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