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