Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
[pandora-kernel.git] / drivers / infiniband / hw / ehca / ehca_classes.h
1 /*
2  *  IBM eServer eHCA Infiniband device driver for Linux on POWER
3  *
4  *  Struct definition for eHCA internal structures
5  *
6  *  Authors: Heiko J Schick <schickhj@de.ibm.com>
7  *           Christoph Raisch <raisch@de.ibm.com>
8  *
9  *  Copyright (c) 2005 IBM Corporation
10  *
11  *  All rights reserved.
12  *
13  *  This source code is distributed under a dual license of GPL v2.0 and OpenIB
14  *  BSD.
15  *
16  * OpenIB BSD License
17  *
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions are met:
20  *
21  * Redistributions of source code must retain the above copyright notice, this
22  * list of conditions and the following disclaimer.
23  *
24  * Redistributions in binary form must reproduce the above copyright notice,
25  * this list of conditions and the following disclaimer in the documentation
26  * and/or other materials
27  * provided with the distribution.
28  *
29  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
30  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
33  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
36  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
37  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39  * POSSIBILITY OF SUCH DAMAGE.
40  */
41
42 #ifndef __EHCA_CLASSES_H__
43 #define __EHCA_CLASSES_H__
44
45 #include "ehca_classes.h"
46 #include "ipz_pt_fn.h"
47
48 struct ehca_module;
49 struct ehca_qp;
50 struct ehca_cq;
51 struct ehca_eq;
52 struct ehca_mr;
53 struct ehca_mw;
54 struct ehca_pd;
55 struct ehca_av;
56
57 #ifdef CONFIG_PPC64
58 #include "ehca_classes_pSeries.h"
59 #endif
60
61 #include <rdma/ib_verbs.h>
62 #include <rdma/ib_user_verbs.h>
63
64 #include "ehca_irq.h"
65
66 struct ehca_eq {
67         u32 length;
68         struct ipz_queue ipz_queue;
69         struct ipz_eq_handle ipz_eq_handle;
70         struct work_struct work;
71         struct h_galpas galpas;
72         int is_initialized;
73         struct ehca_pfeq pf;
74         spinlock_t spinlock;
75         struct tasklet_struct interrupt_task;
76         u32 ist;
77 };
78
79 struct ehca_sport {
80         struct ib_cq *ibcq_aqp1;
81         struct ib_qp *ibqp_aqp1;
82         enum ib_rate  rate;
83         enum ib_port_state port_state;
84 };
85
86 struct ehca_shca {
87         struct ib_device ib_device;
88         struct ibmebus_dev *ibmebus_dev;
89         u8 num_ports;
90         int hw_level;
91         struct list_head shca_list;
92         struct ipz_adapter_handle ipz_hca_handle;
93         struct ehca_sport sport[2];
94         struct ehca_eq eq;
95         struct ehca_eq neq;
96         struct ehca_mr *maxmr;
97         struct ehca_pd *pd;
98         struct h_galpas galpas;
99 };
100
101 struct ehca_pd {
102         struct ib_pd ib_pd;
103         struct ipz_pd fw_pd;
104         u32 ownpid;
105 };
106
107 struct ehca_qp {
108         struct ib_qp ib_qp;
109         u32 qp_type;
110         struct ipz_queue ipz_squeue;
111         struct ipz_queue ipz_rqueue;
112         struct h_galpas galpas;
113         u32 qkey;
114         u32 real_qp_num;
115         u32 token;
116         spinlock_t spinlock_s;
117         spinlock_t spinlock_r;
118         u32 sq_max_inline_data_size;
119         struct ipz_qp_handle ipz_qp_handle;
120         struct ehca_pfqp pf;
121         struct ib_qp_init_attr init_attr;
122         struct ehca_cq *send_cq;
123         struct ehca_cq *recv_cq;
124         unsigned int sqerr_purgeflag;
125         struct hlist_node list_entries;
126         /* mmap counter for resources mapped into user space */
127         u32 mm_count_squeue;
128         u32 mm_count_rqueue;
129         u32 mm_count_galpa;
130 };
131
132 /* must be power of 2 */
133 #define QP_HASHTAB_LEN 8
134
135 struct ehca_cq {
136         struct ib_cq ib_cq;
137         struct ipz_queue ipz_queue;
138         struct h_galpas galpas;
139         spinlock_t spinlock;
140         u32 cq_number;
141         u32 token;
142         u32 nr_of_entries;
143         struct ipz_cq_handle ipz_cq_handle;
144         struct ehca_pfcq pf;
145         spinlock_t cb_lock;
146         struct hlist_head qp_hashtab[QP_HASHTAB_LEN];
147         struct list_head entry;
148         u32 nr_callbacks;
149         spinlock_t task_lock;
150         u32 ownpid;
151         /* mmap counter for resources mapped into user space */
152         u32 mm_count_queue;
153         u32 mm_count_galpa;
154 };
155
156 enum ehca_mr_flag {
157         EHCA_MR_FLAG_FMR = 0x80000000,   /* FMR, created with ehca_alloc_fmr */
158         EHCA_MR_FLAG_MAXMR = 0x40000000, /* max-MR                           */
159 };
160
161 struct ehca_mr {
162         union {
163                 struct ib_mr ib_mr;     /* must always be first in ehca_mr */
164                 struct ib_fmr ib_fmr;   /* must always be first in ehca_mr */
165         } ib;
166         spinlock_t mrlock;
167
168         enum ehca_mr_flag flags;
169         u32 num_pages;          /* number of MR pages */
170         u32 num_4k;             /* number of 4k "page" portions to form MR */
171         int acl;                /* ACL (stored here for usage in reregister) */
172         u64 *start;             /* virtual start address (stored here for */
173                                 /* usage in reregister) */
174         u64 size;               /* size (stored here for usage in reregister) */
175         u32 fmr_page_size;      /* page size for FMR */
176         u32 fmr_max_pages;      /* max pages for FMR */
177         u32 fmr_max_maps;       /* max outstanding maps for FMR */
178         u32 fmr_map_cnt;        /* map counter for FMR */
179         /* fw specific data */
180         struct ipz_mrmw_handle ipz_mr_handle;   /* MR handle for h-calls */
181         struct h_galpas galpas;
182         /* data for userspace bridge */
183         u32 nr_of_pages;
184         void *pagearray;
185 };
186
187 struct ehca_mw {
188         struct ib_mw ib_mw;     /* gen2 mw, must always be first in ehca_mw */
189         spinlock_t mwlock;
190
191         u8 never_bound;         /* indication MW was never bound */
192         struct ipz_mrmw_handle ipz_mw_handle;   /* MW handle for h-calls */
193         struct h_galpas galpas;
194 };
195
196 enum ehca_mr_pgi_type {
197         EHCA_MR_PGI_PHYS   = 1,  /* type of ehca_reg_phys_mr,
198                                   * ehca_rereg_phys_mr,
199                                   * ehca_reg_internal_maxmr */
200         EHCA_MR_PGI_USER   = 2,  /* type of ehca_reg_user_mr */
201         EHCA_MR_PGI_FMR    = 3   /* type of ehca_map_phys_fmr */
202 };
203
204 struct ehca_mr_pginfo {
205         enum ehca_mr_pgi_type type;
206         u64 num_pages;
207         u64 page_cnt;
208         u64 num_4k;       /* number of 4k "page" portions */
209         u64 page_4k_cnt;  /* counter for 4k "page" portions */
210         u64 next_4k;      /* next 4k "page" portion in buffer/chunk/listelem */
211
212         /* type EHCA_MR_PGI_PHYS section */
213         int num_phys_buf;
214         struct ib_phys_buf *phys_buf_array;
215         u64 next_buf;
216
217         /* type EHCA_MR_PGI_USER section */
218         struct ib_umem *region;
219         struct ib_umem_chunk *next_chunk;
220         u64 next_nmap;
221
222         /* type EHCA_MR_PGI_FMR section */
223         u64 *page_list;
224         u64 next_listelem;
225         /* next_4k also used within EHCA_MR_PGI_FMR */
226 };
227
228 /* output parameters for MR/FMR hipz calls */
229 struct ehca_mr_hipzout_parms {
230         struct ipz_mrmw_handle handle;
231         u32 lkey;
232         u32 rkey;
233         u64 len;
234         u64 vaddr;
235         u32 acl;
236 };
237
238 /* output parameters for MW hipz calls */
239 struct ehca_mw_hipzout_parms {
240         struct ipz_mrmw_handle handle;
241         u32 rkey;
242 };
243
244 struct ehca_av {
245         struct ib_ah ib_ah;
246         struct ehca_ud_av av;
247 };
248
249 struct ehca_ucontext {
250         struct ib_ucontext ib_ucontext;
251 };
252
253 int ehca_init_pd_cache(void);
254 void ehca_cleanup_pd_cache(void);
255 int ehca_init_cq_cache(void);
256 void ehca_cleanup_cq_cache(void);
257 int ehca_init_qp_cache(void);
258 void ehca_cleanup_qp_cache(void);
259 int ehca_init_av_cache(void);
260 void ehca_cleanup_av_cache(void);
261 int ehca_init_mrmw_cache(void);
262 void ehca_cleanup_mrmw_cache(void);
263
264 extern spinlock_t ehca_qp_idr_lock;
265 extern spinlock_t ehca_cq_idr_lock;
266 extern struct idr ehca_qp_idr;
267 extern struct idr ehca_cq_idr;
268
269 extern int ehca_static_rate;
270 extern int ehca_port_act_time;
271 extern int ehca_use_hp_mr;
272
273 struct ipzu_queue_resp {
274         u32 qe_size;      /* queue entry size */
275         u32 act_nr_of_sg;
276         u32 queue_length; /* queue length allocated in bytes */
277         u32 pagesize;
278         u32 toggle_state;
279         u32 dummy; /* padding for 8 byte alignment */
280 };
281
282 struct ehca_create_cq_resp {
283         u32 cq_number;
284         u32 token;
285         struct ipzu_queue_resp ipz_queue;
286 };
287
288 struct ehca_create_qp_resp {
289         u32 qp_num;
290         u32 token;
291         u32 qp_type;
292         u32 qkey;
293         /* qp_num assigned by ehca: sqp0/1 may have got different numbers */
294         u32 real_qp_num;
295         u32 dummy; /* padding for 8 byte alignment */
296         struct ipzu_queue_resp ipz_squeue;
297         struct ipzu_queue_resp ipz_rqueue;
298 };
299
300 struct ehca_alloc_cq_parms {
301         u32 nr_cqe;
302         u32 act_nr_of_entries;
303         u32 act_pages;
304         struct ipz_eq_handle eq_handle;
305 };
306
307 struct ehca_alloc_qp_parms {
308         int servicetype;
309         int sigtype;
310         int daqp_ctrl;
311         int max_send_sge;
312         int max_recv_sge;
313         int ud_av_l_key_ctl;
314
315         u16 act_nr_send_wqes;
316         u16 act_nr_recv_wqes;
317         u8  act_nr_recv_sges;
318         u8  act_nr_send_sges;
319
320         u32 nr_rq_pages;
321         u32 nr_sq_pages;
322
323         struct ipz_eq_handle ipz_eq_handle;
324         struct ipz_pd pd;
325 };
326
327 int ehca_cq_assign_qp(struct ehca_cq *cq, struct ehca_qp *qp);
328 int ehca_cq_unassign_qp(struct ehca_cq *cq, unsigned int qp_num);
329 struct ehca_qp* ehca_cq_get_qp(struct ehca_cq *cq, int qp_num);
330
331 #endif