1ac91bc49SGaetan Rivet /* SPDX-License-Identifier: BSD-3-Clause 2ac91bc49SGaetan Rivet * Copyright 2018 Gaëtan Rivet 3ac91bc49SGaetan Rivet */ 4ac91bc49SGaetan Rivet 572b452c5SDmitry Kozlyuk #include <errno.h> 62c29f879SThomas Monjalon #include <string.h> 72c29f879SThomas Monjalon 81acb7f54SDavid Marchand #include <dev_driver.h> 9ac91bc49SGaetan Rivet #include <rte_kvargs.h> 10ac91bc49SGaetan Rivet #include <rte_errno.h> 11ac91bc49SGaetan Rivet 12ac91bc49SGaetan Rivet #include "vdev_logs.h" 13ac91bc49SGaetan Rivet #include "vdev_private.h" 14ac91bc49SGaetan Rivet 15ac91bc49SGaetan Rivet enum vdev_params { 162c29f879SThomas Monjalon RTE_VDEV_PARAM_NAME, 173f7a40c6SThomas Monjalon RTE_VDEV_PARAM_MAX, 18ac91bc49SGaetan Rivet }; 19ac91bc49SGaetan Rivet 20ac91bc49SGaetan Rivet static const char * const vdev_params_keys[] = { 212c29f879SThomas Monjalon [RTE_VDEV_PARAM_NAME] = "name", 223f7a40c6SThomas Monjalon [RTE_VDEV_PARAM_MAX] = NULL, 23ac91bc49SGaetan Rivet }; 24ac91bc49SGaetan Rivet 25ac91bc49SGaetan Rivet static int 26ac91bc49SGaetan Rivet vdev_dev_match(const struct rte_device *dev, 27ac91bc49SGaetan Rivet const void *_kvlist) 28ac91bc49SGaetan Rivet { 29ac91bc49SGaetan Rivet const struct rte_kvargs *kvlist = _kvlist; 306aebb942SOlivier Matz const char *key = vdev_params_keys[RTE_VDEV_PARAM_NAME]; 31926629e3SXueming Li const char *name; 32ac91bc49SGaetan Rivet 33926629e3SXueming Li /* no kvlist arg, all devices match */ 34926629e3SXueming Li if (kvlist == NULL) 35926629e3SXueming Li return 0; 36926629e3SXueming Li 37926629e3SXueming Li /* if key is present in kvlist and does not match, filter device */ 38926629e3SXueming Li name = rte_kvargs_get(kvlist, key); 39926629e3SXueming Li if (name != NULL && strcmp(name, dev->name)) 402c29f879SThomas Monjalon return -1; 412c29f879SThomas Monjalon 42ac91bc49SGaetan Rivet return 0; 43ac91bc49SGaetan Rivet } 44ac91bc49SGaetan Rivet 45ac91bc49SGaetan Rivet void * 46ac91bc49SGaetan Rivet rte_vdev_dev_iterate(const void *start, 47ac91bc49SGaetan Rivet const char *str, 48ac91bc49SGaetan Rivet const struct rte_dev_iterator *it __rte_unused) 49ac91bc49SGaetan Rivet { 50ac91bc49SGaetan Rivet struct rte_kvargs *kvargs = NULL; 51ac91bc49SGaetan Rivet struct rte_device *dev; 52ac91bc49SGaetan Rivet 53ac91bc49SGaetan Rivet if (str != NULL) { 54ac91bc49SGaetan Rivet kvargs = rte_kvargs_parse(str, vdev_params_keys); 55ac91bc49SGaetan Rivet if (kvargs == NULL) { 56*f665790aSDavid Marchand VDEV_LOG(ERR, "cannot parse argument list"); 57ac91bc49SGaetan Rivet rte_errno = EINVAL; 58ac91bc49SGaetan Rivet return NULL; 59ac91bc49SGaetan Rivet } 60ac91bc49SGaetan Rivet } 61ac91bc49SGaetan Rivet dev = rte_vdev_find_device(start, vdev_dev_match, kvargs); 62ac91bc49SGaetan Rivet rte_kvargs_free(kvargs); 63ac91bc49SGaetan Rivet return dev; 64ac91bc49SGaetan Rivet } 65