Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
   2/*
   3 * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
   4 * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
   5 */
   6
   7#include <linux/dma-mapping.h>
   8#include <net/addrconf.h>
   9#include <rdma/uverbs_ioctl.h>
  10
  11#include "rxe.h"
  12#include "rxe_queue.h"
  13#include "rxe_hw_counters.h"
  14
  15static int rxe_query_device(struct ib_device *dev,
  16			    struct ib_device_attr *attr,
  17			    struct ib_udata *uhw)
  18{
  19	struct rxe_dev *rxe = to_rdev(dev);
  20
  21	if (uhw->inlen || uhw->outlen)
  22		return -EINVAL;
  23
  24	*attr = rxe->attr;
  25	return 0;
  26}
  27
  28static int rxe_query_port(struct ib_device *dev,
  29			  u32 port_num, struct ib_port_attr *attr)
  30{
  31	struct rxe_dev *rxe = to_rdev(dev);
  32	int rc;
  33
  34	/* *attr being zeroed by the caller, avoid zeroing it here */
  35	*attr = rxe->port.attr;
  36
  37	mutex_lock(&rxe->usdev_lock);
  38	rc = ib_get_eth_speed(dev, port_num, &attr->active_speed,
  39			      &attr->active_width);
  40
  41	if (attr->state == IB_PORT_ACTIVE)
  42		attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
  43	else if (dev_get_flags(rxe->ndev) & IFF_UP)
  44		attr->phys_state = IB_PORT_PHYS_STATE_POLLING;
  45	else
  46		attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
  47
  48	mutex_unlock(&rxe->usdev_lock);
  49
  50	return rc;
  51}
  52
  53static int rxe_query_pkey(struct ib_device *device,
  54			  u32 port_num, u16 index, u16 *pkey)
  55{
  56	if (index > 0)
  57		return -EINVAL;
  58
  59	*pkey = IB_DEFAULT_PKEY_FULL;
  60	return 0;
  61}
  62
  63static int rxe_modify_device(struct ib_device *dev,
  64			     int mask, struct ib_device_modify *attr)
  65{
  66	struct rxe_dev *rxe = to_rdev(dev);
  67
  68	if (mask & ~(IB_DEVICE_MODIFY_SYS_IMAGE_GUID |
  69		     IB_DEVICE_MODIFY_NODE_DESC))
  70		return -EOPNOTSUPP;
  71
  72	if (mask & IB_DEVICE_MODIFY_SYS_IMAGE_GUID)
  73		rxe->attr.sys_image_guid = cpu_to_be64(attr->sys_image_guid);
  74
  75	if (mask & IB_DEVICE_MODIFY_NODE_DESC) {
  76		memcpy(rxe->ib_dev.node_desc,
  77		       attr->node_desc, sizeof(rxe->ib_dev.node_desc));
  78	}
  79
  80	return 0;
  81}
  82
  83static int rxe_modify_port(struct ib_device *dev,
  84			   u32 port_num, int mask, struct ib_port_modify *attr)
  85{
  86	struct rxe_dev *rxe = to_rdev(dev);
  87	struct rxe_port *port;
  88
  89	port = &rxe->port;
  90
  91	port->attr.port_cap_flags |= attr->set_port_cap_mask;
  92	port->attr.port_cap_flags &= ~attr->clr_port_cap_mask;
  93
  94	if (mask & IB_PORT_RESET_QKEY_CNTR)
  95		port->attr.qkey_viol_cntr = 0;
  96
  97	return 0;
  98}
  99
 100static enum rdma_link_layer rxe_get_link_layer(struct ib_device *dev,
 101					       u32 port_num)
 102{
 103	return IB_LINK_LAYER_ETHERNET;
 104}
 105
 106static int rxe_alloc_ucontext(struct ib_ucontext *ibuc, struct ib_udata *udata)
 107{
 108	struct rxe_dev *rxe = to_rdev(ibuc->device);
 109	struct rxe_ucontext *uc = to_ruc(ibuc);
 110
 111	return rxe_add_to_pool(&rxe->uc_pool, uc);
 112}
 113
 114static void rxe_dealloc_ucontext(struct ib_ucontext *ibuc)
 115{
 116	struct rxe_ucontext *uc = to_ruc(ibuc);
 117
 118	rxe_cleanup(uc);
 119}
 120
 121static int rxe_port_immutable(struct ib_device *dev, u32 port_num,
 122			      struct ib_port_immutable *immutable)
 123{
 124	int err;
 125	struct ib_port_attr attr;
 126
 127	immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
 128
 129	err = ib_query_port(dev, port_num, &attr);
 130	if (err)
 131		return err;
 132
 133	immutable->pkey_tbl_len = attr.pkey_tbl_len;
 134	immutable->gid_tbl_len = attr.gid_tbl_len;
 135	immutable->max_mad_size = IB_MGMT_MAD_SIZE;
 136
 137	return 0;
 138}
 139
 140static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 141{
 142	struct rxe_dev *rxe = to_rdev(ibpd->device);
 143	struct rxe_pd *pd = to_rpd(ibpd);
 144
 145	return rxe_add_to_pool(&rxe->pd_pool, pd);
 146}
 147
 148static int rxe_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 149{
 150	struct rxe_pd *pd = to_rpd(ibpd);
 151
 152	rxe_cleanup(pd);
 153	return 0;
 154}
 155
 156static int rxe_create_ah(struct ib_ah *ibah,
 157			 struct rdma_ah_init_attr *init_attr,
 158			 struct ib_udata *udata)
 159
 160{
 161	struct rxe_dev *rxe = to_rdev(ibah->device);
 162	struct rxe_ah *ah = to_rah(ibah);
 163	struct rxe_create_ah_resp __user *uresp = NULL;
 164	int err;
 165
 166	if (udata) {
 167		/* test if new user provider */
 168		if (udata->outlen >= sizeof(*uresp))
 169			uresp = udata->outbuf;
 170		ah->is_user = true;
 171	} else {
 172		ah->is_user = false;
 173	}
 174
 175	err = rxe_add_to_pool_ah(&rxe->ah_pool, ah,
 176			init_attr->flags & RDMA_CREATE_AH_SLEEPABLE);
 177	if (err)
 178		return err;
 179
 180	/* create index > 0 */
 181	ah->ah_num = ah->elem.index;
 182
 183	err = rxe_ah_chk_attr(ah, init_attr->ah_attr);
 184	if (err) {
 185		rxe_cleanup(ah);
 186		return err;
 187	}
 188
 189	if (uresp) {
 190		/* only if new user provider */
 191		err = copy_to_user(&uresp->ah_num, &ah->ah_num,
 192					 sizeof(uresp->ah_num));
 193		if (err) {
 194			rxe_cleanup(ah);
 195			return -EFAULT;
 196		}
 197	} else if (ah->is_user) {
 198		/* only if old user provider */
 199		ah->ah_num = 0;
 200	}
 201
 202	rxe_init_av(init_attr->ah_attr, &ah->av);
 203	rxe_finalize(ah);
 204
 205	return 0;
 206}
 207
 208static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
 209{
 210	int err;
 211	struct rxe_ah *ah = to_rah(ibah);
 212
 213	err = rxe_ah_chk_attr(ah, attr);
 214	if (err)
 215		return err;
 216
 217	rxe_init_av(attr, &ah->av);
 218	return 0;
 219}
 220
 221static int rxe_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
 222{
 223	struct rxe_ah *ah = to_rah(ibah);
 224
 225	memset(attr, 0, sizeof(*attr));
 226	attr->type = ibah->type;
 227	rxe_av_to_attr(&ah->av, attr);
 228	return 0;
 229}
 230
 231static int rxe_destroy_ah(struct ib_ah *ibah, u32 flags)
 232{
 233	struct rxe_ah *ah = to_rah(ibah);
 234
 235	rxe_cleanup_ah(ah, flags & RDMA_DESTROY_AH_SLEEPABLE);
 236
 237	return 0;
 238}
 239
 240static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr)
 241{
 242	int i;
 243	u32 length;
 244	struct rxe_recv_wqe *recv_wqe;
 245	int num_sge = ibwr->num_sge;
 246	int full;
 247
 248	full = queue_full(rq->queue, QUEUE_TYPE_TO_DRIVER);
 249	if (unlikely(full))
 250		return -ENOMEM;
 251
 252	if (unlikely(num_sge > rq->max_sge))
 253		return -EINVAL;
 254
 255	length = 0;
 256	for (i = 0; i < num_sge; i++)
 257		length += ibwr->sg_list[i].length;
 258
 259	recv_wqe = queue_producer_addr(rq->queue, QUEUE_TYPE_TO_DRIVER);
 260	recv_wqe->wr_id = ibwr->wr_id;
 261
 262	memcpy(recv_wqe->dma.sge, ibwr->sg_list,
 263	       num_sge * sizeof(struct ib_sge));
 264
 265	recv_wqe->dma.length		= length;
 266	recv_wqe->dma.resid		= length;
 267	recv_wqe->dma.num_sge		= num_sge;
 268	recv_wqe->dma.cur_sge		= 0;
 269	recv_wqe->dma.sge_offset	= 0;
 270
 271	queue_advance_producer(rq->queue, QUEUE_TYPE_TO_DRIVER);
 272
 273	return 0;
 274}
 275
 276static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init,
 277			  struct ib_udata *udata)
 278{
 279	int err;
 280	struct rxe_dev *rxe = to_rdev(ibsrq->device);
 281	struct rxe_pd *pd = to_rpd(ibsrq->pd);
 282	struct rxe_srq *srq = to_rsrq(ibsrq);
 283	struct rxe_create_srq_resp __user *uresp = NULL;
 284
 285	if (udata) {
 286		if (udata->outlen < sizeof(*uresp))
 287			return -EINVAL;
 288		uresp = udata->outbuf;
 289	}
 290
 291	if (init->srq_type != IB_SRQT_BASIC)
 292		return -EOPNOTSUPP;
 293
 294	err = rxe_srq_chk_init(rxe, init);
 295	if (err)
 296		return err;
 297
 298	err = rxe_add_to_pool(&rxe->srq_pool, srq);
 299	if (err)
 300		return err;
 301
 302	rxe_get(pd);
 303	srq->pd = pd;
 304
 305	err = rxe_srq_from_init(rxe, srq, init, udata, uresp);
 306	if (err)
 307		goto err_cleanup;
 308
 309	return 0;
 310
 311err_cleanup:
 312	rxe_cleanup(srq);
 313
 314	return err;
 315}
 316
 317static int rxe_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
 318			  enum ib_srq_attr_mask mask,
 319			  struct ib_udata *udata)
 320{
 321	int err;
 322	struct rxe_srq *srq = to_rsrq(ibsrq);
 323	struct rxe_dev *rxe = to_rdev(ibsrq->device);
 324	struct rxe_modify_srq_cmd ucmd = {};
 325
 326	if (udata) {
 327		if (udata->inlen < sizeof(ucmd))
 328			return -EINVAL;
 329
 330		err = ib_copy_from_udata(&ucmd, udata, sizeof(ucmd));
 331		if (err)
 332			return err;
 333	}
 334
 335	err = rxe_srq_chk_attr(rxe, srq, attr, mask);
 336	if (err)
 337		return err;
 338
 339	return rxe_srq_from_attr(rxe, srq, attr, mask, &ucmd, udata);
 340}
 341
 342static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
 343{
 344	struct rxe_srq *srq = to_rsrq(ibsrq);
 345
 346	if (srq->error)
 347		return -EINVAL;
 348
 349	attr->max_wr = srq->rq.queue->buf->index_mask;
 350	attr->max_sge = srq->rq.max_sge;
 351	attr->srq_limit = srq->limit;
 352	return 0;
 353}
 354
 355static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
 356{
 357	struct rxe_srq *srq = to_rsrq(ibsrq);
 358
 359	rxe_cleanup(srq);
 360	return 0;
 361}
 362
 363static int rxe_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
 364			     const struct ib_recv_wr **bad_wr)
 365{
 366	int err = 0;
 367	struct rxe_srq *srq = to_rsrq(ibsrq);
 368	unsigned long flags;
 369
 370	spin_lock_irqsave(&srq->rq.producer_lock, flags);
 371
 372	while (wr) {
 373		err = post_one_recv(&srq->rq, wr);
 374		if (unlikely(err))
 375			break;
 376		wr = wr->next;
 377	}
 378
 379	spin_unlock_irqrestore(&srq->rq.producer_lock, flags);
 380
 381	if (err)
 382		*bad_wr = wr;
 383
 384	return err;
 385}
 386
 387static int rxe_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init,
 388			 struct ib_udata *udata)
 389{
 390	int err;
 391	struct rxe_dev *rxe = to_rdev(ibqp->device);
 392	struct rxe_pd *pd = to_rpd(ibqp->pd);
 393	struct rxe_qp *qp = to_rqp(ibqp);
 394	struct rxe_create_qp_resp __user *uresp = NULL;
 395
 396	if (udata) {
 397		if (udata->outlen < sizeof(*uresp))
 398			return -EINVAL;
 399		uresp = udata->outbuf;
 400	}
 401
 402	if (init->create_flags)
 403		return -EOPNOTSUPP;
 404
 405	err = rxe_qp_chk_init(rxe, init);
 406	if (err)
 407		return err;
 408
 409	if (udata) {
 410		if (udata->inlen)
 411			return -EINVAL;
 412
 413		qp->is_user = true;
 414	} else {
 415		qp->is_user = false;
 416	}
 417
 418	err = rxe_add_to_pool(&rxe->qp_pool, qp);
 419	if (err)
 420		return err;
 421
 422	err = rxe_qp_from_init(rxe, qp, pd, init, uresp, ibqp->pd, udata);
 423	if (err)
 424		goto qp_init;
 425
 426	rxe_finalize(qp);
 427	return 0;
 428
 429qp_init:
 430	rxe_cleanup(qp);
 431	return err;
 432}
 433
 434static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 435			 int mask, struct ib_udata *udata)
 436{
 437	int err;
 438	struct rxe_dev *rxe = to_rdev(ibqp->device);
 439	struct rxe_qp *qp = to_rqp(ibqp);
 440
 441	if (mask & ~IB_QP_ATTR_STANDARD_BITS)
 442		return -EOPNOTSUPP;
 443
 444	err = rxe_qp_chk_attr(rxe, qp, attr, mask);
 445	if (err)
 446		return err;
 447
 448	err = rxe_qp_from_attr(qp, attr, mask, udata);
 449	if (err)
 450		return err;
 451
 452	if ((mask & IB_QP_AV) && (attr->ah_attr.ah_flags & IB_AH_GRH))
 453		qp->src_port = rdma_get_udp_sport(attr->ah_attr.grh.flow_label,
 454						  qp->ibqp.qp_num,
 455						  qp->attr.dest_qp_num);
 456
 457	return 0;
 458}
 459
 460static int rxe_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 461			int mask, struct ib_qp_init_attr *init)
 462{
 463	struct rxe_qp *qp = to_rqp(ibqp);
 464
 465	rxe_qp_to_init(qp, init);
 466	rxe_qp_to_attr(qp, attr, mask);
 467
 468	return 0;
 469}
 470
 471static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 472{
 473	struct rxe_qp *qp = to_rqp(ibqp);
 474	int ret;
 475
 476	ret = rxe_qp_chk_destroy(qp);
 477	if (ret)
 478		return ret;
 479
 480	rxe_cleanup(qp);
 481	return 0;
 482}
 483
 484static int validate_send_wr(struct rxe_qp *qp, const struct ib_send_wr *ibwr,
 485			    unsigned int mask, unsigned int length)
 486{
 487	int num_sge = ibwr->num_sge;
 488	struct rxe_sq *sq = &qp->sq;
 489
 490	if (unlikely(num_sge > sq->max_sge))
 491		return -EINVAL;
 492
 493	if (unlikely(mask & WR_ATOMIC_MASK)) {
 494		if (length < 8)
 495			return -EINVAL;
 496
 497		if (atomic_wr(ibwr)->remote_addr & 0x7)
 498			return -EINVAL;
 499	}
 500
 501	if (unlikely((ibwr->send_flags & IB_SEND_INLINE) &&
 502		     (length > sq->max_inline)))
 503		return -EINVAL;
 504
 505	return 0;
 506}
 507
 508static void init_send_wr(struct rxe_qp *qp, struct rxe_send_wr *wr,
 509			 const struct ib_send_wr *ibwr)
 510{
 511	wr->wr_id = ibwr->wr_id;
 512	wr->opcode = ibwr->opcode;
 513	wr->send_flags = ibwr->send_flags;
 514
 515	if (qp_type(qp) == IB_QPT_UD ||
 516	    qp_type(qp) == IB_QPT_GSI) {
 517		struct ib_ah *ibah = ud_wr(ibwr)->ah;
 518
 519		wr->wr.ud.remote_qpn = ud_wr(ibwr)->remote_qpn;
 520		wr->wr.ud.remote_qkey = ud_wr(ibwr)->remote_qkey;
 521		wr->wr.ud.ah_num = to_rah(ibah)->ah_num;
 522		if (qp_type(qp) == IB_QPT_GSI)
 523			wr->wr.ud.pkey_index = ud_wr(ibwr)->pkey_index;
 524		if (wr->opcode == IB_WR_SEND_WITH_IMM)
 525			wr->ex.imm_data = ibwr->ex.imm_data;
 526	} else {
 527		switch (wr->opcode) {
 528		case IB_WR_RDMA_WRITE_WITH_IMM:
 529			wr->ex.imm_data = ibwr->ex.imm_data;
 530			fallthrough;
 531		case IB_WR_RDMA_READ:
 532		case IB_WR_RDMA_WRITE:
 533			wr->wr.rdma.remote_addr = rdma_wr(ibwr)->remote_addr;
 534			wr->wr.rdma.rkey	= rdma_wr(ibwr)->rkey;
 535			break;
 536		case IB_WR_SEND_WITH_IMM:
 537			wr->ex.imm_data = ibwr->ex.imm_data;
 538			break;
 539		case IB_WR_SEND_WITH_INV:
 540			wr->ex.invalidate_rkey = ibwr->ex.invalidate_rkey;
 541			break;
 542		case IB_WR_ATOMIC_CMP_AND_SWP:
 543		case IB_WR_ATOMIC_FETCH_AND_ADD:
 544			wr->wr.atomic.remote_addr =
 545				atomic_wr(ibwr)->remote_addr;
 546			wr->wr.atomic.compare_add =
 547				atomic_wr(ibwr)->compare_add;
 548			wr->wr.atomic.swap = atomic_wr(ibwr)->swap;
 549			wr->wr.atomic.rkey = atomic_wr(ibwr)->rkey;
 550			break;
 551		case IB_WR_LOCAL_INV:
 552			wr->ex.invalidate_rkey = ibwr->ex.invalidate_rkey;
 553		break;
 554		case IB_WR_REG_MR:
 555			wr->wr.reg.mr = reg_wr(ibwr)->mr;
 556			wr->wr.reg.key = reg_wr(ibwr)->key;
 557			wr->wr.reg.access = reg_wr(ibwr)->access;
 558		break;
 559		default:
 560			break;
 561		}
 562	}
 563}
 564
 565static void copy_inline_data_to_wqe(struct rxe_send_wqe *wqe,
 566				    const struct ib_send_wr *ibwr)
 567{
 568	struct ib_sge *sge = ibwr->sg_list;
 569	u8 *p = wqe->dma.inline_data;
 570	int i;
 571
 572	for (i = 0; i < ibwr->num_sge; i++, sge++) {
 573		memcpy(p, (void *)(uintptr_t)sge->addr, sge->length);
 574		p += sge->length;
 575	}
 576}
 577
 578static void init_send_wqe(struct rxe_qp *qp, const struct ib_send_wr *ibwr,
 579			 unsigned int mask, unsigned int length,
 580			 struct rxe_send_wqe *wqe)
 581{
 582	int num_sge = ibwr->num_sge;
 583
 584	init_send_wr(qp, &wqe->wr, ibwr);
 585
 586	/* local operation */
 587	if (unlikely(mask & WR_LOCAL_OP_MASK)) {
 588		wqe->mask = mask;
 589		wqe->state = wqe_state_posted;
 590		return;
 591	}
 592
 593	if (unlikely(ibwr->send_flags & IB_SEND_INLINE))
 594		copy_inline_data_to_wqe(wqe, ibwr);
 595	else
 596		memcpy(wqe->dma.sge, ibwr->sg_list,
 597		       num_sge * sizeof(struct ib_sge));
 598
 599	wqe->iova = mask & WR_ATOMIC_MASK ? atomic_wr(ibwr)->remote_addr :
 600		mask & WR_READ_OR_WRITE_MASK ? rdma_wr(ibwr)->remote_addr : 0;
 601	wqe->mask		= mask;
 602	wqe->dma.length		= length;
 603	wqe->dma.resid		= length;
 604	wqe->dma.num_sge	= num_sge;
 605	wqe->dma.cur_sge	= 0;
 606	wqe->dma.sge_offset	= 0;
 607	wqe->state		= wqe_state_posted;
 608	wqe->ssn		= atomic_add_return(1, &qp->ssn);
 609}
 610
 611static int post_one_send(struct rxe_qp *qp, const struct ib_send_wr *ibwr,
 612			 unsigned int mask, u32 length)
 613{
 614	int err;
 615	struct rxe_sq *sq = &qp->sq;
 616	struct rxe_send_wqe *send_wqe;
 617	unsigned long flags;
 618	int full;
 619
 620	err = validate_send_wr(qp, ibwr, mask, length);
 621	if (err)
 622		return err;
 623
 624	spin_lock_irqsave(&qp->sq.sq_lock, flags);
 625
 626	full = queue_full(sq->queue, QUEUE_TYPE_TO_DRIVER);
 627
 628	if (unlikely(full)) {
 629		spin_unlock_irqrestore(&qp->sq.sq_lock, flags);
 630		return -ENOMEM;
 631	}
 632
 633	send_wqe = queue_producer_addr(sq->queue, QUEUE_TYPE_TO_DRIVER);
 634	init_send_wqe(qp, ibwr, mask, length, send_wqe);
 635
 636	queue_advance_producer(sq->queue, QUEUE_TYPE_TO_DRIVER);
 637
 638	spin_unlock_irqrestore(&qp->sq.sq_lock, flags);
 639
 640	return 0;
 641}
 642
 643static int rxe_post_send_kernel(struct rxe_qp *qp, const struct ib_send_wr *wr,
 644				const struct ib_send_wr **bad_wr)
 645{
 646	int err = 0;
 647	unsigned int mask;
 648	unsigned int length = 0;
 649	int i;
 650	struct ib_send_wr *next;
 651
 652	while (wr) {
 653		mask = wr_opcode_mask(wr->opcode, qp);
 654		if (unlikely(!mask)) {
 655			err = -EINVAL;
 656			*bad_wr = wr;
 657			break;
 658		}
 659
 660		if (unlikely((wr->send_flags & IB_SEND_INLINE) &&
 661			     !(mask & WR_INLINE_MASK))) {
 662			err = -EINVAL;
 663			*bad_wr = wr;
 664			break;
 665		}
 666
 667		next = wr->next;
 668
 669		length = 0;
 670		for (i = 0; i < wr->num_sge; i++)
 671			length += wr->sg_list[i].length;
 672
 673		err = post_one_send(qp, wr, mask, length);
 674
 675		if (err) {
 676			*bad_wr = wr;
 677			break;
 678		}
 679		wr = next;
 680	}
 681
 682	rxe_sched_task(&qp->req.task);
 683	if (unlikely(qp->req.state == QP_STATE_ERROR))
 684		rxe_sched_task(&qp->comp.task);
 685
 686	return err;
 687}
 688
 689static int rxe_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
 690			 const struct ib_send_wr **bad_wr)
 691{
 692	struct rxe_qp *qp = to_rqp(ibqp);
 693
 694	if (unlikely(!qp->valid)) {
 695		*bad_wr = wr;
 696		return -EINVAL;
 697	}
 698
 699	if (unlikely(qp->req.state < QP_STATE_READY)) {
 700		*bad_wr = wr;
 701		return -EINVAL;
 702	}
 703
 704	if (qp->is_user) {
 705		/* Utilize process context to do protocol processing */
 706		rxe_run_task(&qp->req.task);
 707		return 0;
 708	} else
 709		return rxe_post_send_kernel(qp, wr, bad_wr);
 710}
 711
 712static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
 713			 const struct ib_recv_wr **bad_wr)
 714{
 715	int err = 0;
 716	struct rxe_qp *qp = to_rqp(ibqp);
 717	struct rxe_rq *rq = &qp->rq;
 718	unsigned long flags;
 719
 720	if (unlikely((qp_state(qp) < IB_QPS_INIT) || !qp->valid)) {
 721		*bad_wr = wr;
 722		return -EINVAL;
 723	}
 724
 725	if (unlikely(qp->srq)) {
 726		*bad_wr = wr;
 727		return -EINVAL;
 728	}
 729
 730	spin_lock_irqsave(&rq->producer_lock, flags);
 731
 732	while (wr) {
 733		err = post_one_recv(rq, wr);
 734		if (unlikely(err)) {
 735			*bad_wr = wr;
 736			break;
 737		}
 738		wr = wr->next;
 739	}
 740
 741	spin_unlock_irqrestore(&rq->producer_lock, flags);
 742
 743	if (qp->resp.state == QP_STATE_ERROR)
 744		rxe_sched_task(&qp->resp.task);
 745
 746	return err;
 747}
 748
 749static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
 750			 struct ib_udata *udata)
 751{
 752	int err;
 753	struct ib_device *dev = ibcq->device;
 754	struct rxe_dev *rxe = to_rdev(dev);
 755	struct rxe_cq *cq = to_rcq(ibcq);
 756	struct rxe_create_cq_resp __user *uresp = NULL;
 757
 758	if (udata) {
 759		if (udata->outlen < sizeof(*uresp))
 760			return -EINVAL;
 761		uresp = udata->outbuf;
 762	}
 763
 764	if (attr->flags)
 765		return -EOPNOTSUPP;
 766
 767	err = rxe_cq_chk_attr(rxe, NULL, attr->cqe, attr->comp_vector);
 768	if (err)
 769		return err;
 770
 771	err = rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, udata,
 772			       uresp);
 773	if (err)
 774		return err;
 775
 776	return rxe_add_to_pool(&rxe->cq_pool, cq);
 777}
 778
 779static int rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
 780{
 781	struct rxe_cq *cq = to_rcq(ibcq);
 782
 783	/* See IBA C11-17: The CI shall return an error if this Verb is
 784	 * invoked while a Work Queue is still associated with the CQ.
 785	 */
 786	if (atomic_read(&cq->num_wq))
 787		return -EINVAL;
 788
 789	rxe_cq_disable(cq);
 790
 791	rxe_cleanup(cq);
 792	return 0;
 793}
 794
 795static int rxe_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 796{
 797	int err;
 798	struct rxe_cq *cq = to_rcq(ibcq);
 799	struct rxe_dev *rxe = to_rdev(ibcq->device);
 800	struct rxe_resize_cq_resp __user *uresp = NULL;
 801
 802	if (udata) {
 803		if (udata->outlen < sizeof(*uresp))
 804			return -EINVAL;
 805		uresp = udata->outbuf;
 806	}
 807
 808	err = rxe_cq_chk_attr(rxe, cq, cqe, 0);
 809	if (err)
 810		return err;
 811
 812	return rxe_cq_resize_queue(cq, cqe, uresp, udata);
 813}
 814
 815static int rxe_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
 816{
 817	int i;
 818	struct rxe_cq *cq = to_rcq(ibcq);
 819	struct rxe_cqe *cqe;
 820	unsigned long flags;
 821
 822	spin_lock_irqsave(&cq->cq_lock, flags);
 823	for (i = 0; i < num_entries; i++) {
 824		cqe = queue_head(cq->queue, QUEUE_TYPE_FROM_DRIVER);
 825		if (!cqe)
 826			break;
 827
 828		memcpy(wc++, &cqe->ibwc, sizeof(*wc));
 829		queue_advance_consumer(cq->queue, QUEUE_TYPE_FROM_DRIVER);
 830	}
 831	spin_unlock_irqrestore(&cq->cq_lock, flags);
 832
 833	return i;
 834}
 835
 836static int rxe_peek_cq(struct ib_cq *ibcq, int wc_cnt)
 837{
 838	struct rxe_cq *cq = to_rcq(ibcq);
 839	int count;
 840
 841	count = queue_count(cq->queue, QUEUE_TYPE_FROM_DRIVER);
 842
 843	return (count > wc_cnt) ? wc_cnt : count;
 844}
 845
 846static int rxe_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
 847{
 848	struct rxe_cq *cq = to_rcq(ibcq);
 849	int ret = 0;
 850	int empty;
 851	unsigned long irq_flags;
 852
 853	spin_lock_irqsave(&cq->cq_lock, irq_flags);
 854	if (cq->notify != IB_CQ_NEXT_COMP)
 855		cq->notify = flags & IB_CQ_SOLICITED_MASK;
 856
 857	empty = queue_empty(cq->queue, QUEUE_TYPE_FROM_DRIVER);
 858
 859	if ((flags & IB_CQ_REPORT_MISSED_EVENTS) && !empty)
 860		ret = 1;
 861
 862	spin_unlock_irqrestore(&cq->cq_lock, irq_flags);
 863
 864	return ret;
 865}
 866
 867static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access)
 868{
 869	struct rxe_dev *rxe = to_rdev(ibpd->device);
 870	struct rxe_pd *pd = to_rpd(ibpd);
 871	struct rxe_mr *mr;
 872
 873	mr = rxe_alloc(&rxe->mr_pool);
 874	if (!mr)
 875		return ERR_PTR(-ENOMEM);
 876
 877	rxe_get(pd);
 878	mr->ibmr.pd = ibpd;
 879	mr->ibmr.device = ibpd->device;
 880
 881	rxe_mr_init_dma(access, mr);
 882	rxe_finalize(mr);
 883
 884	return &mr->ibmr;
 885}
 886
 887static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd,
 888				     u64 start,
 889				     u64 length,
 890				     u64 iova,
 891				     int access, struct ib_udata *udata)
 892{
 893	int err;
 894	struct rxe_dev *rxe = to_rdev(ibpd->device);
 895	struct rxe_pd *pd = to_rpd(ibpd);
 896	struct rxe_mr *mr;
 897
 898	mr = rxe_alloc(&rxe->mr_pool);
 899	if (!mr)
 900		return ERR_PTR(-ENOMEM);
 901
 902	rxe_get(pd);
 903	mr->ibmr.pd = ibpd;
 904	mr->ibmr.device = ibpd->device;
 905
 906	err = rxe_mr_init_user(rxe, start, length, iova, access, mr);
 907	if (err)
 908		goto err1;
 909
 910	rxe_finalize(mr);
 911
 912	return &mr->ibmr;
 913
 914err1:
 915	rxe_cleanup(mr);
 916	return ERR_PTR(err);
 917}
 918
 919static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 920				  u32 max_num_sg)
 921{
 922	struct rxe_dev *rxe = to_rdev(ibpd->device);
 923	struct rxe_pd *pd = to_rpd(ibpd);
 924	struct rxe_mr *mr;
 925	int err;
 926
 927	if (mr_type != IB_MR_TYPE_MEM_REG)
 928		return ERR_PTR(-EINVAL);
 929
 930	mr = rxe_alloc(&rxe->mr_pool);
 931	if (!mr)
 932		return ERR_PTR(-ENOMEM);
 933
 934	rxe_get(pd);
 935	mr->ibmr.pd = ibpd;
 936	mr->ibmr.device = ibpd->device;
 937
 938	err = rxe_mr_init_fast(max_num_sg, mr);
 939	if (err)
 940		goto err1;
 941
 942	rxe_finalize(mr);
 943
 944	return &mr->ibmr;
 945
 946err1:
 947	rxe_cleanup(mr);
 948	return ERR_PTR(err);
 949}
 950
 951static int rxe_set_page(struct ib_mr *ibmr, u64 addr)
 952{
 953	struct rxe_mr *mr = to_rmr(ibmr);
 954	struct rxe_map *map;
 955	struct rxe_phys_buf *buf;
 956
 957	if (unlikely(mr->nbuf == mr->num_buf))
 958		return -ENOMEM;
 959
 960	map = mr->map[mr->nbuf / RXE_BUF_PER_MAP];
 961	buf = &map->buf[mr->nbuf % RXE_BUF_PER_MAP];
 962
 963	buf->addr = addr;
 964	buf->size = ibmr->page_size;
 965	mr->nbuf++;
 966
 967	return 0;
 968}
 969
 970static int rxe_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
 971			 int sg_nents, unsigned int *sg_offset)
 972{
 973	struct rxe_mr *mr = to_rmr(ibmr);
 974	int n;
 975
 976	mr->nbuf = 0;
 977
 978	n = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rxe_set_page);
 979
 980	mr->page_shift = ilog2(ibmr->page_size);
 981	mr->page_mask = ibmr->page_size - 1;
 982	mr->offset = ibmr->iova & mr->page_mask;
 983
 984	return n;
 985}
 986
 987static ssize_t parent_show(struct device *device,
 988			   struct device_attribute *attr, char *buf)
 989{
 990	struct rxe_dev *rxe =
 991		rdma_device_to_drv_device(device, struct rxe_dev, ib_dev);
 992
 993	return sysfs_emit(buf, "%s\n", rxe_parent_name(rxe, 1));
 994}
 995
 996static DEVICE_ATTR_RO(parent);
 997
 998static struct attribute *rxe_dev_attributes[] = {
 999	&dev_attr_parent.attr,
1000	NULL
1001};
1002
1003static const struct attribute_group rxe_attr_group = {
1004	.attrs = rxe_dev_attributes,
1005};
1006
1007static int rxe_enable_driver(struct ib_device *ib_dev)
1008{
1009	struct rxe_dev *rxe = container_of(ib_dev, struct rxe_dev, ib_dev);
1010
1011	rxe_set_port_state(rxe);
1012	dev_info(&rxe->ib_dev.dev, "added %s\n", netdev_name(rxe->ndev));
1013	return 0;
1014}
1015
1016static const struct ib_device_ops rxe_dev_ops = {
1017	.owner = THIS_MODULE,
1018	.driver_id = RDMA_DRIVER_RXE,
1019	.uverbs_abi_ver = RXE_UVERBS_ABI_VERSION,
1020
1021	.alloc_hw_port_stats = rxe_ib_alloc_hw_port_stats,
1022	.alloc_mr = rxe_alloc_mr,
1023	.alloc_mw = rxe_alloc_mw,
1024	.alloc_pd = rxe_alloc_pd,
1025	.alloc_ucontext = rxe_alloc_ucontext,
1026	.attach_mcast = rxe_attach_mcast,
1027	.create_ah = rxe_create_ah,
1028	.create_cq = rxe_create_cq,
1029	.create_qp = rxe_create_qp,
1030	.create_srq = rxe_create_srq,
1031	.create_user_ah = rxe_create_ah,
1032	.dealloc_driver = rxe_dealloc,
1033	.dealloc_mw = rxe_dealloc_mw,
1034	.dealloc_pd = rxe_dealloc_pd,
1035	.dealloc_ucontext = rxe_dealloc_ucontext,
1036	.dereg_mr = rxe_dereg_mr,
1037	.destroy_ah = rxe_destroy_ah,
1038	.destroy_cq = rxe_destroy_cq,
1039	.destroy_qp = rxe_destroy_qp,
1040	.destroy_srq = rxe_destroy_srq,
1041	.detach_mcast = rxe_detach_mcast,
1042	.device_group = &rxe_attr_group,
1043	.enable_driver = rxe_enable_driver,
1044	.get_dma_mr = rxe_get_dma_mr,
1045	.get_hw_stats = rxe_ib_get_hw_stats,
1046	.get_link_layer = rxe_get_link_layer,
1047	.get_port_immutable = rxe_port_immutable,
1048	.map_mr_sg = rxe_map_mr_sg,
1049	.mmap = rxe_mmap,
1050	.modify_ah = rxe_modify_ah,
1051	.modify_device = rxe_modify_device,
1052	.modify_port = rxe_modify_port,
1053	.modify_qp = rxe_modify_qp,
1054	.modify_srq = rxe_modify_srq,
1055	.peek_cq = rxe_peek_cq,
1056	.poll_cq = rxe_poll_cq,
1057	.post_recv = rxe_post_recv,
1058	.post_send = rxe_post_send,
1059	.post_srq_recv = rxe_post_srq_recv,
1060	.query_ah = rxe_query_ah,
1061	.query_device = rxe_query_device,
1062	.query_pkey = rxe_query_pkey,
1063	.query_port = rxe_query_port,
1064	.query_qp = rxe_query_qp,
1065	.query_srq = rxe_query_srq,
1066	.reg_user_mr = rxe_reg_user_mr,
1067	.req_notify_cq = rxe_req_notify_cq,
1068	.resize_cq = rxe_resize_cq,
1069
1070	INIT_RDMA_OBJ_SIZE(ib_ah, rxe_ah, ibah),
1071	INIT_RDMA_OBJ_SIZE(ib_cq, rxe_cq, ibcq),
1072	INIT_RDMA_OBJ_SIZE(ib_pd, rxe_pd, ibpd),
1073	INIT_RDMA_OBJ_SIZE(ib_qp, rxe_qp, ibqp),
1074	INIT_RDMA_OBJ_SIZE(ib_srq, rxe_srq, ibsrq),
1075	INIT_RDMA_OBJ_SIZE(ib_ucontext, rxe_ucontext, ibuc),
1076	INIT_RDMA_OBJ_SIZE(ib_mw, rxe_mw, ibmw),
1077};
1078
1079int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
1080{
1081	int err;
1082	struct ib_device *dev = &rxe->ib_dev;
1083
1084	strscpy(dev->node_desc, "rxe", sizeof(dev->node_desc));
1085
1086	dev->node_type = RDMA_NODE_IB_CA;
1087	dev->phys_port_cnt = 1;
1088	dev->num_comp_vectors = num_possible_cpus();
1089	dev->local_dma_lkey = 0;
1090	addrconf_addr_eui48((unsigned char *)&dev->node_guid,
1091			    rxe->ndev->dev_addr);
1092
1093	dev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_POST_SEND) |
1094				BIT_ULL(IB_USER_VERBS_CMD_REQ_NOTIFY_CQ);
1095
1096	ib_set_device_ops(dev, &rxe_dev_ops);
1097	err = ib_device_set_netdev(&rxe->ib_dev, rxe->ndev, 1);
1098	if (err)
1099		return err;
1100
1101	err = rxe_icrc_init(rxe);
1102	if (err)
1103		return err;
1104
1105	err = ib_register_device(dev, ibdev_name, NULL);
1106	if (err)
1107		rxe_dbg(rxe, "failed with error %d\n", err);
1108
1109	/*
1110	 * Note that rxe may be invalid at this point if another thread
1111	 * unregistered it.
1112	 */
1113	return err;
1114}