xref: /dpdk/app/test-bbdev/test_bbdev_perf.c (revision 92351557d57637431807f46f5433886a10efcc91)
1f714a188SAmr Mokhtar /* SPDX-License-Identifier: BSD-3-Clause
2f714a188SAmr Mokhtar  * Copyright(c) 2017 Intel Corporation
3f714a188SAmr Mokhtar  */
4f714a188SAmr Mokhtar 
5f714a188SAmr Mokhtar #include <stdio.h>
672b452c5SDmitry Kozlyuk #include <stdlib.h>
7f714a188SAmr Mokhtar #include <inttypes.h>
847d5a049SKamil Chalupnik #include <math.h>
9f714a188SAmr Mokhtar 
10f714a188SAmr Mokhtar #include <rte_eal.h>
11f714a188SAmr Mokhtar #include <rte_common.h>
12f714a188SAmr Mokhtar #include <rte_dev.h>
13f714a188SAmr Mokhtar #include <rte_launch.h>
14f714a188SAmr Mokhtar #include <rte_bbdev.h>
15f714a188SAmr Mokhtar #include <rte_cycles.h>
16f714a188SAmr Mokhtar #include <rte_lcore.h>
17f714a188SAmr Mokhtar #include <rte_malloc.h>
18f714a188SAmr Mokhtar #include <rte_random.h>
19f714a188SAmr Mokhtar #include <rte_hexdump.h>
20d819c083SNicolas Chautru #include <rte_interrupts.h>
21d819c083SNicolas Chautru 
22f714a188SAmr Mokhtar #include "main.h"
23f714a188SAmr Mokhtar #include "test_bbdev_vector.h"
24f714a188SAmr Mokhtar 
25f714a188SAmr Mokhtar #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id))
26f714a188SAmr Mokhtar 
27f714a188SAmr Mokhtar #define MAX_QUEUES RTE_MAX_LCORE
282ad0b152SNicolas Chautru #define TEST_REPETITIONS 100
29e49b23ddSNicolas Chautru #define TIME_OUT_POLL 1e9
305c3f7fc5SNicolas Chautru #define WAIT_OFFLOAD_US 1000
31f714a188SAmr Mokhtar 
32a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC
339f17582cSNicolas Chautru #include <fpga_lte_fec.h>
349f17582cSNicolas Chautru #define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf")
359f17582cSNicolas Chautru #define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf")
369f17582cSNicolas Chautru #define VF_UL_4G_QUEUE_VALUE 4
379f17582cSNicolas Chautru #define VF_DL_4G_QUEUE_VALUE 4
389f17582cSNicolas Chautru #define UL_4G_BANDWIDTH 3
399f17582cSNicolas Chautru #define DL_4G_BANDWIDTH 3
409f17582cSNicolas Chautru #define UL_4G_LOAD_BALANCE 128
419f17582cSNicolas Chautru #define DL_4G_LOAD_BALANCE 128
429f17582cSNicolas Chautru #define FLR_4G_TIMEOUT 610
43d819c083SNicolas Chautru #endif
44d819c083SNicolas Chautru 
45a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC
462d430643SNicolas Chautru #include <rte_pmd_fpga_5gnr_fec.h>
472d430643SNicolas Chautru #define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf")
482d430643SNicolas Chautru #define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf")
492d430643SNicolas Chautru #define VF_UL_5G_QUEUE_VALUE 4
502d430643SNicolas Chautru #define VF_DL_5G_QUEUE_VALUE 4
512d430643SNicolas Chautru #define UL_5G_BANDWIDTH 3
522d430643SNicolas Chautru #define DL_5G_BANDWIDTH 3
532d430643SNicolas Chautru #define UL_5G_LOAD_BALANCE 128
542d430643SNicolas Chautru #define DL_5G_LOAD_BALANCE 128
552d430643SNicolas Chautru #endif
562d430643SNicolas Chautru 
57dcf43d24SNicolas Chautru #ifdef RTE_BASEBAND_ACC
58c1407bfaSNicolas Chautru #include <rte_acc_cfg.h>
59b17d7092SNicolas Chautru #define ACC100PF_DRIVER_NAME   ("intel_acc100_pf")
60b17d7092SNicolas Chautru #define ACC100VF_DRIVER_NAME   ("intel_acc100_vf")
61b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_AQS 16
62b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_QGS 2
63b17d7092SNicolas Chautru #define ACC100_QMGR_AQ_DEPTH 5
64b17d7092SNicolas Chautru #define ACC100_QMGR_INVALID_IDX -1
65b17d7092SNicolas Chautru #define ACC100_QMGR_RR 1
66b17d7092SNicolas Chautru #define ACC100_QOS_GBR 0
6761e02ccbSNicolas Chautru #define VRBPF_DRIVER_NAME   ("intel_vran_boost_pf")
6861e02ccbSNicolas Chautru #define VRBVF_DRIVER_NAME   ("intel_vran_boost_vf")
6961e02ccbSNicolas Chautru #define VRB_QMGR_NUM_AQS 16
7061e02ccbSNicolas Chautru #define VRB_QMGR_NUM_QGS 2
7161e02ccbSNicolas Chautru #define VRB_QMGR_AQ_DEPTH 5
7261e02ccbSNicolas Chautru #define VRB_QMGR_INVALID_IDX -1
7361e02ccbSNicolas Chautru #define VRB_QMGR_RR 1
7461e02ccbSNicolas Chautru #define VRB_QOS_GBR 0
75b17d7092SNicolas Chautru #endif
76b17d7092SNicolas Chautru 
77f714a188SAmr Mokhtar #define OPS_CACHE_SIZE 256U
78f714a188SAmr Mokhtar #define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */
79f714a188SAmr Mokhtar 
80f714a188SAmr Mokhtar #define SYNC_WAIT 0
81f714a188SAmr Mokhtar #define SYNC_START 1
82f714a188SAmr Mokhtar 
83f714a188SAmr Mokhtar #define INVALID_QUEUE_ID -1
84335c11fdSNicolas Chautru /* Increment for next code block in external HARQ memory */
85335c11fdSNicolas Chautru #define HARQ_INCR 32768
86335c11fdSNicolas Chautru /* Headroom for filler LLRs insertion in HARQ buffer */
87bee9ac50SHernan Vargas #define FILLER_HEADROOM 2048
88335c11fdSNicolas Chautru /* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */
89335c11fdSNicolas Chautru #define N_ZC_1 66 /* N = 66 Zc for BG 1 */
90335c11fdSNicolas Chautru #define N_ZC_2 50 /* N = 50 Zc for BG 2 */
91335c11fdSNicolas Chautru #define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */
92335c11fdSNicolas Chautru #define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */
93335c11fdSNicolas Chautru #define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */
94335c11fdSNicolas Chautru #define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */
95335c11fdSNicolas Chautru #define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */
96335c11fdSNicolas Chautru #define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */
970de3cb95SHernan Vargas #define NUM_SC_PER_RB (12) /* Number of subcarriers in a RB in 3GPP. */
980de3cb95SHernan Vargas #define BITS_PER_LLR  (8)  /* Number of bits in a LLR. */
99f714a188SAmr Mokhtar 
10039b601c4SHernan Vargas #define HARQ_MEM_TOLERANCE 256
101f714a188SAmr Mokhtar static struct test_bbdev_vector test_vector;
102f714a188SAmr Mokhtar 
103f714a188SAmr Mokhtar /* Switch between PMD and Interrupt for throughput TC */
104f714a188SAmr Mokhtar static bool intr_enabled;
105f714a188SAmr Mokhtar 
106335c11fdSNicolas Chautru /* LLR arithmetic representation for numerical conversion */
107335c11fdSNicolas Chautru static int ldpc_llr_decimals;
108335c11fdSNicolas Chautru static int ldpc_llr_size;
109335c11fdSNicolas Chautru /* Keep track of the LDPC decoder device capability flag */
110335c11fdSNicolas Chautru static uint32_t ldpc_cap_flags;
111a2ea86cbSHernan Vargas /* FFT window width predefined on device and on vector. */
112a2ea86cbSHernan Vargas static int fft_window_width_dev;
113335c11fdSNicolas Chautru 
114067fae41SNicolas Chautru bool dump_ops = true;
115067fae41SNicolas Chautru 
116f714a188SAmr Mokhtar /* Represents tested active devices */
117f714a188SAmr Mokhtar static struct active_device {
118f714a188SAmr Mokhtar 	const char *driver_name;
119f714a188SAmr Mokhtar 	uint8_t dev_id;
120f714a188SAmr Mokhtar 	uint16_t supported_ops;
121f714a188SAmr Mokhtar 	uint16_t queue_ids[MAX_QUEUES];
122f714a188SAmr Mokhtar 	uint16_t nb_queues;
123f714a188SAmr Mokhtar 	struct rte_mempool *ops_mempool;
124f714a188SAmr Mokhtar 	struct rte_mempool *in_mbuf_pool;
125f714a188SAmr Mokhtar 	struct rte_mempool *hard_out_mbuf_pool;
126f714a188SAmr Mokhtar 	struct rte_mempool *soft_out_mbuf_pool;
127d819c083SNicolas Chautru 	struct rte_mempool *harq_in_mbuf_pool;
128d819c083SNicolas Chautru 	struct rte_mempool *harq_out_mbuf_pool;
129f714a188SAmr Mokhtar } active_devs[RTE_BBDEV_MAX_DEVS];
130f714a188SAmr Mokhtar 
131f714a188SAmr Mokhtar static uint8_t nb_active_devs;
132f714a188SAmr Mokhtar 
133f714a188SAmr Mokhtar /* Data buffers used by BBDEV ops */
134f714a188SAmr Mokhtar struct test_buffers {
135f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *inputs;
136f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *hard_outputs;
137f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *soft_outputs;
138d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_inputs;
139d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_outputs;
140f714a188SAmr Mokhtar };
141f714a188SAmr Mokhtar 
142f714a188SAmr Mokhtar /* Operation parameters specific for given test case */
143f714a188SAmr Mokhtar struct test_op_params {
144f714a188SAmr Mokhtar 	struct rte_mempool *mp;
145f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ref_dec_op;
146f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ref_enc_op;
1470acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ref_fft_op;
14895f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ref_mldts_op;
149f714a188SAmr Mokhtar 	uint16_t burst_sz;
150f714a188SAmr Mokhtar 	uint16_t num_to_process;
151f714a188SAmr Mokhtar 	uint16_t num_lcores;
152f714a188SAmr Mokhtar 	int vector_mask;
153b6a7e685STyler Retzlaff 	RTE_ATOMIC(uint16_t) sync;
154f714a188SAmr Mokhtar 	struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES];
155f714a188SAmr Mokhtar };
156f714a188SAmr Mokhtar 
157f714a188SAmr Mokhtar /* Contains per lcore params */
158f714a188SAmr Mokhtar struct thread_params {
159f714a188SAmr Mokhtar 	uint8_t dev_id;
160f714a188SAmr Mokhtar 	uint16_t queue_id;
161b2e2aec3SKamil Chalupnik 	uint32_t lcore_id;
162f714a188SAmr Mokhtar 	uint64_t start_time;
1630b98d574SKamil Chalupnik 	double ops_per_sec;
164f714a188SAmr Mokhtar 	double mbps;
1650b98d574SKamil Chalupnik 	uint8_t iter_count;
166f41c6e4dSNicolas Chautru 	double iter_average;
167f41c6e4dSNicolas Chautru 	double bler;
168b6a7e685STyler Retzlaff 	RTE_ATOMIC(uint16_t) nb_dequeued;
169b6a7e685STyler Retzlaff 	RTE_ATOMIC(int16_t) processing_status;
170b6a7e685STyler Retzlaff 	RTE_ATOMIC(uint16_t) burst_sz;
171f714a188SAmr Mokhtar 	struct test_op_params *op_params;
172b2e2aec3SKamil Chalupnik 	struct rte_bbdev_dec_op *dec_ops[MAX_BURST];
173b2e2aec3SKamil Chalupnik 	struct rte_bbdev_enc_op *enc_ops[MAX_BURST];
1740acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *fft_ops[MAX_BURST];
17595f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *mldts_ops[MAX_BURST];
176f714a188SAmr Mokhtar };
177f714a188SAmr Mokhtar 
178864edd69SKamil Chalupnik /* Stores time statistics */
179864edd69SKamil Chalupnik struct test_time_stats {
180864edd69SKamil Chalupnik 	/* Stores software enqueue total working time */
1819fa6ebdeSKamil Chalupnik 	uint64_t enq_sw_total_time;
182864edd69SKamil Chalupnik 	/* Stores minimum value of software enqueue working time */
183864edd69SKamil Chalupnik 	uint64_t enq_sw_min_time;
184864edd69SKamil Chalupnik 	/* Stores maximum value of software enqueue working time */
185864edd69SKamil Chalupnik 	uint64_t enq_sw_max_time;
186864edd69SKamil Chalupnik 	/* Stores turbo enqueue total working time */
1879fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_total_time;
1889fa6ebdeSKamil Chalupnik 	/* Stores minimum value of accelerator enqueue working time */
1899fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_min_time;
1909fa6ebdeSKamil Chalupnik 	/* Stores maximum value of accelerator enqueue working time */
1919fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_max_time;
192864edd69SKamil Chalupnik 	/* Stores dequeue total working time */
1939fa6ebdeSKamil Chalupnik 	uint64_t deq_total_time;
194864edd69SKamil Chalupnik 	/* Stores minimum value of dequeue working time */
195864edd69SKamil Chalupnik 	uint64_t deq_min_time;
196864edd69SKamil Chalupnik 	/* Stores maximum value of dequeue working time */
197864edd69SKamil Chalupnik 	uint64_t deq_max_time;
198864edd69SKamil Chalupnik };
199864edd69SKamil Chalupnik 
200f714a188SAmr Mokhtar typedef int (test_case_function)(struct active_device *ad,
201f714a188SAmr Mokhtar 		struct test_op_params *op_params);
202f714a188SAmr Mokhtar 
203fb5e060eSHernan Vargas /* Get device status before timeout exit */
204fb5e060eSHernan Vargas static inline void
205fb5e060eSHernan Vargas timeout_exit(uint8_t dev_id)
206fb5e060eSHernan Vargas {
207fb5e060eSHernan Vargas 	struct rte_bbdev_info info;
208fb5e060eSHernan Vargas 	rte_bbdev_info_get(dev_id, &info);
209fb5e060eSHernan Vargas 	printf("Device Status %s\n", rte_bbdev_device_status_str(info.drv.device_status));
210fb5e060eSHernan Vargas }
211fb5e060eSHernan Vargas 
212f714a188SAmr Mokhtar static inline void
2139585f8b1SKamil Chalupnik mbuf_reset(struct rte_mbuf *m)
2149585f8b1SKamil Chalupnik {
2159585f8b1SKamil Chalupnik 	m->pkt_len = 0;
2169585f8b1SKamil Chalupnik 
2179585f8b1SKamil Chalupnik 	do {
2189585f8b1SKamil Chalupnik 		m->data_len = 0;
2199585f8b1SKamil Chalupnik 		m = m->next;
2209585f8b1SKamil Chalupnik 	} while (m != NULL);
2219585f8b1SKamil Chalupnik }
2229585f8b1SKamil Chalupnik 
223d819c083SNicolas Chautru /* Read flag value 0/1 from bitmap */
224d819c083SNicolas Chautru static inline bool
225d819c083SNicolas Chautru check_bit(uint32_t bitmap, uint32_t bitmask)
226d819c083SNicolas Chautru {
227d819c083SNicolas Chautru 	return bitmap & bitmask;
228d819c083SNicolas Chautru }
229d819c083SNicolas Chautru 
2309585f8b1SKamil Chalupnik static inline void
231f714a188SAmr Mokhtar set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
232f714a188SAmr Mokhtar {
233f714a188SAmr Mokhtar 	ad->supported_ops |= (1 << op_type);
234f714a188SAmr Mokhtar }
235f714a188SAmr Mokhtar 
236f714a188SAmr Mokhtar static inline bool
237f714a188SAmr Mokhtar is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
238f714a188SAmr Mokhtar {
239f714a188SAmr Mokhtar 	return ad->supported_ops & (1 << op_type);
240f714a188SAmr Mokhtar }
241f714a188SAmr Mokhtar 
242f714a188SAmr Mokhtar static inline bool
243f714a188SAmr Mokhtar flags_match(uint32_t flags_req, uint32_t flags_present)
244f714a188SAmr Mokhtar {
245f714a188SAmr Mokhtar 	return (flags_req & flags_present) == flags_req;
246f714a188SAmr Mokhtar }
247f714a188SAmr Mokhtar 
248f714a188SAmr Mokhtar static void
249f714a188SAmr Mokhtar clear_soft_out_cap(uint32_t *op_flags)
250f714a188SAmr Mokhtar {
251f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT;
252f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
253f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
254f714a188SAmr Mokhtar }
255f714a188SAmr Mokhtar 
256441ac2e0SNipun Gupta /* This API is to convert all the test vector op data entries
257441ac2e0SNipun Gupta  * to big endian format. It is used when the device supports
258441ac2e0SNipun Gupta  * the input in the big endian format.
259441ac2e0SNipun Gupta  */
260441ac2e0SNipun Gupta static inline void
261441ac2e0SNipun Gupta convert_op_data_to_be(void)
262441ac2e0SNipun Gupta {
263441ac2e0SNipun Gupta 	struct op_data_entries *op;
264441ac2e0SNipun Gupta 	enum op_data_type type;
265441ac2e0SNipun Gupta 	uint8_t nb_segs, *rem_data, temp;
266441ac2e0SNipun Gupta 	uint32_t *data, len;
267441ac2e0SNipun Gupta 	int complete, rem, i, j;
268441ac2e0SNipun Gupta 
269441ac2e0SNipun Gupta 	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
270441ac2e0SNipun Gupta 		nb_segs = test_vector.entries[type].nb_segments;
271441ac2e0SNipun Gupta 		op = &test_vector.entries[type];
272441ac2e0SNipun Gupta 
273441ac2e0SNipun Gupta 		/* Invert byte endianness for all the segments */
274441ac2e0SNipun Gupta 		for (i = 0; i < nb_segs; ++i) {
275441ac2e0SNipun Gupta 			len = op->segments[i].length;
276441ac2e0SNipun Gupta 			data = op->segments[i].addr;
277441ac2e0SNipun Gupta 
278441ac2e0SNipun Gupta 			/* Swap complete u32 bytes */
279441ac2e0SNipun Gupta 			complete = len / 4;
280441ac2e0SNipun Gupta 			for (j = 0; j < complete; j++)
281441ac2e0SNipun Gupta 				data[j] = rte_bswap32(data[j]);
282441ac2e0SNipun Gupta 
283441ac2e0SNipun Gupta 			/* Swap any remaining bytes */
284441ac2e0SNipun Gupta 			rem = len % 4;
285441ac2e0SNipun Gupta 			rem_data = (uint8_t *)&data[j];
286441ac2e0SNipun Gupta 			for (j = 0; j < rem/2; j++) {
287441ac2e0SNipun Gupta 				temp = rem_data[j];
288441ac2e0SNipun Gupta 				rem_data[j] = rem_data[rem - j - 1];
289441ac2e0SNipun Gupta 				rem_data[rem - j - 1] = temp;
290441ac2e0SNipun Gupta 			}
291441ac2e0SNipun Gupta 		}
292441ac2e0SNipun Gupta 	}
293441ac2e0SNipun Gupta }
294441ac2e0SNipun Gupta 
295f714a188SAmr Mokhtar static int
296f714a188SAmr Mokhtar check_dev_cap(const struct rte_bbdev_info *dev_info)
297f714a188SAmr Mokhtar {
298f714a188SAmr Mokhtar 	unsigned int i;
299d819c083SNicolas Chautru 	unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs,
300d819c083SNicolas Chautru 		nb_harq_inputs, nb_harq_outputs;
301f714a188SAmr Mokhtar 	const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities;
302441ac2e0SNipun Gupta 	uint8_t dev_data_endianness = dev_info->drv.data_endianness;
303f714a188SAmr Mokhtar 
304f714a188SAmr Mokhtar 	nb_inputs = test_vector.entries[DATA_INPUT].nb_segments;
305f714a188SAmr Mokhtar 	nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments;
306f714a188SAmr Mokhtar 	nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments;
307d819c083SNicolas Chautru 	nb_harq_inputs  = test_vector.entries[DATA_HARQ_INPUT].nb_segments;
308d819c083SNicolas Chautru 	nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments;
309f714a188SAmr Mokhtar 
310f714a188SAmr Mokhtar 	for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) {
311f714a188SAmr Mokhtar 		if (op_cap->type != test_vector.op_type)
312f714a188SAmr Mokhtar 			continue;
313f714a188SAmr Mokhtar 
314441ac2e0SNipun Gupta 		if (dev_data_endianness == RTE_BIG_ENDIAN)
315441ac2e0SNipun Gupta 			convert_op_data_to_be();
316441ac2e0SNipun Gupta 
317f714a188SAmr Mokhtar 		if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) {
318f714a188SAmr Mokhtar 			const struct rte_bbdev_op_cap_turbo_dec *cap =
319f714a188SAmr Mokhtar 					&op_cap->cap.turbo_dec;
320f714a188SAmr Mokhtar 			/* Ignore lack of soft output capability, just skip
321f714a188SAmr Mokhtar 			 * checking if soft output is valid.
322f714a188SAmr Mokhtar 			 */
323f714a188SAmr Mokhtar 			if ((test_vector.turbo_dec.op_flags &
324f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
325f714a188SAmr Mokhtar 					!(cap->capability_flags &
326f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
327f714a188SAmr Mokhtar 				printf(
328d819c083SNicolas Chautru 					"INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n",
329f714a188SAmr Mokhtar 					dev_info->dev_name);
330f714a188SAmr Mokhtar 				clear_soft_out_cap(
331f714a188SAmr Mokhtar 					&test_vector.turbo_dec.op_flags);
332f714a188SAmr Mokhtar 			}
333f714a188SAmr Mokhtar 
334f714a188SAmr Mokhtar 			if (!flags_match(test_vector.turbo_dec.op_flags,
335f714a188SAmr Mokhtar 					cap->capability_flags))
336f714a188SAmr Mokhtar 				return TEST_FAILED;
337f714a188SAmr Mokhtar 			if (nb_inputs > cap->num_buffers_src) {
338f714a188SAmr Mokhtar 				printf("Too many inputs defined: %u, max: %u\n",
339f714a188SAmr Mokhtar 					nb_inputs, cap->num_buffers_src);
340f714a188SAmr Mokhtar 				return TEST_FAILED;
341f714a188SAmr Mokhtar 			}
342f714a188SAmr Mokhtar 			if (nb_soft_outputs > cap->num_buffers_soft_out &&
343f714a188SAmr Mokhtar 					(test_vector.turbo_dec.op_flags &
344f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
345f714a188SAmr Mokhtar 				printf(
346f714a188SAmr Mokhtar 					"Too many soft outputs defined: %u, max: %u\n",
347f714a188SAmr Mokhtar 						nb_soft_outputs,
348f714a188SAmr Mokhtar 						cap->num_buffers_soft_out);
349f714a188SAmr Mokhtar 				return TEST_FAILED;
350f714a188SAmr Mokhtar 			}
351f714a188SAmr Mokhtar 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
352f714a188SAmr Mokhtar 				printf(
353f714a188SAmr Mokhtar 					"Too many hard outputs defined: %u, max: %u\n",
354f714a188SAmr Mokhtar 						nb_hard_outputs,
355f714a188SAmr Mokhtar 						cap->num_buffers_hard_out);
356f714a188SAmr Mokhtar 				return TEST_FAILED;
357f714a188SAmr Mokhtar 			}
358f714a188SAmr Mokhtar 			if (intr_enabled && !(cap->capability_flags &
359f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_DEC_INTERRUPTS)) {
360f714a188SAmr Mokhtar 				printf(
361f714a188SAmr Mokhtar 					"Dequeue interrupts are not supported!\n");
362f714a188SAmr Mokhtar 				return TEST_FAILED;
363f714a188SAmr Mokhtar 			}
364f714a188SAmr Mokhtar 
365f714a188SAmr Mokhtar 			return TEST_SUCCESS;
366f714a188SAmr Mokhtar 		} else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) {
367f714a188SAmr Mokhtar 			const struct rte_bbdev_op_cap_turbo_enc *cap =
368f714a188SAmr Mokhtar 					&op_cap->cap.turbo_enc;
369f714a188SAmr Mokhtar 
370f714a188SAmr Mokhtar 			if (!flags_match(test_vector.turbo_enc.op_flags,
371f714a188SAmr Mokhtar 					cap->capability_flags))
372f714a188SAmr Mokhtar 				return TEST_FAILED;
373f714a188SAmr Mokhtar 			if (nb_inputs > cap->num_buffers_src) {
374f714a188SAmr Mokhtar 				printf("Too many inputs defined: %u, max: %u\n",
375f714a188SAmr Mokhtar 					nb_inputs, cap->num_buffers_src);
376f714a188SAmr Mokhtar 				return TEST_FAILED;
377f714a188SAmr Mokhtar 			}
378f714a188SAmr Mokhtar 			if (nb_hard_outputs > cap->num_buffers_dst) {
379f714a188SAmr Mokhtar 				printf(
380f714a188SAmr Mokhtar 					"Too many hard outputs defined: %u, max: %u\n",
381d819c083SNicolas Chautru 					nb_hard_outputs, cap->num_buffers_dst);
382f714a188SAmr Mokhtar 				return TEST_FAILED;
383f714a188SAmr Mokhtar 			}
384f714a188SAmr Mokhtar 			if (intr_enabled && !(cap->capability_flags &
385f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_ENC_INTERRUPTS)) {
386f714a188SAmr Mokhtar 				printf(
387f714a188SAmr Mokhtar 					"Dequeue interrupts are not supported!\n");
388f714a188SAmr Mokhtar 				return TEST_FAILED;
389f714a188SAmr Mokhtar 			}
390f714a188SAmr Mokhtar 
391f714a188SAmr Mokhtar 			return TEST_SUCCESS;
392d819c083SNicolas Chautru 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) {
393d819c083SNicolas Chautru 			const struct rte_bbdev_op_cap_ldpc_enc *cap =
394d819c083SNicolas Chautru 					&op_cap->cap.ldpc_enc;
395d819c083SNicolas Chautru 
396d819c083SNicolas Chautru 			if (!flags_match(test_vector.ldpc_enc.op_flags,
397d819c083SNicolas Chautru 					cap->capability_flags)){
398d819c083SNicolas Chautru 				printf("Flag Mismatch\n");
399d819c083SNicolas Chautru 				return TEST_FAILED;
400d819c083SNicolas Chautru 			}
401d819c083SNicolas Chautru 			if (nb_inputs > cap->num_buffers_src) {
402d819c083SNicolas Chautru 				printf("Too many inputs defined: %u, max: %u\n",
403d819c083SNicolas Chautru 					nb_inputs, cap->num_buffers_src);
404d819c083SNicolas Chautru 				return TEST_FAILED;
405d819c083SNicolas Chautru 			}
406d819c083SNicolas Chautru 			if (nb_hard_outputs > cap->num_buffers_dst) {
407d819c083SNicolas Chautru 				printf(
408d819c083SNicolas Chautru 					"Too many hard outputs defined: %u, max: %u\n",
409d819c083SNicolas Chautru 					nb_hard_outputs, cap->num_buffers_dst);
410d819c083SNicolas Chautru 				return TEST_FAILED;
411d819c083SNicolas Chautru 			}
412d819c083SNicolas Chautru 			if (intr_enabled && !(cap->capability_flags &
413335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_ENC_INTERRUPTS)) {
414d819c083SNicolas Chautru 				printf(
415d819c083SNicolas Chautru 					"Dequeue interrupts are not supported!\n");
416d819c083SNicolas Chautru 				return TEST_FAILED;
417d819c083SNicolas Chautru 			}
418d819c083SNicolas Chautru 
419d819c083SNicolas Chautru 			return TEST_SUCCESS;
420d819c083SNicolas Chautru 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) {
421d819c083SNicolas Chautru 			const struct rte_bbdev_op_cap_ldpc_dec *cap =
422d819c083SNicolas Chautru 					&op_cap->cap.ldpc_dec;
423d819c083SNicolas Chautru 
424d819c083SNicolas Chautru 			if (!flags_match(test_vector.ldpc_dec.op_flags,
425d819c083SNicolas Chautru 					cap->capability_flags)){
426d819c083SNicolas Chautru 				printf("Flag Mismatch\n");
427d819c083SNicolas Chautru 				return TEST_FAILED;
428d819c083SNicolas Chautru 			}
429d819c083SNicolas Chautru 			if (nb_inputs > cap->num_buffers_src) {
430d819c083SNicolas Chautru 				printf("Too many inputs defined: %u, max: %u\n",
431d819c083SNicolas Chautru 					nb_inputs, cap->num_buffers_src);
432d819c083SNicolas Chautru 				return TEST_FAILED;
433d819c083SNicolas Chautru 			}
434d819c083SNicolas Chautru 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
435d819c083SNicolas Chautru 				printf(
436d819c083SNicolas Chautru 					"Too many hard outputs defined: %u, max: %u\n",
437d819c083SNicolas Chautru 					nb_hard_outputs,
438d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
439d819c083SNicolas Chautru 				return TEST_FAILED;
440d819c083SNicolas Chautru 			}
441d819c083SNicolas Chautru 			if (nb_harq_inputs > cap->num_buffers_hard_out) {
442d819c083SNicolas Chautru 				printf(
443d819c083SNicolas Chautru 					"Too many HARQ inputs defined: %u, max: %u\n",
44449ca9e5aSMin Hu (Connor) 					nb_harq_inputs,
445d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
446d819c083SNicolas Chautru 				return TEST_FAILED;
447d819c083SNicolas Chautru 			}
448d819c083SNicolas Chautru 			if (nb_harq_outputs > cap->num_buffers_hard_out) {
449d819c083SNicolas Chautru 				printf(
450d819c083SNicolas Chautru 					"Too many HARQ outputs defined: %u, max: %u\n",
45149ca9e5aSMin Hu (Connor) 					nb_harq_outputs,
452d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
453d819c083SNicolas Chautru 				return TEST_FAILED;
454d819c083SNicolas Chautru 			}
455d819c083SNicolas Chautru 			if (intr_enabled && !(cap->capability_flags &
456335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_DEC_INTERRUPTS)) {
457d819c083SNicolas Chautru 				printf(
458d819c083SNicolas Chautru 					"Dequeue interrupts are not supported!\n");
459d819c083SNicolas Chautru 				return TEST_FAILED;
460d819c083SNicolas Chautru 			}
461335c11fdSNicolas Chautru 			if (intr_enabled && (test_vector.ldpc_dec.op_flags &
462335c11fdSNicolas Chautru 				(RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE |
463335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE |
464335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK
465335c11fdSNicolas Chautru 					))) {
466335c11fdSNicolas Chautru 				printf("Skip loop-back with interrupt\n");
467335c11fdSNicolas Chautru 				return TEST_FAILED;
468335c11fdSNicolas Chautru 			}
469d819c083SNicolas Chautru 			return TEST_SUCCESS;
4700acdb986SNicolas Chautru 		} else if (op_cap->type == RTE_BBDEV_OP_FFT) {
4710acdb986SNicolas Chautru 			const struct rte_bbdev_op_cap_fft *cap = &op_cap->cap.fft;
4720acdb986SNicolas Chautru 
4730acdb986SNicolas Chautru 			if (!flags_match(test_vector.fft.op_flags, cap->capability_flags)) {
4740acdb986SNicolas Chautru 				printf("Flag Mismatch\n");
4750acdb986SNicolas Chautru 				return TEST_FAILED;
4760acdb986SNicolas Chautru 			}
4770acdb986SNicolas Chautru 			if (nb_inputs > cap->num_buffers_src) {
4780acdb986SNicolas Chautru 				printf("Too many inputs defined: %u, max: %u\n",
4790acdb986SNicolas Chautru 					nb_inputs, cap->num_buffers_src);
4800acdb986SNicolas Chautru 				return TEST_FAILED;
4810acdb986SNicolas Chautru 			}
4820acdb986SNicolas Chautru 			return TEST_SUCCESS;
48395f192a4SHernan Vargas 		} else if (op_cap->type == RTE_BBDEV_OP_MLDTS) {
48495f192a4SHernan Vargas 			const struct rte_bbdev_op_cap_mld *cap = &op_cap->cap.mld;
48595f192a4SHernan Vargas 			if (!flags_match(test_vector.mldts.op_flags, cap->capability_flags)) {
48695f192a4SHernan Vargas 				printf("Flag Mismatch\n");
48795f192a4SHernan Vargas 				return TEST_FAILED;
48895f192a4SHernan Vargas 			}
48995f192a4SHernan Vargas 			if (nb_inputs > cap->num_buffers_src) {
49095f192a4SHernan Vargas 				printf("Too many inputs defined: %u, max: %u\n",
49195f192a4SHernan Vargas 					nb_inputs, cap->num_buffers_src);
49295f192a4SHernan Vargas 				return TEST_FAILED;
49395f192a4SHernan Vargas 			}
49495f192a4SHernan Vargas 			return TEST_SUCCESS;
495f714a188SAmr Mokhtar 		}
496f714a188SAmr Mokhtar 	}
497f714a188SAmr Mokhtar 
498f714a188SAmr Mokhtar 	if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE))
499f714a188SAmr Mokhtar 		return TEST_SUCCESS; /* Special case for NULL device */
500f714a188SAmr Mokhtar 
501f714a188SAmr Mokhtar 	return TEST_FAILED;
502f714a188SAmr Mokhtar }
503f714a188SAmr Mokhtar 
504f714a188SAmr Mokhtar /* calculates optimal mempool size not smaller than the val */
505f714a188SAmr Mokhtar static unsigned int
506f714a188SAmr Mokhtar optimal_mempool_size(unsigned int val)
507f714a188SAmr Mokhtar {
508f714a188SAmr Mokhtar 	return rte_align32pow2(val + 1) - 1;
509f714a188SAmr Mokhtar }
510f714a188SAmr Mokhtar 
511f714a188SAmr Mokhtar /* allocates mbuf mempool for inputs and outputs */
512f714a188SAmr Mokhtar static struct rte_mempool *
513f714a188SAmr Mokhtar create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id,
514f714a188SAmr Mokhtar 		int socket_id, unsigned int mbuf_pool_size,
515f714a188SAmr Mokhtar 		const char *op_type_str)
516f714a188SAmr Mokhtar {
517f714a188SAmr Mokhtar 	unsigned int i;
518f714a188SAmr Mokhtar 	uint32_t max_seg_sz = 0;
519f714a188SAmr Mokhtar 	char pool_name[RTE_MEMPOOL_NAMESIZE];
520f714a188SAmr Mokhtar 
521f714a188SAmr Mokhtar 	/* find max input segment size */
522f714a188SAmr Mokhtar 	for (i = 0; i < entries->nb_segments; ++i)
523f714a188SAmr Mokhtar 		if (entries->segments[i].length > max_seg_sz)
524f714a188SAmr Mokhtar 			max_seg_sz = entries->segments[i].length;
525f714a188SAmr Mokhtar 
526f714a188SAmr Mokhtar 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
527f714a188SAmr Mokhtar 			dev_id);
528f714a188SAmr Mokhtar 	return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0,
529335c11fdSNicolas Chautru 			RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM
530335c11fdSNicolas Chautru 					+ FILLER_HEADROOM,
531f714a188SAmr Mokhtar 			(unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id);
532f714a188SAmr Mokhtar }
533f714a188SAmr Mokhtar 
534f714a188SAmr Mokhtar static int
535f714a188SAmr Mokhtar create_mempools(struct active_device *ad, int socket_id,
536ad458935SKamil Chalupnik 		enum rte_bbdev_op_type org_op_type, uint16_t num_ops)
537f714a188SAmr Mokhtar {
538f714a188SAmr Mokhtar 	struct rte_mempool *mp;
539f714a188SAmr Mokhtar 	unsigned int ops_pool_size, mbuf_pool_size = 0;
540f714a188SAmr Mokhtar 	char pool_name[RTE_MEMPOOL_NAMESIZE];
541f714a188SAmr Mokhtar 	const char *op_type_str;
542ad458935SKamil Chalupnik 	enum rte_bbdev_op_type op_type = org_op_type;
543f714a188SAmr Mokhtar 
544f714a188SAmr Mokhtar 	struct op_data_entries *in = &test_vector.entries[DATA_INPUT];
545f714a188SAmr Mokhtar 	struct op_data_entries *hard_out =
546f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
547f714a188SAmr Mokhtar 	struct op_data_entries *soft_out =
548f714a188SAmr Mokhtar 			&test_vector.entries[DATA_SOFT_OUTPUT];
549d819c083SNicolas Chautru 	struct op_data_entries *harq_in =
550d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARQ_INPUT];
551d819c083SNicolas Chautru 	struct op_data_entries *harq_out =
552d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARQ_OUTPUT];
553f714a188SAmr Mokhtar 
554f714a188SAmr Mokhtar 	/* allocate ops mempool */
555f714a188SAmr Mokhtar 	ops_pool_size = optimal_mempool_size(RTE_MAX(
556f714a188SAmr Mokhtar 			/* Ops used plus 1 reference op */
557f714a188SAmr Mokhtar 			RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1),
558f714a188SAmr Mokhtar 			/* Minimal cache size plus 1 reference op */
559f714a188SAmr Mokhtar 			(unsigned int)(1.5 * rte_lcore_count() *
560f714a188SAmr Mokhtar 					OPS_CACHE_SIZE + 1)),
561f714a188SAmr Mokhtar 			OPS_POOL_SIZE_MIN));
562f714a188SAmr Mokhtar 
563ad458935SKamil Chalupnik 	if (org_op_type == RTE_BBDEV_OP_NONE)
564ad458935SKamil Chalupnik 		op_type = RTE_BBDEV_OP_TURBO_ENC;
565ad458935SKamil Chalupnik 
566f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
567f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
568f714a188SAmr Mokhtar 
569f714a188SAmr Mokhtar 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
570f714a188SAmr Mokhtar 			ad->dev_id);
571f714a188SAmr Mokhtar 	mp = rte_bbdev_op_pool_create(pool_name, op_type,
572f714a188SAmr Mokhtar 			ops_pool_size, OPS_CACHE_SIZE, socket_id);
573f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(mp,
574f714a188SAmr Mokhtar 			"ERROR Failed to create %u items ops pool for dev %u on socket %u.",
575f714a188SAmr Mokhtar 			ops_pool_size,
576f714a188SAmr Mokhtar 			ad->dev_id,
577f714a188SAmr Mokhtar 			socket_id);
578f714a188SAmr Mokhtar 	ad->ops_mempool = mp;
579f714a188SAmr Mokhtar 
580ad458935SKamil Chalupnik 	/* Do not create inputs and outputs mbufs for BaseBand Null Device */
581ad458935SKamil Chalupnik 	if (org_op_type == RTE_BBDEV_OP_NONE)
582ad458935SKamil Chalupnik 		return TEST_SUCCESS;
583ad458935SKamil Chalupnik 
584f714a188SAmr Mokhtar 	/* Inputs */
585335c11fdSNicolas Chautru 	if (in->nb_segments > 0) {
586335c11fdSNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
587335c11fdSNicolas Chautru 				in->nb_segments);
588335c11fdSNicolas Chautru 		mp = create_mbuf_pool(in, ad->dev_id, socket_id,
589335c11fdSNicolas Chautru 				mbuf_pool_size, "in");
590f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
591f714a188SAmr Mokhtar 				"ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.",
592f714a188SAmr Mokhtar 				mbuf_pool_size,
593f714a188SAmr Mokhtar 				ad->dev_id,
594f714a188SAmr Mokhtar 				socket_id);
595f714a188SAmr Mokhtar 		ad->in_mbuf_pool = mp;
596335c11fdSNicolas Chautru 	}
597f714a188SAmr Mokhtar 
598f714a188SAmr Mokhtar 	/* Hard outputs */
599335c11fdSNicolas Chautru 	if (hard_out->nb_segments > 0) {
600f714a188SAmr Mokhtar 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
601f714a188SAmr Mokhtar 				hard_out->nb_segments);
602335c11fdSNicolas Chautru 		mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id,
603335c11fdSNicolas Chautru 				mbuf_pool_size,
604f714a188SAmr Mokhtar 				"hard_out");
605f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
606f714a188SAmr Mokhtar 				"ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.",
607f714a188SAmr Mokhtar 				mbuf_pool_size,
608f714a188SAmr Mokhtar 				ad->dev_id,
609f714a188SAmr Mokhtar 				socket_id);
610f714a188SAmr Mokhtar 		ad->hard_out_mbuf_pool = mp;
611335c11fdSNicolas Chautru 	}
612f714a188SAmr Mokhtar 
613f714a188SAmr Mokhtar 	/* Soft outputs */
614d819c083SNicolas Chautru 	if (soft_out->nb_segments > 0) {
615f714a188SAmr Mokhtar 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
616f714a188SAmr Mokhtar 				soft_out->nb_segments);
617d819c083SNicolas Chautru 		mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id,
618d819c083SNicolas Chautru 				mbuf_pool_size,
619f714a188SAmr Mokhtar 				"soft_out");
620f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
621f714a188SAmr Mokhtar 				"ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.",
622f714a188SAmr Mokhtar 				mbuf_pool_size,
623f714a188SAmr Mokhtar 				ad->dev_id,
624f714a188SAmr Mokhtar 				socket_id);
625f714a188SAmr Mokhtar 		ad->soft_out_mbuf_pool = mp;
626d819c083SNicolas Chautru 	}
627f714a188SAmr Mokhtar 
628d819c083SNicolas Chautru 	/* HARQ inputs */
629d819c083SNicolas Chautru 	if (harq_in->nb_segments > 0) {
630d819c083SNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
631d819c083SNicolas Chautru 				harq_in->nb_segments);
632d819c083SNicolas Chautru 		mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id,
633d819c083SNicolas Chautru 				mbuf_pool_size,
634d819c083SNicolas Chautru 				"harq_in");
635d819c083SNicolas Chautru 		TEST_ASSERT_NOT_NULL(mp,
636d819c083SNicolas Chautru 				"ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.",
637d819c083SNicolas Chautru 				mbuf_pool_size,
638d819c083SNicolas Chautru 				ad->dev_id,
639d819c083SNicolas Chautru 				socket_id);
640d819c083SNicolas Chautru 		ad->harq_in_mbuf_pool = mp;
641d819c083SNicolas Chautru 	}
642d819c083SNicolas Chautru 
643d819c083SNicolas Chautru 	/* HARQ outputs */
644d819c083SNicolas Chautru 	if (harq_out->nb_segments > 0) {
645d819c083SNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
646d819c083SNicolas Chautru 				harq_out->nb_segments);
647d819c083SNicolas Chautru 		mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id,
648d819c083SNicolas Chautru 				mbuf_pool_size,
649d819c083SNicolas Chautru 				"harq_out");
650d819c083SNicolas Chautru 		TEST_ASSERT_NOT_NULL(mp,
651d819c083SNicolas Chautru 				"ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.",
652d819c083SNicolas Chautru 				mbuf_pool_size,
653d819c083SNicolas Chautru 				ad->dev_id,
654d819c083SNicolas Chautru 				socket_id);
655d819c083SNicolas Chautru 		ad->harq_out_mbuf_pool = mp;
656d819c083SNicolas Chautru 	}
657d819c083SNicolas Chautru 
658d819c083SNicolas Chautru 	return TEST_SUCCESS;
659f714a188SAmr Mokhtar }
660f714a188SAmr Mokhtar 
661f714a188SAmr Mokhtar static int
662f714a188SAmr Mokhtar add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info,
663f714a188SAmr Mokhtar 		struct test_bbdev_vector *vector)
664f714a188SAmr Mokhtar {
665f714a188SAmr Mokhtar 	int ret;
666f714a188SAmr Mokhtar 	unsigned int queue_id;
667f714a188SAmr Mokhtar 	struct rte_bbdev_queue_conf qconf;
668f714a188SAmr Mokhtar 	struct active_device *ad = &active_devs[nb_active_devs];
669f714a188SAmr Mokhtar 	unsigned int nb_queues;
670f714a188SAmr Mokhtar 	enum rte_bbdev_op_type op_type = vector->op_type;
671f714a188SAmr Mokhtar 
672d819c083SNicolas Chautru /* Configure fpga lte fec with PF & VF values
673d819c083SNicolas Chautru  * if '-i' flag is set and using fpga device
674d819c083SNicolas Chautru  */
675a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC
676d819c083SNicolas Chautru 	if ((get_init_device() == true) &&
6779f17582cSNicolas Chautru 		(!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) {
678e6925585SMaxime Coquelin 		struct rte_fpga_lte_fec_conf conf;
679d819c083SNicolas Chautru 		unsigned int i;
680d819c083SNicolas Chautru 
6819f17582cSNicolas Chautru 		printf("Configure FPGA LTE FEC Driver %s with default values\n",
682d819c083SNicolas Chautru 				info->drv.driver_name);
683d819c083SNicolas Chautru 
684d819c083SNicolas Chautru 		/* clear default configuration before initialization */
685e6925585SMaxime Coquelin 		memset(&conf, 0, sizeof(struct rte_fpga_lte_fec_conf));
686d819c083SNicolas Chautru 
687d819c083SNicolas Chautru 		/* Set PF mode :
688d819c083SNicolas Chautru 		 * true if PF is used for data plane
689d819c083SNicolas Chautru 		 * false for VFs
690d819c083SNicolas Chautru 		 */
691d819c083SNicolas Chautru 		conf.pf_mode_en = true;
692d819c083SNicolas Chautru 
693d819c083SNicolas Chautru 		for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) {
694d819c083SNicolas Chautru 			/* Number of UL queues per VF (fpga supports 8 VFs) */
6959f17582cSNicolas Chautru 			conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE;
696d819c083SNicolas Chautru 			/* Number of DL queues per VF (fpga supports 8 VFs) */
6979f17582cSNicolas Chautru 			conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE;
698d819c083SNicolas Chautru 		}
699d819c083SNicolas Chautru 
700d819c083SNicolas Chautru 		/* UL bandwidth. Needed for schedule algorithm */
7019f17582cSNicolas Chautru 		conf.ul_bandwidth = UL_4G_BANDWIDTH;
702d819c083SNicolas Chautru 		/* DL bandwidth */
7039f17582cSNicolas Chautru 		conf.dl_bandwidth = DL_4G_BANDWIDTH;
704d819c083SNicolas Chautru 
705d819c083SNicolas Chautru 		/* UL & DL load Balance Factor to 64 */
7069f17582cSNicolas Chautru 		conf.ul_load_balance = UL_4G_LOAD_BALANCE;
7079f17582cSNicolas Chautru 		conf.dl_load_balance = DL_4G_LOAD_BALANCE;
708d819c083SNicolas Chautru 
709d819c083SNicolas Chautru 		/**< FLR timeout value */
7109f17582cSNicolas Chautru 		conf.flr_time_out = FLR_4G_TIMEOUT;
711d819c083SNicolas Chautru 
712d819c083SNicolas Chautru 		/* setup FPGA PF with configuration information */
713e6925585SMaxime Coquelin 		ret = rte_fpga_lte_fec_configure(info->dev_name, &conf);
714d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
715d819c083SNicolas Chautru 				"Failed to configure 4G FPGA PF for bbdev %s",
716d819c083SNicolas Chautru 				info->dev_name);
717d819c083SNicolas Chautru 	}
718d819c083SNicolas Chautru #endif
719a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC
7202d430643SNicolas Chautru 	if ((get_init_device() == true) &&
7212d430643SNicolas Chautru 		(!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) {
7227adbb468SMaxime Coquelin 		struct rte_fpga_5gnr_fec_conf conf;
7232d430643SNicolas Chautru 		unsigned int i;
7242d430643SNicolas Chautru 
7252d430643SNicolas Chautru 		printf("Configure FPGA 5GNR FEC Driver %s with default values\n",
7262d430643SNicolas Chautru 				info->drv.driver_name);
7272d430643SNicolas Chautru 
7282d430643SNicolas Chautru 		/* clear default configuration before initialization */
7297adbb468SMaxime Coquelin 		memset(&conf, 0, sizeof(struct rte_fpga_5gnr_fec_conf));
7302d430643SNicolas Chautru 
7312d430643SNicolas Chautru 		/* Set PF mode :
7322d430643SNicolas Chautru 		 * true if PF is used for data plane
7332d430643SNicolas Chautru 		 * false for VFs
7342d430643SNicolas Chautru 		 */
7352d430643SNicolas Chautru 		conf.pf_mode_en = true;
7362d430643SNicolas Chautru 
7372d430643SNicolas Chautru 		for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) {
7382d430643SNicolas Chautru 			/* Number of UL queues per VF (fpga supports 8 VFs) */
7392d430643SNicolas Chautru 			conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE;
7402d430643SNicolas Chautru 			/* Number of DL queues per VF (fpga supports 8 VFs) */
7412d430643SNicolas Chautru 			conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE;
7422d430643SNicolas Chautru 		}
7432d430643SNicolas Chautru 
7445884e56fSHernan Vargas 		/* UL bandwidth. Needed only for Vista Creek 5GNR schedule algorithm */
7452d430643SNicolas Chautru 		conf.ul_bandwidth = UL_5G_BANDWIDTH;
7465884e56fSHernan Vargas 		/* DL bandwidth. Needed only for Vista Creek 5GNR schedule algorithm  */
7472d430643SNicolas Chautru 		conf.dl_bandwidth = DL_5G_BANDWIDTH;
7482d430643SNicolas Chautru 
7492d430643SNicolas Chautru 		/* UL & DL load Balance Factor to 64 */
7502d430643SNicolas Chautru 		conf.ul_load_balance = UL_5G_LOAD_BALANCE;
7512d430643SNicolas Chautru 		conf.dl_load_balance = DL_5G_LOAD_BALANCE;
7522d430643SNicolas Chautru 
7532d430643SNicolas Chautru 		/* setup FPGA PF with configuration information */
7547adbb468SMaxime Coquelin 		ret = rte_fpga_5gnr_fec_configure(info->dev_name, &conf);
7552d430643SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
7562d430643SNicolas Chautru 				"Failed to configure 5G FPGA PF for bbdev %s",
7572d430643SNicolas Chautru 				info->dev_name);
7582d430643SNicolas Chautru 	}
7592d430643SNicolas Chautru #endif
760dcf43d24SNicolas Chautru #ifdef RTE_BASEBAND_ACC
761b17d7092SNicolas Chautru 	if ((get_init_device() == true) &&
762b17d7092SNicolas Chautru 			(!strcmp(info->drv.driver_name, ACC100PF_DRIVER_NAME))) {
76332e8b7eaSNicolas Chautru 		struct rte_acc_conf conf;
764b17d7092SNicolas Chautru 		unsigned int i;
765b17d7092SNicolas Chautru 
7665884e56fSHernan Vargas 		printf("Configure ACC100 FEC device %s with default values\n",
767b17d7092SNicolas Chautru 				info->drv.driver_name);
768b17d7092SNicolas Chautru 
769b17d7092SNicolas Chautru 		/* clear default configuration before initialization */
77032e8b7eaSNicolas Chautru 		memset(&conf, 0, sizeof(struct rte_acc_conf));
771b17d7092SNicolas Chautru 
772b17d7092SNicolas Chautru 		/* Always set in PF mode for built-in configuration */
773b17d7092SNicolas Chautru 		conf.pf_mode_en = true;
77432e8b7eaSNicolas Chautru 		for (i = 0; i < RTE_ACC_NUM_VFS; ++i) {
775b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
776b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
777b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].round_robin_weight = ACC100_QMGR_RR;
778b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
779b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
780b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].round_robin_weight = ACC100_QMGR_RR;
781b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
782b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
783b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].round_robin_weight = ACC100_QMGR_RR;
784b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
785b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
786b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].round_robin_weight = ACC100_QMGR_RR;
787b17d7092SNicolas Chautru 		}
788b17d7092SNicolas Chautru 
789b17d7092SNicolas Chautru 		conf.input_pos_llr_1_bit = true;
790b17d7092SNicolas Chautru 		conf.output_pos_llr_1_bit = true;
791b17d7092SNicolas Chautru 		conf.num_vf_bundles = 1; /**< Number of VF bundles to setup */
792b17d7092SNicolas Chautru 
793b17d7092SNicolas Chautru 		conf.q_ul_4g.num_qgroups = ACC100_QMGR_NUM_QGS;
794b17d7092SNicolas Chautru 		conf.q_ul_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
795b17d7092SNicolas Chautru 		conf.q_ul_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
796b17d7092SNicolas Chautru 		conf.q_ul_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
797b17d7092SNicolas Chautru 		conf.q_dl_4g.num_qgroups = ACC100_QMGR_NUM_QGS;
798b17d7092SNicolas Chautru 		conf.q_dl_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
799b17d7092SNicolas Chautru 		conf.q_dl_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
800b17d7092SNicolas Chautru 		conf.q_dl_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
801b17d7092SNicolas Chautru 		conf.q_ul_5g.num_qgroups = ACC100_QMGR_NUM_QGS;
802b17d7092SNicolas Chautru 		conf.q_ul_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
803b17d7092SNicolas Chautru 		conf.q_ul_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
804b17d7092SNicolas Chautru 		conf.q_ul_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
805b17d7092SNicolas Chautru 		conf.q_dl_5g.num_qgroups = ACC100_QMGR_NUM_QGS;
806b17d7092SNicolas Chautru 		conf.q_dl_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
807b17d7092SNicolas Chautru 		conf.q_dl_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
808b17d7092SNicolas Chautru 		conf.q_dl_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
809b17d7092SNicolas Chautru 
810b17d7092SNicolas Chautru 		/* setup PF with configuration information */
811c1407bfaSNicolas Chautru 		ret = rte_acc_configure(info->dev_name, &conf);
812b17d7092SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
813b17d7092SNicolas Chautru 				"Failed to configure ACC100 PF for bbdev %s",
814b17d7092SNicolas Chautru 				info->dev_name);
815b17d7092SNicolas Chautru 	}
816c1407bfaSNicolas Chautru 	if ((get_init_device() == true) &&
81761e02ccbSNicolas Chautru 		(!strcmp(info->drv.driver_name, VRBPF_DRIVER_NAME))) {
818c1407bfaSNicolas Chautru 		struct rte_acc_conf conf;
819c1407bfaSNicolas Chautru 		unsigned int i;
820c1407bfaSNicolas Chautru 
82161e02ccbSNicolas Chautru 		printf("Configure Driver %s with default values\n",
822c1407bfaSNicolas Chautru 				info->drv.driver_name);
823c1407bfaSNicolas Chautru 
824c1407bfaSNicolas Chautru 		/* clear default configuration before initialization */
825c1407bfaSNicolas Chautru 		memset(&conf, 0, sizeof(struct rte_acc_conf));
826c1407bfaSNicolas Chautru 
827c1407bfaSNicolas Chautru 		/* Always set in PF mode for built-in configuration */
828c1407bfaSNicolas Chautru 		conf.pf_mode_en = true;
829c1407bfaSNicolas Chautru 		for (i = 0; i < RTE_ACC_NUM_VFS; ++i) {
83061e02ccbSNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = VRB_QOS_GBR;
83161e02ccbSNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = VRB_QOS_GBR;
83261e02ccbSNicolas Chautru 			conf.arb_dl_4g[i].round_robin_weight = VRB_QMGR_RR;
83361e02ccbSNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = VRB_QOS_GBR;
83461e02ccbSNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = VRB_QOS_GBR;
83561e02ccbSNicolas Chautru 			conf.arb_ul_4g[i].round_robin_weight = VRB_QMGR_RR;
83661e02ccbSNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = VRB_QOS_GBR;
83761e02ccbSNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = VRB_QOS_GBR;
83861e02ccbSNicolas Chautru 			conf.arb_dl_5g[i].round_robin_weight = VRB_QMGR_RR;
83961e02ccbSNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = VRB_QOS_GBR;
84061e02ccbSNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = VRB_QOS_GBR;
84161e02ccbSNicolas Chautru 			conf.arb_ul_5g[i].round_robin_weight = VRB_QMGR_RR;
84261e02ccbSNicolas Chautru 			conf.arb_fft[i].gbr_threshold1 = VRB_QOS_GBR;
84361e02ccbSNicolas Chautru 			conf.arb_fft[i].gbr_threshold1 = VRB_QOS_GBR;
84461e02ccbSNicolas Chautru 			conf.arb_fft[i].round_robin_weight = VRB_QMGR_RR;
84595f192a4SHernan Vargas 			conf.arb_mld[i].gbr_threshold1 = VRB_QOS_GBR;
84695f192a4SHernan Vargas 			conf.arb_mld[i].gbr_threshold1 = VRB_QOS_GBR;
84795f192a4SHernan Vargas 			conf.arb_mld[i].round_robin_weight = VRB_QMGR_RR;
848c1407bfaSNicolas Chautru 		}
849c1407bfaSNicolas Chautru 
850c1407bfaSNicolas Chautru 		conf.input_pos_llr_1_bit = true;
851c1407bfaSNicolas Chautru 		conf.output_pos_llr_1_bit = true;
852c1407bfaSNicolas Chautru 		conf.num_vf_bundles = 1; /**< Number of VF bundles to setup */
853c1407bfaSNicolas Chautru 
85461e02ccbSNicolas Chautru 		conf.q_ul_4g.num_qgroups = VRB_QMGR_NUM_QGS;
85561e02ccbSNicolas Chautru 		conf.q_ul_4g.first_qgroup_index = VRB_QMGR_INVALID_IDX;
85661e02ccbSNicolas Chautru 		conf.q_ul_4g.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
85761e02ccbSNicolas Chautru 		conf.q_ul_4g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
85861e02ccbSNicolas Chautru 		conf.q_dl_4g.num_qgroups = VRB_QMGR_NUM_QGS;
85961e02ccbSNicolas Chautru 		conf.q_dl_4g.first_qgroup_index = VRB_QMGR_INVALID_IDX;
86061e02ccbSNicolas Chautru 		conf.q_dl_4g.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
86161e02ccbSNicolas Chautru 		conf.q_dl_4g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
86261e02ccbSNicolas Chautru 		conf.q_ul_5g.num_qgroups = VRB_QMGR_NUM_QGS;
86361e02ccbSNicolas Chautru 		conf.q_ul_5g.first_qgroup_index = VRB_QMGR_INVALID_IDX;
86461e02ccbSNicolas Chautru 		conf.q_ul_5g.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
86561e02ccbSNicolas Chautru 		conf.q_ul_5g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
86661e02ccbSNicolas Chautru 		conf.q_dl_5g.num_qgroups = VRB_QMGR_NUM_QGS;
86761e02ccbSNicolas Chautru 		conf.q_dl_5g.first_qgroup_index = VRB_QMGR_INVALID_IDX;
86861e02ccbSNicolas Chautru 		conf.q_dl_5g.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
86961e02ccbSNicolas Chautru 		conf.q_dl_5g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
87061e02ccbSNicolas Chautru 		conf.q_fft.num_qgroups = VRB_QMGR_NUM_QGS;
87161e02ccbSNicolas Chautru 		conf.q_fft.first_qgroup_index = VRB_QMGR_INVALID_IDX;
87261e02ccbSNicolas Chautru 		conf.q_fft.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
8730ed76d66SHernan Vargas 		conf.q_fft.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
87495f192a4SHernan Vargas 		conf.q_mld.num_qgroups = VRB_QMGR_NUM_QGS;
87595f192a4SHernan Vargas 		conf.q_mld.first_qgroup_index = VRB_QMGR_INVALID_IDX;
87695f192a4SHernan Vargas 		conf.q_mld.num_aqs_per_groups = VRB_QMGR_NUM_AQS;
87795f192a4SHernan Vargas 		conf.q_mld.aq_depth_log2 = VRB_QMGR_AQ_DEPTH;
878c1407bfaSNicolas Chautru 
879c1407bfaSNicolas Chautru 		/* setup PF with configuration information */
880c1407bfaSNicolas Chautru 		ret = rte_acc_configure(info->dev_name, &conf);
881c1407bfaSNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
88261e02ccbSNicolas Chautru 				"Failed to configure PF for bbdev %s",
883c1407bfaSNicolas Chautru 				info->dev_name);
884c1407bfaSNicolas Chautru 	}
885b17d7092SNicolas Chautru #endif
886b17d7092SNicolas Chautru 	/* Let's refresh this now this is configured */
887b17d7092SNicolas Chautru 	rte_bbdev_info_get(dev_id, info);
8883190372dSHernan Vargas 	if (info->drv.device_status == RTE_BBDEV_DEV_FATAL_ERR)
8893190372dSHernan Vargas 		printf("Device Status %s\n", rte_bbdev_device_status_str(info->drv.device_status));
890a2ea86cbSHernan Vargas 	if (info->drv.fft_window_width != NULL)
891a2ea86cbSHernan Vargas 		fft_window_width_dev = info->drv.fft_window_width[0];
892a2ea86cbSHernan Vargas 	else
893a2ea86cbSHernan Vargas 		fft_window_width_dev = 0;
894a2ea86cbSHernan Vargas 	if (fft_window_width_dev != 0)
895a2ea86cbSHernan Vargas 		printf("  FFT Window0 width %d\n", fft_window_width_dev);
896a2ea86cbSHernan Vargas 
897f714a188SAmr Mokhtar 	nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues);
898d819c083SNicolas Chautru 	nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES);
899d819c083SNicolas Chautru 
900f714a188SAmr Mokhtar 	/* setup device */
901f714a188SAmr Mokhtar 	ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id);
902f714a188SAmr Mokhtar 	if (ret < 0) {
903f714a188SAmr Mokhtar 		printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n",
904f714a188SAmr Mokhtar 				dev_id, nb_queues, info->socket_id, ret);
905f714a188SAmr Mokhtar 		return TEST_FAILED;
906f714a188SAmr Mokhtar 	}
907f714a188SAmr Mokhtar 
908f714a188SAmr Mokhtar 	/* configure interrupts if needed */
909f714a188SAmr Mokhtar 	if (intr_enabled) {
910f714a188SAmr Mokhtar 		ret = rte_bbdev_intr_enable(dev_id);
911f714a188SAmr Mokhtar 		if (ret < 0) {
912f714a188SAmr Mokhtar 			printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id,
913f714a188SAmr Mokhtar 					ret);
914f714a188SAmr Mokhtar 			return TEST_FAILED;
915f714a188SAmr Mokhtar 		}
916f714a188SAmr Mokhtar 	}
917f714a188SAmr Mokhtar 
918f714a188SAmr Mokhtar 	/* setup device queues */
919f714a188SAmr Mokhtar 	qconf.socket = info->socket_id;
920f714a188SAmr Mokhtar 	qconf.queue_size = info->drv.default_queue_conf.queue_size;
921f714a188SAmr Mokhtar 	qconf.priority = 0;
922f714a188SAmr Mokhtar 	qconf.deferred_start = 0;
923f714a188SAmr Mokhtar 	qconf.op_type = op_type;
924f714a188SAmr Mokhtar 
925f714a188SAmr Mokhtar 	for (queue_id = 0; queue_id < nb_queues; ++queue_id) {
926f714a188SAmr Mokhtar 		ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf);
927f714a188SAmr Mokhtar 		if (ret != 0) {
928f714a188SAmr Mokhtar 			printf(
929f714a188SAmr Mokhtar 					"Allocated all queues (id=%u) at prio%u on dev%u\n",
930f714a188SAmr Mokhtar 					queue_id, qconf.priority, dev_id);
931f714a188SAmr Mokhtar 			qconf.priority++;
932f32bbc32SHernan Vargas 			ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, &qconf);
933f714a188SAmr Mokhtar 		}
934f714a188SAmr Mokhtar 		if (ret != 0) {
935f32bbc32SHernan Vargas 			printf("All queues on dev %u allocated: %u\n", dev_id, queue_id);
936f32bbc32SHernan Vargas 			break;
937f32bbc32SHernan Vargas 		}
938f32bbc32SHernan Vargas 		ret = rte_bbdev_queue_start(ad->dev_id, queue_id);
939f32bbc32SHernan Vargas 		if (ret != 0) {
940f32bbc32SHernan Vargas 			printf("Failed to start queue on dev %u q_id: %u\n", dev_id, queue_id);
941f714a188SAmr Mokhtar 			break;
942f714a188SAmr Mokhtar 		}
943f714a188SAmr Mokhtar 		ad->queue_ids[queue_id] = queue_id;
944f714a188SAmr Mokhtar 	}
945f714a188SAmr Mokhtar 	TEST_ASSERT(queue_id != 0,
946f32bbc32SHernan Vargas 			"ERROR Failed to configure any queues on dev %u\n"
947f32bbc32SHernan Vargas 			"\tthe device may not support the related operation capability\n"
948f32bbc32SHernan Vargas 			"\tor the device may not have been configured yet", dev_id);
949f714a188SAmr Mokhtar 	ad->nb_queues = queue_id;
950f714a188SAmr Mokhtar 
951f714a188SAmr Mokhtar 	set_avail_op(ad, op_type);
952f714a188SAmr Mokhtar 
953f714a188SAmr Mokhtar 	return TEST_SUCCESS;
954f714a188SAmr Mokhtar }
955f714a188SAmr Mokhtar 
956f714a188SAmr Mokhtar static int
957f714a188SAmr Mokhtar add_active_device(uint8_t dev_id, struct rte_bbdev_info *info,
958f714a188SAmr Mokhtar 		struct test_bbdev_vector *vector)
959f714a188SAmr Mokhtar {
960f714a188SAmr Mokhtar 	int ret;
961f714a188SAmr Mokhtar 
962f714a188SAmr Mokhtar 	active_devs[nb_active_devs].driver_name = info->drv.driver_name;
963f714a188SAmr Mokhtar 	active_devs[nb_active_devs].dev_id = dev_id;
964f714a188SAmr Mokhtar 
965f714a188SAmr Mokhtar 	ret = add_bbdev_dev(dev_id, info, vector);
966f714a188SAmr Mokhtar 	if (ret == TEST_SUCCESS)
967f714a188SAmr Mokhtar 		++nb_active_devs;
968f714a188SAmr Mokhtar 	return ret;
969f714a188SAmr Mokhtar }
970f714a188SAmr Mokhtar 
971f714a188SAmr Mokhtar static uint8_t
972f714a188SAmr Mokhtar populate_active_devices(void)
973f714a188SAmr Mokhtar {
974f714a188SAmr Mokhtar 	int ret;
975f714a188SAmr Mokhtar 	uint8_t dev_id;
976f714a188SAmr Mokhtar 	uint8_t nb_devs_added = 0;
977f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
978f714a188SAmr Mokhtar 
979f714a188SAmr Mokhtar 	RTE_BBDEV_FOREACH(dev_id) {
980f714a188SAmr Mokhtar 		rte_bbdev_info_get(dev_id, &info);
981f714a188SAmr Mokhtar 
982f714a188SAmr Mokhtar 		if (check_dev_cap(&info)) {
983f714a188SAmr Mokhtar 			printf(
984f714a188SAmr Mokhtar 				"Device %d (%s) does not support specified capabilities\n",
985f714a188SAmr Mokhtar 					dev_id, info.dev_name);
986f714a188SAmr Mokhtar 			continue;
987f714a188SAmr Mokhtar 		}
988f714a188SAmr Mokhtar 
989f714a188SAmr Mokhtar 		ret = add_active_device(dev_id, &info, &test_vector);
990f714a188SAmr Mokhtar 		if (ret != 0) {
991f714a188SAmr Mokhtar 			printf("Adding active bbdev %s skipped\n",
992f714a188SAmr Mokhtar 					info.dev_name);
993f714a188SAmr Mokhtar 			continue;
994f714a188SAmr Mokhtar 		}
995f714a188SAmr Mokhtar 		nb_devs_added++;
996f714a188SAmr Mokhtar 	}
997f714a188SAmr Mokhtar 
998f714a188SAmr Mokhtar 	return nb_devs_added;
999f714a188SAmr Mokhtar }
1000f714a188SAmr Mokhtar 
1001f714a188SAmr Mokhtar static int
1002f714a188SAmr Mokhtar read_test_vector(void)
1003f714a188SAmr Mokhtar {
1004f714a188SAmr Mokhtar 	int ret;
1005f714a188SAmr Mokhtar 
1006f714a188SAmr Mokhtar 	memset(&test_vector, 0, sizeof(test_vector));
1007f714a188SAmr Mokhtar 	printf("Test vector file = %s\n", get_vector_filename());
1008f714a188SAmr Mokhtar 	ret = test_bbdev_vector_read(get_vector_filename(), &test_vector);
1009f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n",
1010f714a188SAmr Mokhtar 			get_vector_filename());
1011f714a188SAmr Mokhtar 
1012f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1013f714a188SAmr Mokhtar }
1014f714a188SAmr Mokhtar 
1015f714a188SAmr Mokhtar static int
1016f714a188SAmr Mokhtar testsuite_setup(void)
1017f714a188SAmr Mokhtar {
1018f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
1019f714a188SAmr Mokhtar 
1020f714a188SAmr Mokhtar 	if (populate_active_devices() == 0) {
1021f714a188SAmr Mokhtar 		printf("No suitable devices found!\n");
1022f714a188SAmr Mokhtar 		return TEST_SKIPPED;
1023f714a188SAmr Mokhtar 	}
1024f714a188SAmr Mokhtar 
1025f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1026f714a188SAmr Mokhtar }
1027f714a188SAmr Mokhtar 
1028f714a188SAmr Mokhtar static int
1029f714a188SAmr Mokhtar interrupt_testsuite_setup(void)
1030f714a188SAmr Mokhtar {
1031f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
1032f714a188SAmr Mokhtar 
1033f714a188SAmr Mokhtar 	/* Enable interrupts */
1034f714a188SAmr Mokhtar 	intr_enabled = true;
1035f714a188SAmr Mokhtar 
1036f714a188SAmr Mokhtar 	/* Special case for NULL device (RTE_BBDEV_OP_NONE) */
1037f714a188SAmr Mokhtar 	if (populate_active_devices() == 0 ||
1038f714a188SAmr Mokhtar 			test_vector.op_type == RTE_BBDEV_OP_NONE) {
1039f714a188SAmr Mokhtar 		intr_enabled = false;
1040f714a188SAmr Mokhtar 		printf("No suitable devices found!\n");
1041f714a188SAmr Mokhtar 		return TEST_SKIPPED;
1042f714a188SAmr Mokhtar 	}
1043f714a188SAmr Mokhtar 
1044f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1045f714a188SAmr Mokhtar }
1046f714a188SAmr Mokhtar 
1047f714a188SAmr Mokhtar static void
1048f714a188SAmr Mokhtar testsuite_teardown(void)
1049f714a188SAmr Mokhtar {
1050f714a188SAmr Mokhtar 	uint8_t dev_id;
1051f714a188SAmr Mokhtar 
1052f714a188SAmr Mokhtar 	/* Unconfigure devices */
1053f714a188SAmr Mokhtar 	RTE_BBDEV_FOREACH(dev_id)
1054f714a188SAmr Mokhtar 		rte_bbdev_close(dev_id);
1055f714a188SAmr Mokhtar 
1056f714a188SAmr Mokhtar 	/* Clear active devices structs. */
1057f714a188SAmr Mokhtar 	memset(active_devs, 0, sizeof(active_devs));
1058f714a188SAmr Mokhtar 	nb_active_devs = 0;
1059f162c475SNicolas Chautru 
1060f162c475SNicolas Chautru 	/* Disable interrupts */
1061f162c475SNicolas Chautru 	intr_enabled = false;
1062f714a188SAmr Mokhtar }
1063f714a188SAmr Mokhtar 
1064f714a188SAmr Mokhtar static int
1065f714a188SAmr Mokhtar ut_setup(void)
1066f714a188SAmr Mokhtar {
1067f714a188SAmr Mokhtar 	uint8_t i, dev_id;
1068f714a188SAmr Mokhtar 
1069f714a188SAmr Mokhtar 	for (i = 0; i < nb_active_devs; i++) {
1070f714a188SAmr Mokhtar 		dev_id = active_devs[i].dev_id;
1071f714a188SAmr Mokhtar 		/* reset bbdev stats */
1072f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
1073f714a188SAmr Mokhtar 				"Failed to reset stats of bbdev %u", dev_id);
1074f714a188SAmr Mokhtar 		/* start the device */
1075f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
1076f714a188SAmr Mokhtar 				"Failed to start bbdev %u", dev_id);
1077f714a188SAmr Mokhtar 	}
1078f714a188SAmr Mokhtar 
1079f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1080f714a188SAmr Mokhtar }
1081f714a188SAmr Mokhtar 
1082f714a188SAmr Mokhtar static void
1083f714a188SAmr Mokhtar ut_teardown(void)
1084f714a188SAmr Mokhtar {
10855884e56fSHernan Vargas 	uint8_t i, dev_id, ret;
1086f714a188SAmr Mokhtar 	struct rte_bbdev_stats stats;
1087f714a188SAmr Mokhtar 
1088f714a188SAmr Mokhtar 	for (i = 0; i < nb_active_devs; i++) {
1089f714a188SAmr Mokhtar 		dev_id = active_devs[i].dev_id;
1090f714a188SAmr Mokhtar 		/* read stats and print */
10915884e56fSHernan Vargas 		ret = rte_bbdev_stats_get(dev_id, &stats);
10925884e56fSHernan Vargas 		if (ret != 0)
10935884e56fSHernan Vargas 			printf("Failed to get stats on bbdev %u\n", dev_id);
1094f714a188SAmr Mokhtar 		/* Stop the device */
1095f714a188SAmr Mokhtar 		rte_bbdev_stop(dev_id);
1096f714a188SAmr Mokhtar 	}
1097f714a188SAmr Mokhtar }
1098f714a188SAmr Mokhtar 
1099f714a188SAmr Mokhtar static int
1100f714a188SAmr Mokhtar init_op_data_objs(struct rte_bbdev_op_data *bufs,
1101f714a188SAmr Mokhtar 		struct op_data_entries *ref_entries,
1102f714a188SAmr Mokhtar 		struct rte_mempool *mbuf_pool, const uint16_t n,
1103f714a188SAmr Mokhtar 		enum op_data_type op_type, uint16_t min_alignment)
1104f714a188SAmr Mokhtar {
1105f714a188SAmr Mokhtar 	int ret;
1106f714a188SAmr Mokhtar 	unsigned int i, j;
110731a7853dSNicolas Chautru 	bool large_input = false;
1108f714a188SAmr Mokhtar 
1109f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
1110f714a188SAmr Mokhtar 		char *data;
1111f714a188SAmr Mokhtar 		struct op_data_buf *seg = &ref_entries->segments[0];
1112f714a188SAmr Mokhtar 		struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool);
1113f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(m_head,
1114f714a188SAmr Mokhtar 				"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
1115f714a188SAmr Mokhtar 				op_type, n * ref_entries->nb_segments,
1116f714a188SAmr Mokhtar 				mbuf_pool->size);
1117f714a188SAmr Mokhtar 
11180acdb986SNicolas Chautru 		if ((seg->length + RTE_PKTMBUF_HEADROOM) > RTE_BBDEV_LDPC_E_MAX_MBUF) {
111931a7853dSNicolas Chautru 			/*
112031a7853dSNicolas Chautru 			 * Special case when DPDK mbuf cannot handle
112131a7853dSNicolas Chautru 			 * the required input size
112231a7853dSNicolas Chautru 			 */
112331a7853dSNicolas Chautru 			large_input = true;
112431a7853dSNicolas Chautru 		}
1125f714a188SAmr Mokhtar 		bufs[i].data = m_head;
1126f714a188SAmr Mokhtar 		bufs[i].offset = 0;
1127f714a188SAmr Mokhtar 		bufs[i].length = 0;
1128f714a188SAmr Mokhtar 
1129d819c083SNicolas Chautru 		if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) {
11300acdb986SNicolas Chautru 			if (large_input) {
113131a7853dSNicolas Chautru 				/* Allocate a fake overused mbuf */
113231a7853dSNicolas Chautru 				data = rte_malloc(NULL, seg->length, 0);
1133bc4c9418SMin Hu (Connor) 				TEST_ASSERT_NOT_NULL(data,
1134bc4c9418SMin Hu (Connor) 					"rte malloc failed with %u bytes",
1135bc4c9418SMin Hu (Connor) 					seg->length);
113631a7853dSNicolas Chautru 				memcpy(data, seg->addr, seg->length);
113731a7853dSNicolas Chautru 				m_head->buf_addr = data;
1138e811e2d7SShijith Thotton 				rte_mbuf_iova_set(m_head, rte_malloc_virt2iova(data));
113931a7853dSNicolas Chautru 				m_head->data_off = 0;
114031a7853dSNicolas Chautru 				m_head->data_len = seg->length;
114131a7853dSNicolas Chautru 			} else {
1142f714a188SAmr Mokhtar 				data = rte_pktmbuf_append(m_head, seg->length);
1143f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(data,
1144f714a188SAmr Mokhtar 					"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
1145f714a188SAmr Mokhtar 					seg->length, op_type);
1146f714a188SAmr Mokhtar 
114731a7853dSNicolas Chautru 				TEST_ASSERT(data == RTE_PTR_ALIGN(
114831a7853dSNicolas Chautru 						data, min_alignment),
1149f714a188SAmr Mokhtar 					"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
1150f714a188SAmr Mokhtar 					data, min_alignment);
1151f714a188SAmr Mokhtar 				rte_memcpy(data, seg->addr, seg->length);
115231a7853dSNicolas Chautru 			}
115331a7853dSNicolas Chautru 
1154f714a188SAmr Mokhtar 			bufs[i].length += seg->length;
1155f714a188SAmr Mokhtar 
1156f714a188SAmr Mokhtar 			for (j = 1; j < ref_entries->nb_segments; ++j) {
1157f714a188SAmr Mokhtar 				struct rte_mbuf *m_tail =
1158f714a188SAmr Mokhtar 						rte_pktmbuf_alloc(mbuf_pool);
1159f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(m_tail,
1160f714a188SAmr Mokhtar 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
1161f714a188SAmr Mokhtar 						op_type,
1162f714a188SAmr Mokhtar 						n * ref_entries->nb_segments,
1163f714a188SAmr Mokhtar 						mbuf_pool->size);
1164f714a188SAmr Mokhtar 				seg += 1;
1165f714a188SAmr Mokhtar 
1166f714a188SAmr Mokhtar 				data = rte_pktmbuf_append(m_tail, seg->length);
1167f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(data,
1168f714a188SAmr Mokhtar 						"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
1169f714a188SAmr Mokhtar 						seg->length, op_type);
1170f714a188SAmr Mokhtar 
1171f714a188SAmr Mokhtar 				TEST_ASSERT(data == RTE_PTR_ALIGN(data,
1172f714a188SAmr Mokhtar 						min_alignment),
1173f714a188SAmr Mokhtar 						"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
1174f714a188SAmr Mokhtar 						data, min_alignment);
1175f714a188SAmr Mokhtar 				rte_memcpy(data, seg->addr, seg->length);
1176f714a188SAmr Mokhtar 				bufs[i].length += seg->length;
1177f714a188SAmr Mokhtar 
1178f714a188SAmr Mokhtar 				ret = rte_pktmbuf_chain(m_head, m_tail);
1179f714a188SAmr Mokhtar 				TEST_ASSERT_SUCCESS(ret,
1180f714a188SAmr Mokhtar 						"Couldn't chain mbufs from %d data type mbuf pool",
1181f714a188SAmr Mokhtar 						op_type);
1182f714a188SAmr Mokhtar 			}
11839585f8b1SKamil Chalupnik 		} else {
11840acdb986SNicolas Chautru 			if (((op_type == DATA_HARD_OUTPUT) || (op_type == DATA_SOFT_OUTPUT))
11850acdb986SNicolas Chautru 					&& ((seg->length + RTE_PKTMBUF_HEADROOM)
11860acdb986SNicolas Chautru 					> RTE_BBDEV_LDPC_E_MAX_MBUF)) {
11870acdb986SNicolas Chautru 				/* Allocate a fake overused mbuf + margin */
11880acdb986SNicolas Chautru 				data = rte_malloc(NULL, seg->length + 1024, 0);
11890acdb986SNicolas Chautru 				TEST_ASSERT_NOT_NULL(data,
11900acdb986SNicolas Chautru 					"rte malloc failed with %u bytes",
11910acdb986SNicolas Chautru 					seg->length + 1024);
11920acdb986SNicolas Chautru 				m_head->buf_addr = data;
1193a62ac101SSrikanth Yalavarthi 				rte_mbuf_iova_set(m_head, rte_malloc_virt2iova(data));
11940acdb986SNicolas Chautru 				m_head->data_off = 0;
11950acdb986SNicolas Chautru 				m_head->data_len = seg->length;
11960acdb986SNicolas Chautru 			} else {
11979585f8b1SKamil Chalupnik 				/* allocate chained-mbuf for output buffer */
11989585f8b1SKamil Chalupnik 				for (j = 1; j < ref_entries->nb_segments; ++j) {
11999585f8b1SKamil Chalupnik 					struct rte_mbuf *m_tail =
12009585f8b1SKamil Chalupnik 						rte_pktmbuf_alloc(mbuf_pool);
12019585f8b1SKamil Chalupnik 					TEST_ASSERT_NOT_NULL(m_tail,
12029585f8b1SKamil Chalupnik 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
12039585f8b1SKamil Chalupnik 						op_type,
12049585f8b1SKamil Chalupnik 						n * ref_entries->nb_segments,
12059585f8b1SKamil Chalupnik 						mbuf_pool->size);
12069585f8b1SKamil Chalupnik 
12079585f8b1SKamil Chalupnik 					ret = rte_pktmbuf_chain(m_head, m_tail);
12089585f8b1SKamil Chalupnik 					TEST_ASSERT_SUCCESS(ret,
12099585f8b1SKamil Chalupnik 						"Couldn't chain mbufs from %d data type mbuf pool",
12109585f8b1SKamil Chalupnik 						op_type);
12119585f8b1SKamil Chalupnik 				}
1212f714a188SAmr Mokhtar 			}
12130acdb986SNicolas Chautru 			bufs[i].length += seg->length;
12140acdb986SNicolas Chautru 		}
1215f714a188SAmr Mokhtar 	}
1216f714a188SAmr Mokhtar 
1217f714a188SAmr Mokhtar 	return 0;
1218f714a188SAmr Mokhtar }
1219f714a188SAmr Mokhtar 
1220f714a188SAmr Mokhtar static int
1221f714a188SAmr Mokhtar allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len,
1222f714a188SAmr Mokhtar 		const int socket)
1223f714a188SAmr Mokhtar {
1224f714a188SAmr Mokhtar 	int i;
1225f714a188SAmr Mokhtar 
1226f714a188SAmr Mokhtar 	*buffers = rte_zmalloc_socket(NULL, len, 0, socket);
1227f714a188SAmr Mokhtar 	if (*buffers == NULL) {
1228f714a188SAmr Mokhtar 		printf("WARNING: Failed to allocate op_data on socket %d\n",
1229f714a188SAmr Mokhtar 				socket);
1230f714a188SAmr Mokhtar 		/* try to allocate memory on other detected sockets */
1231f714a188SAmr Mokhtar 		for (i = 0; i < socket; i++) {
1232f714a188SAmr Mokhtar 			*buffers = rte_zmalloc_socket(NULL, len, 0, i);
1233f714a188SAmr Mokhtar 			if (*buffers != NULL)
1234f714a188SAmr Mokhtar 				break;
1235f714a188SAmr Mokhtar 		}
1236f714a188SAmr Mokhtar 	}
1237f714a188SAmr Mokhtar 
1238f714a188SAmr Mokhtar 	return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS;
1239f714a188SAmr Mokhtar }
1240f714a188SAmr Mokhtar 
124147d5a049SKamil Chalupnik static void
124247d5a049SKamil Chalupnik limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops,
1243d819c083SNicolas Chautru 		const uint16_t n, const int8_t max_llr_modulus)
124447d5a049SKamil Chalupnik {
124547d5a049SKamil Chalupnik 	uint16_t i, byte_idx;
124647d5a049SKamil Chalupnik 
124747d5a049SKamil Chalupnik 	for (i = 0; i < n; ++i) {
124847d5a049SKamil Chalupnik 		struct rte_mbuf *m = input_ops[i].data;
124947d5a049SKamil Chalupnik 		while (m != NULL) {
125047d5a049SKamil Chalupnik 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
125147d5a049SKamil Chalupnik 					input_ops[i].offset);
12529585f8b1SKamil Chalupnik 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
125347d5a049SKamil Chalupnik 					++byte_idx)
125447d5a049SKamil Chalupnik 				llr[byte_idx] = round((double)max_llr_modulus *
125547d5a049SKamil Chalupnik 						llr[byte_idx] / INT8_MAX);
125647d5a049SKamil Chalupnik 
125747d5a049SKamil Chalupnik 			m = m->next;
125847d5a049SKamil Chalupnik 		}
125947d5a049SKamil Chalupnik 	}
126047d5a049SKamil Chalupnik }
126147d5a049SKamil Chalupnik 
1262335c11fdSNicolas Chautru /*
1263335c11fdSNicolas Chautru  * We may have to insert filler bits
1264335c11fdSNicolas Chautru  * when they are required by the HARQ assumption
1265335c11fdSNicolas Chautru  */
1266335c11fdSNicolas Chautru static void
1267335c11fdSNicolas Chautru ldpc_add_filler(struct rte_bbdev_op_data *input_ops,
1268335c11fdSNicolas Chautru 		const uint16_t n, struct test_op_params *op_params)
1269335c11fdSNicolas Chautru {
1270335c11fdSNicolas Chautru 	struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec;
1271335c11fdSNicolas Chautru 
1272335c11fdSNicolas Chautru 	if (input_ops == NULL)
1273335c11fdSNicolas Chautru 		return;
1274335c11fdSNicolas Chautru 	/* No need to add filler if not required by device */
1275335c11fdSNicolas Chautru 	if (!(ldpc_cap_flags &
1276335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS))
1277335c11fdSNicolas Chautru 		return;
1278335c11fdSNicolas Chautru 	/* No need to add filler for loopback operation */
1279335c11fdSNicolas Chautru 	if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
1280335c11fdSNicolas Chautru 		return;
1281335c11fdSNicolas Chautru 
1282335c11fdSNicolas Chautru 	uint16_t i, j, parity_offset;
1283335c11fdSNicolas Chautru 	for (i = 0; i < n; ++i) {
1284335c11fdSNicolas Chautru 		struct rte_mbuf *m = input_ops[i].data;
1285335c11fdSNicolas Chautru 		int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
1286335c11fdSNicolas Chautru 				input_ops[i].offset);
1287335c11fdSNicolas Chautru 		parity_offset = (dec.basegraph == 1 ? 20 : 8)
1288335c11fdSNicolas Chautru 				* dec.z_c - dec.n_filler;
1289335c11fdSNicolas Chautru 		uint16_t new_hin_size = input_ops[i].length + dec.n_filler;
1290335c11fdSNicolas Chautru 		m->data_len = new_hin_size;
1291335c11fdSNicolas Chautru 		input_ops[i].length = new_hin_size;
1292335c11fdSNicolas Chautru 		for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler;
1293335c11fdSNicolas Chautru 				j--)
1294335c11fdSNicolas Chautru 			llr[j] = llr[j - dec.n_filler];
1295335c11fdSNicolas Chautru 		uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1;
1296335c11fdSNicolas Chautru 		for (j = 0; j < dec.n_filler; j++)
1297335c11fdSNicolas Chautru 			llr[parity_offset + j] = llr_max_pre_scaling;
1298335c11fdSNicolas Chautru 	}
1299335c11fdSNicolas Chautru }
1300335c11fdSNicolas Chautru 
1301d819c083SNicolas Chautru static void
1302d819c083SNicolas Chautru ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops,
1303d819c083SNicolas Chautru 		const uint16_t n, const int8_t llr_size,
1304d819c083SNicolas Chautru 		const int8_t llr_decimals)
1305d819c083SNicolas Chautru {
1306d819c083SNicolas Chautru 	if (input_ops == NULL)
1307d819c083SNicolas Chautru 		return;
1308d819c083SNicolas Chautru 
1309d819c083SNicolas Chautru 	uint16_t i, byte_idx;
1310d819c083SNicolas Chautru 
1311d819c083SNicolas Chautru 	int16_t llr_max, llr_min, llr_tmp;
1312d819c083SNicolas Chautru 	llr_max = (1 << (llr_size - 1)) - 1;
1313d819c083SNicolas Chautru 	llr_min = -llr_max;
1314d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
1315d819c083SNicolas Chautru 		struct rte_mbuf *m = input_ops[i].data;
1316d819c083SNicolas Chautru 		while (m != NULL) {
1317d819c083SNicolas Chautru 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
1318d819c083SNicolas Chautru 					input_ops[i].offset);
1319d819c083SNicolas Chautru 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
1320d819c083SNicolas Chautru 					++byte_idx) {
1321d819c083SNicolas Chautru 
1322d819c083SNicolas Chautru 				llr_tmp = llr[byte_idx];
1323335c11fdSNicolas Chautru 				if (llr_decimals == 4)
1324335c11fdSNicolas Chautru 					llr_tmp *= 8;
1325335c11fdSNicolas Chautru 				else if (llr_decimals == 2)
1326d819c083SNicolas Chautru 					llr_tmp *= 2;
1327d819c083SNicolas Chautru 				else if (llr_decimals == 0)
1328d819c083SNicolas Chautru 					llr_tmp /= 2;
1329d819c083SNicolas Chautru 				llr_tmp = RTE_MIN(llr_max,
1330d819c083SNicolas Chautru 						RTE_MAX(llr_min, llr_tmp));
1331d819c083SNicolas Chautru 				llr[byte_idx] = (int8_t) llr_tmp;
1332d819c083SNicolas Chautru 			}
1333d819c083SNicolas Chautru 
1334d819c083SNicolas Chautru 			m = m->next;
1335d819c083SNicolas Chautru 		}
1336d819c083SNicolas Chautru 	}
1337d819c083SNicolas Chautru }
1338d819c083SNicolas Chautru 
1339d819c083SNicolas Chautru 
1340d819c083SNicolas Chautru 
1341f714a188SAmr Mokhtar static int
1342f714a188SAmr Mokhtar fill_queue_buffers(struct test_op_params *op_params,
1343f714a188SAmr Mokhtar 		struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp,
1344d819c083SNicolas Chautru 		struct rte_mempool *soft_out_mp,
1345d819c083SNicolas Chautru 		struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp,
1346d819c083SNicolas Chautru 		uint16_t queue_id,
134747d5a049SKamil Chalupnik 		const struct rte_bbdev_op_cap *capabilities,
1348f714a188SAmr Mokhtar 		uint16_t min_alignment, const int socket_id)
1349f714a188SAmr Mokhtar {
1350f714a188SAmr Mokhtar 	int ret;
1351f714a188SAmr Mokhtar 	enum op_data_type type;
1352f714a188SAmr Mokhtar 	const uint16_t n = op_params->num_to_process;
1353f714a188SAmr Mokhtar 
1354f714a188SAmr Mokhtar 	struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {
1355f714a188SAmr Mokhtar 		in_mp,
1356f714a188SAmr Mokhtar 		soft_out_mp,
1357f714a188SAmr Mokhtar 		hard_out_mp,
1358d819c083SNicolas Chautru 		harq_in_mp,
1359d819c083SNicolas Chautru 		harq_out_mp,
1360f714a188SAmr Mokhtar 	};
1361f714a188SAmr Mokhtar 
1362f714a188SAmr Mokhtar 	struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {
1363f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].inputs,
1364f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].soft_outputs,
1365f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].hard_outputs,
1366d819c083SNicolas Chautru 		&op_params->q_bufs[socket_id][queue_id].harq_inputs,
1367d819c083SNicolas Chautru 		&op_params->q_bufs[socket_id][queue_id].harq_outputs,
1368f714a188SAmr Mokhtar 	};
1369f714a188SAmr Mokhtar 
1370f714a188SAmr Mokhtar 	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
1371f714a188SAmr Mokhtar 		struct op_data_entries *ref_entries =
1372f714a188SAmr Mokhtar 				&test_vector.entries[type];
1373f714a188SAmr Mokhtar 		if (ref_entries->nb_segments == 0)
1374f714a188SAmr Mokhtar 			continue;
1375f714a188SAmr Mokhtar 
1376f714a188SAmr Mokhtar 		ret = allocate_buffers_on_socket(queue_ops[type],
1377f714a188SAmr Mokhtar 				n * sizeof(struct rte_bbdev_op_data),
1378f714a188SAmr Mokhtar 				socket_id);
1379f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
1380f714a188SAmr Mokhtar 				"Couldn't allocate memory for rte_bbdev_op_data structs");
1381f714a188SAmr Mokhtar 
1382f714a188SAmr Mokhtar 		ret = init_op_data_objs(*queue_ops[type], ref_entries,
1383f714a188SAmr Mokhtar 				mbuf_pools[type], n, type, min_alignment);
1384f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
1385f714a188SAmr Mokhtar 				"Couldn't init rte_bbdev_op_data structs");
1386f714a188SAmr Mokhtar 	}
1387f714a188SAmr Mokhtar 
138847d5a049SKamil Chalupnik 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
138947d5a049SKamil Chalupnik 		limit_input_llr_val_range(*queue_ops[DATA_INPUT], n,
139047d5a049SKamil Chalupnik 			capabilities->cap.turbo_dec.max_llr_modulus);
139147d5a049SKamil Chalupnik 
1392d819c083SNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
1393335c11fdSNicolas Chautru 		bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags &
1394335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
1395335c11fdSNicolas Chautru 		bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags &
1396335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_LLR_COMPRESSION;
1397335c11fdSNicolas Chautru 		bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags &
1398335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
13999d9d73ebSHernan Vargas 
1400335c11fdSNicolas Chautru 		ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals;
1401335c11fdSNicolas Chautru 		ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size;
1402335c11fdSNicolas Chautru 		ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags;
1403335c11fdSNicolas Chautru 		if (!loopback && !llr_comp)
1404d819c083SNicolas Chautru 			ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n,
1405335c11fdSNicolas Chautru 					ldpc_llr_size, ldpc_llr_decimals);
1406335c11fdSNicolas Chautru 		if (!loopback && !harq_comp)
1407d819c083SNicolas Chautru 			ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n,
1408335c11fdSNicolas Chautru 					ldpc_llr_size, ldpc_llr_decimals);
1409335c11fdSNicolas Chautru 		if (!loopback)
1410335c11fdSNicolas Chautru 			ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n,
1411335c11fdSNicolas Chautru 					op_params);
1412d819c083SNicolas Chautru 	}
1413d819c083SNicolas Chautru 
1414f714a188SAmr Mokhtar 	return 0;
1415f714a188SAmr Mokhtar }
1416f714a188SAmr Mokhtar 
1417f714a188SAmr Mokhtar static void
1418f714a188SAmr Mokhtar free_buffers(struct active_device *ad, struct test_op_params *op_params)
1419f714a188SAmr Mokhtar {
1420f714a188SAmr Mokhtar 	unsigned int i, j;
1421f714a188SAmr Mokhtar 
1422f714a188SAmr Mokhtar 	rte_mempool_free(ad->ops_mempool);
1423f714a188SAmr Mokhtar 	rte_mempool_free(ad->in_mbuf_pool);
1424f714a188SAmr Mokhtar 	rte_mempool_free(ad->hard_out_mbuf_pool);
1425f714a188SAmr Mokhtar 	rte_mempool_free(ad->soft_out_mbuf_pool);
1426d819c083SNicolas Chautru 	rte_mempool_free(ad->harq_in_mbuf_pool);
1427d819c083SNicolas Chautru 	rte_mempool_free(ad->harq_out_mbuf_pool);
1428f714a188SAmr Mokhtar 
1429f714a188SAmr Mokhtar 	for (i = 0; i < rte_lcore_count(); ++i) {
1430f714a188SAmr Mokhtar 		for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) {
1431f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].inputs);
1432f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].hard_outputs);
1433f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].soft_outputs);
1434d819c083SNicolas Chautru 			rte_free(op_params->q_bufs[j][i].harq_inputs);
1435d819c083SNicolas Chautru 			rte_free(op_params->q_bufs[j][i].harq_outputs);
1436f714a188SAmr Mokhtar 		}
1437f714a188SAmr Mokhtar 	}
1438f714a188SAmr Mokhtar }
1439f714a188SAmr Mokhtar 
1440f714a188SAmr Mokhtar static void
1441f714a188SAmr Mokhtar copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1442f714a188SAmr Mokhtar 		unsigned int start_idx,
1443f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *inputs,
1444f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *hard_outputs,
1445f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *soft_outputs,
1446f714a188SAmr Mokhtar 		struct rte_bbdev_dec_op *ref_op)
1447f714a188SAmr Mokhtar {
1448f714a188SAmr Mokhtar 	unsigned int i;
1449f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec;
1450f714a188SAmr Mokhtar 
1451f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
145248fc315fSNicolas Chautru 		if (turbo_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1453f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.ea =
1454f714a188SAmr Mokhtar 					turbo_dec->tb_params.ea;
1455f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.eb =
1456f714a188SAmr Mokhtar 					turbo_dec->tb_params.eb;
1457f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.k_pos =
1458f714a188SAmr Mokhtar 					turbo_dec->tb_params.k_pos;
1459f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.k_neg =
1460f714a188SAmr Mokhtar 					turbo_dec->tb_params.k_neg;
1461f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.c =
1462f714a188SAmr Mokhtar 					turbo_dec->tb_params.c;
1463f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.c_neg =
1464f714a188SAmr Mokhtar 					turbo_dec->tb_params.c_neg;
1465f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.cab =
1466f714a188SAmr Mokhtar 					turbo_dec->tb_params.cab;
14670b98d574SKamil Chalupnik 			ops[i]->turbo_dec.tb_params.r =
14680b98d574SKamil Chalupnik 					turbo_dec->tb_params.r;
1469f714a188SAmr Mokhtar 		} else {
1470f714a188SAmr Mokhtar 			ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e;
1471f714a188SAmr Mokhtar 			ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k;
1472f714a188SAmr Mokhtar 		}
1473f714a188SAmr Mokhtar 
1474f714a188SAmr Mokhtar 		ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale;
1475f714a188SAmr Mokhtar 		ops[i]->turbo_dec.iter_max = turbo_dec->iter_max;
1476f714a188SAmr Mokhtar 		ops[i]->turbo_dec.iter_min = turbo_dec->iter_min;
1477f714a188SAmr Mokhtar 		ops[i]->turbo_dec.op_flags = turbo_dec->op_flags;
1478f714a188SAmr Mokhtar 		ops[i]->turbo_dec.rv_index = turbo_dec->rv_index;
1479f714a188SAmr Mokhtar 		ops[i]->turbo_dec.num_maps = turbo_dec->num_maps;
1480f714a188SAmr Mokhtar 		ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode;
1481f714a188SAmr Mokhtar 
1482f714a188SAmr Mokhtar 		ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i];
1483f714a188SAmr Mokhtar 		ops[i]->turbo_dec.input = inputs[start_idx + i];
1484f714a188SAmr Mokhtar 		if (soft_outputs != NULL)
1485f714a188SAmr Mokhtar 			ops[i]->turbo_dec.soft_output =
1486f714a188SAmr Mokhtar 				soft_outputs[start_idx + i];
1487f714a188SAmr Mokhtar 	}
1488f714a188SAmr Mokhtar }
1489f714a188SAmr Mokhtar 
1490f714a188SAmr Mokhtar static void
1491f714a188SAmr Mokhtar copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1492f714a188SAmr Mokhtar 		unsigned int start_idx,
1493f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *inputs,
1494f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *outputs,
1495f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op)
1496f714a188SAmr Mokhtar {
1497f714a188SAmr Mokhtar 	unsigned int i;
1498f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc;
1499f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
150048fc315fSNicolas Chautru 		if (turbo_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1501f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ea =
1502f714a188SAmr Mokhtar 					turbo_enc->tb_params.ea;
1503f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.eb =
1504f714a188SAmr Mokhtar 					turbo_enc->tb_params.eb;
1505f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.k_pos =
1506f714a188SAmr Mokhtar 					turbo_enc->tb_params.k_pos;
1507f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.k_neg =
1508f714a188SAmr Mokhtar 					turbo_enc->tb_params.k_neg;
1509f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.c =
1510f714a188SAmr Mokhtar 					turbo_enc->tb_params.c;
1511f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.c_neg =
1512f714a188SAmr Mokhtar 					turbo_enc->tb_params.c_neg;
1513f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.cab =
1514f714a188SAmr Mokhtar 					turbo_enc->tb_params.cab;
1515f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ncb_pos =
1516f714a188SAmr Mokhtar 					turbo_enc->tb_params.ncb_pos;
1517f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ncb_neg =
1518f714a188SAmr Mokhtar 					turbo_enc->tb_params.ncb_neg;
1519f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r;
1520f714a188SAmr Mokhtar 		} else {
1521f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e;
1522f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k;
1523f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.ncb =
1524f714a188SAmr Mokhtar 					turbo_enc->cb_params.ncb;
1525f714a188SAmr Mokhtar 		}
1526f714a188SAmr Mokhtar 		ops[i]->turbo_enc.rv_index = turbo_enc->rv_index;
1527f714a188SAmr Mokhtar 		ops[i]->turbo_enc.op_flags = turbo_enc->op_flags;
1528f714a188SAmr Mokhtar 		ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode;
1529f714a188SAmr Mokhtar 
1530f714a188SAmr Mokhtar 		ops[i]->turbo_enc.output = outputs[start_idx + i];
1531f714a188SAmr Mokhtar 		ops[i]->turbo_enc.input = inputs[start_idx + i];
1532f714a188SAmr Mokhtar 	}
1533f714a188SAmr Mokhtar }
1534f714a188SAmr Mokhtar 
1535f41c6e4dSNicolas Chautru 
1536f41c6e4dSNicolas Chautru /* Returns a random number drawn from a normal distribution
1537f41c6e4dSNicolas Chautru  * with mean of 0 and variance of 1
1538f41c6e4dSNicolas Chautru  * Marsaglia algorithm
1539f41c6e4dSNicolas Chautru  */
1540f41c6e4dSNicolas Chautru static double
1541f41c6e4dSNicolas Chautru randn(int n)
1542f41c6e4dSNicolas Chautru {
1543f41c6e4dSNicolas Chautru 	double S, Z, U1, U2, u, v, fac;
1544f41c6e4dSNicolas Chautru 
1545f41c6e4dSNicolas Chautru 	do {
1546f41c6e4dSNicolas Chautru 		U1 = (double)rand() / RAND_MAX;
1547f41c6e4dSNicolas Chautru 		U2 = (double)rand() / RAND_MAX;
1548f41c6e4dSNicolas Chautru 		u = 2. * U1 - 1.;
1549f41c6e4dSNicolas Chautru 		v = 2. * U2 - 1.;
1550f41c6e4dSNicolas Chautru 		S = u * u + v * v;
1551f41c6e4dSNicolas Chautru 	} while (S >= 1 || S == 0);
1552f41c6e4dSNicolas Chautru 	fac = sqrt(-2. * log(S) / S);
1553f41c6e4dSNicolas Chautru 	Z = (n % 2) ? u * fac : v * fac;
1554f41c6e4dSNicolas Chautru 	return Z;
1555f41c6e4dSNicolas Chautru }
1556f41c6e4dSNicolas Chautru 
1557f41c6e4dSNicolas Chautru static inline double
1558f41c6e4dSNicolas Chautru maxstar(double A, double B)
1559f41c6e4dSNicolas Chautru {
1560f41c6e4dSNicolas Chautru 	if (fabs(A - B) > 5)
1561f41c6e4dSNicolas Chautru 		return RTE_MAX(A, B);
1562f41c6e4dSNicolas Chautru 	else
1563f41c6e4dSNicolas Chautru 		return RTE_MAX(A, B) + log1p(exp(-fabs(A - B)));
1564f41c6e4dSNicolas Chautru }
1565f41c6e4dSNicolas Chautru 
1566f41c6e4dSNicolas Chautru /*
1567f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==8
1568f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1569f41c6e4dSNicolas Chautru  */
1570f41c6e4dSNicolas Chautru static void
1571f41c6e4dSNicolas Chautru gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1572f41c6e4dSNicolas Chautru {
1573f41c6e4dSNicolas Chautru 	int qm = 8;
1574f41c6e4dSNicolas Chautru 	int qam = 256;
1575f41c6e4dSNicolas Chautru 	int m, k;
1576f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1577f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1578f41c6e4dSNicolas Chautru 	const double symbols_I[256] = {
1579f41c6e4dSNicolas Chautru 			5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5,
1580f41c6e4dSNicolas Chautru 			5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11,
1581f41c6e4dSNicolas Chautru 			11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13,
1582f41c6e4dSNicolas Chautru 			15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15,
1583f41c6e4dSNicolas Chautru 			15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3,
1584f41c6e4dSNicolas Chautru 			1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1,
1585f41c6e4dSNicolas Chautru 			1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13,
1586f41c6e4dSNicolas Chautru 			15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9,
1587f41c6e4dSNicolas Chautru 			13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5,
1588f41c6e4dSNicolas Chautru 			-5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5,
1589f41c6e4dSNicolas Chautru 			-7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3,
1590f41c6e4dSNicolas Chautru 			-1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13,
1591f41c6e4dSNicolas Chautru 			-13, -15, -15, -13, -13, -15, -15, -11, -11, -9,
1592f41c6e4dSNicolas Chautru 			-9, -11, -11, -9, -9, -13, -13, -15, -15, -13,
1593f41c6e4dSNicolas Chautru 			-13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3,
1594f41c6e4dSNicolas Chautru 			-3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5,
1595f41c6e4dSNicolas Chautru 			-7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11,
1596f41c6e4dSNicolas Chautru 			-9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13,
1597f41c6e4dSNicolas Chautru 			-13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9,
1598f41c6e4dSNicolas Chautru 			-13, -13, -15, -15, -13, -13, -15, -15};
1599f41c6e4dSNicolas Chautru 	const double symbols_Q[256] = {
1600f41c6e4dSNicolas Chautru 			5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11,
1601f41c6e4dSNicolas Chautru 			9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13,
1602f41c6e4dSNicolas Chautru 			15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1,
1603f41c6e4dSNicolas Chautru 			11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13,
1604f41c6e4dSNicolas Chautru 			15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5,
1605f41c6e4dSNicolas Chautru 			-7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13,
1606f41c6e4dSNicolas Chautru 			-15, -13, -15, -11, -9, -11, -9, -13, -15, -13,
1607f41c6e4dSNicolas Chautru 			-15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5,
1608f41c6e4dSNicolas Chautru 			-7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15,
1609f41c6e4dSNicolas Chautru 			-13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5,
1610f41c6e4dSNicolas Chautru 			7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11,
1611f41c6e4dSNicolas Chautru 			9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15,
1612f41c6e4dSNicolas Chautru 			13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1,
1613f41c6e4dSNicolas Chautru 			3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9,
1614f41c6e4dSNicolas Chautru 			13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1,
1615f41c6e4dSNicolas Chautru 			-5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9,
1616f41c6e4dSNicolas Chautru 			-13, -15, -13, -15, -11, -9, -11, -9, -13, -15,
1617f41c6e4dSNicolas Chautru 			-13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7,
1618f41c6e4dSNicolas Chautru 			-5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15,
1619f41c6e4dSNicolas Chautru 			-13, -15, -11, -9, -11, -9, -13, -15, -13, -15};
1620f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1621f41c6e4dSNicolas Chautru 	N0 *= 170.0;
1622f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1623f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1624f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1625f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) *
1626f41c6e4dSNicolas Chautru 			(4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6]))));
1627f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) *
1628f41c6e4dSNicolas Chautru 			(4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7]))));
1629f41c6e4dSNicolas Chautru 	/* AWGN channel */
1630f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1631f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1632f41c6e4dSNicolas Chautru 	/*
1633f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1634f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1635f41c6e4dSNicolas Chautru 	 */
1636f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1637f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1638f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1639f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1640f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1641f41c6e4dSNicolas Chautru 		p0 = -999999;
1642f41c6e4dSNicolas Chautru 		p1 = -999999;
1643f41c6e4dSNicolas Chautru 		/* For each constellation point */
1644f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1645f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1646f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1647f41c6e4dSNicolas Chautru 			else
1648f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1649f41c6e4dSNicolas Chautru 		}
1650f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1651f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1652f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1653f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1654f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1655f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1656f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1657f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1658f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1659f41c6e4dSNicolas Chautru 	}
1660f41c6e4dSNicolas Chautru }
1661f41c6e4dSNicolas Chautru 
1662f41c6e4dSNicolas Chautru 
1663f41c6e4dSNicolas Chautru /*
1664f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==6
1665f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1666f41c6e4dSNicolas Chautru  */
1667f41c6e4dSNicolas Chautru static void
1668f41c6e4dSNicolas Chautru gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1669f41c6e4dSNicolas Chautru {
1670f41c6e4dSNicolas Chautru 	int qm = 6;
1671f41c6e4dSNicolas Chautru 	int qam = 64;
1672f41c6e4dSNicolas Chautru 	int m, k;
1673f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1674f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1675f41c6e4dSNicolas Chautru 	const double symbols_I[64] = {
1676f41c6e4dSNicolas Chautru 			3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7,
1677f41c6e4dSNicolas Chautru 			3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7,
1678f41c6e4dSNicolas Chautru 			-3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7,
1679f41c6e4dSNicolas Chautru 			-5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1,
1680f41c6e4dSNicolas Chautru 			-5, -5, -7, -7, -5, -5, -7, -7};
1681f41c6e4dSNicolas Chautru 	const double symbols_Q[64] = {
1682f41c6e4dSNicolas Chautru 			3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7,
1683f41c6e4dSNicolas Chautru 			-3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1,
1684f41c6e4dSNicolas Chautru 			-5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1,
1685f41c6e4dSNicolas Chautru 			5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7,
1686f41c6e4dSNicolas Chautru 			-3, -1, -3, -1, -5, -7, -5, -7};
1687f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1688f41c6e4dSNicolas Chautru 	N0 *= 42.0;
1689f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1690f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1691f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1692f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4])));
1693f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5])));
1694f41c6e4dSNicolas Chautru 	/* AWGN channel */
1695f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1696f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1697f41c6e4dSNicolas Chautru 	/*
1698f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1699f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1700f41c6e4dSNicolas Chautru 	 */
1701f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1702f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1703f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1704f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1705f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1706f41c6e4dSNicolas Chautru 		p0 = -999999;
1707f41c6e4dSNicolas Chautru 		p1 = -999999;
1708f41c6e4dSNicolas Chautru 		/* For each constellation point */
1709f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1710f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1711f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1712f41c6e4dSNicolas Chautru 			else
1713f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1714f41c6e4dSNicolas Chautru 		}
1715f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1716f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1717f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1718f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1719f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1720f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1721f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1722f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1723f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1724f41c6e4dSNicolas Chautru 	}
1725f41c6e4dSNicolas Chautru }
1726f41c6e4dSNicolas Chautru 
1727f41c6e4dSNicolas Chautru /*
1728f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==4
1729f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1730f41c6e4dSNicolas Chautru  */
1731f41c6e4dSNicolas Chautru static void
1732f41c6e4dSNicolas Chautru gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1733f41c6e4dSNicolas Chautru {
1734f41c6e4dSNicolas Chautru 	int qm = 4;
1735f41c6e4dSNicolas Chautru 	int qam = 16;
1736f41c6e4dSNicolas Chautru 	int m, k;
1737f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1738f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1739f41c6e4dSNicolas Chautru 	const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3,
1740f41c6e4dSNicolas Chautru 			-1, -1, -3, -3, -1, -1, -3, -3};
1741f41c6e4dSNicolas Chautru 	const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3,
1742f41c6e4dSNicolas Chautru 			1, 3, 1, 3, -1, -3, -1, -3};
1743f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1744f41c6e4dSNicolas Chautru 	N0 *= 10.0;
1745f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1746f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1747f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1748f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2]));
1749f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3]));
1750f41c6e4dSNicolas Chautru 	/* AWGN channel */
1751f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1752f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1753f41c6e4dSNicolas Chautru 	/*
1754f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1755f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1756f41c6e4dSNicolas Chautru 	 */
1757f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1758f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1759f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1760f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1761f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1762f41c6e4dSNicolas Chautru 		p0 = -999999;
1763f41c6e4dSNicolas Chautru 		p1 = -999999;
1764f41c6e4dSNicolas Chautru 		/* For each constellation point */
1765f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1766f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1767f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1768f41c6e4dSNicolas Chautru 			else
1769f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1770f41c6e4dSNicolas Chautru 		}
1771f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1772f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1773f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1774f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1775f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1776f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1777f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1778f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1779f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1780f41c6e4dSNicolas Chautru 	}
1781f41c6e4dSNicolas Chautru }
1782f41c6e4dSNicolas Chautru 
1783f41c6e4dSNicolas Chautru static void
1784f41c6e4dSNicolas Chautru gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max)
1785f41c6e4dSNicolas Chautru {
1786f41c6e4dSNicolas Chautru 	double b, b1, n;
1787f41c6e4dSNicolas Chautru 	double coeff = 2.0 * sqrt(N0);
1788f41c6e4dSNicolas Chautru 
1789f41c6e4dSNicolas Chautru 	/* Ignore in vectors rare quasi null LLRs not to be saturated */
1790f41c6e4dSNicolas Chautru 	if (llrs[j] < 8 && llrs[j] > -8)
1791f41c6e4dSNicolas Chautru 		return;
1792f41c6e4dSNicolas Chautru 
1793f41c6e4dSNicolas Chautru 	/* Note don't change sign here */
1794f41c6e4dSNicolas Chautru 	n = randn(j % 2);
1795f41c6e4dSNicolas Chautru 	b1 = ((llrs[j] > 0 ? 2.0 : -2.0)
1796f41c6e4dSNicolas Chautru 			+ coeff * n) / N0;
1797f41c6e4dSNicolas Chautru 	b = b1 * (1 << ldpc_llr_decimals);
1798f41c6e4dSNicolas Chautru 	b = round(b);
1799f41c6e4dSNicolas Chautru 	if (b > llr_max)
1800f41c6e4dSNicolas Chautru 		b = llr_max;
1801f41c6e4dSNicolas Chautru 	if (b < -llr_max)
1802f41c6e4dSNicolas Chautru 		b = -llr_max;
1803f41c6e4dSNicolas Chautru 	llrs[j] = (int8_t) b;
1804f41c6e4dSNicolas Chautru }
1805f41c6e4dSNicolas Chautru 
18067831a968SHernan Vargas /* Simple LLR generation assuming AWGN and QPSK */
18077831a968SHernan Vargas static void
18087831a968SHernan Vargas gen_turbo_llr(int8_t *llrs, uint32_t j, double N0, double llr_max)
18097831a968SHernan Vargas {
18107831a968SHernan Vargas 	double b, b1, n;
18117831a968SHernan Vargas 	double coeff = 2.0 * sqrt(N0);
18127831a968SHernan Vargas 
18137831a968SHernan Vargas 	/* Ignore in vectors null LLRs not to be saturated */
18147831a968SHernan Vargas 	if (llrs[j] == 0)
18157831a968SHernan Vargas 		return;
18167831a968SHernan Vargas 
18177831a968SHernan Vargas 	/* Note don't change sign here */
18187831a968SHernan Vargas 	n = randn(j % 2);
18197831a968SHernan Vargas 	b1 = ((llrs[j] > 0 ? 2.0 : -2.0)
18207831a968SHernan Vargas 			+ coeff * n) / N0;
18217831a968SHernan Vargas 	b = b1 * (1 << 4);
18227831a968SHernan Vargas 	b = round(b);
18237831a968SHernan Vargas 	if (b > llr_max)
18247831a968SHernan Vargas 		b = llr_max;
18257831a968SHernan Vargas 	if (b < -llr_max)
18267831a968SHernan Vargas 		b = -llr_max;
18277831a968SHernan Vargas 	llrs[j] = (int8_t) b;
18287831a968SHernan Vargas }
18297831a968SHernan Vargas 
1830f41c6e4dSNicolas Chautru /* Generate LLR for a given SNR */
1831f41c6e4dSNicolas Chautru static void
1832f41c6e4dSNicolas Chautru generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs,
1833f41c6e4dSNicolas Chautru 		struct rte_bbdev_dec_op *ref_op)
1834f41c6e4dSNicolas Chautru {
1835f41c6e4dSNicolas Chautru 	struct rte_mbuf *m;
1836f41c6e4dSNicolas Chautru 	uint16_t qm;
1837f41c6e4dSNicolas Chautru 	uint32_t i, j, e, range;
1838f41c6e4dSNicolas Chautru 	double N0, llr_max;
1839f41c6e4dSNicolas Chautru 
1840f41c6e4dSNicolas Chautru 	e = ref_op->ldpc_dec.cb_params.e;
1841f41c6e4dSNicolas Chautru 	qm = ref_op->ldpc_dec.q_m;
1842f41c6e4dSNicolas Chautru 	llr_max = (1 << (ldpc_llr_size - 1)) - 1;
1843f41c6e4dSNicolas Chautru 	range = e / qm;
1844f41c6e4dSNicolas Chautru 	N0 = 1.0 / pow(10.0, get_snr() / 10.0);
1845f41c6e4dSNicolas Chautru 
1846f41c6e4dSNicolas Chautru 	for (i = 0; i < n; ++i) {
1847f41c6e4dSNicolas Chautru 		m = inputs[i].data;
1848f41c6e4dSNicolas Chautru 		int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0);
1849f41c6e4dSNicolas Chautru 		if (qm == 8) {
1850f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1851f41c6e4dSNicolas Chautru 				gen_qm8_llr(llrs, j, N0, llr_max);
1852f41c6e4dSNicolas Chautru 		} else if (qm == 6) {
1853f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1854f41c6e4dSNicolas Chautru 				gen_qm6_llr(llrs, j, N0, llr_max);
1855f41c6e4dSNicolas Chautru 		} else if (qm == 4) {
1856f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1857f41c6e4dSNicolas Chautru 				gen_qm4_llr(llrs, j, N0, llr_max);
1858f41c6e4dSNicolas Chautru 		} else {
1859f41c6e4dSNicolas Chautru 			for (j = 0; j < e; ++j)
1860f41c6e4dSNicolas Chautru 				gen_qm2_llr(llrs, j, N0, llr_max);
1861f41c6e4dSNicolas Chautru 		}
1862f41c6e4dSNicolas Chautru 	}
1863f41c6e4dSNicolas Chautru }
1864f41c6e4dSNicolas Chautru 
18657831a968SHernan Vargas /* Generate LLR for turbo decoder for a given SNR */
18667831a968SHernan Vargas static void
18677831a968SHernan Vargas generate_turbo_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs,
18687831a968SHernan Vargas 		struct rte_bbdev_dec_op *ref_op)
18697831a968SHernan Vargas {
18707831a968SHernan Vargas 	struct rte_mbuf *m;
18717831a968SHernan Vargas 	uint32_t i, j, range;
18727831a968SHernan Vargas 	double N0, llr_max;
18737831a968SHernan Vargas 
18747831a968SHernan Vargas 	llr_max = 127;
18757831a968SHernan Vargas 	range = ref_op->turbo_dec.input.length;
18767831a968SHernan Vargas 	N0 = 1.0 / pow(10.0, get_snr() / 10.0);
18777831a968SHernan Vargas 
18785471c7d4SHernan Vargas 	if (range > inputs[0].data->data_len) {
18795471c7d4SHernan Vargas 		printf("Warning: Limiting LLR generation to first segment (%d from %d)\n",
18805471c7d4SHernan Vargas 				inputs[0].data->data_len, range);
18815471c7d4SHernan Vargas 		range = inputs[0].data->data_len;
18825471c7d4SHernan Vargas 	}
18835471c7d4SHernan Vargas 
18847831a968SHernan Vargas 	for (i = 0; i < n; ++i) {
18857831a968SHernan Vargas 		m = inputs[i].data;
18867831a968SHernan Vargas 		int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0);
18877831a968SHernan Vargas 		for (j = 0; j < range; ++j)
18887831a968SHernan Vargas 			gen_turbo_llr(llrs, j, N0, llr_max);
18897831a968SHernan Vargas 	}
18907831a968SHernan Vargas }
18917831a968SHernan Vargas 
1892d819c083SNicolas Chautru static void
1893d819c083SNicolas Chautru copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1894d819c083SNicolas Chautru 		unsigned int start_idx,
1895d819c083SNicolas Chautru 		struct rte_bbdev_op_data *inputs,
1896d819c083SNicolas Chautru 		struct rte_bbdev_op_data *hard_outputs,
1897d819c083SNicolas Chautru 		struct rte_bbdev_op_data *soft_outputs,
1898d819c083SNicolas Chautru 		struct rte_bbdev_op_data *harq_inputs,
1899d819c083SNicolas Chautru 		struct rte_bbdev_op_data *harq_outputs,
1900d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op)
1901d819c083SNicolas Chautru {
1902d819c083SNicolas Chautru 	unsigned int i;
1903d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec;
1904d819c083SNicolas Chautru 
1905d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
190648fc315fSNicolas Chautru 		if (ldpc_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1907d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.ea =
1908d819c083SNicolas Chautru 					ldpc_dec->tb_params.ea;
1909d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.eb =
1910d819c083SNicolas Chautru 					ldpc_dec->tb_params.eb;
1911d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.c =
1912d819c083SNicolas Chautru 					ldpc_dec->tb_params.c;
1913d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.cab =
1914d819c083SNicolas Chautru 					ldpc_dec->tb_params.cab;
1915d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.r =
1916d819c083SNicolas Chautru 					ldpc_dec->tb_params.r;
1917d819c083SNicolas Chautru 		} else {
1918d819c083SNicolas Chautru 			ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e;
1919d819c083SNicolas Chautru 		}
1920d819c083SNicolas Chautru 
1921d819c083SNicolas Chautru 		ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph;
1922d819c083SNicolas Chautru 		ops[i]->ldpc_dec.z_c = ldpc_dec->z_c;
1923d819c083SNicolas Chautru 		ops[i]->ldpc_dec.q_m = ldpc_dec->q_m;
1924d819c083SNicolas Chautru 		ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler;
1925d819c083SNicolas Chautru 		ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb;
1926d819c083SNicolas Chautru 		ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max;
1927d819c083SNicolas Chautru 		ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index;
1928591d38ccSNicolas Chautru 		ops[i]->ldpc_dec.k0 = ldpc_dec->k0;
1929d819c083SNicolas Chautru 		ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags;
1930d819c083SNicolas Chautru 		ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode;
1931d819c083SNicolas Chautru 
1932335c11fdSNicolas Chautru 		if (hard_outputs != NULL)
1933335c11fdSNicolas Chautru 			ops[i]->ldpc_dec.hard_output =
1934335c11fdSNicolas Chautru 					hard_outputs[start_idx + i];
1935335c11fdSNicolas Chautru 		if (inputs != NULL)
1936335c11fdSNicolas Chautru 			ops[i]->ldpc_dec.input =
1937335c11fdSNicolas Chautru 					inputs[start_idx + i];
1938d819c083SNicolas Chautru 		if (soft_outputs != NULL)
1939d819c083SNicolas Chautru 			ops[i]->ldpc_dec.soft_output =
1940d819c083SNicolas Chautru 					soft_outputs[start_idx + i];
1941d819c083SNicolas Chautru 		if (harq_inputs != NULL)
1942d819c083SNicolas Chautru 			ops[i]->ldpc_dec.harq_combined_input =
1943d819c083SNicolas Chautru 					harq_inputs[start_idx + i];
1944d819c083SNicolas Chautru 		if (harq_outputs != NULL)
1945d819c083SNicolas Chautru 			ops[i]->ldpc_dec.harq_combined_output =
1946d819c083SNicolas Chautru 					harq_outputs[start_idx + i];
1947d819c083SNicolas Chautru 	}
1948d819c083SNicolas Chautru }
1949d819c083SNicolas Chautru 
1950d819c083SNicolas Chautru 
1951d819c083SNicolas Chautru static void
1952d819c083SNicolas Chautru copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1953d819c083SNicolas Chautru 		unsigned int start_idx,
1954d819c083SNicolas Chautru 		struct rte_bbdev_op_data *inputs,
1955d819c083SNicolas Chautru 		struct rte_bbdev_op_data *outputs,
1956d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op)
1957d819c083SNicolas Chautru {
1958d819c083SNicolas Chautru 	unsigned int i;
1959d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc;
1960d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
196148fc315fSNicolas Chautru 		if (ldpc_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1962d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea;
1963d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb;
1964d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.cab =
1965d819c083SNicolas Chautru 					ldpc_enc->tb_params.cab;
1966d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c;
1967d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r;
1968d819c083SNicolas Chautru 		} else {
1969d819c083SNicolas Chautru 			ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e;
1970d819c083SNicolas Chautru 		}
1971d819c083SNicolas Chautru 		ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph;
1972d819c083SNicolas Chautru 		ops[i]->ldpc_enc.z_c = ldpc_enc->z_c;
1973d819c083SNicolas Chautru 		ops[i]->ldpc_enc.q_m = ldpc_enc->q_m;
1974d819c083SNicolas Chautru 		ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler;
1975d819c083SNicolas Chautru 		ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb;
1976d819c083SNicolas Chautru 		ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index;
1977d819c083SNicolas Chautru 		ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags;
1978d819c083SNicolas Chautru 		ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode;
1979d819c083SNicolas Chautru 		ops[i]->ldpc_enc.output = outputs[start_idx + i];
1980d819c083SNicolas Chautru 		ops[i]->ldpc_enc.input = inputs[start_idx + i];
1981d819c083SNicolas Chautru 	}
1982d819c083SNicolas Chautru }
1983d819c083SNicolas Chautru 
19840acdb986SNicolas Chautru static void
19850acdb986SNicolas Chautru copy_reference_fft_op(struct rte_bbdev_fft_op **ops, unsigned int n,
19860acdb986SNicolas Chautru 		unsigned int start_idx, struct rte_bbdev_op_data *inputs,
19870acdb986SNicolas Chautru 		struct rte_bbdev_op_data *outputs, struct rte_bbdev_op_data *pwrouts,
19880ed76d66SHernan Vargas 		struct rte_bbdev_op_data *win_inputs, struct rte_bbdev_fft_op *ref_op)
19890acdb986SNicolas Chautru {
19900acdb986SNicolas Chautru 	unsigned int i, j;
19910acdb986SNicolas Chautru 	struct rte_bbdev_op_fft *fft = &ref_op->fft;
19920acdb986SNicolas Chautru 	for (i = 0; i < n; i++) {
19930acdb986SNicolas Chautru 		ops[i]->fft.input_sequence_size = fft->input_sequence_size;
19940acdb986SNicolas Chautru 		ops[i]->fft.input_leading_padding = fft->input_leading_padding;
19950acdb986SNicolas Chautru 		ops[i]->fft.output_sequence_size = fft->output_sequence_size;
19960acdb986SNicolas Chautru 		ops[i]->fft.output_leading_depadding =
19970acdb986SNicolas Chautru 				fft->output_leading_depadding;
19980acdb986SNicolas Chautru 		for (j = 0; j < RTE_BBDEV_MAX_CS_2; j++)
19990acdb986SNicolas Chautru 			ops[i]->fft.window_index[j] = fft->window_index[j];
20000ed76d66SHernan Vargas 		for (j = 0; j < RTE_BBDEV_MAX_CS; j++) {
20010ed76d66SHernan Vargas 			ops[i]->fft.cs_theta_0[j] = fft->cs_theta_0[j];
20020ed76d66SHernan Vargas 			ops[i]->fft.cs_theta_d[j] = fft->cs_theta_d[j];
20030ed76d66SHernan Vargas 			ops[i]->fft.time_offset[j] = fft->time_offset[j];
20040ed76d66SHernan Vargas 		}
20050acdb986SNicolas Chautru 		ops[i]->fft.cs_bitmap = fft->cs_bitmap;
20060acdb986SNicolas Chautru 		ops[i]->fft.num_antennas_log2 = fft->num_antennas_log2;
20070acdb986SNicolas Chautru 		ops[i]->fft.idft_log2 = fft->idft_log2;
20080acdb986SNicolas Chautru 		ops[i]->fft.dft_log2 = fft->dft_log2;
20090acdb986SNicolas Chautru 		ops[i]->fft.cs_time_adjustment = fft->cs_time_adjustment;
20100acdb986SNicolas Chautru 		ops[i]->fft.idft_shift = fft->idft_shift;
20110acdb986SNicolas Chautru 		ops[i]->fft.dft_shift = fft->dft_shift;
20120acdb986SNicolas Chautru 		ops[i]->fft.ncs_reciprocal = fft->ncs_reciprocal;
20130acdb986SNicolas Chautru 		ops[i]->fft.power_shift = fft->power_shift;
20140acdb986SNicolas Chautru 		ops[i]->fft.fp16_exp_adjust = fft->fp16_exp_adjust;
20150ed76d66SHernan Vargas 		ops[i]->fft.output_depadded_size = fft->output_depadded_size;
20160ed76d66SHernan Vargas 		ops[i]->fft.freq_resample_mode = fft->freq_resample_mode;
20170acdb986SNicolas Chautru 		ops[i]->fft.base_output = outputs[start_idx + i];
20180acdb986SNicolas Chautru 		ops[i]->fft.base_input = inputs[start_idx + i];
20190ed76d66SHernan Vargas 		if (win_inputs != NULL)
20200ed76d66SHernan Vargas 			ops[i]->fft.dewindowing_input = win_inputs[start_idx + i];
20210acdb986SNicolas Chautru 		if (pwrouts != NULL)
20220acdb986SNicolas Chautru 			ops[i]->fft.power_meas_output = pwrouts[start_idx + i];
20230acdb986SNicolas Chautru 		ops[i]->fft.op_flags = fft->op_flags;
20240acdb986SNicolas Chautru 	}
20250acdb986SNicolas Chautru }
20260acdb986SNicolas Chautru 
202795f192a4SHernan Vargas static void
202895f192a4SHernan Vargas copy_reference_mldts_op(struct rte_bbdev_mldts_op **ops, unsigned int n,
202995f192a4SHernan Vargas 		unsigned int start_idx,
203095f192a4SHernan Vargas 		struct rte_bbdev_op_data *q_inputs,
203195f192a4SHernan Vargas 		struct rte_bbdev_op_data *r_inputs,
203295f192a4SHernan Vargas 		struct rte_bbdev_op_data *outputs,
203395f192a4SHernan Vargas 		struct rte_bbdev_mldts_op *ref_op)
203495f192a4SHernan Vargas {
203595f192a4SHernan Vargas 	unsigned int i, j;
203695f192a4SHernan Vargas 	struct rte_bbdev_op_mldts *mldts = &ref_op->mldts;
203795f192a4SHernan Vargas 	for (i = 0; i < n; i++) {
203895f192a4SHernan Vargas 		ops[i]->mldts.c_rep = mldts->c_rep;
203995f192a4SHernan Vargas 		ops[i]->mldts.num_layers = mldts->num_layers;
204095f192a4SHernan Vargas 		ops[i]->mldts.num_rbs = mldts->num_rbs;
204195f192a4SHernan Vargas 		ops[i]->mldts.op_flags = mldts->op_flags;
204295f192a4SHernan Vargas 		for (j = 0; j < RTE_BBDEV_MAX_MLD_LAYERS; j++)
204395f192a4SHernan Vargas 			ops[i]->mldts.q_m[j] = mldts->q_m[j];
204495f192a4SHernan Vargas 		ops[i]->mldts.r_rep = mldts->r_rep;
204595f192a4SHernan Vargas 		ops[i]->mldts.c_rep = mldts->c_rep;
204695f192a4SHernan Vargas 		ops[i]->mldts.r_input = r_inputs[start_idx + i];
204795f192a4SHernan Vargas 		ops[i]->mldts.qhy_input = q_inputs[start_idx + i];
204895f192a4SHernan Vargas 		ops[i]->mldts.output = outputs[start_idx + i];
204995f192a4SHernan Vargas 	}
205095f192a4SHernan Vargas }
205195f192a4SHernan Vargas 
2052f714a188SAmr Mokhtar static int
2053f714a188SAmr Mokhtar check_dec_status_and_ordering(struct rte_bbdev_dec_op *op,
2054f714a188SAmr Mokhtar 		unsigned int order_idx, const int expected_status)
2055f714a188SAmr Mokhtar {
2056335c11fdSNicolas Chautru 	int status = op->status;
2057335c11fdSNicolas Chautru 	/* ignore parity mismatch false alarms for long iterations */
2058335c11fdSNicolas Chautru 	if (get_iter_max() >= 10) {
2059335c11fdSNicolas Chautru 		if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) &&
2060335c11fdSNicolas Chautru 				(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) {
2061335c11fdSNicolas Chautru 			printf("WARNING: Ignore Syndrome Check mismatch\n");
2062335c11fdSNicolas Chautru 			status -= (1 << RTE_BBDEV_SYNDROME_ERROR);
2063335c11fdSNicolas Chautru 		}
2064335c11fdSNicolas Chautru 		if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) &&
2065335c11fdSNicolas Chautru 				!(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) {
2066335c11fdSNicolas Chautru 			printf("WARNING: Ignore Syndrome Check mismatch\n");
2067335c11fdSNicolas Chautru 			status += (1 << RTE_BBDEV_SYNDROME_ERROR);
2068335c11fdSNicolas Chautru 		}
2069335c11fdSNicolas Chautru 	}
2070335c11fdSNicolas Chautru 
2071335c11fdSNicolas Chautru 	TEST_ASSERT(status == expected_status,
2072f714a188SAmr Mokhtar 			"op_status (%d) != expected_status (%d)",
2073f714a188SAmr Mokhtar 			op->status, expected_status);
2074f714a188SAmr Mokhtar 
2075f714a188SAmr Mokhtar 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
2076f714a188SAmr Mokhtar 			"Ordering error, expected %p, got %p",
2077f714a188SAmr Mokhtar 			(void *)(uintptr_t)order_idx, op->opaque_data);
2078f714a188SAmr Mokhtar 
2079f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2080f714a188SAmr Mokhtar }
2081f714a188SAmr Mokhtar 
2082f714a188SAmr Mokhtar static int
2083f714a188SAmr Mokhtar check_enc_status_and_ordering(struct rte_bbdev_enc_op *op,
2084f714a188SAmr Mokhtar 		unsigned int order_idx, const int expected_status)
2085f714a188SAmr Mokhtar {
2086f714a188SAmr Mokhtar 	TEST_ASSERT(op->status == expected_status,
2087f714a188SAmr Mokhtar 			"op_status (%d) != expected_status (%d)",
2088f714a188SAmr Mokhtar 			op->status, expected_status);
2089f714a188SAmr Mokhtar 
2090f714a188SAmr Mokhtar 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
2091f714a188SAmr Mokhtar 			"Ordering error, expected %p, got %p",
2092f714a188SAmr Mokhtar 			(void *)(uintptr_t)order_idx, op->opaque_data);
2093f714a188SAmr Mokhtar 
2094f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2095f714a188SAmr Mokhtar }
2096f714a188SAmr Mokhtar 
20970acdb986SNicolas Chautru static int
20980acdb986SNicolas Chautru check_fft_status_and_ordering(struct rte_bbdev_fft_op *op,
20990acdb986SNicolas Chautru 		unsigned int order_idx, const int expected_status)
21000acdb986SNicolas Chautru {
21010acdb986SNicolas Chautru 	TEST_ASSERT(op->status == expected_status,
21020acdb986SNicolas Chautru 			"op_status (%d) != expected_status (%d)",
21030acdb986SNicolas Chautru 			op->status, expected_status);
21040acdb986SNicolas Chautru 
21050acdb986SNicolas Chautru 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
21060acdb986SNicolas Chautru 			"Ordering error, expected %p, got %p",
21070acdb986SNicolas Chautru 			(void *)(uintptr_t)order_idx, op->opaque_data);
21080acdb986SNicolas Chautru 
21090acdb986SNicolas Chautru 	return TEST_SUCCESS;
21100acdb986SNicolas Chautru }
21110acdb986SNicolas Chautru 
211295f192a4SHernan Vargas static int
211395f192a4SHernan Vargas check_mldts_status_and_ordering(struct rte_bbdev_mldts_op *op,
211495f192a4SHernan Vargas 		unsigned int order_idx, const int expected_status)
211595f192a4SHernan Vargas {
211695f192a4SHernan Vargas 	TEST_ASSERT(op->status == expected_status,
211795f192a4SHernan Vargas 			"op_status (%d) != expected_status (%d)",
211895f192a4SHernan Vargas 			op->status, expected_status);
211995f192a4SHernan Vargas 
212095f192a4SHernan Vargas 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
212195f192a4SHernan Vargas 			"Ordering error, expected %p, got %p",
212295f192a4SHernan Vargas 			(void *)(uintptr_t)order_idx, op->opaque_data);
212395f192a4SHernan Vargas 
212495f192a4SHernan Vargas 	return TEST_SUCCESS;
212595f192a4SHernan Vargas }
212695f192a4SHernan Vargas 
2127f714a188SAmr Mokhtar static inline int
2128f714a188SAmr Mokhtar validate_op_chain(struct rte_bbdev_op_data *op,
2129f714a188SAmr Mokhtar 		struct op_data_entries *orig_op)
2130f714a188SAmr Mokhtar {
2131f714a188SAmr Mokhtar 	uint8_t i;
2132f714a188SAmr Mokhtar 	struct rte_mbuf *m = op->data;
2133f714a188SAmr Mokhtar 	uint8_t nb_dst_segments = orig_op->nb_segments;
21349585f8b1SKamil Chalupnik 	uint32_t total_data_size = 0;
2135fd96ef37SHernan Vargas 	bool ignore_mbuf = false; /* ignore mbuf limitations */
2136f714a188SAmr Mokhtar 
2137f714a188SAmr Mokhtar 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
2138f714a188SAmr Mokhtar 			"Number of segments differ in original (%u) and filled (%u) op",
2139f714a188SAmr Mokhtar 			nb_dst_segments, m->nb_segs);
2140f714a188SAmr Mokhtar 
21419585f8b1SKamil Chalupnik 	/* Validate each mbuf segment length */
2142f714a188SAmr Mokhtar 	for (i = 0; i < nb_dst_segments; ++i) {
2143f714a188SAmr Mokhtar 		/* Apply offset to the first mbuf segment */
2144f714a188SAmr Mokhtar 		uint16_t offset = (i == 0) ? op->offset : 0;
21459585f8b1SKamil Chalupnik 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
21469585f8b1SKamil Chalupnik 		total_data_size += orig_op->segments[i].length;
2147f714a188SAmr Mokhtar 
2148494d0c9bSHernan Vargas 		if ((orig_op->segments[i].length + RTE_PKTMBUF_HEADROOM)
2149494d0c9bSHernan Vargas 				> RTE_BBDEV_LDPC_E_MAX_MBUF)
2150fd96ef37SHernan Vargas 			ignore_mbuf = true;
2151fd96ef37SHernan Vargas 		if (!ignore_mbuf)
2152f714a188SAmr Mokhtar 			TEST_ASSERT(orig_op->segments[i].length == data_len,
2153f714a188SAmr Mokhtar 					"Length of segment differ in original (%u) and filled (%u) op",
2154f714a188SAmr Mokhtar 					orig_op->segments[i].length, data_len);
2155f714a188SAmr Mokhtar 		TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr,
2156f714a188SAmr Mokhtar 				rte_pktmbuf_mtod_offset(m, uint32_t *, offset),
2157fd96ef37SHernan Vargas 				orig_op->segments[i].length,
2158f714a188SAmr Mokhtar 				"Output buffers (CB=%u) are not equal", i);
2159f714a188SAmr Mokhtar 		m = m->next;
2160f714a188SAmr Mokhtar 	}
2161f714a188SAmr Mokhtar 
21629585f8b1SKamil Chalupnik 	/* Validate total mbuf pkt length */
21639585f8b1SKamil Chalupnik 	uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset;
2164fd96ef37SHernan Vargas 	if (!ignore_mbuf)
21659585f8b1SKamil Chalupnik 		TEST_ASSERT(total_data_size == pkt_len,
21669585f8b1SKamil Chalupnik 				"Length of data differ in original (%u) and filled (%u) op",
21679585f8b1SKamil Chalupnik 				total_data_size, pkt_len);
21689585f8b1SKamil Chalupnik 
2169f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2170f714a188SAmr Mokhtar }
2171f714a188SAmr Mokhtar 
2172335c11fdSNicolas Chautru /*
2173335c11fdSNicolas Chautru  * Compute K0 for a given configuration for HARQ output length computation
2174335c11fdSNicolas Chautru  * As per definition in 3GPP 38.212 Table 5.4.2.1-2
2175335c11fdSNicolas Chautru  */
2176335c11fdSNicolas Chautru static inline uint16_t
2177591d38ccSNicolas Chautru get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index, uint16_t k0)
2178335c11fdSNicolas Chautru {
2179591d38ccSNicolas Chautru 	if (k0 > 0)
2180591d38ccSNicolas Chautru 		return k0;
2181335c11fdSNicolas Chautru 	if (rv_index == 0)
2182335c11fdSNicolas Chautru 		return 0;
2183335c11fdSNicolas Chautru 	uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c;
2184335c11fdSNicolas Chautru 	if (n_cb == n) {
2185335c11fdSNicolas Chautru 		if (rv_index == 1)
2186335c11fdSNicolas Chautru 			return (bg == 1 ? K0_1_1 : K0_1_2) * z_c;
2187335c11fdSNicolas Chautru 		else if (rv_index == 2)
2188335c11fdSNicolas Chautru 			return (bg == 1 ? K0_2_1 : K0_2_2) * z_c;
2189335c11fdSNicolas Chautru 		else
2190335c11fdSNicolas Chautru 			return (bg == 1 ? K0_3_1 : K0_3_2) * z_c;
2191335c11fdSNicolas Chautru 	}
2192335c11fdSNicolas Chautru 	/* LBRM case - includes a division by N */
2193335c11fdSNicolas Chautru 	if (rv_index == 1)
2194335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb)
2195335c11fdSNicolas Chautru 				/ n) * z_c;
2196335c11fdSNicolas Chautru 	else if (rv_index == 2)
2197335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb)
2198335c11fdSNicolas Chautru 				/ n) * z_c;
2199335c11fdSNicolas Chautru 	else
2200335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb)
2201335c11fdSNicolas Chautru 				/ n) * z_c;
2202335c11fdSNicolas Chautru }
2203335c11fdSNicolas Chautru 
2204335c11fdSNicolas Chautru /* HARQ output length including the Filler bits */
2205335c11fdSNicolas Chautru static inline uint16_t
2206335c11fdSNicolas Chautru compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld)
2207335c11fdSNicolas Chautru {
2208335c11fdSNicolas Chautru 	uint16_t k0 = 0;
2209335c11fdSNicolas Chautru 	uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index;
2210591d38ccSNicolas Chautru 	k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv, ops_ld->k0);
2211335c11fdSNicolas Chautru 	/* Compute RM out size and number of rows */
2212335c11fdSNicolas Chautru 	uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8)
2213335c11fdSNicolas Chautru 			* ops_ld->z_c - ops_ld->n_filler;
2214335c11fdSNicolas Chautru 	uint16_t deRmOutSize = RTE_MIN(
2215335c11fdSNicolas Chautru 			k0 + ops_ld->cb_params.e +
2216335c11fdSNicolas Chautru 			((k0 > parity_offset) ?
2217335c11fdSNicolas Chautru 					0 : ops_ld->n_filler),
2218335c11fdSNicolas Chautru 					ops_ld->n_cb);
2219335c11fdSNicolas Chautru 	uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1)
2220335c11fdSNicolas Chautru 			/ ops_ld->z_c);
2221335c11fdSNicolas Chautru 	uint16_t harq_output_len = numRows * ops_ld->z_c;
2222335c11fdSNicolas Chautru 	return harq_output_len;
2223335c11fdSNicolas Chautru }
2224335c11fdSNicolas Chautru 
2225335c11fdSNicolas Chautru static inline int
2226335c11fdSNicolas Chautru validate_op_harq_chain(struct rte_bbdev_op_data *op,
2227335c11fdSNicolas Chautru 		struct op_data_entries *orig_op,
2228335c11fdSNicolas Chautru 		struct rte_bbdev_op_ldpc_dec *ops_ld)
2229335c11fdSNicolas Chautru {
2230335c11fdSNicolas Chautru 	uint8_t i;
2231335c11fdSNicolas Chautru 	uint32_t j, jj, k;
2232335c11fdSNicolas Chautru 	struct rte_mbuf *m = op->data;
2233335c11fdSNicolas Chautru 	uint8_t nb_dst_segments = orig_op->nb_segments;
2234335c11fdSNicolas Chautru 	uint32_t total_data_size = 0;
2235335c11fdSNicolas Chautru 	int8_t *harq_orig, *harq_out, abs_harq_origin;
2236335c11fdSNicolas Chautru 	uint32_t byte_error = 0, cum_error = 0, error;
2237335c11fdSNicolas Chautru 	int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1;
2238335c11fdSNicolas Chautru 	int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1;
2239335c11fdSNicolas Chautru 	uint16_t parity_offset;
2240335c11fdSNicolas Chautru 
2241335c11fdSNicolas Chautru 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
2242335c11fdSNicolas Chautru 			"Number of segments differ in original (%u) and filled (%u) op",
2243335c11fdSNicolas Chautru 			nb_dst_segments, m->nb_segs);
2244335c11fdSNicolas Chautru 
2245335c11fdSNicolas Chautru 	/* Validate each mbuf segment length */
2246335c11fdSNicolas Chautru 	for (i = 0; i < nb_dst_segments; ++i) {
2247335c11fdSNicolas Chautru 		/* Apply offset to the first mbuf segment */
2248335c11fdSNicolas Chautru 		uint16_t offset = (i == 0) ? op->offset : 0;
2249335c11fdSNicolas Chautru 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
2250335c11fdSNicolas Chautru 		total_data_size += orig_op->segments[i].length;
2251335c11fdSNicolas Chautru 
225239b601c4SHernan Vargas 		TEST_ASSERT(orig_op->segments[i].length < (uint32_t)(data_len + HARQ_MEM_TOLERANCE),
2253335c11fdSNicolas Chautru 				"Length of segment differ in original (%u) and filled (%u) op",
2254335c11fdSNicolas Chautru 				orig_op->segments[i].length, data_len);
2255335c11fdSNicolas Chautru 		harq_orig = (int8_t *) orig_op->segments[i].addr;
2256335c11fdSNicolas Chautru 		harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset);
2257335c11fdSNicolas Chautru 
225839b601c4SHernan Vargas 		/* Cannot compare HARQ output data for such cases */
225939b601c4SHernan Vargas 		if ((ldpc_llr_decimals > 1) && ((ops_ld->op_flags & RTE_BBDEV_LDPC_LLR_COMPRESSION)
2260a591b77fSHernan Vargas 				|| (ops_ld->op_flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION)
2261a591b77fSHernan Vargas 				|| (ops_ld->op_flags & RTE_BBDEV_LDPC_HARQ_4BIT_COMPRESSION)))
226239b601c4SHernan Vargas 			break;
226339b601c4SHernan Vargas 
2264335c11fdSNicolas Chautru 		if (!(ldpc_cap_flags &
2265335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS
2266335c11fdSNicolas Chautru 				) || (ops_ld->op_flags &
2267335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
2268335c11fdSNicolas Chautru 			data_len -= ops_ld->z_c;
2269335c11fdSNicolas Chautru 			parity_offset = data_len;
2270335c11fdSNicolas Chautru 		} else {
2271335c11fdSNicolas Chautru 			/* Compute RM out size and number of rows */
2272335c11fdSNicolas Chautru 			parity_offset = (ops_ld->basegraph == 1 ? 20 : 8)
2273335c11fdSNicolas Chautru 					* ops_ld->z_c - ops_ld->n_filler;
2274335c11fdSNicolas Chautru 			uint16_t deRmOutSize = compute_harq_len(ops_ld) -
2275335c11fdSNicolas Chautru 					ops_ld->n_filler;
2276335c11fdSNicolas Chautru 			if (data_len > deRmOutSize)
2277335c11fdSNicolas Chautru 				data_len = deRmOutSize;
2278bee9ac50SHernan Vargas 		}
2279335c11fdSNicolas Chautru 		if (data_len > orig_op->segments[i].length)
2280335c11fdSNicolas Chautru 			data_len = orig_op->segments[i].length;
2281335c11fdSNicolas Chautru 		/*
2282335c11fdSNicolas Chautru 		 * HARQ output can have minor differences
2283335c11fdSNicolas Chautru 		 * due to integer representation and related scaling
2284335c11fdSNicolas Chautru 		 */
2285335c11fdSNicolas Chautru 		for (j = 0, jj = 0; j < data_len; j++, jj++) {
2286335c11fdSNicolas Chautru 			if (j == parity_offset) {
2287335c11fdSNicolas Chautru 				/* Special Handling of the filler bits */
2288335c11fdSNicolas Chautru 				for (k = 0; k < ops_ld->n_filler; k++) {
2289335c11fdSNicolas Chautru 					if (harq_out[jj] !=
2290335c11fdSNicolas Chautru 							llr_max_pre_scaling) {
2291335c11fdSNicolas Chautru 						printf("HARQ Filler issue %d: %d %d\n",
2292335c11fdSNicolas Chautru 							jj, harq_out[jj],
2293335c11fdSNicolas Chautru 							llr_max);
2294335c11fdSNicolas Chautru 						byte_error++;
2295335c11fdSNicolas Chautru 					}
2296335c11fdSNicolas Chautru 					jj++;
2297335c11fdSNicolas Chautru 				}
2298335c11fdSNicolas Chautru 			}
2299335c11fdSNicolas Chautru 			if (!(ops_ld->op_flags &
2300335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
2301335c11fdSNicolas Chautru 				if (ldpc_llr_decimals > 1)
2302335c11fdSNicolas Chautru 					harq_out[jj] = (harq_out[jj] + 1)
2303335c11fdSNicolas Chautru 						>> (ldpc_llr_decimals - 1);
2304335c11fdSNicolas Chautru 				/* Saturated to S7 */
2305335c11fdSNicolas Chautru 				if (harq_orig[j] > llr_max)
2306335c11fdSNicolas Chautru 					harq_orig[j] = llr_max;
2307335c11fdSNicolas Chautru 				if (harq_orig[j] < -llr_max)
2308335c11fdSNicolas Chautru 					harq_orig[j] = -llr_max;
2309335c11fdSNicolas Chautru 			}
2310335c11fdSNicolas Chautru 			if (harq_orig[j] != harq_out[jj]) {
2311335c11fdSNicolas Chautru 				error = (harq_orig[j] > harq_out[jj]) ?
2312335c11fdSNicolas Chautru 						harq_orig[j] - harq_out[jj] :
2313335c11fdSNicolas Chautru 						harq_out[jj] - harq_orig[j];
2314335c11fdSNicolas Chautru 				abs_harq_origin = harq_orig[j] > 0 ?
2315335c11fdSNicolas Chautru 							harq_orig[j] :
2316335c11fdSNicolas Chautru 							-harq_orig[j];
2317335c11fdSNicolas Chautru 				/* Residual quantization error */
2318335c11fdSNicolas Chautru 				if ((error > 8 && (abs_harq_origin <
2319335c11fdSNicolas Chautru 						(llr_max - 16))) ||
2320335c11fdSNicolas Chautru 						(error > 16)) {
23215884e56fSHernan Vargas 					/*
2322335c11fdSNicolas Chautru 					printf("HARQ mismatch %d: exp %d act %d => %d\n",
2323335c11fdSNicolas Chautru 							j, harq_orig[j],
2324335c11fdSNicolas Chautru 							harq_out[jj], error);
23255884e56fSHernan Vargas 					*/
2326335c11fdSNicolas Chautru 					byte_error++;
2327335c11fdSNicolas Chautru 					cum_error += error;
2328335c11fdSNicolas Chautru 				}
2329335c11fdSNicolas Chautru 			}
2330335c11fdSNicolas Chautru 		}
2331335c11fdSNicolas Chautru 		m = m->next;
2332335c11fdSNicolas Chautru 	}
2333335c11fdSNicolas Chautru 
2334335c11fdSNicolas Chautru 	if (byte_error)
2335335c11fdSNicolas Chautru 		TEST_ASSERT(byte_error <= 1,
2336335c11fdSNicolas Chautru 				"HARQ output mismatch (%d) %d",
2337335c11fdSNicolas Chautru 				byte_error, cum_error);
2338335c11fdSNicolas Chautru 
2339335c11fdSNicolas Chautru 	/* Validate total mbuf pkt length */
2340335c11fdSNicolas Chautru 	uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset;
234139b601c4SHernan Vargas 	TEST_ASSERT(total_data_size < pkt_len + HARQ_MEM_TOLERANCE,
2342335c11fdSNicolas Chautru 			"Length of data differ in original (%u) and filled (%u) op",
2343335c11fdSNicolas Chautru 			total_data_size, pkt_len);
2344335c11fdSNicolas Chautru 
2345335c11fdSNicolas Chautru 	return TEST_SUCCESS;
2346335c11fdSNicolas Chautru }
2347335c11fdSNicolas Chautru 
23480acdb986SNicolas Chautru 
23490acdb986SNicolas Chautru static inline int
23500acdb986SNicolas Chautru validate_op_so_chain(struct rte_bbdev_op_data *op,
23510acdb986SNicolas Chautru 		struct op_data_entries *orig_op)
23520acdb986SNicolas Chautru {
23530acdb986SNicolas Chautru 	struct rte_mbuf *m = op->data;
23540acdb986SNicolas Chautru 	uint8_t i, nb_dst_segments = orig_op->nb_segments;
23550acdb986SNicolas Chautru 	uint32_t j, jj;
23560acdb986SNicolas Chautru 	int8_t *so_orig, *so_out;
23570acdb986SNicolas Chautru 	uint32_t byte_error = 0, error, margin_error = 0;
23580acdb986SNicolas Chautru 
23590acdb986SNicolas Chautru 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
23600acdb986SNicolas Chautru 			"Number of segments differ in original (%u) and filled (%u) op",
23610acdb986SNicolas Chautru 			nb_dst_segments, m->nb_segs);
23620acdb986SNicolas Chautru 
23630acdb986SNicolas Chautru 	/* Validate each mbuf segment length. */
23640acdb986SNicolas Chautru 	for (i = 0; i < nb_dst_segments; ++i) {
23650acdb986SNicolas Chautru 		/* Apply offset to the first mbuf segment. */
23660acdb986SNicolas Chautru 		uint16_t offset = (i == 0) ? op->offset : 0;
23670acdb986SNicolas Chautru 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
23680acdb986SNicolas Chautru 
23690acdb986SNicolas Chautru 		TEST_ASSERT(orig_op->segments[i].length == data_len,
23700acdb986SNicolas Chautru 				"Length of segment differ in original (%u) and filled (%u) op",
23710acdb986SNicolas Chautru 				orig_op->segments[i].length, data_len);
23720acdb986SNicolas Chautru 		so_orig = (int8_t *) orig_op->segments[i].addr;
23730acdb986SNicolas Chautru 		so_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset);
23740acdb986SNicolas Chautru 		margin_error += data_len / 8; /* Allow for few % errors. */
23750acdb986SNicolas Chautru 
23760acdb986SNicolas Chautru 		/* SO output can have minor differences due to algorithm variations. */
23770acdb986SNicolas Chautru 		for (j = 0, jj = 0; j < data_len; j++, jj++) {
23780acdb986SNicolas Chautru 			if (so_orig[j] != so_out[jj]) {
23790acdb986SNicolas Chautru 				error = (so_orig[j] > so_out[jj]) ? so_orig[j] - so_out[jj] :
23800acdb986SNicolas Chautru 						so_out[jj] - so_orig[j];
23810acdb986SNicolas Chautru 				/* Residual quantization error. */
23820acdb986SNicolas Chautru 				if (error > 32) {
23830acdb986SNicolas Chautru 					printf("Warning: Soft mismatch %d: exp %d act %d => %d\n",
23840acdb986SNicolas Chautru 							j, so_orig[j], so_out[jj], error);
23850acdb986SNicolas Chautru 					byte_error++;
23860acdb986SNicolas Chautru 				}
23870acdb986SNicolas Chautru 			}
23880acdb986SNicolas Chautru 		}
23890acdb986SNicolas Chautru 		m = m->next;
23900acdb986SNicolas Chautru 	}
23910acdb986SNicolas Chautru 
23920acdb986SNicolas Chautru 	if (byte_error > margin_error)
23930acdb986SNicolas Chautru 		TEST_ASSERT(byte_error <= 1, "Soft output mismatch (%d) %d",
23940acdb986SNicolas Chautru 				byte_error, margin_error);
23950acdb986SNicolas Chautru 
23960acdb986SNicolas Chautru 	return TEST_SUCCESS;
23970acdb986SNicolas Chautru }
23980acdb986SNicolas Chautru 
2399f714a188SAmr Mokhtar static int
2400f714a188SAmr Mokhtar validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
2401de2ce637SHernan Vargas 		struct rte_bbdev_dec_op *ref_op)
2402f714a188SAmr Mokhtar {
2403f714a188SAmr Mokhtar 	unsigned int i;
2404f714a188SAmr Mokhtar 	int ret;
2405f714a188SAmr Mokhtar 	struct op_data_entries *hard_data_orig =
2406f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
2407f714a188SAmr Mokhtar 	struct op_data_entries *soft_data_orig =
2408f714a188SAmr Mokhtar 			&test_vector.entries[DATA_SOFT_OUTPUT];
2409f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_dec *ops_td;
2410f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *hard_output;
2411f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *soft_output;
2412f714a188SAmr Mokhtar 
2413f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
2414f714a188SAmr Mokhtar 		ops_td = &ops[i]->turbo_dec;
2415f714a188SAmr Mokhtar 		hard_output = &ops_td->hard_output;
2416f714a188SAmr Mokhtar 		soft_output = &ops_td->soft_output;
2417f714a188SAmr Mokhtar 
2418f714a188SAmr Mokhtar 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
2419f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
2420f714a188SAmr Mokhtar 				"Checking status and ordering for decoder failed");
2421f714a188SAmr Mokhtar 
2422f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
2423f714a188SAmr Mokhtar 				hard_data_orig),
2424f714a188SAmr Mokhtar 				"Hard output buffers (CB=%u) are not equal",
2425f714a188SAmr Mokhtar 				i);
2426f714a188SAmr Mokhtar 
2427f714a188SAmr Mokhtar 		if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT)
24280acdb986SNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_so_chain(soft_output,
2429f714a188SAmr Mokhtar 					soft_data_orig),
2430f714a188SAmr Mokhtar 					"Soft output buffers (CB=%u) are not equal",
2431f714a188SAmr Mokhtar 					i);
2432f714a188SAmr Mokhtar 	}
2433f714a188SAmr Mokhtar 
2434f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2435f714a188SAmr Mokhtar }
2436f714a188SAmr Mokhtar 
2437f41c6e4dSNicolas Chautru /* Check Number of code blocks errors */
2438f41c6e4dSNicolas Chautru static int
2439f41c6e4dSNicolas Chautru validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n)
2440f41c6e4dSNicolas Chautru {
2441f41c6e4dSNicolas Chautru 	unsigned int i;
2442f41c6e4dSNicolas Chautru 	struct op_data_entries *hard_data_orig =
2443f41c6e4dSNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2444f41c6e4dSNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ops_td;
2445f41c6e4dSNicolas Chautru 	struct rte_bbdev_op_data *hard_output;
2446f41c6e4dSNicolas Chautru 	int errors = 0;
2447f41c6e4dSNicolas Chautru 	struct rte_mbuf *m;
2448f41c6e4dSNicolas Chautru 
2449f41c6e4dSNicolas Chautru 	for (i = 0; i < n; ++i) {
2450f41c6e4dSNicolas Chautru 		ops_td = &ops[i]->ldpc_dec;
2451f41c6e4dSNicolas Chautru 		hard_output = &ops_td->hard_output;
2452f41c6e4dSNicolas Chautru 		m = hard_output->data;
2453f41c6e4dSNicolas Chautru 		if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0),
2454f41c6e4dSNicolas Chautru 				hard_data_orig->segments[0].addr,
2455f41c6e4dSNicolas Chautru 				hard_data_orig->segments[0].length))
2456f41c6e4dSNicolas Chautru 			errors++;
2457f41c6e4dSNicolas Chautru 	}
2458f41c6e4dSNicolas Chautru 	return errors;
2459f41c6e4dSNicolas Chautru }
2460f41c6e4dSNicolas Chautru 
24617831a968SHernan Vargas /* Check Number of code blocks errors */
24627831a968SHernan Vargas static int
24637831a968SHernan Vargas validate_turbo_bler(struct rte_bbdev_dec_op **ops, const uint16_t n)
24647831a968SHernan Vargas {
24657831a968SHernan Vargas 	unsigned int i;
24667831a968SHernan Vargas 	struct op_data_entries *hard_data_orig = &test_vector.entries[DATA_HARD_OUTPUT];
24677831a968SHernan Vargas 	struct rte_bbdev_op_turbo_dec *ops_td;
24687831a968SHernan Vargas 	struct rte_bbdev_op_data *hard_output;
24697831a968SHernan Vargas 	int errors = 0;
24707831a968SHernan Vargas 	struct rte_mbuf *m;
24717831a968SHernan Vargas 
24727831a968SHernan Vargas 	for (i = 0; i < n; ++i) {
24737831a968SHernan Vargas 		ops_td = &ops[i]->turbo_dec;
24747831a968SHernan Vargas 		hard_output = &ops_td->hard_output;
24757831a968SHernan Vargas 		m = hard_output->data;
24767831a968SHernan Vargas 		if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0),
24777831a968SHernan Vargas 				hard_data_orig->segments[0].addr,
24787831a968SHernan Vargas 				hard_data_orig->segments[0].length))
24797831a968SHernan Vargas 			errors++;
24807831a968SHernan Vargas 	}
24817831a968SHernan Vargas 	return errors;
24827831a968SHernan Vargas }
24837831a968SHernan Vargas 
24847831a968SHernan Vargas 
2485d819c083SNicolas Chautru static int
2486d819c083SNicolas Chautru validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
2487d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op, const int vector_mask)
2488d819c083SNicolas Chautru {
2489d819c083SNicolas Chautru 	unsigned int i;
2490d819c083SNicolas Chautru 	int ret;
2491d819c083SNicolas Chautru 	struct op_data_entries *hard_data_orig =
2492d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2493d819c083SNicolas Chautru 	struct op_data_entries *soft_data_orig =
2494d819c083SNicolas Chautru 			&test_vector.entries[DATA_SOFT_OUTPUT];
2495d819c083SNicolas Chautru 	struct op_data_entries *harq_data_orig =
2496d819c083SNicolas Chautru 				&test_vector.entries[DATA_HARQ_OUTPUT];
2497d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ops_td;
2498d819c083SNicolas Chautru 	struct rte_bbdev_op_data *hard_output;
2499d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_output;
2500d819c083SNicolas Chautru 	struct rte_bbdev_op_data *soft_output;
2501d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec;
2502d819c083SNicolas Chautru 
2503d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
2504d819c083SNicolas Chautru 		ops_td = &ops[i]->ldpc_dec;
2505d819c083SNicolas Chautru 		hard_output = &ops_td->hard_output;
2506d819c083SNicolas Chautru 		harq_output = &ops_td->harq_combined_output;
2507d819c083SNicolas Chautru 		soft_output = &ops_td->soft_output;
2508d819c083SNicolas Chautru 
2509d819c083SNicolas Chautru 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
2510d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
2511d819c083SNicolas Chautru 				"Checking status and ordering for decoder failed");
2512d819c083SNicolas Chautru 		if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)
2513d819c083SNicolas Chautru 			TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count,
2514d819c083SNicolas Chautru 					"Returned iter_count (%d) > expected iter_count (%d)",
2515d819c083SNicolas Chautru 					ops_td->iter_count, ref_td->iter_count);
2516335c11fdSNicolas Chautru 		/*
2517335c11fdSNicolas Chautru 		 * We can ignore output data when the decoding failed to
2518335c11fdSNicolas Chautru 		 * converge or for loop-back cases
2519335c11fdSNicolas Chautru 		 */
2520335c11fdSNicolas Chautru 		if (!check_bit(ops[i]->ldpc_dec.op_flags,
2521335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK
2522335c11fdSNicolas Chautru 				) && (
2523335c11fdSNicolas Chautru 				ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR
2524335c11fdSNicolas Chautru 						)) == 0)
2525d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
2526d819c083SNicolas Chautru 					hard_data_orig),
2527d819c083SNicolas Chautru 					"Hard output buffers (CB=%u) are not equal",
2528d819c083SNicolas Chautru 					i);
2529d819c083SNicolas Chautru 
2530d819c083SNicolas Chautru 		if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE)
25319d9d73ebSHernan Vargas 			TEST_ASSERT_SUCCESS(validate_op_so_chain(soft_output,
2532d819c083SNicolas Chautru 					soft_data_orig),
2533d819c083SNicolas Chautru 					"Soft output buffers (CB=%u) are not equal",
2534d819c083SNicolas Chautru 					i);
2535d819c083SNicolas Chautru 		if (ref_op->ldpc_dec.op_flags &
2536d819c083SNicolas Chautru 				RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) {
2537335c11fdSNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output,
2538335c11fdSNicolas Chautru 					harq_data_orig, ops_td),
2539d819c083SNicolas Chautru 					"HARQ output buffers (CB=%u) are not equal",
2540d819c083SNicolas Chautru 					i);
2541d819c083SNicolas Chautru 		}
2542335c11fdSNicolas Chautru 		if (ref_op->ldpc_dec.op_flags &
2543335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
2544335c11fdSNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output,
2545335c11fdSNicolas Chautru 					harq_data_orig, ops_td),
2546335c11fdSNicolas Chautru 					"HARQ output buffers (CB=%u) are not equal",
2547335c11fdSNicolas Chautru 					i);
2548335c11fdSNicolas Chautru 
2549d819c083SNicolas Chautru 	}
2550d819c083SNicolas Chautru 
2551d819c083SNicolas Chautru 	return TEST_SUCCESS;
2552d819c083SNicolas Chautru }
2553d819c083SNicolas Chautru 
2554d819c083SNicolas Chautru 
2555f714a188SAmr Mokhtar static int
2556f714a188SAmr Mokhtar validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
2557f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op)
2558f714a188SAmr Mokhtar {
2559f714a188SAmr Mokhtar 	unsigned int i;
2560f714a188SAmr Mokhtar 	int ret;
2561f714a188SAmr Mokhtar 	struct op_data_entries *hard_data_orig =
2562f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
2563f714a188SAmr Mokhtar 
2564f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
2565f714a188SAmr Mokhtar 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
2566f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
2567f714a188SAmr Mokhtar 				"Checking status and ordering for encoder failed");
2568f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(validate_op_chain(
2569f714a188SAmr Mokhtar 				&ops[i]->turbo_enc.output,
2570f714a188SAmr Mokhtar 				hard_data_orig),
2571f714a188SAmr Mokhtar 				"Output buffers (CB=%u) are not equal",
2572f714a188SAmr Mokhtar 				i);
2573f714a188SAmr Mokhtar 	}
2574f714a188SAmr Mokhtar 
2575f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2576f714a188SAmr Mokhtar }
2577f714a188SAmr Mokhtar 
2578d819c083SNicolas Chautru static int
2579d819c083SNicolas Chautru validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
2580d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op)
2581d819c083SNicolas Chautru {
2582d819c083SNicolas Chautru 	unsigned int i;
2583d819c083SNicolas Chautru 	int ret;
2584d819c083SNicolas Chautru 	struct op_data_entries *hard_data_orig =
2585d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2586d819c083SNicolas Chautru 
2587d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
2588d819c083SNicolas Chautru 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
2589d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
2590d819c083SNicolas Chautru 				"Checking status and ordering for encoder failed");
2591d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(validate_op_chain(
2592d819c083SNicolas Chautru 				&ops[i]->ldpc_enc.output,
2593d819c083SNicolas Chautru 				hard_data_orig),
2594d819c083SNicolas Chautru 				"Output buffers (CB=%u) are not equal",
2595d819c083SNicolas Chautru 				i);
2596d819c083SNicolas Chautru 	}
2597d819c083SNicolas Chautru 
2598d819c083SNicolas Chautru 	return TEST_SUCCESS;
2599d819c083SNicolas Chautru }
2600d819c083SNicolas Chautru 
26010acdb986SNicolas Chautru static inline int
2602a2ea86cbSHernan Vargas validate_op_fft_chain(struct rte_bbdev_op_data *op, struct op_data_entries *orig_op,
2603a2ea86cbSHernan Vargas 		bool skip_validate_output)
26040acdb986SNicolas Chautru {
26050acdb986SNicolas Chautru 	struct rte_mbuf *m = op->data;
26060acdb986SNicolas Chautru 	uint8_t i, nb_dst_segments = orig_op->nb_segments;
26070ed76d66SHernan Vargas 	int16_t delt, abs_delt, thres_hold = 4;
26080acdb986SNicolas Chautru 	uint32_t j, data_len_iq, error_num;
26090acdb986SNicolas Chautru 	int16_t *ref_out, *op_out;
26100acdb986SNicolas Chautru 
26110acdb986SNicolas Chautru 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
26120acdb986SNicolas Chautru 			"Number of segments differ in original (%u) and filled (%u) op fft",
26130acdb986SNicolas Chautru 			nb_dst_segments, m->nb_segs);
26140acdb986SNicolas Chautru 
26150acdb986SNicolas Chautru 	/* Due to size limitation of mbuf, FFT doesn't use real mbuf. */
26160acdb986SNicolas Chautru 	for (i = 0; i < nb_dst_segments; ++i) {
26170acdb986SNicolas Chautru 		uint16_t offset = (i == 0) ? op->offset : 0;
26180acdb986SNicolas Chautru 		uint32_t data_len = op->length;
26190acdb986SNicolas Chautru 
26200acdb986SNicolas Chautru 		TEST_ASSERT(orig_op->segments[i].length == data_len,
26210acdb986SNicolas Chautru 				"Length of segment differ in original (%u) and filled (%u) op fft",
26220acdb986SNicolas Chautru 				orig_op->segments[i].length, data_len);
26230acdb986SNicolas Chautru 		/* Divided by 2 to get the number of 16bits data. */
26240acdb986SNicolas Chautru 		data_len_iq = data_len >> 1;
26250acdb986SNicolas Chautru 		ref_out = (int16_t *)(orig_op->segments[i].addr);
26260acdb986SNicolas Chautru 		op_out = rte_pktmbuf_mtod_offset(m, int16_t *, offset);
26270acdb986SNicolas Chautru 		error_num = 0;
26280acdb986SNicolas Chautru 		for (j = 0; j < data_len_iq; j++) {
26290acdb986SNicolas Chautru 			delt = ref_out[j] - op_out[j];
26300acdb986SNicolas Chautru 			abs_delt = delt > 0 ? delt : -delt;
26310acdb986SNicolas Chautru 			error_num += (abs_delt > thres_hold ? 1 : 0);
26320acdb986SNicolas Chautru 		}
2633a2ea86cbSHernan Vargas 		if ((error_num > 0) && !skip_validate_output) {
26340acdb986SNicolas Chautru 			rte_memdump(stdout, "Buffer A", ref_out, data_len);
26350acdb986SNicolas Chautru 			rte_memdump(stdout, "Buffer B", op_out, data_len);
26360acdb986SNicolas Chautru 			TEST_ASSERT(error_num == 0,
26370acdb986SNicolas Chautru 				"FFT Output are not matched total (%u) errors (%u)",
26380acdb986SNicolas Chautru 				data_len_iq, error_num);
26390acdb986SNicolas Chautru 		}
26400acdb986SNicolas Chautru 
26410acdb986SNicolas Chautru 		m = m->next;
26420acdb986SNicolas Chautru 	}
26430acdb986SNicolas Chautru 
26440acdb986SNicolas Chautru 	return TEST_SUCCESS;
26450acdb986SNicolas Chautru }
26460acdb986SNicolas Chautru 
264795f192a4SHernan Vargas static inline int
2648c268644aSHernan Vargas validate_op_fft_meas_chain(struct rte_bbdev_op_data *op, struct op_data_entries *orig_op,
2649c268644aSHernan Vargas 		bool skip_validate_output)
2650c268644aSHernan Vargas {
2651c268644aSHernan Vargas 	struct rte_mbuf *m = op->data;
2652c268644aSHernan Vargas 	uint8_t i, nb_dst_segments = orig_op->nb_segments;
2653c268644aSHernan Vargas 	double thres_hold = 1.0;
2654c268644aSHernan Vargas 	uint32_t j, data_len_iq, error_num;
2655c268644aSHernan Vargas 	int32_t *ref_out, *op_out;
2656c268644aSHernan Vargas 	double estSNR, refSNR, delt, abs_delt;
2657c268644aSHernan Vargas 
2658c268644aSHernan Vargas 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
2659c268644aSHernan Vargas 			"Number of segments differ in original (%u) and filled (%u) op fft",
2660c268644aSHernan Vargas 			nb_dst_segments, m->nb_segs);
2661c268644aSHernan Vargas 
2662c268644aSHernan Vargas 	/* Due to size limitation of mbuf, FFT doesn't use real mbuf. */
2663c268644aSHernan Vargas 	for (i = 0; i < nb_dst_segments; ++i) {
2664c268644aSHernan Vargas 		uint16_t offset = (i == 0) ? op->offset : 0;
2665c268644aSHernan Vargas 		uint32_t data_len = op->length;
2666c268644aSHernan Vargas 
2667c268644aSHernan Vargas 		TEST_ASSERT(orig_op->segments[i].length == data_len,
2668c268644aSHernan Vargas 				"Length of segment differ in original (%u) and filled (%u) op fft",
2669c268644aSHernan Vargas 				orig_op->segments[i].length, data_len);
2670c268644aSHernan Vargas 
2671c268644aSHernan Vargas 		/* Divided by 4 to get the number of 32 bits data. */
2672c268644aSHernan Vargas 		data_len_iq = data_len >> 2;
2673c268644aSHernan Vargas 		ref_out = (int32_t *)(orig_op->segments[i].addr);
2674c268644aSHernan Vargas 		op_out = rte_pktmbuf_mtod_offset(m, int32_t *, offset);
2675c268644aSHernan Vargas 		error_num = 0;
2676c268644aSHernan Vargas 		for (j = 0; j < data_len_iq; j++) {
2677c268644aSHernan Vargas 			estSNR = 10*log10(op_out[j]);
2678c268644aSHernan Vargas 			refSNR = 10*log10(ref_out[j]);
2679c268644aSHernan Vargas 			delt = refSNR - estSNR;
2680c268644aSHernan Vargas 			abs_delt = delt > 0 ? delt : -delt;
2681c268644aSHernan Vargas 			error_num += (abs_delt > thres_hold ? 1 : 0);
2682c268644aSHernan Vargas 		}
2683c268644aSHernan Vargas 		if ((error_num > 0) && !skip_validate_output) {
2684c268644aSHernan Vargas 			rte_memdump(stdout, "Buffer A", ref_out, data_len);
2685c268644aSHernan Vargas 			rte_memdump(stdout, "Buffer B", op_out, data_len);
2686c268644aSHernan Vargas 			TEST_ASSERT(error_num == 0,
2687c268644aSHernan Vargas 				"FFT Output are not matched total (%u) errors (%u)",
2688c268644aSHernan Vargas 				data_len_iq, error_num);
2689c268644aSHernan Vargas 		}
2690c268644aSHernan Vargas 
2691c268644aSHernan Vargas 		m = m->next;
2692c268644aSHernan Vargas 	}
2693c268644aSHernan Vargas 
2694c268644aSHernan Vargas 	return TEST_SUCCESS;
2695c268644aSHernan Vargas }
2696c268644aSHernan Vargas 
2697c268644aSHernan Vargas static inline int
269895f192a4SHernan Vargas validate_op_mldts_chain(struct rte_bbdev_op_data *op,
269995f192a4SHernan Vargas 		struct op_data_entries *orig_op)
270095f192a4SHernan Vargas {
270195f192a4SHernan Vargas 	uint8_t i;
270295f192a4SHernan Vargas 	struct rte_mbuf *m = op->data;
270395f192a4SHernan Vargas 	uint8_t nb_dst_segments = orig_op->nb_segments;
270495f192a4SHernan Vargas 	/*the result is not bit exact*/
270595f192a4SHernan Vargas 	int16_t thres_hold = 3;
270695f192a4SHernan Vargas 	int16_t delt, abs_delt;
270795f192a4SHernan Vargas 	uint32_t j, data_len_iq;
270895f192a4SHernan Vargas 	uint32_t error_num;
270995f192a4SHernan Vargas 	int8_t *ref_out;
271095f192a4SHernan Vargas 	int8_t *op_out;
271195f192a4SHernan Vargas 
271295f192a4SHernan Vargas 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
271395f192a4SHernan Vargas 			"Number of segments differ in original (%u) and filled (%u) op mldts",
271495f192a4SHernan Vargas 			nb_dst_segments, m->nb_segs);
271595f192a4SHernan Vargas 
271695f192a4SHernan Vargas 	/* Due to size limitation of mbuf, MLDTS doesn't use real mbuf. */
271795f192a4SHernan Vargas 	for (i = 0; i < nb_dst_segments; ++i) {
271895f192a4SHernan Vargas 		uint16_t offset = (i == 0) ? op->offset : 0;
271995f192a4SHernan Vargas 		uint32_t data_len = op->length;
272095f192a4SHernan Vargas 
272195f192a4SHernan Vargas 		TEST_ASSERT(orig_op->segments[i].length == data_len,
272295f192a4SHernan Vargas 				"Length of segment differ in original (%u) and filled (%u) op mldts",
272395f192a4SHernan Vargas 				orig_op->segments[i].length, data_len);
272495f192a4SHernan Vargas 		data_len_iq = data_len;
272595f192a4SHernan Vargas 		ref_out = (int8_t *)(orig_op->segments[i].addr);
272695f192a4SHernan Vargas 		op_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset);
272795f192a4SHernan Vargas 		error_num = 0;
272895f192a4SHernan Vargas 		for (j = 0; j < data_len_iq; j++) {
272995f192a4SHernan Vargas 
273095f192a4SHernan Vargas 			delt = ref_out[j] - op_out[j];
273195f192a4SHernan Vargas 			abs_delt = delt > 0 ? delt : -delt;
273295f192a4SHernan Vargas 			error_num += (abs_delt > thres_hold ? 1 : 0);
273395f192a4SHernan Vargas 			if (error_num > 0)
273495f192a4SHernan Vargas 				printf("MLD Error %d: Exp %x %d Actual %x %d Diff %d\n",
273595f192a4SHernan Vargas 						j, ref_out[j], ref_out[j], op_out[j], op_out[j],
273695f192a4SHernan Vargas 						delt);
273795f192a4SHernan Vargas 		}
273895f192a4SHernan Vargas 		TEST_ASSERT(error_num == 0,
273995f192a4SHernan Vargas 			"MLDTS Output are not matched total (%u) errors (%u)",
274095f192a4SHernan Vargas 			data_len_iq, error_num);
274195f192a4SHernan Vargas 
274295f192a4SHernan Vargas 		m = m->next;
274395f192a4SHernan Vargas 	}
274495f192a4SHernan Vargas 
274595f192a4SHernan Vargas 	return TEST_SUCCESS;
274695f192a4SHernan Vargas }
274795f192a4SHernan Vargas 
27480acdb986SNicolas Chautru static int
27490acdb986SNicolas Chautru validate_fft_op(struct rte_bbdev_fft_op **ops, const uint16_t n,
27500acdb986SNicolas Chautru 		struct rte_bbdev_fft_op *ref_op)
27510acdb986SNicolas Chautru {
27520acdb986SNicolas Chautru 	unsigned int i;
27530acdb986SNicolas Chautru 	int ret;
27540acdb986SNicolas Chautru 	struct op_data_entries *fft_data_orig = &test_vector.entries[DATA_HARD_OUTPUT];
27550acdb986SNicolas Chautru 	struct op_data_entries *fft_pwr_orig = &test_vector.entries[DATA_SOFT_OUTPUT];
2756a2ea86cbSHernan Vargas 	bool skip_validate_output = false;
2757a2ea86cbSHernan Vargas 
2758a2ea86cbSHernan Vargas 	if ((test_vector.fft_window_width_vec > 0) &&
2759a2ea86cbSHernan Vargas 			(test_vector.fft_window_width_vec != fft_window_width_dev)) {
2760a2ea86cbSHernan Vargas 		printf("The vector FFT width doesn't match with device - skip %d %d\n",
2761a2ea86cbSHernan Vargas 				test_vector.fft_window_width_vec, fft_window_width_dev);
2762a2ea86cbSHernan Vargas 		skip_validate_output = true;
2763a2ea86cbSHernan Vargas 	}
27640acdb986SNicolas Chautru 
27650acdb986SNicolas Chautru 	for (i = 0; i < n; ++i) {
27660acdb986SNicolas Chautru 		ret = check_fft_status_and_ordering(ops[i], i, ref_op->status);
27670acdb986SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Checking status and ordering for FFT failed");
27680acdb986SNicolas Chautru 		TEST_ASSERT_SUCCESS(validate_op_fft_chain(
2769a2ea86cbSHernan Vargas 				&ops[i]->fft.base_output, fft_data_orig, skip_validate_output),
27700acdb986SNicolas Chautru 				"FFT Output buffers (op=%u) are not matched", i);
27710acdb986SNicolas Chautru 		if (check_bit(ops[i]->fft.op_flags, RTE_BBDEV_FFT_POWER_MEAS))
2772c268644aSHernan Vargas 			TEST_ASSERT_SUCCESS(validate_op_fft_meas_chain(
2773a2ea86cbSHernan Vargas 				&ops[i]->fft.power_meas_output, fft_pwr_orig, skip_validate_output),
27740acdb986SNicolas Chautru 				"FFT Power Output buffers (op=%u) are not matched", i);
27750acdb986SNicolas Chautru 	}
27760acdb986SNicolas Chautru 
27770acdb986SNicolas Chautru 	return TEST_SUCCESS;
27780acdb986SNicolas Chautru }
27790acdb986SNicolas Chautru 
278095f192a4SHernan Vargas static int
278195f192a4SHernan Vargas validate_mldts_op(struct rte_bbdev_mldts_op **ops, const uint16_t n,
278295f192a4SHernan Vargas 		struct rte_bbdev_mldts_op *ref_op)
278395f192a4SHernan Vargas {
278495f192a4SHernan Vargas 	unsigned int i;
278595f192a4SHernan Vargas 	int ret;
278695f192a4SHernan Vargas 	struct op_data_entries *mldts_data_orig =
278795f192a4SHernan Vargas 			&test_vector.entries[DATA_HARD_OUTPUT];
278895f192a4SHernan Vargas 	for (i = 0; i < n; ++i) {
278995f192a4SHernan Vargas 		ret = check_mldts_status_and_ordering(ops[i], i, ref_op->status);
279095f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(ret,
279195f192a4SHernan Vargas 				"Checking status and ordering for MLDTS failed");
279295f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(validate_op_mldts_chain(
279395f192a4SHernan Vargas 				&ops[i]->mldts.output,
279495f192a4SHernan Vargas 				mldts_data_orig),
279595f192a4SHernan Vargas 				"MLDTS Output buffers (op=%u) are not matched",
279695f192a4SHernan Vargas 				i);
279795f192a4SHernan Vargas 	}
279895f192a4SHernan Vargas 
279995f192a4SHernan Vargas 	return TEST_SUCCESS;
280095f192a4SHernan Vargas }
280195f192a4SHernan Vargas 
2802f714a188SAmr Mokhtar static void
2803f714a188SAmr Mokhtar create_reference_dec_op(struct rte_bbdev_dec_op *op)
2804f714a188SAmr Mokhtar {
2805f714a188SAmr Mokhtar 	unsigned int i;
2806f714a188SAmr Mokhtar 	struct op_data_entries *entry;
2807f714a188SAmr Mokhtar 
2808f714a188SAmr Mokhtar 	op->turbo_dec = test_vector.turbo_dec;
2809f714a188SAmr Mokhtar 	entry = &test_vector.entries[DATA_INPUT];
2810f714a188SAmr Mokhtar 	for (i = 0; i < entry->nb_segments; ++i)
2811f714a188SAmr Mokhtar 		op->turbo_dec.input.length +=
2812f714a188SAmr Mokhtar 				entry->segments[i].length;
2813f714a188SAmr Mokhtar }
2814f714a188SAmr Mokhtar 
2815f714a188SAmr Mokhtar static void
2816d819c083SNicolas Chautru create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op)
2817d819c083SNicolas Chautru {
2818d819c083SNicolas Chautru 	unsigned int i;
2819d819c083SNicolas Chautru 	struct op_data_entries *entry;
2820d819c083SNicolas Chautru 
2821d819c083SNicolas Chautru 	op->ldpc_dec = test_vector.ldpc_dec;
2822d819c083SNicolas Chautru 	entry = &test_vector.entries[DATA_INPUT];
2823d819c083SNicolas Chautru 	for (i = 0; i < entry->nb_segments; ++i)
2824d819c083SNicolas Chautru 		op->ldpc_dec.input.length +=
2825d819c083SNicolas Chautru 				entry->segments[i].length;
2826d819c083SNicolas Chautru 	if (test_vector.ldpc_dec.op_flags &
2827d819c083SNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) {
2828d819c083SNicolas Chautru 		entry = &test_vector.entries[DATA_HARQ_INPUT];
2829d819c083SNicolas Chautru 		for (i = 0; i < entry->nb_segments; ++i)
2830d819c083SNicolas Chautru 			op->ldpc_dec.harq_combined_input.length +=
2831d819c083SNicolas Chautru 				entry->segments[i].length;
2832d819c083SNicolas Chautru 	}
2833d819c083SNicolas Chautru }
2834d819c083SNicolas Chautru 
28350acdb986SNicolas Chautru static void
28360acdb986SNicolas Chautru create_reference_fft_op(struct rte_bbdev_fft_op *op)
28370acdb986SNicolas Chautru {
28380acdb986SNicolas Chautru 	unsigned int i;
28390acdb986SNicolas Chautru 	struct op_data_entries *entry;
28400acdb986SNicolas Chautru 	op->fft = test_vector.fft;
28410acdb986SNicolas Chautru 	entry = &test_vector.entries[DATA_INPUT];
28420acdb986SNicolas Chautru 	for (i = 0; i < entry->nb_segments; ++i)
28430acdb986SNicolas Chautru 		op->fft.base_input.length += entry->segments[i].length;
28440ed76d66SHernan Vargas 	entry = &test_vector.entries[DATA_HARQ_INPUT];
28450ed76d66SHernan Vargas 	for (i = 0; i < entry->nb_segments; ++i)
28460ed76d66SHernan Vargas 		op->fft.dewindowing_input.length += entry->segments[i].length;
28470acdb986SNicolas Chautru }
2848d819c083SNicolas Chautru 
2849d819c083SNicolas Chautru static void
285095f192a4SHernan Vargas create_reference_mldts_op(struct rte_bbdev_mldts_op *op)
285195f192a4SHernan Vargas {
285295f192a4SHernan Vargas 	unsigned int i;
285395f192a4SHernan Vargas 	struct op_data_entries *entry;
285495f192a4SHernan Vargas 	op->mldts = test_vector.mldts;
285595f192a4SHernan Vargas 	entry = &test_vector.entries[DATA_INPUT];
285695f192a4SHernan Vargas 	for (i = 0; i < entry->nb_segments; ++i)
285795f192a4SHernan Vargas 		op->mldts.qhy_input.length += entry->segments[i].length;
285895f192a4SHernan Vargas 	entry = &test_vector.entries[DATA_HARQ_INPUT];
285995f192a4SHernan Vargas 	for (i = 0; i < entry->nb_segments; ++i)
286095f192a4SHernan Vargas 		op->mldts.r_input.length += entry->segments[i].length;
286195f192a4SHernan Vargas }
286295f192a4SHernan Vargas 
286395f192a4SHernan Vargas static void
2864f714a188SAmr Mokhtar create_reference_enc_op(struct rte_bbdev_enc_op *op)
2865f714a188SAmr Mokhtar {
2866f714a188SAmr Mokhtar 	unsigned int i;
2867f714a188SAmr Mokhtar 	struct op_data_entries *entry;
2868f714a188SAmr Mokhtar 
2869f714a188SAmr Mokhtar 	op->turbo_enc = test_vector.turbo_enc;
2870f714a188SAmr Mokhtar 	entry = &test_vector.entries[DATA_INPUT];
2871f714a188SAmr Mokhtar 	for (i = 0; i < entry->nb_segments; ++i)
2872f714a188SAmr Mokhtar 		op->turbo_enc.input.length +=
2873f714a188SAmr Mokhtar 				entry->segments[i].length;
2874f714a188SAmr Mokhtar }
2875f714a188SAmr Mokhtar 
2876d819c083SNicolas Chautru static void
2877d819c083SNicolas Chautru create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op)
2878d819c083SNicolas Chautru {
2879d819c083SNicolas Chautru 	unsigned int i;
2880d819c083SNicolas Chautru 	struct op_data_entries *entry;
2881d819c083SNicolas Chautru 
2882d819c083SNicolas Chautru 	op->ldpc_enc = test_vector.ldpc_enc;
2883d819c083SNicolas Chautru 	entry = &test_vector.entries[DATA_INPUT];
2884d819c083SNicolas Chautru 	for (i = 0; i < entry->nb_segments; ++i)
2885d819c083SNicolas Chautru 		op->ldpc_enc.input.length +=
2886d819c083SNicolas Chautru 				entry->segments[i].length;
2887d819c083SNicolas Chautru }
2888d819c083SNicolas Chautru 
28890b98d574SKamil Chalupnik static uint32_t
28900b98d574SKamil Chalupnik calc_dec_TB_size(struct rte_bbdev_dec_op *op)
28910b98d574SKamil Chalupnik {
28920b98d574SKamil Chalupnik 	uint8_t i;
28930b98d574SKamil Chalupnik 	uint32_t c, r, tb_size = 0;
28940b98d574SKamil Chalupnik 
289548fc315fSNicolas Chautru 	if (op->turbo_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
28960b98d574SKamil Chalupnik 		tb_size = op->turbo_dec.tb_params.k_neg;
28970b98d574SKamil Chalupnik 	} else {
28980b98d574SKamil Chalupnik 		c = op->turbo_dec.tb_params.c;
28990b98d574SKamil Chalupnik 		r = op->turbo_dec.tb_params.r;
29000b98d574SKamil Chalupnik 		for (i = 0; i < c-r; i++)
29010b98d574SKamil Chalupnik 			tb_size += (r < op->turbo_dec.tb_params.c_neg) ?
29020b98d574SKamil Chalupnik 				op->turbo_dec.tb_params.k_neg :
29030b98d574SKamil Chalupnik 				op->turbo_dec.tb_params.k_pos;
29040b98d574SKamil Chalupnik 	}
29050b98d574SKamil Chalupnik 	return tb_size;
29060b98d574SKamil Chalupnik }
29070b98d574SKamil Chalupnik 
29080b98d574SKamil Chalupnik static uint32_t
2909d819c083SNicolas Chautru calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op)
2910d819c083SNicolas Chautru {
2911647144a5SHernan Vargas 	uint8_t num_cbs = 0;
2912647144a5SHernan Vargas 	uint32_t tb_size = 0;
2913d819c083SNicolas Chautru 	uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10;
2914d819c083SNicolas Chautru 
2915647144a5SHernan Vargas 	if (op->ldpc_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK)
2916647144a5SHernan Vargas 		num_cbs = 1;
2917647144a5SHernan Vargas 	else
2918647144a5SHernan Vargas 		num_cbs = op->ldpc_dec.tb_params.c - op->ldpc_dec.tb_params.r;
2919647144a5SHernan Vargas 
2920647144a5SHernan Vargas 	tb_size = (sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler) * num_cbs;
2921d819c083SNicolas Chautru 	return tb_size;
2922d819c083SNicolas Chautru }
2923d819c083SNicolas Chautru 
2924d819c083SNicolas Chautru static uint32_t
29250b98d574SKamil Chalupnik calc_enc_TB_size(struct rte_bbdev_enc_op *op)
29260b98d574SKamil Chalupnik {
29270b98d574SKamil Chalupnik 	uint8_t i;
29280b98d574SKamil Chalupnik 	uint32_t c, r, tb_size = 0;
29290b98d574SKamil Chalupnik 
293048fc315fSNicolas Chautru 	if (op->turbo_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
29310b98d574SKamil Chalupnik 		tb_size = op->turbo_enc.tb_params.k_neg;
29320b98d574SKamil Chalupnik 	} else {
29330b98d574SKamil Chalupnik 		c = op->turbo_enc.tb_params.c;
29340b98d574SKamil Chalupnik 		r = op->turbo_enc.tb_params.r;
29350b98d574SKamil Chalupnik 		for (i = 0; i < c-r; i++)
29360b98d574SKamil Chalupnik 			tb_size += (r < op->turbo_enc.tb_params.c_neg) ?
29370b98d574SKamil Chalupnik 				op->turbo_enc.tb_params.k_neg :
29380b98d574SKamil Chalupnik 				op->turbo_enc.tb_params.k_pos;
29390b98d574SKamil Chalupnik 	}
29400b98d574SKamil Chalupnik 	return tb_size;
29410b98d574SKamil Chalupnik }
29420b98d574SKamil Chalupnik 
2943d819c083SNicolas Chautru static uint32_t
2944d819c083SNicolas Chautru calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op)
2945d819c083SNicolas Chautru {
2946647144a5SHernan Vargas 	uint8_t num_cbs = 0;
2947647144a5SHernan Vargas 	uint32_t tb_size = 0;
2948d819c083SNicolas Chautru 	uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10;
2949d819c083SNicolas Chautru 
2950647144a5SHernan Vargas 	if (op->ldpc_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK)
2951647144a5SHernan Vargas 		num_cbs = 1;
2952647144a5SHernan Vargas 	else
2953647144a5SHernan Vargas 		num_cbs = op->ldpc_enc.tb_params.c - op->ldpc_enc.tb_params.r;
2954647144a5SHernan Vargas 
2955647144a5SHernan Vargas 	tb_size = (sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler) * num_cbs;
2956d819c083SNicolas Chautru 	return tb_size;
2957d819c083SNicolas Chautru }
2958d819c083SNicolas Chautru 
29590acdb986SNicolas Chautru static uint32_t
29600acdb986SNicolas Chautru calc_fft_size(struct rte_bbdev_fft_op *op)
29610acdb986SNicolas Chautru {
29620acdb986SNicolas Chautru 	uint32_t output_size;
29630acdb986SNicolas Chautru 	int num_cs = 0, i;
29640acdb986SNicolas Chautru 	for (i = 0; i < 12; i++)
29650acdb986SNicolas Chautru 		if (check_bit(op->fft.cs_bitmap, 1 << i))
29660acdb986SNicolas Chautru 			num_cs++;
29670acdb986SNicolas Chautru 	output_size = (num_cs * op->fft.output_sequence_size * 4) << op->fft.num_antennas_log2;
29680acdb986SNicolas Chautru 	return output_size;
29690acdb986SNicolas Chautru }
2970d819c083SNicolas Chautru 
297195f192a4SHernan Vargas static uint32_t
297295f192a4SHernan Vargas calc_mldts_size(struct rte_bbdev_mldts_op *op)
297395f192a4SHernan Vargas {
29740de3cb95SHernan Vargas 	uint32_t output_size = 0;
29750de3cb95SHernan Vargas 	uint16_t i;
29760de3cb95SHernan Vargas 
29770de3cb95SHernan Vargas 	for (i = 0; i < op->mldts.num_layers; i++)
29780de3cb95SHernan Vargas 		output_size += op->mldts.q_m[i];
29790de3cb95SHernan Vargas 
29800de3cb95SHernan Vargas 	output_size *= NUM_SC_PER_RB * BITS_PER_LLR * op->mldts.num_rbs * (op->mldts.c_rep + 1);
29810de3cb95SHernan Vargas 
298295f192a4SHernan Vargas 	return output_size;
298395f192a4SHernan Vargas }
298495f192a4SHernan Vargas 
2985f714a188SAmr Mokhtar static int
2986f714a188SAmr Mokhtar init_test_op_params(struct test_op_params *op_params,
2987f714a188SAmr Mokhtar 		enum rte_bbdev_op_type op_type, const int expected_status,
2988f714a188SAmr Mokhtar 		const int vector_mask, struct rte_mempool *ops_mp,
2989f714a188SAmr Mokhtar 		uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores)
2990f714a188SAmr Mokhtar {
2991f714a188SAmr Mokhtar 	int ret = 0;
2992d819c083SNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
2993d819c083SNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
2994f714a188SAmr Mokhtar 		ret = rte_bbdev_dec_op_alloc_bulk(ops_mp,
2995f714a188SAmr Mokhtar 				&op_params->ref_dec_op, 1);
29960acdb986SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_FFT)
29970acdb986SNicolas Chautru 		ret = rte_bbdev_fft_op_alloc_bulk(ops_mp,
29980acdb986SNicolas Chautru 				&op_params->ref_fft_op, 1);
299995f192a4SHernan Vargas 	else if (op_type == RTE_BBDEV_OP_MLDTS)
300095f192a4SHernan Vargas 		ret = rte_bbdev_mldts_op_alloc_bulk(ops_mp,
300195f192a4SHernan Vargas 				&op_params->ref_mldts_op, 1);
3002f714a188SAmr Mokhtar 	else
3003f714a188SAmr Mokhtar 		ret = rte_bbdev_enc_op_alloc_bulk(ops_mp,
3004f714a188SAmr Mokhtar 				&op_params->ref_enc_op, 1);
3005f714a188SAmr Mokhtar 
3006f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed");
3007f714a188SAmr Mokhtar 
3008f714a188SAmr Mokhtar 	op_params->mp = ops_mp;
3009f714a188SAmr Mokhtar 	op_params->burst_sz = burst_sz;
3010f714a188SAmr Mokhtar 	op_params->num_to_process = num_to_process;
3011f714a188SAmr Mokhtar 	op_params->num_lcores = num_lcores;
3012f714a188SAmr Mokhtar 	op_params->vector_mask = vector_mask;
3013d819c083SNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
3014d819c083SNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
3015f714a188SAmr Mokhtar 		op_params->ref_dec_op->status = expected_status;
3016d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC
3017d819c083SNicolas Chautru 			|| op_type == RTE_BBDEV_OP_LDPC_ENC)
3018f714a188SAmr Mokhtar 		op_params->ref_enc_op->status = expected_status;
30190acdb986SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_FFT)
30200acdb986SNicolas Chautru 		op_params->ref_fft_op->status = expected_status;
302195f192a4SHernan Vargas 	else if (op_type == RTE_BBDEV_OP_MLDTS)
302295f192a4SHernan Vargas 		op_params->ref_mldts_op->status = expected_status;
3023f714a188SAmr Mokhtar 	return 0;
3024f714a188SAmr Mokhtar }
3025f714a188SAmr Mokhtar 
3026f714a188SAmr Mokhtar static int
3027f714a188SAmr Mokhtar run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id,
3028f714a188SAmr Mokhtar 		struct test_op_params *op_params)
3029f714a188SAmr Mokhtar {
3030f714a188SAmr Mokhtar 	int t_ret, f_ret, socket_id = SOCKET_ID_ANY;
3031f714a188SAmr Mokhtar 	unsigned int i;
3032f714a188SAmr Mokhtar 	struct active_device *ad;
3033f714a188SAmr Mokhtar 	unsigned int burst_sz = get_burst_sz();
3034f714a188SAmr Mokhtar 	enum rte_bbdev_op_type op_type = test_vector.op_type;
303547d5a049SKamil Chalupnik 	const struct rte_bbdev_op_cap *capabilities = NULL;
3036f714a188SAmr Mokhtar 
3037f714a188SAmr Mokhtar 	ad = &active_devs[dev_id];
3038f714a188SAmr Mokhtar 
3039f714a188SAmr Mokhtar 	/* Check if device supports op_type */
3040f714a188SAmr Mokhtar 	if (!is_avail_op(ad, test_vector.op_type))
3041f714a188SAmr Mokhtar 		return TEST_SUCCESS;
3042f714a188SAmr Mokhtar 
3043f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
3044f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
3045f714a188SAmr Mokhtar 	socket_id = GET_SOCKET(info.socket_id);
3046f714a188SAmr Mokhtar 
3047f714a188SAmr Mokhtar 	f_ret = create_mempools(ad, socket_id, op_type,
3048f714a188SAmr Mokhtar 			get_num_ops());
3049f714a188SAmr Mokhtar 	if (f_ret != TEST_SUCCESS) {
3050f714a188SAmr Mokhtar 		printf("Couldn't create mempools");
3051f714a188SAmr Mokhtar 		goto fail;
3052f714a188SAmr Mokhtar 	}
3053ad458935SKamil Chalupnik 	if (op_type == RTE_BBDEV_OP_NONE)
3054ad458935SKamil Chalupnik 		op_type = RTE_BBDEV_OP_TURBO_ENC;
3055f714a188SAmr Mokhtar 
3056f714a188SAmr Mokhtar 	f_ret = init_test_op_params(op_params, test_vector.op_type,
3057f714a188SAmr Mokhtar 			test_vector.expected_status,
3058f714a188SAmr Mokhtar 			test_vector.mask,
3059f714a188SAmr Mokhtar 			ad->ops_mempool,
3060f714a188SAmr Mokhtar 			burst_sz,
3061f714a188SAmr Mokhtar 			get_num_ops(),
3062f714a188SAmr Mokhtar 			get_num_lcores());
3063f714a188SAmr Mokhtar 	if (f_ret != TEST_SUCCESS) {
3064f714a188SAmr Mokhtar 		printf("Couldn't init test op params");
3065f714a188SAmr Mokhtar 		goto fail;
3066f714a188SAmr Mokhtar 	}
3067f714a188SAmr Mokhtar 
3068d819c083SNicolas Chautru 
3069d819c083SNicolas Chautru 	/* Find capabilities */
307047d5a049SKamil Chalupnik 	const struct rte_bbdev_op_cap *cap = info.drv.capabilities;
3071e70212ccSNicolas Chautru 	do {
3072d819c083SNicolas Chautru 		if (cap->type == test_vector.op_type) {
307347d5a049SKamil Chalupnik 			capabilities = cap;
307447d5a049SKamil Chalupnik 			break;
307547d5a049SKamil Chalupnik 		}
3076d819c083SNicolas Chautru 		cap++;
3077e70212ccSNicolas Chautru 	} while (cap->type != RTE_BBDEV_OP_NONE);
307847d5a049SKamil Chalupnik 	TEST_ASSERT_NOT_NULL(capabilities,
3079d819c083SNicolas Chautru 			"Couldn't find capabilities");
308047d5a049SKamil Chalupnik 
3081d819c083SNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
3082f714a188SAmr Mokhtar 		create_reference_dec_op(op_params->ref_dec_op);
308347d5a049SKamil Chalupnik 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
3084f714a188SAmr Mokhtar 		create_reference_enc_op(op_params->ref_enc_op);
3085d819c083SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
3086d819c083SNicolas Chautru 		create_reference_ldpc_enc_op(op_params->ref_enc_op);
3087d819c083SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
3088d819c083SNicolas Chautru 		create_reference_ldpc_dec_op(op_params->ref_dec_op);
30890acdb986SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_FFT)
30900acdb986SNicolas Chautru 		create_reference_fft_op(op_params->ref_fft_op);
309195f192a4SHernan Vargas 	else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS)
309295f192a4SHernan Vargas 		create_reference_mldts_op(op_params->ref_mldts_op);
3093f714a188SAmr Mokhtar 
3094f714a188SAmr Mokhtar 	for (i = 0; i < ad->nb_queues; ++i) {
3095f714a188SAmr Mokhtar 		f_ret = fill_queue_buffers(op_params,
3096f714a188SAmr Mokhtar 				ad->in_mbuf_pool,
3097f714a188SAmr Mokhtar 				ad->hard_out_mbuf_pool,
3098f714a188SAmr Mokhtar 				ad->soft_out_mbuf_pool,
3099d819c083SNicolas Chautru 				ad->harq_in_mbuf_pool,
3100d819c083SNicolas Chautru 				ad->harq_out_mbuf_pool,
3101f714a188SAmr Mokhtar 				ad->queue_ids[i],
310247d5a049SKamil Chalupnik 				capabilities,
3103f714a188SAmr Mokhtar 				info.drv.min_alignment,
3104f714a188SAmr Mokhtar 				socket_id);
3105f714a188SAmr Mokhtar 		if (f_ret != TEST_SUCCESS) {
3106f714a188SAmr Mokhtar 			printf("Couldn't init queue buffers");
3107f714a188SAmr Mokhtar 			goto fail;
3108f714a188SAmr Mokhtar 		}
3109f714a188SAmr Mokhtar 	}
3110f714a188SAmr Mokhtar 
3111f714a188SAmr Mokhtar 	/* Run test case function */
3112f714a188SAmr Mokhtar 	t_ret = test_case_func(ad, op_params);
3113f714a188SAmr Mokhtar 
3114067fae41SNicolas Chautru 	if (dump_ops) {
3115067fae41SNicolas Chautru 		/* Dump queue information in local file. */
3116067fae41SNicolas Chautru 		static FILE *fd;
3117067fae41SNicolas Chautru 		fd = fopen("./dump_bbdev_queue_ops.txt", "w");
3118067fae41SNicolas Chautru 		if (fd == NULL) {
3119067fae41SNicolas Chautru 			printf("Open dump file error.\n");
3120067fae41SNicolas Chautru 			return -1;
3121067fae41SNicolas Chautru 		}
3122067fae41SNicolas Chautru 		rte_bbdev_queue_ops_dump(ad->dev_id, ad->queue_ids[i], fd);
3123067fae41SNicolas Chautru 		fclose(fd);
3124067fae41SNicolas Chautru 		/* Run it once only. */
3125067fae41SNicolas Chautru 		dump_ops = false;
3126067fae41SNicolas Chautru 	}
3127067fae41SNicolas Chautru 
3128f714a188SAmr Mokhtar 	/* Free active device resources and return */
3129f714a188SAmr Mokhtar 	free_buffers(ad, op_params);
3130f714a188SAmr Mokhtar 	return t_ret;
3131f714a188SAmr Mokhtar 
3132f714a188SAmr Mokhtar fail:
3133f714a188SAmr Mokhtar 	free_buffers(ad, op_params);
3134f714a188SAmr Mokhtar 	return TEST_FAILED;
3135f714a188SAmr Mokhtar }
3136f714a188SAmr Mokhtar 
3137f714a188SAmr Mokhtar /* Run given test function per active device per supported op type
3138f714a188SAmr Mokhtar  * per burst size.
3139f714a188SAmr Mokhtar  */
3140f714a188SAmr Mokhtar static int
3141f714a188SAmr Mokhtar run_test_case(test_case_function *test_case_func)
3142f714a188SAmr Mokhtar {
3143f714a188SAmr Mokhtar 	int ret = 0;
3144f714a188SAmr Mokhtar 	uint8_t dev;
3145f714a188SAmr Mokhtar 
3146f714a188SAmr Mokhtar 	/* Alloc op_params */
3147f714a188SAmr Mokhtar 	struct test_op_params *op_params = rte_zmalloc(NULL,
3148f714a188SAmr Mokhtar 			sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE);
3149f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params",
3150f714a188SAmr Mokhtar 			RTE_ALIGN(sizeof(struct test_op_params),
3151f714a188SAmr Mokhtar 				RTE_CACHE_LINE_SIZE));
3152f714a188SAmr Mokhtar 
3153f714a188SAmr Mokhtar 	/* For each device run test case function */
3154f714a188SAmr Mokhtar 	for (dev = 0; dev < nb_active_devs; ++dev)
3155f714a188SAmr Mokhtar 		ret |= run_test_case_on_device(test_case_func, dev, op_params);
3156f714a188SAmr Mokhtar 
3157f714a188SAmr Mokhtar 	rte_free(op_params);
3158f714a188SAmr Mokhtar 
3159f714a188SAmr Mokhtar 	return ret;
3160f714a188SAmr Mokhtar }
3161f714a188SAmr Mokhtar 
3162335c11fdSNicolas Chautru 
3163335c11fdSNicolas Chautru /* Push back the HARQ output from DDR to host */
3164335c11fdSNicolas Chautru static void
3165335c11fdSNicolas Chautru retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id,
3166335c11fdSNicolas Chautru 		struct rte_bbdev_dec_op **ops,
3167335c11fdSNicolas Chautru 		const uint16_t n)
3168335c11fdSNicolas Chautru {
3169335c11fdSNicolas Chautru 	uint16_t j;
3170335c11fdSNicolas Chautru 	int save_status, ret;
31713d6063a0SNicolas Chautru 	uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
3172335c11fdSNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[MAX_BURST];
3173335c11fdSNicolas Chautru 	uint32_t flags = ops[0]->ldpc_dec.op_flags;
3174335c11fdSNicolas Chautru 	bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
3175335c11fdSNicolas Chautru 	bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
3176335c11fdSNicolas Chautru 	bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
3177335c11fdSNicolas Chautru 	bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
3178335c11fdSNicolas Chautru 	for (j = 0; j < n; ++j) {
3179335c11fdSNicolas Chautru 		if ((loopback && mem_out) || hc_out) {
3180335c11fdSNicolas Chautru 			save_status = ops[j]->status;
3181335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags =
3182335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK +
3183335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
3184335c11fdSNicolas Chautru 			if (h_comp)
3185335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.op_flags +=
3186335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
3187335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset =
3188335c11fdSNicolas Chautru 					harq_offset;
3189335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset = 0;
3190335c11fdSNicolas Chautru 			harq_offset += HARQ_INCR;
3191335c11fdSNicolas Chautru 			if (!loopback)
3192335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.harq_combined_input.length =
3193335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.harq_combined_output.length;
3194335c11fdSNicolas Chautru 			rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
3195335c11fdSNicolas Chautru 					&ops[j], 1);
3196335c11fdSNicolas Chautru 			ret = 0;
3197335c11fdSNicolas Chautru 			while (ret == 0)
3198335c11fdSNicolas Chautru 				ret = rte_bbdev_dequeue_ldpc_dec_ops(
3199335c11fdSNicolas Chautru 						dev_id, queue_id,
3200335c11fdSNicolas Chautru 						&ops_deq[j], 1);
3201335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags = flags;
3202335c11fdSNicolas Chautru 			ops[j]->status = save_status;
3203335c11fdSNicolas Chautru 		}
3204335c11fdSNicolas Chautru 	}
3205335c11fdSNicolas Chautru }
3206335c11fdSNicolas Chautru 
3207335c11fdSNicolas Chautru /*
3208335c11fdSNicolas Chautru  * Push back the HARQ output from HW DDR to Host
3209335c11fdSNicolas Chautru  * Preload HARQ memory input and adjust HARQ offset
3210335c11fdSNicolas Chautru  */
3211335c11fdSNicolas Chautru static void
3212335c11fdSNicolas Chautru preload_harq_ddr(uint16_t dev_id, uint16_t queue_id,
3213335c11fdSNicolas Chautru 		struct rte_bbdev_dec_op **ops, const uint16_t n,
3214335c11fdSNicolas Chautru 		bool preload)
3215335c11fdSNicolas Chautru {
3216335c11fdSNicolas Chautru 	uint16_t j;
32173d6063a0SNicolas Chautru 	int deq;
32183d6063a0SNicolas Chautru 	uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
32193d6063a0SNicolas Chautru 	struct rte_bbdev_op_data save_hc_in[MAX_OPS], save_hc_out[MAX_OPS];
32203d6063a0SNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[MAX_OPS];
3221335c11fdSNicolas Chautru 	uint32_t flags = ops[0]->ldpc_dec.op_flags;
3222335c11fdSNicolas Chautru 	bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
3223335c11fdSNicolas Chautru 	bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
3224335c11fdSNicolas Chautru 	bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
3225335c11fdSNicolas Chautru 	bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
3226335c11fdSNicolas Chautru 	bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
3227335c11fdSNicolas Chautru 	if ((mem_in || hc_in) && preload) {
32283d6063a0SNicolas Chautru 		for (j = 0; j < n; ++j) {
32293d6063a0SNicolas Chautru 			save_hc_in[j] = ops[j]->ldpc_dec.harq_combined_input;
32303d6063a0SNicolas Chautru 			save_hc_out[j] = ops[j]->ldpc_dec.harq_combined_output;
3231335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags =
3232335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK +
3233335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
3234335c11fdSNicolas Chautru 			if (h_comp)
3235335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.op_flags +=
3236335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
3237335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset =
3238335c11fdSNicolas Chautru 					harq_offset;
3239335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset = 0;
32403d6063a0SNicolas Chautru 			harq_offset += HARQ_INCR;
3241335c11fdSNicolas Chautru 		}
32423d6063a0SNicolas Chautru 		rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, &ops[0], n);
32433d6063a0SNicolas Chautru 		deq = 0;
32443d6063a0SNicolas Chautru 		while (deq != n)
32453d6063a0SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(
32463d6063a0SNicolas Chautru 					dev_id, queue_id, &ops_deq[deq],
32473d6063a0SNicolas Chautru 					n - deq);
32483d6063a0SNicolas Chautru 		/* Restore the operations */
32493d6063a0SNicolas Chautru 		for (j = 0; j < n; ++j) {
32503d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.op_flags = flags;
32513d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input = save_hc_in[j];
32523d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output = save_hc_out[j];
32533d6063a0SNicolas Chautru 		}
32543d6063a0SNicolas Chautru 	}
32553d6063a0SNicolas Chautru 	harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
32563d6063a0SNicolas Chautru 	for (j = 0; j < n; ++j) {
3257335c11fdSNicolas Chautru 		/* Adjust HARQ offset when we reach external DDR */
3258335c11fdSNicolas Chautru 		if (mem_in || hc_in)
3259335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset
3260335c11fdSNicolas Chautru 				= harq_offset;
3261335c11fdSNicolas Chautru 		if (mem_out || hc_out)
3262335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset
3263335c11fdSNicolas Chautru 				= harq_offset;
3264335c11fdSNicolas Chautru 		harq_offset += HARQ_INCR;
3265335c11fdSNicolas Chautru 	}
3266335c11fdSNicolas Chautru }
3267335c11fdSNicolas Chautru 
3268f714a188SAmr Mokhtar static void
3269f714a188SAmr Mokhtar dequeue_event_callback(uint16_t dev_id,
3270f714a188SAmr Mokhtar 		enum rte_bbdev_event_type event, void *cb_arg,
3271f714a188SAmr Mokhtar 		void *ret_param)
3272f714a188SAmr Mokhtar {
3273f714a188SAmr Mokhtar 	int ret;
3274f714a188SAmr Mokhtar 	uint16_t i;
3275f714a188SAmr Mokhtar 	uint64_t total_time;
32760b98d574SKamil Chalupnik 	uint16_t deq, burst_sz, num_ops;
3277b2e2aec3SKamil Chalupnik 	uint16_t queue_id = *(uint16_t *) ret_param;
3278f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
32790b98d574SKamil Chalupnik 	double tb_len_bits;
3280f714a188SAmr Mokhtar 	struct thread_params *tp = cb_arg;
3281f714a188SAmr Mokhtar 
3282f714a188SAmr Mokhtar 	/* Find matching thread params using queue_id */
3283f714a188SAmr Mokhtar 	for (i = 0; i < MAX_QUEUES; ++i, ++tp)
3284f714a188SAmr Mokhtar 		if (tp->queue_id == queue_id)
3285f714a188SAmr Mokhtar 			break;
3286f714a188SAmr Mokhtar 
3287f714a188SAmr Mokhtar 	if (i == MAX_QUEUES) {
3288f714a188SAmr Mokhtar 		printf("%s: Queue_id from interrupt details was not found!\n",
3289f714a188SAmr Mokhtar 				__func__);
3290f714a188SAmr Mokhtar 		return;
3291f714a188SAmr Mokhtar 	}
3292f714a188SAmr Mokhtar 
3293f714a188SAmr Mokhtar 	if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) {
3294b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED,
3295b6a7e685STyler Retzlaff 				rte_memory_order_relaxed);
3296f714a188SAmr Mokhtar 		printf(
3297f714a188SAmr Mokhtar 			"Dequeue interrupt handler called for incorrect event!\n");
3298f714a188SAmr Mokhtar 		return;
3299f714a188SAmr Mokhtar 	}
3300f714a188SAmr Mokhtar 
3301b6a7e685STyler Retzlaff 	burst_sz = rte_atomic_load_explicit(&tp->burst_sz, rte_memory_order_relaxed);
33020b98d574SKamil Chalupnik 	num_ops = tp->op_params->num_to_process;
3303f714a188SAmr Mokhtar 
3304335c11fdSNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
3305b2e2aec3SKamil Chalupnik 		deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
3306b2e2aec3SKamil Chalupnik 				&tp->dec_ops[
3307b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3308b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
3309f714a188SAmr Mokhtar 				burst_sz);
3310335c11fdSNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
3311335c11fdSNicolas Chautru 		deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
3312335c11fdSNicolas Chautru 				&tp->dec_ops[
3313b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3314b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
3315335c11fdSNicolas Chautru 				burst_sz);
3316335c11fdSNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
3317335c11fdSNicolas Chautru 		deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
3318335c11fdSNicolas Chautru 				&tp->enc_ops[
3319b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3320b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
3321335c11fdSNicolas Chautru 				burst_sz);
33220acdb986SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_FFT)
33230acdb986SNicolas Chautru 		deq = rte_bbdev_dequeue_fft_ops(dev_id, queue_id,
33240acdb986SNicolas Chautru 				&tp->fft_ops[
3325b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3326b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
33270acdb986SNicolas Chautru 				burst_sz);
332895f192a4SHernan Vargas 	else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS)
332995f192a4SHernan Vargas 		deq = rte_bbdev_dequeue_mldts_ops(dev_id, queue_id,
333095f192a4SHernan Vargas 				&tp->mldts_ops[
3331b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3332b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
333395f192a4SHernan Vargas 				burst_sz);
3334335c11fdSNicolas Chautru 	else /*RTE_BBDEV_OP_TURBO_ENC*/
3335b2e2aec3SKamil Chalupnik 		deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
3336b2e2aec3SKamil Chalupnik 				&tp->enc_ops[
3337b6a7e685STyler Retzlaff 					rte_atomic_load_explicit(&tp->nb_dequeued,
3338b6a7e685STyler Retzlaff 							rte_memory_order_relaxed)],
3339f714a188SAmr Mokhtar 				burst_sz);
3340f714a188SAmr Mokhtar 
3341f714a188SAmr Mokhtar 	if (deq < burst_sz) {
3342f714a188SAmr Mokhtar 		printf(
3343f714a188SAmr Mokhtar 			"After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n",
3344f714a188SAmr Mokhtar 			burst_sz, deq);
3345b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED,
3346b6a7e685STyler Retzlaff 				rte_memory_order_relaxed);
3347f714a188SAmr Mokhtar 		return;
3348f714a188SAmr Mokhtar 	}
3349f714a188SAmr Mokhtar 
3350b6a7e685STyler Retzlaff 	if (rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) + deq < num_ops) {
3351b6a7e685STyler Retzlaff 		rte_atomic_fetch_add_explicit(&tp->nb_dequeued, deq, rte_memory_order_relaxed);
3352f714a188SAmr Mokhtar 		return;
3353f714a188SAmr Mokhtar 	}
3354f714a188SAmr Mokhtar 
3355f714a188SAmr Mokhtar 	total_time = rte_rdtsc_precise() - tp->start_time;
3356f714a188SAmr Mokhtar 
3357f714a188SAmr Mokhtar 	rte_bbdev_info_get(dev_id, &info);
3358f714a188SAmr Mokhtar 
3359f714a188SAmr Mokhtar 	ret = TEST_SUCCESS;
33600b98d574SKamil Chalupnik 
33610b98d574SKamil Chalupnik 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
33620b98d574SKamil Chalupnik 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3363de2ce637SHernan Vargas 		ret = validate_dec_op(tp->dec_ops, num_ops, ref_op);
3364b2e2aec3SKamil Chalupnik 		/* get the max of iter_count for all dequeued ops */
3365b2e2aec3SKamil Chalupnik 		for (i = 0; i < num_ops; ++i)
3366b2e2aec3SKamil Chalupnik 			tp->iter_count = RTE_MAX(
3367b2e2aec3SKamil Chalupnik 					tp->dec_ops[i]->turbo_dec.iter_count,
3368b2e2aec3SKamil Chalupnik 					tp->iter_count);
3369b2e2aec3SKamil Chalupnik 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
33700b98d574SKamil Chalupnik 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) {
33710b98d574SKamil Chalupnik 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
3372b2e2aec3SKamil Chalupnik 		ret = validate_enc_op(tp->enc_ops, num_ops, ref_op);
3373b2e2aec3SKamil Chalupnik 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
3374d819c083SNicolas Chautru 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) {
3375d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
3376d819c083SNicolas Chautru 		ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op);
3377d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
33780acdb986SNicolas Chautru 	} else if (test_vector.op_type == RTE_BBDEV_OP_FFT) {
33790acdb986SNicolas Chautru 		struct rte_bbdev_fft_op *ref_op = tp->op_params->ref_fft_op;
33800acdb986SNicolas Chautru 		ret = validate_fft_op(tp->fft_ops, num_ops, ref_op);
33810acdb986SNicolas Chautru 		rte_bbdev_fft_op_free_bulk(tp->fft_ops, deq);
338295f192a4SHernan Vargas 	} else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) {
338395f192a4SHernan Vargas 		struct rte_bbdev_mldts_op *ref_op = tp->op_params->ref_mldts_op;
338495f192a4SHernan Vargas 		ret = validate_mldts_op(tp->mldts_ops, num_ops, ref_op);
338595f192a4SHernan Vargas 		rte_bbdev_mldts_op_free_bulk(tp->mldts_ops, deq);
3386d819c083SNicolas Chautru 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
3387d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3388d819c083SNicolas Chautru 		ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op,
3389d819c083SNicolas Chautru 				tp->op_params->vector_mask);
3390d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
33910b98d574SKamil Chalupnik 	}
3392f714a188SAmr Mokhtar 
3393f714a188SAmr Mokhtar 	if (ret) {
3394f714a188SAmr Mokhtar 		printf("Buffers validation failed\n");
3395b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED,
3396b6a7e685STyler Retzlaff 				rte_memory_order_relaxed);
3397f714a188SAmr Mokhtar 	}
3398f714a188SAmr Mokhtar 
3399f714a188SAmr Mokhtar 	switch (test_vector.op_type) {
3400f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_TURBO_DEC:
34010b98d574SKamil Chalupnik 		tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op);
3402f714a188SAmr Mokhtar 		break;
3403f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_TURBO_ENC:
34040b98d574SKamil Chalupnik 		tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op);
3405f714a188SAmr Mokhtar 		break;
3406d819c083SNicolas Chautru 	case RTE_BBDEV_OP_LDPC_DEC:
3407d819c083SNicolas Chautru 		tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op);
3408d819c083SNicolas Chautru 		break;
34090acdb986SNicolas Chautru 	case RTE_BBDEV_OP_FFT:
34100acdb986SNicolas Chautru 		tb_len_bits = calc_fft_size(tp->op_params->ref_fft_op);
34110acdb986SNicolas Chautru 		break;
341295f192a4SHernan Vargas 	case RTE_BBDEV_OP_MLDTS:
341395f192a4SHernan Vargas 		tb_len_bits = calc_mldts_size(tp->op_params->ref_mldts_op);
341495f192a4SHernan Vargas 		break;
3415d819c083SNicolas Chautru 	case RTE_BBDEV_OP_LDPC_ENC:
3416d819c083SNicolas Chautru 		tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op);
3417d819c083SNicolas Chautru 		break;
3418f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_NONE:
34190b98d574SKamil Chalupnik 		tb_len_bits = 0.0;
3420f714a188SAmr Mokhtar 		break;
3421f714a188SAmr Mokhtar 	default:
3422f714a188SAmr Mokhtar 		printf("Unknown op type: %d\n", test_vector.op_type);
3423b6a7e685STyler Retzlaff 		rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED,
3424b6a7e685STyler Retzlaff 				rte_memory_order_relaxed);
3425f714a188SAmr Mokhtar 		return;
3426f714a188SAmr Mokhtar 	}
3427f714a188SAmr Mokhtar 
3428b2e2aec3SKamil Chalupnik 	tp->ops_per_sec += ((double)num_ops) /
3429f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
3430b2e2aec3SKamil Chalupnik 	tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) /
3431f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
3432f714a188SAmr Mokhtar 
3433b6a7e685STyler Retzlaff 	rte_atomic_fetch_add_explicit(&tp->nb_dequeued, deq, rte_memory_order_relaxed);
3434f714a188SAmr Mokhtar }
3435f714a188SAmr Mokhtar 
3436f714a188SAmr Mokhtar static int
3437f162c475SNicolas Chautru throughput_intr_lcore_ldpc_dec(void *arg)
3438f162c475SNicolas Chautru {
3439f162c475SNicolas Chautru 	struct thread_params *tp = arg;
3440f162c475SNicolas Chautru 	unsigned int enqueued;
3441f162c475SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3442f162c475SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3443f162c475SNicolas Chautru 	const uint16_t num_to_process = tp->op_params->num_to_process;
3444f162c475SNicolas Chautru 	struct rte_bbdev_dec_op *ops[num_to_process];
3445f162c475SNicolas Chautru 	struct test_buffers *bufs = NULL;
3446f162c475SNicolas Chautru 	struct rte_bbdev_info info;
3447f162c475SNicolas Chautru 	int ret, i, j;
3448f162c475SNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3449f162c475SNicolas Chautru 	uint16_t num_to_enq, enq;
3450f162c475SNicolas Chautru 
3451f162c475SNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
3452f162c475SNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
3453f162c475SNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
3454f162c475SNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
3455f162c475SNicolas Chautru 
3456f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3457f162c475SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3458f162c475SNicolas Chautru 
3459f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
3460f162c475SNicolas Chautru 			"Failed to enable interrupts for dev: %u, queue_id: %u",
3461f162c475SNicolas Chautru 			tp->dev_id, queue_id);
3462f162c475SNicolas Chautru 
3463f162c475SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3464f162c475SNicolas Chautru 
3465f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
3466f162c475SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3467f162c475SNicolas Chautru 			info.drv.queue_size_lim);
3468f162c475SNicolas Chautru 
3469f162c475SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3470f162c475SNicolas Chautru 
3471b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3472b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3473f162c475SNicolas Chautru 
3474b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3475b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
3476f162c475SNicolas Chautru 
3477f162c475SNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops,
3478f162c475SNicolas Chautru 				num_to_process);
3479f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
3480f162c475SNicolas Chautru 			num_to_process);
348131fab7b4SHernan Vargas 	ref_op->ldpc_dec.iter_max = get_iter_max();
348231fab7b4SHernan Vargas 
3483f162c475SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3484f162c475SNicolas Chautru 		copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs,
3485f162c475SNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
3486f162c475SNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
3487f162c475SNicolas Chautru 
3488f162c475SNicolas Chautru 	/* Set counter to validate the ordering */
3489f162c475SNicolas Chautru 	for (j = 0; j < num_to_process; ++j)
3490f162c475SNicolas Chautru 		ops[j]->opaque_data = (void *)(uintptr_t)j;
3491f162c475SNicolas Chautru 
3492f162c475SNicolas Chautru 	for (j = 0; j < TEST_REPETITIONS; ++j) {
3493f162c475SNicolas Chautru 		for (i = 0; i < num_to_process; ++i) {
3494f162c475SNicolas Chautru 			if (!loopback)
34953d3047e7SHernan Vargas 				mbuf_reset(ops[i]->ldpc_dec.hard_output.data);
3496f162c475SNicolas Chautru 			if (hc_out || loopback)
34979d9d73ebSHernan Vargas 				mbuf_reset(ops[i]->ldpc_dec.harq_combined_output.data);
34989d9d73ebSHernan Vargas 			if (ops[i]->ldpc_dec.soft_output.data != NULL)
34993d3047e7SHernan Vargas 				mbuf_reset(ops[i]->ldpc_dec.soft_output.data);
3500f162c475SNicolas Chautru 		}
3501f162c475SNicolas Chautru 
3502f162c475SNicolas Chautru 		tp->start_time = rte_rdtsc_precise();
3503f162c475SNicolas Chautru 		for (enqueued = 0; enqueued < num_to_process;) {
3504f162c475SNicolas Chautru 			num_to_enq = burst_sz;
3505f162c475SNicolas Chautru 
3506f162c475SNicolas Chautru 			if (unlikely(num_to_process - enqueued < num_to_enq))
3507f162c475SNicolas Chautru 				num_to_enq = num_to_process - enqueued;
3508f162c475SNicolas Chautru 
3509f162c475SNicolas Chautru 			/* Write to thread burst_sz current number of enqueued
3510f162c475SNicolas Chautru 			 * descriptors. It ensures that proper number of
3511f162c475SNicolas Chautru 			 * descriptors will be dequeued in callback
3512f162c475SNicolas Chautru 			 * function - needed for last batch in case where
3513f162c475SNicolas Chautru 			 * the number of operations is not a multiple of
3514f162c475SNicolas Chautru 			 * burst size.
3515f162c475SNicolas Chautru 			 */
3516b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3517b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3518f162c475SNicolas Chautru 
3519fdcee665SHernan Vargas 			enq = 0;
3520fdcee665SHernan Vargas 			do {
3521fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_ldpc_dec_ops(
3522fdcee665SHernan Vargas 						tp->dev_id,
3523fdcee665SHernan Vargas 						queue_id, &ops[enqueued],
3524fdcee665SHernan Vargas 						num_to_enq);
3525fdcee665SHernan Vargas 			} while (unlikely(num_to_enq != enq));
3526fdcee665SHernan Vargas 			enqueued += enq;
3527fdcee665SHernan Vargas 
3528f162c475SNicolas Chautru 			/* Wait until processing of previous batch is
3529f162c475SNicolas Chautru 			 * completed
3530f162c475SNicolas Chautru 			 */
3531b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
3532b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3533f162c475SNicolas Chautru 		}
3534f162c475SNicolas Chautru 		if (j != TEST_REPETITIONS - 1)
3535b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3536f162c475SNicolas Chautru 	}
3537f162c475SNicolas Chautru 
3538*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
3539*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
3540*92351557SNicolas Chautru 			tp->dev_id, queue_id);
3541*92351557SNicolas Chautru 
3542f162c475SNicolas Chautru 	return TEST_SUCCESS;
3543f162c475SNicolas Chautru }
3544f162c475SNicolas Chautru 
3545f162c475SNicolas Chautru static int
3546f714a188SAmr Mokhtar throughput_intr_lcore_dec(void *arg)
3547f714a188SAmr Mokhtar {
3548f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
3549f714a188SAmr Mokhtar 	unsigned int enqueued;
3550f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
3551f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
3552f714a188SAmr Mokhtar 	const uint16_t num_to_process = tp->op_params->num_to_process;
35530b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops[num_to_process];
3554f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
3555f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
35560acdb986SNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3557b2e2aec3SKamil Chalupnik 	int ret, i, j;
3558b2e2aec3SKamil Chalupnik 	uint16_t num_to_enq, enq;
3559f714a188SAmr Mokhtar 
3560f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3561f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
3562f714a188SAmr Mokhtar 
3563f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
3564f714a188SAmr Mokhtar 			"Failed to enable interrupts for dev: %u, queue_id: %u",
3565f714a188SAmr Mokhtar 			tp->dev_id, queue_id);
3566f714a188SAmr Mokhtar 
3567f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
35680b98d574SKamil Chalupnik 
35690b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
35700b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
35710b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
35720b98d574SKamil Chalupnik 
3573f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3574f714a188SAmr Mokhtar 
3575b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3576b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3577f714a188SAmr Mokhtar 
3578b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3579b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
3580f714a188SAmr Mokhtar 
35810b98d574SKamil Chalupnik 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops,
35820b98d574SKamil Chalupnik 				num_to_process);
35830acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_to_process);
35840acdb986SNicolas Chautru 	ref_op->turbo_dec.iter_max = get_iter_max();
35850b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
35860b98d574SKamil Chalupnik 		copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs,
35870b98d574SKamil Chalupnik 				bufs->hard_outputs, bufs->soft_outputs,
35880b98d574SKamil Chalupnik 				tp->op_params->ref_dec_op);
35890b98d574SKamil Chalupnik 
35900acdb986SNicolas Chautru 	/* Set counter to validate the ordering. */
3591b2e2aec3SKamil Chalupnik 	for (j = 0; j < num_to_process; ++j)
3592b2e2aec3SKamil Chalupnik 		ops[j]->opaque_data = (void *)(uintptr_t)j;
3593b2e2aec3SKamil Chalupnik 
3594b2e2aec3SKamil Chalupnik 	for (j = 0; j < TEST_REPETITIONS; ++j) {
35950acdb986SNicolas Chautru 		for (i = 0; i < num_to_process; ++i) {
35963d3047e7SHernan Vargas 			mbuf_reset(ops[i]->turbo_dec.hard_output.data);
35970acdb986SNicolas Chautru 			if (ops[i]->turbo_dec.soft_output.data != NULL)
35983d3047e7SHernan Vargas 				mbuf_reset(ops[i]->turbo_dec.soft_output.data);
35990acdb986SNicolas Chautru 		}
36000acdb986SNicolas Chautru 
3601f714a188SAmr Mokhtar 		tp->start_time = rte_rdtsc_precise();
3602f714a188SAmr Mokhtar 		for (enqueued = 0; enqueued < num_to_process;) {
36030b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
3604f714a188SAmr Mokhtar 
3605f714a188SAmr Mokhtar 			if (unlikely(num_to_process - enqueued < num_to_enq))
3606f714a188SAmr Mokhtar 				num_to_enq = num_to_process - enqueued;
3607f714a188SAmr Mokhtar 
3608b2e2aec3SKamil Chalupnik 			/* Write to thread burst_sz current number of enqueued
3609b2e2aec3SKamil Chalupnik 			 * descriptors. It ensures that proper number of
3610b2e2aec3SKamil Chalupnik 			 * descriptors will be dequeued in callback
3611b2e2aec3SKamil Chalupnik 			 * function - needed for last batch in case where
3612b2e2aec3SKamil Chalupnik 			 * the number of operations is not a multiple of
3613b2e2aec3SKamil Chalupnik 			 * burst size.
3614b2e2aec3SKamil Chalupnik 			 */
3615b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3616b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3617b2e2aec3SKamil Chalupnik 
3618fdcee665SHernan Vargas 			enq = 0;
3619fdcee665SHernan Vargas 			do {
3620fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
3621fdcee665SHernan Vargas 						queue_id, &ops[enqueued],
3622fdcee665SHernan Vargas 						num_to_enq);
3623fdcee665SHernan Vargas 			} while (unlikely(num_to_enq != enq));
3624fdcee665SHernan Vargas 			enqueued += enq;
3625fdcee665SHernan Vargas 
3626b2e2aec3SKamil Chalupnik 			/* Wait until processing of previous batch is
3627d819c083SNicolas Chautru 			 * completed
3628b2e2aec3SKamil Chalupnik 			 */
3629b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
3630b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3631b2e2aec3SKamil Chalupnik 		}
3632b2e2aec3SKamil Chalupnik 		if (j != TEST_REPETITIONS - 1)
3633b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3634f714a188SAmr Mokhtar 	}
3635f714a188SAmr Mokhtar 
3636*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
3637*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
3638*92351557SNicolas Chautru 			tp->dev_id, queue_id);
3639*92351557SNicolas Chautru 
3640f714a188SAmr Mokhtar 	return TEST_SUCCESS;
3641f714a188SAmr Mokhtar }
3642f714a188SAmr Mokhtar 
3643f714a188SAmr Mokhtar static int
3644f714a188SAmr Mokhtar throughput_intr_lcore_enc(void *arg)
3645f714a188SAmr Mokhtar {
3646f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
3647f714a188SAmr Mokhtar 	unsigned int enqueued;
3648f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
3649f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
3650f714a188SAmr Mokhtar 	const uint16_t num_to_process = tp->op_params->num_to_process;
36510b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops[num_to_process];
3652f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
3653f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
3654b2e2aec3SKamil Chalupnik 	int ret, i, j;
3655b2e2aec3SKamil Chalupnik 	uint16_t num_to_enq, enq;
3656f714a188SAmr Mokhtar 
3657f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3658f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
3659f714a188SAmr Mokhtar 
3660f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
3661f714a188SAmr Mokhtar 			"Failed to enable interrupts for dev: %u, queue_id: %u",
3662f714a188SAmr Mokhtar 			tp->dev_id, queue_id);
3663f714a188SAmr Mokhtar 
3664f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
36650b98d574SKamil Chalupnik 
36660b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
36670b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
36680b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
36690b98d574SKamil Chalupnik 
3670f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3671f714a188SAmr Mokhtar 
3672b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3673b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3674f714a188SAmr Mokhtar 
3675b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3676b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
3677f714a188SAmr Mokhtar 
36780b98d574SKamil Chalupnik 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops,
36790b98d574SKamil Chalupnik 			num_to_process);
36800b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
36810b98d574SKamil Chalupnik 			num_to_process);
36820b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
36830b98d574SKamil Chalupnik 		copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs,
36840b98d574SKamil Chalupnik 				bufs->hard_outputs, tp->op_params->ref_enc_op);
36850b98d574SKamil Chalupnik 
3686b2e2aec3SKamil Chalupnik 	/* Set counter to validate the ordering */
3687b2e2aec3SKamil Chalupnik 	for (j = 0; j < num_to_process; ++j)
3688b2e2aec3SKamil Chalupnik 		ops[j]->opaque_data = (void *)(uintptr_t)j;
3689b2e2aec3SKamil Chalupnik 
3690b2e2aec3SKamil Chalupnik 	for (j = 0; j < TEST_REPETITIONS; ++j) {
3691b2e2aec3SKamil Chalupnik 		for (i = 0; i < num_to_process; ++i)
36923d3047e7SHernan Vargas 			mbuf_reset(ops[i]->turbo_enc.output.data);
3693b2e2aec3SKamil Chalupnik 
3694f714a188SAmr Mokhtar 		tp->start_time = rte_rdtsc_precise();
3695f714a188SAmr Mokhtar 		for (enqueued = 0; enqueued < num_to_process;) {
36960b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
3697f714a188SAmr Mokhtar 
3698f714a188SAmr Mokhtar 			if (unlikely(num_to_process - enqueued < num_to_enq))
3699f714a188SAmr Mokhtar 				num_to_enq = num_to_process - enqueued;
3700f714a188SAmr Mokhtar 
3701b2e2aec3SKamil Chalupnik 			/* Write to thread burst_sz current number of enqueued
3702b2e2aec3SKamil Chalupnik 			 * descriptors. It ensures that proper number of
3703b2e2aec3SKamil Chalupnik 			 * descriptors will be dequeued in callback
3704b2e2aec3SKamil Chalupnik 			 * function - needed for last batch in case where
3705b2e2aec3SKamil Chalupnik 			 * the number of operations is not a multiple of
3706b2e2aec3SKamil Chalupnik 			 * burst size.
3707b2e2aec3SKamil Chalupnik 			 */
3708b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3709b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3710b2e2aec3SKamil Chalupnik 
3711fdcee665SHernan Vargas 			enq = 0;
3712fdcee665SHernan Vargas 			do {
3713fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
3714fdcee665SHernan Vargas 						queue_id, &ops[enqueued],
3715fdcee665SHernan Vargas 						num_to_enq);
3716fdcee665SHernan Vargas 			} while (unlikely(enq != num_to_enq));
3717fdcee665SHernan Vargas 			enqueued += enq;
3718fdcee665SHernan Vargas 
3719b2e2aec3SKamil Chalupnik 			/* Wait until processing of previous batch is
3720d819c083SNicolas Chautru 			 * completed
3721b2e2aec3SKamil Chalupnik 			 */
3722b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
3723b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3724b2e2aec3SKamil Chalupnik 		}
3725b2e2aec3SKamil Chalupnik 		if (j != TEST_REPETITIONS - 1)
3726b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3727f714a188SAmr Mokhtar 	}
3728f714a188SAmr Mokhtar 
3729*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
3730*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
3731*92351557SNicolas Chautru 			tp->dev_id, queue_id);
3732*92351557SNicolas Chautru 
3733f714a188SAmr Mokhtar 	return TEST_SUCCESS;
3734f714a188SAmr Mokhtar }
3735f714a188SAmr Mokhtar 
3736f162c475SNicolas Chautru 
3737f162c475SNicolas Chautru static int
3738f162c475SNicolas Chautru throughput_intr_lcore_ldpc_enc(void *arg)
3739f162c475SNicolas Chautru {
3740f162c475SNicolas Chautru 	struct thread_params *tp = arg;
3741f162c475SNicolas Chautru 	unsigned int enqueued;
3742f162c475SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3743f162c475SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3744f162c475SNicolas Chautru 	const uint16_t num_to_process = tp->op_params->num_to_process;
3745f162c475SNicolas Chautru 	struct rte_bbdev_enc_op *ops[num_to_process];
3746f162c475SNicolas Chautru 	struct test_buffers *bufs = NULL;
3747f162c475SNicolas Chautru 	struct rte_bbdev_info info;
3748f162c475SNicolas Chautru 	int ret, i, j;
3749f162c475SNicolas Chautru 	uint16_t num_to_enq, enq;
3750f162c475SNicolas Chautru 
3751f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3752f162c475SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3753f162c475SNicolas Chautru 
3754f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
3755f162c475SNicolas Chautru 			"Failed to enable interrupts for dev: %u, queue_id: %u",
3756f162c475SNicolas Chautru 			tp->dev_id, queue_id);
3757f162c475SNicolas Chautru 
3758f162c475SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3759f162c475SNicolas Chautru 
3760f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
3761f162c475SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3762f162c475SNicolas Chautru 			info.drv.queue_size_lim);
3763f162c475SNicolas Chautru 
3764f162c475SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3765f162c475SNicolas Chautru 
3766b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3767b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3768f162c475SNicolas Chautru 
3769b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3770b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
3771f162c475SNicolas Chautru 
3772f162c475SNicolas Chautru 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops,
3773f162c475SNicolas Chautru 			num_to_process);
3774f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
3775f162c475SNicolas Chautru 			num_to_process);
3776f162c475SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3777f162c475SNicolas Chautru 		copy_reference_ldpc_enc_op(ops, num_to_process, 0,
3778f162c475SNicolas Chautru 				bufs->inputs, bufs->hard_outputs,
3779f162c475SNicolas Chautru 				tp->op_params->ref_enc_op);
3780f162c475SNicolas Chautru 
3781f162c475SNicolas Chautru 	/* Set counter to validate the ordering */
3782f162c475SNicolas Chautru 	for (j = 0; j < num_to_process; ++j)
3783f162c475SNicolas Chautru 		ops[j]->opaque_data = (void *)(uintptr_t)j;
3784f162c475SNicolas Chautru 
3785f162c475SNicolas Chautru 	for (j = 0; j < TEST_REPETITIONS; ++j) {
3786f162c475SNicolas Chautru 		for (i = 0; i < num_to_process; ++i)
37873d3047e7SHernan Vargas 			mbuf_reset(ops[i]->turbo_enc.output.data);
3788f162c475SNicolas Chautru 
3789f162c475SNicolas Chautru 		tp->start_time = rte_rdtsc_precise();
3790f162c475SNicolas Chautru 		for (enqueued = 0; enqueued < num_to_process;) {
3791f162c475SNicolas Chautru 			num_to_enq = burst_sz;
3792f162c475SNicolas Chautru 
3793f162c475SNicolas Chautru 			if (unlikely(num_to_process - enqueued < num_to_enq))
3794f162c475SNicolas Chautru 				num_to_enq = num_to_process - enqueued;
3795f162c475SNicolas Chautru 
3796f162c475SNicolas Chautru 			/* Write to thread burst_sz current number of enqueued
3797f162c475SNicolas Chautru 			 * descriptors. It ensures that proper number of
3798f162c475SNicolas Chautru 			 * descriptors will be dequeued in callback
3799f162c475SNicolas Chautru 			 * function - needed for last batch in case where
3800f162c475SNicolas Chautru 			 * the number of operations is not a multiple of
3801f162c475SNicolas Chautru 			 * burst size.
3802f162c475SNicolas Chautru 			 */
3803b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3804b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3805f162c475SNicolas Chautru 
3806fdcee665SHernan Vargas 			enq = 0;
3807fdcee665SHernan Vargas 			do {
3808fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_ldpc_enc_ops(
3809fdcee665SHernan Vargas 						tp->dev_id,
3810fdcee665SHernan Vargas 						queue_id, &ops[enqueued],
3811fdcee665SHernan Vargas 						num_to_enq);
3812fdcee665SHernan Vargas 			} while (unlikely(enq != num_to_enq));
3813fdcee665SHernan Vargas 			enqueued += enq;
3814fdcee665SHernan Vargas 
3815f162c475SNicolas Chautru 			/* Wait until processing of previous batch is
3816f162c475SNicolas Chautru 			 * completed
3817f162c475SNicolas Chautru 			 */
3818b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
3819b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
3820f162c475SNicolas Chautru 		}
3821f162c475SNicolas Chautru 		if (j != TEST_REPETITIONS - 1)
3822b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
3823f162c475SNicolas Chautru 	}
3824f162c475SNicolas Chautru 
3825*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
3826*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
3827*92351557SNicolas Chautru 			tp->dev_id, queue_id);
3828*92351557SNicolas Chautru 
3829f162c475SNicolas Chautru 	return TEST_SUCCESS;
3830f162c475SNicolas Chautru }
3831f162c475SNicolas Chautru 
38320acdb986SNicolas Chautru 
38330acdb986SNicolas Chautru static int
38340acdb986SNicolas Chautru throughput_intr_lcore_fft(void *arg)
38350acdb986SNicolas Chautru {
38360acdb986SNicolas Chautru 	struct thread_params *tp = arg;
38370acdb986SNicolas Chautru 	unsigned int enqueued;
38380acdb986SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
38390acdb986SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
38400acdb986SNicolas Chautru 	const uint16_t num_to_process = tp->op_params->num_to_process;
38410acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ops[num_to_process];
38420acdb986SNicolas Chautru 	struct test_buffers *bufs = NULL;
38430acdb986SNicolas Chautru 	struct rte_bbdev_info info;
38440acdb986SNicolas Chautru 	int ret, i, j;
38450acdb986SNicolas Chautru 	uint16_t num_to_enq, enq;
38460acdb986SNicolas Chautru 
38470acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
38480acdb986SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
38490acdb986SNicolas Chautru 
38500acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
38510acdb986SNicolas Chautru 			"Failed to enable interrupts for dev: %u, queue_id: %u",
38520acdb986SNicolas Chautru 			tp->dev_id, queue_id);
38530acdb986SNicolas Chautru 
38540acdb986SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
38550acdb986SNicolas Chautru 
38560acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
38570acdb986SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
38580acdb986SNicolas Chautru 			info.drv.queue_size_lim);
38590acdb986SNicolas Chautru 
38600acdb986SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
38610acdb986SNicolas Chautru 
3862b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3863b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
38640acdb986SNicolas Chautru 
3865b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3866b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
38670acdb986SNicolas Chautru 
38680acdb986SNicolas Chautru 	ret = rte_bbdev_fft_op_alloc_bulk(tp->op_params->mp, ops,
38690acdb986SNicolas Chautru 			num_to_process);
38700acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
38710acdb986SNicolas Chautru 			num_to_process);
38720acdb986SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
38730acdb986SNicolas Chautru 		copy_reference_fft_op(ops, num_to_process, 0, bufs->inputs,
38740ed76d66SHernan Vargas 				bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs,
38750ed76d66SHernan Vargas 				tp->op_params->ref_fft_op);
38760acdb986SNicolas Chautru 
38770acdb986SNicolas Chautru 	/* Set counter to validate the ordering */
38780acdb986SNicolas Chautru 	for (j = 0; j < num_to_process; ++j)
38790acdb986SNicolas Chautru 		ops[j]->opaque_data = (void *)(uintptr_t)j;
38800acdb986SNicolas Chautru 
38810acdb986SNicolas Chautru 	for (j = 0; j < TEST_REPETITIONS; ++j) {
38820acdb986SNicolas Chautru 		for (i = 0; i < num_to_process; ++i)
38833d3047e7SHernan Vargas 			mbuf_reset(ops[i]->fft.base_output.data);
38840acdb986SNicolas Chautru 
38850acdb986SNicolas Chautru 		tp->start_time = rte_rdtsc_precise();
38860acdb986SNicolas Chautru 		for (enqueued = 0; enqueued < num_to_process;) {
38870acdb986SNicolas Chautru 			num_to_enq = burst_sz;
38880acdb986SNicolas Chautru 
38890acdb986SNicolas Chautru 			if (unlikely(num_to_process - enqueued < num_to_enq))
38900acdb986SNicolas Chautru 				num_to_enq = num_to_process - enqueued;
38910acdb986SNicolas Chautru 
38920acdb986SNicolas Chautru 			/* Write to thread burst_sz current number of enqueued
38930acdb986SNicolas Chautru 			 * descriptors. It ensures that proper number of
38940acdb986SNicolas Chautru 			 * descriptors will be dequeued in callback
38950acdb986SNicolas Chautru 			 * function - needed for last batch in case where
38960acdb986SNicolas Chautru 			 * the number of operations is not a multiple of
38970acdb986SNicolas Chautru 			 * burst size.
38980acdb986SNicolas Chautru 			 */
3899b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3900b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
39010acdb986SNicolas Chautru 
3902fdcee665SHernan Vargas 			enq = 0;
3903fdcee665SHernan Vargas 			do {
3904fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_fft_ops(tp->dev_id,
3905fdcee665SHernan Vargas 						queue_id, &ops[enqueued],
3906fdcee665SHernan Vargas 						num_to_enq);
3907fdcee665SHernan Vargas 			} while (unlikely(enq != num_to_enq));
3908fdcee665SHernan Vargas 			enqueued += enq;
3909fdcee665SHernan Vargas 
39100acdb986SNicolas Chautru 			/* Wait until processing of previous batch is
39110acdb986SNicolas Chautru 			 * completed
39120acdb986SNicolas Chautru 			 */
3913b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
3914b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
39150acdb986SNicolas Chautru 		}
39160acdb986SNicolas Chautru 		if (j != TEST_REPETITIONS - 1)
3917b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
39180acdb986SNicolas Chautru 	}
39190acdb986SNicolas Chautru 
3920*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
3921*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
3922*92351557SNicolas Chautru 			tp->dev_id, queue_id);
3923*92351557SNicolas Chautru 
39240acdb986SNicolas Chautru 	return TEST_SUCCESS;
39250acdb986SNicolas Chautru }
39260acdb986SNicolas Chautru 
3927f714a188SAmr Mokhtar static int
392895f192a4SHernan Vargas throughput_intr_lcore_mldts(void *arg)
392995f192a4SHernan Vargas {
393095f192a4SHernan Vargas 	struct thread_params *tp = arg;
393195f192a4SHernan Vargas 	unsigned int enqueued;
393295f192a4SHernan Vargas 	const uint16_t queue_id = tp->queue_id;
393395f192a4SHernan Vargas 	const uint16_t burst_sz = tp->op_params->burst_sz;
393495f192a4SHernan Vargas 	const uint16_t num_to_process = tp->op_params->num_to_process;
393595f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ops[num_to_process];
393695f192a4SHernan Vargas 	struct test_buffers *bufs = NULL;
393795f192a4SHernan Vargas 	struct rte_bbdev_info info;
393895f192a4SHernan Vargas 	int ret, i, j;
393995f192a4SHernan Vargas 	uint16_t num_to_enq, enq;
394095f192a4SHernan Vargas 
394195f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST);
394295f192a4SHernan Vargas 
394395f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
394495f192a4SHernan Vargas 			"Failed to enable interrupts for dev: %u, queue_id: %u",
394595f192a4SHernan Vargas 			tp->dev_id, queue_id);
394695f192a4SHernan Vargas 
394795f192a4SHernan Vargas 	rte_bbdev_info_get(tp->dev_id, &info);
394895f192a4SHernan Vargas 
394995f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
395095f192a4SHernan Vargas 			"NUM_OPS cannot exceed %u for this device",
395195f192a4SHernan Vargas 			info.drv.queue_size_lim);
395295f192a4SHernan Vargas 
395395f192a4SHernan Vargas 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
395495f192a4SHernan Vargas 
3955b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed);
3956b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
395795f192a4SHernan Vargas 
3958b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
3959b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
396095f192a4SHernan Vargas 
396195f192a4SHernan Vargas 	ret = rte_bbdev_mldts_op_alloc_bulk(tp->op_params->mp, ops, num_to_process);
396295f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_to_process);
396395f192a4SHernan Vargas 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
396495f192a4SHernan Vargas 		copy_reference_mldts_op(ops, num_to_process, 0, bufs->inputs, bufs->harq_inputs,
396595f192a4SHernan Vargas 				bufs->hard_outputs, tp->op_params->ref_mldts_op);
396695f192a4SHernan Vargas 
396795f192a4SHernan Vargas 	/* Set counter to validate the ordering */
396895f192a4SHernan Vargas 	for (j = 0; j < num_to_process; ++j)
396995f192a4SHernan Vargas 		ops[j]->opaque_data = (void *)(uintptr_t)j;
397095f192a4SHernan Vargas 
397195f192a4SHernan Vargas 	for (j = 0; j < TEST_REPETITIONS; ++j) {
397295f192a4SHernan Vargas 		for (i = 0; i < num_to_process; ++i)
397395f192a4SHernan Vargas 			mbuf_reset(ops[i]->mldts.output.data);
397495f192a4SHernan Vargas 
397595f192a4SHernan Vargas 		tp->start_time = rte_rdtsc_precise();
397695f192a4SHernan Vargas 		for (enqueued = 0; enqueued < num_to_process;) {
397795f192a4SHernan Vargas 			num_to_enq = burst_sz;
397895f192a4SHernan Vargas 
397995f192a4SHernan Vargas 			if (unlikely(num_to_process - enqueued < num_to_enq))
398095f192a4SHernan Vargas 				num_to_enq = num_to_process - enqueued;
398195f192a4SHernan Vargas 
398295f192a4SHernan Vargas 			/* Write to thread burst_sz current number of enqueued
398395f192a4SHernan Vargas 			 * descriptors. It ensures that proper number of
398495f192a4SHernan Vargas 			 * descriptors will be dequeued in callback
398595f192a4SHernan Vargas 			 * function - needed for last batch in case where
398695f192a4SHernan Vargas 			 * the number of operations is not a multiple of
398795f192a4SHernan Vargas 			 * burst size.
398895f192a4SHernan Vargas 			 */
3989b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->burst_sz, num_to_enq,
3990b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
399195f192a4SHernan Vargas 
3992fdcee665SHernan Vargas 			enq = 0;
3993fdcee665SHernan Vargas 			do {
3994fdcee665SHernan Vargas 				enq += rte_bbdev_enqueue_mldts_ops(tp->dev_id,
3995fdcee665SHernan Vargas 						queue_id, &ops[enqueued], num_to_enq);
3996fdcee665SHernan Vargas 			} while (unlikely(enq != num_to_enq));
3997fdcee665SHernan Vargas 			enqueued += enq;
3998fdcee665SHernan Vargas 
399995f192a4SHernan Vargas 			/* Wait until processing of previous batch is
400095f192a4SHernan Vargas 			 * completed
400195f192a4SHernan Vargas 			 */
4002b6a7e685STyler Retzlaff 			rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued,
4003b6a7e685STyler Retzlaff 					rte_memory_order_relaxed);
400495f192a4SHernan Vargas 		}
400595f192a4SHernan Vargas 		if (j != TEST_REPETITIONS - 1)
4006b6a7e685STyler Retzlaff 			rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed);
400795f192a4SHernan Vargas 	}
400895f192a4SHernan Vargas 
4009*92351557SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id),
4010*92351557SNicolas Chautru 			"Failed to disable interrupts for dev: %u, queue_id: %u",
4011*92351557SNicolas Chautru 			tp->dev_id, queue_id);
4012*92351557SNicolas Chautru 
401395f192a4SHernan Vargas 	return TEST_SUCCESS;
401495f192a4SHernan Vargas }
401595f192a4SHernan Vargas 
401695f192a4SHernan Vargas static int
4017f714a188SAmr Mokhtar throughput_pmd_lcore_dec(void *arg)
4018f714a188SAmr Mokhtar {
4019f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
40200b98d574SKamil Chalupnik 	uint16_t enq, deq;
40210b98d574SKamil Chalupnik 	uint64_t total_time = 0, start_time;
4022f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
4023f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
40240b98d574SKamil Chalupnik 	const uint16_t num_ops = tp->op_params->num_to_process;
40250b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops_enq[num_ops];
40260b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops_deq[num_ops];
4027f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
4028f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
40290b98d574SKamil Chalupnik 	int i, j, ret;
4030f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
40310b98d574SKamil Chalupnik 	uint16_t num_to_enq;
40320acdb986SNicolas Chautru 	bool so_enable;
4033f714a188SAmr Mokhtar 
4034f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4035f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
4036f714a188SAmr Mokhtar 
4037f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
40380b98d574SKamil Chalupnik 
40390b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
40400b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
40410b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
40420b98d574SKamil Chalupnik 
4043f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4044f714a188SAmr Mokhtar 
4045b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4046b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
4047f714a188SAmr Mokhtar 
40480b98d574SKamil Chalupnik 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
40490b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
40500acdb986SNicolas Chautru 	ref_op->turbo_dec.iter_max = get_iter_max();
4051f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
40520b98d574SKamil Chalupnik 		copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs,
40530b98d574SKamil Chalupnik 				bufs->hard_outputs, bufs->soft_outputs, ref_op);
4054f714a188SAmr Mokhtar 
40550acdb986SNicolas Chautru 	so_enable = check_bit(ops_enq[0]->turbo_dec.op_flags, RTE_BBDEV_TURBO_SOFT_OUTPUT);
40560acdb986SNicolas Chautru 
40570b98d574SKamil Chalupnik 	/* Set counter to validate the ordering */
40580b98d574SKamil Chalupnik 	for (j = 0; j < num_ops; ++j)
40590b98d574SKamil Chalupnik 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
40600b98d574SKamil Chalupnik 
40610b98d574SKamil Chalupnik 	for (i = 0; i < TEST_REPETITIONS; ++i) {
4062fb5e060eSHernan Vargas 		uint32_t time_out = 0;
40639585f8b1SKamil Chalupnik 		for (j = 0; j < num_ops; ++j)
40649585f8b1SKamil Chalupnik 			mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data);
40650acdb986SNicolas Chautru 		if (so_enable)
40660acdb986SNicolas Chautru 			for (j = 0; j < num_ops; ++j)
40670acdb986SNicolas Chautru 				mbuf_reset(ops_enq[j]->turbo_dec.soft_output.data);
40680b98d574SKamil Chalupnik 
40690b98d574SKamil Chalupnik 		start_time = rte_rdtsc_precise();
40700b98d574SKamil Chalupnik 
40710b98d574SKamil Chalupnik 		for (enq = 0, deq = 0; enq < num_ops;) {
40720b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
40730b98d574SKamil Chalupnik 
40740b98d574SKamil Chalupnik 			if (unlikely(num_ops - enq < num_to_enq))
40750b98d574SKamil Chalupnik 				num_to_enq = num_ops - enq;
40760b98d574SKamil Chalupnik 
40770b98d574SKamil Chalupnik 			enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
40780b98d574SKamil Chalupnik 					queue_id, &ops_enq[enq], num_to_enq);
40790b98d574SKamil Chalupnik 
40800b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
40810b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
4082fb5e060eSHernan Vargas 			time_out++;
4083fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4084fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4085fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4086fb5e060eSHernan Vargas 			}
4087f714a188SAmr Mokhtar 		}
4088f714a188SAmr Mokhtar 
40890b98d574SKamil Chalupnik 		/* dequeue the remaining */
4090fb5e060eSHernan Vargas 		time_out = 0;
40910b98d574SKamil Chalupnik 		while (deq < enq) {
40920b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
40930b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
4094fb5e060eSHernan Vargas 			time_out++;
4095fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4096fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4097fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4098fb5e060eSHernan Vargas 			}
40990b98d574SKamil Chalupnik 		}
4100f714a188SAmr Mokhtar 
41010b98d574SKamil Chalupnik 		total_time += rte_rdtsc_precise() - start_time;
41020b98d574SKamil Chalupnik 	}
41030b98d574SKamil Chalupnik 
41040b98d574SKamil Chalupnik 	tp->iter_count = 0;
41050b98d574SKamil Chalupnik 	/* get the max of iter_count for all dequeued ops */
41060b98d574SKamil Chalupnik 	for (i = 0; i < num_ops; ++i) {
41070b98d574SKamil Chalupnik 		tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count,
41080b98d574SKamil Chalupnik 				tp->iter_count);
41090b98d574SKamil Chalupnik 	}
4110f714a188SAmr Mokhtar 
4111f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4112de2ce637SHernan Vargas 		ret = validate_dec_op(ops_deq, num_ops, ref_op);
41130b98d574SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4114f714a188SAmr Mokhtar 	}
4115f714a188SAmr Mokhtar 
41160b98d574SKamil Chalupnik 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
41170b98d574SKamil Chalupnik 
41180b98d574SKamil Chalupnik 	double tb_len_bits = calc_dec_TB_size(ref_op);
41190b98d574SKamil Chalupnik 
41200b98d574SKamil Chalupnik 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
4121f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
41220b98d574SKamil Chalupnik 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
41230b98d574SKamil Chalupnik 			1000000.0) / ((double)total_time /
41240b98d574SKamil Chalupnik 			(double)rte_get_tsc_hz());
4125f714a188SAmr Mokhtar 
4126f714a188SAmr Mokhtar 	return TEST_SUCCESS;
4127f714a188SAmr Mokhtar }
4128f714a188SAmr Mokhtar 
4129f714a188SAmr Mokhtar static int
4130f41c6e4dSNicolas Chautru bler_pmd_lcore_ldpc_dec(void *arg)
4131f41c6e4dSNicolas Chautru {
4132f41c6e4dSNicolas Chautru 	struct thread_params *tp = arg;
4133f41c6e4dSNicolas Chautru 	uint16_t enq, deq;
4134f41c6e4dSNicolas Chautru 	uint64_t total_time = 0, start_time;
4135f41c6e4dSNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
4136f41c6e4dSNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
4137f41c6e4dSNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
4138f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[num_ops];
4139f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[num_ops];
4140f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
4141f41c6e4dSNicolas Chautru 	struct test_buffers *bufs = NULL;
4142f41c6e4dSNicolas Chautru 	int i, j, ret;
4143f41c6e4dSNicolas Chautru 	float parity_bler = 0;
4144f41c6e4dSNicolas Chautru 	struct rte_bbdev_info info;
4145f41c6e4dSNicolas Chautru 	uint16_t num_to_enq;
4146f41c6e4dSNicolas Chautru 	bool extDdr = check_bit(ldpc_cap_flags,
4147f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE);
4148f41c6e4dSNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
4149f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
4150f41c6e4dSNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
4151f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
4152f41c6e4dSNicolas Chautru 
4153f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4154f41c6e4dSNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
41557cc8009bSHernan Vargas 	TEST_ASSERT_SUCCESS((num_ops == 0), "NUM_OPS must be greater than 0");
4156f41c6e4dSNicolas Chautru 
4157f41c6e4dSNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
4158f41c6e4dSNicolas Chautru 
4159f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
4160f41c6e4dSNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
4161f41c6e4dSNicolas Chautru 			info.drv.queue_size_lim);
4162f41c6e4dSNicolas Chautru 
4163f41c6e4dSNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4164f41c6e4dSNicolas Chautru 
4165b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4166b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
4167f41c6e4dSNicolas Chautru 
4168f41c6e4dSNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
4169f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
4170f41c6e4dSNicolas Chautru 
4171f41c6e4dSNicolas Chautru 	/* For BLER tests we need to enable early termination */
4172b9ac824aSHernan Vargas 	if (!check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
4173b9ac824aSHernan Vargas 		ref_op->ldpc_dec.op_flags += RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
4174b9ac824aSHernan Vargas 
4175f41c6e4dSNicolas Chautru 	ref_op->ldpc_dec.iter_max = get_iter_max();
4176f41c6e4dSNicolas Chautru 
4177f41c6e4dSNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4178f41c6e4dSNicolas Chautru 		copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs,
4179f41c6e4dSNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
4180f41c6e4dSNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
4181f41c6e4dSNicolas Chautru 	generate_llr_input(num_ops, bufs->inputs, ref_op);
4182f41c6e4dSNicolas Chautru 
4183f41c6e4dSNicolas Chautru 	/* Set counter to validate the ordering */
4184f41c6e4dSNicolas Chautru 	for (j = 0; j < num_ops; ++j)
4185f41c6e4dSNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4186f41c6e4dSNicolas Chautru 
4187f41c6e4dSNicolas Chautru 	for (i = 0; i < 1; ++i) { /* Could add more iterations */
4188fb5e060eSHernan Vargas 		uint32_t time_out = 0;
4189f41c6e4dSNicolas Chautru 		for (j = 0; j < num_ops; ++j) {
4190f41c6e4dSNicolas Chautru 			if (!loopback)
41919d9d73ebSHernan Vargas 				mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data);
4192f41c6e4dSNicolas Chautru 			if (hc_out || loopback)
41930acdb986SNicolas Chautru 				mbuf_reset(ops_enq[j]->ldpc_dec.harq_combined_output.data);
41949d9d73ebSHernan Vargas 			if (ops_enq[j]->ldpc_dec.soft_output.data != NULL)
41959d9d73ebSHernan Vargas 				mbuf_reset(ops_enq[j]->ldpc_dec.soft_output.data);
4196f41c6e4dSNicolas Chautru 		}
41973d6063a0SNicolas Chautru 		if (extDdr)
4198f41c6e4dSNicolas Chautru 			preload_harq_ddr(tp->dev_id, queue_id, ops_enq,
41993d6063a0SNicolas Chautru 					num_ops, true);
4200f41c6e4dSNicolas Chautru 		start_time = rte_rdtsc_precise();
4201f41c6e4dSNicolas Chautru 
4202f41c6e4dSNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
4203f41c6e4dSNicolas Chautru 			num_to_enq = burst_sz;
4204f41c6e4dSNicolas Chautru 
4205f41c6e4dSNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
4206f41c6e4dSNicolas Chautru 				num_to_enq = num_ops - enq;
4207f41c6e4dSNicolas Chautru 
4208f41c6e4dSNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id,
4209f41c6e4dSNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
4210f41c6e4dSNicolas Chautru 
4211f41c6e4dSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
4212f41c6e4dSNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4213fb5e060eSHernan Vargas 			time_out++;
4214fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4215fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4216fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4217fb5e060eSHernan Vargas 			}
4218f41c6e4dSNicolas Chautru 		}
4219f41c6e4dSNicolas Chautru 
4220f41c6e4dSNicolas Chautru 		/* dequeue the remaining */
4221fb5e060eSHernan Vargas 		time_out = 0;
4222f41c6e4dSNicolas Chautru 		while (deq < enq) {
4223f41c6e4dSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
4224f41c6e4dSNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4225fb5e060eSHernan Vargas 			time_out++;
4226fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4227fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4228fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4229fb5e060eSHernan Vargas 			}
4230f41c6e4dSNicolas Chautru 		}
4231f41c6e4dSNicolas Chautru 
4232f41c6e4dSNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
4233f41c6e4dSNicolas Chautru 	}
4234f41c6e4dSNicolas Chautru 
4235f41c6e4dSNicolas Chautru 	tp->iter_count = 0;
4236f41c6e4dSNicolas Chautru 	tp->iter_average = 0;
4237f41c6e4dSNicolas Chautru 	/* get the max of iter_count for all dequeued ops */
4238f41c6e4dSNicolas Chautru 	for (i = 0; i < num_ops; ++i) {
4239f41c6e4dSNicolas Chautru 		tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count,
4240f41c6e4dSNicolas Chautru 				tp->iter_count);
4241f41c6e4dSNicolas Chautru 		tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count;
4242f41c6e4dSNicolas Chautru 		if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR))
4243f41c6e4dSNicolas Chautru 			parity_bler += 1.0;
4244f41c6e4dSNicolas Chautru 	}
4245f41c6e4dSNicolas Chautru 
4246f41c6e4dSNicolas Chautru 	parity_bler /= num_ops; /* This one is based on SYND */
4247f41c6e4dSNicolas Chautru 	tp->iter_average /= num_ops;
4248f41c6e4dSNicolas Chautru 	tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops;
4249f41c6e4dSNicolas Chautru 
4250f41c6e4dSNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE
4251f41c6e4dSNicolas Chautru 			&& tp->bler == 0
4252f41c6e4dSNicolas Chautru 			&& parity_bler == 0
4253f41c6e4dSNicolas Chautru 			&& !hc_out) {
4254f41c6e4dSNicolas Chautru 		ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op,
4255f41c6e4dSNicolas Chautru 				tp->op_params->vector_mask);
4256f41c6e4dSNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4257f41c6e4dSNicolas Chautru 	}
4258f41c6e4dSNicolas Chautru 
4259f41c6e4dSNicolas Chautru 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
4260f41c6e4dSNicolas Chautru 
4261f41c6e4dSNicolas Chautru 	double tb_len_bits = calc_ldpc_dec_TB_size(ref_op);
4262f41c6e4dSNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * 1) /
4263f41c6e4dSNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
4264f41c6e4dSNicolas Chautru 	tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) /
4265f41c6e4dSNicolas Chautru 			1000000.0) / ((double)total_time /
4266f41c6e4dSNicolas Chautru 			(double)rte_get_tsc_hz());
4267f41c6e4dSNicolas Chautru 
4268f41c6e4dSNicolas Chautru 	return TEST_SUCCESS;
4269f41c6e4dSNicolas Chautru }
4270f41c6e4dSNicolas Chautru 
42717831a968SHernan Vargas 
42727831a968SHernan Vargas static int
42737831a968SHernan Vargas bler_pmd_lcore_turbo_dec(void *arg)
42747831a968SHernan Vargas {
42757831a968SHernan Vargas 	struct thread_params *tp = arg;
42767831a968SHernan Vargas 	uint16_t enq, deq;
42777831a968SHernan Vargas 	uint64_t total_time = 0, start_time;
42787831a968SHernan Vargas 	const uint16_t queue_id = tp->queue_id;
42797831a968SHernan Vargas 	const uint16_t burst_sz = tp->op_params->burst_sz;
42807831a968SHernan Vargas 	const uint16_t num_ops = tp->op_params->num_to_process;
42817831a968SHernan Vargas 	struct rte_bbdev_dec_op *ops_enq[num_ops];
42827831a968SHernan Vargas 	struct rte_bbdev_dec_op *ops_deq[num_ops];
42837831a968SHernan Vargas 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
42847831a968SHernan Vargas 	struct test_buffers *bufs = NULL;
42857831a968SHernan Vargas 	int i, j, ret;
42867831a968SHernan Vargas 	struct rte_bbdev_info info;
42877831a968SHernan Vargas 	uint16_t num_to_enq;
42887831a968SHernan Vargas 
42897831a968SHernan Vargas 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
42907831a968SHernan Vargas 			"BURST_SIZE should be <= %u", MAX_BURST);
42917cc8009bSHernan Vargas 	TEST_ASSERT_SUCCESS((num_ops == 0), "NUM_OPS must be greater than 0");
42927831a968SHernan Vargas 
42937831a968SHernan Vargas 	rte_bbdev_info_get(tp->dev_id, &info);
42947831a968SHernan Vargas 
42957831a968SHernan Vargas 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
42967831a968SHernan Vargas 			"NUM_OPS cannot exceed %u for this device",
42977831a968SHernan Vargas 			info.drv.queue_size_lim);
42987831a968SHernan Vargas 
42997831a968SHernan Vargas 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
43007831a968SHernan Vargas 
4301b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4302b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
43037831a968SHernan Vargas 
43047831a968SHernan Vargas 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
43057831a968SHernan Vargas 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
43067831a968SHernan Vargas 
43077831a968SHernan Vargas 	/* For BLER tests we need to enable early termination */
4308b9ac824aSHernan Vargas 	if (!check_bit(ref_op->turbo_dec.op_flags, RTE_BBDEV_TURBO_EARLY_TERMINATION))
4309b9ac824aSHernan Vargas 		ref_op->turbo_dec.op_flags += RTE_BBDEV_TURBO_EARLY_TERMINATION;
4310b9ac824aSHernan Vargas 
43117831a968SHernan Vargas 	ref_op->turbo_dec.iter_max = get_iter_max();
43127831a968SHernan Vargas 
43137831a968SHernan Vargas 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
43147831a968SHernan Vargas 		copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs,
43157831a968SHernan Vargas 				bufs->hard_outputs, bufs->soft_outputs,
43167831a968SHernan Vargas 				ref_op);
43177831a968SHernan Vargas 	generate_turbo_llr_input(num_ops, bufs->inputs, ref_op);
43187831a968SHernan Vargas 
43197831a968SHernan Vargas 	/* Set counter to validate the ordering */
43207831a968SHernan Vargas 	for (j = 0; j < num_ops; ++j)
43217831a968SHernan Vargas 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
43227831a968SHernan Vargas 
43237831a968SHernan Vargas 	for (i = 0; i < 1; ++i) { /* Could add more iterations */
43247831a968SHernan Vargas 		uint32_t time_out = 0;
43257831a968SHernan Vargas 		for (j = 0; j < num_ops; ++j) {
43267831a968SHernan Vargas 			mbuf_reset(
43277831a968SHernan Vargas 			ops_enq[j]->turbo_dec.hard_output.data);
43287831a968SHernan Vargas 		}
43297831a968SHernan Vargas 
43307831a968SHernan Vargas 		start_time = rte_rdtsc_precise();
43317831a968SHernan Vargas 
43327831a968SHernan Vargas 		for (enq = 0, deq = 0; enq < num_ops;) {
43337831a968SHernan Vargas 			num_to_enq = burst_sz;
43347831a968SHernan Vargas 
43357831a968SHernan Vargas 			if (unlikely(num_ops - enq < num_to_enq))
43367831a968SHernan Vargas 				num_to_enq = num_ops - enq;
43377831a968SHernan Vargas 
43387831a968SHernan Vargas 			enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
43397831a968SHernan Vargas 					queue_id, &ops_enq[enq], num_to_enq);
43407831a968SHernan Vargas 
43417831a968SHernan Vargas 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
43427831a968SHernan Vargas 					queue_id, &ops_deq[deq], enq - deq);
43437831a968SHernan Vargas 			time_out++;
43447831a968SHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
43457831a968SHernan Vargas 				timeout_exit(tp->dev_id);
43467831a968SHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
43477831a968SHernan Vargas 			}
43487831a968SHernan Vargas 		}
43497831a968SHernan Vargas 
43507831a968SHernan Vargas 		/* dequeue the remaining */
43517831a968SHernan Vargas 		time_out = 0;
43527831a968SHernan Vargas 		while (deq < enq) {
43537831a968SHernan Vargas 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
43547831a968SHernan Vargas 					queue_id, &ops_deq[deq], enq - deq);
43557831a968SHernan Vargas 			time_out++;
43567831a968SHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
43577831a968SHernan Vargas 				timeout_exit(tp->dev_id);
43587831a968SHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
43597831a968SHernan Vargas 			}
43607831a968SHernan Vargas 		}
43617831a968SHernan Vargas 
43627831a968SHernan Vargas 		total_time += rte_rdtsc_precise() - start_time;
43637831a968SHernan Vargas 	}
43647831a968SHernan Vargas 
43657831a968SHernan Vargas 	tp->iter_count = 0;
43667831a968SHernan Vargas 	tp->iter_average = 0;
43677831a968SHernan Vargas 	/* get the max of iter_count for all dequeued ops */
43687831a968SHernan Vargas 	for (i = 0; i < num_ops; ++i) {
43697831a968SHernan Vargas 		tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count,
43707831a968SHernan Vargas 				tp->iter_count);
43717831a968SHernan Vargas 		tp->iter_average += (double) ops_enq[i]->turbo_dec.iter_count;
43727831a968SHernan Vargas 	}
43737831a968SHernan Vargas 
43747831a968SHernan Vargas 	tp->iter_average /= num_ops;
43757831a968SHernan Vargas 	tp->bler = (double) validate_turbo_bler(ops_deq, num_ops) / num_ops;
43767831a968SHernan Vargas 
43777831a968SHernan Vargas 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
43787831a968SHernan Vargas 
43797831a968SHernan Vargas 	double tb_len_bits = calc_dec_TB_size(ref_op);
43807831a968SHernan Vargas 	tp->ops_per_sec = ((double)num_ops * 1) /
43817831a968SHernan Vargas 			((double)total_time / (double)rte_get_tsc_hz());
43827831a968SHernan Vargas 	tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) /
43837831a968SHernan Vargas 			1000000.0) / ((double)total_time /
43847831a968SHernan Vargas 			(double)rte_get_tsc_hz());
43857831a968SHernan Vargas 	printf("TBS %.0f Time %.0f\n", tb_len_bits, 1000000.0 *
43867831a968SHernan Vargas 			((double)total_time / (double)rte_get_tsc_hz()));
43877831a968SHernan Vargas 
43887831a968SHernan Vargas 	return TEST_SUCCESS;
43897831a968SHernan Vargas }
43907831a968SHernan Vargas 
4391f41c6e4dSNicolas Chautru static int
4392d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_dec(void *arg)
4393d819c083SNicolas Chautru {
4394d819c083SNicolas Chautru 	struct thread_params *tp = arg;
4395d819c083SNicolas Chautru 	uint16_t enq, deq;
4396d819c083SNicolas Chautru 	uint64_t total_time = 0, start_time;
4397d819c083SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
4398d819c083SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
4399d819c083SNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
4400d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[num_ops];
4401d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[num_ops];
4402d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
4403d819c083SNicolas Chautru 	struct test_buffers *bufs = NULL;
4404d819c083SNicolas Chautru 	int i, j, ret;
4405d819c083SNicolas Chautru 	struct rte_bbdev_info info;
4406d819c083SNicolas Chautru 	uint16_t num_to_enq;
4407335c11fdSNicolas Chautru 	bool extDdr = check_bit(ldpc_cap_flags,
4408335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE);
4409335c11fdSNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
4410335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
4411335c11fdSNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
4412335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
4413d819c083SNicolas Chautru 
4414d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4415d819c083SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
4416d819c083SNicolas Chautru 
4417d819c083SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
4418d819c083SNicolas Chautru 
4419d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
4420d819c083SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
4421d819c083SNicolas Chautru 			info.drv.queue_size_lim);
4422d819c083SNicolas Chautru 
4423d819c083SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4424d819c083SNicolas Chautru 
4425b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4426b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
4427d819c083SNicolas Chautru 
4428d819c083SNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
4429d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
4430d819c083SNicolas Chautru 
4431d819c083SNicolas Chautru 	/* For throughput tests we need to disable early termination */
44323073445dSHernan Vargas 	if (check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
44333073445dSHernan Vargas 		ref_op->ldpc_dec.op_flags -= RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
44343073445dSHernan Vargas 
4435f41c6e4dSNicolas Chautru 	ref_op->ldpc_dec.iter_max = get_iter_max();
44363073445dSHernan Vargas 	/* Since ET is disabled, the expected iter_count is iter_max */
4437d819c083SNicolas Chautru 	ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
4438d819c083SNicolas Chautru 
4439d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4440d819c083SNicolas Chautru 		copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs,
4441d819c083SNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
4442d819c083SNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
4443d819c083SNicolas Chautru 
4444d819c083SNicolas Chautru 	/* Set counter to validate the ordering */
4445d819c083SNicolas Chautru 	for (j = 0; j < num_ops; ++j)
4446d819c083SNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4447d819c083SNicolas Chautru 
4448d819c083SNicolas Chautru 	for (i = 0; i < TEST_REPETITIONS; ++i) {
4449fb5e060eSHernan Vargas 		uint32_t time_out = 0;
4450d819c083SNicolas Chautru 		for (j = 0; j < num_ops; ++j) {
4451335c11fdSNicolas Chautru 			if (!loopback)
44529d9d73ebSHernan Vargas 				mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data);
4453335c11fdSNicolas Chautru 			if (hc_out || loopback)
44549d9d73ebSHernan Vargas 				mbuf_reset(ops_enq[j]->ldpc_dec.harq_combined_output.data);
44559d9d73ebSHernan Vargas 			if (ops_enq[j]->ldpc_dec.soft_output.data != NULL)
44569d9d73ebSHernan Vargas 				mbuf_reset(ops_enq[j]->ldpc_dec.soft_output.data);
4457d819c083SNicolas Chautru 		}
44583d6063a0SNicolas Chautru 		if (extDdr)
4459335c11fdSNicolas Chautru 			preload_harq_ddr(tp->dev_id, queue_id, ops_enq,
44603d6063a0SNicolas Chautru 					num_ops, true);
4461d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
4462d819c083SNicolas Chautru 
4463d819c083SNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
4464d819c083SNicolas Chautru 			num_to_enq = burst_sz;
4465d819c083SNicolas Chautru 
4466d819c083SNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
4467d819c083SNicolas Chautru 				num_to_enq = num_ops - enq;
4468d819c083SNicolas Chautru 
4469d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id,
4470d819c083SNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
4471d819c083SNicolas Chautru 
4472d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
4473d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4474fb5e060eSHernan Vargas 			time_out++;
4475fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4476fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4477fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4478fb5e060eSHernan Vargas 			}
4479d819c083SNicolas Chautru 		}
4480d819c083SNicolas Chautru 
4481d819c083SNicolas Chautru 		/* dequeue the remaining */
4482fb5e060eSHernan Vargas 		time_out = 0;
4483d819c083SNicolas Chautru 		while (deq < enq) {
4484d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
4485d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4486fb5e060eSHernan Vargas 			time_out++;
4487fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4488fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4489fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4490fb5e060eSHernan Vargas 			}
4491d819c083SNicolas Chautru 		}
4492d819c083SNicolas Chautru 
4493d819c083SNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
4494d819c083SNicolas Chautru 	}
4495d819c083SNicolas Chautru 
4496d819c083SNicolas Chautru 	tp->iter_count = 0;
4497d819c083SNicolas Chautru 	/* get the max of iter_count for all dequeued ops */
4498d819c083SNicolas Chautru 	for (i = 0; i < num_ops; ++i) {
4499d819c083SNicolas Chautru 		tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count,
4500d819c083SNicolas Chautru 				tp->iter_count);
4501d819c083SNicolas Chautru 	}
4502335c11fdSNicolas Chautru 	if (extDdr) {
4503335c11fdSNicolas Chautru 		/* Read loopback is not thread safe */
4504335c11fdSNicolas Chautru 		retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops);
4505335c11fdSNicolas Chautru 	}
4506d819c083SNicolas Chautru 
4507d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4508d819c083SNicolas Chautru 		ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op,
4509d819c083SNicolas Chautru 				tp->op_params->vector_mask);
4510d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4511d819c083SNicolas Chautru 	}
4512d819c083SNicolas Chautru 
4513f32bbc32SHernan Vargas 	ret = rte_bbdev_queue_stop(tp->dev_id, queue_id);
4514f32bbc32SHernan Vargas 	if (ret != 0)
4515f32bbc32SHernan Vargas 		printf("Failed to stop queue on dev %u q_id: %u\n", tp->dev_id, queue_id);
4516d819c083SNicolas Chautru 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
4517d819c083SNicolas Chautru 
4518d819c083SNicolas Chautru 	double tb_len_bits = calc_ldpc_dec_TB_size(ref_op);
4519d819c083SNicolas Chautru 
4520d819c083SNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
4521d819c083SNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
4522d819c083SNicolas Chautru 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
4523d819c083SNicolas Chautru 			1000000.0) / ((double)total_time /
4524d819c083SNicolas Chautru 			(double)rte_get_tsc_hz());
4525d819c083SNicolas Chautru 
4526d819c083SNicolas Chautru 	return TEST_SUCCESS;
4527d819c083SNicolas Chautru }
4528d819c083SNicolas Chautru 
4529d819c083SNicolas Chautru static int
4530f714a188SAmr Mokhtar throughput_pmd_lcore_enc(void *arg)
4531f714a188SAmr Mokhtar {
4532f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
45330b98d574SKamil Chalupnik 	uint16_t enq, deq;
45340b98d574SKamil Chalupnik 	uint64_t total_time = 0, start_time;
4535f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
4536f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
45370b98d574SKamil Chalupnik 	const uint16_t num_ops = tp->op_params->num_to_process;
45380b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops_enq[num_ops];
45390b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops_deq[num_ops];
4540f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
4541f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
45420b98d574SKamil Chalupnik 	int i, j, ret;
4543f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
45440b98d574SKamil Chalupnik 	uint16_t num_to_enq;
4545f714a188SAmr Mokhtar 
4546f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4547f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
4548f714a188SAmr Mokhtar 
4549f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
45500b98d574SKamil Chalupnik 
45510b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
45520b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
45530b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
45540b98d574SKamil Chalupnik 
4555f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4556f714a188SAmr Mokhtar 
4557b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4558b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
4559f714a188SAmr Mokhtar 
45600b98d574SKamil Chalupnik 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
45610b98d574SKamil Chalupnik 			num_ops);
45620b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
45630b98d574SKamil Chalupnik 			num_ops);
45640b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
45650b98d574SKamil Chalupnik 		copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs,
45660b98d574SKamil Chalupnik 				bufs->hard_outputs, ref_op);
4567f714a188SAmr Mokhtar 
45680b98d574SKamil Chalupnik 	/* Set counter to validate the ordering */
45690b98d574SKamil Chalupnik 	for (j = 0; j < num_ops; ++j)
45700b98d574SKamil Chalupnik 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4571f714a188SAmr Mokhtar 
45720b98d574SKamil Chalupnik 	for (i = 0; i < TEST_REPETITIONS; ++i) {
4573fb5e060eSHernan Vargas 		uint32_t time_out = 0;
4574f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
45750b98d574SKamil Chalupnik 			for (j = 0; j < num_ops; ++j)
45769585f8b1SKamil Chalupnik 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
4577f714a188SAmr Mokhtar 
45780b98d574SKamil Chalupnik 		start_time = rte_rdtsc_precise();
45790b98d574SKamil Chalupnik 
45800b98d574SKamil Chalupnik 		for (enq = 0, deq = 0; enq < num_ops;) {
45810b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
45820b98d574SKamil Chalupnik 
45830b98d574SKamil Chalupnik 			if (unlikely(num_ops - enq < num_to_enq))
45840b98d574SKamil Chalupnik 				num_to_enq = num_ops - enq;
45850b98d574SKamil Chalupnik 
45860b98d574SKamil Chalupnik 			enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
45870b98d574SKamil Chalupnik 					queue_id, &ops_enq[enq], num_to_enq);
45880b98d574SKamil Chalupnik 
45890b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
45900b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
4591fb5e060eSHernan Vargas 			time_out++;
4592fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4593fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4594fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4595fb5e060eSHernan Vargas 			}
4596f714a188SAmr Mokhtar 		}
45970b98d574SKamil Chalupnik 
45980b98d574SKamil Chalupnik 		/* dequeue the remaining */
4599fb5e060eSHernan Vargas 		time_out = 0;
46000b98d574SKamil Chalupnik 		while (deq < enq) {
46010b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
46020b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
4603fb5e060eSHernan Vargas 			time_out++;
4604fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4605fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4606fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4607fb5e060eSHernan Vargas 			}
4608f714a188SAmr Mokhtar 		}
4609f714a188SAmr Mokhtar 
46100b98d574SKamil Chalupnik 		total_time += rte_rdtsc_precise() - start_time;
46110b98d574SKamil Chalupnik 	}
4612f714a188SAmr Mokhtar 
4613f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
46140b98d574SKamil Chalupnik 		ret = validate_enc_op(ops_deq, num_ops, ref_op);
46150b98d574SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4616f714a188SAmr Mokhtar 	}
4617f714a188SAmr Mokhtar 
4618d819c083SNicolas Chautru 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
4619d819c083SNicolas Chautru 
46200b98d574SKamil Chalupnik 	double tb_len_bits = calc_enc_TB_size(ref_op);
4621f714a188SAmr Mokhtar 
46220b98d574SKamil Chalupnik 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
4623f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
46240b98d574SKamil Chalupnik 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
46250b98d574SKamil Chalupnik 			/ 1000000.0) / ((double)total_time /
46260b98d574SKamil Chalupnik 			(double)rte_get_tsc_hz());
4627f714a188SAmr Mokhtar 
4628f714a188SAmr Mokhtar 	return TEST_SUCCESS;
4629f714a188SAmr Mokhtar }
46300b98d574SKamil Chalupnik 
4631d819c083SNicolas Chautru static int
4632d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_enc(void *arg)
4633d819c083SNicolas Chautru {
4634d819c083SNicolas Chautru 	struct thread_params *tp = arg;
4635d819c083SNicolas Chautru 	uint16_t enq, deq;
4636d819c083SNicolas Chautru 	uint64_t total_time = 0, start_time;
4637d819c083SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
4638d819c083SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
4639d819c083SNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
4640d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[num_ops];
4641d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_deq[num_ops];
4642d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
4643d819c083SNicolas Chautru 	struct test_buffers *bufs = NULL;
4644d819c083SNicolas Chautru 	int i, j, ret;
4645d819c083SNicolas Chautru 	struct rte_bbdev_info info;
4646d819c083SNicolas Chautru 	uint16_t num_to_enq;
4647d819c083SNicolas Chautru 
4648d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4649d819c083SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
4650d819c083SNicolas Chautru 
4651d819c083SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
4652d819c083SNicolas Chautru 
4653d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
4654d819c083SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
4655d819c083SNicolas Chautru 			info.drv.queue_size_lim);
4656d819c083SNicolas Chautru 
4657d819c083SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4658d819c083SNicolas Chautru 
4659b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4660b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
4661d819c083SNicolas Chautru 
4662d819c083SNicolas Chautru 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
4663d819c083SNicolas Chautru 			num_ops);
4664d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
4665d819c083SNicolas Chautru 			num_ops);
4666d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4667d819c083SNicolas Chautru 		copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs,
4668d819c083SNicolas Chautru 				bufs->hard_outputs, ref_op);
4669d819c083SNicolas Chautru 
4670d819c083SNicolas Chautru 	/* Set counter to validate the ordering */
4671d819c083SNicolas Chautru 	for (j = 0; j < num_ops; ++j)
4672d819c083SNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4673d819c083SNicolas Chautru 
4674d819c083SNicolas Chautru 	for (i = 0; i < TEST_REPETITIONS; ++i) {
4675fb5e060eSHernan Vargas 		uint32_t time_out = 0;
4676d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4677d819c083SNicolas Chautru 			for (j = 0; j < num_ops; ++j)
4678d819c083SNicolas Chautru 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
4679d819c083SNicolas Chautru 
4680d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
4681d819c083SNicolas Chautru 
4682d819c083SNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
4683d819c083SNicolas Chautru 			num_to_enq = burst_sz;
4684d819c083SNicolas Chautru 
4685d819c083SNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
4686d819c083SNicolas Chautru 				num_to_enq = num_ops - enq;
4687d819c083SNicolas Chautru 
4688d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id,
4689d819c083SNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
4690d819c083SNicolas Chautru 
4691d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
4692d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4693fb5e060eSHernan Vargas 			time_out++;
4694fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4695fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4696fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4697fb5e060eSHernan Vargas 			}
4698d819c083SNicolas Chautru 		}
4699d819c083SNicolas Chautru 
4700d819c083SNicolas Chautru 		/* dequeue the remaining */
4701fb5e060eSHernan Vargas 		time_out = 0;
4702d819c083SNicolas Chautru 		while (deq < enq) {
4703d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
4704d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4705fb5e060eSHernan Vargas 			time_out++;
4706fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4707fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4708fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4709fb5e060eSHernan Vargas 			}
4710d819c083SNicolas Chautru 		}
4711d819c083SNicolas Chautru 
4712d819c083SNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
4713d819c083SNicolas Chautru 	}
4714d819c083SNicolas Chautru 
4715d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4716d819c083SNicolas Chautru 		ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op);
4717d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4718d819c083SNicolas Chautru 	}
4719d819c083SNicolas Chautru 
4720d819c083SNicolas Chautru 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
4721d819c083SNicolas Chautru 
4722d819c083SNicolas Chautru 	double tb_len_bits = calc_ldpc_enc_TB_size(ref_op);
4723d819c083SNicolas Chautru 
4724d819c083SNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
4725d819c083SNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
4726d819c083SNicolas Chautru 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
4727d819c083SNicolas Chautru 			/ 1000000.0) / ((double)total_time /
4728d819c083SNicolas Chautru 			(double)rte_get_tsc_hz());
4729d819c083SNicolas Chautru 
4730d819c083SNicolas Chautru 	return TEST_SUCCESS;
4731d819c083SNicolas Chautru }
4732d819c083SNicolas Chautru 
47330acdb986SNicolas Chautru static int
47340acdb986SNicolas Chautru throughput_pmd_lcore_fft(void *arg)
47350acdb986SNicolas Chautru {
47360acdb986SNicolas Chautru 	struct thread_params *tp = arg;
47370acdb986SNicolas Chautru 	uint16_t enq, deq;
47380acdb986SNicolas Chautru 	uint64_t total_time = 0, start_time;
47390acdb986SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
47400acdb986SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
47410acdb986SNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
47420acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ops_enq[num_ops];
47430acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ops_deq[num_ops];
47440acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ref_op = tp->op_params->ref_fft_op;
47450acdb986SNicolas Chautru 	struct test_buffers *bufs = NULL;
47460acdb986SNicolas Chautru 	int i, j, ret;
47470acdb986SNicolas Chautru 	struct rte_bbdev_info info;
47480acdb986SNicolas Chautru 	uint16_t num_to_enq;
47490acdb986SNicolas Chautru 
47500acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
47510acdb986SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
47520acdb986SNicolas Chautru 
47530acdb986SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
47540acdb986SNicolas Chautru 
47550acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
47560acdb986SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
47570acdb986SNicolas Chautru 			info.drv.queue_size_lim);
47580acdb986SNicolas Chautru 
47590acdb986SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
47600acdb986SNicolas Chautru 
4761b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4762b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
47630acdb986SNicolas Chautru 
47640acdb986SNicolas Chautru 	ret = rte_bbdev_fft_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
47650acdb986SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
47660acdb986SNicolas Chautru 
47670acdb986SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
47680acdb986SNicolas Chautru 		copy_reference_fft_op(ops_enq, num_ops, 0, bufs->inputs,
47690ed76d66SHernan Vargas 				bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, ref_op);
47700acdb986SNicolas Chautru 
47710acdb986SNicolas Chautru 	/* Set counter to validate the ordering */
47720acdb986SNicolas Chautru 	for (j = 0; j < num_ops; ++j)
47730acdb986SNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
47740acdb986SNicolas Chautru 
47750acdb986SNicolas Chautru 	for (i = 0; i < TEST_REPETITIONS; ++i) {
4776fb5e060eSHernan Vargas 		uint32_t time_out = 0;
47770acdb986SNicolas Chautru 		for (j = 0; j < num_ops; ++j)
47780acdb986SNicolas Chautru 			mbuf_reset(ops_enq[j]->fft.base_output.data);
47790acdb986SNicolas Chautru 
47800acdb986SNicolas Chautru 		start_time = rte_rdtsc_precise();
47810acdb986SNicolas Chautru 
47820acdb986SNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
47830acdb986SNicolas Chautru 			num_to_enq = burst_sz;
47840acdb986SNicolas Chautru 
47850acdb986SNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
47860acdb986SNicolas Chautru 				num_to_enq = num_ops - enq;
47870acdb986SNicolas Chautru 
47880acdb986SNicolas Chautru 			enq += rte_bbdev_enqueue_fft_ops(tp->dev_id,
47890acdb986SNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
47900acdb986SNicolas Chautru 
47910acdb986SNicolas Chautru 			deq += rte_bbdev_dequeue_fft_ops(tp->dev_id,
47920acdb986SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4793fb5e060eSHernan Vargas 			time_out++;
4794fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4795fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4796fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
4797fb5e060eSHernan Vargas 			}
47980acdb986SNicolas Chautru 		}
47990acdb986SNicolas Chautru 
48000acdb986SNicolas Chautru 		/* dequeue the remaining */
4801fb5e060eSHernan Vargas 		time_out = 0;
48020acdb986SNicolas Chautru 		while (deq < enq) {
48030acdb986SNicolas Chautru 			deq += rte_bbdev_dequeue_fft_ops(tp->dev_id,
48040acdb986SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
4805fb5e060eSHernan Vargas 			time_out++;
4806fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
4807fb5e060eSHernan Vargas 				timeout_exit(tp->dev_id);
4808fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
4809fb5e060eSHernan Vargas 			}
48100acdb986SNicolas Chautru 		}
48110acdb986SNicolas Chautru 
48120acdb986SNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
48130acdb986SNicolas Chautru 	}
48140acdb986SNicolas Chautru 
48150acdb986SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
48160acdb986SNicolas Chautru 		ret = validate_fft_op(ops_deq, num_ops, ref_op);
48170acdb986SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
48180acdb986SNicolas Chautru 	}
48190acdb986SNicolas Chautru 
48200acdb986SNicolas Chautru 	rte_bbdev_fft_op_free_bulk(ops_enq, num_ops);
48210acdb986SNicolas Chautru 
48220acdb986SNicolas Chautru 	double tb_len_bits = calc_fft_size(ref_op);
48230acdb986SNicolas Chautru 
48240acdb986SNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
48250acdb986SNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
48260acdb986SNicolas Chautru 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
48270acdb986SNicolas Chautru 			1000000.0) / ((double)total_time /
48280acdb986SNicolas Chautru 			(double)rte_get_tsc_hz());
48290acdb986SNicolas Chautru 
48300acdb986SNicolas Chautru 	return TEST_SUCCESS;
48310acdb986SNicolas Chautru }
48320acdb986SNicolas Chautru 
483395f192a4SHernan Vargas static int
483495f192a4SHernan Vargas throughput_pmd_lcore_mldts(void *arg)
483595f192a4SHernan Vargas {
483695f192a4SHernan Vargas 	struct thread_params *tp = arg;
483795f192a4SHernan Vargas 	uint16_t enq, deq;
483895f192a4SHernan Vargas 	uint64_t total_time = 0, start_time;
483995f192a4SHernan Vargas 	const uint16_t queue_id = tp->queue_id;
484095f192a4SHernan Vargas 	const uint16_t burst_sz = tp->op_params->burst_sz;
484195f192a4SHernan Vargas 	const uint16_t num_ops = tp->op_params->num_to_process;
484295f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ops_enq[num_ops];
484395f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ops_deq[num_ops];
484495f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ref_op = tp->op_params->ref_mldts_op;
484595f192a4SHernan Vargas 	struct test_buffers *bufs = NULL;
484695f192a4SHernan Vargas 	int i, j, ret;
484795f192a4SHernan Vargas 	struct rte_bbdev_info info;
484895f192a4SHernan Vargas 	uint16_t num_to_enq;
484995f192a4SHernan Vargas 
485095f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST);
485195f192a4SHernan Vargas 
485295f192a4SHernan Vargas 	rte_bbdev_info_get(tp->dev_id, &info);
485395f192a4SHernan Vargas 
485495f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
485595f192a4SHernan Vargas 			"NUM_OPS cannot exceed %u for this device",
485695f192a4SHernan Vargas 			info.drv.queue_size_lim);
485795f192a4SHernan Vargas 
485895f192a4SHernan Vargas 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
485995f192a4SHernan Vargas 
4860b6a7e685STyler Retzlaff 	rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START,
4861b6a7e685STyler Retzlaff 			rte_memory_order_relaxed);
486295f192a4SHernan Vargas 
486395f192a4SHernan Vargas 	ret = rte_bbdev_mldts_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
486495f192a4SHernan Vargas 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
486595f192a4SHernan Vargas 
486695f192a4SHernan Vargas 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
486795f192a4SHernan Vargas 		copy_reference_mldts_op(ops_enq, num_ops, 0, bufs->inputs, bufs->harq_inputs,
486895f192a4SHernan Vargas 				bufs->hard_outputs, ref_op);
486995f192a4SHernan Vargas 
487095f192a4SHernan Vargas 	/* Set counter to validate the ordering */
487195f192a4SHernan Vargas 	for (j = 0; j < num_ops; ++j)
487295f192a4SHernan Vargas 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
487395f192a4SHernan Vargas 
487495f192a4SHernan Vargas 	for (i = 0; i < TEST_REPETITIONS; ++i) {
487595f192a4SHernan Vargas 		uint32_t time_out = 0;
487695f192a4SHernan Vargas 		for (j = 0; j < num_ops; ++j)
487795f192a4SHernan Vargas 			mbuf_reset(ops_enq[j]->mldts.output.data);
487895f192a4SHernan Vargas 
487995f192a4SHernan Vargas 		start_time = rte_rdtsc_precise();
488095f192a4SHernan Vargas 
488195f192a4SHernan Vargas 		for (enq = 0, deq = 0; enq < num_ops;) {
488295f192a4SHernan Vargas 			num_to_enq = burst_sz;
488395f192a4SHernan Vargas 
488495f192a4SHernan Vargas 			if (unlikely(num_ops - enq < num_to_enq))
488595f192a4SHernan Vargas 				num_to_enq = num_ops - enq;
488695f192a4SHernan Vargas 
488795f192a4SHernan Vargas 			enq += rte_bbdev_enqueue_mldts_ops(tp->dev_id,
488895f192a4SHernan Vargas 					queue_id, &ops_enq[enq], num_to_enq);
488995f192a4SHernan Vargas 
489095f192a4SHernan Vargas 			deq += rte_bbdev_dequeue_mldts_ops(tp->dev_id,
489195f192a4SHernan Vargas 					queue_id, &ops_deq[deq], enq - deq);
489295f192a4SHernan Vargas 			time_out++;
489395f192a4SHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
489495f192a4SHernan Vargas 				timeout_exit(tp->dev_id);
489595f192a4SHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!");
489695f192a4SHernan Vargas 			}
489795f192a4SHernan Vargas 		}
489895f192a4SHernan Vargas 
489995f192a4SHernan Vargas 		/* dequeue the remaining */
490095f192a4SHernan Vargas 		time_out = 0;
490195f192a4SHernan Vargas 		while (deq < enq) {
490295f192a4SHernan Vargas 			deq += rte_bbdev_dequeue_mldts_ops(tp->dev_id,
490395f192a4SHernan Vargas 					queue_id, &ops_deq[deq], enq - deq);
490495f192a4SHernan Vargas 			time_out++;
490595f192a4SHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
490695f192a4SHernan Vargas 				timeout_exit(tp->dev_id);
490795f192a4SHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
490895f192a4SHernan Vargas 			}
490995f192a4SHernan Vargas 		}
491095f192a4SHernan Vargas 
491195f192a4SHernan Vargas 		total_time += rte_rdtsc_precise() - start_time;
491295f192a4SHernan Vargas 	}
491395f192a4SHernan Vargas 
491495f192a4SHernan Vargas 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
491595f192a4SHernan Vargas 		ret = validate_mldts_op(ops_deq, num_ops, ref_op);
491695f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
491795f192a4SHernan Vargas 	}
491895f192a4SHernan Vargas 
491995f192a4SHernan Vargas 	rte_bbdev_mldts_op_free_bulk(ops_enq, num_ops);
492095f192a4SHernan Vargas 
492195f192a4SHernan Vargas 	double tb_len_bits = calc_mldts_size(ref_op);
492295f192a4SHernan Vargas 
492395f192a4SHernan Vargas 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
492495f192a4SHernan Vargas 			((double)total_time / (double)rte_get_tsc_hz());
492595f192a4SHernan Vargas 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
492695f192a4SHernan Vargas 			1000000.0) / ((double)total_time /
492795f192a4SHernan Vargas 			(double)rte_get_tsc_hz());
492895f192a4SHernan Vargas 
492995f192a4SHernan Vargas 	return TEST_SUCCESS;
493095f192a4SHernan Vargas }
493195f192a4SHernan Vargas 
4932f714a188SAmr Mokhtar static void
49330b98d574SKamil Chalupnik print_enc_throughput(struct thread_params *t_params, unsigned int used_cores)
4934f714a188SAmr Mokhtar {
4935b2e2aec3SKamil Chalupnik 	unsigned int iter = 0;
4936f714a188SAmr Mokhtar 	double total_mops = 0, total_mbps = 0;
4937f714a188SAmr Mokhtar 
4938b2e2aec3SKamil Chalupnik 	for (iter = 0; iter < used_cores; iter++) {
49390b98d574SKamil Chalupnik 		printf(
49400b98d574SKamil Chalupnik 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n",
4941b2e2aec3SKamil Chalupnik 			t_params[iter].lcore_id, t_params[iter].ops_per_sec,
4942b2e2aec3SKamil Chalupnik 			t_params[iter].mbps);
4943b2e2aec3SKamil Chalupnik 		total_mops += t_params[iter].ops_per_sec;
4944b2e2aec3SKamil Chalupnik 		total_mbps += t_params[iter].mbps;
4945f714a188SAmr Mokhtar 	}
4946f714a188SAmr Mokhtar 	printf(
49479fa6ebdeSKamil Chalupnik 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n",
4948f714a188SAmr Mokhtar 		used_cores, total_mops, total_mbps);
4949f714a188SAmr Mokhtar }
4950f714a188SAmr Mokhtar 
4951f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */
49520b98d574SKamil Chalupnik static void
49530b98d574SKamil Chalupnik print_dec_throughput(struct thread_params *t_params, unsigned int used_cores)
49540b98d574SKamil Chalupnik {
4955f41c6e4dSNicolas Chautru 	unsigned int core_idx = 0;
49560b98d574SKamil Chalupnik 	double total_mops = 0, total_mbps = 0;
49570b98d574SKamil Chalupnik 	uint8_t iter_count = 0;
49580b98d574SKamil Chalupnik 
4959f41c6e4dSNicolas Chautru 	for (core_idx = 0; core_idx < used_cores; core_idx++) {
49600b98d574SKamil Chalupnik 		printf(
49610b98d574SKamil Chalupnik 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n",
4962f41c6e4dSNicolas Chautru 			t_params[core_idx].lcore_id,
4963f41c6e4dSNicolas Chautru 			t_params[core_idx].ops_per_sec,
4964f41c6e4dSNicolas Chautru 			t_params[core_idx].mbps,
4965f41c6e4dSNicolas Chautru 			t_params[core_idx].iter_count);
4966f41c6e4dSNicolas Chautru 		total_mops += t_params[core_idx].ops_per_sec;
4967f41c6e4dSNicolas Chautru 		total_mbps += t_params[core_idx].mbps;
4968f41c6e4dSNicolas Chautru 		iter_count = RTE_MAX(iter_count,
4969f41c6e4dSNicolas Chautru 				t_params[core_idx].iter_count);
49700b98d574SKamil Chalupnik 	}
49710b98d574SKamil Chalupnik 	printf(
49720b98d574SKamil Chalupnik 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n",
49730b98d574SKamil Chalupnik 		used_cores, total_mops, total_mbps, iter_count);
49740b98d574SKamil Chalupnik }
49750b98d574SKamil Chalupnik 
4976f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */
4977f41c6e4dSNicolas Chautru static void
4978f41c6e4dSNicolas Chautru print_dec_bler(struct thread_params *t_params, unsigned int used_cores)
4979f41c6e4dSNicolas Chautru {
4980f41c6e4dSNicolas Chautru 	unsigned int core_idx = 0;
4981f41c6e4dSNicolas Chautru 	double total_mbps = 0, total_bler = 0, total_iter = 0;
4982f41c6e4dSNicolas Chautru 	double snr = get_snr();
4983f41c6e4dSNicolas Chautru 
4984f41c6e4dSNicolas Chautru 	for (core_idx = 0; core_idx < used_cores; core_idx++) {
4985f41c6e4dSNicolas Chautru 		printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n",
4986f41c6e4dSNicolas Chautru 				t_params[core_idx].lcore_id,
4987f41c6e4dSNicolas Chautru 				t_params[core_idx].bler * 100,
4988f41c6e4dSNicolas Chautru 				t_params[core_idx].iter_average,
4989f41c6e4dSNicolas Chautru 				t_params[core_idx].mbps,
4990f41c6e4dSNicolas Chautru 				get_vector_filename());
4991f41c6e4dSNicolas Chautru 		total_mbps += t_params[core_idx].mbps;
4992f41c6e4dSNicolas Chautru 		total_bler += t_params[core_idx].bler;
4993f41c6e4dSNicolas Chautru 		total_iter += t_params[core_idx].iter_average;
4994f41c6e4dSNicolas Chautru 	}
4995f41c6e4dSNicolas Chautru 	total_bler /= used_cores;
4996f41c6e4dSNicolas Chautru 	total_iter /= used_cores;
4997f41c6e4dSNicolas Chautru 
49987831a968SHernan Vargas 	printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.3f Mbps %s\n",
4999f41c6e4dSNicolas Chautru 			snr, total_bler * 100, total_iter, get_iter_max(),
5000f41c6e4dSNicolas Chautru 			total_mbps, get_vector_filename());
5001f41c6e4dSNicolas Chautru }
5002f41c6e4dSNicolas Chautru 
5003f41c6e4dSNicolas Chautru /*
5004f41c6e4dSNicolas Chautru  * Test function that determines BLER wireless performance
5005f41c6e4dSNicolas Chautru  */
5006f41c6e4dSNicolas Chautru static int
5007f41c6e4dSNicolas Chautru bler_test(struct active_device *ad,
5008f41c6e4dSNicolas Chautru 		struct test_op_params *op_params)
5009f41c6e4dSNicolas Chautru {
5010f41c6e4dSNicolas Chautru 	int ret;
5011f41c6e4dSNicolas Chautru 	unsigned int lcore_id, used_cores = 0;
5012f41c6e4dSNicolas Chautru 	struct thread_params *t_params;
5013f41c6e4dSNicolas Chautru 	struct rte_bbdev_info info;
5014f41c6e4dSNicolas Chautru 	lcore_function_t *bler_function;
5015f41c6e4dSNicolas Chautru 	uint16_t num_lcores;
5016f41c6e4dSNicolas Chautru 	const char *op_type_str;
5017f41c6e4dSNicolas Chautru 
5018f41c6e4dSNicolas Chautru 	rte_bbdev_info_get(ad->dev_id, &info);
5019f41c6e4dSNicolas Chautru 
5020f41c6e4dSNicolas Chautru 	op_type_str = rte_bbdev_op_type_str(test_vector.op_type);
5021f41c6e4dSNicolas Chautru 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u",
5022f41c6e4dSNicolas Chautru 			test_vector.op_type);
5023f41c6e4dSNicolas Chautru 
5024f41c6e4dSNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
5025f41c6e4dSNicolas Chautru 	printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n",
5026f41c6e4dSNicolas Chautru 			info.dev_name, ad->nb_queues, op_params->burst_sz,
5027f41c6e4dSNicolas Chautru 			op_params->num_to_process, op_params->num_lcores,
5028f41c6e4dSNicolas Chautru 			op_type_str,
5029f41c6e4dSNicolas Chautru 			intr_enabled ? "Interrupt mode" : "PMD mode",
5030f41c6e4dSNicolas Chautru 			(double)rte_get_tsc_hz() / 1000000000.0);
5031f41c6e4dSNicolas Chautru 
5032f41c6e4dSNicolas Chautru 	/* Set number of lcores */
5033f41c6e4dSNicolas Chautru 	num_lcores = (ad->nb_queues < (op_params->num_lcores))
5034f41c6e4dSNicolas Chautru 			? ad->nb_queues
5035f41c6e4dSNicolas Chautru 			: op_params->num_lcores;
5036f41c6e4dSNicolas Chautru 
5037f41c6e4dSNicolas Chautru 	/* Allocate memory for thread parameters structure */
5038f41c6e4dSNicolas Chautru 	t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params),
5039f41c6e4dSNicolas Chautru 			RTE_CACHE_LINE_SIZE);
5040f41c6e4dSNicolas Chautru 	TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params",
5041f41c6e4dSNicolas Chautru 			RTE_ALIGN(sizeof(struct thread_params) * num_lcores,
5042f41c6e4dSNicolas Chautru 				RTE_CACHE_LINE_SIZE));
5043f41c6e4dSNicolas Chautru 
50447456706aSNicolas Chautru 	if ((test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) &&
50457456706aSNicolas Chautru 			!check_bit(test_vector.ldpc_dec.op_flags,
50467456706aSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
50477456706aSNicolas Chautru 			&& !check_bit(test_vector.ldpc_dec.op_flags,
50487456706aSNicolas Chautru 			RTE_BBDEV_LDPC_LLR_COMPRESSION))
5049f41c6e4dSNicolas Chautru 		bler_function = bler_pmd_lcore_ldpc_dec;
50507831a968SHernan Vargas 	else if ((test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) &&
50517831a968SHernan Vargas 			!check_bit(test_vector.turbo_dec.op_flags,
50527831a968SHernan Vargas 			RTE_BBDEV_TURBO_SOFT_OUTPUT))
50537831a968SHernan Vargas 		bler_function = bler_pmd_lcore_turbo_dec;
5054f41c6e4dSNicolas Chautru 	else
5055f41c6e4dSNicolas Chautru 		return TEST_SKIPPED;
5056f41c6e4dSNicolas Chautru 
5057b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&op_params->sync, SYNC_WAIT, rte_memory_order_relaxed);
5058f41c6e4dSNicolas Chautru 
5059cb056611SStephen Hemminger 	/* Main core is set at first entry */
5060f41c6e4dSNicolas Chautru 	t_params[0].dev_id = ad->dev_id;
5061f41c6e4dSNicolas Chautru 	t_params[0].lcore_id = rte_lcore_id();
5062f41c6e4dSNicolas Chautru 	t_params[0].op_params = op_params;
5063f41c6e4dSNicolas Chautru 	t_params[0].queue_id = ad->queue_ids[used_cores++];
5064f41c6e4dSNicolas Chautru 	t_params[0].iter_count = 0;
5065f41c6e4dSNicolas Chautru 
5066cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
5067f41c6e4dSNicolas Chautru 		if (used_cores >= num_lcores)
5068f41c6e4dSNicolas Chautru 			break;
5069f41c6e4dSNicolas Chautru 
5070f41c6e4dSNicolas Chautru 		t_params[used_cores].dev_id = ad->dev_id;
5071f41c6e4dSNicolas Chautru 		t_params[used_cores].lcore_id = lcore_id;
5072f41c6e4dSNicolas Chautru 		t_params[used_cores].op_params = op_params;
5073f41c6e4dSNicolas Chautru 		t_params[used_cores].queue_id = ad->queue_ids[used_cores];
5074f41c6e4dSNicolas Chautru 		t_params[used_cores].iter_count = 0;
5075f41c6e4dSNicolas Chautru 
5076f41c6e4dSNicolas Chautru 		rte_eal_remote_launch(bler_function,
5077f41c6e4dSNicolas Chautru 				&t_params[used_cores++], lcore_id);
5078f41c6e4dSNicolas Chautru 	}
5079f41c6e4dSNicolas Chautru 
5080b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&op_params->sync, SYNC_START, rte_memory_order_relaxed);
5081f41c6e4dSNicolas Chautru 	ret = bler_function(&t_params[0]);
5082f41c6e4dSNicolas Chautru 
5083cb056611SStephen Hemminger 	/* Main core is always used */
5084f41c6e4dSNicolas Chautru 	for (used_cores = 1; used_cores < num_lcores; used_cores++)
5085f41c6e4dSNicolas Chautru 		ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id);
5086f41c6e4dSNicolas Chautru 
5087f41c6e4dSNicolas Chautru 	print_dec_bler(t_params, num_lcores);
5088f41c6e4dSNicolas Chautru 
5089f41c6e4dSNicolas Chautru 	/* Return if test failed */
5090f41c6e4dSNicolas Chautru 	if (ret) {
5091f41c6e4dSNicolas Chautru 		rte_free(t_params);
5092f41c6e4dSNicolas Chautru 		return ret;
5093f41c6e4dSNicolas Chautru 	}
5094f41c6e4dSNicolas Chautru 
5095f41c6e4dSNicolas Chautru 	/* Function to print something  here*/
5096f41c6e4dSNicolas Chautru 	rte_free(t_params);
5097f41c6e4dSNicolas Chautru 	return ret;
5098f41c6e4dSNicolas Chautru }
5099f41c6e4dSNicolas Chautru 
5100f714a188SAmr Mokhtar /*
5101f714a188SAmr Mokhtar  * Test function that determines how long an enqueue + dequeue of a burst
5102f714a188SAmr Mokhtar  * takes on available lcores.
5103f714a188SAmr Mokhtar  */
5104f714a188SAmr Mokhtar static int
5105f714a188SAmr Mokhtar throughput_test(struct active_device *ad,
5106f714a188SAmr Mokhtar 		struct test_op_params *op_params)
5107f714a188SAmr Mokhtar {
5108f714a188SAmr Mokhtar 	int ret;
5109f714a188SAmr Mokhtar 	unsigned int lcore_id, used_cores = 0;
5110b2e2aec3SKamil Chalupnik 	struct thread_params *t_params, *tp;
5111f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
5112f714a188SAmr Mokhtar 	lcore_function_t *throughput_function;
5113f714a188SAmr Mokhtar 	uint16_t num_lcores;
5114f714a188SAmr Mokhtar 	const char *op_type_str;
5115f714a188SAmr Mokhtar 
5116f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
5117f714a188SAmr Mokhtar 
5118f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(test_vector.op_type);
5119f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u",
5120f714a188SAmr Mokhtar 			test_vector.op_type);
5121f714a188SAmr Mokhtar 
5122d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
5123d819c083SNicolas Chautru 	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",
5124f714a188SAmr Mokhtar 			info.dev_name, ad->nb_queues, op_params->burst_sz,
5125f714a188SAmr Mokhtar 			op_params->num_to_process, op_params->num_lcores,
5126f714a188SAmr Mokhtar 			op_type_str,
5127f714a188SAmr Mokhtar 			intr_enabled ? "Interrupt mode" : "PMD mode",
5128f714a188SAmr Mokhtar 			(double)rte_get_tsc_hz() / 1000000000.0);
5129f714a188SAmr Mokhtar 
5130f714a188SAmr Mokhtar 	/* Set number of lcores */
5131f714a188SAmr Mokhtar 	num_lcores = (ad->nb_queues < (op_params->num_lcores))
5132f714a188SAmr Mokhtar 			? ad->nb_queues
5133f714a188SAmr Mokhtar 			: op_params->num_lcores;
5134f714a188SAmr Mokhtar 
5135b2e2aec3SKamil Chalupnik 	/* Allocate memory for thread parameters structure */
5136b2e2aec3SKamil Chalupnik 	t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params),
5137b2e2aec3SKamil Chalupnik 			RTE_CACHE_LINE_SIZE);
5138b2e2aec3SKamil Chalupnik 	TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params",
5139b2e2aec3SKamil Chalupnik 			RTE_ALIGN(sizeof(struct thread_params) * num_lcores,
5140b2e2aec3SKamil Chalupnik 				RTE_CACHE_LINE_SIZE));
5141b2e2aec3SKamil Chalupnik 
5142f714a188SAmr Mokhtar 	if (intr_enabled) {
5143f714a188SAmr Mokhtar 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
5144f714a188SAmr Mokhtar 			throughput_function = throughput_intr_lcore_dec;
5145d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
5146f162c475SNicolas Chautru 			throughput_function = throughput_intr_lcore_ldpc_dec;
5147d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
5148d819c083SNicolas Chautru 			throughput_function = throughput_intr_lcore_enc;
5149d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
5150f162c475SNicolas Chautru 			throughput_function = throughput_intr_lcore_ldpc_enc;
51510acdb986SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_FFT)
51520acdb986SNicolas Chautru 			throughput_function = throughput_intr_lcore_fft;
515395f192a4SHernan Vargas 		else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS)
515495f192a4SHernan Vargas 			throughput_function = throughput_intr_lcore_mldts;
5155f714a188SAmr Mokhtar 		else
5156f714a188SAmr Mokhtar 			throughput_function = throughput_intr_lcore_enc;
5157f714a188SAmr Mokhtar 
5158f714a188SAmr Mokhtar 		/* Dequeue interrupt callback registration */
5159d3345d40SAmr Mokhtar 		ret = rte_bbdev_callback_register(ad->dev_id,
5160d3345d40SAmr Mokhtar 				RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback,
5161b2e2aec3SKamil Chalupnik 				t_params);
5162b2e2aec3SKamil Chalupnik 		if (ret < 0) {
5163b2e2aec3SKamil Chalupnik 			rte_free(t_params);
5164d3345d40SAmr Mokhtar 			return ret;
5165b2e2aec3SKamil Chalupnik 		}
5166f714a188SAmr Mokhtar 	} else {
5167f714a188SAmr Mokhtar 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
5168f714a188SAmr Mokhtar 			throughput_function = throughput_pmd_lcore_dec;
5169d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
5170d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_ldpc_dec;
5171d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
5172d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_enc;
5173d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
5174d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_ldpc_enc;
51750acdb986SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_FFT)
51760acdb986SNicolas Chautru 			throughput_function = throughput_pmd_lcore_fft;
517795f192a4SHernan Vargas 		else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS)
517895f192a4SHernan Vargas 			throughput_function = throughput_pmd_lcore_mldts;
5179f714a188SAmr Mokhtar 		else
5180f714a188SAmr Mokhtar 			throughput_function = throughput_pmd_lcore_enc;
5181f714a188SAmr Mokhtar 	}
5182f714a188SAmr Mokhtar 
5183b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&op_params->sync, SYNC_WAIT, rte_memory_order_relaxed);
5184f714a188SAmr Mokhtar 
5185cb056611SStephen Hemminger 	/* Main core is set at first entry */
5186b2e2aec3SKamil Chalupnik 	t_params[0].dev_id = ad->dev_id;
5187b2e2aec3SKamil Chalupnik 	t_params[0].lcore_id = rte_lcore_id();
5188b2e2aec3SKamil Chalupnik 	t_params[0].op_params = op_params;
5189b2e2aec3SKamil Chalupnik 	t_params[0].queue_id = ad->queue_ids[used_cores++];
5190b2e2aec3SKamil Chalupnik 	t_params[0].iter_count = 0;
5191f714a188SAmr Mokhtar 
5192cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
5193f714a188SAmr Mokhtar 		if (used_cores >= num_lcores)
5194f714a188SAmr Mokhtar 			break;
5195f714a188SAmr Mokhtar 
5196b2e2aec3SKamil Chalupnik 		t_params[used_cores].dev_id = ad->dev_id;
5197b2e2aec3SKamil Chalupnik 		t_params[used_cores].lcore_id = lcore_id;
5198b2e2aec3SKamil Chalupnik 		t_params[used_cores].op_params = op_params;
5199b2e2aec3SKamil Chalupnik 		t_params[used_cores].queue_id = ad->queue_ids[used_cores];
5200b2e2aec3SKamil Chalupnik 		t_params[used_cores].iter_count = 0;
5201f714a188SAmr Mokhtar 
5202b2e2aec3SKamil Chalupnik 		rte_eal_remote_launch(throughput_function,
5203b2e2aec3SKamil Chalupnik 				&t_params[used_cores++], lcore_id);
5204f714a188SAmr Mokhtar 	}
5205f714a188SAmr Mokhtar 
5206b6a7e685STyler Retzlaff 	rte_atomic_store_explicit(&op_params->sync, SYNC_START, rte_memory_order_relaxed);
5207b2e2aec3SKamil Chalupnik 	ret = throughput_function(&t_params[0]);
5208f714a188SAmr Mokhtar 
5209cb056611SStephen Hemminger 	/* Main core is always used */
5210b2e2aec3SKamil Chalupnik 	for (used_cores = 1; used_cores < num_lcores; used_cores++)
5211b2e2aec3SKamil Chalupnik 		ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id);
5212f714a188SAmr Mokhtar 
5213f714a188SAmr Mokhtar 	/* Return if test failed */
5214b2e2aec3SKamil Chalupnik 	if (ret) {
5215b2e2aec3SKamil Chalupnik 		rte_free(t_params);
5216f714a188SAmr Mokhtar 		return ret;
5217b2e2aec3SKamil Chalupnik 	}
5218f714a188SAmr Mokhtar 
5219f714a188SAmr Mokhtar 	/* Print throughput if interrupts are disabled and test passed */
5220f714a188SAmr Mokhtar 	if (!intr_enabled) {
5221d819c083SNicolas Chautru 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
5222d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
52230b98d574SKamil Chalupnik 			print_dec_throughput(t_params, num_lcores);
52240b98d574SKamil Chalupnik 		else
52250b98d574SKamil Chalupnik 			print_enc_throughput(t_params, num_lcores);
5226b2e2aec3SKamil Chalupnik 		rte_free(t_params);
5227f714a188SAmr Mokhtar 		return ret;
5228f714a188SAmr Mokhtar 	}
5229f714a188SAmr Mokhtar 
5230f714a188SAmr Mokhtar 	/* In interrupt TC we need to wait for the interrupt callback to deqeue
5231f714a188SAmr Mokhtar 	 * all pending operations. Skip waiting for queues which reported an
5232f714a188SAmr Mokhtar 	 * error using processing_status variable.
5233cb056611SStephen Hemminger 	 * Wait for main lcore operations.
5234f714a188SAmr Mokhtar 	 */
5235b2e2aec3SKamil Chalupnik 	tp = &t_params[0];
5236b6a7e685STyler Retzlaff 	while ((rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) <
5237f714a188SAmr Mokhtar 		op_params->num_to_process) &&
5238b6a7e685STyler Retzlaff 		(rte_atomic_load_explicit(&tp->processing_status, rte_memory_order_relaxed) !=
5239f714a188SAmr Mokhtar 		TEST_FAILED))
5240f714a188SAmr Mokhtar 		rte_pause();
5241f714a188SAmr Mokhtar 
5242b2e2aec3SKamil Chalupnik 	tp->ops_per_sec /= TEST_REPETITIONS;
5243b2e2aec3SKamil Chalupnik 	tp->mbps /= TEST_REPETITIONS;
5244b6a7e685STyler Retzlaff 	ret |= (int)rte_atomic_load_explicit(&tp->processing_status, rte_memory_order_relaxed);
5245f714a188SAmr Mokhtar 
5246cb056611SStephen Hemminger 	/* Wait for worker lcores operations */
5247b2e2aec3SKamil Chalupnik 	for (used_cores = 1; used_cores < num_lcores; used_cores++) {
5248b2e2aec3SKamil Chalupnik 		tp = &t_params[used_cores];
5249f714a188SAmr Mokhtar 
5250b6a7e685STyler Retzlaff 		while ((rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) <
5251f714a188SAmr Mokhtar 			op_params->num_to_process) &&
5252b6a7e685STyler Retzlaff 			(rte_atomic_load_explicit(&tp->processing_status,
5253b6a7e685STyler Retzlaff 					rte_memory_order_relaxed) != TEST_FAILED))
5254f714a188SAmr Mokhtar 			rte_pause();
5255f714a188SAmr Mokhtar 
5256b2e2aec3SKamil Chalupnik 		tp->ops_per_sec /= TEST_REPETITIONS;
5257b2e2aec3SKamil Chalupnik 		tp->mbps /= TEST_REPETITIONS;
5258b6a7e685STyler Retzlaff 		ret |= (int)rte_atomic_load_explicit(&tp->processing_status,
5259b6a7e685STyler Retzlaff 				rte_memory_order_relaxed);
5260f714a188SAmr Mokhtar 	}
5261f714a188SAmr Mokhtar 
5262f714a188SAmr Mokhtar 	/* Print throughput if test passed */
52630b98d574SKamil Chalupnik 	if (!ret) {
5264d819c083SNicolas Chautru 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
5265d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
52660b98d574SKamil Chalupnik 			print_dec_throughput(t_params, num_lcores);
5267d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC ||
5268d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
52690b98d574SKamil Chalupnik 			print_enc_throughput(t_params, num_lcores);
52700b98d574SKamil Chalupnik 	}
5271b2e2aec3SKamil Chalupnik 
5272b2e2aec3SKamil Chalupnik 	rte_free(t_params);
5273f714a188SAmr Mokhtar 	return ret;
5274f714a188SAmr Mokhtar }
5275f714a188SAmr Mokhtar 
5276f714a188SAmr Mokhtar static int
5277864edd69SKamil Chalupnik latency_test_dec(struct rte_mempool *mempool,
5278f714a188SAmr Mokhtar 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
5279de2ce637SHernan Vargas 		uint16_t dev_id, uint16_t queue_id,
5280f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
52813073445dSHernan Vargas 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time, bool disable_et)
5282f714a188SAmr Mokhtar {
5283f714a188SAmr Mokhtar 	int ret = TEST_SUCCESS;
5284f714a188SAmr Mokhtar 	uint16_t i, j, dequeued;
5285f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
5286864edd69SKamil Chalupnik 	uint64_t start_time = 0, last_time = 0;
5287f714a188SAmr Mokhtar 
5288f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
5289f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
5290fb5e060eSHernan Vargas 		uint32_t time_out = 0;
5291f714a188SAmr Mokhtar 		bool first_time = true;
5292864edd69SKamil Chalupnik 		last_time = 0;
5293f714a188SAmr Mokhtar 
5294f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
5295f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
5296f714a188SAmr Mokhtar 
5297b1bc4217SKamil Chalupnik 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
52983073445dSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed");
52993073445dSHernan Vargas 
53003073445dSHernan Vargas 		ref_op->turbo_dec.iter_max = get_iter_max();
53013073445dSHernan Vargas 		/* For validation tests we want to enable early termination */
53023073445dSHernan Vargas 		if (!disable_et && !check_bit(ref_op->turbo_dec.op_flags,
53033073445dSHernan Vargas 				RTE_BBDEV_TURBO_EARLY_TERMINATION))
53043073445dSHernan Vargas 			ref_op->turbo_dec.op_flags |= RTE_BBDEV_TURBO_EARLY_TERMINATION;
53053073445dSHernan Vargas 
5306f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
5307f714a188SAmr Mokhtar 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
5308f714a188SAmr Mokhtar 					bufs->inputs,
5309f714a188SAmr Mokhtar 					bufs->hard_outputs,
5310f714a188SAmr Mokhtar 					bufs->soft_outputs,
5311f714a188SAmr Mokhtar 					ref_op);
5312f714a188SAmr Mokhtar 
5313f714a188SAmr Mokhtar 		/* Set counter to validate the ordering */
5314f714a188SAmr Mokhtar 		for (j = 0; j < burst_sz; ++j)
5315f714a188SAmr Mokhtar 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
5316f714a188SAmr Mokhtar 
5317f714a188SAmr Mokhtar 		start_time = rte_rdtsc_precise();
5318f714a188SAmr Mokhtar 
5319f714a188SAmr Mokhtar 		enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq],
5320f714a188SAmr Mokhtar 				burst_sz);
5321f714a188SAmr Mokhtar 		TEST_ASSERT(enq == burst_sz,
5322f714a188SAmr Mokhtar 				"Error enqueueing burst, expected %u, got %u",
5323f714a188SAmr Mokhtar 				burst_sz, enq);
5324f714a188SAmr Mokhtar 
5325f714a188SAmr Mokhtar 		/* Dequeue */
5326f714a188SAmr Mokhtar 		do {
5327f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
5328f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
5329f714a188SAmr Mokhtar 			if (likely(first_time && (deq > 0))) {
5330864edd69SKamil Chalupnik 				last_time = rte_rdtsc_precise() - start_time;
5331f714a188SAmr Mokhtar 				first_time = false;
5332f714a188SAmr Mokhtar 			}
5333fb5e060eSHernan Vargas 			time_out++;
5334fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
5335fb5e060eSHernan Vargas 				timeout_exit(dev_id);
5336fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
5337fb5e060eSHernan Vargas 			}
5338f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != deq));
5339f714a188SAmr Mokhtar 
5340864edd69SKamil Chalupnik 		*max_time = RTE_MAX(*max_time, last_time);
5341864edd69SKamil Chalupnik 		*min_time = RTE_MIN(*min_time, last_time);
5342864edd69SKamil Chalupnik 		*total_time += last_time;
5343864edd69SKamil Chalupnik 
5344f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
5345de2ce637SHernan Vargas 			ret = validate_dec_op(ops_deq, burst_sz, ref_op);
5346f714a188SAmr Mokhtar 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
5347f714a188SAmr Mokhtar 		}
5348f714a188SAmr Mokhtar 
5349f714a188SAmr Mokhtar 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
5350f714a188SAmr Mokhtar 		dequeued += deq;
5351f714a188SAmr Mokhtar 	}
5352f714a188SAmr Mokhtar 
5353f714a188SAmr Mokhtar 	return i;
5354f714a188SAmr Mokhtar }
5355f714a188SAmr Mokhtar 
53560ab66275SNicolas Chautru /* Test case for latency/validation for LDPC Decoder */
5357f714a188SAmr Mokhtar static int
5358d819c083SNicolas Chautru latency_test_ldpc_dec(struct rte_mempool *mempool,
5359d819c083SNicolas Chautru 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
5360d819c083SNicolas Chautru 		int vector_mask, uint16_t dev_id, uint16_t queue_id,
5361d819c083SNicolas Chautru 		const uint16_t num_to_process, uint16_t burst_sz,
53620ab66275SNicolas Chautru 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time,
53630ab66275SNicolas Chautru 		bool disable_et)
5364d819c083SNicolas Chautru {
5365d819c083SNicolas Chautru 	int ret = TEST_SUCCESS;
5366d819c083SNicolas Chautru 	uint16_t i, j, dequeued;
5367d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
5368d819c083SNicolas Chautru 	uint64_t start_time = 0, last_time = 0;
5369335c11fdSNicolas Chautru 	bool extDdr = ldpc_cap_flags &
5370335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
5371d819c083SNicolas Chautru 
5372d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
5373d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
5374d1bfc723SHernan Vargas 		uint32_t time_out = 0;
5375d819c083SNicolas Chautru 		bool first_time = true;
5376d819c083SNicolas Chautru 		last_time = 0;
5377d819c083SNicolas Chautru 
5378d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
5379d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
5380d819c083SNicolas Chautru 
5381d819c083SNicolas Chautru 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
5382d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
5383d819c083SNicolas Chautru 				"rte_bbdev_dec_op_alloc_bulk() failed");
5384335c11fdSNicolas Chautru 
5385335c11fdSNicolas Chautru 		/* For latency tests we need to disable early termination */
53860ab66275SNicolas Chautru 		if (disable_et && check_bit(ref_op->ldpc_dec.op_flags,
5387335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
53883073445dSHernan Vargas 			ref_op->ldpc_dec.op_flags -= RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
53893073445dSHernan Vargas 
5390f41c6e4dSNicolas Chautru 		ref_op->ldpc_dec.iter_max = get_iter_max();
53913073445dSHernan Vargas 		/* When ET is disabled, the expected iter_count is iter_max */
53923073445dSHernan Vargas 		if (disable_et)
5393335c11fdSNicolas Chautru 			ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
5394335c11fdSNicolas Chautru 
5395d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
5396d819c083SNicolas Chautru 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
5397d819c083SNicolas Chautru 					bufs->inputs,
5398d819c083SNicolas Chautru 					bufs->hard_outputs,
5399d819c083SNicolas Chautru 					bufs->soft_outputs,
5400d819c083SNicolas Chautru 					bufs->harq_inputs,
5401d819c083SNicolas Chautru 					bufs->harq_outputs,
5402d819c083SNicolas Chautru 					ref_op);
5403d819c083SNicolas Chautru 
5404335c11fdSNicolas Chautru 		if (extDdr)
5405335c11fdSNicolas Chautru 			preload_harq_ddr(dev_id, queue_id, ops_enq,
5406335c11fdSNicolas Chautru 					burst_sz, true);
5407335c11fdSNicolas Chautru 
5408d819c083SNicolas Chautru 		/* Set counter to validate the ordering */
5409d819c083SNicolas Chautru 		for (j = 0; j < burst_sz; ++j)
5410d819c083SNicolas Chautru 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
5411d819c083SNicolas Chautru 
5412d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
5413d819c083SNicolas Chautru 
5414d819c083SNicolas Chautru 		enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
5415d819c083SNicolas Chautru 				&ops_enq[enq], burst_sz);
5416d819c083SNicolas Chautru 		TEST_ASSERT(enq == burst_sz,
5417d819c083SNicolas Chautru 				"Error enqueueing burst, expected %u, got %u",
5418d819c083SNicolas Chautru 				burst_sz, enq);
5419d819c083SNicolas Chautru 
5420d819c083SNicolas Chautru 		/* Dequeue */
5421d819c083SNicolas Chautru 		do {
5422d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
5423d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
5424d819c083SNicolas Chautru 			if (likely(first_time && (deq > 0))) {
5425d819c083SNicolas Chautru 				last_time = rte_rdtsc_precise() - start_time;
5426d819c083SNicolas Chautru 				first_time = false;
5427d819c083SNicolas Chautru 			}
5428d1bfc723SHernan Vargas 			time_out++;
5429fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
5430fb5e060eSHernan Vargas 				timeout_exit(dev_id);
5431fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
5432fb5e060eSHernan Vargas 			}
5433fb5e060eSHernan Vargas 		} while (unlikely(burst_sz != deq));
5434d819c083SNicolas Chautru 
5435d819c083SNicolas Chautru 		*max_time = RTE_MAX(*max_time, last_time);
5436d819c083SNicolas Chautru 		*min_time = RTE_MIN(*min_time, last_time);
5437d819c083SNicolas Chautru 		*total_time += last_time;
5438d819c083SNicolas Chautru 
5439335c11fdSNicolas Chautru 		if (extDdr)
5440335c11fdSNicolas Chautru 			retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz);
5441335c11fdSNicolas Chautru 
5442fb5e060eSHernan Vargas 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
5443fb5e060eSHernan Vargas 			ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, vector_mask);
5444d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
5445d819c083SNicolas Chautru 		}
5446d819c083SNicolas Chautru 
5447d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
5448d819c083SNicolas Chautru 		dequeued += deq;
5449d819c083SNicolas Chautru 	}
5450d819c083SNicolas Chautru 	return i;
5451d819c083SNicolas Chautru }
5452d819c083SNicolas Chautru 
5453d819c083SNicolas Chautru static int
5454864edd69SKamil Chalupnik latency_test_enc(struct rte_mempool *mempool,
5455f714a188SAmr Mokhtar 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
5456f714a188SAmr Mokhtar 		uint16_t dev_id, uint16_t queue_id,
5457f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
5458864edd69SKamil Chalupnik 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
5459f714a188SAmr Mokhtar {
5460f714a188SAmr Mokhtar 	int ret = TEST_SUCCESS;
5461f714a188SAmr Mokhtar 	uint16_t i, j, dequeued;
5462f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
5463864edd69SKamil Chalupnik 	uint64_t start_time = 0, last_time = 0;
5464f714a188SAmr Mokhtar 
5465f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
5466f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
5467d1bfc723SHernan Vargas 		uint32_t time_out = 0;
5468f714a188SAmr Mokhtar 		bool first_time = true;
5469864edd69SKamil Chalupnik 		last_time = 0;
5470f714a188SAmr Mokhtar 
5471f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
5472f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
5473f714a188SAmr Mokhtar 
5474b1bc4217SKamil Chalupnik 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
5475b1bc4217SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
5476b1bc4217SKamil Chalupnik 				"rte_bbdev_enc_op_alloc_bulk() failed");
5477f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
5478f714a188SAmr Mokhtar 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
5479f714a188SAmr Mokhtar 					bufs->inputs,
5480f714a188SAmr Mokhtar 					bufs->hard_outputs,
5481f714a188SAmr Mokhtar 					ref_op);
5482f714a188SAmr Mokhtar 
5483f714a188SAmr Mokhtar 		/* Set counter to validate the ordering */
5484f714a188SAmr Mokhtar 		for (j = 0; j < burst_sz; ++j)
5485f714a188SAmr Mokhtar 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
5486f714a188SAmr Mokhtar 
5487f714a188SAmr Mokhtar 		start_time = rte_rdtsc_precise();
5488f714a188SAmr Mokhtar 
5489f714a188SAmr Mokhtar 		enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq],
5490f714a188SAmr Mokhtar 				burst_sz);
5491f714a188SAmr Mokhtar 		TEST_ASSERT(enq == burst_sz,
5492f714a188SAmr Mokhtar 				"Error enqueueing burst, expected %u, got %u",
5493f714a188SAmr Mokhtar 				burst_sz, enq);
5494f714a188SAmr Mokhtar 
5495f714a188SAmr Mokhtar 		/* Dequeue */
5496f714a188SAmr Mokhtar 		do {
5497f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
5498f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
5499f714a188SAmr Mokhtar 			if (likely(first_time && (deq > 0))) {
5500864edd69SKamil Chalupnik 				last_time += rte_rdtsc_precise() - start_time;
5501f714a188SAmr Mokhtar 				first_time = false;
5502f714a188SAmr Mokhtar 			}
5503d1bfc723SHernan Vargas 			time_out++;
5504fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
5505fb5e060eSHernan Vargas 				timeout_exit(dev_id);
5506fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
5507fb5e060eSHernan Vargas 			}
5508fb5e060eSHernan Vargas 		} while (unlikely(burst_sz != deq));
5509f714a188SAmr Mokhtar 
5510864edd69SKamil Chalupnik 		*max_time = RTE_MAX(*max_time, last_time);
5511864edd69SKamil Chalupnik 		*min_time = RTE_MIN(*min_time, last_time);
5512864edd69SKamil Chalupnik 		*total_time += last_time;
5513fb5e060eSHernan Vargas 
5514fb5e060eSHernan Vargas 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
5515f714a188SAmr Mokhtar 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
5516f714a188SAmr Mokhtar 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
5517f714a188SAmr Mokhtar 		}
5518f714a188SAmr Mokhtar 
5519f714a188SAmr Mokhtar 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
5520f714a188SAmr Mokhtar 		dequeued += deq;
5521f714a188SAmr Mokhtar 	}
5522f714a188SAmr Mokhtar 
5523f714a188SAmr Mokhtar 	return i;
5524f714a188SAmr Mokhtar }
5525f714a188SAmr Mokhtar 
5526f714a188SAmr Mokhtar static int
5527d819c083SNicolas Chautru latency_test_ldpc_enc(struct rte_mempool *mempool,
5528d819c083SNicolas Chautru 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
5529d819c083SNicolas Chautru 		uint16_t dev_id, uint16_t queue_id,
5530d819c083SNicolas Chautru 		const uint16_t num_to_process, uint16_t burst_sz,
5531d819c083SNicolas Chautru 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
5532d819c083SNicolas Chautru {
5533d819c083SNicolas Chautru 	int ret = TEST_SUCCESS;
5534d819c083SNicolas Chautru 	uint16_t i, j, dequeued;
5535d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
5536d819c083SNicolas Chautru 	uint64_t start_time = 0, last_time = 0;
5537d819c083SNicolas Chautru 
5538d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
5539d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
5540fb5e060eSHernan Vargas 		uint32_t time_out = 0;
5541d819c083SNicolas Chautru 		bool first_time = true;
5542d819c083SNicolas Chautru 		last_time = 0;
5543d819c083SNicolas Chautru 
5544d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
5545d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
5546d819c083SNicolas Chautru 
5547d819c083SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
5548d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
5549d819c083SNicolas Chautru 				"rte_bbdev_enc_op_alloc_bulk() failed");
5550d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
5551d819c083SNicolas Chautru 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
5552d819c083SNicolas Chautru 					bufs->inputs,
5553d819c083SNicolas Chautru 					bufs->hard_outputs,
5554d819c083SNicolas Chautru 					ref_op);
5555d819c083SNicolas Chautru 
5556d819c083SNicolas Chautru 		/* Set counter to validate the ordering */
5557d819c083SNicolas Chautru 		for (j = 0; j < burst_sz; ++j)
5558d819c083SNicolas Chautru 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
5559d819c083SNicolas Chautru 
5560d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
5561d819c083SNicolas Chautru 
5562d819c083SNicolas Chautru 		enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
5563d819c083SNicolas Chautru 				&ops_enq[enq], burst_sz);
5564d819c083SNicolas Chautru 		TEST_ASSERT(enq == burst_sz,
5565d819c083SNicolas Chautru 				"Error enqueueing burst, expected %u, got %u",
5566d819c083SNicolas Chautru 				burst_sz, enq);
5567d819c083SNicolas Chautru 
5568d819c083SNicolas Chautru 		/* Dequeue */
5569d819c083SNicolas Chautru 		do {
5570d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
5571d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
5572d819c083SNicolas Chautru 			if (likely(first_time && (deq > 0))) {
5573d819c083SNicolas Chautru 				last_time += rte_rdtsc_precise() - start_time;
5574d819c083SNicolas Chautru 				first_time = false;
5575d819c083SNicolas Chautru 			}
5576fb5e060eSHernan Vargas 			time_out++;
5577fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
5578fb5e060eSHernan Vargas 				timeout_exit(dev_id);
5579fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
5580fb5e060eSHernan Vargas 			}
5581d819c083SNicolas Chautru 		} while (unlikely(burst_sz != deq));
5582d819c083SNicolas Chautru 
5583d819c083SNicolas Chautru 		*max_time = RTE_MAX(*max_time, last_time);
5584d819c083SNicolas Chautru 		*min_time = RTE_MIN(*min_time, last_time);
5585d819c083SNicolas Chautru 		*total_time += last_time;
5586d819c083SNicolas Chautru 
5587d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
5588d819c083SNicolas Chautru 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
5589d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
5590d819c083SNicolas Chautru 		}
5591d819c083SNicolas Chautru 
5592d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
5593d819c083SNicolas Chautru 		dequeued += deq;
5594d819c083SNicolas Chautru 	}
5595d819c083SNicolas Chautru 
5596d819c083SNicolas Chautru 	return i;
5597d819c083SNicolas Chautru }
5598d819c083SNicolas Chautru 
55990acdb986SNicolas Chautru 
56000acdb986SNicolas Chautru static int
56010acdb986SNicolas Chautru latency_test_fft(struct rte_mempool *mempool,
56020acdb986SNicolas Chautru 		struct test_buffers *bufs, struct rte_bbdev_fft_op *ref_op,
56030acdb986SNicolas Chautru 		uint16_t dev_id, uint16_t queue_id,
56040acdb986SNicolas Chautru 		const uint16_t num_to_process, uint16_t burst_sz,
56050acdb986SNicolas Chautru 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
56060acdb986SNicolas Chautru {
56070acdb986SNicolas Chautru 	int ret = TEST_SUCCESS;
56080acdb986SNicolas Chautru 	uint16_t i, j, dequeued;
56090acdb986SNicolas Chautru 	struct rte_bbdev_fft_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
56100acdb986SNicolas Chautru 	uint64_t start_time = 0, last_time = 0;
56110acdb986SNicolas Chautru 
56120acdb986SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
56130acdb986SNicolas Chautru 		uint16_t enq = 0, deq = 0;
5614fb5e060eSHernan Vargas 		uint32_t time_out = 0;
56150acdb986SNicolas Chautru 		bool first_time = true;
56160acdb986SNicolas Chautru 		last_time = 0;
56170acdb986SNicolas Chautru 
56180acdb986SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
56190acdb986SNicolas Chautru 			burst_sz = num_to_process - dequeued;
56200acdb986SNicolas Chautru 
56210acdb986SNicolas Chautru 		ret = rte_bbdev_fft_op_alloc_bulk(mempool, ops_enq, burst_sz);
56220acdb986SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
56230acdb986SNicolas Chautru 				"rte_bbdev_fft_op_alloc_bulk() failed");
56240acdb986SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
56250acdb986SNicolas Chautru 			copy_reference_fft_op(ops_enq, burst_sz, dequeued,
56260acdb986SNicolas Chautru 					bufs->inputs,
56270ed76d66SHernan Vargas 					bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs,
56280acdb986SNicolas Chautru 					ref_op);
56290acdb986SNicolas Chautru 
56300acdb986SNicolas Chautru 		/* Set counter to validate the ordering */
56310acdb986SNicolas Chautru 		for (j = 0; j < burst_sz; ++j)
56320acdb986SNicolas Chautru 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
56330acdb986SNicolas Chautru 
56340acdb986SNicolas Chautru 		start_time = rte_rdtsc_precise();
56350acdb986SNicolas Chautru 
56360acdb986SNicolas Chautru 		enq = rte_bbdev_enqueue_fft_ops(dev_id, queue_id,
56370acdb986SNicolas Chautru 				&ops_enq[enq], burst_sz);
56380acdb986SNicolas Chautru 		TEST_ASSERT(enq == burst_sz,
56390acdb986SNicolas Chautru 				"Error enqueueing burst, expected %u, got %u",
56400acdb986SNicolas Chautru 				burst_sz, enq);
56410acdb986SNicolas Chautru 
56420acdb986SNicolas Chautru 		/* Dequeue */
56430acdb986SNicolas Chautru 		do {
56440acdb986SNicolas Chautru 			deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id,
56450acdb986SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
56460acdb986SNicolas Chautru 			if (likely(first_time && (deq > 0))) {
56470acdb986SNicolas Chautru 				last_time += rte_rdtsc_precise() - start_time;
56480acdb986SNicolas Chautru 				first_time = false;
56490acdb986SNicolas Chautru 			}
5650fb5e060eSHernan Vargas 			time_out++;
5651fb5e060eSHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
5652fb5e060eSHernan Vargas 				timeout_exit(dev_id);
5653fb5e060eSHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
5654fb5e060eSHernan Vargas 			}
56550acdb986SNicolas Chautru 		} while (unlikely(burst_sz != deq));
56560acdb986SNicolas Chautru 
56570acdb986SNicolas Chautru 		*max_time = RTE_MAX(*max_time, last_time);
56580acdb986SNicolas Chautru 		*min_time = RTE_MIN(*min_time, last_time);
56590acdb986SNicolas Chautru 		*total_time += last_time;
56600acdb986SNicolas Chautru 
56610acdb986SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
56620acdb986SNicolas Chautru 			ret = validate_fft_op(ops_deq, burst_sz, ref_op);
56630acdb986SNicolas Chautru 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
56640acdb986SNicolas Chautru 		}
56650acdb986SNicolas Chautru 
56660acdb986SNicolas Chautru 		rte_bbdev_fft_op_free_bulk(ops_enq, deq);
56670acdb986SNicolas Chautru 		dequeued += deq;
56680acdb986SNicolas Chautru 	}
56690acdb986SNicolas Chautru 
56700acdb986SNicolas Chautru 	return i;
56710acdb986SNicolas Chautru }
56720acdb986SNicolas Chautru 
567395f192a4SHernan Vargas static int
567495f192a4SHernan Vargas latency_test_mldts(struct rte_mempool *mempool,
567595f192a4SHernan Vargas 		struct test_buffers *bufs, struct rte_bbdev_mldts_op *ref_op,
567695f192a4SHernan Vargas 		uint16_t dev_id, uint16_t queue_id,
567795f192a4SHernan Vargas 		const uint16_t num_to_process, uint16_t burst_sz,
567895f192a4SHernan Vargas 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
567995f192a4SHernan Vargas {
568095f192a4SHernan Vargas 	int ret = TEST_SUCCESS;
568195f192a4SHernan Vargas 	uint16_t i, j, dequeued;
568295f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
568395f192a4SHernan Vargas 	uint64_t start_time = 0, last_time = 0;
568495f192a4SHernan Vargas 
568595f192a4SHernan Vargas 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
568695f192a4SHernan Vargas 		uint16_t enq = 0, deq = 0;
568795f192a4SHernan Vargas 		uint32_t time_out = 0;
568895f192a4SHernan Vargas 		bool first_time = true;
568995f192a4SHernan Vargas 		last_time = 0;
569095f192a4SHernan Vargas 
569195f192a4SHernan Vargas 		if (unlikely(num_to_process - dequeued < burst_sz))
569295f192a4SHernan Vargas 			burst_sz = num_to_process - dequeued;
569395f192a4SHernan Vargas 
569495f192a4SHernan Vargas 		ret = rte_bbdev_mldts_op_alloc_bulk(mempool, ops_enq, burst_sz);
569595f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_mldts_op_alloc_bulk() failed");
569695f192a4SHernan Vargas 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
569795f192a4SHernan Vargas 			copy_reference_mldts_op(ops_enq, burst_sz, dequeued,
569895f192a4SHernan Vargas 					bufs->inputs, bufs->harq_inputs,
569995f192a4SHernan Vargas 					bufs->hard_outputs,
570095f192a4SHernan Vargas 					ref_op);
570195f192a4SHernan Vargas 
570295f192a4SHernan Vargas 		/* Set counter to validate the ordering */
570395f192a4SHernan Vargas 		for (j = 0; j < burst_sz; ++j)
570495f192a4SHernan Vargas 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
570595f192a4SHernan Vargas 
570695f192a4SHernan Vargas 		start_time = rte_rdtsc_precise();
570795f192a4SHernan Vargas 
570895f192a4SHernan Vargas 		enq = rte_bbdev_enqueue_mldts_ops(dev_id, queue_id, &ops_enq[enq], burst_sz);
570995f192a4SHernan Vargas 		TEST_ASSERT(enq == burst_sz,
571095f192a4SHernan Vargas 				"Error enqueueing burst, expected %u, got %u",
571195f192a4SHernan Vargas 				burst_sz, enq);
571295f192a4SHernan Vargas 
571395f192a4SHernan Vargas 		/* Dequeue */
571495f192a4SHernan Vargas 		do {
571595f192a4SHernan Vargas 			deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id,
571695f192a4SHernan Vargas 					&ops_deq[deq], burst_sz - deq);
571795f192a4SHernan Vargas 			if (likely(first_time && (deq > 0))) {
571895f192a4SHernan Vargas 				last_time += rte_rdtsc_precise() - start_time;
571995f192a4SHernan Vargas 				first_time = false;
572095f192a4SHernan Vargas 			}
572195f192a4SHernan Vargas 			time_out++;
572295f192a4SHernan Vargas 			if (time_out >= TIME_OUT_POLL) {
572395f192a4SHernan Vargas 				timeout_exit(dev_id);
572495f192a4SHernan Vargas 				TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!");
572595f192a4SHernan Vargas 			}
572695f192a4SHernan Vargas 		} while (unlikely(burst_sz != deq));
572795f192a4SHernan Vargas 
572895f192a4SHernan Vargas 		*max_time = RTE_MAX(*max_time, last_time);
572995f192a4SHernan Vargas 		*min_time = RTE_MIN(*min_time, last_time);
573095f192a4SHernan Vargas 		*total_time += last_time;
573195f192a4SHernan Vargas 
573295f192a4SHernan Vargas 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
573395f192a4SHernan Vargas 			ret = validate_mldts_op(ops_deq, burst_sz, ref_op);
573495f192a4SHernan Vargas 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
573595f192a4SHernan Vargas 		}
573695f192a4SHernan Vargas 
573795f192a4SHernan Vargas 		rte_bbdev_mldts_op_free_bulk(ops_enq, deq);
573895f192a4SHernan Vargas 		dequeued += deq;
573995f192a4SHernan Vargas 	}
574095f192a4SHernan Vargas 
574195f192a4SHernan Vargas 	return i;
574295f192a4SHernan Vargas }
574395f192a4SHernan Vargas 
57440ab66275SNicolas Chautru /* Common function for running validation and latency test cases */
5745d819c083SNicolas Chautru static int
57460ab66275SNicolas Chautru validation_latency_test(struct active_device *ad,
57470ab66275SNicolas Chautru 		struct test_op_params *op_params, bool latency_flag)
5748f714a188SAmr Mokhtar {
5749f714a188SAmr Mokhtar 	int iter;
5750f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
5751f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
5752f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
5753f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
5754f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
5755f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
5756864edd69SKamil Chalupnik 	uint64_t total_time, min_time, max_time;
5757f714a188SAmr Mokhtar 	const char *op_type_str;
5758f714a188SAmr Mokhtar 
5759864edd69SKamil Chalupnik 	total_time = max_time = 0;
5760864edd69SKamil Chalupnik 	min_time = UINT64_MAX;
5761864edd69SKamil Chalupnik 
5762f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
5763f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
5764f714a188SAmr Mokhtar 
5765f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
5766f714a188SAmr Mokhtar 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
5767f714a188SAmr Mokhtar 
5768f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
5769f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
5770f714a188SAmr Mokhtar 
5771d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
57720ab66275SNicolas Chautru 	if (latency_flag)
57730ab66275SNicolas Chautru 		printf("== test: latency\ndev:");
57740ab66275SNicolas Chautru 	else
57750ab66275SNicolas Chautru 		printf("== test: validation\ndev:");
57760ab66275SNicolas Chautru 	printf("%s, burst size: %u, num ops: %u, op type: %s\n",
5777f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
5778f714a188SAmr Mokhtar 
5779f714a188SAmr Mokhtar 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
5780864edd69SKamil Chalupnik 		iter = latency_test_dec(op_params->mp, bufs,
5781de2ce637SHernan Vargas 				op_params->ref_dec_op, ad->dev_id, queue_id,
5782de2ce637SHernan Vargas 				num_to_process, burst_sz, &total_time,
5783de2ce637SHernan Vargas 				&min_time, &max_time, latency_flag);
5784d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
5785d819c083SNicolas Chautru 		iter = latency_test_ldpc_enc(op_params->mp, bufs,
5786d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
5787d819c083SNicolas Chautru 				num_to_process, burst_sz, &total_time,
5788d819c083SNicolas Chautru 				&min_time, &max_time);
5789d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
5790d819c083SNicolas Chautru 		iter = latency_test_ldpc_dec(op_params->mp, bufs,
5791d819c083SNicolas Chautru 				op_params->ref_dec_op, op_params->vector_mask,
5792d819c083SNicolas Chautru 				ad->dev_id, queue_id, num_to_process,
57930ab66275SNicolas Chautru 				burst_sz, &total_time, &min_time, &max_time,
57940ab66275SNicolas Chautru 				latency_flag);
57950acdb986SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_FFT)
57960acdb986SNicolas Chautru 		iter = latency_test_fft(op_params->mp, bufs,
57970acdb986SNicolas Chautru 				op_params->ref_fft_op,
57980acdb986SNicolas Chautru 				ad->dev_id, queue_id,
57990acdb986SNicolas Chautru 				num_to_process, burst_sz, &total_time,
58000acdb986SNicolas Chautru 				&min_time, &max_time);
580195f192a4SHernan Vargas 	else if (op_type == RTE_BBDEV_OP_MLDTS)
580295f192a4SHernan Vargas 		iter = latency_test_mldts(op_params->mp, bufs,
580395f192a4SHernan Vargas 				op_params->ref_mldts_op,
580495f192a4SHernan Vargas 				ad->dev_id, queue_id,
580595f192a4SHernan Vargas 				num_to_process, burst_sz, &total_time,
580695f192a4SHernan Vargas 				&min_time, &max_time);
58070ab66275SNicolas Chautru 	else /* RTE_BBDEV_OP_TURBO_ENC */
5808d819c083SNicolas Chautru 		iter = latency_test_enc(op_params->mp, bufs,
5809d819c083SNicolas Chautru 				op_params->ref_enc_op,
5810d819c083SNicolas Chautru 				ad->dev_id, queue_id,
5811d819c083SNicolas Chautru 				num_to_process, burst_sz, &total_time,
5812d819c083SNicolas Chautru 				&min_time, &max_time);
5813f714a188SAmr Mokhtar 
5814c3aaec26SAmr Mokhtar 	if (iter <= 0)
5815f714a188SAmr Mokhtar 		return TEST_FAILED;
5816f714a188SAmr Mokhtar 
58179fa6ebdeSKamil Chalupnik 	printf("Operation latency:\n"
5818d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
5819d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
5820d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
5821f714a188SAmr Mokhtar 			(double)total_time / (double)iter,
5822f714a188SAmr Mokhtar 			(double)(total_time * 1000000) / (double)iter /
5823864edd69SKamil Chalupnik 			(double)rte_get_tsc_hz(), (double)min_time,
5824864edd69SKamil Chalupnik 			(double)(min_time * 1000000) / (double)rte_get_tsc_hz(),
5825864edd69SKamil Chalupnik 			(double)max_time, (double)(max_time * 1000000) /
5826f714a188SAmr Mokhtar 			(double)rte_get_tsc_hz());
5827f714a188SAmr Mokhtar 
5828f714a188SAmr Mokhtar 	return TEST_SUCCESS;
5829f714a188SAmr Mokhtar }
5830f714a188SAmr Mokhtar 
58310ab66275SNicolas Chautru static int
58320ab66275SNicolas Chautru latency_test(struct active_device *ad, struct test_op_params *op_params)
58330ab66275SNicolas Chautru {
58340ab66275SNicolas Chautru 	return validation_latency_test(ad, op_params, true);
58350ab66275SNicolas Chautru }
58360ab66275SNicolas Chautru 
58370ab66275SNicolas Chautru static int
58380ab66275SNicolas Chautru validation_test(struct active_device *ad, struct test_op_params *op_params)
58390ab66275SNicolas Chautru {
58400ab66275SNicolas Chautru 	return validation_latency_test(ad, op_params, false);
58410ab66275SNicolas Chautru }
58420ab66275SNicolas Chautru 
5843864edd69SKamil Chalupnik static int
5844864edd69SKamil Chalupnik get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id,
5845864edd69SKamil Chalupnik 		struct rte_bbdev_stats *stats)
5846864edd69SKamil Chalupnik {
5847864edd69SKamil Chalupnik 	struct rte_bbdev *dev = &rte_bbdev_devices[dev_id];
5848864edd69SKamil Chalupnik 	struct rte_bbdev_stats *q_stats;
5849864edd69SKamil Chalupnik 
5850864edd69SKamil Chalupnik 	if (queue_id >= dev->data->num_queues)
5851864edd69SKamil Chalupnik 		return -1;
5852864edd69SKamil Chalupnik 
5853864edd69SKamil Chalupnik 	q_stats = &dev->data->queues[queue_id].queue_stats;
5854864edd69SKamil Chalupnik 
5855864edd69SKamil Chalupnik 	stats->enqueued_count = q_stats->enqueued_count;
5856864edd69SKamil Chalupnik 	stats->dequeued_count = q_stats->dequeued_count;
5857864edd69SKamil Chalupnik 	stats->enqueue_err_count = q_stats->enqueue_err_count;
5858864edd69SKamil Chalupnik 	stats->dequeue_err_count = q_stats->dequeue_err_count;
58591228c856SNicolas Chautru 	stats->enqueue_warn_count = q_stats->enqueue_warn_count;
58601228c856SNicolas Chautru 	stats->dequeue_warn_count = q_stats->dequeue_warn_count;
58619fa6ebdeSKamil Chalupnik 	stats->acc_offload_cycles = q_stats->acc_offload_cycles;
5862f8d8fa0eSNicolas Chautru 	stats->enqueue_depth_avail = q_stats->enqueue_depth_avail;
5863864edd69SKamil Chalupnik 
5864864edd69SKamil Chalupnik 	return 0;
5865864edd69SKamil Chalupnik }
5866864edd69SKamil Chalupnik 
5867f714a188SAmr Mokhtar static int
58684a07b231SNicolas Chautru offload_latency_test_fft(struct rte_mempool *mempool, struct test_buffers *bufs,
58694a07b231SNicolas Chautru 		struct rte_bbdev_fft_op *ref_op, uint16_t dev_id,
58704a07b231SNicolas Chautru 		uint16_t queue_id, const uint16_t num_to_process,
58714a07b231SNicolas Chautru 		uint16_t burst_sz, struct test_time_stats *time_st)
58724a07b231SNicolas Chautru {
58734a07b231SNicolas Chautru 	int i, dequeued, ret;
58744a07b231SNicolas Chautru 	struct rte_bbdev_fft_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
58754a07b231SNicolas Chautru 	uint64_t enq_start_time, deq_start_time;
58764a07b231SNicolas Chautru 	uint64_t enq_sw_last_time, deq_last_time;
58774a07b231SNicolas Chautru 	struct rte_bbdev_stats stats;
58784a07b231SNicolas Chautru 
58794a07b231SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
58804a07b231SNicolas Chautru 		uint16_t enq = 0, deq = 0;
58814a07b231SNicolas Chautru 
58824a07b231SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
58834a07b231SNicolas Chautru 			burst_sz = num_to_process - dequeued;
58844a07b231SNicolas Chautru 
58858abe31b1SNicolas Chautru 		ret = rte_bbdev_fft_op_alloc_bulk(mempool, ops_enq, burst_sz);
58865884e56fSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_fft_op_alloc_bulk() failed");
58874a07b231SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
58884a07b231SNicolas Chautru 			copy_reference_fft_op(ops_enq, burst_sz, dequeued,
58894a07b231SNicolas Chautru 					bufs->inputs,
58900ed76d66SHernan Vargas 					bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs,
58914a07b231SNicolas Chautru 					ref_op);
58924a07b231SNicolas Chautru 
58934a07b231SNicolas Chautru 		/* Start time meas for enqueue function offload latency */
58944a07b231SNicolas Chautru 		enq_start_time = rte_rdtsc_precise();
58954a07b231SNicolas Chautru 		do {
58964a07b231SNicolas Chautru 			enq += rte_bbdev_enqueue_fft_ops(dev_id, queue_id,
58974a07b231SNicolas Chautru 					&ops_enq[enq], burst_sz - enq);
58984a07b231SNicolas Chautru 		} while (unlikely(burst_sz != enq));
58994a07b231SNicolas Chautru 
59004a07b231SNicolas Chautru 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
59014a07b231SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
59024a07b231SNicolas Chautru 				"Failed to get stats for queue (%u) of device (%u)",
59034a07b231SNicolas Chautru 				queue_id, dev_id);
59044a07b231SNicolas Chautru 
59054a07b231SNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
59064a07b231SNicolas Chautru 				stats.acc_offload_cycles;
59074a07b231SNicolas Chautru 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
59084a07b231SNicolas Chautru 				enq_sw_last_time);
59094a07b231SNicolas Chautru 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
59104a07b231SNicolas Chautru 				enq_sw_last_time);
59114a07b231SNicolas Chautru 		time_st->enq_sw_total_time += enq_sw_last_time;
59124a07b231SNicolas Chautru 
59134a07b231SNicolas Chautru 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
59144a07b231SNicolas Chautru 				stats.acc_offload_cycles);
59154a07b231SNicolas Chautru 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
59164a07b231SNicolas Chautru 				stats.acc_offload_cycles);
59174a07b231SNicolas Chautru 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
59184a07b231SNicolas Chautru 
59194a07b231SNicolas Chautru 		/* give time for device to process ops */
59204a07b231SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
59214a07b231SNicolas Chautru 
59224a07b231SNicolas Chautru 		/* Start time meas for dequeue function offload latency */
59234a07b231SNicolas Chautru 		deq_start_time = rte_rdtsc_precise();
59244a07b231SNicolas Chautru 		/* Dequeue one operation */
59254a07b231SNicolas Chautru 		do {
59264a07b231SNicolas Chautru 			deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id,
59274a07b231SNicolas Chautru 					&ops_deq[deq], enq);
59284a07b231SNicolas Chautru 		} while (unlikely(deq == 0));
59294a07b231SNicolas Chautru 
59304a07b231SNicolas Chautru 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
59314a07b231SNicolas Chautru 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
59324a07b231SNicolas Chautru 				deq_last_time);
59334a07b231SNicolas Chautru 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
59344a07b231SNicolas Chautru 				deq_last_time);
59354a07b231SNicolas Chautru 		time_st->deq_total_time += deq_last_time;
59364a07b231SNicolas Chautru 
59374a07b231SNicolas Chautru 		/* Dequeue remaining operations if needed*/
59384a07b231SNicolas Chautru 		while (burst_sz != deq)
59394a07b231SNicolas Chautru 			deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id,
59404a07b231SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
59414a07b231SNicolas Chautru 
59424a07b231SNicolas Chautru 		rte_bbdev_fft_op_free_bulk(ops_enq, deq);
59434a07b231SNicolas Chautru 		dequeued += deq;
59444a07b231SNicolas Chautru 	}
59454a07b231SNicolas Chautru 
59464a07b231SNicolas Chautru 	return i;
59474a07b231SNicolas Chautru }
59484a07b231SNicolas Chautru 
59494a07b231SNicolas Chautru static int
595095f192a4SHernan Vargas offload_latency_test_mldts(struct rte_mempool *mempool, struct test_buffers *bufs,
595195f192a4SHernan Vargas 		struct rte_bbdev_mldts_op *ref_op, uint16_t dev_id,
595295f192a4SHernan Vargas 		uint16_t queue_id, const uint16_t num_to_process,
595395f192a4SHernan Vargas 		uint16_t burst_sz, struct test_time_stats *time_st)
595495f192a4SHernan Vargas {
595595f192a4SHernan Vargas 	int i, dequeued, ret;
595695f192a4SHernan Vargas 	struct rte_bbdev_mldts_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
595795f192a4SHernan Vargas 	uint64_t enq_start_time, deq_start_time;
595895f192a4SHernan Vargas 	uint64_t enq_sw_last_time, deq_last_time;
595995f192a4SHernan Vargas 	struct rte_bbdev_stats stats;
596095f192a4SHernan Vargas 
596195f192a4SHernan Vargas 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
596295f192a4SHernan Vargas 		uint16_t enq = 0, deq = 0;
596395f192a4SHernan Vargas 
596495f192a4SHernan Vargas 		if (unlikely(num_to_process - dequeued < burst_sz))
596595f192a4SHernan Vargas 			burst_sz = num_to_process - dequeued;
596695f192a4SHernan Vargas 
596795f192a4SHernan Vargas 		ret = rte_bbdev_mldts_op_alloc_bulk(mempool, ops_enq, burst_sz);
596895f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_mldts_op_alloc_bulk() failed");
596995f192a4SHernan Vargas 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
597095f192a4SHernan Vargas 			copy_reference_mldts_op(ops_enq, burst_sz, dequeued,
597195f192a4SHernan Vargas 					bufs->inputs, bufs->harq_inputs,
597295f192a4SHernan Vargas 					bufs->hard_outputs,
597395f192a4SHernan Vargas 					ref_op);
597495f192a4SHernan Vargas 
597595f192a4SHernan Vargas 		/* Start time meas for enqueue function offload latency */
597695f192a4SHernan Vargas 		enq_start_time = rte_rdtsc_precise();
597795f192a4SHernan Vargas 		do {
597895f192a4SHernan Vargas 			enq += rte_bbdev_enqueue_mldts_ops(dev_id, queue_id,
597995f192a4SHernan Vargas 					&ops_enq[enq], burst_sz - enq);
598095f192a4SHernan Vargas 		} while (unlikely(burst_sz != enq));
598195f192a4SHernan Vargas 
598295f192a4SHernan Vargas 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
598395f192a4SHernan Vargas 		TEST_ASSERT_SUCCESS(ret,
598495f192a4SHernan Vargas 				"Failed to get stats for queue (%u) of device (%u)",
598595f192a4SHernan Vargas 				queue_id, dev_id);
598695f192a4SHernan Vargas 
598795f192a4SHernan Vargas 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
598895f192a4SHernan Vargas 				stats.acc_offload_cycles;
598995f192a4SHernan Vargas 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
599095f192a4SHernan Vargas 				enq_sw_last_time);
599195f192a4SHernan Vargas 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
599295f192a4SHernan Vargas 				enq_sw_last_time);
599395f192a4SHernan Vargas 		time_st->enq_sw_total_time += enq_sw_last_time;
599495f192a4SHernan Vargas 
599595f192a4SHernan Vargas 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
599695f192a4SHernan Vargas 				stats.acc_offload_cycles);
599795f192a4SHernan Vargas 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
599895f192a4SHernan Vargas 				stats.acc_offload_cycles);
599995f192a4SHernan Vargas 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
600095f192a4SHernan Vargas 
600195f192a4SHernan Vargas 		/* give time for device to process ops */
600295f192a4SHernan Vargas 		rte_delay_us(WAIT_OFFLOAD_US);
600395f192a4SHernan Vargas 
600495f192a4SHernan Vargas 		/* Start time meas for dequeue function offload latency */
600595f192a4SHernan Vargas 		deq_start_time = rte_rdtsc_precise();
600695f192a4SHernan Vargas 		/* Dequeue one operation */
600795f192a4SHernan Vargas 		do {
600895f192a4SHernan Vargas 			deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id, &ops_deq[deq], enq);
600995f192a4SHernan Vargas 		} while (unlikely(deq == 0));
601095f192a4SHernan Vargas 
601195f192a4SHernan Vargas 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
601295f192a4SHernan Vargas 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, deq_last_time);
601395f192a4SHernan Vargas 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, deq_last_time);
601495f192a4SHernan Vargas 		time_st->deq_total_time += deq_last_time;
601595f192a4SHernan Vargas 
601695f192a4SHernan Vargas 		/* Dequeue remaining operations if needed*/
601795f192a4SHernan Vargas 		while (burst_sz != deq)
601895f192a4SHernan Vargas 			deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id,
601995f192a4SHernan Vargas 					&ops_deq[deq], burst_sz - deq);
602095f192a4SHernan Vargas 
602195f192a4SHernan Vargas 		rte_bbdev_mldts_op_free_bulk(ops_enq, deq);
602295f192a4SHernan Vargas 		dequeued += deq;
602395f192a4SHernan Vargas 	}
602495f192a4SHernan Vargas 
602595f192a4SHernan Vargas 	return i;
602695f192a4SHernan Vargas }
602795f192a4SHernan Vargas 
602895f192a4SHernan Vargas static int
6029f714a188SAmr Mokhtar offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs,
6030f714a188SAmr Mokhtar 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
6031f714a188SAmr Mokhtar 		uint16_t queue_id, const uint16_t num_to_process,
6032864edd69SKamil Chalupnik 		uint16_t burst_sz, struct test_time_stats *time_st)
6033f714a188SAmr Mokhtar {
6034864edd69SKamil Chalupnik 	int i, dequeued, ret;
6035f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
6036f714a188SAmr Mokhtar 	uint64_t enq_start_time, deq_start_time;
6037864edd69SKamil Chalupnik 	uint64_t enq_sw_last_time, deq_last_time;
6038864edd69SKamil Chalupnik 	struct rte_bbdev_stats stats;
6039f714a188SAmr Mokhtar 
6040f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
6041f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
6042f714a188SAmr Mokhtar 
6043f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
6044f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
6045f714a188SAmr Mokhtar 
60468abe31b1SNicolas Chautru 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
60475884e56fSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed");
604831fab7b4SHernan Vargas 		ref_op->turbo_dec.iter_max = get_iter_max();
6049f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
6050f714a188SAmr Mokhtar 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
6051f714a188SAmr Mokhtar 					bufs->inputs,
6052f714a188SAmr Mokhtar 					bufs->hard_outputs,
6053f714a188SAmr Mokhtar 					bufs->soft_outputs,
6054f714a188SAmr Mokhtar 					ref_op);
6055f714a188SAmr Mokhtar 
6056864edd69SKamil Chalupnik 		/* Start time meas for enqueue function offload latency */
6057864edd69SKamil Chalupnik 		enq_start_time = rte_rdtsc_precise();
6058f714a188SAmr Mokhtar 		do {
6059f714a188SAmr Mokhtar 			enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id,
6060f714a188SAmr Mokhtar 					&ops_enq[enq], burst_sz - enq);
6061f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != enq));
6062864edd69SKamil Chalupnik 
6063864edd69SKamil Chalupnik 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
6064864edd69SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
6065864edd69SKamil Chalupnik 				"Failed to get stats for queue (%u) of device (%u)",
6066864edd69SKamil Chalupnik 				queue_id, dev_id);
6067864edd69SKamil Chalupnik 
6068864edd69SKamil Chalupnik 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
60699fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles;
6070864edd69SKamil Chalupnik 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
6071864edd69SKamil Chalupnik 				enq_sw_last_time);
6072864edd69SKamil Chalupnik 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
6073864edd69SKamil Chalupnik 				enq_sw_last_time);
60749fa6ebdeSKamil Chalupnik 		time_st->enq_sw_total_time += enq_sw_last_time;
6075864edd69SKamil Chalupnik 
60769fa6ebdeSKamil Chalupnik 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
60779fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
60789fa6ebdeSKamil Chalupnik 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
60799fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
60809fa6ebdeSKamil Chalupnik 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
6081f714a188SAmr Mokhtar 
6082d819c083SNicolas Chautru 		/* give time for device to process ops */
60835c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
6084f714a188SAmr Mokhtar 
6085864edd69SKamil Chalupnik 		/* Start time meas for dequeue function offload latency */
6086864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
6087864edd69SKamil Chalupnik 		/* Dequeue one operation */
6088f714a188SAmr Mokhtar 		do {
6089f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
6090f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
6091f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
6092864edd69SKamil Chalupnik 
6093864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6094864edd69SKamil Chalupnik 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
6095864edd69SKamil Chalupnik 				deq_last_time);
6096864edd69SKamil Chalupnik 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
6097864edd69SKamil Chalupnik 				deq_last_time);
60989fa6ebdeSKamil Chalupnik 		time_st->deq_total_time += deq_last_time;
6099864edd69SKamil Chalupnik 
6100864edd69SKamil Chalupnik 		/* Dequeue remaining operations if needed*/
6101864edd69SKamil Chalupnik 		while (burst_sz != deq)
6102864edd69SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
6103f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
6104f714a188SAmr Mokhtar 
6105f714a188SAmr Mokhtar 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
6106f714a188SAmr Mokhtar 		dequeued += deq;
6107f714a188SAmr Mokhtar 	}
6108f714a188SAmr Mokhtar 
6109f714a188SAmr Mokhtar 	return i;
6110f714a188SAmr Mokhtar }
6111f714a188SAmr Mokhtar 
6112f714a188SAmr Mokhtar static int
6113d819c083SNicolas Chautru offload_latency_test_ldpc_dec(struct rte_mempool *mempool,
6114d819c083SNicolas Chautru 		struct test_buffers *bufs,
6115d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
6116d819c083SNicolas Chautru 		uint16_t queue_id, const uint16_t num_to_process,
6117d819c083SNicolas Chautru 		uint16_t burst_sz, struct test_time_stats *time_st)
6118d819c083SNicolas Chautru {
6119d819c083SNicolas Chautru 	int i, dequeued, ret;
6120d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
6121d819c083SNicolas Chautru 	uint64_t enq_start_time, deq_start_time;
6122d819c083SNicolas Chautru 	uint64_t enq_sw_last_time, deq_last_time;
6123d819c083SNicolas Chautru 	struct rte_bbdev_stats stats;
6124335c11fdSNicolas Chautru 	bool extDdr = ldpc_cap_flags &
6125335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
6126d819c083SNicolas Chautru 
6127d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
6128d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
6129d819c083SNicolas Chautru 
6130d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
6131d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
6132d819c083SNicolas Chautru 
61338abe31b1SNicolas Chautru 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
61345884e56fSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed");
613531fab7b4SHernan Vargas 		ref_op->ldpc_dec.iter_max = get_iter_max();
6136d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
6137d819c083SNicolas Chautru 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
6138d819c083SNicolas Chautru 					bufs->inputs,
6139d819c083SNicolas Chautru 					bufs->hard_outputs,
6140d819c083SNicolas Chautru 					bufs->soft_outputs,
6141d819c083SNicolas Chautru 					bufs->harq_inputs,
6142d819c083SNicolas Chautru 					bufs->harq_outputs,
6143d819c083SNicolas Chautru 					ref_op);
6144d819c083SNicolas Chautru 
6145335c11fdSNicolas Chautru 		if (extDdr)
6146335c11fdSNicolas Chautru 			preload_harq_ddr(dev_id, queue_id, ops_enq,
6147335c11fdSNicolas Chautru 					burst_sz, true);
6148335c11fdSNicolas Chautru 
6149d819c083SNicolas Chautru 		/* Start time meas for enqueue function offload latency */
6150d819c083SNicolas Chautru 		enq_start_time = rte_rdtsc_precise();
6151d819c083SNicolas Chautru 		do {
6152d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
6153d819c083SNicolas Chautru 					&ops_enq[enq], burst_sz - enq);
6154d819c083SNicolas Chautru 		} while (unlikely(burst_sz != enq));
6155d819c083SNicolas Chautru 
6156335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
6157d819c083SNicolas Chautru 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
6158d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
6159d819c083SNicolas Chautru 				"Failed to get stats for queue (%u) of device (%u)",
6160d819c083SNicolas Chautru 				queue_id, dev_id);
6161d819c083SNicolas Chautru 
6162335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
6163d819c083SNicolas Chautru 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
6164d819c083SNicolas Chautru 				enq_sw_last_time);
6165d819c083SNicolas Chautru 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
6166d819c083SNicolas Chautru 				enq_sw_last_time);
6167d819c083SNicolas Chautru 		time_st->enq_sw_total_time += enq_sw_last_time;
6168d819c083SNicolas Chautru 
6169d819c083SNicolas Chautru 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
6170d819c083SNicolas Chautru 				stats.acc_offload_cycles);
6171d819c083SNicolas Chautru 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
6172d819c083SNicolas Chautru 				stats.acc_offload_cycles);
6173d819c083SNicolas Chautru 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
6174d819c083SNicolas Chautru 
6175d819c083SNicolas Chautru 		/* give time for device to process ops */
61765c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
6177d819c083SNicolas Chautru 
6178d819c083SNicolas Chautru 		/* Start time meas for dequeue function offload latency */
6179d819c083SNicolas Chautru 		deq_start_time = rte_rdtsc_precise();
6180d819c083SNicolas Chautru 		/* Dequeue one operation */
6181d819c083SNicolas Chautru 		do {
6182d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
6183f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
6184f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
6185d819c083SNicolas Chautru 
6186d819c083SNicolas Chautru 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6187d819c083SNicolas Chautru 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
6188d819c083SNicolas Chautru 				deq_last_time);
6189d819c083SNicolas Chautru 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
6190d819c083SNicolas Chautru 				deq_last_time);
6191d819c083SNicolas Chautru 		time_st->deq_total_time += deq_last_time;
6192d819c083SNicolas Chautru 
6193d819c083SNicolas Chautru 		/* Dequeue remaining operations if needed*/
6194d819c083SNicolas Chautru 		while (burst_sz != deq)
6195335c11fdSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
6196d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
6197d819c083SNicolas Chautru 
6198335c11fdSNicolas Chautru 		if (extDdr) {
6199335c11fdSNicolas Chautru 			/* Read loopback is not thread safe */
6200335c11fdSNicolas Chautru 			retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz);
6201335c11fdSNicolas Chautru 		}
6202335c11fdSNicolas Chautru 
6203d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
6204d819c083SNicolas Chautru 		dequeued += deq;
6205d819c083SNicolas Chautru 	}
6206d819c083SNicolas Chautru 
6207d819c083SNicolas Chautru 	return i;
6208d819c083SNicolas Chautru }
6209d819c083SNicolas Chautru 
6210d819c083SNicolas Chautru static int
6211f714a188SAmr Mokhtar offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs,
6212f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
6213f714a188SAmr Mokhtar 		uint16_t queue_id, const uint16_t num_to_process,
6214864edd69SKamil Chalupnik 		uint16_t burst_sz, struct test_time_stats *time_st)
6215f714a188SAmr Mokhtar {
6216864edd69SKamil Chalupnik 	int i, dequeued, ret;
6217f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
6218f714a188SAmr Mokhtar 	uint64_t enq_start_time, deq_start_time;
6219864edd69SKamil Chalupnik 	uint64_t enq_sw_last_time, deq_last_time;
6220864edd69SKamil Chalupnik 	struct rte_bbdev_stats stats;
6221f714a188SAmr Mokhtar 
6222f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
6223f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
6224f714a188SAmr Mokhtar 
6225f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
6226f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
6227f714a188SAmr Mokhtar 
6228be840d08SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
62295884e56fSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_enc_op_alloc_bulk() failed");
6230f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
6231f714a188SAmr Mokhtar 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
6232f714a188SAmr Mokhtar 					bufs->inputs,
6233f714a188SAmr Mokhtar 					bufs->hard_outputs,
6234f714a188SAmr Mokhtar 					ref_op);
6235f714a188SAmr Mokhtar 
6236864edd69SKamil Chalupnik 		/* Start time meas for enqueue function offload latency */
6237864edd69SKamil Chalupnik 		enq_start_time = rte_rdtsc_precise();
6238f714a188SAmr Mokhtar 		do {
6239f714a188SAmr Mokhtar 			enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id,
6240f714a188SAmr Mokhtar 					&ops_enq[enq], burst_sz - enq);
6241f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != enq));
6242864edd69SKamil Chalupnik 
6243335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
6244335c11fdSNicolas Chautru 
6245864edd69SKamil Chalupnik 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
6246864edd69SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
6247864edd69SKamil Chalupnik 				"Failed to get stats for queue (%u) of device (%u)",
6248864edd69SKamil Chalupnik 				queue_id, dev_id);
6249335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
6250864edd69SKamil Chalupnik 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
6251864edd69SKamil Chalupnik 				enq_sw_last_time);
6252864edd69SKamil Chalupnik 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
6253864edd69SKamil Chalupnik 				enq_sw_last_time);
62549fa6ebdeSKamil Chalupnik 		time_st->enq_sw_total_time += enq_sw_last_time;
6255864edd69SKamil Chalupnik 
62569fa6ebdeSKamil Chalupnik 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
62579fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
62589fa6ebdeSKamil Chalupnik 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
62599fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
62609fa6ebdeSKamil Chalupnik 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
6261f714a188SAmr Mokhtar 
6262d819c083SNicolas Chautru 		/* give time for device to process ops */
62635c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
6264f714a188SAmr Mokhtar 
6265864edd69SKamil Chalupnik 		/* Start time meas for dequeue function offload latency */
6266864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
6267864edd69SKamil Chalupnik 		/* Dequeue one operation */
6268f714a188SAmr Mokhtar 		do {
6269f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
6270f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
6271f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
6272864edd69SKamil Chalupnik 
6273864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6274864edd69SKamil Chalupnik 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
6275864edd69SKamil Chalupnik 				deq_last_time);
6276864edd69SKamil Chalupnik 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
6277864edd69SKamil Chalupnik 				deq_last_time);
62789fa6ebdeSKamil Chalupnik 		time_st->deq_total_time += deq_last_time;
6279864edd69SKamil Chalupnik 
6280864edd69SKamil Chalupnik 		while (burst_sz != deq)
6281864edd69SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
6282f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
6283f714a188SAmr Mokhtar 
6284f714a188SAmr Mokhtar 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
6285f714a188SAmr Mokhtar 		dequeued += deq;
6286f714a188SAmr Mokhtar 	}
6287f714a188SAmr Mokhtar 
6288f714a188SAmr Mokhtar 	return i;
6289f714a188SAmr Mokhtar }
6290d819c083SNicolas Chautru 
6291d819c083SNicolas Chautru static int
6292d819c083SNicolas Chautru offload_latency_test_ldpc_enc(struct rte_mempool *mempool,
6293d819c083SNicolas Chautru 		struct test_buffers *bufs,
6294d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
6295d819c083SNicolas Chautru 		uint16_t queue_id, const uint16_t num_to_process,
6296d819c083SNicolas Chautru 		uint16_t burst_sz, struct test_time_stats *time_st)
6297d819c083SNicolas Chautru {
6298d819c083SNicolas Chautru 	int i, dequeued, ret;
6299d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
6300d819c083SNicolas Chautru 	uint64_t enq_start_time, deq_start_time;
6301d819c083SNicolas Chautru 	uint64_t enq_sw_last_time, deq_last_time;
6302d819c083SNicolas Chautru 	struct rte_bbdev_stats stats;
6303d819c083SNicolas Chautru 
6304d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
6305d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
6306d819c083SNicolas Chautru 
6307d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
6308d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
6309d819c083SNicolas Chautru 
6310be840d08SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
63115884e56fSHernan Vargas 		TEST_ASSERT_SUCCESS(ret, "rte_bbdev_enc_op_alloc_bulk() failed");
6312d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
6313d819c083SNicolas Chautru 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
6314d819c083SNicolas Chautru 					bufs->inputs,
6315d819c083SNicolas Chautru 					bufs->hard_outputs,
6316d819c083SNicolas Chautru 					ref_op);
6317d819c083SNicolas Chautru 
6318d819c083SNicolas Chautru 		/* Start time meas for enqueue function offload latency */
6319d819c083SNicolas Chautru 		enq_start_time = rte_rdtsc_precise();
6320d819c083SNicolas Chautru 		do {
6321d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
6322d819c083SNicolas Chautru 					&ops_enq[enq], burst_sz - enq);
6323d819c083SNicolas Chautru 		} while (unlikely(burst_sz != enq));
6324d819c083SNicolas Chautru 
6325335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
6326d819c083SNicolas Chautru 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
6327d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
6328d819c083SNicolas Chautru 				"Failed to get stats for queue (%u) of device (%u)",
6329d819c083SNicolas Chautru 				queue_id, dev_id);
6330d819c083SNicolas Chautru 
6331335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
6332d819c083SNicolas Chautru 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
6333d819c083SNicolas Chautru 				enq_sw_last_time);
6334d819c083SNicolas Chautru 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
6335d819c083SNicolas Chautru 				enq_sw_last_time);
6336d819c083SNicolas Chautru 		time_st->enq_sw_total_time += enq_sw_last_time;
6337d819c083SNicolas Chautru 
6338d819c083SNicolas Chautru 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
6339d819c083SNicolas Chautru 				stats.acc_offload_cycles);
6340d819c083SNicolas Chautru 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
6341d819c083SNicolas Chautru 				stats.acc_offload_cycles);
6342d819c083SNicolas Chautru 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
6343d819c083SNicolas Chautru 
6344d819c083SNicolas Chautru 		/* give time for device to process ops */
63455c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
6346d819c083SNicolas Chautru 
6347d819c083SNicolas Chautru 		/* Start time meas for dequeue function offload latency */
6348d819c083SNicolas Chautru 		deq_start_time = rte_rdtsc_precise();
6349d819c083SNicolas Chautru 		/* Dequeue one operation */
6350d819c083SNicolas Chautru 		do {
6351d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
6352f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
6353f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
6354d819c083SNicolas Chautru 
6355d819c083SNicolas Chautru 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6356d819c083SNicolas Chautru 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
6357d819c083SNicolas Chautru 				deq_last_time);
6358d819c083SNicolas Chautru 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
6359d819c083SNicolas Chautru 				deq_last_time);
6360d819c083SNicolas Chautru 		time_st->deq_total_time += deq_last_time;
6361d819c083SNicolas Chautru 
6362d819c083SNicolas Chautru 		while (burst_sz != deq)
6363d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
6364d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
6365d819c083SNicolas Chautru 
6366d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
6367d819c083SNicolas Chautru 		dequeued += deq;
6368d819c083SNicolas Chautru 	}
6369d819c083SNicolas Chautru 
6370d819c083SNicolas Chautru 	return i;
6371d819c083SNicolas Chautru }
6372f714a188SAmr Mokhtar 
6373f714a188SAmr Mokhtar static int
6374864edd69SKamil Chalupnik offload_cost_test(struct active_device *ad,
6375f714a188SAmr Mokhtar 		struct test_op_params *op_params)
6376f714a188SAmr Mokhtar {
6377ce1b6289SHernan Vargas 	int iter, ret;
6378f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
6379f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
6380f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
6381f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
6382f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
6383f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
6384f714a188SAmr Mokhtar 	const char *op_type_str;
6385864edd69SKamil Chalupnik 	struct test_time_stats time_st;
6386864edd69SKamil Chalupnik 
6387864edd69SKamil Chalupnik 	memset(&time_st, 0, sizeof(struct test_time_stats));
6388864edd69SKamil Chalupnik 	time_st.enq_sw_min_time = UINT64_MAX;
63899fa6ebdeSKamil Chalupnik 	time_st.enq_acc_min_time = UINT64_MAX;
6390864edd69SKamil Chalupnik 	time_st.deq_min_time = UINT64_MAX;
6391f714a188SAmr Mokhtar 
6392f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
6393f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
6394f714a188SAmr Mokhtar 
6395f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
6396f714a188SAmr Mokhtar 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
6397f714a188SAmr Mokhtar 
6398f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
6399f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
6400f714a188SAmr Mokhtar 
6401d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
6402d819c083SNicolas Chautru 	printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
6403f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
6404f714a188SAmr Mokhtar 
6405f714a188SAmr Mokhtar 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
6406f714a188SAmr Mokhtar 		iter = offload_latency_test_dec(op_params->mp, bufs,
6407f714a188SAmr Mokhtar 				op_params->ref_dec_op, ad->dev_id, queue_id,
6408864edd69SKamil Chalupnik 				num_to_process, burst_sz, &time_st);
6409d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC)
6410d819c083SNicolas Chautru 		iter = offload_latency_test_enc(op_params->mp, bufs,
6411d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
6412d819c083SNicolas Chautru 				num_to_process, burst_sz, &time_st);
6413d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
6414d819c083SNicolas Chautru 		iter = offload_latency_test_ldpc_enc(op_params->mp, bufs,
6415d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
6416d819c083SNicolas Chautru 				num_to_process, burst_sz, &time_st);
6417d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
6418d819c083SNicolas Chautru 		iter = offload_latency_test_ldpc_dec(op_params->mp, bufs,
6419d819c083SNicolas Chautru 			op_params->ref_dec_op, ad->dev_id, queue_id,
6420d819c083SNicolas Chautru 			num_to_process, burst_sz, &time_st);
64210acdb986SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_FFT)
64220acdb986SNicolas Chautru 		iter = offload_latency_test_fft(op_params->mp, bufs,
64230acdb986SNicolas Chautru 			op_params->ref_fft_op, ad->dev_id, queue_id,
64240acdb986SNicolas Chautru 			num_to_process, burst_sz, &time_st);
642595f192a4SHernan Vargas 	else if (op_type == RTE_BBDEV_OP_MLDTS)
642695f192a4SHernan Vargas 		iter = offload_latency_test_mldts(op_params->mp, bufs,
642795f192a4SHernan Vargas 			op_params->ref_mldts_op, ad->dev_id, queue_id,
642895f192a4SHernan Vargas 			num_to_process, burst_sz, &time_st);
6429f714a188SAmr Mokhtar 	else
6430f714a188SAmr Mokhtar 		iter = offload_latency_test_enc(op_params->mp, bufs,
6431f714a188SAmr Mokhtar 				op_params->ref_enc_op, ad->dev_id, queue_id,
6432864edd69SKamil Chalupnik 				num_to_process, burst_sz, &time_st);
6433f714a188SAmr Mokhtar 
6434c3aaec26SAmr Mokhtar 	if (iter <= 0)
6435f714a188SAmr Mokhtar 		return TEST_FAILED;
6436f714a188SAmr Mokhtar 
6437d819c083SNicolas Chautru 	printf("Enqueue driver offload cost latency:\n"
6438d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
6439d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
6440d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n"
6441d819c083SNicolas Chautru 			"Enqueue accelerator offload cost latency:\n"
6442d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
6443d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
6444d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
64459fa6ebdeSKamil Chalupnik 			(double)time_st.enq_sw_total_time / (double)iter,
64469fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_sw_total_time * 1000000) /
6447864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
6448864edd69SKamil Chalupnik 			(double)time_st.enq_sw_min_time,
6449864edd69SKamil Chalupnik 			(double)(time_st.enq_sw_min_time * 1000000) /
6450864edd69SKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_sw_max_time,
6451864edd69SKamil Chalupnik 			(double)(time_st.enq_sw_max_time * 1000000) /
64529fa6ebdeSKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_acc_total_time /
6453864edd69SKamil Chalupnik 			(double)iter,
64549fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_total_time * 1000000) /
6455864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
64569fa6ebdeSKamil Chalupnik 			(double)time_st.enq_acc_min_time,
64579fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_min_time * 1000000) /
64589fa6ebdeSKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_acc_max_time,
64599fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_max_time * 1000000) /
6460864edd69SKamil Chalupnik 			rte_get_tsc_hz());
6461f714a188SAmr Mokhtar 
64629fa6ebdeSKamil Chalupnik 	printf("Dequeue offload cost latency - one op:\n"
6463d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
6464d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
6465d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
64669fa6ebdeSKamil Chalupnik 			(double)time_st.deq_total_time / (double)iter,
64679fa6ebdeSKamil Chalupnik 			(double)(time_st.deq_total_time * 1000000) /
6468864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
6469864edd69SKamil Chalupnik 			(double)time_st.deq_min_time,
6470864edd69SKamil Chalupnik 			(double)(time_st.deq_min_time * 1000000) /
6471864edd69SKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.deq_max_time,
6472864edd69SKamil Chalupnik 			(double)(time_st.deq_max_time * 1000000) /
6473864edd69SKamil Chalupnik 			rte_get_tsc_hz());
6474f714a188SAmr Mokhtar 
6475c2560435SNicolas Chautru 	struct rte_bbdev_stats stats = {0};
6476ce1b6289SHernan Vargas 	ret = get_bbdev_queue_stats(ad->dev_id, queue_id, &stats);
6477ce1b6289SHernan Vargas 	TEST_ASSERT_SUCCESS(ret,
6478ce1b6289SHernan Vargas 			"Failed to get stats for queue (%u) of device (%u)",
6479ce1b6289SHernan Vargas 			queue_id, ad->dev_id);
6480c00b1677SHernan Vargas 	if (stats.enqueue_warn_count > 0)
6481c00b1677SHernan Vargas 		printf("Warning reported on the queue : %10"PRIu64"\n",
6482c00b1677SHernan Vargas 			stats.enqueue_warn_count);
6483c2560435SNicolas Chautru 	if (op_type != RTE_BBDEV_OP_LDPC_DEC) {
6484c2560435SNicolas Chautru 		TEST_ASSERT_SUCCESS(stats.enqueued_count != num_to_process,
6485c2560435SNicolas Chautru 				"Mismatch in enqueue count %10"PRIu64" %d",
6486c2560435SNicolas Chautru 				stats.enqueued_count, num_to_process);
6487c2560435SNicolas Chautru 		TEST_ASSERT_SUCCESS(stats.dequeued_count != num_to_process,
6488c2560435SNicolas Chautru 				"Mismatch in dequeue count %10"PRIu64" %d",
6489c2560435SNicolas Chautru 				stats.dequeued_count, num_to_process);
6490c2560435SNicolas Chautru 	}
6491c2560435SNicolas Chautru 	TEST_ASSERT_SUCCESS(stats.enqueue_err_count != 0,
6492c2560435SNicolas Chautru 			"Enqueue count Error %10"PRIu64"",
6493c2560435SNicolas Chautru 			stats.enqueue_err_count);
6494c2560435SNicolas Chautru 	TEST_ASSERT_SUCCESS(stats.dequeue_err_count != 0,
6495c2560435SNicolas Chautru 			"Dequeue count Error (%10"PRIu64"",
6496c2560435SNicolas Chautru 			stats.dequeue_err_count);
6497c2560435SNicolas Chautru 
6498f714a188SAmr Mokhtar 	return TEST_SUCCESS;
6499f714a188SAmr Mokhtar }
6500f714a188SAmr Mokhtar 
6501f714a188SAmr Mokhtar static int
6502f714a188SAmr Mokhtar offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id,
6503f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
65049fa6ebdeSKamil Chalupnik 		uint64_t *deq_total_time, uint64_t *deq_min_time,
65056e024c4bSNicolas Chautru 		uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type)
6506f714a188SAmr Mokhtar {
6507f714a188SAmr Mokhtar 	int i, deq_total;
6508f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops[MAX_BURST];
6509864edd69SKamil Chalupnik 	uint64_t deq_start_time, deq_last_time;
6510f714a188SAmr Mokhtar 
6511f714a188SAmr Mokhtar 	/* Test deq offload latency from an empty queue */
6512864edd69SKamil Chalupnik 
6513f714a188SAmr Mokhtar 	for (i = 0, deq_total = 0; deq_total < num_to_process;
6514f714a188SAmr Mokhtar 			++i, deq_total += burst_sz) {
6515864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
6516864edd69SKamil Chalupnik 
6517f714a188SAmr Mokhtar 		if (unlikely(num_to_process - deq_total < burst_sz))
6518f714a188SAmr Mokhtar 			burst_sz = num_to_process - deq_total;
65196e024c4bSNicolas Chautru 		if (op_type == RTE_BBDEV_OP_LDPC_DEC)
65206e024c4bSNicolas Chautru 			rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops,
65216e024c4bSNicolas Chautru 					burst_sz);
65226e024c4bSNicolas Chautru 		else
65236e024c4bSNicolas Chautru 			rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops,
65246e024c4bSNicolas Chautru 					burst_sz);
6525864edd69SKamil Chalupnik 
6526864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6527864edd69SKamil Chalupnik 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
6528864edd69SKamil Chalupnik 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
65299fa6ebdeSKamil Chalupnik 		*deq_total_time += deq_last_time;
6530f714a188SAmr Mokhtar 	}
6531f714a188SAmr Mokhtar 
6532f714a188SAmr Mokhtar 	return i;
6533f714a188SAmr Mokhtar }
6534f714a188SAmr Mokhtar 
6535f714a188SAmr Mokhtar static int
6536f714a188SAmr Mokhtar offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id,
6537f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
65389fa6ebdeSKamil Chalupnik 		uint64_t *deq_total_time, uint64_t *deq_min_time,
65396e024c4bSNicolas Chautru 		uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type)
6540f714a188SAmr Mokhtar {
6541f714a188SAmr Mokhtar 	int i, deq_total;
6542f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops[MAX_BURST];
6543864edd69SKamil Chalupnik 	uint64_t deq_start_time, deq_last_time;
6544f714a188SAmr Mokhtar 
6545f714a188SAmr Mokhtar 	/* Test deq offload latency from an empty queue */
6546f714a188SAmr Mokhtar 	for (i = 0, deq_total = 0; deq_total < num_to_process;
6547f714a188SAmr Mokhtar 			++i, deq_total += burst_sz) {
6548864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
6549864edd69SKamil Chalupnik 
6550f714a188SAmr Mokhtar 		if (unlikely(num_to_process - deq_total < burst_sz))
6551f714a188SAmr Mokhtar 			burst_sz = num_to_process - deq_total;
65526e024c4bSNicolas Chautru 		if (op_type == RTE_BBDEV_OP_LDPC_ENC)
65536e024c4bSNicolas Chautru 			rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops,
65546e024c4bSNicolas Chautru 					burst_sz);
65556e024c4bSNicolas Chautru 		else
65566e024c4bSNicolas Chautru 			rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops,
65576e024c4bSNicolas Chautru 					burst_sz);
6558864edd69SKamil Chalupnik 
6559864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
6560864edd69SKamil Chalupnik 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
6561864edd69SKamil Chalupnik 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
65629fa6ebdeSKamil Chalupnik 		*deq_total_time += deq_last_time;
6563f714a188SAmr Mokhtar 	}
6564f714a188SAmr Mokhtar 
6565f714a188SAmr Mokhtar 	return i;
6566f714a188SAmr Mokhtar }
65676e024c4bSNicolas Chautru 
6568f714a188SAmr Mokhtar static int
6569f714a188SAmr Mokhtar offload_latency_empty_q_test(struct active_device *ad,
6570f714a188SAmr Mokhtar 		struct test_op_params *op_params)
6571f714a188SAmr Mokhtar {
6572f714a188SAmr Mokhtar 	int iter;
65739fa6ebdeSKamil Chalupnik 	uint64_t deq_total_time, deq_min_time, deq_max_time;
6574f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
6575f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
6576f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
6577f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
6578f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
6579f714a188SAmr Mokhtar 	const char *op_type_str;
6580f714a188SAmr Mokhtar 
65819fa6ebdeSKamil Chalupnik 	deq_total_time = deq_max_time = 0;
6582864edd69SKamil Chalupnik 	deq_min_time = UINT64_MAX;
6583864edd69SKamil Chalupnik 
6584f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
6585f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
6586f714a188SAmr Mokhtar 
6587f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
6588f714a188SAmr Mokhtar 
6589f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
6590f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
6591f714a188SAmr Mokhtar 
6592d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
6593d819c083SNicolas Chautru 	printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
6594f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
6595f714a188SAmr Mokhtar 
65966e024c4bSNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
65976e024c4bSNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
6598f714a188SAmr Mokhtar 		iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id,
65999fa6ebdeSKamil Chalupnik 				num_to_process, burst_sz, &deq_total_time,
66006e024c4bSNicolas Chautru 				&deq_min_time, &deq_max_time, op_type);
6601f714a188SAmr Mokhtar 	else
6602f714a188SAmr Mokhtar 		iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id,
66039fa6ebdeSKamil Chalupnik 				num_to_process, burst_sz, &deq_total_time,
66046e024c4bSNicolas Chautru 				&deq_min_time, &deq_max_time, op_type);
6605f714a188SAmr Mokhtar 
6606c3aaec26SAmr Mokhtar 	if (iter <= 0)
6607f714a188SAmr Mokhtar 		return TEST_FAILED;
6608f714a188SAmr Mokhtar 
6609d819c083SNicolas Chautru 	printf("Empty dequeue offload:\n"
6610d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
6611d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
6612d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
66139fa6ebdeSKamil Chalupnik 			(double)deq_total_time / (double)iter,
66149fa6ebdeSKamil Chalupnik 			(double)(deq_total_time * 1000000) / (double)iter /
6615864edd69SKamil Chalupnik 			(double)rte_get_tsc_hz(), (double)deq_min_time,
6616864edd69SKamil Chalupnik 			(double)(deq_min_time * 1000000) / rte_get_tsc_hz(),
6617864edd69SKamil Chalupnik 			(double)deq_max_time, (double)(deq_max_time * 1000000) /
6618864edd69SKamil Chalupnik 			rte_get_tsc_hz());
6619f714a188SAmr Mokhtar 
6620f714a188SAmr Mokhtar 	return TEST_SUCCESS;
6621f714a188SAmr Mokhtar }
6622f714a188SAmr Mokhtar 
6623f714a188SAmr Mokhtar static int
6624f41c6e4dSNicolas Chautru bler_tc(void)
6625f41c6e4dSNicolas Chautru {
6626f41c6e4dSNicolas Chautru 	return run_test_case(bler_test);
6627f41c6e4dSNicolas Chautru }
6628f41c6e4dSNicolas Chautru 
6629f41c6e4dSNicolas Chautru static int
6630f714a188SAmr Mokhtar throughput_tc(void)
6631f714a188SAmr Mokhtar {
6632f714a188SAmr Mokhtar 	return run_test_case(throughput_test);
6633f714a188SAmr Mokhtar }
6634f714a188SAmr Mokhtar 
6635f714a188SAmr Mokhtar static int
6636864edd69SKamil Chalupnik offload_cost_tc(void)
6637f714a188SAmr Mokhtar {
6638864edd69SKamil Chalupnik 	return run_test_case(offload_cost_test);
6639f714a188SAmr Mokhtar }
6640f714a188SAmr Mokhtar 
6641f714a188SAmr Mokhtar static int
6642f714a188SAmr Mokhtar offload_latency_empty_q_tc(void)
6643f714a188SAmr Mokhtar {
6644f714a188SAmr Mokhtar 	return run_test_case(offload_latency_empty_q_test);
6645f714a188SAmr Mokhtar }
6646f714a188SAmr Mokhtar 
6647f714a188SAmr Mokhtar static int
6648864edd69SKamil Chalupnik latency_tc(void)
6649f714a188SAmr Mokhtar {
6650864edd69SKamil Chalupnik 	return run_test_case(latency_test);
6651f714a188SAmr Mokhtar }
6652f714a188SAmr Mokhtar 
6653f714a188SAmr Mokhtar static int
66540ab66275SNicolas Chautru validation_tc(void)
66550ab66275SNicolas Chautru {
66560ab66275SNicolas Chautru 	return run_test_case(validation_test);
66570ab66275SNicolas Chautru }
66580ab66275SNicolas Chautru 
66590ab66275SNicolas Chautru static int
6660f714a188SAmr Mokhtar interrupt_tc(void)
6661f714a188SAmr Mokhtar {
6662f714a188SAmr Mokhtar 	return run_test_case(throughput_test);
6663f714a188SAmr Mokhtar }
6664f714a188SAmr Mokhtar 
6665f41c6e4dSNicolas Chautru static struct unit_test_suite bbdev_bler_testsuite = {
6666f41c6e4dSNicolas Chautru 	.suite_name = "BBdev BLER Tests",
6667f41c6e4dSNicolas Chautru 	.setup = testsuite_setup,
6668f41c6e4dSNicolas Chautru 	.teardown = testsuite_teardown,
6669f41c6e4dSNicolas Chautru 	.unit_test_cases = {
6670f41c6e4dSNicolas Chautru 		TEST_CASE_ST(ut_setup, ut_teardown, bler_tc),
6671f41c6e4dSNicolas Chautru 		TEST_CASES_END() /**< NULL terminate unit test array */
6672f41c6e4dSNicolas Chautru 	}
6673f41c6e4dSNicolas Chautru };
6674f41c6e4dSNicolas Chautru 
6675f714a188SAmr Mokhtar static struct unit_test_suite bbdev_throughput_testsuite = {
6676f714a188SAmr Mokhtar 	.suite_name = "BBdev Throughput Tests",
6677f714a188SAmr Mokhtar 	.setup = testsuite_setup,
6678f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
6679f714a188SAmr Mokhtar 	.unit_test_cases = {
6680f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc),
6681f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
6682f714a188SAmr Mokhtar 	}
6683f714a188SAmr Mokhtar };
6684f714a188SAmr Mokhtar 
6685f714a188SAmr Mokhtar static struct unit_test_suite bbdev_validation_testsuite = {
6686f714a188SAmr Mokhtar 	.suite_name = "BBdev Validation Tests",
6687f714a188SAmr Mokhtar 	.setup = testsuite_setup,
6688f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
6689f714a188SAmr Mokhtar 	.unit_test_cases = {
66900ab66275SNicolas Chautru 		TEST_CASE_ST(ut_setup, ut_teardown, validation_tc),
6691f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
6692f714a188SAmr Mokhtar 	}
6693f714a188SAmr Mokhtar };
6694f714a188SAmr Mokhtar 
6695f714a188SAmr Mokhtar static struct unit_test_suite bbdev_latency_testsuite = {
6696f714a188SAmr Mokhtar 	.suite_name = "BBdev Latency Tests",
6697f714a188SAmr Mokhtar 	.setup = testsuite_setup,
6698f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
6699f714a188SAmr Mokhtar 	.unit_test_cases = {
6700864edd69SKamil Chalupnik 		TEST_CASE_ST(ut_setup, ut_teardown, latency_tc),
6701864edd69SKamil Chalupnik 		TEST_CASES_END() /**< NULL terminate unit test array */
6702864edd69SKamil Chalupnik 	}
6703864edd69SKamil Chalupnik };
6704864edd69SKamil Chalupnik 
6705864edd69SKamil Chalupnik static struct unit_test_suite bbdev_offload_cost_testsuite = {
6706864edd69SKamil Chalupnik 	.suite_name = "BBdev Offload Cost Tests",
6707864edd69SKamil Chalupnik 	.setup = testsuite_setup,
6708864edd69SKamil Chalupnik 	.teardown = testsuite_teardown,
6709864edd69SKamil Chalupnik 	.unit_test_cases = {
6710864edd69SKamil Chalupnik 		TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc),
6711f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc),
6712f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
6713f714a188SAmr Mokhtar 	}
6714f714a188SAmr Mokhtar };
6715f714a188SAmr Mokhtar 
6716f714a188SAmr Mokhtar static struct unit_test_suite bbdev_interrupt_testsuite = {
6717f714a188SAmr Mokhtar 	.suite_name = "BBdev Interrupt Tests",
6718f714a188SAmr Mokhtar 	.setup = interrupt_testsuite_setup,
6719f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
6720f714a188SAmr Mokhtar 	.unit_test_cases = {
6721f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc),
6722f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
6723f714a188SAmr Mokhtar 	}
6724f714a188SAmr Mokhtar };
6725f714a188SAmr Mokhtar 
6726f41c6e4dSNicolas Chautru REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite);
6727f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite);
6728f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite);
6729f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite);
6730864edd69SKamil Chalupnik REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite);
6731f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite);
6732