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