verbs.c (9b031c86506cef9acae45e61339fcf9deaabb793) | verbs.c (b6db3f71c976ea92361dbc7ebfb65db666ac9f02) |
---|---|
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: --- 131 unchanged lines hidden (view full) --- 140 attr->max_recv_sge = qattr->max_sge; 141 attr->max_sge_rd = qattr->max_sge; 142 attr->max_cq = qattr->max_cq; 143 attr->max_cqe = qattr->max_cqe; 144 attr->max_mr = qattr->max_mr; 145 attr->max_mw = qattr->max_mw; 146 attr->max_pd = qattr->max_pd; 147 attr->atomic_cap = dev->atomic_cap; | 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: --- 131 unchanged lines hidden (view full) --- 140 attr->max_recv_sge = qattr->max_sge; 141 attr->max_sge_rd = qattr->max_sge; 142 attr->max_cq = qattr->max_cq; 143 attr->max_cqe = qattr->max_cqe; 144 attr->max_mr = qattr->max_mr; 145 attr->max_mw = qattr->max_mw; 146 attr->max_pd = qattr->max_pd; 147 attr->atomic_cap = dev->atomic_cap; |
148 attr->max_fmr = qattr->max_fmr; 149 attr->max_map_per_fmr = 16; | |
150 attr->max_qp_init_rd_atom = 151 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1); 152 attr->max_qp_rd_atom = 153 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1), 154 attr->max_qp_init_rd_atom); 155 156 attr->max_srq = qattr->max_srq; 157 attr->max_srq_sge = qattr->max_srq_sge; --- 730 unchanged lines hidden (view full) --- 888int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 889 struct ib_udata *udata) 890{ 891 struct ib_device *ibdev = ibcq->device; 892 struct qedr_ucontext *ctx = rdma_udata_to_drv_context( 893 udata, struct qedr_ucontext, ibucontext); 894 struct qed_rdma_destroy_cq_out_params destroy_oparams; 895 struct qed_rdma_destroy_cq_in_params destroy_iparams; | 148 attr->max_qp_init_rd_atom = 149 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1); 150 attr->max_qp_rd_atom = 151 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1), 152 attr->max_qp_init_rd_atom); 153 154 attr->max_srq = qattr->max_srq; 155 attr->max_srq_sge = qattr->max_srq_sge; --- 730 unchanged lines hidden (view full) --- 886int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 887 struct ib_udata *udata) 888{ 889 struct ib_device *ibdev = ibcq->device; 890 struct qedr_ucontext *ctx = rdma_udata_to_drv_context( 891 udata, struct qedr_ucontext, ibucontext); 892 struct qed_rdma_destroy_cq_out_params destroy_oparams; 893 struct qed_rdma_destroy_cq_in_params destroy_iparams; |
894 struct qed_chain_init_params chain_params = { 895 .mode = QED_CHAIN_MODE_PBL, 896 .intended_use = QED_CHAIN_USE_TO_CONSUME, 897 .cnt_type = QED_CHAIN_CNT_TYPE_U32, 898 .elem_size = sizeof(union rdma_cqe), 899 }; |
|
896 struct qedr_dev *dev = get_qedr_dev(ibdev); 897 struct qed_rdma_create_cq_in_params params; 898 struct qedr_create_cq_ureq ureq = {}; 899 int vector = attr->comp_vector; 900 int entries = attr->cqe; 901 struct qedr_cq *cq = get_qedr_cq(ibcq); 902 int chain_entries; 903 u32 db_offset; --- 10 unchanged lines hidden (view full) --- 914 DP_ERR(dev, 915 "create cq: the number of entries %d is too high. Must be equal or below %d.\n", 916 entries, QEDR_MAX_CQES); 917 return -EINVAL; 918 } 919 920 chain_entries = qedr_align_cq_entries(entries); 921 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES); | 900 struct qedr_dev *dev = get_qedr_dev(ibdev); 901 struct qed_rdma_create_cq_in_params params; 902 struct qedr_create_cq_ureq ureq = {}; 903 int vector = attr->comp_vector; 904 int entries = attr->cqe; 905 struct qedr_cq *cq = get_qedr_cq(ibcq); 906 int chain_entries; 907 u32 db_offset; --- 10 unchanged lines hidden (view full) --- 918 DP_ERR(dev, 919 "create cq: the number of entries %d is too high. Must be equal or below %d.\n", 920 entries, QEDR_MAX_CQES); 921 return -EINVAL; 922 } 923 924 chain_entries = qedr_align_cq_entries(entries); 925 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES); |
926 chain_params.num_elems = chain_entries; |
|
922 923 /* calc db offset. user will add DPI base, kernel will add db addr */ 924 db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT); 925 926 if (udata) { 927 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq), 928 udata->inlen))) { 929 DP_ERR(dev, --- 18 unchanged lines hidden (view full) --- 948 pbl_ptr = cq->q.pbl_tbl->pa; 949 page_cnt = cq->q.pbl_info.num_pbes; 950 951 cq->ibcq.cqe = chain_entries; 952 cq->q.db_addr = ctx->dpi_addr + db_offset; 953 } else { 954 cq->cq_type = QEDR_CQ_TYPE_KERNEL; 955 | 927 928 /* calc db offset. user will add DPI base, kernel will add db addr */ 929 db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT); 930 931 if (udata) { 932 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq), 933 udata->inlen))) { 934 DP_ERR(dev, --- 18 unchanged lines hidden (view full) --- 953 pbl_ptr = cq->q.pbl_tbl->pa; 954 page_cnt = cq->q.pbl_info.num_pbes; 955 956 cq->ibcq.cqe = chain_entries; 957 cq->q.db_addr = ctx->dpi_addr + db_offset; 958 } else { 959 cq->cq_type = QEDR_CQ_TYPE_KERNEL; 960 |
956 rc = dev->ops->common->chain_alloc(dev->cdev, 957 QED_CHAIN_USE_TO_CONSUME, 958 QED_CHAIN_MODE_PBL, 959 QED_CHAIN_CNT_TYPE_U32, 960 chain_entries, 961 sizeof(union rdma_cqe), 962 &cq->pbl, NULL); | 961 rc = dev->ops->common->chain_alloc(dev->cdev, &cq->pbl, 962 &chain_params); |
963 if (rc) 964 goto err0; 965 966 page_cnt = qed_chain_get_page_cnt(&cq->pbl); 967 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl); 968 cq->ibcq.cqe = cq->pbl.capacity; 969 } 970 --- 472 unchanged lines hidden (view full) --- 1443 return 0; 1444} 1445 1446static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq, 1447 struct qedr_dev *dev, 1448 struct ib_srq_init_attr *init_attr) 1449{ 1450 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq; | 963 if (rc) 964 goto err0; 965 966 page_cnt = qed_chain_get_page_cnt(&cq->pbl); 967 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl); 968 cq->ibcq.cqe = cq->pbl.capacity; 969 } 970 --- 472 unchanged lines hidden (view full) --- 1443 return 0; 1444} 1445 1446static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq, 1447 struct qedr_dev *dev, 1448 struct ib_srq_init_attr *init_attr) 1449{ 1450 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq; |
1451 struct qed_chain_init_params params = { 1452 .mode = QED_CHAIN_MODE_PBL, 1453 .intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE, 1454 .cnt_type = QED_CHAIN_CNT_TYPE_U32, 1455 .elem_size = QEDR_SRQ_WQE_ELEM_SIZE, 1456 }; |
|
1451 dma_addr_t phy_prod_pair_addr; 1452 u32 num_elems; 1453 void *va; 1454 int rc; 1455 1456 va = dma_alloc_coherent(&dev->pdev->dev, 1457 sizeof(struct rdma_srq_producers), 1458 &phy_prod_pair_addr, GFP_KERNEL); 1459 if (!va) { 1460 DP_ERR(dev, 1461 "create srq: failed to allocate dma memory for producer\n"); 1462 return -ENOMEM; 1463 } 1464 1465 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr; 1466 hw_srq->virt_prod_pair_addr = va; 1467 1468 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE; | 1457 dma_addr_t phy_prod_pair_addr; 1458 u32 num_elems; 1459 void *va; 1460 int rc; 1461 1462 va = dma_alloc_coherent(&dev->pdev->dev, 1463 sizeof(struct rdma_srq_producers), 1464 &phy_prod_pair_addr, GFP_KERNEL); 1465 if (!va) { 1466 DP_ERR(dev, 1467 "create srq: failed to allocate dma memory for producer\n"); 1468 return -ENOMEM; 1469 } 1470 1471 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr; 1472 hw_srq->virt_prod_pair_addr = va; 1473 1474 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE; |
1469 rc = dev->ops->common->chain_alloc(dev->cdev, 1470 QED_CHAIN_USE_TO_CONSUME_PRODUCE, 1471 QED_CHAIN_MODE_PBL, 1472 QED_CHAIN_CNT_TYPE_U32, 1473 num_elems, 1474 QEDR_SRQ_WQE_ELEM_SIZE, 1475 &hw_srq->pbl, NULL); | 1475 params.num_elems = num_elems; 1476 1477 rc = dev->ops->common->chain_alloc(dev->cdev, &hw_srq->pbl, ¶ms); |
1476 if (rc) 1477 goto err0; 1478 1479 hw_srq->num_elems = num_elems; 1480 1481 return 0; 1482 1483err0: --- 414 unchanged lines hidden (view full) --- 1898 1899static int 1900qedr_roce_create_kernel_qp(struct qedr_dev *dev, 1901 struct qedr_qp *qp, 1902 struct qed_rdma_create_qp_in_params *in_params, 1903 u32 n_sq_elems, u32 n_rq_elems) 1904{ 1905 struct qed_rdma_create_qp_out_params out_params; | 1478 if (rc) 1479 goto err0; 1480 1481 hw_srq->num_elems = num_elems; 1482 1483 return 0; 1484 1485err0: --- 414 unchanged lines hidden (view full) --- 1900 1901static int 1902qedr_roce_create_kernel_qp(struct qedr_dev *dev, 1903 struct qedr_qp *qp, 1904 struct qed_rdma_create_qp_in_params *in_params, 1905 u32 n_sq_elems, u32 n_rq_elems) 1906{ 1907 struct qed_rdma_create_qp_out_params out_params; |
1908 struct qed_chain_init_params params = { 1909 .mode = QED_CHAIN_MODE_PBL, 1910 .cnt_type = QED_CHAIN_CNT_TYPE_U32, 1911 }; |
|
1906 int rc; 1907 | 1912 int rc; 1913 |
1908 rc = dev->ops->common->chain_alloc(dev->cdev, 1909 QED_CHAIN_USE_TO_PRODUCE, 1910 QED_CHAIN_MODE_PBL, 1911 QED_CHAIN_CNT_TYPE_U32, 1912 n_sq_elems, 1913 QEDR_SQE_ELEMENT_SIZE, 1914 &qp->sq.pbl, NULL); | 1914 params.intended_use = QED_CHAIN_USE_TO_PRODUCE; 1915 params.num_elems = n_sq_elems; 1916 params.elem_size = QEDR_SQE_ELEMENT_SIZE; |
1915 | 1917 |
1918 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, ¶ms); |
|
1916 if (rc) 1917 return rc; 1918 1919 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl); 1920 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl); 1921 | 1919 if (rc) 1920 return rc; 1921 1922 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl); 1923 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl); 1924 |
1922 rc = dev->ops->common->chain_alloc(dev->cdev, 1923 QED_CHAIN_USE_TO_CONSUME_PRODUCE, 1924 QED_CHAIN_MODE_PBL, 1925 QED_CHAIN_CNT_TYPE_U32, 1926 n_rq_elems, 1927 QEDR_RQE_ELEMENT_SIZE, 1928 &qp->rq.pbl, NULL); | 1925 params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE; 1926 params.elem_size = n_rq_elems; 1927 params.elem_size = QEDR_RQE_ELEMENT_SIZE; 1928 1929 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, ¶ms); |
1929 if (rc) 1930 return rc; 1931 1932 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl); 1933 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl); 1934 1935 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx, 1936 in_params, &out_params); --- 9 unchanged lines hidden (view full) --- 1946 1947static int 1948qedr_iwarp_create_kernel_qp(struct qedr_dev *dev, 1949 struct qedr_qp *qp, 1950 struct qed_rdma_create_qp_in_params *in_params, 1951 u32 n_sq_elems, u32 n_rq_elems) 1952{ 1953 struct qed_rdma_create_qp_out_params out_params; | 1930 if (rc) 1931 return rc; 1932 1933 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl); 1934 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl); 1935 1936 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx, 1937 in_params, &out_params); --- 9 unchanged lines hidden (view full) --- 1947 1948static int 1949qedr_iwarp_create_kernel_qp(struct qedr_dev *dev, 1950 struct qedr_qp *qp, 1951 struct qed_rdma_create_qp_in_params *in_params, 1952 u32 n_sq_elems, u32 n_rq_elems) 1953{ 1954 struct qed_rdma_create_qp_out_params out_params; |
1954 struct qed_chain_ext_pbl ext_pbl; | 1955 struct qed_chain_init_params params = { 1956 .mode = QED_CHAIN_MODE_PBL, 1957 .cnt_type = QED_CHAIN_CNT_TYPE_U32, 1958 }; |
1955 int rc; 1956 1957 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems, 1958 QEDR_SQE_ELEMENT_SIZE, 1959 QED_CHAIN_MODE_PBL); 1960 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems, 1961 QEDR_RQE_ELEMENT_SIZE, 1962 QED_CHAIN_MODE_PBL); 1963 1964 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx, 1965 in_params, &out_params); 1966 1967 if (!qp->qed_qp) 1968 return -EINVAL; 1969 1970 /* Now we allocate the chain */ | 1959 int rc; 1960 1961 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems, 1962 QEDR_SQE_ELEMENT_SIZE, 1963 QED_CHAIN_MODE_PBL); 1964 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems, 1965 QEDR_RQE_ELEMENT_SIZE, 1966 QED_CHAIN_MODE_PBL); 1967 1968 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx, 1969 in_params, &out_params); 1970 1971 if (!qp->qed_qp) 1972 return -EINVAL; 1973 1974 /* Now we allocate the chain */ |
1971 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt; 1972 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys; | |
1973 | 1975 |
1974 rc = dev->ops->common->chain_alloc(dev->cdev, 1975 QED_CHAIN_USE_TO_PRODUCE, 1976 QED_CHAIN_MODE_PBL, 1977 QED_CHAIN_CNT_TYPE_U32, 1978 n_sq_elems, 1979 QEDR_SQE_ELEMENT_SIZE, 1980 &qp->sq.pbl, &ext_pbl); | 1976 params.intended_use = QED_CHAIN_USE_TO_PRODUCE; 1977 params.num_elems = n_sq_elems; 1978 params.elem_size = QEDR_SQE_ELEMENT_SIZE; 1979 params.ext_pbl_virt = out_params.sq_pbl_virt; 1980 params.ext_pbl_phys = out_params.sq_pbl_phys; |
1981 | 1981 |
1982 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, ¶ms); |
|
1982 if (rc) 1983 goto err; 1984 | 1983 if (rc) 1984 goto err; 1985 |
1985 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt; 1986 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys; | 1986 params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE; 1987 params.num_elems = n_rq_elems; 1988 params.elem_size = QEDR_RQE_ELEMENT_SIZE; 1989 params.ext_pbl_virt = out_params.rq_pbl_virt; 1990 params.ext_pbl_phys = out_params.rq_pbl_phys; |
1987 | 1991 |
1988 rc = dev->ops->common->chain_alloc(dev->cdev, 1989 QED_CHAIN_USE_TO_CONSUME_PRODUCE, 1990 QED_CHAIN_MODE_PBL, 1991 QED_CHAIN_CNT_TYPE_U32, 1992 n_rq_elems, 1993 QEDR_RQE_ELEMENT_SIZE, 1994 &qp->rq.pbl, &ext_pbl); 1995 | 1992 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, ¶ms); |
1996 if (rc) 1997 goto err; 1998 1999 qp->qp_id = out_params.qp_id; 2000 qp->icid = out_params.icid; 2001 2002 return qedr_set_iwarp_db_info(dev, qp); 2003 --- 741 unchanged lines hidden (view full) --- 2745 qedr_free_qp_resources(dev, qp, udata); 2746 2747 if (rdma_protocol_iwarp(&dev->ibdev, 1)) 2748 qedr_iw_qp_rem_ref(&qp->ibqp); 2749 2750 return 0; 2751} 2752 | 1993 if (rc) 1994 goto err; 1995 1996 qp->qp_id = out_params.qp_id; 1997 qp->icid = out_params.icid; 1998 1999 return qedr_set_iwarp_db_info(dev, qp); 2000 --- 741 unchanged lines hidden (view full) --- 2742 qedr_free_qp_resources(dev, qp, udata); 2743 2744 if (rdma_protocol_iwarp(&dev->ibdev, 1)) 2745 qedr_iw_qp_rem_ref(&qp->ibqp); 2746 2747 return 0; 2748} 2749 |
2753int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags, | 2750int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr, |
2754 struct ib_udata *udata) 2755{ 2756 struct qedr_ah *ah = get_qedr_ah(ibah); 2757 | 2751 struct ib_udata *udata) 2752{ 2753 struct qedr_ah *ah = get_qedr_ah(ibah); 2754 |
2758 rdma_copy_ah_attr(&ah->attr, attr); | 2755 rdma_copy_ah_attr(&ah->attr, init_attr->ah_attr); |
2759 2760 return 0; 2761} 2762 2763void qedr_destroy_ah(struct ib_ah *ibah, u32 flags) 2764{ 2765 struct qedr_ah *ah = get_qedr_ah(ibah); 2766 --- 1601 unchanged lines hidden --- | 2756 2757 return 0; 2758} 2759 2760void qedr_destroy_ah(struct ib_ah *ibah, u32 flags) 2761{ 2762 struct qedr_ah *ah = get_qedr_ah(ibah); 2763 --- 1601 unchanged lines hidden --- |