misc: deprecate dpdk hqos
[vpp.git] / src / plugins / dpdk / device / init.c
index d15f5bf..5d0e5a2 100644 (file)
@@ -158,7 +158,7 @@ dpdk_port_crc_strip_enabled (dpdk_device_t * xd)
   return !(xd->port_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC);
 }
 
-/* The funciton check_l3cache helps check if Level 3 cache exists or not on current CPUs
+/* The function check_l3cache helps check if Level 3 cache exists or not on current CPUs
   return value 1: exist.
   return value 0: not exist.
 */
@@ -181,7 +181,7 @@ check_l3cache ()
          u8 *p = NULL;
          int level_cache = -1;
 
-         p = format (p, "%s/%s/%s", sys_cache_dir, dp->d_name, "level");
+         p = format (p, "%s/%s/%s%c", sys_cache_dir, dp->d_name, "level", 0);
          if ((err = clib_sysfs_read ((char *) p, "%d", &level_cache)))
            clib_error_free (err);
 
@@ -214,34 +214,14 @@ dpdk_lib_init (dpdk_main_t * dm)
   dpdk_device_t *xd;
   vlib_pci_addr_t last_pci_addr;
   u32 last_pci_addr_port = 0;
-  vlib_thread_registration_t *tr_hqos;
-  uword *p_hqos;
-
-  u32 next_hqos_cpu = 0;
   u8 af_packet_instance_num = 0;
   last_pci_addr.as_u32 = ~0;
 
-  dm->hqos_cpu_first_index = 0;
-  dm->hqos_cpu_count = 0;
-
-  /* find out which cpus will be used for I/O TX */
-  p_hqos = hash_get_mem (tm->thread_registrations_by_name, "hqos-threads");
-  tr_hqos = p_hqos ? (vlib_thread_registration_t *) p_hqos[0] : 0;
-
-  if (tr_hqos && tr_hqos->count > 0)
-    {
-      dm->hqos_cpu_first_index = tr_hqos->first_index;
-      dm->hqos_cpu_count = tr_hqos->count;
-    }
-
-  vec_validate_aligned (dm->devices_by_hqos_cpu, tm->n_vlib_mains - 1,
-                       CLIB_CACHE_LINE_BYTES);
-
   nports = rte_eth_dev_count_avail ();
 
   if (nports < 1)
     {
-      dpdk_log_notice ("DPDK drivers found no ports...");
+      dpdk_log_notice ("DPDK drivers found no Ethernet devices...");
     }
 
   if (CLIB_DEBUG > 0)
@@ -266,7 +246,7 @@ dpdk_lib_init (dpdk_main_t * dm)
   RTE_ETH_FOREACH_DEV(i)
     {
       u8 addr[6];
-      u8 vlan_strip = 0;
+      int vlan_off;
       struct rte_eth_dev_info dev_info;
       struct rte_pci_device *pci_dev;
       struct rte_eth_link l;
@@ -283,7 +263,7 @@ dpdk_lib_init (dpdk_main_t * dm)
 
       if (dev_info.device == 0)
        {
-         clib_warning ("DPDK bug: missing device info. Skipping %s device",
+         dpdk_log_notice ("DPDK bug: missing device info. Skipping %s device",
                        dev_info.driver_name);
          continue;
        }
@@ -454,6 +434,7 @@ dpdk_lib_init (dpdk_main_t * dm)
            case VNET_DPDK_PMD_MLX4:
            case VNET_DPDK_PMD_MLX5:
            case VNET_DPDK_PMD_QEDE:
+           case VNET_DPDK_PMD_BNXT:
              xd->port_type = port_type_from_speed_capa (&dev_info);
              break;
 
@@ -462,6 +443,14 @@ dpdk_lib_init (dpdk_main_t * dm)
            case VNET_DPDK_PMD_IXGBEVF:
            case VNET_DPDK_PMD_I40EVF:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
+             if (dm->conf->no_tx_checksum_offload == 0)
+               {
+                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+                 xd->flags |=
+                   DPDK_DEVICE_FLAG_TX_OFFLOAD |
+                   DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
+               }
              break;
 
            case VNET_DPDK_PMD_THUNDERX:
@@ -575,7 +564,7 @@ dpdk_lib_init (dpdk_main_t * dm)
          addr[1] = 0xfe;
        }
       else
-       rte_eth_macaddr_get (i, (struct ether_addr *) addr);
+       rte_eth_macaddr_get (i, (void *) addr);
 
       if (xd->tx_q_used < tm->n_vlib_mains)
        dpdk_device_lock_init (xd);
@@ -587,38 +576,6 @@ dpdk_lib_init (dpdk_main_t * dm)
       /* assign interface to input thread */
       int q;
 
-      if (devconf->hqos_enabled)
-       {
-         xd->flags |= DPDK_DEVICE_FLAG_HQOS;
-
-         int cpu;
-         if (devconf->hqos.hqos_thread_valid)
-           {
-             if (devconf->hqos.hqos_thread >= dm->hqos_cpu_count)
-               return clib_error_return (0, "invalid HQoS thread index");
-
-             cpu = dm->hqos_cpu_first_index + devconf->hqos.hqos_thread;
-           }
-         else
-           {
-             if (dm->hqos_cpu_count == 0)
-               return clib_error_return (0, "no HQoS threads available");
-
-             cpu = dm->hqos_cpu_first_index + next_hqos_cpu;
-
-             next_hqos_cpu++;
-             if (next_hqos_cpu == dm->hqos_cpu_count)
-               next_hqos_cpu = 0;
-
-             devconf->hqos.hqos_thread_valid = 1;
-             devconf->hqos.hqos_thread = cpu;
-           }
-
-         dpdk_device_and_queue_t *dq;
-         vec_add2 (dm->devices_by_hqos_cpu[cpu], dq, 1);
-         dq->device = xd->device_index;
-         dq->queue_id = 0;
-       }
 
       error = ethernet_register_interface
        (dm->vnet_main, dpdk_device_class.index, xd->device_index,
@@ -739,6 +696,21 @@ dpdk_lib_init (dpdk_main_t * dm)
        if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL)
          hi->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD;
 
+      if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL)
+       {
+         /*tcp_udp checksum must be enabled*/
+         if ((dm->conf->enable_tcp_udp_checksum) &&
+             (hi->flags & VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD))
+           {
+               hi->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO;
+               xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO |
+                 DEV_TX_OFFLOAD_UDP_TSO;
+           }
+         else
+           clib_warning ("%s: TCP/UDP checksum offload must be enabled",
+             hi->name);
+       }
+
       dpdk_device_setup (xd);
 
       if (vec_len (xd->errors))
@@ -746,14 +718,6 @@ dpdk_lib_init (dpdk_main_t * dm)
                      format_dpdk_device_name, i,
                      format_dpdk_device_errors, xd);
 
-      if (devconf->hqos_enabled)
-       {
-         clib_error_t *rv;
-         rv = dpdk_port_setup_hqos (xd, &devconf->hqos);
-         if (rv)
-           return rv;
-       }
-
       /*
        * A note on Cisco VIC (PMD_ENIC) and VLAN:
        *
@@ -778,29 +742,33 @@ dpdk_lib_init (dpdk_main_t * dm)
        * VLAN stripping: default to VLAN strip disabled, unless specified
        * otherwise in the startup config.
        */
-      if (devconf->vlan_strip_offload == DPDK_DEVICE_VLAN_STRIP_ON)
-       vlan_strip = 1;
 
-      if (vlan_strip)
+      vlan_off = rte_eth_dev_get_vlan_offload (xd->port_id);
+      if (devconf->vlan_strip_offload == DPDK_DEVICE_VLAN_STRIP_ON)
        {
-         int vlan_off;
-         vlan_off = rte_eth_dev_get_vlan_offload (xd->port_id);
          vlan_off |= ETH_VLAN_STRIP_OFFLOAD;
-          if (vlan_off)
-           xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
-         else
-           xd->port_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
-         if (rte_eth_dev_set_vlan_offload (xd->port_id, vlan_off) == 0)
+         if (rte_eth_dev_set_vlan_offload (xd->port_id, vlan_off) >= 0)
            dpdk_log_info ("VLAN strip enabled for interface\n");
          else
            dpdk_log_warn ("VLAN strip cannot be supported by interface\n");
+         xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+       }
+      else
+       {
+         if (vlan_off & ETH_VLAN_STRIP_OFFLOAD)
+           {
+             vlan_off &= ~ETH_VLAN_STRIP_OFFLOAD;
+             if (rte_eth_dev_set_vlan_offload (xd->port_id, vlan_off) >= 0)
+               dpdk_log_warn ("set VLAN offload failed\n");
+           }
+         xd->port_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
        }
 
       if (hi)
        hi->max_packet_bytes = xd->port_conf.rxmode.max_rx_pkt_len
          - sizeof (ethernet_header_t);
       else
-       clib_warning ("hi NULL");
+       dpdk_log_warn ("hi NULL");
 
       if (dm->conf->no_multi_seg)
        mtu = mtu > ETHER_MAX_LEN ? ETHER_MAX_LEN : mtu;
@@ -911,7 +879,8 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf)
       ;
     /* all Intel QAT devices VFs */
     else if (d->vendor_id == 0x8086 && d->device_class == PCI_CLASS_PROCESSOR_CO &&
-        (d->device_id == 0x0443 || d->device_id == 0x37c9 || d->device_id == 0x19e3))
+        (d->device_id == 0x0443 || d->device_id == 0x18a1 || d->device_id == 0x19e3 ||
+        d->device_id == 0x37c9 || d->device_id == 0x6f55))
       ;
     /* Cisco VIC */
     else if (d->vendor_id == 0x1137 &&
@@ -920,7 +889,7 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf)
     /* Chelsio T4/T5 */
     else if (d->vendor_id == 0x1425 && (d->device_id & 0xe000) == 0x4000)
       ;
-    /* Amazen Elastic Network Adapter */
+    /* Amazon Elastic Network Adapter */
     else if (d->vendor_id == 0x1d0f && d->device_id >= 0xec20 && d->device_id <= 0xec21)
       ;
     /* Cavium Network Adapter */
@@ -939,6 +908,19 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf)
       {
         continue;
       }
+    /* Broadcom NetXtreme S, and E series only */
+    else if (d->vendor_id == 0x14e4 &&
+       ((d->device_id >= 0x16c0 &&
+               d->device_id != 0x16c6 && d->device_id != 0x16c7 &&
+               d->device_id != 0x16dd && d->device_id != 0x16f7 &&
+               d->device_id != 0x16fd && d->device_id != 0x16fe &&
+               d->device_id != 0x170d && d->device_id != 0x170c &&
+               d->device_id != 0x170e && d->device_id != 0x1712 &&
+               d->device_id != 0x1713) ||
+       (d->device_id == 0x1604 || d->device_id == 0x1605 ||
+        d->device_id == 0x1614 || d->device_id == 0x1606 ||
+        d->device_id == 0x1609 || d->device_id == 0x1614)))
+      ;
     else
       {
         dpdk_log_warn ("Unsupported PCI device 0x%04x:0x%04x found "
@@ -1018,10 +1000,7 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
     }
 
   devconf->pci_addr.as_u32 = pci_addr.as_u32;
-  devconf->hqos_enabled = 0;
-#if 0
-  dpdk_device_config_hqos_default (&devconf->hqos);
-#endif
+  devconf->tso = DPDK_DEVICE_TSO_DEFAULT;
 
   if (!input)
     return 0;
@@ -1054,19 +1033,16 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
        devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_OFF;
       else if (unformat (input, "vlan-strip-offload on"))
        devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_ON;
-      else
-       if (unformat
-           (input, "hqos %U", unformat_vlib_cli_sub_input, &sub_input))
+      else if (unformat (input, "tso on"))
        {
-         devconf->hqos_enabled = 1;
-         error = unformat_hqos (&sub_input, &devconf->hqos);
-         if (error)
-           break;
+         devconf->tso = DPDK_DEVICE_TSO_ON;
        }
-      else if (unformat (input, "hqos"))
+      else if (unformat (input, "tso off"))
        {
-         devconf->hqos_enabled = 1;
+         devconf->tso = DPDK_DEVICE_TSO_OFF;
        }
+      else if (unformat (input, "devargs %s", &devconf->devargs))
+       ;
       else
        {
          error = clib_error_return (0, "unknown input `%U'",
@@ -1348,6 +1324,7 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
       vec_insert (conf->eal_init_args, 2, 3);
       conf->eal_init_args[3] = (u8 *) "-n";
       tmp = format (0, "%d", conf->nchannels);
+      vec_terminate_c_string (tmp);
       conf->eal_init_args[4] = tmp;
     }
 
@@ -1373,21 +1350,34 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
                devconf->vlan_strip_offload =
                        conf->default_devconf.vlan_strip_offload;
 
+       /* 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* */
 
@@ -1438,6 +1428,8 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
     conf->eal_init_args_str = format (conf->eal_init_args_str, "%s ",
                                      conf->eal_init_args[i]);
 
+  vec_terminate_c_string (conf->eal_init_args_str);
+
   dpdk_log_warn ("EAL init args: %s", conf->eal_init_args_str);
   ret = rte_eal_init (vec_len (conf->eal_init_args),
                      (char **) conf->eal_init_args);