xref: /openbmc/linux/drivers/infiniband/hw/efa/efa.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1853f5652SGal Pressman /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
2853f5652SGal Pressman /*
30043dbcfSGal Pressman  * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
4853f5652SGal Pressman  */
5853f5652SGal Pressman 
6853f5652SGal Pressman #ifndef _EFA_H_
7853f5652SGal Pressman #define _EFA_H_
8853f5652SGal Pressman 
9853f5652SGal Pressman #include <linux/bitops.h>
10853f5652SGal Pressman #include <linux/interrupt.h>
11853f5652SGal Pressman #include <linux/pci.h>
12853f5652SGal Pressman 
13853f5652SGal Pressman #include <rdma/efa-abi.h>
14853f5652SGal Pressman #include <rdma/ib_verbs.h>
15853f5652SGal Pressman 
16853f5652SGal Pressman #include "efa_com_cmd.h"
17853f5652SGal Pressman 
18853f5652SGal Pressman #define DRV_MODULE_NAME         "efa"
19853f5652SGal Pressman #define DEVICE_NAME             "Elastic Fabric Adapter (EFA)"
20853f5652SGal Pressman 
21853f5652SGal Pressman #define EFA_IRQNAME_SIZE        40
22853f5652SGal Pressman 
23853f5652SGal Pressman #define EFA_MGMNT_MSIX_VEC_IDX            0
242a152512SGal Pressman #define EFA_COMP_EQS_VEC_BASE             1
25853f5652SGal Pressman 
26853f5652SGal Pressman struct efa_irq {
27853f5652SGal Pressman 	irq_handler_t handler;
28853f5652SGal Pressman 	void *data;
29273691c3SGal Pressman 	u32 irqn;
302a152512SGal Pressman 	u32 vector;
31853f5652SGal Pressman 	cpumask_t affinity_hint_mask;
32853f5652SGal Pressman 	char name[EFA_IRQNAME_SIZE];
33853f5652SGal Pressman };
34853f5652SGal Pressman 
35215b88acSGal Pressman /* Don't use anything other than atomic64 */
36215b88acSGal Pressman struct efa_stats {
37853f5652SGal Pressman 	atomic64_t alloc_pd_err;
38853f5652SGal Pressman 	atomic64_t create_qp_err;
39853f5652SGal Pressman 	atomic64_t create_cq_err;
40853f5652SGal Pressman 	atomic64_t reg_mr_err;
41853f5652SGal Pressman 	atomic64_t alloc_ucontext_err;
42853f5652SGal Pressman 	atomic64_t create_ah_err;
43eca5757fSGal Pressman 	atomic64_t mmap_err;
44853f5652SGal Pressman 	atomic64_t keep_alive_rcvd;
45853f5652SGal Pressman };
46853f5652SGal Pressman 
47853f5652SGal Pressman struct efa_dev {
48853f5652SGal Pressman 	struct ib_device ibdev;
49853f5652SGal Pressman 	struct efa_com_dev edev;
50853f5652SGal Pressman 	struct pci_dev *pdev;
51853f5652SGal Pressman 	struct efa_com_get_device_attr_result dev_attr;
52853f5652SGal Pressman 
53853f5652SGal Pressman 	u64 reg_bar_addr;
54853f5652SGal Pressman 	u64 reg_bar_len;
55853f5652SGal Pressman 	u64 mem_bar_addr;
56853f5652SGal Pressman 	u64 mem_bar_len;
57853f5652SGal Pressman 	u64 db_bar_addr;
58853f5652SGal Pressman 	u64 db_bar_len;
59853f5652SGal Pressman 
60853f5652SGal Pressman 	int admin_msix_vector_idx;
61853f5652SGal Pressman 	struct efa_irq admin_irq;
62853f5652SGal Pressman 
63853f5652SGal Pressman 	struct efa_stats stats;
642a152512SGal Pressman 
652a152512SGal Pressman 	/* Array of completion EQs */
662a152512SGal Pressman 	struct efa_eq *eqs;
672a152512SGal Pressman 	unsigned int neqs;
682a152512SGal Pressman 
692a152512SGal Pressman 	/* Only stores CQs with interrupts enabled */
702a152512SGal Pressman 	struct xarray cqs_xa;
71853f5652SGal Pressman };
72853f5652SGal Pressman 
73853f5652SGal Pressman struct efa_ucontext {
74853f5652SGal Pressman 	struct ib_ucontext ibucontext;
75853f5652SGal Pressman 	u16 uarn;
76853f5652SGal Pressman };
77853f5652SGal Pressman 
78853f5652SGal Pressman struct efa_pd {
79853f5652SGal Pressman 	struct ib_pd ibpd;
80853f5652SGal Pressman 	u16 pdn;
81853f5652SGal Pressman };
82853f5652SGal Pressman 
83853f5652SGal Pressman struct efa_mr {
84853f5652SGal Pressman 	struct ib_mr ibmr;
85853f5652SGal Pressman 	struct ib_umem *umem;
86853f5652SGal Pressman };
87853f5652SGal Pressman 
88853f5652SGal Pressman struct efa_cq {
89853f5652SGal Pressman 	struct ib_cq ibcq;
90853f5652SGal Pressman 	struct efa_ucontext *ucontext;
91853f5652SGal Pressman 	dma_addr_t dma_addr;
92853f5652SGal Pressman 	void *cpu_addr;
93e84d3c18SMichal Kalderon 	struct rdma_user_mmap_entry *mmap_entry;
942a152512SGal Pressman 	struct rdma_user_mmap_entry *db_mmap_entry;
95853f5652SGal Pressman 	size_t size;
96853f5652SGal Pressman 	u16 cq_idx;
972a152512SGal Pressman 	/* NULL when no interrupts requested */
982a152512SGal Pressman 	struct efa_eq *eq;
99853f5652SGal Pressman };
100853f5652SGal Pressman 
101853f5652SGal Pressman struct efa_qp {
102853f5652SGal Pressman 	struct ib_qp ibqp;
103853f5652SGal Pressman 	dma_addr_t rq_dma_addr;
104853f5652SGal Pressman 	void *rq_cpu_addr;
105853f5652SGal Pressman 	size_t rq_size;
106853f5652SGal Pressman 	enum ib_qp_state state;
107e84d3c18SMichal Kalderon 
108e84d3c18SMichal Kalderon 	/* Used for saving mmap_xa entries */
109e84d3c18SMichal Kalderon 	struct rdma_user_mmap_entry *sq_db_mmap_entry;
110e84d3c18SMichal Kalderon 	struct rdma_user_mmap_entry *llq_desc_mmap_entry;
111e84d3c18SMichal Kalderon 	struct rdma_user_mmap_entry *rq_db_mmap_entry;
112e84d3c18SMichal Kalderon 	struct rdma_user_mmap_entry *rq_mmap_entry;
113e84d3c18SMichal Kalderon 
114853f5652SGal Pressman 	u32 qp_handle;
115853f5652SGal Pressman 	u32 max_send_wr;
116853f5652SGal Pressman 	u32 max_recv_wr;
117853f5652SGal Pressman 	u32 max_send_sge;
118853f5652SGal Pressman 	u32 max_recv_sge;
119853f5652SGal Pressman 	u32 max_inline_data;
120853f5652SGal Pressman };
121853f5652SGal Pressman 
122853f5652SGal Pressman struct efa_ah {
123853f5652SGal Pressman 	struct ib_ah ibah;
124853f5652SGal Pressman 	u16 ah;
125853f5652SGal Pressman 	/* dest_addr */
126853f5652SGal Pressman 	u8 id[EFA_GID_SIZE];
127853f5652SGal Pressman };
128853f5652SGal Pressman 
1292a152512SGal Pressman struct efa_eq {
1302a152512SGal Pressman 	struct efa_com_eq eeq;
1312a152512SGal Pressman 	struct efa_irq irq;
1322a152512SGal Pressman };
1332a152512SGal Pressman 
134853f5652SGal Pressman int efa_query_device(struct ib_device *ibdev,
135853f5652SGal Pressman 		     struct ib_device_attr *props,
136853f5652SGal Pressman 		     struct ib_udata *udata);
1371fb7f897SMark Bloch int efa_query_port(struct ib_device *ibdev, u32 port,
138853f5652SGal Pressman 		   struct ib_port_attr *props);
139853f5652SGal Pressman int efa_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
140853f5652SGal Pressman 		 int qp_attr_mask,
141853f5652SGal Pressman 		 struct ib_qp_init_attr *qp_init_attr);
1421fb7f897SMark Bloch int efa_query_gid(struct ib_device *ibdev, u32 port, int index,
143853f5652SGal Pressman 		  union ib_gid *gid);
1441fb7f897SMark Bloch int efa_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
145853f5652SGal Pressman 		   u16 *pkey);
146853f5652SGal Pressman int efa_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
14791a7c58fSLeon Romanovsky int efa_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
148853f5652SGal Pressman int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
149514aee66SLeon Romanovsky int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr,
150853f5652SGal Pressman 		  struct ib_udata *udata);
15143d781b9SLeon Romanovsky int efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
152e39afe3dSLeon Romanovsky int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
153853f5652SGal Pressman 		  struct ib_udata *udata);
154853f5652SGal Pressman struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
155853f5652SGal Pressman 			 u64 virt_addr, int access_flags,
156853f5652SGal Pressman 			 struct ib_udata *udata);
157*66f4817bSGal Pressman struct ib_mr *efa_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start,
158*66f4817bSGal Pressman 				     u64 length, u64 virt_addr,
159*66f4817bSGal Pressman 				     int fd, int access_flags,
160*66f4817bSGal Pressman 				     struct ib_udata *udata);
161853f5652SGal Pressman int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
1621fb7f897SMark Bloch int efa_get_port_immutable(struct ib_device *ibdev, u32 port_num,
163853f5652SGal Pressman 			   struct ib_port_immutable *immutable);
164853f5652SGal Pressman int efa_alloc_ucontext(struct ib_ucontext *ibucontext, struct ib_udata *udata);
165853f5652SGal Pressman void efa_dealloc_ucontext(struct ib_ucontext *ibucontext);
166853f5652SGal Pressman int efa_mmap(struct ib_ucontext *ibucontext,
167853f5652SGal Pressman 	     struct vm_area_struct *vma);
168e84d3c18SMichal Kalderon void efa_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
169853f5652SGal Pressman int efa_create_ah(struct ib_ah *ibah,
170fa5d010cSMaor Gottlieb 		  struct rdma_ah_init_attr *init_attr,
171853f5652SGal Pressman 		  struct ib_udata *udata);
1729a9ebf8cSLeon Romanovsky int efa_destroy_ah(struct ib_ah *ibah, u32 flags);
173853f5652SGal Pressman int efa_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
174853f5652SGal Pressman 		  int qp_attr_mask, struct ib_udata *udata);
175853f5652SGal Pressman enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
1761fb7f897SMark Bloch 					 u32 port_num);
1774b5f4d3fSJason Gunthorpe struct rdma_hw_stats *efa_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num);
1784b5f4d3fSJason Gunthorpe struct rdma_hw_stats *efa_alloc_hw_device_stats(struct ib_device *ibdev);
17916e9111eSGal Pressman int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
1801fb7f897SMark Bloch 		     u32 port_num, int index);
181853f5652SGal Pressman 
182853f5652SGal Pressman #endif /* _EFA_H_ */
183