1cd9b3d59SGal Pressman /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2cd9b3d59SGal Pressman /* 3*113383efSMichael Margolin * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4cd9b3d59SGal Pressman */ 5cd9b3d59SGal Pressman 6cd9b3d59SGal Pressman #ifndef _EFA_COM_CMD_H_ 7cd9b3d59SGal Pressman #define _EFA_COM_CMD_H_ 8cd9b3d59SGal Pressman 9cd9b3d59SGal Pressman #include "efa_com.h" 10cd9b3d59SGal Pressman 11cd9b3d59SGal Pressman #define EFA_GID_SIZE 16 12cd9b3d59SGal Pressman 13cd9b3d59SGal Pressman struct efa_com_create_qp_params { 14cd9b3d59SGal Pressman u64 rq_base_addr; 15cd9b3d59SGal Pressman u32 send_cq_idx; 16cd9b3d59SGal Pressman u32 recv_cq_idx; 17cd9b3d59SGal Pressman /* 18cd9b3d59SGal Pressman * Send descriptor ring size in bytes, 19cd9b3d59SGal Pressman * sufficient for user-provided number of WQEs and SGL size 20cd9b3d59SGal Pressman */ 21cd9b3d59SGal Pressman u32 sq_ring_size_in_bytes; 22cd9b3d59SGal Pressman /* Max number of WQEs that will be posted on send queue */ 23cd9b3d59SGal Pressman u32 sq_depth; 24cd9b3d59SGal Pressman /* Recv descriptor ring size in bytes */ 25cd9b3d59SGal Pressman u32 rq_ring_size_in_bytes; 26cd9b3d59SGal Pressman u32 rq_depth; 27cd9b3d59SGal Pressman u16 pd; 28cd9b3d59SGal Pressman u16 uarn; 29cd9b3d59SGal Pressman u8 qp_type; 30cd9b3d59SGal Pressman }; 31cd9b3d59SGal Pressman 32cd9b3d59SGal Pressman struct efa_com_create_qp_result { 33cd9b3d59SGal Pressman u32 qp_handle; 34cd9b3d59SGal Pressman u32 qp_num; 35cd9b3d59SGal Pressman u32 sq_db_offset; 36cd9b3d59SGal Pressman u32 rq_db_offset; 37cd9b3d59SGal Pressman u32 llq_descriptors_offset; 38cd9b3d59SGal Pressman u16 send_sub_cq_idx; 39cd9b3d59SGal Pressman u16 recv_sub_cq_idx; 40cd9b3d59SGal Pressman }; 41cd9b3d59SGal Pressman 42cd9b3d59SGal Pressman struct efa_com_modify_qp_params { 43cd9b3d59SGal Pressman u32 modify_mask; 44cd9b3d59SGal Pressman u32 qp_handle; 45cd9b3d59SGal Pressman u32 qp_state; 46cd9b3d59SGal Pressman u32 cur_qp_state; 47cd9b3d59SGal Pressman u32 qkey; 48cd9b3d59SGal Pressman u32 sq_psn; 49cd9b3d59SGal Pressman u8 sq_drained_async_notify; 50a4e6a1ddSGal Pressman u8 rnr_retry; 51cd9b3d59SGal Pressman }; 52cd9b3d59SGal Pressman 53cd9b3d59SGal Pressman struct efa_com_query_qp_params { 54cd9b3d59SGal Pressman u32 qp_handle; 55cd9b3d59SGal Pressman }; 56cd9b3d59SGal Pressman 57cd9b3d59SGal Pressman struct efa_com_query_qp_result { 58cd9b3d59SGal Pressman u32 qp_state; 59cd9b3d59SGal Pressman u32 qkey; 60cd9b3d59SGal Pressman u32 sq_draining; 61cd9b3d59SGal Pressman u32 sq_psn; 62a4e6a1ddSGal Pressman u8 rnr_retry; 63cd9b3d59SGal Pressman }; 64cd9b3d59SGal Pressman 65cd9b3d59SGal Pressman struct efa_com_destroy_qp_params { 66cd9b3d59SGal Pressman u32 qp_handle; 67cd9b3d59SGal Pressman }; 68cd9b3d59SGal Pressman 69cd9b3d59SGal Pressman struct efa_com_create_cq_params { 70cd9b3d59SGal Pressman /* cq physical base address in OS memory */ 71cd9b3d59SGal Pressman dma_addr_t dma_addr; 72cd9b3d59SGal Pressman /* completion queue depth in # of entries */ 73cd9b3d59SGal Pressman u16 cq_depth; 74cd9b3d59SGal Pressman u16 num_sub_cqs; 75cd9b3d59SGal Pressman u16 uarn; 762a152512SGal Pressman u16 eqn; 77cd9b3d59SGal Pressman u8 entry_size_in_bytes; 78dc13fbf7SMichael Margolin u8 interrupt_mode_enabled : 1; 79dc13fbf7SMichael Margolin u8 set_src_addr : 1; 80cd9b3d59SGal Pressman }; 81cd9b3d59SGal Pressman 82cd9b3d59SGal Pressman struct efa_com_create_cq_result { 83cd9b3d59SGal Pressman /* cq identifier */ 84cd9b3d59SGal Pressman u16 cq_idx; 85cd9b3d59SGal Pressman /* actual cq depth in # of entries */ 86cd9b3d59SGal Pressman u16 actual_depth; 872a152512SGal Pressman u32 db_off; 882a152512SGal Pressman bool db_valid; 89cd9b3d59SGal Pressman }; 90cd9b3d59SGal Pressman 91cd9b3d59SGal Pressman struct efa_com_destroy_cq_params { 92cd9b3d59SGal Pressman u16 cq_idx; 93cd9b3d59SGal Pressman }; 94cd9b3d59SGal Pressman 95cd9b3d59SGal Pressman struct efa_com_create_ah_params { 96cd9b3d59SGal Pressman u16 pdn; 97cd9b3d59SGal Pressman /* Destination address in network byte order */ 98cd9b3d59SGal Pressman u8 dest_addr[EFA_GID_SIZE]; 99cd9b3d59SGal Pressman }; 100cd9b3d59SGal Pressman 101cd9b3d59SGal Pressman struct efa_com_create_ah_result { 102cd9b3d59SGal Pressman u16 ah; 103cd9b3d59SGal Pressman }; 104cd9b3d59SGal Pressman 105cd9b3d59SGal Pressman struct efa_com_destroy_ah_params { 106cd9b3d59SGal Pressman u16 ah; 107cd9b3d59SGal Pressman u16 pdn; 108cd9b3d59SGal Pressman }; 109cd9b3d59SGal Pressman 110cd9b3d59SGal Pressman struct efa_com_get_device_attr_result { 111bcf7cc53SGal Pressman u8 addr[EFA_GID_SIZE]; 112cd9b3d59SGal Pressman u64 page_size_cap; 113cd9b3d59SGal Pressman u64 max_mr_pages; 114bcf7cc53SGal Pressman u32 mtu; 115cd9b3d59SGal Pressman u32 fw_version; 116cd9b3d59SGal Pressman u32 admin_api_version; 117cd9b3d59SGal Pressman u32 device_version; 118cd9b3d59SGal Pressman u32 supported_features; 119cd9b3d59SGal Pressman u32 phys_addr_width; 120cd9b3d59SGal Pressman u32 virt_addr_width; 121cd9b3d59SGal Pressman u32 max_qp; 122cd9b3d59SGal Pressman u32 max_sq_depth; /* wqes */ 123cd9b3d59SGal Pressman u32 max_rq_depth; /* wqes */ 124cd9b3d59SGal Pressman u32 max_cq; 125cd9b3d59SGal Pressman u32 max_cq_depth; /* cqes */ 126cd9b3d59SGal Pressman u32 inline_buf_size; 127cd9b3d59SGal Pressman u32 max_mr; 128cd9b3d59SGal Pressman u32 max_pd; 129cd9b3d59SGal Pressman u32 max_ah; 130cd9b3d59SGal Pressman u32 max_llq_size; 131666e8ff5SDaniel Kranzdorf u32 max_rdma_size; 132666e8ff5SDaniel Kranzdorf u32 device_caps; 1332a152512SGal Pressman u32 max_eq; 1342a152512SGal Pressman u32 max_eq_depth; 1352a152512SGal Pressman u32 event_bitmask; /* EQ events bitmask */ 136cd9b3d59SGal Pressman u16 sub_cqs_per_cq; 137cd9b3d59SGal Pressman u16 max_sq_sge; 138cd9b3d59SGal Pressman u16 max_rq_sge; 139666e8ff5SDaniel Kranzdorf u16 max_wr_rdma_sge; 140556c811fSGal Pressman u16 max_tx_batch; 141da2924bdSGal Pressman u16 min_sq_depth; 142cd9b3d59SGal Pressman u8 db_bar; 143cd9b3d59SGal Pressman }; 144cd9b3d59SGal Pressman 145cd9b3d59SGal Pressman struct efa_com_get_hw_hints_result { 146cd9b3d59SGal Pressman u16 mmio_read_timeout; 147cd9b3d59SGal Pressman u16 driver_watchdog_timeout; 148cd9b3d59SGal Pressman u16 admin_completion_timeout; 149cd9b3d59SGal Pressman u16 poll_interval; 150cd9b3d59SGal Pressman u32 reserved[4]; 151cd9b3d59SGal Pressman }; 152cd9b3d59SGal Pressman 153cd9b3d59SGal Pressman struct efa_com_mem_addr { 154cd9b3d59SGal Pressman u32 mem_addr_low; 155cd9b3d59SGal Pressman u32 mem_addr_high; 156cd9b3d59SGal Pressman }; 157cd9b3d59SGal Pressman 158cd9b3d59SGal Pressman /* Used at indirect mode page list chunks for chaining */ 159cd9b3d59SGal Pressman struct efa_com_ctrl_buff_info { 160cd9b3d59SGal Pressman /* indicates length of the buffer pointed by control_buffer_address. */ 161cd9b3d59SGal Pressman u32 length; 162cd9b3d59SGal Pressman /* points to control buffer (direct or indirect) */ 163cd9b3d59SGal Pressman struct efa_com_mem_addr address; 164cd9b3d59SGal Pressman }; 165cd9b3d59SGal Pressman 166cd9b3d59SGal Pressman struct efa_com_reg_mr_params { 167cd9b3d59SGal Pressman /* Memory region length, in bytes. */ 168cd9b3d59SGal Pressman u64 mr_length_in_bytes; 169cd9b3d59SGal Pressman /* IO Virtual Address associated with this MR. */ 170cd9b3d59SGal Pressman u64 iova; 171cd9b3d59SGal Pressman /* words 8:15: Physical Buffer List, each element is page-aligned. */ 172cd9b3d59SGal Pressman union { 173cd9b3d59SGal Pressman /* 174cd9b3d59SGal Pressman * Inline array of physical addresses of app pages 175cd9b3d59SGal Pressman * (optimization for short region reservations) 176cd9b3d59SGal Pressman */ 177cd9b3d59SGal Pressman u64 inline_pbl_array[4]; 178cd9b3d59SGal Pressman /* 179cd9b3d59SGal Pressman * Describes the next physically contiguous chunk of indirect 180cd9b3d59SGal Pressman * page list. A page list contains physical addresses of command 181cd9b3d59SGal Pressman * data pages. Data pages are 4KB; page list chunks are 182cd9b3d59SGal Pressman * variable-sized. 183cd9b3d59SGal Pressman */ 184cd9b3d59SGal Pressman struct efa_com_ctrl_buff_info pbl; 185cd9b3d59SGal Pressman } pbl; 186cd9b3d59SGal Pressman /* number of pages in PBL (redundant, could be calculated) */ 187cd9b3d59SGal Pressman u32 page_num; 188cd9b3d59SGal Pressman /* Protection Domain */ 189cd9b3d59SGal Pressman u16 pd; 190cd9b3d59SGal Pressman /* 191cd9b3d59SGal Pressman * phys_page_size_shift - page size is (1 << phys_page_size_shift) 192cd9b3d59SGal Pressman * Page size is used for building the Virtual to Physical 193cd9b3d59SGal Pressman * address mapping 194cd9b3d59SGal Pressman */ 195cd9b3d59SGal Pressman u8 page_shift; 196e6c4f3ffSDaniel Kranzdorf /* see permissions field of struct efa_admin_reg_mr_cmd */ 197cd9b3d59SGal Pressman u8 permissions; 198cd9b3d59SGal Pressman u8 inline_pbl; 199cd9b3d59SGal Pressman u8 indirect; 200cd9b3d59SGal Pressman }; 201cd9b3d59SGal Pressman 202cd9b3d59SGal Pressman struct efa_com_reg_mr_result { 203cd9b3d59SGal Pressman /* 204cd9b3d59SGal Pressman * To be used in conjunction with local buffers references in SQ and 205cd9b3d59SGal Pressman * RQ WQE 206cd9b3d59SGal Pressman */ 207cd9b3d59SGal Pressman u32 l_key; 208cd9b3d59SGal Pressman /* 209cd9b3d59SGal Pressman * To be used in incoming RDMA semantics messages to refer to remotely 210cd9b3d59SGal Pressman * accessed memory region 211cd9b3d59SGal Pressman */ 212cd9b3d59SGal Pressman u32 r_key; 213cd9b3d59SGal Pressman }; 214cd9b3d59SGal Pressman 215cd9b3d59SGal Pressman struct efa_com_dereg_mr_params { 216cd9b3d59SGal Pressman u32 l_key; 217cd9b3d59SGal Pressman }; 218cd9b3d59SGal Pressman 219cd9b3d59SGal Pressman struct efa_com_alloc_pd_result { 220cd9b3d59SGal Pressman u16 pdn; 221cd9b3d59SGal Pressman }; 222cd9b3d59SGal Pressman 223cd9b3d59SGal Pressman struct efa_com_dealloc_pd_params { 224cd9b3d59SGal Pressman u16 pdn; 225cd9b3d59SGal Pressman }; 226cd9b3d59SGal Pressman 227cd9b3d59SGal Pressman struct efa_com_alloc_uar_result { 228cd9b3d59SGal Pressman u16 uarn; 229cd9b3d59SGal Pressman }; 230cd9b3d59SGal Pressman 231cd9b3d59SGal Pressman struct efa_com_dealloc_uar_params { 232cd9b3d59SGal Pressman u16 uarn; 233cd9b3d59SGal Pressman }; 234cd9b3d59SGal Pressman 23516e9111eSGal Pressman struct efa_com_get_stats_params { 23616e9111eSGal Pressman /* see enum efa_admin_get_stats_type */ 23716e9111eSGal Pressman u8 type; 23816e9111eSGal Pressman /* see enum efa_admin_get_stats_scope */ 23916e9111eSGal Pressman u8 scope; 24016e9111eSGal Pressman u16 scope_modifier; 24116e9111eSGal Pressman }; 24216e9111eSGal Pressman 24316e9111eSGal Pressman struct efa_com_basic_stats { 24416e9111eSGal Pressman u64 tx_bytes; 24516e9111eSGal Pressman u64 tx_pkts; 24616e9111eSGal Pressman u64 rx_bytes; 24716e9111eSGal Pressman u64 rx_pkts; 24816e9111eSGal Pressman u64 rx_drops; 24916e9111eSGal Pressman }; 25016e9111eSGal Pressman 251b0cff387SDaniel Kranzdorf struct efa_com_messages_stats { 252b0cff387SDaniel Kranzdorf u64 send_bytes; 253b0cff387SDaniel Kranzdorf u64 send_wrs; 254b0cff387SDaniel Kranzdorf u64 recv_bytes; 255b0cff387SDaniel Kranzdorf u64 recv_wrs; 256b0cff387SDaniel Kranzdorf }; 257b0cff387SDaniel Kranzdorf 258b0cff387SDaniel Kranzdorf struct efa_com_rdma_read_stats { 259b0cff387SDaniel Kranzdorf u64 read_wrs; 260b0cff387SDaniel Kranzdorf u64 read_bytes; 261b0cff387SDaniel Kranzdorf u64 read_wr_err; 262b0cff387SDaniel Kranzdorf u64 read_resp_bytes; 263b0cff387SDaniel Kranzdorf }; 264b0cff387SDaniel Kranzdorf 265*113383efSMichael Margolin struct efa_com_rdma_write_stats { 266*113383efSMichael Margolin u64 write_wrs; 267*113383efSMichael Margolin u64 write_bytes; 268*113383efSMichael Margolin u64 write_wr_err; 269*113383efSMichael Margolin u64 write_recv_bytes; 270*113383efSMichael Margolin }; 271*113383efSMichael Margolin 27216e9111eSGal Pressman union efa_com_get_stats_result { 27316e9111eSGal Pressman struct efa_com_basic_stats basic_stats; 274b0cff387SDaniel Kranzdorf struct efa_com_messages_stats messages_stats; 275b0cff387SDaniel Kranzdorf struct efa_com_rdma_read_stats rdma_read_stats; 276*113383efSMichael Margolin struct efa_com_rdma_write_stats rdma_write_stats; 27716e9111eSGal Pressman }; 27816e9111eSGal Pressman 279cd9b3d59SGal Pressman int efa_com_create_qp(struct efa_com_dev *edev, 280cd9b3d59SGal Pressman struct efa_com_create_qp_params *params, 281cd9b3d59SGal Pressman struct efa_com_create_qp_result *res); 282cd9b3d59SGal Pressman int efa_com_modify_qp(struct efa_com_dev *edev, 283cd9b3d59SGal Pressman struct efa_com_modify_qp_params *params); 284cd9b3d59SGal Pressman int efa_com_query_qp(struct efa_com_dev *edev, 285cd9b3d59SGal Pressman struct efa_com_query_qp_params *params, 286cd9b3d59SGal Pressman struct efa_com_query_qp_result *result); 287cd9b3d59SGal Pressman int efa_com_destroy_qp(struct efa_com_dev *edev, 288cd9b3d59SGal Pressman struct efa_com_destroy_qp_params *params); 289cd9b3d59SGal Pressman int efa_com_create_cq(struct efa_com_dev *edev, 290cd9b3d59SGal Pressman struct efa_com_create_cq_params *params, 291cd9b3d59SGal Pressman struct efa_com_create_cq_result *result); 292cd9b3d59SGal Pressman int efa_com_destroy_cq(struct efa_com_dev *edev, 293cd9b3d59SGal Pressman struct efa_com_destroy_cq_params *params); 294cd9b3d59SGal Pressman int efa_com_register_mr(struct efa_com_dev *edev, 295cd9b3d59SGal Pressman struct efa_com_reg_mr_params *params, 296cd9b3d59SGal Pressman struct efa_com_reg_mr_result *result); 297cd9b3d59SGal Pressman int efa_com_dereg_mr(struct efa_com_dev *edev, 298cd9b3d59SGal Pressman struct efa_com_dereg_mr_params *params); 299cd9b3d59SGal Pressman int efa_com_create_ah(struct efa_com_dev *edev, 300cd9b3d59SGal Pressman struct efa_com_create_ah_params *params, 301cd9b3d59SGal Pressman struct efa_com_create_ah_result *result); 302cd9b3d59SGal Pressman int efa_com_destroy_ah(struct efa_com_dev *edev, 303cd9b3d59SGal Pressman struct efa_com_destroy_ah_params *params); 304cd9b3d59SGal Pressman int efa_com_get_device_attr(struct efa_com_dev *edev, 305cd9b3d59SGal Pressman struct efa_com_get_device_attr_result *result); 306cd9b3d59SGal Pressman int efa_com_get_hw_hints(struct efa_com_dev *edev, 307cd9b3d59SGal Pressman struct efa_com_get_hw_hints_result *result); 308e1ca01a9SGal Pressman bool 309e1ca01a9SGal Pressman efa_com_check_supported_feature_id(struct efa_com_dev *edev, 310e1ca01a9SGal Pressman enum efa_admin_aq_feature_id feature_id); 311e1ca01a9SGal Pressman int efa_com_set_feature_ex(struct efa_com_dev *edev, 312e1ca01a9SGal Pressman struct efa_admin_set_feature_resp *set_resp, 313e1ca01a9SGal Pressman struct efa_admin_set_feature_cmd *set_cmd, 314e1ca01a9SGal Pressman enum efa_admin_aq_feature_id feature_id, 315e1ca01a9SGal Pressman dma_addr_t control_buf_dma_addr, 316e1ca01a9SGal Pressman u32 control_buff_size); 317cd9b3d59SGal Pressman int efa_com_set_aenq_config(struct efa_com_dev *edev, u32 groups); 318cd9b3d59SGal Pressman int efa_com_alloc_pd(struct efa_com_dev *edev, 319cd9b3d59SGal Pressman struct efa_com_alloc_pd_result *result); 320cd9b3d59SGal Pressman int efa_com_dealloc_pd(struct efa_com_dev *edev, 321cd9b3d59SGal Pressman struct efa_com_dealloc_pd_params *params); 322cd9b3d59SGal Pressman int efa_com_alloc_uar(struct efa_com_dev *edev, 323cd9b3d59SGal Pressman struct efa_com_alloc_uar_result *result); 324cd9b3d59SGal Pressman int efa_com_dealloc_uar(struct efa_com_dev *edev, 325cd9b3d59SGal Pressman struct efa_com_dealloc_uar_params *params); 32616e9111eSGal Pressman int efa_com_get_stats(struct efa_com_dev *edev, 32716e9111eSGal Pressman struct efa_com_get_stats_params *params, 32816e9111eSGal Pressman union efa_com_get_stats_result *result); 329cd9b3d59SGal Pressman 330cd9b3d59SGal Pressman #endif /* _EFA_COM_CMD_H_ */ 331