devargs: add non-variadic parsing function
rte_devargs_parse becomes non-variadic, rte_devargs_parsef becomes the variadic version, to be used to compose device strings. Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com> Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com> Acked-by: Thomas Monjalon <thomas@monjalon.net>
This commit is contained in:
parent
0436120e33
commit
a23bc2c4e0
@ -63,7 +63,7 @@ fs_parse_device(struct sub_device *sdev, char *args)
|
||||
|
||||
d = &sdev->devargs;
|
||||
DEBUG("%s", args);
|
||||
ret = rte_devargs_parse(d, "%s", args);
|
||||
ret = rte_devargs_parse(d, args);
|
||||
if (ret) {
|
||||
DEBUG("devargs parsing failed with code %d", ret);
|
||||
return ret;
|
||||
|
@ -86,7 +86,7 @@ fs_bus_init(struct rte_eth_dev *dev)
|
||||
else
|
||||
snprintf(devstr, sizeof(devstr), "%s",
|
||||
rte_eth_devices[pid].device->name);
|
||||
ret = rte_devargs_parse(da, "%s", devstr);
|
||||
ret = rte_devargs_parse(da, devstr);
|
||||
if (ret) {
|
||||
ERROR("Probed devargs parsing failed with code"
|
||||
" %d", ret);
|
||||
|
@ -138,8 +138,8 @@ int __rte_experimental rte_eal_hotplug_add(const char *busname, const char *devn
|
||||
if (da == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = rte_devargs_parse(da, "%s:%s,%s",
|
||||
busname, devname, devargs);
|
||||
ret = rte_devargs_parsef(da, "%s:%s,%s",
|
||||
busname, devname, devargs);
|
||||
if (ret)
|
||||
goto err_devarg;
|
||||
|
||||
|
@ -63,24 +63,18 @@ bus_name_cmp(const struct rte_bus *bus, const void *name)
|
||||
return strncmp(bus->name, name, strlen(bus->name));
|
||||
}
|
||||
|
||||
int __rte_experimental
|
||||
rte_devargs_parse(struct rte_devargs *da, const char *format, ...)
|
||||
__rte_experimental
|
||||
int
|
||||
rte_devargs_parse(struct rte_devargs *da, const char *dev)
|
||||
{
|
||||
struct rte_bus *bus = NULL;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
char dev[vsnprintf(NULL, 0, format, ap) + 1];
|
||||
const char *devname;
|
||||
const size_t maxlen = sizeof(da->name);
|
||||
size_t i;
|
||||
|
||||
va_end(ap);
|
||||
if (da == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
va_start(ap, format);
|
||||
vsnprintf(dev, sizeof(dev), format, ap);
|
||||
va_end(ap);
|
||||
/* Retrieve eventual bus info */
|
||||
do {
|
||||
devname = dev;
|
||||
@ -125,6 +119,34 @@ rte_devargs_parse(struct rte_devargs *da, const char *format, ...)
|
||||
return 0;
|
||||
}
|
||||
|
||||
__rte_experimental
|
||||
int
|
||||
rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t len;
|
||||
char *dev;
|
||||
|
||||
if (da == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
va_start(ap, format);
|
||||
len = vsnprintf(NULL, 0, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
dev = calloc(1, len + 1);
|
||||
if (dev == NULL) {
|
||||
RTE_LOG(ERR, EAL, "not enough memory to parse device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
va_start(ap, format);
|
||||
vsnprintf(dev, len, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return rte_devargs_parse(da, dev);
|
||||
}
|
||||
|
||||
int __rte_experimental
|
||||
rte_devargs_insert(struct rte_devargs *da)
|
||||
{
|
||||
@ -151,7 +173,7 @@ rte_devargs_add(enum rte_devtype devtype, const char *devargs_str)
|
||||
if (devargs == NULL)
|
||||
goto fail;
|
||||
|
||||
if (rte_devargs_parse(devargs, "%s", dev))
|
||||
if (rte_devargs_parse(devargs, dev))
|
||||
goto fail;
|
||||
devargs->type = devtype;
|
||||
bus = devargs->bus;
|
||||
|
@ -89,6 +89,42 @@ __rte_deprecated
|
||||
int rte_eal_parse_devargs_str(const char *devargs_str,
|
||||
char **drvname, char **drvargs);
|
||||
|
||||
/**
|
||||
* Parse a device string.
|
||||
*
|
||||
* Verify that a bus is capable of handling the device passed
|
||||
* in argument. Store which bus will handle the device, its name
|
||||
* and the eventual device parameters.
|
||||
*
|
||||
* The syntax is:
|
||||
*
|
||||
* bus:device_identifier,arg1=val1,arg2=val2
|
||||
*
|
||||
* where "bus:" is the bus name followed by any character separator.
|
||||
* The bus name is optional. If no bus name is specified, each bus
|
||||
* will attempt to recognize the device identifier. The first one
|
||||
* to succeed will be used.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* pci:0000:05.00.0,arg=val
|
||||
* 05.00.0,arg=val
|
||||
* vdev:net_ring0
|
||||
*
|
||||
* @param da
|
||||
* The devargs structure holding the device information.
|
||||
*
|
||||
* @param dev
|
||||
* String describing a device.
|
||||
*
|
||||
* @return
|
||||
* - 0 on success.
|
||||
* - Negative errno on error.
|
||||
*/
|
||||
__rte_experimental
|
||||
int
|
||||
rte_devargs_parse(struct rte_devargs *da, const char *dev);
|
||||
|
||||
/**
|
||||
* Parse a device string.
|
||||
*
|
||||
@ -124,8 +160,8 @@ int rte_eal_parse_devargs_str(const char *devargs_str,
|
||||
*/
|
||||
__rte_experimental
|
||||
int
|
||||
rte_devargs_parse(struct rte_devargs *da,
|
||||
const char *format, ...)
|
||||
rte_devargs_parsef(struct rte_devargs *da,
|
||||
const char *format, ...)
|
||||
__attribute__((format(printf, 2, 0)));
|
||||
|
||||
/**
|
||||
|
@ -264,6 +264,7 @@ EXPERIMENTAL {
|
||||
rte_devargs_insert;
|
||||
rte_devargs_next;
|
||||
rte_devargs_parse;
|
||||
rte_devargs_parsef;
|
||||
rte_devargs_remove;
|
||||
rte_devargs_type_count;
|
||||
rte_eal_cleanup;
|
||||
|
@ -658,7 +658,7 @@ rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
|
||||
}
|
||||
|
||||
/* parse devargs */
|
||||
if (rte_devargs_parse(&da, "%s", devargs))
|
||||
if (rte_devargs_parse(&da, devargs))
|
||||
goto err;
|
||||
|
||||
ret = rte_eal_hotplug_add(da.bus->name, da.name, da.args);
|
||||
|
Loading…
x
Reference in New Issue
Block a user