avf: improve capabilities handling 95/31795/7
authorDamjan Marion <damarion@cisco.com>
Mon, 29 Mar 2021 16:22:22 +0000 (18:22 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 31 Mar 2021 15:10:12 +0000 (15:10 +0000)
Type: improvement
Change-Id: If35b40168414807e928cb3026633ae9d2fa703ed
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/plugins/avf/avf.h
src/plugins/avf/device.c
src/plugins/avf/flow.c
src/plugins/avf/format.c
src/plugins/avf/virtchnl.h

index 51a81c6..2ca3143 100644 (file)
@@ -236,7 +236,7 @@ typedef struct
   virtchnl_pf_event_t *events;
 
   u16 vsi_id;
-  u32 feature_bitmap;
+  u32 cap_flags;
   u8 hwaddr[6];
   u16 num_queue_pairs;
   u16 max_vectors;
@@ -348,6 +348,7 @@ clib_error_t *avf_program_flow (u32 dev_instance, int is_add, u8 *rule,
 format_function_t format_avf_device;
 format_function_t format_avf_device_name;
 format_function_t format_avf_input_trace;
+format_function_t format_avf_vf_cap_flags;
 vnet_flow_dev_ops_function_t avf_flow_ops_fn;
 
 static_always_inline avf_device_t *
index 4418dfd..78a211f 100644 (file)
@@ -466,11 +466,10 @@ retry:
 
   if (d->v_opcode != op)
     {
-      err =
-       clib_error_return (0,
-                          "unexpected message receiver [v_opcode = %u, "
-                          "expected %u, v_retval %d]", d->v_opcode, op,
-                          d->v_retval);
+      err = clib_error_return (0,
+                              "unexpected message received [v_opcode = %u, "
+                              "expected %u, v_retval %d]",
+                              d->v_opcode, op, d->v_retval);
       goto done;
     }
 
@@ -556,29 +555,29 @@ avf_op_get_vf_resources (vlib_main_t * vm, avf_device_t * ad,
      VIRTCHNL_VF_OFFLOAD_RX_POLLING | VIRTCHNL_VF_CAP_ADV_LINK_SPEED |
      VIRTCHNL_VF_OFFLOAD_FDIR_PF | VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF);
 
-  avf_log_debug (ad, "get_vf_reqources: bitmap 0x%x", bitmap);
+  avf_log_debug (ad, "get_vf_resources: bitmap 0x%x (%U)", bitmap,
+                format_avf_vf_cap_flags, bitmap);
   err = avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_VF_RESOURCES, &bitmap,
                        sizeof (u32), res, sizeof (virtchnl_vf_resource_t));
 
   if (err == 0)
     {
       int i;
-      avf_log_debug (ad, "get_vf_reqources: num_vsis %u num_queue_pairs %u "
-                    "max_vectors %u max_mtu %u vf_offload_flags 0x%04x "
+      avf_log_debug (ad,
+                    "get_vf_resources: num_vsis %u num_queue_pairs %u "
+                    "max_vectors %u max_mtu %u vf_cap_flags 0x%x (%U) "
                     "rss_key_size %u rss_lut_size %u",
                     res->num_vsis, res->num_queue_pairs, res->max_vectors,
-                    res->max_mtu, res->vf_offload_flags, res->rss_key_size,
-                    res->rss_lut_size);
+                    res->max_mtu, res->vf_cap_flags, format_avf_vf_cap_flags,
+                    res->vf_cap_flags, res->rss_key_size, res->rss_lut_size);
       for (i = 0; i < res->num_vsis; i++)
-       avf_log_debug (ad, "get_vf_reqources_vsi[%u]: vsi_id %u "
-                      "num_queue_pairs %u vsi_type %u qset_handle %u "
-                      "default_mac_addr %U", i,
-                      res->vsi_res[i].vsi_id,
-                      res->vsi_res[i].num_queue_pairs,
-                      res->vsi_res[i].vsi_type,
-                      res->vsi_res[i].qset_handle,
-                      format_ethernet_address,
-                      res->vsi_res[i].default_mac_addr);
+       avf_log_debug (
+         ad,
+         "get_vf_resources_vsi[%u]: vsi_id %u num_queue_pairs %u vsi_type %u "
+         "qset_handle %u default_mac_addr %U",
+         i, res->vsi_res[i].vsi_id, res->vsi_res[i].num_queue_pairs,
+         res->vsi_res[i].vsi_type, res->vsi_res[i].qset_handle,
+         format_ethernet_address, res->vsi_res[i].default_mac_addr);
     }
 
   return err;
@@ -948,13 +947,13 @@ avf_device_init (vlib_main_t * vm, avf_main_t * am, avf_device_t * ad,
     return clib_error_return (0, "unexpected GET_VF_RESOURCE reply received");
 
   ad->vsi_id = res.vsi_res[0].vsi_id;
-  ad->feature_bitmap = res.vf_offload_flags;
+  ad->cap_flags = res.vf_cap_flags;
   ad->num_queue_pairs = res.num_queue_pairs;
   ad->max_vectors = res.max_vectors;
   ad->max_mtu = res.max_mtu;
   ad->rss_key_size = res.rss_key_size;
   ad->rss_lut_size = res.rss_lut_size;
-  wb_on_itr = (ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) != 0;
+  wb_on_itr = (ad->cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) != 0;
 
   clib_memcpy_fast (ad->hwaddr, res.vsi_res[0].default_mac_addr, 6);
 
@@ -994,12 +993,11 @@ avf_device_init (vlib_main_t * vm, avf_main_t * am, avf_device_t * ad,
   else
     ad->n_rx_irqs = 1;
 
-
-  if ((ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
+  if ((ad->cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
       (error = avf_op_config_rss_lut (vm, ad)))
     return error;
 
-  if ((ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
+  if ((ad->cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
       (error = avf_op_config_rss_key (vm, ad)))
     return error;
 
@@ -1077,12 +1075,12 @@ avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq)
          u32 flags = 0;
          u32 mbps = 0;
 
-         if (ad->feature_bitmap & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
+         if (ad->cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
            link_up = e->event_data.link_event_adv.link_status;
          else
            link_up = e->event_data.link_event.link_status;
 
-         if (ad->feature_bitmap & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
+         if (ad->cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
            mbps = e->event_data.link_event_adv.link_speed;
          if (speed == VIRTCHNL_LINK_SPEED_40GB)
            mbps = 40000;
@@ -1740,7 +1738,7 @@ avf_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid,
     {
       if (rxq->int_mode == 0)
        return 0;
-      if (ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR)
+      if (ad->cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR)
        avf_irq_n_set_state (ad, qid, AVF_IRQ_STATE_WB_ON_ITR);
       else
        avf_irq_n_set_state (ad, qid, AVF_IRQ_STATE_ENABLED);
index 64eeea0..7a80da6 100644 (file)
@@ -468,7 +468,7 @@ avf_flow_ops_fn (vnet_main_t *vm, vnet_flow_dev_op_t op, u32 dev_instance,
   avf_flow_lookup_entry_t *fle = NULL;
   int rv = 0;
 
-  if ((ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_FDIR_PF) == 0)
+  if ((ad->cap_flags & VIRTCHNL_VF_OFFLOAD_FDIR_PF) == 0)
     {
       rv = VNET_FLOW_ERROR_NOT_SUPPORTED;
       goto done;
index 9bdf4a5..5dbfae2 100644 (file)
@@ -57,14 +57,26 @@ u8 *
 format_avf_vf_cap_flags (u8 * s, va_list * args)
 {
   u32 flags = va_arg (*args, u32);
-  u8 *t = 0;
+  int not_first = 0;
 
-#define _(a, b, c) if (flags & (1 << a)) \
-  t = format (t, "%s%s", t ? " ":"", c);
-  foreach_avf_vf_cap_flag;
+  char *strs[32] = {
+#define _(a, b, c) [a] = c,
+    foreach_avf_vf_cap_flag
 #undef _
-  s = format (s, "%v", t);
-  vec_free (t);
+  };
+
+  for (int i = 0; i < 32; i++)
+    {
+      if ((flags & (1 << i)) == 0)
+       continue;
+      if (not_first)
+       s = format (s, " ");
+      if (strs[i])
+       s = format (s, "%s", strs[i]);
+      else
+       s = format (s, "unknown(%u)", i);
+      not_first = 1;
+    }
   return s;
 }
 
@@ -100,8 +112,8 @@ format_avf_device (u8 * s, va_list * args)
              AVF_QUEUE_SZ_MIN, AVF_QUEUE_SZ_MAX);
   s = format (s, "\n%Uflags: %U", format_white_space, indent,
              format_avf_device_flags, ad);
-  s = format (s, "\n%Uoffload features: %U", format_white_space, indent,
-             format_avf_vf_cap_flags, ad->feature_bitmap);
+  s = format (s, "\n%Ucapability flags: %U", format_white_space, indent,
+             format_avf_vf_cap_flags, ad->cap_flags);
 
   s = format (s, "\n%Unum-queue-pairs %d max-vectors %u max-mtu %u "
              "rss-key-size %u rss-lut-size %u", format_white_space, indent,
index 48ecab0..01c8510 100644 (file)
@@ -130,6 +130,8 @@ typedef enum
   _ (5, OFFLOAD_WB_ON_ITR, "wb-on-itr")                                       \
   _ (6, OFFLOAD_REQ_QUEUES, "req-queues")                                     \
   _ (7, CAP_ADV_LINK_SPEED, "adv-link-speed")                                 \
+  _ (9, LARGE_NUM_QPAIRS, "large-num-qpairs")                                 \
+  _ (15, OFFLOAD_VLAN_V2, "vlan-v2")                                          \
   _ (16, OFFLOAD_VLAN, "vlan")                                                \
   _ (17, OFFLOAD_RX_POLLING, "rx-polling")                                    \
   _ (18, OFFLOAD_RSS_PCTYPE_V2, "rss-pctype-v2")                              \
@@ -138,8 +140,12 @@ typedef enum
   _ (21, OFFLOAD_ENCAP_CSUM, "encap-csum")                                    \
   _ (22, OFFLOAD_RX_ENCAP_CSUM, "rx-encap-csum")                              \
   _ (23, OFFLOAD_ADQ, "offload-adq")                                          \
+  _ (24, OFFLOAD_ADQ_v2, "offload-adq-v2")                                    \
+  _ (25, OFFLOAD_USO, "offload-uso")                                          \
+  _ (26, OFFLOAD_RX_FLEX_DESC, "offload-rx-flex-desc")                        \
   _ (27, OFFLOAD_ADV_RSS_PF, "offload-adv-rss-pf")                            \
-  _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf")
+  _ (28, OFFLOAD_FDIR_PF, "offload-fdir-pf")                                  \
+  _ (30, CAP_DCF, "dcf")
 
 typedef enum
 {
@@ -176,7 +182,7 @@ typedef struct
   u16 num_queue_pairs;
   u16 max_vectors;
   u16 max_mtu;
-  u32 vf_offload_flags;
+  u32 vf_cap_flags;
   u32 rss_key_size;
   u32 rss_lut_size;
   virtchnl_vsi_resource_t vsi_res[1];