xref: /dpdk/app/test-bbdev/test_bbdev_vector.c (revision 10b71caecbe1cddcbb65c050ca775fba575e88db)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4 
5 #ifdef RTE_EXEC_ENV_FREEBSD
6 	#define _WITH_GETLINE
7 #endif
8 #include <stdio.h>
9 #include <stdbool.h>
10 #include <rte_malloc.h>
11 
12 #include "test_bbdev_vector.h"
13 
14 #define VALUE_DELIMITER ","
15 #define ENTRY_DELIMITER "="
16 
17 const char *op_data_prefixes[] = {
18 	"input",
19 	"soft_output",
20 	"hard_output",
21 	"harq_input",
22 	"harq_output",
23 };
24 
25 /* trim leading and trailing spaces */
26 static void
27 trim_space(char *str)
28 {
29 	char *start, *end;
30 
31 	for (start = str; *start; start++) {
32 		if (!isspace((unsigned char) start[0]))
33 			break;
34 	}
35 
36 	for (end = start + strlen(start); end > start + 1; end--) {
37 		if (!isspace((unsigned char) end[-1]))
38 			break;
39 	}
40 
41 	*end = 0;
42 
43 	/* Shift from "start" to the beginning of the string */
44 	if (start > str)
45 		memmove(str, start, (end - start) + 1);
46 }
47 
48 static bool
49 starts_with(const char *str, const char *pre)
50 {
51 	return strncmp(pre, str, strlen(pre)) == 0;
52 }
53 
54 /* tokenization test values separated by a comma */
55 static int
56 parse_values(char *tokens, uint32_t **data, uint32_t *data_length)
57 {
58 	uint32_t n_tokens = 0;
59 	uint32_t data_size = 32;
60 
61 	uint32_t *values, *values_resized;
62 	char *tok, *error = NULL;
63 
64 	tok = strtok(tokens, VALUE_DELIMITER);
65 	if (tok == NULL)
66 		return -1;
67 
68 	values = (uint32_t *)
69 			rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0);
70 	if (values == NULL)
71 		return -1;
72 
73 	while (tok != NULL) {
74 		values_resized = NULL;
75 
76 		if (n_tokens >= data_size) {
77 			data_size *= 2;
78 
79 			values_resized = (uint32_t *) rte_realloc(values,
80 				sizeof(uint32_t) * data_size, 0);
81 			if (values_resized == NULL) {
82 				rte_free(values);
83 				return -1;
84 			}
85 			values = values_resized;
86 		}
87 
88 		values[n_tokens] = (uint32_t) strtoul(tok, &error, 0);
89 
90 		if ((error == NULL) || (*error != '\0')) {
91 			printf("Failed with convert '%s'\n", tok);
92 			rte_free(values);
93 			return -1;
94 		}
95 
96 		*data_length = *data_length + (strlen(tok) - strlen("0x"))/2;
97 
98 		tok = strtok(NULL, VALUE_DELIMITER);
99 		if (tok == NULL)
100 			break;
101 
102 		n_tokens++;
103 	}
104 
105 	values_resized = (uint32_t *) rte_realloc(values,
106 		sizeof(uint32_t) * (n_tokens + 1), 0);
107 
108 	if (values_resized == NULL) {
109 		rte_free(values);
110 		return -1;
111 	}
112 
113 	*data = values_resized;
114 
115 	return 0;
116 }
117 
118 /* convert turbo decoder flag from string to unsigned long int*/
119 static int
120 op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
121 {
122 	if (!strcmp(token, "RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE"))
123 		*op_flag_value = RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE;
124 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_TYPE_24B"))
125 		*op_flag_value = RTE_BBDEV_TURBO_CRC_TYPE_24B;
126 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EQUALIZER"))
127 		*op_flag_value = RTE_BBDEV_TURBO_EQUALIZER;
128 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUT_SATURATE"))
129 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUT_SATURATE;
130 	else if (!strcmp(token, "RTE_BBDEV_TURBO_HALF_ITERATION_EVEN"))
131 		*op_flag_value = RTE_BBDEV_TURBO_HALF_ITERATION_EVEN;
132 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH"))
133 		*op_flag_value = RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH;
134 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUTPUT"))
135 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUTPUT;
136 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EARLY_TERMINATION"))
137 		*op_flag_value = RTE_BBDEV_TURBO_EARLY_TERMINATION;
138 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN"))
139 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN;
140 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN"))
141 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
142 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT"))
143 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
144 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT"))
145 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
146 	else if (!strcmp(token, "RTE_BBDEV_TURBO_MAP_DEC"))
147 		*op_flag_value = RTE_BBDEV_TURBO_MAP_DEC;
148 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_SCATTER_GATHER"))
149 		*op_flag_value = RTE_BBDEV_TURBO_DEC_SCATTER_GATHER;
150 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP"))
151 		*op_flag_value = RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP;
152 	else {
153 		printf("The given value is not a turbo decoder flag\n");
154 		return -1;
155 	}
156 
157 	return 0;
158 }
159 
160 /* convert LDPC flag from string to unsigned long int*/
161 static int
162 op_ldpc_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
163 {
164 	if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK"))
165 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK;
166 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK"))
167 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK;
168 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP"))
169 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP;
170 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS"))
171 		*op_flag_value = RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS;
172 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE"))
173 		*op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
174 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE"))
175 		*op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
176 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DECODE_BYPASS"))
177 		*op_flag_value = RTE_BBDEV_LDPC_DECODE_BYPASS;
178 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_ENABLE"))
179 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_ENABLE;
180 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS"))
181 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS;
182 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS"))
183 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS;
184 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE"))
185 		*op_flag_value = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
186 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_INTERRUPTS"))
187 		*op_flag_value = RTE_BBDEV_LDPC_DEC_INTERRUPTS;
188 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_SCATTER_GATHER"))
189 		*op_flag_value = RTE_BBDEV_LDPC_DEC_SCATTER_GATHER;
190 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION"))
191 		*op_flag_value = RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
192 	else if (!strcmp(token, "RTE_BBDEV_LDPC_LLR_COMPRESSION"))
193 		*op_flag_value = RTE_BBDEV_LDPC_LLR_COMPRESSION;
194 	else if (!strcmp(token,
195 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE"))
196 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
197 	else if (!strcmp(token,
198 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE"))
199 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
200 	else if (!strcmp(token,
201 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK"))
202 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
203 	else {
204 		printf("The given value is not a LDPC decoder flag\n");
205 		return -1;
206 	}
207 
208 	return 0;
209 }
210 
211 /* convert turbo encoder flag from string to unsigned long int*/
212 static int
213 op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
214 {
215 	if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS"))
216 		*op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS;
217 	else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH"))
218 		*op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH;
219 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH"))
220 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH;
221 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH"))
222 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH;
223 	else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER"))
224 		*op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER;
225 	else {
226 		printf("The given value is not a turbo encoder flag\n");
227 		return -1;
228 	}
229 
230 	return 0;
231 }
232 
233 /* convert LDPC encoder flag from string to unsigned long int*/
234 static int
235 op_ldpc_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
236 {
237 	if (!strcmp(token, "RTE_BBDEV_LDPC_INTERLEAVER_BYPASS"))
238 		*op_flag_value = RTE_BBDEV_LDPC_INTERLEAVER_BYPASS;
239 	else if (!strcmp(token, "RTE_BBDEV_LDPC_RATE_MATCH"))
240 		*op_flag_value = RTE_BBDEV_LDPC_RATE_MATCH;
241 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24A_ATTACH"))
242 		*op_flag_value = RTE_BBDEV_LDPC_CRC_24A_ATTACH;
243 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24B_ATTACH"))
244 		*op_flag_value = RTE_BBDEV_LDPC_CRC_24B_ATTACH;
245 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_16_ATTACH"))
246 		*op_flag_value = RTE_BBDEV_LDPC_CRC_16_ATTACH;
247 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_INTERRUPTS"))
248 		*op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS;
249 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER"))
250 		*op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER;
251 	else {
252 		printf("The given value is not a turbo encoder flag\n");
253 		return -1;
254 	}
255 
256 	return 0;
257 }
258 
259 /* tokenization turbo decoder/encoder flags values separated by a comma */
260 static int
261 parse_turbo_flags(char *tokens, uint32_t *op_flags,
262 		enum rte_bbdev_op_type op_type)
263 {
264 	char *tok = NULL;
265 	uint32_t op_flag_value = 0;
266 
267 	tok = strtok(tokens, VALUE_DELIMITER);
268 	if (tok == NULL)
269 		return -1;
270 
271 	while (tok != NULL) {
272 		trim_space(tok);
273 		if (op_type == RTE_BBDEV_OP_TURBO_DEC) {
274 			if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1)
275 				return -1;
276 		} else if (op_type == RTE_BBDEV_OP_TURBO_ENC) {
277 			if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1)
278 				return -1;
279 		} else if (op_type == RTE_BBDEV_OP_LDPC_ENC) {
280 			if (op_ldpc_encoder_flag_strtoul(tok, &op_flag_value)
281 					== -1)
282 				return -1;
283 		} else if (op_type == RTE_BBDEV_OP_LDPC_DEC) {
284 			if (op_ldpc_decoder_flag_strtoul(tok, &op_flag_value)
285 					== -1)
286 				return -1;
287 		} else {
288 			return -1;
289 		}
290 
291 		*op_flags = *op_flags | op_flag_value;
292 
293 		tok = strtok(NULL, VALUE_DELIMITER);
294 		if (tok == NULL)
295 			break;
296 	}
297 
298 	return 0;
299 }
300 
301 /* convert turbo encoder/decoder op_type from string to enum*/
302 static int
303 op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type)
304 {
305 	trim_space(token);
306 	if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC"))
307 		*op_type = RTE_BBDEV_OP_TURBO_DEC;
308 	else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC"))
309 		*op_type = RTE_BBDEV_OP_TURBO_ENC;
310 	else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_ENC"))
311 		*op_type = RTE_BBDEV_OP_LDPC_ENC;
312 	else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_DEC"))
313 		*op_type = RTE_BBDEV_OP_LDPC_DEC;
314 	else if (!strcmp(token, "RTE_BBDEV_OP_NONE"))
315 		*op_type = RTE_BBDEV_OP_NONE;
316 	else {
317 		printf("Not valid turbo op_type: '%s'\n", token);
318 		return -1;
319 	}
320 
321 	return 0;
322 }
323 
324 /* tokenization expected status values separated by a comma */
325 static int
326 parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type)
327 {
328 	char *tok = NULL;
329 	bool status_ok = false;
330 
331 	tok = strtok(tokens, VALUE_DELIMITER);
332 	if (tok == NULL)
333 		return -1;
334 
335 	while (tok != NULL) {
336 		trim_space(tok);
337 		if (!strcmp(tok, "OK"))
338 			status_ok = true;
339 		else if (!strcmp(tok, "DMA"))
340 			*status = *status | (1 << RTE_BBDEV_DRV_ERROR);
341 		else if (!strcmp(tok, "FCW"))
342 			*status = *status | (1 << RTE_BBDEV_DATA_ERROR);
343 		else if (!strcmp(tok, "SYNCRC")) {
344 			*status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
345 			*status = *status | (1 << RTE_BBDEV_CRC_ERROR);
346 		} else if (!strcmp(tok, "SYN"))
347 			*status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
348 		else if (!strcmp(tok, "CRC")) {
349 			if ((op_type == RTE_BBDEV_OP_TURBO_DEC) ||
350 					(op_type == RTE_BBDEV_OP_LDPC_DEC))
351 				*status = *status | (1 << RTE_BBDEV_CRC_ERROR);
352 			else {
353 				printf(
354 						"CRC is only a valid value for decoder\n");
355 				return -1;
356 			}
357 		} else {
358 			printf("Not valid status: '%s'\n", tok);
359 			return -1;
360 		}
361 
362 		tok = strtok(NULL, VALUE_DELIMITER);
363 		if (tok == NULL)
364 			break;
365 	}
366 
367 	if (status_ok && *status != 0) {
368 		printf(
369 				"Not valid status values. Cannot be OK and ERROR at the same time.\n");
370 		return -1;
371 	}
372 
373 	return 0;
374 }
375 
376 /* parse ops data entry (there can be more than 1 input entry, each will be
377  * contained in a separate op_data_buf struct)
378  */
379 static int
380 parse_data_entry(const char *key_token, char *token,
381 		struct test_bbdev_vector *vector, enum op_data_type type,
382 		const char *prefix)
383 {
384 	int ret;
385 	uint32_t data_length = 0;
386 	uint32_t *data = NULL;
387 	unsigned int id;
388 	struct op_data_buf *op_data;
389 	unsigned int *nb_ops;
390 
391 	if (type >= DATA_NUM_TYPES) {
392 		printf("Unknown op type: %d!\n", type);
393 		return -1;
394 	}
395 
396 	op_data = vector->entries[type].segments;
397 	nb_ops = &vector->entries[type].nb_segments;
398 
399 	if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) {
400 		printf("Too many segments (code blocks defined): %u, max %d!\n",
401 				*nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS);
402 		return -1;
403 	}
404 
405 	if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) {
406 		printf("Missing ID of %s\n", prefix);
407 		return -1;
408 	}
409 	if (id != *nb_ops) {
410 		printf(
411 			"Please order data entries sequentially, i.e. %s0, %s1, ...\n",
412 				prefix, prefix);
413 		return -1;
414 	}
415 
416 	/* Clear new op data struct */
417 	memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf));
418 
419 	ret = parse_values(token, &data, &data_length);
420 	if (!ret) {
421 		op_data[*nb_ops].addr = data;
422 		op_data[*nb_ops].length = data_length;
423 		++(*nb_ops);
424 	}
425 
426 	return ret;
427 }
428 
429 /* parses turbo decoder parameters and assigns to global variable */
430 static int
431 parse_decoder_params(const char *key_token, char *token,
432 		struct test_bbdev_vector *vector)
433 {
434 	int ret = 0, status = 0;
435 	uint32_t op_flags = 0;
436 	char *err = NULL;
437 
438 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
439 
440 	/* compare keys */
441 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
442 		ret = parse_data_entry(key_token, token, vector,
443 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
444 
445 	else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT]))
446 		ret = parse_data_entry(key_token, token, vector,
447 				DATA_SOFT_OUTPUT,
448 				op_data_prefixes[DATA_SOFT_OUTPUT]);
449 
450 	else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT]))
451 		ret = parse_data_entry(key_token, token, vector,
452 				DATA_HARD_OUTPUT,
453 				op_data_prefixes[DATA_HARD_OUTPUT]);
454 	else if (!strcmp(key_token, "e")) {
455 		vector->mask |= TEST_BBDEV_VF_E;
456 		turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
457 	} else if (!strcmp(key_token, "ea")) {
458 		vector->mask |= TEST_BBDEV_VF_EA;
459 		turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
460 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
461 	} else if (!strcmp(key_token, "eb")) {
462 		vector->mask |= TEST_BBDEV_VF_EB;
463 		turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
464 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
465 	} else if (!strcmp(key_token, "k")) {
466 		vector->mask |= TEST_BBDEV_VF_K;
467 		turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0);
468 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
469 	} else if (!strcmp(key_token, "k_pos")) {
470 		vector->mask |= TEST_BBDEV_VF_K_POS;
471 		turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
472 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
473 	} else if (!strcmp(key_token, "k_neg")) {
474 		vector->mask |= TEST_BBDEV_VF_K_NEG;
475 		turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
476 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
477 	} else if (!strcmp(key_token, "c")) {
478 		vector->mask |= TEST_BBDEV_VF_C;
479 		turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0);
480 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
481 	} else if (!strcmp(key_token, "c_neg")) {
482 		vector->mask |= TEST_BBDEV_VF_C_NEG;
483 		turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0);
484 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
485 	} else if (!strcmp(key_token, "cab")) {
486 		vector->mask |= TEST_BBDEV_VF_CAB;
487 		turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
488 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
489 	} else if (!strcmp(key_token, "rv_index")) {
490 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
491 		turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
492 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
493 	} else if (!strcmp(key_token, "iter_max")) {
494 		vector->mask |= TEST_BBDEV_VF_ITER_MAX;
495 		turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
496 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
497 	} else if (!strcmp(key_token, "iter_min")) {
498 		vector->mask |= TEST_BBDEV_VF_ITER_MIN;
499 		turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0);
500 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
501 	} else if (!strcmp(key_token, "expected_iter_count")) {
502 		vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
503 		turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
504 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
505 	} else if (!strcmp(key_token, "ext_scale")) {
506 		vector->mask |= TEST_BBDEV_VF_EXT_SCALE;
507 		turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0);
508 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
509 	} else if (!strcmp(key_token, "num_maps")) {
510 		vector->mask |= TEST_BBDEV_VF_NUM_MAPS;
511 		turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0);
512 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
513 	} else if (!strcmp(key_token, "r")) {
514 		vector->mask |= TEST_BBDEV_VF_R;
515 		turbo_dec->tb_params.r = (uint8_t)strtoul(token, &err, 0);
516 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
517 	} else if (!strcmp(key_token, "code_block_mode")) {
518 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
519 		turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
520 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
521 	} else if (!strcmp(key_token, "op_flags")) {
522 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
523 		ret = parse_turbo_flags(token, &op_flags,
524 			vector->op_type);
525 		if (!ret)
526 			turbo_dec->op_flags = op_flags;
527 	} else if (!strcmp(key_token, "expected_status")) {
528 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
529 		ret = parse_expected_status(token, &status, vector->op_type);
530 		if (!ret)
531 			vector->expected_status = status;
532 	} else {
533 		printf("Not valid dec key: '%s'\n", key_token);
534 		return -1;
535 	}
536 
537 	if (ret != 0) {
538 		printf("Failed with convert '%s\t%s'\n", key_token, token);
539 		return -1;
540 	}
541 
542 	return 0;
543 }
544 
545 /* parses turbo encoder parameters and assigns to global variable */
546 static int
547 parse_encoder_params(const char *key_token, char *token,
548 		struct test_bbdev_vector *vector)
549 {
550 	int ret = 0, status = 0;
551 	uint32_t op_flags = 0;
552 	char *err = NULL;
553 
554 
555 	struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc;
556 
557 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
558 		ret = parse_data_entry(key_token, token, vector,
559 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
560 	else if (starts_with(key_token, "output"))
561 		ret = parse_data_entry(key_token, token, vector,
562 				DATA_HARD_OUTPUT, "output");
563 	else if (!strcmp(key_token, "e")) {
564 		vector->mask |= TEST_BBDEV_VF_E;
565 		turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
566 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
567 	} else if (!strcmp(key_token, "ea")) {
568 		vector->mask |= TEST_BBDEV_VF_EA;
569 		turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
570 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
571 	} else if (!strcmp(key_token, "eb")) {
572 		vector->mask |= TEST_BBDEV_VF_EB;
573 		turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
574 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
575 	} else if (!strcmp(key_token, "k")) {
576 		vector->mask |= TEST_BBDEV_VF_K;
577 		turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0);
578 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
579 	} else if (!strcmp(key_token, "k_neg")) {
580 		vector->mask |= TEST_BBDEV_VF_K_NEG;
581 		turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
582 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
583 	} else if (!strcmp(key_token, "k_pos")) {
584 		vector->mask |= TEST_BBDEV_VF_K_POS;
585 		turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
586 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
587 	} else if (!strcmp(key_token, "c_neg")) {
588 		vector->mask |= TEST_BBDEV_VF_C_NEG;
589 		turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0);
590 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
591 	} else if (!strcmp(key_token, "c")) {
592 		vector->mask |= TEST_BBDEV_VF_C;
593 		turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
594 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
595 	} else if (!strcmp(key_token, "cab")) {
596 		vector->mask |= TEST_BBDEV_VF_CAB;
597 		turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
598 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
599 	} else if (!strcmp(key_token, "rv_index")) {
600 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
601 		turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
602 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
603 	} else if (!strcmp(key_token, "ncb")) {
604 		vector->mask |= TEST_BBDEV_VF_NCB;
605 		turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0);
606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
607 	} else if (!strcmp(key_token, "ncb_neg")) {
608 		vector->mask |= TEST_BBDEV_VF_NCB_NEG;
609 		turbo_enc->tb_params.ncb_neg =
610 				(uint16_t) strtoul(token, &err, 0);
611 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
612 	} else if (!strcmp(key_token, "ncb_pos")) {
613 		vector->mask |= TEST_BBDEV_VF_NCB_POS;
614 		turbo_enc->tb_params.ncb_pos =
615 				(uint16_t) strtoul(token, &err, 0);
616 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
617 	} else if (!strcmp(key_token, "r")) {
618 		vector->mask |= TEST_BBDEV_VF_R;
619 		turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
620 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
621 	} else if (!strcmp(key_token, "code_block_mode")) {
622 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
623 		turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
624 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
625 	} else if (!strcmp(key_token, "op_flags")) {
626 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
627 		ret = parse_turbo_flags(token, &op_flags,
628 				vector->op_type);
629 		if (!ret)
630 			turbo_enc->op_flags = op_flags;
631 	} else if (!strcmp(key_token, "expected_status")) {
632 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
633 		ret = parse_expected_status(token, &status, vector->op_type);
634 		if (!ret)
635 			vector->expected_status = status;
636 	} else {
637 		printf("Not valid enc key: '%s'\n", key_token);
638 		return -1;
639 	}
640 
641 	if (ret != 0) {
642 		printf("Failed with convert '%s\t%s'\n", key_token, token);
643 		return -1;
644 	}
645 
646 	return 0;
647 }
648 
649 
650 /* parses LDPC encoder parameters and assigns to global variable */
651 static int
652 parse_ldpc_encoder_params(const char *key_token, char *token,
653 		struct test_bbdev_vector *vector)
654 {
655 	int ret = 0, status = 0;
656 	uint32_t op_flags = 0;
657 	char *err = NULL;
658 
659 	struct rte_bbdev_op_ldpc_enc *ldpc_enc = &vector->ldpc_enc;
660 
661 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
662 		ret = parse_data_entry(key_token, token, vector,
663 				DATA_INPUT,
664 				op_data_prefixes[DATA_INPUT]);
665 	else if (starts_with(key_token, "output"))
666 		ret = parse_data_entry(key_token, token, vector,
667 				DATA_HARD_OUTPUT,
668 				"output");
669 	else if (!strcmp(key_token, "e")) {
670 		vector->mask |= TEST_BBDEV_VF_E;
671 		ldpc_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
672 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
673 	} else if (!strcmp(key_token, "ea")) {
674 		vector->mask |= TEST_BBDEV_VF_EA;
675 		ldpc_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
676 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
677 	} else if (!strcmp(key_token, "eb")) {
678 		vector->mask |= TEST_BBDEV_VF_EB;
679 		ldpc_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
680 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
681 	} else if (!strcmp(key_token, "c")) {
682 		vector->mask |= TEST_BBDEV_VF_C;
683 		ldpc_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
684 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
685 	} else if (!strcmp(key_token, "cab")) {
686 		vector->mask |= TEST_BBDEV_VF_CAB;
687 		ldpc_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
688 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
689 	} else if (!strcmp(key_token, "rv_index")) {
690 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
691 		ldpc_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
692 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
693 	} else if (!strcmp(key_token, "n_cb")) {
694 		vector->mask |= TEST_BBDEV_VF_NCB;
695 		ldpc_enc->n_cb = (uint16_t) strtoul(token, &err, 0);
696 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
697 	} else if (!strcmp(key_token, "r")) {
698 		vector->mask |= TEST_BBDEV_VF_R;
699 		ldpc_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
700 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
701 	} else if (!strcmp(key_token, "q_m")) {
702 		vector->mask |= TEST_BBDEV_VF_QM;
703 		ldpc_enc->q_m = (uint8_t) strtoul(token, &err, 0);
704 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
705 	} else if (!strcmp(key_token, "basegraph")) {
706 		vector->mask |= TEST_BBDEV_VF_BG;
707 		ldpc_enc->basegraph = (uint8_t) strtoul(token, &err, 0);
708 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
709 	} else if (!strcmp(key_token, "z_c")) {
710 		vector->mask |= TEST_BBDEV_VF_ZC;
711 		ldpc_enc->z_c = (uint16_t) strtoul(token, &err, 0);
712 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
713 	} else if (!strcmp(key_token, "n_filler")) {
714 		vector->mask |= TEST_BBDEV_VF_F;
715 		ldpc_enc->n_filler = (uint16_t) strtoul(token, &err, 0);
716 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
717 	} else if (!strcmp(key_token, "code_block_mode")) {
718 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
719 		ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
720 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
721 	} else if (!strcmp(key_token, "op_flags")) {
722 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
723 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
724 		if (!ret)
725 			ldpc_enc->op_flags = op_flags;
726 	} else if (!strcmp(key_token, "expected_status")) {
727 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
728 		ret = parse_expected_status(token, &status, vector->op_type);
729 		if (!ret)
730 			vector->expected_status = status;
731 	} else {
732 		printf("Not valid ldpc enc key: '%s'\n", key_token);
733 		return -1;
734 	}
735 
736 	if (ret != 0) {
737 		printf("Failed with convert '%s\t%s'\n", key_token, token);
738 		return -1;
739 	}
740 
741 	return 0;
742 }
743 
744 /* parses LDPC decoder parameters and assigns to global variable */
745 static int
746 parse_ldpc_decoder_params(const char *key_token, char *token,
747 		struct test_bbdev_vector *vector)
748 {
749 	int ret = 0, status = 0;
750 	uint32_t op_flags = 0;
751 	char *err = NULL;
752 
753 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
754 
755 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
756 		ret = parse_data_entry(key_token, token, vector,
757 				DATA_INPUT,
758 				op_data_prefixes[DATA_INPUT]);
759 	else if (starts_with(key_token, "output"))
760 		ret = parse_data_entry(key_token, token, vector,
761 				DATA_HARD_OUTPUT,
762 				"output");
763 	else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_INPUT]))
764 		ret = parse_data_entry(key_token, token, vector,
765 				DATA_HARQ_INPUT,
766 				op_data_prefixes[DATA_HARQ_INPUT]);
767 	else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_OUTPUT]))
768 		ret = parse_data_entry(key_token, token, vector,
769 				DATA_HARQ_OUTPUT,
770 				op_data_prefixes[DATA_HARQ_OUTPUT]);
771 	else if (!strcmp(key_token, "e")) {
772 		vector->mask |= TEST_BBDEV_VF_E;
773 		ldpc_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
774 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
775 	} else if (!strcmp(key_token, "ea")) {
776 		vector->mask |= TEST_BBDEV_VF_EA;
777 		ldpc_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
778 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
779 	} else if (!strcmp(key_token, "eb")) {
780 		vector->mask |= TEST_BBDEV_VF_EB;
781 		ldpc_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
782 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
783 	} else if (!strcmp(key_token, "c")) {
784 		vector->mask |= TEST_BBDEV_VF_C;
785 		ldpc_dec->tb_params.c = (uint8_t) strtoul(token, &err, 0);
786 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
787 	} else if (!strcmp(key_token, "cab")) {
788 		vector->mask |= TEST_BBDEV_VF_CAB;
789 		ldpc_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
790 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
791 	} else if (!strcmp(key_token, "rv_index")) {
792 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
793 		ldpc_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
794 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
795 	} else if (!strcmp(key_token, "n_cb")) {
796 		vector->mask |= TEST_BBDEV_VF_NCB;
797 		ldpc_dec->n_cb = (uint16_t) strtoul(token, &err, 0);
798 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
799 	} else if (!strcmp(key_token, "r")) {
800 		vector->mask |= TEST_BBDEV_VF_R;
801 		ldpc_dec->tb_params.r = (uint8_t) strtoul(token, &err, 0);
802 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
803 	} else if (!strcmp(key_token, "q_m")) {
804 		vector->mask |= TEST_BBDEV_VF_QM;
805 		ldpc_dec->q_m = (uint8_t) strtoul(token, &err, 0);
806 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
807 	} else if (!strcmp(key_token, "basegraph")) {
808 		vector->mask |= TEST_BBDEV_VF_BG;
809 		ldpc_dec->basegraph = (uint8_t) strtoul(token, &err, 0);
810 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
811 	} else if (!strcmp(key_token, "z_c")) {
812 		vector->mask |= TEST_BBDEV_VF_ZC;
813 		ldpc_dec->z_c = (uint16_t) strtoul(token, &err, 0);
814 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
815 	} else if (!strcmp(key_token, "n_filler")) {
816 		vector->mask |= TEST_BBDEV_VF_F;
817 		ldpc_dec->n_filler = (uint16_t) strtoul(token, &err, 0);
818 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
819 	} else if (!strcmp(key_token, "expected_iter_count")) {
820 		vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
821 		ldpc_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
822 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
823 	} else if (!strcmp(key_token, "iter_max")) {
824 		vector->mask |= TEST_BBDEV_VF_ITER_MAX;
825 		ldpc_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
826 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
827 	} else if (!strcmp(key_token, "code_block_mode")) {
828 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
829 		ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
830 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
831 	} else if (!strcmp(key_token, "op_flags")) {
832 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
833 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
834 		if (!ret)
835 			ldpc_dec->op_flags = op_flags;
836 	} else if (!strcmp(key_token, "expected_status")) {
837 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
838 		ret = parse_expected_status(token, &status, vector->op_type);
839 		if (!ret)
840 			vector->expected_status = status;
841 	} else {
842 		printf("Not valid ldpc dec key: '%s'\n", key_token);
843 		return -1;
844 	}
845 
846 	if (ret != 0) {
847 		printf("Failed with convert '%s\t%s'\n", key_token, token);
848 		return -1;
849 	}
850 
851 	return 0;
852 }
853 
854 /* checks the type of key and assigns data */
855 static int
856 parse_entry(char *entry, struct test_bbdev_vector *vector)
857 {
858 	int ret = 0;
859 	char *token, *key_token;
860 	enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE;
861 
862 	if (entry == NULL) {
863 		printf("Expected entry value\n");
864 		return -1;
865 	}
866 
867 	/* get key */
868 	token = strtok(entry, ENTRY_DELIMITER);
869 	key_token = token;
870 	/* get values for key */
871 	token = strtok(NULL, ENTRY_DELIMITER);
872 
873 	if (key_token == NULL || token == NULL) {
874 		printf("Expected 'key = values' but was '%.40s'..\n", entry);
875 		return -1;
876 	}
877 	trim_space(key_token);
878 
879 	/* first key_token has to specify type of operation */
880 	if (vector->op_type == RTE_BBDEV_OP_NONE) {
881 		if (!strcmp(key_token, "op_type")) {
882 			ret = op_turbo_type_strtol(token, &op_type);
883 			if (!ret)
884 				vector->op_type = op_type;
885 			return (!ret) ? 0 : -1;
886 		}
887 		printf("First key_token (%s) does not specify op_type\n",
888 				key_token);
889 		return -1;
890 	}
891 
892 	/* compare keys */
893 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
894 		if (parse_decoder_params(key_token, token, vector) == -1)
895 			return -1;
896 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
897 		if (parse_encoder_params(key_token, token, vector) == -1)
898 			return -1;
899 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
900 		if (parse_ldpc_encoder_params(key_token, token, vector) == -1)
901 			return -1;
902 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
903 		if (parse_ldpc_decoder_params(key_token, token, vector) == -1)
904 			return -1;
905 	}
906 
907 	return 0;
908 }
909 
910 static int
911 check_decoder_segments(struct test_bbdev_vector *vector)
912 {
913 	unsigned char i;
914 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
915 
916 	if (vector->entries[DATA_INPUT].nb_segments == 0)
917 		return -1;
918 
919 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
920 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
921 			return -1;
922 
923 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
924 		return -1;
925 
926 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments;
927 			i++)
928 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
929 			return -1;
930 
931 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
932 			(vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
933 		return -1;
934 
935 	for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments;
936 			i++)
937 		if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
938 			return -1;
939 
940 	return 0;
941 }
942 
943 static int
944 check_ldpc_decoder_segments(struct test_bbdev_vector *vector)
945 {
946 	unsigned char i;
947 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
948 
949 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
950 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
951 			return -1;
952 
953 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
954 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
955 			return -1;
956 
957 	if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) &&
958 			(vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
959 		return -1;
960 
961 	for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; i++)
962 		if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
963 			return -1;
964 
965 	if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) &&
966 			(vector->entries[DATA_HARQ_OUTPUT].nb_segments == 0))
967 		return -1;
968 
969 	for (i = 0; i < vector->entries[DATA_HARQ_OUTPUT].nb_segments; i++)
970 		if (vector->entries[DATA_HARQ_OUTPUT].segments[i].addr == NULL)
971 			return -1;
972 
973 	return 0;
974 }
975 
976 static int
977 check_decoder_llr_spec(struct test_bbdev_vector *vector)
978 {
979 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
980 
981 	/* Check input LLR sign formalism specification */
982 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
983 			(turbo_dec->op_flags &
984 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
985 		printf(
986 			"Both positive and negative LLR input flags were set!\n");
987 		return -1;
988 	}
989 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
990 			!(turbo_dec->op_flags &
991 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
992 		printf(
993 			"INFO: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
994 		turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
995 	}
996 
997 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT))
998 		return 0;
999 
1000 	/* Check output LLR sign formalism specification */
1001 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1002 			(turbo_dec->op_flags &
1003 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1004 		printf(
1005 			"Both positive and negative LLR output flags were set!\n");
1006 		return -1;
1007 	}
1008 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1009 			!(turbo_dec->op_flags &
1010 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1011 		printf(
1012 			"INFO: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
1013 		turbo_dec->op_flags |=
1014 				RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
1015 	}
1016 
1017 	return 0;
1018 }
1019 
1020 static int
1021 check_decoder_op_flags(struct test_bbdev_vector *vector)
1022 {
1023 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
1024 
1025 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP) &&
1026 		!(turbo_dec->op_flags & RTE_BBDEV_TURBO_CRC_TYPE_24B)) {
1027 		printf(
1028 			"WARNING: RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP flag is missing RTE_BBDEV_TURBO_CRC_TYPE_24B\n");
1029 		return -1;
1030 	}
1031 
1032 	return 0;
1033 }
1034 
1035 /* checks decoder parameters */
1036 static int
1037 check_decoder(struct test_bbdev_vector *vector)
1038 {
1039 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
1040 	const int mask = vector->mask;
1041 
1042 	if (check_decoder_segments(vector) < 0)
1043 		return -1;
1044 
1045 	if (check_decoder_llr_spec(vector) < 0)
1046 		return -1;
1047 
1048 	if (check_decoder_op_flags(vector) < 0)
1049 		return -1;
1050 
1051 	/* Check which params were set */
1052 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1053 		printf(
1054 			"WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
1055 		turbo_dec->code_block_mode = 1;
1056 	}
1057 	if (turbo_dec->code_block_mode == 0) {
1058 		if (!(mask & TEST_BBDEV_VF_EA))
1059 			printf(
1060 				"WARNING: ea was not specified in vector file and will be set to 0\n");
1061 		if (!(mask & TEST_BBDEV_VF_EB))
1062 			printf(
1063 				"WARNING: eb was not specified in vector file and will be set to 0\n");
1064 		if (!(mask & TEST_BBDEV_VF_K_NEG))
1065 			printf(
1066 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
1067 		if (!(mask & TEST_BBDEV_VF_K_POS))
1068 			printf(
1069 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
1070 		if (!(mask & TEST_BBDEV_VF_C_NEG))
1071 			printf(
1072 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
1073 		if (!(mask & TEST_BBDEV_VF_C)) {
1074 			printf(
1075 				"WARNING: c was not specified in vector file and will be set to 1\n");
1076 			turbo_dec->tb_params.c = 1;
1077 		}
1078 		if (!(mask & TEST_BBDEV_VF_CAB))
1079 			printf(
1080 				"WARNING: cab was not specified in vector file and will be set to 0\n");
1081 		if (!(mask & TEST_BBDEV_VF_R))
1082 			printf(
1083 				"WARNING: r was not specified in vector file and will be set to 0\n");
1084 	} else {
1085 		if (!(mask & TEST_BBDEV_VF_E))
1086 			printf(
1087 				"WARNING: e was not specified in vector file and will be set to 0\n");
1088 		if (!(mask & TEST_BBDEV_VF_K))
1089 			printf(
1090 				"WARNING: k was not specified in vector file and will be set to 0\n");
1091 	}
1092 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1093 		printf(
1094 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1095 	if (!(mask & TEST_BBDEV_VF_ITER_MIN))
1096 		printf(
1097 			"WARNING: iter_min was not specified in vector file and will be set to 0\n");
1098 	if (!(mask & TEST_BBDEV_VF_ITER_MAX))
1099 		printf(
1100 			"WARNING: iter_max was not specified in vector file and will be set to 0\n");
1101 	if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
1102 		printf(
1103 			"WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
1104 	if (!(mask & TEST_BBDEV_VF_EXT_SCALE))
1105 		printf(
1106 			"WARNING: ext_scale was not specified in vector file and will be set to 0\n");
1107 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
1108 		printf(
1109 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
1110 		turbo_dec->num_maps = 0;
1111 	} else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) &&
1112 			mask & TEST_BBDEV_VF_NUM_MAPS) {
1113 		printf(
1114 			"INFO: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n");
1115 		turbo_dec->num_maps = 0;
1116 	}
1117 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1118 		printf(
1119 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1120 	return 0;
1121 }
1122 
1123 /* checks LDPC decoder parameters */
1124 static int
1125 check_ldpc_decoder(struct test_bbdev_vector *vector)
1126 {
1127 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
1128 	const int mask = vector->mask;
1129 
1130 	if (check_ldpc_decoder_segments(vector) < 0)
1131 		return -1;
1132 
1133 	/*
1134 	 * if (check_ldpc_decoder_llr_spec(vector) < 0)
1135 	 *	return -1;
1136 	 *
1137 	 * if (check_ldpc_decoder_op_flags(vector) < 0)
1138 	 *	return -1;
1139 	 */
1140 
1141 	/* Check which params were set */
1142 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1143 		printf(
1144 			"WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
1145 		ldpc_dec->code_block_mode = 1;
1146 	}
1147 	if (ldpc_dec->code_block_mode == 0) {
1148 		if (!(mask & TEST_BBDEV_VF_EA))
1149 			printf(
1150 				"WARNING: ea was not specified in vector file and will be set to 0\n");
1151 		if (!(mask & TEST_BBDEV_VF_EB))
1152 			printf(
1153 				"WARNING: eb was not specified in vector file and will be set to 0\n");
1154 		if (!(mask & TEST_BBDEV_VF_C)) {
1155 			printf(
1156 				"WARNING: c was not specified in vector file and will be set to 1\n");
1157 			ldpc_dec->tb_params.c = 1;
1158 		}
1159 		if (!(mask & TEST_BBDEV_VF_CAB))
1160 			printf(
1161 				"WARNING: cab was not specified in vector file and will be set to 0\n");
1162 		if (!(mask & TEST_BBDEV_VF_R))
1163 			printf(
1164 				"WARNING: r was not specified in vector file and will be set to 0\n");
1165 	} else {
1166 		if (!(mask & TEST_BBDEV_VF_E))
1167 			printf(
1168 				"WARNING: e was not specified in vector file and will be set to 0\n");
1169 	}
1170 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1171 		printf(
1172 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1173 	if (!(mask & TEST_BBDEV_VF_ITER_MAX))
1174 		printf(
1175 			"WARNING: iter_max was not specified in vector file and will be set to 0\n");
1176 	if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
1177 		printf(
1178 			"WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
1179 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
1180 		printf(
1181 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
1182 	}
1183 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1184 		printf(
1185 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1186 	return 0;
1187 }
1188 
1189 /* checks encoder parameters */
1190 static int
1191 check_encoder(struct test_bbdev_vector *vector)
1192 {
1193 	unsigned char i;
1194 	const int mask = vector->mask;
1195 
1196 	if (vector->entries[DATA_INPUT].nb_segments == 0)
1197 		return -1;
1198 
1199 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
1200 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
1201 			return -1;
1202 
1203 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
1204 		return -1;
1205 
1206 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
1207 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
1208 			return -1;
1209 
1210 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1211 		printf(
1212 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
1213 		vector->turbo_enc.code_block_mode = 1;
1214 	}
1215 	if (vector->turbo_enc.code_block_mode == 0) {
1216 		if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags &
1217 				RTE_BBDEV_TURBO_RATE_MATCH))
1218 			printf(
1219 				"WARNING: ea was not specified in vector file and will be set to 0\n");
1220 		if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags &
1221 				RTE_BBDEV_TURBO_RATE_MATCH))
1222 			printf(
1223 				"WARNING: eb was not specified in vector file and will be set to 0\n");
1224 		if (!(mask & TEST_BBDEV_VF_K_NEG))
1225 			printf(
1226 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
1227 		if (!(mask & TEST_BBDEV_VF_K_POS))
1228 			printf(
1229 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
1230 		if (!(mask & TEST_BBDEV_VF_C_NEG))
1231 			printf(
1232 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
1233 		if (!(mask & TEST_BBDEV_VF_C)) {
1234 			printf(
1235 				"WARNING: c was not specified in vector file and will be set to 1\n");
1236 			vector->turbo_enc.tb_params.c = 1;
1237 		}
1238 		if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags &
1239 				RTE_BBDEV_TURBO_RATE_MATCH))
1240 			printf(
1241 				"WARNING: cab was not specified in vector file and will be set to 0\n");
1242 		if (!(mask & TEST_BBDEV_VF_NCB_NEG))
1243 			printf(
1244 				"WARNING: ncb_neg was not specified in vector file and will be set to 0\n");
1245 		if (!(mask & TEST_BBDEV_VF_NCB_POS))
1246 			printf(
1247 				"WARNING: ncb_pos was not specified in vector file and will be set to 0\n");
1248 		if (!(mask & TEST_BBDEV_VF_R))
1249 			printf(
1250 				"WARNING: r was not specified in vector file and will be set to 0\n");
1251 	} else {
1252 		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
1253 				RTE_BBDEV_TURBO_RATE_MATCH))
1254 			printf(
1255 				"WARNING: e was not specified in vector file and will be set to 0\n");
1256 		if (!(mask & TEST_BBDEV_VF_K))
1257 			printf(
1258 				"WARNING: k was not specified in vector file and will be set to 0\n");
1259 		if (!(mask & TEST_BBDEV_VF_NCB))
1260 			printf(
1261 				"WARNING: ncb was not specified in vector file and will be set to 0\n");
1262 	}
1263 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1264 		printf(
1265 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1266 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
1267 		printf(
1268 			"INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
1269 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1270 		printf(
1271 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1272 
1273 	return 0;
1274 }
1275 
1276 
1277 /* checks encoder parameters */
1278 static int
1279 check_ldpc_encoder(struct test_bbdev_vector *vector)
1280 {
1281 	unsigned char i;
1282 	const int mask = vector->mask;
1283 
1284 	if (vector->entries[DATA_INPUT].nb_segments == 0)
1285 		return -1;
1286 
1287 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
1288 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
1289 			return -1;
1290 
1291 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
1292 		return -1;
1293 
1294 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
1295 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
1296 			return -1;
1297 
1298 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1299 		printf(
1300 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
1301 		vector->turbo_enc.code_block_mode = 1;
1302 	}
1303 	if (vector->turbo_enc.code_block_mode == 0) {
1304 	} else {
1305 		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
1306 				RTE_BBDEV_TURBO_RATE_MATCH))
1307 			printf(
1308 				"WARNING: e was not specified in vector file and will be set to 0\n");
1309 		if (!(mask & TEST_BBDEV_VF_NCB))
1310 			printf(
1311 				"WARNING: ncb was not specified in vector file and will be set to 0\n");
1312 	}
1313 	if (!(mask & TEST_BBDEV_VF_BG))
1314 		printf(
1315 			"WARNING: BG was not specified in vector file and will be set to 0\n");
1316 	if (!(mask & TEST_BBDEV_VF_ZC))
1317 		printf(
1318 			"WARNING: Zc was not specified in vector file and will be set to 0\n");
1319 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1320 		printf(
1321 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1322 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
1323 		printf(
1324 			"INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
1325 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1326 		printf(
1327 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1328 
1329 	return 0;
1330 }
1331 
1332 static int
1333 bbdev_check_vector(struct test_bbdev_vector *vector)
1334 {
1335 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
1336 		if (check_decoder(vector) == -1)
1337 			return -1;
1338 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
1339 		if (check_encoder(vector) == -1)
1340 			return -1;
1341 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
1342 		if (check_ldpc_encoder(vector) == -1)
1343 			return -1;
1344 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
1345 		if (check_ldpc_decoder(vector) == -1)
1346 			return -1;
1347 	} else if (vector->op_type != RTE_BBDEV_OP_NONE) {
1348 		printf("Vector was not filled\n");
1349 		return -1;
1350 	}
1351 
1352 	return 0;
1353 }
1354 
1355 int
1356 test_bbdev_vector_read(const char *filename,
1357 		struct test_bbdev_vector *vector)
1358 {
1359 	int ret = 0;
1360 	size_t len = 0;
1361 
1362 	FILE *fp = NULL;
1363 	char *line = NULL;
1364 	char *entry = NULL;
1365 
1366 	fp = fopen(filename, "r");
1367 	if (fp == NULL) {
1368 		printf("File %s does not exist\n", filename);
1369 		return -1;
1370 	}
1371 
1372 	while (getline(&line, &len, fp) != -1) {
1373 
1374 		/* ignore comments and new lines */
1375 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
1376 			|| line[0] == '\r')
1377 			continue;
1378 
1379 		trim_space(line);
1380 
1381 		/* buffer for multiline */
1382 		entry = realloc(entry, strlen(line) + 1);
1383 		if (entry == NULL) {
1384 			printf("Fail to realloc %zu bytes\n", strlen(line) + 1);
1385 			ret = -ENOMEM;
1386 			goto exit;
1387 		}
1388 
1389 		strcpy(entry, line);
1390 
1391 		/* check if entry ends with , or = */
1392 		if (entry[strlen(entry) - 1] == ','
1393 			|| entry[strlen(entry) - 1] == '=') {
1394 			while (getline(&line, &len, fp) != -1) {
1395 				trim_space(line);
1396 
1397 				/* extend entry about length of new line */
1398 				char *entry_extended = realloc(entry,
1399 						strlen(line) +
1400 						strlen(entry) + 1);
1401 
1402 				if (entry_extended == NULL) {
1403 					printf("Fail to allocate %zu bytes\n",
1404 							strlen(line) +
1405 							strlen(entry) + 1);
1406 					ret = -ENOMEM;
1407 					goto exit;
1408 				}
1409 
1410 				entry = entry_extended;
1411 				/* entry has been allocated accordingly */
1412 				strcpy(&entry[strlen(entry)], line);
1413 
1414 				if (entry[strlen(entry) - 1] != ',')
1415 					break;
1416 			}
1417 		}
1418 		ret = parse_entry(entry, vector);
1419 		if (ret != 0) {
1420 			printf("An error occurred while parsing!\n");
1421 			goto exit;
1422 		}
1423 	}
1424 	ret = bbdev_check_vector(vector);
1425 	if (ret != 0)
1426 		printf("An error occurred while checking!\n");
1427 
1428 exit:
1429 	fclose(fp);
1430 	free(line);
1431 	free(entry);
1432 
1433 	return ret;
1434 }
1435