1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright(c) 2019-2021 Xilinx, Inc. 4 * Copyright(c) 2016-2019 Solarflare Communications Inc. 5 * 6 * This software was jointly developed between OKTET Labs (under contract 7 * for Solarflare) and Solarflare Communications, Inc. 8 */ 9 10 #include <stdbool.h> 11 #include <strings.h> 12 13 #include <rte_devargs.h> 14 #include <rte_kvargs.h> 15 16 #include "sfc.h" 17 #include "sfc_kvargs.h" 18 19 int 20 sfc_kvargs_parse(struct sfc_adapter *sa) 21 { 22 struct rte_eth_dev *eth_dev = (sa)->eth_dev; 23 struct rte_devargs *devargs = eth_dev->device->devargs; 24 const char **params = (const char *[]){ 25 SFC_KVARG_STATS_UPDATE_PERIOD_MS, 26 SFC_KVARG_PERF_PROFILE, 27 SFC_KVARG_RX_DATAPATH, 28 SFC_KVARG_TX_DATAPATH, 29 SFC_KVARG_FW_VARIANT, 30 SFC_KVARG_RXD_WAIT_TIMEOUT_NS, 31 SFC_EFX_KVARG_DEV_CLASS, 32 NULL, 33 }; 34 35 if (devargs == NULL) 36 return 0; 37 38 sa->kvargs = rte_kvargs_parse(devargs->args, params); 39 if (sa->kvargs == NULL) 40 return EINVAL; 41 42 return 0; 43 } 44 45 void 46 sfc_kvargs_cleanup(struct sfc_adapter *sa) 47 { 48 rte_kvargs_free(sa->kvargs); 49 } 50 51 static int 52 sfc_kvarg_match_value(const char *value, const char * const *values, 53 unsigned int n_values) 54 { 55 unsigned int i; 56 57 for (i = 0; i < n_values; ++i) 58 if (strcasecmp(value, values[i]) == 0) 59 return 1; 60 61 return 0; 62 } 63 64 int 65 sfc_kvargs_process(struct sfc_adapter *sa, const char *key_match, 66 arg_handler_t handler, void *opaque_arg) 67 { 68 if (sa->kvargs == NULL) 69 return 0; 70 71 return -rte_kvargs_process(sa->kvargs, key_match, handler, opaque_arg); 72 } 73 74 int 75 sfc_kvarg_bool_handler(__rte_unused const char *key, 76 const char *value_str, void *opaque) 77 { 78 const char * const true_strs[] = { 79 "1", "y", "yes", "on", "true" 80 }; 81 const char * const false_strs[] = { 82 "0", "n", "no", "off", "false" 83 }; 84 bool *value = opaque; 85 86 if (sfc_kvarg_match_value(value_str, true_strs, 87 RTE_DIM(true_strs))) 88 *value = true; 89 else if (sfc_kvarg_match_value(value_str, false_strs, 90 RTE_DIM(false_strs))) 91 *value = false; 92 else 93 return -EINVAL; 94 95 return 0; 96 } 97 98 int 99 sfc_kvarg_long_handler(__rte_unused const char *key, 100 const char *value_str, void *opaque) 101 { 102 long value; 103 char *endptr; 104 105 if (!value_str || !opaque) 106 return -EINVAL; 107 108 value = strtol(value_str, &endptr, 0); 109 if (endptr == value_str) 110 return -EINVAL; 111 112 *(long *)opaque = value; 113 114 return 0; 115 } 116 117 int 118 sfc_kvarg_string_handler(__rte_unused const char *key, 119 const char *value_str, void *opaque) 120 { 121 *(const char **)opaque = value_str; 122 123 return 0; 124 } 125