linux/drivers/infiniband/hw/efa/efa_com_cmd.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
   2/*
   3 * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved.
   4 */
   5
   6#ifndef _EFA_COM_CMD_H_
   7#define _EFA_COM_CMD_H_
   8
   9#include "efa_com.h"
  10
  11#define EFA_GID_SIZE 16
  12
  13struct efa_com_create_qp_params {
  14        u64 rq_base_addr;
  15        u32 send_cq_idx;
  16        u32 recv_cq_idx;
  17        /*
  18         * Send descriptor ring size in bytes,
  19         * sufficient for user-provided number of WQEs and SGL size
  20         */
  21        u32 sq_ring_size_in_bytes;
  22        /* Max number of WQEs that will be posted on send queue */
  23        u32 sq_depth;
  24        /* Recv descriptor ring size in bytes */
  25        u32 rq_ring_size_in_bytes;
  26        u32 rq_depth;
  27        u16 pd;
  28        u16 uarn;
  29        u8 qp_type;
  30};
  31
  32struct efa_com_create_qp_result {
  33        u32 qp_handle;
  34        u32 qp_num;
  35        u32 sq_db_offset;
  36        u32 rq_db_offset;
  37        u32 llq_descriptors_offset;
  38        u16 send_sub_cq_idx;
  39        u16 recv_sub_cq_idx;
  40};
  41
  42struct efa_com_modify_qp_params {
  43        u32 modify_mask;
  44        u32 qp_handle;
  45        u32 qp_state;
  46        u32 cur_qp_state;
  47        u32 qkey;
  48        u32 sq_psn;
  49        u8 sq_drained_async_notify;
  50};
  51
  52struct efa_com_query_qp_params {
  53        u32 qp_handle;
  54};
  55
  56struct efa_com_query_qp_result {
  57        u32 qp_state;
  58        u32 qkey;
  59        u32 sq_draining;
  60        u32 sq_psn;
  61};
  62
  63struct efa_com_destroy_qp_params {
  64        u32 qp_handle;
  65};
  66
  67struct efa_com_create_cq_params {
  68        /* cq physical base address in OS memory */
  69        dma_addr_t dma_addr;
  70        /* completion queue depth in # of entries */
  71        u16 cq_depth;
  72        u16 num_sub_cqs;
  73        u16 uarn;
  74        u8 entry_size_in_bytes;
  75};
  76
  77struct efa_com_create_cq_result {
  78        /* cq identifier */
  79        u16 cq_idx;
  80        /* actual cq depth in # of entries */
  81        u16 actual_depth;
  82};
  83
  84struct efa_com_destroy_cq_params {
  85        u16 cq_idx;
  86};
  87
  88struct efa_com_create_ah_params {
  89        u16 pdn;
  90        /* Destination address in network byte order */
  91        u8 dest_addr[EFA_GID_SIZE];
  92};
  93
  94struct efa_com_create_ah_result {
  95        u16 ah;
  96};
  97
  98struct efa_com_destroy_ah_params {
  99        u16 ah;
 100        u16 pdn;
 101};
 102
 103struct efa_com_get_network_attr_result {
 104        u8 addr[EFA_GID_SIZE];
 105        u32 mtu;
 106};
 107
 108struct efa_com_get_device_attr_result {
 109        u64 page_size_cap;
 110        u64 max_mr_pages;
 111        u32 fw_version;
 112        u32 admin_api_version;
 113        u32 device_version;
 114        u32 supported_features;
 115        u32 phys_addr_width;
 116        u32 virt_addr_width;
 117        u32 max_qp;
 118        u32 max_sq_depth; /* wqes */
 119        u32 max_rq_depth; /* wqes */
 120        u32 max_cq;
 121        u32 max_cq_depth; /* cqes */
 122        u32 inline_buf_size;
 123        u32 max_mr;
 124        u32 max_pd;
 125        u32 max_ah;
 126        u32 max_llq_size;
 127        u16 sub_cqs_per_cq;
 128        u16 max_sq_sge;
 129        u16 max_rq_sge;
 130        u8 db_bar;
 131};
 132
 133struct efa_com_get_hw_hints_result {
 134        u16 mmio_read_timeout;
 135        u16 driver_watchdog_timeout;
 136        u16 admin_completion_timeout;
 137        u16 poll_interval;
 138        u32 reserved[4];
 139};
 140
 141struct efa_com_mem_addr {
 142        u32 mem_addr_low;
 143        u32 mem_addr_high;
 144};
 145
 146/* Used at indirect mode page list chunks for chaining */
 147struct efa_com_ctrl_buff_info {
 148        /* indicates length of the buffer pointed by control_buffer_address. */
 149        u32 length;
 150        /* points to control buffer (direct or indirect) */
 151        struct efa_com_mem_addr address;
 152};
 153
 154struct efa_com_reg_mr_params {
 155        /* Memory region length, in bytes. */
 156        u64 mr_length_in_bytes;
 157        /* IO Virtual Address associated with this MR. */
 158        u64 iova;
 159        /* words 8:15: Physical Buffer List, each element is page-aligned. */
 160        union {
 161                /*
 162                 * Inline array of physical addresses of app pages
 163                 * (optimization for short region reservations)
 164                 */
 165                u64 inline_pbl_array[4];
 166                /*
 167                 * Describes the next physically contiguous chunk of indirect
 168                 * page list. A page list contains physical addresses of command
 169                 * data pages. Data pages are 4KB; page list chunks are
 170                 * variable-sized.
 171                 */
 172                struct efa_com_ctrl_buff_info pbl;
 173        } pbl;
 174        /* number of pages in PBL (redundant, could be calculated) */
 175        u32 page_num;
 176        /* Protection Domain */
 177        u16 pd;
 178        /*
 179         * phys_page_size_shift - page size is (1 << phys_page_size_shift)
 180         * Page size is used for building the Virtual to Physical
 181         * address mapping
 182         */
 183        u8 page_shift;
 184        /*
 185         * permissions
 186         * 0: local_write_enable - Write permissions: value of 1 needed
 187         * for RQ buffers and for RDMA write:1: reserved1 - remote
 188         * access flags, etc
 189         */
 190        u8 permissions;
 191        u8 inline_pbl;
 192        u8 indirect;
 193};
 194
 195struct efa_com_reg_mr_result {
 196        /*
 197         * To be used in conjunction with local buffers references in SQ and
 198         * RQ WQE
 199         */
 200        u32 l_key;
 201        /*
 202         * To be used in incoming RDMA semantics messages to refer to remotely
 203         * accessed memory region
 204         */
 205        u32 r_key;
 206};
 207
 208struct efa_com_dereg_mr_params {
 209        u32 l_key;
 210};
 211
 212struct efa_com_alloc_pd_result {
 213        u16 pdn;
 214};
 215
 216struct efa_com_dealloc_pd_params {
 217        u16 pdn;
 218};
 219
 220struct efa_com_alloc_uar_result {
 221        u16 uarn;
 222};
 223
 224struct efa_com_dealloc_uar_params {
 225        u16 uarn;
 226};
 227
 228void efa_com_set_dma_addr(dma_addr_t addr, u32 *addr_high, u32 *addr_low);
 229int efa_com_create_qp(struct efa_com_dev *edev,
 230                      struct efa_com_create_qp_params *params,
 231                      struct efa_com_create_qp_result *res);
 232int efa_com_modify_qp(struct efa_com_dev *edev,
 233                      struct efa_com_modify_qp_params *params);
 234int efa_com_query_qp(struct efa_com_dev *edev,
 235                     struct efa_com_query_qp_params *params,
 236                     struct efa_com_query_qp_result *result);
 237int efa_com_destroy_qp(struct efa_com_dev *edev,
 238                       struct efa_com_destroy_qp_params *params);
 239int efa_com_create_cq(struct efa_com_dev *edev,
 240                      struct efa_com_create_cq_params *params,
 241                      struct efa_com_create_cq_result *result);
 242int efa_com_destroy_cq(struct efa_com_dev *edev,
 243                       struct efa_com_destroy_cq_params *params);
 244int efa_com_register_mr(struct efa_com_dev *edev,
 245                        struct efa_com_reg_mr_params *params,
 246                        struct efa_com_reg_mr_result *result);
 247int efa_com_dereg_mr(struct efa_com_dev *edev,
 248                     struct efa_com_dereg_mr_params *params);
 249int efa_com_create_ah(struct efa_com_dev *edev,
 250                      struct efa_com_create_ah_params *params,
 251                      struct efa_com_create_ah_result *result);
 252int efa_com_destroy_ah(struct efa_com_dev *edev,
 253                       struct efa_com_destroy_ah_params *params);
 254int efa_com_get_network_attr(struct efa_com_dev *edev,
 255                             struct efa_com_get_network_attr_result *result);
 256int efa_com_get_device_attr(struct efa_com_dev *edev,
 257                            struct efa_com_get_device_attr_result *result);
 258int efa_com_get_hw_hints(struct efa_com_dev *edev,
 259                         struct efa_com_get_hw_hints_result *result);
 260int efa_com_set_aenq_config(struct efa_com_dev *edev, u32 groups);
 261int efa_com_alloc_pd(struct efa_com_dev *edev,
 262                     struct efa_com_alloc_pd_result *result);
 263int efa_com_dealloc_pd(struct efa_com_dev *edev,
 264                       struct efa_com_dealloc_pd_params *params);
 265int efa_com_alloc_uar(struct efa_com_dev *edev,
 266                      struct efa_com_alloc_uar_result *result);
 267int efa_com_dealloc_uar(struct efa_com_dev *edev,
 268                        struct efa_com_dealloc_uar_params *params);
 269
 270#endif /* _EFA_COM_CMD_H_ */
 271