From: Ben Ben-ishay <benis...@nvidia.com>

Add the necessary infrastructure for NVMEoTCP offload:

- Add nvmeocp_en + nvmeotcp_crc_en bit to the TIR for identify NVMEoTCP offload 
flow
  And tag_buffer_id that will be used by the connected nvmeotcp_queues
- Add new CQE field that will be used to pass scattered data information to SW
- Add new capability to HCA_CAP that represnts the NVMEoTCP offload ability

Signed-off-by: Ben Ben-ishay <benis...@nvidia.com>
Signed-off-by: Boris Pismenny <bor...@mellanox.com>
Signed-off-by: Or Gerlitz <ogerl...@mellanox.com>
Signed-off-by: Yoray Zack <yor...@mellanox.com>
---
 include/linux/mlx5/device.h   |   8 +++
 include/linux/mlx5/mlx5_ifc.h | 104 +++++++++++++++++++++++++++++++++-
 include/linux/mlx5/qp.h       |   1 +
 3 files changed, 110 insertions(+), 3 deletions(-)

diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h
index 00057eae89ab..4433ff213d32 100644
--- a/include/linux/mlx5/device.h
+++ b/include/linux/mlx5/device.h
@@ -263,6 +263,7 @@ enum {
 enum {
        MLX5_MKEY_MASK_LEN              = 1ull << 0,
        MLX5_MKEY_MASK_PAGE_SIZE        = 1ull << 1,
+       MLX5_MKEY_MASK_XLT_OCT_SIZE     = 1ull << 2,
        MLX5_MKEY_MASK_START_ADDR       = 1ull << 6,
        MLX5_MKEY_MASK_PD               = 1ull << 7,
        MLX5_MKEY_MASK_EN_RINVAL        = 1ull << 8,
@@ -1171,6 +1172,7 @@ enum mlx5_cap_type {
        MLX5_CAP_VDPA_EMULATION = 0x13,
        MLX5_CAP_DEV_EVENT = 0x14,
        MLX5_CAP_IPSEC,
+       MLX5_CAP_DEV_NVMEOTCP = 0x19,
        /* NUM OF CAP Types */
        MLX5_CAP_NUM
 };
@@ -1391,6 +1393,12 @@ enum mlx5_qcam_feature_groups {
 #define MLX5_CAP_IPSEC(mdev, cap)\
        MLX5_GET(ipsec_cap, (mdev)->caps.hca_cur[MLX5_CAP_IPSEC], cap)
 
+#define MLX5_CAP_DEV_NVMEOTCP(mdev, cap)\
+       MLX5_GET(nvmeotcp_cap, mdev->caps.hca_cur[MLX5_CAP_DEV_NVMEOTCP], cap)
+
+#define MLX5_CAP64_NVMEOTCP(mdev, cap)\
+       MLX5_GET64(nvmeotcp_cap, mdev->caps.hca_cur[MLX5_CAP_DEV_NVMEOTCP], cap)
+
 enum {
        MLX5_CMD_STAT_OK                        = 0x0,
        MLX5_CMD_STAT_INT_ERR                   = 0x1,
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index a3510e81ab3b..e2b75c580c37 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -1271,7 +1271,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {
        u8         log_max_srq_sz[0x8];
        u8         log_max_qp_sz[0x8];
        u8         event_cap[0x1];
-       u8         reserved_at_91[0x7];
+       u8         reserved_at_91[0x5];
+       u8         nvmeotcp[0x1];
+       u8         reserved_at_97[0x1];
        u8         prio_tag_required[0x1];
        u8         reserved_at_99[0x2];
        u8         log_max_qp[0x5];
@@ -3020,6 +3022,21 @@ struct mlx5_ifc_roce_addr_layout_bits {
        u8         reserved_at_e0[0x20];
 };
 
+struct mlx5_ifc_nvmeotcp_cap_bits {
+       u8    zerocopy[0x1];
+       u8    crc_rx[0x1];
+       u8    crc_tx[0x1];
+       u8    reserved_at_3[0x15];
+       u8    version[0x8];
+
+       u8    reserved_at_20[0x13];
+       u8    log_max_nvmeotcp_tag_buffer_table[0x5];
+       u8    reserved_at_38[0x3];
+       u8    log_max_nvmeotcp_tag_buffer_size[0x5];
+
+       u8    reserved_at_40[0x7c0];
+};
+
 union mlx5_ifc_hca_cap_union_bits {
        struct mlx5_ifc_cmd_hca_cap_bits cmd_hca_cap;
        struct mlx5_ifc_odp_cap_bits odp_cap;
@@ -3036,6 +3053,7 @@ union mlx5_ifc_hca_cap_union_bits {
        struct mlx5_ifc_tls_cap_bits tls_cap;
        struct mlx5_ifc_device_mem_cap_bits device_mem_cap;
        struct mlx5_ifc_virtio_emulation_cap_bits virtio_emulation_cap;
+       struct mlx5_ifc_nvmeotcp_cap_bits nvmeotcp_cap;
        u8         reserved_at_0[0x8000];
 };
 
@@ -3230,7 +3248,9 @@ struct mlx5_ifc_tirc_bits {
 
        u8         disp_type[0x4];
        u8         tls_en[0x1];
-       u8         reserved_at_25[0x1b];
+       u8         nvmeotcp_zero_copy_en[0x1];
+       u8         nvmeotcp_crc_en[0x1];
+       u8         reserved_at_27[0x19];
 
        u8         reserved_at_40[0x40];
 
@@ -3261,7 +3281,8 @@ struct mlx5_ifc_tirc_bits {
 
        struct mlx5_ifc_rx_hash_field_select_bits rx_hash_field_selector_inner;
 
-       u8         reserved_at_2c0[0x4c0];
+       u8         nvmeotcp_tag_buffer_table_id[0x20];
+       u8         reserved_at_2e0[0x4a0];
 };
 
 enum {
@@ -10716,12 +10737,14 @@ enum {
        MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY = BIT(0xc),
        MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_IPSEC = BIT(0x13),
        MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_SAMPLER = BIT(0x20),
+       MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_NVMEOTCP_TAG_BUFFER_TABLE = BIT(0x21),
 };
 
 enum {
        MLX5_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY = 0xc,
        MLX5_GENERAL_OBJECT_TYPES_IPSEC = 0x13,
        MLX5_GENERAL_OBJECT_TYPES_SAMPLER = 0x20,
+       MLX5_GENERAL_OBJECT_TYPES_NVMEOTCP_TAG_BUFFER_TABLE = 0x21
 };
 
 enum {
@@ -10823,6 +10846,20 @@ struct mlx5_ifc_create_sampler_obj_in_bits {
        struct mlx5_ifc_sampler_obj_bits sampler_object;
 };
 
+struct mlx5_ifc_nvmeotcp_tag_buf_table_obj_bits {
+       u8    modify_field_select[0x40];
+
+       u8    reserved_at_20[0x20];
+
+       u8    reserved_at_40[0x1b];
+       u8    log_tag_buffer_table_size[0x5];
+};
+
+struct mlx5_ifc_create_nvmeotcp_tag_buf_table_in_bits {
+       struct mlx5_ifc_general_obj_in_cmd_hdr_bits general_obj_in_cmd_hdr;
+       struct mlx5_ifc_nvmeotcp_tag_buf_table_obj_bits 
nvmeotcp_tag_buf_table_obj;
+};
+
 enum {
        MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_128 = 0x0,
        MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_256 = 0x1,
@@ -10833,6 +10870,18 @@ enum {
        MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_TYPE_IPSEC = 0x2,
 };
 
+enum {
+       MLX5_TRANSPORT_STATIC_PARAMS_ACC_TYPE_XTS               = 0x0,
+       MLX5_TRANSPORT_STATIC_PARAMS_ACC_TYPE_TLS               = 0x1,
+       MLX5_TRANSPORT_STATIC_PARAMS_ACC_TYPE_NVMETCP           = 0x2,
+       MLX5_TRANSPORT_STATIC_PARAMS_ACC_TYPE_NVMETCP_WITH_TLS  = 0x3,
+};
+
+enum {
+       MLX5_TRANSPORT_STATIC_PARAMS_TI_INITIATOR  = 0x0,
+       MLX5_TRANSPORT_STATIC_PARAMS_TI_TARGET     = 0x1,
+};
+
 struct mlx5_ifc_tls_static_params_bits {
        u8         const_2[0x2];
        u8         tls_version[0x4];
@@ -10873,4 +10922,53 @@ enum {
        MLX5_MTT_PERM_RW        = MLX5_MTT_PERM_READ | MLX5_MTT_PERM_WRITE,
 };
 
+struct mlx5_ifc_nvmeotcp_progress_params_bits {
+       u8    valid[0x1];
+       u8    reserved_at_1[0x7];
+       u8    pd[0x18];
+
+       u8    next_pdu_tcp_sn[0x20];
+
+       u8    hw_resync_tcp_sn[0x20];
+
+       u8    pdu_tracker_state[0x2];
+       u8    offloading_state[0x2];
+       u8    reserved_at_64[0xc];
+       u8    cccid_ttag[0x10];
+};
+
+struct mlx5_ifc_transport_static_params_bits {
+       u8    const_2[0x2];
+       u8    tls_version[0x4];
+       u8    const_1[0x2];
+       u8    reserved_at_8[0x14];
+       u8    acc_type[0x4];
+
+       u8    reserved_at_20[0x20];
+
+       u8    initial_record_number[0x40];
+
+       u8    resync_tcp_sn[0x20];
+
+       u8    gcm_iv[0x20];
+
+       u8    implicit_iv[0x40];
+
+       u8    reserved_at_100[0x8];
+       u8    dek_index[0x18];
+
+       u8    reserved_at_120[0x15];
+       u8    ti[0x1];
+       u8    zero_copy_en[0x1];
+       u8    ddgst_offload_en[0x1];
+       u8    hdgst_offload_en[0x1];
+       u8    ddgst_en[0x1];
+       u8    hddgst_en[0x1];
+       u8    pda[0x5];
+
+       u8    nvme_resync_tcp_sn[0x20];
+
+       u8    reserved_at_160[0xa0];
+};
+
 #endif /* MLX5_IFC_H */
diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h
index d75ef8aa8fac..5fa8b82c9edb 100644
--- a/include/linux/mlx5/qp.h
+++ b/include/linux/mlx5/qp.h
@@ -220,6 +220,7 @@ struct mlx5_wqe_ctrl_seg {
 #define MLX5_WQE_CTRL_OPCODE_MASK 0xff
 #define MLX5_WQE_CTRL_WQE_INDEX_MASK 0x00ffff00
 #define MLX5_WQE_CTRL_WQE_INDEX_SHIFT 8
+#define MLX5_WQE_CTRL_TIR_TIS_INDEX_SHIFT 8
 
 enum {
        MLX5_ETH_WQE_L3_INNER_CSUM      = 1 << 4,
-- 
2.24.1

Reply via email to