[IB] mthca: Report correct atomic capability
[linux-block.git] / drivers / infiniband / hw / mthca / mthca_provider.c
1 /*
2  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
4  * Copyright (c) 2005 Cisco Systems. All rights reserved.
5  * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
6  * Copyright (c) 2004 Voltaire, Inc. All rights reserved.
7  *
8  * This software is available to you under a choice of one of two
9  * licenses.  You may choose to be licensed under the terms of the GNU
10  * General Public License (GPL) Version 2, available from the file
11  * COPYING in the main directory of this source tree, or the
12  * OpenIB.org BSD license below:
13  *
14  *     Redistribution and use in source and binary forms, with or
15  *     without modification, are permitted provided that the following
16  *     conditions are met:
17  *
18  *      - Redistributions of source code must retain the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer.
21  *
22  *      - Redistributions in binary form must reproduce the above
23  *        copyright notice, this list of conditions and the following
24  *        disclaimer in the documentation and/or other materials
25  *        provided with the distribution.
26  *
27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34  * SOFTWARE.
35  *
36  * $Id: mthca_provider.c 1397 2004-12-28 05:09:00Z roland $
37  */
38
39 #include <rdma/ib_smi.h>
40 #include <linux/mm.h>
41
42 #include "mthca_dev.h"
43 #include "mthca_cmd.h"
44 #include "mthca_user.h"
45 #include "mthca_memfree.h"
46
47 static int mthca_query_device(struct ib_device *ibdev,
48                               struct ib_device_attr *props)
49 {
50         struct ib_smp *in_mad  = NULL;
51         struct ib_smp *out_mad = NULL;
52         int err = -ENOMEM;
53         struct mthca_dev* mdev = to_mdev(ibdev);
54
55         u8 status;
56
57         in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);
58         out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
59         if (!in_mad || !out_mad)
60                 goto out;
61
62         memset(props, 0, sizeof *props);
63
64         props->fw_ver              = mdev->fw_ver;
65
66         memset(in_mad, 0, sizeof *in_mad);
67         in_mad->base_version       = 1;
68         in_mad->mgmt_class         = IB_MGMT_CLASS_SUBN_LID_ROUTED;
69         in_mad->class_version      = 1;
70         in_mad->method             = IB_MGMT_METHOD_GET;
71         in_mad->attr_id            = IB_SMP_ATTR_NODE_INFO;
72
73         err = mthca_MAD_IFC(mdev, 1, 1,
74                             1, NULL, NULL, in_mad, out_mad,
75                             &status);
76         if (err)
77                 goto out;
78         if (status) {
79                 err = -EINVAL;
80                 goto out;
81         }
82
83         props->device_cap_flags    = mdev->device_cap_flags;
84         props->vendor_id           = be32_to_cpup((__be32 *) (out_mad->data + 36)) &
85                 0xffffff;
86         props->vendor_part_id      = be16_to_cpup((__be16 *) (out_mad->data + 30));
87         props->hw_ver              = be32_to_cpup((__be32 *) (out_mad->data + 32));
88         memcpy(&props->sys_image_guid, out_mad->data +  4, 8);
89         memcpy(&props->node_guid,      out_mad->data + 12, 8);
90
91         props->max_mr_size         = ~0ull;
92         props->max_qp              = mdev->limits.num_qps - mdev->limits.reserved_qps;
93         props->max_qp_wr           = 0xffff;
94         props->max_sge             = mdev->limits.max_sg;
95         props->max_cq              = mdev->limits.num_cqs - mdev->limits.reserved_cqs;
96         props->max_cqe             = 0xffff;
97         props->max_mr              = mdev->limits.num_mpts - mdev->limits.reserved_mrws;
98         props->max_pd              = mdev->limits.num_pds - mdev->limits.reserved_pds;
99         props->max_qp_rd_atom      = 1 << mdev->qp_table.rdb_shift;
100         props->max_qp_init_rd_atom = 1 << mdev->qp_table.rdb_shift;
101         props->local_ca_ack_delay  = mdev->limits.local_ca_ack_delay;
102         props->atomic_cap          = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ? 
103                                         IB_ATOMIC_HCA : IB_ATOMIC_NONE;
104
105         err = 0;
106  out:
107         kfree(in_mad);
108         kfree(out_mad);
109         return err;
110 }
111
112 static int mthca_query_port(struct ib_device *ibdev,
113                             u8 port, struct ib_port_attr *props)
114 {
115         struct ib_smp *in_mad  = NULL;
116         struct ib_smp *out_mad = NULL;
117         int err = -ENOMEM;
118         u8 status;
119
120         in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);
121         out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
122         if (!in_mad || !out_mad)
123                 goto out;
124
125         memset(props, 0, sizeof *props);
126
127         memset(in_mad, 0, sizeof *in_mad);
128         in_mad->base_version       = 1;
129         in_mad->mgmt_class         = IB_MGMT_CLASS_SUBN_LID_ROUTED;
130         in_mad->class_version      = 1;
131         in_mad->method             = IB_MGMT_METHOD_GET;
132         in_mad->attr_id            = IB_SMP_ATTR_PORT_INFO;
133         in_mad->attr_mod           = cpu_to_be32(port);
134
135         err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
136                             port, NULL, NULL, in_mad, out_mad,
137                             &status);
138         if (err)
139                 goto out;
140         if (status) {
141                 err = -EINVAL;
142                 goto out;
143         }
144
145         props->lid               = be16_to_cpup((__be16 *) (out_mad->data + 16));
146         props->lmc               = out_mad->data[34] & 0x7;
147         props->sm_lid            = be16_to_cpup((__be16 *) (out_mad->data + 18));
148         props->sm_sl             = out_mad->data[36] & 0xf;
149         props->state             = out_mad->data[32] & 0xf;
150         props->phys_state        = out_mad->data[33] >> 4;
151         props->port_cap_flags    = be32_to_cpup((__be32 *) (out_mad->data + 20));
152         props->gid_tbl_len       = to_mdev(ibdev)->limits.gid_table_len;
153         props->max_msg_sz        = 0x80000000;
154         props->pkey_tbl_len      = to_mdev(ibdev)->limits.pkey_table_len;
155         props->qkey_viol_cntr    = be16_to_cpup((__be16 *) (out_mad->data + 48));
156         props->active_width      = out_mad->data[31] & 0xf;
157         props->active_speed      = out_mad->data[35] >> 4;
158
159  out:
160         kfree(in_mad);
161         kfree(out_mad);
162         return err;
163 }
164
165 static int mthca_modify_port(struct ib_device *ibdev,
166                              u8 port, int port_modify_mask,
167                              struct ib_port_modify *props)
168 {
169         struct mthca_set_ib_param set_ib;
170         struct ib_port_attr attr;
171         int err;
172         u8 status;
173
174         if (down_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
175                 return -ERESTARTSYS;
176
177         err = mthca_query_port(ibdev, port, &attr);
178         if (err)
179                 goto out;
180
181         set_ib.set_si_guid     = 0;
182         set_ib.reset_qkey_viol = !!(port_modify_mask & IB_PORT_RESET_QKEY_CNTR);
183
184         set_ib.cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) &
185                 ~props->clr_port_cap_mask;
186
187         err = mthca_SET_IB(to_mdev(ibdev), &set_ib, port, &status);
188         if (err)
189                 goto out;
190         if (status) {
191                 err = -EINVAL;
192                 goto out;
193         }
194
195 out:
196         up(&to_mdev(ibdev)->cap_mask_mutex);
197         return err;
198 }
199
200 static int mthca_query_pkey(struct ib_device *ibdev,
201                             u8 port, u16 index, u16 *pkey)
202 {
203         struct ib_smp *in_mad  = NULL;
204         struct ib_smp *out_mad = NULL;
205         int err = -ENOMEM;
206         u8 status;
207
208         in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);
209         out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
210         if (!in_mad || !out_mad)
211                 goto out;
212
213         memset(in_mad, 0, sizeof *in_mad);
214         in_mad->base_version       = 1;
215         in_mad->mgmt_class         = IB_MGMT_CLASS_SUBN_LID_ROUTED;
216         in_mad->class_version      = 1;
217         in_mad->method             = IB_MGMT_METHOD_GET;
218         in_mad->attr_id            = IB_SMP_ATTR_PKEY_TABLE;
219         in_mad->attr_mod           = cpu_to_be32(index / 32);
220
221         err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
222                             port, NULL, NULL, in_mad, out_mad,
223                             &status);
224         if (err)
225                 goto out;
226         if (status) {
227                 err = -EINVAL;
228                 goto out;
229         }
230
231         *pkey = be16_to_cpu(((__be16 *) out_mad->data)[index % 32]);
232
233  out:
234         kfree(in_mad);
235         kfree(out_mad);
236         return err;
237 }
238
239 static int mthca_query_gid(struct ib_device *ibdev, u8 port,
240                            int index, union ib_gid *gid)
241 {
242         struct ib_smp *in_mad  = NULL;
243         struct ib_smp *out_mad = NULL;
244         int err = -ENOMEM;
245         u8 status;
246
247         in_mad  = kmalloc(sizeof *in_mad, GFP_KERNEL);
248         out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
249         if (!in_mad || !out_mad)
250                 goto out;
251
252         memset(in_mad, 0, sizeof *in_mad);
253         in_mad->base_version       = 1;
254         in_mad->mgmt_class         = IB_MGMT_CLASS_SUBN_LID_ROUTED;
255         in_mad->class_version      = 1;
256         in_mad->method             = IB_MGMT_METHOD_GET;
257         in_mad->attr_id            = IB_SMP_ATTR_PORT_INFO;
258         in_mad->attr_mod           = cpu_to_be32(port);
259
260         err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
261                             port, NULL, NULL, in_mad, out_mad,
262                             &status);
263         if (err)
264                 goto out;
265         if (status) {
266                 err = -EINVAL;
267                 goto out;
268         }
269
270         memcpy(gid->raw, out_mad->data + 8, 8);
271
272         memset(in_mad, 0, sizeof *in_mad);
273         in_mad->base_version       = 1;
274         in_mad->mgmt_class         = IB_MGMT_CLASS_SUBN_LID_ROUTED;
275         in_mad->class_version      = 1;
276         in_mad->method             = IB_MGMT_METHOD_GET;
277         in_mad->attr_id            = IB_SMP_ATTR_GUID_INFO;
278         in_mad->attr_mod           = cpu_to_be32(index / 8);
279
280         err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
281                             port, NULL, NULL, in_mad, out_mad,
282                             &status);
283         if (err)
284                 goto out;
285         if (status) {
286                 err = -EINVAL;
287                 goto out;
288         }
289
290         memcpy(gid->raw + 8, out_mad->data + (index % 8) * 16, 8);
291
292  out:
293         kfree(in_mad);
294         kfree(out_mad);
295         return err;
296 }
297
298 static struct ib_ucontext *mthca_alloc_ucontext(struct ib_device *ibdev,
299                                                 struct ib_udata *udata)
300 {
301         struct mthca_alloc_ucontext_resp uresp;
302         struct mthca_ucontext           *context;
303         int                              err;
304
305         memset(&uresp, 0, sizeof uresp);
306
307         uresp.qp_tab_size = to_mdev(ibdev)->limits.num_qps;
308         if (mthca_is_memfree(to_mdev(ibdev)))
309                 uresp.uarc_size = to_mdev(ibdev)->uar_table.uarc_size;
310         else
311                 uresp.uarc_size = 0;
312
313         context = kmalloc(sizeof *context, GFP_KERNEL);
314         if (!context)
315                 return ERR_PTR(-ENOMEM);
316
317         err = mthca_uar_alloc(to_mdev(ibdev), &context->uar);
318         if (err) {
319                 kfree(context);
320                 return ERR_PTR(err);
321         }
322
323         context->db_tab = mthca_init_user_db_tab(to_mdev(ibdev));
324         if (IS_ERR(context->db_tab)) {
325                 err = PTR_ERR(context->db_tab);
326                 mthca_uar_free(to_mdev(ibdev), &context->uar);
327                 kfree(context);
328                 return ERR_PTR(err);
329         }
330
331         if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
332                 mthca_cleanup_user_db_tab(to_mdev(ibdev), &context->uar, context->db_tab);
333                 mthca_uar_free(to_mdev(ibdev), &context->uar);
334                 kfree(context);
335                 return ERR_PTR(-EFAULT);
336         }
337
338         return &context->ibucontext;
339 }
340
341 static int mthca_dealloc_ucontext(struct ib_ucontext *context)
342 {
343         mthca_cleanup_user_db_tab(to_mdev(context->device), &to_mucontext(context)->uar,
344                                   to_mucontext(context)->db_tab);
345         mthca_uar_free(to_mdev(context->device), &to_mucontext(context)->uar);
346         kfree(to_mucontext(context));
347
348         return 0;
349 }
350
351 static int mthca_mmap_uar(struct ib_ucontext *context,
352                           struct vm_area_struct *vma)
353 {
354         if (vma->vm_end - vma->vm_start != PAGE_SIZE)
355                 return -EINVAL;
356
357         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
358
359         if (io_remap_pfn_range(vma, vma->vm_start,
360                                to_mucontext(context)->uar.pfn,
361                                PAGE_SIZE, vma->vm_page_prot))
362                 return -EAGAIN;
363
364         return 0;
365 }
366
367 static struct ib_pd *mthca_alloc_pd(struct ib_device *ibdev,
368                                     struct ib_ucontext *context,
369                                     struct ib_udata *udata)
370 {
371         struct mthca_pd *pd;
372         int err;
373
374         pd = kmalloc(sizeof *pd, GFP_KERNEL);
375         if (!pd)
376                 return ERR_PTR(-ENOMEM);
377
378         err = mthca_pd_alloc(to_mdev(ibdev), !context, pd);
379         if (err) {
380                 kfree(pd);
381                 return ERR_PTR(err);
382         }
383
384         if (context) {
385                 if (ib_copy_to_udata(udata, &pd->pd_num, sizeof (__u32))) {
386                         mthca_pd_free(to_mdev(ibdev), pd);
387                         kfree(pd);
388                         return ERR_PTR(-EFAULT);
389                 }
390         }
391
392         return &pd->ibpd;
393 }
394
395 static int mthca_dealloc_pd(struct ib_pd *pd)
396 {
397         mthca_pd_free(to_mdev(pd->device), to_mpd(pd));
398         kfree(pd);
399
400         return 0;
401 }
402
403 static struct ib_ah *mthca_ah_create(struct ib_pd *pd,
404                                      struct ib_ah_attr *ah_attr)
405 {
406         int err;
407         struct mthca_ah *ah;
408
409         ah = kmalloc(sizeof *ah, GFP_ATOMIC);
410         if (!ah)
411                 return ERR_PTR(-ENOMEM);
412
413         err = mthca_create_ah(to_mdev(pd->device), to_mpd(pd), ah_attr, ah);
414         if (err) {
415                 kfree(ah);
416                 return ERR_PTR(err);
417         }
418
419         return &ah->ibah;
420 }
421
422 static int mthca_ah_destroy(struct ib_ah *ah)
423 {
424         mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));
425         kfree(ah);
426
427         return 0;
428 }
429
430 static struct ib_srq *mthca_create_srq(struct ib_pd *pd,
431                                        struct ib_srq_init_attr *init_attr,
432                                        struct ib_udata *udata)
433 {
434         struct mthca_create_srq ucmd;
435         struct mthca_ucontext *context = NULL;
436         struct mthca_srq *srq;
437         int err;
438
439         srq = kmalloc(sizeof *srq, GFP_KERNEL);
440         if (!srq)
441                 return ERR_PTR(-ENOMEM);
442
443         if (pd->uobject) {
444                 context = to_mucontext(pd->uobject->context);
445
446                 if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
447                         return ERR_PTR(-EFAULT);
448
449                 err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
450                                         context->db_tab, ucmd.db_index,
451                                         ucmd.db_page);
452
453                 if (err)
454                         goto err_free;
455
456                 srq->mr.ibmr.lkey = ucmd.lkey;
457                 srq->db_index     = ucmd.db_index;
458         }
459
460         err = mthca_alloc_srq(to_mdev(pd->device), to_mpd(pd),
461                               &init_attr->attr, srq);
462
463         if (err && pd->uobject)
464                 mthca_unmap_user_db(to_mdev(pd->device), &context->uar,
465                                     context->db_tab, ucmd.db_index);
466
467         if (err)
468                 goto err_free;
469
470         if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof (__u32))) {
471                 mthca_free_srq(to_mdev(pd->device), srq);
472                 err = -EFAULT;
473                 goto err_free;
474         }
475
476         return &srq->ibsrq;
477
478 err_free:
479         kfree(srq);
480
481         return ERR_PTR(err);
482 }
483
484 static int mthca_destroy_srq(struct ib_srq *srq)
485 {
486         struct mthca_ucontext *context;
487
488         if (srq->uobject) {
489                 context = to_mucontext(srq->uobject->context);
490
491                 mthca_unmap_user_db(to_mdev(srq->device), &context->uar,
492                                     context->db_tab, to_msrq(srq)->db_index);
493         }
494
495         mthca_free_srq(to_mdev(srq->device), to_msrq(srq));
496         kfree(srq);
497
498         return 0;
499 }
500
501 static struct ib_qp *mthca_create_qp(struct ib_pd *pd,
502                                      struct ib_qp_init_attr *init_attr,
503                                      struct ib_udata *udata)
504 {
505         struct mthca_create_qp ucmd;
506         struct mthca_qp *qp;
507         int err;
508
509         switch (init_attr->qp_type) {
510         case IB_QPT_RC:
511         case IB_QPT_UC:
512         case IB_QPT_UD:
513         {
514                 struct mthca_ucontext *context;
515
516                 qp = kmalloc(sizeof *qp, GFP_KERNEL);
517                 if (!qp)
518                         return ERR_PTR(-ENOMEM);
519
520                 if (pd->uobject) {
521                         context = to_mucontext(pd->uobject->context);
522
523                         if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
524                                 return ERR_PTR(-EFAULT);
525
526                         err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
527                                                 context->db_tab,
528                                                 ucmd.sq_db_index, ucmd.sq_db_page);
529                         if (err) {
530                                 kfree(qp);
531                                 return ERR_PTR(err);
532                         }
533
534                         err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
535                                                 context->db_tab,
536                                                 ucmd.rq_db_index, ucmd.rq_db_page);
537                         if (err) {
538                                 mthca_unmap_user_db(to_mdev(pd->device),
539                                                     &context->uar,
540                                                     context->db_tab,
541                                                     ucmd.sq_db_index);
542                                 kfree(qp);
543                                 return ERR_PTR(err);
544                         }
545
546                         qp->mr.ibmr.lkey = ucmd.lkey;
547                         qp->sq.db_index  = ucmd.sq_db_index;
548                         qp->rq.db_index  = ucmd.rq_db_index;
549                 }
550
551                 err = mthca_alloc_qp(to_mdev(pd->device), to_mpd(pd),
552                                      to_mcq(init_attr->send_cq),
553                                      to_mcq(init_attr->recv_cq),
554                                      init_attr->qp_type, init_attr->sq_sig_type,
555                                      &init_attr->cap, qp);
556
557                 if (err && pd->uobject) {
558                         context = to_mucontext(pd->uobject->context);
559
560                         mthca_unmap_user_db(to_mdev(pd->device),
561                                             &context->uar,
562                                             context->db_tab,
563                                             ucmd.sq_db_index);
564                         mthca_unmap_user_db(to_mdev(pd->device),
565                                             &context->uar,
566                                             context->db_tab,
567                                             ucmd.rq_db_index);
568                 }
569
570                 qp->ibqp.qp_num = qp->qpn;
571                 break;
572         }
573         case IB_QPT_SMI:
574         case IB_QPT_GSI:
575         {
576                 /* Don't allow userspace to create special QPs */
577                 if (pd->uobject)
578                         return ERR_PTR(-EINVAL);
579
580                 qp = kmalloc(sizeof (struct mthca_sqp), GFP_KERNEL);
581                 if (!qp)
582                         return ERR_PTR(-ENOMEM);
583
584                 qp->ibqp.qp_num = init_attr->qp_type == IB_QPT_SMI ? 0 : 1;
585
586                 err = mthca_alloc_sqp(to_mdev(pd->device), to_mpd(pd),
587                                       to_mcq(init_attr->send_cq),
588                                       to_mcq(init_attr->recv_cq),
589                                       init_attr->sq_sig_type, &init_attr->cap,
590                                       qp->ibqp.qp_num, init_attr->port_num,
591                                       to_msqp(qp));
592                 break;
593         }
594         default:
595                 /* Don't support raw QPs */
596                 return ERR_PTR(-ENOSYS);
597         }
598
599         if (err) {
600                 kfree(qp);
601                 return ERR_PTR(err);
602         }
603
604         init_attr->cap.max_inline_data = 0;
605         init_attr->cap.max_send_wr     = qp->sq.max;
606         init_attr->cap.max_recv_wr     = qp->rq.max;
607         init_attr->cap.max_send_sge    = qp->sq.max_gs;
608         init_attr->cap.max_recv_sge    = qp->rq.max_gs;
609
610         return &qp->ibqp;
611 }
612
613 static int mthca_destroy_qp(struct ib_qp *qp)
614 {
615         if (qp->uobject) {
616                 mthca_unmap_user_db(to_mdev(qp->device),
617                                     &to_mucontext(qp->uobject->context)->uar,
618                                     to_mucontext(qp->uobject->context)->db_tab,
619                                     to_mqp(qp)->sq.db_index);
620                 mthca_unmap_user_db(to_mdev(qp->device),
621                                     &to_mucontext(qp->uobject->context)->uar,
622                                     to_mucontext(qp->uobject->context)->db_tab,
623                                     to_mqp(qp)->rq.db_index);
624         }
625         mthca_free_qp(to_mdev(qp->device), to_mqp(qp));
626         kfree(qp);
627         return 0;
628 }
629
630 static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries,
631                                      struct ib_ucontext *context,
632                                      struct ib_udata *udata)
633 {
634         struct mthca_create_cq ucmd;
635         struct mthca_cq *cq;
636         int nent;
637         int err;
638
639         if (context) {
640                 if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
641                         return ERR_PTR(-EFAULT);
642
643                 err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
644                                         to_mucontext(context)->db_tab,
645                                         ucmd.set_db_index, ucmd.set_db_page);
646                 if (err)
647                         return ERR_PTR(err);
648
649                 err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
650                                         to_mucontext(context)->db_tab,
651                                         ucmd.arm_db_index, ucmd.arm_db_page);
652                 if (err)
653                         goto err_unmap_set;
654         }
655
656         cq = kmalloc(sizeof *cq, GFP_KERNEL);
657         if (!cq) {
658                 err = -ENOMEM;
659                 goto err_unmap_arm;
660         }
661
662         if (context) {
663                 cq->mr.ibmr.lkey    = ucmd.lkey;
664                 cq->set_ci_db_index = ucmd.set_db_index;
665                 cq->arm_db_index    = ucmd.arm_db_index;
666         }
667
668         for (nent = 1; nent <= entries; nent <<= 1)
669                 ; /* nothing */
670
671         err = mthca_init_cq(to_mdev(ibdev), nent,
672                             context ? to_mucontext(context) : NULL,
673                             context ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
674                             cq);
675         if (err)
676                 goto err_free;
677
678         if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) {
679                 mthca_free_cq(to_mdev(ibdev), cq);
680                 goto err_free;
681         }
682
683         return &cq->ibcq;
684
685 err_free:
686         kfree(cq);
687
688 err_unmap_arm:
689         if (context)
690                 mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
691                                     to_mucontext(context)->db_tab, ucmd.arm_db_index);
692
693 err_unmap_set:
694         if (context)
695                 mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
696                                     to_mucontext(context)->db_tab, ucmd.set_db_index);
697
698         return ERR_PTR(err);
699 }
700
701 static int mthca_destroy_cq(struct ib_cq *cq)
702 {
703         if (cq->uobject) {
704                 mthca_unmap_user_db(to_mdev(cq->device),
705                                     &to_mucontext(cq->uobject->context)->uar,
706                                     to_mucontext(cq->uobject->context)->db_tab,
707                                     to_mcq(cq)->arm_db_index);
708                 mthca_unmap_user_db(to_mdev(cq->device),
709                                     &to_mucontext(cq->uobject->context)->uar,
710                                     to_mucontext(cq->uobject->context)->db_tab,
711                                     to_mcq(cq)->set_ci_db_index);
712         }
713         mthca_free_cq(to_mdev(cq->device), to_mcq(cq));
714         kfree(cq);
715
716         return 0;
717 }
718
719 static inline u32 convert_access(int acc)
720 {
721         return (acc & IB_ACCESS_REMOTE_ATOMIC ? MTHCA_MPT_FLAG_ATOMIC       : 0) |
722                (acc & IB_ACCESS_REMOTE_WRITE  ? MTHCA_MPT_FLAG_REMOTE_WRITE : 0) |
723                (acc & IB_ACCESS_REMOTE_READ   ? MTHCA_MPT_FLAG_REMOTE_READ  : 0) |
724                (acc & IB_ACCESS_LOCAL_WRITE   ? MTHCA_MPT_FLAG_LOCAL_WRITE  : 0) |
725                MTHCA_MPT_FLAG_LOCAL_READ;
726 }
727
728 static struct ib_mr *mthca_get_dma_mr(struct ib_pd *pd, int acc)
729 {
730         struct mthca_mr *mr;
731         int err;
732
733         mr = kmalloc(sizeof *mr, GFP_KERNEL);
734         if (!mr)
735                 return ERR_PTR(-ENOMEM);
736
737         err = mthca_mr_alloc_notrans(to_mdev(pd->device),
738                                      to_mpd(pd)->pd_num,
739                                      convert_access(acc), mr);
740
741         if (err) {
742                 kfree(mr);
743                 return ERR_PTR(err);
744         }
745
746         return &mr->ibmr;
747 }
748
749 static struct ib_mr *mthca_reg_phys_mr(struct ib_pd       *pd,
750                                        struct ib_phys_buf *buffer_list,
751                                        int                 num_phys_buf,
752                                        int                 acc,
753                                        u64                *iova_start)
754 {
755         struct mthca_mr *mr;
756         u64 *page_list;
757         u64 total_size;
758         u64 mask;
759         int shift;
760         int npages;
761         int err;
762         int i, j, n;
763
764         /* First check that we have enough alignment */
765         if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK))
766                 return ERR_PTR(-EINVAL);
767
768         if (num_phys_buf > 1 &&
769             ((buffer_list[0].addr + buffer_list[0].size) & ~PAGE_MASK))
770                 return ERR_PTR(-EINVAL);
771
772         mask = 0;
773         total_size = 0;
774         for (i = 0; i < num_phys_buf; ++i) {
775                 if (i != 0 && buffer_list[i].addr & ~PAGE_MASK)
776                         return ERR_PTR(-EINVAL);
777                 if (i != 0 && i != num_phys_buf - 1 &&
778                     (buffer_list[i].size & ~PAGE_MASK))
779                         return ERR_PTR(-EINVAL);
780
781                 total_size += buffer_list[i].size;
782                 if (i > 0)
783                         mask |= buffer_list[i].addr;
784         }
785
786         /* Find largest page shift we can use to cover buffers */
787         for (shift = PAGE_SHIFT; shift < 31; ++shift)
788                 if (num_phys_buf > 1) {
789                         if ((1ULL << shift) & mask)
790                                 break;
791                 } else {
792                         if (1ULL << shift >=
793                             buffer_list[0].size +
794                             (buffer_list[0].addr & ((1ULL << shift) - 1)))
795                                 break;
796                 }
797
798         buffer_list[0].size += buffer_list[0].addr & ((1ULL << shift) - 1);
799         buffer_list[0].addr &= ~0ull << shift;
800
801         mr = kmalloc(sizeof *mr, GFP_KERNEL);
802         if (!mr)
803                 return ERR_PTR(-ENOMEM);
804
805         npages = 0;
806         for (i = 0; i < num_phys_buf; ++i)
807                 npages += (buffer_list[i].size + (1ULL << shift) - 1) >> shift;
808
809         if (!npages)
810                 return &mr->ibmr;
811
812         page_list = kmalloc(npages * sizeof *page_list, GFP_KERNEL);
813         if (!page_list) {
814                 kfree(mr);
815                 return ERR_PTR(-ENOMEM);
816         }
817
818         n = 0;
819         for (i = 0; i < num_phys_buf; ++i)
820                 for (j = 0;
821                      j < (buffer_list[i].size + (1ULL << shift) - 1) >> shift;
822                      ++j)
823                         page_list[n++] = buffer_list[i].addr + ((u64) j << shift);
824
825         mthca_dbg(to_mdev(pd->device), "Registering memory at %llx (iova %llx) "
826                   "in PD %x; shift %d, npages %d.\n",
827                   (unsigned long long) buffer_list[0].addr,
828                   (unsigned long long) *iova_start,
829                   to_mpd(pd)->pd_num,
830                   shift, npages);
831
832         err = mthca_mr_alloc_phys(to_mdev(pd->device),
833                                   to_mpd(pd)->pd_num,
834                                   page_list, shift, npages,
835                                   *iova_start, total_size,
836                                   convert_access(acc), mr);
837
838         if (err) {
839                 kfree(page_list);
840                 kfree(mr);
841                 return ERR_PTR(err);
842         }
843
844         kfree(page_list);
845         return &mr->ibmr;
846 }
847
848 static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
849                                        int acc, struct ib_udata *udata)
850 {
851         struct mthca_dev *dev = to_mdev(pd->device);
852         struct ib_umem_chunk *chunk;
853         struct mthca_mr *mr;
854         u64 *pages;
855         int shift, n, len;
856         int i, j, k;
857         int err = 0;
858
859         shift = ffs(region->page_size) - 1;
860
861         mr = kmalloc(sizeof *mr, GFP_KERNEL);
862         if (!mr)
863                 return ERR_PTR(-ENOMEM);
864
865         n = 0;
866         list_for_each_entry(chunk, &region->chunk_list, list)
867                 n += chunk->nents;
868
869         mr->mtt = mthca_alloc_mtt(dev, n);
870         if (IS_ERR(mr->mtt)) {
871                 err = PTR_ERR(mr->mtt);
872                 goto err;
873         }
874
875         pages = (u64 *) __get_free_page(GFP_KERNEL);
876         if (!pages) {
877                 err = -ENOMEM;
878                 goto err_mtt;
879         }
880
881         i = n = 0;
882
883         list_for_each_entry(chunk, &region->chunk_list, list)
884                 for (j = 0; j < chunk->nmap; ++j) {
885                         len = sg_dma_len(&chunk->page_list[j]) >> shift;
886                         for (k = 0; k < len; ++k) {
887                                 pages[i++] = sg_dma_address(&chunk->page_list[j]) +
888                                         region->page_size * k;
889                                 /*
890                                  * Be friendly to WRITE_MTT command
891                                  * and leave two empty slots for the
892                                  * index and reserved fields of the
893                                  * mailbox.
894                                  */
895                                 if (i == PAGE_SIZE / sizeof (u64) - 2) {
896                                         err = mthca_write_mtt(dev, mr->mtt,
897                                                               n, pages, i);
898                                         if (err)
899                                                 goto mtt_done;
900                                         n += i;
901                                         i = 0;
902                                 }
903                         }
904                 }
905
906         if (i)
907                 err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
908 mtt_done:
909         free_page((unsigned long) pages);
910         if (err)
911                 goto err_mtt;
912
913         err = mthca_mr_alloc(dev, to_mpd(pd)->pd_num, shift, region->virt_base,
914                              region->length, convert_access(acc), mr);
915
916         if (err)
917                 goto err_mtt;
918
919         return &mr->ibmr;
920
921 err_mtt:
922         mthca_free_mtt(dev, mr->mtt);
923
924 err:
925         kfree(mr);
926         return ERR_PTR(err);
927 }
928
929 static int mthca_dereg_mr(struct ib_mr *mr)
930 {
931         struct mthca_mr *mmr = to_mmr(mr);
932         mthca_free_mr(to_mdev(mr->device), mmr);
933         kfree(mmr);
934         return 0;
935 }
936
937 static struct ib_fmr *mthca_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
938                                       struct ib_fmr_attr *fmr_attr)
939 {
940         struct mthca_fmr *fmr;
941         int err;
942
943         fmr = kmalloc(sizeof *fmr, GFP_KERNEL);
944         if (!fmr)
945                 return ERR_PTR(-ENOMEM);
946
947         memcpy(&fmr->attr, fmr_attr, sizeof *fmr_attr);
948         err = mthca_fmr_alloc(to_mdev(pd->device), to_mpd(pd)->pd_num,
949                              convert_access(mr_access_flags), fmr);
950
951         if (err) {
952                 kfree(fmr);
953                 return ERR_PTR(err);
954         }
955
956         return &fmr->ibmr;
957 }
958
959 static int mthca_dealloc_fmr(struct ib_fmr *fmr)
960 {
961         struct mthca_fmr *mfmr = to_mfmr(fmr);
962         int err;
963
964         err = mthca_free_fmr(to_mdev(fmr->device), mfmr);
965         if (err)
966                 return err;
967
968         kfree(mfmr);
969         return 0;
970 }
971
972 static int mthca_unmap_fmr(struct list_head *fmr_list)
973 {
974         struct ib_fmr *fmr;
975         int err;
976         u8 status;
977         struct mthca_dev *mdev = NULL;
978
979         list_for_each_entry(fmr, fmr_list, list) {
980                 if (mdev && to_mdev(fmr->device) != mdev)
981                         return -EINVAL;
982                 mdev = to_mdev(fmr->device);
983         }
984
985         if (!mdev)
986                 return 0;
987
988         if (mthca_is_memfree(mdev)) {
989                 list_for_each_entry(fmr, fmr_list, list)
990                         mthca_arbel_fmr_unmap(mdev, to_mfmr(fmr));
991
992                 wmb();
993         } else
994                 list_for_each_entry(fmr, fmr_list, list)
995                         mthca_tavor_fmr_unmap(mdev, to_mfmr(fmr));
996
997         err = mthca_SYNC_TPT(mdev, &status);
998         if (err)
999                 return err;
1000         if (status)
1001                 return -EINVAL;
1002         return 0;
1003 }
1004
1005 static ssize_t show_rev(struct class_device *cdev, char *buf)
1006 {
1007         struct mthca_dev *dev = container_of(cdev, struct mthca_dev, ib_dev.class_dev);
1008         return sprintf(buf, "%x\n", dev->rev_id);
1009 }
1010
1011 static ssize_t show_fw_ver(struct class_device *cdev, char *buf)
1012 {
1013         struct mthca_dev *dev = container_of(cdev, struct mthca_dev, ib_dev.class_dev);
1014         return sprintf(buf, "%x.%x.%x\n", (int) (dev->fw_ver >> 32),
1015                        (int) (dev->fw_ver >> 16) & 0xffff,
1016                        (int) dev->fw_ver & 0xffff);
1017 }
1018
1019 static ssize_t show_hca(struct class_device *cdev, char *buf)
1020 {
1021         struct mthca_dev *dev = container_of(cdev, struct mthca_dev, ib_dev.class_dev);
1022         switch (dev->pdev->device) {
1023         case PCI_DEVICE_ID_MELLANOX_TAVOR:
1024                 return sprintf(buf, "MT23108\n");
1025         case PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT:
1026                 return sprintf(buf, "MT25208 (MT23108 compat mode)\n");
1027         case PCI_DEVICE_ID_MELLANOX_ARBEL:
1028                 return sprintf(buf, "MT25208\n");
1029         case PCI_DEVICE_ID_MELLANOX_SINAI:
1030         case PCI_DEVICE_ID_MELLANOX_SINAI_OLD:
1031                 return sprintf(buf, "MT25204\n");
1032         default:
1033                 return sprintf(buf, "unknown\n");
1034         }
1035 }
1036
1037 static ssize_t show_board(struct class_device *cdev, char *buf)
1038 {
1039         struct mthca_dev *dev = container_of(cdev, struct mthca_dev, ib_dev.class_dev);
1040         return sprintf(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id);
1041 }
1042
1043 static CLASS_DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
1044 static CLASS_DEVICE_ATTR(fw_ver,   S_IRUGO, show_fw_ver, NULL);
1045 static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
1046 static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
1047
1048 static struct class_device_attribute *mthca_class_attributes[] = {
1049         &class_device_attr_hw_rev,
1050         &class_device_attr_fw_ver,
1051         &class_device_attr_hca_type,
1052         &class_device_attr_board_id
1053 };
1054
1055 int mthca_register_device(struct mthca_dev *dev)
1056 {
1057         int ret;
1058         int i;
1059
1060         strlcpy(dev->ib_dev.name, "mthca%d", IB_DEVICE_NAME_MAX);
1061         dev->ib_dev.owner                = THIS_MODULE;
1062
1063         dev->ib_dev.node_type            = IB_NODE_CA;
1064         dev->ib_dev.phys_port_cnt        = dev->limits.num_ports;
1065         dev->ib_dev.dma_device           = &dev->pdev->dev;
1066         dev->ib_dev.class_dev.dev        = &dev->pdev->dev;
1067         dev->ib_dev.query_device         = mthca_query_device;
1068         dev->ib_dev.query_port           = mthca_query_port;
1069         dev->ib_dev.modify_port          = mthca_modify_port;
1070         dev->ib_dev.query_pkey           = mthca_query_pkey;
1071         dev->ib_dev.query_gid            = mthca_query_gid;
1072         dev->ib_dev.alloc_ucontext       = mthca_alloc_ucontext;
1073         dev->ib_dev.dealloc_ucontext     = mthca_dealloc_ucontext;
1074         dev->ib_dev.mmap                 = mthca_mmap_uar;
1075         dev->ib_dev.alloc_pd             = mthca_alloc_pd;
1076         dev->ib_dev.dealloc_pd           = mthca_dealloc_pd;
1077         dev->ib_dev.create_ah            = mthca_ah_create;
1078         dev->ib_dev.destroy_ah           = mthca_ah_destroy;
1079
1080         if (dev->mthca_flags & MTHCA_FLAG_SRQ) {
1081                 dev->ib_dev.create_srq           = mthca_create_srq;
1082                 dev->ib_dev.destroy_srq          = mthca_destroy_srq;
1083
1084                 if (mthca_is_memfree(dev))
1085                         dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv;
1086                 else
1087                         dev->ib_dev.post_srq_recv = mthca_tavor_post_srq_recv;
1088         }
1089
1090         dev->ib_dev.create_qp            = mthca_create_qp;
1091         dev->ib_dev.modify_qp            = mthca_modify_qp;
1092         dev->ib_dev.destroy_qp           = mthca_destroy_qp;
1093         dev->ib_dev.create_cq            = mthca_create_cq;
1094         dev->ib_dev.destroy_cq           = mthca_destroy_cq;
1095         dev->ib_dev.poll_cq              = mthca_poll_cq;
1096         dev->ib_dev.get_dma_mr           = mthca_get_dma_mr;
1097         dev->ib_dev.reg_phys_mr          = mthca_reg_phys_mr;
1098         dev->ib_dev.reg_user_mr          = mthca_reg_user_mr;
1099         dev->ib_dev.dereg_mr             = mthca_dereg_mr;
1100
1101         if (dev->mthca_flags & MTHCA_FLAG_FMR) {
1102                 dev->ib_dev.alloc_fmr            = mthca_alloc_fmr;
1103                 dev->ib_dev.unmap_fmr            = mthca_unmap_fmr;
1104                 dev->ib_dev.dealloc_fmr          = mthca_dealloc_fmr;
1105                 if (mthca_is_memfree(dev))
1106                         dev->ib_dev.map_phys_fmr = mthca_arbel_map_phys_fmr;
1107                 else
1108                         dev->ib_dev.map_phys_fmr = mthca_tavor_map_phys_fmr;
1109         }
1110
1111         dev->ib_dev.attach_mcast         = mthca_multicast_attach;
1112         dev->ib_dev.detach_mcast         = mthca_multicast_detach;
1113         dev->ib_dev.process_mad          = mthca_process_mad;
1114
1115         if (mthca_is_memfree(dev)) {
1116                 dev->ib_dev.req_notify_cq = mthca_arbel_arm_cq;
1117                 dev->ib_dev.post_send     = mthca_arbel_post_send;
1118                 dev->ib_dev.post_recv     = mthca_arbel_post_receive;
1119         } else {
1120                 dev->ib_dev.req_notify_cq = mthca_tavor_arm_cq;
1121                 dev->ib_dev.post_send     = mthca_tavor_post_send;
1122                 dev->ib_dev.post_recv     = mthca_tavor_post_receive;
1123         }
1124
1125         init_MUTEX(&dev->cap_mask_mutex);
1126
1127         ret = ib_register_device(&dev->ib_dev);
1128         if (ret)
1129                 return ret;
1130
1131         for (i = 0; i < ARRAY_SIZE(mthca_class_attributes); ++i) {
1132                 ret = class_device_create_file(&dev->ib_dev.class_dev,
1133                                                mthca_class_attributes[i]);
1134                 if (ret) {
1135                         ib_unregister_device(&dev->ib_dev);
1136                         return ret;
1137                 }
1138         }
1139
1140         return 0;
1141 }
1142
1143 void mthca_unregister_device(struct mthca_dev *dev)
1144 {
1145         ib_unregister_device(&dev->ib_dev);
1146 }