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, &params);
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, &params);
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, &params);
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, &params);
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, &params);
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 ---