When parsing a devargs, try to parse using the global device syntax
first. Fallback on legacy syntax on error.

Example of new global device syntax:
 -a bus=pci,addr=82:00.0/class=eth/driver=mlx5,dv_flow_en=1

Signed-off-by: Xueming Li <xuemi...@nvidia.com>
Reviewed-by: Gaetan Rivet <gr...@u256.net>
---
 doc/guides/rel_notes/release_21_05.rst     |  6 ++++++
 lib/librte_eal/common/eal_common_devargs.c | 16 ++++++++++++----
 lib/librte_eal/include/rte_devargs.h       |  4 ++++
 lib/librte_ethdev/rte_ethdev.c             |  1 -
 4 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst 
b/doc/guides/rel_notes/release_21_05.rst
index 374d6d98ea..ff1459a4d1 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -131,6 +131,12 @@ New Features
   * Added command to display Rx queue used descriptor count.
     ``show port (port_id) rxq (queue_id) desc used count``
 
+* **Enabled new devargs parser.**
+
+  * Unified devargs storage buffer usage.
+  * Added new bus driver api to allow bus driver contribute to devargs parsing.
+  * Try new devargs syntax parser first, fallback to legacy syntax parser.
+
 
 Removed Items
 -------------
diff --git a/lib/librte_eal/common/eal_common_devargs.c 
b/lib/librte_eal/common/eal_common_devargs.c
index 3a62521e05..069d8f8499 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -125,7 +125,6 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
                layers[i].str = s;
                layers[i].kvlist = rte_kvargs_parse_delim(s, NULL, "/");
                if (layers[i].kvlist == NULL) {
-                       RTE_LOG(ERR, EAL, "Could not parse %s\n", s);
                        ret = -EINVAL;
                        goto get_out;
                }
@@ -143,7 +142,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
                kv = &layers[i].kvlist->pairs[0];
                if (kv->key == NULL)
                        continue;
-               if (strcmp(kv->key, "bus") == 0) {
+               if (strcmp(kv->key, RTE_DEVARGS_KEY_BUS) == 0) {
                        bus = rte_bus_find_by_name(kv->value);
                        if (bus == NULL) {
                                RTE_LOG(ERR, EAL, "Could not find bus \"%s\"\n",
@@ -151,7 +150,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
                                ret = -EFAULT;
                                goto get_out;
                        }
-               } else if (strcmp(kv->key, "class") == 0) {
+               } else if (strcmp(kv->key, RTE_DEVARGS_KEY_CLASS) == 0) {
                        cls = rte_class_find_by_name(kv->value);
                        if (cls == NULL) {
                                RTE_LOG(ERR, EAL, "Could not find class 
\"%s\"\n",
@@ -159,7 +158,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
                                ret = -EFAULT;
                                goto get_out;
                        }
-               } else if (strcmp(kv->key, "driver") == 0) {
+               } else if (strcmp(kv->key, RTE_DEVARGS_KEY_DRIVER) == 0) {
                        /* Ignore */
                        continue;
                }
@@ -224,6 +223,15 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev)
        if (da == NULL)
                return -EINVAL;
 
+       /* First parse according global device syntax. */
+       if (rte_devargs_layers_parse(da, dev) == 0) {
+               if (da->bus != NULL || da->cls != NULL)
+                       return 0;
+               rte_devargs_reset(da);
+       }
+
+       /* Otherwise fallback to legacy syntax: */
+
        /* Retrieve eventual bus info */
        do {
                devname = dev;
diff --git a/lib/librte_eal/include/rte_devargs.h 
b/lib/librte_eal/include/rte_devargs.h
index 134b44a887..39e34ea02e 100644
--- a/lib/librte_eal/include/rte_devargs.h
+++ b/lib/librte_eal/include/rte_devargs.h
@@ -25,6 +25,10 @@ extern "C" {
 #include <rte_compat.h>
 #include <rte_bus.h>
 
+#define RTE_DEVARGS_KEY_BUS "bus"
+#define RTE_DEVARGS_KEY_CLASS "class"
+#define RTE_DEVARGS_KEY_DRIVER "driver"
+
 /**
  * Type of generic device
  */
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index e11a95558f..9e9b136438 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -207,7 +207,6 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const 
char *devargs_str)
         *   - 0000:08:00.0,representor=[1-3]
         *   - pci:0000:06:00.0,representor=[0,5]
         *   - class=eth,mac=00:11:22:33:44:55
-        * A new syntax is in development (not yet supported):
         *   - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z
         */
 
-- 
2.25.1

Reply via email to