xref: /dpdk/drivers/net/sfc/sfc_kvargs.c (revision f33e8c0e4a80c1456987f96c1ce448d65e7d6dfb)
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