IB/mlx5: Expose software parsing for Raw Ethernet QP
authorNoa Osherovich <noaos@mellanox.com>
Thu, 17 Aug 2017 12:52:28 +0000 (15:52 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 24 Aug 2017 21:47:34 +0000 (17:47 -0400)
Software parsing (SWP) is a feature that can be used to instruct the
device to stop using its internal parser and to parse packets on the
transmit path according to offsets set for each packets.

Through this feature, the device allows the handling of checksum and
LSO by the hardware according to the location of IP and TCP/UDP
headers.

Enable SW parsing on Raw Ethernet send queue by default if firmware
supports it and report these capabilities to user space.

Signed-off-by: Noa Osherovich <noaos@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/qp.c
include/uapi/rdma/mlx5-abi.h

index 762ef6bf219e0e7ae860d8f3978df942ebfe4078..07789450ec42d650ff23a4598ae3eef8e9b0f710 100644 (file)
@@ -811,6 +811,27 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
        if (field_avail(typeof(resp), reserved, uhw->outlen))
                resp.response_length += sizeof(resp.reserved);
 
+       if (field_avail(typeof(resp), sw_parsing_caps,
+                       uhw->outlen)) {
+               resp.response_length += sizeof(resp.sw_parsing_caps);
+               if (MLX5_CAP_ETH(mdev, swp)) {
+                       resp.sw_parsing_caps.sw_parsing_offloads |=
+                               MLX5_IB_SW_PARSING;
+
+                       if (MLX5_CAP_ETH(mdev, swp_csum))
+                               resp.sw_parsing_caps.sw_parsing_offloads |=
+                                       MLX5_IB_SW_PARSING_CSUM;
+
+                       if (MLX5_CAP_ETH(mdev, swp_lso))
+                               resp.sw_parsing_caps.sw_parsing_offloads |=
+                                       MLX5_IB_SW_PARSING_LSO;
+
+                       if (resp.sw_parsing_caps.sw_parsing_offloads)
+                               resp.sw_parsing_caps.supported_qpts =
+                                       BIT(IB_QPT_RAW_PACKET);
+               }
+       }
+
        if (uhw->outlen) {
                err = ib_copy_to_udata(uhw, &resp, resp.response_length);
 
index bc49d14e0a001273351506ccd981a8ecfac68676..656773196f275b677877475ed671a86d5a5ba6ee 100644 (file)
@@ -1088,6 +1088,9 @@ static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
        MLX5_SET(sqc, sqc, cqn, MLX5_GET(qpc, qpc, cqn_snd));
        MLX5_SET(sqc, sqc, tis_lst_sz, 1);
        MLX5_SET(sqc, sqc, tis_num_0, sq->tisn);
+       if (MLX5_CAP_GEN(dev->mdev, eth_net_offloads) &&
+           MLX5_CAP_ETH(dev->mdev, swp))
+               MLX5_SET(sqc, sqc, allow_swp, 1);
 
        wq = MLX5_ADDR_OF(sqc, sqc, wq);
        MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC);
index 0b3d30837a9f6456aabe028f5f9931b3593d778c..64d398e662cd32034a7f790c02cbbff223b326eb 100644 (file)
@@ -168,6 +168,22 @@ struct mlx5_packet_pacing_caps {
        __u32 reserved;
 };
 
+enum mlx5_ib_sw_parsing_offloads {
+       MLX5_IB_SW_PARSING = 1 << 0,
+       MLX5_IB_SW_PARSING_CSUM = 1 << 1,
+       MLX5_IB_SW_PARSING_LSO = 1 << 2,
+};
+
+struct mlx5_ib_sw_parsing_caps {
+       __u32 sw_parsing_offloads; /* enum mlx5_ib_sw_parsing_offloads */
+
+       /* Corresponding bit will be set if qp type from
+        * 'enum ib_qp_type' is supported, e.g.
+        * supported_qpts |= 1 << IB_QPT_RAW_PACKET
+        */
+       __u32 supported_qpts;
+};
+
 struct mlx5_ib_query_device_resp {
        __u32   comp_mask;
        __u32   response_length;
@@ -177,6 +193,7 @@ struct mlx5_ib_query_device_resp {
        struct  mlx5_packet_pacing_caps packet_pacing_caps;
        __u32   mlx5_ib_support_multi_pkt_send_wqes;
        __u32   reserved;
+       struct mlx5_ib_sw_parsing_caps sw_parsing_caps;
 };
 
 struct mlx5_ib_create_cq {