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