dpdk: add devargs support 89/23989/2
authorChenmin Sun <chenmin.sun@intel.com>
Fri, 13 Dec 2019 22:59:03 +0000 (06:59 +0800)
committerDamjan Marion <dmarion@me.com>
Tue, 17 Dec 2019 17:55:34 +0000 (17:55 +0000)
Type: feature

This patch adds the devargs support for dpdk device
The devargs are used as hardware-specific init args for dpdk devices
please refer to the nic guides under
$(DPDK_DIR)/doc/guides/nics/$(NIC_DRIVER).rst

Signed-off-by: Chenmin Sun <chenmin.sun@intel.com>
Change-Id: Id380d04720090bb66afe5ce09d664e5e248b8eb9

src/plugins/dpdk/device/dpdk.h
src/plugins/dpdk/device/format.c
src/plugins/dpdk/device/init.c
src/vpp/conf/startup.conf

index d58d2da..ab28ac0 100644 (file)
@@ -336,6 +336,8 @@ typedef struct
   u32 hqos_enabled;
   dpdk_device_config_hqos_t hqos;
   u8 tso;
+  u8 *devargs;
+
 #define DPDK_DEVICE_TSO_DEFAULT 0
 #define DPDK_DEVICE_TSO_OFF 1
 #define DPDK_DEVICE_TSO_ON  2
index 292c083..20493eb 100644 (file)
@@ -564,6 +564,9 @@ format_dpdk_device (u8 * s, va_list * args)
              format_white_space, indent + 2, format_dpdk_link_status, xd);
   s = format (s, "%Uflags: %U\n",
              format_white_space, indent + 2, format_dpdk_device_flags, xd);
+  if (di.device->devargs && di.device->devargs->args)
+    s = format (s, "%UDevargs: %s\n",
+               format_white_space, indent + 2, di.device->devargs->args);
   s = format (s, "%Urx: queues %d (max %d), desc %d "
              "(min %d max %d align %d)\n",
              format_white_space, indent + 2, xd->rx_q_used, di.max_rx_queues,
index 5a6262c..d0125e9 100644 (file)
@@ -1118,6 +1118,8 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
        {
          devconf->tso = DPDK_DEVICE_TSO_OFF;
        }
+      else if (unformat (input, "devargs %s", &devconf->devargs))
+       ;
       else
        {
          error = clib_error_return (0, "unknown input `%U'",
@@ -1428,21 +1430,31 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
        /* copy tso config from default device */
        _(tso)
 
+       /* copy tso config from default device */
+       _(devargs)
+
     /* add DPDK EAL whitelist/blacklist entry */
     if (num_whitelisted > 0 && devconf->is_blacklisted == 0)
-      {
-       tmp = format (0, "-w%c", 0);
-       vec_add1 (conf->eal_init_args, tmp);
-       tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
-       vec_add1 (conf->eal_init_args, tmp);
-      }
+    {
+         tmp = format (0, "-w%c", 0);
+         vec_add1 (conf->eal_init_args, tmp);
+         if (devconf->devargs)
+         {
+           tmp = format (0, "%U,%s", format_vlib_pci_addr, &devconf->pci_addr, devconf->devargs, 0);
+         }
+         else
+         {
+           tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
+         }
+         vec_add1 (conf->eal_init_args, tmp);
+    }
     else if (num_whitelisted == 0 && devconf->is_blacklisted != 0)
-      {
-       tmp = format (0, "-b%c", 0);
-       vec_add1 (conf->eal_init_args, tmp);
-       tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
-       vec_add1 (conf->eal_init_args, tmp);
-      }
+    {
+         tmp = format (0, "-b%c", 0);
+         vec_add1 (conf->eal_init_args, tmp);
+         tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
+         vec_add1 (conf->eal_init_args, tmp);
+    }
   }));
   /* *INDENT-ON* */
 
index 3d83a13..b0d0c86 100644 (file)
@@ -105,6 +105,11 @@ cpu {
                ## Default is off
                ## To enable TSO, 'enable-tcp-udp-checksum' must be set
                # tso on
+
+               ## Devargs
+                ## device specific init args
+                ## Default is NULL
+               # devargs safe-mode-support=1,pipeline-mode-support=1
        # }
 
        ## Whitelist specific interface by specifying PCI address