xref: /dpdk/app/test-bbdev/test_bbdev_perf.c (revision f83f3147)
1f714a188SAmr Mokhtar /* SPDX-License-Identifier: BSD-3-Clause
2f714a188SAmr Mokhtar  * Copyright(c) 2017 Intel Corporation
3f714a188SAmr Mokhtar  */
4f714a188SAmr Mokhtar 
5f714a188SAmr Mokhtar #include <stdio.h>
6f714a188SAmr Mokhtar #include <inttypes.h>
747d5a049SKamil Chalupnik #include <math.h>
8f714a188SAmr Mokhtar 
9f714a188SAmr Mokhtar #include <rte_eal.h>
10f714a188SAmr Mokhtar #include <rte_common.h>
11f714a188SAmr Mokhtar #include <rte_dev.h>
12f714a188SAmr Mokhtar #include <rte_launch.h>
13f714a188SAmr Mokhtar #include <rte_bbdev.h>
14f714a188SAmr Mokhtar #include <rte_cycles.h>
15f714a188SAmr Mokhtar #include <rte_lcore.h>
16f714a188SAmr Mokhtar #include <rte_malloc.h>
17f714a188SAmr Mokhtar #include <rte_random.h>
18f714a188SAmr Mokhtar #include <rte_hexdump.h>
19d819c083SNicolas Chautru #include <rte_interrupts.h>
20d819c083SNicolas Chautru 
21f714a188SAmr Mokhtar #include "main.h"
22f714a188SAmr Mokhtar #include "test_bbdev_vector.h"
23f714a188SAmr Mokhtar 
24f714a188SAmr Mokhtar #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id))
25f714a188SAmr Mokhtar 
26f714a188SAmr Mokhtar #define MAX_QUEUES RTE_MAX_LCORE
272ad0b152SNicolas Chautru #define TEST_REPETITIONS 100
285c3f7fc5SNicolas Chautru #define WAIT_OFFLOAD_US 1000
29f714a188SAmr Mokhtar 
30a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC
319f17582cSNicolas Chautru #include <fpga_lte_fec.h>
329f17582cSNicolas Chautru #define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf")
339f17582cSNicolas Chautru #define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf")
349f17582cSNicolas Chautru #define VF_UL_4G_QUEUE_VALUE 4
359f17582cSNicolas Chautru #define VF_DL_4G_QUEUE_VALUE 4
369f17582cSNicolas Chautru #define UL_4G_BANDWIDTH 3
379f17582cSNicolas Chautru #define DL_4G_BANDWIDTH 3
389f17582cSNicolas Chautru #define UL_4G_LOAD_BALANCE 128
399f17582cSNicolas Chautru #define DL_4G_LOAD_BALANCE 128
409f17582cSNicolas Chautru #define FLR_4G_TIMEOUT 610
41d819c083SNicolas Chautru #endif
42d819c083SNicolas Chautru 
43a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC
442d430643SNicolas Chautru #include <rte_pmd_fpga_5gnr_fec.h>
452d430643SNicolas Chautru #define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf")
462d430643SNicolas Chautru #define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf")
472d430643SNicolas Chautru #define VF_UL_5G_QUEUE_VALUE 4
482d430643SNicolas Chautru #define VF_DL_5G_QUEUE_VALUE 4
492d430643SNicolas Chautru #define UL_5G_BANDWIDTH 3
502d430643SNicolas Chautru #define DL_5G_BANDWIDTH 3
512d430643SNicolas Chautru #define UL_5G_LOAD_BALANCE 128
522d430643SNicolas Chautru #define DL_5G_LOAD_BALANCE 128
532d430643SNicolas Chautru #define FLR_5G_TIMEOUT 610
542d430643SNicolas Chautru #endif
552d430643SNicolas Chautru 
56a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_ACC100
57b17d7092SNicolas Chautru #include <rte_acc100_cfg.h>
58b17d7092SNicolas Chautru #define ACC100PF_DRIVER_NAME   ("intel_acc100_pf")
59b17d7092SNicolas Chautru #define ACC100VF_DRIVER_NAME   ("intel_acc100_vf")
60b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_AQS 16
61b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_QGS 2
62b17d7092SNicolas Chautru #define ACC100_QMGR_AQ_DEPTH 5
63b17d7092SNicolas Chautru #define ACC100_QMGR_INVALID_IDX -1
64b17d7092SNicolas Chautru #define ACC100_QMGR_RR 1
65b17d7092SNicolas Chautru #define ACC100_QOS_GBR 0
66b17d7092SNicolas Chautru #endif
67b17d7092SNicolas Chautru 
68f714a188SAmr Mokhtar #define OPS_CACHE_SIZE 256U
69f714a188SAmr Mokhtar #define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */
70f714a188SAmr Mokhtar 
71f714a188SAmr Mokhtar #define SYNC_WAIT 0
72f714a188SAmr Mokhtar #define SYNC_START 1
73335c11fdSNicolas Chautru #define INVALID_OPAQUE -1
74f714a188SAmr Mokhtar 
75f714a188SAmr Mokhtar #define INVALID_QUEUE_ID -1
76335c11fdSNicolas Chautru /* Increment for next code block in external HARQ memory */
77335c11fdSNicolas Chautru #define HARQ_INCR 32768
78335c11fdSNicolas Chautru /* Headroom for filler LLRs insertion in HARQ buffer */
79335c11fdSNicolas Chautru #define FILLER_HEADROOM 1024
80335c11fdSNicolas Chautru /* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */
81335c11fdSNicolas Chautru #define N_ZC_1 66 /* N = 66 Zc for BG 1 */
82335c11fdSNicolas Chautru #define N_ZC_2 50 /* N = 50 Zc for BG 2 */
83335c11fdSNicolas Chautru #define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */
84335c11fdSNicolas Chautru #define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */
85335c11fdSNicolas Chautru #define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */
86335c11fdSNicolas Chautru #define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */
87335c11fdSNicolas Chautru #define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */
88335c11fdSNicolas Chautru #define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */
89f714a188SAmr Mokhtar 
90f714a188SAmr Mokhtar static struct test_bbdev_vector test_vector;
91f714a188SAmr Mokhtar 
92f714a188SAmr Mokhtar /* Switch between PMD and Interrupt for throughput TC */
93f714a188SAmr Mokhtar static bool intr_enabled;
94f714a188SAmr Mokhtar 
95335c11fdSNicolas Chautru /* LLR arithmetic representation for numerical conversion */
96335c11fdSNicolas Chautru static int ldpc_llr_decimals;
97335c11fdSNicolas Chautru static int ldpc_llr_size;
98335c11fdSNicolas Chautru /* Keep track of the LDPC decoder device capability flag */
99335c11fdSNicolas Chautru static uint32_t ldpc_cap_flags;
100335c11fdSNicolas Chautru 
101f714a188SAmr Mokhtar /* Represents tested active devices */
102f714a188SAmr Mokhtar static struct active_device {
103f714a188SAmr Mokhtar 	const char *driver_name;
104f714a188SAmr Mokhtar 	uint8_t dev_id;
105f714a188SAmr Mokhtar 	uint16_t supported_ops;
106f714a188SAmr Mokhtar 	uint16_t queue_ids[MAX_QUEUES];
107f714a188SAmr Mokhtar 	uint16_t nb_queues;
108f714a188SAmr Mokhtar 	struct rte_mempool *ops_mempool;
109f714a188SAmr Mokhtar 	struct rte_mempool *in_mbuf_pool;
110f714a188SAmr Mokhtar 	struct rte_mempool *hard_out_mbuf_pool;
111f714a188SAmr Mokhtar 	struct rte_mempool *soft_out_mbuf_pool;
112d819c083SNicolas Chautru 	struct rte_mempool *harq_in_mbuf_pool;
113d819c083SNicolas Chautru 	struct rte_mempool *harq_out_mbuf_pool;
114f714a188SAmr Mokhtar } active_devs[RTE_BBDEV_MAX_DEVS];
115f714a188SAmr Mokhtar 
116f714a188SAmr Mokhtar static uint8_t nb_active_devs;
117f714a188SAmr Mokhtar 
118f714a188SAmr Mokhtar /* Data buffers used by BBDEV ops */
119f714a188SAmr Mokhtar struct test_buffers {
120f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *inputs;
121f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *hard_outputs;
122f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *soft_outputs;
123d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_inputs;
124d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_outputs;
125f714a188SAmr Mokhtar };
126f714a188SAmr Mokhtar 
127f714a188SAmr Mokhtar /* Operation parameters specific for given test case */
128f714a188SAmr Mokhtar struct test_op_params {
129f714a188SAmr Mokhtar 	struct rte_mempool *mp;
130f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ref_dec_op;
131f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ref_enc_op;
132f714a188SAmr Mokhtar 	uint16_t burst_sz;
133f714a188SAmr Mokhtar 	uint16_t num_to_process;
134f714a188SAmr Mokhtar 	uint16_t num_lcores;
135f714a188SAmr Mokhtar 	int vector_mask;
136*f83f3147SJoyce Kong 	uint16_t sync;
137f714a188SAmr Mokhtar 	struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES];
138f714a188SAmr Mokhtar };
139f714a188SAmr Mokhtar 
140f714a188SAmr Mokhtar /* Contains per lcore params */
141f714a188SAmr Mokhtar struct thread_params {
142f714a188SAmr Mokhtar 	uint8_t dev_id;
143f714a188SAmr Mokhtar 	uint16_t queue_id;
144b2e2aec3SKamil Chalupnik 	uint32_t lcore_id;
145f714a188SAmr Mokhtar 	uint64_t start_time;
1460b98d574SKamil Chalupnik 	double ops_per_sec;
147f714a188SAmr Mokhtar 	double mbps;
1480b98d574SKamil Chalupnik 	uint8_t iter_count;
149f41c6e4dSNicolas Chautru 	double iter_average;
150f41c6e4dSNicolas Chautru 	double bler;
151*f83f3147SJoyce Kong 	uint16_t nb_dequeued;
152*f83f3147SJoyce Kong 	int16_t processing_status;
153*f83f3147SJoyce Kong 	uint16_t burst_sz;
154f714a188SAmr Mokhtar 	struct test_op_params *op_params;
155b2e2aec3SKamil Chalupnik 	struct rte_bbdev_dec_op *dec_ops[MAX_BURST];
156b2e2aec3SKamil Chalupnik 	struct rte_bbdev_enc_op *enc_ops[MAX_BURST];
157f714a188SAmr Mokhtar };
158f714a188SAmr Mokhtar 
159864edd69SKamil Chalupnik #ifdef RTE_BBDEV_OFFLOAD_COST
160864edd69SKamil Chalupnik /* Stores time statistics */
161864edd69SKamil Chalupnik struct test_time_stats {
162864edd69SKamil Chalupnik 	/* Stores software enqueue total working time */
1639fa6ebdeSKamil Chalupnik 	uint64_t enq_sw_total_time;
164864edd69SKamil Chalupnik 	/* Stores minimum value of software enqueue working time */
165864edd69SKamil Chalupnik 	uint64_t enq_sw_min_time;
166864edd69SKamil Chalupnik 	/* Stores maximum value of software enqueue working time */
167864edd69SKamil Chalupnik 	uint64_t enq_sw_max_time;
168864edd69SKamil Chalupnik 	/* Stores turbo enqueue total working time */
1699fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_total_time;
1709fa6ebdeSKamil Chalupnik 	/* Stores minimum value of accelerator enqueue working time */
1719fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_min_time;
1729fa6ebdeSKamil Chalupnik 	/* Stores maximum value of accelerator enqueue working time */
1739fa6ebdeSKamil Chalupnik 	uint64_t enq_acc_max_time;
174864edd69SKamil Chalupnik 	/* Stores dequeue total working time */
1759fa6ebdeSKamil Chalupnik 	uint64_t deq_total_time;
176864edd69SKamil Chalupnik 	/* Stores minimum value of dequeue working time */
177864edd69SKamil Chalupnik 	uint64_t deq_min_time;
178864edd69SKamil Chalupnik 	/* Stores maximum value of dequeue working time */
179864edd69SKamil Chalupnik 	uint64_t deq_max_time;
180864edd69SKamil Chalupnik };
181864edd69SKamil Chalupnik #endif
182864edd69SKamil Chalupnik 
183f714a188SAmr Mokhtar typedef int (test_case_function)(struct active_device *ad,
184f714a188SAmr Mokhtar 		struct test_op_params *op_params);
185f714a188SAmr Mokhtar 
186f714a188SAmr Mokhtar static inline void
mbuf_reset(struct rte_mbuf * m)1879585f8b1SKamil Chalupnik mbuf_reset(struct rte_mbuf *m)
1889585f8b1SKamil Chalupnik {
1899585f8b1SKamil Chalupnik 	m->pkt_len = 0;
1909585f8b1SKamil Chalupnik 
1919585f8b1SKamil Chalupnik 	do {
1929585f8b1SKamil Chalupnik 		m->data_len = 0;
1939585f8b1SKamil Chalupnik 		m = m->next;
1949585f8b1SKamil Chalupnik 	} while (m != NULL);
1959585f8b1SKamil Chalupnik }
1969585f8b1SKamil Chalupnik 
197d819c083SNicolas Chautru /* Read flag value 0/1 from bitmap */
198d819c083SNicolas Chautru static inline bool
check_bit(uint32_t bitmap,uint32_t bitmask)199d819c083SNicolas Chautru check_bit(uint32_t bitmap, uint32_t bitmask)
200d819c083SNicolas Chautru {
201d819c083SNicolas Chautru 	return bitmap & bitmask;
202d819c083SNicolas Chautru }
203d819c083SNicolas Chautru 
2049585f8b1SKamil Chalupnik static inline void
set_avail_op(struct active_device * ad,enum rte_bbdev_op_type op_type)205f714a188SAmr Mokhtar set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
206f714a188SAmr Mokhtar {
207f714a188SAmr Mokhtar 	ad->supported_ops |= (1 << op_type);
208f714a188SAmr Mokhtar }
209f714a188SAmr Mokhtar 
210f714a188SAmr Mokhtar static inline bool
is_avail_op(struct active_device * ad,enum rte_bbdev_op_type op_type)211f714a188SAmr Mokhtar is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type)
212f714a188SAmr Mokhtar {
213f714a188SAmr Mokhtar 	return ad->supported_ops & (1 << op_type);
214f714a188SAmr Mokhtar }
215f714a188SAmr Mokhtar 
216f714a188SAmr Mokhtar static inline bool
flags_match(uint32_t flags_req,uint32_t flags_present)217f714a188SAmr Mokhtar flags_match(uint32_t flags_req, uint32_t flags_present)
218f714a188SAmr Mokhtar {
219f714a188SAmr Mokhtar 	return (flags_req & flags_present) == flags_req;
220f714a188SAmr Mokhtar }
221f714a188SAmr Mokhtar 
222f714a188SAmr Mokhtar static void
clear_soft_out_cap(uint32_t * op_flags)223f714a188SAmr Mokhtar clear_soft_out_cap(uint32_t *op_flags)
224f714a188SAmr Mokhtar {
225f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT;
226f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
227f714a188SAmr Mokhtar 	*op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
228f714a188SAmr Mokhtar }
229f714a188SAmr Mokhtar 
230441ac2e0SNipun Gupta /* This API is to convert all the test vector op data entries
231441ac2e0SNipun Gupta  * to big endian format. It is used when the device supports
232441ac2e0SNipun Gupta  * the input in the big endian format.
233441ac2e0SNipun Gupta  */
234441ac2e0SNipun Gupta static inline void
convert_op_data_to_be(void)235441ac2e0SNipun Gupta convert_op_data_to_be(void)
236441ac2e0SNipun Gupta {
237441ac2e0SNipun Gupta 	struct op_data_entries *op;
238441ac2e0SNipun Gupta 	enum op_data_type type;
239441ac2e0SNipun Gupta 	uint8_t nb_segs, *rem_data, temp;
240441ac2e0SNipun Gupta 	uint32_t *data, len;
241441ac2e0SNipun Gupta 	int complete, rem, i, j;
242441ac2e0SNipun Gupta 
243441ac2e0SNipun Gupta 	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
244441ac2e0SNipun Gupta 		nb_segs = test_vector.entries[type].nb_segments;
245441ac2e0SNipun Gupta 		op = &test_vector.entries[type];
246441ac2e0SNipun Gupta 
247441ac2e0SNipun Gupta 		/* Invert byte endianness for all the segments */
248441ac2e0SNipun Gupta 		for (i = 0; i < nb_segs; ++i) {
249441ac2e0SNipun Gupta 			len = op->segments[i].length;
250441ac2e0SNipun Gupta 			data = op->segments[i].addr;
251441ac2e0SNipun Gupta 
252441ac2e0SNipun Gupta 			/* Swap complete u32 bytes */
253441ac2e0SNipun Gupta 			complete = len / 4;
254441ac2e0SNipun Gupta 			for (j = 0; j < complete; j++)
255441ac2e0SNipun Gupta 				data[j] = rte_bswap32(data[j]);
256441ac2e0SNipun Gupta 
257441ac2e0SNipun Gupta 			/* Swap any remaining bytes */
258441ac2e0SNipun Gupta 			rem = len % 4;
259441ac2e0SNipun Gupta 			rem_data = (uint8_t *)&data[j];
260441ac2e0SNipun Gupta 			for (j = 0; j < rem/2; j++) {
261441ac2e0SNipun Gupta 				temp = rem_data[j];
262441ac2e0SNipun Gupta 				rem_data[j] = rem_data[rem - j - 1];
263441ac2e0SNipun Gupta 				rem_data[rem - j - 1] = temp;
264441ac2e0SNipun Gupta 			}
265441ac2e0SNipun Gupta 		}
266441ac2e0SNipun Gupta 	}
267441ac2e0SNipun Gupta }
268441ac2e0SNipun Gupta 
269f714a188SAmr Mokhtar static int
check_dev_cap(const struct rte_bbdev_info * dev_info)270f714a188SAmr Mokhtar check_dev_cap(const struct rte_bbdev_info *dev_info)
271f714a188SAmr Mokhtar {
272f714a188SAmr Mokhtar 	unsigned int i;
273d819c083SNicolas Chautru 	unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs,
274d819c083SNicolas Chautru 		nb_harq_inputs, nb_harq_outputs;
275f714a188SAmr Mokhtar 	const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities;
276441ac2e0SNipun Gupta 	uint8_t dev_data_endianness = dev_info->drv.data_endianness;
277f714a188SAmr Mokhtar 
278f714a188SAmr Mokhtar 	nb_inputs = test_vector.entries[DATA_INPUT].nb_segments;
279f714a188SAmr Mokhtar 	nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments;
280f714a188SAmr Mokhtar 	nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments;
281d819c083SNicolas Chautru 	nb_harq_inputs  = test_vector.entries[DATA_HARQ_INPUT].nb_segments;
282d819c083SNicolas Chautru 	nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments;
283f714a188SAmr Mokhtar 
284f714a188SAmr Mokhtar 	for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) {
285f714a188SAmr Mokhtar 		if (op_cap->type != test_vector.op_type)
286f714a188SAmr Mokhtar 			continue;
287f714a188SAmr Mokhtar 
288441ac2e0SNipun Gupta 		if (dev_data_endianness == RTE_BIG_ENDIAN)
289441ac2e0SNipun Gupta 			convert_op_data_to_be();
290441ac2e0SNipun Gupta 
291f714a188SAmr Mokhtar 		if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) {
292f714a188SAmr Mokhtar 			const struct rte_bbdev_op_cap_turbo_dec *cap =
293f714a188SAmr Mokhtar 					&op_cap->cap.turbo_dec;
294f714a188SAmr Mokhtar 			/* Ignore lack of soft output capability, just skip
295f714a188SAmr Mokhtar 			 * checking if soft output is valid.
296f714a188SAmr Mokhtar 			 */
297f714a188SAmr Mokhtar 			if ((test_vector.turbo_dec.op_flags &
298f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
299f714a188SAmr Mokhtar 					!(cap->capability_flags &
300f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
301f714a188SAmr Mokhtar 				printf(
302d819c083SNicolas Chautru 					"INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n",
303f714a188SAmr Mokhtar 					dev_info->dev_name);
304f714a188SAmr Mokhtar 				clear_soft_out_cap(
305f714a188SAmr Mokhtar 					&test_vector.turbo_dec.op_flags);
306f714a188SAmr Mokhtar 			}
307f714a188SAmr Mokhtar 
308f714a188SAmr Mokhtar 			if (!flags_match(test_vector.turbo_dec.op_flags,
309f714a188SAmr Mokhtar 					cap->capability_flags))
310f714a188SAmr Mokhtar 				return TEST_FAILED;
311f714a188SAmr Mokhtar 			if (nb_inputs > cap->num_buffers_src) {
312f714a188SAmr Mokhtar 				printf("Too many inputs defined: %u, max: %u\n",
313f714a188SAmr Mokhtar 					nb_inputs, cap->num_buffers_src);
314f714a188SAmr Mokhtar 				return TEST_FAILED;
315f714a188SAmr Mokhtar 			}
316f714a188SAmr Mokhtar 			if (nb_soft_outputs > cap->num_buffers_soft_out &&
317f714a188SAmr Mokhtar 					(test_vector.turbo_dec.op_flags &
318f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_SOFT_OUTPUT)) {
319f714a188SAmr Mokhtar 				printf(
320f714a188SAmr Mokhtar 					"Too many soft outputs defined: %u, max: %u\n",
321f714a188SAmr Mokhtar 						nb_soft_outputs,
322f714a188SAmr Mokhtar 						cap->num_buffers_soft_out);
323f714a188SAmr Mokhtar 				return TEST_FAILED;
324f714a188SAmr Mokhtar 			}
325f714a188SAmr Mokhtar 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
326f714a188SAmr Mokhtar 				printf(
327f714a188SAmr Mokhtar 					"Too many hard outputs defined: %u, max: %u\n",
328f714a188SAmr Mokhtar 						nb_hard_outputs,
329f714a188SAmr Mokhtar 						cap->num_buffers_hard_out);
330f714a188SAmr Mokhtar 				return TEST_FAILED;
331f714a188SAmr Mokhtar 			}
332f714a188SAmr Mokhtar 			if (intr_enabled && !(cap->capability_flags &
333f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_DEC_INTERRUPTS)) {
334f714a188SAmr Mokhtar 				printf(
335f714a188SAmr Mokhtar 					"Dequeue interrupts are not supported!\n");
336f714a188SAmr Mokhtar 				return TEST_FAILED;
337f714a188SAmr Mokhtar 			}
338f714a188SAmr Mokhtar 
339f714a188SAmr Mokhtar 			return TEST_SUCCESS;
340f714a188SAmr Mokhtar 		} else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) {
341f714a188SAmr Mokhtar 			const struct rte_bbdev_op_cap_turbo_enc *cap =
342f714a188SAmr Mokhtar 					&op_cap->cap.turbo_enc;
343f714a188SAmr Mokhtar 
344f714a188SAmr Mokhtar 			if (!flags_match(test_vector.turbo_enc.op_flags,
345f714a188SAmr Mokhtar 					cap->capability_flags))
346f714a188SAmr Mokhtar 				return TEST_FAILED;
347f714a188SAmr Mokhtar 			if (nb_inputs > cap->num_buffers_src) {
348f714a188SAmr Mokhtar 				printf("Too many inputs defined: %u, max: %u\n",
349f714a188SAmr Mokhtar 					nb_inputs, cap->num_buffers_src);
350f714a188SAmr Mokhtar 				return TEST_FAILED;
351f714a188SAmr Mokhtar 			}
352f714a188SAmr Mokhtar 			if (nb_hard_outputs > cap->num_buffers_dst) {
353f714a188SAmr Mokhtar 				printf(
354f714a188SAmr Mokhtar 					"Too many hard outputs defined: %u, max: %u\n",
355d819c083SNicolas Chautru 					nb_hard_outputs, cap->num_buffers_dst);
356f714a188SAmr Mokhtar 				return TEST_FAILED;
357f714a188SAmr Mokhtar 			}
358f714a188SAmr Mokhtar 			if (intr_enabled && !(cap->capability_flags &
359f714a188SAmr Mokhtar 					RTE_BBDEV_TURBO_ENC_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;
366d819c083SNicolas Chautru 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) {
367d819c083SNicolas Chautru 			const struct rte_bbdev_op_cap_ldpc_enc *cap =
368d819c083SNicolas Chautru 					&op_cap->cap.ldpc_enc;
369d819c083SNicolas Chautru 
370d819c083SNicolas Chautru 			if (!flags_match(test_vector.ldpc_enc.op_flags,
371d819c083SNicolas Chautru 					cap->capability_flags)){
372d819c083SNicolas Chautru 				printf("Flag Mismatch\n");
373d819c083SNicolas Chautru 				return TEST_FAILED;
374d819c083SNicolas Chautru 			}
375d819c083SNicolas Chautru 			if (nb_inputs > cap->num_buffers_src) {
376d819c083SNicolas Chautru 				printf("Too many inputs defined: %u, max: %u\n",
377d819c083SNicolas Chautru 					nb_inputs, cap->num_buffers_src);
378d819c083SNicolas Chautru 				return TEST_FAILED;
379d819c083SNicolas Chautru 			}
380d819c083SNicolas Chautru 			if (nb_hard_outputs > cap->num_buffers_dst) {
381d819c083SNicolas Chautru 				printf(
382d819c083SNicolas Chautru 					"Too many hard outputs defined: %u, max: %u\n",
383d819c083SNicolas Chautru 					nb_hard_outputs, cap->num_buffers_dst);
384d819c083SNicolas Chautru 				return TEST_FAILED;
385d819c083SNicolas Chautru 			}
386d819c083SNicolas Chautru 			if (intr_enabled && !(cap->capability_flags &
387335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_ENC_INTERRUPTS)) {
388d819c083SNicolas Chautru 				printf(
389d819c083SNicolas Chautru 					"Dequeue interrupts are not supported!\n");
390d819c083SNicolas Chautru 				return TEST_FAILED;
391d819c083SNicolas Chautru 			}
392d819c083SNicolas Chautru 
393d819c083SNicolas Chautru 			return TEST_SUCCESS;
394d819c083SNicolas Chautru 		} else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) {
395d819c083SNicolas Chautru 			const struct rte_bbdev_op_cap_ldpc_dec *cap =
396d819c083SNicolas Chautru 					&op_cap->cap.ldpc_dec;
397d819c083SNicolas Chautru 
398d819c083SNicolas Chautru 			if (!flags_match(test_vector.ldpc_dec.op_flags,
399d819c083SNicolas Chautru 					cap->capability_flags)){
400d819c083SNicolas Chautru 				printf("Flag Mismatch\n");
401d819c083SNicolas Chautru 				return TEST_FAILED;
402d819c083SNicolas Chautru 			}
403d819c083SNicolas Chautru 			if (nb_inputs > cap->num_buffers_src) {
404d819c083SNicolas Chautru 				printf("Too many inputs defined: %u, max: %u\n",
405d819c083SNicolas Chautru 					nb_inputs, cap->num_buffers_src);
406d819c083SNicolas Chautru 				return TEST_FAILED;
407d819c083SNicolas Chautru 			}
408d819c083SNicolas Chautru 			if (nb_hard_outputs > cap->num_buffers_hard_out) {
409d819c083SNicolas Chautru 				printf(
410d819c083SNicolas Chautru 					"Too many hard outputs defined: %u, max: %u\n",
411d819c083SNicolas Chautru 					nb_hard_outputs,
412d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
413d819c083SNicolas Chautru 				return TEST_FAILED;
414d819c083SNicolas Chautru 			}
415d819c083SNicolas Chautru 			if (nb_harq_inputs > cap->num_buffers_hard_out) {
416d819c083SNicolas Chautru 				printf(
417d819c083SNicolas Chautru 					"Too many HARQ inputs defined: %u, max: %u\n",
41849ca9e5aSMin Hu (Connor) 					nb_harq_inputs,
419d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
420d819c083SNicolas Chautru 				return TEST_FAILED;
421d819c083SNicolas Chautru 			}
422d819c083SNicolas Chautru 			if (nb_harq_outputs > cap->num_buffers_hard_out) {
423d819c083SNicolas Chautru 				printf(
424d819c083SNicolas Chautru 					"Too many HARQ outputs defined: %u, max: %u\n",
42549ca9e5aSMin Hu (Connor) 					nb_harq_outputs,
426d819c083SNicolas Chautru 					cap->num_buffers_hard_out);
427d819c083SNicolas Chautru 				return TEST_FAILED;
428d819c083SNicolas Chautru 			}
429d819c083SNicolas Chautru 			if (intr_enabled && !(cap->capability_flags &
430335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_DEC_INTERRUPTS)) {
431d819c083SNicolas Chautru 				printf(
432d819c083SNicolas Chautru 					"Dequeue interrupts are not supported!\n");
433d819c083SNicolas Chautru 				return TEST_FAILED;
434d819c083SNicolas Chautru 			}
435335c11fdSNicolas Chautru 			if (intr_enabled && (test_vector.ldpc_dec.op_flags &
436335c11fdSNicolas Chautru 				(RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE |
437335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE |
438335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK
439335c11fdSNicolas Chautru 					))) {
440335c11fdSNicolas Chautru 				printf("Skip loop-back with interrupt\n");
441335c11fdSNicolas Chautru 				return TEST_FAILED;
442335c11fdSNicolas Chautru 			}
443d819c083SNicolas Chautru 			return TEST_SUCCESS;
444f714a188SAmr Mokhtar 		}
445f714a188SAmr Mokhtar 	}
446f714a188SAmr Mokhtar 
447f714a188SAmr Mokhtar 	if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE))
448f714a188SAmr Mokhtar 		return TEST_SUCCESS; /* Special case for NULL device */
449f714a188SAmr Mokhtar 
450f714a188SAmr Mokhtar 	return TEST_FAILED;
451f714a188SAmr Mokhtar }
452f714a188SAmr Mokhtar 
453f714a188SAmr Mokhtar /* calculates optimal mempool size not smaller than the val */
454f714a188SAmr Mokhtar static unsigned int
optimal_mempool_size(unsigned int val)455f714a188SAmr Mokhtar optimal_mempool_size(unsigned int val)
456f714a188SAmr Mokhtar {
457f714a188SAmr Mokhtar 	return rte_align32pow2(val + 1) - 1;
458f714a188SAmr Mokhtar }
459f714a188SAmr Mokhtar 
460f714a188SAmr Mokhtar /* allocates mbuf mempool for inputs and outputs */
461f714a188SAmr Mokhtar static struct rte_mempool *
create_mbuf_pool(struct op_data_entries * entries,uint8_t dev_id,int socket_id,unsigned int mbuf_pool_size,const char * op_type_str)462f714a188SAmr Mokhtar create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id,
463f714a188SAmr Mokhtar 		int socket_id, unsigned int mbuf_pool_size,
464f714a188SAmr Mokhtar 		const char *op_type_str)
465f714a188SAmr Mokhtar {
466f714a188SAmr Mokhtar 	unsigned int i;
467f714a188SAmr Mokhtar 	uint32_t max_seg_sz = 0;
468f714a188SAmr Mokhtar 	char pool_name[RTE_MEMPOOL_NAMESIZE];
469f714a188SAmr Mokhtar 
470f714a188SAmr Mokhtar 	/* find max input segment size */
471f714a188SAmr Mokhtar 	for (i = 0; i < entries->nb_segments; ++i)
472f714a188SAmr Mokhtar 		if (entries->segments[i].length > max_seg_sz)
473f714a188SAmr Mokhtar 			max_seg_sz = entries->segments[i].length;
474f714a188SAmr Mokhtar 
475f714a188SAmr Mokhtar 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
476f714a188SAmr Mokhtar 			dev_id);
477f714a188SAmr Mokhtar 	return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0,
478335c11fdSNicolas Chautru 			RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM
479335c11fdSNicolas Chautru 					+ FILLER_HEADROOM,
480f714a188SAmr Mokhtar 			(unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id);
481f714a188SAmr Mokhtar }
482f714a188SAmr Mokhtar 
483f714a188SAmr Mokhtar static int
create_mempools(struct active_device * ad,int socket_id,enum rte_bbdev_op_type org_op_type,uint16_t num_ops)484f714a188SAmr Mokhtar create_mempools(struct active_device *ad, int socket_id,
485ad458935SKamil Chalupnik 		enum rte_bbdev_op_type org_op_type, uint16_t num_ops)
486f714a188SAmr Mokhtar {
487f714a188SAmr Mokhtar 	struct rte_mempool *mp;
488f714a188SAmr Mokhtar 	unsigned int ops_pool_size, mbuf_pool_size = 0;
489f714a188SAmr Mokhtar 	char pool_name[RTE_MEMPOOL_NAMESIZE];
490f714a188SAmr Mokhtar 	const char *op_type_str;
491ad458935SKamil Chalupnik 	enum rte_bbdev_op_type op_type = org_op_type;
492f714a188SAmr Mokhtar 
493f714a188SAmr Mokhtar 	struct op_data_entries *in = &test_vector.entries[DATA_INPUT];
494f714a188SAmr Mokhtar 	struct op_data_entries *hard_out =
495f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
496f714a188SAmr Mokhtar 	struct op_data_entries *soft_out =
497f714a188SAmr Mokhtar 			&test_vector.entries[DATA_SOFT_OUTPUT];
498d819c083SNicolas Chautru 	struct op_data_entries *harq_in =
499d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARQ_INPUT];
500d819c083SNicolas Chautru 	struct op_data_entries *harq_out =
501d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARQ_OUTPUT];
502f714a188SAmr Mokhtar 
503f714a188SAmr Mokhtar 	/* allocate ops mempool */
504f714a188SAmr Mokhtar 	ops_pool_size = optimal_mempool_size(RTE_MAX(
505f714a188SAmr Mokhtar 			/* Ops used plus 1 reference op */
506f714a188SAmr Mokhtar 			RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1),
507f714a188SAmr Mokhtar 			/* Minimal cache size plus 1 reference op */
508f714a188SAmr Mokhtar 			(unsigned int)(1.5 * rte_lcore_count() *
509f714a188SAmr Mokhtar 					OPS_CACHE_SIZE + 1)),
510f714a188SAmr Mokhtar 			OPS_POOL_SIZE_MIN));
511f714a188SAmr Mokhtar 
512ad458935SKamil Chalupnik 	if (org_op_type == RTE_BBDEV_OP_NONE)
513ad458935SKamil Chalupnik 		op_type = RTE_BBDEV_OP_TURBO_ENC;
514ad458935SKamil Chalupnik 
515f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
516f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
517f714a188SAmr Mokhtar 
518f714a188SAmr Mokhtar 	snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str,
519f714a188SAmr Mokhtar 			ad->dev_id);
520f714a188SAmr Mokhtar 	mp = rte_bbdev_op_pool_create(pool_name, op_type,
521f714a188SAmr Mokhtar 			ops_pool_size, OPS_CACHE_SIZE, socket_id);
522f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(mp,
523f714a188SAmr Mokhtar 			"ERROR Failed to create %u items ops pool for dev %u on socket %u.",
524f714a188SAmr Mokhtar 			ops_pool_size,
525f714a188SAmr Mokhtar 			ad->dev_id,
526f714a188SAmr Mokhtar 			socket_id);
527f714a188SAmr Mokhtar 	ad->ops_mempool = mp;
528f714a188SAmr Mokhtar 
529ad458935SKamil Chalupnik 	/* Do not create inputs and outputs mbufs for BaseBand Null Device */
530ad458935SKamil Chalupnik 	if (org_op_type == RTE_BBDEV_OP_NONE)
531ad458935SKamil Chalupnik 		return TEST_SUCCESS;
532ad458935SKamil Chalupnik 
533f714a188SAmr Mokhtar 	/* Inputs */
534335c11fdSNicolas Chautru 	if (in->nb_segments > 0) {
535335c11fdSNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
536335c11fdSNicolas Chautru 				in->nb_segments);
537335c11fdSNicolas Chautru 		mp = create_mbuf_pool(in, ad->dev_id, socket_id,
538335c11fdSNicolas Chautru 				mbuf_pool_size, "in");
539f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
540f714a188SAmr Mokhtar 				"ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.",
541f714a188SAmr Mokhtar 				mbuf_pool_size,
542f714a188SAmr Mokhtar 				ad->dev_id,
543f714a188SAmr Mokhtar 				socket_id);
544f714a188SAmr Mokhtar 		ad->in_mbuf_pool = mp;
545335c11fdSNicolas Chautru 	}
546f714a188SAmr Mokhtar 
547f714a188SAmr Mokhtar 	/* Hard outputs */
548335c11fdSNicolas Chautru 	if (hard_out->nb_segments > 0) {
549f714a188SAmr Mokhtar 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
550f714a188SAmr Mokhtar 				hard_out->nb_segments);
551335c11fdSNicolas Chautru 		mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id,
552335c11fdSNicolas Chautru 				mbuf_pool_size,
553f714a188SAmr Mokhtar 				"hard_out");
554f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
555f714a188SAmr Mokhtar 				"ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.",
556f714a188SAmr Mokhtar 				mbuf_pool_size,
557f714a188SAmr Mokhtar 				ad->dev_id,
558f714a188SAmr Mokhtar 				socket_id);
559f714a188SAmr Mokhtar 		ad->hard_out_mbuf_pool = mp;
560335c11fdSNicolas Chautru 	}
561f714a188SAmr Mokhtar 
562f714a188SAmr Mokhtar 	/* Soft outputs */
563d819c083SNicolas Chautru 	if (soft_out->nb_segments > 0) {
564f714a188SAmr Mokhtar 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
565f714a188SAmr Mokhtar 				soft_out->nb_segments);
566d819c083SNicolas Chautru 		mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id,
567d819c083SNicolas Chautru 				mbuf_pool_size,
568f714a188SAmr Mokhtar 				"soft_out");
569f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(mp,
570f714a188SAmr Mokhtar 				"ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.",
571f714a188SAmr Mokhtar 				mbuf_pool_size,
572f714a188SAmr Mokhtar 				ad->dev_id,
573f714a188SAmr Mokhtar 				socket_id);
574f714a188SAmr Mokhtar 		ad->soft_out_mbuf_pool = mp;
575d819c083SNicolas Chautru 	}
576f714a188SAmr Mokhtar 
577d819c083SNicolas Chautru 	/* HARQ inputs */
578d819c083SNicolas Chautru 	if (harq_in->nb_segments > 0) {
579d819c083SNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
580d819c083SNicolas Chautru 				harq_in->nb_segments);
581d819c083SNicolas Chautru 		mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id,
582d819c083SNicolas Chautru 				mbuf_pool_size,
583d819c083SNicolas Chautru 				"harq_in");
584d819c083SNicolas Chautru 		TEST_ASSERT_NOT_NULL(mp,
585d819c083SNicolas Chautru 				"ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.",
586d819c083SNicolas Chautru 				mbuf_pool_size,
587d819c083SNicolas Chautru 				ad->dev_id,
588d819c083SNicolas Chautru 				socket_id);
589d819c083SNicolas Chautru 		ad->harq_in_mbuf_pool = mp;
590d819c083SNicolas Chautru 	}
591d819c083SNicolas Chautru 
592d819c083SNicolas Chautru 	/* HARQ outputs */
593d819c083SNicolas Chautru 	if (harq_out->nb_segments > 0) {
594d819c083SNicolas Chautru 		mbuf_pool_size = optimal_mempool_size(ops_pool_size *
595d819c083SNicolas Chautru 				harq_out->nb_segments);
596d819c083SNicolas Chautru 		mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id,
597d819c083SNicolas Chautru 				mbuf_pool_size,
598d819c083SNicolas Chautru 				"harq_out");
599d819c083SNicolas Chautru 		TEST_ASSERT_NOT_NULL(mp,
600d819c083SNicolas Chautru 				"ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.",
601d819c083SNicolas Chautru 				mbuf_pool_size,
602d819c083SNicolas Chautru 				ad->dev_id,
603d819c083SNicolas Chautru 				socket_id);
604d819c083SNicolas Chautru 		ad->harq_out_mbuf_pool = mp;
605d819c083SNicolas Chautru 	}
606d819c083SNicolas Chautru 
607d819c083SNicolas Chautru 	return TEST_SUCCESS;
608f714a188SAmr Mokhtar }
609f714a188SAmr Mokhtar 
610f714a188SAmr Mokhtar static int
add_bbdev_dev(uint8_t dev_id,struct rte_bbdev_info * info,struct test_bbdev_vector * vector)611f714a188SAmr Mokhtar add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info,
612f714a188SAmr Mokhtar 		struct test_bbdev_vector *vector)
613f714a188SAmr Mokhtar {
614f714a188SAmr Mokhtar 	int ret;
615f714a188SAmr Mokhtar 	unsigned int queue_id;
616f714a188SAmr Mokhtar 	struct rte_bbdev_queue_conf qconf;
617f714a188SAmr Mokhtar 	struct active_device *ad = &active_devs[nb_active_devs];
618f714a188SAmr Mokhtar 	unsigned int nb_queues;
619f714a188SAmr Mokhtar 	enum rte_bbdev_op_type op_type = vector->op_type;
620f714a188SAmr Mokhtar 
621d819c083SNicolas Chautru /* Configure fpga lte fec with PF & VF values
622d819c083SNicolas Chautru  * if '-i' flag is set and using fpga device
623d819c083SNicolas Chautru  */
624a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC
625d819c083SNicolas Chautru 	if ((get_init_device() == true) &&
6269f17582cSNicolas Chautru 		(!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) {
627e6925585SMaxime Coquelin 		struct rte_fpga_lte_fec_conf conf;
628d819c083SNicolas Chautru 		unsigned int i;
629d819c083SNicolas Chautru 
6309f17582cSNicolas Chautru 		printf("Configure FPGA LTE FEC Driver %s with default values\n",
631d819c083SNicolas Chautru 				info->drv.driver_name);
632d819c083SNicolas Chautru 
633d819c083SNicolas Chautru 		/* clear default configuration before initialization */
634e6925585SMaxime Coquelin 		memset(&conf, 0, sizeof(struct rte_fpga_lte_fec_conf));
635d819c083SNicolas Chautru 
636d819c083SNicolas Chautru 		/* Set PF mode :
637d819c083SNicolas Chautru 		 * true if PF is used for data plane
638d819c083SNicolas Chautru 		 * false for VFs
639d819c083SNicolas Chautru 		 */
640d819c083SNicolas Chautru 		conf.pf_mode_en = true;
641d819c083SNicolas Chautru 
642d819c083SNicolas Chautru 		for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) {
643d819c083SNicolas Chautru 			/* Number of UL queues per VF (fpga supports 8 VFs) */
6449f17582cSNicolas Chautru 			conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE;
645d819c083SNicolas Chautru 			/* Number of DL queues per VF (fpga supports 8 VFs) */
6469f17582cSNicolas Chautru 			conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE;
647d819c083SNicolas Chautru 		}
648d819c083SNicolas Chautru 
649d819c083SNicolas Chautru 		/* UL bandwidth. Needed for schedule algorithm */
6509f17582cSNicolas Chautru 		conf.ul_bandwidth = UL_4G_BANDWIDTH;
651d819c083SNicolas Chautru 		/* DL bandwidth */
6529f17582cSNicolas Chautru 		conf.dl_bandwidth = DL_4G_BANDWIDTH;
653d819c083SNicolas Chautru 
654d819c083SNicolas Chautru 		/* UL & DL load Balance Factor to 64 */
6559f17582cSNicolas Chautru 		conf.ul_load_balance = UL_4G_LOAD_BALANCE;
6569f17582cSNicolas Chautru 		conf.dl_load_balance = DL_4G_LOAD_BALANCE;
657d819c083SNicolas Chautru 
658d819c083SNicolas Chautru 		/**< FLR timeout value */
6599f17582cSNicolas Chautru 		conf.flr_time_out = FLR_4G_TIMEOUT;
660d819c083SNicolas Chautru 
661d819c083SNicolas Chautru 		/* setup FPGA PF with configuration information */
662e6925585SMaxime Coquelin 		ret = rte_fpga_lte_fec_configure(info->dev_name, &conf);
663d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
664d819c083SNicolas Chautru 				"Failed to configure 4G FPGA PF for bbdev %s",
665d819c083SNicolas Chautru 				info->dev_name);
666d819c083SNicolas Chautru 	}
667d819c083SNicolas Chautru #endif
668a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC
6692d430643SNicolas Chautru 	if ((get_init_device() == true) &&
6702d430643SNicolas Chautru 		(!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) {
6717adbb468SMaxime Coquelin 		struct rte_fpga_5gnr_fec_conf conf;
6722d430643SNicolas Chautru 		unsigned int i;
6732d430643SNicolas Chautru 
6742d430643SNicolas Chautru 		printf("Configure FPGA 5GNR FEC Driver %s with default values\n",
6752d430643SNicolas Chautru 				info->drv.driver_name);
6762d430643SNicolas Chautru 
6772d430643SNicolas Chautru 		/* clear default configuration before initialization */
6787adbb468SMaxime Coquelin 		memset(&conf, 0, sizeof(struct rte_fpga_5gnr_fec_conf));
6792d430643SNicolas Chautru 
6802d430643SNicolas Chautru 		/* Set PF mode :
6812d430643SNicolas Chautru 		 * true if PF is used for data plane
6822d430643SNicolas Chautru 		 * false for VFs
6832d430643SNicolas Chautru 		 */
6842d430643SNicolas Chautru 		conf.pf_mode_en = true;
6852d430643SNicolas Chautru 
6862d430643SNicolas Chautru 		for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) {
6872d430643SNicolas Chautru 			/* Number of UL queues per VF (fpga supports 8 VFs) */
6882d430643SNicolas Chautru 			conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE;
6892d430643SNicolas Chautru 			/* Number of DL queues per VF (fpga supports 8 VFs) */
6902d430643SNicolas Chautru 			conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE;
6912d430643SNicolas Chautru 		}
6922d430643SNicolas Chautru 
6932d430643SNicolas Chautru 		/* UL bandwidth. Needed for schedule algorithm */
6942d430643SNicolas Chautru 		conf.ul_bandwidth = UL_5G_BANDWIDTH;
6952d430643SNicolas Chautru 		/* DL bandwidth */
6962d430643SNicolas Chautru 		conf.dl_bandwidth = DL_5G_BANDWIDTH;
6972d430643SNicolas Chautru 
6982d430643SNicolas Chautru 		/* UL & DL load Balance Factor to 64 */
6992d430643SNicolas Chautru 		conf.ul_load_balance = UL_5G_LOAD_BALANCE;
7002d430643SNicolas Chautru 		conf.dl_load_balance = DL_5G_LOAD_BALANCE;
7012d430643SNicolas Chautru 
7022d430643SNicolas Chautru 		/**< FLR timeout value */
7032d430643SNicolas Chautru 		conf.flr_time_out = FLR_5G_TIMEOUT;
7042d430643SNicolas Chautru 
7052d430643SNicolas Chautru 		/* setup FPGA PF with configuration information */
7067adbb468SMaxime Coquelin 		ret = rte_fpga_5gnr_fec_configure(info->dev_name, &conf);
7072d430643SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
7082d430643SNicolas Chautru 				"Failed to configure 5G FPGA PF for bbdev %s",
7092d430643SNicolas Chautru 				info->dev_name);
7102d430643SNicolas Chautru 	}
7112d430643SNicolas Chautru #endif
712a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_ACC100
713b17d7092SNicolas Chautru 	if ((get_init_device() == true) &&
714b17d7092SNicolas Chautru 		(!strcmp(info->drv.driver_name, ACC100PF_DRIVER_NAME))) {
715b17d7092SNicolas Chautru 		struct rte_acc100_conf conf;
716b17d7092SNicolas Chautru 		unsigned int i;
717b17d7092SNicolas Chautru 
718b17d7092SNicolas Chautru 		printf("Configure ACC100 FEC Driver %s with default values\n",
719b17d7092SNicolas Chautru 				info->drv.driver_name);
720b17d7092SNicolas Chautru 
721b17d7092SNicolas Chautru 		/* clear default configuration before initialization */
722b17d7092SNicolas Chautru 		memset(&conf, 0, sizeof(struct rte_acc100_conf));
723b17d7092SNicolas Chautru 
724b17d7092SNicolas Chautru 		/* Always set in PF mode for built-in configuration */
725b17d7092SNicolas Chautru 		conf.pf_mode_en = true;
726b17d7092SNicolas Chautru 		for (i = 0; i < RTE_ACC100_NUM_VFS; ++i) {
727b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
728b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
729b17d7092SNicolas Chautru 			conf.arb_dl_4g[i].round_robin_weight = ACC100_QMGR_RR;
730b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
731b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR;
732b17d7092SNicolas Chautru 			conf.arb_ul_4g[i].round_robin_weight = ACC100_QMGR_RR;
733b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
734b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
735b17d7092SNicolas Chautru 			conf.arb_dl_5g[i].round_robin_weight = ACC100_QMGR_RR;
736b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
737b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR;
738b17d7092SNicolas Chautru 			conf.arb_ul_5g[i].round_robin_weight = ACC100_QMGR_RR;
739b17d7092SNicolas Chautru 		}
740b17d7092SNicolas Chautru 
741b17d7092SNicolas Chautru 		conf.input_pos_llr_1_bit = true;
742b17d7092SNicolas Chautru 		conf.output_pos_llr_1_bit = true;
743b17d7092SNicolas Chautru 		conf.num_vf_bundles = 1; /**< Number of VF bundles to setup */
744b17d7092SNicolas Chautru 
745b17d7092SNicolas Chautru 		conf.q_ul_4g.num_qgroups = ACC100_QMGR_NUM_QGS;
746b17d7092SNicolas Chautru 		conf.q_ul_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
747b17d7092SNicolas Chautru 		conf.q_ul_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
748b17d7092SNicolas Chautru 		conf.q_ul_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
749b17d7092SNicolas Chautru 		conf.q_dl_4g.num_qgroups = ACC100_QMGR_NUM_QGS;
750b17d7092SNicolas Chautru 		conf.q_dl_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
751b17d7092SNicolas Chautru 		conf.q_dl_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
752b17d7092SNicolas Chautru 		conf.q_dl_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
753b17d7092SNicolas Chautru 		conf.q_ul_5g.num_qgroups = ACC100_QMGR_NUM_QGS;
754b17d7092SNicolas Chautru 		conf.q_ul_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
755b17d7092SNicolas Chautru 		conf.q_ul_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
756b17d7092SNicolas Chautru 		conf.q_ul_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
757b17d7092SNicolas Chautru 		conf.q_dl_5g.num_qgroups = ACC100_QMGR_NUM_QGS;
758b17d7092SNicolas Chautru 		conf.q_dl_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX;
759b17d7092SNicolas Chautru 		conf.q_dl_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS;
760b17d7092SNicolas Chautru 		conf.q_dl_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH;
761b17d7092SNicolas Chautru 
762b17d7092SNicolas Chautru 		/* setup PF with configuration information */
763b17d7092SNicolas Chautru 		ret = rte_acc100_configure(info->dev_name, &conf);
764b17d7092SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
765b17d7092SNicolas Chautru 				"Failed to configure ACC100 PF for bbdev %s",
766b17d7092SNicolas Chautru 				info->dev_name);
767b17d7092SNicolas Chautru 	}
768b17d7092SNicolas Chautru #endif
769b17d7092SNicolas Chautru 	/* Let's refresh this now this is configured */
770b17d7092SNicolas Chautru 	rte_bbdev_info_get(dev_id, info);
771f714a188SAmr Mokhtar 	nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues);
772d819c083SNicolas Chautru 	nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES);
773d819c083SNicolas Chautru 
774f714a188SAmr Mokhtar 	/* setup device */
775f714a188SAmr Mokhtar 	ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id);
776f714a188SAmr Mokhtar 	if (ret < 0) {
777f714a188SAmr Mokhtar 		printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n",
778f714a188SAmr Mokhtar 				dev_id, nb_queues, info->socket_id, ret);
779f714a188SAmr Mokhtar 		return TEST_FAILED;
780f714a188SAmr Mokhtar 	}
781f714a188SAmr Mokhtar 
782f714a188SAmr Mokhtar 	/* configure interrupts if needed */
783f714a188SAmr Mokhtar 	if (intr_enabled) {
784f714a188SAmr Mokhtar 		ret = rte_bbdev_intr_enable(dev_id);
785f714a188SAmr Mokhtar 		if (ret < 0) {
786f714a188SAmr Mokhtar 			printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id,
787f714a188SAmr Mokhtar 					ret);
788f714a188SAmr Mokhtar 			return TEST_FAILED;
789f714a188SAmr Mokhtar 		}
790f714a188SAmr Mokhtar 	}
791f714a188SAmr Mokhtar 
792f714a188SAmr Mokhtar 	/* setup device queues */
793f714a188SAmr Mokhtar 	qconf.socket = info->socket_id;
794f714a188SAmr Mokhtar 	qconf.queue_size = info->drv.default_queue_conf.queue_size;
795f714a188SAmr Mokhtar 	qconf.priority = 0;
796f714a188SAmr Mokhtar 	qconf.deferred_start = 0;
797f714a188SAmr Mokhtar 	qconf.op_type = op_type;
798f714a188SAmr Mokhtar 
799f714a188SAmr Mokhtar 	for (queue_id = 0; queue_id < nb_queues; ++queue_id) {
800f714a188SAmr Mokhtar 		ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf);
801f714a188SAmr Mokhtar 		if (ret != 0) {
802f714a188SAmr Mokhtar 			printf(
803f714a188SAmr Mokhtar 					"Allocated all queues (id=%u) at prio%u on dev%u\n",
804f714a188SAmr Mokhtar 					queue_id, qconf.priority, dev_id);
805f714a188SAmr Mokhtar 			qconf.priority++;
806f714a188SAmr Mokhtar 			ret = rte_bbdev_queue_configure(ad->dev_id, queue_id,
807f714a188SAmr Mokhtar 					&qconf);
808f714a188SAmr Mokhtar 		}
809f714a188SAmr Mokhtar 		if (ret != 0) {
810f714a188SAmr Mokhtar 			printf("All queues on dev %u allocated: %u\n",
811f714a188SAmr Mokhtar 					dev_id, queue_id);
812f714a188SAmr Mokhtar 			break;
813f714a188SAmr Mokhtar 		}
814f714a188SAmr Mokhtar 		ad->queue_ids[queue_id] = queue_id;
815f714a188SAmr Mokhtar 	}
816f714a188SAmr Mokhtar 	TEST_ASSERT(queue_id != 0,
817f714a188SAmr Mokhtar 			"ERROR Failed to configure any queues on dev %u",
818f714a188SAmr Mokhtar 			dev_id);
819f714a188SAmr Mokhtar 	ad->nb_queues = queue_id;
820f714a188SAmr Mokhtar 
821f714a188SAmr Mokhtar 	set_avail_op(ad, op_type);
822f714a188SAmr Mokhtar 
823f714a188SAmr Mokhtar 	return TEST_SUCCESS;
824f714a188SAmr Mokhtar }
825f714a188SAmr Mokhtar 
826f714a188SAmr Mokhtar static int
add_active_device(uint8_t dev_id,struct rte_bbdev_info * info,struct test_bbdev_vector * vector)827f714a188SAmr Mokhtar add_active_device(uint8_t dev_id, struct rte_bbdev_info *info,
828f714a188SAmr Mokhtar 		struct test_bbdev_vector *vector)
829f714a188SAmr Mokhtar {
830f714a188SAmr Mokhtar 	int ret;
831f714a188SAmr Mokhtar 
832f714a188SAmr Mokhtar 	active_devs[nb_active_devs].driver_name = info->drv.driver_name;
833f714a188SAmr Mokhtar 	active_devs[nb_active_devs].dev_id = dev_id;
834f714a188SAmr Mokhtar 
835f714a188SAmr Mokhtar 	ret = add_bbdev_dev(dev_id, info, vector);
836f714a188SAmr Mokhtar 	if (ret == TEST_SUCCESS)
837f714a188SAmr Mokhtar 		++nb_active_devs;
838f714a188SAmr Mokhtar 	return ret;
839f714a188SAmr Mokhtar }
840f714a188SAmr Mokhtar 
841f714a188SAmr Mokhtar static uint8_t
populate_active_devices(void)842f714a188SAmr Mokhtar populate_active_devices(void)
843f714a188SAmr Mokhtar {
844f714a188SAmr Mokhtar 	int ret;
845f714a188SAmr Mokhtar 	uint8_t dev_id;
846f714a188SAmr Mokhtar 	uint8_t nb_devs_added = 0;
847f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
848f714a188SAmr Mokhtar 
849f714a188SAmr Mokhtar 	RTE_BBDEV_FOREACH(dev_id) {
850f714a188SAmr Mokhtar 		rte_bbdev_info_get(dev_id, &info);
851f714a188SAmr Mokhtar 
852f714a188SAmr Mokhtar 		if (check_dev_cap(&info)) {
853f714a188SAmr Mokhtar 			printf(
854f714a188SAmr Mokhtar 				"Device %d (%s) does not support specified capabilities\n",
855f714a188SAmr Mokhtar 					dev_id, info.dev_name);
856f714a188SAmr Mokhtar 			continue;
857f714a188SAmr Mokhtar 		}
858f714a188SAmr Mokhtar 
859f714a188SAmr Mokhtar 		ret = add_active_device(dev_id, &info, &test_vector);
860f714a188SAmr Mokhtar 		if (ret != 0) {
861f714a188SAmr Mokhtar 			printf("Adding active bbdev %s skipped\n",
862f714a188SAmr Mokhtar 					info.dev_name);
863f714a188SAmr Mokhtar 			continue;
864f714a188SAmr Mokhtar 		}
865f714a188SAmr Mokhtar 		nb_devs_added++;
866f714a188SAmr Mokhtar 	}
867f714a188SAmr Mokhtar 
868f714a188SAmr Mokhtar 	return nb_devs_added;
869f714a188SAmr Mokhtar }
870f714a188SAmr Mokhtar 
871f714a188SAmr Mokhtar static int
read_test_vector(void)872f714a188SAmr Mokhtar read_test_vector(void)
873f714a188SAmr Mokhtar {
874f714a188SAmr Mokhtar 	int ret;
875f714a188SAmr Mokhtar 
876f714a188SAmr Mokhtar 	memset(&test_vector, 0, sizeof(test_vector));
877f714a188SAmr Mokhtar 	printf("Test vector file = %s\n", get_vector_filename());
878f714a188SAmr Mokhtar 	ret = test_bbdev_vector_read(get_vector_filename(), &test_vector);
879f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n",
880f714a188SAmr Mokhtar 			get_vector_filename());
881f714a188SAmr Mokhtar 
882f714a188SAmr Mokhtar 	return TEST_SUCCESS;
883f714a188SAmr Mokhtar }
884f714a188SAmr Mokhtar 
885f714a188SAmr Mokhtar static int
testsuite_setup(void)886f714a188SAmr Mokhtar testsuite_setup(void)
887f714a188SAmr Mokhtar {
888f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
889f714a188SAmr Mokhtar 
890f714a188SAmr Mokhtar 	if (populate_active_devices() == 0) {
891f714a188SAmr Mokhtar 		printf("No suitable devices found!\n");
892f714a188SAmr Mokhtar 		return TEST_SKIPPED;
893f714a188SAmr Mokhtar 	}
894f714a188SAmr Mokhtar 
895f714a188SAmr Mokhtar 	return TEST_SUCCESS;
896f714a188SAmr Mokhtar }
897f714a188SAmr Mokhtar 
898f714a188SAmr Mokhtar static int
interrupt_testsuite_setup(void)899f714a188SAmr Mokhtar interrupt_testsuite_setup(void)
900f714a188SAmr Mokhtar {
901f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n");
902f714a188SAmr Mokhtar 
903f714a188SAmr Mokhtar 	/* Enable interrupts */
904f714a188SAmr Mokhtar 	intr_enabled = true;
905f714a188SAmr Mokhtar 
906f714a188SAmr Mokhtar 	/* Special case for NULL device (RTE_BBDEV_OP_NONE) */
907f714a188SAmr Mokhtar 	if (populate_active_devices() == 0 ||
908f714a188SAmr Mokhtar 			test_vector.op_type == RTE_BBDEV_OP_NONE) {
909f714a188SAmr Mokhtar 		intr_enabled = false;
910f714a188SAmr Mokhtar 		printf("No suitable devices found!\n");
911f714a188SAmr Mokhtar 		return TEST_SKIPPED;
912f714a188SAmr Mokhtar 	}
913f714a188SAmr Mokhtar 
914f714a188SAmr Mokhtar 	return TEST_SUCCESS;
915f714a188SAmr Mokhtar }
916f714a188SAmr Mokhtar 
917f714a188SAmr Mokhtar static void
testsuite_teardown(void)918f714a188SAmr Mokhtar testsuite_teardown(void)
919f714a188SAmr Mokhtar {
920f714a188SAmr Mokhtar 	uint8_t dev_id;
921f714a188SAmr Mokhtar 
922f714a188SAmr Mokhtar 	/* Unconfigure devices */
923f714a188SAmr Mokhtar 	RTE_BBDEV_FOREACH(dev_id)
924f714a188SAmr Mokhtar 		rte_bbdev_close(dev_id);
925f714a188SAmr Mokhtar 
926f714a188SAmr Mokhtar 	/* Clear active devices structs. */
927f714a188SAmr Mokhtar 	memset(active_devs, 0, sizeof(active_devs));
928f714a188SAmr Mokhtar 	nb_active_devs = 0;
929f162c475SNicolas Chautru 
930f162c475SNicolas Chautru 	/* Disable interrupts */
931f162c475SNicolas Chautru 	intr_enabled = false;
932f714a188SAmr Mokhtar }
933f714a188SAmr Mokhtar 
934f714a188SAmr Mokhtar static int
ut_setup(void)935f714a188SAmr Mokhtar ut_setup(void)
936f714a188SAmr Mokhtar {
937f714a188SAmr Mokhtar 	uint8_t i, dev_id;
938f714a188SAmr Mokhtar 
939f714a188SAmr Mokhtar 	for (i = 0; i < nb_active_devs; i++) {
940f714a188SAmr Mokhtar 		dev_id = active_devs[i].dev_id;
941f714a188SAmr Mokhtar 		/* reset bbdev stats */
942f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id),
943f714a188SAmr Mokhtar 				"Failed to reset stats of bbdev %u", dev_id);
944f714a188SAmr Mokhtar 		/* start the device */
945f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id),
946f714a188SAmr Mokhtar 				"Failed to start bbdev %u", dev_id);
947f714a188SAmr Mokhtar 	}
948f714a188SAmr Mokhtar 
949f714a188SAmr Mokhtar 	return TEST_SUCCESS;
950f714a188SAmr Mokhtar }
951f714a188SAmr Mokhtar 
952f714a188SAmr Mokhtar static void
ut_teardown(void)953f714a188SAmr Mokhtar ut_teardown(void)
954f714a188SAmr Mokhtar {
955f714a188SAmr Mokhtar 	uint8_t i, dev_id;
956f714a188SAmr Mokhtar 	struct rte_bbdev_stats stats;
957f714a188SAmr Mokhtar 
958f714a188SAmr Mokhtar 	for (i = 0; i < nb_active_devs; i++) {
959f714a188SAmr Mokhtar 		dev_id = active_devs[i].dev_id;
960f714a188SAmr Mokhtar 		/* read stats and print */
961f714a188SAmr Mokhtar 		rte_bbdev_stats_get(dev_id, &stats);
962f714a188SAmr Mokhtar 		/* Stop the device */
963f714a188SAmr Mokhtar 		rte_bbdev_stop(dev_id);
964f714a188SAmr Mokhtar 	}
965f714a188SAmr Mokhtar }
966f714a188SAmr Mokhtar 
967f714a188SAmr Mokhtar static int
init_op_data_objs(struct rte_bbdev_op_data * bufs,struct op_data_entries * ref_entries,struct rte_mempool * mbuf_pool,const uint16_t n,enum op_data_type op_type,uint16_t min_alignment)968f714a188SAmr Mokhtar init_op_data_objs(struct rte_bbdev_op_data *bufs,
969f714a188SAmr Mokhtar 		struct op_data_entries *ref_entries,
970f714a188SAmr Mokhtar 		struct rte_mempool *mbuf_pool, const uint16_t n,
971f714a188SAmr Mokhtar 		enum op_data_type op_type, uint16_t min_alignment)
972f714a188SAmr Mokhtar {
973f714a188SAmr Mokhtar 	int ret;
974f714a188SAmr Mokhtar 	unsigned int i, j;
97531a7853dSNicolas Chautru 	bool large_input = false;
976f714a188SAmr Mokhtar 
977f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
978f714a188SAmr Mokhtar 		char *data;
979f714a188SAmr Mokhtar 		struct op_data_buf *seg = &ref_entries->segments[0];
980f714a188SAmr Mokhtar 		struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool);
981f714a188SAmr Mokhtar 		TEST_ASSERT_NOT_NULL(m_head,
982f714a188SAmr Mokhtar 				"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
983f714a188SAmr Mokhtar 				op_type, n * ref_entries->nb_segments,
984f714a188SAmr Mokhtar 				mbuf_pool->size);
985f714a188SAmr Mokhtar 
98631a7853dSNicolas Chautru 		if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) {
98731a7853dSNicolas Chautru 			/*
98831a7853dSNicolas Chautru 			 * Special case when DPDK mbuf cannot handle
98931a7853dSNicolas Chautru 			 * the required input size
99031a7853dSNicolas Chautru 			 */
99131a7853dSNicolas Chautru 			printf("Warning: Larger input size than DPDK mbuf %d\n",
99231a7853dSNicolas Chautru 					seg->length);
99331a7853dSNicolas Chautru 			large_input = true;
99431a7853dSNicolas Chautru 		}
995f714a188SAmr Mokhtar 		bufs[i].data = m_head;
996f714a188SAmr Mokhtar 		bufs[i].offset = 0;
997f714a188SAmr Mokhtar 		bufs[i].length = 0;
998f714a188SAmr Mokhtar 
999d819c083SNicolas Chautru 		if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) {
100031a7853dSNicolas Chautru 			if ((op_type == DATA_INPUT) && large_input) {
100131a7853dSNicolas Chautru 				/* Allocate a fake overused mbuf */
100231a7853dSNicolas Chautru 				data = rte_malloc(NULL, seg->length, 0);
1003bc4c9418SMin Hu (Connor) 				TEST_ASSERT_NOT_NULL(data,
1004bc4c9418SMin Hu (Connor) 					"rte malloc failed with %u bytes",
1005bc4c9418SMin Hu (Connor) 					seg->length);
100631a7853dSNicolas Chautru 				memcpy(data, seg->addr, seg->length);
100731a7853dSNicolas Chautru 				m_head->buf_addr = data;
100831a7853dSNicolas Chautru 				m_head->buf_iova = rte_malloc_virt2iova(data);
100931a7853dSNicolas Chautru 				m_head->data_off = 0;
101031a7853dSNicolas Chautru 				m_head->data_len = seg->length;
101131a7853dSNicolas Chautru 			} else {
1012f714a188SAmr Mokhtar 				data = rte_pktmbuf_append(m_head, seg->length);
1013f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(data,
1014f714a188SAmr Mokhtar 					"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
1015f714a188SAmr Mokhtar 					seg->length, op_type);
1016f714a188SAmr Mokhtar 
101731a7853dSNicolas Chautru 				TEST_ASSERT(data == RTE_PTR_ALIGN(
101831a7853dSNicolas Chautru 						data, min_alignment),
1019f714a188SAmr Mokhtar 					"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
1020f714a188SAmr Mokhtar 					data, min_alignment);
1021f714a188SAmr Mokhtar 				rte_memcpy(data, seg->addr, seg->length);
102231a7853dSNicolas Chautru 			}
102331a7853dSNicolas Chautru 
1024f714a188SAmr Mokhtar 			bufs[i].length += seg->length;
1025f714a188SAmr Mokhtar 
1026f714a188SAmr Mokhtar 			for (j = 1; j < ref_entries->nb_segments; ++j) {
1027f714a188SAmr Mokhtar 				struct rte_mbuf *m_tail =
1028f714a188SAmr Mokhtar 						rte_pktmbuf_alloc(mbuf_pool);
1029f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(m_tail,
1030f714a188SAmr Mokhtar 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
1031f714a188SAmr Mokhtar 						op_type,
1032f714a188SAmr Mokhtar 						n * ref_entries->nb_segments,
1033f714a188SAmr Mokhtar 						mbuf_pool->size);
1034f714a188SAmr Mokhtar 				seg += 1;
1035f714a188SAmr Mokhtar 
1036f714a188SAmr Mokhtar 				data = rte_pktmbuf_append(m_tail, seg->length);
1037f714a188SAmr Mokhtar 				TEST_ASSERT_NOT_NULL(data,
1038f714a188SAmr Mokhtar 						"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
1039f714a188SAmr Mokhtar 						seg->length, op_type);
1040f714a188SAmr Mokhtar 
1041f714a188SAmr Mokhtar 				TEST_ASSERT(data == RTE_PTR_ALIGN(data,
1042f714a188SAmr Mokhtar 						min_alignment),
1043f714a188SAmr Mokhtar 						"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
1044f714a188SAmr Mokhtar 						data, min_alignment);
1045f714a188SAmr Mokhtar 				rte_memcpy(data, seg->addr, seg->length);
1046f714a188SAmr Mokhtar 				bufs[i].length += seg->length;
1047f714a188SAmr Mokhtar 
1048f714a188SAmr Mokhtar 				ret = rte_pktmbuf_chain(m_head, m_tail);
1049f714a188SAmr Mokhtar 				TEST_ASSERT_SUCCESS(ret,
1050f714a188SAmr Mokhtar 						"Couldn't chain mbufs from %d data type mbuf pool",
1051f714a188SAmr Mokhtar 						op_type);
1052f714a188SAmr Mokhtar 			}
10539585f8b1SKamil Chalupnik 		} else {
10549585f8b1SKamil Chalupnik 
10559585f8b1SKamil Chalupnik 			/* allocate chained-mbuf for output buffer */
10569585f8b1SKamil Chalupnik 			for (j = 1; j < ref_entries->nb_segments; ++j) {
10579585f8b1SKamil Chalupnik 				struct rte_mbuf *m_tail =
10589585f8b1SKamil Chalupnik 						rte_pktmbuf_alloc(mbuf_pool);
10599585f8b1SKamil Chalupnik 				TEST_ASSERT_NOT_NULL(m_tail,
10609585f8b1SKamil Chalupnik 						"Not enough mbufs in %d data type mbuf pool (needed %u, available %u)",
10619585f8b1SKamil Chalupnik 						op_type,
10629585f8b1SKamil Chalupnik 						n * ref_entries->nb_segments,
10639585f8b1SKamil Chalupnik 						mbuf_pool->size);
10649585f8b1SKamil Chalupnik 
10659585f8b1SKamil Chalupnik 				ret = rte_pktmbuf_chain(m_head, m_tail);
10669585f8b1SKamil Chalupnik 				TEST_ASSERT_SUCCESS(ret,
10679585f8b1SKamil Chalupnik 						"Couldn't chain mbufs from %d data type mbuf pool",
10689585f8b1SKamil Chalupnik 						op_type);
10699585f8b1SKamil Chalupnik 			}
1070f714a188SAmr Mokhtar 		}
1071f714a188SAmr Mokhtar 	}
1072f714a188SAmr Mokhtar 
1073f714a188SAmr Mokhtar 	return 0;
1074f714a188SAmr Mokhtar }
1075f714a188SAmr Mokhtar 
1076f714a188SAmr Mokhtar static int
allocate_buffers_on_socket(struct rte_bbdev_op_data ** buffers,const int len,const int socket)1077f714a188SAmr Mokhtar allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len,
1078f714a188SAmr Mokhtar 		const int socket)
1079f714a188SAmr Mokhtar {
1080f714a188SAmr Mokhtar 	int i;
1081f714a188SAmr Mokhtar 
1082f714a188SAmr Mokhtar 	*buffers = rte_zmalloc_socket(NULL, len, 0, socket);
1083f714a188SAmr Mokhtar 	if (*buffers == NULL) {
1084f714a188SAmr Mokhtar 		printf("WARNING: Failed to allocate op_data on socket %d\n",
1085f714a188SAmr Mokhtar 				socket);
1086f714a188SAmr Mokhtar 		/* try to allocate memory on other detected sockets */
1087f714a188SAmr Mokhtar 		for (i = 0; i < socket; i++) {
1088f714a188SAmr Mokhtar 			*buffers = rte_zmalloc_socket(NULL, len, 0, i);
1089f714a188SAmr Mokhtar 			if (*buffers != NULL)
1090f714a188SAmr Mokhtar 				break;
1091f714a188SAmr Mokhtar 		}
1092f714a188SAmr Mokhtar 	}
1093f714a188SAmr Mokhtar 
1094f714a188SAmr Mokhtar 	return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS;
1095f714a188SAmr Mokhtar }
1096f714a188SAmr Mokhtar 
109747d5a049SKamil Chalupnik static void
limit_input_llr_val_range(struct rte_bbdev_op_data * input_ops,const uint16_t n,const int8_t max_llr_modulus)109847d5a049SKamil Chalupnik limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops,
1099d819c083SNicolas Chautru 		const uint16_t n, const int8_t max_llr_modulus)
110047d5a049SKamil Chalupnik {
110147d5a049SKamil Chalupnik 	uint16_t i, byte_idx;
110247d5a049SKamil Chalupnik 
110347d5a049SKamil Chalupnik 	for (i = 0; i < n; ++i) {
110447d5a049SKamil Chalupnik 		struct rte_mbuf *m = input_ops[i].data;
110547d5a049SKamil Chalupnik 		while (m != NULL) {
110647d5a049SKamil Chalupnik 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
110747d5a049SKamil Chalupnik 					input_ops[i].offset);
11089585f8b1SKamil Chalupnik 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
110947d5a049SKamil Chalupnik 					++byte_idx)
111047d5a049SKamil Chalupnik 				llr[byte_idx] = round((double)max_llr_modulus *
111147d5a049SKamil Chalupnik 						llr[byte_idx] / INT8_MAX);
111247d5a049SKamil Chalupnik 
111347d5a049SKamil Chalupnik 			m = m->next;
111447d5a049SKamil Chalupnik 		}
111547d5a049SKamil Chalupnik 	}
111647d5a049SKamil Chalupnik }
111747d5a049SKamil Chalupnik 
1118335c11fdSNicolas Chautru /*
1119335c11fdSNicolas Chautru  * We may have to insert filler bits
1120335c11fdSNicolas Chautru  * when they are required by the HARQ assumption
1121335c11fdSNicolas Chautru  */
1122335c11fdSNicolas Chautru static void
ldpc_add_filler(struct rte_bbdev_op_data * input_ops,const uint16_t n,struct test_op_params * op_params)1123335c11fdSNicolas Chautru ldpc_add_filler(struct rte_bbdev_op_data *input_ops,
1124335c11fdSNicolas Chautru 		const uint16_t n, struct test_op_params *op_params)
1125335c11fdSNicolas Chautru {
1126335c11fdSNicolas Chautru 	struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec;
1127335c11fdSNicolas Chautru 
1128335c11fdSNicolas Chautru 	if (input_ops == NULL)
1129335c11fdSNicolas Chautru 		return;
1130335c11fdSNicolas Chautru 	/* No need to add filler if not required by device */
1131335c11fdSNicolas Chautru 	if (!(ldpc_cap_flags &
1132335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS))
1133335c11fdSNicolas Chautru 		return;
1134335c11fdSNicolas Chautru 	/* No need to add filler for loopback operation */
1135335c11fdSNicolas Chautru 	if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
1136335c11fdSNicolas Chautru 		return;
1137335c11fdSNicolas Chautru 
1138335c11fdSNicolas Chautru 	uint16_t i, j, parity_offset;
1139335c11fdSNicolas Chautru 	for (i = 0; i < n; ++i) {
1140335c11fdSNicolas Chautru 		struct rte_mbuf *m = input_ops[i].data;
1141335c11fdSNicolas Chautru 		int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
1142335c11fdSNicolas Chautru 				input_ops[i].offset);
1143335c11fdSNicolas Chautru 		parity_offset = (dec.basegraph == 1 ? 20 : 8)
1144335c11fdSNicolas Chautru 				* dec.z_c - dec.n_filler;
1145335c11fdSNicolas Chautru 		uint16_t new_hin_size = input_ops[i].length + dec.n_filler;
1146335c11fdSNicolas Chautru 		m->data_len = new_hin_size;
1147335c11fdSNicolas Chautru 		input_ops[i].length = new_hin_size;
1148335c11fdSNicolas Chautru 		for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler;
1149335c11fdSNicolas Chautru 				j--)
1150335c11fdSNicolas Chautru 			llr[j] = llr[j - dec.n_filler];
1151335c11fdSNicolas Chautru 		uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1;
1152335c11fdSNicolas Chautru 		for (j = 0; j < dec.n_filler; j++)
1153335c11fdSNicolas Chautru 			llr[parity_offset + j] = llr_max_pre_scaling;
1154335c11fdSNicolas Chautru 	}
1155335c11fdSNicolas Chautru }
1156335c11fdSNicolas Chautru 
1157d819c083SNicolas Chautru static void
ldpc_input_llr_scaling(struct rte_bbdev_op_data * input_ops,const uint16_t n,const int8_t llr_size,const int8_t llr_decimals)1158d819c083SNicolas Chautru ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops,
1159d819c083SNicolas Chautru 		const uint16_t n, const int8_t llr_size,
1160d819c083SNicolas Chautru 		const int8_t llr_decimals)
1161d819c083SNicolas Chautru {
1162d819c083SNicolas Chautru 	if (input_ops == NULL)
1163d819c083SNicolas Chautru 		return;
1164d819c083SNicolas Chautru 
1165d819c083SNicolas Chautru 	uint16_t i, byte_idx;
1166d819c083SNicolas Chautru 
1167d819c083SNicolas Chautru 	int16_t llr_max, llr_min, llr_tmp;
1168d819c083SNicolas Chautru 	llr_max = (1 << (llr_size - 1)) - 1;
1169d819c083SNicolas Chautru 	llr_min = -llr_max;
1170d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
1171d819c083SNicolas Chautru 		struct rte_mbuf *m = input_ops[i].data;
1172d819c083SNicolas Chautru 		while (m != NULL) {
1173d819c083SNicolas Chautru 			int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *,
1174d819c083SNicolas Chautru 					input_ops[i].offset);
1175d819c083SNicolas Chautru 			for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m);
1176d819c083SNicolas Chautru 					++byte_idx) {
1177d819c083SNicolas Chautru 
1178d819c083SNicolas Chautru 				llr_tmp = llr[byte_idx];
1179335c11fdSNicolas Chautru 				if (llr_decimals == 4)
1180335c11fdSNicolas Chautru 					llr_tmp *= 8;
1181335c11fdSNicolas Chautru 				else if (llr_decimals == 2)
1182d819c083SNicolas Chautru 					llr_tmp *= 2;
1183d819c083SNicolas Chautru 				else if (llr_decimals == 0)
1184d819c083SNicolas Chautru 					llr_tmp /= 2;
1185d819c083SNicolas Chautru 				llr_tmp = RTE_MIN(llr_max,
1186d819c083SNicolas Chautru 						RTE_MAX(llr_min, llr_tmp));
1187d819c083SNicolas Chautru 				llr[byte_idx] = (int8_t) llr_tmp;
1188d819c083SNicolas Chautru 			}
1189d819c083SNicolas Chautru 
1190d819c083SNicolas Chautru 			m = m->next;
1191d819c083SNicolas Chautru 		}
1192d819c083SNicolas Chautru 	}
1193d819c083SNicolas Chautru }
1194d819c083SNicolas Chautru 
1195d819c083SNicolas Chautru 
1196d819c083SNicolas Chautru 
1197f714a188SAmr Mokhtar static int
fill_queue_buffers(struct test_op_params * op_params,struct rte_mempool * in_mp,struct rte_mempool * hard_out_mp,struct rte_mempool * soft_out_mp,struct rte_mempool * harq_in_mp,struct rte_mempool * harq_out_mp,uint16_t queue_id,const struct rte_bbdev_op_cap * capabilities,uint16_t min_alignment,const int socket_id)1198f714a188SAmr Mokhtar fill_queue_buffers(struct test_op_params *op_params,
1199f714a188SAmr Mokhtar 		struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp,
1200d819c083SNicolas Chautru 		struct rte_mempool *soft_out_mp,
1201d819c083SNicolas Chautru 		struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp,
1202d819c083SNicolas Chautru 		uint16_t queue_id,
120347d5a049SKamil Chalupnik 		const struct rte_bbdev_op_cap *capabilities,
1204f714a188SAmr Mokhtar 		uint16_t min_alignment, const int socket_id)
1205f714a188SAmr Mokhtar {
1206f714a188SAmr Mokhtar 	int ret;
1207f714a188SAmr Mokhtar 	enum op_data_type type;
1208f714a188SAmr Mokhtar 	const uint16_t n = op_params->num_to_process;
1209f714a188SAmr Mokhtar 
1210f714a188SAmr Mokhtar 	struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = {
1211f714a188SAmr Mokhtar 		in_mp,
1212f714a188SAmr Mokhtar 		soft_out_mp,
1213f714a188SAmr Mokhtar 		hard_out_mp,
1214d819c083SNicolas Chautru 		harq_in_mp,
1215d819c083SNicolas Chautru 		harq_out_mp,
1216f714a188SAmr Mokhtar 	};
1217f714a188SAmr Mokhtar 
1218f714a188SAmr Mokhtar 	struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = {
1219f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].inputs,
1220f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].soft_outputs,
1221f714a188SAmr Mokhtar 		&op_params->q_bufs[socket_id][queue_id].hard_outputs,
1222d819c083SNicolas Chautru 		&op_params->q_bufs[socket_id][queue_id].harq_inputs,
1223d819c083SNicolas Chautru 		&op_params->q_bufs[socket_id][queue_id].harq_outputs,
1224f714a188SAmr Mokhtar 	};
1225f714a188SAmr Mokhtar 
1226f714a188SAmr Mokhtar 	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
1227f714a188SAmr Mokhtar 		struct op_data_entries *ref_entries =
1228f714a188SAmr Mokhtar 				&test_vector.entries[type];
1229f714a188SAmr Mokhtar 		if (ref_entries->nb_segments == 0)
1230f714a188SAmr Mokhtar 			continue;
1231f714a188SAmr Mokhtar 
1232f714a188SAmr Mokhtar 		ret = allocate_buffers_on_socket(queue_ops[type],
1233f714a188SAmr Mokhtar 				n * sizeof(struct rte_bbdev_op_data),
1234f714a188SAmr Mokhtar 				socket_id);
1235f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
1236f714a188SAmr Mokhtar 				"Couldn't allocate memory for rte_bbdev_op_data structs");
1237f714a188SAmr Mokhtar 
1238f714a188SAmr Mokhtar 		ret = init_op_data_objs(*queue_ops[type], ref_entries,
1239f714a188SAmr Mokhtar 				mbuf_pools[type], n, type, min_alignment);
1240f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
1241f714a188SAmr Mokhtar 				"Couldn't init rte_bbdev_op_data structs");
1242f714a188SAmr Mokhtar 	}
1243f714a188SAmr Mokhtar 
124447d5a049SKamil Chalupnik 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
124547d5a049SKamil Chalupnik 		limit_input_llr_val_range(*queue_ops[DATA_INPUT], n,
124647d5a049SKamil Chalupnik 			capabilities->cap.turbo_dec.max_llr_modulus);
124747d5a049SKamil Chalupnik 
1248d819c083SNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
1249335c11fdSNicolas Chautru 		bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags &
1250335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
1251335c11fdSNicolas Chautru 		bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags &
1252335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_LLR_COMPRESSION;
1253335c11fdSNicolas Chautru 		bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags &
1254335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
1255335c11fdSNicolas Chautru 		ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals;
1256335c11fdSNicolas Chautru 		ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size;
1257335c11fdSNicolas Chautru 		ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags;
1258335c11fdSNicolas Chautru 		if (!loopback && !llr_comp)
1259d819c083SNicolas Chautru 			ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n,
1260335c11fdSNicolas Chautru 					ldpc_llr_size, ldpc_llr_decimals);
1261335c11fdSNicolas Chautru 		if (!loopback && !harq_comp)
1262d819c083SNicolas Chautru 			ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n,
1263335c11fdSNicolas Chautru 					ldpc_llr_size, ldpc_llr_decimals);
1264335c11fdSNicolas Chautru 		if (!loopback)
1265335c11fdSNicolas Chautru 			ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n,
1266335c11fdSNicolas Chautru 					op_params);
1267d819c083SNicolas Chautru 	}
1268d819c083SNicolas Chautru 
1269f714a188SAmr Mokhtar 	return 0;
1270f714a188SAmr Mokhtar }
1271f714a188SAmr Mokhtar 
1272f714a188SAmr Mokhtar static void
free_buffers(struct active_device * ad,struct test_op_params * op_params)1273f714a188SAmr Mokhtar free_buffers(struct active_device *ad, struct test_op_params *op_params)
1274f714a188SAmr Mokhtar {
1275f714a188SAmr Mokhtar 	unsigned int i, j;
1276f714a188SAmr Mokhtar 
1277f714a188SAmr Mokhtar 	rte_mempool_free(ad->ops_mempool);
1278f714a188SAmr Mokhtar 	rte_mempool_free(ad->in_mbuf_pool);
1279f714a188SAmr Mokhtar 	rte_mempool_free(ad->hard_out_mbuf_pool);
1280f714a188SAmr Mokhtar 	rte_mempool_free(ad->soft_out_mbuf_pool);
1281d819c083SNicolas Chautru 	rte_mempool_free(ad->harq_in_mbuf_pool);
1282d819c083SNicolas Chautru 	rte_mempool_free(ad->harq_out_mbuf_pool);
1283f714a188SAmr Mokhtar 
1284f714a188SAmr Mokhtar 	for (i = 0; i < rte_lcore_count(); ++i) {
1285f714a188SAmr Mokhtar 		for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) {
1286f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].inputs);
1287f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].hard_outputs);
1288f714a188SAmr Mokhtar 			rte_free(op_params->q_bufs[j][i].soft_outputs);
1289d819c083SNicolas Chautru 			rte_free(op_params->q_bufs[j][i].harq_inputs);
1290d819c083SNicolas Chautru 			rte_free(op_params->q_bufs[j][i].harq_outputs);
1291f714a188SAmr Mokhtar 		}
1292f714a188SAmr Mokhtar 	}
1293f714a188SAmr Mokhtar }
1294f714a188SAmr Mokhtar 
1295f714a188SAmr Mokhtar static void
copy_reference_dec_op(struct rte_bbdev_dec_op ** ops,unsigned int n,unsigned int start_idx,struct rte_bbdev_op_data * inputs,struct rte_bbdev_op_data * hard_outputs,struct rte_bbdev_op_data * soft_outputs,struct rte_bbdev_dec_op * ref_op)1296f714a188SAmr Mokhtar copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1297f714a188SAmr Mokhtar 		unsigned int start_idx,
1298f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *inputs,
1299f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *hard_outputs,
1300f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *soft_outputs,
1301f714a188SAmr Mokhtar 		struct rte_bbdev_dec_op *ref_op)
1302f714a188SAmr Mokhtar {
1303f714a188SAmr Mokhtar 	unsigned int i;
1304f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec;
1305f714a188SAmr Mokhtar 
1306f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
130748fc315fSNicolas Chautru 		if (turbo_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1308f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.ea =
1309f714a188SAmr Mokhtar 					turbo_dec->tb_params.ea;
1310f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.eb =
1311f714a188SAmr Mokhtar 					turbo_dec->tb_params.eb;
1312f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.k_pos =
1313f714a188SAmr Mokhtar 					turbo_dec->tb_params.k_pos;
1314f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.k_neg =
1315f714a188SAmr Mokhtar 					turbo_dec->tb_params.k_neg;
1316f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.c =
1317f714a188SAmr Mokhtar 					turbo_dec->tb_params.c;
1318f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.c_neg =
1319f714a188SAmr Mokhtar 					turbo_dec->tb_params.c_neg;
1320f714a188SAmr Mokhtar 			ops[i]->turbo_dec.tb_params.cab =
1321f714a188SAmr Mokhtar 					turbo_dec->tb_params.cab;
13220b98d574SKamil Chalupnik 			ops[i]->turbo_dec.tb_params.r =
13230b98d574SKamil Chalupnik 					turbo_dec->tb_params.r;
1324f714a188SAmr Mokhtar 		} else {
1325f714a188SAmr Mokhtar 			ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e;
1326f714a188SAmr Mokhtar 			ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k;
1327f714a188SAmr Mokhtar 		}
1328f714a188SAmr Mokhtar 
1329f714a188SAmr Mokhtar 		ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale;
1330f714a188SAmr Mokhtar 		ops[i]->turbo_dec.iter_max = turbo_dec->iter_max;
1331f714a188SAmr Mokhtar 		ops[i]->turbo_dec.iter_min = turbo_dec->iter_min;
1332f714a188SAmr Mokhtar 		ops[i]->turbo_dec.op_flags = turbo_dec->op_flags;
1333f714a188SAmr Mokhtar 		ops[i]->turbo_dec.rv_index = turbo_dec->rv_index;
1334f714a188SAmr Mokhtar 		ops[i]->turbo_dec.num_maps = turbo_dec->num_maps;
1335f714a188SAmr Mokhtar 		ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode;
1336f714a188SAmr Mokhtar 
1337f714a188SAmr Mokhtar 		ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i];
1338f714a188SAmr Mokhtar 		ops[i]->turbo_dec.input = inputs[start_idx + i];
1339f714a188SAmr Mokhtar 		if (soft_outputs != NULL)
1340f714a188SAmr Mokhtar 			ops[i]->turbo_dec.soft_output =
1341f714a188SAmr Mokhtar 				soft_outputs[start_idx + i];
1342f714a188SAmr Mokhtar 	}
1343f714a188SAmr Mokhtar }
1344f714a188SAmr Mokhtar 
1345f714a188SAmr Mokhtar static void
copy_reference_enc_op(struct rte_bbdev_enc_op ** ops,unsigned int n,unsigned int start_idx,struct rte_bbdev_op_data * inputs,struct rte_bbdev_op_data * outputs,struct rte_bbdev_enc_op * ref_op)1346f714a188SAmr Mokhtar copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1347f714a188SAmr Mokhtar 		unsigned int start_idx,
1348f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *inputs,
1349f714a188SAmr Mokhtar 		struct rte_bbdev_op_data *outputs,
1350f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op)
1351f714a188SAmr Mokhtar {
1352f714a188SAmr Mokhtar 	unsigned int i;
1353f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc;
1354f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
135548fc315fSNicolas Chautru 		if (turbo_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1356f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ea =
1357f714a188SAmr Mokhtar 					turbo_enc->tb_params.ea;
1358f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.eb =
1359f714a188SAmr Mokhtar 					turbo_enc->tb_params.eb;
1360f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.k_pos =
1361f714a188SAmr Mokhtar 					turbo_enc->tb_params.k_pos;
1362f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.k_neg =
1363f714a188SAmr Mokhtar 					turbo_enc->tb_params.k_neg;
1364f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.c =
1365f714a188SAmr Mokhtar 					turbo_enc->tb_params.c;
1366f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.c_neg =
1367f714a188SAmr Mokhtar 					turbo_enc->tb_params.c_neg;
1368f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.cab =
1369f714a188SAmr Mokhtar 					turbo_enc->tb_params.cab;
1370f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ncb_pos =
1371f714a188SAmr Mokhtar 					turbo_enc->tb_params.ncb_pos;
1372f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.ncb_neg =
1373f714a188SAmr Mokhtar 					turbo_enc->tb_params.ncb_neg;
1374f714a188SAmr Mokhtar 			ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r;
1375f714a188SAmr Mokhtar 		} else {
1376f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e;
1377f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k;
1378f714a188SAmr Mokhtar 			ops[i]->turbo_enc.cb_params.ncb =
1379f714a188SAmr Mokhtar 					turbo_enc->cb_params.ncb;
1380f714a188SAmr Mokhtar 		}
1381f714a188SAmr Mokhtar 		ops[i]->turbo_enc.rv_index = turbo_enc->rv_index;
1382f714a188SAmr Mokhtar 		ops[i]->turbo_enc.op_flags = turbo_enc->op_flags;
1383f714a188SAmr Mokhtar 		ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode;
1384f714a188SAmr Mokhtar 
1385f714a188SAmr Mokhtar 		ops[i]->turbo_enc.output = outputs[start_idx + i];
1386f714a188SAmr Mokhtar 		ops[i]->turbo_enc.input = inputs[start_idx + i];
1387f714a188SAmr Mokhtar 	}
1388f714a188SAmr Mokhtar }
1389f714a188SAmr Mokhtar 
1390f41c6e4dSNicolas Chautru 
1391f41c6e4dSNicolas Chautru /* Returns a random number drawn from a normal distribution
1392f41c6e4dSNicolas Chautru  * with mean of 0 and variance of 1
1393f41c6e4dSNicolas Chautru  * Marsaglia algorithm
1394f41c6e4dSNicolas Chautru  */
1395f41c6e4dSNicolas Chautru static double
randn(int n)1396f41c6e4dSNicolas Chautru randn(int n)
1397f41c6e4dSNicolas Chautru {
1398f41c6e4dSNicolas Chautru 	double S, Z, U1, U2, u, v, fac;
1399f41c6e4dSNicolas Chautru 
1400f41c6e4dSNicolas Chautru 	do {
1401f41c6e4dSNicolas Chautru 		U1 = (double)rand() / RAND_MAX;
1402f41c6e4dSNicolas Chautru 		U2 = (double)rand() / RAND_MAX;
1403f41c6e4dSNicolas Chautru 		u = 2. * U1 - 1.;
1404f41c6e4dSNicolas Chautru 		v = 2. * U2 - 1.;
1405f41c6e4dSNicolas Chautru 		S = u * u + v * v;
1406f41c6e4dSNicolas Chautru 	} while (S >= 1 || S == 0);
1407f41c6e4dSNicolas Chautru 	fac = sqrt(-2. * log(S) / S);
1408f41c6e4dSNicolas Chautru 	Z = (n % 2) ? u * fac : v * fac;
1409f41c6e4dSNicolas Chautru 	return Z;
1410f41c6e4dSNicolas Chautru }
1411f41c6e4dSNicolas Chautru 
1412f41c6e4dSNicolas Chautru static inline double
maxstar(double A,double B)1413f41c6e4dSNicolas Chautru maxstar(double A, double B)
1414f41c6e4dSNicolas Chautru {
1415f41c6e4dSNicolas Chautru 	if (fabs(A - B) > 5)
1416f41c6e4dSNicolas Chautru 		return RTE_MAX(A, B);
1417f41c6e4dSNicolas Chautru 	else
1418f41c6e4dSNicolas Chautru 		return RTE_MAX(A, B) + log1p(exp(-fabs(A - B)));
1419f41c6e4dSNicolas Chautru }
1420f41c6e4dSNicolas Chautru 
1421f41c6e4dSNicolas Chautru /*
1422f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==8
1423f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1424f41c6e4dSNicolas Chautru  */
1425f41c6e4dSNicolas Chautru static void
gen_qm8_llr(int8_t * llrs,uint32_t i,double N0,double llr_max)1426f41c6e4dSNicolas Chautru gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1427f41c6e4dSNicolas Chautru {
1428f41c6e4dSNicolas Chautru 	int qm = 8;
1429f41c6e4dSNicolas Chautru 	int qam = 256;
1430f41c6e4dSNicolas Chautru 	int m, k;
1431f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1432f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1433f41c6e4dSNicolas Chautru 	const double symbols_I[256] = {
1434f41c6e4dSNicolas Chautru 			5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5,
1435f41c6e4dSNicolas Chautru 			5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11,
1436f41c6e4dSNicolas Chautru 			11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13,
1437f41c6e4dSNicolas Chautru 			15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15,
1438f41c6e4dSNicolas Chautru 			15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3,
1439f41c6e4dSNicolas Chautru 			1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1,
1440f41c6e4dSNicolas Chautru 			1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13,
1441f41c6e4dSNicolas Chautru 			15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9,
1442f41c6e4dSNicolas Chautru 			13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5,
1443f41c6e4dSNicolas Chautru 			-5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5,
1444f41c6e4dSNicolas Chautru 			-7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3,
1445f41c6e4dSNicolas Chautru 			-1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13,
1446f41c6e4dSNicolas Chautru 			-13, -15, -15, -13, -13, -15, -15, -11, -11, -9,
1447f41c6e4dSNicolas Chautru 			-9, -11, -11, -9, -9, -13, -13, -15, -15, -13,
1448f41c6e4dSNicolas Chautru 			-13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3,
1449f41c6e4dSNicolas Chautru 			-3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5,
1450f41c6e4dSNicolas Chautru 			-7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11,
1451f41c6e4dSNicolas Chautru 			-9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13,
1452f41c6e4dSNicolas Chautru 			-13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9,
1453f41c6e4dSNicolas Chautru 			-13, -13, -15, -15, -13, -13, -15, -15};
1454f41c6e4dSNicolas Chautru 	const double symbols_Q[256] = {
1455f41c6e4dSNicolas Chautru 			5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11,
1456f41c6e4dSNicolas Chautru 			9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13,
1457f41c6e4dSNicolas Chautru 			15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1,
1458f41c6e4dSNicolas Chautru 			11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13,
1459f41c6e4dSNicolas Chautru 			15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5,
1460f41c6e4dSNicolas Chautru 			-7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13,
1461f41c6e4dSNicolas Chautru 			-15, -13, -15, -11, -9, -11, -9, -13, -15, -13,
1462f41c6e4dSNicolas Chautru 			-15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5,
1463f41c6e4dSNicolas Chautru 			-7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15,
1464f41c6e4dSNicolas Chautru 			-13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5,
1465f41c6e4dSNicolas Chautru 			7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11,
1466f41c6e4dSNicolas Chautru 			9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15,
1467f41c6e4dSNicolas Chautru 			13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1,
1468f41c6e4dSNicolas Chautru 			3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9,
1469f41c6e4dSNicolas Chautru 			13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1,
1470f41c6e4dSNicolas Chautru 			-5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9,
1471f41c6e4dSNicolas Chautru 			-13, -15, -13, -15, -11, -9, -11, -9, -13, -15,
1472f41c6e4dSNicolas Chautru 			-13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7,
1473f41c6e4dSNicolas Chautru 			-5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15,
1474f41c6e4dSNicolas Chautru 			-13, -15, -11, -9, -11, -9, -13, -15, -13, -15};
1475f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1476f41c6e4dSNicolas Chautru 	N0 *= 170.0;
1477f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1478f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1479f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1480f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) *
1481f41c6e4dSNicolas Chautru 			(4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6]))));
1482f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) *
1483f41c6e4dSNicolas Chautru 			(4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7]))));
1484f41c6e4dSNicolas Chautru 	/* AWGN channel */
1485f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1486f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1487f41c6e4dSNicolas Chautru 	/*
1488f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1489f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1490f41c6e4dSNicolas Chautru 	 */
1491f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1492f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1493f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1494f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1495f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1496f41c6e4dSNicolas Chautru 		p0 = -999999;
1497f41c6e4dSNicolas Chautru 		p1 = -999999;
1498f41c6e4dSNicolas Chautru 		/* For each constellation point */
1499f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1500f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1501f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1502f41c6e4dSNicolas Chautru 			else
1503f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1504f41c6e4dSNicolas Chautru 		}
1505f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1506f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1507f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1508f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1509f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1510f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1511f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1512f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1513f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1514f41c6e4dSNicolas Chautru 	}
1515f41c6e4dSNicolas Chautru }
1516f41c6e4dSNicolas Chautru 
1517f41c6e4dSNicolas Chautru 
1518f41c6e4dSNicolas Chautru /*
1519f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==6
1520f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1521f41c6e4dSNicolas Chautru  */
1522f41c6e4dSNicolas Chautru static void
gen_qm6_llr(int8_t * llrs,uint32_t i,double N0,double llr_max)1523f41c6e4dSNicolas Chautru gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1524f41c6e4dSNicolas Chautru {
1525f41c6e4dSNicolas Chautru 	int qm = 6;
1526f41c6e4dSNicolas Chautru 	int qam = 64;
1527f41c6e4dSNicolas Chautru 	int m, k;
1528f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1529f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1530f41c6e4dSNicolas Chautru 	const double symbols_I[64] = {
1531f41c6e4dSNicolas Chautru 			3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7,
1532f41c6e4dSNicolas Chautru 			3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7,
1533f41c6e4dSNicolas Chautru 			-3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7,
1534f41c6e4dSNicolas Chautru 			-5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1,
1535f41c6e4dSNicolas Chautru 			-5, -5, -7, -7, -5, -5, -7, -7};
1536f41c6e4dSNicolas Chautru 	const double symbols_Q[64] = {
1537f41c6e4dSNicolas Chautru 			3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7,
1538f41c6e4dSNicolas Chautru 			-3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1,
1539f41c6e4dSNicolas Chautru 			-5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1,
1540f41c6e4dSNicolas Chautru 			5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7,
1541f41c6e4dSNicolas Chautru 			-3, -1, -3, -1, -5, -7, -5, -7};
1542f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1543f41c6e4dSNicolas Chautru 	N0 *= 42.0;
1544f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1545f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1546f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1547f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4])));
1548f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5])));
1549f41c6e4dSNicolas Chautru 	/* AWGN channel */
1550f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1551f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1552f41c6e4dSNicolas Chautru 	/*
1553f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1554f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1555f41c6e4dSNicolas Chautru 	 */
1556f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1557f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1558f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1559f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1560f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1561f41c6e4dSNicolas Chautru 		p0 = -999999;
1562f41c6e4dSNicolas Chautru 		p1 = -999999;
1563f41c6e4dSNicolas Chautru 		/* For each constellation point */
1564f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1565f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1566f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1567f41c6e4dSNicolas Chautru 			else
1568f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1569f41c6e4dSNicolas Chautru 		}
1570f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1571f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1572f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1573f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1574f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1575f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1576f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1577f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1578f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1579f41c6e4dSNicolas Chautru 	}
1580f41c6e4dSNicolas Chautru }
1581f41c6e4dSNicolas Chautru 
1582f41c6e4dSNicolas Chautru /*
1583f41c6e4dSNicolas Chautru  * Generate Qm LLRS for Qm==4
1584f41c6e4dSNicolas Chautru  * Modulation, AWGN and LLR estimation from max log development
1585f41c6e4dSNicolas Chautru  */
1586f41c6e4dSNicolas Chautru static void
gen_qm4_llr(int8_t * llrs,uint32_t i,double N0,double llr_max)1587f41c6e4dSNicolas Chautru gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max)
1588f41c6e4dSNicolas Chautru {
1589f41c6e4dSNicolas Chautru 	int qm = 4;
1590f41c6e4dSNicolas Chautru 	int qam = 16;
1591f41c6e4dSNicolas Chautru 	int m, k;
1592f41c6e4dSNicolas Chautru 	double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam];
1593f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1594f41c6e4dSNicolas Chautru 	const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3,
1595f41c6e4dSNicolas Chautru 			-1, -1, -3, -3, -1, -1, -3, -3};
1596f41c6e4dSNicolas Chautru 	const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3,
1597f41c6e4dSNicolas Chautru 			1, 3, 1, 3, -1, -3, -1, -3};
1598f41c6e4dSNicolas Chautru 	/* Average constellation point energy */
1599f41c6e4dSNicolas Chautru 	N0 *= 10.0;
1600f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++)
1601f41c6e4dSNicolas Chautru 		b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0;
1602f41c6e4dSNicolas Chautru 	/* 5.1.4 of TS38.211 */
1603f41c6e4dSNicolas Chautru 	I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2]));
1604f41c6e4dSNicolas Chautru 	Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3]));
1605f41c6e4dSNicolas Chautru 	/* AWGN channel */
1606f41c6e4dSNicolas Chautru 	I += sqrt(N0 / 2) * randn(0);
1607f41c6e4dSNicolas Chautru 	Q += sqrt(N0 / 2) * randn(1);
1608f41c6e4dSNicolas Chautru 	/*
1609f41c6e4dSNicolas Chautru 	 * Calculate the log of the probability that each of
1610f41c6e4dSNicolas Chautru 	 * the constellation points was transmitted
1611f41c6e4dSNicolas Chautru 	 */
1612f41c6e4dSNicolas Chautru 	for (m = 0; m < qam; m++)
1613f41c6e4dSNicolas Chautru 		log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0)
1614f41c6e4dSNicolas Chautru 				+ pow(Q - symbols_Q[m], 2.0)) / N0;
1615f41c6e4dSNicolas Chautru 	/* Calculate an LLR for each of the k_64QAM bits in the set */
1616f41c6e4dSNicolas Chautru 	for (k = 0; k < qm; k++) {
1617f41c6e4dSNicolas Chautru 		p0 = -999999;
1618f41c6e4dSNicolas Chautru 		p1 = -999999;
1619f41c6e4dSNicolas Chautru 		/* For each constellation point */
1620f41c6e4dSNicolas Chautru 		for (m = 0; m < qam; m++) {
1621f41c6e4dSNicolas Chautru 			if ((m >> (qm - k - 1)) & 1)
1622f41c6e4dSNicolas Chautru 				p1 = maxstar(p1, log_syml_prob[m]);
1623f41c6e4dSNicolas Chautru 			else
1624f41c6e4dSNicolas Chautru 				p0 = maxstar(p0, log_syml_prob[m]);
1625f41c6e4dSNicolas Chautru 		}
1626f41c6e4dSNicolas Chautru 		/* Calculate the LLR */
1627f41c6e4dSNicolas Chautru 		llr_ = p0 - p1;
1628f41c6e4dSNicolas Chautru 		llr_ *= (1 << ldpc_llr_decimals);
1629f41c6e4dSNicolas Chautru 		llr_ = round(llr_);
1630f41c6e4dSNicolas Chautru 		if (llr_ > llr_max)
1631f41c6e4dSNicolas Chautru 			llr_ = llr_max;
1632f41c6e4dSNicolas Chautru 		if (llr_ < -llr_max)
1633f41c6e4dSNicolas Chautru 			llr_ = -llr_max;
1634f41c6e4dSNicolas Chautru 		llrs[qm * i + k] = (int8_t) llr_;
1635f41c6e4dSNicolas Chautru 	}
1636f41c6e4dSNicolas Chautru }
1637f41c6e4dSNicolas Chautru 
1638f41c6e4dSNicolas Chautru static void
gen_qm2_llr(int8_t * llrs,uint32_t j,double N0,double llr_max)1639f41c6e4dSNicolas Chautru gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max)
1640f41c6e4dSNicolas Chautru {
1641f41c6e4dSNicolas Chautru 	double b, b1, n;
1642f41c6e4dSNicolas Chautru 	double coeff = 2.0 * sqrt(N0);
1643f41c6e4dSNicolas Chautru 
1644f41c6e4dSNicolas Chautru 	/* Ignore in vectors rare quasi null LLRs not to be saturated */
1645f41c6e4dSNicolas Chautru 	if (llrs[j] < 8 && llrs[j] > -8)
1646f41c6e4dSNicolas Chautru 		return;
1647f41c6e4dSNicolas Chautru 
1648f41c6e4dSNicolas Chautru 	/* Note don't change sign here */
1649f41c6e4dSNicolas Chautru 	n = randn(j % 2);
1650f41c6e4dSNicolas Chautru 	b1 = ((llrs[j] > 0 ? 2.0 : -2.0)
1651f41c6e4dSNicolas Chautru 			+ coeff * n) / N0;
1652f41c6e4dSNicolas Chautru 	b = b1 * (1 << ldpc_llr_decimals);
1653f41c6e4dSNicolas Chautru 	b = round(b);
1654f41c6e4dSNicolas Chautru 	if (b > llr_max)
1655f41c6e4dSNicolas Chautru 		b = llr_max;
1656f41c6e4dSNicolas Chautru 	if (b < -llr_max)
1657f41c6e4dSNicolas Chautru 		b = -llr_max;
1658f41c6e4dSNicolas Chautru 	llrs[j] = (int8_t) b;
1659f41c6e4dSNicolas Chautru }
1660f41c6e4dSNicolas Chautru 
1661f41c6e4dSNicolas Chautru /* Generate LLR for a given SNR */
1662f41c6e4dSNicolas Chautru static void
generate_llr_input(uint16_t n,struct rte_bbdev_op_data * inputs,struct rte_bbdev_dec_op * ref_op)1663f41c6e4dSNicolas Chautru generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs,
1664f41c6e4dSNicolas Chautru 		struct rte_bbdev_dec_op *ref_op)
1665f41c6e4dSNicolas Chautru {
1666f41c6e4dSNicolas Chautru 	struct rte_mbuf *m;
1667f41c6e4dSNicolas Chautru 	uint16_t qm;
1668f41c6e4dSNicolas Chautru 	uint32_t i, j, e, range;
1669f41c6e4dSNicolas Chautru 	double N0, llr_max;
1670f41c6e4dSNicolas Chautru 
1671f41c6e4dSNicolas Chautru 	e = ref_op->ldpc_dec.cb_params.e;
1672f41c6e4dSNicolas Chautru 	qm = ref_op->ldpc_dec.q_m;
1673f41c6e4dSNicolas Chautru 	llr_max = (1 << (ldpc_llr_size - 1)) - 1;
1674f41c6e4dSNicolas Chautru 	range = e / qm;
1675f41c6e4dSNicolas Chautru 	N0 = 1.0 / pow(10.0, get_snr() / 10.0);
1676f41c6e4dSNicolas Chautru 
1677f41c6e4dSNicolas Chautru 	for (i = 0; i < n; ++i) {
1678f41c6e4dSNicolas Chautru 		m = inputs[i].data;
1679f41c6e4dSNicolas Chautru 		int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0);
1680f41c6e4dSNicolas Chautru 		if (qm == 8) {
1681f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1682f41c6e4dSNicolas Chautru 				gen_qm8_llr(llrs, j, N0, llr_max);
1683f41c6e4dSNicolas Chautru 		} else if (qm == 6) {
1684f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1685f41c6e4dSNicolas Chautru 				gen_qm6_llr(llrs, j, N0, llr_max);
1686f41c6e4dSNicolas Chautru 		} else if (qm == 4) {
1687f41c6e4dSNicolas Chautru 			for (j = 0; j < range; ++j)
1688f41c6e4dSNicolas Chautru 				gen_qm4_llr(llrs, j, N0, llr_max);
1689f41c6e4dSNicolas Chautru 		} else {
1690f41c6e4dSNicolas Chautru 			for (j = 0; j < e; ++j)
1691f41c6e4dSNicolas Chautru 				gen_qm2_llr(llrs, j, N0, llr_max);
1692f41c6e4dSNicolas Chautru 		}
1693f41c6e4dSNicolas Chautru 	}
1694f41c6e4dSNicolas Chautru }
1695f41c6e4dSNicolas Chautru 
1696d819c083SNicolas Chautru static void
copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op ** ops,unsigned int n,unsigned int start_idx,struct rte_bbdev_op_data * inputs,struct rte_bbdev_op_data * hard_outputs,struct rte_bbdev_op_data * soft_outputs,struct rte_bbdev_op_data * harq_inputs,struct rte_bbdev_op_data * harq_outputs,struct rte_bbdev_dec_op * ref_op)1697d819c083SNicolas Chautru copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n,
1698d819c083SNicolas Chautru 		unsigned int start_idx,
1699d819c083SNicolas Chautru 		struct rte_bbdev_op_data *inputs,
1700d819c083SNicolas Chautru 		struct rte_bbdev_op_data *hard_outputs,
1701d819c083SNicolas Chautru 		struct rte_bbdev_op_data *soft_outputs,
1702d819c083SNicolas Chautru 		struct rte_bbdev_op_data *harq_inputs,
1703d819c083SNicolas Chautru 		struct rte_bbdev_op_data *harq_outputs,
1704d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op)
1705d819c083SNicolas Chautru {
1706d819c083SNicolas Chautru 	unsigned int i;
1707d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec;
1708d819c083SNicolas Chautru 
1709d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
171048fc315fSNicolas Chautru 		if (ldpc_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1711d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.ea =
1712d819c083SNicolas Chautru 					ldpc_dec->tb_params.ea;
1713d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.eb =
1714d819c083SNicolas Chautru 					ldpc_dec->tb_params.eb;
1715d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.c =
1716d819c083SNicolas Chautru 					ldpc_dec->tb_params.c;
1717d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.cab =
1718d819c083SNicolas Chautru 					ldpc_dec->tb_params.cab;
1719d819c083SNicolas Chautru 			ops[i]->ldpc_dec.tb_params.r =
1720d819c083SNicolas Chautru 					ldpc_dec->tb_params.r;
1721d819c083SNicolas Chautru 		} else {
1722d819c083SNicolas Chautru 			ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e;
1723d819c083SNicolas Chautru 		}
1724d819c083SNicolas Chautru 
1725d819c083SNicolas Chautru 		ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph;
1726d819c083SNicolas Chautru 		ops[i]->ldpc_dec.z_c = ldpc_dec->z_c;
1727d819c083SNicolas Chautru 		ops[i]->ldpc_dec.q_m = ldpc_dec->q_m;
1728d819c083SNicolas Chautru 		ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler;
1729d819c083SNicolas Chautru 		ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb;
1730d819c083SNicolas Chautru 		ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max;
1731d819c083SNicolas Chautru 		ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index;
1732d819c083SNicolas Chautru 		ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags;
1733d819c083SNicolas Chautru 		ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode;
1734d819c083SNicolas Chautru 
1735335c11fdSNicolas Chautru 		if (hard_outputs != NULL)
1736335c11fdSNicolas Chautru 			ops[i]->ldpc_dec.hard_output =
1737335c11fdSNicolas Chautru 					hard_outputs[start_idx + i];
1738335c11fdSNicolas Chautru 		if (inputs != NULL)
1739335c11fdSNicolas Chautru 			ops[i]->ldpc_dec.input =
1740335c11fdSNicolas Chautru 					inputs[start_idx + i];
1741d819c083SNicolas Chautru 		if (soft_outputs != NULL)
1742d819c083SNicolas Chautru 			ops[i]->ldpc_dec.soft_output =
1743d819c083SNicolas Chautru 					soft_outputs[start_idx + i];
1744d819c083SNicolas Chautru 		if (harq_inputs != NULL)
1745d819c083SNicolas Chautru 			ops[i]->ldpc_dec.harq_combined_input =
1746d819c083SNicolas Chautru 					harq_inputs[start_idx + i];
1747d819c083SNicolas Chautru 		if (harq_outputs != NULL)
1748d819c083SNicolas Chautru 			ops[i]->ldpc_dec.harq_combined_output =
1749d819c083SNicolas Chautru 					harq_outputs[start_idx + i];
1750d819c083SNicolas Chautru 	}
1751d819c083SNicolas Chautru }
1752d819c083SNicolas Chautru 
1753d819c083SNicolas Chautru 
1754d819c083SNicolas Chautru static void
copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op ** ops,unsigned int n,unsigned int start_idx,struct rte_bbdev_op_data * inputs,struct rte_bbdev_op_data * outputs,struct rte_bbdev_enc_op * ref_op)1755d819c083SNicolas Chautru copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n,
1756d819c083SNicolas Chautru 		unsigned int start_idx,
1757d819c083SNicolas Chautru 		struct rte_bbdev_op_data *inputs,
1758d819c083SNicolas Chautru 		struct rte_bbdev_op_data *outputs,
1759d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op)
1760d819c083SNicolas Chautru {
1761d819c083SNicolas Chautru 	unsigned int i;
1762d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc;
1763d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
176448fc315fSNicolas Chautru 		if (ldpc_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1765d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea;
1766d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb;
1767d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.cab =
1768d819c083SNicolas Chautru 					ldpc_enc->tb_params.cab;
1769d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c;
1770d819c083SNicolas Chautru 			ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r;
1771d819c083SNicolas Chautru 		} else {
1772d819c083SNicolas Chautru 			ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e;
1773d819c083SNicolas Chautru 		}
1774d819c083SNicolas Chautru 		ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph;
1775d819c083SNicolas Chautru 		ops[i]->ldpc_enc.z_c = ldpc_enc->z_c;
1776d819c083SNicolas Chautru 		ops[i]->ldpc_enc.q_m = ldpc_enc->q_m;
1777d819c083SNicolas Chautru 		ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler;
1778d819c083SNicolas Chautru 		ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb;
1779d819c083SNicolas Chautru 		ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index;
1780d819c083SNicolas Chautru 		ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags;
1781d819c083SNicolas Chautru 		ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode;
1782d819c083SNicolas Chautru 		ops[i]->ldpc_enc.output = outputs[start_idx + i];
1783d819c083SNicolas Chautru 		ops[i]->ldpc_enc.input = inputs[start_idx + i];
1784d819c083SNicolas Chautru 	}
1785d819c083SNicolas Chautru }
1786d819c083SNicolas Chautru 
1787f714a188SAmr Mokhtar static int
check_dec_status_and_ordering(struct rte_bbdev_dec_op * op,unsigned int order_idx,const int expected_status)1788f714a188SAmr Mokhtar check_dec_status_and_ordering(struct rte_bbdev_dec_op *op,
1789f714a188SAmr Mokhtar 		unsigned int order_idx, const int expected_status)
1790f714a188SAmr Mokhtar {
1791335c11fdSNicolas Chautru 	int status = op->status;
1792335c11fdSNicolas Chautru 	/* ignore parity mismatch false alarms for long iterations */
1793335c11fdSNicolas Chautru 	if (get_iter_max() >= 10) {
1794335c11fdSNicolas Chautru 		if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) &&
1795335c11fdSNicolas Chautru 				(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) {
1796335c11fdSNicolas Chautru 			printf("WARNING: Ignore Syndrome Check mismatch\n");
1797335c11fdSNicolas Chautru 			status -= (1 << RTE_BBDEV_SYNDROME_ERROR);
1798335c11fdSNicolas Chautru 		}
1799335c11fdSNicolas Chautru 		if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) &&
1800335c11fdSNicolas Chautru 				!(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) {
1801335c11fdSNicolas Chautru 			printf("WARNING: Ignore Syndrome Check mismatch\n");
1802335c11fdSNicolas Chautru 			status += (1 << RTE_BBDEV_SYNDROME_ERROR);
1803335c11fdSNicolas Chautru 		}
1804335c11fdSNicolas Chautru 	}
1805335c11fdSNicolas Chautru 
1806335c11fdSNicolas Chautru 	TEST_ASSERT(status == expected_status,
1807f714a188SAmr Mokhtar 			"op_status (%d) != expected_status (%d)",
1808f714a188SAmr Mokhtar 			op->status, expected_status);
1809f714a188SAmr Mokhtar 
1810f714a188SAmr Mokhtar 	TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
1811f714a188SAmr Mokhtar 			"Ordering error, expected %p, got %p",
1812f714a188SAmr Mokhtar 			(void *)(uintptr_t)order_idx, op->opaque_data);
1813f714a188SAmr Mokhtar 
1814f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1815f714a188SAmr Mokhtar }
1816f714a188SAmr Mokhtar 
1817f714a188SAmr Mokhtar static int
check_enc_status_and_ordering(struct rte_bbdev_enc_op * op,unsigned int order_idx,const int expected_status)1818f714a188SAmr Mokhtar check_enc_status_and_ordering(struct rte_bbdev_enc_op *op,
1819f714a188SAmr Mokhtar 		unsigned int order_idx, const int expected_status)
1820f714a188SAmr Mokhtar {
1821f714a188SAmr Mokhtar 	TEST_ASSERT(op->status == expected_status,
1822f714a188SAmr Mokhtar 			"op_status (%d) != expected_status (%d)",
1823f714a188SAmr Mokhtar 			op->status, expected_status);
1824f714a188SAmr Mokhtar 
1825335c11fdSNicolas Chautru 	if (op->opaque_data != (void *)(uintptr_t)INVALID_OPAQUE)
1826f714a188SAmr Mokhtar 		TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data,
1827f714a188SAmr Mokhtar 				"Ordering error, expected %p, got %p",
1828f714a188SAmr Mokhtar 				(void *)(uintptr_t)order_idx, op->opaque_data);
1829f714a188SAmr Mokhtar 
1830f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1831f714a188SAmr Mokhtar }
1832f714a188SAmr Mokhtar 
1833f714a188SAmr Mokhtar static inline int
validate_op_chain(struct rte_bbdev_op_data * op,struct op_data_entries * orig_op)1834f714a188SAmr Mokhtar validate_op_chain(struct rte_bbdev_op_data *op,
1835f714a188SAmr Mokhtar 		struct op_data_entries *orig_op)
1836f714a188SAmr Mokhtar {
1837f714a188SAmr Mokhtar 	uint8_t i;
1838f714a188SAmr Mokhtar 	struct rte_mbuf *m = op->data;
1839f714a188SAmr Mokhtar 	uint8_t nb_dst_segments = orig_op->nb_segments;
18409585f8b1SKamil Chalupnik 	uint32_t total_data_size = 0;
1841f714a188SAmr Mokhtar 
1842f714a188SAmr Mokhtar 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
1843f714a188SAmr Mokhtar 			"Number of segments differ in original (%u) and filled (%u) op",
1844f714a188SAmr Mokhtar 			nb_dst_segments, m->nb_segs);
1845f714a188SAmr Mokhtar 
18469585f8b1SKamil Chalupnik 	/* Validate each mbuf segment length */
1847f714a188SAmr Mokhtar 	for (i = 0; i < nb_dst_segments; ++i) {
1848f714a188SAmr Mokhtar 		/* Apply offset to the first mbuf segment */
1849f714a188SAmr Mokhtar 		uint16_t offset = (i == 0) ? op->offset : 0;
18509585f8b1SKamil Chalupnik 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
18519585f8b1SKamil Chalupnik 		total_data_size += orig_op->segments[i].length;
1852f714a188SAmr Mokhtar 
1853f714a188SAmr Mokhtar 		TEST_ASSERT(orig_op->segments[i].length == data_len,
1854f714a188SAmr Mokhtar 				"Length of segment differ in original (%u) and filled (%u) op",
1855f714a188SAmr Mokhtar 				orig_op->segments[i].length, data_len);
1856f714a188SAmr Mokhtar 		TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr,
1857f714a188SAmr Mokhtar 				rte_pktmbuf_mtod_offset(m, uint32_t *, offset),
1858f714a188SAmr Mokhtar 				data_len,
1859f714a188SAmr Mokhtar 				"Output buffers (CB=%u) are not equal", i);
1860f714a188SAmr Mokhtar 		m = m->next;
1861f714a188SAmr Mokhtar 	}
1862f714a188SAmr Mokhtar 
18639585f8b1SKamil Chalupnik 	/* Validate total mbuf pkt length */
18649585f8b1SKamil Chalupnik 	uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset;
18659585f8b1SKamil Chalupnik 	TEST_ASSERT(total_data_size == pkt_len,
18669585f8b1SKamil Chalupnik 			"Length of data differ in original (%u) and filled (%u) op",
18679585f8b1SKamil Chalupnik 			total_data_size, pkt_len);
18689585f8b1SKamil Chalupnik 
1869f714a188SAmr Mokhtar 	return TEST_SUCCESS;
1870f714a188SAmr Mokhtar }
1871f714a188SAmr Mokhtar 
1872335c11fdSNicolas Chautru /*
1873335c11fdSNicolas Chautru  * Compute K0 for a given configuration for HARQ output length computation
1874335c11fdSNicolas Chautru  * As per definition in 3GPP 38.212 Table 5.4.2.1-2
1875335c11fdSNicolas Chautru  */
1876335c11fdSNicolas Chautru static inline uint16_t
get_k0(uint16_t n_cb,uint16_t z_c,uint8_t bg,uint8_t rv_index)1877335c11fdSNicolas Chautru get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index)
1878335c11fdSNicolas Chautru {
1879335c11fdSNicolas Chautru 	if (rv_index == 0)
1880335c11fdSNicolas Chautru 		return 0;
1881335c11fdSNicolas Chautru 	uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c;
1882335c11fdSNicolas Chautru 	if (n_cb == n) {
1883335c11fdSNicolas Chautru 		if (rv_index == 1)
1884335c11fdSNicolas Chautru 			return (bg == 1 ? K0_1_1 : K0_1_2) * z_c;
1885335c11fdSNicolas Chautru 		else if (rv_index == 2)
1886335c11fdSNicolas Chautru 			return (bg == 1 ? K0_2_1 : K0_2_2) * z_c;
1887335c11fdSNicolas Chautru 		else
1888335c11fdSNicolas Chautru 			return (bg == 1 ? K0_3_1 : K0_3_2) * z_c;
1889335c11fdSNicolas Chautru 	}
1890335c11fdSNicolas Chautru 	/* LBRM case - includes a division by N */
1891335c11fdSNicolas Chautru 	if (rv_index == 1)
1892335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb)
1893335c11fdSNicolas Chautru 				/ n) * z_c;
1894335c11fdSNicolas Chautru 	else if (rv_index == 2)
1895335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb)
1896335c11fdSNicolas Chautru 				/ n) * z_c;
1897335c11fdSNicolas Chautru 	else
1898335c11fdSNicolas Chautru 		return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb)
1899335c11fdSNicolas Chautru 				/ n) * z_c;
1900335c11fdSNicolas Chautru }
1901335c11fdSNicolas Chautru 
1902335c11fdSNicolas Chautru /* HARQ output length including the Filler bits */
1903335c11fdSNicolas Chautru static inline uint16_t
compute_harq_len(struct rte_bbdev_op_ldpc_dec * ops_ld)1904335c11fdSNicolas Chautru compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld)
1905335c11fdSNicolas Chautru {
1906335c11fdSNicolas Chautru 	uint16_t k0 = 0;
1907335c11fdSNicolas Chautru 	uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index;
1908335c11fdSNicolas Chautru 	k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv);
1909335c11fdSNicolas Chautru 	/* Compute RM out size and number of rows */
1910335c11fdSNicolas Chautru 	uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8)
1911335c11fdSNicolas Chautru 			* ops_ld->z_c - ops_ld->n_filler;
1912335c11fdSNicolas Chautru 	uint16_t deRmOutSize = RTE_MIN(
1913335c11fdSNicolas Chautru 			k0 + ops_ld->cb_params.e +
1914335c11fdSNicolas Chautru 			((k0 > parity_offset) ?
1915335c11fdSNicolas Chautru 					0 : ops_ld->n_filler),
1916335c11fdSNicolas Chautru 					ops_ld->n_cb);
1917335c11fdSNicolas Chautru 	uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1)
1918335c11fdSNicolas Chautru 			/ ops_ld->z_c);
1919335c11fdSNicolas Chautru 	uint16_t harq_output_len = numRows * ops_ld->z_c;
1920335c11fdSNicolas Chautru 	return harq_output_len;
1921335c11fdSNicolas Chautru }
1922335c11fdSNicolas Chautru 
1923335c11fdSNicolas Chautru static inline int
validate_op_harq_chain(struct rte_bbdev_op_data * op,struct op_data_entries * orig_op,struct rte_bbdev_op_ldpc_dec * ops_ld)1924335c11fdSNicolas Chautru validate_op_harq_chain(struct rte_bbdev_op_data *op,
1925335c11fdSNicolas Chautru 		struct op_data_entries *orig_op,
1926335c11fdSNicolas Chautru 		struct rte_bbdev_op_ldpc_dec *ops_ld)
1927335c11fdSNicolas Chautru {
1928335c11fdSNicolas Chautru 	uint8_t i;
1929335c11fdSNicolas Chautru 	uint32_t j, jj, k;
1930335c11fdSNicolas Chautru 	struct rte_mbuf *m = op->data;
1931335c11fdSNicolas Chautru 	uint8_t nb_dst_segments = orig_op->nb_segments;
1932335c11fdSNicolas Chautru 	uint32_t total_data_size = 0;
1933335c11fdSNicolas Chautru 	int8_t *harq_orig, *harq_out, abs_harq_origin;
1934335c11fdSNicolas Chautru 	uint32_t byte_error = 0, cum_error = 0, error;
1935335c11fdSNicolas Chautru 	int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1;
1936335c11fdSNicolas Chautru 	int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1;
1937335c11fdSNicolas Chautru 	uint16_t parity_offset;
1938335c11fdSNicolas Chautru 
1939335c11fdSNicolas Chautru 	TEST_ASSERT(nb_dst_segments == m->nb_segs,
1940335c11fdSNicolas Chautru 			"Number of segments differ in original (%u) and filled (%u) op",
1941335c11fdSNicolas Chautru 			nb_dst_segments, m->nb_segs);
1942335c11fdSNicolas Chautru 
1943335c11fdSNicolas Chautru 	/* Validate each mbuf segment length */
1944335c11fdSNicolas Chautru 	for (i = 0; i < nb_dst_segments; ++i) {
1945335c11fdSNicolas Chautru 		/* Apply offset to the first mbuf segment */
1946335c11fdSNicolas Chautru 		uint16_t offset = (i == 0) ? op->offset : 0;
1947335c11fdSNicolas Chautru 		uint16_t data_len = rte_pktmbuf_data_len(m) - offset;
1948335c11fdSNicolas Chautru 		total_data_size += orig_op->segments[i].length;
1949335c11fdSNicolas Chautru 
1950335c11fdSNicolas Chautru 		TEST_ASSERT(orig_op->segments[i].length <
1951335c11fdSNicolas Chautru 				(uint32_t)(data_len + 64),
1952335c11fdSNicolas Chautru 				"Length of segment differ in original (%u) and filled (%u) op",
1953335c11fdSNicolas Chautru 				orig_op->segments[i].length, data_len);
1954335c11fdSNicolas Chautru 		harq_orig = (int8_t *) orig_op->segments[i].addr;
1955335c11fdSNicolas Chautru 		harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset);
1956335c11fdSNicolas Chautru 
1957335c11fdSNicolas Chautru 		if (!(ldpc_cap_flags &
1958335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS
1959335c11fdSNicolas Chautru 				) || (ops_ld->op_flags &
1960335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
1961335c11fdSNicolas Chautru 			data_len -= ops_ld->z_c;
1962335c11fdSNicolas Chautru 			parity_offset = data_len;
1963335c11fdSNicolas Chautru 		} else {
1964335c11fdSNicolas Chautru 			/* Compute RM out size and number of rows */
1965335c11fdSNicolas Chautru 			parity_offset = (ops_ld->basegraph == 1 ? 20 : 8)
1966335c11fdSNicolas Chautru 					* ops_ld->z_c - ops_ld->n_filler;
1967335c11fdSNicolas Chautru 			uint16_t deRmOutSize = compute_harq_len(ops_ld) -
1968335c11fdSNicolas Chautru 					ops_ld->n_filler;
1969335c11fdSNicolas Chautru 			if (data_len > deRmOutSize)
1970335c11fdSNicolas Chautru 				data_len = deRmOutSize;
1971335c11fdSNicolas Chautru 			if (data_len > orig_op->segments[i].length)
1972335c11fdSNicolas Chautru 				data_len = orig_op->segments[i].length;
1973335c11fdSNicolas Chautru 		}
1974335c11fdSNicolas Chautru 		/*
1975335c11fdSNicolas Chautru 		 * HARQ output can have minor differences
1976335c11fdSNicolas Chautru 		 * due to integer representation and related scaling
1977335c11fdSNicolas Chautru 		 */
1978335c11fdSNicolas Chautru 		for (j = 0, jj = 0; j < data_len; j++, jj++) {
1979335c11fdSNicolas Chautru 			if (j == parity_offset) {
1980335c11fdSNicolas Chautru 				/* Special Handling of the filler bits */
1981335c11fdSNicolas Chautru 				for (k = 0; k < ops_ld->n_filler; k++) {
1982335c11fdSNicolas Chautru 					if (harq_out[jj] !=
1983335c11fdSNicolas Chautru 							llr_max_pre_scaling) {
1984335c11fdSNicolas Chautru 						printf("HARQ Filler issue %d: %d %d\n",
1985335c11fdSNicolas Chautru 							jj, harq_out[jj],
1986335c11fdSNicolas Chautru 							llr_max);
1987335c11fdSNicolas Chautru 						byte_error++;
1988335c11fdSNicolas Chautru 					}
1989335c11fdSNicolas Chautru 					jj++;
1990335c11fdSNicolas Chautru 				}
1991335c11fdSNicolas Chautru 			}
1992335c11fdSNicolas Chautru 			if (!(ops_ld->op_flags &
1993335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
1994335c11fdSNicolas Chautru 				if (ldpc_llr_decimals > 1)
1995335c11fdSNicolas Chautru 					harq_out[jj] = (harq_out[jj] + 1)
1996335c11fdSNicolas Chautru 						>> (ldpc_llr_decimals - 1);
1997335c11fdSNicolas Chautru 				/* Saturated to S7 */
1998335c11fdSNicolas Chautru 				if (harq_orig[j] > llr_max)
1999335c11fdSNicolas Chautru 					harq_orig[j] = llr_max;
2000335c11fdSNicolas Chautru 				if (harq_orig[j] < -llr_max)
2001335c11fdSNicolas Chautru 					harq_orig[j] = -llr_max;
2002335c11fdSNicolas Chautru 			}
2003335c11fdSNicolas Chautru 			if (harq_orig[j] != harq_out[jj]) {
2004335c11fdSNicolas Chautru 				error = (harq_orig[j] > harq_out[jj]) ?
2005335c11fdSNicolas Chautru 						harq_orig[j] - harq_out[jj] :
2006335c11fdSNicolas Chautru 						harq_out[jj] - harq_orig[j];
2007335c11fdSNicolas Chautru 				abs_harq_origin = harq_orig[j] > 0 ?
2008335c11fdSNicolas Chautru 							harq_orig[j] :
2009335c11fdSNicolas Chautru 							-harq_orig[j];
2010335c11fdSNicolas Chautru 				/* Residual quantization error */
2011335c11fdSNicolas Chautru 				if ((error > 8 && (abs_harq_origin <
2012335c11fdSNicolas Chautru 						(llr_max - 16))) ||
2013335c11fdSNicolas Chautru 						(error > 16)) {
2014335c11fdSNicolas Chautru 					printf("HARQ mismatch %d: exp %d act %d => %d\n",
2015335c11fdSNicolas Chautru 							j, harq_orig[j],
2016335c11fdSNicolas Chautru 							harq_out[jj], error);
2017335c11fdSNicolas Chautru 					byte_error++;
2018335c11fdSNicolas Chautru 					cum_error += error;
2019335c11fdSNicolas Chautru 				}
2020335c11fdSNicolas Chautru 			}
2021335c11fdSNicolas Chautru 		}
2022335c11fdSNicolas Chautru 		m = m->next;
2023335c11fdSNicolas Chautru 	}
2024335c11fdSNicolas Chautru 
2025335c11fdSNicolas Chautru 	if (byte_error)
2026335c11fdSNicolas Chautru 		TEST_ASSERT(byte_error <= 1,
2027335c11fdSNicolas Chautru 				"HARQ output mismatch (%d) %d",
2028335c11fdSNicolas Chautru 				byte_error, cum_error);
2029335c11fdSNicolas Chautru 
2030335c11fdSNicolas Chautru 	/* Validate total mbuf pkt length */
2031335c11fdSNicolas Chautru 	uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset;
2032335c11fdSNicolas Chautru 	TEST_ASSERT(total_data_size < pkt_len + 64,
2033335c11fdSNicolas Chautru 			"Length of data differ in original (%u) and filled (%u) op",
2034335c11fdSNicolas Chautru 			total_data_size, pkt_len);
2035335c11fdSNicolas Chautru 
2036335c11fdSNicolas Chautru 	return TEST_SUCCESS;
2037335c11fdSNicolas Chautru }
2038335c11fdSNicolas Chautru 
2039f714a188SAmr Mokhtar static int
validate_dec_op(struct rte_bbdev_dec_op ** ops,const uint16_t n,struct rte_bbdev_dec_op * ref_op,const int vector_mask)2040f714a188SAmr Mokhtar validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
2041f714a188SAmr Mokhtar 		struct rte_bbdev_dec_op *ref_op, const int vector_mask)
2042f714a188SAmr Mokhtar {
2043f714a188SAmr Mokhtar 	unsigned int i;
2044f714a188SAmr Mokhtar 	int ret;
2045f714a188SAmr Mokhtar 	struct op_data_entries *hard_data_orig =
2046f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
2047f714a188SAmr Mokhtar 	struct op_data_entries *soft_data_orig =
2048f714a188SAmr Mokhtar 			&test_vector.entries[DATA_SOFT_OUTPUT];
2049f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_dec *ops_td;
2050f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *hard_output;
2051f714a188SAmr Mokhtar 	struct rte_bbdev_op_data *soft_output;
2052f714a188SAmr Mokhtar 	struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec;
2053f714a188SAmr Mokhtar 
2054f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
2055f714a188SAmr Mokhtar 		ops_td = &ops[i]->turbo_dec;
2056f714a188SAmr Mokhtar 		hard_output = &ops_td->hard_output;
2057f714a188SAmr Mokhtar 		soft_output = &ops_td->soft_output;
2058f714a188SAmr Mokhtar 
2059f714a188SAmr Mokhtar 		if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)
2060f714a188SAmr Mokhtar 			TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count,
2061f714a188SAmr Mokhtar 					"Returned iter_count (%d) > expected iter_count (%d)",
2062f714a188SAmr Mokhtar 					ops_td->iter_count, ref_td->iter_count);
2063f714a188SAmr Mokhtar 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
2064f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
2065f714a188SAmr Mokhtar 				"Checking status and ordering for decoder failed");
2066f714a188SAmr Mokhtar 
2067f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
2068f714a188SAmr Mokhtar 				hard_data_orig),
2069f714a188SAmr Mokhtar 				"Hard output buffers (CB=%u) are not equal",
2070f714a188SAmr Mokhtar 				i);
2071f714a188SAmr Mokhtar 
2072f714a188SAmr Mokhtar 		if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT)
2073f714a188SAmr Mokhtar 			TEST_ASSERT_SUCCESS(validate_op_chain(soft_output,
2074f714a188SAmr Mokhtar 					soft_data_orig),
2075f714a188SAmr Mokhtar 					"Soft output buffers (CB=%u) are not equal",
2076f714a188SAmr Mokhtar 					i);
2077f714a188SAmr Mokhtar 	}
2078f714a188SAmr Mokhtar 
2079f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2080f714a188SAmr Mokhtar }
2081f714a188SAmr Mokhtar 
2082f41c6e4dSNicolas Chautru /* Check Number of code blocks errors */
2083f41c6e4dSNicolas Chautru static int
validate_ldpc_bler(struct rte_bbdev_dec_op ** ops,const uint16_t n)2084f41c6e4dSNicolas Chautru validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n)
2085f41c6e4dSNicolas Chautru {
2086f41c6e4dSNicolas Chautru 	unsigned int i;
2087f41c6e4dSNicolas Chautru 	struct op_data_entries *hard_data_orig =
2088f41c6e4dSNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2089f41c6e4dSNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ops_td;
2090f41c6e4dSNicolas Chautru 	struct rte_bbdev_op_data *hard_output;
2091f41c6e4dSNicolas Chautru 	int errors = 0;
2092f41c6e4dSNicolas Chautru 	struct rte_mbuf *m;
2093f41c6e4dSNicolas Chautru 
2094f41c6e4dSNicolas Chautru 	for (i = 0; i < n; ++i) {
2095f41c6e4dSNicolas Chautru 		ops_td = &ops[i]->ldpc_dec;
2096f41c6e4dSNicolas Chautru 		hard_output = &ops_td->hard_output;
2097f41c6e4dSNicolas Chautru 		m = hard_output->data;
2098f41c6e4dSNicolas Chautru 		if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0),
2099f41c6e4dSNicolas Chautru 				hard_data_orig->segments[0].addr,
2100f41c6e4dSNicolas Chautru 				hard_data_orig->segments[0].length))
2101f41c6e4dSNicolas Chautru 			errors++;
2102f41c6e4dSNicolas Chautru 	}
2103f41c6e4dSNicolas Chautru 	return errors;
2104f41c6e4dSNicolas Chautru }
2105f41c6e4dSNicolas Chautru 
2106d819c083SNicolas Chautru static int
validate_ldpc_dec_op(struct rte_bbdev_dec_op ** ops,const uint16_t n,struct rte_bbdev_dec_op * ref_op,const int vector_mask)2107d819c083SNicolas Chautru validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n,
2108d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op, const int vector_mask)
2109d819c083SNicolas Chautru {
2110d819c083SNicolas Chautru 	unsigned int i;
2111d819c083SNicolas Chautru 	int ret;
2112d819c083SNicolas Chautru 	struct op_data_entries *hard_data_orig =
2113d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2114d819c083SNicolas Chautru 	struct op_data_entries *soft_data_orig =
2115d819c083SNicolas Chautru 			&test_vector.entries[DATA_SOFT_OUTPUT];
2116d819c083SNicolas Chautru 	struct op_data_entries *harq_data_orig =
2117d819c083SNicolas Chautru 				&test_vector.entries[DATA_HARQ_OUTPUT];
2118d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ops_td;
2119d819c083SNicolas Chautru 	struct rte_bbdev_op_data *hard_output;
2120d819c083SNicolas Chautru 	struct rte_bbdev_op_data *harq_output;
2121d819c083SNicolas Chautru 	struct rte_bbdev_op_data *soft_output;
2122d819c083SNicolas Chautru 	struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec;
2123d819c083SNicolas Chautru 
2124d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
2125d819c083SNicolas Chautru 		ops_td = &ops[i]->ldpc_dec;
2126d819c083SNicolas Chautru 		hard_output = &ops_td->hard_output;
2127d819c083SNicolas Chautru 		harq_output = &ops_td->harq_combined_output;
2128d819c083SNicolas Chautru 		soft_output = &ops_td->soft_output;
2129d819c083SNicolas Chautru 
2130d819c083SNicolas Chautru 		ret = check_dec_status_and_ordering(ops[i], i, ref_op->status);
2131d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
2132d819c083SNicolas Chautru 				"Checking status and ordering for decoder failed");
2133d819c083SNicolas Chautru 		if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)
2134d819c083SNicolas Chautru 			TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count,
2135d819c083SNicolas Chautru 					"Returned iter_count (%d) > expected iter_count (%d)",
2136d819c083SNicolas Chautru 					ops_td->iter_count, ref_td->iter_count);
2137335c11fdSNicolas Chautru 		/*
2138335c11fdSNicolas Chautru 		 * We can ignore output data when the decoding failed to
2139335c11fdSNicolas Chautru 		 * converge or for loop-back cases
2140335c11fdSNicolas Chautru 		 */
2141335c11fdSNicolas Chautru 		if (!check_bit(ops[i]->ldpc_dec.op_flags,
2142335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK
2143335c11fdSNicolas Chautru 				) && (
2144335c11fdSNicolas Chautru 				ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR
2145335c11fdSNicolas Chautru 						)) == 0)
2146d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_chain(hard_output,
2147d819c083SNicolas Chautru 					hard_data_orig),
2148d819c083SNicolas Chautru 					"Hard output buffers (CB=%u) are not equal",
2149d819c083SNicolas Chautru 					i);
2150d819c083SNicolas Chautru 
2151d819c083SNicolas Chautru 		if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE)
2152d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_chain(soft_output,
2153d819c083SNicolas Chautru 					soft_data_orig),
2154d819c083SNicolas Chautru 					"Soft output buffers (CB=%u) are not equal",
2155d819c083SNicolas Chautru 					i);
2156d819c083SNicolas Chautru 		if (ref_op->ldpc_dec.op_flags &
2157d819c083SNicolas Chautru 				RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) {
2158335c11fdSNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output,
2159335c11fdSNicolas Chautru 					harq_data_orig, ops_td),
2160d819c083SNicolas Chautru 					"HARQ output buffers (CB=%u) are not equal",
2161d819c083SNicolas Chautru 					i);
2162d819c083SNicolas Chautru 		}
2163335c11fdSNicolas Chautru 		if (ref_op->ldpc_dec.op_flags &
2164335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
2165335c11fdSNicolas Chautru 			TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output,
2166335c11fdSNicolas Chautru 					harq_data_orig, ops_td),
2167335c11fdSNicolas Chautru 					"HARQ output buffers (CB=%u) are not equal",
2168335c11fdSNicolas Chautru 					i);
2169335c11fdSNicolas Chautru 
2170d819c083SNicolas Chautru 	}
2171d819c083SNicolas Chautru 
2172d819c083SNicolas Chautru 	return TEST_SUCCESS;
2173d819c083SNicolas Chautru }
2174d819c083SNicolas Chautru 
2175d819c083SNicolas Chautru 
2176f714a188SAmr Mokhtar static int
validate_enc_op(struct rte_bbdev_enc_op ** ops,const uint16_t n,struct rte_bbdev_enc_op * ref_op)2177f714a188SAmr Mokhtar validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
2178f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op)
2179f714a188SAmr Mokhtar {
2180f714a188SAmr Mokhtar 	unsigned int i;
2181f714a188SAmr Mokhtar 	int ret;
2182f714a188SAmr Mokhtar 	struct op_data_entries *hard_data_orig =
2183f714a188SAmr Mokhtar 			&test_vector.entries[DATA_HARD_OUTPUT];
2184f714a188SAmr Mokhtar 
2185f714a188SAmr Mokhtar 	for (i = 0; i < n; ++i) {
2186f714a188SAmr Mokhtar 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
2187f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(ret,
2188f714a188SAmr Mokhtar 				"Checking status and ordering for encoder failed");
2189f714a188SAmr Mokhtar 		TEST_ASSERT_SUCCESS(validate_op_chain(
2190f714a188SAmr Mokhtar 				&ops[i]->turbo_enc.output,
2191f714a188SAmr Mokhtar 				hard_data_orig),
2192f714a188SAmr Mokhtar 				"Output buffers (CB=%u) are not equal",
2193f714a188SAmr Mokhtar 				i);
2194f714a188SAmr Mokhtar 	}
2195f714a188SAmr Mokhtar 
2196f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2197f714a188SAmr Mokhtar }
2198f714a188SAmr Mokhtar 
2199d819c083SNicolas Chautru static int
validate_ldpc_enc_op(struct rte_bbdev_enc_op ** ops,const uint16_t n,struct rte_bbdev_enc_op * ref_op)2200d819c083SNicolas Chautru validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n,
2201d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op)
2202d819c083SNicolas Chautru {
2203d819c083SNicolas Chautru 	unsigned int i;
2204d819c083SNicolas Chautru 	int ret;
2205d819c083SNicolas Chautru 	struct op_data_entries *hard_data_orig =
2206d819c083SNicolas Chautru 			&test_vector.entries[DATA_HARD_OUTPUT];
2207d819c083SNicolas Chautru 
2208d819c083SNicolas Chautru 	for (i = 0; i < n; ++i) {
2209d819c083SNicolas Chautru 		ret = check_enc_status_and_ordering(ops[i], i, ref_op->status);
2210d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
2211d819c083SNicolas Chautru 				"Checking status and ordering for encoder failed");
2212d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(validate_op_chain(
2213d819c083SNicolas Chautru 				&ops[i]->ldpc_enc.output,
2214d819c083SNicolas Chautru 				hard_data_orig),
2215d819c083SNicolas Chautru 				"Output buffers (CB=%u) are not equal",
2216d819c083SNicolas Chautru 				i);
2217d819c083SNicolas Chautru 	}
2218d819c083SNicolas Chautru 
2219d819c083SNicolas Chautru 	return TEST_SUCCESS;
2220d819c083SNicolas Chautru }
2221d819c083SNicolas Chautru 
2222f714a188SAmr Mokhtar static void
create_reference_dec_op(struct rte_bbdev_dec_op * op)2223f714a188SAmr Mokhtar create_reference_dec_op(struct rte_bbdev_dec_op *op)
2224f714a188SAmr Mokhtar {
2225f714a188SAmr Mokhtar 	unsigned int i;
2226f714a188SAmr Mokhtar 	struct op_data_entries *entry;
2227f714a188SAmr Mokhtar 
2228f714a188SAmr Mokhtar 	op->turbo_dec = test_vector.turbo_dec;
2229f714a188SAmr Mokhtar 	entry = &test_vector.entries[DATA_INPUT];
2230f714a188SAmr Mokhtar 	for (i = 0; i < entry->nb_segments; ++i)
2231f714a188SAmr Mokhtar 		op->turbo_dec.input.length +=
2232f714a188SAmr Mokhtar 				entry->segments[i].length;
2233f714a188SAmr Mokhtar }
2234f714a188SAmr Mokhtar 
2235f714a188SAmr Mokhtar static void
create_reference_ldpc_dec_op(struct rte_bbdev_dec_op * op)2236d819c083SNicolas Chautru create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op)
2237d819c083SNicolas Chautru {
2238d819c083SNicolas Chautru 	unsigned int i;
2239d819c083SNicolas Chautru 	struct op_data_entries *entry;
2240d819c083SNicolas Chautru 
2241d819c083SNicolas Chautru 	op->ldpc_dec = test_vector.ldpc_dec;
2242d819c083SNicolas Chautru 	entry = &test_vector.entries[DATA_INPUT];
2243d819c083SNicolas Chautru 	for (i = 0; i < entry->nb_segments; ++i)
2244d819c083SNicolas Chautru 		op->ldpc_dec.input.length +=
2245d819c083SNicolas Chautru 				entry->segments[i].length;
2246d819c083SNicolas Chautru 	if (test_vector.ldpc_dec.op_flags &
2247d819c083SNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) {
2248d819c083SNicolas Chautru 		entry = &test_vector.entries[DATA_HARQ_INPUT];
2249d819c083SNicolas Chautru 		for (i = 0; i < entry->nb_segments; ++i)
2250d819c083SNicolas Chautru 			op->ldpc_dec.harq_combined_input.length +=
2251d819c083SNicolas Chautru 				entry->segments[i].length;
2252d819c083SNicolas Chautru 	}
2253d819c083SNicolas Chautru }
2254d819c083SNicolas Chautru 
2255d819c083SNicolas Chautru 
2256d819c083SNicolas Chautru static void
create_reference_enc_op(struct rte_bbdev_enc_op * op)2257f714a188SAmr Mokhtar create_reference_enc_op(struct rte_bbdev_enc_op *op)
2258f714a188SAmr Mokhtar {
2259f714a188SAmr Mokhtar 	unsigned int i;
2260f714a188SAmr Mokhtar 	struct op_data_entries *entry;
2261f714a188SAmr Mokhtar 
2262f714a188SAmr Mokhtar 	op->turbo_enc = test_vector.turbo_enc;
2263f714a188SAmr Mokhtar 	entry = &test_vector.entries[DATA_INPUT];
2264f714a188SAmr Mokhtar 	for (i = 0; i < entry->nb_segments; ++i)
2265f714a188SAmr Mokhtar 		op->turbo_enc.input.length +=
2266f714a188SAmr Mokhtar 				entry->segments[i].length;
2267f714a188SAmr Mokhtar }
2268f714a188SAmr Mokhtar 
2269d819c083SNicolas Chautru static void
create_reference_ldpc_enc_op(struct rte_bbdev_enc_op * op)2270d819c083SNicolas Chautru create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op)
2271d819c083SNicolas Chautru {
2272d819c083SNicolas Chautru 	unsigned int i;
2273d819c083SNicolas Chautru 	struct op_data_entries *entry;
2274d819c083SNicolas Chautru 
2275d819c083SNicolas Chautru 	op->ldpc_enc = test_vector.ldpc_enc;
2276d819c083SNicolas Chautru 	entry = &test_vector.entries[DATA_INPUT];
2277d819c083SNicolas Chautru 	for (i = 0; i < entry->nb_segments; ++i)
2278d819c083SNicolas Chautru 		op->ldpc_enc.input.length +=
2279d819c083SNicolas Chautru 				entry->segments[i].length;
2280d819c083SNicolas Chautru }
2281d819c083SNicolas Chautru 
22820b98d574SKamil Chalupnik static uint32_t
calc_dec_TB_size(struct rte_bbdev_dec_op * op)22830b98d574SKamil Chalupnik calc_dec_TB_size(struct rte_bbdev_dec_op *op)
22840b98d574SKamil Chalupnik {
22850b98d574SKamil Chalupnik 	uint8_t i;
22860b98d574SKamil Chalupnik 	uint32_t c, r, tb_size = 0;
22870b98d574SKamil Chalupnik 
228848fc315fSNicolas Chautru 	if (op->turbo_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
22890b98d574SKamil Chalupnik 		tb_size = op->turbo_dec.tb_params.k_neg;
22900b98d574SKamil Chalupnik 	} else {
22910b98d574SKamil Chalupnik 		c = op->turbo_dec.tb_params.c;
22920b98d574SKamil Chalupnik 		r = op->turbo_dec.tb_params.r;
22930b98d574SKamil Chalupnik 		for (i = 0; i < c-r; i++)
22940b98d574SKamil Chalupnik 			tb_size += (r < op->turbo_dec.tb_params.c_neg) ?
22950b98d574SKamil Chalupnik 				op->turbo_dec.tb_params.k_neg :
22960b98d574SKamil Chalupnik 				op->turbo_dec.tb_params.k_pos;
22970b98d574SKamil Chalupnik 	}
22980b98d574SKamil Chalupnik 	return tb_size;
22990b98d574SKamil Chalupnik }
23000b98d574SKamil Chalupnik 
23010b98d574SKamil Chalupnik static uint32_t
calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op * op)2302d819c083SNicolas Chautru calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op)
2303d819c083SNicolas Chautru {
2304d819c083SNicolas Chautru 	uint8_t i;
2305d819c083SNicolas Chautru 	uint32_t c, r, tb_size = 0;
2306d819c083SNicolas Chautru 	uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10;
2307d819c083SNicolas Chautru 
230848fc315fSNicolas Chautru 	if (op->ldpc_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
2309d819c083SNicolas Chautru 		tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler;
2310d819c083SNicolas Chautru 	} else {
2311d819c083SNicolas Chautru 		c = op->ldpc_dec.tb_params.c;
2312d819c083SNicolas Chautru 		r = op->ldpc_dec.tb_params.r;
2313d819c083SNicolas Chautru 		for (i = 0; i < c-r; i++)
2314d819c083SNicolas Chautru 			tb_size += sys_cols * op->ldpc_dec.z_c
2315d819c083SNicolas Chautru 					- op->ldpc_dec.n_filler;
2316d819c083SNicolas Chautru 	}
2317d819c083SNicolas Chautru 	return tb_size;
2318d819c083SNicolas Chautru }
2319d819c083SNicolas Chautru 
2320d819c083SNicolas Chautru static uint32_t
calc_enc_TB_size(struct rte_bbdev_enc_op * op)23210b98d574SKamil Chalupnik calc_enc_TB_size(struct rte_bbdev_enc_op *op)
23220b98d574SKamil Chalupnik {
23230b98d574SKamil Chalupnik 	uint8_t i;
23240b98d574SKamil Chalupnik 	uint32_t c, r, tb_size = 0;
23250b98d574SKamil Chalupnik 
232648fc315fSNicolas Chautru 	if (op->turbo_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
23270b98d574SKamil Chalupnik 		tb_size = op->turbo_enc.tb_params.k_neg;
23280b98d574SKamil Chalupnik 	} else {
23290b98d574SKamil Chalupnik 		c = op->turbo_enc.tb_params.c;
23300b98d574SKamil Chalupnik 		r = op->turbo_enc.tb_params.r;
23310b98d574SKamil Chalupnik 		for (i = 0; i < c-r; i++)
23320b98d574SKamil Chalupnik 			tb_size += (r < op->turbo_enc.tb_params.c_neg) ?
23330b98d574SKamil Chalupnik 				op->turbo_enc.tb_params.k_neg :
23340b98d574SKamil Chalupnik 				op->turbo_enc.tb_params.k_pos;
23350b98d574SKamil Chalupnik 	}
23360b98d574SKamil Chalupnik 	return tb_size;
23370b98d574SKamil Chalupnik }
23380b98d574SKamil Chalupnik 
2339d819c083SNicolas Chautru static uint32_t
calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op * op)2340d819c083SNicolas Chautru calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op)
2341d819c083SNicolas Chautru {
2342d819c083SNicolas Chautru 	uint8_t i;
2343d819c083SNicolas Chautru 	uint32_t c, r, tb_size = 0;
2344d819c083SNicolas Chautru 	uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10;
2345d819c083SNicolas Chautru 
234648fc315fSNicolas Chautru 	if (op->ldpc_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK) {
2347d819c083SNicolas Chautru 		tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler;
2348d819c083SNicolas Chautru 	} else {
2349d819c083SNicolas Chautru 		c = op->turbo_enc.tb_params.c;
2350d819c083SNicolas Chautru 		r = op->turbo_enc.tb_params.r;
2351d819c083SNicolas Chautru 		for (i = 0; i < c-r; i++)
2352d819c083SNicolas Chautru 			tb_size += sys_cols * op->ldpc_enc.z_c
2353d819c083SNicolas Chautru 					- op->ldpc_enc.n_filler;
2354d819c083SNicolas Chautru 	}
2355d819c083SNicolas Chautru 	return tb_size;
2356d819c083SNicolas Chautru }
2357d819c083SNicolas Chautru 
2358d819c083SNicolas Chautru 
2359f714a188SAmr Mokhtar static int
init_test_op_params(struct test_op_params * op_params,enum rte_bbdev_op_type op_type,const int expected_status,const int vector_mask,struct rte_mempool * ops_mp,uint16_t burst_sz,uint16_t num_to_process,uint16_t num_lcores)2360f714a188SAmr Mokhtar init_test_op_params(struct test_op_params *op_params,
2361f714a188SAmr Mokhtar 		enum rte_bbdev_op_type op_type, const int expected_status,
2362f714a188SAmr Mokhtar 		const int vector_mask, struct rte_mempool *ops_mp,
2363f714a188SAmr Mokhtar 		uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores)
2364f714a188SAmr Mokhtar {
2365f714a188SAmr Mokhtar 	int ret = 0;
2366d819c083SNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
2367d819c083SNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
2368f714a188SAmr Mokhtar 		ret = rte_bbdev_dec_op_alloc_bulk(ops_mp,
2369f714a188SAmr Mokhtar 				&op_params->ref_dec_op, 1);
2370f714a188SAmr Mokhtar 	else
2371f714a188SAmr Mokhtar 		ret = rte_bbdev_enc_op_alloc_bulk(ops_mp,
2372f714a188SAmr Mokhtar 				&op_params->ref_enc_op, 1);
2373f714a188SAmr Mokhtar 
2374f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed");
2375f714a188SAmr Mokhtar 
2376f714a188SAmr Mokhtar 	op_params->mp = ops_mp;
2377f714a188SAmr Mokhtar 	op_params->burst_sz = burst_sz;
2378f714a188SAmr Mokhtar 	op_params->num_to_process = num_to_process;
2379f714a188SAmr Mokhtar 	op_params->num_lcores = num_lcores;
2380f714a188SAmr Mokhtar 	op_params->vector_mask = vector_mask;
2381d819c083SNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
2382d819c083SNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
2383f714a188SAmr Mokhtar 		op_params->ref_dec_op->status = expected_status;
2384d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC
2385d819c083SNicolas Chautru 			|| op_type == RTE_BBDEV_OP_LDPC_ENC)
2386f714a188SAmr Mokhtar 		op_params->ref_enc_op->status = expected_status;
2387f714a188SAmr Mokhtar 	return 0;
2388f714a188SAmr Mokhtar }
2389f714a188SAmr Mokhtar 
2390f714a188SAmr Mokhtar static int
run_test_case_on_device(test_case_function * test_case_func,uint8_t dev_id,struct test_op_params * op_params)2391f714a188SAmr Mokhtar run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id,
2392f714a188SAmr Mokhtar 		struct test_op_params *op_params)
2393f714a188SAmr Mokhtar {
2394f714a188SAmr Mokhtar 	int t_ret, f_ret, socket_id = SOCKET_ID_ANY;
2395f714a188SAmr Mokhtar 	unsigned int i;
2396f714a188SAmr Mokhtar 	struct active_device *ad;
2397f714a188SAmr Mokhtar 	unsigned int burst_sz = get_burst_sz();
2398f714a188SAmr Mokhtar 	enum rte_bbdev_op_type op_type = test_vector.op_type;
239947d5a049SKamil Chalupnik 	const struct rte_bbdev_op_cap *capabilities = NULL;
2400f714a188SAmr Mokhtar 
2401f714a188SAmr Mokhtar 	ad = &active_devs[dev_id];
2402f714a188SAmr Mokhtar 
2403f714a188SAmr Mokhtar 	/* Check if device supports op_type */
2404f714a188SAmr Mokhtar 	if (!is_avail_op(ad, test_vector.op_type))
2405f714a188SAmr Mokhtar 		return TEST_SUCCESS;
2406f714a188SAmr Mokhtar 
2407f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
2408f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
2409f714a188SAmr Mokhtar 	socket_id = GET_SOCKET(info.socket_id);
2410f714a188SAmr Mokhtar 
2411f714a188SAmr Mokhtar 	f_ret = create_mempools(ad, socket_id, op_type,
2412f714a188SAmr Mokhtar 			get_num_ops());
2413f714a188SAmr Mokhtar 	if (f_ret != TEST_SUCCESS) {
2414f714a188SAmr Mokhtar 		printf("Couldn't create mempools");
2415f714a188SAmr Mokhtar 		goto fail;
2416f714a188SAmr Mokhtar 	}
2417ad458935SKamil Chalupnik 	if (op_type == RTE_BBDEV_OP_NONE)
2418ad458935SKamil Chalupnik 		op_type = RTE_BBDEV_OP_TURBO_ENC;
2419f714a188SAmr Mokhtar 
2420f714a188SAmr Mokhtar 	f_ret = init_test_op_params(op_params, test_vector.op_type,
2421f714a188SAmr Mokhtar 			test_vector.expected_status,
2422f714a188SAmr Mokhtar 			test_vector.mask,
2423f714a188SAmr Mokhtar 			ad->ops_mempool,
2424f714a188SAmr Mokhtar 			burst_sz,
2425f714a188SAmr Mokhtar 			get_num_ops(),
2426f714a188SAmr Mokhtar 			get_num_lcores());
2427f714a188SAmr Mokhtar 	if (f_ret != TEST_SUCCESS) {
2428f714a188SAmr Mokhtar 		printf("Couldn't init test op params");
2429f714a188SAmr Mokhtar 		goto fail;
2430f714a188SAmr Mokhtar 	}
2431f714a188SAmr Mokhtar 
2432d819c083SNicolas Chautru 
2433d819c083SNicolas Chautru 	/* Find capabilities */
243447d5a049SKamil Chalupnik 	const struct rte_bbdev_op_cap *cap = info.drv.capabilities;
2435d819c083SNicolas Chautru 	for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) {
2436d819c083SNicolas Chautru 		if (cap->type == test_vector.op_type) {
243747d5a049SKamil Chalupnik 			capabilities = cap;
243847d5a049SKamil Chalupnik 			break;
243947d5a049SKamil Chalupnik 		}
2440d819c083SNicolas Chautru 		cap++;
244147d5a049SKamil Chalupnik 	}
244247d5a049SKamil Chalupnik 	TEST_ASSERT_NOT_NULL(capabilities,
2443d819c083SNicolas Chautru 			"Couldn't find capabilities");
244447d5a049SKamil Chalupnik 
2445d819c083SNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
2446f714a188SAmr Mokhtar 		create_reference_dec_op(op_params->ref_dec_op);
244747d5a049SKamil Chalupnik 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
2448f714a188SAmr Mokhtar 		create_reference_enc_op(op_params->ref_enc_op);
2449d819c083SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
2450d819c083SNicolas Chautru 		create_reference_ldpc_enc_op(op_params->ref_enc_op);
2451d819c083SNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2452d819c083SNicolas Chautru 		create_reference_ldpc_dec_op(op_params->ref_dec_op);
2453f714a188SAmr Mokhtar 
2454f714a188SAmr Mokhtar 	for (i = 0; i < ad->nb_queues; ++i) {
2455f714a188SAmr Mokhtar 		f_ret = fill_queue_buffers(op_params,
2456f714a188SAmr Mokhtar 				ad->in_mbuf_pool,
2457f714a188SAmr Mokhtar 				ad->hard_out_mbuf_pool,
2458f714a188SAmr Mokhtar 				ad->soft_out_mbuf_pool,
2459d819c083SNicolas Chautru 				ad->harq_in_mbuf_pool,
2460d819c083SNicolas Chautru 				ad->harq_out_mbuf_pool,
2461f714a188SAmr Mokhtar 				ad->queue_ids[i],
246247d5a049SKamil Chalupnik 				capabilities,
2463f714a188SAmr Mokhtar 				info.drv.min_alignment,
2464f714a188SAmr Mokhtar 				socket_id);
2465f714a188SAmr Mokhtar 		if (f_ret != TEST_SUCCESS) {
2466f714a188SAmr Mokhtar 			printf("Couldn't init queue buffers");
2467f714a188SAmr Mokhtar 			goto fail;
2468f714a188SAmr Mokhtar 		}
2469f714a188SAmr Mokhtar 	}
2470f714a188SAmr Mokhtar 
2471f714a188SAmr Mokhtar 	/* Run test case function */
2472f714a188SAmr Mokhtar 	t_ret = test_case_func(ad, op_params);
2473f714a188SAmr Mokhtar 
2474f714a188SAmr Mokhtar 	/* Free active device resources and return */
2475f714a188SAmr Mokhtar 	free_buffers(ad, op_params);
2476f714a188SAmr Mokhtar 	return t_ret;
2477f714a188SAmr Mokhtar 
2478f714a188SAmr Mokhtar fail:
2479f714a188SAmr Mokhtar 	free_buffers(ad, op_params);
2480f714a188SAmr Mokhtar 	return TEST_FAILED;
2481f714a188SAmr Mokhtar }
2482f714a188SAmr Mokhtar 
2483f714a188SAmr Mokhtar /* Run given test function per active device per supported op type
2484f714a188SAmr Mokhtar  * per burst size.
2485f714a188SAmr Mokhtar  */
2486f714a188SAmr Mokhtar static int
run_test_case(test_case_function * test_case_func)2487f714a188SAmr Mokhtar run_test_case(test_case_function *test_case_func)
2488f714a188SAmr Mokhtar {
2489f714a188SAmr Mokhtar 	int ret = 0;
2490f714a188SAmr Mokhtar 	uint8_t dev;
2491f714a188SAmr Mokhtar 
2492f714a188SAmr Mokhtar 	/* Alloc op_params */
2493f714a188SAmr Mokhtar 	struct test_op_params *op_params = rte_zmalloc(NULL,
2494f714a188SAmr Mokhtar 			sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE);
2495f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params",
2496f714a188SAmr Mokhtar 			RTE_ALIGN(sizeof(struct test_op_params),
2497f714a188SAmr Mokhtar 				RTE_CACHE_LINE_SIZE));
2498f714a188SAmr Mokhtar 
2499f714a188SAmr Mokhtar 	/* For each device run test case function */
2500f714a188SAmr Mokhtar 	for (dev = 0; dev < nb_active_devs; ++dev)
2501f714a188SAmr Mokhtar 		ret |= run_test_case_on_device(test_case_func, dev, op_params);
2502f714a188SAmr Mokhtar 
2503f714a188SAmr Mokhtar 	rte_free(op_params);
2504f714a188SAmr Mokhtar 
2505f714a188SAmr Mokhtar 	return ret;
2506f714a188SAmr Mokhtar }
2507f714a188SAmr Mokhtar 
2508335c11fdSNicolas Chautru 
2509335c11fdSNicolas Chautru /* Push back the HARQ output from DDR to host */
2510335c11fdSNicolas Chautru static void
retrieve_harq_ddr(uint16_t dev_id,uint16_t queue_id,struct rte_bbdev_dec_op ** ops,const uint16_t n)2511335c11fdSNicolas Chautru retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id,
2512335c11fdSNicolas Chautru 		struct rte_bbdev_dec_op **ops,
2513335c11fdSNicolas Chautru 		const uint16_t n)
2514335c11fdSNicolas Chautru {
2515335c11fdSNicolas Chautru 	uint16_t j;
2516335c11fdSNicolas Chautru 	int save_status, ret;
25173d6063a0SNicolas Chautru 	uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
2518335c11fdSNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[MAX_BURST];
2519335c11fdSNicolas Chautru 	uint32_t flags = ops[0]->ldpc_dec.op_flags;
2520335c11fdSNicolas Chautru 	bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
2521335c11fdSNicolas Chautru 	bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
2522335c11fdSNicolas Chautru 	bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
2523335c11fdSNicolas Chautru 	bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
2524335c11fdSNicolas Chautru 	for (j = 0; j < n; ++j) {
2525335c11fdSNicolas Chautru 		if ((loopback && mem_out) || hc_out) {
2526335c11fdSNicolas Chautru 			save_status = ops[j]->status;
2527335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags =
2528335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK +
2529335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
2530335c11fdSNicolas Chautru 			if (h_comp)
2531335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.op_flags +=
2532335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
2533335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset =
2534335c11fdSNicolas Chautru 					harq_offset;
2535335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset = 0;
2536335c11fdSNicolas Chautru 			harq_offset += HARQ_INCR;
2537335c11fdSNicolas Chautru 			if (!loopback)
2538335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.harq_combined_input.length =
2539335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.harq_combined_output.length;
2540335c11fdSNicolas Chautru 			rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
2541335c11fdSNicolas Chautru 					&ops[j], 1);
2542335c11fdSNicolas Chautru 			ret = 0;
2543335c11fdSNicolas Chautru 			while (ret == 0)
2544335c11fdSNicolas Chautru 				ret = rte_bbdev_dequeue_ldpc_dec_ops(
2545335c11fdSNicolas Chautru 						dev_id, queue_id,
2546335c11fdSNicolas Chautru 						&ops_deq[j], 1);
2547335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags = flags;
2548335c11fdSNicolas Chautru 			ops[j]->status = save_status;
2549335c11fdSNicolas Chautru 		}
2550335c11fdSNicolas Chautru 	}
2551335c11fdSNicolas Chautru }
2552335c11fdSNicolas Chautru 
2553335c11fdSNicolas Chautru /*
2554335c11fdSNicolas Chautru  * Push back the HARQ output from HW DDR to Host
2555335c11fdSNicolas Chautru  * Preload HARQ memory input and adjust HARQ offset
2556335c11fdSNicolas Chautru  */
2557335c11fdSNicolas Chautru static void
preload_harq_ddr(uint16_t dev_id,uint16_t queue_id,struct rte_bbdev_dec_op ** ops,const uint16_t n,bool preload)2558335c11fdSNicolas Chautru preload_harq_ddr(uint16_t dev_id, uint16_t queue_id,
2559335c11fdSNicolas Chautru 		struct rte_bbdev_dec_op **ops, const uint16_t n,
2560335c11fdSNicolas Chautru 		bool preload)
2561335c11fdSNicolas Chautru {
2562335c11fdSNicolas Chautru 	uint16_t j;
25633d6063a0SNicolas Chautru 	int deq;
25643d6063a0SNicolas Chautru 	uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
25653d6063a0SNicolas Chautru 	struct rte_bbdev_op_data save_hc_in[MAX_OPS], save_hc_out[MAX_OPS];
25663d6063a0SNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[MAX_OPS];
2567335c11fdSNicolas Chautru 	uint32_t flags = ops[0]->ldpc_dec.op_flags;
2568335c11fdSNicolas Chautru 	bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
2569335c11fdSNicolas Chautru 	bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
2570335c11fdSNicolas Chautru 	bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
2571335c11fdSNicolas Chautru 	bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
2572335c11fdSNicolas Chautru 	bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
2573335c11fdSNicolas Chautru 	if ((mem_in || hc_in) && preload) {
25743d6063a0SNicolas Chautru 		for (j = 0; j < n; ++j) {
25753d6063a0SNicolas Chautru 			save_hc_in[j] = ops[j]->ldpc_dec.harq_combined_input;
25763d6063a0SNicolas Chautru 			save_hc_out[j] = ops[j]->ldpc_dec.harq_combined_output;
2577335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.op_flags =
2578335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK +
2579335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
2580335c11fdSNicolas Chautru 			if (h_comp)
2581335c11fdSNicolas Chautru 				ops[j]->ldpc_dec.op_flags +=
2582335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
2583335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset =
2584335c11fdSNicolas Chautru 					harq_offset;
2585335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset = 0;
25863d6063a0SNicolas Chautru 			harq_offset += HARQ_INCR;
2587335c11fdSNicolas Chautru 		}
25883d6063a0SNicolas Chautru 		rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, &ops[0], n);
25893d6063a0SNicolas Chautru 		deq = 0;
25903d6063a0SNicolas Chautru 		while (deq != n)
25913d6063a0SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(
25923d6063a0SNicolas Chautru 					dev_id, queue_id, &ops_deq[deq],
25933d6063a0SNicolas Chautru 					n - deq);
25943d6063a0SNicolas Chautru 		/* Restore the operations */
25953d6063a0SNicolas Chautru 		for (j = 0; j < n; ++j) {
25963d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.op_flags = flags;
25973d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input = save_hc_in[j];
25983d6063a0SNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output = save_hc_out[j];
25993d6063a0SNicolas Chautru 		}
26003d6063a0SNicolas Chautru 	}
26013d6063a0SNicolas Chautru 	harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS;
26023d6063a0SNicolas Chautru 	for (j = 0; j < n; ++j) {
2603335c11fdSNicolas Chautru 		/* Adjust HARQ offset when we reach external DDR */
2604335c11fdSNicolas Chautru 		if (mem_in || hc_in)
2605335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_input.offset
2606335c11fdSNicolas Chautru 				= harq_offset;
2607335c11fdSNicolas Chautru 		if (mem_out || hc_out)
2608335c11fdSNicolas Chautru 			ops[j]->ldpc_dec.harq_combined_output.offset
2609335c11fdSNicolas Chautru 				= harq_offset;
2610335c11fdSNicolas Chautru 		harq_offset += HARQ_INCR;
2611335c11fdSNicolas Chautru 	}
2612335c11fdSNicolas Chautru }
2613335c11fdSNicolas Chautru 
2614f714a188SAmr Mokhtar static void
dequeue_event_callback(uint16_t dev_id,enum rte_bbdev_event_type event,void * cb_arg,void * ret_param)2615f714a188SAmr Mokhtar dequeue_event_callback(uint16_t dev_id,
2616f714a188SAmr Mokhtar 		enum rte_bbdev_event_type event, void *cb_arg,
2617f714a188SAmr Mokhtar 		void *ret_param)
2618f714a188SAmr Mokhtar {
2619f714a188SAmr Mokhtar 	int ret;
2620f714a188SAmr Mokhtar 	uint16_t i;
2621f714a188SAmr Mokhtar 	uint64_t total_time;
26220b98d574SKamil Chalupnik 	uint16_t deq, burst_sz, num_ops;
2623b2e2aec3SKamil Chalupnik 	uint16_t queue_id = *(uint16_t *) ret_param;
2624f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
26250b98d574SKamil Chalupnik 	double tb_len_bits;
2626f714a188SAmr Mokhtar 	struct thread_params *tp = cb_arg;
2627f714a188SAmr Mokhtar 
2628f714a188SAmr Mokhtar 	/* Find matching thread params using queue_id */
2629f714a188SAmr Mokhtar 	for (i = 0; i < MAX_QUEUES; ++i, ++tp)
2630f714a188SAmr Mokhtar 		if (tp->queue_id == queue_id)
2631f714a188SAmr Mokhtar 			break;
2632f714a188SAmr Mokhtar 
2633f714a188SAmr Mokhtar 	if (i == MAX_QUEUES) {
2634f714a188SAmr Mokhtar 		printf("%s: Queue_id from interrupt details was not found!\n",
2635f714a188SAmr Mokhtar 				__func__);
2636f714a188SAmr Mokhtar 		return;
2637f714a188SAmr Mokhtar 	}
2638f714a188SAmr Mokhtar 
2639f714a188SAmr Mokhtar 	if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) {
2640*f83f3147SJoyce Kong 		__atomic_store_n(&tp->processing_status, TEST_FAILED, __ATOMIC_RELAXED);
2641f714a188SAmr Mokhtar 		printf(
2642f714a188SAmr Mokhtar 			"Dequeue interrupt handler called for incorrect event!\n");
2643f714a188SAmr Mokhtar 		return;
2644f714a188SAmr Mokhtar 	}
2645f714a188SAmr Mokhtar 
2646*f83f3147SJoyce Kong 	burst_sz = __atomic_load_n(&tp->burst_sz, __ATOMIC_RELAXED);
26470b98d574SKamil Chalupnik 	num_ops = tp->op_params->num_to_process;
2648f714a188SAmr Mokhtar 
2649335c11fdSNicolas Chautru 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
2650b2e2aec3SKamil Chalupnik 		deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
2651b2e2aec3SKamil Chalupnik 				&tp->dec_ops[
2652*f83f3147SJoyce Kong 					__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED)],
2653f714a188SAmr Mokhtar 				burst_sz);
2654335c11fdSNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
2655335c11fdSNicolas Chautru 		deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
2656335c11fdSNicolas Chautru 				&tp->dec_ops[
2657*f83f3147SJoyce Kong 					__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED)],
2658335c11fdSNicolas Chautru 				burst_sz);
2659335c11fdSNicolas Chautru 	else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
2660335c11fdSNicolas Chautru 		deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
2661335c11fdSNicolas Chautru 				&tp->enc_ops[
2662*f83f3147SJoyce Kong 					__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED)],
2663335c11fdSNicolas Chautru 				burst_sz);
2664335c11fdSNicolas Chautru 	else /*RTE_BBDEV_OP_TURBO_ENC*/
2665b2e2aec3SKamil Chalupnik 		deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
2666b2e2aec3SKamil Chalupnik 				&tp->enc_ops[
2667*f83f3147SJoyce Kong 					__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED)],
2668f714a188SAmr Mokhtar 				burst_sz);
2669f714a188SAmr Mokhtar 
2670f714a188SAmr Mokhtar 	if (deq < burst_sz) {
2671f714a188SAmr Mokhtar 		printf(
2672f714a188SAmr Mokhtar 			"After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n",
2673f714a188SAmr Mokhtar 			burst_sz, deq);
2674*f83f3147SJoyce Kong 		__atomic_store_n(&tp->processing_status, TEST_FAILED, __ATOMIC_RELAXED);
2675f714a188SAmr Mokhtar 		return;
2676f714a188SAmr Mokhtar 	}
2677f714a188SAmr Mokhtar 
2678*f83f3147SJoyce Kong 	if (__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED) + deq < num_ops) {
2679*f83f3147SJoyce Kong 		__atomic_fetch_add(&tp->nb_dequeued, deq, __ATOMIC_RELAXED);
2680f714a188SAmr Mokhtar 		return;
2681f714a188SAmr Mokhtar 	}
2682f714a188SAmr Mokhtar 
2683f714a188SAmr Mokhtar 	total_time = rte_rdtsc_precise() - tp->start_time;
2684f714a188SAmr Mokhtar 
2685f714a188SAmr Mokhtar 	rte_bbdev_info_get(dev_id, &info);
2686f714a188SAmr Mokhtar 
2687f714a188SAmr Mokhtar 	ret = TEST_SUCCESS;
26880b98d574SKamil Chalupnik 
26890b98d574SKamil Chalupnik 	if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) {
26900b98d574SKamil Chalupnik 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
2691b2e2aec3SKamil Chalupnik 		ret = validate_dec_op(tp->dec_ops, num_ops, ref_op,
26920b98d574SKamil Chalupnik 				tp->op_params->vector_mask);
2693b2e2aec3SKamil Chalupnik 		/* get the max of iter_count for all dequeued ops */
2694b2e2aec3SKamil Chalupnik 		for (i = 0; i < num_ops; ++i)
2695b2e2aec3SKamil Chalupnik 			tp->iter_count = RTE_MAX(
2696b2e2aec3SKamil Chalupnik 					tp->dec_ops[i]->turbo_dec.iter_count,
2697b2e2aec3SKamil Chalupnik 					tp->iter_count);
2698b2e2aec3SKamil Chalupnik 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
26990b98d574SKamil Chalupnik 	} else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) {
27000b98d574SKamil Chalupnik 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
2701b2e2aec3SKamil Chalupnik 		ret = validate_enc_op(tp->enc_ops, num_ops, ref_op);
2702b2e2aec3SKamil Chalupnik 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
2703d819c083SNicolas Chautru 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) {
2704d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
2705d819c083SNicolas Chautru 		ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op);
2706d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq);
2707d819c083SNicolas Chautru 	} else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) {
2708d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
2709d819c083SNicolas Chautru 		ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op,
2710d819c083SNicolas Chautru 				tp->op_params->vector_mask);
2711d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq);
27120b98d574SKamil Chalupnik 	}
2713f714a188SAmr Mokhtar 
2714f714a188SAmr Mokhtar 	if (ret) {
2715f714a188SAmr Mokhtar 		printf("Buffers validation failed\n");
2716*f83f3147SJoyce Kong 		__atomic_store_n(&tp->processing_status, TEST_FAILED, __ATOMIC_RELAXED);
2717f714a188SAmr Mokhtar 	}
2718f714a188SAmr Mokhtar 
2719f714a188SAmr Mokhtar 	switch (test_vector.op_type) {
2720f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_TURBO_DEC:
27210b98d574SKamil Chalupnik 		tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op);
2722f714a188SAmr Mokhtar 		break;
2723f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_TURBO_ENC:
27240b98d574SKamil Chalupnik 		tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op);
2725f714a188SAmr Mokhtar 		break;
2726d819c083SNicolas Chautru 	case RTE_BBDEV_OP_LDPC_DEC:
2727d819c083SNicolas Chautru 		tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op);
2728d819c083SNicolas Chautru 		break;
2729d819c083SNicolas Chautru 	case RTE_BBDEV_OP_LDPC_ENC:
2730d819c083SNicolas Chautru 		tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op);
2731d819c083SNicolas Chautru 		break;
2732f714a188SAmr Mokhtar 	case RTE_BBDEV_OP_NONE:
27330b98d574SKamil Chalupnik 		tb_len_bits = 0.0;
2734f714a188SAmr Mokhtar 		break;
2735f714a188SAmr Mokhtar 	default:
2736f714a188SAmr Mokhtar 		printf("Unknown op type: %d\n", test_vector.op_type);
2737*f83f3147SJoyce Kong 		__atomic_store_n(&tp->processing_status, TEST_FAILED, __ATOMIC_RELAXED);
2738f714a188SAmr Mokhtar 		return;
2739f714a188SAmr Mokhtar 	}
2740f714a188SAmr Mokhtar 
2741b2e2aec3SKamil Chalupnik 	tp->ops_per_sec += ((double)num_ops) /
2742f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
2743b2e2aec3SKamil Chalupnik 	tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) /
2744f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
2745f714a188SAmr Mokhtar 
2746*f83f3147SJoyce Kong 	__atomic_fetch_add(&tp->nb_dequeued, deq, __ATOMIC_RELAXED);
2747f714a188SAmr Mokhtar }
2748f714a188SAmr Mokhtar 
2749f714a188SAmr Mokhtar static int
throughput_intr_lcore_ldpc_dec(void * arg)2750f162c475SNicolas Chautru throughput_intr_lcore_ldpc_dec(void *arg)
2751f162c475SNicolas Chautru {
2752f162c475SNicolas Chautru 	struct thread_params *tp = arg;
2753f162c475SNicolas Chautru 	unsigned int enqueued;
2754f162c475SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
2755f162c475SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
2756f162c475SNicolas Chautru 	const uint16_t num_to_process = tp->op_params->num_to_process;
2757f162c475SNicolas Chautru 	struct rte_bbdev_dec_op *ops[num_to_process];
2758f162c475SNicolas Chautru 	struct test_buffers *bufs = NULL;
2759f162c475SNicolas Chautru 	struct rte_bbdev_info info;
2760f162c475SNicolas Chautru 	int ret, i, j;
2761f162c475SNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
2762f162c475SNicolas Chautru 	uint16_t num_to_enq, enq;
2763f162c475SNicolas Chautru 
2764f162c475SNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
2765f162c475SNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
2766f162c475SNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
2767f162c475SNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
2768f162c475SNicolas Chautru 
2769f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2770f162c475SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
2771f162c475SNicolas Chautru 
2772f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
2773f162c475SNicolas Chautru 			"Failed to enable interrupts for dev: %u, queue_id: %u",
2774f162c475SNicolas Chautru 			tp->dev_id, queue_id);
2775f162c475SNicolas Chautru 
2776f162c475SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
2777f162c475SNicolas Chautru 
2778f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
2779f162c475SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
2780f162c475SNicolas Chautru 			info.drv.queue_size_lim);
2781f162c475SNicolas Chautru 
2782f162c475SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2783f162c475SNicolas Chautru 
2784*f83f3147SJoyce Kong 	__atomic_store_n(&tp->processing_status, 0, __ATOMIC_RELAXED);
2785*f83f3147SJoyce Kong 	__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
2786f162c475SNicolas Chautru 
2787*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
2788f162c475SNicolas Chautru 
2789f162c475SNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops,
2790f162c475SNicolas Chautru 				num_to_process);
2791f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
2792f162c475SNicolas Chautru 			num_to_process);
2793f162c475SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
2794f162c475SNicolas Chautru 		copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs,
2795f162c475SNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
2796f162c475SNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
2797f162c475SNicolas Chautru 
2798f162c475SNicolas Chautru 	/* Set counter to validate the ordering */
2799f162c475SNicolas Chautru 	for (j = 0; j < num_to_process; ++j)
2800f162c475SNicolas Chautru 		ops[j]->opaque_data = (void *)(uintptr_t)j;
2801f162c475SNicolas Chautru 
2802f162c475SNicolas Chautru 	for (j = 0; j < TEST_REPETITIONS; ++j) {
2803f162c475SNicolas Chautru 		for (i = 0; i < num_to_process; ++i) {
2804f162c475SNicolas Chautru 			if (!loopback)
2805f162c475SNicolas Chautru 				rte_pktmbuf_reset(
2806f162c475SNicolas Chautru 					ops[i]->ldpc_dec.hard_output.data);
2807f162c475SNicolas Chautru 			if (hc_out || loopback)
2808f162c475SNicolas Chautru 				mbuf_reset(
2809f162c475SNicolas Chautru 				ops[i]->ldpc_dec.harq_combined_output.data);
2810f162c475SNicolas Chautru 		}
2811f162c475SNicolas Chautru 
2812f162c475SNicolas Chautru 		tp->start_time = rte_rdtsc_precise();
2813f162c475SNicolas Chautru 		for (enqueued = 0; enqueued < num_to_process;) {
2814f162c475SNicolas Chautru 			num_to_enq = burst_sz;
2815f162c475SNicolas Chautru 
2816f162c475SNicolas Chautru 			if (unlikely(num_to_process - enqueued < num_to_enq))
2817f162c475SNicolas Chautru 				num_to_enq = num_to_process - enqueued;
2818f162c475SNicolas Chautru 
2819f162c475SNicolas Chautru 			enq = 0;
2820f162c475SNicolas Chautru 			do {
2821f162c475SNicolas Chautru 				enq += rte_bbdev_enqueue_ldpc_dec_ops(
2822f162c475SNicolas Chautru 						tp->dev_id,
2823f162c475SNicolas Chautru 						queue_id, &ops[enqueued],
2824f162c475SNicolas Chautru 						num_to_enq);
2825f162c475SNicolas Chautru 			} while (unlikely(num_to_enq != enq));
2826f162c475SNicolas Chautru 			enqueued += enq;
2827f162c475SNicolas Chautru 
2828f162c475SNicolas Chautru 			/* Write to thread burst_sz current number of enqueued
2829f162c475SNicolas Chautru 			 * descriptors. It ensures that proper number of
2830f162c475SNicolas Chautru 			 * descriptors will be dequeued in callback
2831f162c475SNicolas Chautru 			 * function - needed for last batch in case where
2832f162c475SNicolas Chautru 			 * the number of operations is not a multiple of
2833f162c475SNicolas Chautru 			 * burst size.
2834f162c475SNicolas Chautru 			 */
2835*f83f3147SJoyce Kong 			__atomic_store_n(&tp->burst_sz, num_to_enq, __ATOMIC_RELAXED);
2836f162c475SNicolas Chautru 
2837f162c475SNicolas Chautru 			/* Wait until processing of previous batch is
2838f162c475SNicolas Chautru 			 * completed
2839f162c475SNicolas Chautru 			 */
2840*f83f3147SJoyce Kong 			rte_wait_until_equal_16(&tp->nb_dequeued, enqueued, __ATOMIC_RELAXED);
2841f162c475SNicolas Chautru 		}
2842f162c475SNicolas Chautru 		if (j != TEST_REPETITIONS - 1)
2843*f83f3147SJoyce Kong 			__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
2844f162c475SNicolas Chautru 	}
2845f162c475SNicolas Chautru 
2846f162c475SNicolas Chautru 	return TEST_SUCCESS;
2847f162c475SNicolas Chautru }
2848f162c475SNicolas Chautru 
2849f162c475SNicolas Chautru static int
throughput_intr_lcore_dec(void * arg)2850f714a188SAmr Mokhtar throughput_intr_lcore_dec(void *arg)
2851f714a188SAmr Mokhtar {
2852f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
2853f714a188SAmr Mokhtar 	unsigned int enqueued;
2854f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
2855f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
2856f714a188SAmr Mokhtar 	const uint16_t num_to_process = tp->op_params->num_to_process;
28570b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops[num_to_process];
2858f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
2859f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
2860b2e2aec3SKamil Chalupnik 	int ret, i, j;
2861b2e2aec3SKamil Chalupnik 	uint16_t num_to_enq, enq;
2862f714a188SAmr Mokhtar 
2863f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2864f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
2865f714a188SAmr Mokhtar 
2866f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
2867f714a188SAmr Mokhtar 			"Failed to enable interrupts for dev: %u, queue_id: %u",
2868f714a188SAmr Mokhtar 			tp->dev_id, queue_id);
2869f714a188SAmr Mokhtar 
2870f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
28710b98d574SKamil Chalupnik 
28720b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
28730b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
28740b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
28750b98d574SKamil Chalupnik 
2876f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2877f714a188SAmr Mokhtar 
2878*f83f3147SJoyce Kong 	__atomic_store_n(&tp->processing_status, 0, __ATOMIC_RELAXED);
2879*f83f3147SJoyce Kong 	__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
2880f714a188SAmr Mokhtar 
2881*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
2882f714a188SAmr Mokhtar 
28830b98d574SKamil Chalupnik 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops,
28840b98d574SKamil Chalupnik 				num_to_process);
28850b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
28860b98d574SKamil Chalupnik 			num_to_process);
28870b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
28880b98d574SKamil Chalupnik 		copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs,
28890b98d574SKamil Chalupnik 				bufs->hard_outputs, bufs->soft_outputs,
28900b98d574SKamil Chalupnik 				tp->op_params->ref_dec_op);
28910b98d574SKamil Chalupnik 
2892b2e2aec3SKamil Chalupnik 	/* Set counter to validate the ordering */
2893b2e2aec3SKamil Chalupnik 	for (j = 0; j < num_to_process; ++j)
2894b2e2aec3SKamil Chalupnik 		ops[j]->opaque_data = (void *)(uintptr_t)j;
2895b2e2aec3SKamil Chalupnik 
2896b2e2aec3SKamil Chalupnik 	for (j = 0; j < TEST_REPETITIONS; ++j) {
2897b2e2aec3SKamil Chalupnik 		for (i = 0; i < num_to_process; ++i)
2898b2e2aec3SKamil Chalupnik 			rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data);
2899b2e2aec3SKamil Chalupnik 
2900f714a188SAmr Mokhtar 		tp->start_time = rte_rdtsc_precise();
2901f714a188SAmr Mokhtar 		for (enqueued = 0; enqueued < num_to_process;) {
29020b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
2903f714a188SAmr Mokhtar 
2904f714a188SAmr Mokhtar 			if (unlikely(num_to_process - enqueued < num_to_enq))
2905f714a188SAmr Mokhtar 				num_to_enq = num_to_process - enqueued;
2906f714a188SAmr Mokhtar 
2907b2e2aec3SKamil Chalupnik 			enq = 0;
2908b2e2aec3SKamil Chalupnik 			do {
2909b2e2aec3SKamil Chalupnik 				enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
2910b2e2aec3SKamil Chalupnik 						queue_id, &ops[enqueued],
2911b2e2aec3SKamil Chalupnik 						num_to_enq);
2912b2e2aec3SKamil Chalupnik 			} while (unlikely(num_to_enq != enq));
2913b2e2aec3SKamil Chalupnik 			enqueued += enq;
2914b2e2aec3SKamil Chalupnik 
2915b2e2aec3SKamil Chalupnik 			/* Write to thread burst_sz current number of enqueued
2916b2e2aec3SKamil Chalupnik 			 * descriptors. It ensures that proper number of
2917b2e2aec3SKamil Chalupnik 			 * descriptors will be dequeued in callback
2918b2e2aec3SKamil Chalupnik 			 * function - needed for last batch in case where
2919b2e2aec3SKamil Chalupnik 			 * the number of operations is not a multiple of
2920b2e2aec3SKamil Chalupnik 			 * burst size.
2921b2e2aec3SKamil Chalupnik 			 */
2922*f83f3147SJoyce Kong 			__atomic_store_n(&tp->burst_sz, num_to_enq, __ATOMIC_RELAXED);
2923b2e2aec3SKamil Chalupnik 
2924b2e2aec3SKamil Chalupnik 			/* Wait until processing of previous batch is
2925d819c083SNicolas Chautru 			 * completed
2926b2e2aec3SKamil Chalupnik 			 */
2927*f83f3147SJoyce Kong 			rte_wait_until_equal_16(&tp->nb_dequeued, enqueued, __ATOMIC_RELAXED);
2928b2e2aec3SKamil Chalupnik 		}
2929b2e2aec3SKamil Chalupnik 		if (j != TEST_REPETITIONS - 1)
2930*f83f3147SJoyce Kong 			__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
2931f714a188SAmr Mokhtar 	}
2932f714a188SAmr Mokhtar 
2933f714a188SAmr Mokhtar 	return TEST_SUCCESS;
2934f714a188SAmr Mokhtar }
2935f714a188SAmr Mokhtar 
2936f714a188SAmr Mokhtar static int
throughput_intr_lcore_enc(void * arg)2937f714a188SAmr Mokhtar throughput_intr_lcore_enc(void *arg)
2938f714a188SAmr Mokhtar {
2939f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
2940f714a188SAmr Mokhtar 	unsigned int enqueued;
2941f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
2942f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
2943f714a188SAmr Mokhtar 	const uint16_t num_to_process = tp->op_params->num_to_process;
29440b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops[num_to_process];
2945f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
2946f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
2947b2e2aec3SKamil Chalupnik 	int ret, i, j;
2948b2e2aec3SKamil Chalupnik 	uint16_t num_to_enq, enq;
2949f714a188SAmr Mokhtar 
2950f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
2951f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
2952f714a188SAmr Mokhtar 
2953f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
2954f714a188SAmr Mokhtar 			"Failed to enable interrupts for dev: %u, queue_id: %u",
2955f714a188SAmr Mokhtar 			tp->dev_id, queue_id);
2956f714a188SAmr Mokhtar 
2957f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
29580b98d574SKamil Chalupnik 
29590b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
29600b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
29610b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
29620b98d574SKamil Chalupnik 
2963f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
2964f714a188SAmr Mokhtar 
2965*f83f3147SJoyce Kong 	__atomic_store_n(&tp->processing_status, 0, __ATOMIC_RELAXED);
2966*f83f3147SJoyce Kong 	__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
2967f714a188SAmr Mokhtar 
2968*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
2969f714a188SAmr Mokhtar 
29700b98d574SKamil Chalupnik 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops,
29710b98d574SKamil Chalupnik 			num_to_process);
29720b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
29730b98d574SKamil Chalupnik 			num_to_process);
29740b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
29750b98d574SKamil Chalupnik 		copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs,
29760b98d574SKamil Chalupnik 				bufs->hard_outputs, tp->op_params->ref_enc_op);
29770b98d574SKamil Chalupnik 
2978b2e2aec3SKamil Chalupnik 	/* Set counter to validate the ordering */
2979b2e2aec3SKamil Chalupnik 	for (j = 0; j < num_to_process; ++j)
2980b2e2aec3SKamil Chalupnik 		ops[j]->opaque_data = (void *)(uintptr_t)j;
2981b2e2aec3SKamil Chalupnik 
2982b2e2aec3SKamil Chalupnik 	for (j = 0; j < TEST_REPETITIONS; ++j) {
2983b2e2aec3SKamil Chalupnik 		for (i = 0; i < num_to_process; ++i)
2984b2e2aec3SKamil Chalupnik 			rte_pktmbuf_reset(ops[i]->turbo_enc.output.data);
2985b2e2aec3SKamil Chalupnik 
2986f714a188SAmr Mokhtar 		tp->start_time = rte_rdtsc_precise();
2987f714a188SAmr Mokhtar 		for (enqueued = 0; enqueued < num_to_process;) {
29880b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
2989f714a188SAmr Mokhtar 
2990f714a188SAmr Mokhtar 			if (unlikely(num_to_process - enqueued < num_to_enq))
2991f714a188SAmr Mokhtar 				num_to_enq = num_to_process - enqueued;
2992f714a188SAmr Mokhtar 
2993b2e2aec3SKamil Chalupnik 			enq = 0;
2994b2e2aec3SKamil Chalupnik 			do {
2995b2e2aec3SKamil Chalupnik 				enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
2996b2e2aec3SKamil Chalupnik 						queue_id, &ops[enqueued],
2997b2e2aec3SKamil Chalupnik 						num_to_enq);
2998b2e2aec3SKamil Chalupnik 			} while (unlikely(enq != num_to_enq));
2999b2e2aec3SKamil Chalupnik 			enqueued += enq;
3000b2e2aec3SKamil Chalupnik 
3001b2e2aec3SKamil Chalupnik 			/* Write to thread burst_sz current number of enqueued
3002b2e2aec3SKamil Chalupnik 			 * descriptors. It ensures that proper number of
3003b2e2aec3SKamil Chalupnik 			 * descriptors will be dequeued in callback
3004b2e2aec3SKamil Chalupnik 			 * function - needed for last batch in case where
3005b2e2aec3SKamil Chalupnik 			 * the number of operations is not a multiple of
3006b2e2aec3SKamil Chalupnik 			 * burst size.
3007b2e2aec3SKamil Chalupnik 			 */
3008*f83f3147SJoyce Kong 			__atomic_store_n(&tp->burst_sz, num_to_enq, __ATOMIC_RELAXED);
3009b2e2aec3SKamil Chalupnik 
3010b2e2aec3SKamil Chalupnik 			/* Wait until processing of previous batch is
3011d819c083SNicolas Chautru 			 * completed
3012b2e2aec3SKamil Chalupnik 			 */
3013*f83f3147SJoyce Kong 			rte_wait_until_equal_16(&tp->nb_dequeued, enqueued, __ATOMIC_RELAXED);
3014b2e2aec3SKamil Chalupnik 		}
3015b2e2aec3SKamil Chalupnik 		if (j != TEST_REPETITIONS - 1)
3016*f83f3147SJoyce Kong 			__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
3017f714a188SAmr Mokhtar 	}
3018f714a188SAmr Mokhtar 
3019f714a188SAmr Mokhtar 	return TEST_SUCCESS;
3020f714a188SAmr Mokhtar }
3021f714a188SAmr Mokhtar 
3022f162c475SNicolas Chautru 
3023f162c475SNicolas Chautru static int
throughput_intr_lcore_ldpc_enc(void * arg)3024f162c475SNicolas Chautru throughput_intr_lcore_ldpc_enc(void *arg)
3025f162c475SNicolas Chautru {
3026f162c475SNicolas Chautru 	struct thread_params *tp = arg;
3027f162c475SNicolas Chautru 	unsigned int enqueued;
3028f162c475SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3029f162c475SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3030f162c475SNicolas Chautru 	const uint16_t num_to_process = tp->op_params->num_to_process;
3031f162c475SNicolas Chautru 	struct rte_bbdev_enc_op *ops[num_to_process];
3032f162c475SNicolas Chautru 	struct test_buffers *bufs = NULL;
3033f162c475SNicolas Chautru 	struct rte_bbdev_info info;
3034f162c475SNicolas Chautru 	int ret, i, j;
3035f162c475SNicolas Chautru 	uint16_t num_to_enq, enq;
3036f162c475SNicolas Chautru 
3037f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3038f162c475SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3039f162c475SNicolas Chautru 
3040f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id),
3041f162c475SNicolas Chautru 			"Failed to enable interrupts for dev: %u, queue_id: %u",
3042f162c475SNicolas Chautru 			tp->dev_id, queue_id);
3043f162c475SNicolas Chautru 
3044f162c475SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3045f162c475SNicolas Chautru 
3046f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim),
3047f162c475SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3048f162c475SNicolas Chautru 			info.drv.queue_size_lim);
3049f162c475SNicolas Chautru 
3050f162c475SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3051f162c475SNicolas Chautru 
3052*f83f3147SJoyce Kong 	__atomic_store_n(&tp->processing_status, 0, __ATOMIC_RELAXED);
3053*f83f3147SJoyce Kong 	__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
3054f162c475SNicolas Chautru 
3055*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3056f162c475SNicolas Chautru 
3057f162c475SNicolas Chautru 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops,
3058f162c475SNicolas Chautru 			num_to_process);
3059f162c475SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
3060f162c475SNicolas Chautru 			num_to_process);
3061f162c475SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3062f162c475SNicolas Chautru 		copy_reference_ldpc_enc_op(ops, num_to_process, 0,
3063f162c475SNicolas Chautru 				bufs->inputs, bufs->hard_outputs,
3064f162c475SNicolas Chautru 				tp->op_params->ref_enc_op);
3065f162c475SNicolas Chautru 
3066f162c475SNicolas Chautru 	/* Set counter to validate the ordering */
3067f162c475SNicolas Chautru 	for (j = 0; j < num_to_process; ++j)
3068f162c475SNicolas Chautru 		ops[j]->opaque_data = (void *)(uintptr_t)j;
3069f162c475SNicolas Chautru 
3070f162c475SNicolas Chautru 	for (j = 0; j < TEST_REPETITIONS; ++j) {
3071f162c475SNicolas Chautru 		for (i = 0; i < num_to_process; ++i)
3072f162c475SNicolas Chautru 			rte_pktmbuf_reset(ops[i]->turbo_enc.output.data);
3073f162c475SNicolas Chautru 
3074f162c475SNicolas Chautru 		tp->start_time = rte_rdtsc_precise();
3075f162c475SNicolas Chautru 		for (enqueued = 0; enqueued < num_to_process;) {
3076f162c475SNicolas Chautru 			num_to_enq = burst_sz;
3077f162c475SNicolas Chautru 
3078f162c475SNicolas Chautru 			if (unlikely(num_to_process - enqueued < num_to_enq))
3079f162c475SNicolas Chautru 				num_to_enq = num_to_process - enqueued;
3080f162c475SNicolas Chautru 
3081f162c475SNicolas Chautru 			enq = 0;
3082f162c475SNicolas Chautru 			do {
3083f162c475SNicolas Chautru 				enq += rte_bbdev_enqueue_ldpc_enc_ops(
3084f162c475SNicolas Chautru 						tp->dev_id,
3085f162c475SNicolas Chautru 						queue_id, &ops[enqueued],
3086f162c475SNicolas Chautru 						num_to_enq);
3087f162c475SNicolas Chautru 			} while (unlikely(enq != num_to_enq));
3088f162c475SNicolas Chautru 			enqueued += enq;
3089f162c475SNicolas Chautru 
3090f162c475SNicolas Chautru 			/* Write to thread burst_sz current number of enqueued
3091f162c475SNicolas Chautru 			 * descriptors. It ensures that proper number of
3092f162c475SNicolas Chautru 			 * descriptors will be dequeued in callback
3093f162c475SNicolas Chautru 			 * function - needed for last batch in case where
3094f162c475SNicolas Chautru 			 * the number of operations is not a multiple of
3095f162c475SNicolas Chautru 			 * burst size.
3096f162c475SNicolas Chautru 			 */
3097*f83f3147SJoyce Kong 			__atomic_store_n(&tp->burst_sz, num_to_enq, __ATOMIC_RELAXED);
3098f162c475SNicolas Chautru 
3099f162c475SNicolas Chautru 			/* Wait until processing of previous batch is
3100f162c475SNicolas Chautru 			 * completed
3101f162c475SNicolas Chautru 			 */
3102*f83f3147SJoyce Kong 			rte_wait_until_equal_16(&tp->nb_dequeued, enqueued, __ATOMIC_RELAXED);
3103f162c475SNicolas Chautru 		}
3104f162c475SNicolas Chautru 		if (j != TEST_REPETITIONS - 1)
3105*f83f3147SJoyce Kong 			__atomic_store_n(&tp->nb_dequeued, 0, __ATOMIC_RELAXED);
3106f162c475SNicolas Chautru 	}
3107f162c475SNicolas Chautru 
3108f162c475SNicolas Chautru 	return TEST_SUCCESS;
3109f162c475SNicolas Chautru }
3110f162c475SNicolas Chautru 
3111f714a188SAmr Mokhtar static int
throughput_pmd_lcore_dec(void * arg)3112f714a188SAmr Mokhtar throughput_pmd_lcore_dec(void *arg)
3113f714a188SAmr Mokhtar {
3114f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
31150b98d574SKamil Chalupnik 	uint16_t enq, deq;
31160b98d574SKamil Chalupnik 	uint64_t total_time = 0, start_time;
3117f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
3118f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
31190b98d574SKamil Chalupnik 	const uint16_t num_ops = tp->op_params->num_to_process;
31200b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops_enq[num_ops];
31210b98d574SKamil Chalupnik 	struct rte_bbdev_dec_op *ops_deq[num_ops];
3122f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3123f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
31240b98d574SKamil Chalupnik 	int i, j, ret;
3125f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
31260b98d574SKamil Chalupnik 	uint16_t num_to_enq;
3127f714a188SAmr Mokhtar 
3128f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3129f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
3130f714a188SAmr Mokhtar 
3131f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
31320b98d574SKamil Chalupnik 
31330b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
31340b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
31350b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
31360b98d574SKamil Chalupnik 
3137f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3138f714a188SAmr Mokhtar 
3139*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3140f714a188SAmr Mokhtar 
31410b98d574SKamil Chalupnik 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
31420b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
3143f714a188SAmr Mokhtar 
3144f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
31450b98d574SKamil Chalupnik 		copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs,
31460b98d574SKamil Chalupnik 				bufs->hard_outputs, bufs->soft_outputs, ref_op);
3147f714a188SAmr Mokhtar 
31480b98d574SKamil Chalupnik 	/* Set counter to validate the ordering */
31490b98d574SKamil Chalupnik 	for (j = 0; j < num_ops; ++j)
31500b98d574SKamil Chalupnik 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
31510b98d574SKamil Chalupnik 
31520b98d574SKamil Chalupnik 	for (i = 0; i < TEST_REPETITIONS; ++i) {
31530b98d574SKamil Chalupnik 
31549585f8b1SKamil Chalupnik 		for (j = 0; j < num_ops; ++j)
31559585f8b1SKamil Chalupnik 			mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data);
31560b98d574SKamil Chalupnik 
31570b98d574SKamil Chalupnik 		start_time = rte_rdtsc_precise();
31580b98d574SKamil Chalupnik 
31590b98d574SKamil Chalupnik 		for (enq = 0, deq = 0; enq < num_ops;) {
31600b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
31610b98d574SKamil Chalupnik 
31620b98d574SKamil Chalupnik 			if (unlikely(num_ops - enq < num_to_enq))
31630b98d574SKamil Chalupnik 				num_to_enq = num_ops - enq;
31640b98d574SKamil Chalupnik 
31650b98d574SKamil Chalupnik 			enq += rte_bbdev_enqueue_dec_ops(tp->dev_id,
31660b98d574SKamil Chalupnik 					queue_id, &ops_enq[enq], num_to_enq);
31670b98d574SKamil Chalupnik 
31680b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
31690b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
3170f714a188SAmr Mokhtar 		}
3171f714a188SAmr Mokhtar 
31720b98d574SKamil Chalupnik 		/* dequeue the remaining */
31730b98d574SKamil Chalupnik 		while (deq < enq) {
31740b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(tp->dev_id,
31750b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
31760b98d574SKamil Chalupnik 		}
3177f714a188SAmr Mokhtar 
31780b98d574SKamil Chalupnik 		total_time += rte_rdtsc_precise() - start_time;
31790b98d574SKamil Chalupnik 	}
31800b98d574SKamil Chalupnik 
31810b98d574SKamil Chalupnik 	tp->iter_count = 0;
31820b98d574SKamil Chalupnik 	/* get the max of iter_count for all dequeued ops */
31830b98d574SKamil Chalupnik 	for (i = 0; i < num_ops; ++i) {
31840b98d574SKamil Chalupnik 		tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count,
31850b98d574SKamil Chalupnik 				tp->iter_count);
31860b98d574SKamil Chalupnik 	}
3187f714a188SAmr Mokhtar 
3188f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
31890b98d574SKamil Chalupnik 		ret = validate_dec_op(ops_deq, num_ops, ref_op,
31900b98d574SKamil Chalupnik 				tp->op_params->vector_mask);
31910b98d574SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
3192f714a188SAmr Mokhtar 	}
3193f714a188SAmr Mokhtar 
31940b98d574SKamil Chalupnik 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
31950b98d574SKamil Chalupnik 
31960b98d574SKamil Chalupnik 	double tb_len_bits = calc_dec_TB_size(ref_op);
31970b98d574SKamil Chalupnik 
31980b98d574SKamil Chalupnik 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
3199f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
32000b98d574SKamil Chalupnik 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
32010b98d574SKamil Chalupnik 			1000000.0) / ((double)total_time /
32020b98d574SKamil Chalupnik 			(double)rte_get_tsc_hz());
3203f714a188SAmr Mokhtar 
3204f714a188SAmr Mokhtar 	return TEST_SUCCESS;
3205f714a188SAmr Mokhtar }
3206f714a188SAmr Mokhtar 
3207f714a188SAmr Mokhtar static int
bler_pmd_lcore_ldpc_dec(void * arg)3208f41c6e4dSNicolas Chautru bler_pmd_lcore_ldpc_dec(void *arg)
3209f41c6e4dSNicolas Chautru {
3210f41c6e4dSNicolas Chautru 	struct thread_params *tp = arg;
3211f41c6e4dSNicolas Chautru 	uint16_t enq, deq;
3212f41c6e4dSNicolas Chautru 	uint64_t total_time = 0, start_time;
3213f41c6e4dSNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3214f41c6e4dSNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3215f41c6e4dSNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
3216f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[num_ops];
3217f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[num_ops];
3218f41c6e4dSNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3219f41c6e4dSNicolas Chautru 	struct test_buffers *bufs = NULL;
3220f41c6e4dSNicolas Chautru 	int i, j, ret;
3221f41c6e4dSNicolas Chautru 	float parity_bler = 0;
3222f41c6e4dSNicolas Chautru 	struct rte_bbdev_info info;
3223f41c6e4dSNicolas Chautru 	uint16_t num_to_enq;
3224f41c6e4dSNicolas Chautru 	bool extDdr = check_bit(ldpc_cap_flags,
3225f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE);
3226f41c6e4dSNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
3227f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
3228f41c6e4dSNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
3229f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
3230f41c6e4dSNicolas Chautru 
3231f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3232f41c6e4dSNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3233f41c6e4dSNicolas Chautru 
3234f41c6e4dSNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3235f41c6e4dSNicolas Chautru 
3236f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
3237f41c6e4dSNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3238f41c6e4dSNicolas Chautru 			info.drv.queue_size_lim);
3239f41c6e4dSNicolas Chautru 
3240f41c6e4dSNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3241f41c6e4dSNicolas Chautru 
3242*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3243f41c6e4dSNicolas Chautru 
3244f41c6e4dSNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
3245f41c6e4dSNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
3246f41c6e4dSNicolas Chautru 
3247f41c6e4dSNicolas Chautru 	/* For BLER tests we need to enable early termination */
3248f41c6e4dSNicolas Chautru 	if (!check_bit(ref_op->ldpc_dec.op_flags,
3249f41c6e4dSNicolas Chautru 			RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
3250f41c6e4dSNicolas Chautru 		ref_op->ldpc_dec.op_flags +=
3251f41c6e4dSNicolas Chautru 				RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
3252f41c6e4dSNicolas Chautru 	ref_op->ldpc_dec.iter_max = get_iter_max();
3253f41c6e4dSNicolas Chautru 	ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
3254f41c6e4dSNicolas Chautru 
3255f41c6e4dSNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3256f41c6e4dSNicolas Chautru 		copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs,
3257f41c6e4dSNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
3258f41c6e4dSNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
3259f41c6e4dSNicolas Chautru 	generate_llr_input(num_ops, bufs->inputs, ref_op);
3260f41c6e4dSNicolas Chautru 
3261f41c6e4dSNicolas Chautru 	/* Set counter to validate the ordering */
3262f41c6e4dSNicolas Chautru 	for (j = 0; j < num_ops; ++j)
3263f41c6e4dSNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
3264f41c6e4dSNicolas Chautru 
3265f41c6e4dSNicolas Chautru 	for (i = 0; i < 1; ++i) { /* Could add more iterations */
3266f41c6e4dSNicolas Chautru 		for (j = 0; j < num_ops; ++j) {
3267f41c6e4dSNicolas Chautru 			if (!loopback)
3268f41c6e4dSNicolas Chautru 				mbuf_reset(
3269f41c6e4dSNicolas Chautru 				ops_enq[j]->ldpc_dec.hard_output.data);
3270f41c6e4dSNicolas Chautru 			if (hc_out || loopback)
3271f41c6e4dSNicolas Chautru 				mbuf_reset(
3272f41c6e4dSNicolas Chautru 				ops_enq[j]->ldpc_dec.harq_combined_output.data);
3273f41c6e4dSNicolas Chautru 		}
32743d6063a0SNicolas Chautru 		if (extDdr)
3275f41c6e4dSNicolas Chautru 			preload_harq_ddr(tp->dev_id, queue_id, ops_enq,
32763d6063a0SNicolas Chautru 					num_ops, true);
3277f41c6e4dSNicolas Chautru 		start_time = rte_rdtsc_precise();
3278f41c6e4dSNicolas Chautru 
3279f41c6e4dSNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
3280f41c6e4dSNicolas Chautru 			num_to_enq = burst_sz;
3281f41c6e4dSNicolas Chautru 
3282f41c6e4dSNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
3283f41c6e4dSNicolas Chautru 				num_to_enq = num_ops - enq;
3284f41c6e4dSNicolas Chautru 
3285f41c6e4dSNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id,
3286f41c6e4dSNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
3287f41c6e4dSNicolas Chautru 
3288f41c6e4dSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
3289f41c6e4dSNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3290f41c6e4dSNicolas Chautru 		}
3291f41c6e4dSNicolas Chautru 
3292f41c6e4dSNicolas Chautru 		/* dequeue the remaining */
3293f41c6e4dSNicolas Chautru 		while (deq < enq) {
3294f41c6e4dSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
3295f41c6e4dSNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3296f41c6e4dSNicolas Chautru 		}
3297f41c6e4dSNicolas Chautru 
3298f41c6e4dSNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
3299f41c6e4dSNicolas Chautru 	}
3300f41c6e4dSNicolas Chautru 
3301f41c6e4dSNicolas Chautru 	tp->iter_count = 0;
3302f41c6e4dSNicolas Chautru 	tp->iter_average = 0;
3303f41c6e4dSNicolas Chautru 	/* get the max of iter_count for all dequeued ops */
3304f41c6e4dSNicolas Chautru 	for (i = 0; i < num_ops; ++i) {
3305f41c6e4dSNicolas Chautru 		tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count,
3306f41c6e4dSNicolas Chautru 				tp->iter_count);
3307f41c6e4dSNicolas Chautru 		tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count;
3308f41c6e4dSNicolas Chautru 		if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR))
3309f41c6e4dSNicolas Chautru 			parity_bler += 1.0;
3310f41c6e4dSNicolas Chautru 	}
3311f41c6e4dSNicolas Chautru 
3312f41c6e4dSNicolas Chautru 	parity_bler /= num_ops; /* This one is based on SYND */
3313f41c6e4dSNicolas Chautru 	tp->iter_average /= num_ops;
3314f41c6e4dSNicolas Chautru 	tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops;
3315f41c6e4dSNicolas Chautru 
3316f41c6e4dSNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE
3317f41c6e4dSNicolas Chautru 			&& tp->bler == 0
3318f41c6e4dSNicolas Chautru 			&& parity_bler == 0
3319f41c6e4dSNicolas Chautru 			&& !hc_out) {
3320f41c6e4dSNicolas Chautru 		ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op,
3321f41c6e4dSNicolas Chautru 				tp->op_params->vector_mask);
3322f41c6e4dSNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
3323f41c6e4dSNicolas Chautru 	}
3324f41c6e4dSNicolas Chautru 
3325f41c6e4dSNicolas Chautru 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
3326f41c6e4dSNicolas Chautru 
3327f41c6e4dSNicolas Chautru 	double tb_len_bits = calc_ldpc_dec_TB_size(ref_op);
3328f41c6e4dSNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * 1) /
3329f41c6e4dSNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
3330f41c6e4dSNicolas Chautru 	tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) /
3331f41c6e4dSNicolas Chautru 			1000000.0) / ((double)total_time /
3332f41c6e4dSNicolas Chautru 			(double)rte_get_tsc_hz());
3333f41c6e4dSNicolas Chautru 
3334f41c6e4dSNicolas Chautru 	return TEST_SUCCESS;
3335f41c6e4dSNicolas Chautru }
3336f41c6e4dSNicolas Chautru 
3337f41c6e4dSNicolas Chautru static int
throughput_pmd_lcore_ldpc_dec(void * arg)3338d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_dec(void *arg)
3339d819c083SNicolas Chautru {
3340d819c083SNicolas Chautru 	struct thread_params *tp = arg;
3341d819c083SNicolas Chautru 	uint16_t enq, deq;
3342d819c083SNicolas Chautru 	uint64_t total_time = 0, start_time;
3343d819c083SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3344d819c083SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3345d819c083SNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
3346d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[num_ops];
3347d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_deq[num_ops];
3348d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op;
3349d819c083SNicolas Chautru 	struct test_buffers *bufs = NULL;
3350d819c083SNicolas Chautru 	int i, j, ret;
3351d819c083SNicolas Chautru 	struct rte_bbdev_info info;
3352d819c083SNicolas Chautru 	uint16_t num_to_enq;
3353335c11fdSNicolas Chautru 	bool extDdr = check_bit(ldpc_cap_flags,
3354335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE);
3355335c11fdSNicolas Chautru 	bool loopback = check_bit(ref_op->ldpc_dec.op_flags,
3356335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK);
3357335c11fdSNicolas Chautru 	bool hc_out = check_bit(ref_op->ldpc_dec.op_flags,
3358335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE);
3359d819c083SNicolas Chautru 
3360d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3361d819c083SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3362d819c083SNicolas Chautru 
3363d819c083SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3364d819c083SNicolas Chautru 
3365d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
3366d819c083SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3367d819c083SNicolas Chautru 			info.drv.queue_size_lim);
3368d819c083SNicolas Chautru 
3369d819c083SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3370d819c083SNicolas Chautru 
3371*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3372d819c083SNicolas Chautru 
3373d819c083SNicolas Chautru 	ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops);
3374d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops);
3375d819c083SNicolas Chautru 
3376d819c083SNicolas Chautru 	/* For throughput tests we need to disable early termination */
3377d819c083SNicolas Chautru 	if (check_bit(ref_op->ldpc_dec.op_flags,
3378d819c083SNicolas Chautru 			RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
3379d819c083SNicolas Chautru 		ref_op->ldpc_dec.op_flags -=
3380d819c083SNicolas Chautru 				RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
3381f41c6e4dSNicolas Chautru 	ref_op->ldpc_dec.iter_max = get_iter_max();
3382d819c083SNicolas Chautru 	ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
3383d819c083SNicolas Chautru 
3384d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3385d819c083SNicolas Chautru 		copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs,
3386d819c083SNicolas Chautru 				bufs->hard_outputs, bufs->soft_outputs,
3387d819c083SNicolas Chautru 				bufs->harq_inputs, bufs->harq_outputs, ref_op);
3388d819c083SNicolas Chautru 
3389d819c083SNicolas Chautru 	/* Set counter to validate the ordering */
3390d819c083SNicolas Chautru 	for (j = 0; j < num_ops; ++j)
3391d819c083SNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
3392d819c083SNicolas Chautru 
3393d819c083SNicolas Chautru 	for (i = 0; i < TEST_REPETITIONS; ++i) {
3394d819c083SNicolas Chautru 		for (j = 0; j < num_ops; ++j) {
3395335c11fdSNicolas Chautru 			if (!loopback)
3396335c11fdSNicolas Chautru 				mbuf_reset(
3397335c11fdSNicolas Chautru 				ops_enq[j]->ldpc_dec.hard_output.data);
3398335c11fdSNicolas Chautru 			if (hc_out || loopback)
3399d819c083SNicolas Chautru 				mbuf_reset(
3400d819c083SNicolas Chautru 				ops_enq[j]->ldpc_dec.harq_combined_output.data);
3401d819c083SNicolas Chautru 		}
34023d6063a0SNicolas Chautru 		if (extDdr)
3403335c11fdSNicolas Chautru 			preload_harq_ddr(tp->dev_id, queue_id, ops_enq,
34043d6063a0SNicolas Chautru 					num_ops, true);
3405d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
3406d819c083SNicolas Chautru 
3407d819c083SNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
3408d819c083SNicolas Chautru 			num_to_enq = burst_sz;
3409d819c083SNicolas Chautru 
3410d819c083SNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
3411d819c083SNicolas Chautru 				num_to_enq = num_ops - enq;
3412d819c083SNicolas Chautru 
3413d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id,
3414d819c083SNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
3415d819c083SNicolas Chautru 
3416d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
3417d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3418d819c083SNicolas Chautru 		}
3419d819c083SNicolas Chautru 
3420d819c083SNicolas Chautru 		/* dequeue the remaining */
3421d819c083SNicolas Chautru 		while (deq < enq) {
3422d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id,
3423d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3424d819c083SNicolas Chautru 		}
3425d819c083SNicolas Chautru 
3426d819c083SNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
3427d819c083SNicolas Chautru 	}
3428d819c083SNicolas Chautru 
3429d819c083SNicolas Chautru 	tp->iter_count = 0;
3430d819c083SNicolas Chautru 	/* get the max of iter_count for all dequeued ops */
3431d819c083SNicolas Chautru 	for (i = 0; i < num_ops; ++i) {
3432d819c083SNicolas Chautru 		tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count,
3433d819c083SNicolas Chautru 				tp->iter_count);
3434d819c083SNicolas Chautru 	}
3435335c11fdSNicolas Chautru 	if (extDdr) {
3436335c11fdSNicolas Chautru 		/* Read loopback is not thread safe */
3437335c11fdSNicolas Chautru 		retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops);
3438335c11fdSNicolas Chautru 	}
3439d819c083SNicolas Chautru 
3440d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
3441d819c083SNicolas Chautru 		ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op,
3442d819c083SNicolas Chautru 				tp->op_params->vector_mask);
3443d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
3444d819c083SNicolas Chautru 	}
3445d819c083SNicolas Chautru 
3446d819c083SNicolas Chautru 	rte_bbdev_dec_op_free_bulk(ops_enq, num_ops);
3447d819c083SNicolas Chautru 
3448d819c083SNicolas Chautru 	double tb_len_bits = calc_ldpc_dec_TB_size(ref_op);
3449d819c083SNicolas Chautru 
3450d819c083SNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
3451d819c083SNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
3452d819c083SNicolas Chautru 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) /
3453d819c083SNicolas Chautru 			1000000.0) / ((double)total_time /
3454d819c083SNicolas Chautru 			(double)rte_get_tsc_hz());
3455d819c083SNicolas Chautru 
3456d819c083SNicolas Chautru 	return TEST_SUCCESS;
3457d819c083SNicolas Chautru }
3458d819c083SNicolas Chautru 
3459d819c083SNicolas Chautru static int
throughput_pmd_lcore_enc(void * arg)3460f714a188SAmr Mokhtar throughput_pmd_lcore_enc(void *arg)
3461f714a188SAmr Mokhtar {
3462f714a188SAmr Mokhtar 	struct thread_params *tp = arg;
34630b98d574SKamil Chalupnik 	uint16_t enq, deq;
34640b98d574SKamil Chalupnik 	uint64_t total_time = 0, start_time;
3465f714a188SAmr Mokhtar 	const uint16_t queue_id = tp->queue_id;
3466f714a188SAmr Mokhtar 	const uint16_t burst_sz = tp->op_params->burst_sz;
34670b98d574SKamil Chalupnik 	const uint16_t num_ops = tp->op_params->num_to_process;
34680b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops_enq[num_ops];
34690b98d574SKamil Chalupnik 	struct rte_bbdev_enc_op *ops_deq[num_ops];
3470f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
3471f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
34720b98d574SKamil Chalupnik 	int i, j, ret;
3473f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
34740b98d574SKamil Chalupnik 	uint16_t num_to_enq;
3475f714a188SAmr Mokhtar 
3476f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3477f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
3478f714a188SAmr Mokhtar 
3479f714a188SAmr Mokhtar 	rte_bbdev_info_get(tp->dev_id, &info);
34800b98d574SKamil Chalupnik 
34810b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
34820b98d574SKamil Chalupnik 			"NUM_OPS cannot exceed %u for this device",
34830b98d574SKamil Chalupnik 			info.drv.queue_size_lim);
34840b98d574SKamil Chalupnik 
3485f714a188SAmr Mokhtar 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3486f714a188SAmr Mokhtar 
3487*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3488f714a188SAmr Mokhtar 
34890b98d574SKamil Chalupnik 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
34900b98d574SKamil Chalupnik 			num_ops);
34910b98d574SKamil Chalupnik 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
34920b98d574SKamil Chalupnik 			num_ops);
34930b98d574SKamil Chalupnik 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
34940b98d574SKamil Chalupnik 		copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs,
34950b98d574SKamil Chalupnik 				bufs->hard_outputs, ref_op);
3496f714a188SAmr Mokhtar 
34970b98d574SKamil Chalupnik 	/* Set counter to validate the ordering */
34980b98d574SKamil Chalupnik 	for (j = 0; j < num_ops; ++j)
34990b98d574SKamil Chalupnik 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
3500f714a188SAmr Mokhtar 
35010b98d574SKamil Chalupnik 	for (i = 0; i < TEST_REPETITIONS; ++i) {
3502f714a188SAmr Mokhtar 
3503f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
35040b98d574SKamil Chalupnik 			for (j = 0; j < num_ops; ++j)
35059585f8b1SKamil Chalupnik 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
3506f714a188SAmr Mokhtar 
35070b98d574SKamil Chalupnik 		start_time = rte_rdtsc_precise();
35080b98d574SKamil Chalupnik 
35090b98d574SKamil Chalupnik 		for (enq = 0, deq = 0; enq < num_ops;) {
35100b98d574SKamil Chalupnik 			num_to_enq = burst_sz;
35110b98d574SKamil Chalupnik 
35120b98d574SKamil Chalupnik 			if (unlikely(num_ops - enq < num_to_enq))
35130b98d574SKamil Chalupnik 				num_to_enq = num_ops - enq;
35140b98d574SKamil Chalupnik 
35150b98d574SKamil Chalupnik 			enq += rte_bbdev_enqueue_enc_ops(tp->dev_id,
35160b98d574SKamil Chalupnik 					queue_id, &ops_enq[enq], num_to_enq);
35170b98d574SKamil Chalupnik 
35180b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
35190b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
3520f714a188SAmr Mokhtar 		}
35210b98d574SKamil Chalupnik 
35220b98d574SKamil Chalupnik 		/* dequeue the remaining */
35230b98d574SKamil Chalupnik 		while (deq < enq) {
35240b98d574SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(tp->dev_id,
35250b98d574SKamil Chalupnik 					queue_id, &ops_deq[deq], enq - deq);
3526f714a188SAmr Mokhtar 		}
3527f714a188SAmr Mokhtar 
35280b98d574SKamil Chalupnik 		total_time += rte_rdtsc_precise() - start_time;
35290b98d574SKamil Chalupnik 	}
3530f714a188SAmr Mokhtar 
3531f714a188SAmr Mokhtar 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
35320b98d574SKamil Chalupnik 		ret = validate_enc_op(ops_deq, num_ops, ref_op);
35330b98d574SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
3534f714a188SAmr Mokhtar 	}
3535f714a188SAmr Mokhtar 
3536d819c083SNicolas Chautru 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
3537d819c083SNicolas Chautru 
35380b98d574SKamil Chalupnik 	double tb_len_bits = calc_enc_TB_size(ref_op);
3539f714a188SAmr Mokhtar 
35400b98d574SKamil Chalupnik 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
3541f714a188SAmr Mokhtar 			((double)total_time / (double)rte_get_tsc_hz());
35420b98d574SKamil Chalupnik 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
35430b98d574SKamil Chalupnik 			/ 1000000.0) / ((double)total_time /
35440b98d574SKamil Chalupnik 			(double)rte_get_tsc_hz());
3545f714a188SAmr Mokhtar 
3546f714a188SAmr Mokhtar 	return TEST_SUCCESS;
3547f714a188SAmr Mokhtar }
35480b98d574SKamil Chalupnik 
3549d819c083SNicolas Chautru static int
throughput_pmd_lcore_ldpc_enc(void * arg)3550d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_enc(void *arg)
3551d819c083SNicolas Chautru {
3552d819c083SNicolas Chautru 	struct thread_params *tp = arg;
3553d819c083SNicolas Chautru 	uint16_t enq, deq;
3554d819c083SNicolas Chautru 	uint64_t total_time = 0, start_time;
3555d819c083SNicolas Chautru 	const uint16_t queue_id = tp->queue_id;
3556d819c083SNicolas Chautru 	const uint16_t burst_sz = tp->op_params->burst_sz;
3557d819c083SNicolas Chautru 	const uint16_t num_ops = tp->op_params->num_to_process;
3558d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[num_ops];
3559d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_deq[num_ops];
3560d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op;
3561d819c083SNicolas Chautru 	struct test_buffers *bufs = NULL;
3562d819c083SNicolas Chautru 	int i, j, ret;
3563d819c083SNicolas Chautru 	struct rte_bbdev_info info;
3564d819c083SNicolas Chautru 	uint16_t num_to_enq;
3565d819c083SNicolas Chautru 
3566d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
3567d819c083SNicolas Chautru 			"BURST_SIZE should be <= %u", MAX_BURST);
3568d819c083SNicolas Chautru 
3569d819c083SNicolas Chautru 	rte_bbdev_info_get(tp->dev_id, &info);
3570d819c083SNicolas Chautru 
3571d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim),
3572d819c083SNicolas Chautru 			"NUM_OPS cannot exceed %u for this device",
3573d819c083SNicolas Chautru 			info.drv.queue_size_lim);
3574d819c083SNicolas Chautru 
3575d819c083SNicolas Chautru 	bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
3576d819c083SNicolas Chautru 
3577*f83f3147SJoyce Kong 	rte_wait_until_equal_16(&tp->op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3578d819c083SNicolas Chautru 
3579d819c083SNicolas Chautru 	ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq,
3580d819c083SNicolas Chautru 			num_ops);
3581d819c083SNicolas Chautru 	TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops",
3582d819c083SNicolas Chautru 			num_ops);
3583d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3584d819c083SNicolas Chautru 		copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs,
3585d819c083SNicolas Chautru 				bufs->hard_outputs, ref_op);
3586d819c083SNicolas Chautru 
3587d819c083SNicolas Chautru 	/* Set counter to validate the ordering */
3588d819c083SNicolas Chautru 	for (j = 0; j < num_ops; ++j)
3589d819c083SNicolas Chautru 		ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
3590d819c083SNicolas Chautru 
3591d819c083SNicolas Chautru 	for (i = 0; i < TEST_REPETITIONS; ++i) {
3592d819c083SNicolas Chautru 
3593d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3594d819c083SNicolas Chautru 			for (j = 0; j < num_ops; ++j)
3595d819c083SNicolas Chautru 				mbuf_reset(ops_enq[j]->turbo_enc.output.data);
3596d819c083SNicolas Chautru 
3597d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
3598d819c083SNicolas Chautru 
3599d819c083SNicolas Chautru 		for (enq = 0, deq = 0; enq < num_ops;) {
3600d819c083SNicolas Chautru 			num_to_enq = burst_sz;
3601d819c083SNicolas Chautru 
3602d819c083SNicolas Chautru 			if (unlikely(num_ops - enq < num_to_enq))
3603d819c083SNicolas Chautru 				num_to_enq = num_ops - enq;
3604d819c083SNicolas Chautru 
3605d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id,
3606d819c083SNicolas Chautru 					queue_id, &ops_enq[enq], num_to_enq);
3607d819c083SNicolas Chautru 
3608d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
3609d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3610d819c083SNicolas Chautru 		}
3611d819c083SNicolas Chautru 
3612d819c083SNicolas Chautru 		/* dequeue the remaining */
3613d819c083SNicolas Chautru 		while (deq < enq) {
3614d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id,
3615d819c083SNicolas Chautru 					queue_id, &ops_deq[deq], enq - deq);
3616d819c083SNicolas Chautru 		}
3617d819c083SNicolas Chautru 
3618d819c083SNicolas Chautru 		total_time += rte_rdtsc_precise() - start_time;
3619d819c083SNicolas Chautru 	}
3620d819c083SNicolas Chautru 
3621d819c083SNicolas Chautru 	if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
3622d819c083SNicolas Chautru 		ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op);
3623d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret, "Validation failed!");
3624d819c083SNicolas Chautru 	}
3625d819c083SNicolas Chautru 
3626d819c083SNicolas Chautru 	rte_bbdev_enc_op_free_bulk(ops_enq, num_ops);
3627d819c083SNicolas Chautru 
3628d819c083SNicolas Chautru 	double tb_len_bits = calc_ldpc_enc_TB_size(ref_op);
3629d819c083SNicolas Chautru 
3630d819c083SNicolas Chautru 	tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) /
3631d819c083SNicolas Chautru 			((double)total_time / (double)rte_get_tsc_hz());
3632d819c083SNicolas Chautru 	tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits))
3633d819c083SNicolas Chautru 			/ 1000000.0) / ((double)total_time /
3634d819c083SNicolas Chautru 			(double)rte_get_tsc_hz());
3635d819c083SNicolas Chautru 
3636d819c083SNicolas Chautru 	return TEST_SUCCESS;
3637d819c083SNicolas Chautru }
3638d819c083SNicolas Chautru 
3639f714a188SAmr Mokhtar static void
print_enc_throughput(struct thread_params * t_params,unsigned int used_cores)36400b98d574SKamil Chalupnik print_enc_throughput(struct thread_params *t_params, unsigned int used_cores)
3641f714a188SAmr Mokhtar {
3642b2e2aec3SKamil Chalupnik 	unsigned int iter = 0;
3643f714a188SAmr Mokhtar 	double total_mops = 0, total_mbps = 0;
3644f714a188SAmr Mokhtar 
3645b2e2aec3SKamil Chalupnik 	for (iter = 0; iter < used_cores; iter++) {
36460b98d574SKamil Chalupnik 		printf(
36470b98d574SKamil Chalupnik 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n",
3648b2e2aec3SKamil Chalupnik 			t_params[iter].lcore_id, t_params[iter].ops_per_sec,
3649b2e2aec3SKamil Chalupnik 			t_params[iter].mbps);
3650b2e2aec3SKamil Chalupnik 		total_mops += t_params[iter].ops_per_sec;
3651b2e2aec3SKamil Chalupnik 		total_mbps += t_params[iter].mbps;
3652f714a188SAmr Mokhtar 	}
3653f714a188SAmr Mokhtar 	printf(
36549fa6ebdeSKamil Chalupnik 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n",
3655f714a188SAmr Mokhtar 		used_cores, total_mops, total_mbps);
3656f714a188SAmr Mokhtar }
3657f714a188SAmr Mokhtar 
3658f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */
36590b98d574SKamil Chalupnik static void
print_dec_throughput(struct thread_params * t_params,unsigned int used_cores)36600b98d574SKamil Chalupnik print_dec_throughput(struct thread_params *t_params, unsigned int used_cores)
36610b98d574SKamil Chalupnik {
3662f41c6e4dSNicolas Chautru 	unsigned int core_idx = 0;
36630b98d574SKamil Chalupnik 	double total_mops = 0, total_mbps = 0;
36640b98d574SKamil Chalupnik 	uint8_t iter_count = 0;
36650b98d574SKamil Chalupnik 
3666f41c6e4dSNicolas Chautru 	for (core_idx = 0; core_idx < used_cores; core_idx++) {
36670b98d574SKamil Chalupnik 		printf(
36680b98d574SKamil Chalupnik 			"Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n",
3669f41c6e4dSNicolas Chautru 			t_params[core_idx].lcore_id,
3670f41c6e4dSNicolas Chautru 			t_params[core_idx].ops_per_sec,
3671f41c6e4dSNicolas Chautru 			t_params[core_idx].mbps,
3672f41c6e4dSNicolas Chautru 			t_params[core_idx].iter_count);
3673f41c6e4dSNicolas Chautru 		total_mops += t_params[core_idx].ops_per_sec;
3674f41c6e4dSNicolas Chautru 		total_mbps += t_params[core_idx].mbps;
3675f41c6e4dSNicolas Chautru 		iter_count = RTE_MAX(iter_count,
3676f41c6e4dSNicolas Chautru 				t_params[core_idx].iter_count);
36770b98d574SKamil Chalupnik 	}
36780b98d574SKamil Chalupnik 	printf(
36790b98d574SKamil Chalupnik 		"\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n",
36800b98d574SKamil Chalupnik 		used_cores, total_mops, total_mbps, iter_count);
36810b98d574SKamil Chalupnik }
36820b98d574SKamil Chalupnik 
3683f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */
3684f41c6e4dSNicolas Chautru static void
print_dec_bler(struct thread_params * t_params,unsigned int used_cores)3685f41c6e4dSNicolas Chautru print_dec_bler(struct thread_params *t_params, unsigned int used_cores)
3686f41c6e4dSNicolas Chautru {
3687f41c6e4dSNicolas Chautru 	unsigned int core_idx = 0;
3688f41c6e4dSNicolas Chautru 	double total_mbps = 0, total_bler = 0, total_iter = 0;
3689f41c6e4dSNicolas Chautru 	double snr = get_snr();
3690f41c6e4dSNicolas Chautru 
3691f41c6e4dSNicolas Chautru 	for (core_idx = 0; core_idx < used_cores; core_idx++) {
3692f41c6e4dSNicolas Chautru 		printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n",
3693f41c6e4dSNicolas Chautru 				t_params[core_idx].lcore_id,
3694f41c6e4dSNicolas Chautru 				t_params[core_idx].bler * 100,
3695f41c6e4dSNicolas Chautru 				t_params[core_idx].iter_average,
3696f41c6e4dSNicolas Chautru 				t_params[core_idx].mbps,
3697f41c6e4dSNicolas Chautru 				get_vector_filename());
3698f41c6e4dSNicolas Chautru 		total_mbps += t_params[core_idx].mbps;
3699f41c6e4dSNicolas Chautru 		total_bler += t_params[core_idx].bler;
3700f41c6e4dSNicolas Chautru 		total_iter += t_params[core_idx].iter_average;
3701f41c6e4dSNicolas Chautru 	}
3702f41c6e4dSNicolas Chautru 	total_bler /= used_cores;
3703f41c6e4dSNicolas Chautru 	total_iter /= used_cores;
3704f41c6e4dSNicolas Chautru 
3705f41c6e4dSNicolas Chautru 	printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.1f Mbps %s\n",
3706f41c6e4dSNicolas Chautru 			snr, total_bler * 100, total_iter, get_iter_max(),
3707f41c6e4dSNicolas Chautru 			total_mbps, get_vector_filename());
3708f41c6e4dSNicolas Chautru }
3709f41c6e4dSNicolas Chautru 
3710f41c6e4dSNicolas Chautru /*
3711f41c6e4dSNicolas Chautru  * Test function that determines BLER wireless performance
3712f41c6e4dSNicolas Chautru  */
3713f41c6e4dSNicolas Chautru static int
bler_test(struct active_device * ad,struct test_op_params * op_params)3714f41c6e4dSNicolas Chautru bler_test(struct active_device *ad,
3715f41c6e4dSNicolas Chautru 		struct test_op_params *op_params)
3716f41c6e4dSNicolas Chautru {
3717f41c6e4dSNicolas Chautru 	int ret;
3718f41c6e4dSNicolas Chautru 	unsigned int lcore_id, used_cores = 0;
3719f41c6e4dSNicolas Chautru 	struct thread_params *t_params;
3720f41c6e4dSNicolas Chautru 	struct rte_bbdev_info info;
3721f41c6e4dSNicolas Chautru 	lcore_function_t *bler_function;
3722f41c6e4dSNicolas Chautru 	uint16_t num_lcores;
3723f41c6e4dSNicolas Chautru 	const char *op_type_str;
3724f41c6e4dSNicolas Chautru 
3725f41c6e4dSNicolas Chautru 	rte_bbdev_info_get(ad->dev_id, &info);
3726f41c6e4dSNicolas Chautru 
3727f41c6e4dSNicolas Chautru 	op_type_str = rte_bbdev_op_type_str(test_vector.op_type);
3728f41c6e4dSNicolas Chautru 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u",
3729f41c6e4dSNicolas Chautru 			test_vector.op_type);
3730f41c6e4dSNicolas Chautru 
3731f41c6e4dSNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
3732f41c6e4dSNicolas 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",
3733f41c6e4dSNicolas Chautru 			info.dev_name, ad->nb_queues, op_params->burst_sz,
3734f41c6e4dSNicolas Chautru 			op_params->num_to_process, op_params->num_lcores,
3735f41c6e4dSNicolas Chautru 			op_type_str,
3736f41c6e4dSNicolas Chautru 			intr_enabled ? "Interrupt mode" : "PMD mode",
3737f41c6e4dSNicolas Chautru 			(double)rte_get_tsc_hz() / 1000000000.0);
3738f41c6e4dSNicolas Chautru 
3739f41c6e4dSNicolas Chautru 	/* Set number of lcores */
3740f41c6e4dSNicolas Chautru 	num_lcores = (ad->nb_queues < (op_params->num_lcores))
3741f41c6e4dSNicolas Chautru 			? ad->nb_queues
3742f41c6e4dSNicolas Chautru 			: op_params->num_lcores;
3743f41c6e4dSNicolas Chautru 
3744f41c6e4dSNicolas Chautru 	/* Allocate memory for thread parameters structure */
3745f41c6e4dSNicolas Chautru 	t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params),
3746f41c6e4dSNicolas Chautru 			RTE_CACHE_LINE_SIZE);
3747f41c6e4dSNicolas Chautru 	TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params",
3748f41c6e4dSNicolas Chautru 			RTE_ALIGN(sizeof(struct thread_params) * num_lcores,
3749f41c6e4dSNicolas Chautru 				RTE_CACHE_LINE_SIZE));
3750f41c6e4dSNicolas Chautru 
37517456706aSNicolas Chautru 	if ((test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) &&
37527456706aSNicolas Chautru 			!check_bit(test_vector.ldpc_dec.op_flags,
37537456706aSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)
37547456706aSNicolas Chautru 			&& !check_bit(test_vector.ldpc_dec.op_flags,
37557456706aSNicolas Chautru 			RTE_BBDEV_LDPC_LLR_COMPRESSION))
3756f41c6e4dSNicolas Chautru 		bler_function = bler_pmd_lcore_ldpc_dec;
3757f41c6e4dSNicolas Chautru 	else
3758f41c6e4dSNicolas Chautru 		return TEST_SKIPPED;
3759f41c6e4dSNicolas Chautru 
3760*f83f3147SJoyce Kong 	__atomic_store_n(&op_params->sync, SYNC_WAIT, __ATOMIC_RELAXED);
3761f41c6e4dSNicolas Chautru 
3762cb056611SStephen Hemminger 	/* Main core is set at first entry */
3763f41c6e4dSNicolas Chautru 	t_params[0].dev_id = ad->dev_id;
3764f41c6e4dSNicolas Chautru 	t_params[0].lcore_id = rte_lcore_id();
3765f41c6e4dSNicolas Chautru 	t_params[0].op_params = op_params;
3766f41c6e4dSNicolas Chautru 	t_params[0].queue_id = ad->queue_ids[used_cores++];
3767f41c6e4dSNicolas Chautru 	t_params[0].iter_count = 0;
3768f41c6e4dSNicolas Chautru 
3769cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
3770f41c6e4dSNicolas Chautru 		if (used_cores >= num_lcores)
3771f41c6e4dSNicolas Chautru 			break;
3772f41c6e4dSNicolas Chautru 
3773f41c6e4dSNicolas Chautru 		t_params[used_cores].dev_id = ad->dev_id;
3774f41c6e4dSNicolas Chautru 		t_params[used_cores].lcore_id = lcore_id;
3775f41c6e4dSNicolas Chautru 		t_params[used_cores].op_params = op_params;
3776f41c6e4dSNicolas Chautru 		t_params[used_cores].queue_id = ad->queue_ids[used_cores];
3777f41c6e4dSNicolas Chautru 		t_params[used_cores].iter_count = 0;
3778f41c6e4dSNicolas Chautru 
3779f41c6e4dSNicolas Chautru 		rte_eal_remote_launch(bler_function,
3780f41c6e4dSNicolas Chautru 				&t_params[used_cores++], lcore_id);
3781f41c6e4dSNicolas Chautru 	}
3782f41c6e4dSNicolas Chautru 
3783*f83f3147SJoyce Kong 	__atomic_store_n(&op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3784f41c6e4dSNicolas Chautru 	ret = bler_function(&t_params[0]);
3785f41c6e4dSNicolas Chautru 
3786cb056611SStephen Hemminger 	/* Main core is always used */
3787f41c6e4dSNicolas Chautru 	for (used_cores = 1; used_cores < num_lcores; used_cores++)
3788f41c6e4dSNicolas Chautru 		ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id);
3789f41c6e4dSNicolas Chautru 
3790f41c6e4dSNicolas Chautru 	print_dec_bler(t_params, num_lcores);
3791f41c6e4dSNicolas Chautru 
3792f41c6e4dSNicolas Chautru 	/* Return if test failed */
3793f41c6e4dSNicolas Chautru 	if (ret) {
3794f41c6e4dSNicolas Chautru 		rte_free(t_params);
3795f41c6e4dSNicolas Chautru 		return ret;
3796f41c6e4dSNicolas Chautru 	}
3797f41c6e4dSNicolas Chautru 
3798f41c6e4dSNicolas Chautru 	/* Function to print something  here*/
3799f41c6e4dSNicolas Chautru 	rte_free(t_params);
3800f41c6e4dSNicolas Chautru 	return ret;
3801f41c6e4dSNicolas Chautru }
3802f41c6e4dSNicolas Chautru 
3803f714a188SAmr Mokhtar /*
3804f714a188SAmr Mokhtar  * Test function that determines how long an enqueue + dequeue of a burst
3805f714a188SAmr Mokhtar  * takes on available lcores.
3806f714a188SAmr Mokhtar  */
3807f714a188SAmr Mokhtar static int
throughput_test(struct active_device * ad,struct test_op_params * op_params)3808f714a188SAmr Mokhtar throughput_test(struct active_device *ad,
3809f714a188SAmr Mokhtar 		struct test_op_params *op_params)
3810f714a188SAmr Mokhtar {
3811f714a188SAmr Mokhtar 	int ret;
3812f714a188SAmr Mokhtar 	unsigned int lcore_id, used_cores = 0;
3813b2e2aec3SKamil Chalupnik 	struct thread_params *t_params, *tp;
3814f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
3815f714a188SAmr Mokhtar 	lcore_function_t *throughput_function;
3816f714a188SAmr Mokhtar 	uint16_t num_lcores;
3817f714a188SAmr Mokhtar 	const char *op_type_str;
3818f714a188SAmr Mokhtar 
3819f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
3820f714a188SAmr Mokhtar 
3821f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(test_vector.op_type);
3822f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u",
3823f714a188SAmr Mokhtar 			test_vector.op_type);
3824f714a188SAmr Mokhtar 
3825d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
3826d819c083SNicolas 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",
3827f714a188SAmr Mokhtar 			info.dev_name, ad->nb_queues, op_params->burst_sz,
3828f714a188SAmr Mokhtar 			op_params->num_to_process, op_params->num_lcores,
3829f714a188SAmr Mokhtar 			op_type_str,
3830f714a188SAmr Mokhtar 			intr_enabled ? "Interrupt mode" : "PMD mode",
3831f714a188SAmr Mokhtar 			(double)rte_get_tsc_hz() / 1000000000.0);
3832f714a188SAmr Mokhtar 
3833f714a188SAmr Mokhtar 	/* Set number of lcores */
3834f714a188SAmr Mokhtar 	num_lcores = (ad->nb_queues < (op_params->num_lcores))
3835f714a188SAmr Mokhtar 			? ad->nb_queues
3836f714a188SAmr Mokhtar 			: op_params->num_lcores;
3837f714a188SAmr Mokhtar 
3838b2e2aec3SKamil Chalupnik 	/* Allocate memory for thread parameters structure */
3839b2e2aec3SKamil Chalupnik 	t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params),
3840b2e2aec3SKamil Chalupnik 			RTE_CACHE_LINE_SIZE);
3841b2e2aec3SKamil Chalupnik 	TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params",
3842b2e2aec3SKamil Chalupnik 			RTE_ALIGN(sizeof(struct thread_params) * num_lcores,
3843b2e2aec3SKamil Chalupnik 				RTE_CACHE_LINE_SIZE));
3844b2e2aec3SKamil Chalupnik 
3845f714a188SAmr Mokhtar 	if (intr_enabled) {
3846f714a188SAmr Mokhtar 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
3847f714a188SAmr Mokhtar 			throughput_function = throughput_intr_lcore_dec;
3848d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
3849f162c475SNicolas Chautru 			throughput_function = throughput_intr_lcore_ldpc_dec;
3850d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
3851d819c083SNicolas Chautru 			throughput_function = throughput_intr_lcore_enc;
3852d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
3853f162c475SNicolas Chautru 			throughput_function = throughput_intr_lcore_ldpc_enc;
3854f714a188SAmr Mokhtar 		else
3855f714a188SAmr Mokhtar 			throughput_function = throughput_intr_lcore_enc;
3856f714a188SAmr Mokhtar 
3857f714a188SAmr Mokhtar 		/* Dequeue interrupt callback registration */
3858d3345d40SAmr Mokhtar 		ret = rte_bbdev_callback_register(ad->dev_id,
3859d3345d40SAmr Mokhtar 				RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback,
3860b2e2aec3SKamil Chalupnik 				t_params);
3861b2e2aec3SKamil Chalupnik 		if (ret < 0) {
3862b2e2aec3SKamil Chalupnik 			rte_free(t_params);
3863d3345d40SAmr Mokhtar 			return ret;
3864b2e2aec3SKamil Chalupnik 		}
3865f714a188SAmr Mokhtar 	} else {
3866f714a188SAmr Mokhtar 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC)
3867f714a188SAmr Mokhtar 			throughput_function = throughput_pmd_lcore_dec;
3868d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
3869d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_ldpc_dec;
3870d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC)
3871d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_enc;
3872d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
3873d819c083SNicolas Chautru 			throughput_function = throughput_pmd_lcore_ldpc_enc;
3874f714a188SAmr Mokhtar 		else
3875f714a188SAmr Mokhtar 			throughput_function = throughput_pmd_lcore_enc;
3876f714a188SAmr Mokhtar 	}
3877f714a188SAmr Mokhtar 
3878*f83f3147SJoyce Kong 	__atomic_store_n(&op_params->sync, SYNC_WAIT, __ATOMIC_RELAXED);
3879f714a188SAmr Mokhtar 
3880cb056611SStephen Hemminger 	/* Main core is set at first entry */
3881b2e2aec3SKamil Chalupnik 	t_params[0].dev_id = ad->dev_id;
3882b2e2aec3SKamil Chalupnik 	t_params[0].lcore_id = rte_lcore_id();
3883b2e2aec3SKamil Chalupnik 	t_params[0].op_params = op_params;
3884b2e2aec3SKamil Chalupnik 	t_params[0].queue_id = ad->queue_ids[used_cores++];
3885b2e2aec3SKamil Chalupnik 	t_params[0].iter_count = 0;
3886f714a188SAmr Mokhtar 
3887cb056611SStephen Hemminger 	RTE_LCORE_FOREACH_WORKER(lcore_id) {
3888f714a188SAmr Mokhtar 		if (used_cores >= num_lcores)
3889f714a188SAmr Mokhtar 			break;
3890f714a188SAmr Mokhtar 
3891b2e2aec3SKamil Chalupnik 		t_params[used_cores].dev_id = ad->dev_id;
3892b2e2aec3SKamil Chalupnik 		t_params[used_cores].lcore_id = lcore_id;
3893b2e2aec3SKamil Chalupnik 		t_params[used_cores].op_params = op_params;
3894b2e2aec3SKamil Chalupnik 		t_params[used_cores].queue_id = ad->queue_ids[used_cores];
3895b2e2aec3SKamil Chalupnik 		t_params[used_cores].iter_count = 0;
3896f714a188SAmr Mokhtar 
3897b2e2aec3SKamil Chalupnik 		rte_eal_remote_launch(throughput_function,
3898b2e2aec3SKamil Chalupnik 				&t_params[used_cores++], lcore_id);
3899f714a188SAmr Mokhtar 	}
3900f714a188SAmr Mokhtar 
3901*f83f3147SJoyce Kong 	__atomic_store_n(&op_params->sync, SYNC_START, __ATOMIC_RELAXED);
3902b2e2aec3SKamil Chalupnik 	ret = throughput_function(&t_params[0]);
3903f714a188SAmr Mokhtar 
3904cb056611SStephen Hemminger 	/* Main core is always used */
3905b2e2aec3SKamil Chalupnik 	for (used_cores = 1; used_cores < num_lcores; used_cores++)
3906b2e2aec3SKamil Chalupnik 		ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id);
3907f714a188SAmr Mokhtar 
3908f714a188SAmr Mokhtar 	/* Return if test failed */
3909b2e2aec3SKamil Chalupnik 	if (ret) {
3910b2e2aec3SKamil Chalupnik 		rte_free(t_params);
3911f714a188SAmr Mokhtar 		return ret;
3912b2e2aec3SKamil Chalupnik 	}
3913f714a188SAmr Mokhtar 
3914f714a188SAmr Mokhtar 	/* Print throughput if interrupts are disabled and test passed */
3915f714a188SAmr Mokhtar 	if (!intr_enabled) {
3916d819c083SNicolas Chautru 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
3917d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
39180b98d574SKamil Chalupnik 			print_dec_throughput(t_params, num_lcores);
39190b98d574SKamil Chalupnik 		else
39200b98d574SKamil Chalupnik 			print_enc_throughput(t_params, num_lcores);
3921b2e2aec3SKamil Chalupnik 		rte_free(t_params);
3922f714a188SAmr Mokhtar 		return ret;
3923f714a188SAmr Mokhtar 	}
3924f714a188SAmr Mokhtar 
3925f714a188SAmr Mokhtar 	/* In interrupt TC we need to wait for the interrupt callback to deqeue
3926f714a188SAmr Mokhtar 	 * all pending operations. Skip waiting for queues which reported an
3927f714a188SAmr Mokhtar 	 * error using processing_status variable.
3928cb056611SStephen Hemminger 	 * Wait for main lcore operations.
3929f714a188SAmr Mokhtar 	 */
3930b2e2aec3SKamil Chalupnik 	tp = &t_params[0];
3931*f83f3147SJoyce Kong 	while ((__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED) <
3932f714a188SAmr Mokhtar 		op_params->num_to_process) &&
3933*f83f3147SJoyce Kong 		(__atomic_load_n(&tp->processing_status, __ATOMIC_RELAXED) !=
3934f714a188SAmr Mokhtar 		TEST_FAILED))
3935f714a188SAmr Mokhtar 		rte_pause();
3936f714a188SAmr Mokhtar 
3937b2e2aec3SKamil Chalupnik 	tp->ops_per_sec /= TEST_REPETITIONS;
3938b2e2aec3SKamil Chalupnik 	tp->mbps /= TEST_REPETITIONS;
3939*f83f3147SJoyce Kong 	ret |= (int)__atomic_load_n(&tp->processing_status, __ATOMIC_RELAXED);
3940f714a188SAmr Mokhtar 
3941cb056611SStephen Hemminger 	/* Wait for worker lcores operations */
3942b2e2aec3SKamil Chalupnik 	for (used_cores = 1; used_cores < num_lcores; used_cores++) {
3943b2e2aec3SKamil Chalupnik 		tp = &t_params[used_cores];
3944f714a188SAmr Mokhtar 
3945*f83f3147SJoyce Kong 		while ((__atomic_load_n(&tp->nb_dequeued, __ATOMIC_RELAXED) <
3946f714a188SAmr Mokhtar 			op_params->num_to_process) &&
3947*f83f3147SJoyce Kong 			(__atomic_load_n(&tp->processing_status, __ATOMIC_RELAXED) !=
3948f714a188SAmr Mokhtar 			TEST_FAILED))
3949f714a188SAmr Mokhtar 			rte_pause();
3950f714a188SAmr Mokhtar 
3951b2e2aec3SKamil Chalupnik 		tp->ops_per_sec /= TEST_REPETITIONS;
3952b2e2aec3SKamil Chalupnik 		tp->mbps /= TEST_REPETITIONS;
3953*f83f3147SJoyce Kong 		ret |= (int)__atomic_load_n(&tp->processing_status, __ATOMIC_RELAXED);
3954f714a188SAmr Mokhtar 	}
3955f714a188SAmr Mokhtar 
3956f714a188SAmr Mokhtar 	/* Print throughput if test passed */
39570b98d574SKamil Chalupnik 	if (!ret) {
3958d819c083SNicolas Chautru 		if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC ||
3959d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC)
39600b98d574SKamil Chalupnik 			print_dec_throughput(t_params, num_lcores);
3961d819c083SNicolas Chautru 		else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC ||
3962d819c083SNicolas Chautru 				test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC)
39630b98d574SKamil Chalupnik 			print_enc_throughput(t_params, num_lcores);
39640b98d574SKamil Chalupnik 	}
3965b2e2aec3SKamil Chalupnik 
3966b2e2aec3SKamil Chalupnik 	rte_free(t_params);
3967f714a188SAmr Mokhtar 	return ret;
3968f714a188SAmr Mokhtar }
3969f714a188SAmr Mokhtar 
3970f714a188SAmr Mokhtar static int
latency_test_dec(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_dec_op * ref_op,int vector_mask,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * total_time,uint64_t * min_time,uint64_t * max_time)3971864edd69SKamil Chalupnik latency_test_dec(struct rte_mempool *mempool,
3972f714a188SAmr Mokhtar 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
3973f714a188SAmr Mokhtar 		int vector_mask, uint16_t dev_id, uint16_t queue_id,
3974f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
3975864edd69SKamil Chalupnik 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
3976f714a188SAmr Mokhtar {
3977f714a188SAmr Mokhtar 	int ret = TEST_SUCCESS;
3978f714a188SAmr Mokhtar 	uint16_t i, j, dequeued;
3979f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
3980864edd69SKamil Chalupnik 	uint64_t start_time = 0, last_time = 0;
3981f714a188SAmr Mokhtar 
3982f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
3983f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
3984f714a188SAmr Mokhtar 		bool first_time = true;
3985864edd69SKamil Chalupnik 		last_time = 0;
3986f714a188SAmr Mokhtar 
3987f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
3988f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
3989f714a188SAmr Mokhtar 
3990b1bc4217SKamil Chalupnik 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
3991b1bc4217SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
3992b1bc4217SKamil Chalupnik 				"rte_bbdev_dec_op_alloc_bulk() failed");
3993f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
3994f714a188SAmr Mokhtar 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
3995f714a188SAmr Mokhtar 					bufs->inputs,
3996f714a188SAmr Mokhtar 					bufs->hard_outputs,
3997f714a188SAmr Mokhtar 					bufs->soft_outputs,
3998f714a188SAmr Mokhtar 					ref_op);
3999f714a188SAmr Mokhtar 
4000f714a188SAmr Mokhtar 		/* Set counter to validate the ordering */
4001f714a188SAmr Mokhtar 		for (j = 0; j < burst_sz; ++j)
4002f714a188SAmr Mokhtar 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4003f714a188SAmr Mokhtar 
4004f714a188SAmr Mokhtar 		start_time = rte_rdtsc_precise();
4005f714a188SAmr Mokhtar 
4006f714a188SAmr Mokhtar 		enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq],
4007f714a188SAmr Mokhtar 				burst_sz);
4008f714a188SAmr Mokhtar 		TEST_ASSERT(enq == burst_sz,
4009f714a188SAmr Mokhtar 				"Error enqueueing burst, expected %u, got %u",
4010f714a188SAmr Mokhtar 				burst_sz, enq);
4011f714a188SAmr Mokhtar 
4012f714a188SAmr Mokhtar 		/* Dequeue */
4013f714a188SAmr Mokhtar 		do {
4014f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
4015f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
4016f714a188SAmr Mokhtar 			if (likely(first_time && (deq > 0))) {
4017864edd69SKamil Chalupnik 				last_time = rte_rdtsc_precise() - start_time;
4018f714a188SAmr Mokhtar 				first_time = false;
4019f714a188SAmr Mokhtar 			}
4020f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != deq));
4021f714a188SAmr Mokhtar 
4022864edd69SKamil Chalupnik 		*max_time = RTE_MAX(*max_time, last_time);
4023864edd69SKamil Chalupnik 		*min_time = RTE_MIN(*min_time, last_time);
4024864edd69SKamil Chalupnik 		*total_time += last_time;
4025864edd69SKamil Chalupnik 
4026f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4027f714a188SAmr Mokhtar 			ret = validate_dec_op(ops_deq, burst_sz, ref_op,
4028f714a188SAmr Mokhtar 					vector_mask);
4029f714a188SAmr Mokhtar 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4030f714a188SAmr Mokhtar 		}
4031f714a188SAmr Mokhtar 
4032f714a188SAmr Mokhtar 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
4033f714a188SAmr Mokhtar 		dequeued += deq;
4034f714a188SAmr Mokhtar 	}
4035f714a188SAmr Mokhtar 
4036f714a188SAmr Mokhtar 	return i;
4037f714a188SAmr Mokhtar }
4038f714a188SAmr Mokhtar 
40390ab66275SNicolas Chautru /* Test case for latency/validation for LDPC Decoder */
4040f714a188SAmr Mokhtar static int
latency_test_ldpc_dec(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_dec_op * ref_op,int vector_mask,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * total_time,uint64_t * min_time,uint64_t * max_time,bool disable_et)4041d819c083SNicolas Chautru latency_test_ldpc_dec(struct rte_mempool *mempool,
4042d819c083SNicolas Chautru 		struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op,
4043d819c083SNicolas Chautru 		int vector_mask, uint16_t dev_id, uint16_t queue_id,
4044d819c083SNicolas Chautru 		const uint16_t num_to_process, uint16_t burst_sz,
40450ab66275SNicolas Chautru 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time,
40460ab66275SNicolas Chautru 		bool disable_et)
4047d819c083SNicolas Chautru {
4048d819c083SNicolas Chautru 	int ret = TEST_SUCCESS;
4049d819c083SNicolas Chautru 	uint16_t i, j, dequeued;
4050d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4051d819c083SNicolas Chautru 	uint64_t start_time = 0, last_time = 0;
4052335c11fdSNicolas Chautru 	bool extDdr = ldpc_cap_flags &
4053335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
4054d819c083SNicolas Chautru 
4055d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4056d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
4057d819c083SNicolas Chautru 		bool first_time = true;
4058d819c083SNicolas Chautru 		last_time = 0;
4059d819c083SNicolas Chautru 
4060d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
4061d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
4062d819c083SNicolas Chautru 
4063d819c083SNicolas Chautru 		ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
4064d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4065d819c083SNicolas Chautru 				"rte_bbdev_dec_op_alloc_bulk() failed");
4066335c11fdSNicolas Chautru 
4067335c11fdSNicolas Chautru 		/* For latency tests we need to disable early termination */
40680ab66275SNicolas Chautru 		if (disable_et && check_bit(ref_op->ldpc_dec.op_flags,
4069335c11fdSNicolas Chautru 				RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE))
4070335c11fdSNicolas Chautru 			ref_op->ldpc_dec.op_flags -=
4071335c11fdSNicolas Chautru 					RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
4072f41c6e4dSNicolas Chautru 		ref_op->ldpc_dec.iter_max = get_iter_max();
4073335c11fdSNicolas Chautru 		ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max;
4074335c11fdSNicolas Chautru 
4075d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4076d819c083SNicolas Chautru 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
4077d819c083SNicolas Chautru 					bufs->inputs,
4078d819c083SNicolas Chautru 					bufs->hard_outputs,
4079d819c083SNicolas Chautru 					bufs->soft_outputs,
4080d819c083SNicolas Chautru 					bufs->harq_inputs,
4081d819c083SNicolas Chautru 					bufs->harq_outputs,
4082d819c083SNicolas Chautru 					ref_op);
4083d819c083SNicolas Chautru 
4084335c11fdSNicolas Chautru 		if (extDdr)
4085335c11fdSNicolas Chautru 			preload_harq_ddr(dev_id, queue_id, ops_enq,
4086335c11fdSNicolas Chautru 					burst_sz, true);
4087335c11fdSNicolas Chautru 
4088d819c083SNicolas Chautru 		/* Set counter to validate the ordering */
4089d819c083SNicolas Chautru 		for (j = 0; j < burst_sz; ++j)
4090d819c083SNicolas Chautru 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4091d819c083SNicolas Chautru 
4092d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
4093d819c083SNicolas Chautru 
4094d819c083SNicolas Chautru 		enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
4095d819c083SNicolas Chautru 				&ops_enq[enq], burst_sz);
4096d819c083SNicolas Chautru 		TEST_ASSERT(enq == burst_sz,
4097d819c083SNicolas Chautru 				"Error enqueueing burst, expected %u, got %u",
4098d819c083SNicolas Chautru 				burst_sz, enq);
4099d819c083SNicolas Chautru 
4100d819c083SNicolas Chautru 		/* Dequeue */
4101d819c083SNicolas Chautru 		do {
4102d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
4103d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
4104d819c083SNicolas Chautru 			if (likely(first_time && (deq > 0))) {
4105d819c083SNicolas Chautru 				last_time = rte_rdtsc_precise() - start_time;
4106d819c083SNicolas Chautru 				first_time = false;
4107d819c083SNicolas Chautru 			}
4108d819c083SNicolas Chautru 		} while (unlikely(burst_sz != deq));
4109d819c083SNicolas Chautru 
4110d819c083SNicolas Chautru 		*max_time = RTE_MAX(*max_time, last_time);
4111d819c083SNicolas Chautru 		*min_time = RTE_MIN(*min_time, last_time);
4112d819c083SNicolas Chautru 		*total_time += last_time;
4113d819c083SNicolas Chautru 
4114335c11fdSNicolas Chautru 		if (extDdr)
4115335c11fdSNicolas Chautru 			retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz);
4116335c11fdSNicolas Chautru 
4117d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4118d819c083SNicolas Chautru 			ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op,
4119d819c083SNicolas Chautru 					vector_mask);
4120d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4121d819c083SNicolas Chautru 		}
4122d819c083SNicolas Chautru 
4123d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
4124d819c083SNicolas Chautru 		dequeued += deq;
4125d819c083SNicolas Chautru 	}
4126d819c083SNicolas Chautru 	return i;
4127d819c083SNicolas Chautru }
4128d819c083SNicolas Chautru 
4129d819c083SNicolas Chautru static int
latency_test_enc(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_enc_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * total_time,uint64_t * min_time,uint64_t * max_time)4130864edd69SKamil Chalupnik latency_test_enc(struct rte_mempool *mempool,
4131f714a188SAmr Mokhtar 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
4132f714a188SAmr Mokhtar 		uint16_t dev_id, uint16_t queue_id,
4133f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
4134864edd69SKamil Chalupnik 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
4135f714a188SAmr Mokhtar {
4136f714a188SAmr Mokhtar 	int ret = TEST_SUCCESS;
4137f714a188SAmr Mokhtar 	uint16_t i, j, dequeued;
4138f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4139864edd69SKamil Chalupnik 	uint64_t start_time = 0, last_time = 0;
4140f714a188SAmr Mokhtar 
4141f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4142f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
4143f714a188SAmr Mokhtar 		bool first_time = true;
4144864edd69SKamil Chalupnik 		last_time = 0;
4145f714a188SAmr Mokhtar 
4146f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
4147f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
4148f714a188SAmr Mokhtar 
4149b1bc4217SKamil Chalupnik 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
4150b1bc4217SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
4151b1bc4217SKamil Chalupnik 				"rte_bbdev_enc_op_alloc_bulk() failed");
4152f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4153f714a188SAmr Mokhtar 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
4154f714a188SAmr Mokhtar 					bufs->inputs,
4155f714a188SAmr Mokhtar 					bufs->hard_outputs,
4156f714a188SAmr Mokhtar 					ref_op);
4157f714a188SAmr Mokhtar 
4158f714a188SAmr Mokhtar 		/* Set counter to validate the ordering */
4159f714a188SAmr Mokhtar 		for (j = 0; j < burst_sz; ++j)
4160f714a188SAmr Mokhtar 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4161f714a188SAmr Mokhtar 
4162f714a188SAmr Mokhtar 		start_time = rte_rdtsc_precise();
4163f714a188SAmr Mokhtar 
4164f714a188SAmr Mokhtar 		enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq],
4165f714a188SAmr Mokhtar 				burst_sz);
4166f714a188SAmr Mokhtar 		TEST_ASSERT(enq == burst_sz,
4167f714a188SAmr Mokhtar 				"Error enqueueing burst, expected %u, got %u",
4168f714a188SAmr Mokhtar 				burst_sz, enq);
4169f714a188SAmr Mokhtar 
4170f714a188SAmr Mokhtar 		/* Dequeue */
4171f714a188SAmr Mokhtar 		do {
4172f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
4173f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
4174f714a188SAmr Mokhtar 			if (likely(first_time && (deq > 0))) {
4175864edd69SKamil Chalupnik 				last_time += rte_rdtsc_precise() - start_time;
4176f714a188SAmr Mokhtar 				first_time = false;
4177f714a188SAmr Mokhtar 			}
4178f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != deq));
4179f714a188SAmr Mokhtar 
4180864edd69SKamil Chalupnik 		*max_time = RTE_MAX(*max_time, last_time);
4181864edd69SKamil Chalupnik 		*min_time = RTE_MIN(*min_time, last_time);
4182864edd69SKamil Chalupnik 		*total_time += last_time;
4183864edd69SKamil Chalupnik 
4184f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4185f714a188SAmr Mokhtar 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
4186f714a188SAmr Mokhtar 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4187f714a188SAmr Mokhtar 		}
4188f714a188SAmr Mokhtar 
4189f714a188SAmr Mokhtar 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
4190f714a188SAmr Mokhtar 		dequeued += deq;
4191f714a188SAmr Mokhtar 	}
4192f714a188SAmr Mokhtar 
4193f714a188SAmr Mokhtar 	return i;
4194f714a188SAmr Mokhtar }
4195f714a188SAmr Mokhtar 
4196f714a188SAmr Mokhtar static int
latency_test_ldpc_enc(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_enc_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * total_time,uint64_t * min_time,uint64_t * max_time)4197d819c083SNicolas Chautru latency_test_ldpc_enc(struct rte_mempool *mempool,
4198d819c083SNicolas Chautru 		struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op,
4199d819c083SNicolas Chautru 		uint16_t dev_id, uint16_t queue_id,
4200d819c083SNicolas Chautru 		const uint16_t num_to_process, uint16_t burst_sz,
4201d819c083SNicolas Chautru 		uint64_t *total_time, uint64_t *min_time, uint64_t *max_time)
4202d819c083SNicolas Chautru {
4203d819c083SNicolas Chautru 	int ret = TEST_SUCCESS;
4204d819c083SNicolas Chautru 	uint16_t i, j, dequeued;
4205d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4206d819c083SNicolas Chautru 	uint64_t start_time = 0, last_time = 0;
4207d819c083SNicolas Chautru 
4208d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4209d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
4210d819c083SNicolas Chautru 		bool first_time = true;
4211d819c083SNicolas Chautru 		last_time = 0;
4212d819c083SNicolas Chautru 
4213d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
4214d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
4215d819c083SNicolas Chautru 
4216d819c083SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
4217d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4218d819c083SNicolas Chautru 				"rte_bbdev_enc_op_alloc_bulk() failed");
4219d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4220d819c083SNicolas Chautru 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
4221d819c083SNicolas Chautru 					bufs->inputs,
4222d819c083SNicolas Chautru 					bufs->hard_outputs,
4223d819c083SNicolas Chautru 					ref_op);
4224d819c083SNicolas Chautru 
4225d819c083SNicolas Chautru 		/* Set counter to validate the ordering */
4226d819c083SNicolas Chautru 		for (j = 0; j < burst_sz; ++j)
4227d819c083SNicolas Chautru 			ops_enq[j]->opaque_data = (void *)(uintptr_t)j;
4228d819c083SNicolas Chautru 
4229d819c083SNicolas Chautru 		start_time = rte_rdtsc_precise();
4230d819c083SNicolas Chautru 
4231d819c083SNicolas Chautru 		enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
4232d819c083SNicolas Chautru 				&ops_enq[enq], burst_sz);
4233d819c083SNicolas Chautru 		TEST_ASSERT(enq == burst_sz,
4234d819c083SNicolas Chautru 				"Error enqueueing burst, expected %u, got %u",
4235d819c083SNicolas Chautru 				burst_sz, enq);
4236d819c083SNicolas Chautru 
4237d819c083SNicolas Chautru 		/* Dequeue */
4238d819c083SNicolas Chautru 		do {
4239d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
4240d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
4241d819c083SNicolas Chautru 			if (likely(first_time && (deq > 0))) {
4242d819c083SNicolas Chautru 				last_time += rte_rdtsc_precise() - start_time;
4243d819c083SNicolas Chautru 				first_time = false;
4244d819c083SNicolas Chautru 			}
4245d819c083SNicolas Chautru 		} while (unlikely(burst_sz != deq));
4246d819c083SNicolas Chautru 
4247d819c083SNicolas Chautru 		*max_time = RTE_MAX(*max_time, last_time);
4248d819c083SNicolas Chautru 		*min_time = RTE_MIN(*min_time, last_time);
4249d819c083SNicolas Chautru 		*total_time += last_time;
4250d819c083SNicolas Chautru 
4251d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE) {
4252d819c083SNicolas Chautru 			ret = validate_enc_op(ops_deq, burst_sz, ref_op);
4253d819c083SNicolas Chautru 			TEST_ASSERT_SUCCESS(ret, "Validation failed!");
4254d819c083SNicolas Chautru 		}
4255d819c083SNicolas Chautru 
4256d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
4257d819c083SNicolas Chautru 		dequeued += deq;
4258d819c083SNicolas Chautru 	}
4259d819c083SNicolas Chautru 
4260d819c083SNicolas Chautru 	return i;
4261d819c083SNicolas Chautru }
4262d819c083SNicolas Chautru 
42630ab66275SNicolas Chautru /* Common function for running validation and latency test cases */
4264d819c083SNicolas Chautru static int
validation_latency_test(struct active_device * ad,struct test_op_params * op_params,bool latency_flag)42650ab66275SNicolas Chautru validation_latency_test(struct active_device *ad,
42660ab66275SNicolas Chautru 		struct test_op_params *op_params, bool latency_flag)
4267f714a188SAmr Mokhtar {
4268f714a188SAmr Mokhtar 	int iter;
4269f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
4270f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
4271f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
4272f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
4273f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
4274f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
4275864edd69SKamil Chalupnik 	uint64_t total_time, min_time, max_time;
4276f714a188SAmr Mokhtar 	const char *op_type_str;
4277f714a188SAmr Mokhtar 
4278864edd69SKamil Chalupnik 	total_time = max_time = 0;
4279864edd69SKamil Chalupnik 	min_time = UINT64_MAX;
4280864edd69SKamil Chalupnik 
4281f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4282f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
4283f714a188SAmr Mokhtar 
4284f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
4285f714a188SAmr Mokhtar 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4286f714a188SAmr Mokhtar 
4287f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
4288f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
4289f714a188SAmr Mokhtar 
4290d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
42910ab66275SNicolas Chautru 	if (latency_flag)
42920ab66275SNicolas Chautru 		printf("== test: latency\ndev:");
42930ab66275SNicolas Chautru 	else
42940ab66275SNicolas Chautru 		printf("== test: validation\ndev:");
42950ab66275SNicolas Chautru 	printf("%s, burst size: %u, num ops: %u, op type: %s\n",
4296f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
4297f714a188SAmr Mokhtar 
4298f714a188SAmr Mokhtar 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
4299864edd69SKamil Chalupnik 		iter = latency_test_dec(op_params->mp, bufs,
4300f714a188SAmr Mokhtar 				op_params->ref_dec_op, op_params->vector_mask,
4301f714a188SAmr Mokhtar 				ad->dev_id, queue_id, num_to_process,
4302864edd69SKamil Chalupnik 				burst_sz, &total_time, &min_time, &max_time);
4303d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
4304d819c083SNicolas Chautru 		iter = latency_test_ldpc_enc(op_params->mp, bufs,
4305d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
4306d819c083SNicolas Chautru 				num_to_process, burst_sz, &total_time,
4307d819c083SNicolas Chautru 				&min_time, &max_time);
4308d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
4309d819c083SNicolas Chautru 		iter = latency_test_ldpc_dec(op_params->mp, bufs,
4310d819c083SNicolas Chautru 				op_params->ref_dec_op, op_params->vector_mask,
4311d819c083SNicolas Chautru 				ad->dev_id, queue_id, num_to_process,
43120ab66275SNicolas Chautru 				burst_sz, &total_time, &min_time, &max_time,
43130ab66275SNicolas Chautru 				latency_flag);
43140ab66275SNicolas Chautru 	else /* RTE_BBDEV_OP_TURBO_ENC */
4315d819c083SNicolas Chautru 		iter = latency_test_enc(op_params->mp, bufs,
4316d819c083SNicolas Chautru 				op_params->ref_enc_op,
4317d819c083SNicolas Chautru 				ad->dev_id, queue_id,
4318d819c083SNicolas Chautru 				num_to_process, burst_sz, &total_time,
4319d819c083SNicolas Chautru 				&min_time, &max_time);
4320f714a188SAmr Mokhtar 
4321c3aaec26SAmr Mokhtar 	if (iter <= 0)
4322f714a188SAmr Mokhtar 		return TEST_FAILED;
4323f714a188SAmr Mokhtar 
43249fa6ebdeSKamil Chalupnik 	printf("Operation latency:\n"
4325d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
4326d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
4327d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
4328f714a188SAmr Mokhtar 			(double)total_time / (double)iter,
4329f714a188SAmr Mokhtar 			(double)(total_time * 1000000) / (double)iter /
4330864edd69SKamil Chalupnik 			(double)rte_get_tsc_hz(), (double)min_time,
4331864edd69SKamil Chalupnik 			(double)(min_time * 1000000) / (double)rte_get_tsc_hz(),
4332864edd69SKamil Chalupnik 			(double)max_time, (double)(max_time * 1000000) /
4333f714a188SAmr Mokhtar 			(double)rte_get_tsc_hz());
4334f714a188SAmr Mokhtar 
4335f714a188SAmr Mokhtar 	return TEST_SUCCESS;
4336f714a188SAmr Mokhtar }
4337f714a188SAmr Mokhtar 
43380ab66275SNicolas Chautru static int
latency_test(struct active_device * ad,struct test_op_params * op_params)43390ab66275SNicolas Chautru latency_test(struct active_device *ad, struct test_op_params *op_params)
43400ab66275SNicolas Chautru {
43410ab66275SNicolas Chautru 	return validation_latency_test(ad, op_params, true);
43420ab66275SNicolas Chautru }
43430ab66275SNicolas Chautru 
43440ab66275SNicolas Chautru static int
validation_test(struct active_device * ad,struct test_op_params * op_params)43450ab66275SNicolas Chautru validation_test(struct active_device *ad, struct test_op_params *op_params)
43460ab66275SNicolas Chautru {
43470ab66275SNicolas Chautru 	return validation_latency_test(ad, op_params, false);
43480ab66275SNicolas Chautru }
43490ab66275SNicolas Chautru 
4350864edd69SKamil Chalupnik #ifdef RTE_BBDEV_OFFLOAD_COST
4351864edd69SKamil Chalupnik static int
get_bbdev_queue_stats(uint16_t dev_id,uint16_t queue_id,struct rte_bbdev_stats * stats)4352864edd69SKamil Chalupnik get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id,
4353864edd69SKamil Chalupnik 		struct rte_bbdev_stats *stats)
4354864edd69SKamil Chalupnik {
4355864edd69SKamil Chalupnik 	struct rte_bbdev *dev = &rte_bbdev_devices[dev_id];
4356864edd69SKamil Chalupnik 	struct rte_bbdev_stats *q_stats;
4357864edd69SKamil Chalupnik 
4358864edd69SKamil Chalupnik 	if (queue_id >= dev->data->num_queues)
4359864edd69SKamil Chalupnik 		return -1;
4360864edd69SKamil Chalupnik 
4361864edd69SKamil Chalupnik 	q_stats = &dev->data->queues[queue_id].queue_stats;
4362864edd69SKamil Chalupnik 
4363864edd69SKamil Chalupnik 	stats->enqueued_count = q_stats->enqueued_count;
4364864edd69SKamil Chalupnik 	stats->dequeued_count = q_stats->dequeued_count;
4365864edd69SKamil Chalupnik 	stats->enqueue_err_count = q_stats->enqueue_err_count;
4366864edd69SKamil Chalupnik 	stats->dequeue_err_count = q_stats->dequeue_err_count;
43679fa6ebdeSKamil Chalupnik 	stats->acc_offload_cycles = q_stats->acc_offload_cycles;
4368864edd69SKamil Chalupnik 
4369864edd69SKamil Chalupnik 	return 0;
4370864edd69SKamil Chalupnik }
4371864edd69SKamil Chalupnik 
4372f714a188SAmr Mokhtar static int
offload_latency_test_dec(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_dec_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,struct test_time_stats * time_st)4373f714a188SAmr Mokhtar offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs,
4374f714a188SAmr Mokhtar 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
4375f714a188SAmr Mokhtar 		uint16_t queue_id, const uint16_t num_to_process,
4376864edd69SKamil Chalupnik 		uint16_t burst_sz, struct test_time_stats *time_st)
4377f714a188SAmr Mokhtar {
4378864edd69SKamil Chalupnik 	int i, dequeued, ret;
4379f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4380f714a188SAmr Mokhtar 	uint64_t enq_start_time, deq_start_time;
4381864edd69SKamil Chalupnik 	uint64_t enq_sw_last_time, deq_last_time;
4382864edd69SKamil Chalupnik 	struct rte_bbdev_stats stats;
4383f714a188SAmr Mokhtar 
4384f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4385f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
4386f714a188SAmr Mokhtar 
4387f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
4388f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
4389f714a188SAmr Mokhtar 
4390d819c083SNicolas Chautru 		rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
4391f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4392f714a188SAmr Mokhtar 			copy_reference_dec_op(ops_enq, burst_sz, dequeued,
4393f714a188SAmr Mokhtar 					bufs->inputs,
4394f714a188SAmr Mokhtar 					bufs->hard_outputs,
4395f714a188SAmr Mokhtar 					bufs->soft_outputs,
4396f714a188SAmr Mokhtar 					ref_op);
4397f714a188SAmr Mokhtar 
4398864edd69SKamil Chalupnik 		/* Start time meas for enqueue function offload latency */
4399864edd69SKamil Chalupnik 		enq_start_time = rte_rdtsc_precise();
4400f714a188SAmr Mokhtar 		do {
4401f714a188SAmr Mokhtar 			enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id,
4402f714a188SAmr Mokhtar 					&ops_enq[enq], burst_sz - enq);
4403f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != enq));
4404864edd69SKamil Chalupnik 
4405864edd69SKamil Chalupnik 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
4406864edd69SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
4407864edd69SKamil Chalupnik 				"Failed to get stats for queue (%u) of device (%u)",
4408864edd69SKamil Chalupnik 				queue_id, dev_id);
4409864edd69SKamil Chalupnik 
4410864edd69SKamil Chalupnik 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time -
44119fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles;
4412864edd69SKamil Chalupnik 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
4413864edd69SKamil Chalupnik 				enq_sw_last_time);
4414864edd69SKamil Chalupnik 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
4415864edd69SKamil Chalupnik 				enq_sw_last_time);
44169fa6ebdeSKamil Chalupnik 		time_st->enq_sw_total_time += enq_sw_last_time;
4417864edd69SKamil Chalupnik 
44189fa6ebdeSKamil Chalupnik 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
44199fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
44209fa6ebdeSKamil Chalupnik 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
44219fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
44229fa6ebdeSKamil Chalupnik 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
4423f714a188SAmr Mokhtar 
4424d819c083SNicolas Chautru 		/* give time for device to process ops */
44255c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
4426f714a188SAmr Mokhtar 
4427864edd69SKamil Chalupnik 		/* Start time meas for dequeue function offload latency */
4428864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
4429864edd69SKamil Chalupnik 		/* Dequeue one operation */
4430f714a188SAmr Mokhtar 		do {
4431f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
4432f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
4433f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
4434864edd69SKamil Chalupnik 
4435864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4436864edd69SKamil Chalupnik 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
4437864edd69SKamil Chalupnik 				deq_last_time);
4438864edd69SKamil Chalupnik 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
4439864edd69SKamil Chalupnik 				deq_last_time);
44409fa6ebdeSKamil Chalupnik 		time_st->deq_total_time += deq_last_time;
4441864edd69SKamil Chalupnik 
4442864edd69SKamil Chalupnik 		/* Dequeue remaining operations if needed*/
4443864edd69SKamil Chalupnik 		while (burst_sz != deq)
4444864edd69SKamil Chalupnik 			deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id,
4445f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
4446f714a188SAmr Mokhtar 
4447f714a188SAmr Mokhtar 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
4448f714a188SAmr Mokhtar 		dequeued += deq;
4449f714a188SAmr Mokhtar 	}
4450f714a188SAmr Mokhtar 
4451f714a188SAmr Mokhtar 	return i;
4452f714a188SAmr Mokhtar }
4453f714a188SAmr Mokhtar 
4454f714a188SAmr Mokhtar static int
offload_latency_test_ldpc_dec(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_dec_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,struct test_time_stats * time_st)4455d819c083SNicolas Chautru offload_latency_test_ldpc_dec(struct rte_mempool *mempool,
4456d819c083SNicolas Chautru 		struct test_buffers *bufs,
4457d819c083SNicolas Chautru 		struct rte_bbdev_dec_op *ref_op, uint16_t dev_id,
4458d819c083SNicolas Chautru 		uint16_t queue_id, const uint16_t num_to_process,
4459d819c083SNicolas Chautru 		uint16_t burst_sz, struct test_time_stats *time_st)
4460d819c083SNicolas Chautru {
4461d819c083SNicolas Chautru 	int i, dequeued, ret;
4462d819c083SNicolas Chautru 	struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4463d819c083SNicolas Chautru 	uint64_t enq_start_time, deq_start_time;
4464d819c083SNicolas Chautru 	uint64_t enq_sw_last_time, deq_last_time;
4465d819c083SNicolas Chautru 	struct rte_bbdev_stats stats;
4466335c11fdSNicolas Chautru 	bool extDdr = ldpc_cap_flags &
4467335c11fdSNicolas Chautru 			RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
4468d819c083SNicolas Chautru 
4469d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4470d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
4471d819c083SNicolas Chautru 
4472d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
4473d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
4474d819c083SNicolas Chautru 
4475d819c083SNicolas Chautru 		rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz);
4476d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4477d819c083SNicolas Chautru 			copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued,
4478d819c083SNicolas Chautru 					bufs->inputs,
4479d819c083SNicolas Chautru 					bufs->hard_outputs,
4480d819c083SNicolas Chautru 					bufs->soft_outputs,
4481d819c083SNicolas Chautru 					bufs->harq_inputs,
4482d819c083SNicolas Chautru 					bufs->harq_outputs,
4483d819c083SNicolas Chautru 					ref_op);
4484d819c083SNicolas Chautru 
4485335c11fdSNicolas Chautru 		if (extDdr)
4486335c11fdSNicolas Chautru 			preload_harq_ddr(dev_id, queue_id, ops_enq,
4487335c11fdSNicolas Chautru 					burst_sz, true);
4488335c11fdSNicolas Chautru 
4489d819c083SNicolas Chautru 		/* Start time meas for enqueue function offload latency */
4490d819c083SNicolas Chautru 		enq_start_time = rte_rdtsc_precise();
4491d819c083SNicolas Chautru 		do {
4492d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id,
4493d819c083SNicolas Chautru 					&ops_enq[enq], burst_sz - enq);
4494d819c083SNicolas Chautru 		} while (unlikely(burst_sz != enq));
4495d819c083SNicolas Chautru 
4496335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
4497d819c083SNicolas Chautru 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
4498d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4499d819c083SNicolas Chautru 				"Failed to get stats for queue (%u) of device (%u)",
4500d819c083SNicolas Chautru 				queue_id, dev_id);
4501d819c083SNicolas Chautru 
4502335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
4503d819c083SNicolas Chautru 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
4504d819c083SNicolas Chautru 				enq_sw_last_time);
4505d819c083SNicolas Chautru 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
4506d819c083SNicolas Chautru 				enq_sw_last_time);
4507d819c083SNicolas Chautru 		time_st->enq_sw_total_time += enq_sw_last_time;
4508d819c083SNicolas Chautru 
4509d819c083SNicolas Chautru 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
4510d819c083SNicolas Chautru 				stats.acc_offload_cycles);
4511d819c083SNicolas Chautru 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
4512d819c083SNicolas Chautru 				stats.acc_offload_cycles);
4513d819c083SNicolas Chautru 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
4514d819c083SNicolas Chautru 
4515d819c083SNicolas Chautru 		/* give time for device to process ops */
45165c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
4517d819c083SNicolas Chautru 
4518d819c083SNicolas Chautru 		/* Start time meas for dequeue function offload latency */
4519d819c083SNicolas Chautru 		deq_start_time = rte_rdtsc_precise();
4520d819c083SNicolas Chautru 		/* Dequeue one operation */
4521d819c083SNicolas Chautru 		do {
4522d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
4523f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
4524f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
4525d819c083SNicolas Chautru 
4526d819c083SNicolas Chautru 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4527d819c083SNicolas Chautru 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
4528d819c083SNicolas Chautru 				deq_last_time);
4529d819c083SNicolas Chautru 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
4530d819c083SNicolas Chautru 				deq_last_time);
4531d819c083SNicolas Chautru 		time_st->deq_total_time += deq_last_time;
4532d819c083SNicolas Chautru 
4533d819c083SNicolas Chautru 		/* Dequeue remaining operations if needed*/
4534d819c083SNicolas Chautru 		while (burst_sz != deq)
4535335c11fdSNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id,
4536d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
4537d819c083SNicolas Chautru 
4538335c11fdSNicolas Chautru 		if (extDdr) {
4539335c11fdSNicolas Chautru 			/* Read loopback is not thread safe */
4540335c11fdSNicolas Chautru 			retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz);
4541335c11fdSNicolas Chautru 		}
4542335c11fdSNicolas Chautru 
4543d819c083SNicolas Chautru 		rte_bbdev_dec_op_free_bulk(ops_enq, deq);
4544d819c083SNicolas Chautru 		dequeued += deq;
4545d819c083SNicolas Chautru 	}
4546d819c083SNicolas Chautru 
4547d819c083SNicolas Chautru 	return i;
4548d819c083SNicolas Chautru }
4549d819c083SNicolas Chautru 
4550d819c083SNicolas Chautru static int
offload_latency_test_enc(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_enc_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,struct test_time_stats * time_st)4551f714a188SAmr Mokhtar offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs,
4552f714a188SAmr Mokhtar 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
4553f714a188SAmr Mokhtar 		uint16_t queue_id, const uint16_t num_to_process,
4554864edd69SKamil Chalupnik 		uint16_t burst_sz, struct test_time_stats *time_st)
4555f714a188SAmr Mokhtar {
4556864edd69SKamil Chalupnik 	int i, dequeued, ret;
4557f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4558f714a188SAmr Mokhtar 	uint64_t enq_start_time, deq_start_time;
4559864edd69SKamil Chalupnik 	uint64_t enq_sw_last_time, deq_last_time;
4560864edd69SKamil Chalupnik 	struct rte_bbdev_stats stats;
4561f714a188SAmr Mokhtar 
4562f714a188SAmr Mokhtar 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4563f714a188SAmr Mokhtar 		uint16_t enq = 0, deq = 0;
4564f714a188SAmr Mokhtar 
4565f714a188SAmr Mokhtar 		if (unlikely(num_to_process - dequeued < burst_sz))
4566f714a188SAmr Mokhtar 			burst_sz = num_to_process - dequeued;
4567f714a188SAmr Mokhtar 
4568be840d08SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
4569335c11fdSNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4570335c11fdSNicolas Chautru 				"rte_bbdev_enc_op_alloc_bulk() failed");
4571f714a188SAmr Mokhtar 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4572f714a188SAmr Mokhtar 			copy_reference_enc_op(ops_enq, burst_sz, dequeued,
4573f714a188SAmr Mokhtar 					bufs->inputs,
4574f714a188SAmr Mokhtar 					bufs->hard_outputs,
4575f714a188SAmr Mokhtar 					ref_op);
4576f714a188SAmr Mokhtar 
4577864edd69SKamil Chalupnik 		/* Start time meas for enqueue function offload latency */
4578864edd69SKamil Chalupnik 		enq_start_time = rte_rdtsc_precise();
4579f714a188SAmr Mokhtar 		do {
4580f714a188SAmr Mokhtar 			enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id,
4581f714a188SAmr Mokhtar 					&ops_enq[enq], burst_sz - enq);
4582f714a188SAmr Mokhtar 		} while (unlikely(burst_sz != enq));
4583864edd69SKamil Chalupnik 
4584335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
4585335c11fdSNicolas Chautru 
4586864edd69SKamil Chalupnik 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
4587864edd69SKamil Chalupnik 		TEST_ASSERT_SUCCESS(ret,
4588864edd69SKamil Chalupnik 				"Failed to get stats for queue (%u) of device (%u)",
4589864edd69SKamil Chalupnik 				queue_id, dev_id);
4590335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
4591864edd69SKamil Chalupnik 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
4592864edd69SKamil Chalupnik 				enq_sw_last_time);
4593864edd69SKamil Chalupnik 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
4594864edd69SKamil Chalupnik 				enq_sw_last_time);
45959fa6ebdeSKamil Chalupnik 		time_st->enq_sw_total_time += enq_sw_last_time;
4596864edd69SKamil Chalupnik 
45979fa6ebdeSKamil Chalupnik 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
45989fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
45999fa6ebdeSKamil Chalupnik 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
46009fa6ebdeSKamil Chalupnik 				stats.acc_offload_cycles);
46019fa6ebdeSKamil Chalupnik 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
4602f714a188SAmr Mokhtar 
4603d819c083SNicolas Chautru 		/* give time for device to process ops */
46045c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
4605f714a188SAmr Mokhtar 
4606864edd69SKamil Chalupnik 		/* Start time meas for dequeue function offload latency */
4607864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
4608864edd69SKamil Chalupnik 		/* Dequeue one operation */
4609f714a188SAmr Mokhtar 		do {
4610f714a188SAmr Mokhtar 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
4611f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
4612f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
4613864edd69SKamil Chalupnik 
4614864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4615864edd69SKamil Chalupnik 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
4616864edd69SKamil Chalupnik 				deq_last_time);
4617864edd69SKamil Chalupnik 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
4618864edd69SKamil Chalupnik 				deq_last_time);
46199fa6ebdeSKamil Chalupnik 		time_st->deq_total_time += deq_last_time;
4620864edd69SKamil Chalupnik 
4621864edd69SKamil Chalupnik 		while (burst_sz != deq)
4622864edd69SKamil Chalupnik 			deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id,
4623f714a188SAmr Mokhtar 					&ops_deq[deq], burst_sz - deq);
4624f714a188SAmr Mokhtar 
4625f714a188SAmr Mokhtar 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
4626f714a188SAmr Mokhtar 		dequeued += deq;
4627f714a188SAmr Mokhtar 	}
4628f714a188SAmr Mokhtar 
4629f714a188SAmr Mokhtar 	return i;
4630f714a188SAmr Mokhtar }
4631d819c083SNicolas Chautru 
4632d819c083SNicolas Chautru static int
offload_latency_test_ldpc_enc(struct rte_mempool * mempool,struct test_buffers * bufs,struct rte_bbdev_enc_op * ref_op,uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,struct test_time_stats * time_st)4633d819c083SNicolas Chautru offload_latency_test_ldpc_enc(struct rte_mempool *mempool,
4634d819c083SNicolas Chautru 		struct test_buffers *bufs,
4635d819c083SNicolas Chautru 		struct rte_bbdev_enc_op *ref_op, uint16_t dev_id,
4636d819c083SNicolas Chautru 		uint16_t queue_id, const uint16_t num_to_process,
4637d819c083SNicolas Chautru 		uint16_t burst_sz, struct test_time_stats *time_st)
4638d819c083SNicolas Chautru {
4639d819c083SNicolas Chautru 	int i, dequeued, ret;
4640d819c083SNicolas Chautru 	struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST];
4641d819c083SNicolas Chautru 	uint64_t enq_start_time, deq_start_time;
4642d819c083SNicolas Chautru 	uint64_t enq_sw_last_time, deq_last_time;
4643d819c083SNicolas Chautru 	struct rte_bbdev_stats stats;
4644d819c083SNicolas Chautru 
4645d819c083SNicolas Chautru 	for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) {
4646d819c083SNicolas Chautru 		uint16_t enq = 0, deq = 0;
4647d819c083SNicolas Chautru 
4648d819c083SNicolas Chautru 		if (unlikely(num_to_process - dequeued < burst_sz))
4649d819c083SNicolas Chautru 			burst_sz = num_to_process - dequeued;
4650d819c083SNicolas Chautru 
4651be840d08SNicolas Chautru 		ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz);
4652335c11fdSNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4653335c11fdSNicolas Chautru 				"rte_bbdev_enc_op_alloc_bulk() failed");
4654d819c083SNicolas Chautru 		if (test_vector.op_type != RTE_BBDEV_OP_NONE)
4655d819c083SNicolas Chautru 			copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued,
4656d819c083SNicolas Chautru 					bufs->inputs,
4657d819c083SNicolas Chautru 					bufs->hard_outputs,
4658d819c083SNicolas Chautru 					ref_op);
4659d819c083SNicolas Chautru 
4660d819c083SNicolas Chautru 		/* Start time meas for enqueue function offload latency */
4661d819c083SNicolas Chautru 		enq_start_time = rte_rdtsc_precise();
4662d819c083SNicolas Chautru 		do {
4663d819c083SNicolas Chautru 			enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id,
4664d819c083SNicolas Chautru 					&ops_enq[enq], burst_sz - enq);
4665d819c083SNicolas Chautru 		} while (unlikely(burst_sz != enq));
4666d819c083SNicolas Chautru 
4667335c11fdSNicolas Chautru 		enq_sw_last_time = rte_rdtsc_precise() - enq_start_time;
4668d819c083SNicolas Chautru 		ret = get_bbdev_queue_stats(dev_id, queue_id, &stats);
4669d819c083SNicolas Chautru 		TEST_ASSERT_SUCCESS(ret,
4670d819c083SNicolas Chautru 				"Failed to get stats for queue (%u) of device (%u)",
4671d819c083SNicolas Chautru 				queue_id, dev_id);
4672d819c083SNicolas Chautru 
4673335c11fdSNicolas Chautru 		enq_sw_last_time -= stats.acc_offload_cycles;
4674d819c083SNicolas Chautru 		time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time,
4675d819c083SNicolas Chautru 				enq_sw_last_time);
4676d819c083SNicolas Chautru 		time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time,
4677d819c083SNicolas Chautru 				enq_sw_last_time);
4678d819c083SNicolas Chautru 		time_st->enq_sw_total_time += enq_sw_last_time;
4679d819c083SNicolas Chautru 
4680d819c083SNicolas Chautru 		time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time,
4681d819c083SNicolas Chautru 				stats.acc_offload_cycles);
4682d819c083SNicolas Chautru 		time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time,
4683d819c083SNicolas Chautru 				stats.acc_offload_cycles);
4684d819c083SNicolas Chautru 		time_st->enq_acc_total_time += stats.acc_offload_cycles;
4685d819c083SNicolas Chautru 
4686d819c083SNicolas Chautru 		/* give time for device to process ops */
46875c3f7fc5SNicolas Chautru 		rte_delay_us(WAIT_OFFLOAD_US);
4688d819c083SNicolas Chautru 
4689d819c083SNicolas Chautru 		/* Start time meas for dequeue function offload latency */
4690d819c083SNicolas Chautru 		deq_start_time = rte_rdtsc_precise();
4691d819c083SNicolas Chautru 		/* Dequeue one operation */
4692d819c083SNicolas Chautru 		do {
4693d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
4694f32e93b1SNicolas Chautru 					&ops_deq[deq], enq);
4695f32e93b1SNicolas Chautru 		} while (unlikely(deq == 0));
4696d819c083SNicolas Chautru 
4697d819c083SNicolas Chautru 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4698d819c083SNicolas Chautru 		time_st->deq_max_time = RTE_MAX(time_st->deq_max_time,
4699d819c083SNicolas Chautru 				deq_last_time);
4700d819c083SNicolas Chautru 		time_st->deq_min_time = RTE_MIN(time_st->deq_min_time,
4701d819c083SNicolas Chautru 				deq_last_time);
4702d819c083SNicolas Chautru 		time_st->deq_total_time += deq_last_time;
4703d819c083SNicolas Chautru 
4704d819c083SNicolas Chautru 		while (burst_sz != deq)
4705d819c083SNicolas Chautru 			deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id,
4706d819c083SNicolas Chautru 					&ops_deq[deq], burst_sz - deq);
4707d819c083SNicolas Chautru 
4708d819c083SNicolas Chautru 		rte_bbdev_enc_op_free_bulk(ops_enq, deq);
4709d819c083SNicolas Chautru 		dequeued += deq;
4710d819c083SNicolas Chautru 	}
4711d819c083SNicolas Chautru 
4712d819c083SNicolas Chautru 	return i;
4713d819c083SNicolas Chautru }
4714864edd69SKamil Chalupnik #endif
4715f714a188SAmr Mokhtar 
4716f714a188SAmr Mokhtar static int
offload_cost_test(struct active_device * ad,struct test_op_params * op_params)4717864edd69SKamil Chalupnik offload_cost_test(struct active_device *ad,
4718f714a188SAmr Mokhtar 		struct test_op_params *op_params)
4719f714a188SAmr Mokhtar {
4720864edd69SKamil Chalupnik #ifndef RTE_BBDEV_OFFLOAD_COST
4721864edd69SKamil Chalupnik 	RTE_SET_USED(ad);
4722864edd69SKamil Chalupnik 	RTE_SET_USED(op_params);
4723864edd69SKamil Chalupnik 	printf("Offload latency test is disabled.\n");
4724864edd69SKamil Chalupnik 	printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n");
4725864edd69SKamil Chalupnik 	return TEST_SKIPPED;
4726864edd69SKamil Chalupnik #else
4727f714a188SAmr Mokhtar 	int iter;
4728f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
4729f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
4730f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
4731f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
4732f714a188SAmr Mokhtar 	struct test_buffers *bufs = NULL;
4733f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
4734f714a188SAmr Mokhtar 	const char *op_type_str;
4735864edd69SKamil Chalupnik 	struct test_time_stats time_st;
4736864edd69SKamil Chalupnik 
4737864edd69SKamil Chalupnik 	memset(&time_st, 0, sizeof(struct test_time_stats));
4738864edd69SKamil Chalupnik 	time_st.enq_sw_min_time = UINT64_MAX;
47399fa6ebdeSKamil Chalupnik 	time_st.enq_acc_min_time = UINT64_MAX;
4740864edd69SKamil Chalupnik 	time_st.deq_min_time = UINT64_MAX;
4741f714a188SAmr Mokhtar 
4742f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4743f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
4744f714a188SAmr Mokhtar 
4745f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
4746f714a188SAmr Mokhtar 	bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id];
4747f714a188SAmr Mokhtar 
4748f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
4749f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
4750f714a188SAmr Mokhtar 
4751d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
4752d819c083SNicolas Chautru 	printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
4753f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
4754f714a188SAmr Mokhtar 
4755f714a188SAmr Mokhtar 	if (op_type == RTE_BBDEV_OP_TURBO_DEC)
4756f714a188SAmr Mokhtar 		iter = offload_latency_test_dec(op_params->mp, bufs,
4757f714a188SAmr Mokhtar 				op_params->ref_dec_op, ad->dev_id, queue_id,
4758864edd69SKamil Chalupnik 				num_to_process, burst_sz, &time_st);
4759d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_TURBO_ENC)
4760d819c083SNicolas Chautru 		iter = offload_latency_test_enc(op_params->mp, bufs,
4761d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
4762d819c083SNicolas Chautru 				num_to_process, burst_sz, &time_st);
4763d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_ENC)
4764d819c083SNicolas Chautru 		iter = offload_latency_test_ldpc_enc(op_params->mp, bufs,
4765d819c083SNicolas Chautru 				op_params->ref_enc_op, ad->dev_id, queue_id,
4766d819c083SNicolas Chautru 				num_to_process, burst_sz, &time_st);
4767d819c083SNicolas Chautru 	else if (op_type == RTE_BBDEV_OP_LDPC_DEC)
4768d819c083SNicolas Chautru 		iter = offload_latency_test_ldpc_dec(op_params->mp, bufs,
4769d819c083SNicolas Chautru 			op_params->ref_dec_op, ad->dev_id, queue_id,
4770d819c083SNicolas Chautru 			num_to_process, burst_sz, &time_st);
4771f714a188SAmr Mokhtar 	else
4772f714a188SAmr Mokhtar 		iter = offload_latency_test_enc(op_params->mp, bufs,
4773f714a188SAmr Mokhtar 				op_params->ref_enc_op, ad->dev_id, queue_id,
4774864edd69SKamil Chalupnik 				num_to_process, burst_sz, &time_st);
4775f714a188SAmr Mokhtar 
4776c3aaec26SAmr Mokhtar 	if (iter <= 0)
4777f714a188SAmr Mokhtar 		return TEST_FAILED;
4778f714a188SAmr Mokhtar 
4779d819c083SNicolas Chautru 	printf("Enqueue driver offload cost latency:\n"
4780d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
4781d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
4782d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n"
4783d819c083SNicolas Chautru 			"Enqueue accelerator offload cost latency:\n"
4784d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
4785d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
4786d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
47879fa6ebdeSKamil Chalupnik 			(double)time_st.enq_sw_total_time / (double)iter,
47889fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_sw_total_time * 1000000) /
4789864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
4790864edd69SKamil Chalupnik 			(double)time_st.enq_sw_min_time,
4791864edd69SKamil Chalupnik 			(double)(time_st.enq_sw_min_time * 1000000) /
4792864edd69SKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_sw_max_time,
4793864edd69SKamil Chalupnik 			(double)(time_st.enq_sw_max_time * 1000000) /
47949fa6ebdeSKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_acc_total_time /
4795864edd69SKamil Chalupnik 			(double)iter,
47969fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_total_time * 1000000) /
4797864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
47989fa6ebdeSKamil Chalupnik 			(double)time_st.enq_acc_min_time,
47999fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_min_time * 1000000) /
48009fa6ebdeSKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.enq_acc_max_time,
48019fa6ebdeSKamil Chalupnik 			(double)(time_st.enq_acc_max_time * 1000000) /
4802864edd69SKamil Chalupnik 			rte_get_tsc_hz());
4803f714a188SAmr Mokhtar 
48049fa6ebdeSKamil Chalupnik 	printf("Dequeue offload cost latency - one op:\n"
4805d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
4806d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
4807d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
48089fa6ebdeSKamil Chalupnik 			(double)time_st.deq_total_time / (double)iter,
48099fa6ebdeSKamil Chalupnik 			(double)(time_st.deq_total_time * 1000000) /
4810864edd69SKamil Chalupnik 			(double)iter / (double)rte_get_tsc_hz(),
4811864edd69SKamil Chalupnik 			(double)time_st.deq_min_time,
4812864edd69SKamil Chalupnik 			(double)(time_st.deq_min_time * 1000000) /
4813864edd69SKamil Chalupnik 			rte_get_tsc_hz(), (double)time_st.deq_max_time,
4814864edd69SKamil Chalupnik 			(double)(time_st.deq_max_time * 1000000) /
4815864edd69SKamil Chalupnik 			rte_get_tsc_hz());
4816f714a188SAmr Mokhtar 
4817c2560435SNicolas Chautru 	struct rte_bbdev_stats stats = {0};
4818c2560435SNicolas Chautru 	get_bbdev_queue_stats(ad->dev_id, queue_id, &stats);
4819c2560435SNicolas Chautru 	if (op_type != RTE_BBDEV_OP_LDPC_DEC) {
4820c2560435SNicolas Chautru 		TEST_ASSERT_SUCCESS(stats.enqueued_count != num_to_process,
4821c2560435SNicolas Chautru 				"Mismatch in enqueue count %10"PRIu64" %d",
4822c2560435SNicolas Chautru 				stats.enqueued_count, num_to_process);
4823c2560435SNicolas Chautru 		TEST_ASSERT_SUCCESS(stats.dequeued_count != num_to_process,
4824c2560435SNicolas Chautru 				"Mismatch in dequeue count %10"PRIu64" %d",
4825c2560435SNicolas Chautru 				stats.dequeued_count, num_to_process);
4826c2560435SNicolas Chautru 	}
4827c2560435SNicolas Chautru 	TEST_ASSERT_SUCCESS(stats.enqueue_err_count != 0,
4828c2560435SNicolas Chautru 			"Enqueue count Error %10"PRIu64"",
4829c2560435SNicolas Chautru 			stats.enqueue_err_count);
4830c2560435SNicolas Chautru 	TEST_ASSERT_SUCCESS(stats.dequeue_err_count != 0,
4831c2560435SNicolas Chautru 			"Dequeue count Error (%10"PRIu64"",
4832c2560435SNicolas Chautru 			stats.dequeue_err_count);
4833c2560435SNicolas Chautru 
4834f714a188SAmr Mokhtar 	return TEST_SUCCESS;
4835864edd69SKamil Chalupnik #endif
4836f714a188SAmr Mokhtar }
4837f714a188SAmr Mokhtar 
4838864edd69SKamil Chalupnik #ifdef RTE_BBDEV_OFFLOAD_COST
4839f714a188SAmr Mokhtar static int
offload_latency_empty_q_test_dec(uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * deq_total_time,uint64_t * deq_min_time,uint64_t * deq_max_time,const enum rte_bbdev_op_type op_type)4840f714a188SAmr Mokhtar offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id,
4841f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
48429fa6ebdeSKamil Chalupnik 		uint64_t *deq_total_time, uint64_t *deq_min_time,
48436e024c4bSNicolas Chautru 		uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type)
4844f714a188SAmr Mokhtar {
4845f714a188SAmr Mokhtar 	int i, deq_total;
4846f714a188SAmr Mokhtar 	struct rte_bbdev_dec_op *ops[MAX_BURST];
4847864edd69SKamil Chalupnik 	uint64_t deq_start_time, deq_last_time;
4848f714a188SAmr Mokhtar 
4849f714a188SAmr Mokhtar 	/* Test deq offload latency from an empty queue */
4850864edd69SKamil Chalupnik 
4851f714a188SAmr Mokhtar 	for (i = 0, deq_total = 0; deq_total < num_to_process;
4852f714a188SAmr Mokhtar 			++i, deq_total += burst_sz) {
4853864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
4854864edd69SKamil Chalupnik 
4855f714a188SAmr Mokhtar 		if (unlikely(num_to_process - deq_total < burst_sz))
4856f714a188SAmr Mokhtar 			burst_sz = num_to_process - deq_total;
48576e024c4bSNicolas Chautru 		if (op_type == RTE_BBDEV_OP_LDPC_DEC)
48586e024c4bSNicolas Chautru 			rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops,
48596e024c4bSNicolas Chautru 					burst_sz);
48606e024c4bSNicolas Chautru 		else
48616e024c4bSNicolas Chautru 			rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops,
48626e024c4bSNicolas Chautru 					burst_sz);
4863864edd69SKamil Chalupnik 
4864864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4865864edd69SKamil Chalupnik 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
4866864edd69SKamil Chalupnik 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
48679fa6ebdeSKamil Chalupnik 		*deq_total_time += deq_last_time;
4868f714a188SAmr Mokhtar 	}
4869f714a188SAmr Mokhtar 
4870f714a188SAmr Mokhtar 	return i;
4871f714a188SAmr Mokhtar }
4872f714a188SAmr Mokhtar 
4873f714a188SAmr Mokhtar static int
offload_latency_empty_q_test_enc(uint16_t dev_id,uint16_t queue_id,const uint16_t num_to_process,uint16_t burst_sz,uint64_t * deq_total_time,uint64_t * deq_min_time,uint64_t * deq_max_time,const enum rte_bbdev_op_type op_type)4874f714a188SAmr Mokhtar offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id,
4875f714a188SAmr Mokhtar 		const uint16_t num_to_process, uint16_t burst_sz,
48769fa6ebdeSKamil Chalupnik 		uint64_t *deq_total_time, uint64_t *deq_min_time,
48776e024c4bSNicolas Chautru 		uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type)
4878f714a188SAmr Mokhtar {
4879f714a188SAmr Mokhtar 	int i, deq_total;
4880f714a188SAmr Mokhtar 	struct rte_bbdev_enc_op *ops[MAX_BURST];
4881864edd69SKamil Chalupnik 	uint64_t deq_start_time, deq_last_time;
4882f714a188SAmr Mokhtar 
4883f714a188SAmr Mokhtar 	/* Test deq offload latency from an empty queue */
4884f714a188SAmr Mokhtar 	for (i = 0, deq_total = 0; deq_total < num_to_process;
4885f714a188SAmr Mokhtar 			++i, deq_total += burst_sz) {
4886864edd69SKamil Chalupnik 		deq_start_time = rte_rdtsc_precise();
4887864edd69SKamil Chalupnik 
4888f714a188SAmr Mokhtar 		if (unlikely(num_to_process - deq_total < burst_sz))
4889f714a188SAmr Mokhtar 			burst_sz = num_to_process - deq_total;
48906e024c4bSNicolas Chautru 		if (op_type == RTE_BBDEV_OP_LDPC_ENC)
48916e024c4bSNicolas Chautru 			rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops,
48926e024c4bSNicolas Chautru 					burst_sz);
48936e024c4bSNicolas Chautru 		else
48946e024c4bSNicolas Chautru 			rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops,
48956e024c4bSNicolas Chautru 					burst_sz);
4896864edd69SKamil Chalupnik 
4897864edd69SKamil Chalupnik 		deq_last_time = rte_rdtsc_precise() - deq_start_time;
4898864edd69SKamil Chalupnik 		*deq_max_time = RTE_MAX(*deq_max_time, deq_last_time);
4899864edd69SKamil Chalupnik 		*deq_min_time = RTE_MIN(*deq_min_time, deq_last_time);
49009fa6ebdeSKamil Chalupnik 		*deq_total_time += deq_last_time;
4901f714a188SAmr Mokhtar 	}
4902f714a188SAmr Mokhtar 
4903f714a188SAmr Mokhtar 	return i;
4904f714a188SAmr Mokhtar }
49056e024c4bSNicolas Chautru 
4906864edd69SKamil Chalupnik #endif
4907f714a188SAmr Mokhtar 
4908f714a188SAmr Mokhtar static int
offload_latency_empty_q_test(struct active_device * ad,struct test_op_params * op_params)4909f714a188SAmr Mokhtar offload_latency_empty_q_test(struct active_device *ad,
4910f714a188SAmr Mokhtar 		struct test_op_params *op_params)
4911f714a188SAmr Mokhtar {
4912864edd69SKamil Chalupnik #ifndef RTE_BBDEV_OFFLOAD_COST
4913864edd69SKamil Chalupnik 	RTE_SET_USED(ad);
4914864edd69SKamil Chalupnik 	RTE_SET_USED(op_params);
4915864edd69SKamil Chalupnik 	printf("Offload latency empty dequeue test is disabled.\n");
4916864edd69SKamil Chalupnik 	printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n");
4917864edd69SKamil Chalupnik 	return TEST_SKIPPED;
4918864edd69SKamil Chalupnik #else
4919f714a188SAmr Mokhtar 	int iter;
49209fa6ebdeSKamil Chalupnik 	uint64_t deq_total_time, deq_min_time, deq_max_time;
4921f714a188SAmr Mokhtar 	uint16_t burst_sz = op_params->burst_sz;
4922f714a188SAmr Mokhtar 	const uint16_t num_to_process = op_params->num_to_process;
4923f714a188SAmr Mokhtar 	const enum rte_bbdev_op_type op_type = test_vector.op_type;
4924f714a188SAmr Mokhtar 	const uint16_t queue_id = ad->queue_ids[0];
4925f714a188SAmr Mokhtar 	struct rte_bbdev_info info;
4926f714a188SAmr Mokhtar 	const char *op_type_str;
4927f714a188SAmr Mokhtar 
49289fa6ebdeSKamil Chalupnik 	deq_total_time = deq_max_time = 0;
4929864edd69SKamil Chalupnik 	deq_min_time = UINT64_MAX;
4930864edd69SKamil Chalupnik 
4931f714a188SAmr Mokhtar 	TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST),
4932f714a188SAmr Mokhtar 			"BURST_SIZE should be <= %u", MAX_BURST);
4933f714a188SAmr Mokhtar 
4934f714a188SAmr Mokhtar 	rte_bbdev_info_get(ad->dev_id, &info);
4935f714a188SAmr Mokhtar 
4936f714a188SAmr Mokhtar 	op_type_str = rte_bbdev_op_type_str(op_type);
4937f714a188SAmr Mokhtar 	TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type);
4938f714a188SAmr Mokhtar 
4939d819c083SNicolas Chautru 	printf("+ ------------------------------------------------------- +\n");
4940d819c083SNicolas Chautru 	printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n",
4941f714a188SAmr Mokhtar 			info.dev_name, burst_sz, num_to_process, op_type_str);
4942f714a188SAmr Mokhtar 
49436e024c4bSNicolas Chautru 	if (op_type == RTE_BBDEV_OP_TURBO_DEC ||
49446e024c4bSNicolas Chautru 			op_type == RTE_BBDEV_OP_LDPC_DEC)
4945f714a188SAmr Mokhtar 		iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id,
49469fa6ebdeSKamil Chalupnik 				num_to_process, burst_sz, &deq_total_time,
49476e024c4bSNicolas Chautru 				&deq_min_time, &deq_max_time, op_type);
4948f714a188SAmr Mokhtar 	else
4949f714a188SAmr Mokhtar 		iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id,
49509fa6ebdeSKamil Chalupnik 				num_to_process, burst_sz, &deq_total_time,
49516e024c4bSNicolas Chautru 				&deq_min_time, &deq_max_time, op_type);
4952f714a188SAmr Mokhtar 
4953c3aaec26SAmr Mokhtar 	if (iter <= 0)
4954f714a188SAmr Mokhtar 		return TEST_FAILED;
4955f714a188SAmr Mokhtar 
4956d819c083SNicolas Chautru 	printf("Empty dequeue offload:\n"
4957d819c083SNicolas Chautru 			"\tavg: %lg cycles, %lg us\n"
4958d819c083SNicolas Chautru 			"\tmin: %lg cycles, %lg us\n"
4959d819c083SNicolas Chautru 			"\tmax: %lg cycles, %lg us\n",
49609fa6ebdeSKamil Chalupnik 			(double)deq_total_time / (double)iter,
49619fa6ebdeSKamil Chalupnik 			(double)(deq_total_time * 1000000) / (double)iter /
4962864edd69SKamil Chalupnik 			(double)rte_get_tsc_hz(), (double)deq_min_time,
4963864edd69SKamil Chalupnik 			(double)(deq_min_time * 1000000) / rte_get_tsc_hz(),
4964864edd69SKamil Chalupnik 			(double)deq_max_time, (double)(deq_max_time * 1000000) /
4965864edd69SKamil Chalupnik 			rte_get_tsc_hz());
4966f714a188SAmr Mokhtar 
4967f714a188SAmr Mokhtar 	return TEST_SUCCESS;
4968864edd69SKamil Chalupnik #endif
4969f714a188SAmr Mokhtar }
4970f714a188SAmr Mokhtar 
4971f714a188SAmr Mokhtar static int
bler_tc(void)4972f41c6e4dSNicolas Chautru bler_tc(void)
4973f41c6e4dSNicolas Chautru {
4974f41c6e4dSNicolas Chautru 	return run_test_case(bler_test);
4975f41c6e4dSNicolas Chautru }
4976f41c6e4dSNicolas Chautru 
4977f41c6e4dSNicolas Chautru static int
throughput_tc(void)4978f714a188SAmr Mokhtar throughput_tc(void)
4979f714a188SAmr Mokhtar {
4980f714a188SAmr Mokhtar 	return run_test_case(throughput_test);
4981f714a188SAmr Mokhtar }
4982f714a188SAmr Mokhtar 
4983f714a188SAmr Mokhtar static int
offload_cost_tc(void)4984864edd69SKamil Chalupnik offload_cost_tc(void)
4985f714a188SAmr Mokhtar {
4986864edd69SKamil Chalupnik 	return run_test_case(offload_cost_test);
4987f714a188SAmr Mokhtar }
4988f714a188SAmr Mokhtar 
4989f714a188SAmr Mokhtar static int
offload_latency_empty_q_tc(void)4990f714a188SAmr Mokhtar offload_latency_empty_q_tc(void)
4991f714a188SAmr Mokhtar {
4992f714a188SAmr Mokhtar 	return run_test_case(offload_latency_empty_q_test);
4993f714a188SAmr Mokhtar }
4994f714a188SAmr Mokhtar 
4995f714a188SAmr Mokhtar static int
latency_tc(void)4996864edd69SKamil Chalupnik latency_tc(void)
4997f714a188SAmr Mokhtar {
4998864edd69SKamil Chalupnik 	return run_test_case(latency_test);
4999f714a188SAmr Mokhtar }
5000f714a188SAmr Mokhtar 
5001f714a188SAmr Mokhtar static int
validation_tc(void)50020ab66275SNicolas Chautru validation_tc(void)
50030ab66275SNicolas Chautru {
50040ab66275SNicolas Chautru 	return run_test_case(validation_test);
50050ab66275SNicolas Chautru }
50060ab66275SNicolas Chautru 
50070ab66275SNicolas Chautru static int
interrupt_tc(void)5008f714a188SAmr Mokhtar interrupt_tc(void)
5009f714a188SAmr Mokhtar {
5010f714a188SAmr Mokhtar 	return run_test_case(throughput_test);
5011f714a188SAmr Mokhtar }
5012f714a188SAmr Mokhtar 
5013f41c6e4dSNicolas Chautru static struct unit_test_suite bbdev_bler_testsuite = {
5014f41c6e4dSNicolas Chautru 	.suite_name = "BBdev BLER Tests",
5015f41c6e4dSNicolas Chautru 	.setup = testsuite_setup,
5016f41c6e4dSNicolas Chautru 	.teardown = testsuite_teardown,
5017f41c6e4dSNicolas Chautru 	.unit_test_cases = {
5018f41c6e4dSNicolas Chautru 		TEST_CASE_ST(ut_setup, ut_teardown, bler_tc),
5019f41c6e4dSNicolas Chautru 		TEST_CASES_END() /**< NULL terminate unit test array */
5020f41c6e4dSNicolas Chautru 	}
5021f41c6e4dSNicolas Chautru };
5022f41c6e4dSNicolas Chautru 
5023f714a188SAmr Mokhtar static struct unit_test_suite bbdev_throughput_testsuite = {
5024f714a188SAmr Mokhtar 	.suite_name = "BBdev Throughput Tests",
5025f714a188SAmr Mokhtar 	.setup = testsuite_setup,
5026f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
5027f714a188SAmr Mokhtar 	.unit_test_cases = {
5028f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc),
5029f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
5030f714a188SAmr Mokhtar 	}
5031f714a188SAmr Mokhtar };
5032f714a188SAmr Mokhtar 
5033f714a188SAmr Mokhtar static struct unit_test_suite bbdev_validation_testsuite = {
5034f714a188SAmr Mokhtar 	.suite_name = "BBdev Validation Tests",
5035f714a188SAmr Mokhtar 	.setup = testsuite_setup,
5036f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
5037f714a188SAmr Mokhtar 	.unit_test_cases = {
50380ab66275SNicolas Chautru 		TEST_CASE_ST(ut_setup, ut_teardown, validation_tc),
5039f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
5040f714a188SAmr Mokhtar 	}
5041f714a188SAmr Mokhtar };
5042f714a188SAmr Mokhtar 
5043f714a188SAmr Mokhtar static struct unit_test_suite bbdev_latency_testsuite = {
5044f714a188SAmr Mokhtar 	.suite_name = "BBdev Latency Tests",
5045f714a188SAmr Mokhtar 	.setup = testsuite_setup,
5046f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
5047f714a188SAmr Mokhtar 	.unit_test_cases = {
5048864edd69SKamil Chalupnik 		TEST_CASE_ST(ut_setup, ut_teardown, latency_tc),
5049864edd69SKamil Chalupnik 		TEST_CASES_END() /**< NULL terminate unit test array */
5050864edd69SKamil Chalupnik 	}
5051864edd69SKamil Chalupnik };
5052864edd69SKamil Chalupnik 
5053864edd69SKamil Chalupnik static struct unit_test_suite bbdev_offload_cost_testsuite = {
5054864edd69SKamil Chalupnik 	.suite_name = "BBdev Offload Cost Tests",
5055864edd69SKamil Chalupnik 	.setup = testsuite_setup,
5056864edd69SKamil Chalupnik 	.teardown = testsuite_teardown,
5057864edd69SKamil Chalupnik 	.unit_test_cases = {
5058864edd69SKamil Chalupnik 		TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc),
5059f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc),
5060f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
5061f714a188SAmr Mokhtar 	}
5062f714a188SAmr Mokhtar };
5063f714a188SAmr Mokhtar 
5064f714a188SAmr Mokhtar static struct unit_test_suite bbdev_interrupt_testsuite = {
5065f714a188SAmr Mokhtar 	.suite_name = "BBdev Interrupt Tests",
5066f714a188SAmr Mokhtar 	.setup = interrupt_testsuite_setup,
5067f714a188SAmr Mokhtar 	.teardown = testsuite_teardown,
5068f714a188SAmr Mokhtar 	.unit_test_cases = {
5069f714a188SAmr Mokhtar 		TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc),
5070f714a188SAmr Mokhtar 		TEST_CASES_END() /**< NULL terminate unit test array */
5071f714a188SAmr Mokhtar 	}
5072f714a188SAmr Mokhtar };
5073f714a188SAmr Mokhtar 
5074f41c6e4dSNicolas Chautru REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite);
5075f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite);
5076f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite);
5077f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite);
5078864edd69SKamil Chalupnik REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite);
5079f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite);
5080