1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606  * Copyright(c) 2017 Intel Corporation
3*d30ea906Sjfb8856606  */
4*d30ea906Sjfb8856606 
5*d30ea906Sjfb8856606 #ifdef RTE_EXEC_ENV_BSDAPP
6*d30ea906Sjfb8856606 	#define _WITH_GETLINE
7*d30ea906Sjfb8856606 #endif
8*d30ea906Sjfb8856606 #include <stdio.h>
9*d30ea906Sjfb8856606 #include <stdbool.h>
10*d30ea906Sjfb8856606 #include <rte_malloc.h>
11*d30ea906Sjfb8856606 
12*d30ea906Sjfb8856606 #include "test_bbdev_vector.h"
13*d30ea906Sjfb8856606 
14*d30ea906Sjfb8856606 #define VALUE_DELIMITER ","
15*d30ea906Sjfb8856606 #define ENTRY_DELIMITER "="
16*d30ea906Sjfb8856606 
17*d30ea906Sjfb8856606 const char *op_data_prefixes[] = {
18*d30ea906Sjfb8856606 	"input",
19*d30ea906Sjfb8856606 	"soft_output",
20*d30ea906Sjfb8856606 	"hard_output",
21*d30ea906Sjfb8856606 };
22*d30ea906Sjfb8856606 
23*d30ea906Sjfb8856606 /* trim leading and trailing spaces */
24*d30ea906Sjfb8856606 static void
25*d30ea906Sjfb8856606 trim_space(char *str)
26*d30ea906Sjfb8856606 {
27*d30ea906Sjfb8856606 	char *start, *end;
28*d30ea906Sjfb8856606 
29*d30ea906Sjfb8856606 	for (start = str; *start; start++) {
30*d30ea906Sjfb8856606 		if (!isspace((unsigned char) start[0]))
31*d30ea906Sjfb8856606 			break;
32*d30ea906Sjfb8856606 	}
33*d30ea906Sjfb8856606 
34*d30ea906Sjfb8856606 	for (end = start + strlen(start); end > start + 1; end--) {
35*d30ea906Sjfb8856606 		if (!isspace((unsigned char) end[-1]))
36*d30ea906Sjfb8856606 			break;
37*d30ea906Sjfb8856606 	}
38*d30ea906Sjfb8856606 
39*d30ea906Sjfb8856606 	*end = 0;
40*d30ea906Sjfb8856606 
41*d30ea906Sjfb8856606 	/* Shift from "start" to the beginning of the string */
42*d30ea906Sjfb8856606 	if (start > str)
43*d30ea906Sjfb8856606 		memmove(str, start, (end - start) + 1);
44*d30ea906Sjfb8856606 }
45*d30ea906Sjfb8856606 
46*d30ea906Sjfb8856606 static bool
47*d30ea906Sjfb8856606 starts_with(const char *str, const char *pre)
48*d30ea906Sjfb8856606 {
49*d30ea906Sjfb8856606 	return strncmp(pre, str, strlen(pre)) == 0;
50*d30ea906Sjfb8856606 }
51*d30ea906Sjfb8856606 
52*d30ea906Sjfb8856606 /* tokenization test values separated by a comma */
53*d30ea906Sjfb8856606 static int
54*d30ea906Sjfb8856606 parse_values(char *tokens, uint32_t **data, uint32_t *data_length)
55*d30ea906Sjfb8856606 {
56*d30ea906Sjfb8856606 	uint32_t n_tokens = 0;
57*d30ea906Sjfb8856606 	uint32_t data_size = 32;
58*d30ea906Sjfb8856606 
59*d30ea906Sjfb8856606 	uint32_t *values, *values_resized;
60*d30ea906Sjfb8856606 	char *tok, *error = NULL;
61*d30ea906Sjfb8856606 
62*d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
63*d30ea906Sjfb8856606 	if (tok == NULL)
64*d30ea906Sjfb8856606 		return -1;
65*d30ea906Sjfb8856606 
66*d30ea906Sjfb8856606 	values = (uint32_t *)
67*d30ea906Sjfb8856606 			rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0);
68*d30ea906Sjfb8856606 	if (values == NULL)
69*d30ea906Sjfb8856606 		return -1;
70*d30ea906Sjfb8856606 
71*d30ea906Sjfb8856606 	while (tok != NULL) {
72*d30ea906Sjfb8856606 		values_resized = NULL;
73*d30ea906Sjfb8856606 
74*d30ea906Sjfb8856606 		if (n_tokens >= data_size) {
75*d30ea906Sjfb8856606 			data_size *= 2;
76*d30ea906Sjfb8856606 
77*d30ea906Sjfb8856606 			values_resized = (uint32_t *) rte_realloc(values,
78*d30ea906Sjfb8856606 				sizeof(uint32_t) * data_size, 0);
79*d30ea906Sjfb8856606 			if (values_resized == NULL) {
80*d30ea906Sjfb8856606 				rte_free(values);
81*d30ea906Sjfb8856606 				return -1;
82*d30ea906Sjfb8856606 			}
83*d30ea906Sjfb8856606 			values = values_resized;
84*d30ea906Sjfb8856606 		}
85*d30ea906Sjfb8856606 
86*d30ea906Sjfb8856606 		values[n_tokens] = (uint32_t) strtoul(tok, &error, 0);
87*d30ea906Sjfb8856606 		if ((error == NULL) || (*error != '\0')) {
88*d30ea906Sjfb8856606 			printf("Failed with convert '%s'\n", tok);
89*d30ea906Sjfb8856606 			rte_free(values);
90*d30ea906Sjfb8856606 			return -1;
91*d30ea906Sjfb8856606 		}
92*d30ea906Sjfb8856606 
93*d30ea906Sjfb8856606 		*data_length = *data_length + (strlen(tok) - strlen("0x"))/2;
94*d30ea906Sjfb8856606 
95*d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
96*d30ea906Sjfb8856606 		if (tok == NULL)
97*d30ea906Sjfb8856606 			break;
98*d30ea906Sjfb8856606 
99*d30ea906Sjfb8856606 		n_tokens++;
100*d30ea906Sjfb8856606 	}
101*d30ea906Sjfb8856606 
102*d30ea906Sjfb8856606 	values_resized = (uint32_t *) rte_realloc(values,
103*d30ea906Sjfb8856606 		sizeof(uint32_t) * (n_tokens + 1), 0);
104*d30ea906Sjfb8856606 
105*d30ea906Sjfb8856606 	if (values_resized == NULL) {
106*d30ea906Sjfb8856606 		rte_free(values);
107*d30ea906Sjfb8856606 		return -1;
108*d30ea906Sjfb8856606 	}
109*d30ea906Sjfb8856606 
110*d30ea906Sjfb8856606 	*data = values_resized;
111*d30ea906Sjfb8856606 
112*d30ea906Sjfb8856606 	return 0;
113*d30ea906Sjfb8856606 }
114*d30ea906Sjfb8856606 
115*d30ea906Sjfb8856606 /* convert turbo decoder flag from string to unsigned long int*/
116*d30ea906Sjfb8856606 static int
117*d30ea906Sjfb8856606 op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
118*d30ea906Sjfb8856606 {
119*d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE"))
120*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE;
121*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_TYPE_24B"))
122*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_TYPE_24B;
123*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EQUALIZER"))
124*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_EQUALIZER;
125*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUT_SATURATE"))
126*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUT_SATURATE;
127*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_HALF_ITERATION_EVEN"))
128*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_HALF_ITERATION_EVEN;
129*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH"))
130*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH;
131*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUTPUT"))
132*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_SOFT_OUTPUT;
133*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_EARLY_TERMINATION"))
134*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_EARLY_TERMINATION;
135*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN"))
136*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN;
137*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN"))
138*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
139*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT"))
140*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT;
141*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT"))
142*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
143*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_MAP_DEC"))
144*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_MAP_DEC;
145*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_SCATTER_GATHER"))
146*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_DEC_SCATTER_GATHER;
147*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP"))
148*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP;
149*d30ea906Sjfb8856606 	else {
150*d30ea906Sjfb8856606 		printf("The given value is not a turbo decoder flag\n");
151*d30ea906Sjfb8856606 		return -1;
152*d30ea906Sjfb8856606 	}
153*d30ea906Sjfb8856606 
154*d30ea906Sjfb8856606 	return 0;
155*d30ea906Sjfb8856606 }
156*d30ea906Sjfb8856606 
157*d30ea906Sjfb8856606 /* convert turbo encoder flag from string to unsigned long int*/
158*d30ea906Sjfb8856606 static int
159*d30ea906Sjfb8856606 op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
160*d30ea906Sjfb8856606 {
161*d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS"))
162*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS;
163*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH"))
164*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH;
165*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH"))
166*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH;
167*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH"))
168*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH;
169*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER"))
170*d30ea906Sjfb8856606 		*op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER;
171*d30ea906Sjfb8856606 	else {
172*d30ea906Sjfb8856606 		printf("The given value is not a turbo encoder flag\n");
173*d30ea906Sjfb8856606 		return -1;
174*d30ea906Sjfb8856606 	}
175*d30ea906Sjfb8856606 
176*d30ea906Sjfb8856606 	return 0;
177*d30ea906Sjfb8856606 }
178*d30ea906Sjfb8856606 
179*d30ea906Sjfb8856606 /* tokenization turbo decoder/encoder flags values separated by a comma */
180*d30ea906Sjfb8856606 static int
181*d30ea906Sjfb8856606 parse_turbo_flags(char *tokens, uint32_t *op_flags,
182*d30ea906Sjfb8856606 		enum rte_bbdev_op_type op_type)
183*d30ea906Sjfb8856606 {
184*d30ea906Sjfb8856606 	char *tok = NULL;
185*d30ea906Sjfb8856606 	uint32_t op_flag_value = 0;
186*d30ea906Sjfb8856606 
187*d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
188*d30ea906Sjfb8856606 	if (tok == NULL)
189*d30ea906Sjfb8856606 		return -1;
190*d30ea906Sjfb8856606 
191*d30ea906Sjfb8856606 	while (tok != NULL) {
192*d30ea906Sjfb8856606 		trim_space(tok);
193*d30ea906Sjfb8856606 		if (op_type == RTE_BBDEV_OP_TURBO_DEC) {
194*d30ea906Sjfb8856606 			if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1)
195*d30ea906Sjfb8856606 				return -1;
196*d30ea906Sjfb8856606 		} else if (op_type == RTE_BBDEV_OP_TURBO_ENC) {
197*d30ea906Sjfb8856606 			if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1)
198*d30ea906Sjfb8856606 				return -1;
199*d30ea906Sjfb8856606 		} else {
200*d30ea906Sjfb8856606 			return -1;
201*d30ea906Sjfb8856606 		}
202*d30ea906Sjfb8856606 
203*d30ea906Sjfb8856606 		*op_flags = *op_flags | op_flag_value;
204*d30ea906Sjfb8856606 
205*d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
206*d30ea906Sjfb8856606 		if (tok == NULL)
207*d30ea906Sjfb8856606 			break;
208*d30ea906Sjfb8856606 	}
209*d30ea906Sjfb8856606 
210*d30ea906Sjfb8856606 	return 0;
211*d30ea906Sjfb8856606 }
212*d30ea906Sjfb8856606 
213*d30ea906Sjfb8856606 /* convert turbo encoder/decoder op_type from string to enum*/
214*d30ea906Sjfb8856606 static int
215*d30ea906Sjfb8856606 op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type)
216*d30ea906Sjfb8856606 {
217*d30ea906Sjfb8856606 	trim_space(token);
218*d30ea906Sjfb8856606 	if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC"))
219*d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_TURBO_DEC;
220*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC"))
221*d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_TURBO_ENC;
222*d30ea906Sjfb8856606 	else if (!strcmp(token, "RTE_BBDEV_OP_NONE"))
223*d30ea906Sjfb8856606 		*op_type = RTE_BBDEV_OP_NONE;
224*d30ea906Sjfb8856606 	else {
225*d30ea906Sjfb8856606 		printf("Not valid turbo op_type: '%s'\n", token);
226*d30ea906Sjfb8856606 		return -1;
227*d30ea906Sjfb8856606 	}
228*d30ea906Sjfb8856606 
229*d30ea906Sjfb8856606 	return 0;
230*d30ea906Sjfb8856606 }
231*d30ea906Sjfb8856606 
232*d30ea906Sjfb8856606 /* tokenization expected status values separated by a comma */
233*d30ea906Sjfb8856606 static int
234*d30ea906Sjfb8856606 parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type)
235*d30ea906Sjfb8856606 {
236*d30ea906Sjfb8856606 	char *tok = NULL;
237*d30ea906Sjfb8856606 	bool status_ok = false;
238*d30ea906Sjfb8856606 
239*d30ea906Sjfb8856606 	tok = strtok(tokens, VALUE_DELIMITER);
240*d30ea906Sjfb8856606 	if (tok == NULL)
241*d30ea906Sjfb8856606 		return -1;
242*d30ea906Sjfb8856606 
243*d30ea906Sjfb8856606 	while (tok != NULL) {
244*d30ea906Sjfb8856606 		trim_space(tok);
245*d30ea906Sjfb8856606 		if (!strcmp(tok, "OK"))
246*d30ea906Sjfb8856606 			status_ok = true;
247*d30ea906Sjfb8856606 		else if (!strcmp(tok, "DMA"))
248*d30ea906Sjfb8856606 			*status = *status | (1 << RTE_BBDEV_DRV_ERROR);
249*d30ea906Sjfb8856606 		else if (!strcmp(tok, "FCW"))
250*d30ea906Sjfb8856606 			*status = *status | (1 << RTE_BBDEV_DATA_ERROR);
251*d30ea906Sjfb8856606 		else if (!strcmp(tok, "CRC")) {
252*d30ea906Sjfb8856606 			if (op_type == RTE_BBDEV_OP_TURBO_DEC)
253*d30ea906Sjfb8856606 				*status = *status | (1 << RTE_BBDEV_CRC_ERROR);
254*d30ea906Sjfb8856606 			else {
255*d30ea906Sjfb8856606 				printf(
256*d30ea906Sjfb8856606 						"CRC is only a valid value for turbo decoder\n");
257*d30ea906Sjfb8856606 				return -1;
258*d30ea906Sjfb8856606 			}
259*d30ea906Sjfb8856606 		} else {
260*d30ea906Sjfb8856606 			printf("Not valid status: '%s'\n", tok);
261*d30ea906Sjfb8856606 			return -1;
262*d30ea906Sjfb8856606 		}
263*d30ea906Sjfb8856606 
264*d30ea906Sjfb8856606 		tok = strtok(NULL, VALUE_DELIMITER);
265*d30ea906Sjfb8856606 		if (tok == NULL)
266*d30ea906Sjfb8856606 			break;
267*d30ea906Sjfb8856606 	}
268*d30ea906Sjfb8856606 
269*d30ea906Sjfb8856606 	if (status_ok && *status != 0) {
270*d30ea906Sjfb8856606 		printf(
271*d30ea906Sjfb8856606 				"Not valid status values. Cannot be OK and ERROR at the same time.\n");
272*d30ea906Sjfb8856606 		return -1;
273*d30ea906Sjfb8856606 	}
274*d30ea906Sjfb8856606 
275*d30ea906Sjfb8856606 	return 0;
276*d30ea906Sjfb8856606 }
277*d30ea906Sjfb8856606 
278*d30ea906Sjfb8856606 /* parse ops data entry (there can be more than 1 input entry, each will be
279*d30ea906Sjfb8856606  * contained in a separate op_data_buf struct)
280*d30ea906Sjfb8856606  */
281*d30ea906Sjfb8856606 static int
282*d30ea906Sjfb8856606 parse_data_entry(const char *key_token, char *token,
283*d30ea906Sjfb8856606 		struct test_bbdev_vector *vector, enum op_data_type type,
284*d30ea906Sjfb8856606 		const char *prefix)
285*d30ea906Sjfb8856606 {
286*d30ea906Sjfb8856606 	int ret;
287*d30ea906Sjfb8856606 	uint32_t data_length = 0;
288*d30ea906Sjfb8856606 	uint32_t *data = NULL;
289*d30ea906Sjfb8856606 	unsigned int id;
290*d30ea906Sjfb8856606 	struct op_data_buf *op_data;
291*d30ea906Sjfb8856606 	unsigned int *nb_ops;
292*d30ea906Sjfb8856606 
293*d30ea906Sjfb8856606 	if (type >= DATA_NUM_TYPES) {
294*d30ea906Sjfb8856606 		printf("Unknown op type: %d!\n", type);
295*d30ea906Sjfb8856606 		return -1;
296*d30ea906Sjfb8856606 	}
297*d30ea906Sjfb8856606 
298*d30ea906Sjfb8856606 	op_data = vector->entries[type].segments;
299*d30ea906Sjfb8856606 	nb_ops = &vector->entries[type].nb_segments;
300*d30ea906Sjfb8856606 
301*d30ea906Sjfb8856606 	if (*nb_ops >= RTE_BBDEV_MAX_CODE_BLOCKS) {
302*d30ea906Sjfb8856606 		printf("Too many segments (code blocks defined): %u, max %d!\n",
303*d30ea906Sjfb8856606 				*nb_ops, RTE_BBDEV_MAX_CODE_BLOCKS);
304*d30ea906Sjfb8856606 		return -1;
305*d30ea906Sjfb8856606 	}
306*d30ea906Sjfb8856606 
307*d30ea906Sjfb8856606 	if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) {
308*d30ea906Sjfb8856606 		printf("Missing ID of %s\n", prefix);
309*d30ea906Sjfb8856606 		return -1;
310*d30ea906Sjfb8856606 	}
311*d30ea906Sjfb8856606 	if (id != *nb_ops) {
312*d30ea906Sjfb8856606 		printf(
313*d30ea906Sjfb8856606 			"Please order data entries sequentially, i.e. %s0, %s1, ...\n",
314*d30ea906Sjfb8856606 				prefix, prefix);
315*d30ea906Sjfb8856606 		return -1;
316*d30ea906Sjfb8856606 	}
317*d30ea906Sjfb8856606 
318*d30ea906Sjfb8856606 	/* Clear new op data struct */
319*d30ea906Sjfb8856606 	memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf));
320*d30ea906Sjfb8856606 
321*d30ea906Sjfb8856606 	ret = parse_values(token, &data, &data_length);
322*d30ea906Sjfb8856606 	if (!ret) {
323*d30ea906Sjfb8856606 		op_data[*nb_ops].addr = data;
324*d30ea906Sjfb8856606 		op_data[*nb_ops].length = data_length;
325*d30ea906Sjfb8856606 		++(*nb_ops);
326*d30ea906Sjfb8856606 	}
327*d30ea906Sjfb8856606 
328*d30ea906Sjfb8856606 	return ret;
329*d30ea906Sjfb8856606 }
330*d30ea906Sjfb8856606 
331*d30ea906Sjfb8856606 /* parses turbo decoder parameters and assigns to global variable */
332*d30ea906Sjfb8856606 static int
333*d30ea906Sjfb8856606 parse_decoder_params(const char *key_token, char *token,
334*d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
335*d30ea906Sjfb8856606 {
336*d30ea906Sjfb8856606 	int ret = 0, status = 0;
337*d30ea906Sjfb8856606 	uint32_t op_flags = 0;
338*d30ea906Sjfb8856606 	char *err = NULL;
339*d30ea906Sjfb8856606 
340*d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
341*d30ea906Sjfb8856606 
342*d30ea906Sjfb8856606 	/* compare keys */
343*d30ea906Sjfb8856606 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
344*d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
345*d30ea906Sjfb8856606 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
346*d30ea906Sjfb8856606 
347*d30ea906Sjfb8856606 	else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT]))
348*d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
349*d30ea906Sjfb8856606 				DATA_SOFT_OUTPUT,
350*d30ea906Sjfb8856606 				op_data_prefixes[DATA_SOFT_OUTPUT]);
351*d30ea906Sjfb8856606 
352*d30ea906Sjfb8856606 	else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT]))
353*d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
354*d30ea906Sjfb8856606 				DATA_HARD_OUTPUT,
355*d30ea906Sjfb8856606 				op_data_prefixes[DATA_HARD_OUTPUT]);
356*d30ea906Sjfb8856606 	else if (!strcmp(key_token, "e")) {
357*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_E;
358*d30ea906Sjfb8856606 		turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
359*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ea")) {
360*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EA;
361*d30ea906Sjfb8856606 		turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
362*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
363*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "eb")) {
364*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EB;
365*d30ea906Sjfb8856606 		turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
366*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
367*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k")) {
368*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K;
369*d30ea906Sjfb8856606 		turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0);
370*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
371*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_pos")) {
372*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_POS;
373*d30ea906Sjfb8856606 		turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
374*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
375*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_neg")) {
376*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_NEG;
377*d30ea906Sjfb8856606 		turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
378*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
379*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c")) {
380*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C;
381*d30ea906Sjfb8856606 		turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0);
382*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
383*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c_neg")) {
384*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C_NEG;
385*d30ea906Sjfb8856606 		turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0);
386*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
387*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "cab")) {
388*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CAB;
389*d30ea906Sjfb8856606 		turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
390*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
391*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "rv_index")) {
392*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
393*d30ea906Sjfb8856606 		turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
394*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
395*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "iter_max")) {
396*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_ITER_MAX;
397*d30ea906Sjfb8856606 		turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
398*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
399*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "iter_min")) {
400*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_ITER_MIN;
401*d30ea906Sjfb8856606 		turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0);
402*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
403*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_iter_count")) {
404*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
405*d30ea906Sjfb8856606 		turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
406*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
407*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ext_scale")) {
408*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXT_SCALE;
409*d30ea906Sjfb8856606 		turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0);
410*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
411*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "num_maps")) {
412*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NUM_MAPS;
413*d30ea906Sjfb8856606 		turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0);
414*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
415*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "code_block_mode")) {
416*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
417*d30ea906Sjfb8856606 		turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
418*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
419*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "op_flags")) {
420*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
421*d30ea906Sjfb8856606 		ret = parse_turbo_flags(token, &op_flags,
422*d30ea906Sjfb8856606 			vector->op_type);
423*d30ea906Sjfb8856606 		if (!ret)
424*d30ea906Sjfb8856606 			turbo_dec->op_flags = op_flags;
425*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_status")) {
426*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
427*d30ea906Sjfb8856606 		ret = parse_expected_status(token, &status, vector->op_type);
428*d30ea906Sjfb8856606 		if (!ret)
429*d30ea906Sjfb8856606 			vector->expected_status = status;
430*d30ea906Sjfb8856606 	} else {
431*d30ea906Sjfb8856606 		printf("Not valid dec key: '%s'\n", key_token);
432*d30ea906Sjfb8856606 		return -1;
433*d30ea906Sjfb8856606 	}
434*d30ea906Sjfb8856606 
435*d30ea906Sjfb8856606 	if (ret != 0) {
436*d30ea906Sjfb8856606 		printf("Failed with convert '%s\t%s'\n", key_token, token);
437*d30ea906Sjfb8856606 		return -1;
438*d30ea906Sjfb8856606 	}
439*d30ea906Sjfb8856606 
440*d30ea906Sjfb8856606 	return 0;
441*d30ea906Sjfb8856606 }
442*d30ea906Sjfb8856606 
443*d30ea906Sjfb8856606 /* parses turbo encoder parameters and assigns to global variable */
444*d30ea906Sjfb8856606 static int
445*d30ea906Sjfb8856606 parse_encoder_params(const char *key_token, char *token,
446*d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
447*d30ea906Sjfb8856606 {
448*d30ea906Sjfb8856606 	int ret = 0, status = 0;
449*d30ea906Sjfb8856606 	uint32_t op_flags = 0;
450*d30ea906Sjfb8856606 	char *err = NULL;
451*d30ea906Sjfb8856606 
452*d30ea906Sjfb8856606 
453*d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc;
454*d30ea906Sjfb8856606 
455*d30ea906Sjfb8856606 	if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
456*d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
457*d30ea906Sjfb8856606 				DATA_INPUT, op_data_prefixes[DATA_INPUT]);
458*d30ea906Sjfb8856606 	else if (starts_with(key_token, "output"))
459*d30ea906Sjfb8856606 		ret = parse_data_entry(key_token, token, vector,
460*d30ea906Sjfb8856606 				DATA_HARD_OUTPUT, "output");
461*d30ea906Sjfb8856606 	else if (!strcmp(key_token, "e")) {
462*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_E;
463*d30ea906Sjfb8856606 		turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
464*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
465*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ea")) {
466*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EA;
467*d30ea906Sjfb8856606 		turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
468*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
469*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "eb")) {
470*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EB;
471*d30ea906Sjfb8856606 		turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
472*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
473*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k")) {
474*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K;
475*d30ea906Sjfb8856606 		turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0);
476*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
477*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_neg")) {
478*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_NEG;
479*d30ea906Sjfb8856606 		turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
480*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
481*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "k_pos")) {
482*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_K_POS;
483*d30ea906Sjfb8856606 		turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
484*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
485*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c_neg")) {
486*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C_NEG;
487*d30ea906Sjfb8856606 		turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0);
488*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
489*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "c")) {
490*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_C;
491*d30ea906Sjfb8856606 		turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
492*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
493*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "cab")) {
494*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CAB;
495*d30ea906Sjfb8856606 		turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
496*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
497*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "rv_index")) {
498*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_RV_INDEX;
499*d30ea906Sjfb8856606 		turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
500*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
501*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb")) {
502*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB;
503*d30ea906Sjfb8856606 		turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0);
504*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
505*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb_neg")) {
506*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB_NEG;
507*d30ea906Sjfb8856606 		turbo_enc->tb_params.ncb_neg =
508*d30ea906Sjfb8856606 				(uint16_t) strtoul(token, &err, 0);
509*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
510*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "ncb_pos")) {
511*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_NCB_POS;
512*d30ea906Sjfb8856606 		turbo_enc->tb_params.ncb_pos =
513*d30ea906Sjfb8856606 				(uint16_t) strtoul(token, &err, 0);
514*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
515*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "r")) {
516*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_R;
517*d30ea906Sjfb8856606 		turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
518*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
519*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "code_block_mode")) {
520*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
521*d30ea906Sjfb8856606 		turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
522*d30ea906Sjfb8856606 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
523*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "op_flags")) {
524*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
525*d30ea906Sjfb8856606 		ret = parse_turbo_flags(token, &op_flags,
526*d30ea906Sjfb8856606 				vector->op_type);
527*d30ea906Sjfb8856606 		if (!ret)
528*d30ea906Sjfb8856606 			turbo_enc->op_flags = op_flags;
529*d30ea906Sjfb8856606 	} else if (!strcmp(key_token, "expected_status")) {
530*d30ea906Sjfb8856606 		vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
531*d30ea906Sjfb8856606 		ret = parse_expected_status(token, &status, vector->op_type);
532*d30ea906Sjfb8856606 		if (!ret)
533*d30ea906Sjfb8856606 			vector->expected_status = status;
534*d30ea906Sjfb8856606 	} else {
535*d30ea906Sjfb8856606 		printf("Not valid enc key: '%s'\n", key_token);
536*d30ea906Sjfb8856606 		return -1;
537*d30ea906Sjfb8856606 	}
538*d30ea906Sjfb8856606 
539*d30ea906Sjfb8856606 	if (ret != 0) {
540*d30ea906Sjfb8856606 		printf("Failed with convert '%s\t%s'\n", key_token, token);
541*d30ea906Sjfb8856606 		return -1;
542*d30ea906Sjfb8856606 	}
543*d30ea906Sjfb8856606 
544*d30ea906Sjfb8856606 	return 0;
545*d30ea906Sjfb8856606 }
546*d30ea906Sjfb8856606 
547*d30ea906Sjfb8856606 /* checks the type of key and assigns data */
548*d30ea906Sjfb8856606 static int
549*d30ea906Sjfb8856606 parse_entry(char *entry, struct test_bbdev_vector *vector)
550*d30ea906Sjfb8856606 {
551*d30ea906Sjfb8856606 	int ret = 0;
552*d30ea906Sjfb8856606 	char *token, *key_token;
553*d30ea906Sjfb8856606 	enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE;
554*d30ea906Sjfb8856606 
555*d30ea906Sjfb8856606 	if (entry == NULL) {
556*d30ea906Sjfb8856606 		printf("Expected entry value\n");
557*d30ea906Sjfb8856606 		return -1;
558*d30ea906Sjfb8856606 	}
559*d30ea906Sjfb8856606 
560*d30ea906Sjfb8856606 	/* get key */
561*d30ea906Sjfb8856606 	token = strtok(entry, ENTRY_DELIMITER);
562*d30ea906Sjfb8856606 	key_token = token;
563*d30ea906Sjfb8856606 	/* get values for key */
564*d30ea906Sjfb8856606 	token = strtok(NULL, ENTRY_DELIMITER);
565*d30ea906Sjfb8856606 
566*d30ea906Sjfb8856606 	if (key_token == NULL || token == NULL) {
567*d30ea906Sjfb8856606 		printf("Expected 'key = values' but was '%.40s'..\n", entry);
568*d30ea906Sjfb8856606 		return -1;
569*d30ea906Sjfb8856606 	}
570*d30ea906Sjfb8856606 	trim_space(key_token);
571*d30ea906Sjfb8856606 
572*d30ea906Sjfb8856606 	/* first key_token has to specify type of operation */
573*d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_NONE) {
574*d30ea906Sjfb8856606 		if (!strcmp(key_token, "op_type")) {
575*d30ea906Sjfb8856606 			ret = op_turbo_type_strtol(token, &op_type);
576*d30ea906Sjfb8856606 			if (!ret)
577*d30ea906Sjfb8856606 				vector->op_type = op_type;
578*d30ea906Sjfb8856606 			return (!ret) ? 0 : -1;
579*d30ea906Sjfb8856606 		}
580*d30ea906Sjfb8856606 		printf("First key_token (%s) does not specify op_type\n",
581*d30ea906Sjfb8856606 				key_token);
582*d30ea906Sjfb8856606 		return -1;
583*d30ea906Sjfb8856606 	}
584*d30ea906Sjfb8856606 
585*d30ea906Sjfb8856606 	/* compare keys */
586*d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
587*d30ea906Sjfb8856606 		if (parse_decoder_params(key_token, token, vector) == -1)
588*d30ea906Sjfb8856606 			return -1;
589*d30ea906Sjfb8856606 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
590*d30ea906Sjfb8856606 		if (parse_encoder_params(key_token, token, vector) == -1)
591*d30ea906Sjfb8856606 			return -1;
592*d30ea906Sjfb8856606 	}
593*d30ea906Sjfb8856606 
594*d30ea906Sjfb8856606 	return 0;
595*d30ea906Sjfb8856606 }
596*d30ea906Sjfb8856606 
597*d30ea906Sjfb8856606 static int
598*d30ea906Sjfb8856606 check_decoder_segments(struct test_bbdev_vector *vector)
599*d30ea906Sjfb8856606 {
600*d30ea906Sjfb8856606 	unsigned char i;
601*d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
602*d30ea906Sjfb8856606 
603*d30ea906Sjfb8856606 	if (vector->entries[DATA_INPUT].nb_segments == 0)
604*d30ea906Sjfb8856606 		return -1;
605*d30ea906Sjfb8856606 
606*d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
607*d30ea906Sjfb8856606 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
608*d30ea906Sjfb8856606 			return -1;
609*d30ea906Sjfb8856606 
610*d30ea906Sjfb8856606 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
611*d30ea906Sjfb8856606 		return -1;
612*d30ea906Sjfb8856606 
613*d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments;
614*d30ea906Sjfb8856606 			i++)
615*d30ea906Sjfb8856606 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
616*d30ea906Sjfb8856606 			return -1;
617*d30ea906Sjfb8856606 
618*d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
619*d30ea906Sjfb8856606 			(vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
620*d30ea906Sjfb8856606 		return -1;
621*d30ea906Sjfb8856606 
622*d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments;
623*d30ea906Sjfb8856606 			i++)
624*d30ea906Sjfb8856606 		if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
625*d30ea906Sjfb8856606 			return -1;
626*d30ea906Sjfb8856606 
627*d30ea906Sjfb8856606 	return 0;
628*d30ea906Sjfb8856606 }
629*d30ea906Sjfb8856606 
630*d30ea906Sjfb8856606 static int
631*d30ea906Sjfb8856606 check_decoder_llr_spec(struct test_bbdev_vector *vector)
632*d30ea906Sjfb8856606 {
633*d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
634*d30ea906Sjfb8856606 
635*d30ea906Sjfb8856606 	/* Check input LLR sign formalism specification */
636*d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
637*d30ea906Sjfb8856606 			(turbo_dec->op_flags &
638*d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
639*d30ea906Sjfb8856606 		printf(
640*d30ea906Sjfb8856606 			"Both positive and negative LLR input flags were set!\n");
641*d30ea906Sjfb8856606 		return -1;
642*d30ea906Sjfb8856606 	}
643*d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
644*d30ea906Sjfb8856606 			!(turbo_dec->op_flags &
645*d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
646*d30ea906Sjfb8856606 		printf(
647*d30ea906Sjfb8856606 			"WARNING: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
648*d30ea906Sjfb8856606 		turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
649*d30ea906Sjfb8856606 	}
650*d30ea906Sjfb8856606 
651*d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT))
652*d30ea906Sjfb8856606 		return 0;
653*d30ea906Sjfb8856606 
654*d30ea906Sjfb8856606 	/* Check output LLR sign formalism specification */
655*d30ea906Sjfb8856606 	if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
656*d30ea906Sjfb8856606 			(turbo_dec->op_flags &
657*d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
658*d30ea906Sjfb8856606 		printf(
659*d30ea906Sjfb8856606 			"Both positive and negative LLR output flags were set!\n");
660*d30ea906Sjfb8856606 		return -1;
661*d30ea906Sjfb8856606 	}
662*d30ea906Sjfb8856606 	if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
663*d30ea906Sjfb8856606 			!(turbo_dec->op_flags &
664*d30ea906Sjfb8856606 			RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
665*d30ea906Sjfb8856606 		printf(
666*d30ea906Sjfb8856606 			"WARNING: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
667*d30ea906Sjfb8856606 		turbo_dec->op_flags |=
668*d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
669*d30ea906Sjfb8856606 	}
670*d30ea906Sjfb8856606 
671*d30ea906Sjfb8856606 	return 0;
672*d30ea906Sjfb8856606 }
673*d30ea906Sjfb8856606 
674*d30ea906Sjfb8856606 /* checks decoder parameters */
675*d30ea906Sjfb8856606 static int
676*d30ea906Sjfb8856606 check_decoder(struct test_bbdev_vector *vector)
677*d30ea906Sjfb8856606 {
678*d30ea906Sjfb8856606 	struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
679*d30ea906Sjfb8856606 	const int mask = vector->mask;
680*d30ea906Sjfb8856606 
681*d30ea906Sjfb8856606 	if (check_decoder_segments(vector) < 0)
682*d30ea906Sjfb8856606 		return -1;
683*d30ea906Sjfb8856606 
684*d30ea906Sjfb8856606 	if (check_decoder_llr_spec(vector) < 0)
685*d30ea906Sjfb8856606 		return -1;
686*d30ea906Sjfb8856606 
687*d30ea906Sjfb8856606 	/* Check which params were set */
688*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
689*d30ea906Sjfb8856606 		printf(
690*d30ea906Sjfb8856606 			"WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
691*d30ea906Sjfb8856606 		turbo_dec->code_block_mode = 1;
692*d30ea906Sjfb8856606 	}
693*d30ea906Sjfb8856606 	if (turbo_dec->code_block_mode == 0) {
694*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EA))
695*d30ea906Sjfb8856606 			printf(
696*d30ea906Sjfb8856606 				"WARNING: ea was not specified in vector file and will be set to 0\n");
697*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EB))
698*d30ea906Sjfb8856606 			printf(
699*d30ea906Sjfb8856606 				"WARNING: eb was not specified in vector file and will be set to 0\n");
700*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_NEG))
701*d30ea906Sjfb8856606 			printf(
702*d30ea906Sjfb8856606 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
703*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_POS))
704*d30ea906Sjfb8856606 			printf(
705*d30ea906Sjfb8856606 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
706*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C_NEG))
707*d30ea906Sjfb8856606 			printf(
708*d30ea906Sjfb8856606 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
709*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C)) {
710*d30ea906Sjfb8856606 			printf(
711*d30ea906Sjfb8856606 				"WARNING: c was not specified in vector file and will be set to 1\n");
712*d30ea906Sjfb8856606 			turbo_dec->tb_params.c = 1;
713*d30ea906Sjfb8856606 		}
714*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_CAB))
715*d30ea906Sjfb8856606 			printf(
716*d30ea906Sjfb8856606 				"WARNING: cab was not specified in vector file and will be set to 0\n");
717*d30ea906Sjfb8856606 	} else {
718*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_E))
719*d30ea906Sjfb8856606 			printf(
720*d30ea906Sjfb8856606 				"WARNING: e was not specified in vector file and will be set to 0\n");
721*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K))
722*d30ea906Sjfb8856606 			printf(
723*d30ea906Sjfb8856606 				"WARNING: k was not specified in vector file and will be set to 0\n");
724*d30ea906Sjfb8856606 	}
725*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
726*d30ea906Sjfb8856606 		printf(
727*d30ea906Sjfb8856606 			"WARNING: rv_index was not specified in vector file and will be set to 0\n");
728*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_ITER_MIN))
729*d30ea906Sjfb8856606 		printf(
730*d30ea906Sjfb8856606 			"WARNING: iter_min was not specified in vector file and will be set to 0\n");
731*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_ITER_MAX))
732*d30ea906Sjfb8856606 		printf(
733*d30ea906Sjfb8856606 			"WARNING: iter_max was not specified in vector file and will be set to 0\n");
734*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
735*d30ea906Sjfb8856606 		printf(
736*d30ea906Sjfb8856606 			"WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
737*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXT_SCALE))
738*d30ea906Sjfb8856606 		printf(
739*d30ea906Sjfb8856606 			"WARNING: ext_scale was not specified in vector file and will be set to 0\n");
740*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
741*d30ea906Sjfb8856606 		printf(
742*d30ea906Sjfb8856606 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
743*d30ea906Sjfb8856606 		turbo_dec->num_maps = 0;
744*d30ea906Sjfb8856606 	} else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) &&
745*d30ea906Sjfb8856606 			mask & TEST_BBDEV_VF_NUM_MAPS) {
746*d30ea906Sjfb8856606 		printf(
747*d30ea906Sjfb8856606 			"WARNING: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n");
748*d30ea906Sjfb8856606 		turbo_dec->num_maps = 0;
749*d30ea906Sjfb8856606 	}
750*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
751*d30ea906Sjfb8856606 		printf(
752*d30ea906Sjfb8856606 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
753*d30ea906Sjfb8856606 	return 0;
754*d30ea906Sjfb8856606 }
755*d30ea906Sjfb8856606 
756*d30ea906Sjfb8856606 /* checks encoder parameters */
757*d30ea906Sjfb8856606 static int
758*d30ea906Sjfb8856606 check_encoder(struct test_bbdev_vector *vector)
759*d30ea906Sjfb8856606 {
760*d30ea906Sjfb8856606 	unsigned char i;
761*d30ea906Sjfb8856606 	const int mask = vector->mask;
762*d30ea906Sjfb8856606 
763*d30ea906Sjfb8856606 	if (vector->entries[DATA_INPUT].nb_segments == 0)
764*d30ea906Sjfb8856606 		return -1;
765*d30ea906Sjfb8856606 
766*d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
767*d30ea906Sjfb8856606 		if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
768*d30ea906Sjfb8856606 			return -1;
769*d30ea906Sjfb8856606 
770*d30ea906Sjfb8856606 	if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
771*d30ea906Sjfb8856606 		return -1;
772*d30ea906Sjfb8856606 
773*d30ea906Sjfb8856606 	for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
774*d30ea906Sjfb8856606 		if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
775*d30ea906Sjfb8856606 			return -1;
776*d30ea906Sjfb8856606 
777*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
778*d30ea906Sjfb8856606 		printf(
779*d30ea906Sjfb8856606 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
780*d30ea906Sjfb8856606 		vector->turbo_enc.code_block_mode = 1;
781*d30ea906Sjfb8856606 	}
782*d30ea906Sjfb8856606 	if (vector->turbo_enc.code_block_mode == 0) {
783*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags &
784*d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
785*d30ea906Sjfb8856606 			printf(
786*d30ea906Sjfb8856606 				"WARNING: ea was not specified in vector file and will be set to 0\n");
787*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags &
788*d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
789*d30ea906Sjfb8856606 			printf(
790*d30ea906Sjfb8856606 				"WARNING: eb was not specified in vector file and will be set to 0\n");
791*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_NEG))
792*d30ea906Sjfb8856606 			printf(
793*d30ea906Sjfb8856606 				"WARNING: k_neg was not specified in vector file and will be set to 0\n");
794*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K_POS))
795*d30ea906Sjfb8856606 			printf(
796*d30ea906Sjfb8856606 				"WARNING: k_pos was not specified in vector file and will be set to 0\n");
797*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C_NEG))
798*d30ea906Sjfb8856606 			printf(
799*d30ea906Sjfb8856606 				"WARNING: c_neg was not specified in vector file and will be set to 0\n");
800*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_C)) {
801*d30ea906Sjfb8856606 			printf(
802*d30ea906Sjfb8856606 				"WARNING: c was not specified in vector file and will be set to 1\n");
803*d30ea906Sjfb8856606 			vector->turbo_enc.tb_params.c = 1;
804*d30ea906Sjfb8856606 		}
805*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags &
806*d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
807*d30ea906Sjfb8856606 			printf(
808*d30ea906Sjfb8856606 				"WARNING: cab was not specified in vector file and will be set to 0\n");
809*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB_NEG))
810*d30ea906Sjfb8856606 			printf(
811*d30ea906Sjfb8856606 				"WARNING: ncb_neg was not specified in vector file and will be set to 0\n");
812*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB_POS))
813*d30ea906Sjfb8856606 			printf(
814*d30ea906Sjfb8856606 				"WARNING: ncb_pos was not specified in vector file and will be set to 0\n");
815*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_R))
816*d30ea906Sjfb8856606 			printf(
817*d30ea906Sjfb8856606 				"WARNING: r was not specified in vector file and will be set to 0\n");
818*d30ea906Sjfb8856606 	} else {
819*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
820*d30ea906Sjfb8856606 				RTE_BBDEV_TURBO_RATE_MATCH))
821*d30ea906Sjfb8856606 			printf(
822*d30ea906Sjfb8856606 				"WARNING: e was not specified in vector file and will be set to 0\n");
823*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_K))
824*d30ea906Sjfb8856606 			printf(
825*d30ea906Sjfb8856606 				"WARNING: k was not specified in vector file and will be set to 0\n");
826*d30ea906Sjfb8856606 		if (!(mask & TEST_BBDEV_VF_NCB))
827*d30ea906Sjfb8856606 			printf(
828*d30ea906Sjfb8856606 				"WARNING: ncb was not specified in vector file and will be set to 0\n");
829*d30ea906Sjfb8856606 	}
830*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_RV_INDEX))
831*d30ea906Sjfb8856606 		printf(
832*d30ea906Sjfb8856606 			"WARNING: rv_index was not specified in vector file and will be set to 0\n");
833*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
834*d30ea906Sjfb8856606 		printf(
835*d30ea906Sjfb8856606 			"WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
836*d30ea906Sjfb8856606 	if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
837*d30ea906Sjfb8856606 		printf(
838*d30ea906Sjfb8856606 			"WARNING: expected_status was not specified in vector file and will be set to 0\n");
839*d30ea906Sjfb8856606 
840*d30ea906Sjfb8856606 	return 0;
841*d30ea906Sjfb8856606 }
842*d30ea906Sjfb8856606 
843*d30ea906Sjfb8856606 static int
844*d30ea906Sjfb8856606 bbdev_check_vector(struct test_bbdev_vector *vector)
845*d30ea906Sjfb8856606 {
846*d30ea906Sjfb8856606 	if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
847*d30ea906Sjfb8856606 		if (check_decoder(vector) == -1)
848*d30ea906Sjfb8856606 			return -1;
849*d30ea906Sjfb8856606 	} else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
850*d30ea906Sjfb8856606 		if (check_encoder(vector) == -1)
851*d30ea906Sjfb8856606 			return -1;
852*d30ea906Sjfb8856606 	} else if (vector->op_type != RTE_BBDEV_OP_NONE) {
853*d30ea906Sjfb8856606 		printf("Vector was not filled\n");
854*d30ea906Sjfb8856606 		return -1;
855*d30ea906Sjfb8856606 	}
856*d30ea906Sjfb8856606 
857*d30ea906Sjfb8856606 	return 0;
858*d30ea906Sjfb8856606 }
859*d30ea906Sjfb8856606 
860*d30ea906Sjfb8856606 int
861*d30ea906Sjfb8856606 test_bbdev_vector_read(const char *filename,
862*d30ea906Sjfb8856606 		struct test_bbdev_vector *vector)
863*d30ea906Sjfb8856606 {
864*d30ea906Sjfb8856606 	int ret = 0;
865*d30ea906Sjfb8856606 	size_t len = 0;
866*d30ea906Sjfb8856606 
867*d30ea906Sjfb8856606 	FILE *fp = NULL;
868*d30ea906Sjfb8856606 	char *line = NULL;
869*d30ea906Sjfb8856606 	char *entry = NULL;
870*d30ea906Sjfb8856606 
871*d30ea906Sjfb8856606 	fp = fopen(filename, "r");
872*d30ea906Sjfb8856606 	if (fp == NULL) {
873*d30ea906Sjfb8856606 		printf("File %s does not exist\n", filename);
874*d30ea906Sjfb8856606 		return -1;
875*d30ea906Sjfb8856606 	}
876*d30ea906Sjfb8856606 
877*d30ea906Sjfb8856606 	while (getline(&line, &len, fp) != -1) {
878*d30ea906Sjfb8856606 
879*d30ea906Sjfb8856606 		/* ignore comments and new lines */
880*d30ea906Sjfb8856606 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
881*d30ea906Sjfb8856606 			|| line[0] == '\r')
882*d30ea906Sjfb8856606 			continue;
883*d30ea906Sjfb8856606 
884*d30ea906Sjfb8856606 		trim_space(line);
885*d30ea906Sjfb8856606 
886*d30ea906Sjfb8856606 		/* buffer for multiline */
887*d30ea906Sjfb8856606 		entry = realloc(entry, strlen(line) + 1);
888*d30ea906Sjfb8856606 		if (entry == NULL) {
889*d30ea906Sjfb8856606 			printf("Fail to realloc %zu bytes\n", strlen(line) + 1);
890*d30ea906Sjfb8856606 			ret = -ENOMEM;
891*d30ea906Sjfb8856606 			goto exit;
892*d30ea906Sjfb8856606 		}
893*d30ea906Sjfb8856606 
894*d30ea906Sjfb8856606 		strcpy(entry, line);
895*d30ea906Sjfb8856606 
896*d30ea906Sjfb8856606 		/* check if entry ends with , or = */
897*d30ea906Sjfb8856606 		if (entry[strlen(entry) - 1] == ','
898*d30ea906Sjfb8856606 			|| entry[strlen(entry) - 1] == '=') {
899*d30ea906Sjfb8856606 			while (getline(&line, &len, fp) != -1) {
900*d30ea906Sjfb8856606 				trim_space(line);
901*d30ea906Sjfb8856606 
902*d30ea906Sjfb8856606 				/* extend entry about length of new line */
903*d30ea906Sjfb8856606 				char *entry_extended = realloc(entry,
904*d30ea906Sjfb8856606 						strlen(line) +
905*d30ea906Sjfb8856606 						strlen(entry) + 1);
906*d30ea906Sjfb8856606 
907*d30ea906Sjfb8856606 				if (entry_extended == NULL) {
908*d30ea906Sjfb8856606 					printf("Fail to allocate %zu bytes\n",
909*d30ea906Sjfb8856606 							strlen(line) +
910*d30ea906Sjfb8856606 							strlen(entry) + 1);
911*d30ea906Sjfb8856606 					ret = -ENOMEM;
912*d30ea906Sjfb8856606 					goto exit;
913*d30ea906Sjfb8856606 				}
914*d30ea906Sjfb8856606 
915*d30ea906Sjfb8856606 				entry = entry_extended;
916*d30ea906Sjfb8856606 				/* entry has been allocated accordingly */
917*d30ea906Sjfb8856606 				strcpy(&entry[strlen(entry)], line);
918*d30ea906Sjfb8856606 
919*d30ea906Sjfb8856606 				if (entry[strlen(entry) - 1] != ',')
920*d30ea906Sjfb8856606 					break;
921*d30ea906Sjfb8856606 			}
922*d30ea906Sjfb8856606 		}
923*d30ea906Sjfb8856606 		ret = parse_entry(entry, vector);
924*d30ea906Sjfb8856606 		if (ret != 0) {
925*d30ea906Sjfb8856606 			printf("An error occurred while parsing!\n");
926*d30ea906Sjfb8856606 			goto exit;
927*d30ea906Sjfb8856606 		}
928*d30ea906Sjfb8856606 	}
929*d30ea906Sjfb8856606 	ret = bbdev_check_vector(vector);
930*d30ea906Sjfb8856606 	if (ret != 0)
931*d30ea906Sjfb8856606 		printf("An error occurred while checking!\n");
932*d30ea906Sjfb8856606 
933*d30ea906Sjfb8856606 exit:
934*d30ea906Sjfb8856606 	fclose(fp);
935*d30ea906Sjfb8856606 	free(line);
936*d30ea906Sjfb8856606 	free(entry);
937*d30ea906Sjfb8856606 
938*d30ea906Sjfb8856606 	return ret;
939*d30ea906Sjfb8856606 }
940