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