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