1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2017 Intel Corporation
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
54418919fSjohnjiang #ifdef RTE_EXEC_ENV_FREEBSD
6d30ea906Sjfb8856606 	#define _WITH_GETLINE
7d30ea906Sjfb8856606 #endif
8d30ea906Sjfb8856606 #include <stdio.h>
9d30ea906Sjfb8856606 #include <stdbool.h>
10d30ea906Sjfb8856606 #include <rte_malloc.h>
11d30ea906Sjfb8856606 
12d30ea906Sjfb8856606 #include "test_bbdev_vector.h"
13d30ea906Sjfb8856606 
14d30ea906Sjfb8856606 #define VALUE_DELIMITER ","
15d30ea906Sjfb8856606 #define ENTRY_DELIMITER "="
16d30ea906Sjfb8856606 
17d30ea906Sjfb8856606 const char *op_data_prefixes[] = {
18d30ea906Sjfb8856606 	"input",
19d30ea906Sjfb8856606 	"soft_output",
20d30ea906Sjfb8856606 	"hard_output",
214418919fSjohnjiang 	"harq_input",
224418919fSjohnjiang 	"harq_output",
23d30ea906Sjfb8856606 };
24d30ea906Sjfb8856606 
25d30ea906Sjfb8856606 /* trim leading and trailing spaces */
26d30ea906Sjfb8856606 static void
trim_space(char * str)27d30ea906Sjfb8856606 trim_space(char *str)
28d30ea906Sjfb8856606 {
29d30ea906Sjfb8856606 	char *start, *end;
30d30ea906Sjfb8856606 
31d30ea906Sjfb8856606 	for (start = str; *start; start++) {
32d30ea906Sjfb8856606 		if (!isspace((unsigned char) start[0]))
33d30ea906Sjfb8856606 			break;
34d30ea906Sjfb8856606 	}
35d30ea906Sjfb8856606 
36d30ea906Sjfb8856606 	for (end = start + strlen(start); end > start + 1; end--) {
37d30ea906Sjfb8856606 		if (!isspace((unsigned char) end[-1]))
38d30ea906Sjfb8856606 			break;
39d30ea906Sjfb8856606 	}
40d30ea906Sjfb8856606 
41d30ea906Sjfb8856606 	*end = 0;
42d30ea906Sjfb8856606 
43d30ea906Sjfb8856606 	/* Shift from "start" to the beginning of the string */
44d30ea906Sjfb8856606 	if (start > str)
45d30ea906Sjfb8856606 		memmove(str, start, (end - start) + 1);
46d30ea906Sjfb8856606 }
47d30ea906Sjfb8856606 
48d30ea906Sjfb8856606 static bool
starts_with(const char * str,const char * pre)49d30ea906Sjfb8856606 starts_with(const char *str, const char *pre)
50d30ea906Sjfb8856606 {
51d30ea906Sjfb8856606 	return strncmp(pre, str, strlen(pre)) == 0;
52d30ea906Sjfb8856606 }
53d30ea906Sjfb8856606 
54d30ea906Sjfb8856606 /* tokenization test values separated by a comma */
55d30ea906Sjfb8856606 static int
parse_values(char * tokens,uint32_t ** data,uint32_t * data_length)56d30ea906Sjfb8856606 parse_values(char *tokens, uint32_t **data, uint32_t *data_length)
57d30ea906Sjfb8856606 {
58d30ea906Sjfb8856606 	uint32_t n_tokens = 0;
59d30ea906Sjfb8856606 	uint32_t data_size = 32;
60d30ea906Sjfb8856606 
61d30ea906Sjfb8856606 	uint32_t *values, *values_resized;
62d30ea906Sjfb8856606 	char *tok, *error = NULL;
63d30ea906Sjfb8856606 
64d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
65d30ea906Sjfb8856606 	if (tok == NULL)
66d30ea906Sjfb8856606 		return -1;
67d30ea906Sjfb8856606 
68d30ea906Sjfb8856606 	values = (uint32_t *)
69d30ea906Sjfb8856606 			rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0);
70d30ea906Sjfb8856606 	if (values == NULL)
71d30ea906Sjfb8856606 		return -1;
72d30ea906Sjfb8856606 
73d30ea906Sjfb8856606 	while (tok != NULL) {
74d30ea906Sjfb8856606 		values_resized = NULL;
75d30ea906Sjfb8856606 
76d30ea906Sjfb8856606 		if (n_tokens >= data_size) {
77d30ea906Sjfb8856606 			data_size *= 2;
78d30ea906Sjfb8856606 
79d30ea906Sjfb8856606 			values_resized = (uint32_t *) rte_realloc(values,
80d30ea906Sjfb8856606 				sizeof(uint32_t) * data_size, 0);
81d30ea906Sjfb8856606 			if (values_resized == NULL) {
82d30ea906Sjfb8856606 				rte_free(values);
83d30ea906Sjfb8856606 				return -1;
84d30ea906Sjfb8856606 			}
85d30ea906Sjfb8856606 			values = values_resized;
86d30ea906Sjfb8856606 		}
87d30ea906Sjfb8856606 
88d30ea906Sjfb8856606 		values[n_tokens] = (uint32_t) strtoul(tok, &error, 0);
894418919fSjohnjiang 
90d30ea906Sjfb8856606 		if ((error == NULL) || (*error != '\0')) {
91d30ea906Sjfb8856606 			printf("Failed with convert '%s'\n", tok);
92d30ea906Sjfb8856606 			rte_free(values);
93d30ea906Sjfb8856606 			return -1;
94d30ea906Sjfb8856606 		}
95d30ea906Sjfb8856606 
96d30ea906Sjfb8856606 		*data_length = *data_length + (strlen(tok) - strlen("0x"))/2;
97d30ea906Sjfb8856606 
98d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
99d30ea906Sjfb8856606 		if (tok == NULL)
100d30ea906Sjfb8856606 			break;
101d30ea906Sjfb8856606 
102d30ea906Sjfb8856606 		n_tokens++;
103d30ea906Sjfb8856606 	}
104d30ea906Sjfb8856606 
105d30ea906Sjfb8856606 	values_resized = (uint32_t *) rte_realloc(values,
106d30ea906Sjfb8856606 		sizeof(uint32_t) * (n_tokens + 1), 0);
107d30ea906Sjfb8856606 
108d30ea906Sjfb8856606 	if (values_resized == NULL) {
109d30ea906Sjfb8856606 		rte_free(values);
110d30ea906Sjfb8856606 		return -1;
111d30ea906Sjfb8856606 	}
112d30ea906Sjfb8856606 
113d30ea906Sjfb8856606 	*data = values_resized;
114d30ea906Sjfb8856606 
115d30ea906Sjfb8856606 	return 0;
116d30ea906Sjfb8856606 }
117d30ea906Sjfb8856606 
118d30ea906Sjfb8856606 /* convert turbo decoder flag from string to unsigned long int*/
119d30ea906Sjfb8856606 static int
op_decoder_flag_strtoul(char * token,uint32_t * op_flag_value)120d30ea906Sjfb8856606 op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
121d30ea906Sjfb8856606 {
122d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE"))
123d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE;
124d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_TYPE_24B"))
125d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_TYPE_24B;
126d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EQUALIZER"))
127d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_EQUALIZER;
128d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUT_SATURATE"))
129d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUT_SATURATE;
130d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_HALF_ITERATION_EVEN"))
131d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_HALF_ITERATION_EVEN;
132d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH"))
133d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH;
134d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUTPUT"))
135d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUTPUT;
136d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EARLY_TERMINATION"))
137d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_EARLY_TERMINATION;
138d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN"))
139d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN;
140d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN"))
141d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
142d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT"))
143d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
144d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT"))
145d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
146d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_MAP_DEC"))
147d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_MAP_DEC;
148d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_SCATTER_GATHER"))
149d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_DEC_SCATTER_GATHER;
150d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP"))
151d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP;
152d30ea906Sjfb8856606 	else {
153d30ea906Sjfb8856606 		printf("The given value is not a turbo decoder flag\n");
154d30ea906Sjfb8856606 		return -1;
155d30ea906Sjfb8856606 	}
156d30ea906Sjfb8856606 
157d30ea906Sjfb8856606 	return 0;
158d30ea906Sjfb8856606 }
159d30ea906Sjfb8856606 
1604418919fSjohnjiang /* convert LDPC flag from string to unsigned long int*/
1614418919fSjohnjiang static int
op_ldpc_decoder_flag_strtoul(char * token,uint32_t * op_flag_value)1624418919fSjohnjiang op_ldpc_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
1634418919fSjohnjiang {
1644418919fSjohnjiang 	if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK"))
1654418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK;
1664418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK"))
1674418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK;
1684418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP"))
1694418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP;
1704418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS"))
1714418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS;
1724418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE"))
1734418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
1744418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE"))
1754418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
1764418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DECODE_BYPASS"))
1774418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_DECODE_BYPASS;
1784418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_ENABLE"))
1794418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_ENABLE;
1804418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS"))
1814418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS;
1824418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS"))
1834418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS;
1844418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE"))
1854418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
1864418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_INTERRUPTS"))
1874418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_DEC_INTERRUPTS;
1884418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_SCATTER_GATHER"))
1894418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_DEC_SCATTER_GATHER;
1904418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION"))
1914418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
1924418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_LLR_COMPRESSION"))
1934418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_LLR_COMPRESSION;
1944418919fSjohnjiang 	else if (!strcmp(token,
1954418919fSjohnjiang 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE"))
1964418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
1974418919fSjohnjiang 	else if (!strcmp(token,
1984418919fSjohnjiang 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE"))
1994418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
200*2d9fd380Sjfb8856606 	else if (!strcmp(token,
201*2d9fd380Sjfb8856606 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK"))
202*2d9fd380Sjfb8856606 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
2034418919fSjohnjiang 	else {
2044418919fSjohnjiang 		printf("The given value is not a LDPC decoder flag\n");
2054418919fSjohnjiang 		return -1;
2064418919fSjohnjiang 	}
2074418919fSjohnjiang 
2084418919fSjohnjiang 	return 0;
2094418919fSjohnjiang }
2104418919fSjohnjiang 
211d30ea906Sjfb8856606 /* convert turbo encoder flag from string to unsigned long int*/
212d30ea906Sjfb8856606 static int
op_encoder_flag_strtoul(char * token,uint32_t * op_flag_value)213d30ea906Sjfb8856606 op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
214d30ea906Sjfb8856606 {
215d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS"))
216d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS;
217d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH"))
218d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH;
219d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH"))
220d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH;
221d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH"))
222d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH;
223d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER"))
224d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER;
225d30ea906Sjfb8856606 	else {
226d30ea906Sjfb8856606 		printf("The given value is not a turbo encoder flag\n");
227d30ea906Sjfb8856606 		return -1;
228d30ea906Sjfb8856606 	}
229d30ea906Sjfb8856606 
230d30ea906Sjfb8856606 	return 0;
231d30ea906Sjfb8856606 }
232d30ea906Sjfb8856606 
2334418919fSjohnjiang /* convert LDPC encoder flag from string to unsigned long int*/
2344418919fSjohnjiang static int
op_ldpc_encoder_flag_strtoul(char * token,uint32_t * op_flag_value)2354418919fSjohnjiang op_ldpc_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
2364418919fSjohnjiang {
2374418919fSjohnjiang 	if (!strcmp(token, "RTE_BBDEV_LDPC_INTERLEAVER_BYPASS"))
2384418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_INTERLEAVER_BYPASS;
2394418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_RATE_MATCH"))
2404418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_RATE_MATCH;
2414418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24A_ATTACH"))
2424418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_24A_ATTACH;
2434418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24B_ATTACH"))
2444418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_24B_ATTACH;
2454418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_16_ATTACH"))
2464418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_CRC_16_ATTACH;
2474418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_INTERRUPTS"))
2484418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS;
2494418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER"))
2504418919fSjohnjiang 		*op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER;
2514418919fSjohnjiang 	else {
2524418919fSjohnjiang 		printf("The given value is not a turbo encoder flag\n");
2534418919fSjohnjiang 		return -1;
2544418919fSjohnjiang 	}
2554418919fSjohnjiang 
2564418919fSjohnjiang 	return 0;
2574418919fSjohnjiang }
2584418919fSjohnjiang 
259d30ea906Sjfb8856606 /* tokenization turbo decoder/encoder flags values separated by a comma */
260d30ea906Sjfb8856606 static int
parse_turbo_flags(char * tokens,uint32_t * op_flags,enum rte_bbdev_op_type op_type)261d30ea906Sjfb8856606 parse_turbo_flags(char *tokens, uint32_t *op_flags,
262d30ea906Sjfb8856606 		enum rte_bbdev_op_type op_type)
263d30ea906Sjfb8856606 {
264d30ea906Sjfb8856606 	char *tok = NULL;
265d30ea906Sjfb8856606 	uint32_t op_flag_value = 0;
266d30ea906Sjfb8856606 
267d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
268d30ea906Sjfb8856606 	if (tok == NULL)
269d30ea906Sjfb8856606 		return -1;
270d30ea906Sjfb8856606 
271d30ea906Sjfb8856606 	while (tok != NULL) {
272d30ea906Sjfb8856606 		trim_space(tok);
273d30ea906Sjfb8856606 		if (op_type == RTE_BBDEV_OP_TURBO_DEC) {
274d30ea906Sjfb8856606 			if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1)
275d30ea906Sjfb8856606 				return -1;
276d30ea906Sjfb8856606 		} else if (op_type == RTE_BBDEV_OP_TURBO_ENC) {
277d30ea906Sjfb8856606 			if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1)
278d30ea906Sjfb8856606 				return -1;
2794418919fSjohnjiang 		} else if (op_type == RTE_BBDEV_OP_LDPC_ENC) {
2804418919fSjohnjiang 			if (op_ldpc_encoder_flag_strtoul(tok, &op_flag_value)
2814418919fSjohnjiang 					== -1)
2824418919fSjohnjiang 				return -1;
2834418919fSjohnjiang 		} else if (op_type == RTE_BBDEV_OP_LDPC_DEC) {
2844418919fSjohnjiang 			if (op_ldpc_decoder_flag_strtoul(tok, &op_flag_value)
2854418919fSjohnjiang 					== -1)
2864418919fSjohnjiang 				return -1;
287d30ea906Sjfb8856606 		} else {
288d30ea906Sjfb8856606 			return -1;
289d30ea906Sjfb8856606 		}
290d30ea906Sjfb8856606 
291d30ea906Sjfb8856606 		*op_flags = *op_flags | op_flag_value;
292d30ea906Sjfb8856606 
293d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
294d30ea906Sjfb8856606 		if (tok == NULL)
295d30ea906Sjfb8856606 			break;
296d30ea906Sjfb8856606 	}
297d30ea906Sjfb8856606 
298d30ea906Sjfb8856606 	return 0;
299d30ea906Sjfb8856606 }
300d30ea906Sjfb8856606 
301d30ea906Sjfb8856606 /* convert turbo encoder/decoder op_type from string to enum*/
302d30ea906Sjfb8856606 static int
op_turbo_type_strtol(char * token,enum rte_bbdev_op_type * op_type)303d30ea906Sjfb8856606 op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type)
304d30ea906Sjfb8856606 {
305d30ea906Sjfb8856606 	trim_space(token);
306d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC"))
307d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_TURBO_DEC;
308d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC"))
309d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_TURBO_ENC;
3104418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_ENC"))
3114418919fSjohnjiang 		*op_type = RTE_BBDEV_OP_LDPC_ENC;
3124418919fSjohnjiang 	else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_DEC"))
3134418919fSjohnjiang 		*op_type = RTE_BBDEV_OP_LDPC_DEC;
314d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_OP_NONE"))
315d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_NONE;
316d30ea906Sjfb8856606 	else {
317d30ea906Sjfb8856606 		printf("Not valid turbo op_type: '%s'\n", token);
318d30ea906Sjfb8856606 		return -1;
319d30ea906Sjfb8856606 	}
320d30ea906Sjfb8856606 
321d30ea906Sjfb8856606 	return 0;
322d30ea906Sjfb8856606 }
323d30ea906Sjfb8856606 
324d30ea906Sjfb8856606 /* tokenization expected status values separated by a comma */
325d30ea906Sjfb8856606 static int
parse_expected_status(char * tokens,int * status,enum rte_bbdev_op_type op_type)326d30ea906Sjfb8856606 parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type)
327d30ea906Sjfb8856606 {
328d30ea906Sjfb8856606 	char *tok = NULL;
329d30ea906Sjfb8856606 	bool status_ok = false;
330d30ea906Sjfb8856606 
331d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
332d30ea906Sjfb8856606 	if (tok == NULL)
333d30ea906Sjfb8856606 		return -1;
334d30ea906Sjfb8856606 
335d30ea906Sjfb8856606 	while (tok != NULL) {
336d30ea906Sjfb8856606 		trim_space(tok);
337d30ea906Sjfb8856606 		if (!strcmp(tok, "OK"))
338d30ea906Sjfb8856606 			status_ok = true;
339d30ea906Sjfb8856606 		else if (!strcmp(tok, "DMA"))
340d30ea906Sjfb8856606 			*status = *status | (1 << RTE_BBDEV_DRV_ERROR);
341d30ea906Sjfb8856606 		else if (!strcmp(tok, "FCW"))
342d30ea906Sjfb8856606 			*status = *status | (1 << RTE_BBDEV_DATA_ERROR);
3434418919fSjohnjiang 		else if (!strcmp(tok, "SYNCRC")) {
3444418919fSjohnjiang 			*status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
3454418919fSjohnjiang 			*status = *status | (1 << RTE_BBDEV_CRC_ERROR);
3464418919fSjohnjiang 		} else if (!strcmp(tok, "SYN"))
3474418919fSjohnjiang 			*status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
348d30ea906Sjfb8856606 		else if (!strcmp(tok, "CRC")) {
3494418919fSjohnjiang 			if ((op_type == RTE_BBDEV_OP_TURBO_DEC) ||
3504418919fSjohnjiang 					(op_type == RTE_BBDEV_OP_LDPC_DEC))
351d30ea906Sjfb8856606 				*status = *status | (1 << RTE_BBDEV_CRC_ERROR);
352d30ea906Sjfb8856606 			else {
353d30ea906Sjfb8856606 				printf(
3544418919fSjohnjiang 						"CRC is only a valid value for decoder\n");
355d30ea906Sjfb8856606 				return -1;
356d30ea906Sjfb8856606 			}
357d30ea906Sjfb8856606 		} else {
358d30ea906Sjfb8856606 			printf("Not valid status: '%s'\n", tok);
359d30ea906Sjfb8856606 			return -1;
360d30ea906Sjfb8856606 		}
361d30ea906Sjfb8856606 
362d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
363d30ea906Sjfb8856606 		if (tok == NULL)
364d30ea906Sjfb8856606 			break;
365d30ea906Sjfb8856606 	}
366d30ea906Sjfb8856606 
367d30ea906Sjfb8856606 	if (status_ok && *status != 0) {
368d30ea906Sjfb8856606 		printf(
369d30ea906Sjfb8856606 				"Not valid status values. Cannot be OK and ERROR at the same time.\n");
370d30ea906Sjfb8856606 		return -1;
371d30ea906Sjfb8856606 	}
372d30ea906Sjfb8856606 
373d30ea906Sjfb8856606 	return 0;
374d30ea906Sjfb8856606 }
375d30ea906Sjfb8856606 
376d30ea906Sjfb8856606 /* parse ops data entry (there can be more than 1 input entry, each will be
377d30ea906Sjfb8856606  * contained in a separate op_data_buf struct)
378d30ea906Sjfb8856606  */
379d30ea906Sjfb8856606 static int
parse_data_entry(const char * key_token,char * token,struct test_bbdev_vector * vector,enum op_data_type type,const char * prefix)380d30ea906Sjfb8856606 parse_data_entry(const char *key_token, char *token,
381d30ea906Sjfb8856606 		struct test_bbdev_vector *vector, enum op_data_type type,
382d30ea906Sjfb8856606 		const char *prefix)
383d30ea906Sjfb8856606 {
384d30ea906Sjfb8856606 	int ret;
385d30ea906Sjfb8856606 	uint32_t data_length = 0;
386d30ea906Sjfb8856606 	uint32_t *data = NULL;
387d30ea906Sjfb8856606 	unsigned int id;
388d30ea906Sjfb8856606 	struct op_data_buf *op_data;
389d30ea906Sjfb8856606 	unsigned int *nb_ops;
390d30ea906Sjfb8856606 
391d30ea906Sjfb8856606 	if (type >= DATA_NUM_TYPES) {
392d30ea906Sjfb8856606 		printf("Unknown op type: %d!\n", type);
393d30ea906Sjfb8856606 		return -1;
394d30ea906Sjfb8856606 	}
395d30ea906Sjfb8856606 
396d30ea906Sjfb8856606 	op_data = vector->entries[type].segments;
397d30ea906Sjfb8856606 	nb_ops = &vector->entries[type].nb_segments;
398d30ea906Sjfb8856606 
3994418919fSjohnjiang 	if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) {
400d30ea906Sjfb8856606 		printf("Too many segments (code blocks defined): %u, max %d!\n",
4014418919fSjohnjiang 				*nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS);
402d30ea906Sjfb8856606 		return -1;
403d30ea906Sjfb8856606 	}
404d30ea906Sjfb8856606 
405d30ea906Sjfb8856606 	if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) {
406d30ea906Sjfb8856606 		printf("Missing ID of %s\n", prefix);
407d30ea906Sjfb8856606 		return -1;
408d30ea906Sjfb8856606 	}
409d30ea906Sjfb8856606 	if (id != *nb_ops) {
410d30ea906Sjfb8856606 		printf(
411d30ea906Sjfb8856606 			"Please order data entries sequentially, i.e. %s0, %s1, ...\n",
412d30ea906Sjfb8856606 				prefix, prefix);
413d30ea906Sjfb8856606 		return -1;
414d30ea906Sjfb8856606 	}
415d30ea906Sjfb8856606 
416d30ea906Sjfb8856606 	/* Clear new op data struct */
417d30ea906Sjfb8856606 	memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf));
418d30ea906Sjfb8856606 
419d30ea906Sjfb8856606 	ret = parse_values(token, &data, &data_length);
420d30ea906Sjfb8856606 	if (!ret) {
421d30ea906Sjfb8856606 		op_data[*nb_ops].addr = data;
422d30ea906Sjfb8856606 		op_data[*nb_ops].length = data_length;
423d30ea906Sjfb8856606 		++(*nb_ops);
424d30ea906Sjfb8856606 	}
425d30ea906Sjfb8856606 
426d30ea906Sjfb8856606 	return ret;
427d30ea906Sjfb8856606 }
428d30ea906Sjfb8856606 
429d30ea906Sjfb8856606 /* parses turbo decoder parameters and assigns to global variable */
430d30ea906Sjfb8856606 static int
parse_decoder_params(const char * key_token,char * token,struct test_bbdev_vector * vector)431d30ea906Sjfb8856606 parse_decoder_params(const char *key_token, char *token,
432d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
433d30ea906Sjfb8856606 {
434d30ea906Sjfb8856606 	int ret = 0, status = 0;
435d30ea906Sjfb8856606 	uint32_t op_flags = 0;
436d30ea906Sjfb8856606 	char *err = NULL;
437d30ea906Sjfb8856606 
438d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
439d30ea906Sjfb8856606 
440d30ea906Sjfb8856606 	/* compare keys */
441d30ea906Sjfb8856606 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
442d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
443d30ea906Sjfb8856606 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
444d30ea906Sjfb8856606 
445d30ea906Sjfb8856606 	else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT]))
446d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
447d30ea906Sjfb8856606 				DATA_SOFT_OUTPUT,
448d30ea906Sjfb8856606 				op_data_prefixes[DATA_SOFT_OUTPUT]);
449d30ea906Sjfb8856606 
450d30ea906Sjfb8856606 	else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT]))
451d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
452d30ea906Sjfb8856606 				DATA_HARD_OUTPUT,
453d30ea906Sjfb8856606 				op_data_prefixes[DATA_HARD_OUTPUT]);
454d30ea906Sjfb8856606 	else if (!strcmp(key_token, "e")) {
455d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_E;
456d30ea906Sjfb8856606 		turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
457d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ea")) {
458d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EA;
459d30ea906Sjfb8856606 		turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
460d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
461d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "eb")) {
462d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EB;
463d30ea906Sjfb8856606 		turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
464d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
465d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k")) {
466d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K;
467d30ea906Sjfb8856606 		turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0);
468d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
469d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_pos")) {
470d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_POS;
471d30ea906Sjfb8856606 		turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
472d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
473d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_neg")) {
474d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_NEG;
475d30ea906Sjfb8856606 		turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
476d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
477d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c")) {
478d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C;
479d30ea906Sjfb8856606 		turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0);
480d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
481d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c_neg")) {
482d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C_NEG;
483d30ea906Sjfb8856606 		turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0);
484d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
485d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "cab")) {
486d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CAB;
487d30ea906Sjfb8856606 		turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
488d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
489d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "rv_index")) {
490d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
491d30ea906Sjfb8856606 		turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
492d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
493d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "iter_max")) {
494d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_ITER_MAX;
495d30ea906Sjfb8856606 		turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
496d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
497d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "iter_min")) {
498d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_ITER_MIN;
499d30ea906Sjfb8856606 		turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0);
500d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
501d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_iter_count")) {
502d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
503d30ea906Sjfb8856606 		turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
504d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
505d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ext_scale")) {
506d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXT_SCALE;
507d30ea906Sjfb8856606 		turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0);
508d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
509d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "num_maps")) {
510d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NUM_MAPS;
511d30ea906Sjfb8856606 		turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0);
512d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
5134418919fSjohnjiang 	} else if (!strcmp(key_token, "r")) {
5144418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_R;
5154418919fSjohnjiang 		turbo_dec->tb_params.r = (uint8_t)strtoul(token, &err, 0);
5164418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
517d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "code_block_mode")) {
518d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
519d30ea906Sjfb8856606 		turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
520d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
521d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "op_flags")) {
522d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
523d30ea906Sjfb8856606 		ret = parse_turbo_flags(token, &op_flags,
524d30ea906Sjfb8856606 			vector->op_type);
525d30ea906Sjfb8856606 		if (!ret)
526d30ea906Sjfb8856606 			turbo_dec->op_flags = op_flags;
527d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_status")) {
528d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
529d30ea906Sjfb8856606 		ret = parse_expected_status(token, &status, vector->op_type);
530d30ea906Sjfb8856606 		if (!ret)
531d30ea906Sjfb8856606 			vector->expected_status = status;
532d30ea906Sjfb8856606 	} else {
533d30ea906Sjfb8856606 		printf("Not valid dec key: '%s'\n", key_token);
534d30ea906Sjfb8856606 		return -1;
535d30ea906Sjfb8856606 	}
536d30ea906Sjfb8856606 
537d30ea906Sjfb8856606 	if (ret != 0) {
538d30ea906Sjfb8856606 		printf("Failed with convert '%s\t%s'\n", key_token, token);
539d30ea906Sjfb8856606 		return -1;
540d30ea906Sjfb8856606 	}
541d30ea906Sjfb8856606 
542d30ea906Sjfb8856606 	return 0;
543d30ea906Sjfb8856606 }
544d30ea906Sjfb8856606 
545d30ea906Sjfb8856606 /* parses turbo encoder parameters and assigns to global variable */
546d30ea906Sjfb8856606 static int
parse_encoder_params(const char * key_token,char * token,struct test_bbdev_vector * vector)547d30ea906Sjfb8856606 parse_encoder_params(const char *key_token, char *token,
548d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
549d30ea906Sjfb8856606 {
550d30ea906Sjfb8856606 	int ret = 0, status = 0;
551d30ea906Sjfb8856606 	uint32_t op_flags = 0;
552d30ea906Sjfb8856606 	char *err = NULL;
553d30ea906Sjfb8856606 
554d30ea906Sjfb8856606 
555d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc;
556d30ea906Sjfb8856606 
557d30ea906Sjfb8856606 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
558d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
559d30ea906Sjfb8856606 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
560d30ea906Sjfb8856606 	else if (starts_with(key_token, "output"))
561d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
562d30ea906Sjfb8856606 				DATA_HARD_OUTPUT, "output");
563d30ea906Sjfb8856606 	else if (!strcmp(key_token, "e")) {
564d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_E;
565d30ea906Sjfb8856606 		turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
566d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
567d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ea")) {
568d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EA;
569d30ea906Sjfb8856606 		turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
570d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
571d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "eb")) {
572d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EB;
573d30ea906Sjfb8856606 		turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
574d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
575d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k")) {
576d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K;
577d30ea906Sjfb8856606 		turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0);
578d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
579d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_neg")) {
580d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_NEG;
581d30ea906Sjfb8856606 		turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
582d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
583d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_pos")) {
584d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_POS;
585d30ea906Sjfb8856606 		turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
586d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
587d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c_neg")) {
588d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C_NEG;
589d30ea906Sjfb8856606 		turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0);
590d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
591d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c")) {
592d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C;
593d30ea906Sjfb8856606 		turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
594d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
595d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "cab")) {
596d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CAB;
597d30ea906Sjfb8856606 		turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
598d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
599d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "rv_index")) {
600d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
601d30ea906Sjfb8856606 		turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
602d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
603d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb")) {
604d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB;
605d30ea906Sjfb8856606 		turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0);
606d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
607d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb_neg")) {
608d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB_NEG;
609d30ea906Sjfb8856606 		turbo_enc->tb_params.ncb_neg =
610d30ea906Sjfb8856606 				(uint16_t) strtoul(token, &err, 0);
611d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
612d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb_pos")) {
613d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB_POS;
614d30ea906Sjfb8856606 		turbo_enc->tb_params.ncb_pos =
615d30ea906Sjfb8856606 				(uint16_t) strtoul(token, &err, 0);
616d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
617d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "r")) {
618d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_R;
619d30ea906Sjfb8856606 		turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
620d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
621d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "code_block_mode")) {
622d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
623d30ea906Sjfb8856606 		turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
624d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
625d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "op_flags")) {
626d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
627d30ea906Sjfb8856606 		ret = parse_turbo_flags(token, &op_flags,
628d30ea906Sjfb8856606 				vector->op_type);
629d30ea906Sjfb8856606 		if (!ret)
630d30ea906Sjfb8856606 			turbo_enc->op_flags = op_flags;
631d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_status")) {
632d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
633d30ea906Sjfb8856606 		ret = parse_expected_status(token, &status, vector->op_type);
634d30ea906Sjfb8856606 		if (!ret)
635d30ea906Sjfb8856606 			vector->expected_status = status;
636d30ea906Sjfb8856606 	} else {
637d30ea906Sjfb8856606 		printf("Not valid enc key: '%s'\n", key_token);
638d30ea906Sjfb8856606 		return -1;
639d30ea906Sjfb8856606 	}
640d30ea906Sjfb8856606 
641d30ea906Sjfb8856606 	if (ret != 0) {
642d30ea906Sjfb8856606 		printf("Failed with convert '%s\t%s'\n", key_token, token);
643d30ea906Sjfb8856606 		return -1;
644d30ea906Sjfb8856606 	}
645d30ea906Sjfb8856606 
646d30ea906Sjfb8856606 	return 0;
647d30ea906Sjfb8856606 }
648d30ea906Sjfb8856606 
6494418919fSjohnjiang 
6504418919fSjohnjiang /* parses LDPC encoder parameters and assigns to global variable */
6514418919fSjohnjiang static int
parse_ldpc_encoder_params(const char * key_token,char * token,struct test_bbdev_vector * vector)6524418919fSjohnjiang parse_ldpc_encoder_params(const char *key_token, char *token,
6534418919fSjohnjiang 		struct test_bbdev_vector *vector)
6544418919fSjohnjiang {
6554418919fSjohnjiang 	int ret = 0, status = 0;
6564418919fSjohnjiang 	uint32_t op_flags = 0;
6574418919fSjohnjiang 	char *err = NULL;
6584418919fSjohnjiang 
6594418919fSjohnjiang 	struct rte_bbdev_op_ldpc_enc *ldpc_enc = &vector->ldpc_enc;
6604418919fSjohnjiang 
6614418919fSjohnjiang 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
6624418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
6634418919fSjohnjiang 				DATA_INPUT,
6644418919fSjohnjiang 				op_data_prefixes[DATA_INPUT]);
6654418919fSjohnjiang 	else if (starts_with(key_token, "output"))
6664418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
6674418919fSjohnjiang 				DATA_HARD_OUTPUT,
6684418919fSjohnjiang 				"output");
6694418919fSjohnjiang 	else if (!strcmp(key_token, "e")) {
6704418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_E;
6714418919fSjohnjiang 		ldpc_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
6724418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6734418919fSjohnjiang 	} else if (!strcmp(key_token, "ea")) {
6744418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EA;
6754418919fSjohnjiang 		ldpc_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
6764418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6774418919fSjohnjiang 	} else if (!strcmp(key_token, "eb")) {
6784418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EB;
6794418919fSjohnjiang 		ldpc_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
6804418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6814418919fSjohnjiang 	} else if (!strcmp(key_token, "c")) {
6824418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_C;
6834418919fSjohnjiang 		ldpc_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
6844418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6854418919fSjohnjiang 	} else if (!strcmp(key_token, "cab")) {
6864418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_CAB;
6874418919fSjohnjiang 		ldpc_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
6884418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6894418919fSjohnjiang 	} else if (!strcmp(key_token, "rv_index")) {
6904418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
6914418919fSjohnjiang 		ldpc_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
6924418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6934418919fSjohnjiang 	} else if (!strcmp(key_token, "n_cb")) {
6944418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_NCB;
6954418919fSjohnjiang 		ldpc_enc->n_cb = (uint16_t) strtoul(token, &err, 0);
6964418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
6974418919fSjohnjiang 	} else if (!strcmp(key_token, "r")) {
6984418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_R;
6994418919fSjohnjiang 		ldpc_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
7004418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7014418919fSjohnjiang 	} else if (!strcmp(key_token, "q_m")) {
7024418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_QM;
7034418919fSjohnjiang 		ldpc_enc->q_m = (uint8_t) strtoul(token, &err, 0);
7044418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7054418919fSjohnjiang 	} else if (!strcmp(key_token, "basegraph")) {
7064418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_BG;
7074418919fSjohnjiang 		ldpc_enc->basegraph = (uint8_t) strtoul(token, &err, 0);
7084418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7094418919fSjohnjiang 	} else if (!strcmp(key_token, "z_c")) {
7104418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_ZC;
7114418919fSjohnjiang 		ldpc_enc->z_c = (uint16_t) strtoul(token, &err, 0);
7124418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7134418919fSjohnjiang 	} else if (!strcmp(key_token, "n_filler")) {
7144418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_F;
7154418919fSjohnjiang 		ldpc_enc->n_filler = (uint16_t) strtoul(token, &err, 0);
7164418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7174418919fSjohnjiang 	} else if (!strcmp(key_token, "code_block_mode")) {
7184418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
7194418919fSjohnjiang 		ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
7204418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7214418919fSjohnjiang 	} else if (!strcmp(key_token, "op_flags")) {
7224418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
7234418919fSjohnjiang 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
7244418919fSjohnjiang 		if (!ret)
7254418919fSjohnjiang 			ldpc_enc->op_flags = op_flags;
7264418919fSjohnjiang 	} else if (!strcmp(key_token, "expected_status")) {
7274418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
7284418919fSjohnjiang 		ret = parse_expected_status(token, &status, vector->op_type);
7294418919fSjohnjiang 		if (!ret)
7304418919fSjohnjiang 			vector->expected_status = status;
7314418919fSjohnjiang 	} else {
7324418919fSjohnjiang 		printf("Not valid ldpc enc key: '%s'\n", key_token);
7334418919fSjohnjiang 		return -1;
7344418919fSjohnjiang 	}
7354418919fSjohnjiang 
7364418919fSjohnjiang 	if (ret != 0) {
7374418919fSjohnjiang 		printf("Failed with convert '%s\t%s'\n", key_token, token);
7384418919fSjohnjiang 		return -1;
7394418919fSjohnjiang 	}
7404418919fSjohnjiang 
7414418919fSjohnjiang 	return 0;
7424418919fSjohnjiang }
7434418919fSjohnjiang 
7444418919fSjohnjiang /* parses LDPC decoder parameters and assigns to global variable */
7454418919fSjohnjiang static int
parse_ldpc_decoder_params(const char * key_token,char * token,struct test_bbdev_vector * vector)7464418919fSjohnjiang parse_ldpc_decoder_params(const char *key_token, char *token,
7474418919fSjohnjiang 		struct test_bbdev_vector *vector)
7484418919fSjohnjiang {
7494418919fSjohnjiang 	int ret = 0, status = 0;
7504418919fSjohnjiang 	uint32_t op_flags = 0;
7514418919fSjohnjiang 	char *err = NULL;
7524418919fSjohnjiang 
7534418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
7544418919fSjohnjiang 
7554418919fSjohnjiang 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
7564418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
7574418919fSjohnjiang 				DATA_INPUT,
7584418919fSjohnjiang 				op_data_prefixes[DATA_INPUT]);
7594418919fSjohnjiang 	else if (starts_with(key_token, "output"))
7604418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
7614418919fSjohnjiang 				DATA_HARD_OUTPUT,
7624418919fSjohnjiang 				"output");
7634418919fSjohnjiang 	else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_INPUT]))
7644418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
7654418919fSjohnjiang 				DATA_HARQ_INPUT,
7664418919fSjohnjiang 				op_data_prefixes[DATA_HARQ_INPUT]);
7674418919fSjohnjiang 	else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_OUTPUT]))
7684418919fSjohnjiang 		ret = parse_data_entry(key_token, token, vector,
7694418919fSjohnjiang 				DATA_HARQ_OUTPUT,
7704418919fSjohnjiang 				op_data_prefixes[DATA_HARQ_OUTPUT]);
7714418919fSjohnjiang 	else if (!strcmp(key_token, "e")) {
7724418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_E;
7734418919fSjohnjiang 		ldpc_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
7744418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7754418919fSjohnjiang 	} else if (!strcmp(key_token, "ea")) {
7764418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EA;
7774418919fSjohnjiang 		ldpc_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
7784418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7794418919fSjohnjiang 	} else if (!strcmp(key_token, "eb")) {
7804418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EB;
7814418919fSjohnjiang 		ldpc_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
7824418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7834418919fSjohnjiang 	} else if (!strcmp(key_token, "c")) {
7844418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_C;
7854418919fSjohnjiang 		ldpc_dec->tb_params.c = (uint8_t) strtoul(token, &err, 0);
7864418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7874418919fSjohnjiang 	} else if (!strcmp(key_token, "cab")) {
7884418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_CAB;
7894418919fSjohnjiang 		ldpc_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
7904418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7914418919fSjohnjiang 	} else if (!strcmp(key_token, "rv_index")) {
7924418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
7934418919fSjohnjiang 		ldpc_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
7944418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7954418919fSjohnjiang 	} else if (!strcmp(key_token, "n_cb")) {
7964418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_NCB;
7974418919fSjohnjiang 		ldpc_dec->n_cb = (uint16_t) strtoul(token, &err, 0);
7984418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
7994418919fSjohnjiang 	} else if (!strcmp(key_token, "r")) {
8004418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_R;
8014418919fSjohnjiang 		ldpc_dec->tb_params.r = (uint8_t) strtoul(token, &err, 0);
8024418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8034418919fSjohnjiang 	} else if (!strcmp(key_token, "q_m")) {
8044418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_QM;
8054418919fSjohnjiang 		ldpc_dec->q_m = (uint8_t) strtoul(token, &err, 0);
8064418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8074418919fSjohnjiang 	} else if (!strcmp(key_token, "basegraph")) {
8084418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_BG;
8094418919fSjohnjiang 		ldpc_dec->basegraph = (uint8_t) strtoul(token, &err, 0);
8104418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8114418919fSjohnjiang 	} else if (!strcmp(key_token, "z_c")) {
8124418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_ZC;
8134418919fSjohnjiang 		ldpc_dec->z_c = (uint16_t) strtoul(token, &err, 0);
8144418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8154418919fSjohnjiang 	} else if (!strcmp(key_token, "n_filler")) {
8164418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_F;
8174418919fSjohnjiang 		ldpc_dec->n_filler = (uint16_t) strtoul(token, &err, 0);
8184418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8194418919fSjohnjiang 	} else if (!strcmp(key_token, "expected_iter_count")) {
8204418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
8214418919fSjohnjiang 		ldpc_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
8224418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8234418919fSjohnjiang 	} else if (!strcmp(key_token, "iter_max")) {
8244418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_ITER_MAX;
8254418919fSjohnjiang 		ldpc_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
8264418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8274418919fSjohnjiang 	} else if (!strcmp(key_token, "code_block_mode")) {
8284418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
8294418919fSjohnjiang 		ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
8304418919fSjohnjiang 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
8314418919fSjohnjiang 	} else if (!strcmp(key_token, "op_flags")) {
8324418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
8334418919fSjohnjiang 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
8344418919fSjohnjiang 		if (!ret)
8354418919fSjohnjiang 			ldpc_dec->op_flags = op_flags;
8364418919fSjohnjiang 	} else if (!strcmp(key_token, "expected_status")) {
8374418919fSjohnjiang 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
8384418919fSjohnjiang 		ret = parse_expected_status(token, &status, vector->op_type);
8394418919fSjohnjiang 		if (!ret)
8404418919fSjohnjiang 			vector->expected_status = status;
8414418919fSjohnjiang 	} else {
8424418919fSjohnjiang 		printf("Not valid ldpc dec key: '%s'\n", key_token);
8434418919fSjohnjiang 		return -1;
8444418919fSjohnjiang 	}
8454418919fSjohnjiang 
8464418919fSjohnjiang 	if (ret != 0) {
8474418919fSjohnjiang 		printf("Failed with convert '%s\t%s'\n", key_token, token);
8484418919fSjohnjiang 		return -1;
8494418919fSjohnjiang 	}
8504418919fSjohnjiang 
8514418919fSjohnjiang 	return 0;
8524418919fSjohnjiang }
8534418919fSjohnjiang 
854d30ea906Sjfb8856606 /* checks the type of key and assigns data */
855d30ea906Sjfb8856606 static int
parse_entry(char * entry,struct test_bbdev_vector * vector)856d30ea906Sjfb8856606 parse_entry(char *entry, struct test_bbdev_vector *vector)
857d30ea906Sjfb8856606 {
858d30ea906Sjfb8856606 	int ret = 0;
859d30ea906Sjfb8856606 	char *token, *key_token;
860d30ea906Sjfb8856606 	enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE;
861d30ea906Sjfb8856606 
862d30ea906Sjfb8856606 	if (entry == NULL) {
863d30ea906Sjfb8856606 		printf("Expected entry value\n");
864d30ea906Sjfb8856606 		return -1;
865d30ea906Sjfb8856606 	}
866d30ea906Sjfb8856606 
867d30ea906Sjfb8856606 	/* get key */
868d30ea906Sjfb8856606 	token = strtok(entry, ENTRY_DELIMITER);
869d30ea906Sjfb8856606 	key_token = token;
870d30ea906Sjfb8856606 	/* get values for key */
871d30ea906Sjfb8856606 	token = strtok(NULL, ENTRY_DELIMITER);
872d30ea906Sjfb8856606 
873d30ea906Sjfb8856606 	if (key_token == NULL || token == NULL) {
874d30ea906Sjfb8856606 		printf("Expected 'key = values' but was '%.40s'..\n", entry);
875d30ea906Sjfb8856606 		return -1;
876d30ea906Sjfb8856606 	}
877d30ea906Sjfb8856606 	trim_space(key_token);
878d30ea906Sjfb8856606 
879d30ea906Sjfb8856606 	/* first key_token has to specify type of operation */
880d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_NONE) {
881d30ea906Sjfb8856606 		if (!strcmp(key_token, "op_type")) {
882d30ea906Sjfb8856606 			ret = op_turbo_type_strtol(token, &op_type);
883d30ea906Sjfb8856606 			if (!ret)
884d30ea906Sjfb8856606 				vector->op_type = op_type;
885d30ea906Sjfb8856606 			return (!ret) ? 0 : -1;
886d30ea906Sjfb8856606 		}
887d30ea906Sjfb8856606 		printf("First key_token (%s) does not specify op_type\n",
888d30ea906Sjfb8856606 				key_token);
889d30ea906Sjfb8856606 		return -1;
890d30ea906Sjfb8856606 	}
891d30ea906Sjfb8856606 
892d30ea906Sjfb8856606 	/* compare keys */
893d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
894d30ea906Sjfb8856606 		if (parse_decoder_params(key_token, token, vector) == -1)
895d30ea906Sjfb8856606 			return -1;
896d30ea906Sjfb8856606 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
897d30ea906Sjfb8856606 		if (parse_encoder_params(key_token, token, vector) == -1)
898d30ea906Sjfb8856606 			return -1;
8994418919fSjohnjiang 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
9004418919fSjohnjiang 		if (parse_ldpc_encoder_params(key_token, token, vector) == -1)
9014418919fSjohnjiang 			return -1;
9024418919fSjohnjiang 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
9034418919fSjohnjiang 		if (parse_ldpc_decoder_params(key_token, token, vector) == -1)
9044418919fSjohnjiang 			return -1;
905d30ea906Sjfb8856606 	}
906d30ea906Sjfb8856606 
907d30ea906Sjfb8856606 	return 0;
908d30ea906Sjfb8856606 }
909d30ea906Sjfb8856606 
910d30ea906Sjfb8856606 static int
check_decoder_segments(struct test_bbdev_vector * vector)911d30ea906Sjfb8856606 check_decoder_segments(struct test_bbdev_vector *vector)
912d30ea906Sjfb8856606 {
913d30ea906Sjfb8856606 	unsigned char i;
914d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
915d30ea906Sjfb8856606 
916d30ea906Sjfb8856606 	if (vector->entries[DATA_INPUT].nb_segments == 0)
917d30ea906Sjfb8856606 		return -1;
918d30ea906Sjfb8856606 
919d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
920d30ea906Sjfb8856606 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
921d30ea906Sjfb8856606 			return -1;
922d30ea906Sjfb8856606 
923d30ea906Sjfb8856606 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
924d30ea906Sjfb8856606 		return -1;
925d30ea906Sjfb8856606 
926d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments;
927d30ea906Sjfb8856606 			i++)
928d30ea906Sjfb8856606 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
929d30ea906Sjfb8856606 			return -1;
930d30ea906Sjfb8856606 
931d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
932d30ea906Sjfb8856606 			(vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
933d30ea906Sjfb8856606 		return -1;
934d30ea906Sjfb8856606 
935d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments;
936d30ea906Sjfb8856606 			i++)
937d30ea906Sjfb8856606 		if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
938d30ea906Sjfb8856606 			return -1;
939d30ea906Sjfb8856606 
940d30ea906Sjfb8856606 	return 0;
941d30ea906Sjfb8856606 }
942d30ea906Sjfb8856606 
943d30ea906Sjfb8856606 static int
check_ldpc_decoder_segments(struct test_bbdev_vector * vector)9444418919fSjohnjiang check_ldpc_decoder_segments(struct test_bbdev_vector *vector)
9454418919fSjohnjiang {
9464418919fSjohnjiang 	unsigned char i;
9474418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
9484418919fSjohnjiang 
9494418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
9504418919fSjohnjiang 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
9514418919fSjohnjiang 			return -1;
9524418919fSjohnjiang 
9534418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
9544418919fSjohnjiang 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
9554418919fSjohnjiang 			return -1;
9564418919fSjohnjiang 
9574418919fSjohnjiang 	if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) &&
9584418919fSjohnjiang 			(vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
9594418919fSjohnjiang 		return -1;
9604418919fSjohnjiang 
9614418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; i++)
9624418919fSjohnjiang 		if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
9634418919fSjohnjiang 			return -1;
9644418919fSjohnjiang 
9654418919fSjohnjiang 	if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) &&
9664418919fSjohnjiang 			(vector->entries[DATA_HARQ_OUTPUT].nb_segments == 0))
9674418919fSjohnjiang 		return -1;
9684418919fSjohnjiang 
9694418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_HARQ_OUTPUT].nb_segments; i++)
9704418919fSjohnjiang 		if (vector->entries[DATA_HARQ_OUTPUT].segments[i].addr == NULL)
9714418919fSjohnjiang 			return -1;
9724418919fSjohnjiang 
9734418919fSjohnjiang 	return 0;
9744418919fSjohnjiang }
9754418919fSjohnjiang 
9764418919fSjohnjiang static int
check_decoder_llr_spec(struct test_bbdev_vector * vector)977d30ea906Sjfb8856606 check_decoder_llr_spec(struct test_bbdev_vector *vector)
978d30ea906Sjfb8856606 {
979d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
980d30ea906Sjfb8856606 
981d30ea906Sjfb8856606 	/* Check input LLR sign formalism specification */
982d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
983d30ea906Sjfb8856606 			(turbo_dec->op_flags &
984d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
985d30ea906Sjfb8856606 		printf(
986d30ea906Sjfb8856606 			"Both positive and negative LLR input flags were set!\n");
987d30ea906Sjfb8856606 		return -1;
988d30ea906Sjfb8856606 	}
989d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
990d30ea906Sjfb8856606 			!(turbo_dec->op_flags &
991d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
992d30ea906Sjfb8856606 		printf(
9934418919fSjohnjiang 			"INFO: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
994d30ea906Sjfb8856606 		turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
995d30ea906Sjfb8856606 	}
996d30ea906Sjfb8856606 
997d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT))
998d30ea906Sjfb8856606 		return 0;
999d30ea906Sjfb8856606 
1000d30ea906Sjfb8856606 	/* Check output LLR sign formalism specification */
1001d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1002d30ea906Sjfb8856606 			(turbo_dec->op_flags &
1003d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1004d30ea906Sjfb8856606 		printf(
1005d30ea906Sjfb8856606 			"Both positive and negative LLR output flags were set!\n");
1006d30ea906Sjfb8856606 		return -1;
1007d30ea906Sjfb8856606 	}
1008d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1009d30ea906Sjfb8856606 			!(turbo_dec->op_flags &
1010d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1011d30ea906Sjfb8856606 		printf(
10124418919fSjohnjiang 			"INFO: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
1013d30ea906Sjfb8856606 		turbo_dec->op_flags |=
1014d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
1015d30ea906Sjfb8856606 	}
1016d30ea906Sjfb8856606 
1017d30ea906Sjfb8856606 	return 0;
1018d30ea906Sjfb8856606 }
1019d30ea906Sjfb8856606 
10204418919fSjohnjiang static int
check_decoder_op_flags(struct test_bbdev_vector * vector)10214418919fSjohnjiang check_decoder_op_flags(struct test_bbdev_vector *vector)
10224418919fSjohnjiang {
10234418919fSjohnjiang 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
10244418919fSjohnjiang 
10254418919fSjohnjiang 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP) &&
10264418919fSjohnjiang 		!(turbo_dec->op_flags & RTE_BBDEV_TURBO_CRC_TYPE_24B)) {
10274418919fSjohnjiang 		printf(
10284418919fSjohnjiang 			"WARNING: RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP flag is missing RTE_BBDEV_TURBO_CRC_TYPE_24B\n");
10294418919fSjohnjiang 		return -1;
10304418919fSjohnjiang 	}
10314418919fSjohnjiang 
10324418919fSjohnjiang 	return 0;
10334418919fSjohnjiang }
10344418919fSjohnjiang 
1035d30ea906Sjfb8856606 /* checks decoder parameters */
1036d30ea906Sjfb8856606 static int
check_decoder(struct test_bbdev_vector * vector)1037d30ea906Sjfb8856606 check_decoder(struct test_bbdev_vector *vector)
1038d30ea906Sjfb8856606 {
1039d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
1040d30ea906Sjfb8856606 	const int mask = vector->mask;
1041d30ea906Sjfb8856606 
1042d30ea906Sjfb8856606 	if (check_decoder_segments(vector) < 0)
1043d30ea906Sjfb8856606 		return -1;
1044d30ea906Sjfb8856606 
1045d30ea906Sjfb8856606 	if (check_decoder_llr_spec(vector) < 0)
1046d30ea906Sjfb8856606 		return -1;
1047d30ea906Sjfb8856606 
10484418919fSjohnjiang 	if (check_decoder_op_flags(vector) < 0)
10494418919fSjohnjiang 		return -1;
10504418919fSjohnjiang 
1051d30ea906Sjfb8856606 	/* Check which params were set */
1052d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1053d30ea906Sjfb8856606 		printf(
1054d30ea906Sjfb8856606 			"WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
1055d30ea906Sjfb8856606 		turbo_dec->code_block_mode = 1;
1056d30ea906Sjfb8856606 	}
1057d30ea906Sjfb8856606 	if (turbo_dec->code_block_mode == 0) {
1058d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EA))
1059d30ea906Sjfb8856606 			printf(
1060d30ea906Sjfb8856606 				"WARNING: ea was not specified in vector file and will be set to 0\n");
1061d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EB))
1062d30ea906Sjfb8856606 			printf(
1063d30ea906Sjfb8856606 				"WARNING: eb was not specified in vector file and will be set to 0\n");
1064d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_NEG))
1065d30ea906Sjfb8856606 			printf(
1066d30ea906Sjfb8856606 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
1067d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_POS))
1068d30ea906Sjfb8856606 			printf(
1069d30ea906Sjfb8856606 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
1070d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C_NEG))
1071d30ea906Sjfb8856606 			printf(
1072d30ea906Sjfb8856606 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
1073d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C)) {
1074d30ea906Sjfb8856606 			printf(
1075d30ea906Sjfb8856606 				"WARNING: c was not specified in vector file and will be set to 1\n");
1076d30ea906Sjfb8856606 			turbo_dec->tb_params.c = 1;
1077d30ea906Sjfb8856606 		}
1078d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_CAB))
1079d30ea906Sjfb8856606 			printf(
1080d30ea906Sjfb8856606 				"WARNING: cab was not specified in vector file and will be set to 0\n");
10814418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_R))
10824418919fSjohnjiang 			printf(
10834418919fSjohnjiang 				"WARNING: r was not specified in vector file and will be set to 0\n");
1084d30ea906Sjfb8856606 	} else {
1085d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_E))
1086d30ea906Sjfb8856606 			printf(
1087d30ea906Sjfb8856606 				"WARNING: e was not specified in vector file and will be set to 0\n");
1088d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K))
1089d30ea906Sjfb8856606 			printf(
1090d30ea906Sjfb8856606 				"WARNING: k was not specified in vector file and will be set to 0\n");
1091d30ea906Sjfb8856606 	}
1092d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1093d30ea906Sjfb8856606 		printf(
10944418919fSjohnjiang 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1095d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_ITER_MIN))
1096d30ea906Sjfb8856606 		printf(
1097d30ea906Sjfb8856606 			"WARNING: iter_min was not specified in vector file and will be set to 0\n");
1098d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_ITER_MAX))
1099d30ea906Sjfb8856606 		printf(
1100d30ea906Sjfb8856606 			"WARNING: iter_max was not specified in vector file and will be set to 0\n");
1101d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
1102d30ea906Sjfb8856606 		printf(
1103d30ea906Sjfb8856606 			"WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
1104d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXT_SCALE))
1105d30ea906Sjfb8856606 		printf(
1106d30ea906Sjfb8856606 			"WARNING: ext_scale was not specified in vector file and will be set to 0\n");
1107d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
1108d30ea906Sjfb8856606 		printf(
1109d30ea906Sjfb8856606 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
1110d30ea906Sjfb8856606 		turbo_dec->num_maps = 0;
1111d30ea906Sjfb8856606 	} else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) &&
1112d30ea906Sjfb8856606 			mask & TEST_BBDEV_VF_NUM_MAPS) {
1113d30ea906Sjfb8856606 		printf(
11144418919fSjohnjiang 			"INFO: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n");
1115d30ea906Sjfb8856606 		turbo_dec->num_maps = 0;
1116d30ea906Sjfb8856606 	}
1117d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1118d30ea906Sjfb8856606 		printf(
1119d30ea906Sjfb8856606 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1120d30ea906Sjfb8856606 	return 0;
1121d30ea906Sjfb8856606 }
1122d30ea906Sjfb8856606 
11234418919fSjohnjiang /* checks LDPC decoder parameters */
11244418919fSjohnjiang static int
check_ldpc_decoder(struct test_bbdev_vector * vector)11254418919fSjohnjiang check_ldpc_decoder(struct test_bbdev_vector *vector)
11264418919fSjohnjiang {
11274418919fSjohnjiang 	struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
11284418919fSjohnjiang 	const int mask = vector->mask;
11294418919fSjohnjiang 
11304418919fSjohnjiang 	if (check_ldpc_decoder_segments(vector) < 0)
11314418919fSjohnjiang 		return -1;
11324418919fSjohnjiang 
11334418919fSjohnjiang 	/*
11344418919fSjohnjiang 	 * if (check_ldpc_decoder_llr_spec(vector) < 0)
11354418919fSjohnjiang 	 *	return -1;
11364418919fSjohnjiang 	 *
11374418919fSjohnjiang 	 * if (check_ldpc_decoder_op_flags(vector) < 0)
11384418919fSjohnjiang 	 *	return -1;
11394418919fSjohnjiang 	 */
11404418919fSjohnjiang 
11414418919fSjohnjiang 	/* Check which params were set */
11424418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
11434418919fSjohnjiang 		printf(
11444418919fSjohnjiang 			"WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
11454418919fSjohnjiang 		ldpc_dec->code_block_mode = 1;
11464418919fSjohnjiang 	}
11474418919fSjohnjiang 	if (ldpc_dec->code_block_mode == 0) {
11484418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_EA))
11494418919fSjohnjiang 			printf(
11504418919fSjohnjiang 				"WARNING: ea was not specified in vector file and will be set to 0\n");
11514418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_EB))
11524418919fSjohnjiang 			printf(
11534418919fSjohnjiang 				"WARNING: eb was not specified in vector file and will be set to 0\n");
11544418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_C)) {
11554418919fSjohnjiang 			printf(
11564418919fSjohnjiang 				"WARNING: c was not specified in vector file and will be set to 1\n");
11574418919fSjohnjiang 			ldpc_dec->tb_params.c = 1;
11584418919fSjohnjiang 		}
11594418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_CAB))
11604418919fSjohnjiang 			printf(
11614418919fSjohnjiang 				"WARNING: cab was not specified in vector file and will be set to 0\n");
11624418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_R))
11634418919fSjohnjiang 			printf(
11644418919fSjohnjiang 				"WARNING: r was not specified in vector file and will be set to 0\n");
11654418919fSjohnjiang 	} else {
11664418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_E))
11674418919fSjohnjiang 			printf(
11684418919fSjohnjiang 				"WARNING: e was not specified in vector file and will be set to 0\n");
11694418919fSjohnjiang 	}
11704418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
11714418919fSjohnjiang 		printf(
11724418919fSjohnjiang 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
11734418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_ITER_MAX))
11744418919fSjohnjiang 		printf(
11754418919fSjohnjiang 			"WARNING: iter_max was not specified in vector file and will be set to 0\n");
11764418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
11774418919fSjohnjiang 		printf(
11784418919fSjohnjiang 			"WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
11794418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
11804418919fSjohnjiang 		printf(
11814418919fSjohnjiang 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
11824418919fSjohnjiang 	}
11834418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
11844418919fSjohnjiang 		printf(
11854418919fSjohnjiang 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
11864418919fSjohnjiang 	return 0;
11874418919fSjohnjiang }
11884418919fSjohnjiang 
1189d30ea906Sjfb8856606 /* checks encoder parameters */
1190d30ea906Sjfb8856606 static int
check_encoder(struct test_bbdev_vector * vector)1191d30ea906Sjfb8856606 check_encoder(struct test_bbdev_vector *vector)
1192d30ea906Sjfb8856606 {
1193d30ea906Sjfb8856606 	unsigned char i;
1194d30ea906Sjfb8856606 	const int mask = vector->mask;
1195d30ea906Sjfb8856606 
1196d30ea906Sjfb8856606 	if (vector->entries[DATA_INPUT].nb_segments == 0)
1197d30ea906Sjfb8856606 		return -1;
1198d30ea906Sjfb8856606 
1199d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
1200d30ea906Sjfb8856606 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
1201d30ea906Sjfb8856606 			return -1;
1202d30ea906Sjfb8856606 
1203d30ea906Sjfb8856606 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
1204d30ea906Sjfb8856606 		return -1;
1205d30ea906Sjfb8856606 
1206d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
1207d30ea906Sjfb8856606 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
1208d30ea906Sjfb8856606 			return -1;
1209d30ea906Sjfb8856606 
1210d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1211d30ea906Sjfb8856606 		printf(
1212d30ea906Sjfb8856606 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
1213d30ea906Sjfb8856606 		vector->turbo_enc.code_block_mode = 1;
1214d30ea906Sjfb8856606 	}
1215d30ea906Sjfb8856606 	if (vector->turbo_enc.code_block_mode == 0) {
1216d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags &
1217d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
1218d30ea906Sjfb8856606 			printf(
1219d30ea906Sjfb8856606 				"WARNING: ea was not specified in vector file and will be set to 0\n");
1220d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags &
1221d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
1222d30ea906Sjfb8856606 			printf(
1223d30ea906Sjfb8856606 				"WARNING: eb was not specified in vector file and will be set to 0\n");
1224d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_NEG))
1225d30ea906Sjfb8856606 			printf(
1226d30ea906Sjfb8856606 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
1227d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_POS))
1228d30ea906Sjfb8856606 			printf(
1229d30ea906Sjfb8856606 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
1230d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C_NEG))
1231d30ea906Sjfb8856606 			printf(
1232d30ea906Sjfb8856606 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
1233d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C)) {
1234d30ea906Sjfb8856606 			printf(
1235d30ea906Sjfb8856606 				"WARNING: c was not specified in vector file and will be set to 1\n");
1236d30ea906Sjfb8856606 			vector->turbo_enc.tb_params.c = 1;
1237d30ea906Sjfb8856606 		}
1238d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags &
1239d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
1240d30ea906Sjfb8856606 			printf(
1241d30ea906Sjfb8856606 				"WARNING: cab was not specified in vector file and will be set to 0\n");
1242d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB_NEG))
1243d30ea906Sjfb8856606 			printf(
1244d30ea906Sjfb8856606 				"WARNING: ncb_neg was not specified in vector file and will be set to 0\n");
1245d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB_POS))
1246d30ea906Sjfb8856606 			printf(
1247d30ea906Sjfb8856606 				"WARNING: ncb_pos was not specified in vector file and will be set to 0\n");
1248d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_R))
1249d30ea906Sjfb8856606 			printf(
1250d30ea906Sjfb8856606 				"WARNING: r was not specified in vector file and will be set to 0\n");
1251d30ea906Sjfb8856606 	} else {
1252d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
1253d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
1254d30ea906Sjfb8856606 			printf(
1255d30ea906Sjfb8856606 				"WARNING: e was not specified in vector file and will be set to 0\n");
1256d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K))
1257d30ea906Sjfb8856606 			printf(
1258d30ea906Sjfb8856606 				"WARNING: k was not specified in vector file and will be set to 0\n");
1259d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB))
1260d30ea906Sjfb8856606 			printf(
1261d30ea906Sjfb8856606 				"WARNING: ncb was not specified in vector file and will be set to 0\n");
1262d30ea906Sjfb8856606 	}
1263d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1264d30ea906Sjfb8856606 		printf(
12654418919fSjohnjiang 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
1266d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
1267d30ea906Sjfb8856606 		printf(
12684418919fSjohnjiang 			"INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
12694418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
12704418919fSjohnjiang 		printf(
12714418919fSjohnjiang 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
12724418919fSjohnjiang 
12734418919fSjohnjiang 	return 0;
12744418919fSjohnjiang }
12754418919fSjohnjiang 
12764418919fSjohnjiang 
12774418919fSjohnjiang /* checks encoder parameters */
12784418919fSjohnjiang static int
check_ldpc_encoder(struct test_bbdev_vector * vector)12794418919fSjohnjiang check_ldpc_encoder(struct test_bbdev_vector *vector)
12804418919fSjohnjiang {
12814418919fSjohnjiang 	unsigned char i;
12824418919fSjohnjiang 	const int mask = vector->mask;
12834418919fSjohnjiang 
12844418919fSjohnjiang 	if (vector->entries[DATA_INPUT].nb_segments == 0)
12854418919fSjohnjiang 		return -1;
12864418919fSjohnjiang 
12874418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
12884418919fSjohnjiang 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
12894418919fSjohnjiang 			return -1;
12904418919fSjohnjiang 
12914418919fSjohnjiang 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
12924418919fSjohnjiang 		return -1;
12934418919fSjohnjiang 
12944418919fSjohnjiang 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
12954418919fSjohnjiang 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
12964418919fSjohnjiang 			return -1;
12974418919fSjohnjiang 
12984418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
12994418919fSjohnjiang 		printf(
13004418919fSjohnjiang 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
13014418919fSjohnjiang 		vector->turbo_enc.code_block_mode = 1;
13024418919fSjohnjiang 	}
13034418919fSjohnjiang 	if (vector->turbo_enc.code_block_mode == 0) {
13044418919fSjohnjiang 	} else {
13054418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
13064418919fSjohnjiang 				RTE_BBDEV_TURBO_RATE_MATCH))
13074418919fSjohnjiang 			printf(
13084418919fSjohnjiang 				"WARNING: e was not specified in vector file and will be set to 0\n");
13094418919fSjohnjiang 		if (!(mask & TEST_BBDEV_VF_NCB))
13104418919fSjohnjiang 			printf(
13114418919fSjohnjiang 				"WARNING: ncb was not specified in vector file and will be set to 0\n");
13124418919fSjohnjiang 	}
13134418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_BG))
13144418919fSjohnjiang 		printf(
13154418919fSjohnjiang 			"WARNING: BG was not specified in vector file and will be set to 0\n");
13164418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_ZC))
13174418919fSjohnjiang 		printf(
13184418919fSjohnjiang 			"WARNING: Zc was not specified in vector file and will be set to 0\n");
13194418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
13204418919fSjohnjiang 		printf(
13214418919fSjohnjiang 			"INFO: rv_index was not specified in vector file and will be set to 0\n");
13224418919fSjohnjiang 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
13234418919fSjohnjiang 		printf(
13244418919fSjohnjiang 			"INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
1325d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1326d30ea906Sjfb8856606 		printf(
1327d30ea906Sjfb8856606 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
1328d30ea906Sjfb8856606 
1329d30ea906Sjfb8856606 	return 0;
1330d30ea906Sjfb8856606 }
1331d30ea906Sjfb8856606 
1332d30ea906Sjfb8856606 static int
bbdev_check_vector(struct test_bbdev_vector * vector)1333d30ea906Sjfb8856606 bbdev_check_vector(struct test_bbdev_vector *vector)
1334d30ea906Sjfb8856606 {
1335d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
1336d30ea906Sjfb8856606 		if (check_decoder(vector) == -1)
1337d30ea906Sjfb8856606 			return -1;
1338d30ea906Sjfb8856606 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
1339d30ea906Sjfb8856606 		if (check_encoder(vector) == -1)
1340d30ea906Sjfb8856606 			return -1;
13414418919fSjohnjiang 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
13424418919fSjohnjiang 		if (check_ldpc_encoder(vector) == -1)
13434418919fSjohnjiang 			return -1;
13444418919fSjohnjiang 	} else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
13454418919fSjohnjiang 		if (check_ldpc_decoder(vector) == -1)
13464418919fSjohnjiang 			return -1;
1347d30ea906Sjfb8856606 	} else if (vector->op_type != RTE_BBDEV_OP_NONE) {
1348d30ea906Sjfb8856606 		printf("Vector was not filled\n");
1349d30ea906Sjfb8856606 		return -1;
1350d30ea906Sjfb8856606 	}
1351d30ea906Sjfb8856606 
1352d30ea906Sjfb8856606 	return 0;
1353d30ea906Sjfb8856606 }
1354d30ea906Sjfb8856606 
1355d30ea906Sjfb8856606 int
test_bbdev_vector_read(const char * filename,struct test_bbdev_vector * vector)1356d30ea906Sjfb8856606 test_bbdev_vector_read(const char *filename,
1357d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
1358d30ea906Sjfb8856606 {
1359d30ea906Sjfb8856606 	int ret = 0;
1360d30ea906Sjfb8856606 	size_t len = 0;
1361d30ea906Sjfb8856606 
1362d30ea906Sjfb8856606 	FILE *fp = NULL;
1363d30ea906Sjfb8856606 	char *line = NULL;
1364d30ea906Sjfb8856606 	char *entry = NULL;
1365d30ea906Sjfb8856606 
1366d30ea906Sjfb8856606 	fp = fopen(filename, "r");
1367d30ea906Sjfb8856606 	if (fp == NULL) {
1368d30ea906Sjfb8856606 		printf("File %s does not exist\n", filename);
1369d30ea906Sjfb8856606 		return -1;
1370d30ea906Sjfb8856606 	}
1371d30ea906Sjfb8856606 
1372d30ea906Sjfb8856606 	while (getline(&line, &len, fp) != -1) {
1373d30ea906Sjfb8856606 
1374d30ea906Sjfb8856606 		/* ignore comments and new lines */
1375d30ea906Sjfb8856606 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
1376d30ea906Sjfb8856606 			|| line[0] == '\r')
1377d30ea906Sjfb8856606 			continue;
1378d30ea906Sjfb8856606 
1379d30ea906Sjfb8856606 		trim_space(line);
1380d30ea906Sjfb8856606 
1381d30ea906Sjfb8856606 		/* buffer for multiline */
1382d30ea906Sjfb8856606 		entry = realloc(entry, strlen(line) + 1);
1383d30ea906Sjfb8856606 		if (entry == NULL) {
1384d30ea906Sjfb8856606 			printf("Fail to realloc %zu bytes\n", strlen(line) + 1);
1385d30ea906Sjfb8856606 			ret = -ENOMEM;
1386d30ea906Sjfb8856606 			goto exit;
1387d30ea906Sjfb8856606 		}
1388d30ea906Sjfb8856606 
1389d30ea906Sjfb8856606 		strcpy(entry, line);
1390d30ea906Sjfb8856606 
1391d30ea906Sjfb8856606 		/* check if entry ends with , or = */
1392d30ea906Sjfb8856606 		if (entry[strlen(entry) - 1] == ','
1393d30ea906Sjfb8856606 			|| entry[strlen(entry) - 1] == '=') {
1394d30ea906Sjfb8856606 			while (getline(&line, &len, fp) != -1) {
1395d30ea906Sjfb8856606 				trim_space(line);
1396d30ea906Sjfb8856606 
1397d30ea906Sjfb8856606 				/* extend entry about length of new line */
1398d30ea906Sjfb8856606 				char *entry_extended = realloc(entry,
1399d30ea906Sjfb8856606 						strlen(line) +
1400d30ea906Sjfb8856606 						strlen(entry) + 1);
1401d30ea906Sjfb8856606 
1402d30ea906Sjfb8856606 				if (entry_extended == NULL) {
1403d30ea906Sjfb8856606 					printf("Fail to allocate %zu bytes\n",
1404d30ea906Sjfb8856606 							strlen(line) +
1405d30ea906Sjfb8856606 							strlen(entry) + 1);
1406d30ea906Sjfb8856606 					ret = -ENOMEM;
1407d30ea906Sjfb8856606 					goto exit;
1408d30ea906Sjfb8856606 				}
1409d30ea906Sjfb8856606 
1410d30ea906Sjfb8856606 				entry = entry_extended;
1411d30ea906Sjfb8856606 				/* entry has been allocated accordingly */
1412d30ea906Sjfb8856606 				strcpy(&entry[strlen(entry)], line);
1413d30ea906Sjfb8856606 
1414d30ea906Sjfb8856606 				if (entry[strlen(entry) - 1] != ',')
1415d30ea906Sjfb8856606 					break;
1416d30ea906Sjfb8856606 			}
1417d30ea906Sjfb8856606 		}
1418d30ea906Sjfb8856606 		ret = parse_entry(entry, vector);
1419d30ea906Sjfb8856606 		if (ret != 0) {
1420d30ea906Sjfb8856606 			printf("An error occurred while parsing!\n");
1421d30ea906Sjfb8856606 			goto exit;
1422d30ea906Sjfb8856606 		}
1423d30ea906Sjfb8856606 	}
1424d30ea906Sjfb8856606 	ret = bbdev_check_vector(vector);
1425d30ea906Sjfb8856606 	if (ret != 0)
1426d30ea906Sjfb8856606 		printf("An error occurred while checking!\n");
1427d30ea906Sjfb8856606 
1428d30ea906Sjfb8856606 exit:
1429d30ea906Sjfb8856606 	fclose(fp);
1430d30ea906Sjfb8856606 	free(line);
1431d30ea906Sjfb8856606 	free(entry);
1432d30ea906Sjfb8856606 
1433d30ea906Sjfb8856606 	return ret;
1434d30ea906Sjfb8856606 }
1435