1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Intel Corporation
5 #ifdef RTE_EXEC_ENV_FREEBSD
10 #include <rte_malloc.h>
12 #include "test_bbdev_vector.h"
14 #define VALUE_DELIMITER ","
15 #define ENTRY_DELIMITER "="
17 const char *op_data_prefixes[] = {
25 /* trim leading and trailing spaces */
31 for (start = str; *start; start++) {
32 if (!isspace((unsigned char) start[0]))
36 for (end = start + strlen(start); end > start + 1; end--) {
37 if (!isspace((unsigned char) end[-1]))
43 /* Shift from "start" to the beginning of the string */
45 memmove(str, start, (end - start) + 1);
49 starts_with(const char *str, const char *pre)
51 return strncmp(pre, str, strlen(pre)) == 0;
54 /* tokenization test values separated by a comma */
56 parse_values(char *tokens, uint32_t **data, uint32_t *data_length)
58 uint32_t n_tokens = 0;
59 uint32_t data_size = 32;
61 uint32_t *values, *values_resized;
62 char *tok, *error = NULL;
64 tok = strtok(tokens, VALUE_DELIMITER);
69 rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0);
74 values_resized = NULL;
76 if (n_tokens >= data_size) {
79 values_resized = (uint32_t *) rte_realloc(values,
80 sizeof(uint32_t) * data_size, 0);
81 if (values_resized == NULL) {
85 values = values_resized;
88 values[n_tokens] = (uint32_t) strtoul(tok, &error, 0);
90 if ((error == NULL) || (*error != '\0')) {
91 printf("Failed with convert '%s'\n", tok);
96 *data_length = *data_length + (strlen(tok) - strlen("0x"))/2;
98 tok = strtok(NULL, VALUE_DELIMITER);
105 values_resized = (uint32_t *) rte_realloc(values,
106 sizeof(uint32_t) * (n_tokens + 1), 0);
108 if (values_resized == NULL) {
113 *data = values_resized;
118 /* convert turbo decoder flag from string to unsigned long int*/
120 op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
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;
153 printf("The given value is not a turbo decoder flag\n");
160 /* convert LDPC flag from string to unsigned long int*/
162 op_ldpc_decoder_flag_strtoul(char *token, uint32_t *op_flag_value)
164 if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK"))
165 *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK;
166 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK"))
167 *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK;
168 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP"))
169 *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP;
170 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_16_CHECK"))
171 *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_16_CHECK;
172 else if (!strcmp(token, "RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS"))
173 *op_flag_value = RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS;
174 else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE"))
175 *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
176 else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE"))
177 *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
178 else if (!strcmp(token, "RTE_BBDEV_LDPC_DECODE_BYPASS"))
179 *op_flag_value = RTE_BBDEV_LDPC_DECODE_BYPASS;
180 else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_ENABLE"))
181 *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_ENABLE;
182 else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS"))
183 *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS;
184 else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS"))
185 *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS;
186 else if (!strcmp(token, "RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE"))
187 *op_flag_value = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE;
188 else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_INTERRUPTS"))
189 *op_flag_value = RTE_BBDEV_LDPC_DEC_INTERRUPTS;
190 else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_SCATTER_GATHER"))
191 *op_flag_value = RTE_BBDEV_LDPC_DEC_SCATTER_GATHER;
192 else if (!strcmp(token, "RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION"))
193 *op_flag_value = RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION;
194 else if (!strcmp(token, "RTE_BBDEV_LDPC_LLR_COMPRESSION"))
195 *op_flag_value = RTE_BBDEV_LDPC_LLR_COMPRESSION;
196 else if (!strcmp(token,
197 "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE"))
198 *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE;
199 else if (!strcmp(token,
200 "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE"))
201 *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE;
202 else if (!strcmp(token,
203 "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK"))
204 *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
206 printf("The given value is not a LDPC decoder flag\n");
213 /* convert turbo encoder flag from string to unsigned long int*/
215 op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
217 if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS"))
218 *op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS;
219 else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH"))
220 *op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH;
221 else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH"))
222 *op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH;
223 else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH"))
224 *op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH;
225 else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER"))
226 *op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER;
228 printf("The given value is not a turbo encoder flag\n");
235 /* convert LDPC encoder flag from string to unsigned long int*/
237 op_ldpc_encoder_flag_strtoul(char *token, uint32_t *op_flag_value)
239 if (!strcmp(token, "RTE_BBDEV_LDPC_INTERLEAVER_BYPASS"))
240 *op_flag_value = RTE_BBDEV_LDPC_INTERLEAVER_BYPASS;
241 else if (!strcmp(token, "RTE_BBDEV_LDPC_RATE_MATCH"))
242 *op_flag_value = RTE_BBDEV_LDPC_RATE_MATCH;
243 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24A_ATTACH"))
244 *op_flag_value = RTE_BBDEV_LDPC_CRC_24A_ATTACH;
245 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24B_ATTACH"))
246 *op_flag_value = RTE_BBDEV_LDPC_CRC_24B_ATTACH;
247 else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_16_ATTACH"))
248 *op_flag_value = RTE_BBDEV_LDPC_CRC_16_ATTACH;
249 else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_INTERRUPTS"))
250 *op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS;
251 else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER"))
252 *op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER;
254 printf("The given value is not a turbo encoder flag\n");
261 /* tokenization turbo decoder/encoder flags values separated by a comma */
263 parse_turbo_flags(char *tokens, uint32_t *op_flags,
264 enum rte_bbdev_op_type op_type)
267 uint32_t op_flag_value = 0;
269 tok = strtok(tokens, VALUE_DELIMITER);
273 while (tok != NULL) {
275 if (op_type == RTE_BBDEV_OP_TURBO_DEC) {
276 if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1)
278 } else if (op_type == RTE_BBDEV_OP_TURBO_ENC) {
279 if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1)
281 } else if (op_type == RTE_BBDEV_OP_LDPC_ENC) {
282 if (op_ldpc_encoder_flag_strtoul(tok, &op_flag_value)
285 } else if (op_type == RTE_BBDEV_OP_LDPC_DEC) {
286 if (op_ldpc_decoder_flag_strtoul(tok, &op_flag_value)
293 *op_flags = *op_flags | op_flag_value;
295 tok = strtok(NULL, VALUE_DELIMITER);
303 /* convert turbo encoder/decoder op_type from string to enum*/
305 op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type)
308 if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC"))
309 *op_type = RTE_BBDEV_OP_TURBO_DEC;
310 else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC"))
311 *op_type = RTE_BBDEV_OP_TURBO_ENC;
312 else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_ENC"))
313 *op_type = RTE_BBDEV_OP_LDPC_ENC;
314 else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_DEC"))
315 *op_type = RTE_BBDEV_OP_LDPC_DEC;
316 else if (!strcmp(token, "RTE_BBDEV_OP_NONE"))
317 *op_type = RTE_BBDEV_OP_NONE;
319 printf("Not valid turbo op_type: '%s'\n", token);
326 /* tokenization expected status values separated by a comma */
328 parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type)
331 bool status_ok = false;
333 tok = strtok(tokens, VALUE_DELIMITER);
337 while (tok != NULL) {
339 if (!strcmp(tok, "OK"))
341 else if (!strcmp(tok, "DMA"))
342 *status = *status | (1 << RTE_BBDEV_DRV_ERROR);
343 else if (!strcmp(tok, "FCW"))
344 *status = *status | (1 << RTE_BBDEV_DATA_ERROR);
345 else if (!strcmp(tok, "SYNCRC")) {
346 *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
347 *status = *status | (1 << RTE_BBDEV_CRC_ERROR);
348 } else if (!strcmp(tok, "SYN"))
349 *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR);
350 else if (!strcmp(tok, "CRC")) {
351 if ((op_type == RTE_BBDEV_OP_TURBO_DEC) ||
352 (op_type == RTE_BBDEV_OP_LDPC_DEC))
353 *status = *status | (1 << RTE_BBDEV_CRC_ERROR);
356 "CRC is only a valid value for decoder\n");
360 printf("Not valid status: '%s'\n", tok);
364 tok = strtok(NULL, VALUE_DELIMITER);
369 if (status_ok && *status != 0) {
371 "Not valid status values. Cannot be OK and ERROR at the same time.\n");
378 /* parse ops data entry (there can be more than 1 input entry, each will be
379 * contained in a separate op_data_buf struct)
382 parse_data_entry(const char *key_token, char *token,
383 struct test_bbdev_vector *vector, enum op_data_type type,
387 uint32_t data_length = 0;
388 uint32_t *data = NULL;
390 struct op_data_buf *op_data;
391 unsigned int *nb_ops;
393 if (type >= DATA_NUM_TYPES) {
394 printf("Unknown op type: %d!\n", type);
398 op_data = vector->entries[type].segments;
399 nb_ops = &vector->entries[type].nb_segments;
401 if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) {
402 printf("Too many segments (code blocks defined): %u, max %d!\n",
403 *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS);
407 if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) {
408 printf("Missing ID of %s\n", prefix);
413 "Please order data entries sequentially, i.e. %s0, %s1, ...\n",
418 /* Clear new op data struct */
419 memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf));
421 ret = parse_values(token, &data, &data_length);
423 op_data[*nb_ops].addr = data;
424 op_data[*nb_ops].length = data_length;
431 /* parses turbo decoder parameters and assigns to global variable */
433 parse_decoder_params(const char *key_token, char *token,
434 struct test_bbdev_vector *vector)
436 int ret = 0, status = 0;
437 uint32_t op_flags = 0;
440 struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
443 if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
444 ret = parse_data_entry(key_token, token, vector,
445 DATA_INPUT, op_data_prefixes[DATA_INPUT]);
447 else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT]))
448 ret = parse_data_entry(key_token, token, vector,
450 op_data_prefixes[DATA_SOFT_OUTPUT]);
452 else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT]))
453 ret = parse_data_entry(key_token, token, vector,
455 op_data_prefixes[DATA_HARD_OUTPUT]);
456 else if (!strcmp(key_token, "e")) {
457 vector->mask |= TEST_BBDEV_VF_E;
458 turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
459 } else if (!strcmp(key_token, "ea")) {
460 vector->mask |= TEST_BBDEV_VF_EA;
461 turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
462 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
463 } else if (!strcmp(key_token, "eb")) {
464 vector->mask |= TEST_BBDEV_VF_EB;
465 turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
466 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
467 } else if (!strcmp(key_token, "k")) {
468 vector->mask |= TEST_BBDEV_VF_K;
469 turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0);
470 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
471 } else if (!strcmp(key_token, "k_pos")) {
472 vector->mask |= TEST_BBDEV_VF_K_POS;
473 turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
474 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
475 } else if (!strcmp(key_token, "k_neg")) {
476 vector->mask |= TEST_BBDEV_VF_K_NEG;
477 turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
478 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
479 } else if (!strcmp(key_token, "c")) {
480 vector->mask |= TEST_BBDEV_VF_C;
481 turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0);
482 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
483 } else if (!strcmp(key_token, "c_neg")) {
484 vector->mask |= TEST_BBDEV_VF_C_NEG;
485 turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0);
486 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
487 } else if (!strcmp(key_token, "cab")) {
488 vector->mask |= TEST_BBDEV_VF_CAB;
489 turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
490 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
491 } else if (!strcmp(key_token, "rv_index")) {
492 vector->mask |= TEST_BBDEV_VF_RV_INDEX;
493 turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
494 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
495 } else if (!strcmp(key_token, "iter_max")) {
496 vector->mask |= TEST_BBDEV_VF_ITER_MAX;
497 turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
498 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
499 } else if (!strcmp(key_token, "iter_min")) {
500 vector->mask |= TEST_BBDEV_VF_ITER_MIN;
501 turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0);
502 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
503 } else if (!strcmp(key_token, "expected_iter_count")) {
504 vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
505 turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
506 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
507 } else if (!strcmp(key_token, "ext_scale")) {
508 vector->mask |= TEST_BBDEV_VF_EXT_SCALE;
509 turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0);
510 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
511 } else if (!strcmp(key_token, "num_maps")) {
512 vector->mask |= TEST_BBDEV_VF_NUM_MAPS;
513 turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0);
514 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
515 } else if (!strcmp(key_token, "r")) {
516 vector->mask |= TEST_BBDEV_VF_R;
517 turbo_dec->tb_params.r = (uint8_t)strtoul(token, &err, 0);
518 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
519 } else if (!strcmp(key_token, "code_block_mode")) {
520 vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
521 turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
522 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
523 } else if (!strcmp(key_token, "op_flags")) {
524 vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
525 ret = parse_turbo_flags(token, &op_flags,
528 turbo_dec->op_flags = op_flags;
529 } else if (!strcmp(key_token, "expected_status")) {
530 vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
531 ret = parse_expected_status(token, &status, vector->op_type);
533 vector->expected_status = status;
535 printf("Not valid dec key: '%s'\n", key_token);
540 printf("Failed with convert '%s\t%s'\n", key_token, token);
547 /* parses turbo encoder parameters and assigns to global variable */
549 parse_encoder_params(const char *key_token, char *token,
550 struct test_bbdev_vector *vector)
552 int ret = 0, status = 0;
553 uint32_t op_flags = 0;
557 struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc;
559 if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
560 ret = parse_data_entry(key_token, token, vector,
561 DATA_INPUT, op_data_prefixes[DATA_INPUT]);
562 else if (starts_with(key_token, "output"))
563 ret = parse_data_entry(key_token, token, vector,
564 DATA_HARD_OUTPUT, "output");
565 else if (!strcmp(key_token, "e")) {
566 vector->mask |= TEST_BBDEV_VF_E;
567 turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
568 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
569 } else if (!strcmp(key_token, "ea")) {
570 vector->mask |= TEST_BBDEV_VF_EA;
571 turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
572 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
573 } else if (!strcmp(key_token, "eb")) {
574 vector->mask |= TEST_BBDEV_VF_EB;
575 turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
576 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
577 } else if (!strcmp(key_token, "k")) {
578 vector->mask |= TEST_BBDEV_VF_K;
579 turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0);
580 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
581 } else if (!strcmp(key_token, "k_neg")) {
582 vector->mask |= TEST_BBDEV_VF_K_NEG;
583 turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0);
584 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
585 } else if (!strcmp(key_token, "k_pos")) {
586 vector->mask |= TEST_BBDEV_VF_K_POS;
587 turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0);
588 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
589 } else if (!strcmp(key_token, "c_neg")) {
590 vector->mask |= TEST_BBDEV_VF_C_NEG;
591 turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0);
592 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
593 } else if (!strcmp(key_token, "c")) {
594 vector->mask |= TEST_BBDEV_VF_C;
595 turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
596 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
597 } else if (!strcmp(key_token, "cab")) {
598 vector->mask |= TEST_BBDEV_VF_CAB;
599 turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
600 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
601 } else if (!strcmp(key_token, "rv_index")) {
602 vector->mask |= TEST_BBDEV_VF_RV_INDEX;
603 turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
604 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
605 } else if (!strcmp(key_token, "ncb")) {
606 vector->mask |= TEST_BBDEV_VF_NCB;
607 turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0);
608 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
609 } else if (!strcmp(key_token, "ncb_neg")) {
610 vector->mask |= TEST_BBDEV_VF_NCB_NEG;
611 turbo_enc->tb_params.ncb_neg =
612 (uint16_t) strtoul(token, &err, 0);
613 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
614 } else if (!strcmp(key_token, "ncb_pos")) {
615 vector->mask |= TEST_BBDEV_VF_NCB_POS;
616 turbo_enc->tb_params.ncb_pos =
617 (uint16_t) strtoul(token, &err, 0);
618 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
619 } else if (!strcmp(key_token, "r")) {
620 vector->mask |= TEST_BBDEV_VF_R;
621 turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
622 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
623 } else if (!strcmp(key_token, "code_block_mode")) {
624 vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
625 turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
626 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
627 } else if (!strcmp(key_token, "op_flags")) {
628 vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
629 ret = parse_turbo_flags(token, &op_flags,
632 turbo_enc->op_flags = op_flags;
633 } else if (!strcmp(key_token, "expected_status")) {
634 vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
635 ret = parse_expected_status(token, &status, vector->op_type);
637 vector->expected_status = status;
639 printf("Not valid enc key: '%s'\n", key_token);
644 printf("Failed with convert '%s\t%s'\n", key_token, token);
652 /* parses LDPC encoder parameters and assigns to global variable */
654 parse_ldpc_encoder_params(const char *key_token, char *token,
655 struct test_bbdev_vector *vector)
657 int ret = 0, status = 0;
658 uint32_t op_flags = 0;
661 struct rte_bbdev_op_ldpc_enc *ldpc_enc = &vector->ldpc_enc;
663 if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
664 ret = parse_data_entry(key_token, token, vector,
666 op_data_prefixes[DATA_INPUT]);
667 else if (starts_with(key_token, "output"))
668 ret = parse_data_entry(key_token, token, vector,
671 else if (!strcmp(key_token, "e")) {
672 vector->mask |= TEST_BBDEV_VF_E;
673 ldpc_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0);
674 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
675 } else if (!strcmp(key_token, "ea")) {
676 vector->mask |= TEST_BBDEV_VF_EA;
677 ldpc_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
678 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
679 } else if (!strcmp(key_token, "eb")) {
680 vector->mask |= TEST_BBDEV_VF_EB;
681 ldpc_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
682 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
683 } else if (!strcmp(key_token, "c")) {
684 vector->mask |= TEST_BBDEV_VF_C;
685 ldpc_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0);
686 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
687 } else if (!strcmp(key_token, "cab")) {
688 vector->mask |= TEST_BBDEV_VF_CAB;
689 ldpc_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
690 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
691 } else if (!strcmp(key_token, "rv_index")) {
692 vector->mask |= TEST_BBDEV_VF_RV_INDEX;
693 ldpc_enc->rv_index = (uint8_t) strtoul(token, &err, 0);
694 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
695 } else if (!strcmp(key_token, "n_cb")) {
696 vector->mask |= TEST_BBDEV_VF_NCB;
697 ldpc_enc->n_cb = (uint16_t) strtoul(token, &err, 0);
698 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
699 } else if (!strcmp(key_token, "r")) {
700 vector->mask |= TEST_BBDEV_VF_R;
701 ldpc_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0);
702 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
703 } else if (!strcmp(key_token, "q_m")) {
704 vector->mask |= TEST_BBDEV_VF_QM;
705 ldpc_enc->q_m = (uint8_t) strtoul(token, &err, 0);
706 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
707 } else if (!strcmp(key_token, "basegraph")) {
708 vector->mask |= TEST_BBDEV_VF_BG;
709 ldpc_enc->basegraph = (uint8_t) strtoul(token, &err, 0);
710 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
711 } else if (!strcmp(key_token, "z_c")) {
712 vector->mask |= TEST_BBDEV_VF_ZC;
713 ldpc_enc->z_c = (uint16_t) strtoul(token, &err, 0);
714 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
715 } else if (!strcmp(key_token, "n_filler")) {
716 vector->mask |= TEST_BBDEV_VF_F;
717 ldpc_enc->n_filler = (uint16_t) strtoul(token, &err, 0);
718 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
719 } else if (!strcmp(key_token, "code_block_mode")) {
720 vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
721 ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
722 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
723 } else if (!strcmp(key_token, "op_flags")) {
724 vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
725 ret = parse_turbo_flags(token, &op_flags, vector->op_type);
727 ldpc_enc->op_flags = op_flags;
728 } else if (!strcmp(key_token, "expected_status")) {
729 vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
730 ret = parse_expected_status(token, &status, vector->op_type);
732 vector->expected_status = status;
734 printf("Not valid ldpc enc key: '%s'\n", key_token);
739 printf("Failed with convert '%s\t%s'\n", key_token, token);
746 /* parses LDPC decoder parameters and assigns to global variable */
748 parse_ldpc_decoder_params(const char *key_token, char *token,
749 struct test_bbdev_vector *vector)
751 int ret = 0, status = 0;
752 uint32_t op_flags = 0;
755 struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
757 if (starts_with(key_token, op_data_prefixes[DATA_INPUT]))
758 ret = parse_data_entry(key_token, token, vector,
760 op_data_prefixes[DATA_INPUT]);
761 else if (starts_with(key_token, "output"))
762 ret = parse_data_entry(key_token, token, vector,
765 else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_INPUT]))
766 ret = parse_data_entry(key_token, token, vector,
768 op_data_prefixes[DATA_HARQ_INPUT]);
769 else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_OUTPUT]))
770 ret = parse_data_entry(key_token, token, vector,
772 op_data_prefixes[DATA_HARQ_OUTPUT]);
773 else if (!strcmp(key_token, "e")) {
774 vector->mask |= TEST_BBDEV_VF_E;
775 ldpc_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0);
776 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
777 } else if (!strcmp(key_token, "ea")) {
778 vector->mask |= TEST_BBDEV_VF_EA;
779 ldpc_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0);
780 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
781 } else if (!strcmp(key_token, "eb")) {
782 vector->mask |= TEST_BBDEV_VF_EB;
783 ldpc_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0);
784 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
785 } else if (!strcmp(key_token, "c")) {
786 vector->mask |= TEST_BBDEV_VF_C;
787 ldpc_dec->tb_params.c = (uint8_t) strtoul(token, &err, 0);
788 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
789 } else if (!strcmp(key_token, "cab")) {
790 vector->mask |= TEST_BBDEV_VF_CAB;
791 ldpc_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0);
792 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
793 } else if (!strcmp(key_token, "rv_index")) {
794 vector->mask |= TEST_BBDEV_VF_RV_INDEX;
795 ldpc_dec->rv_index = (uint8_t) strtoul(token, &err, 0);
796 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
797 } else if (!strcmp(key_token, "n_cb")) {
798 vector->mask |= TEST_BBDEV_VF_NCB;
799 ldpc_dec->n_cb = (uint16_t) strtoul(token, &err, 0);
800 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
801 } else if (!strcmp(key_token, "r")) {
802 vector->mask |= TEST_BBDEV_VF_R;
803 ldpc_dec->tb_params.r = (uint8_t) strtoul(token, &err, 0);
804 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
805 } else if (!strcmp(key_token, "q_m")) {
806 vector->mask |= TEST_BBDEV_VF_QM;
807 ldpc_dec->q_m = (uint8_t) strtoul(token, &err, 0);
808 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
809 } else if (!strcmp(key_token, "basegraph")) {
810 vector->mask |= TEST_BBDEV_VF_BG;
811 ldpc_dec->basegraph = (uint8_t) strtoul(token, &err, 0);
812 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
813 } else if (!strcmp(key_token, "z_c")) {
814 vector->mask |= TEST_BBDEV_VF_ZC;
815 ldpc_dec->z_c = (uint16_t) strtoul(token, &err, 0);
816 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
817 } else if (!strcmp(key_token, "n_filler")) {
818 vector->mask |= TEST_BBDEV_VF_F;
819 ldpc_dec->n_filler = (uint16_t) strtoul(token, &err, 0);
820 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
821 } else if (!strcmp(key_token, "expected_iter_count")) {
822 vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT;
823 ldpc_dec->iter_count = (uint8_t) strtoul(token, &err, 0);
824 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
825 } else if (!strcmp(key_token, "iter_max")) {
826 vector->mask |= TEST_BBDEV_VF_ITER_MAX;
827 ldpc_dec->iter_max = (uint8_t) strtoul(token, &err, 0);
828 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
829 } else if (!strcmp(key_token, "code_block_mode")) {
830 vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
831 ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
832 ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
833 } else if (!strcmp(key_token, "op_flags")) {
834 vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
835 ret = parse_turbo_flags(token, &op_flags, vector->op_type);
837 ldpc_dec->op_flags = op_flags;
838 } else if (!strcmp(key_token, "expected_status")) {
839 vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS;
840 ret = parse_expected_status(token, &status, vector->op_type);
842 vector->expected_status = status;
844 printf("Not valid ldpc dec key: '%s'\n", key_token);
849 printf("Failed with convert '%s\t%s'\n", key_token, token);
856 /* checks the type of key and assigns data */
858 parse_entry(char *entry, struct test_bbdev_vector *vector)
861 char *token, *key_token;
862 enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE;
865 printf("Expected entry value\n");
870 token = strtok(entry, ENTRY_DELIMITER);
872 /* get values for key */
873 token = strtok(NULL, ENTRY_DELIMITER);
875 if (key_token == NULL || token == NULL) {
876 printf("Expected 'key = values' but was '%.40s'..\n", entry);
879 trim_space(key_token);
881 /* first key_token has to specify type of operation */
882 if (vector->op_type == RTE_BBDEV_OP_NONE) {
883 if (!strcmp(key_token, "op_type")) {
884 ret = op_turbo_type_strtol(token, &op_type);
886 vector->op_type = op_type;
887 return (!ret) ? 0 : -1;
889 printf("First key_token (%s) does not specify op_type\n",
895 if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
896 if (parse_decoder_params(key_token, token, vector) == -1)
898 } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
899 if (parse_encoder_params(key_token, token, vector) == -1)
901 } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
902 if (parse_ldpc_encoder_params(key_token, token, vector) == -1)
904 } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
905 if (parse_ldpc_decoder_params(key_token, token, vector) == -1)
913 check_decoder_segments(struct test_bbdev_vector *vector)
916 struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
918 if (vector->entries[DATA_INPUT].nb_segments == 0)
921 for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
922 if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
925 if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
928 for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments;
930 if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
933 if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) &&
934 (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
937 for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments;
939 if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
946 check_ldpc_decoder_segments(struct test_bbdev_vector *vector)
949 struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
951 for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
952 if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
955 for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
956 if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
959 if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) &&
960 (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0))
963 for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; i++)
964 if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL)
967 if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) &&
968 (vector->entries[DATA_HARQ_OUTPUT].nb_segments == 0))
971 for (i = 0; i < vector->entries[DATA_HARQ_OUTPUT].nb_segments; i++)
972 if (vector->entries[DATA_HARQ_OUTPUT].segments[i].addr == NULL)
979 check_decoder_llr_spec(struct test_bbdev_vector *vector)
981 struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
983 /* Check input LLR sign formalism specification */
984 if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
985 (turbo_dec->op_flags &
986 RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
988 "Both positive and negative LLR input flags were set!\n");
991 if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) &&
992 !(turbo_dec->op_flags &
993 RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) {
995 "INFO: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
996 turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN;
999 if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT))
1002 /* Check output LLR sign formalism specification */
1003 if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1004 (turbo_dec->op_flags &
1005 RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1007 "Both positive and negative LLR output flags were set!\n");
1010 if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) &&
1011 !(turbo_dec->op_flags &
1012 RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) {
1014 "INFO: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n");
1015 turbo_dec->op_flags |=
1016 RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
1023 check_decoder_op_flags(struct test_bbdev_vector *vector)
1025 struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
1027 if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP) &&
1028 !(turbo_dec->op_flags & RTE_BBDEV_TURBO_CRC_TYPE_24B)) {
1030 "WARNING: RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP flag is missing RTE_BBDEV_TURBO_CRC_TYPE_24B\n");
1037 /* checks decoder parameters */
1039 check_decoder(struct test_bbdev_vector *vector)
1041 struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec;
1042 const int mask = vector->mask;
1044 if (check_decoder_segments(vector) < 0)
1047 if (check_decoder_llr_spec(vector) < 0)
1050 if (check_decoder_op_flags(vector) < 0)
1053 /* Check which params were set */
1054 if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1056 "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
1057 turbo_dec->code_block_mode = RTE_BBDEV_CODE_BLOCK;
1059 if (turbo_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1060 if (!(mask & TEST_BBDEV_VF_EA))
1062 "WARNING: ea was not specified in vector file and will be set to 0\n");
1063 if (!(mask & TEST_BBDEV_VF_EB))
1065 "WARNING: eb was not specified in vector file and will be set to 0\n");
1066 if (!(mask & TEST_BBDEV_VF_K_NEG))
1068 "WARNING: k_neg was not specified in vector file and will be set to 0\n");
1069 if (!(mask & TEST_BBDEV_VF_K_POS))
1071 "WARNING: k_pos was not specified in vector file and will be set to 0\n");
1072 if (!(mask & TEST_BBDEV_VF_C_NEG))
1074 "WARNING: c_neg was not specified in vector file and will be set to 0\n");
1075 if (!(mask & TEST_BBDEV_VF_C)) {
1077 "WARNING: c was not specified in vector file and will be set to 1\n");
1078 turbo_dec->tb_params.c = 1;
1080 if (!(mask & TEST_BBDEV_VF_CAB))
1082 "WARNING: cab was not specified in vector file and will be set to 0\n");
1083 if (!(mask & TEST_BBDEV_VF_R))
1085 "WARNING: r was not specified in vector file and will be set to 0\n");
1087 if (!(mask & TEST_BBDEV_VF_E))
1089 "WARNING: e was not specified in vector file and will be set to 0\n");
1090 if (!(mask & TEST_BBDEV_VF_K))
1092 "WARNING: k was not specified in vector file and will be set to 0\n");
1094 if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1096 "INFO: rv_index was not specified in vector file and will be set to 0\n");
1097 if (!(mask & TEST_BBDEV_VF_ITER_MIN))
1099 "WARNING: iter_min was not specified in vector file and will be set to 0\n");
1100 if (!(mask & TEST_BBDEV_VF_ITER_MAX))
1102 "WARNING: iter_max was not specified in vector file and will be set to 0\n");
1103 if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
1105 "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
1106 if (!(mask & TEST_BBDEV_VF_EXT_SCALE))
1108 "WARNING: ext_scale was not specified in vector file and will be set to 0\n");
1109 if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
1111 "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
1112 turbo_dec->num_maps = 0;
1113 } else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) &&
1114 mask & TEST_BBDEV_VF_NUM_MAPS) {
1116 "INFO: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n");
1117 turbo_dec->num_maps = 0;
1119 if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1121 "WARNING: expected_status was not specified in vector file and will be set to 0\n");
1125 /* checks LDPC decoder parameters */
1127 check_ldpc_decoder(struct test_bbdev_vector *vector)
1129 struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec;
1130 const int mask = vector->mask;
1132 if (check_ldpc_decoder_segments(vector) < 0)
1136 * if (check_ldpc_decoder_llr_spec(vector) < 0)
1139 * if (check_ldpc_decoder_op_flags(vector) < 0)
1143 /* Check which params were set */
1144 if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1146 "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n");
1147 ldpc_dec->code_block_mode = RTE_BBDEV_CODE_BLOCK;
1149 if (ldpc_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1150 if (!(mask & TEST_BBDEV_VF_EA))
1152 "WARNING: ea was not specified in vector file and will be set to 0\n");
1153 if (!(mask & TEST_BBDEV_VF_EB))
1155 "WARNING: eb was not specified in vector file and will be set to 0\n");
1156 if (!(mask & TEST_BBDEV_VF_C)) {
1158 "WARNING: c was not specified in vector file and will be set to 1\n");
1159 ldpc_dec->tb_params.c = 1;
1161 if (!(mask & TEST_BBDEV_VF_CAB))
1163 "WARNING: cab was not specified in vector file and will be set to 0\n");
1164 if (!(mask & TEST_BBDEV_VF_R))
1166 "WARNING: r was not specified in vector file and will be set to 0\n");
1168 if (!(mask & TEST_BBDEV_VF_E))
1170 "WARNING: e was not specified in vector file and will be set to 0\n");
1172 if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1174 "INFO: rv_index was not specified in vector file and will be set to 0\n");
1175 if (!(mask & TEST_BBDEV_VF_ITER_MAX))
1177 "WARNING: iter_max was not specified in vector file and will be set to 0\n");
1178 if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT))
1180 "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n");
1181 if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) {
1183 "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n");
1185 if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1187 "WARNING: expected_status was not specified in vector file and will be set to 0\n");
1191 /* checks encoder parameters */
1193 check_encoder(struct test_bbdev_vector *vector)
1196 const int mask = vector->mask;
1198 if (vector->entries[DATA_INPUT].nb_segments == 0)
1201 for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
1202 if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
1205 if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
1208 for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
1209 if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
1212 if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1214 "WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
1215 vector->turbo_enc.code_block_mode = RTE_BBDEV_CODE_BLOCK;
1217 if (vector->turbo_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1218 if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags &
1219 RTE_BBDEV_TURBO_RATE_MATCH))
1221 "WARNING: ea was not specified in vector file and will be set to 0\n");
1222 if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags &
1223 RTE_BBDEV_TURBO_RATE_MATCH))
1225 "WARNING: eb was not specified in vector file and will be set to 0\n");
1226 if (!(mask & TEST_BBDEV_VF_K_NEG))
1228 "WARNING: k_neg was not specified in vector file and will be set to 0\n");
1229 if (!(mask & TEST_BBDEV_VF_K_POS))
1231 "WARNING: k_pos was not specified in vector file and will be set to 0\n");
1232 if (!(mask & TEST_BBDEV_VF_C_NEG))
1234 "WARNING: c_neg was not specified in vector file and will be set to 0\n");
1235 if (!(mask & TEST_BBDEV_VF_C)) {
1237 "WARNING: c was not specified in vector file and will be set to 1\n");
1238 vector->turbo_enc.tb_params.c = 1;
1240 if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags &
1241 RTE_BBDEV_TURBO_RATE_MATCH))
1243 "WARNING: cab was not specified in vector file and will be set to 0\n");
1244 if (!(mask & TEST_BBDEV_VF_NCB_NEG))
1246 "WARNING: ncb_neg was not specified in vector file and will be set to 0\n");
1247 if (!(mask & TEST_BBDEV_VF_NCB_POS))
1249 "WARNING: ncb_pos was not specified in vector file and will be set to 0\n");
1250 if (!(mask & TEST_BBDEV_VF_R))
1252 "WARNING: r was not specified in vector file and will be set to 0\n");
1254 if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
1255 RTE_BBDEV_TURBO_RATE_MATCH))
1257 "WARNING: e was not specified in vector file and will be set to 0\n");
1258 if (!(mask & TEST_BBDEV_VF_K))
1260 "WARNING: k was not specified in vector file and will be set to 0\n");
1261 if (!(mask & TEST_BBDEV_VF_NCB))
1263 "WARNING: ncb was not specified in vector file and will be set to 0\n");
1265 if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1267 "INFO: rv_index was not specified in vector file and will be set to 0\n");
1268 if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
1270 "INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
1271 if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1273 "WARNING: expected_status was not specified in vector file and will be set to 0\n");
1279 /* checks encoder parameters */
1281 check_ldpc_encoder(struct test_bbdev_vector *vector)
1284 const int mask = vector->mask;
1286 if (vector->entries[DATA_INPUT].nb_segments == 0)
1289 for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++)
1290 if (vector->entries[DATA_INPUT].segments[i].addr == NULL)
1293 if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0)
1296 for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++)
1297 if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL)
1300 if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
1302 "WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
1303 vector->turbo_enc.code_block_mode = RTE_BBDEV_CODE_BLOCK;
1305 if (vector->turbo_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) {
1307 if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
1308 RTE_BBDEV_TURBO_RATE_MATCH))
1310 "WARNING: e was not specified in vector file and will be set to 0\n");
1311 if (!(mask & TEST_BBDEV_VF_NCB))
1313 "WARNING: ncb was not specified in vector file and will be set to 0\n");
1315 if (!(mask & TEST_BBDEV_VF_BG))
1317 "WARNING: BG was not specified in vector file and will be set to 0\n");
1318 if (!(mask & TEST_BBDEV_VF_ZC))
1320 "WARNING: Zc was not specified in vector file and will be set to 0\n");
1321 if (!(mask & TEST_BBDEV_VF_RV_INDEX))
1323 "INFO: rv_index was not specified in vector file and will be set to 0\n");
1324 if (!(mask & TEST_BBDEV_VF_OP_FLAGS))
1326 "INFO: op_flags was not specified in vector file and capabilities will not be validated\n");
1327 if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS))
1329 "WARNING: expected_status was not specified in vector file and will be set to 0\n");
1335 bbdev_check_vector(struct test_bbdev_vector *vector)
1337 if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) {
1338 if (check_decoder(vector) == -1)
1340 } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) {
1341 if (check_encoder(vector) == -1)
1343 } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) {
1344 if (check_ldpc_encoder(vector) == -1)
1346 } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) {
1347 if (check_ldpc_decoder(vector) == -1)
1349 } else if (vector->op_type != RTE_BBDEV_OP_NONE) {
1350 printf("Vector was not filled\n");
1358 test_bbdev_vector_read(const char *filename,
1359 struct test_bbdev_vector *vector)
1368 fp = fopen(filename, "r");
1370 printf("File %s does not exist\n", filename);
1374 while (getline(&line, &len, fp) != -1) {
1376 /* ignore comments and new lines */
1377 if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
1383 /* buffer for multiline */
1384 entry = realloc(entry, strlen(line) + 1);
1385 if (entry == NULL) {
1386 printf("Fail to realloc %zu bytes\n", strlen(line) + 1);
1391 strcpy(entry, line);
1393 /* check if entry ends with , or = */
1394 if (entry[strlen(entry) - 1] == ','
1395 || entry[strlen(entry) - 1] == '=') {
1396 while (getline(&line, &len, fp) != -1) {
1399 /* extend entry about length of new line */
1400 char *entry_extended = realloc(entry,
1404 if (entry_extended == NULL) {
1405 printf("Fail to allocate %zu bytes\n",
1412 entry = entry_extended;
1413 /* entry has been allocated accordingly */
1414 strcpy(&entry[strlen(entry)], line);
1416 if (entry[strlen(entry) - 1] != ',')
1420 ret = parse_entry(entry, vector);
1422 printf("An error occurred while parsing!\n");
1426 ret = bbdev_check_vector(vector);
1428 printf("An error occurred while checking!\n");