Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ocrdma.h
Go to the documentation of this file.
1 /*******************************************************************
2  * This file is part of the Emulex RoCE Device Driver for *
3  * RoCE (RDMA over Converged Ethernet) adapters. *
4  * Copyright (C) 2008-2012 Emulex. All rights reserved. *
5  * EMULEX and SLI are trademarks of Emulex. *
6  * www.emulex.com *
7  * *
8  * This program is free software; you can redistribute it and/or *
9  * modify it under the terms of version 2 of the GNU General *
10  * Public License as published by the Free Software Foundation. *
11  * This program is distributed in the hope that it will be useful. *
12  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
13  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
14  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
15  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
16  * TO BE LEGALLY INVALID. See the GNU General Public License for *
17  * more details, a copy of which can be found in the file COPYING *
18  * included with this package. *
19  *
20  * Contact Information:
22  *
23  * Emulex
24  * 3333 Susan Street
25  * Costa Mesa, CA 92626
26  *******************************************************************/
27 
28 #ifndef __OCRDMA_H__
29 #define __OCRDMA_H__
30 
31 #include <linux/mutex.h>
32 #include <linux/list.h>
33 #include <linux/spinlock.h>
34 #include <linux/pci.h>
35 
36 #include <rdma/ib_verbs.h>
37 #include <rdma/ib_user_verbs.h>
38 
39 #include <be_roce.h>
40 #include "ocrdma_sli.h"
41 
42 #define OCRDMA_ROCE_DEV_VERSION "1.0.0"
43 #define OCRDMA_NODE_DESC "Emulex OneConnect RoCE HCA"
44 
45 #define ocrdma_err(format, arg...) printk(KERN_ERR format, ##arg)
46 
47 #define OCRDMA_MAX_AH 512
48 
49 #define OCRDMA_UVERBS(CMD_NAME) (1ull << IB_USER_VERBS_CMD_##CMD_NAME)
50 
52  u8 fw_ver[32];
65  int max_mr;
68  int max_fmr;
73 
77 
84 };
85 
86 struct ocrdma_pbl {
87  void *va;
89 };
90 
92  void *va;
96  u16 entry_size; /* Size of an element in the queue */
97  u16 id; /* qid, where to ring the doorbell. */
99  bool created;
100  atomic_t used; /* Number of valid elements in the queue */
101 };
102 
103 struct ocrdma_eq {
106  int cq_cnt;
107  struct ocrdma_dev *dev;
108  char irq_name[32];
109 };
110 
111 struct ocrdma_mq {
114  bool rearm_cq;
115 };
116 
117 struct mqe_ctx {
118  struct mutex lock; /* for serializing mailbox commands on MQ */
123  bool cmd_done;
124 };
125 
126 struct ocrdma_dev {
127  struct ib_device ibdev;
129 
130  struct mutex dev_lock; /* provides syncronise access to device data */
132 
133  struct ocrdma_cq **cq_tbl;
134  struct ocrdma_qp **qp_tbl;
135 
136  struct ocrdma_eq meq;
138  int eq_cnt;
141 
142  union ib_gid *sgid_tbl;
143  /* provided synchronization to sgid table for
144  * updating gid entries triggered by notifier.
145  */
147 
151 
152  struct {
153  struct ocrdma_av *va;
157  /* provide synchronization for av
158  * entry allocations.
159  */
162  struct ocrdma_pbl pbl;
163  } av_tbl;
164 
165  void *mbx_cmd;
166  struct ocrdma_mq mq;
167  struct mqe_ctx mqe_ctx;
168 
170 
171  struct list_head entry;
172  struct rcu_head rcu;
173  int id;
174 };
175 
176 struct ocrdma_cq {
177  struct ib_cq ibcq;
178  struct ocrdma_dev *dev;
179  struct ocrdma_cqe *va;
181  u32 getp; /* pointer to pending wrs to
182  * return to stack, wrap arounds
183  * at max_hw_cqe
184  */
189 
190  spinlock_t cq_lock ____cacheline_aligned; /* provide synchronization
191  * to cq polling
192  */
193  /* syncronizes cq completion handler invoked from multiple context */
197 
202 
203  /* head of all qp's sq and rq for which cqes need to be flushed
204  * by the software.
205  */
206  struct list_head sq_head, rq_head;
207 };
208 
209 struct ocrdma_pd {
210  struct ib_pd ibpd;
211  struct ocrdma_dev *dev;
218 };
219 
220 struct ocrdma_ah {
221  struct ib_ah ibah;
222  struct ocrdma_dev *dev;
223  struct ocrdma_av *av;
226 };
227 
229  u8 *va; /* virtual address */
235  u16 dbid; /* qid, where to ring the doorbell. */
238 };
239 
240 struct ocrdma_srq {
241  struct ib_srq ibsrq;
242  struct ocrdma_dev *dev;
244  /* provide synchronization to multiple context(s) posting rqe */
246 
248  struct ocrdma_pd *pd;
254 };
255 
256 struct ocrdma_qp {
257  struct ib_qp ibqp;
258  struct ocrdma_dev *dev;
259 
261  /* provide synchronization to multiple context(s) posting wqe, rqe */
264  struct {
270  } *wqe_wr_id_tbl;
272  struct ocrdma_cq *sq_cq;
273  /* list maintained per CQ to flush SQ errors */
275 
279  struct ocrdma_cq *rq_cq;
280  struct ocrdma_srq *srq;
281  /* list maintained per CQ to flush RQ errors */
283 
284  enum ocrdma_qp_state state; /* QP state */
287 
289  struct ocrdma_pd *pd;
290 
292 
293  int sgid_idx;
297 };
298 
299 #define OCRDMA_GET_NUM_POSTED_SHIFT_VAL(qp) \
300  (((qp->dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) && \
301  (qp->id < 64)) ? 24 : 16)
302 
303 struct ocrdma_hw_mr {
304  struct ocrdma_dev *dev;
322 };
323 
324 struct ocrdma_mr {
325  struct ib_mr ibmr;
326  struct ib_umem *umem;
328  struct ocrdma_pd *pd;
329 };
330 
333  struct ocrdma_dev *dev;
334 
336  struct mutex mm_list_lock; /* protects list entries of mm type */
337  struct {
338  u32 *va;
341  } ah_tbl;
342 };
343 
344 struct ocrdma_mm {
345  struct {
347  unsigned long len;
348  } key;
349  struct list_head entry;
350 };
351 
352 static inline struct ocrdma_dev *get_ocrdma_dev(struct ib_device *ibdev)
353 {
354  return container_of(ibdev, struct ocrdma_dev, ibdev);
355 }
356 
357 static inline struct ocrdma_ucontext *get_ocrdma_ucontext(struct ib_ucontext
358  *ibucontext)
359 {
360  return container_of(ibucontext, struct ocrdma_ucontext, ibucontext);
361 }
362 
363 static inline struct ocrdma_pd *get_ocrdma_pd(struct ib_pd *ibpd)
364 {
365  return container_of(ibpd, struct ocrdma_pd, ibpd);
366 }
367 
368 static inline struct ocrdma_cq *get_ocrdma_cq(struct ib_cq *ibcq)
369 {
370  return container_of(ibcq, struct ocrdma_cq, ibcq);
371 }
372 
373 static inline struct ocrdma_qp *get_ocrdma_qp(struct ib_qp *ibqp)
374 {
375  return container_of(ibqp, struct ocrdma_qp, ibqp);
376 }
377 
378 static inline struct ocrdma_mr *get_ocrdma_mr(struct ib_mr *ibmr)
379 {
380  return container_of(ibmr, struct ocrdma_mr, ibmr);
381 }
382 
383 static inline struct ocrdma_ah *get_ocrdma_ah(struct ib_ah *ibah)
384 {
385  return container_of(ibah, struct ocrdma_ah, ibah);
386 }
387 
388 static inline struct ocrdma_srq *get_ocrdma_srq(struct ib_srq *ibsrq)
389 {
390  return container_of(ibsrq, struct ocrdma_srq, ibsrq);
391 }
392 
393 #endif