.. | .. |
---|
| 1 | +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
---|
1 | 2 | /* QLogic qed NIC Driver |
---|
2 | 3 | * Copyright (c) 2015-2017 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: |
---|
9 | | - * |
---|
10 | | - * Redistribution and use in source and binary forms, with or |
---|
11 | | - * without modification, are permitted provided that the following |
---|
12 | | - * conditions are met: |
---|
13 | | - * |
---|
14 | | - * - Redistributions of source code must retain the above |
---|
15 | | - * copyright notice, this list of conditions and the following |
---|
16 | | - * disclaimer. |
---|
17 | | - * |
---|
18 | | - * - Redistributions in binary form must reproduce the above |
---|
19 | | - * copyright notice, this list of conditions and the following |
---|
20 | | - * disclaimer in the documentation and /or other materials |
---|
21 | | - * provided with the distribution. |
---|
22 | | - * |
---|
23 | | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
---|
24 | | - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
---|
25 | | - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
---|
26 | | - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
---|
27 | | - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
---|
28 | | - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
---|
29 | | - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
---|
30 | | - * SOFTWARE. |
---|
| 4 | + * Copyright (c) 2019-2020 Marvell International Ltd. |
---|
31 | 5 | */ |
---|
| 6 | + |
---|
32 | 7 | #include <linux/types.h> |
---|
33 | 8 | #include <asm/byteorder.h> |
---|
34 | 9 | #include <linux/bitops.h> |
---|
.. | .. |
---|
212 | 187 | goto free_rdma_port; |
---|
213 | 188 | } |
---|
214 | 189 | |
---|
| 190 | + /* Allocate bit map for XRC Domains */ |
---|
| 191 | + rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->xrcd_map, |
---|
| 192 | + QED_RDMA_MAX_XRCDS, "XRCD"); |
---|
| 193 | + if (rc) { |
---|
| 194 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
| 195 | + "Failed to allocate xrcd_map,rc = %d\n", rc); |
---|
| 196 | + goto free_pd_map; |
---|
| 197 | + } |
---|
| 198 | + |
---|
215 | 199 | /* Allocate DPI bitmap */ |
---|
216 | 200 | rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->dpi_map, |
---|
217 | 201 | p_hwfn->dpi_count, "DPI"); |
---|
218 | 202 | if (rc) { |
---|
219 | 203 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
220 | 204 | "Failed to allocate DPI bitmap, rc = %d\n", rc); |
---|
221 | | - goto free_pd_map; |
---|
| 205 | + goto free_xrcd_map; |
---|
222 | 206 | } |
---|
223 | 207 | |
---|
224 | 208 | /* Allocate bitmap for cq's. The maximum number of CQs is bound to |
---|
.. | .. |
---|
271 | 255 | goto free_cid_map; |
---|
272 | 256 | } |
---|
273 | 257 | |
---|
| 258 | + /* The first SRQ follows the last XRC SRQ. This means that the |
---|
| 259 | + * SRQ IDs start from an offset equals to max_xrc_srqs. |
---|
| 260 | + */ |
---|
| 261 | + p_rdma_info->srq_id_offset = p_hwfn->p_cxt_mngr->xrc_srq_count; |
---|
| 262 | + rc = qed_rdma_bmap_alloc(p_hwfn, |
---|
| 263 | + &p_rdma_info->xrc_srq_map, |
---|
| 264 | + p_hwfn->p_cxt_mngr->xrc_srq_count, "XRC SRQ"); |
---|
| 265 | + if (rc) { |
---|
| 266 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
| 267 | + "Failed to allocate xrc srq bitmap, rc = %d\n", rc); |
---|
| 268 | + goto free_real_cid_map; |
---|
| 269 | + } |
---|
| 270 | + |
---|
274 | 271 | /* Allocate bitmap for srqs */ |
---|
275 | | - p_rdma_info->num_srqs = qed_cxt_get_srq_count(p_hwfn); |
---|
| 272 | + p_rdma_info->num_srqs = p_hwfn->p_cxt_mngr->srq_count; |
---|
276 | 273 | rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->srq_map, |
---|
277 | 274 | p_rdma_info->num_srqs, "SRQ"); |
---|
278 | 275 | if (rc) { |
---|
279 | 276 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
280 | 277 | "Failed to allocate srq bitmap, rc = %d\n", rc); |
---|
281 | | - goto free_real_cid_map; |
---|
| 278 | + goto free_xrc_srq_map; |
---|
282 | 279 | } |
---|
283 | 280 | |
---|
284 | 281 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) |
---|
.. | .. |
---|
292 | 289 | |
---|
293 | 290 | free_srq_map: |
---|
294 | 291 | kfree(p_rdma_info->srq_map.bitmap); |
---|
| 292 | +free_xrc_srq_map: |
---|
| 293 | + kfree(p_rdma_info->xrc_srq_map.bitmap); |
---|
295 | 294 | free_real_cid_map: |
---|
296 | 295 | kfree(p_rdma_info->real_cid_map.bitmap); |
---|
297 | 296 | free_cid_map: |
---|
.. | .. |
---|
304 | 303 | kfree(p_rdma_info->cq_map.bitmap); |
---|
305 | 304 | free_dpi_map: |
---|
306 | 305 | kfree(p_rdma_info->dpi_map.bitmap); |
---|
| 306 | +free_xrcd_map: |
---|
| 307 | + kfree(p_rdma_info->xrcd_map.bitmap); |
---|
307 | 308 | free_pd_map: |
---|
308 | 309 | kfree(p_rdma_info->pd_map.bitmap); |
---|
309 | 310 | free_rdma_port: |
---|
.. | .. |
---|
377 | 378 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->tid_map, 1); |
---|
378 | 379 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->srq_map, 1); |
---|
379 | 380 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->real_cid_map, 1); |
---|
| 381 | + qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrc_srq_map, 1); |
---|
| 382 | + qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, 1); |
---|
380 | 383 | |
---|
381 | 384 | kfree(p_rdma_info->port); |
---|
382 | 385 | kfree(p_rdma_info->dev); |
---|
.. | .. |
---|
499 | 502 | dev->max_cqe = QED_RDMA_MAX_CQE_16_BIT; |
---|
500 | 503 | |
---|
501 | 504 | dev->max_mw = 0; |
---|
502 | | - dev->max_fmr = QED_RDMA_MAX_FMR; |
---|
503 | 505 | dev->max_mr_mw_fmr_pbl = (PAGE_SIZE / 8) * (PAGE_SIZE / 8); |
---|
504 | 506 | dev->max_mr_mw_fmr_size = dev->max_mr_mw_fmr_pbl * PAGE_SIZE; |
---|
505 | | - dev->max_pkey = QED_RDMA_MAX_P_KEY; |
---|
| 507 | + if (QED_IS_ROCE_PERSONALITY(p_hwfn)) |
---|
| 508 | + dev->max_pkey = QED_RDMA_MAX_P_KEY; |
---|
506 | 509 | |
---|
507 | 510 | dev->max_srq = p_hwfn->p_rdma_info->num_srqs; |
---|
508 | 511 | dev->max_srq_wr = QED_RDMA_MAX_SRQ_WQE_ELEM; |
---|
.. | .. |
---|
530 | 533 | SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_LOCAL_INV_FENCE, 1); |
---|
531 | 534 | |
---|
532 | 535 | /* Check atomic operations support in PCI configuration space. */ |
---|
533 | | - pci_read_config_dword(cdev->pdev, |
---|
534 | | - cdev->pdev->pcie_cap + PCI_EXP_DEVCTL2, |
---|
535 | | - &pci_status_control); |
---|
| 536 | + pcie_capability_read_dword(cdev->pdev, PCI_EXP_DEVCTL2, |
---|
| 537 | + &pci_status_control); |
---|
536 | 538 | |
---|
537 | 539 | if (pci_status_control & PCI_EXP_DEVCTL2_LTR_EN) |
---|
538 | 540 | SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_ATOMIC_OP, 1); |
---|
.. | .. |
---|
613 | 615 | p_params_header->cnq_start_offset = (u8)RESC_START(p_hwfn, |
---|
614 | 616 | QED_RDMA_CNQ_RAM); |
---|
615 | 617 | p_params_header->num_cnqs = params->desired_cnq; |
---|
616 | | - |
---|
| 618 | + p_params_header->first_reg_srq_id = |
---|
| 619 | + cpu_to_le16(p_hwfn->p_rdma_info->srq_id_offset); |
---|
| 620 | + p_params_header->reg_srq_base_addr = |
---|
| 621 | + cpu_to_le32(qed_cxt_get_ilt_page_size(p_hwfn, ILT_CLI_TSDM)); |
---|
617 | 622 | if (params->cq_mode == QED_RDMA_CQ_MODE_16_BITS) |
---|
618 | 623 | p_params_header->cq_ring_mode = 1; |
---|
619 | 624 | else |
---|
.. | .. |
---|
700 | 705 | return rc; |
---|
701 | 706 | |
---|
702 | 707 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
---|
703 | | - rc = qed_iwarp_setup(p_hwfn, p_ptt, params); |
---|
| 708 | + rc = qed_iwarp_setup(p_hwfn, params); |
---|
704 | 709 | if (rc) |
---|
705 | 710 | return rc; |
---|
706 | 711 | } else { |
---|
.. | .. |
---|
742 | 747 | (ll2_ethertype_en & 0xFFFE)); |
---|
743 | 748 | |
---|
744 | 749 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
---|
745 | | - rc = qed_iwarp_stop(p_hwfn, p_ptt); |
---|
| 750 | + rc = qed_iwarp_stop(p_hwfn); |
---|
746 | 751 | if (rc) { |
---|
747 | 752 | qed_ptt_release(p_hwfn, p_ptt); |
---|
748 | 753 | return rc; |
---|
.. | .. |
---|
799 | 804 | /* Calculate the corresponding DPI address */ |
---|
800 | 805 | dpi_start_offset = p_hwfn->dpi_start_offset; |
---|
801 | 806 | |
---|
802 | | - out_params->dpi_addr = (u64)((u8 __iomem *)p_hwfn->doorbells + |
---|
803 | | - dpi_start_offset + |
---|
804 | | - ((out_params->dpi) * p_hwfn->dpi_size)); |
---|
| 807 | + out_params->dpi_addr = p_hwfn->doorbells + dpi_start_offset + |
---|
| 808 | + out_params->dpi * p_hwfn->dpi_size; |
---|
805 | 809 | |
---|
806 | 810 | out_params->dpi_phys_addr = p_hwfn->db_phys_addr + |
---|
807 | 811 | dpi_start_offset + |
---|
.. | .. |
---|
818 | 822 | { |
---|
819 | 823 | struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
---|
820 | 824 | struct qed_rdma_port *p_port = p_hwfn->p_rdma_info->port; |
---|
| 825 | + struct qed_mcp_link_state *p_link_output; |
---|
821 | 826 | |
---|
822 | 827 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA Query port\n"); |
---|
823 | 828 | |
---|
824 | | - /* Link may have changed */ |
---|
825 | | - p_port->port_state = p_hwfn->mcp_info->link_output.link_up ? |
---|
826 | | - QED_RDMA_PORT_UP : QED_RDMA_PORT_DOWN; |
---|
| 829 | + /* The link state is saved only for the leading hwfn */ |
---|
| 830 | + p_link_output = &QED_LEADING_HWFN(p_hwfn->cdev)->mcp_info->link_output; |
---|
827 | 831 | |
---|
828 | | - p_port->link_speed = p_hwfn->mcp_info->link_output.speed; |
---|
| 832 | + p_port->port_state = p_link_output->link_up ? QED_RDMA_PORT_UP |
---|
| 833 | + : QED_RDMA_PORT_DOWN; |
---|
| 834 | + |
---|
| 835 | + p_port->link_speed = p_link_output->speed; |
---|
829 | 836 | |
---|
830 | 837 | p_port->max_msg_size = RDMA_MAX_DATA_SIZE_IN_WQE; |
---|
831 | 838 | |
---|
.. | .. |
---|
870 | 877 | static int qed_fill_rdma_dev_info(struct qed_dev *cdev, |
---|
871 | 878 | struct qed_dev_rdma_info *info) |
---|
872 | 879 | { |
---|
873 | | - struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); |
---|
| 880 | + struct qed_hwfn *p_hwfn = QED_AFFIN_HWFN(cdev); |
---|
874 | 881 | |
---|
875 | 882 | memset(info, 0, sizeof(*info)); |
---|
876 | 883 | |
---|
.. | .. |
---|
889 | 896 | int feat_num; |
---|
890 | 897 | |
---|
891 | 898 | if (cdev->num_hwfns > 1) |
---|
892 | | - feat_num = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_PF_L2_QUE); |
---|
| 899 | + feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE); |
---|
893 | 900 | else |
---|
894 | | - feat_num = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_PF_L2_QUE) * |
---|
| 901 | + feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE) * |
---|
895 | 902 | cdev->num_hwfns; |
---|
896 | 903 | |
---|
897 | 904 | return feat_num; |
---|
.. | .. |
---|
899 | 906 | |
---|
900 | 907 | static int qed_rdma_get_min_cnq_msix(struct qed_dev *cdev) |
---|
901 | 908 | { |
---|
902 | | - int n_cnq = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_RDMA_CNQ); |
---|
| 909 | + int n_cnq = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_RDMA_CNQ); |
---|
903 | 910 | int n_msix = cdev->int_params.rdma_msix_cnt; |
---|
904 | 911 | |
---|
905 | 912 | return min_t(int, n_cnq, n_msix); |
---|
.. | .. |
---|
979 | 986 | /* Returns a previously allocated protection domain for reuse */ |
---|
980 | 987 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
---|
981 | 988 | qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->pd_map, pd); |
---|
| 989 | + spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
---|
| 990 | +} |
---|
| 991 | + |
---|
| 992 | +static int qed_rdma_alloc_xrcd(void *rdma_cxt, u16 *xrcd_id) |
---|
| 993 | +{ |
---|
| 994 | + struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
---|
| 995 | + u32 returned_id; |
---|
| 996 | + int rc; |
---|
| 997 | + |
---|
| 998 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD\n"); |
---|
| 999 | + |
---|
| 1000 | + spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
---|
| 1001 | + rc = qed_rdma_bmap_alloc_id(p_hwfn, |
---|
| 1002 | + &p_hwfn->p_rdma_info->xrcd_map, |
---|
| 1003 | + &returned_id); |
---|
| 1004 | + spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
---|
| 1005 | + if (rc) { |
---|
| 1006 | + DP_NOTICE(p_hwfn, "Failed in allocating xrcd id\n"); |
---|
| 1007 | + return rc; |
---|
| 1008 | + } |
---|
| 1009 | + |
---|
| 1010 | + *xrcd_id = (u16)returned_id; |
---|
| 1011 | + |
---|
| 1012 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD - done, rc = %d\n", rc); |
---|
| 1013 | + return rc; |
---|
| 1014 | +} |
---|
| 1015 | + |
---|
| 1016 | +static void qed_rdma_free_xrcd(void *rdma_cxt, u16 xrcd_id) |
---|
| 1017 | +{ |
---|
| 1018 | + struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
---|
| 1019 | + |
---|
| 1020 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "xrcd_id = %08x\n", xrcd_id); |
---|
| 1021 | + |
---|
| 1022 | + spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
---|
| 1023 | + qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, xrcd_id); |
---|
982 | 1024 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
---|
983 | 1025 | } |
---|
984 | 1026 | |
---|
.. | .. |
---|
1066 | 1108 | p_ramrod->pbl_num_pages = cpu_to_le16(params->pbl_num_pages); |
---|
1067 | 1109 | p_ramrod->cnq_id = (u8)RESC_START(p_hwfn, QED_RDMA_CNQ_RAM) + |
---|
1068 | 1110 | params->cnq_id; |
---|
1069 | | - p_ramrod->int_timeout = params->int_timeout; |
---|
| 1111 | + p_ramrod->int_timeout = cpu_to_le16(params->int_timeout); |
---|
1070 | 1112 | |
---|
1071 | 1113 | /* toggle the bit for every resize or create cq for a given icid */ |
---|
1072 | 1114 | toggle_bit = qed_rdma_toggle_bit_create_resize_cq(p_hwfn, *icid); |
---|
.. | .. |
---|
1110 | 1152 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", in_params->icid); |
---|
1111 | 1153 | |
---|
1112 | 1154 | p_ramrod_res = |
---|
1113 | | - (struct rdma_destroy_cq_output_params *) |
---|
1114 | 1155 | dma_alloc_coherent(&p_hwfn->cdev->pdev->dev, |
---|
1115 | 1156 | sizeof(struct rdma_destroy_cq_output_params), |
---|
1116 | 1157 | &ramrod_res_phys, GFP_KERNEL); |
---|
.. | .. |
---|
1166 | 1207 | return rc; |
---|
1167 | 1208 | } |
---|
1168 | 1209 | |
---|
1169 | | -void qed_rdma_set_fw_mac(u16 *p_fw_mac, u8 *p_qed_mac) |
---|
| 1210 | +void qed_rdma_set_fw_mac(__le16 *p_fw_mac, const u8 *p_qed_mac) |
---|
1170 | 1211 | { |
---|
1171 | 1212 | p_fw_mac[0] = cpu_to_le16((p_qed_mac[0] << 8) + p_qed_mac[1]); |
---|
1172 | 1213 | p_fw_mac[1] = cpu_to_le16((p_qed_mac[2] << 8) + p_qed_mac[3]); |
---|
.. | .. |
---|
1304 | 1345 | qp->resp_offloaded = false; |
---|
1305 | 1346 | qp->e2e_flow_control_en = qp->use_srq ? false : true; |
---|
1306 | 1347 | qp->stats_queue = in_params->stats_queue; |
---|
| 1348 | + qp->qp_type = in_params->qp_type; |
---|
| 1349 | + qp->xrcd_id = in_params->xrcd_id; |
---|
1307 | 1350 | |
---|
1308 | 1351 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
---|
1309 | 1352 | rc = qed_iwarp_create_qp(p_hwfn, qp, out_params); |
---|
1310 | 1353 | qp->qpid = qp->icid; |
---|
1311 | 1354 | } else { |
---|
| 1355 | + qp->edpm_mode = GET_FIELD(in_params->flags, QED_ROCE_EDPM_MODE); |
---|
1312 | 1356 | rc = qed_roce_alloc_cid(p_hwfn, &qp->icid); |
---|
1313 | 1357 | qp->qpid = ((0xFF << 16) | qp->icid); |
---|
1314 | 1358 | } |
---|
.. | .. |
---|
1416 | 1460 | qp->cur_state); |
---|
1417 | 1461 | } |
---|
1418 | 1462 | |
---|
| 1463 | + switch (qp->qp_type) { |
---|
| 1464 | + case QED_RDMA_QP_TYPE_XRC_INI: |
---|
| 1465 | + qp->has_req = true; |
---|
| 1466 | + break; |
---|
| 1467 | + case QED_RDMA_QP_TYPE_XRC_TGT: |
---|
| 1468 | + qp->has_resp = true; |
---|
| 1469 | + break; |
---|
| 1470 | + default: |
---|
| 1471 | + qp->has_req = true; |
---|
| 1472 | + qp->has_resp = true; |
---|
| 1473 | + } |
---|
| 1474 | + |
---|
1419 | 1475 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
---|
1420 | 1476 | enum qed_iwarp_qp_state new_state = |
---|
1421 | 1477 | qed_roce2iwarp_state(qp->cur_state); |
---|
.. | .. |
---|
1439 | 1495 | struct qed_spq_entry *p_ent; |
---|
1440 | 1496 | enum rdma_tid_type tid_type; |
---|
1441 | 1497 | u8 fw_return_code; |
---|
| 1498 | + u16 flags = 0; |
---|
1442 | 1499 | int rc; |
---|
1443 | 1500 | |
---|
1444 | 1501 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "itid = %08x\n", params->itid); |
---|
.. | .. |
---|
1458 | 1515 | if (p_hwfn->p_rdma_info->last_tid < params->itid) |
---|
1459 | 1516 | p_hwfn->p_rdma_info->last_tid = params->itid; |
---|
1460 | 1517 | |
---|
1461 | | - p_ramrod = &p_ent->ramrod.rdma_register_tid; |
---|
1462 | | - |
---|
1463 | | - p_ramrod->flags = 0; |
---|
1464 | | - SET_FIELD(p_ramrod->flags, |
---|
1465 | | - RDMA_REGISTER_TID_RAMROD_DATA_TWO_LEVEL_PBL, |
---|
| 1518 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_TWO_LEVEL_PBL, |
---|
1466 | 1519 | params->pbl_two_level); |
---|
1467 | 1520 | |
---|
1468 | | - SET_FIELD(p_ramrod->flags, |
---|
1469 | | - RDMA_REGISTER_TID_RAMROD_DATA_ZERO_BASED, params->zbva); |
---|
| 1521 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ZERO_BASED, |
---|
| 1522 | + false); |
---|
1470 | 1523 | |
---|
1471 | | - SET_FIELD(p_ramrod->flags, |
---|
1472 | | - RDMA_REGISTER_TID_RAMROD_DATA_PHY_MR, params->phy_mr); |
---|
| 1524 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PHY_MR, params->phy_mr); |
---|
1473 | 1525 | |
---|
1474 | 1526 | /* Don't initialize D/C field, as it may override other bits. */ |
---|
1475 | 1527 | if (!(params->tid_type == QED_RDMA_TID_FMR) && !(params->dma_mr)) |
---|
1476 | | - SET_FIELD(p_ramrod->flags, |
---|
1477 | | - RDMA_REGISTER_TID_RAMROD_DATA_PAGE_SIZE_LOG, |
---|
| 1528 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PAGE_SIZE_LOG, |
---|
1478 | 1529 | params->page_size_log - 12); |
---|
1479 | 1530 | |
---|
1480 | | - SET_FIELD(p_ramrod->flags, |
---|
1481 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_READ, |
---|
| 1531 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_READ, |
---|
1482 | 1532 | params->remote_read); |
---|
1483 | 1533 | |
---|
1484 | | - SET_FIELD(p_ramrod->flags, |
---|
1485 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_WRITE, |
---|
| 1534 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_WRITE, |
---|
1486 | 1535 | params->remote_write); |
---|
1487 | 1536 | |
---|
1488 | | - SET_FIELD(p_ramrod->flags, |
---|
1489 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_ATOMIC, |
---|
| 1537 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_ATOMIC, |
---|
1490 | 1538 | params->remote_atomic); |
---|
1491 | 1539 | |
---|
1492 | | - SET_FIELD(p_ramrod->flags, |
---|
1493 | | - RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_WRITE, |
---|
| 1540 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_WRITE, |
---|
1494 | 1541 | params->local_write); |
---|
1495 | 1542 | |
---|
1496 | | - SET_FIELD(p_ramrod->flags, |
---|
1497 | | - RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_READ, params->local_read); |
---|
| 1543 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_READ, |
---|
| 1544 | + params->local_read); |
---|
1498 | 1545 | |
---|
1499 | | - SET_FIELD(p_ramrod->flags, |
---|
1500 | | - RDMA_REGISTER_TID_RAMROD_DATA_ENABLE_MW_BIND, |
---|
| 1546 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ENABLE_MW_BIND, |
---|
1501 | 1547 | params->mw_bind); |
---|
| 1548 | + |
---|
| 1549 | + p_ramrod = &p_ent->ramrod.rdma_register_tid; |
---|
| 1550 | + p_ramrod->flags = cpu_to_le16(flags); |
---|
1502 | 1551 | |
---|
1503 | 1552 | SET_FIELD(p_ramrod->flags1, |
---|
1504 | 1553 | RDMA_REGISTER_TID_RAMROD_DATA_PBL_PAGE_SIZE_LOG, |
---|
1505 | 1554 | params->pbl_page_size_log - 12); |
---|
1506 | 1555 | |
---|
1507 | | - SET_FIELD(p_ramrod->flags2, |
---|
1508 | | - RDMA_REGISTER_TID_RAMROD_DATA_DMA_MR, params->dma_mr); |
---|
| 1556 | + SET_FIELD(p_ramrod->flags2, RDMA_REGISTER_TID_RAMROD_DATA_DMA_MR, |
---|
| 1557 | + params->dma_mr); |
---|
1509 | 1558 | |
---|
1510 | 1559 | switch (params->tid_type) { |
---|
1511 | 1560 | case QED_RDMA_TID_REGISTERED_MR: |
---|
.. | .. |
---|
1523 | 1572 | qed_sp_destroy_request(p_hwfn, p_ent); |
---|
1524 | 1573 | return rc; |
---|
1525 | 1574 | } |
---|
1526 | | - SET_FIELD(p_ramrod->flags1, |
---|
1527 | | - RDMA_REGISTER_TID_RAMROD_DATA_TID_TYPE, tid_type); |
---|
| 1575 | + |
---|
| 1576 | + SET_FIELD(p_ramrod->flags1, RDMA_REGISTER_TID_RAMROD_DATA_TID_TYPE, |
---|
| 1577 | + tid_type); |
---|
1528 | 1578 | |
---|
1529 | 1579 | p_ramrod->itid = cpu_to_le32(params->itid); |
---|
1530 | 1580 | p_ramrod->key = params->key; |
---|
1531 | 1581 | p_ramrod->pd = cpu_to_le16(params->pd); |
---|
1532 | 1582 | p_ramrod->length_hi = (u8)(params->length >> 32); |
---|
1533 | 1583 | p_ramrod->length_lo = DMA_LO_LE(params->length); |
---|
1534 | | - if (params->zbva) { |
---|
1535 | | - /* Lower 32 bits of the registered MR address. |
---|
1536 | | - * In case of zero based MR, will hold FBO |
---|
1537 | | - */ |
---|
1538 | | - p_ramrod->va.hi = 0; |
---|
1539 | | - p_ramrod->va.lo = cpu_to_le32(params->fbo); |
---|
1540 | | - } else { |
---|
1541 | | - DMA_REGPAIR_LE(p_ramrod->va, params->vaddr); |
---|
1542 | | - } |
---|
| 1584 | + DMA_REGPAIR_LE(p_ramrod->va, params->vaddr); |
---|
1543 | 1585 | DMA_REGPAIR_LE(p_ramrod->pbl_base, params->pbl_ptr); |
---|
1544 | 1586 | |
---|
1545 | 1587 | /* DIF */ |
---|
.. | .. |
---|
1652 | 1694 | |
---|
1653 | 1695 | static void *qed_rdma_get_rdma_ctx(struct qed_dev *cdev) |
---|
1654 | 1696 | { |
---|
1655 | | - return QED_LEADING_HWFN(cdev); |
---|
| 1697 | + return QED_AFFIN_HWFN(cdev); |
---|
| 1698 | +} |
---|
| 1699 | + |
---|
| 1700 | +static struct qed_bmap *qed_rdma_get_srq_bmap(struct qed_hwfn *p_hwfn, |
---|
| 1701 | + bool is_xrc) |
---|
| 1702 | +{ |
---|
| 1703 | + if (is_xrc) |
---|
| 1704 | + return &p_hwfn->p_rdma_info->xrc_srq_map; |
---|
| 1705 | + |
---|
| 1706 | + return &p_hwfn->p_rdma_info->srq_map; |
---|
1656 | 1707 | } |
---|
1657 | 1708 | |
---|
1658 | 1709 | static int qed_rdma_modify_srq(void *rdma_cxt, |
---|
.. | .. |
---|
1684 | 1735 | if (rc) |
---|
1685 | 1736 | return rc; |
---|
1686 | 1737 | |
---|
1687 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "modified SRQ id = %x", |
---|
1688 | | - in_params->srq_id); |
---|
| 1738 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "modified SRQ id = %x, is_xrc=%u\n", |
---|
| 1739 | + in_params->srq_id, in_params->is_xrc); |
---|
1689 | 1740 | |
---|
1690 | 1741 | return rc; |
---|
1691 | 1742 | } |
---|
.. | .. |
---|
1700 | 1751 | struct qed_spq_entry *p_ent; |
---|
1701 | 1752 | struct qed_bmap *bmap; |
---|
1702 | 1753 | u16 opaque_fid; |
---|
| 1754 | + u16 offset; |
---|
1703 | 1755 | int rc; |
---|
1704 | 1756 | |
---|
1705 | 1757 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
---|
.. | .. |
---|
1721 | 1773 | if (rc) |
---|
1722 | 1774 | return rc; |
---|
1723 | 1775 | |
---|
1724 | | - bmap = &p_hwfn->p_rdma_info->srq_map; |
---|
| 1776 | + bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc); |
---|
| 1777 | + offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset; |
---|
1725 | 1778 | |
---|
1726 | 1779 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
---|
1727 | | - qed_bmap_release_id(p_hwfn, bmap, in_params->srq_id); |
---|
| 1780 | + qed_bmap_release_id(p_hwfn, bmap, in_params->srq_id - offset); |
---|
1728 | 1781 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
---|
1729 | 1782 | |
---|
1730 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "SRQ destroyed Id = %x", |
---|
1731 | | - in_params->srq_id); |
---|
| 1783 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
| 1784 | + "XRC/SRQ destroyed Id = %x, is_xrc=%u\n", |
---|
| 1785 | + in_params->srq_id, in_params->is_xrc); |
---|
1732 | 1786 | |
---|
1733 | 1787 | return rc; |
---|
1734 | 1788 | } |
---|
.. | .. |
---|
1746 | 1800 | u16 opaque_fid, srq_id; |
---|
1747 | 1801 | struct qed_bmap *bmap; |
---|
1748 | 1802 | u32 returned_id; |
---|
| 1803 | + u16 offset; |
---|
1749 | 1804 | int rc; |
---|
1750 | 1805 | |
---|
1751 | | - bmap = &p_hwfn->p_rdma_info->srq_map; |
---|
| 1806 | + bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc); |
---|
1752 | 1807 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
---|
1753 | 1808 | rc = qed_rdma_bmap_alloc_id(p_hwfn, bmap, &returned_id); |
---|
1754 | 1809 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
---|
1755 | 1810 | |
---|
1756 | 1811 | if (rc) { |
---|
1757 | | - DP_NOTICE(p_hwfn, "failed to allocate srq id\n"); |
---|
| 1812 | + DP_NOTICE(p_hwfn, |
---|
| 1813 | + "failed to allocate xrc/srq id (is_xrc=%u)\n", |
---|
| 1814 | + in_params->is_xrc); |
---|
1758 | 1815 | return rc; |
---|
1759 | 1816 | } |
---|
1760 | 1817 | |
---|
1761 | | - elem_type = QED_ELEM_SRQ; |
---|
| 1818 | + elem_type = (in_params->is_xrc) ? (QED_ELEM_XRC_SRQ) : (QED_ELEM_SRQ); |
---|
1762 | 1819 | rc = qed_cxt_dynamic_ilt_alloc(p_hwfn, elem_type, returned_id); |
---|
1763 | 1820 | if (rc) |
---|
1764 | 1821 | goto err; |
---|
1765 | | - /* returned id is no greater than u16 */ |
---|
1766 | | - srq_id = (u16)returned_id; |
---|
| 1822 | + |
---|
1767 | 1823 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
---|
1768 | 1824 | |
---|
1769 | 1825 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
---|
.. | .. |
---|
1780 | 1836 | DMA_REGPAIR_LE(p_ramrod->pbl_base_addr, in_params->pbl_base_addr); |
---|
1781 | 1837 | p_ramrod->pages_in_srq_pbl = cpu_to_le16(in_params->num_pages); |
---|
1782 | 1838 | p_ramrod->pd_id = cpu_to_le16(in_params->pd_id); |
---|
1783 | | - p_ramrod->srq_id.srq_idx = cpu_to_le16(srq_id); |
---|
1784 | 1839 | p_ramrod->srq_id.opaque_fid = cpu_to_le16(opaque_fid); |
---|
1785 | 1840 | p_ramrod->page_size = cpu_to_le16(in_params->page_size); |
---|
1786 | 1841 | DMA_REGPAIR_LE(p_ramrod->producers_addr, in_params->prod_pair_addr); |
---|
| 1842 | + offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset; |
---|
| 1843 | + srq_id = (u16)returned_id + offset; |
---|
| 1844 | + p_ramrod->srq_id.srq_idx = cpu_to_le16(srq_id); |
---|
1787 | 1845 | |
---|
| 1846 | + if (in_params->is_xrc) { |
---|
| 1847 | + SET_FIELD(p_ramrod->flags, |
---|
| 1848 | + RDMA_SRQ_CREATE_RAMROD_DATA_XRC_FLAG, 1); |
---|
| 1849 | + SET_FIELD(p_ramrod->flags, |
---|
| 1850 | + RDMA_SRQ_CREATE_RAMROD_DATA_RESERVED_KEY_EN, |
---|
| 1851 | + in_params->reserved_key_en); |
---|
| 1852 | + p_ramrod->xrc_srq_cq_cid = |
---|
| 1853 | + cpu_to_le32((p_hwfn->hw_info.opaque_fid << 16) | |
---|
| 1854 | + in_params->cq_cid); |
---|
| 1855 | + p_ramrod->xrc_domain = cpu_to_le16(in_params->xrcd_id); |
---|
| 1856 | + } |
---|
1788 | 1857 | rc = qed_spq_post(p_hwfn, p_ent, NULL); |
---|
1789 | 1858 | if (rc) |
---|
1790 | 1859 | goto err; |
---|
1791 | 1860 | |
---|
1792 | 1861 | out_params->srq_id = srq_id; |
---|
1793 | 1862 | |
---|
1794 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
---|
1795 | | - "SRQ created Id = %x\n", out_params->srq_id); |
---|
1796 | | - |
---|
| 1863 | + DP_VERBOSE(p_hwfn, |
---|
| 1864 | + QED_MSG_RDMA, |
---|
| 1865 | + "XRC/SRQ created Id = %x (is_xrc=%u)\n", |
---|
| 1866 | + out_params->srq_id, in_params->is_xrc); |
---|
1797 | 1867 | return rc; |
---|
1798 | 1868 | |
---|
1799 | 1869 | err: |
---|
.. | .. |
---|
1880 | 1950 | static int qed_rdma_init(struct qed_dev *cdev, |
---|
1881 | 1951 | struct qed_rdma_start_in_params *params) |
---|
1882 | 1952 | { |
---|
1883 | | - return qed_rdma_start(QED_LEADING_HWFN(cdev), params); |
---|
| 1953 | + return qed_rdma_start(QED_AFFIN_HWFN(cdev), params); |
---|
1884 | 1954 | } |
---|
1885 | 1955 | |
---|
1886 | 1956 | static void qed_rdma_remove_user(void *rdma_cxt, u16 dpi) |
---|
.. | .. |
---|
1898 | 1968 | u8 *old_mac_address, |
---|
1899 | 1969 | u8 *new_mac_address) |
---|
1900 | 1970 | { |
---|
1901 | | - struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); |
---|
1902 | | - struct qed_ptt *p_ptt; |
---|
1903 | 1971 | int rc = 0; |
---|
1904 | 1972 | |
---|
1905 | | - p_ptt = qed_ptt_acquire(p_hwfn); |
---|
1906 | | - if (!p_ptt) { |
---|
1907 | | - DP_ERR(cdev, |
---|
1908 | | - "qed roce ll2 mac filter set: failed to acquire PTT\n"); |
---|
1909 | | - return -EINVAL; |
---|
1910 | | - } |
---|
1911 | | - |
---|
1912 | 1973 | if (old_mac_address) |
---|
1913 | | - qed_llh_remove_mac_filter(p_hwfn, p_ptt, old_mac_address); |
---|
| 1974 | + qed_llh_remove_mac_filter(cdev, 0, old_mac_address); |
---|
1914 | 1975 | if (new_mac_address) |
---|
1915 | | - rc = qed_llh_add_mac_filter(p_hwfn, p_ptt, new_mac_address); |
---|
1916 | | - |
---|
1917 | | - qed_ptt_release(p_hwfn, p_ptt); |
---|
| 1976 | + rc = qed_llh_add_mac_filter(cdev, 0, new_mac_address); |
---|
1918 | 1977 | |
---|
1919 | 1978 | if (rc) |
---|
1920 | 1979 | DP_ERR(cdev, |
---|
1921 | 1980 | "qed roce ll2 mac filter set: failed to add MAC filter\n"); |
---|
1922 | 1981 | |
---|
1923 | 1982 | return rc; |
---|
| 1983 | +} |
---|
| 1984 | + |
---|
| 1985 | +static int qed_iwarp_set_engine_affin(struct qed_dev *cdev, bool b_reset) |
---|
| 1986 | +{ |
---|
| 1987 | + enum qed_eng eng; |
---|
| 1988 | + u8 ppfid = 0; |
---|
| 1989 | + int rc; |
---|
| 1990 | + |
---|
| 1991 | + /* Make sure iwarp cmt mode is enabled before setting affinity */ |
---|
| 1992 | + if (!cdev->iwarp_cmt) |
---|
| 1993 | + return -EINVAL; |
---|
| 1994 | + |
---|
| 1995 | + if (b_reset) |
---|
| 1996 | + eng = QED_BOTH_ENG; |
---|
| 1997 | + else |
---|
| 1998 | + eng = cdev->l2_affin_hint ? QED_ENG1 : QED_ENG0; |
---|
| 1999 | + |
---|
| 2000 | + rc = qed_llh_set_ppfid_affinity(cdev, ppfid, eng); |
---|
| 2001 | + if (rc) { |
---|
| 2002 | + DP_NOTICE(cdev, |
---|
| 2003 | + "Failed to set the engine affinity of ppfid %d\n", |
---|
| 2004 | + ppfid); |
---|
| 2005 | + return rc; |
---|
| 2006 | + } |
---|
| 2007 | + |
---|
| 2008 | + DP_VERBOSE(cdev, (QED_MSG_RDMA | QED_MSG_SP), |
---|
| 2009 | + "LLH: Set the engine affinity of non-RoCE packets as %d\n", |
---|
| 2010 | + eng); |
---|
| 2011 | + |
---|
| 2012 | + return 0; |
---|
1924 | 2013 | } |
---|
1925 | 2014 | |
---|
1926 | 2015 | static const struct qed_rdma_ops qed_rdma_ops_pass = { |
---|
.. | .. |
---|
1940 | 2029 | .rdma_cnq_prod_update = &qed_rdma_cnq_prod_update, |
---|
1941 | 2030 | .rdma_alloc_pd = &qed_rdma_alloc_pd, |
---|
1942 | 2031 | .rdma_dealloc_pd = &qed_rdma_free_pd, |
---|
| 2032 | + .rdma_alloc_xrcd = &qed_rdma_alloc_xrcd, |
---|
| 2033 | + .rdma_dealloc_xrcd = &qed_rdma_free_xrcd, |
---|
1943 | 2034 | .rdma_create_cq = &qed_rdma_create_cq, |
---|
1944 | 2035 | .rdma_destroy_cq = &qed_rdma_destroy_cq, |
---|
1945 | 2036 | .rdma_create_qp = &qed_rdma_create_qp, |
---|
.. | .. |
---|
1962 | 2053 | .ll2_set_fragment_of_tx_packet = &qed_ll2_set_fragment_of_tx_packet, |
---|
1963 | 2054 | .ll2_set_mac_filter = &qed_roce_ll2_set_mac_filter, |
---|
1964 | 2055 | .ll2_get_stats = &qed_ll2_get_stats, |
---|
| 2056 | + .iwarp_set_engine_affin = &qed_iwarp_set_engine_affin, |
---|
1965 | 2057 | .iwarp_connect = &qed_iwarp_connect, |
---|
1966 | 2058 | .iwarp_create_listen = &qed_iwarp_create_listen, |
---|
1967 | 2059 | .iwarp_destroy_listen = &qed_iwarp_destroy_listen, |
---|