144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 2244cfa79SAndrew Rybchenko * 398d26ef7SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc. 4a0147be5SAndrew Rybchenko * Copyright(c) 2016-2019 Solarflare Communications Inc. 563d588ffSAndrew Rybchenko * 663d588ffSAndrew Rybchenko * This software was jointly developed between OKTET Labs (under contract 763d588ffSAndrew Rybchenko * for Solarflare) and Solarflare Communications, Inc. 863d588ffSAndrew Rybchenko */ 963d588ffSAndrew Rybchenko 1063d588ffSAndrew Rybchenko #include <stdbool.h> 1163d588ffSAndrew Rybchenko #include <strings.h> 1263d588ffSAndrew Rybchenko 1363d588ffSAndrew Rybchenko #include <rte_devargs.h> 1463d588ffSAndrew Rybchenko #include <rte_kvargs.h> 1563d588ffSAndrew Rybchenko 1663d588ffSAndrew Rybchenko #include "sfc.h" 1763d588ffSAndrew Rybchenko #include "sfc_kvargs.h" 1863d588ffSAndrew Rybchenko 1963d588ffSAndrew Rybchenko int 2063d588ffSAndrew Rybchenko sfc_kvargs_parse(struct sfc_adapter *sa) 2163d588ffSAndrew Rybchenko { 2263d588ffSAndrew Rybchenko struct rte_eth_dev *eth_dev = (sa)->eth_dev; 2363d588ffSAndrew Rybchenko struct rte_devargs *devargs = eth_dev->device->devargs; 2463d588ffSAndrew Rybchenko const char **params = (const char *[]){ 25f8778b16SIgor Romanov SFC_KVARG_SWITCH_MODE, 26a62ec905SIgor Romanov SFC_KVARG_REPRESENTOR, 27e56fa9c2SIvan Malov SFC_KVARG_STATS_UPDATE_PERIOD_MS, 28c22d3c50SAndrew Rybchenko SFC_KVARG_PERF_PROFILE, 29df1bfde4SAndrew Rybchenko SFC_KVARG_RX_DATAPATH, 30dbdc8241SAndrew Rybchenko SFC_KVARG_TX_DATAPATH, 319e7fc8b8SRoman Zhukov SFC_KVARG_FW_VARIANT, 325a1ae82dSAndrew Rybchenko SFC_KVARG_RXD_WAIT_TIMEOUT_NS, 3335d4f17bSXueming Li RTE_DEVARGS_KEY_CLASS, 3463d588ffSAndrew Rybchenko NULL, 3563d588ffSAndrew Rybchenko }; 3663d588ffSAndrew Rybchenko 3763d588ffSAndrew Rybchenko if (devargs == NULL) 3863d588ffSAndrew Rybchenko return 0; 3963d588ffSAndrew Rybchenko 4063d588ffSAndrew Rybchenko sa->kvargs = rte_kvargs_parse(devargs->args, params); 4163d588ffSAndrew Rybchenko if (sa->kvargs == NULL) 4263d588ffSAndrew Rybchenko return EINVAL; 4363d588ffSAndrew Rybchenko 4463d588ffSAndrew Rybchenko return 0; 4563d588ffSAndrew Rybchenko } 4663d588ffSAndrew Rybchenko 4763d588ffSAndrew Rybchenko void 4863d588ffSAndrew Rybchenko sfc_kvargs_cleanup(struct sfc_adapter *sa) 4963d588ffSAndrew Rybchenko { 5063d588ffSAndrew Rybchenko rte_kvargs_free(sa->kvargs); 5163d588ffSAndrew Rybchenko } 5263d588ffSAndrew Rybchenko 5363d588ffSAndrew Rybchenko static int 5463d588ffSAndrew Rybchenko sfc_kvarg_match_value(const char *value, const char * const *values, 5563d588ffSAndrew Rybchenko unsigned int n_values) 5663d588ffSAndrew Rybchenko { 5763d588ffSAndrew Rybchenko unsigned int i; 5863d588ffSAndrew Rybchenko 5963d588ffSAndrew Rybchenko for (i = 0; i < n_values; ++i) 6063d588ffSAndrew Rybchenko if (strcasecmp(value, values[i]) == 0) 6163d588ffSAndrew Rybchenko return 1; 6263d588ffSAndrew Rybchenko 6363d588ffSAndrew Rybchenko return 0; 6463d588ffSAndrew Rybchenko } 6563d588ffSAndrew Rybchenko 6663d588ffSAndrew Rybchenko int 6763d588ffSAndrew Rybchenko sfc_kvargs_process(struct sfc_adapter *sa, const char *key_match, 6863d588ffSAndrew Rybchenko arg_handler_t handler, void *opaque_arg) 6963d588ffSAndrew Rybchenko { 7063d588ffSAndrew Rybchenko if (sa->kvargs == NULL) 7163d588ffSAndrew Rybchenko return 0; 7263d588ffSAndrew Rybchenko 7363d588ffSAndrew Rybchenko return -rte_kvargs_process(sa->kvargs, key_match, handler, opaque_arg); 7463d588ffSAndrew Rybchenko } 7563d588ffSAndrew Rybchenko 7663d588ffSAndrew Rybchenko int 77*f33e8c0eSChengwen Feng sfc_kvargs_process_opt(struct sfc_adapter *sa, const char *key_match, 78*f33e8c0eSChengwen Feng arg_handler_t handler, void *opaque_arg) 79*f33e8c0eSChengwen Feng { 80*f33e8c0eSChengwen Feng if (sa->kvargs == NULL) 81*f33e8c0eSChengwen Feng return 0; 82*f33e8c0eSChengwen Feng 83*f33e8c0eSChengwen Feng return -rte_kvargs_process_opt(sa->kvargs, key_match, handler, opaque_arg); 84*f33e8c0eSChengwen Feng } 85*f33e8c0eSChengwen Feng 86*f33e8c0eSChengwen Feng int 8763d588ffSAndrew Rybchenko sfc_kvarg_bool_handler(__rte_unused const char *key, 8863d588ffSAndrew Rybchenko const char *value_str, void *opaque) 8963d588ffSAndrew Rybchenko { 9063d588ffSAndrew Rybchenko const char * const true_strs[] = { 9163d588ffSAndrew Rybchenko "1", "y", "yes", "on", "true" 9263d588ffSAndrew Rybchenko }; 9363d588ffSAndrew Rybchenko const char * const false_strs[] = { 9463d588ffSAndrew Rybchenko "0", "n", "no", "off", "false" 9563d588ffSAndrew Rybchenko }; 9663d588ffSAndrew Rybchenko bool *value = opaque; 9763d588ffSAndrew Rybchenko 9863d588ffSAndrew Rybchenko if (sfc_kvarg_match_value(value_str, true_strs, 9963d588ffSAndrew Rybchenko RTE_DIM(true_strs))) 10063d588ffSAndrew Rybchenko *value = true; 10163d588ffSAndrew Rybchenko else if (sfc_kvarg_match_value(value_str, false_strs, 10263d588ffSAndrew Rybchenko RTE_DIM(false_strs))) 10363d588ffSAndrew Rybchenko *value = false; 10463d588ffSAndrew Rybchenko else 10563d588ffSAndrew Rybchenko return -EINVAL; 10663d588ffSAndrew Rybchenko 10763d588ffSAndrew Rybchenko return 0; 10863d588ffSAndrew Rybchenko } 109e56fa9c2SIvan Malov 110e56fa9c2SIvan Malov int 111e56fa9c2SIvan Malov sfc_kvarg_long_handler(__rte_unused const char *key, 112e56fa9c2SIvan Malov const char *value_str, void *opaque) 113e56fa9c2SIvan Malov { 114e56fa9c2SIvan Malov long value; 115e56fa9c2SIvan Malov char *endptr; 116e56fa9c2SIvan Malov 117*f33e8c0eSChengwen Feng if (!opaque) 118e56fa9c2SIvan Malov return -EINVAL; 119e56fa9c2SIvan Malov 120e56fa9c2SIvan Malov value = strtol(value_str, &endptr, 0); 121e56fa9c2SIvan Malov if (endptr == value_str) 122e56fa9c2SIvan Malov return -EINVAL; 123e56fa9c2SIvan Malov 124e56fa9c2SIvan Malov *(long *)opaque = value; 125e56fa9c2SIvan Malov 126e56fa9c2SIvan Malov return 0; 127e56fa9c2SIvan Malov } 128df1bfde4SAndrew Rybchenko 129df1bfde4SAndrew Rybchenko int 130df1bfde4SAndrew Rybchenko sfc_kvarg_string_handler(__rte_unused const char *key, 131df1bfde4SAndrew Rybchenko const char *value_str, void *opaque) 132df1bfde4SAndrew Rybchenko { 133df1bfde4SAndrew Rybchenko *(const char **)opaque = value_str; 134df1bfde4SAndrew Rybchenko 135df1bfde4SAndrew Rybchenko return 0; 136df1bfde4SAndrew Rybchenko } 137