xref: /dpdk/drivers/bus/auxiliary/auxiliary_params.c (revision 1acb7f547455f636a6968cb3b4ca3870279dfece)
11afce308SXueming Li /* SPDX-License-Identifier: BSD-3-Clause
21afce308SXueming Li  * Copyright (c) 2021 NVIDIA Corporation & Affiliates
31afce308SXueming Li  */
41afce308SXueming Li 
51afce308SXueming Li #include <string.h>
61afce308SXueming Li 
7a04322f6SDavid Marchand #include <bus_driver.h>
8*1acb7f54SDavid Marchand #include <dev_driver.h>
91afce308SXueming Li #include <rte_errno.h>
101afce308SXueming Li #include <rte_kvargs.h>
111afce308SXueming Li 
121afce308SXueming Li #include "private.h"
131afce308SXueming Li 
141afce308SXueming Li enum auxiliary_params {
151afce308SXueming Li 	RTE_AUXILIARY_PARAM_NAME,
161afce308SXueming Li };
171afce308SXueming Li 
181afce308SXueming Li static const char * const auxiliary_params_keys[] = {
191afce308SXueming Li 	[RTE_AUXILIARY_PARAM_NAME] = "name",
208d5774d0SDavid Marchand 	NULL,
211afce308SXueming Li };
221afce308SXueming Li 
231afce308SXueming Li static int
auxiliary_dev_match(const struct rte_device * dev,const void * _kvlist)241afce308SXueming Li auxiliary_dev_match(const struct rte_device *dev,
251afce308SXueming Li 	      const void *_kvlist)
261afce308SXueming Li {
271afce308SXueming Li 	const struct rte_kvargs *kvlist = _kvlist;
286aebb942SOlivier Matz 	const char *key = auxiliary_params_keys[RTE_AUXILIARY_PARAM_NAME];
29926629e3SXueming Li 	const char *name;
301afce308SXueming Li 
31926629e3SXueming Li 	/* no kvlist arg, all devices match */
32926629e3SXueming Li 	if (kvlist == NULL)
33926629e3SXueming Li 		return 0;
34926629e3SXueming Li 
35926629e3SXueming Li 	/* if key is present in kvlist and does not match, filter device */
36926629e3SXueming Li 	name = rte_kvargs_get(kvlist, key);
37926629e3SXueming Li 	if (name != NULL && strcmp(name, dev->name))
386aebb942SOlivier Matz 		return -1;
391afce308SXueming Li 
406aebb942SOlivier Matz 	return 0;
411afce308SXueming Li }
421afce308SXueming Li 
431afce308SXueming Li void *
auxiliary_dev_iterate(const void * start,const char * str,const struct rte_dev_iterator * it __rte_unused)441afce308SXueming Li auxiliary_dev_iterate(const void *start,
451afce308SXueming Li 		    const char *str,
461afce308SXueming Li 		    const struct rte_dev_iterator *it __rte_unused)
471afce308SXueming Li {
481afce308SXueming Li 	rte_bus_find_device_t find_device;
491afce308SXueming Li 	struct rte_kvargs *kvargs = NULL;
501afce308SXueming Li 	struct rte_device *dev;
511afce308SXueming Li 
521afce308SXueming Li 	if (str != NULL) {
531afce308SXueming Li 		kvargs = rte_kvargs_parse(str, auxiliary_params_keys);
541afce308SXueming Li 		if (kvargs == NULL) {
551afce308SXueming Li 			AUXILIARY_LOG(ERR, "cannot parse argument list %s",
561afce308SXueming Li 				      str);
571afce308SXueming Li 			rte_errno = EINVAL;
581afce308SXueming Li 			return NULL;
591afce308SXueming Li 		}
601afce308SXueming Li 	}
611afce308SXueming Li 	find_device = auxiliary_bus.bus.find_device;
621afce308SXueming Li 	dev = find_device(start, auxiliary_dev_match, kvargs);
631afce308SXueming Li 	rte_kvargs_free(kvargs);
641afce308SXueming Li 	return dev;
651afce308SXueming Li }
66