net/mlx5: check VLAN push/pop support
[dpdk.git] / drivers / common / mlx5 / mlx5_devx_cmds.c
index 23ae5da..56407cc 100644 (file)
@@ -819,6 +819,8 @@ mlx5_devx_cmd_query_hca_attr(void *ctx,
        attr->roce = MLX5_GET(cmd_hca_cap, hcattr, roce);
        attr->rq_ts_format = MLX5_GET(cmd_hca_cap, hcattr, rq_ts_format);
        attr->sq_ts_format = MLX5_GET(cmd_hca_cap, hcattr, sq_ts_format);
+       attr->steering_format_version =
+               MLX5_GET(cmd_hca_cap, hcattr, steering_format_version);
        attr->regex = MLX5_GET(cmd_hca_cap, hcattr, regexp);
        attr->regexp_num_of_engines = MLX5_GET(cmd_hca_cap, hcattr,
                                               regexp_num_of_engines);
@@ -878,6 +880,9 @@ mlx5_devx_cmd_query_hca_attr(void *ctx,
        attr->crypto = MLX5_GET(cmd_hca_cap, hcattr, crypto);
        if (attr->crypto)
                attr->aes_xts = MLX5_GET(cmd_hca_cap, hcattr, aes_xts);
+       attr->ct_offload = !!(MLX5_GET64(cmd_hca_cap, hcattr,
+                                        general_obj_types) &
+                             MLX5_GENERAL_OBJ_TYPES_CAP_CONN_TRACK_OFFLOAD);
        if (attr->qos.sup) {
                MLX5_SET(query_hca_cap_in, in, op_mod,
                         MLX5_GET_HCA_CAP_OP_MOD_QOS_CAP |
@@ -944,7 +949,16 @@ mlx5_devx_cmd_query_hca_attr(void *ctx,
        attr->log_max_ft_sampler_num = MLX5_GET
                (flow_table_nic_cap, hcattr,
                 flow_table_properties_nic_receive.log_max_ft_sampler_num);
+       attr->flow.tunnel_header_0_1 = MLX5_GET
+               (flow_table_nic_cap, hcattr,
+                ft_field_support_2_nic_receive.tunnel_header_0_1);
        attr->pkt_integrity_match = mlx5_devx_query_pkt_integrity_match(hcattr);
+       attr->inner_ipv4_ihl = MLX5_GET
+               (flow_table_nic_cap, hcattr,
+                ft_field_support_2_nic_receive.inner_ipv4_ihl);
+       attr->outer_ipv4_ihl = MLX5_GET
+               (flow_table_nic_cap, hcattr,
+                ft_field_support_2_nic_receive.outer_ipv4_ihl);
        /* Query HCA offloads for Ethernet protocol. */
        memset(in, 0, sizeof(in));
        memset(out, 0, sizeof(out));
@@ -2347,6 +2361,56 @@ mlx5_devx_cmd_create_flow_meter_aso_obj(void *ctx, uint32_t pd,
        return flow_meter_aso_obj;
 }
 
+/*
+ * Create general object of type CONN_TRACK_OFFLOAD using DevX API.
+ *
+ * @param[in] ctx
+ *   Context returned from mlx5 open_device() glue function.
+ * @param [in] pd
+ *   PD value to associate the CONN_TRACK_OFFLOAD ASO object with.
+ * @param [in] log_obj_size
+ *   log_obj_size to allocate its power of 2 * objects
+ *   in one CONN_TRACK_OFFLOAD bulk allocation.
+ *
+ * @return
+ *   The DevX object created, NULL otherwise and rte_errno is set.
+ */
+struct mlx5_devx_obj *
+mlx5_devx_cmd_create_conn_track_offload_obj(void *ctx, uint32_t pd,
+                                           uint32_t log_obj_size)
+{
+       uint32_t in[MLX5_ST_SZ_DW(create_conn_track_aso_in)] = {0};
+       uint32_t out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
+       struct mlx5_devx_obj *ct_aso_obj;
+       void *ptr;
+
+       ct_aso_obj = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*ct_aso_obj),
+                                0, SOCKET_ID_ANY);
+       if (!ct_aso_obj) {
+               DRV_LOG(ERR, "Failed to allocate CONN_TRACK_OFFLOAD object.");
+               rte_errno = ENOMEM;
+               return NULL;
+       }
+       ptr = MLX5_ADDR_OF(create_conn_track_aso_in, in, hdr);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, opcode,
+                MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, obj_type,
+                MLX5_GENERAL_OBJ_TYPE_CONN_TRACK_OFFLOAD);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, log_obj_range, log_obj_size);
+       ptr = MLX5_ADDR_OF(create_conn_track_aso_in, in, conn_track_offload);
+       MLX5_SET(conn_track_offload, ptr, conn_track_aso_access_pd, pd);
+       ct_aso_obj->obj = mlx5_glue->devx_obj_create(ctx, in, sizeof(in),
+                                                    out, sizeof(out));
+       if (!ct_aso_obj->obj) {
+               rte_errno = errno;
+               DRV_LOG(ERR, "Failed to create CONN_TRACK_OFFLOAD obj by using DevX.");
+               mlx5_free(ct_aso_obj);
+               return NULL;
+       }
+       ct_aso_obj->id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
+       return ct_aso_obj;
+}
+
 /**
  * Create general object of type GENEVE TLV option using DevX API.
  *