verbs.c (3491c9e799fb96d909f22f3b39d8cca81e75c3a9) verbs.c (40b173ddce0fc6653a859889d1a90b5f5817061b)
1/* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 1185 unchanged lines hidden (view full) ---

1194 "create qp: userspace can't create special QPs of type=0x%x\n",
1195 attrs->qp_type);
1196 return -EINVAL;
1197 }
1198
1199 return 0;
1200}
1201
1/* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 1185 unchanged lines hidden (view full) ---

1194 "create qp: userspace can't create special QPs of type=0x%x\n",
1195 attrs->qp_type);
1196 return -EINVAL;
1197 }
1198
1199 return 0;
1200}
1201
1202static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1203 struct qedr_srq *srq, struct ib_udata *udata)
1204{
1205 struct qedr_create_srq_uresp uresp = {};
1206 int rc;
1207
1208 uresp.srq_id = srq->srq_id;
1209
1210 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1211 if (rc)
1212 DP_ERR(dev, "create srq: problem copying data to user space\n");
1213
1214 return rc;
1215}
1216
1202static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1203 struct qedr_create_qp_uresp *uresp,
1204 struct qedr_qp *qp)
1205{
1206 /* iWARP requires two doorbells per RQ. */
1207 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1208 uresp->rq_db_offset =
1209 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);

--- 106 unchanged lines hidden (view full) ---

1316 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1317 attrs->attr.max_sge, qattr->max_sge);
1318 return -EINVAL;
1319 }
1320
1321 return 0;
1322}
1323
1217static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1218 struct qedr_create_qp_uresp *uresp,
1219 struct qedr_qp *qp)
1220{
1221 /* iWARP requires two doorbells per RQ. */
1222 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1223 uresp->rq_db_offset =
1224 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);

--- 106 unchanged lines hidden (view full) ---

1331 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1332 attrs->attr.max_sge, qattr->max_sge);
1333 return -EINVAL;
1334 }
1335
1336 return 0;
1337}
1338
1339static void qedr_free_srq_user_params(struct qedr_srq *srq)
1340{
1341 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1342 ib_umem_release(srq->usrq.umem);
1343 ib_umem_release(srq->prod_umem);
1344}
1345
1324static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1325{
1326 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1327 struct qedr_dev *dev = srq->dev;
1328
1329 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1330
1331 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1332 hw_srq->virt_prod_pair_addr,
1333 hw_srq->phy_prod_pair_addr);
1334}
1335
1346static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1347{
1348 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1349 struct qedr_dev *dev = srq->dev;
1350
1351 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1352
1353 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1354 hw_srq->virt_prod_pair_addr,
1355 hw_srq->phy_prod_pair_addr);
1356}
1357
1358static int qedr_init_srq_user_params(struct ib_ucontext *ib_ctx,
1359 struct qedr_srq *srq,
1360 struct qedr_create_srq_ureq *ureq,
1361 int access, int dmasync)
1362{
1363 struct scatterlist *sg;
1364 int rc;
1365
1366 rc = qedr_init_user_queue(ib_ctx, srq->dev, &srq->usrq, ureq->srq_addr,
1367 ureq->srq_len, access, dmasync, 1);
1368 if (rc)
1369 return rc;
1370
1371 srq->prod_umem = ib_umem_get(ib_ctx, ureq->prod_pair_addr,
1372 sizeof(struct rdma_srq_producers),
1373 access, dmasync);
1374 if (IS_ERR(srq->prod_umem)) {
1375 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1376 ib_umem_release(srq->usrq.umem);
1377 DP_ERR(srq->dev,
1378 "create srq: failed ib_umem_get for producer, got %ld\n",
1379 PTR_ERR(srq->prod_umem));
1380 return PTR_ERR(srq->prod_umem);
1381 }
1382
1383 sg = srq->prod_umem->sg_head.sgl;
1384 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1385
1386 return 0;
1387}
1388
1336static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1337 struct qedr_dev *dev,
1338 struct ib_srq_init_attr *init_attr)
1339{
1340 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1341 dma_addr_t phy_prod_pair_addr;
1342 u32 num_elems;
1343 void *va;

--- 41 unchanged lines hidden (view full) ---

1385 struct ib_srq_init_attr *init_attr,
1386 struct ib_udata *udata)
1387{
1388 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1389 struct qed_rdma_create_srq_in_params in_params = {};
1390 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1391 struct qed_rdma_create_srq_out_params out_params;
1392 struct qedr_pd *pd = get_qedr_pd(ibpd);
1389static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1390 struct qedr_dev *dev,
1391 struct ib_srq_init_attr *init_attr)
1392{
1393 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1394 dma_addr_t phy_prod_pair_addr;
1395 u32 num_elems;
1396 void *va;

--- 41 unchanged lines hidden (view full) ---

1438 struct ib_srq_init_attr *init_attr,
1439 struct ib_udata *udata)
1440{
1441 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1442 struct qed_rdma_create_srq_in_params in_params = {};
1443 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1444 struct qed_rdma_create_srq_out_params out_params;
1445 struct qedr_pd *pd = get_qedr_pd(ibpd);
1446 struct qedr_create_srq_ureq ureq = {};
1393 u64 pbl_base_addr, phy_prod_pair_addr;
1447 u64 pbl_base_addr, phy_prod_pair_addr;
1448 struct ib_ucontext *ib_ctx = NULL;
1394 struct qedr_srq_hwq_info *hw_srq;
1449 struct qedr_srq_hwq_info *hw_srq;
1450 struct qedr_ucontext *ctx = NULL;
1395 u32 page_cnt, page_size;
1451 u32 page_cnt, page_size;
1396 struct qed_chain *pbl;
1397 struct qedr_srq *srq;
1398 int rc = 0;
1399
1400 DP_DEBUG(dev, QEDR_MSG_QP,
1401 "create SRQ called from %s (pd %p)\n",
1402 (udata) ? "User lib" : "kernel", pd);
1403
1404 rc = qedr_check_srq_params(ibpd, dev, init_attr, udata);

--- 6 unchanged lines hidden (view full) ---

1411
1412 srq->dev = dev;
1413 hw_srq = &srq->hw_srq;
1414 spin_lock_init(&srq->lock);
1415
1416 hw_srq->max_wr = init_attr->attr.max_wr;
1417 hw_srq->max_sges = init_attr->attr.max_sge;
1418
1452 struct qedr_srq *srq;
1453 int rc = 0;
1454
1455 DP_DEBUG(dev, QEDR_MSG_QP,
1456 "create SRQ called from %s (pd %p)\n",
1457 (udata) ? "User lib" : "kernel", pd);
1458
1459 rc = qedr_check_srq_params(ibpd, dev, init_attr, udata);

--- 6 unchanged lines hidden (view full) ---

1466
1467 srq->dev = dev;
1468 hw_srq = &srq->hw_srq;
1469 spin_lock_init(&srq->lock);
1470
1471 hw_srq->max_wr = init_attr->attr.max_wr;
1472 hw_srq->max_sges = init_attr->attr.max_sge;
1473
1419 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1420 if (rc)
1421 goto err0;
1474 if (udata && ibpd->uobject && ibpd->uobject->context) {
1475 ib_ctx = ibpd->uobject->context;
1476 ctx = get_qedr_ucontext(ib_ctx);
1422
1477
1423 pbl = &hw_srq->pbl;
1424 page_cnt = qed_chain_get_page_cnt(pbl);
1425 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1426 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1427 page_size = QED_CHAIN_PAGE_SIZE;
1478 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
1479 DP_ERR(dev,
1480 "create srq: problem copying data from user space\n");
1481 goto err0;
1482 }
1483
1484 rc = qedr_init_srq_user_params(ib_ctx, srq, &ureq, 0, 0);
1485 if (rc)
1486 goto err0;
1487
1488 page_cnt = srq->usrq.pbl_info.num_pbes;
1489 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1490 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1491 page_size = BIT(srq->usrq.umem->page_shift);
1492 } else {
1493 struct qed_chain *pbl;
1494
1495 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1496 if (rc)
1497 goto err0;
1498
1499 pbl = &hw_srq->pbl;
1500 page_cnt = qed_chain_get_page_cnt(pbl);
1501 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1502 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1503 page_size = QED_CHAIN_PAGE_SIZE;
1504 }
1505
1428 in_params.pd_id = pd->pd_id;
1429 in_params.pbl_base_addr = pbl_base_addr;
1430 in_params.prod_pair_addr = phy_prod_pair_addr;
1431 in_params.num_pages = page_cnt;
1432 in_params.page_size = page_size;
1433
1434 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1435 if (rc)
1436 goto err1;
1437
1438 srq->srq_id = out_params.srq_id;
1439
1506 in_params.pd_id = pd->pd_id;
1507 in_params.pbl_base_addr = pbl_base_addr;
1508 in_params.prod_pair_addr = phy_prod_pair_addr;
1509 in_params.num_pages = page_cnt;
1510 in_params.page_size = page_size;
1511
1512 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1513 if (rc)
1514 goto err1;
1515
1516 srq->srq_id = out_params.srq_id;
1517
1518 if (udata) {
1519 rc = qedr_copy_srq_uresp(dev, srq, udata);
1520 if (rc)
1521 goto err2;
1522 }
1523
1440 rc = qedr_idr_add(dev, &dev->srqidr, srq, srq->srq_id);
1441 if (rc)
1442 goto err2;
1443
1444 DP_DEBUG(dev, QEDR_MSG_SRQ,
1445 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1446 return &srq->ibsrq;
1447
1448err2:
1449 destroy_in_params.srq_id = srq->srq_id;
1450
1451 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1452err1:
1524 rc = qedr_idr_add(dev, &dev->srqidr, srq, srq->srq_id);
1525 if (rc)
1526 goto err2;
1527
1528 DP_DEBUG(dev, QEDR_MSG_SRQ,
1529 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1530 return &srq->ibsrq;
1531
1532err2:
1533 destroy_in_params.srq_id = srq->srq_id;
1534
1535 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1536err1:
1453 qedr_free_srq_kernel_params(srq);
1537 if (udata)
1538 qedr_free_srq_user_params(srq);
1539 else
1540 qedr_free_srq_kernel_params(srq);
1454err0:
1455 kfree(srq);
1456
1457 return ERR_PTR(-EFAULT);
1458}
1459
1460int qedr_destroy_srq(struct ib_srq *ibsrq)
1461{
1462 struct qed_rdma_destroy_srq_in_params in_params = {};
1463 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1464 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1465
1466 qedr_idr_remove(dev, &dev->srqidr, srq->srq_id);
1467 in_params.srq_id = srq->srq_id;
1468 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1469
1541err0:
1542 kfree(srq);
1543
1544 return ERR_PTR(-EFAULT);
1545}
1546
1547int qedr_destroy_srq(struct ib_srq *ibsrq)
1548{
1549 struct qed_rdma_destroy_srq_in_params in_params = {};
1550 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1551 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1552
1553 qedr_idr_remove(dev, &dev->srqidr, srq->srq_id);
1554 in_params.srq_id = srq->srq_id;
1555 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1556
1470 qedr_free_srq_kernel_params(srq);
1557 if (ibsrq->pd->uobject)
1558 qedr_free_srq_user_params(srq);
1559 else
1560 qedr_free_srq_kernel_params(srq);
1471
1472 DP_DEBUG(dev, QEDR_MSG_SRQ,
1473 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1474 srq->srq_id);
1475 kfree(srq);
1476
1477 return 0;
1478}

--- 109 unchanged lines hidden (view full) ---

1588 struct qedr_qp *qp,
1589 struct qed_rdma_create_qp_out_params *out_params)
1590{
1591 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1592 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1593
1594 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1595 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1561
1562 DP_DEBUG(dev, QEDR_MSG_SRQ,
1563 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1564 srq->srq_id);
1565 kfree(srq);
1566
1567 return 0;
1568}

--- 109 unchanged lines hidden (view full) ---

1678 struct qedr_qp *qp,
1679 struct qed_rdma_create_qp_out_params *out_params)
1680{
1681 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1682 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1683
1684 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1685 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1686 if (!qp->srq) {
1687 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1688 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1689 }
1596
1690
1597 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1598 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1599
1600 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1601 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1602}
1603
1604static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1605{
1606 if (qp->usq.umem)
1607 ib_umem_release(qp->usq.umem);

--- 28 unchanged lines hidden (view full) ---

1636 }
1637
1638 /* SQ - read access only (0), dma sync not required (0) */
1639 rc = qedr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
1640 ureq.sq_len, 0, 0, alloc_and_init);
1641 if (rc)
1642 return rc;
1643
1691 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1692 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1693}
1694
1695static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1696{
1697 if (qp->usq.umem)
1698 ib_umem_release(qp->usq.umem);

--- 28 unchanged lines hidden (view full) ---

1727 }
1728
1729 /* SQ - read access only (0), dma sync not required (0) */
1730 rc = qedr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
1731 ureq.sq_len, 0, 0, alloc_and_init);
1732 if (rc)
1733 return rc;
1734
1644 /* RQ - read access only (0), dma sync not required (0) */
1645 rc = qedr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
1646 ureq.rq_len, 0, 0, alloc_and_init);
1647 if (rc)
1648 return rc;
1735 if (!qp->srq) {
1736 /* RQ - read access only (0), dma sync not required (0) */
1737 rc = qedr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
1738 ureq.rq_len, 0, 0, alloc_and_init);
1739 if (rc)
1740 return rc;
1741 }
1649
1650 memset(&in_params, 0, sizeof(in_params));
1651 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1652 in_params.qp_handle_lo = ureq.qp_handle_lo;
1653 in_params.qp_handle_hi = ureq.qp_handle_hi;
1654 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1655 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1742
1743 memset(&in_params, 0, sizeof(in_params));
1744 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1745 in_params.qp_handle_lo = ureq.qp_handle_lo;
1746 in_params.qp_handle_hi = ureq.qp_handle_hi;
1747 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1748 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1656 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1657 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1749 if (!qp->srq) {
1750 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1751 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1752 }
1658
1659 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1660 &in_params, &out_params);
1661
1662 if (!qp->qed_qp) {
1663 rc = -ENOMEM;
1664 goto err1;
1665 }

--- 2505 unchanged lines hidden ---
1753
1754 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1755 &in_params, &out_params);
1756
1757 if (!qp->qed_qp) {
1758 rc = -ENOMEM;
1759 goto err1;
1760 }

--- 2505 unchanged lines hidden ---