Linux Audio

Check our new training course

Loading...
v6.8
   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, 2006 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
  37#include <rdma/ib_smi.h>
  38#include <rdma/ib_umem.h>
  39#include <rdma/ib_user_verbs.h>
  40#include <rdma/uverbs_ioctl.h>
  41
  42#include <linux/sched.h>
  43#include <linux/slab.h>
  44#include <linux/stat.h>
  45#include <linux/mm.h>
  46#include <linux/export.h>
  47
  48#include "mthca_dev.h"
  49#include "mthca_cmd.h"
  50#include <rdma/mthca-abi.h>
  51#include "mthca_memfree.h"
  52
  53static int mthca_query_device(struct ib_device *ibdev, struct ib_device_attr *props,
  54			      struct ib_udata *uhw)
  55{
  56	struct ib_smp *in_mad;
  57	struct ib_smp *out_mad;
 
 
 
 
 
 
 
 
 
  58	int err = -ENOMEM;
  59	struct mthca_dev *mdev = to_mdev(ibdev);
  60
  61	if (uhw->inlen || uhw->outlen)
  62		return -EINVAL;
  63
  64	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
  65	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
  66	if (!in_mad || !out_mad)
  67		goto out;
  68
  69	memset(props, 0, sizeof *props);
  70
  71	props->fw_ver              = mdev->fw_ver;
  72
  73	ib_init_query_mad(in_mad);
  74	in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
  75
  76	err = mthca_MAD_IFC(mdev, 1, 1,
  77			    1, NULL, NULL, in_mad, out_mad);
  78	if (err)
  79		goto out;
  80
  81	props->device_cap_flags    = mdev->device_cap_flags;
  82	props->vendor_id           = be32_to_cpup((__be32 *) (out_mad->data + 36)) &
  83		0xffffff;
  84	props->vendor_part_id      = be16_to_cpup((__be16 *) (out_mad->data + 30));
  85	props->hw_ver              = be32_to_cpup((__be32 *) (out_mad->data + 32));
  86	memcpy(&props->sys_image_guid, out_mad->data +  4, 8);
  87
  88	props->max_mr_size         = ~0ull;
  89	props->page_size_cap       = mdev->limits.page_size_cap;
  90	props->max_qp              = mdev->limits.num_qps - mdev->limits.reserved_qps;
  91	props->max_qp_wr           = mdev->limits.max_wqes;
  92	props->max_send_sge        = mdev->limits.max_sg;
  93	props->max_recv_sge        = mdev->limits.max_sg;
  94	props->max_sge_rd          = mdev->limits.max_sg;
  95	props->max_cq              = mdev->limits.num_cqs - mdev->limits.reserved_cqs;
  96	props->max_cqe             = mdev->limits.max_cqes;
  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 = mdev->limits.max_qp_init_rdma;
 101	props->max_res_rd_atom     = props->max_qp_rd_atom * props->max_qp;
 102	props->max_srq             = mdev->limits.num_srqs - mdev->limits.reserved_srqs;
 103	props->max_srq_wr          = mdev->limits.max_srq_wqes;
 104	props->max_srq_sge         = mdev->limits.max_srq_sge;
 105	props->local_ca_ack_delay  = mdev->limits.local_ca_ack_delay;
 106	props->atomic_cap          = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ?
 107					IB_ATOMIC_HCA : IB_ATOMIC_NONE;
 108	props->max_pkeys           = mdev->limits.pkey_table_len;
 109	props->max_mcast_grp       = mdev->limits.num_mgms + mdev->limits.num_amgms;
 110	props->max_mcast_qp_attach = MTHCA_QP_PER_MGM;
 111	props->max_total_mcast_qp_attach = props->max_mcast_qp_attach *
 112					   props->max_mcast_grp;
 
 
 
 
 
 
 
 
 
 
 113
 114	err = 0;
 115 out:
 116	kfree(in_mad);
 117	kfree(out_mad);
 118	return err;
 119}
 120
 121static int mthca_query_port(struct ib_device *ibdev,
 122			    u32 port, struct ib_port_attr *props)
 123{
 124	struct ib_smp *in_mad;
 125	struct ib_smp *out_mad;
 126	int err = -ENOMEM;
 127
 128	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 129	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 130	if (!in_mad || !out_mad)
 131		goto out;
 132
 133	/* props being zeroed by the caller, avoid zeroing it here */
 134
 135	ib_init_query_mad(in_mad);
 136	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;
 137	in_mad->attr_mod = cpu_to_be32(port);
 138
 139	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 140			    port, NULL, NULL, in_mad, out_mad);
 141	if (err)
 142		goto out;
 143
 144	props->lid               = be16_to_cpup((__be16 *) (out_mad->data + 16));
 145	props->lmc               = out_mad->data[34] & 0x7;
 146	props->sm_lid            = be16_to_cpup((__be16 *) (out_mad->data + 18));
 147	props->sm_sl             = out_mad->data[36] & 0xf;
 148	props->state             = out_mad->data[32] & 0xf;
 149	props->phys_state        = out_mad->data[33] >> 4;
 150	props->port_cap_flags    = be32_to_cpup((__be32 *) (out_mad->data + 20));
 151	props->gid_tbl_len       = to_mdev(ibdev)->limits.gid_table_len;
 152	props->max_msg_sz        = 0x80000000;
 153	props->pkey_tbl_len      = to_mdev(ibdev)->limits.pkey_table_len;
 154	props->bad_pkey_cntr     = be16_to_cpup((__be16 *) (out_mad->data + 46));
 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	props->max_mtu           = out_mad->data[41] & 0xf;
 159	props->active_mtu        = out_mad->data[36] >> 4;
 160	props->subnet_timeout    = out_mad->data[51] & 0x1f;
 161	props->max_vl_num        = out_mad->data[37] >> 4;
 162	props->init_type_reply   = out_mad->data[41] >> 4;
 163
 164 out:
 165	kfree(in_mad);
 166	kfree(out_mad);
 167	return err;
 168}
 169
 170static int mthca_modify_device(struct ib_device *ibdev,
 171			       int mask,
 172			       struct ib_device_modify *props)
 173{
 174	if (mask & ~IB_DEVICE_MODIFY_NODE_DESC)
 175		return -EOPNOTSUPP;
 176
 177	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {
 178		if (mutex_lock_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
 179			return -ERESTARTSYS;
 180		memcpy(ibdev->node_desc, props->node_desc,
 181		       IB_DEVICE_NODE_DESC_MAX);
 182		mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
 183	}
 184
 185	return 0;
 186}
 187
 188static int mthca_modify_port(struct ib_device *ibdev,
 189			     u32 port, int port_modify_mask,
 190			     struct ib_port_modify *props)
 191{
 192	struct mthca_set_ib_param set_ib;
 193	struct ib_port_attr attr;
 194	int err;
 195
 196	if (mutex_lock_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
 197		return -ERESTARTSYS;
 198
 199	err = ib_query_port(ibdev, port, &attr);
 200	if (err)
 201		goto out;
 202
 203	set_ib.set_si_guid     = 0;
 204	set_ib.reset_qkey_viol = !!(port_modify_mask & IB_PORT_RESET_QKEY_CNTR);
 205
 206	set_ib.cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) &
 207		~props->clr_port_cap_mask;
 208
 209	err = mthca_SET_IB(to_mdev(ibdev), &set_ib, port);
 210	if (err)
 211		goto out;
 212out:
 213	mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
 214	return err;
 215}
 216
 217static int mthca_query_pkey(struct ib_device *ibdev,
 218			    u32 port, u16 index, u16 *pkey)
 219{
 220	struct ib_smp *in_mad;
 221	struct ib_smp *out_mad;
 222	int err = -ENOMEM;
 223
 224	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 225	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 226	if (!in_mad || !out_mad)
 227		goto out;
 228
 229	ib_init_query_mad(in_mad);
 230	in_mad->attr_id  = IB_SMP_ATTR_PKEY_TABLE;
 231	in_mad->attr_mod = cpu_to_be32(index / 32);
 232
 233	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 234			    port, NULL, NULL, in_mad, out_mad);
 235	if (err)
 236		goto out;
 237
 238	*pkey = be16_to_cpu(((__be16 *) out_mad->data)[index % 32]);
 239
 240 out:
 241	kfree(in_mad);
 242	kfree(out_mad);
 243	return err;
 244}
 245
 246static int mthca_query_gid(struct ib_device *ibdev, u32 port,
 247			   int index, union ib_gid *gid)
 248{
 249	struct ib_smp *in_mad;
 250	struct ib_smp *out_mad;
 251	int err = -ENOMEM;
 252
 253	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 254	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 255	if (!in_mad || !out_mad)
 256		goto out;
 257
 258	ib_init_query_mad(in_mad);
 259	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;
 260	in_mad->attr_mod = cpu_to_be32(port);
 261
 262	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 263			    port, NULL, NULL, in_mad, out_mad);
 264	if (err)
 265		goto out;
 266
 267	memcpy(gid->raw, out_mad->data + 8, 8);
 268
 269	ib_init_query_mad(in_mad);
 270	in_mad->attr_id  = IB_SMP_ATTR_GUID_INFO;
 271	in_mad->attr_mod = cpu_to_be32(index / 8);
 272
 273	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 274			    port, NULL, NULL, in_mad, out_mad);
 275	if (err)
 276		goto out;
 277
 278	memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8);
 279
 280 out:
 281	kfree(in_mad);
 282	kfree(out_mad);
 283	return err;
 284}
 285
 286static int mthca_alloc_ucontext(struct ib_ucontext *uctx,
 287				struct ib_udata *udata)
 288{
 289	struct ib_device *ibdev = uctx->device;
 290	struct mthca_alloc_ucontext_resp uresp = {};
 291	struct mthca_ucontext *context = to_mucontext(uctx);
 292	int                              err;
 293
 294	if (!(to_mdev(ibdev)->active))
 295		return -EAGAIN;
 
 
 296
 297	uresp.qp_tab_size = to_mdev(ibdev)->limits.num_qps;
 298	if (mthca_is_memfree(to_mdev(ibdev)))
 299		uresp.uarc_size = to_mdev(ibdev)->uar_table.uarc_size;
 300	else
 301		uresp.uarc_size = 0;
 302
 
 
 
 
 303	err = mthca_uar_alloc(to_mdev(ibdev), &context->uar);
 304	if (err)
 305		return err;
 
 
 306
 307	context->db_tab = mthca_init_user_db_tab(to_mdev(ibdev));
 308	if (IS_ERR(context->db_tab)) {
 309		err = PTR_ERR(context->db_tab);
 310		mthca_uar_free(to_mdev(ibdev), &context->uar);
 311		return err;
 
 312	}
 313
 314	if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) {
 315		mthca_cleanup_user_db_tab(to_mdev(ibdev), &context->uar, context->db_tab);
 316		mthca_uar_free(to_mdev(ibdev), &context->uar);
 317		return -EFAULT;
 
 318	}
 319
 320	context->reg_mr_warned = 0;
 321
 322	return 0;
 323}
 324
 325static void mthca_dealloc_ucontext(struct ib_ucontext *context)
 326{
 327	mthca_cleanup_user_db_tab(to_mdev(context->device), &to_mucontext(context)->uar,
 328				  to_mucontext(context)->db_tab);
 329	mthca_uar_free(to_mdev(context->device), &to_mucontext(context)->uar);
 
 
 
 330}
 331
 332static int mthca_mmap_uar(struct ib_ucontext *context,
 333			  struct vm_area_struct *vma)
 334{
 335	if (vma->vm_end - vma->vm_start != PAGE_SIZE)
 336		return -EINVAL;
 337
 338	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 339
 340	if (io_remap_pfn_range(vma, vma->vm_start,
 341			       to_mucontext(context)->uar.pfn,
 342			       PAGE_SIZE, vma->vm_page_prot))
 343		return -EAGAIN;
 344
 345	return 0;
 346}
 347
 348static int mthca_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 
 
 349{
 350	struct ib_device *ibdev = ibpd->device;
 351	struct mthca_pd *pd = to_mpd(ibpd);
 352	int err;
 353
 354	err = mthca_pd_alloc(to_mdev(ibdev), !udata, pd);
 355	if (err)
 356		return err;
 357
 358	if (udata) {
 
 
 
 
 
 
 359		if (ib_copy_to_udata(udata, &pd->pd_num, sizeof (__u32))) {
 360			mthca_pd_free(to_mdev(ibdev), pd);
 361			return -EFAULT;
 
 362		}
 363	}
 364
 365	return 0;
 366}
 367
 368static int mthca_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata)
 369{
 370	mthca_pd_free(to_mdev(pd->device), to_mpd(pd));
 
 
 371	return 0;
 372}
 373
 374static int mthca_ah_create(struct ib_ah *ibah,
 375			   struct rdma_ah_init_attr *init_attr,
 376			   struct ib_udata *udata)
 377
 378{
 379	struct mthca_ah *ah = to_mah(ibah);
 
 
 
 
 
 380
 381	return mthca_create_ah(to_mdev(ibah->device), to_mpd(ibah->pd),
 382			       init_attr->ah_attr, ah);
 
 
 
 
 
 383}
 384
 385static int mthca_ah_destroy(struct ib_ah *ah, u32 flags)
 386{
 387	mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));
 
 
 388	return 0;
 389}
 390
 391static int mthca_create_srq(struct ib_srq *ibsrq,
 392			    struct ib_srq_init_attr *init_attr,
 393			    struct ib_udata *udata)
 394{
 395	struct mthca_create_srq ucmd;
 396	struct mthca_ucontext *context = rdma_udata_to_drv_context(
 397		udata, struct mthca_ucontext, ibucontext);
 398	struct mthca_srq *srq = to_msrq(ibsrq);
 399	int err;
 400
 401	if (init_attr->srq_type != IB_SRQT_BASIC)
 402		return -EOPNOTSUPP;
 
 
 
 
 
 
 
 403
 404	if (udata) {
 405		if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
 406			return -EFAULT;
 
 407
 408		err = mthca_map_user_db(to_mdev(ibsrq->device), &context->uar,
 409					context->db_tab, ucmd.db_index,
 410					ucmd.db_page);
 411
 412		if (err)
 413			return err;
 414
 415		srq->mr.ibmr.lkey = ucmd.lkey;
 416		srq->db_index     = ucmd.db_index;
 417	}
 418
 419	err = mthca_alloc_srq(to_mdev(ibsrq->device), to_mpd(ibsrq->pd),
 420			      &init_attr->attr, srq, udata);
 421
 422	if (err && udata)
 423		mthca_unmap_user_db(to_mdev(ibsrq->device), &context->uar,
 424				    context->db_tab, ucmd.db_index);
 425
 426	if (err)
 427		return err;
 428
 429	if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof(__u32))) {
 430		mthca_free_srq(to_mdev(ibsrq->device), srq);
 431		return -EFAULT;
 
 432	}
 433
 434	return 0;
 
 
 
 
 
 435}
 436
 437static int mthca_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
 438{
 439	if (udata) {
 440		struct mthca_ucontext *context =
 441			rdma_udata_to_drv_context(
 442				udata,
 443				struct mthca_ucontext,
 444				ibucontext);
 445
 446		mthca_unmap_user_db(to_mdev(srq->device), &context->uar,
 447				    context->db_tab, to_msrq(srq)->db_index);
 448	}
 449
 450	mthca_free_srq(to_mdev(srq->device), to_msrq(srq));
 
 
 451	return 0;
 452}
 453
 454static int mthca_create_qp(struct ib_qp *ibqp,
 455			   struct ib_qp_init_attr *init_attr,
 456			   struct ib_udata *udata)
 457{
 458	struct mthca_ucontext *context = rdma_udata_to_drv_context(
 459		udata, struct mthca_ucontext, ibucontext);
 460	struct mthca_create_qp ucmd;
 461	struct mthca_qp *qp = to_mqp(ibqp);
 462	struct mthca_dev *dev = to_mdev(ibqp->device);
 463	int err;
 464
 465	if (init_attr->create_flags)
 466		return -EOPNOTSUPP;
 467
 468	switch (init_attr->qp_type) {
 469	case IB_QPT_RC:
 470	case IB_QPT_UC:
 471	case IB_QPT_UD:
 472	{
 473		if (udata) {
 474			if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
 475				return -EFAULT;
 
 
 
 
 
 
 
 
 
 
 476
 477			err = mthca_map_user_db(dev, &context->uar,
 478						context->db_tab,
 479						ucmd.sq_db_index,
 480						ucmd.sq_db_page);
 481			if (err)
 482				return err;
 
 483
 484			err = mthca_map_user_db(dev, &context->uar,
 485						context->db_tab,
 486						ucmd.rq_db_index,
 487						ucmd.rq_db_page);
 488			if (err) {
 489				mthca_unmap_user_db(dev, &context->uar,
 
 490						    context->db_tab,
 491						    ucmd.sq_db_index);
 492				return err;
 
 493			}
 494
 495			qp->mr.ibmr.lkey = ucmd.lkey;
 496			qp->sq.db_index  = ucmd.sq_db_index;
 497			qp->rq.db_index  = ucmd.rq_db_index;
 498		}
 499
 500		err = mthca_alloc_qp(dev, to_mpd(ibqp->pd),
 501				     to_mcq(init_attr->send_cq),
 502				     to_mcq(init_attr->recv_cq),
 503				     init_attr->qp_type, init_attr->sq_sig_type,
 504				     &init_attr->cap, qp, udata);
 
 
 
 505
 506		if (err && udata) {
 507			mthca_unmap_user_db(dev, &context->uar, context->db_tab,
 
 508					    ucmd.sq_db_index);
 509			mthca_unmap_user_db(dev, &context->uar, context->db_tab,
 
 
 510					    ucmd.rq_db_index);
 511		}
 512
 513		qp->ibqp.qp_num = qp->qpn;
 514		break;
 515	}
 516	case IB_QPT_SMI:
 517	case IB_QPT_GSI:
 518	{
 519		qp->sqp = kzalloc(sizeof(struct mthca_sqp), GFP_KERNEL);
 520		if (!qp->sqp)
 521			return -ENOMEM;
 
 
 
 
 522
 523		qp->ibqp.qp_num = init_attr->qp_type == IB_QPT_SMI ? 0 : 1;
 524
 525		err = mthca_alloc_sqp(dev, to_mpd(ibqp->pd),
 526				      to_mcq(init_attr->send_cq),
 527				      to_mcq(init_attr->recv_cq),
 528				      init_attr->sq_sig_type, &init_attr->cap,
 529				      qp->ibqp.qp_num, init_attr->port_num, qp,
 530				      udata);
 531		break;
 532	}
 533	default:
 534		/* Don't support raw QPs */
 535		return -EOPNOTSUPP;
 536	}
 537
 538	if (err) {
 539		kfree(qp->sqp);
 540		return err;
 541	}
 542
 543	init_attr->cap.max_send_wr     = qp->sq.max;
 544	init_attr->cap.max_recv_wr     = qp->rq.max;
 545	init_attr->cap.max_send_sge    = qp->sq.max_gs;
 546	init_attr->cap.max_recv_sge    = qp->rq.max_gs;
 547	init_attr->cap.max_inline_data = qp->max_inline_data;
 548
 549	return 0;
 550}
 551
 552static int mthca_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
 553{
 554	if (udata) {
 555		struct mthca_ucontext *context =
 556			rdma_udata_to_drv_context(
 557				udata,
 558				struct mthca_ucontext,
 559				ibucontext);
 560
 561		mthca_unmap_user_db(to_mdev(qp->device),
 562				    &context->uar,
 563				    context->db_tab,
 564				    to_mqp(qp)->sq.db_index);
 565		mthca_unmap_user_db(to_mdev(qp->device),
 566				    &context->uar,
 567				    context->db_tab,
 568				    to_mqp(qp)->rq.db_index);
 569	}
 570	mthca_free_qp(to_mdev(qp->device), to_mqp(qp));
 571	kfree(to_mqp(qp)->sqp);
 572	return 0;
 573}
 574
 575static int mthca_create_cq(struct ib_cq *ibcq,
 576			   const struct ib_cq_init_attr *attr,
 577			   struct ib_udata *udata)
 
 578{
 579	struct ib_device *ibdev = ibcq->device;
 580	int entries = attr->cqe;
 581	struct mthca_create_cq ucmd;
 582	struct mthca_cq *cq;
 583	int nent;
 584	int err;
 585	struct mthca_ucontext *context = rdma_udata_to_drv_context(
 586		udata, struct mthca_ucontext, ibucontext);
 587
 588	if (attr->flags)
 589		return -EOPNOTSUPP;
 590
 591	if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes)
 592		return -EINVAL;
 593
 594	if (udata) {
 595		if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
 596			return -EFAULT;
 597
 598		err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
 599					context->db_tab, ucmd.set_db_index,
 600					ucmd.set_db_page);
 601		if (err)
 602			return err;
 603
 604		err = mthca_map_user_db(to_mdev(ibdev), &context->uar,
 605					context->db_tab, ucmd.arm_db_index,
 606					ucmd.arm_db_page);
 607		if (err)
 608			goto err_unmap_set;
 609	}
 610
 611	cq = to_mcq(ibcq);
 
 
 
 
 612
 613	if (udata) {
 614		cq->buf.mr.ibmr.lkey = ucmd.lkey;
 615		cq->set_ci_db_index  = ucmd.set_db_index;
 616		cq->arm_db_index     = ucmd.arm_db_index;
 617	}
 618
 619	for (nent = 1; nent <= entries; nent <<= 1)
 620		; /* nothing */
 621
 622	err = mthca_init_cq(to_mdev(ibdev), nent, context,
 623			    udata ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
 
 624			    cq);
 625	if (err)
 626		goto err_unmap_arm;
 627
 628	if (udata && ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) {
 629		mthca_free_cq(to_mdev(ibdev), cq);
 630		err = -EFAULT;
 631		goto err_unmap_arm;
 632	}
 633
 634	cq->resize_buf = NULL;
 635
 636	return 0;
 
 
 
 637
 638err_unmap_arm:
 639	if (udata)
 640		mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
 641				    context->db_tab, ucmd.arm_db_index);
 642
 643err_unmap_set:
 644	if (udata)
 645		mthca_unmap_user_db(to_mdev(ibdev), &context->uar,
 646				    context->db_tab, ucmd.set_db_index);
 647
 648	return err;
 649}
 650
 651static int mthca_alloc_resize_buf(struct mthca_dev *dev, struct mthca_cq *cq,
 652				  int entries)
 653{
 654	int ret;
 655
 656	spin_lock_irq(&cq->lock);
 657	if (cq->resize_buf) {
 658		ret = -EBUSY;
 659		goto unlock;
 660	}
 661
 662	cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_ATOMIC);
 663	if (!cq->resize_buf) {
 664		ret = -ENOMEM;
 665		goto unlock;
 666	}
 667
 668	cq->resize_buf->state = CQ_RESIZE_ALLOC;
 669
 670	ret = 0;
 671
 672unlock:
 673	spin_unlock_irq(&cq->lock);
 674
 675	if (ret)
 676		return ret;
 677
 678	ret = mthca_alloc_cq_buf(dev, &cq->resize_buf->buf, entries);
 679	if (ret) {
 680		spin_lock_irq(&cq->lock);
 681		kfree(cq->resize_buf);
 682		cq->resize_buf = NULL;
 683		spin_unlock_irq(&cq->lock);
 684		return ret;
 685	}
 686
 687	cq->resize_buf->cqe = entries - 1;
 688
 689	spin_lock_irq(&cq->lock);
 690	cq->resize_buf->state = CQ_RESIZE_READY;
 691	spin_unlock_irq(&cq->lock);
 692
 693	return 0;
 694}
 695
 696static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
 697{
 698	struct mthca_dev *dev = to_mdev(ibcq->device);
 699	struct mthca_cq *cq = to_mcq(ibcq);
 700	struct mthca_resize_cq ucmd;
 701	u32 lkey;
 702	int ret;
 703
 704	if (entries < 1 || entries > dev->limits.max_cqes)
 705		return -EINVAL;
 706
 707	mutex_lock(&cq->mutex);
 708
 709	entries = roundup_pow_of_two(entries + 1);
 710	if (entries == ibcq->cqe + 1) {
 711		ret = 0;
 712		goto out;
 713	}
 714
 715	if (cq->is_kernel) {
 716		ret = mthca_alloc_resize_buf(dev, cq, entries);
 717		if (ret)
 718			goto out;
 719		lkey = cq->resize_buf->buf.mr.ibmr.lkey;
 720	} else {
 721		if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
 722			ret = -EFAULT;
 723			goto out;
 724		}
 725		lkey = ucmd.lkey;
 726	}
 727
 728	ret = mthca_RESIZE_CQ(dev, cq->cqn, lkey, ilog2(entries));
 729
 730	if (ret) {
 731		if (cq->resize_buf) {
 732			mthca_free_cq_buf(dev, &cq->resize_buf->buf,
 733					  cq->resize_buf->cqe);
 734			kfree(cq->resize_buf);
 735			spin_lock_irq(&cq->lock);
 736			cq->resize_buf = NULL;
 737			spin_unlock_irq(&cq->lock);
 738		}
 739		goto out;
 740	}
 741
 742	if (cq->is_kernel) {
 743		struct mthca_cq_buf tbuf;
 744		int tcqe;
 745
 746		spin_lock_irq(&cq->lock);
 747		if (cq->resize_buf->state == CQ_RESIZE_READY) {
 748			mthca_cq_resize_copy_cqes(cq);
 749			tbuf         = cq->buf;
 750			tcqe         = cq->ibcq.cqe;
 751			cq->buf      = cq->resize_buf->buf;
 752			cq->ibcq.cqe = cq->resize_buf->cqe;
 753		} else {
 754			tbuf = cq->resize_buf->buf;
 755			tcqe = cq->resize_buf->cqe;
 756		}
 757
 758		kfree(cq->resize_buf);
 759		cq->resize_buf = NULL;
 760		spin_unlock_irq(&cq->lock);
 761
 762		mthca_free_cq_buf(dev, &tbuf, tcqe);
 763	} else
 764		ibcq->cqe = entries - 1;
 765
 766out:
 767	mutex_unlock(&cq->mutex);
 768
 769	return ret;
 770}
 771
 772static int mthca_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
 773{
 774	if (udata) {
 775		struct mthca_ucontext *context =
 776			rdma_udata_to_drv_context(
 777				udata,
 778				struct mthca_ucontext,
 779				ibucontext);
 780
 781		mthca_unmap_user_db(to_mdev(cq->device),
 782				    &context->uar,
 783				    context->db_tab,
 784				    to_mcq(cq)->arm_db_index);
 785		mthca_unmap_user_db(to_mdev(cq->device),
 786				    &context->uar,
 787				    context->db_tab,
 788				    to_mcq(cq)->set_ci_db_index);
 789	}
 790	mthca_free_cq(to_mdev(cq->device), to_mcq(cq));
 
 
 791	return 0;
 792}
 793
 794static inline u32 convert_access(int acc)
 795{
 796	return (acc & IB_ACCESS_REMOTE_ATOMIC ? MTHCA_MPT_FLAG_ATOMIC       : 0) |
 797	       (acc & IB_ACCESS_REMOTE_WRITE  ? MTHCA_MPT_FLAG_REMOTE_WRITE : 0) |
 798	       (acc & IB_ACCESS_REMOTE_READ   ? MTHCA_MPT_FLAG_REMOTE_READ  : 0) |
 799	       (acc & IB_ACCESS_LOCAL_WRITE   ? MTHCA_MPT_FLAG_LOCAL_WRITE  : 0) |
 800	       MTHCA_MPT_FLAG_LOCAL_READ;
 801}
 802
 803static struct ib_mr *mthca_get_dma_mr(struct ib_pd *pd, int acc)
 804{
 805	struct mthca_mr *mr;
 806	int err;
 807
 808	mr = kmalloc(sizeof *mr, GFP_KERNEL);
 809	if (!mr)
 810		return ERR_PTR(-ENOMEM);
 811
 812	err = mthca_mr_alloc_notrans(to_mdev(pd->device),
 813				     to_mpd(pd)->pd_num,
 814				     convert_access(acc), mr);
 815
 816	if (err) {
 817		kfree(mr);
 818		return ERR_PTR(err);
 819	}
 820
 821	mr->umem = NULL;
 822
 823	return &mr->ibmr;
 824}
 825
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 826static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 827				       u64 virt, int acc, struct ib_udata *udata)
 828{
 829	struct mthca_dev *dev = to_mdev(pd->device);
 830	struct ib_block_iter biter;
 831	struct mthca_ucontext *context = rdma_udata_to_drv_context(
 832		udata, struct mthca_ucontext, ibucontext);
 833	struct mthca_mr *mr;
 834	struct mthca_reg_mr ucmd;
 835	u64 *pages;
 836	int n, i;
 
 837	int err = 0;
 838	int write_mtt_size;
 839
 840	if (udata->inlen < sizeof ucmd) {
 841		if (!context->reg_mr_warned) {
 842			mthca_warn(dev, "Process '%s' did not pass in MR attrs.\n",
 843				   current->comm);
 844			mthca_warn(dev, "  Update libmthca to fix this.\n");
 845		}
 846		++context->reg_mr_warned;
 847		ucmd.mr_attrs = 0;
 848	} else if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
 849		return ERR_PTR(-EFAULT);
 850
 851	mr = kmalloc(sizeof *mr, GFP_KERNEL);
 852	if (!mr)
 853		return ERR_PTR(-ENOMEM);
 854
 855	mr->umem = ib_umem_get(pd->device, start, length, acc);
 
 
 856	if (IS_ERR(mr->umem)) {
 857		err = PTR_ERR(mr->umem);
 858		goto err;
 859	}
 860
 861	n = ib_umem_num_dma_blocks(mr->umem, PAGE_SIZE);
 
 862
 863	mr->mtt = mthca_alloc_mtt(dev, n);
 864	if (IS_ERR(mr->mtt)) {
 865		err = PTR_ERR(mr->mtt);
 866		goto err_umem;
 867	}
 868
 869	pages = (u64 *) __get_free_page(GFP_KERNEL);
 870	if (!pages) {
 871		err = -ENOMEM;
 872		goto err_mtt;
 873	}
 874
 875	i = n = 0;
 876
 877	write_mtt_size = min(mthca_write_mtt_size(dev), (int) (PAGE_SIZE / sizeof *pages));
 878
 879	rdma_umem_for_each_dma_block(mr->umem, &biter, PAGE_SIZE) {
 880		pages[i++] = rdma_block_iter_dma_address(&biter);
 881
 882		/*
 883		 * Be friendly to write_mtt and pass it chunks
 884		 * of appropriate size.
 885		 */
 886		if (i == write_mtt_size) {
 887			err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
 888			if (err)
 889				goto mtt_done;
 890			n += i;
 891			i = 0;
 
 
 
 892		}
 893	}
 894
 895	if (i)
 896		err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
 897mtt_done:
 898	free_page((unsigned long) pages);
 899	if (err)
 900		goto err_mtt;
 901
 902	err = mthca_mr_alloc(dev, to_mpd(pd)->pd_num, PAGE_SHIFT, virt, length,
 903			     convert_access(acc), mr);
 904
 905	if (err)
 906		goto err_mtt;
 907
 908	return &mr->ibmr;
 909
 910err_mtt:
 911	mthca_free_mtt(dev, mr->mtt);
 912
 913err_umem:
 914	ib_umem_release(mr->umem);
 915
 916err:
 917	kfree(mr);
 918	return ERR_PTR(err);
 919}
 920
 921static int mthca_dereg_mr(struct ib_mr *mr, struct ib_udata *udata)
 922{
 923	struct mthca_mr *mmr = to_mmr(mr);
 924
 925	mthca_free_mr(to_mdev(mr->device), mmr);
 926	ib_umem_release(mmr->umem);
 
 927	kfree(mmr);
 928
 929	return 0;
 930}
 931
 932static ssize_t hw_rev_show(struct device *device,
 933			   struct device_attribute *attr, char *buf)
 934{
 935	struct mthca_dev *dev =
 936		rdma_device_to_drv_device(device, struct mthca_dev, ib_dev);
 
 
 
 
 
 
 
 
 937
 938	return sysfs_emit(buf, "%x\n", dev->rev_id);
 
 
 
 
 
 939}
 940static DEVICE_ATTR_RO(hw_rev);
 941
 942static const char *hca_type_string(int hca_type)
 943{
 944	switch (hca_type) {
 945	case PCI_DEVICE_ID_MELLANOX_TAVOR:
 946		return "MT23108";
 947	case PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT:
 948		return "MT25208 (MT23108 compat mode)";
 949	case PCI_DEVICE_ID_MELLANOX_ARBEL:
 950		return "MT25208";
 951	case PCI_DEVICE_ID_MELLANOX_SINAI:
 952	case PCI_DEVICE_ID_MELLANOX_SINAI_OLD:
 953		return "MT25204";
 
 
 
 
 
 
 
 
 
 
 
 954	}
 955
 956	return "unknown";
 
 
 
 
 
 
 
 
 
 
 
 
 
 957}
 958
 959static ssize_t hca_type_show(struct device *device,
 960			     struct device_attribute *attr, char *buf)
 961{
 962	struct mthca_dev *dev =
 963		rdma_device_to_drv_device(device, struct mthca_dev, ib_dev);
 964
 965	return sysfs_emit(buf, "%s\n", hca_type_string(dev->pdev->device));
 966}
 967static DEVICE_ATTR_RO(hca_type);
 968
 969static ssize_t board_id_show(struct device *device,
 970			     struct device_attribute *attr, char *buf)
 971{
 972	struct mthca_dev *dev =
 973		rdma_device_to_drv_device(device, struct mthca_dev, ib_dev);
 
 
 
 
 974
 975	return sysfs_emit(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 976}
 977static DEVICE_ATTR_RO(board_id);
 978
 979static struct attribute *mthca_dev_attributes[] = {
 980	&dev_attr_hw_rev.attr,
 981	&dev_attr_hca_type.attr,
 982	&dev_attr_board_id.attr,
 983	NULL
 984};
 
 985
 986static const struct attribute_group mthca_attr_group = {
 987	.attrs = mthca_dev_attributes,
 
 
 
 
 
 
 
 
 988};
 989
 990static int mthca_init_node_data(struct mthca_dev *dev)
 991{
 992	struct ib_smp *in_mad;
 993	struct ib_smp *out_mad;
 994	int err = -ENOMEM;
 995
 996	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 997	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 998	if (!in_mad || !out_mad)
 999		goto out;
1000
1001	ib_init_query_mad(in_mad);
1002	in_mad->attr_id = IB_SMP_ATTR_NODE_DESC;
1003
1004	err = mthca_MAD_IFC(dev, 1, 1,
1005			    1, NULL, NULL, in_mad, out_mad);
1006	if (err)
1007		goto out;
1008
1009	memcpy(dev->ib_dev.node_desc, out_mad->data, IB_DEVICE_NODE_DESC_MAX);
1010
1011	in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
1012
1013	err = mthca_MAD_IFC(dev, 1, 1,
1014			    1, NULL, NULL, in_mad, out_mad);
1015	if (err)
1016		goto out;
1017
1018	if (mthca_is_memfree(dev))
1019		dev->rev_id = be32_to_cpup((__be32 *) (out_mad->data + 32));
1020	memcpy(&dev->ib_dev.node_guid, out_mad->data + 12, 8);
1021
1022out:
1023	kfree(in_mad);
1024	kfree(out_mad);
1025	return err;
1026}
1027
1028static int mthca_port_immutable(struct ib_device *ibdev, u32 port_num,
1029			        struct ib_port_immutable *immutable)
1030{
1031	struct ib_port_attr attr;
1032	int err;
1033
1034	immutable->core_cap_flags = RDMA_CORE_PORT_IBA_IB;
1035
1036	err = ib_query_port(ibdev, port_num, &attr);
1037	if (err)
1038		return err;
1039
1040	immutable->pkey_tbl_len = attr.pkey_tbl_len;
1041	immutable->gid_tbl_len = attr.gid_tbl_len;
1042	immutable->max_mad_size = IB_MGMT_MAD_SIZE;
1043
1044	return 0;
1045}
1046
1047static void get_dev_fw_str(struct ib_device *device, char *str)
1048{
1049	struct mthca_dev *dev =
1050		container_of(device, struct mthca_dev, ib_dev);
1051	snprintf(str, IB_FW_VERSION_NAME_MAX, "%d.%d.%d",
1052		 (int) (dev->fw_ver >> 32),
1053		 (int) (dev->fw_ver >> 16) & 0xffff,
1054		 (int) dev->fw_ver & 0xffff);
1055}
1056
1057static const struct ib_device_ops mthca_dev_ops = {
1058	.owner = THIS_MODULE,
1059	.driver_id = RDMA_DRIVER_MTHCA,
1060	.uverbs_abi_ver = MTHCA_UVERBS_ABI_VERSION,
1061	.uverbs_no_driver_id_binding = 1,
1062
1063	.alloc_pd = mthca_alloc_pd,
1064	.alloc_ucontext = mthca_alloc_ucontext,
1065	.attach_mcast = mthca_multicast_attach,
1066	.create_ah = mthca_ah_create,
1067	.create_cq = mthca_create_cq,
1068	.create_qp = mthca_create_qp,
1069	.dealloc_pd = mthca_dealloc_pd,
1070	.dealloc_ucontext = mthca_dealloc_ucontext,
1071	.dereg_mr = mthca_dereg_mr,
1072	.destroy_ah = mthca_ah_destroy,
1073	.destroy_cq = mthca_destroy_cq,
1074	.destroy_qp = mthca_destroy_qp,
1075	.detach_mcast = mthca_multicast_detach,
1076	.device_group = &mthca_attr_group,
1077	.get_dev_fw_str = get_dev_fw_str,
1078	.get_dma_mr = mthca_get_dma_mr,
1079	.get_port_immutable = mthca_port_immutable,
1080	.mmap = mthca_mmap_uar,
1081	.modify_device = mthca_modify_device,
1082	.modify_port = mthca_modify_port,
1083	.modify_qp = mthca_modify_qp,
1084	.poll_cq = mthca_poll_cq,
1085	.process_mad = mthca_process_mad,
1086	.query_ah = mthca_ah_query,
1087	.query_device = mthca_query_device,
1088	.query_gid = mthca_query_gid,
1089	.query_pkey = mthca_query_pkey,
1090	.query_port = mthca_query_port,
1091	.query_qp = mthca_query_qp,
1092	.reg_user_mr = mthca_reg_user_mr,
1093	.resize_cq = mthca_resize_cq,
1094
1095	INIT_RDMA_OBJ_SIZE(ib_ah, mthca_ah, ibah),
1096	INIT_RDMA_OBJ_SIZE(ib_cq, mthca_cq, ibcq),
1097	INIT_RDMA_OBJ_SIZE(ib_pd, mthca_pd, ibpd),
1098	INIT_RDMA_OBJ_SIZE(ib_qp, mthca_qp, ibqp),
1099	INIT_RDMA_OBJ_SIZE(ib_ucontext, mthca_ucontext, ibucontext),
1100};
1101
1102static const struct ib_device_ops mthca_dev_arbel_srq_ops = {
1103	.create_srq = mthca_create_srq,
1104	.destroy_srq = mthca_destroy_srq,
1105	.modify_srq = mthca_modify_srq,
1106	.post_srq_recv = mthca_arbel_post_srq_recv,
1107	.query_srq = mthca_query_srq,
1108
1109	INIT_RDMA_OBJ_SIZE(ib_srq, mthca_srq, ibsrq),
1110};
1111
1112static const struct ib_device_ops mthca_dev_tavor_srq_ops = {
1113	.create_srq = mthca_create_srq,
1114	.destroy_srq = mthca_destroy_srq,
1115	.modify_srq = mthca_modify_srq,
1116	.post_srq_recv = mthca_tavor_post_srq_recv,
1117	.query_srq = mthca_query_srq,
1118
1119	INIT_RDMA_OBJ_SIZE(ib_srq, mthca_srq, ibsrq),
1120};
1121
1122static const struct ib_device_ops mthca_dev_arbel_ops = {
1123	.post_recv = mthca_arbel_post_receive,
1124	.post_send = mthca_arbel_post_send,
1125	.req_notify_cq = mthca_arbel_arm_cq,
1126};
1127
1128static const struct ib_device_ops mthca_dev_tavor_ops = {
1129	.post_recv = mthca_tavor_post_receive,
1130	.post_send = mthca_tavor_post_send,
1131	.req_notify_cq = mthca_tavor_arm_cq,
1132};
1133
1134int mthca_register_device(struct mthca_dev *dev)
1135{
1136	int ret;
 
1137
1138	ret = mthca_init_node_data(dev);
1139	if (ret)
1140		return ret;
1141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1142	dev->ib_dev.node_type            = RDMA_NODE_IB_CA;
1143	dev->ib_dev.phys_port_cnt        = dev->limits.num_ports;
1144	dev->ib_dev.num_comp_vectors     = 1;
1145	dev->ib_dev.dev.parent           = &dev->pdev->dev;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1146
1147	if (dev->mthca_flags & MTHCA_FLAG_SRQ) {
 
 
 
 
 
 
 
 
 
 
1148		if (mthca_is_memfree(dev))
1149			ib_set_device_ops(&dev->ib_dev,
1150					  &mthca_dev_arbel_srq_ops);
1151		else
1152			ib_set_device_ops(&dev->ib_dev,
1153					  &mthca_dev_tavor_srq_ops);
1154	}
1155
1156	ib_set_device_ops(&dev->ib_dev, &mthca_dev_ops);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1157
1158	if (mthca_is_memfree(dev))
1159		ib_set_device_ops(&dev->ib_dev, &mthca_dev_arbel_ops);
1160	else
1161		ib_set_device_ops(&dev->ib_dev, &mthca_dev_tavor_ops);
 
 
 
 
 
 
 
 
 
1162
1163	mutex_init(&dev->cap_mask_mutex);
1164
1165	ret = ib_register_device(&dev->ib_dev, "mthca%d", &dev->pdev->dev);
1166	if (ret)
1167		return ret;
 
 
 
 
 
 
 
 
 
1168
1169	mthca_start_catas_poll(dev);
1170
1171	return 0;
1172}
1173
1174void mthca_unregister_device(struct mthca_dev *dev)
1175{
1176	mthca_stop_catas_poll(dev);
1177	ib_unregister_device(&dev->ib_dev);
1178}
v3.15
   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, 2006 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
  37#include <rdma/ib_smi.h>
  38#include <rdma/ib_umem.h>
  39#include <rdma/ib_user_verbs.h>
 
  40
  41#include <linux/sched.h>
  42#include <linux/slab.h>
  43#include <linux/stat.h>
  44#include <linux/mm.h>
  45#include <linux/export.h>
  46
  47#include "mthca_dev.h"
  48#include "mthca_cmd.h"
  49#include "mthca_user.h"
  50#include "mthca_memfree.h"
  51
  52static void init_query_mad(struct ib_smp *mad)
 
  53{
  54	mad->base_version  = 1;
  55	mad->mgmt_class    = IB_MGMT_CLASS_SUBN_LID_ROUTED;
  56	mad->class_version = 1;
  57	mad->method    	   = IB_MGMT_METHOD_GET;
  58}
  59
  60static int mthca_query_device(struct ib_device *ibdev,
  61			      struct ib_device_attr *props)
  62{
  63	struct ib_smp *in_mad  = NULL;
  64	struct ib_smp *out_mad = NULL;
  65	int err = -ENOMEM;
  66	struct mthca_dev *mdev = to_mdev(ibdev);
  67
 
 
 
  68	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
  69	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
  70	if (!in_mad || !out_mad)
  71		goto out;
  72
  73	memset(props, 0, sizeof *props);
  74
  75	props->fw_ver              = mdev->fw_ver;
  76
  77	init_query_mad(in_mad);
  78	in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
  79
  80	err = mthca_MAD_IFC(mdev, 1, 1,
  81			    1, NULL, NULL, in_mad, out_mad);
  82	if (err)
  83		goto out;
  84
  85	props->device_cap_flags    = mdev->device_cap_flags;
  86	props->vendor_id           = be32_to_cpup((__be32 *) (out_mad->data + 36)) &
  87		0xffffff;
  88	props->vendor_part_id      = be16_to_cpup((__be16 *) (out_mad->data + 30));
  89	props->hw_ver              = be32_to_cpup((__be32 *) (out_mad->data + 32));
  90	memcpy(&props->sys_image_guid, out_mad->data +  4, 8);
  91
  92	props->max_mr_size         = ~0ull;
  93	props->page_size_cap       = mdev->limits.page_size_cap;
  94	props->max_qp              = mdev->limits.num_qps - mdev->limits.reserved_qps;
  95	props->max_qp_wr           = mdev->limits.max_wqes;
  96	props->max_sge             = mdev->limits.max_sg;
 
 
  97	props->max_cq              = mdev->limits.num_cqs - mdev->limits.reserved_cqs;
  98	props->max_cqe             = mdev->limits.max_cqes;
  99	props->max_mr              = mdev->limits.num_mpts - mdev->limits.reserved_mrws;
 100	props->max_pd              = mdev->limits.num_pds - mdev->limits.reserved_pds;
 101	props->max_qp_rd_atom      = 1 << mdev->qp_table.rdb_shift;
 102	props->max_qp_init_rd_atom = mdev->limits.max_qp_init_rdma;
 103	props->max_res_rd_atom     = props->max_qp_rd_atom * props->max_qp;
 104	props->max_srq             = mdev->limits.num_srqs - mdev->limits.reserved_srqs;
 105	props->max_srq_wr          = mdev->limits.max_srq_wqes;
 106	props->max_srq_sge         = mdev->limits.max_srq_sge;
 107	props->local_ca_ack_delay  = mdev->limits.local_ca_ack_delay;
 108	props->atomic_cap          = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ?
 109					IB_ATOMIC_HCA : IB_ATOMIC_NONE;
 110	props->max_pkeys           = mdev->limits.pkey_table_len;
 111	props->max_mcast_grp       = mdev->limits.num_mgms + mdev->limits.num_amgms;
 112	props->max_mcast_qp_attach = MTHCA_QP_PER_MGM;
 113	props->max_total_mcast_qp_attach = props->max_mcast_qp_attach *
 114					   props->max_mcast_grp;
 115	/*
 116	 * If Sinai memory key optimization is being used, then only
 117	 * the 8-bit key portion will change.  For other HCAs, the
 118	 * unused index bits will also be used for FMR remapping.
 119	 */
 120	if (mdev->mthca_flags & MTHCA_FLAG_SINAI_OPT)
 121		props->max_map_per_fmr = 255;
 122	else
 123		props->max_map_per_fmr =
 124			(1 << (32 - ilog2(mdev->limits.num_mpts))) - 1;
 125
 126	err = 0;
 127 out:
 128	kfree(in_mad);
 129	kfree(out_mad);
 130	return err;
 131}
 132
 133static int mthca_query_port(struct ib_device *ibdev,
 134			    u8 port, struct ib_port_attr *props)
 135{
 136	struct ib_smp *in_mad  = NULL;
 137	struct ib_smp *out_mad = NULL;
 138	int err = -ENOMEM;
 139
 140	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 141	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 142	if (!in_mad || !out_mad)
 143		goto out;
 144
 145	memset(props, 0, sizeof *props);
 146
 147	init_query_mad(in_mad);
 148	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;
 149	in_mad->attr_mod = cpu_to_be32(port);
 150
 151	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 152			    port, NULL, NULL, in_mad, out_mad);
 153	if (err)
 154		goto out;
 155
 156	props->lid               = be16_to_cpup((__be16 *) (out_mad->data + 16));
 157	props->lmc               = out_mad->data[34] & 0x7;
 158	props->sm_lid            = be16_to_cpup((__be16 *) (out_mad->data + 18));
 159	props->sm_sl             = out_mad->data[36] & 0xf;
 160	props->state             = out_mad->data[32] & 0xf;
 161	props->phys_state        = out_mad->data[33] >> 4;
 162	props->port_cap_flags    = be32_to_cpup((__be32 *) (out_mad->data + 20));
 163	props->gid_tbl_len       = to_mdev(ibdev)->limits.gid_table_len;
 164	props->max_msg_sz        = 0x80000000;
 165	props->pkey_tbl_len      = to_mdev(ibdev)->limits.pkey_table_len;
 166	props->bad_pkey_cntr     = be16_to_cpup((__be16 *) (out_mad->data + 46));
 167	props->qkey_viol_cntr    = be16_to_cpup((__be16 *) (out_mad->data + 48));
 168	props->active_width      = out_mad->data[31] & 0xf;
 169	props->active_speed      = out_mad->data[35] >> 4;
 170	props->max_mtu           = out_mad->data[41] & 0xf;
 171	props->active_mtu        = out_mad->data[36] >> 4;
 172	props->subnet_timeout    = out_mad->data[51] & 0x1f;
 173	props->max_vl_num        = out_mad->data[37] >> 4;
 174	props->init_type_reply   = out_mad->data[41] >> 4;
 175
 176 out:
 177	kfree(in_mad);
 178	kfree(out_mad);
 179	return err;
 180}
 181
 182static int mthca_modify_device(struct ib_device *ibdev,
 183			       int mask,
 184			       struct ib_device_modify *props)
 185{
 186	if (mask & ~IB_DEVICE_MODIFY_NODE_DESC)
 187		return -EOPNOTSUPP;
 188
 189	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {
 190		if (mutex_lock_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
 191			return -ERESTARTSYS;
 192		memcpy(ibdev->node_desc, props->node_desc, 64);
 
 193		mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
 194	}
 195
 196	return 0;
 197}
 198
 199static int mthca_modify_port(struct ib_device *ibdev,
 200			     u8 port, int port_modify_mask,
 201			     struct ib_port_modify *props)
 202{
 203	struct mthca_set_ib_param set_ib;
 204	struct ib_port_attr attr;
 205	int err;
 206
 207	if (mutex_lock_interruptible(&to_mdev(ibdev)->cap_mask_mutex))
 208		return -ERESTARTSYS;
 209
 210	err = mthca_query_port(ibdev, port, &attr);
 211	if (err)
 212		goto out;
 213
 214	set_ib.set_si_guid     = 0;
 215	set_ib.reset_qkey_viol = !!(port_modify_mask & IB_PORT_RESET_QKEY_CNTR);
 216
 217	set_ib.cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) &
 218		~props->clr_port_cap_mask;
 219
 220	err = mthca_SET_IB(to_mdev(ibdev), &set_ib, port);
 221	if (err)
 222		goto out;
 223out:
 224	mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
 225	return err;
 226}
 227
 228static int mthca_query_pkey(struct ib_device *ibdev,
 229			    u8 port, u16 index, u16 *pkey)
 230{
 231	struct ib_smp *in_mad  = NULL;
 232	struct ib_smp *out_mad = NULL;
 233	int err = -ENOMEM;
 234
 235	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 236	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 237	if (!in_mad || !out_mad)
 238		goto out;
 239
 240	init_query_mad(in_mad);
 241	in_mad->attr_id  = IB_SMP_ATTR_PKEY_TABLE;
 242	in_mad->attr_mod = cpu_to_be32(index / 32);
 243
 244	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 245			    port, NULL, NULL, in_mad, out_mad);
 246	if (err)
 247		goto out;
 248
 249	*pkey = be16_to_cpu(((__be16 *) out_mad->data)[index % 32]);
 250
 251 out:
 252	kfree(in_mad);
 253	kfree(out_mad);
 254	return err;
 255}
 256
 257static int mthca_query_gid(struct ib_device *ibdev, u8 port,
 258			   int index, union ib_gid *gid)
 259{
 260	struct ib_smp *in_mad  = NULL;
 261	struct ib_smp *out_mad = NULL;
 262	int err = -ENOMEM;
 263
 264	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
 265	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
 266	if (!in_mad || !out_mad)
 267		goto out;
 268
 269	init_query_mad(in_mad);
 270	in_mad->attr_id  = IB_SMP_ATTR_PORT_INFO;
 271	in_mad->attr_mod = cpu_to_be32(port);
 272
 273	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 274			    port, NULL, NULL, in_mad, out_mad);
 275	if (err)
 276		goto out;
 277
 278	memcpy(gid->raw, out_mad->data + 8, 8);
 279
 280	init_query_mad(in_mad);
 281	in_mad->attr_id  = IB_SMP_ATTR_GUID_INFO;
 282	in_mad->attr_mod = cpu_to_be32(index / 8);
 283
 284	err = mthca_MAD_IFC(to_mdev(ibdev), 1, 1,
 285			    port, NULL, NULL, in_mad, out_mad);
 286	if (err)
 287		goto out;
 288
 289	memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8);
 290
 291 out:
 292	kfree(in_mad);
 293	kfree(out_mad);
 294	return err;
 295}
 296
 297static struct ib_ucontext *mthca_alloc_ucontext(struct ib_device *ibdev,
 298						struct ib_udata *udata)
 299{
 300	struct mthca_alloc_ucontext_resp uresp;
 301	struct mthca_ucontext           *context;
 
 302	int                              err;
 303
 304	if (!(to_mdev(ibdev)->active))
 305		return ERR_PTR(-EAGAIN);
 306
 307	memset(&uresp, 0, sizeof uresp);
 308
 309	uresp.qp_tab_size = to_mdev(ibdev)->limits.num_qps;
 310	if (mthca_is_memfree(to_mdev(ibdev)))
 311		uresp.uarc_size = to_mdev(ibdev)->uar_table.uarc_size;
 312	else
 313		uresp.uarc_size = 0;
 314
 315	context = kmalloc(sizeof *context, GFP_KERNEL);
 316	if (!context)
 317		return ERR_PTR(-ENOMEM);
 318
 319	err = mthca_uar_alloc(to_mdev(ibdev), &context->uar);
 320	if (err) {
 321		kfree(context);
 322		return ERR_PTR(err);
 323	}
 324
 325	context->db_tab = mthca_init_user_db_tab(to_mdev(ibdev));
 326	if (IS_ERR(context->db_tab)) {
 327		err = PTR_ERR(context->db_tab);
 328		mthca_uar_free(to_mdev(ibdev), &context->uar);
 329		kfree(context);
 330		return ERR_PTR(err);
 331	}
 332
 333	if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
 334		mthca_cleanup_user_db_tab(to_mdev(ibdev), &context->uar, context->db_tab);
 335		mthca_uar_free(to_mdev(ibdev), &context->uar);
 336		kfree(context);
 337		return ERR_PTR(-EFAULT);
 338	}
 339
 340	context->reg_mr_warned = 0;
 341
 342	return &context->ibucontext;
 343}
 344
 345static int mthca_dealloc_ucontext(struct ib_ucontext *context)
 346{
 347	mthca_cleanup_user_db_tab(to_mdev(context->device), &to_mucontext(context)->uar,
 348				  to_mucontext(context)->db_tab);
 349	mthca_uar_free(to_mdev(context->device), &to_mucontext(context)->uar);
 350	kfree(to_mucontext(context));
 351
 352	return 0;
 353}
 354
 355static int mthca_mmap_uar(struct ib_ucontext *context,
 356			  struct vm_area_struct *vma)
 357{
 358	if (vma->vm_end - vma->vm_start != PAGE_SIZE)
 359		return -EINVAL;
 360
 361	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 362
 363	if (io_remap_pfn_range(vma, vma->vm_start,
 364			       to_mucontext(context)->uar.pfn,
 365			       PAGE_SIZE, vma->vm_page_prot))
 366		return -EAGAIN;
 367
 368	return 0;
 369}
 370
 371static struct ib_pd *mthca_alloc_pd(struct ib_device *ibdev,
 372				    struct ib_ucontext *context,
 373				    struct ib_udata *udata)
 374{
 375	struct mthca_pd *pd;
 
 376	int err;
 377
 378	pd = kmalloc(sizeof *pd, GFP_KERNEL);
 379	if (!pd)
 380		return ERR_PTR(-ENOMEM);
 381
 382	err = mthca_pd_alloc(to_mdev(ibdev), !context, pd);
 383	if (err) {
 384		kfree(pd);
 385		return ERR_PTR(err);
 386	}
 387
 388	if (context) {
 389		if (ib_copy_to_udata(udata, &pd->pd_num, sizeof (__u32))) {
 390			mthca_pd_free(to_mdev(ibdev), pd);
 391			kfree(pd);
 392			return ERR_PTR(-EFAULT);
 393		}
 394	}
 395
 396	return &pd->ibpd;
 397}
 398
 399static int mthca_dealloc_pd(struct ib_pd *pd)
 400{
 401	mthca_pd_free(to_mdev(pd->device), to_mpd(pd));
 402	kfree(pd);
 403
 404	return 0;
 405}
 406
 407static struct ib_ah *mthca_ah_create(struct ib_pd *pd,
 408				     struct ib_ah_attr *ah_attr)
 
 
 409{
 410	int err;
 411	struct mthca_ah *ah;
 412
 413	ah = kmalloc(sizeof *ah, GFP_ATOMIC);
 414	if (!ah)
 415		return ERR_PTR(-ENOMEM);
 416
 417	err = mthca_create_ah(to_mdev(pd->device), to_mpd(pd), ah_attr, ah);
 418	if (err) {
 419		kfree(ah);
 420		return ERR_PTR(err);
 421	}
 422
 423	return &ah->ibah;
 424}
 425
 426static int mthca_ah_destroy(struct ib_ah *ah)
 427{
 428	mthca_destroy_ah(to_mdev(ah->device), to_mah(ah));
 429	kfree(ah);
 430
 431	return 0;
 432}
 433
 434static struct ib_srq *mthca_create_srq(struct ib_pd *pd,
 435				       struct ib_srq_init_attr *init_attr,
 436				       struct ib_udata *udata)
 437{
 438	struct mthca_create_srq ucmd;
 439	struct mthca_ucontext *context = NULL;
 440	struct mthca_srq *srq;
 
 441	int err;
 442
 443	if (init_attr->srq_type != IB_SRQT_BASIC)
 444		return ERR_PTR(-ENOSYS);
 445
 446	srq = kmalloc(sizeof *srq, GFP_KERNEL);
 447	if (!srq)
 448		return ERR_PTR(-ENOMEM);
 449
 450	if (pd->uobject) {
 451		context = to_mucontext(pd->uobject->context);
 452
 453		if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
 454			err = -EFAULT;
 455			goto err_free;
 456		}
 457
 458		err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
 459					context->db_tab, ucmd.db_index,
 460					ucmd.db_page);
 461
 462		if (err)
 463			goto err_free;
 464
 465		srq->mr.ibmr.lkey = ucmd.lkey;
 466		srq->db_index     = ucmd.db_index;
 467	}
 468
 469	err = mthca_alloc_srq(to_mdev(pd->device), to_mpd(pd),
 470			      &init_attr->attr, srq);
 471
 472	if (err && pd->uobject)
 473		mthca_unmap_user_db(to_mdev(pd->device), &context->uar,
 474				    context->db_tab, ucmd.db_index);
 475
 476	if (err)
 477		goto err_free;
 478
 479	if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof (__u32))) {
 480		mthca_free_srq(to_mdev(pd->device), srq);
 481		err = -EFAULT;
 482		goto err_free;
 483	}
 484
 485	return &srq->ibsrq;
 486
 487err_free:
 488	kfree(srq);
 489
 490	return ERR_PTR(err);
 491}
 492
 493static int mthca_destroy_srq(struct ib_srq *srq)
 494{
 495	struct mthca_ucontext *context;
 496
 497	if (srq->uobject) {
 498		context = to_mucontext(srq->uobject->context);
 
 
 499
 500		mthca_unmap_user_db(to_mdev(srq->device), &context->uar,
 501				    context->db_tab, to_msrq(srq)->db_index);
 502	}
 503
 504	mthca_free_srq(to_mdev(srq->device), to_msrq(srq));
 505	kfree(srq);
 506
 507	return 0;
 508}
 509
 510static struct ib_qp *mthca_create_qp(struct ib_pd *pd,
 511				     struct ib_qp_init_attr *init_attr,
 512				     struct ib_udata *udata)
 513{
 
 
 514	struct mthca_create_qp ucmd;
 515	struct mthca_qp *qp;
 
 516	int err;
 517
 518	if (init_attr->create_flags)
 519		return ERR_PTR(-EINVAL);
 520
 521	switch (init_attr->qp_type) {
 522	case IB_QPT_RC:
 523	case IB_QPT_UC:
 524	case IB_QPT_UD:
 525	{
 526		struct mthca_ucontext *context;
 527
 528		qp = kmalloc(sizeof *qp, GFP_KERNEL);
 529		if (!qp)
 530			return ERR_PTR(-ENOMEM);
 531
 532		if (pd->uobject) {
 533			context = to_mucontext(pd->uobject->context);
 534
 535			if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
 536				kfree(qp);
 537				return ERR_PTR(-EFAULT);
 538			}
 539
 540			err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
 541						context->db_tab,
 542						ucmd.sq_db_index, ucmd.sq_db_page);
 543			if (err) {
 544				kfree(qp);
 545				return ERR_PTR(err);
 546			}
 547
 548			err = mthca_map_user_db(to_mdev(pd->device), &context->uar,
 549						context->db_tab,
 550						ucmd.rq_db_index, ucmd.rq_db_page);
 
 551			if (err) {
 552				mthca_unmap_user_db(to_mdev(pd->device),
 553						    &context->uar,
 554						    context->db_tab,
 555						    ucmd.sq_db_index);
 556				kfree(qp);
 557				return ERR_PTR(err);
 558			}
 559
 560			qp->mr.ibmr.lkey = ucmd.lkey;
 561			qp->sq.db_index  = ucmd.sq_db_index;
 562			qp->rq.db_index  = ucmd.rq_db_index;
 563		}
 564
 565		err = mthca_alloc_qp(to_mdev(pd->device), to_mpd(pd),
 566				     to_mcq(init_attr->send_cq),
 567				     to_mcq(init_attr->recv_cq),
 568				     init_attr->qp_type, init_attr->sq_sig_type,
 569				     &init_attr->cap, qp);
 570
 571		if (err && pd->uobject) {
 572			context = to_mucontext(pd->uobject->context);
 573
 574			mthca_unmap_user_db(to_mdev(pd->device),
 575					    &context->uar,
 576					    context->db_tab,
 577					    ucmd.sq_db_index);
 578			mthca_unmap_user_db(to_mdev(pd->device),
 579					    &context->uar,
 580					    context->db_tab,
 581					    ucmd.rq_db_index);
 582		}
 583
 584		qp->ibqp.qp_num = qp->qpn;
 585		break;
 586	}
 587	case IB_QPT_SMI:
 588	case IB_QPT_GSI:
 589	{
 590		/* Don't allow userspace to create special QPs */
 591		if (pd->uobject)
 592			return ERR_PTR(-EINVAL);
 593
 594		qp = kmalloc(sizeof (struct mthca_sqp), GFP_KERNEL);
 595		if (!qp)
 596			return ERR_PTR(-ENOMEM);
 597
 598		qp->ibqp.qp_num = init_attr->qp_type == IB_QPT_SMI ? 0 : 1;
 599
 600		err = mthca_alloc_sqp(to_mdev(pd->device), to_mpd(pd),
 601				      to_mcq(init_attr->send_cq),
 602				      to_mcq(init_attr->recv_cq),
 603				      init_attr->sq_sig_type, &init_attr->cap,
 604				      qp->ibqp.qp_num, init_attr->port_num,
 605				      to_msqp(qp));
 606		break;
 607	}
 608	default:
 609		/* Don't support raw QPs */
 610		return ERR_PTR(-ENOSYS);
 611	}
 612
 613	if (err) {
 614		kfree(qp);
 615		return ERR_PTR(err);
 616	}
 617
 618	init_attr->cap.max_send_wr     = qp->sq.max;
 619	init_attr->cap.max_recv_wr     = qp->rq.max;
 620	init_attr->cap.max_send_sge    = qp->sq.max_gs;
 621	init_attr->cap.max_recv_sge    = qp->rq.max_gs;
 622	init_attr->cap.max_inline_data = qp->max_inline_data;
 623
 624	return &qp->ibqp;
 625}
 626
 627static int mthca_destroy_qp(struct ib_qp *qp)
 628{
 629	if (qp->uobject) {
 
 
 
 
 
 
 630		mthca_unmap_user_db(to_mdev(qp->device),
 631				    &to_mucontext(qp->uobject->context)->uar,
 632				    to_mucontext(qp->uobject->context)->db_tab,
 633				    to_mqp(qp)->sq.db_index);
 634		mthca_unmap_user_db(to_mdev(qp->device),
 635				    &to_mucontext(qp->uobject->context)->uar,
 636				    to_mucontext(qp->uobject->context)->db_tab,
 637				    to_mqp(qp)->rq.db_index);
 638	}
 639	mthca_free_qp(to_mdev(qp->device), to_mqp(qp));
 640	kfree(qp);
 641	return 0;
 642}
 643
 644static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries,
 645				     int comp_vector,
 646				     struct ib_ucontext *context,
 647				     struct ib_udata *udata)
 648{
 
 
 649	struct mthca_create_cq ucmd;
 650	struct mthca_cq *cq;
 651	int nent;
 652	int err;
 
 
 
 
 
 653
 654	if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes)
 655		return ERR_PTR(-EINVAL);
 656
 657	if (context) {
 658		if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
 659			return ERR_PTR(-EFAULT);
 660
 661		err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
 662					to_mucontext(context)->db_tab,
 663					ucmd.set_db_index, ucmd.set_db_page);
 664		if (err)
 665			return ERR_PTR(err);
 666
 667		err = mthca_map_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
 668					to_mucontext(context)->db_tab,
 669					ucmd.arm_db_index, ucmd.arm_db_page);
 670		if (err)
 671			goto err_unmap_set;
 672	}
 673
 674	cq = kmalloc(sizeof *cq, GFP_KERNEL);
 675	if (!cq) {
 676		err = -ENOMEM;
 677		goto err_unmap_arm;
 678	}
 679
 680	if (context) {
 681		cq->buf.mr.ibmr.lkey = ucmd.lkey;
 682		cq->set_ci_db_index  = ucmd.set_db_index;
 683		cq->arm_db_index     = ucmd.arm_db_index;
 684	}
 685
 686	for (nent = 1; nent <= entries; nent <<= 1)
 687		; /* nothing */
 688
 689	err = mthca_init_cq(to_mdev(ibdev), nent,
 690			    context ? to_mucontext(context) : NULL,
 691			    context ? ucmd.pdn : to_mdev(ibdev)->driver_pd.pd_num,
 692			    cq);
 693	if (err)
 694		goto err_free;
 695
 696	if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) {
 697		mthca_free_cq(to_mdev(ibdev), cq);
 698		err = -EFAULT;
 699		goto err_free;
 700	}
 701
 702	cq->resize_buf = NULL;
 703
 704	return &cq->ibcq;
 705
 706err_free:
 707	kfree(cq);
 708
 709err_unmap_arm:
 710	if (context)
 711		mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
 712				    to_mucontext(context)->db_tab, ucmd.arm_db_index);
 713
 714err_unmap_set:
 715	if (context)
 716		mthca_unmap_user_db(to_mdev(ibdev), &to_mucontext(context)->uar,
 717				    to_mucontext(context)->db_tab, ucmd.set_db_index);
 718
 719	return ERR_PTR(err);
 720}
 721
 722static int mthca_alloc_resize_buf(struct mthca_dev *dev, struct mthca_cq *cq,
 723				  int entries)
 724{
 725	int ret;
 726
 727	spin_lock_irq(&cq->lock);
 728	if (cq->resize_buf) {
 729		ret = -EBUSY;
 730		goto unlock;
 731	}
 732
 733	cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_ATOMIC);
 734	if (!cq->resize_buf) {
 735		ret = -ENOMEM;
 736		goto unlock;
 737	}
 738
 739	cq->resize_buf->state = CQ_RESIZE_ALLOC;
 740
 741	ret = 0;
 742
 743unlock:
 744	spin_unlock_irq(&cq->lock);
 745
 746	if (ret)
 747		return ret;
 748
 749	ret = mthca_alloc_cq_buf(dev, &cq->resize_buf->buf, entries);
 750	if (ret) {
 751		spin_lock_irq(&cq->lock);
 752		kfree(cq->resize_buf);
 753		cq->resize_buf = NULL;
 754		spin_unlock_irq(&cq->lock);
 755		return ret;
 756	}
 757
 758	cq->resize_buf->cqe = entries - 1;
 759
 760	spin_lock_irq(&cq->lock);
 761	cq->resize_buf->state = CQ_RESIZE_READY;
 762	spin_unlock_irq(&cq->lock);
 763
 764	return 0;
 765}
 766
 767static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
 768{
 769	struct mthca_dev *dev = to_mdev(ibcq->device);
 770	struct mthca_cq *cq = to_mcq(ibcq);
 771	struct mthca_resize_cq ucmd;
 772	u32 lkey;
 773	int ret;
 774
 775	if (entries < 1 || entries > dev->limits.max_cqes)
 776		return -EINVAL;
 777
 778	mutex_lock(&cq->mutex);
 779
 780	entries = roundup_pow_of_two(entries + 1);
 781	if (entries == ibcq->cqe + 1) {
 782		ret = 0;
 783		goto out;
 784	}
 785
 786	if (cq->is_kernel) {
 787		ret = mthca_alloc_resize_buf(dev, cq, entries);
 788		if (ret)
 789			goto out;
 790		lkey = cq->resize_buf->buf.mr.ibmr.lkey;
 791	} else {
 792		if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
 793			ret = -EFAULT;
 794			goto out;
 795		}
 796		lkey = ucmd.lkey;
 797	}
 798
 799	ret = mthca_RESIZE_CQ(dev, cq->cqn, lkey, ilog2(entries));
 800
 801	if (ret) {
 802		if (cq->resize_buf) {
 803			mthca_free_cq_buf(dev, &cq->resize_buf->buf,
 804					  cq->resize_buf->cqe);
 805			kfree(cq->resize_buf);
 806			spin_lock_irq(&cq->lock);
 807			cq->resize_buf = NULL;
 808			spin_unlock_irq(&cq->lock);
 809		}
 810		goto out;
 811	}
 812
 813	if (cq->is_kernel) {
 814		struct mthca_cq_buf tbuf;
 815		int tcqe;
 816
 817		spin_lock_irq(&cq->lock);
 818		if (cq->resize_buf->state == CQ_RESIZE_READY) {
 819			mthca_cq_resize_copy_cqes(cq);
 820			tbuf         = cq->buf;
 821			tcqe         = cq->ibcq.cqe;
 822			cq->buf      = cq->resize_buf->buf;
 823			cq->ibcq.cqe = cq->resize_buf->cqe;
 824		} else {
 825			tbuf = cq->resize_buf->buf;
 826			tcqe = cq->resize_buf->cqe;
 827		}
 828
 829		kfree(cq->resize_buf);
 830		cq->resize_buf = NULL;
 831		spin_unlock_irq(&cq->lock);
 832
 833		mthca_free_cq_buf(dev, &tbuf, tcqe);
 834	} else
 835		ibcq->cqe = entries - 1;
 836
 837out:
 838	mutex_unlock(&cq->mutex);
 839
 840	return ret;
 841}
 842
 843static int mthca_destroy_cq(struct ib_cq *cq)
 844{
 845	if (cq->uobject) {
 
 
 
 
 
 
 846		mthca_unmap_user_db(to_mdev(cq->device),
 847				    &to_mucontext(cq->uobject->context)->uar,
 848				    to_mucontext(cq->uobject->context)->db_tab,
 849				    to_mcq(cq)->arm_db_index);
 850		mthca_unmap_user_db(to_mdev(cq->device),
 851				    &to_mucontext(cq->uobject->context)->uar,
 852				    to_mucontext(cq->uobject->context)->db_tab,
 853				    to_mcq(cq)->set_ci_db_index);
 854	}
 855	mthca_free_cq(to_mdev(cq->device), to_mcq(cq));
 856	kfree(cq);
 857
 858	return 0;
 859}
 860
 861static inline u32 convert_access(int acc)
 862{
 863	return (acc & IB_ACCESS_REMOTE_ATOMIC ? MTHCA_MPT_FLAG_ATOMIC       : 0) |
 864	       (acc & IB_ACCESS_REMOTE_WRITE  ? MTHCA_MPT_FLAG_REMOTE_WRITE : 0) |
 865	       (acc & IB_ACCESS_REMOTE_READ   ? MTHCA_MPT_FLAG_REMOTE_READ  : 0) |
 866	       (acc & IB_ACCESS_LOCAL_WRITE   ? MTHCA_MPT_FLAG_LOCAL_WRITE  : 0) |
 867	       MTHCA_MPT_FLAG_LOCAL_READ;
 868}
 869
 870static struct ib_mr *mthca_get_dma_mr(struct ib_pd *pd, int acc)
 871{
 872	struct mthca_mr *mr;
 873	int err;
 874
 875	mr = kmalloc(sizeof *mr, GFP_KERNEL);
 876	if (!mr)
 877		return ERR_PTR(-ENOMEM);
 878
 879	err = mthca_mr_alloc_notrans(to_mdev(pd->device),
 880				     to_mpd(pd)->pd_num,
 881				     convert_access(acc), mr);
 882
 883	if (err) {
 884		kfree(mr);
 885		return ERR_PTR(err);
 886	}
 887
 888	mr->umem = NULL;
 889
 890	return &mr->ibmr;
 891}
 892
 893static struct ib_mr *mthca_reg_phys_mr(struct ib_pd       *pd,
 894				       struct ib_phys_buf *buffer_list,
 895				       int                 num_phys_buf,
 896				       int                 acc,
 897				       u64                *iova_start)
 898{
 899	struct mthca_mr *mr;
 900	u64 *page_list;
 901	u64 total_size;
 902	unsigned long mask;
 903	int shift;
 904	int npages;
 905	int err;
 906	int i, j, n;
 907
 908	mask = buffer_list[0].addr ^ *iova_start;
 909	total_size = 0;
 910	for (i = 0; i < num_phys_buf; ++i) {
 911		if (i != 0)
 912			mask |= buffer_list[i].addr;
 913		if (i != num_phys_buf - 1)
 914			mask |= buffer_list[i].addr + buffer_list[i].size;
 915
 916		total_size += buffer_list[i].size;
 917	}
 918
 919	if (mask & ~PAGE_MASK)
 920		return ERR_PTR(-EINVAL);
 921
 922	shift = __ffs(mask | 1 << 31);
 923
 924	buffer_list[0].size += buffer_list[0].addr & ((1ULL << shift) - 1);
 925	buffer_list[0].addr &= ~0ull << shift;
 926
 927	mr = kmalloc(sizeof *mr, GFP_KERNEL);
 928	if (!mr)
 929		return ERR_PTR(-ENOMEM);
 930
 931	npages = 0;
 932	for (i = 0; i < num_phys_buf; ++i)
 933		npages += (buffer_list[i].size + (1ULL << shift) - 1) >> shift;
 934
 935	if (!npages)
 936		return &mr->ibmr;
 937
 938	page_list = kmalloc(npages * sizeof *page_list, GFP_KERNEL);
 939	if (!page_list) {
 940		kfree(mr);
 941		return ERR_PTR(-ENOMEM);
 942	}
 943
 944	n = 0;
 945	for (i = 0; i < num_phys_buf; ++i)
 946		for (j = 0;
 947		     j < (buffer_list[i].size + (1ULL << shift) - 1) >> shift;
 948		     ++j)
 949			page_list[n++] = buffer_list[i].addr + ((u64) j << shift);
 950
 951	mthca_dbg(to_mdev(pd->device), "Registering memory at %llx (iova %llx) "
 952		  "in PD %x; shift %d, npages %d.\n",
 953		  (unsigned long long) buffer_list[0].addr,
 954		  (unsigned long long) *iova_start,
 955		  to_mpd(pd)->pd_num,
 956		  shift, npages);
 957
 958	err = mthca_mr_alloc_phys(to_mdev(pd->device),
 959				  to_mpd(pd)->pd_num,
 960				  page_list, shift, npages,
 961				  *iova_start, total_size,
 962				  convert_access(acc), mr);
 963
 964	if (err) {
 965		kfree(page_list);
 966		kfree(mr);
 967		return ERR_PTR(err);
 968	}
 969
 970	kfree(page_list);
 971	mr->umem = NULL;
 972
 973	return &mr->ibmr;
 974}
 975
 976static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 977				       u64 virt, int acc, struct ib_udata *udata)
 978{
 979	struct mthca_dev *dev = to_mdev(pd->device);
 980	struct scatterlist *sg;
 
 
 981	struct mthca_mr *mr;
 982	struct mthca_reg_mr ucmd;
 983	u64 *pages;
 984	int shift, n, len;
 985	int i, k, entry;
 986	int err = 0;
 987	int write_mtt_size;
 988
 989	if (udata->inlen - sizeof (struct ib_uverbs_cmd_hdr) < sizeof ucmd) {
 990		if (!to_mucontext(pd->uobject->context)->reg_mr_warned) {
 991			mthca_warn(dev, "Process '%s' did not pass in MR attrs.\n",
 992				   current->comm);
 993			mthca_warn(dev, "  Update libmthca to fix this.\n");
 994		}
 995		++to_mucontext(pd->uobject->context)->reg_mr_warned;
 996		ucmd.mr_attrs = 0;
 997	} else if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
 998		return ERR_PTR(-EFAULT);
 999
1000	mr = kmalloc(sizeof *mr, GFP_KERNEL);
1001	if (!mr)
1002		return ERR_PTR(-ENOMEM);
1003
1004	mr->umem = ib_umem_get(pd->uobject->context, start, length, acc,
1005			       ucmd.mr_attrs & MTHCA_MR_DMASYNC);
1006
1007	if (IS_ERR(mr->umem)) {
1008		err = PTR_ERR(mr->umem);
1009		goto err;
1010	}
1011
1012	shift = ffs(mr->umem->page_size) - 1;
1013	n = mr->umem->nmap;
1014
1015	mr->mtt = mthca_alloc_mtt(dev, n);
1016	if (IS_ERR(mr->mtt)) {
1017		err = PTR_ERR(mr->mtt);
1018		goto err_umem;
1019	}
1020
1021	pages = (u64 *) __get_free_page(GFP_KERNEL);
1022	if (!pages) {
1023		err = -ENOMEM;
1024		goto err_mtt;
1025	}
1026
1027	i = n = 0;
1028
1029	write_mtt_size = min(mthca_write_mtt_size(dev), (int) (PAGE_SIZE / sizeof *pages));
1030
1031	for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) {
1032		len = sg_dma_len(sg) >> shift;
1033		for (k = 0; k < len; ++k) {
1034			pages[i++] = sg_dma_address(sg) +
1035				mr->umem->page_size * k;
1036			/*
1037			 * Be friendly to write_mtt and pass it chunks
1038			 * of appropriate size.
1039			 */
1040			if (i == write_mtt_size) {
1041				err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
1042				if (err)
1043					goto mtt_done;
1044				n += i;
1045				i = 0;
1046			}
1047		}
1048	}
1049
1050	if (i)
1051		err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
1052mtt_done:
1053	free_page((unsigned long) pages);
1054	if (err)
1055		goto err_mtt;
1056
1057	err = mthca_mr_alloc(dev, to_mpd(pd)->pd_num, shift, virt, length,
1058			     convert_access(acc), mr);
1059
1060	if (err)
1061		goto err_mtt;
1062
1063	return &mr->ibmr;
1064
1065err_mtt:
1066	mthca_free_mtt(dev, mr->mtt);
1067
1068err_umem:
1069	ib_umem_release(mr->umem);
1070
1071err:
1072	kfree(mr);
1073	return ERR_PTR(err);
1074}
1075
1076static int mthca_dereg_mr(struct ib_mr *mr)
1077{
1078	struct mthca_mr *mmr = to_mmr(mr);
1079
1080	mthca_free_mr(to_mdev(mr->device), mmr);
1081	if (mmr->umem)
1082		ib_umem_release(mmr->umem);
1083	kfree(mmr);
1084
1085	return 0;
1086}
1087
1088static struct ib_fmr *mthca_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
1089				      struct ib_fmr_attr *fmr_attr)
1090{
1091	struct mthca_fmr *fmr;
1092	int err;
1093
1094	fmr = kmalloc(sizeof *fmr, GFP_KERNEL);
1095	if (!fmr)
1096		return ERR_PTR(-ENOMEM);
1097
1098	memcpy(&fmr->attr, fmr_attr, sizeof *fmr_attr);
1099	err = mthca_fmr_alloc(to_mdev(pd->device), to_mpd(pd)->pd_num,
1100			     convert_access(mr_access_flags), fmr);
1101
1102	if (err) {
1103		kfree(fmr);
1104		return ERR_PTR(err);
1105	}
1106
1107	return &fmr->ibmr;
1108}
 
1109
1110static int mthca_dealloc_fmr(struct ib_fmr *fmr)
1111{
1112	struct mthca_fmr *mfmr = to_mfmr(fmr);
1113	int err;
1114
1115	err = mthca_free_fmr(to_mdev(fmr->device), mfmr);
1116	if (err)
1117		return err;
1118
1119	kfree(mfmr);
1120	return 0;
1121}
1122
1123static int mthca_unmap_fmr(struct list_head *fmr_list)
1124{
1125	struct ib_fmr *fmr;
1126	int err;
1127	struct mthca_dev *mdev = NULL;
1128
1129	list_for_each_entry(fmr, fmr_list, list) {
1130		if (mdev && to_mdev(fmr->device) != mdev)
1131			return -EINVAL;
1132		mdev = to_mdev(fmr->device);
1133	}
1134
1135	if (!mdev)
1136		return 0;
1137
1138	if (mthca_is_memfree(mdev)) {
1139		list_for_each_entry(fmr, fmr_list, list)
1140			mthca_arbel_fmr_unmap(mdev, to_mfmr(fmr));
1141
1142		wmb();
1143	} else
1144		list_for_each_entry(fmr, fmr_list, list)
1145			mthca_tavor_fmr_unmap(mdev, to_mfmr(fmr));
1146
1147	err = mthca_SYNC_TPT(mdev);
1148	return err;
1149}
1150
1151static ssize_t show_rev(struct device *device, struct device_attribute *attr,
1152			char *buf)
1153{
1154	struct mthca_dev *dev =
1155		container_of(device, struct mthca_dev, ib_dev.dev);
1156	return sprintf(buf, "%x\n", dev->rev_id);
 
1157}
 
1158
1159static ssize_t show_fw_ver(struct device *device, struct device_attribute *attr,
1160			   char *buf)
1161{
1162	struct mthca_dev *dev =
1163		container_of(device, struct mthca_dev, ib_dev.dev);
1164	return sprintf(buf, "%d.%d.%d\n", (int) (dev->fw_ver >> 32),
1165		       (int) (dev->fw_ver >> 16) & 0xffff,
1166		       (int) dev->fw_ver & 0xffff);
1167}
1168
1169static ssize_t show_hca(struct device *device, struct device_attribute *attr,
1170			char *buf)
1171{
1172	struct mthca_dev *dev =
1173		container_of(device, struct mthca_dev, ib_dev.dev);
1174	switch (dev->pdev->device) {
1175	case PCI_DEVICE_ID_MELLANOX_TAVOR:
1176		return sprintf(buf, "MT23108\n");
1177	case PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT:
1178		return sprintf(buf, "MT25208 (MT23108 compat mode)\n");
1179	case PCI_DEVICE_ID_MELLANOX_ARBEL:
1180		return sprintf(buf, "MT25208\n");
1181	case PCI_DEVICE_ID_MELLANOX_SINAI:
1182	case PCI_DEVICE_ID_MELLANOX_SINAI_OLD:
1183		return sprintf(buf, "MT25204\n");
1184	default:
1185		return sprintf(buf, "unknown\n");
1186	}
1187}
 
1188
1189static ssize_t show_board(struct device *device, struct device_attribute *attr,
1190			  char *buf)
1191{
1192	struct mthca_dev *dev =
1193		container_of(device, struct mthca_dev, ib_dev.dev);
1194	return sprintf(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id);
1195}
1196
1197static DEVICE_ATTR(hw_rev,   S_IRUGO, show_rev,    NULL);
1198static DEVICE_ATTR(fw_ver,   S_IRUGO, show_fw_ver, NULL);
1199static DEVICE_ATTR(hca_type, S_IRUGO, show_hca,    NULL);
1200static DEVICE_ATTR(board_id, S_IRUGO, show_board,  NULL);
1201
1202static struct device_attribute *mthca_dev_attributes[] = {
1203	&dev_attr_hw_rev,
1204	&dev_attr_fw_ver,
1205	&dev_attr_hca_type,
1206	&dev_attr_board_id
1207};
1208
1209static int mthca_init_node_data(struct mthca_dev *dev)
1210{
1211	struct ib_smp *in_mad  = NULL;
1212	struct ib_smp *out_mad = NULL;
1213	int err = -ENOMEM;
1214
1215	in_mad  = kzalloc(sizeof *in_mad, GFP_KERNEL);
1216	out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
1217	if (!in_mad || !out_mad)
1218		goto out;
1219
1220	init_query_mad(in_mad);
1221	in_mad->attr_id = IB_SMP_ATTR_NODE_DESC;
1222
1223	err = mthca_MAD_IFC(dev, 1, 1,
1224			    1, NULL, NULL, in_mad, out_mad);
1225	if (err)
1226		goto out;
1227
1228	memcpy(dev->ib_dev.node_desc, out_mad->data, 64);
1229
1230	in_mad->attr_id = IB_SMP_ATTR_NODE_INFO;
1231
1232	err = mthca_MAD_IFC(dev, 1, 1,
1233			    1, NULL, NULL, in_mad, out_mad);
1234	if (err)
1235		goto out;
1236
1237	if (mthca_is_memfree(dev))
1238		dev->rev_id = be32_to_cpup((__be32 *) (out_mad->data + 32));
1239	memcpy(&dev->ib_dev.node_guid, out_mad->data + 12, 8);
1240
1241out:
1242	kfree(in_mad);
1243	kfree(out_mad);
1244	return err;
1245}
1246
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1247int mthca_register_device(struct mthca_dev *dev)
1248{
1249	int ret;
1250	int i;
1251
1252	ret = mthca_init_node_data(dev);
1253	if (ret)
1254		return ret;
1255
1256	strlcpy(dev->ib_dev.name, "mthca%d", IB_DEVICE_NAME_MAX);
1257	dev->ib_dev.owner                = THIS_MODULE;
1258
1259	dev->ib_dev.uverbs_abi_ver	 = MTHCA_UVERBS_ABI_VERSION;
1260	dev->ib_dev.uverbs_cmd_mask	 =
1261		(1ull << IB_USER_VERBS_CMD_GET_CONTEXT)		|
1262		(1ull << IB_USER_VERBS_CMD_QUERY_DEVICE)	|
1263		(1ull << IB_USER_VERBS_CMD_QUERY_PORT)		|
1264		(1ull << IB_USER_VERBS_CMD_ALLOC_PD)		|
1265		(1ull << IB_USER_VERBS_CMD_DEALLOC_PD)		|
1266		(1ull << IB_USER_VERBS_CMD_REG_MR)		|
1267		(1ull << IB_USER_VERBS_CMD_DEREG_MR)		|
1268		(1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL)	|
1269		(1ull << IB_USER_VERBS_CMD_CREATE_CQ)		|
1270		(1ull << IB_USER_VERBS_CMD_RESIZE_CQ)		|
1271		(1ull << IB_USER_VERBS_CMD_DESTROY_CQ)		|
1272		(1ull << IB_USER_VERBS_CMD_CREATE_QP)		|
1273		(1ull << IB_USER_VERBS_CMD_QUERY_QP)		|
1274		(1ull << IB_USER_VERBS_CMD_MODIFY_QP)		|
1275		(1ull << IB_USER_VERBS_CMD_DESTROY_QP)		|
1276		(1ull << IB_USER_VERBS_CMD_ATTACH_MCAST)	|
1277		(1ull << IB_USER_VERBS_CMD_DETACH_MCAST);
1278	dev->ib_dev.node_type            = RDMA_NODE_IB_CA;
1279	dev->ib_dev.phys_port_cnt        = dev->limits.num_ports;
1280	dev->ib_dev.num_comp_vectors     = 1;
1281	dev->ib_dev.dma_device           = &dev->pdev->dev;
1282	dev->ib_dev.query_device         = mthca_query_device;
1283	dev->ib_dev.query_port           = mthca_query_port;
1284	dev->ib_dev.modify_device        = mthca_modify_device;
1285	dev->ib_dev.modify_port          = mthca_modify_port;
1286	dev->ib_dev.query_pkey           = mthca_query_pkey;
1287	dev->ib_dev.query_gid            = mthca_query_gid;
1288	dev->ib_dev.alloc_ucontext       = mthca_alloc_ucontext;
1289	dev->ib_dev.dealloc_ucontext     = mthca_dealloc_ucontext;
1290	dev->ib_dev.mmap                 = mthca_mmap_uar;
1291	dev->ib_dev.alloc_pd             = mthca_alloc_pd;
1292	dev->ib_dev.dealloc_pd           = mthca_dealloc_pd;
1293	dev->ib_dev.create_ah            = mthca_ah_create;
1294	dev->ib_dev.query_ah             = mthca_ah_query;
1295	dev->ib_dev.destroy_ah           = mthca_ah_destroy;
1296
1297	if (dev->mthca_flags & MTHCA_FLAG_SRQ) {
1298		dev->ib_dev.create_srq           = mthca_create_srq;
1299		dev->ib_dev.modify_srq           = mthca_modify_srq;
1300		dev->ib_dev.query_srq            = mthca_query_srq;
1301		dev->ib_dev.destroy_srq          = mthca_destroy_srq;
1302		dev->ib_dev.uverbs_cmd_mask	|=
1303			(1ull << IB_USER_VERBS_CMD_CREATE_SRQ)		|
1304			(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ)		|
1305			(1ull << IB_USER_VERBS_CMD_QUERY_SRQ)		|
1306			(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ);
1307
1308		if (mthca_is_memfree(dev))
1309			dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv;
 
1310		else
1311			dev->ib_dev.post_srq_recv = mthca_tavor_post_srq_recv;
 
1312	}
1313
1314	dev->ib_dev.create_qp            = mthca_create_qp;
1315	dev->ib_dev.modify_qp            = mthca_modify_qp;
1316	dev->ib_dev.query_qp             = mthca_query_qp;
1317	dev->ib_dev.destroy_qp           = mthca_destroy_qp;
1318	dev->ib_dev.create_cq            = mthca_create_cq;
1319	dev->ib_dev.resize_cq            = mthca_resize_cq;
1320	dev->ib_dev.destroy_cq           = mthca_destroy_cq;
1321	dev->ib_dev.poll_cq              = mthca_poll_cq;
1322	dev->ib_dev.get_dma_mr           = mthca_get_dma_mr;
1323	dev->ib_dev.reg_phys_mr          = mthca_reg_phys_mr;
1324	dev->ib_dev.reg_user_mr          = mthca_reg_user_mr;
1325	dev->ib_dev.dereg_mr             = mthca_dereg_mr;
1326
1327	if (dev->mthca_flags & MTHCA_FLAG_FMR) {
1328		dev->ib_dev.alloc_fmr            = mthca_alloc_fmr;
1329		dev->ib_dev.unmap_fmr            = mthca_unmap_fmr;
1330		dev->ib_dev.dealloc_fmr          = mthca_dealloc_fmr;
1331		if (mthca_is_memfree(dev))
1332			dev->ib_dev.map_phys_fmr = mthca_arbel_map_phys_fmr;
1333		else
1334			dev->ib_dev.map_phys_fmr = mthca_tavor_map_phys_fmr;
1335	}
1336
1337	dev->ib_dev.attach_mcast         = mthca_multicast_attach;
1338	dev->ib_dev.detach_mcast         = mthca_multicast_detach;
1339	dev->ib_dev.process_mad          = mthca_process_mad;
1340
1341	if (mthca_is_memfree(dev)) {
1342		dev->ib_dev.req_notify_cq = mthca_arbel_arm_cq;
1343		dev->ib_dev.post_send     = mthca_arbel_post_send;
1344		dev->ib_dev.post_recv     = mthca_arbel_post_receive;
1345	} else {
1346		dev->ib_dev.req_notify_cq = mthca_tavor_arm_cq;
1347		dev->ib_dev.post_send     = mthca_tavor_post_send;
1348		dev->ib_dev.post_recv     = mthca_tavor_post_receive;
1349	}
1350
1351	mutex_init(&dev->cap_mask_mutex);
1352
1353	ret = ib_register_device(&dev->ib_dev, NULL);
1354	if (ret)
1355		return ret;
1356
1357	for (i = 0; i < ARRAY_SIZE(mthca_dev_attributes); ++i) {
1358		ret = device_create_file(&dev->ib_dev.dev,
1359					 mthca_dev_attributes[i]);
1360		if (ret) {
1361			ib_unregister_device(&dev->ib_dev);
1362			return ret;
1363		}
1364	}
1365
1366	mthca_start_catas_poll(dev);
1367
1368	return 0;
1369}
1370
1371void mthca_unregister_device(struct mthca_dev *dev)
1372{
1373	mthca_stop_catas_poll(dev);
1374	ib_unregister_device(&dev->ib_dev);
1375}