1195609Smp/* SPDX-License-Identifier: GPL-2.0-only */ 259243Sobrien/* 359243Sobrien * Copyright (c) 2022 Microsoft Corporation. All rights reserved. 459243Sobrien */ 559243Sobrien 659243Sobrien#ifndef _MANA_IB_H_ 759243Sobrien#define _MANA_IB_H_ 859243Sobrien 959243Sobrien#include <rdma/ib_verbs.h> 1059243Sobrien#include <rdma/ib_mad.h> 1159243Sobrien#include <rdma/ib_umem.h> 1259243Sobrien#include <rdma/mana-abi.h> 1359243Sobrien#include <rdma/uverbs_ioctl.h> 1459243Sobrien 1559243Sobrien#include <net/mana/mana.h> 1659243Sobrien 17100616Smp#define PAGE_SZ_BM \ 1859243Sobrien (SZ_4K | SZ_8K | SZ_16K | SZ_32K | SZ_64K | SZ_128K | SZ_256K | \ 1959243Sobrien SZ_512K | SZ_1M | SZ_2M) 2059243Sobrien 2159243Sobrien/* MANA doesn't have any limit for MR size */ 2259243Sobrien#define MANA_IB_MAX_MR_SIZE U64_MAX 2359243Sobrien 2459243Sobrien/* 2559243Sobrien * The hardware limit of number of MRs is greater than maximum number of MRs 2659243Sobrien * that can possibly represent in 24 bits 2759243Sobrien */ 2859243Sobrien#define MANA_IB_MAX_MR 0xFFFFFFu 2959243Sobrien 3059243Sobrienstruct mana_ib_adapter_caps { 3159243Sobrien u32 max_sq_id; 3259243Sobrien u32 max_rq_id; 3359243Sobrien u32 max_cq_id; 3459243Sobrien u32 max_qp_count; 35195609Smp u32 max_cq_count; 3659243Sobrien u32 max_mr_count; 3759243Sobrien u32 max_pd_count; 3859243Sobrien u32 max_inbound_read_limit; 3959243Sobrien u32 max_outbound_read_limit; 4069408Sache u32 mw_count; 4159243Sobrien u32 max_srq_count; 4269408Sache u32 max_qp_wr; 4359243Sobrien u32 max_send_sge_count; 44167465Smp u32 max_recv_sge_count; 45145479Smp u32 max_inline_data_size; 46145479Smp}; 47145479Smp 48145479Smpstruct mana_ib_dev { 4959243Sobrien struct ib_device ib_dev; 5059243Sobrien struct gdma_dev *gdma_dev; 5159243Sobrien struct mana_ib_adapter_caps adapter_caps; 5259243Sobrien}; 53145479Smp 54145479Smpstruct mana_ib_wq { 55145479Smp struct ib_wq ibwq; 5659243Sobrien struct ib_umem *umem; 5759243Sobrien int wqe; 5859243Sobrien u32 wq_buf_size; 59167465Smp u64 gdma_region; 60167465Smp u64 id; 61167465Smp mana_handle_t rx_object; 62167465Smp}; 63167465Smp 64167465Smpstruct mana_ib_pd { 65195609Smp struct ib_pd ibpd; 66167465Smp u32 pdn; 67167465Smp mana_handle_t pd_handle; 68167465Smp 69167465Smp /* Mutex for sharing access to vport_use_count */ 7059243Sobrien struct mutex vport_mutex; 71167465Smp int vport_use_count; 72167465Smp 7359243Sobrien bool tx_shortform_allowed; 74145479Smp u32 tx_vp_offset; 75167465Smp}; 7659243Sobrien 7759243Sobrienstruct mana_ib_mr { 7859243Sobrien struct ib_mr ibmr; 7959243Sobrien struct ib_umem *umem; 8059243Sobrien mana_handle_t mr_handle; 8159243Sobrien}; 8259243Sobrien 8359243Sobrienstruct mana_ib_cq { 8459243Sobrien struct ib_cq ibcq; 8559243Sobrien struct ib_umem *umem; 8659243Sobrien int cqe; 8759243Sobrien u64 gdma_region; 8859243Sobrien u64 id; 8959243Sobrien u32 comp_vector; 9059243Sobrien}; 9159243Sobrien 9259243Sobrienstruct mana_ib_qp { 9359243Sobrien struct ib_qp ibqp; 9459243Sobrien 9559243Sobrien /* Work queue info */ 9659243Sobrien struct ib_umem *sq_umem; 9759243Sobrien int sqe; 9859243Sobrien u64 sq_gdma_region; 9959243Sobrien u64 sq_id; 10059243Sobrien mana_handle_t tx_object; 10159243Sobrien 10259243Sobrien /* The port on the IB device, starting with 1 */ 10359243Sobrien u32 port; 10459243Sobrien}; 10559243Sobrien 10659243Sobrienstruct mana_ib_ucontext { 10759243Sobrien struct ib_ucontext ibucontext; 10859243Sobrien u32 doorbell; 10959243Sobrien}; 11059243Sobrien 11159243Sobrienstruct mana_ib_rwq_ind_table { 11259243Sobrien struct ib_rwq_ind_table ib_ind_table; 11359243Sobrien}; 11459243Sobrien 11559243Sobrienenum mana_ib_command_code { 11659243Sobrien MANA_IB_GET_ADAPTER_CAP = 0x30001, 11759243Sobrien}; 11859243Sobrien 11959243Sobrienstruct mana_ib_query_adapter_caps_req { 12059243Sobrien struct gdma_req_hdr hdr; 12159243Sobrien}; /*HW Data */ 12259243Sobrien 12359243Sobrienstruct mana_ib_query_adapter_caps_resp { 12459243Sobrien struct gdma_resp_hdr hdr; 12559243Sobrien u32 max_sq_id; 12659243Sobrien u32 max_rq_id; 12759243Sobrien u32 max_cq_id; 12869408Sache u32 max_qp_count; 12959243Sobrien u32 max_cq_count; 13069408Sache u32 max_mr_count; 13159243Sobrien u32 max_pd_count; 13259243Sobrien u32 max_inbound_read_limit; 13359243Sobrien u32 max_outbound_read_limit; 13459243Sobrien u32 mw_count; 135167465Smp u32 max_srq_count; 13659243Sobrien u32 max_requester_sq_size; 13759243Sobrien u32 max_responder_sq_size; 13859243Sobrien u32 max_requester_rq_size; 13959243Sobrien u32 max_responder_rq_size; 14059243Sobrien u32 max_send_sge_count; 14159243Sobrien u32 max_recv_sge_count; 14259243Sobrien u32 max_inline_data_size; 14359243Sobrien}; /* HW Data */ 14459243Sobrien 14559243Sobrienstatic inline struct gdma_context *mdev_to_gc(struct mana_ib_dev *mdev) 14659243Sobrien{ 14759243Sobrien return mdev->gdma_dev->gdma_context; 14859243Sobrien} 14959243Sobrien 15059243Sobrienstatic inline struct net_device *mana_ib_get_netdev(struct ib_device *ibdev, u32 port) 151167465Smp{ 15259243Sobrien struct mana_ib_dev *mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); 153145479Smp struct gdma_context *gc = mdev_to_gc(mdev); 154145479Smp struct mana_context *mc = gc->mana.driver_data; 15559243Sobrien 15659243Sobrien if (port < 1 || port > mc->num_ports) 157167465Smp return NULL; 15859243Sobrien return mc->ports[port - 1]; 15959243Sobrien} 16059243Sobrien 16159243Sobrienint mana_ib_install_cq_cb(struct mana_ib_dev *mdev, struct mana_ib_cq *cq); 16259243Sobrien 163167465Smpint mana_ib_create_zero_offset_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem, 16459243Sobrien mana_handle_t *gdma_region); 165167465Smp 166167465Smpint mana_ib_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem, 167167465Smp mana_handle_t *gdma_region, u64 virt); 16859243Sobrien 16959243Sobrienint mana_ib_gd_destroy_dma_region(struct mana_ib_dev *dev, 17059243Sobrien mana_handle_t gdma_region); 17159243Sobrien 17259243Sobrienstruct ib_wq *mana_ib_create_wq(struct ib_pd *pd, 17359243Sobrien struct ib_wq_init_attr *init_attr, 17459243Sobrien struct ib_udata *udata); 17559243Sobrien 17659243Sobrienint mana_ib_modify_wq(struct ib_wq *wq, struct ib_wq_attr *wq_attr, 177167465Smp u32 wq_attr_mask, struct ib_udata *udata); 17859243Sobrien 17959243Sobrienint mana_ib_destroy_wq(struct ib_wq *ibwq, struct ib_udata *udata); 18059243Sobrien 18159243Sobrienint mana_ib_create_rwq_ind_table(struct ib_rwq_ind_table *ib_rwq_ind_table, 18259243Sobrien struct ib_rwq_ind_table_init_attr *init_attr, 183167465Smp struct ib_udata *udata); 18459243Sobrien 18559243Sobrienint mana_ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *ib_rwq_ind_tbl); 18659243Sobrien 18759243Sobrienstruct ib_mr *mana_ib_get_dma_mr(struct ib_pd *ibpd, int access_flags); 18859243Sobrien 18959243Sobrienstruct ib_mr *mana_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 19059243Sobrien u64 iova, int access_flags, 191167465Smp struct ib_udata *udata); 19259243Sobrien 19359243Sobrienint mana_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata); 19459243Sobrien 19559243Sobrienint mana_ib_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *qp_init_attr, 19659243Sobrien struct ib_udata *udata); 19759243Sobrien 19859243Sobrienint mana_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 19959243Sobrien int attr_mask, struct ib_udata *udata); 200167465Smp 20159243Sobrienint mana_ib_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata); 20259243Sobrien 20359243Sobrienint mana_ib_cfg_vport(struct mana_ib_dev *dev, u32 port_id, 20459243Sobrien struct mana_ib_pd *pd, u32 doorbell_id); 20559243Sobrienvoid mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd, 20659243Sobrien u32 port); 20759243Sobrien 20859243Sobrienint mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 20959243Sobrien struct ib_udata *udata); 21059243Sobrien 21159243Sobrienint mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); 21259243Sobrien 213167465Smpint mana_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata); 21459243Sobrienint mana_ib_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata); 21559243Sobrien 21659243Sobrienint mana_ib_alloc_ucontext(struct ib_ucontext *ibcontext, 21759243Sobrien struct ib_udata *udata); 21859243Sobrienvoid mana_ib_dealloc_ucontext(struct ib_ucontext *ibcontext); 21959243Sobrien 22059243Sobrienint mana_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma); 221167465Smp 22259243Sobrienint mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num, 223167465Smp struct ib_port_immutable *immutable); 22459243Sobrienint mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 225145479Smp struct ib_udata *uhw); 22659243Sobrienint mana_ib_query_port(struct ib_device *ibdev, u32 port, 22759243Sobrien struct ib_port_attr *props); 22859243Sobrienint mana_ib_query_gid(struct ib_device *ibdev, u32 port, int index, 22959243Sobrien union ib_gid *gid); 230167465Smp 231167465Smpvoid mana_ib_disassociate_ucontext(struct ib_ucontext *ibcontext); 232167465Smp 23359243Sobrienint mana_ib_gd_query_adapter_caps(struct mana_ib_dev *mdev); 23459243Sobrien#endif 235167465Smp