net/mlx5: support flow dump API
[dpdk.git] / drivers / net / mlx5 / mlx5_devx_cmds.c
index d6e89b6..d6bf156 100644 (file)
@@ -340,6 +340,29 @@ mlx5_devx_cmd_query_hca_attr(struct ibv_context *ctx,
        attr->eth_virt = MLX5_GET(cmd_hca_cap, hcattr, eth_virt);
        attr->flex_parser_protocols = MLX5_GET(cmd_hca_cap, hcattr,
                                               flex_parser_protocols);
+       attr->qos.sup = MLX5_GET(cmd_hca_cap, hcattr, qos);
+       if (attr->qos.sup) {
+               MLX5_SET(query_hca_cap_in, in, op_mod,
+                        MLX5_GET_HCA_CAP_OP_MOD_QOS_CAP |
+                        MLX5_HCA_CAP_OPMOD_GET_CUR);
+               rc = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in),
+                                                out, sizeof(out));
+               if (rc)
+                       goto error;
+               if (status) {
+                       DRV_LOG(DEBUG, "Failed to query devx QOS capabilities,"
+                               " status %x, syndrome = %x",
+                               status, syndrome);
+                       return -1;
+               }
+               hcattr = MLX5_ADDR_OF(query_hca_cap_out, out, capability);
+               attr->qos.srtcm_sup =
+                               MLX5_GET(qos_cap, hcattr, flow_meter_srtcm);
+               attr->qos.log_max_flow_meter =
+                               MLX5_GET(qos_cap, hcattr, log_max_flow_meter);
+               attr->qos.flow_meter_reg_c_ids =
+                       MLX5_GET(qos_cap, hcattr, flow_meter_reg_id);
+       }
        if (!attr->eth_net_offloads)
                return 0;
 
@@ -904,3 +927,38 @@ mlx5_devx_cmd_create_td(struct ibv_context *ctx)
                           transport_domain);
        return td;
 }
+
+/**
+ * Dump all flows to file.
+ *
+ * @param[in] sh
+ *   Pointer to context.
+ * @param[out] file
+ *   Pointer to file stream.
+ *
+ * @return
+ *   0 on success, a nagative value otherwise.
+ */
+int
+mlx5_devx_cmd_flow_dump(struct mlx5_ibv_shared *sh __rte_unused,
+                       FILE *file __rte_unused)
+{
+       int ret = 0;
+
+#ifdef HAVE_MLX5_DR_FLOW_DUMP
+       if (sh->fdb_domain) {
+               ret = mlx5_glue->dr_dump_domain(file, sh->fdb_domain);
+               if (ret)
+                       return ret;
+       }
+       assert(sh->rx_domain);
+       ret = mlx5_glue->dr_dump_domain(file, sh->rx_domain);
+       if (ret)
+               return ret;
+       assert(sh->tx_domain);
+       ret = mlx5_glue->dr_dump_domain(file, sh->tx_domain);
+#else
+       ret = ENOTSUP;
+#endif
+       return -ret;
+}