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