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