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 --- |