1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* QLogic qed NIC Driver 3*4882a593Smuzhiyun * Copyright (c) 2015-2017 QLogic Corporation 4*4882a593Smuzhiyun * Copyright (c) 2019-2020 Marvell International Ltd. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _QED_RDMA_IF_H 8*4882a593Smuzhiyun #define _QED_RDMA_IF_H 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun #include <linux/delay.h> 11*4882a593Smuzhiyun #include <linux/list.h> 12*4882a593Smuzhiyun #include <linux/slab.h> 13*4882a593Smuzhiyun #include <linux/qed/qed_if.h> 14*4882a593Smuzhiyun #include <linux/qed/qed_ll2_if.h> 15*4882a593Smuzhiyun #include <linux/qed/rdma_common.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define QED_RDMA_MAX_CNQ_SIZE (0xFFFF) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* rdma interface */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun enum qed_roce_qp_state { 22*4882a593Smuzhiyun QED_ROCE_QP_STATE_RESET, 23*4882a593Smuzhiyun QED_ROCE_QP_STATE_INIT, 24*4882a593Smuzhiyun QED_ROCE_QP_STATE_RTR, 25*4882a593Smuzhiyun QED_ROCE_QP_STATE_RTS, 26*4882a593Smuzhiyun QED_ROCE_QP_STATE_SQD, 27*4882a593Smuzhiyun QED_ROCE_QP_STATE_ERR, 28*4882a593Smuzhiyun QED_ROCE_QP_STATE_SQE 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun enum qed_rdma_qp_type { 32*4882a593Smuzhiyun QED_RDMA_QP_TYPE_RC, 33*4882a593Smuzhiyun QED_RDMA_QP_TYPE_XRC_INI, 34*4882a593Smuzhiyun QED_RDMA_QP_TYPE_XRC_TGT, 35*4882a593Smuzhiyun QED_RDMA_QP_TYPE_INVAL = 0xffff, 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun enum qed_rdma_tid_type { 39*4882a593Smuzhiyun QED_RDMA_TID_REGISTERED_MR, 40*4882a593Smuzhiyun QED_RDMA_TID_FMR, 41*4882a593Smuzhiyun QED_RDMA_TID_MW 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct qed_rdma_events { 45*4882a593Smuzhiyun void *context; 46*4882a593Smuzhiyun void (*affiliated_event)(void *context, u8 fw_event_code, 47*4882a593Smuzhiyun void *fw_handle); 48*4882a593Smuzhiyun void (*unaffiliated_event)(void *context, u8 event_code); 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct qed_rdma_device { 52*4882a593Smuzhiyun u32 vendor_id; 53*4882a593Smuzhiyun u32 vendor_part_id; 54*4882a593Smuzhiyun u32 hw_ver; 55*4882a593Smuzhiyun u64 fw_ver; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun u64 node_guid; 58*4882a593Smuzhiyun u64 sys_image_guid; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun u8 max_cnq; 61*4882a593Smuzhiyun u8 max_sge; 62*4882a593Smuzhiyun u8 max_srq_sge; 63*4882a593Smuzhiyun u16 max_inline; 64*4882a593Smuzhiyun u32 max_wqe; 65*4882a593Smuzhiyun u32 max_srq_wqe; 66*4882a593Smuzhiyun u8 max_qp_resp_rd_atomic_resc; 67*4882a593Smuzhiyun u8 max_qp_req_rd_atomic_resc; 68*4882a593Smuzhiyun u64 max_dev_resp_rd_atomic_resc; 69*4882a593Smuzhiyun u32 max_cq; 70*4882a593Smuzhiyun u32 max_qp; 71*4882a593Smuzhiyun u32 max_srq; 72*4882a593Smuzhiyun u32 max_mr; 73*4882a593Smuzhiyun u64 max_mr_size; 74*4882a593Smuzhiyun u32 max_cqe; 75*4882a593Smuzhiyun u32 max_mw; 76*4882a593Smuzhiyun u32 max_mr_mw_fmr_pbl; 77*4882a593Smuzhiyun u64 max_mr_mw_fmr_size; 78*4882a593Smuzhiyun u32 max_pd; 79*4882a593Smuzhiyun u32 max_ah; 80*4882a593Smuzhiyun u8 max_pkey; 81*4882a593Smuzhiyun u16 max_srq_wr; 82*4882a593Smuzhiyun u8 max_stats_queues; 83*4882a593Smuzhiyun u32 dev_caps; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Abilty to support RNR-NAK generation */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RNR_NAK_MASK 0x1 88*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RNR_NAK_SHIFT 0 89*4882a593Smuzhiyun /* Abilty to support shutdown port */ 90*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_SHUTDOWN_PORT_MASK 0x1 91*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_SHUTDOWN_PORT_SHIFT 1 92*4882a593Smuzhiyun /* Abilty to support port active event */ 93*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_PORT_ACTIVE_EVENT_MASK 0x1 94*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_PORT_ACTIVE_EVENT_SHIFT 2 95*4882a593Smuzhiyun /* Abilty to support port change event */ 96*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_PORT_CHANGE_EVENT_MASK 0x1 97*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_PORT_CHANGE_EVENT_SHIFT 3 98*4882a593Smuzhiyun /* Abilty to support system image GUID */ 99*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_SYS_IMAGE_MASK 0x1 100*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_SYS_IMAGE_SHIFT 4 101*4882a593Smuzhiyun /* Abilty to support bad P_Key counter support */ 102*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BAD_PKEY_CNT_MASK 0x1 103*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BAD_PKEY_CNT_SHIFT 5 104*4882a593Smuzhiyun /* Abilty to support atomic operations */ 105*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_ATOMIC_OP_MASK 0x1 106*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_ATOMIC_OP_SHIFT 6 107*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RESIZE_CQ_MASK 0x1 108*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RESIZE_CQ_SHIFT 7 109*4882a593Smuzhiyun /* Abilty to support modifying the maximum number of 110*4882a593Smuzhiyun * outstanding work requests per QP 111*4882a593Smuzhiyun */ 112*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RESIZE_MAX_WR_MASK 0x1 113*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_RESIZE_MAX_WR_SHIFT 8 114*4882a593Smuzhiyun /* Abilty to support automatic path migration */ 115*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_AUTO_PATH_MIG_MASK 0x1 116*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_AUTO_PATH_MIG_SHIFT 9 117*4882a593Smuzhiyun /* Abilty to support the base memory management extensions */ 118*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BASE_MEMORY_EXT_MASK 0x1 119*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BASE_MEMORY_EXT_SHIFT 10 120*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BASE_QUEUE_EXT_MASK 0x1 121*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BASE_QUEUE_EXT_SHIFT 11 122*4882a593Smuzhiyun /* Abilty to support multipile page sizes per memory region */ 123*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_MULTI_PAGE_PER_MR_EXT_MASK 0x1 124*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_MULTI_PAGE_PER_MR_EXT_SHIFT 12 125*4882a593Smuzhiyun /* Abilty to support block list physical buffer list */ 126*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BLOCK_MODE_MASK 0x1 127*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_BLOCK_MODE_SHIFT 13 128*4882a593Smuzhiyun /* Abilty to support zero based virtual addresses */ 129*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_ZBVA_MASK 0x1 130*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_ZBVA_SHIFT 14 131*4882a593Smuzhiyun /* Abilty to support local invalidate fencing */ 132*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_LOCAL_INV_FENCE_MASK 0x1 133*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_LOCAL_INV_FENCE_SHIFT 15 134*4882a593Smuzhiyun /* Abilty to support Loopback on QP */ 135*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_LB_INDICATOR_MASK 0x1 136*4882a593Smuzhiyun #define QED_RDMA_DEV_CAP_LB_INDICATOR_SHIFT 16 137*4882a593Smuzhiyun u64 page_size_caps; 138*4882a593Smuzhiyun u8 dev_ack_delay; 139*4882a593Smuzhiyun u32 reserved_lkey; 140*4882a593Smuzhiyun u32 bad_pkey_counter; 141*4882a593Smuzhiyun struct qed_rdma_events events; 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun enum qed_port_state { 145*4882a593Smuzhiyun QED_RDMA_PORT_UP, 146*4882a593Smuzhiyun QED_RDMA_PORT_DOWN, 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun enum qed_roce_capability { 150*4882a593Smuzhiyun QED_ROCE_V1 = 1 << 0, 151*4882a593Smuzhiyun QED_ROCE_V2 = 1 << 1, 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun struct qed_rdma_port { 155*4882a593Smuzhiyun enum qed_port_state port_state; 156*4882a593Smuzhiyun int link_speed; 157*4882a593Smuzhiyun u64 max_msg_size; 158*4882a593Smuzhiyun u8 source_gid_table_len; 159*4882a593Smuzhiyun void *source_gid_table_ptr; 160*4882a593Smuzhiyun u8 pkey_table_len; 161*4882a593Smuzhiyun void *pkey_table_ptr; 162*4882a593Smuzhiyun u32 pkey_bad_counter; 163*4882a593Smuzhiyun enum qed_roce_capability capability; 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct qed_rdma_cnq_params { 167*4882a593Smuzhiyun u8 num_pbl_pages; 168*4882a593Smuzhiyun u64 pbl_ptr; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* The CQ Mode affects the CQ doorbell transaction size. 172*4882a593Smuzhiyun * 64/32 bit machines should configure to 32/16 bits respectively. 173*4882a593Smuzhiyun */ 174*4882a593Smuzhiyun enum qed_rdma_cq_mode { 175*4882a593Smuzhiyun QED_RDMA_CQ_MODE_16_BITS, 176*4882a593Smuzhiyun QED_RDMA_CQ_MODE_32_BITS, 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct qed_roce_dcqcn_params { 180*4882a593Smuzhiyun u8 notification_point; 181*4882a593Smuzhiyun u8 reaction_point; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* fields for notification point */ 184*4882a593Smuzhiyun u32 cnp_send_timeout; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* fields for reaction point */ 187*4882a593Smuzhiyun u32 rl_bc_rate; 188*4882a593Smuzhiyun u16 rl_max_rate; 189*4882a593Smuzhiyun u16 rl_r_ai; 190*4882a593Smuzhiyun u16 rl_r_hai; 191*4882a593Smuzhiyun u16 dcqcn_g; 192*4882a593Smuzhiyun u32 dcqcn_k_us; 193*4882a593Smuzhiyun u32 dcqcn_timeout_us; 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun struct qed_rdma_start_in_params { 197*4882a593Smuzhiyun struct qed_rdma_events *events; 198*4882a593Smuzhiyun struct qed_rdma_cnq_params cnq_pbl_list[128]; 199*4882a593Smuzhiyun u8 desired_cnq; 200*4882a593Smuzhiyun enum qed_rdma_cq_mode cq_mode; 201*4882a593Smuzhiyun struct qed_roce_dcqcn_params dcqcn_params; 202*4882a593Smuzhiyun u16 max_mtu; 203*4882a593Smuzhiyun u8 mac_addr[ETH_ALEN]; 204*4882a593Smuzhiyun u8 iwarp_flags; 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun struct qed_rdma_add_user_out_params { 208*4882a593Smuzhiyun u16 dpi; 209*4882a593Smuzhiyun void __iomem *dpi_addr; 210*4882a593Smuzhiyun u64 dpi_phys_addr; 211*4882a593Smuzhiyun u32 dpi_size; 212*4882a593Smuzhiyun u16 wid_count; 213*4882a593Smuzhiyun }; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun enum roce_mode { 216*4882a593Smuzhiyun ROCE_V1, 217*4882a593Smuzhiyun ROCE_V2_IPV4, 218*4882a593Smuzhiyun ROCE_V2_IPV6, 219*4882a593Smuzhiyun MAX_ROCE_MODE 220*4882a593Smuzhiyun }; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun union qed_gid { 223*4882a593Smuzhiyun u8 bytes[16]; 224*4882a593Smuzhiyun u16 words[8]; 225*4882a593Smuzhiyun u32 dwords[4]; 226*4882a593Smuzhiyun u64 qwords[2]; 227*4882a593Smuzhiyun u32 ipv4_addr; 228*4882a593Smuzhiyun }; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun struct qed_rdma_register_tid_in_params { 231*4882a593Smuzhiyun u32 itid; 232*4882a593Smuzhiyun enum qed_rdma_tid_type tid_type; 233*4882a593Smuzhiyun u8 key; 234*4882a593Smuzhiyun u16 pd; 235*4882a593Smuzhiyun bool local_read; 236*4882a593Smuzhiyun bool local_write; 237*4882a593Smuzhiyun bool remote_read; 238*4882a593Smuzhiyun bool remote_write; 239*4882a593Smuzhiyun bool remote_atomic; 240*4882a593Smuzhiyun bool mw_bind; 241*4882a593Smuzhiyun u64 pbl_ptr; 242*4882a593Smuzhiyun bool pbl_two_level; 243*4882a593Smuzhiyun u8 pbl_page_size_log; 244*4882a593Smuzhiyun u8 page_size_log; 245*4882a593Smuzhiyun u64 length; 246*4882a593Smuzhiyun u64 vaddr; 247*4882a593Smuzhiyun bool phy_mr; 248*4882a593Smuzhiyun bool dma_mr; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun bool dif_enabled; 251*4882a593Smuzhiyun u64 dif_error_addr; 252*4882a593Smuzhiyun }; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct qed_rdma_create_cq_in_params { 255*4882a593Smuzhiyun u32 cq_handle_lo; 256*4882a593Smuzhiyun u32 cq_handle_hi; 257*4882a593Smuzhiyun u32 cq_size; 258*4882a593Smuzhiyun u16 dpi; 259*4882a593Smuzhiyun bool pbl_two_level; 260*4882a593Smuzhiyun u64 pbl_ptr; 261*4882a593Smuzhiyun u16 pbl_num_pages; 262*4882a593Smuzhiyun u8 pbl_page_size_log; 263*4882a593Smuzhiyun u8 cnq_id; 264*4882a593Smuzhiyun u16 int_timeout; 265*4882a593Smuzhiyun }; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun struct qed_rdma_create_srq_in_params { 268*4882a593Smuzhiyun u64 pbl_base_addr; 269*4882a593Smuzhiyun u64 prod_pair_addr; 270*4882a593Smuzhiyun u16 num_pages; 271*4882a593Smuzhiyun u16 pd_id; 272*4882a593Smuzhiyun u16 page_size; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* XRC related only */ 275*4882a593Smuzhiyun bool reserved_key_en; 276*4882a593Smuzhiyun bool is_xrc; 277*4882a593Smuzhiyun u32 cq_cid; 278*4882a593Smuzhiyun u16 xrcd_id; 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct qed_rdma_destroy_cq_in_params { 282*4882a593Smuzhiyun u16 icid; 283*4882a593Smuzhiyun }; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun struct qed_rdma_destroy_cq_out_params { 286*4882a593Smuzhiyun u16 num_cq_notif; 287*4882a593Smuzhiyun }; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun struct qed_rdma_create_qp_in_params { 290*4882a593Smuzhiyun u32 qp_handle_lo; 291*4882a593Smuzhiyun u32 qp_handle_hi; 292*4882a593Smuzhiyun u32 qp_handle_async_lo; 293*4882a593Smuzhiyun u32 qp_handle_async_hi; 294*4882a593Smuzhiyun bool use_srq; 295*4882a593Smuzhiyun bool signal_all; 296*4882a593Smuzhiyun bool fmr_and_reserved_lkey; 297*4882a593Smuzhiyun u16 pd; 298*4882a593Smuzhiyun u16 dpi; 299*4882a593Smuzhiyun u16 sq_cq_id; 300*4882a593Smuzhiyun u16 sq_num_pages; 301*4882a593Smuzhiyun u64 sq_pbl_ptr; 302*4882a593Smuzhiyun u8 max_sq_sges; 303*4882a593Smuzhiyun u16 rq_cq_id; 304*4882a593Smuzhiyun u16 rq_num_pages; 305*4882a593Smuzhiyun u64 rq_pbl_ptr; 306*4882a593Smuzhiyun u16 srq_id; 307*4882a593Smuzhiyun u16 xrcd_id; 308*4882a593Smuzhiyun u8 stats_queue; 309*4882a593Smuzhiyun enum qed_rdma_qp_type qp_type; 310*4882a593Smuzhiyun u8 flags; 311*4882a593Smuzhiyun #define QED_ROCE_EDPM_MODE_MASK 0x1 312*4882a593Smuzhiyun #define QED_ROCE_EDPM_MODE_SHIFT 0 313*4882a593Smuzhiyun }; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun struct qed_rdma_create_qp_out_params { 316*4882a593Smuzhiyun u32 qp_id; 317*4882a593Smuzhiyun u16 icid; 318*4882a593Smuzhiyun void *rq_pbl_virt; 319*4882a593Smuzhiyun dma_addr_t rq_pbl_phys; 320*4882a593Smuzhiyun void *sq_pbl_virt; 321*4882a593Smuzhiyun dma_addr_t sq_pbl_phys; 322*4882a593Smuzhiyun }; 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun struct qed_rdma_modify_qp_in_params { 325*4882a593Smuzhiyun u32 modify_flags; 326*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_NEW_STATE_MASK 0x1 327*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_NEW_STATE_SHIFT 0 328*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_PKEY_MASK 0x1 329*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_PKEY_SHIFT 1 330*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN_MASK 0x1 331*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN_SHIFT 2 332*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_DEST_QP_MASK 0x1 333*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_DEST_QP_SHIFT 3 334*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR_MASK 0x1 335*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR_SHIFT 4 336*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RQ_PSN_MASK 0x1 337*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RQ_PSN_SHIFT 5 338*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_SQ_PSN_MASK 0x1 339*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_SQ_PSN_SHIFT 6 340*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ_MASK 0x1 341*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ_SHIFT 7 342*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP_MASK 0x1 343*4882a593Smuzhiyun #define QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP_SHIFT 8 344*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT_MASK 0x1 345*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT_SHIFT 9 346*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RETRY_CNT_MASK 0x1 347*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RETRY_CNT_SHIFT 10 348*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT_MASK 0x1 349*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT_SHIFT 11 350*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER_MASK 0x1 351*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER_SHIFT 12 352*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_E2E_FLOW_CONTROL_EN_MASK 0x1 353*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_E2E_FLOW_CONTROL_EN_SHIFT 13 354*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ROCE_MODE_MASK 0x1 355*4882a593Smuzhiyun #define QED_ROCE_MODIFY_QP_VALID_ROCE_MODE_SHIFT 14 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun enum qed_roce_qp_state new_state; 358*4882a593Smuzhiyun u16 pkey; 359*4882a593Smuzhiyun bool incoming_rdma_read_en; 360*4882a593Smuzhiyun bool incoming_rdma_write_en; 361*4882a593Smuzhiyun bool incoming_atomic_en; 362*4882a593Smuzhiyun bool e2e_flow_control_en; 363*4882a593Smuzhiyun u32 dest_qp; 364*4882a593Smuzhiyun bool lb_indication; 365*4882a593Smuzhiyun u16 mtu; 366*4882a593Smuzhiyun u8 traffic_class_tos; 367*4882a593Smuzhiyun u8 hop_limit_ttl; 368*4882a593Smuzhiyun u32 flow_label; 369*4882a593Smuzhiyun union qed_gid sgid; 370*4882a593Smuzhiyun union qed_gid dgid; 371*4882a593Smuzhiyun u16 udp_src_port; 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun u16 vlan_id; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun u32 rq_psn; 376*4882a593Smuzhiyun u32 sq_psn; 377*4882a593Smuzhiyun u8 max_rd_atomic_resp; 378*4882a593Smuzhiyun u8 max_rd_atomic_req; 379*4882a593Smuzhiyun u32 ack_timeout; 380*4882a593Smuzhiyun u8 retry_cnt; 381*4882a593Smuzhiyun u8 rnr_retry_cnt; 382*4882a593Smuzhiyun u8 min_rnr_nak_timer; 383*4882a593Smuzhiyun bool sqd_async; 384*4882a593Smuzhiyun u8 remote_mac_addr[6]; 385*4882a593Smuzhiyun u8 local_mac_addr[6]; 386*4882a593Smuzhiyun bool use_local_mac; 387*4882a593Smuzhiyun enum roce_mode roce_mode; 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun struct qed_rdma_query_qp_out_params { 391*4882a593Smuzhiyun enum qed_roce_qp_state state; 392*4882a593Smuzhiyun u32 rq_psn; 393*4882a593Smuzhiyun u32 sq_psn; 394*4882a593Smuzhiyun bool draining; 395*4882a593Smuzhiyun u16 mtu; 396*4882a593Smuzhiyun u32 dest_qp; 397*4882a593Smuzhiyun bool incoming_rdma_read_en; 398*4882a593Smuzhiyun bool incoming_rdma_write_en; 399*4882a593Smuzhiyun bool incoming_atomic_en; 400*4882a593Smuzhiyun bool e2e_flow_control_en; 401*4882a593Smuzhiyun union qed_gid sgid; 402*4882a593Smuzhiyun union qed_gid dgid; 403*4882a593Smuzhiyun u32 flow_label; 404*4882a593Smuzhiyun u8 hop_limit_ttl; 405*4882a593Smuzhiyun u8 traffic_class_tos; 406*4882a593Smuzhiyun u32 timeout; 407*4882a593Smuzhiyun u8 rnr_retry; 408*4882a593Smuzhiyun u8 retry_cnt; 409*4882a593Smuzhiyun u8 min_rnr_nak_timer; 410*4882a593Smuzhiyun u16 pkey_index; 411*4882a593Smuzhiyun u8 max_rd_atomic; 412*4882a593Smuzhiyun u8 max_dest_rd_atomic; 413*4882a593Smuzhiyun bool sqd_async; 414*4882a593Smuzhiyun }; 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun struct qed_rdma_create_srq_out_params { 417*4882a593Smuzhiyun u16 srq_id; 418*4882a593Smuzhiyun }; 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun struct qed_rdma_destroy_srq_in_params { 421*4882a593Smuzhiyun u16 srq_id; 422*4882a593Smuzhiyun bool is_xrc; 423*4882a593Smuzhiyun }; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun struct qed_rdma_modify_srq_in_params { 426*4882a593Smuzhiyun u32 wqe_limit; 427*4882a593Smuzhiyun u16 srq_id; 428*4882a593Smuzhiyun bool is_xrc; 429*4882a593Smuzhiyun }; 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun struct qed_rdma_stats_out_params { 432*4882a593Smuzhiyun u64 sent_bytes; 433*4882a593Smuzhiyun u64 sent_pkts; 434*4882a593Smuzhiyun u64 rcv_bytes; 435*4882a593Smuzhiyun u64 rcv_pkts; 436*4882a593Smuzhiyun }; 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun struct qed_rdma_counters_out_params { 439*4882a593Smuzhiyun u64 pd_count; 440*4882a593Smuzhiyun u64 max_pd; 441*4882a593Smuzhiyun u64 dpi_count; 442*4882a593Smuzhiyun u64 max_dpi; 443*4882a593Smuzhiyun u64 cq_count; 444*4882a593Smuzhiyun u64 max_cq; 445*4882a593Smuzhiyun u64 qp_count; 446*4882a593Smuzhiyun u64 max_qp; 447*4882a593Smuzhiyun u64 tid_count; 448*4882a593Smuzhiyun u64 max_tid; 449*4882a593Smuzhiyun }; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun #define QED_ROCE_TX_HEAD_FAILURE (1) 452*4882a593Smuzhiyun #define QED_ROCE_TX_FRAG_FAILURE (2) 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun enum qed_iwarp_event_type { 455*4882a593Smuzhiyun QED_IWARP_EVENT_MPA_REQUEST, /* Passive side request received */ 456*4882a593Smuzhiyun QED_IWARP_EVENT_PASSIVE_COMPLETE, /* ack on mpa response */ 457*4882a593Smuzhiyun QED_IWARP_EVENT_ACTIVE_COMPLETE, /* Active side reply received */ 458*4882a593Smuzhiyun QED_IWARP_EVENT_DISCONNECT, 459*4882a593Smuzhiyun QED_IWARP_EVENT_CLOSE, 460*4882a593Smuzhiyun QED_IWARP_EVENT_IRQ_FULL, 461*4882a593Smuzhiyun QED_IWARP_EVENT_RQ_EMPTY, 462*4882a593Smuzhiyun QED_IWARP_EVENT_LLP_TIMEOUT, 463*4882a593Smuzhiyun QED_IWARP_EVENT_REMOTE_PROTECTION_ERROR, 464*4882a593Smuzhiyun QED_IWARP_EVENT_CQ_OVERFLOW, 465*4882a593Smuzhiyun QED_IWARP_EVENT_QP_CATASTROPHIC, 466*4882a593Smuzhiyun QED_IWARP_EVENT_ACTIVE_MPA_REPLY, 467*4882a593Smuzhiyun QED_IWARP_EVENT_LOCAL_ACCESS_ERROR, 468*4882a593Smuzhiyun QED_IWARP_EVENT_REMOTE_OPERATION_ERROR, 469*4882a593Smuzhiyun QED_IWARP_EVENT_TERMINATE_RECEIVED, 470*4882a593Smuzhiyun QED_IWARP_EVENT_SRQ_LIMIT, 471*4882a593Smuzhiyun QED_IWARP_EVENT_SRQ_EMPTY, 472*4882a593Smuzhiyun }; 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun enum qed_tcp_ip_version { 475*4882a593Smuzhiyun QED_TCP_IPV4, 476*4882a593Smuzhiyun QED_TCP_IPV6, 477*4882a593Smuzhiyun }; 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun struct qed_iwarp_cm_info { 480*4882a593Smuzhiyun enum qed_tcp_ip_version ip_version; 481*4882a593Smuzhiyun u32 remote_ip[4]; 482*4882a593Smuzhiyun u32 local_ip[4]; 483*4882a593Smuzhiyun u16 remote_port; 484*4882a593Smuzhiyun u16 local_port; 485*4882a593Smuzhiyun u16 vlan; 486*4882a593Smuzhiyun u8 ord; 487*4882a593Smuzhiyun u8 ird; 488*4882a593Smuzhiyun u16 private_data_len; 489*4882a593Smuzhiyun const void *private_data; 490*4882a593Smuzhiyun }; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun struct qed_iwarp_cm_event_params { 493*4882a593Smuzhiyun enum qed_iwarp_event_type event; 494*4882a593Smuzhiyun const struct qed_iwarp_cm_info *cm_info; 495*4882a593Smuzhiyun void *ep_context; /* To be passed to accept call */ 496*4882a593Smuzhiyun int status; 497*4882a593Smuzhiyun }; 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun typedef int (*iwarp_event_handler) (void *context, 500*4882a593Smuzhiyun struct qed_iwarp_cm_event_params *event); 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun struct qed_iwarp_connect_in { 503*4882a593Smuzhiyun iwarp_event_handler event_cb; 504*4882a593Smuzhiyun void *cb_context; 505*4882a593Smuzhiyun struct qed_rdma_qp *qp; 506*4882a593Smuzhiyun struct qed_iwarp_cm_info cm_info; 507*4882a593Smuzhiyun u16 mss; 508*4882a593Smuzhiyun u8 remote_mac_addr[ETH_ALEN]; 509*4882a593Smuzhiyun u8 local_mac_addr[ETH_ALEN]; 510*4882a593Smuzhiyun }; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun struct qed_iwarp_connect_out { 513*4882a593Smuzhiyun void *ep_context; 514*4882a593Smuzhiyun }; 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun struct qed_iwarp_listen_in { 517*4882a593Smuzhiyun iwarp_event_handler event_cb; 518*4882a593Smuzhiyun void *cb_context; /* passed to event_cb */ 519*4882a593Smuzhiyun u32 max_backlog; 520*4882a593Smuzhiyun enum qed_tcp_ip_version ip_version; 521*4882a593Smuzhiyun u32 ip_addr[4]; 522*4882a593Smuzhiyun u16 port; 523*4882a593Smuzhiyun u16 vlan; 524*4882a593Smuzhiyun }; 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun struct qed_iwarp_listen_out { 527*4882a593Smuzhiyun void *handle; 528*4882a593Smuzhiyun }; 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun struct qed_iwarp_accept_in { 531*4882a593Smuzhiyun void *ep_context; 532*4882a593Smuzhiyun void *cb_context; 533*4882a593Smuzhiyun struct qed_rdma_qp *qp; 534*4882a593Smuzhiyun const void *private_data; 535*4882a593Smuzhiyun u16 private_data_len; 536*4882a593Smuzhiyun u8 ord; 537*4882a593Smuzhiyun u8 ird; 538*4882a593Smuzhiyun }; 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun struct qed_iwarp_reject_in { 541*4882a593Smuzhiyun void *ep_context; 542*4882a593Smuzhiyun void *cb_context; 543*4882a593Smuzhiyun const void *private_data; 544*4882a593Smuzhiyun u16 private_data_len; 545*4882a593Smuzhiyun }; 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun struct qed_iwarp_send_rtr_in { 548*4882a593Smuzhiyun void *ep_context; 549*4882a593Smuzhiyun }; 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun struct qed_roce_ll2_header { 552*4882a593Smuzhiyun void *vaddr; 553*4882a593Smuzhiyun dma_addr_t baddr; 554*4882a593Smuzhiyun size_t len; 555*4882a593Smuzhiyun }; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun struct qed_roce_ll2_buffer { 558*4882a593Smuzhiyun dma_addr_t baddr; 559*4882a593Smuzhiyun size_t len; 560*4882a593Smuzhiyun }; 561*4882a593Smuzhiyun 562*4882a593Smuzhiyun struct qed_roce_ll2_packet { 563*4882a593Smuzhiyun struct qed_roce_ll2_header header; 564*4882a593Smuzhiyun int n_seg; 565*4882a593Smuzhiyun struct qed_roce_ll2_buffer payload[RDMA_MAX_SGE_PER_SQ_WQE]; 566*4882a593Smuzhiyun int roce_mode; 567*4882a593Smuzhiyun enum qed_ll2_tx_dest tx_dest; 568*4882a593Smuzhiyun }; 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun enum qed_rdma_type { 571*4882a593Smuzhiyun QED_RDMA_TYPE_ROCE, 572*4882a593Smuzhiyun QED_RDMA_TYPE_IWARP 573*4882a593Smuzhiyun }; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun struct qed_dev_rdma_info { 576*4882a593Smuzhiyun struct qed_dev_info common; 577*4882a593Smuzhiyun enum qed_rdma_type rdma_type; 578*4882a593Smuzhiyun u8 user_dpm_enabled; 579*4882a593Smuzhiyun }; 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun struct qed_rdma_ops { 582*4882a593Smuzhiyun const struct qed_common_ops *common; 583*4882a593Smuzhiyun 584*4882a593Smuzhiyun int (*fill_dev_info)(struct qed_dev *cdev, 585*4882a593Smuzhiyun struct qed_dev_rdma_info *info); 586*4882a593Smuzhiyun void *(*rdma_get_rdma_ctx)(struct qed_dev *cdev); 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun int (*rdma_init)(struct qed_dev *dev, 589*4882a593Smuzhiyun struct qed_rdma_start_in_params *iparams); 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun int (*rdma_add_user)(void *rdma_cxt, 592*4882a593Smuzhiyun struct qed_rdma_add_user_out_params *oparams); 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun void (*rdma_remove_user)(void *rdma_cxt, u16 dpi); 595*4882a593Smuzhiyun int (*rdma_stop)(void *rdma_cxt); 596*4882a593Smuzhiyun struct qed_rdma_device* (*rdma_query_device)(void *rdma_cxt); 597*4882a593Smuzhiyun struct qed_rdma_port* (*rdma_query_port)(void *rdma_cxt); 598*4882a593Smuzhiyun int (*rdma_get_start_sb)(struct qed_dev *cdev); 599*4882a593Smuzhiyun int (*rdma_get_min_cnq_msix)(struct qed_dev *cdev); 600*4882a593Smuzhiyun void (*rdma_cnq_prod_update)(void *rdma_cxt, u8 cnq_index, u16 prod); 601*4882a593Smuzhiyun int (*rdma_get_rdma_int)(struct qed_dev *cdev, 602*4882a593Smuzhiyun struct qed_int_info *info); 603*4882a593Smuzhiyun int (*rdma_set_rdma_int)(struct qed_dev *cdev, u16 cnt); 604*4882a593Smuzhiyun int (*rdma_alloc_pd)(void *rdma_cxt, u16 *pd); 605*4882a593Smuzhiyun void (*rdma_dealloc_pd)(void *rdma_cxt, u16 pd); 606*4882a593Smuzhiyun int (*rdma_alloc_xrcd)(void *rdma_cxt, u16 *xrcd); 607*4882a593Smuzhiyun void (*rdma_dealloc_xrcd)(void *rdma_cxt, u16 xrcd); 608*4882a593Smuzhiyun int (*rdma_create_cq)(void *rdma_cxt, 609*4882a593Smuzhiyun struct qed_rdma_create_cq_in_params *params, 610*4882a593Smuzhiyun u16 *icid); 611*4882a593Smuzhiyun int (*rdma_destroy_cq)(void *rdma_cxt, 612*4882a593Smuzhiyun struct qed_rdma_destroy_cq_in_params *iparams, 613*4882a593Smuzhiyun struct qed_rdma_destroy_cq_out_params *oparams); 614*4882a593Smuzhiyun struct qed_rdma_qp * 615*4882a593Smuzhiyun (*rdma_create_qp)(void *rdma_cxt, 616*4882a593Smuzhiyun struct qed_rdma_create_qp_in_params *iparams, 617*4882a593Smuzhiyun struct qed_rdma_create_qp_out_params *oparams); 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun int (*rdma_modify_qp)(void *roce_cxt, struct qed_rdma_qp *qp, 620*4882a593Smuzhiyun struct qed_rdma_modify_qp_in_params *iparams); 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun int (*rdma_query_qp)(void *rdma_cxt, struct qed_rdma_qp *qp, 623*4882a593Smuzhiyun struct qed_rdma_query_qp_out_params *oparams); 624*4882a593Smuzhiyun int (*rdma_destroy_qp)(void *rdma_cxt, struct qed_rdma_qp *qp); 625*4882a593Smuzhiyun 626*4882a593Smuzhiyun int 627*4882a593Smuzhiyun (*rdma_register_tid)(void *rdma_cxt, 628*4882a593Smuzhiyun struct qed_rdma_register_tid_in_params *iparams); 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun int (*rdma_deregister_tid)(void *rdma_cxt, u32 itid); 631*4882a593Smuzhiyun int (*rdma_alloc_tid)(void *rdma_cxt, u32 *itid); 632*4882a593Smuzhiyun void (*rdma_free_tid)(void *rdma_cxt, u32 itid); 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun int (*rdma_create_srq)(void *rdma_cxt, 635*4882a593Smuzhiyun struct qed_rdma_create_srq_in_params *iparams, 636*4882a593Smuzhiyun struct qed_rdma_create_srq_out_params *oparams); 637*4882a593Smuzhiyun int (*rdma_destroy_srq)(void *rdma_cxt, 638*4882a593Smuzhiyun struct qed_rdma_destroy_srq_in_params *iparams); 639*4882a593Smuzhiyun int (*rdma_modify_srq)(void *rdma_cxt, 640*4882a593Smuzhiyun struct qed_rdma_modify_srq_in_params *iparams); 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun int (*ll2_acquire_connection)(void *rdma_cxt, 643*4882a593Smuzhiyun struct qed_ll2_acquire_data *data); 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun int (*ll2_establish_connection)(void *rdma_cxt, u8 connection_handle); 646*4882a593Smuzhiyun int (*ll2_terminate_connection)(void *rdma_cxt, u8 connection_handle); 647*4882a593Smuzhiyun void (*ll2_release_connection)(void *rdma_cxt, u8 connection_handle); 648*4882a593Smuzhiyun 649*4882a593Smuzhiyun int (*ll2_prepare_tx_packet)(void *rdma_cxt, 650*4882a593Smuzhiyun u8 connection_handle, 651*4882a593Smuzhiyun struct qed_ll2_tx_pkt_info *pkt, 652*4882a593Smuzhiyun bool notify_fw); 653*4882a593Smuzhiyun 654*4882a593Smuzhiyun int (*ll2_set_fragment_of_tx_packet)(void *rdma_cxt, 655*4882a593Smuzhiyun u8 connection_handle, 656*4882a593Smuzhiyun dma_addr_t addr, 657*4882a593Smuzhiyun u16 nbytes); 658*4882a593Smuzhiyun int (*ll2_post_rx_buffer)(void *rdma_cxt, u8 connection_handle, 659*4882a593Smuzhiyun dma_addr_t addr, u16 buf_len, void *cookie, 660*4882a593Smuzhiyun u8 notify_fw); 661*4882a593Smuzhiyun int (*ll2_get_stats)(void *rdma_cxt, 662*4882a593Smuzhiyun u8 connection_handle, 663*4882a593Smuzhiyun struct qed_ll2_stats *p_stats); 664*4882a593Smuzhiyun int (*ll2_set_mac_filter)(struct qed_dev *cdev, 665*4882a593Smuzhiyun u8 *old_mac_address, u8 *new_mac_address); 666*4882a593Smuzhiyun 667*4882a593Smuzhiyun int (*iwarp_set_engine_affin)(struct qed_dev *cdev, bool b_reset); 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun int (*iwarp_connect)(void *rdma_cxt, 670*4882a593Smuzhiyun struct qed_iwarp_connect_in *iparams, 671*4882a593Smuzhiyun struct qed_iwarp_connect_out *oparams); 672*4882a593Smuzhiyun 673*4882a593Smuzhiyun int (*iwarp_create_listen)(void *rdma_cxt, 674*4882a593Smuzhiyun struct qed_iwarp_listen_in *iparams, 675*4882a593Smuzhiyun struct qed_iwarp_listen_out *oparams); 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun int (*iwarp_accept)(void *rdma_cxt, 678*4882a593Smuzhiyun struct qed_iwarp_accept_in *iparams); 679*4882a593Smuzhiyun 680*4882a593Smuzhiyun int (*iwarp_reject)(void *rdma_cxt, 681*4882a593Smuzhiyun struct qed_iwarp_reject_in *iparams); 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun int (*iwarp_destroy_listen)(void *rdma_cxt, void *handle); 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun int (*iwarp_send_rtr)(void *rdma_cxt, 686*4882a593Smuzhiyun struct qed_iwarp_send_rtr_in *iparams); 687*4882a593Smuzhiyun }; 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun const struct qed_rdma_ops *qed_get_rdma_ops(void); 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun #endif 692