Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull rdma updates from Jason Gunthorpe:
"Usual wide collection of unrelated items in drivers:

- Driver bug fixes and treewide cleanups in hfi1, siw, qib, mlx5,
rxe, usnic, usnic, bnxt_re, ocrdma, iser:
- remove unnecessary NULL checks
- kmap obsolescence
- pci_enable_pcie_error_reporting() obsolescence
- unused variables and macros
- trace event related warnings
- casting warnings

- Code cleanups for irdm and erdma

- EFA reporting of 128 byte PCIe TLP support

- mlx5 more agressively uses the out of order HW feature

- Big rework of how state machines and tasks work in rxe

- Fix a syzkaller found crash netdev refcount leak in siw

- bnxt_re revises their HW description header

- Congestion control for bnxt_re

- Use mmu_notifiers more safely in hfi1

- mlx5 gets better support for PCIe relaxed ordering inside VMs"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (81 commits)
RDMA/efa: Add rdma write capability to device caps
RDMA/mlx5: Use correct device num_ports when modify DC
RDMA/irdma: Drop spurious WQ_UNBOUND from alloc_ordered_workqueue() call
RDMA/rxe: Fix spinlock recursion deadlock on requester
RDMA/mlx5: Fix flow counter query via DEVX
RDMA/rxe: Protect QP state with qp->state_lock
RDMA/rxe: Move code to check if drained to subroutine
RDMA/rxe: Remove qp->req.state
RDMA/rxe: Remove qp->comp.state
RDMA/rxe: Remove qp->resp.state
RDMA/mlx5: Allow relaxed ordering read in VFs and VMs
net/mlx5: Update relaxed ordering read HCA capabilities
RDMA/mlx5: Check pcie_relaxed_ordering_enabled() in UMR
RDMA/mlx5: Remove pcie_relaxed_ordering_enabled() check for RO write
RDMA: Add ib_virt_dma_to_page()
RDMA/rxe: Fix the error "trying to register non-static key in rxe_cleanup_task"
RDMA/irdma: Slightly optimize irdma_form_ah_cm_frame()
RDMA/rxe: Fix incorrect TASKLET_STATE_SCHED check in rxe_task.c
IB/hfi1: Place struct mmu_rb_handler on cache line start
IB/hfi1: Fix bugs with non-PAGE_SIZE-end multi-iovec user SDMA requests
...

+7896 -5408
+2 -1
drivers/infiniband/core/cm.c
··· 2912 2912 (ari && ari_length > IB_CM_REJ_ARI_LENGTH)) 2913 2913 return -EINVAL; 2914 2914 2915 + trace_icm_send_rej(&cm_id_priv->id, reason); 2916 + 2915 2917 switch (state) { 2916 2918 case IB_CM_REQ_SENT: 2917 2919 case IB_CM_MRA_REQ_RCVD: ··· 2944 2942 return -EINVAL; 2945 2943 } 2946 2944 2947 - trace_icm_send_rej(&cm_id_priv->id, reason); 2948 2945 ret = ib_post_send_mad(msg, NULL); 2949 2946 if (ret) { 2950 2947 cm_free_msg(msg);
+2 -4
drivers/infiniband/core/cma.c
··· 709 709 } 710 710 711 711 sgid_attr = rdma_find_gid_by_port(device, gid, gid_type, port, ndev); 712 - if (ndev) 713 - dev_put(ndev); 712 + dev_put(ndev); 714 713 return sgid_attr; 715 714 } 716 715 ··· 2428 2429 mutex_unlock(&listen_id->handler_mutex); 2429 2430 2430 2431 net_dev_put: 2431 - if (net_dev) 2432 - dev_put(net_dev); 2432 + dev_put(net_dev); 2433 2433 2434 2434 return ret; 2435 2435 }
+14 -9
drivers/infiniband/core/user_mad.c
··· 131 131 struct ib_user_mad mad; 132 132 }; 133 133 134 + struct ib_rmpp_mad_hdr { 135 + struct ib_mad_hdr mad_hdr; 136 + struct ib_rmpp_hdr rmpp_hdr; 137 + } __packed; 138 + 134 139 #define CREATE_TRACE_POINTS 135 140 #include <trace/events/ib_umad.h> 136 141 ··· 499 494 size_t count, loff_t *pos) 500 495 { 501 496 struct ib_umad_file *file = filp->private_data; 497 + struct ib_rmpp_mad_hdr *rmpp_mad_hdr; 502 498 struct ib_umad_packet *packet; 503 499 struct ib_mad_agent *agent; 504 500 struct rdma_ah_attr ah_attr; 505 501 struct ib_ah *ah; 506 - struct ib_rmpp_mad *rmpp_mad; 507 502 __be64 *tid; 508 503 int ret, data_len, hdr_len, copy_offset, rmpp_active; 509 504 u8 base_version; ··· 511 506 if (count < hdr_size(file) + IB_MGMT_RMPP_HDR) 512 507 return -EINVAL; 513 508 514 - packet = kzalloc(sizeof *packet + IB_MGMT_RMPP_HDR, GFP_KERNEL); 509 + packet = kzalloc(sizeof(*packet) + IB_MGMT_RMPP_HDR, GFP_KERNEL); 515 510 if (!packet) 516 511 return -ENOMEM; 517 512 ··· 565 560 goto err_up; 566 561 } 567 562 568 - rmpp_mad = (struct ib_rmpp_mad *) packet->mad.data; 569 - hdr_len = ib_get_mad_data_offset(rmpp_mad->mad_hdr.mgmt_class); 563 + rmpp_mad_hdr = (struct ib_rmpp_mad_hdr *)packet->mad.data; 564 + hdr_len = ib_get_mad_data_offset(rmpp_mad_hdr->mad_hdr.mgmt_class); 570 565 571 - if (ib_is_mad_class_rmpp(rmpp_mad->mad_hdr.mgmt_class) 566 + if (ib_is_mad_class_rmpp(rmpp_mad_hdr->mad_hdr.mgmt_class) 572 567 && ib_mad_kernel_rmpp_agent(agent)) { 573 568 copy_offset = IB_MGMT_RMPP_HDR; 574 - rmpp_active = ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) & 569 + rmpp_active = ib_get_rmpp_flags(&rmpp_mad_hdr->rmpp_hdr) & 575 570 IB_MGMT_RMPP_FLAG_ACTIVE; 576 571 } else { 577 572 copy_offset = IB_MGMT_MAD_HDR; ··· 620 615 tid = &((struct ib_mad_hdr *) packet->msg->mad)->tid; 621 616 *tid = cpu_to_be64(((u64) agent->hi_tid) << 32 | 622 617 (be64_to_cpup(tid) & 0xffffffff)); 623 - rmpp_mad->mad_hdr.tid = *tid; 618 + rmpp_mad_hdr->mad_hdr.tid = *tid; 624 619 } 625 620 626 621 if (!ib_mad_kernel_rmpp_agent(agent) 627 - && ib_is_mad_class_rmpp(rmpp_mad->mad_hdr.mgmt_class) 628 - && (ib_get_rmpp_flags(&rmpp_mad->rmpp_hdr) & IB_MGMT_RMPP_FLAG_ACTIVE)) { 622 + && ib_is_mad_class_rmpp(rmpp_mad_hdr->mad_hdr.mgmt_class) 623 + && (ib_get_rmpp_flags(&rmpp_mad_hdr->rmpp_hdr) & IB_MGMT_RMPP_FLAG_ACTIVE)) { 629 624 spin_lock_irq(&file->send_lock); 630 625 list_add_tail(&packet->list, &file->send_list); 631 626 spin_unlock_irq(&file->send_lock);
+109
drivers/infiniband/hw/bnxt_re/ib_verbs.c
··· 2912 2912 return rc; 2913 2913 } 2914 2914 2915 + static void bnxt_re_resize_cq_complete(struct bnxt_re_cq *cq) 2916 + { 2917 + struct bnxt_re_dev *rdev = cq->rdev; 2918 + 2919 + bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq); 2920 + 2921 + cq->qplib_cq.max_wqe = cq->resize_cqe; 2922 + if (cq->resize_umem) { 2923 + ib_umem_release(cq->umem); 2924 + cq->umem = cq->resize_umem; 2925 + cq->resize_umem = NULL; 2926 + cq->resize_cqe = 0; 2927 + } 2928 + } 2929 + 2930 + int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata) 2931 + { 2932 + struct bnxt_qplib_sg_info sg_info = {}; 2933 + struct bnxt_qplib_dpi *orig_dpi = NULL; 2934 + struct bnxt_qplib_dev_attr *dev_attr; 2935 + struct bnxt_re_ucontext *uctx = NULL; 2936 + struct bnxt_re_resize_cq_req req; 2937 + struct bnxt_re_dev *rdev; 2938 + struct bnxt_re_cq *cq; 2939 + int rc, entries; 2940 + 2941 + cq = container_of(ibcq, struct bnxt_re_cq, ib_cq); 2942 + rdev = cq->rdev; 2943 + dev_attr = &rdev->dev_attr; 2944 + if (!ibcq->uobject) { 2945 + ibdev_err(&rdev->ibdev, "Kernel CQ Resize not supported"); 2946 + return -EOPNOTSUPP; 2947 + } 2948 + 2949 + if (cq->resize_umem) { 2950 + ibdev_err(&rdev->ibdev, "Resize CQ %#x failed - Busy", 2951 + cq->qplib_cq.id); 2952 + return -EBUSY; 2953 + } 2954 + 2955 + /* Check the requested cq depth out of supported depth */ 2956 + if (cqe < 1 || cqe > dev_attr->max_cq_wqes) { 2957 + ibdev_err(&rdev->ibdev, "Resize CQ %#x failed - out of range cqe %d", 2958 + cq->qplib_cq.id, cqe); 2959 + return -EINVAL; 2960 + } 2961 + 2962 + entries = roundup_pow_of_two(cqe + 1); 2963 + if (entries > dev_attr->max_cq_wqes + 1) 2964 + entries = dev_attr->max_cq_wqes + 1; 2965 + 2966 + uctx = rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, 2967 + ib_uctx); 2968 + /* uverbs consumer */ 2969 + if (ib_copy_from_udata(&req, udata, sizeof(req))) { 2970 + rc = -EFAULT; 2971 + goto fail; 2972 + } 2973 + 2974 + cq->resize_umem = ib_umem_get(&rdev->ibdev, req.cq_va, 2975 + entries * sizeof(struct cq_base), 2976 + IB_ACCESS_LOCAL_WRITE); 2977 + if (IS_ERR(cq->resize_umem)) { 2978 + rc = PTR_ERR(cq->resize_umem); 2979 + cq->resize_umem = NULL; 2980 + ibdev_err(&rdev->ibdev, "%s: ib_umem_get failed! rc = %d\n", 2981 + __func__, rc); 2982 + goto fail; 2983 + } 2984 + cq->resize_cqe = entries; 2985 + memcpy(&sg_info, &cq->qplib_cq.sg_info, sizeof(sg_info)); 2986 + orig_dpi = cq->qplib_cq.dpi; 2987 + 2988 + cq->qplib_cq.sg_info.umem = cq->resize_umem; 2989 + cq->qplib_cq.sg_info.pgsize = PAGE_SIZE; 2990 + cq->qplib_cq.sg_info.pgshft = PAGE_SHIFT; 2991 + cq->qplib_cq.dpi = &uctx->dpi; 2992 + 2993 + rc = bnxt_qplib_resize_cq(&rdev->qplib_res, &cq->qplib_cq, entries); 2994 + if (rc) { 2995 + ibdev_err(&rdev->ibdev, "Resize HW CQ %#x failed!", 2996 + cq->qplib_cq.id); 2997 + goto fail; 2998 + } 2999 + 3000 + cq->ib_cq.cqe = cq->resize_cqe; 3001 + 3002 + return 0; 3003 + 3004 + fail: 3005 + if (cq->resize_umem) { 3006 + ib_umem_release(cq->resize_umem); 3007 + cq->resize_umem = NULL; 3008 + cq->resize_cqe = 0; 3009 + memcpy(&cq->qplib_cq.sg_info, &sg_info, sizeof(sg_info)); 3010 + cq->qplib_cq.dpi = orig_dpi; 3011 + } 3012 + return rc; 3013 + } 3014 + 2915 3015 static u8 __req_to_ib_wc_status(u8 qstatus) 2916 3016 { 2917 3017 switch (qstatus) { ··· 3524 3424 u32 tbl_idx; 3525 3425 struct bnxt_re_sqp_entries *sqp_entry = NULL; 3526 3426 unsigned long flags; 3427 + 3428 + /* User CQ; the only processing we do is to 3429 + * complete any pending CQ resize operation. 3430 + */ 3431 + if (cq->umem) { 3432 + if (cq->resize_umem) 3433 + bnxt_re_resize_cq_complete(cq); 3434 + return 0; 3435 + } 3527 3436 3528 3437 spin_lock_irqsave(&cq->cq_lock, flags); 3529 3438 budget = min_t(u32, num_entries, cq->max_cql);
+3
drivers/infiniband/hw/bnxt_re/ib_verbs.h
··· 104 104 #define MAX_CQL_PER_POLL 1024 105 105 u32 max_cql; 106 106 struct ib_umem *umem; 107 + struct ib_umem *resize_umem; 108 + int resize_cqe; 107 109 }; 108 110 109 111 struct bnxt_re_mr { ··· 193 191 const struct ib_recv_wr **bad_recv_wr); 194 192 int bnxt_re_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 195 193 struct ib_udata *udata); 194 + int bnxt_re_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); 196 195 int bnxt_re_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); 197 196 int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc); 198 197 int bnxt_re_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
+25 -78
drivers/infiniband/hw/bnxt_re/main.c
··· 553 553 .query_srq = bnxt_re_query_srq, 554 554 .reg_user_mr = bnxt_re_reg_user_mr, 555 555 .req_notify_cq = bnxt_re_req_notify_cq, 556 + .resize_cq = bnxt_re_resize_cq, 556 557 INIT_RDMA_OBJ_SIZE(ib_ah, bnxt_re_ah, ib_ah), 557 558 INIT_RDMA_OBJ_SIZE(ib_cq, bnxt_re_cq, ib_cq), 558 559 INIT_RDMA_OBJ_SIZE(ib_pd, bnxt_re_pd, ib_pd), ··· 585 584 return ret; 586 585 587 586 dma_set_max_seg_size(&rdev->en_dev->pdev->dev, UINT_MAX); 587 + ibdev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_POLL_CQ); 588 588 return ib_register_device(ibdev, "bnxt_re%d", &rdev->en_dev->pdev->dev); 589 589 } 590 590 ··· 921 919 } 922 920 } 923 921 924 - #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_IVLAN 0x02 925 - static int bnxt_re_query_hwrm_pri2cos(struct bnxt_re_dev *rdev, u8 dir, 926 - u64 *cid_map) 927 - { 928 - struct hwrm_queue_pri2cos_qcfg_input req = {0}; 929 - struct hwrm_queue_pri2cos_qcfg_output resp; 930 - struct bnxt_en_dev *en_dev = rdev->en_dev; 931 - struct bnxt_fw_msg fw_msg; 932 - u32 flags = 0; 933 - u8 *qcfgmap, *tmp_map; 934 - int rc = 0, i; 935 - 936 - if (!cid_map) 937 - return -EINVAL; 938 - 939 - memset(&fw_msg, 0, sizeof(fw_msg)); 940 - bnxt_re_init_hwrm_hdr(rdev, (void *)&req, 941 - HWRM_QUEUE_PRI2COS_QCFG, -1, -1); 942 - flags |= (dir & 0x01); 943 - flags |= HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_IVLAN; 944 - req.flags = cpu_to_le32(flags); 945 - req.port_id = en_dev->pf_port_id; 946 - 947 - bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp, 948 - sizeof(resp), DFLT_HWRM_CMD_TIMEOUT); 949 - rc = bnxt_send_msg(en_dev, &fw_msg); 950 - if (rc) 951 - return rc; 952 - 953 - if (resp.queue_cfg_info) { 954 - ibdev_warn(&rdev->ibdev, 955 - "Asymmetric cos queue configuration detected"); 956 - ibdev_warn(&rdev->ibdev, 957 - " on device, QoS may not be fully functional\n"); 958 - } 959 - qcfgmap = &resp.pri0_cos_queue_id; 960 - tmp_map = (u8 *)cid_map; 961 - for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) 962 - tmp_map[i] = qcfgmap[i]; 963 - 964 - return rc; 965 - } 966 - 967 922 static bool bnxt_re_is_qp1_or_shadow_qp(struct bnxt_re_dev *rdev, 968 923 struct bnxt_re_qp *qp) 969 924 { ··· 1013 1054 return prio_map; 1014 1055 } 1015 1056 1016 - static void bnxt_re_parse_cid_map(u8 prio_map, u8 *cid_map, u16 *cosq) 1017 - { 1018 - u16 prio; 1019 - u8 id; 1020 - 1021 - for (prio = 0, id = 0; prio < 8; prio++) { 1022 - if (prio_map & (1 << prio)) { 1023 - cosq[id] = cid_map[prio]; 1024 - id++; 1025 - if (id == 2) /* Max 2 tcs supported */ 1026 - break; 1027 - } 1028 - } 1029 - } 1030 - 1031 1057 static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev) 1032 1058 { 1033 1059 u8 prio_map = 0; 1034 - u64 cid_map; 1035 - int rc; 1036 1060 1037 1061 /* Get priority for roce */ 1038 1062 prio_map = bnxt_re_get_priority_mask(rdev); ··· 1023 1081 if (prio_map == rdev->cur_prio_map) 1024 1082 return 0; 1025 1083 rdev->cur_prio_map = prio_map; 1026 - /* Get cosq id for this priority */ 1027 - rc = bnxt_re_query_hwrm_pri2cos(rdev, 0, &cid_map); 1028 - if (rc) { 1029 - ibdev_warn(&rdev->ibdev, "no cos for p_mask %x\n", prio_map); 1030 - return rc; 1031 - } 1032 - /* Parse CoS IDs for app priority */ 1033 - bnxt_re_parse_cid_map(prio_map, (u8 *)&cid_map, rdev->cosq); 1034 - 1035 - /* Config BONO. */ 1036 - rc = bnxt_qplib_map_tc2cos(&rdev->qplib_res, rdev->cosq); 1037 - if (rc) { 1038 - ibdev_warn(&rdev->ibdev, "no tc for cos{%x, %x}\n", 1039 - rdev->cosq[0], rdev->cosq[1]); 1040 - return rc; 1041 - } 1042 - 1043 1084 /* Actual priorities are not programmed as they are already 1044 1085 * done by L2 driver; just enable or disable priority vlan tagging 1045 1086 */ ··· 1332 1407 return rc; 1333 1408 } 1334 1409 1410 + static void bnxt_re_setup_cc(struct bnxt_re_dev *rdev, bool enable) 1411 + { 1412 + struct bnxt_qplib_cc_param cc_param = {}; 1413 + 1414 + /* Currently enabling only for GenP5 adapters */ 1415 + if (!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) 1416 + return; 1417 + 1418 + if (enable) { 1419 + cc_param.enable = 1; 1420 + cc_param.cc_mode = CMDQ_MODIFY_ROCE_CC_CC_MODE_PROBABILISTIC_CC_MODE; 1421 + } 1422 + 1423 + cc_param.mask = (CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE | 1424 + CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ENABLE_CC | 1425 + CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_ECN); 1426 + 1427 + if (bnxt_qplib_modify_cc(&rdev->qplib_res, &cc_param)) 1428 + ibdev_err(&rdev->ibdev, "Failed to setup CC enable = %d\n", enable); 1429 + } 1430 + 1335 1431 /* 1336 1432 * "Notifier chain callback can be invoked for the same chain from 1337 1433 * different CPUs at the same time". ··· 1421 1475 */ 1422 1476 goto skip_remove; 1423 1477 } 1424 - 1478 + bnxt_re_setup_cc(rdev, false); 1425 1479 ib_unregister_device(&rdev->ibdev); 1426 1480 ib_dealloc_device(&rdev->ibdev); 1427 1481 bnxt_re_dev_uninit(rdev); ··· 1453 1507 goto err; 1454 1508 } 1455 1509 1510 + bnxt_re_setup_cc(rdev, true); 1456 1511 mutex_unlock(&bnxt_re_mutex); 1457 1512 return 0; 1458 1513
+138 -73
drivers/infiniband/hw/bnxt_re/qplib_fp.c
··· 300 300 { 301 301 struct bnxt_qplib_nq *nq = from_tasklet(nq, t, nq_tasklet); 302 302 struct bnxt_qplib_hwq *hwq = &nq->hwq; 303 - int num_srqne_processed = 0; 304 - int num_cqne_processed = 0; 305 303 struct bnxt_qplib_cq *cq; 306 304 int budget = nq->budget; 307 305 u32 sw_cons, raw_cons; ··· 338 340 DBC_DBC_TYPE_CQ_ARMENA); 339 341 spin_lock_bh(&cq->compl_lock); 340 342 atomic_set(&cq->arm_state, 0); 341 - if (!nq->cqn_handler(nq, (cq))) 342 - num_cqne_processed++; 343 - else 343 + if (nq->cqn_handler(nq, (cq))) 344 344 dev_warn(&nq->pdev->dev, 345 345 "cqn - type 0x%x not handled\n", type); 346 346 cq->cnq_events++; ··· 357 361 srq = (struct bnxt_qplib_srq *)q_handle; 358 362 bnxt_qplib_armen_db(&srq->dbinfo, 359 363 DBC_DBC_TYPE_SRQ_ARMENA); 360 - if (!nq->srqn_handler(nq, 361 - (struct bnxt_qplib_srq *)q_handle, 362 - nqsrqe->event)) 363 - num_srqne_processed++; 364 - else 364 + if (nq->srqn_handler(nq, 365 + (struct bnxt_qplib_srq *)q_handle, 366 + nqsrqe->event)) 365 367 dev_warn(&nq->pdev->dev, 366 368 "SRQ event 0x%x not handled\n", 367 369 nqsrqe->event); ··· 575 581 struct bnxt_qplib_srq *srq) 576 582 { 577 583 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 578 - struct cmdq_destroy_srq req; 579 - struct creq_destroy_srq_resp resp; 580 - u16 cmd_flags = 0; 584 + struct creq_destroy_srq_resp resp = {}; 585 + struct bnxt_qplib_cmdqmsg msg = {}; 586 + struct cmdq_destroy_srq req = {}; 581 587 int rc; 582 588 583 - RCFW_CMD_PREP(req, DESTROY_SRQ, cmd_flags); 589 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 590 + CMDQ_BASE_OPCODE_DESTROY_SRQ, 591 + sizeof(req)); 584 592 585 593 /* Configure the request */ 586 594 req.srq_cid = cpu_to_le32(srq->id); 587 595 588 - rc = bnxt_qplib_rcfw_send_message(rcfw, (struct cmdq_base *)&req, 589 - (struct creq_base *)&resp, NULL, 0); 596 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 597 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 590 598 kfree(srq->swq); 591 599 if (rc) 592 600 return; ··· 600 604 { 601 605 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 602 606 struct bnxt_qplib_hwq_attr hwq_attr = {}; 603 - struct creq_create_srq_resp resp; 604 - struct cmdq_create_srq req; 607 + struct creq_create_srq_resp resp = {}; 608 + struct bnxt_qplib_cmdqmsg msg = {}; 609 + struct cmdq_create_srq req = {}; 605 610 struct bnxt_qplib_pbl *pbl; 606 - u16 cmd_flags = 0; 607 611 u16 pg_sz_lvl; 608 612 int rc, idx; 609 613 ··· 623 627 goto fail; 624 628 } 625 629 626 - RCFW_CMD_PREP(req, CREATE_SRQ, cmd_flags); 630 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 631 + CMDQ_BASE_OPCODE_CREATE_SRQ, 632 + sizeof(req)); 627 633 628 634 /* Configure the request */ 629 635 req.dpi = cpu_to_le32(srq->dpi->dpi); ··· 642 644 req.pd_id = cpu_to_le32(srq->pd->id); 643 645 req.eventq_id = cpu_to_le16(srq->eventq_hw_ring_id); 644 646 645 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 646 - (void *)&resp, NULL, 0); 647 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 648 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 647 649 if (rc) 648 650 goto fail; 649 651 ··· 698 700 struct bnxt_qplib_srq *srq) 699 701 { 700 702 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 701 - struct cmdq_query_srq req; 702 - struct creq_query_srq_resp resp; 703 + struct creq_query_srq_resp resp = {}; 704 + struct bnxt_qplib_cmdqmsg msg = {}; 703 705 struct bnxt_qplib_rcfw_sbuf *sbuf; 704 706 struct creq_query_srq_resp_sb *sb; 705 - u16 cmd_flags = 0; 707 + struct cmdq_query_srq req = {}; 706 708 int rc = 0; 707 709 708 - RCFW_CMD_PREP(req, QUERY_SRQ, cmd_flags); 710 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 711 + CMDQ_BASE_OPCODE_QUERY_SRQ, 712 + sizeof(req)); 709 713 710 714 /* Configure the request */ 711 715 sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); ··· 716 716 req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 717 717 req.srq_cid = cpu_to_le32(srq->id); 718 718 sb = sbuf->sb; 719 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 720 - (void *)sbuf, 0); 719 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 720 + sizeof(resp), 0); 721 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 721 722 srq->threshold = le16_to_cpu(sb->srq_limit); 722 723 bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 723 724 ··· 812 811 { 813 812 struct bnxt_qplib_hwq_attr hwq_attr = {}; 814 813 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 814 + struct creq_create_qp1_resp resp = {}; 815 + struct bnxt_qplib_cmdqmsg msg = {}; 815 816 struct bnxt_qplib_q *sq = &qp->sq; 816 817 struct bnxt_qplib_q *rq = &qp->rq; 817 - struct creq_create_qp1_resp resp; 818 - struct cmdq_create_qp1 req; 818 + struct cmdq_create_qp1 req = {}; 819 819 struct bnxt_qplib_pbl *pbl; 820 - u16 cmd_flags = 0; 821 820 u32 qp_flags = 0; 822 821 u8 pg_sz_lvl; 823 822 u32 tbl_indx; 824 823 int rc; 825 824 826 - RCFW_CMD_PREP(req, CREATE_QP1, cmd_flags); 827 - 825 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 826 + CMDQ_BASE_OPCODE_CREATE_QP1, 827 + sizeof(req)); 828 828 /* General */ 829 829 req.type = qp->type; 830 830 req.dpi = cpu_to_le32(qp->dpi->dpi); ··· 893 891 req.qp_flags = cpu_to_le32(qp_flags); 894 892 req.pd_id = cpu_to_le32(qp->pd->id); 895 893 896 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 897 - (void *)&resp, NULL, 0); 894 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 895 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 898 896 if (rc) 899 897 goto fail; 900 898 ··· 954 952 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 955 953 struct bnxt_qplib_hwq_attr hwq_attr = {}; 956 954 struct bnxt_qplib_sg_info sginfo = {}; 955 + struct creq_create_qp_resp resp = {}; 956 + struct bnxt_qplib_cmdqmsg msg = {}; 957 957 struct bnxt_qplib_q *sq = &qp->sq; 958 958 struct bnxt_qplib_q *rq = &qp->rq; 959 - struct creq_create_qp_resp resp; 959 + struct cmdq_create_qp req = {}; 960 960 int rc, req_size, psn_sz = 0; 961 961 struct bnxt_qplib_hwq *xrrq; 962 962 struct bnxt_qplib_pbl *pbl; 963 - struct cmdq_create_qp req; 964 - u16 cmd_flags = 0; 965 963 u32 qp_flags = 0; 966 964 u8 pg_sz_lvl; 967 965 u32 tbl_indx; 968 966 u16 nsge; 969 967 970 - RCFW_CMD_PREP(req, CREATE_QP, cmd_flags); 968 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 969 + CMDQ_BASE_OPCODE_CREATE_QP, 970 + sizeof(req)); 971 971 972 972 /* General */ 973 973 req.type = qp->type; ··· 1102 1098 } 1103 1099 req.pd_id = cpu_to_le32(qp->pd->id); 1104 1100 1105 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 1106 - (void *)&resp, NULL, 0); 1101 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 1102 + sizeof(resp), 0); 1103 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 1107 1104 if (rc) 1108 1105 goto fail; 1109 1106 ··· 1236 1231 int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) 1237 1232 { 1238 1233 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 1239 - struct cmdq_modify_qp req; 1240 - struct creq_modify_qp_resp resp; 1241 - u16 cmd_flags = 0; 1234 + struct creq_modify_qp_resp resp = {}; 1235 + struct bnxt_qplib_cmdqmsg msg = {}; 1236 + struct cmdq_modify_qp req = {}; 1242 1237 u32 temp32[4]; 1243 1238 u32 bmask; 1244 1239 int rc; 1245 1240 1246 - RCFW_CMD_PREP(req, MODIFY_QP, cmd_flags); 1241 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 1242 + CMDQ_BASE_OPCODE_MODIFY_QP, 1243 + sizeof(req)); 1247 1244 1248 1245 /* Filter out the qp_attr_mask based on the state->new transition */ 1249 1246 __filter_modify_flags(qp); ··· 1293 1286 memcpy(req.dest_mac, qp->ah.dmac, 6); 1294 1287 1295 1288 if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU) 1296 - req.path_mtu = qp->path_mtu; 1289 + req.path_mtu_pingpong_push_enable |= qp->path_mtu; 1297 1290 1298 1291 if (bmask & CMDQ_MODIFY_QP_MODIFY_MASK_TIMEOUT) 1299 1292 req.timeout = qp->timeout; ··· 1331 1324 1332 1325 req.vlan_pcp_vlan_dei_vlan_id = cpu_to_le16(qp->vlan_id); 1333 1326 1334 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 1335 - (void *)&resp, NULL, 0); 1327 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 1328 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 1336 1329 if (rc) 1337 1330 return rc; 1338 1331 qp->cur_qp_state = qp->state; ··· 1342 1335 int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) 1343 1336 { 1344 1337 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 1345 - struct cmdq_query_qp req; 1346 - struct creq_query_qp_resp resp; 1338 + struct creq_query_qp_resp resp = {}; 1339 + struct bnxt_qplib_cmdqmsg msg = {}; 1347 1340 struct bnxt_qplib_rcfw_sbuf *sbuf; 1348 1341 struct creq_query_qp_resp_sb *sb; 1349 - u16 cmd_flags = 0; 1342 + struct cmdq_query_qp req = {}; 1350 1343 u32 temp32[4]; 1351 1344 int i, rc = 0; 1352 1345 1353 - RCFW_CMD_PREP(req, QUERY_QP, cmd_flags); 1346 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 1347 + CMDQ_BASE_OPCODE_QUERY_QP, 1348 + sizeof(req)); 1354 1349 1355 1350 sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 1356 1351 if (!sbuf) ··· 1361 1352 1362 1353 req.qp_cid = cpu_to_le32(qp->id); 1363 1354 req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 1364 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 1365 - (void *)sbuf, 0); 1355 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 1356 + sizeof(resp), 0); 1357 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 1366 1358 if (rc) 1367 1359 goto bail; 1368 1360 /* Extract the context from the side buffer */ ··· 1470 1460 struct bnxt_qplib_qp *qp) 1471 1461 { 1472 1462 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 1473 - struct cmdq_destroy_qp req; 1474 - struct creq_destroy_qp_resp resp; 1475 - u16 cmd_flags = 0; 1463 + struct creq_destroy_qp_resp resp = {}; 1464 + struct bnxt_qplib_cmdqmsg msg = {}; 1465 + struct cmdq_destroy_qp req = {}; 1476 1466 u32 tbl_indx; 1477 1467 int rc; 1478 1468 ··· 1480 1470 rcfw->qp_tbl[tbl_indx].qp_id = BNXT_QPLIB_QP_ID_INVALID; 1481 1471 rcfw->qp_tbl[tbl_indx].qp_handle = NULL; 1482 1472 1483 - RCFW_CMD_PREP(req, DESTROY_QP, cmd_flags); 1473 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 1474 + CMDQ_BASE_OPCODE_DESTROY_QP, 1475 + sizeof(req)); 1484 1476 1485 1477 req.qp_cid = cpu_to_le32(qp->id); 1486 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 1487 - (void *)&resp, NULL, 0); 1478 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 1479 + sizeof(resp), 0); 1480 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 1488 1481 if (rc) { 1489 1482 rcfw->qp_tbl[tbl_indx].qp_id = qp->id; 1490 1483 rcfw->qp_tbl[tbl_indx].qp_handle = qp; ··· 2049 2036 { 2050 2037 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 2051 2038 struct bnxt_qplib_hwq_attr hwq_attr = {}; 2052 - struct creq_create_cq_resp resp; 2039 + struct creq_create_cq_resp resp = {}; 2040 + struct bnxt_qplib_cmdqmsg msg = {}; 2041 + struct cmdq_create_cq req = {}; 2053 2042 struct bnxt_qplib_pbl *pbl; 2054 - struct cmdq_create_cq req; 2055 - u16 cmd_flags = 0; 2056 2043 u32 pg_sz_lvl; 2057 2044 int rc; 2058 2045 ··· 2065 2052 if (rc) 2066 2053 goto exit; 2067 2054 2068 - RCFW_CMD_PREP(req, CREATE_CQ, cmd_flags); 2055 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 2056 + CMDQ_BASE_OPCODE_CREATE_CQ, 2057 + sizeof(req)); 2069 2058 2070 2059 if (!cq->dpi) { 2071 2060 dev_err(&rcfw->pdev->dev, ··· 2086 2071 req.cq_fco_cnq_id = cpu_to_le32( 2087 2072 (cq->cnq_hw_ring_id & CMDQ_CREATE_CQ_CNQ_ID_MASK) << 2088 2073 CMDQ_CREATE_CQ_CNQ_ID_SFT); 2089 - 2090 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 2091 - (void *)&resp, NULL, 0); 2074 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 2075 + sizeof(resp), 0); 2076 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 2092 2077 if (rc) 2093 2078 goto fail; 2094 2079 ··· 2115 2100 return rc; 2116 2101 } 2117 2102 2103 + void bnxt_qplib_resize_cq_complete(struct bnxt_qplib_res *res, 2104 + struct bnxt_qplib_cq *cq) 2105 + { 2106 + bnxt_qplib_free_hwq(res, &cq->hwq); 2107 + memcpy(&cq->hwq, &cq->resize_hwq, sizeof(cq->hwq)); 2108 + } 2109 + 2110 + int bnxt_qplib_resize_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq, 2111 + int new_cqes) 2112 + { 2113 + struct bnxt_qplib_hwq_attr hwq_attr = {}; 2114 + struct bnxt_qplib_rcfw *rcfw = res->rcfw; 2115 + struct creq_resize_cq_resp resp = {}; 2116 + struct bnxt_qplib_cmdqmsg msg = {}; 2117 + struct cmdq_resize_cq req = {}; 2118 + struct bnxt_qplib_pbl *pbl; 2119 + u32 pg_sz, lvl, new_sz; 2120 + int rc; 2121 + 2122 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 2123 + CMDQ_BASE_OPCODE_RESIZE_CQ, 2124 + sizeof(req)); 2125 + hwq_attr.sginfo = &cq->sg_info; 2126 + hwq_attr.res = res; 2127 + hwq_attr.depth = new_cqes; 2128 + hwq_attr.stride = sizeof(struct cq_base); 2129 + hwq_attr.type = HWQ_TYPE_QUEUE; 2130 + rc = bnxt_qplib_alloc_init_hwq(&cq->resize_hwq, &hwq_attr); 2131 + if (rc) 2132 + return rc; 2133 + 2134 + req.cq_cid = cpu_to_le32(cq->id); 2135 + pbl = &cq->resize_hwq.pbl[PBL_LVL_0]; 2136 + pg_sz = bnxt_qplib_base_pg_size(&cq->resize_hwq); 2137 + lvl = (cq->resize_hwq.level << CMDQ_RESIZE_CQ_LVL_SFT) & 2138 + CMDQ_RESIZE_CQ_LVL_MASK; 2139 + new_sz = (new_cqes << CMDQ_RESIZE_CQ_NEW_CQ_SIZE_SFT) & 2140 + CMDQ_RESIZE_CQ_NEW_CQ_SIZE_MASK; 2141 + req.new_cq_size_pg_size_lvl = cpu_to_le32(new_sz | pg_sz | lvl); 2142 + req.new_pbl = cpu_to_le64(pbl->pg_map_arr[0]); 2143 + 2144 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 2145 + sizeof(resp), 0); 2146 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 2147 + return rc; 2148 + } 2149 + 2118 2150 int bnxt_qplib_destroy_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq) 2119 2151 { 2120 2152 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 2121 - struct cmdq_destroy_cq req; 2122 - struct creq_destroy_cq_resp resp; 2153 + struct creq_destroy_cq_resp resp = {}; 2154 + struct bnxt_qplib_cmdqmsg msg = {}; 2155 + struct cmdq_destroy_cq req = {}; 2123 2156 u16 total_cnq_events; 2124 - u16 cmd_flags = 0; 2125 2157 int rc; 2126 2158 2127 - RCFW_CMD_PREP(req, DESTROY_CQ, cmd_flags); 2159 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 2160 + CMDQ_BASE_OPCODE_DESTROY_CQ, 2161 + sizeof(req)); 2128 2162 2129 2163 req.cq_cid = cpu_to_le32(cq->id); 2130 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 2131 - (void *)&resp, NULL, 0); 2164 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 2165 + sizeof(resp), 0); 2166 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 2132 2167 if (rc) 2133 2168 return rc; 2134 2169 total_cnq_events = le16_to_cpu(resp.total_cnq_events);
+5
drivers/infiniband/hw/bnxt_re/qplib_fp.h
··· 400 400 u16 count; 401 401 u16 period; 402 402 struct bnxt_qplib_hwq hwq; 403 + struct bnxt_qplib_hwq resize_hwq; 403 404 u32 cnq_hw_ring_id; 404 405 struct bnxt_qplib_nq *nq; 405 406 bool resize_in_progress; ··· 533 532 int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp, 534 533 struct bnxt_qplib_swqe *wqe); 535 534 int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq); 535 + int bnxt_qplib_resize_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq, 536 + int new_cqes); 537 + void bnxt_qplib_resize_cq_complete(struct bnxt_qplib_res *res, 538 + struct bnxt_qplib_cq *cq); 536 539 int bnxt_qplib_destroy_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq); 537 540 int bnxt_qplib_poll_cq(struct bnxt_qplib_cq *cq, struct bnxt_qplib_cqe *cqe, 538 541 int num, struct bnxt_qplib_qp **qp);
+48 -47
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
··· 49 49 #include "qplib_rcfw.h" 50 50 #include "qplib_sp.h" 51 51 #include "qplib_fp.h" 52 + #include "qplib_tlv.h" 52 53 53 54 static void bnxt_qplib_service_creq(struct tasklet_struct *t); 54 55 ··· 86 85 return count ? 0 : -ETIMEDOUT; 87 86 }; 88 87 89 - static int __send_message(struct bnxt_qplib_rcfw *rcfw, struct cmdq_base *req, 90 - struct creq_base *resp, void *sb, u8 is_block) 88 + static int __send_message(struct bnxt_qplib_rcfw *rcfw, 89 + struct bnxt_qplib_cmdqmsg *msg) 91 90 { 92 91 struct bnxt_qplib_cmdq_ctx *cmdq = &rcfw->cmdq; 93 92 struct bnxt_qplib_hwq *hwq = &cmdq->hwq; ··· 96 95 u32 sw_prod, cmdq_prod; 97 96 struct pci_dev *pdev; 98 97 unsigned long flags; 99 - u32 size, opcode; 98 + u32 bsize, opcode; 100 99 u16 cookie, cbit; 101 100 u8 *preq; 102 101 103 102 pdev = rcfw->pdev; 104 103 105 - opcode = req->opcode; 104 + opcode = __get_cmdq_base_opcode(msg->req, msg->req_sz); 106 105 if (!test_bit(FIRMWARE_INITIALIZED_FLAG, &cmdq->flags) && 107 106 (opcode != CMDQ_BASE_OPCODE_QUERY_FUNC && 108 107 opcode != CMDQ_BASE_OPCODE_INITIALIZE_FW && ··· 125 124 * cmdqe 126 125 */ 127 126 spin_lock_irqsave(&hwq->lock, flags); 128 - if (req->cmd_size >= HWQ_FREE_SLOTS(hwq)) { 127 + if (msg->req->cmd_size >= HWQ_FREE_SLOTS(hwq)) { 129 128 dev_err(&pdev->dev, "RCFW: CMDQ is full!\n"); 130 129 spin_unlock_irqrestore(&hwq->lock, flags); 131 130 return -EAGAIN; ··· 134 133 135 134 cookie = cmdq->seq_num & RCFW_MAX_COOKIE_VALUE; 136 135 cbit = cookie % rcfw->cmdq_depth; 137 - if (is_block) 136 + if (msg->block) 138 137 cookie |= RCFW_CMD_IS_BLOCKING; 139 138 140 139 set_bit(cbit, cmdq->cmdq_bitmap); 141 - req->cookie = cpu_to_le16(cookie); 140 + __set_cmdq_base_cookie(msg->req, msg->req_sz, cpu_to_le16(cookie)); 142 141 crsqe = &rcfw->crsqe_tbl[cbit]; 143 142 if (crsqe->resp) { 144 143 spin_unlock_irqrestore(&hwq->lock, flags); 145 144 return -EBUSY; 146 145 } 147 146 148 - size = req->cmd_size; 149 147 /* change the cmd_size to the number of 16byte cmdq unit. 150 148 * req->cmd_size is modified here 151 149 */ 152 - bnxt_qplib_set_cmd_slots(req); 150 + bsize = bnxt_qplib_set_cmd_slots(msg->req); 153 151 154 - memset(resp, 0, sizeof(*resp)); 155 - crsqe->resp = (struct creq_qp_event *)resp; 156 - crsqe->resp->cookie = req->cookie; 157 - crsqe->req_size = req->cmd_size; 158 - if (req->resp_size && sb) { 159 - struct bnxt_qplib_rcfw_sbuf *sbuf = sb; 160 - 161 - req->resp_addr = cpu_to_le64(sbuf->dma_addr); 162 - req->resp_size = (sbuf->size + BNXT_QPLIB_CMDQE_UNITS - 1) / 163 - BNXT_QPLIB_CMDQE_UNITS; 152 + memset(msg->resp, 0, sizeof(*msg->resp)); 153 + crsqe->resp = (struct creq_qp_event *)msg->resp; 154 + crsqe->resp->cookie = cpu_to_le16(cookie); 155 + crsqe->req_size = __get_cmdq_base_cmd_size(msg->req, msg->req_sz); 156 + if (__get_cmdq_base_resp_size(msg->req, msg->req_sz) && msg->sb) { 157 + struct bnxt_qplib_rcfw_sbuf *sbuf = msg->sb; 158 + __set_cmdq_base_resp_addr(msg->req, msg->req_sz, cpu_to_le64(sbuf->dma_addr)); 159 + __set_cmdq_base_resp_size(msg->req, msg->req_sz, 160 + ALIGN(sbuf->size, BNXT_QPLIB_CMDQE_UNITS)); 164 161 } 165 162 166 - preq = (u8 *)req; 163 + preq = (u8 *)msg->req; 167 164 do { 168 165 /* Locate the next cmdq slot */ 169 166 sw_prod = HWQ_CMP(hwq->prod, hwq); ··· 173 174 } 174 175 /* Copy a segment of the req cmd to the cmdq */ 175 176 memset(cmdqe, 0, sizeof(*cmdqe)); 176 - memcpy(cmdqe, preq, min_t(u32, size, sizeof(*cmdqe))); 177 - preq += min_t(u32, size, sizeof(*cmdqe)); 178 - size -= min_t(u32, size, sizeof(*cmdqe)); 177 + memcpy(cmdqe, preq, min_t(u32, bsize, sizeof(*cmdqe))); 178 + preq += min_t(u32, bsize, sizeof(*cmdqe)); 179 + bsize -= min_t(u32, bsize, sizeof(*cmdqe)); 179 180 hwq->prod++; 180 - } while (size > 0); 181 + } while (bsize > 0); 181 182 cmdq->seq_num++; 182 183 183 184 cmdq_prod = hwq->prod; ··· 190 191 cmdq_prod |= BIT(FIRMWARE_FIRST_FLAG); 191 192 clear_bit(FIRMWARE_FIRST_FLAG, &cmdq->flags); 192 193 } 193 - 194 194 /* ring CMDQ DB */ 195 195 wmb(); 196 196 writel(cmdq_prod, cmdq->cmdq_mbox.prod); ··· 201 203 } 202 204 203 205 int bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw, 204 - struct cmdq_base *req, 205 - struct creq_base *resp, 206 - void *sb, u8 is_block) 206 + struct bnxt_qplib_cmdqmsg *msg) 207 207 { 208 - struct creq_qp_event *evnt = (struct creq_qp_event *)resp; 208 + struct creq_qp_event *evnt = (struct creq_qp_event *)msg->resp; 209 209 u16 cookie; 210 210 u8 opcode, retry_cnt = 0xFF; 211 211 int rc = 0; ··· 213 217 return 0; 214 218 215 219 do { 216 - opcode = req->opcode; 217 - rc = __send_message(rcfw, req, resp, sb, is_block); 218 - cookie = le16_to_cpu(req->cookie) & RCFW_MAX_COOKIE_VALUE; 220 + opcode = __get_cmdq_base_opcode(msg->req, msg->req_sz); 221 + rc = __send_message(rcfw, msg); 222 + cookie = le16_to_cpu(__get_cmdq_base_cookie(msg->req, msg->req_sz)) & 223 + RCFW_MAX_COOKIE_VALUE; 219 224 if (!rc) 220 225 break; 221 - 222 226 if (!retry_cnt || (rc != -EAGAIN && rc != -EBUSY)) { 223 227 /* send failed */ 224 228 dev_err(&rcfw->pdev->dev, "cmdq[%#x]=%#x send failed\n", 225 229 cookie, opcode); 226 230 return rc; 227 231 } 228 - is_block ? mdelay(1) : usleep_range(500, 1000); 232 + msg->block ? mdelay(1) : usleep_range(500, 1000); 229 233 230 234 } while (retry_cnt--); 231 235 232 - if (is_block) 236 + if (msg->block) 233 237 rc = __block_for_resp(rcfw, cookie); 234 238 else 235 239 rc = __wait_for_resp(rcfw, cookie); ··· 448 452 /* RCFW */ 449 453 int bnxt_qplib_deinit_rcfw(struct bnxt_qplib_rcfw *rcfw) 450 454 { 451 - struct cmdq_deinitialize_fw req; 452 - struct creq_deinitialize_fw_resp resp; 453 - u16 cmd_flags = 0; 455 + struct creq_deinitialize_fw_resp resp = {}; 456 + struct cmdq_deinitialize_fw req = {}; 457 + struct bnxt_qplib_cmdqmsg msg = {}; 454 458 int rc; 455 459 456 - RCFW_CMD_PREP(req, DEINITIALIZE_FW, cmd_flags); 457 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 458 - NULL, 0); 460 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 461 + CMDQ_BASE_OPCODE_DEINITIALIZE_FW, 462 + sizeof(req)); 463 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, 464 + sizeof(req), sizeof(resp), 0); 465 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 459 466 if (rc) 460 467 return rc; 461 468 ··· 469 470 int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw, 470 471 struct bnxt_qplib_ctx *ctx, int is_virtfn) 471 472 { 472 - struct creq_initialize_fw_resp resp; 473 - struct cmdq_initialize_fw req; 474 - u16 cmd_flags = 0; 473 + struct creq_initialize_fw_resp resp = {}; 474 + struct cmdq_initialize_fw req = {}; 475 + struct bnxt_qplib_cmdqmsg msg = {}; 475 476 u8 pgsz, lvl; 476 477 int rc; 477 478 478 - RCFW_CMD_PREP(req, INITIALIZE_FW, cmd_flags); 479 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 480 + CMDQ_BASE_OPCODE_INITIALIZE_FW, 481 + sizeof(req)); 479 482 /* Supply (log-base-2-of-host-page-size - base-page-shift) 480 483 * to bono to adjust the doorbell page sizes. 481 484 */ ··· 546 545 547 546 skip_ctx_setup: 548 547 req.stat_ctx_id = cpu_to_le32(ctx->stats.fw_id); 549 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 550 - NULL, 0); 548 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 549 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 551 550 if (rc) 552 551 return rc; 553 552 set_bit(FIRMWARE_INITIALIZED_FLAG, &rcfw->cmdq.flags);
+49 -17
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
··· 39 39 #ifndef __BNXT_QPLIB_RCFW_H__ 40 40 #define __BNXT_QPLIB_RCFW_H__ 41 41 42 + #include "qplib_tlv.h" 43 + 42 44 #define RCFW_CMDQ_TRIG_VAL 1 43 45 #define RCFW_COMM_PCI_BAR_REGION 0 44 46 #define RCFW_COMM_CONS_PCI_BAR_REGION 2 ··· 53 51 #define RCFW_DBR_PCI_BAR_REGION 2 54 52 #define RCFW_DBR_BASE_PAGE_SHIFT 12 55 53 56 - #define RCFW_CMD_PREP(req, CMD, cmd_flags) \ 57 - do { \ 58 - memset(&(req), 0, sizeof((req))); \ 59 - (req).opcode = CMDQ_BASE_OPCODE_##CMD; \ 60 - (req).cmd_size = sizeof((req)); \ 61 - (req).flags = cpu_to_le16(cmd_flags); \ 62 - } while (0) 63 - 64 - #define RCFW_CMD_WAIT_TIME_MS 20000 /* 20 Seconds timeout */ 65 - 66 54 /* Cmdq contains a fix number of a 16-Byte slots */ 67 55 struct bnxt_qplib_cmdqe { 68 56 u8 data[16]; 69 57 }; 70 58 59 + #define BNXT_QPLIB_CMDQE_UNITS sizeof(struct bnxt_qplib_cmdqe) 60 + 61 + static inline void bnxt_qplib_rcfw_cmd_prep(struct cmdq_base *req, 62 + u8 opcode, u8 cmd_size) 63 + { 64 + req->opcode = opcode; 65 + req->cmd_size = cmd_size; 66 + } 67 + 68 + #define RCFW_CMD_WAIT_TIME_MS 20000 /* 20 Seconds timeout */ 69 + 71 70 /* CMDQ elements */ 72 71 #define BNXT_QPLIB_CMDQE_MAX_CNT_256 256 73 72 #define BNXT_QPLIB_CMDQE_MAX_CNT_8192 8192 74 - #define BNXT_QPLIB_CMDQE_UNITS sizeof(struct bnxt_qplib_cmdqe) 75 73 #define BNXT_QPLIB_CMDQE_BYTES(depth) ((depth) * BNXT_QPLIB_CMDQE_UNITS) 76 74 77 75 static inline u32 bnxt_qplib_cmdqe_npages(u32 depth) ··· 89 87 return (bnxt_qplib_cmdqe_npages(depth) * PAGE_SIZE); 90 88 } 91 89 92 - /* Set the cmd_size to a factor of CMDQE unit */ 93 - static inline void bnxt_qplib_set_cmd_slots(struct cmdq_base *req) 90 + static inline u32 bnxt_qplib_set_cmd_slots(struct cmdq_base *req) 94 91 { 95 - req->cmd_size = (req->cmd_size + BNXT_QPLIB_CMDQE_UNITS - 1) / 96 - BNXT_QPLIB_CMDQE_UNITS; 92 + u32 cmd_byte = 0; 93 + 94 + if (HAS_TLV_HEADER(req)) { 95 + struct roce_tlv *tlv_req = (struct roce_tlv *)req; 96 + 97 + cmd_byte = tlv_req->total_size * BNXT_QPLIB_CMDQE_UNITS; 98 + } else { 99 + cmd_byte = req->cmd_size; 100 + req->cmd_size = (req->cmd_size + BNXT_QPLIB_CMDQE_UNITS - 1) / 101 + BNXT_QPLIB_CMDQE_UNITS; 102 + } 103 + 104 + return cmd_byte; 97 105 } 98 106 99 107 #define RCFW_MAX_COOKIE_VALUE 0x7FFF ··· 202 190 u32 cmdq_depth; 203 191 }; 204 192 193 + struct bnxt_qplib_cmdqmsg { 194 + struct cmdq_base *req; 195 + struct creq_base *resp; 196 + void *sb; 197 + u32 req_sz; 198 + u32 res_sz; 199 + u8 block; 200 + }; 201 + 202 + static inline void bnxt_qplib_fill_cmdqmsg(struct bnxt_qplib_cmdqmsg *msg, 203 + void *req, void *resp, void *sb, 204 + u32 req_sz, u32 res_sz, u8 block) 205 + { 206 + msg->req = req; 207 + msg->resp = resp; 208 + msg->sb = sb; 209 + msg->req_sz = req_sz; 210 + msg->res_sz = res_sz; 211 + msg->block = block; 212 + } 213 + 205 214 void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw); 206 215 int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res, 207 216 struct bnxt_qplib_rcfw *rcfw, ··· 243 210 void bnxt_qplib_rcfw_free_sbuf(struct bnxt_qplib_rcfw *rcfw, 244 211 struct bnxt_qplib_rcfw_sbuf *sbuf); 245 212 int bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw, 246 - struct cmdq_base *req, struct creq_base *resp, 247 - void *sbuf, u8 is_block); 213 + struct bnxt_qplib_cmdqmsg *msg); 248 214 249 215 int bnxt_qplib_deinit_rcfw(struct bnxt_qplib_rcfw *rcfw); 250 216 int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
+236 -101
drivers/infiniband/hw/bnxt_re/qplib_sp.c
··· 48 48 #include "qplib_res.h" 49 49 #include "qplib_rcfw.h" 50 50 #include "qplib_sp.h" 51 + #include "qplib_tlv.h" 51 52 52 53 const struct bnxt_qplib_gid bnxt_qplib_gid_zero = {{ 0, 0, 0, 0, 0, 0, 0, 0, 53 54 0, 0, 0, 0, 0, 0, 0, 0 } }; ··· 69 68 static void bnxt_qplib_query_version(struct bnxt_qplib_rcfw *rcfw, 70 69 char *fw_ver) 71 70 { 72 - struct cmdq_query_version req; 73 - struct creq_query_version_resp resp; 74 - u16 cmd_flags = 0; 71 + struct creq_query_version_resp resp = {}; 72 + struct bnxt_qplib_cmdqmsg msg = {}; 73 + struct cmdq_query_version req = {}; 75 74 int rc = 0; 76 75 77 - RCFW_CMD_PREP(req, QUERY_VERSION, cmd_flags); 76 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 77 + CMDQ_BASE_OPCODE_QUERY_VERSION, 78 + sizeof(req)); 78 79 79 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 80 - (void *)&resp, NULL, 0); 80 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), sizeof(resp), 0); 81 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 81 82 if (rc) 82 83 return; 83 84 fw_ver[0] = resp.fw_maj; ··· 91 88 int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, 92 89 struct bnxt_qplib_dev_attr *attr, bool vf) 93 90 { 94 - struct cmdq_query_func req; 95 - struct creq_query_func_resp resp; 96 - struct bnxt_qplib_rcfw_sbuf *sbuf; 91 + struct creq_query_func_resp resp = {}; 92 + struct bnxt_qplib_cmdqmsg msg = {}; 97 93 struct creq_query_func_resp_sb *sb; 98 - u16 cmd_flags = 0; 99 - u32 temp; 94 + struct bnxt_qplib_rcfw_sbuf *sbuf; 95 + struct cmdq_query_func req = {}; 100 96 u8 *tqm_alloc; 101 97 int i, rc = 0; 98 + u32 temp; 102 99 103 - RCFW_CMD_PREP(req, QUERY_FUNC, cmd_flags); 100 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 101 + CMDQ_BASE_OPCODE_QUERY_FUNC, 102 + sizeof(req)); 104 103 105 104 sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 106 105 if (!sbuf) { ··· 113 108 114 109 sb = sbuf->sb; 115 110 req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 116 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 117 - (void *)sbuf, 0); 111 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 112 + sizeof(resp), 0); 113 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 118 114 if (rc) 119 115 goto bail; 120 116 ··· 180 174 struct bnxt_qplib_rcfw *rcfw, 181 175 struct bnxt_qplib_ctx *ctx) 182 176 { 183 - struct cmdq_set_func_resources req; 184 - struct creq_set_func_resources_resp resp; 185 - u16 cmd_flags = 0; 177 + struct creq_set_func_resources_resp resp = {}; 178 + struct cmdq_set_func_resources req = {}; 179 + struct bnxt_qplib_cmdqmsg msg = {}; 186 180 int rc = 0; 187 181 188 - RCFW_CMD_PREP(req, SET_FUNC_RESOURCES, cmd_flags); 182 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 183 + CMDQ_BASE_OPCODE_SET_FUNC_RESOURCES, 184 + sizeof(req)); 189 185 190 186 req.number_of_qp = cpu_to_le32(ctx->qpc_count); 191 187 req.number_of_mrw = cpu_to_le32(ctx->mrw_count); ··· 200 192 req.max_cq_per_vf = cpu_to_le32(ctx->vf_res.max_cq_per_vf); 201 193 req.max_gid_per_vf = cpu_to_le32(ctx->vf_res.max_gid_per_vf); 202 194 203 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 204 - (void *)&resp, 205 - NULL, 0); 195 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 196 + sizeof(resp), 0); 197 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 206 198 if (rc) { 207 199 dev_err(&res->pdev->dev, "Failed to set function resources\n"); 208 200 } ··· 253 245 } 254 246 /* Remove GID from the SGID table */ 255 247 if (update) { 256 - struct cmdq_delete_gid req; 257 - struct creq_delete_gid_resp resp; 258 - u16 cmd_flags = 0; 248 + struct creq_delete_gid_resp resp = {}; 249 + struct bnxt_qplib_cmdqmsg msg = {}; 250 + struct cmdq_delete_gid req = {}; 259 251 int rc; 260 252 261 - RCFW_CMD_PREP(req, DELETE_GID, cmd_flags); 253 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 254 + CMDQ_BASE_OPCODE_DELETE_GID, 255 + sizeof(req)); 262 256 if (sgid_tbl->hw_id[index] == 0xFFFF) { 263 257 dev_err(&res->pdev->dev, 264 258 "GID entry contains an invalid HW id\n"); 265 259 return -EINVAL; 266 260 } 267 261 req.gid_index = cpu_to_le16(sgid_tbl->hw_id[index]); 268 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 269 - (void *)&resp, NULL, 0); 262 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 263 + sizeof(resp), 0); 264 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 270 265 if (rc) 271 266 return rc; 272 267 } ··· 326 315 return -ENOMEM; 327 316 } 328 317 if (update) { 329 - struct cmdq_add_gid req; 330 - struct creq_add_gid_resp resp; 331 - u16 cmd_flags = 0; 318 + struct creq_add_gid_resp resp = {}; 319 + struct bnxt_qplib_cmdqmsg msg = {}; 320 + struct cmdq_add_gid req = {}; 332 321 int rc; 333 322 334 - RCFW_CMD_PREP(req, ADD_GID, cmd_flags); 323 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 324 + CMDQ_BASE_OPCODE_ADD_GID, 325 + sizeof(req)); 335 326 336 327 req.gid[0] = cpu_to_be32(((u32 *)gid->data)[3]); 337 328 req.gid[1] = cpu_to_be32(((u32 *)gid->data)[2]); ··· 358 345 req.src_mac[1] = cpu_to_be16(((u16 *)smac)[1]); 359 346 req.src_mac[2] = cpu_to_be16(((u16 *)smac)[2]); 360 347 361 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 362 - (void *)&resp, NULL, 0); 348 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 349 + sizeof(resp), 0); 350 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 363 351 if (rc) 364 352 return rc; 365 353 sgid_tbl->hw_id[free_idx] = le32_to_cpu(resp.xid); ··· 389 375 struct bnxt_qplib_res, 390 376 sgid_tbl); 391 377 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 392 - struct creq_modify_gid_resp resp; 393 - struct cmdq_modify_gid req; 378 + struct creq_modify_gid_resp resp = {}; 379 + struct bnxt_qplib_cmdqmsg msg = {}; 380 + struct cmdq_modify_gid req = {}; 394 381 int rc; 395 - u16 cmd_flags = 0; 396 382 397 - RCFW_CMD_PREP(req, MODIFY_GID, cmd_flags); 383 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 384 + CMDQ_BASE_OPCODE_MODIFY_GID, 385 + sizeof(req)); 398 386 399 387 req.gid[0] = cpu_to_be32(((u32 *)gid->data)[3]); 400 388 req.gid[1] = cpu_to_be32(((u32 *)gid->data)[2]); ··· 415 399 416 400 req.gid_index = cpu_to_le16(gid_idx); 417 401 418 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 419 - (void *)&resp, NULL, 0); 402 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 403 + sizeof(resp), 0); 404 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 420 405 return rc; 421 406 } 422 407 ··· 426 409 bool block) 427 410 { 428 411 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 429 - struct cmdq_create_ah req; 430 - struct creq_create_ah_resp resp; 431 - u16 cmd_flags = 0; 412 + struct creq_create_ah_resp resp = {}; 413 + struct bnxt_qplib_cmdqmsg msg = {}; 414 + struct cmdq_create_ah req = {}; 432 415 u32 temp32[4]; 433 416 u16 temp16[3]; 434 417 int rc; 435 418 436 - RCFW_CMD_PREP(req, CREATE_AH, cmd_flags); 419 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 420 + CMDQ_BASE_OPCODE_CREATE_AH, 421 + sizeof(req)); 437 422 438 423 memcpy(temp32, ah->dgid.data, sizeof(struct bnxt_qplib_gid)); 439 424 req.dgid[0] = cpu_to_le32(temp32[0]); ··· 458 439 req.dest_mac[1] = cpu_to_le16(temp16[1]); 459 440 req.dest_mac[2] = cpu_to_le16(temp16[2]); 460 441 461 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 462 - NULL, block); 442 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 443 + sizeof(resp), block); 444 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 463 445 if (rc) 464 446 return rc; 465 447 ··· 472 452 bool block) 473 453 { 474 454 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 475 - struct cmdq_destroy_ah req; 476 - struct creq_destroy_ah_resp resp; 477 - u16 cmd_flags = 0; 455 + struct creq_destroy_ah_resp resp = {}; 456 + struct bnxt_qplib_cmdqmsg msg = {}; 457 + struct cmdq_destroy_ah req = {}; 478 458 479 459 /* Clean up the AH table in the device */ 480 - RCFW_CMD_PREP(req, DESTROY_AH, cmd_flags); 460 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 461 + CMDQ_BASE_OPCODE_DESTROY_AH, 462 + sizeof(req)); 481 463 482 464 req.ah_cid = cpu_to_le32(ah->id); 483 465 484 - bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, NULL, 485 - block); 466 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 467 + sizeof(resp), block); 468 + bnxt_qplib_rcfw_send_message(rcfw, &msg); 486 469 } 487 470 488 471 /* MRW */ 489 472 int bnxt_qplib_free_mrw(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mrw) 490 473 { 474 + struct creq_deallocate_key_resp resp = {}; 491 475 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 492 - struct cmdq_deallocate_key req; 493 - struct creq_deallocate_key_resp resp; 494 - u16 cmd_flags = 0; 476 + struct cmdq_deallocate_key req = {}; 477 + struct bnxt_qplib_cmdqmsg msg = {}; 495 478 int rc; 496 479 497 480 if (mrw->lkey == 0xFFFFFFFF) { ··· 502 479 return 0; 503 480 } 504 481 505 - RCFW_CMD_PREP(req, DEALLOCATE_KEY, cmd_flags); 482 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 483 + CMDQ_BASE_OPCODE_DEALLOCATE_KEY, 484 + sizeof(req)); 506 485 507 486 req.mrw_flags = mrw->type; 508 487 ··· 515 490 else 516 491 req.key = cpu_to_le32(mrw->lkey); 517 492 518 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 519 - NULL, 0); 493 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 494 + sizeof(resp), 0); 495 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 520 496 if (rc) 521 497 return rc; 522 498 ··· 531 505 int bnxt_qplib_alloc_mrw(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mrw) 532 506 { 533 507 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 534 - struct cmdq_allocate_mrw req; 535 - struct creq_allocate_mrw_resp resp; 536 - u16 cmd_flags = 0; 508 + struct creq_allocate_mrw_resp resp = {}; 509 + struct bnxt_qplib_cmdqmsg msg = {}; 510 + struct cmdq_allocate_mrw req = {}; 537 511 unsigned long tmp; 538 512 int rc; 539 513 540 - RCFW_CMD_PREP(req, ALLOCATE_MRW, cmd_flags); 514 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 515 + CMDQ_BASE_OPCODE_ALLOCATE_MRW, 516 + sizeof(req)); 541 517 542 518 req.pd_id = cpu_to_le32(mrw->pd->id); 543 519 req.mrw_flags = mrw->type; ··· 551 523 tmp = (unsigned long)mrw; 552 524 req.mrw_handle = cpu_to_le64(tmp); 553 525 554 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 555 - (void *)&resp, NULL, 0); 526 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 527 + sizeof(resp), 0); 528 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 556 529 if (rc) 557 530 return rc; 558 531 ··· 570 541 bool block) 571 542 { 572 543 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 573 - struct cmdq_deregister_mr req; 574 - struct creq_deregister_mr_resp resp; 575 - u16 cmd_flags = 0; 544 + struct creq_deregister_mr_resp resp = {}; 545 + struct bnxt_qplib_cmdqmsg msg = {}; 546 + struct cmdq_deregister_mr req = {}; 576 547 int rc; 577 548 578 - RCFW_CMD_PREP(req, DEREGISTER_MR, cmd_flags); 549 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 550 + CMDQ_BASE_OPCODE_DEREGISTER_MR, 551 + sizeof(req)); 579 552 580 553 req.lkey = cpu_to_le32(mrw->lkey); 581 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 582 - (void *)&resp, NULL, block); 554 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 555 + sizeof(resp), block); 556 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 583 557 if (rc) 584 558 return rc; 585 559 ··· 602 570 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 603 571 struct bnxt_qplib_hwq_attr hwq_attr = {}; 604 572 struct bnxt_qplib_sg_info sginfo = {}; 605 - struct creq_register_mr_resp resp; 606 - struct cmdq_register_mr req; 607 - u16 cmd_flags = 0, level; 573 + struct creq_register_mr_resp resp = {}; 574 + struct bnxt_qplib_cmdqmsg msg = {}; 575 + struct cmdq_register_mr req = {}; 608 576 int pages, rc; 609 577 u32 pg_size; 578 + u16 level; 610 579 611 580 if (num_pbls) { 612 581 pages = roundup_pow_of_two(num_pbls); ··· 635 602 } 636 603 } 637 604 638 - RCFW_CMD_PREP(req, REGISTER_MR, cmd_flags); 605 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 606 + CMDQ_BASE_OPCODE_REGISTER_MR, 607 + sizeof(req)); 639 608 640 609 /* Configure the request */ 641 610 if (mr->hwq.level == PBL_LVL_MAX) { ··· 662 627 req.key = cpu_to_le32(mr->lkey); 663 628 req.mr_size = cpu_to_le64(mr->total_size); 664 629 665 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 666 - (void *)&resp, NULL, false); 630 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, NULL, sizeof(req), 631 + sizeof(resp), 0); 632 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 667 633 if (rc) 668 634 goto fail; 669 635 ··· 715 679 return 0; 716 680 } 717 681 718 - int bnxt_qplib_map_tc2cos(struct bnxt_qplib_res *res, u16 *cids) 719 - { 720 - struct bnxt_qplib_rcfw *rcfw = res->rcfw; 721 - struct cmdq_map_tc_to_cos req; 722 - struct creq_map_tc_to_cos_resp resp; 723 - u16 cmd_flags = 0; 724 - 725 - RCFW_CMD_PREP(req, MAP_TC_TO_COS, cmd_flags); 726 - req.cos0 = cpu_to_le16(cids[0]); 727 - req.cos1 = cpu_to_le16(cids[1]); 728 - 729 - return bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 730 - NULL, 0); 731 - } 732 - 733 682 int bnxt_qplib_get_roce_stats(struct bnxt_qplib_rcfw *rcfw, 734 683 struct bnxt_qplib_roce_stats *stats) 735 684 { 736 - struct cmdq_query_roce_stats req; 737 - struct creq_query_roce_stats_resp resp; 738 - struct bnxt_qplib_rcfw_sbuf *sbuf; 685 + struct creq_query_roce_stats_resp resp = {}; 739 686 struct creq_query_roce_stats_resp_sb *sb; 740 - u16 cmd_flags = 0; 687 + struct cmdq_query_roce_stats req = {}; 688 + struct bnxt_qplib_cmdqmsg msg = {}; 689 + struct bnxt_qplib_rcfw_sbuf *sbuf; 741 690 int rc = 0; 742 691 743 - RCFW_CMD_PREP(req, QUERY_ROCE_STATS, cmd_flags); 692 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 693 + CMDQ_BASE_OPCODE_QUERY_ROCE_STATS, 694 + sizeof(req)); 744 695 745 696 sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 746 697 if (!sbuf) { ··· 738 715 739 716 sb = sbuf->sb; 740 717 req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 741 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, 742 - (void *)sbuf, 0); 718 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 719 + sizeof(resp), 0); 720 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 743 721 if (rc) 744 722 goto bail; 745 723 /* Extract the context from the side buffer */ ··· 804 780 struct creq_query_roce_stats_ext_resp resp = {}; 805 781 struct creq_query_roce_stats_ext_resp_sb *sb; 806 782 struct cmdq_query_roce_stats_ext req = {}; 783 + struct bnxt_qplib_cmdqmsg msg = {}; 807 784 struct bnxt_qplib_rcfw_sbuf *sbuf; 808 - u16 cmd_flags = 0; 809 785 int rc; 810 786 811 787 sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); ··· 815 791 return -ENOMEM; 816 792 } 817 793 818 - RCFW_CMD_PREP(req, QUERY_ROCE_STATS_EXT, cmd_flags); 794 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 795 + CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_QUERY_ROCE_STATS, 796 + sizeof(req)); 819 797 820 798 req.resp_size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 821 799 req.resp_addr = cpu_to_le64(sbuf->dma_addr); 822 800 req.function_id = cpu_to_le32(fid); 823 801 req.flags = cpu_to_le16(CMDQ_QUERY_ROCE_STATS_EXT_FLAGS_FUNCTION_ID); 824 802 825 - rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, 826 - (void *)&resp, (void *)sbuf, 0); 803 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 804 + sizeof(resp), 0); 805 + rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 827 806 if (rc) 828 807 goto bail; 829 808 ··· 848 821 849 822 bail: 850 823 bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 824 + return rc; 825 + } 826 + 827 + static void bnxt_qplib_fill_cc_gen1(struct cmdq_modify_roce_cc_gen1_tlv *ext_req, 828 + struct bnxt_qplib_cc_param_ext *cc_ext) 829 + { 830 + ext_req->modify_mask = cpu_to_le64(cc_ext->ext_mask); 831 + cc_ext->ext_mask = 0; 832 + ext_req->inactivity_th_hi = cpu_to_le16(cc_ext->inact_th_hi); 833 + ext_req->min_time_between_cnps = cpu_to_le16(cc_ext->min_delta_cnp); 834 + ext_req->init_cp = cpu_to_le16(cc_ext->init_cp); 835 + ext_req->tr_update_mode = cc_ext->tr_update_mode; 836 + ext_req->tr_update_cycles = cc_ext->tr_update_cyls; 837 + ext_req->fr_num_rtts = cc_ext->fr_rtt; 838 + ext_req->ai_rate_increase = cc_ext->ai_rate_incr; 839 + ext_req->reduction_relax_rtts_th = cpu_to_le16(cc_ext->rr_rtt_th); 840 + ext_req->additional_relax_cr_th = cpu_to_le16(cc_ext->ar_cr_th); 841 + ext_req->cr_min_th = cpu_to_le16(cc_ext->cr_min_th); 842 + ext_req->bw_avg_weight = cc_ext->bw_avg_weight; 843 + ext_req->actual_cr_factor = cc_ext->cr_factor; 844 + ext_req->max_cp_cr_th = cpu_to_le16(cc_ext->cr_th_max_cp); 845 + ext_req->cp_bias_en = cc_ext->cp_bias_en; 846 + ext_req->cp_bias = cc_ext->cp_bias; 847 + ext_req->cnp_ecn = cc_ext->cnp_ecn; 848 + ext_req->rtt_jitter_en = cc_ext->rtt_jitter_en; 849 + ext_req->link_bytes_per_usec = cpu_to_le16(cc_ext->bytes_per_usec); 850 + ext_req->reset_cc_cr_th = cpu_to_le16(cc_ext->cc_cr_reset_th); 851 + ext_req->cr_width = cc_ext->cr_width; 852 + ext_req->quota_period_min = cc_ext->min_quota; 853 + ext_req->quota_period_max = cc_ext->max_quota; 854 + ext_req->quota_period_abs_max = cc_ext->abs_max_quota; 855 + ext_req->tr_lower_bound = cpu_to_le16(cc_ext->tr_lb); 856 + ext_req->cr_prob_factor = cc_ext->cr_prob_fac; 857 + ext_req->tr_prob_factor = cc_ext->tr_prob_fac; 858 + ext_req->fairness_cr_th = cpu_to_le16(cc_ext->fair_cr_th); 859 + ext_req->red_div = cc_ext->red_div; 860 + ext_req->cnp_ratio_th = cc_ext->cnp_ratio_th; 861 + ext_req->exp_ai_rtts = cpu_to_le16(cc_ext->ai_ext_rtt); 862 + ext_req->exp_ai_cr_cp_ratio = cc_ext->exp_crcp_ratio; 863 + ext_req->use_rate_table = cc_ext->low_rate_en; 864 + ext_req->cp_exp_update_th = cpu_to_le16(cc_ext->cpcr_update_th); 865 + ext_req->high_exp_ai_rtts_th1 = cpu_to_le16(cc_ext->ai_rtt_th1); 866 + ext_req->high_exp_ai_rtts_th2 = cpu_to_le16(cc_ext->ai_rtt_th2); 867 + ext_req->actual_cr_cong_free_rtts_th = cpu_to_le16(cc_ext->cf_rtt_th); 868 + ext_req->severe_cong_cr_th1 = cpu_to_le16(cc_ext->sc_cr_th1); 869 + ext_req->severe_cong_cr_th2 = cpu_to_le16(cc_ext->sc_cr_th2); 870 + ext_req->link64B_per_rtt = cpu_to_le32(cc_ext->l64B_per_rtt); 871 + ext_req->cc_ack_bytes = cc_ext->cc_ack_bytes; 872 + } 873 + 874 + int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res, 875 + struct bnxt_qplib_cc_param *cc_param) 876 + { 877 + struct bnxt_qplib_tlv_modify_cc_req tlv_req = {}; 878 + struct creq_modify_roce_cc_resp resp = {}; 879 + struct bnxt_qplib_cmdqmsg msg = {}; 880 + struct cmdq_modify_roce_cc *req; 881 + int req_size; 882 + void *cmd; 883 + int rc; 884 + 885 + /* Prepare the older base command */ 886 + req = &tlv_req.base_req; 887 + cmd = req; 888 + req_size = sizeof(*req); 889 + bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)req, CMDQ_BASE_OPCODE_MODIFY_ROCE_CC, 890 + sizeof(*req)); 891 + req->modify_mask = cpu_to_le32(cc_param->mask); 892 + req->enable_cc = cc_param->enable; 893 + req->g = cc_param->g; 894 + req->num_phases_per_state = cc_param->nph_per_state; 895 + req->time_per_phase = cc_param->time_pph; 896 + req->pkts_per_phase = cc_param->pkts_pph; 897 + req->init_cr = cpu_to_le16(cc_param->init_cr); 898 + req->init_tr = cpu_to_le16(cc_param->init_tr); 899 + req->tos_dscp_tos_ecn = (cc_param->tos_dscp << CMDQ_MODIFY_ROCE_CC_TOS_DSCP_SFT) | 900 + (cc_param->tos_ecn & CMDQ_MODIFY_ROCE_CC_TOS_ECN_MASK); 901 + req->alt_vlan_pcp = cc_param->alt_vlan_pcp; 902 + req->alt_tos_dscp = cpu_to_le16(cc_param->alt_tos_dscp); 903 + req->rtt = cpu_to_le16(cc_param->rtt); 904 + req->tcp_cp = cpu_to_le16(cc_param->tcp_cp); 905 + req->cc_mode = cc_param->cc_mode; 906 + req->inactivity_th = cpu_to_le16(cc_param->inact_th); 907 + 908 + /* For chip gen P5 onwards fill extended cmd and header */ 909 + if (bnxt_qplib_is_chip_gen_p5(res->cctx)) { 910 + struct roce_tlv *hdr; 911 + u32 payload; 912 + u32 chunks; 913 + 914 + cmd = &tlv_req; 915 + req_size = sizeof(tlv_req); 916 + /* Prepare primary tlv header */ 917 + hdr = &tlv_req.tlv_hdr; 918 + chunks = CHUNKS(sizeof(struct bnxt_qplib_tlv_modify_cc_req)); 919 + payload = sizeof(struct cmdq_modify_roce_cc); 920 + __roce_1st_tlv_prep(hdr, chunks, payload, true); 921 + /* Prepare secondary tlv header */ 922 + hdr = (struct roce_tlv *)&tlv_req.ext_req; 923 + payload = sizeof(struct cmdq_modify_roce_cc_gen1_tlv) - 924 + sizeof(struct roce_tlv); 925 + __roce_ext_tlv_prep(hdr, TLV_TYPE_MODIFY_ROCE_CC_GEN1, payload, false, true); 926 + bnxt_qplib_fill_cc_gen1(&tlv_req.ext_req, &cc_param->cc_ext); 927 + } 928 + 929 + bnxt_qplib_fill_cmdqmsg(&msg, cmd, &resp, NULL, req_size, 930 + sizeof(resp), 0); 931 + rc = bnxt_qplib_rcfw_send_message(res->rcfw, &msg); 851 932 return rc; 852 933 }
+67 -1
drivers/infiniband/hw/bnxt_re/qplib_sp.h
··· 244 244 u64 rx_ecn_marked; 245 245 }; 246 246 247 + struct bnxt_qplib_cc_param_ext { 248 + u64 ext_mask; 249 + u16 inact_th_hi; 250 + u16 min_delta_cnp; 251 + u16 init_cp; 252 + u8 tr_update_mode; 253 + u8 tr_update_cyls; 254 + u8 fr_rtt; 255 + u8 ai_rate_incr; 256 + u16 rr_rtt_th; 257 + u16 ar_cr_th; 258 + u16 cr_min_th; 259 + u8 bw_avg_weight; 260 + u8 cr_factor; 261 + u16 cr_th_max_cp; 262 + u8 cp_bias_en; 263 + u8 cp_bias; 264 + u8 cnp_ecn; 265 + u8 rtt_jitter_en; 266 + u16 bytes_per_usec; 267 + u16 cc_cr_reset_th; 268 + u8 cr_width; 269 + u8 min_quota; 270 + u8 max_quota; 271 + u8 abs_max_quota; 272 + u16 tr_lb; 273 + u8 cr_prob_fac; 274 + u8 tr_prob_fac; 275 + u16 fair_cr_th; 276 + u8 red_div; 277 + u8 cnp_ratio_th; 278 + u16 ai_ext_rtt; 279 + u8 exp_crcp_ratio; 280 + u8 low_rate_en; 281 + u16 cpcr_update_th; 282 + u16 ai_rtt_th1; 283 + u16 ai_rtt_th2; 284 + u16 cf_rtt_th; 285 + u16 sc_cr_th1; /* severe congestion cr threshold 1 */ 286 + u16 sc_cr_th2; /* severe congestion cr threshold 2 */ 287 + u32 l64B_per_rtt; 288 + u8 cc_ack_bytes; 289 + u16 reduce_cf_rtt_th; 290 + }; 291 + 292 + struct bnxt_qplib_cc_param { 293 + u8 alt_vlan_pcp; 294 + u16 alt_tos_dscp; 295 + u8 cc_mode; 296 + u8 enable; 297 + u16 inact_th; 298 + u16 init_cr; 299 + u16 init_tr; 300 + u16 rtt; 301 + u8 g; 302 + u8 nph_per_state; 303 + u8 time_pph; 304 + u8 pkts_pph; 305 + u8 tos_ecn; 306 + u8 tos_dscp; 307 + u16 tcp_cp; 308 + struct bnxt_qplib_cc_param_ext cc_ext; 309 + u32 mask; 310 + }; 311 + 247 312 int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res, 248 313 struct bnxt_qplib_sgid_tbl *sgid_tbl, int index, 249 314 struct bnxt_qplib_gid *gid); ··· 342 277 struct bnxt_qplib_frpl *frpl, int max); 343 278 int bnxt_qplib_free_fast_reg_page_list(struct bnxt_qplib_res *res, 344 279 struct bnxt_qplib_frpl *frpl); 345 - int bnxt_qplib_map_tc2cos(struct bnxt_qplib_res *res, u16 *cids); 346 280 int bnxt_qplib_get_roce_stats(struct bnxt_qplib_rcfw *rcfw, 347 281 struct bnxt_qplib_roce_stats *stats); 348 282 int bnxt_qplib_qext_stat(struct bnxt_qplib_rcfw *rcfw, u32 fid, 349 283 struct bnxt_qplib_ext_stat *estat); 284 + int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res, 285 + struct bnxt_qplib_cc_param *cc_param); 350 286 351 287 #endif /* __BNXT_QPLIB_SP_H__*/
+162
drivers/infiniband/hw/bnxt_re/qplib_tlv.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2 + 3 + #ifndef __QPLIB_TLV_H__ 4 + #define __QPLIB_TLV_H__ 5 + 6 + struct roce_tlv { 7 + struct tlv tlv; 8 + u8 total_size; // in units of 16 byte chunks 9 + u8 unused[7]; // for 16 byte alignment 10 + }; 11 + 12 + #define CHUNK_SIZE 16 13 + #define CHUNKS(x) (((x) + CHUNK_SIZE - 1) / CHUNK_SIZE) 14 + 15 + static inline void __roce_1st_tlv_prep(struct roce_tlv *rtlv, u8 tot_chunks, 16 + u16 content_bytes, u8 flags) 17 + { 18 + rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP); 19 + rtlv->tlv.tlv_type = cpu_to_le16(TLV_TYPE_ROCE_SP_COMMAND); 20 + rtlv->tlv.length = cpu_to_le16(content_bytes); 21 + rtlv->tlv.flags = TLV_FLAGS_REQUIRED; 22 + rtlv->tlv.flags |= flags ? TLV_FLAGS_MORE : 0; 23 + rtlv->total_size = (tot_chunks); 24 + } 25 + 26 + static inline void __roce_ext_tlv_prep(struct roce_tlv *rtlv, u16 tlv_type, 27 + u16 content_bytes, u8 more, u8 flags) 28 + { 29 + rtlv->tlv.cmd_discr = cpu_to_le16(CMD_DISCR_TLV_ENCAP); 30 + rtlv->tlv.tlv_type = cpu_to_le16(tlv_type); 31 + rtlv->tlv.length = cpu_to_le16(content_bytes); 32 + rtlv->tlv.flags |= more ? TLV_FLAGS_MORE : 0; 33 + rtlv->tlv.flags |= flags ? TLV_FLAGS_REQUIRED : 0; 34 + } 35 + 36 + /* 37 + * TLV size in units of 16 byte chunks 38 + */ 39 + #define TLV_SIZE ((sizeof(struct roce_tlv) + 15) / 16) 40 + /* 41 + * TLV length in bytes 42 + */ 43 + #define TLV_BYTES (TLV_SIZE * 16) 44 + 45 + #define HAS_TLV_HEADER(msg) (le16_to_cpu(((struct tlv *)(msg))->cmd_discr) == CMD_DISCR_TLV_ENCAP) 46 + #define GET_TLV_DATA(tlv) ((void *)&((uint8_t *)(tlv))[TLV_BYTES]) 47 + 48 + static inline u8 __get_cmdq_base_opcode(struct cmdq_base *req, u32 size) 49 + { 50 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 51 + return ((struct cmdq_base *)GET_TLV_DATA(req))->opcode; 52 + else 53 + return req->opcode; 54 + } 55 + 56 + static inline void __set_cmdq_base_opcode(struct cmdq_base *req, 57 + u32 size, u8 val) 58 + { 59 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 60 + ((struct cmdq_base *)GET_TLV_DATA(req))->opcode = val; 61 + else 62 + req->opcode = val; 63 + } 64 + 65 + static inline __le16 __get_cmdq_base_cookie(struct cmdq_base *req, u32 size) 66 + { 67 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 68 + return ((struct cmdq_base *)GET_TLV_DATA(req))->cookie; 69 + else 70 + return req->cookie; 71 + } 72 + 73 + static inline void __set_cmdq_base_cookie(struct cmdq_base *req, 74 + u32 size, __le16 val) 75 + { 76 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 77 + ((struct cmdq_base *)GET_TLV_DATA(req))->cookie = val; 78 + else 79 + req->cookie = val; 80 + } 81 + 82 + static inline __le64 __get_cmdq_base_resp_addr(struct cmdq_base *req, u32 size) 83 + { 84 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 85 + return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr; 86 + else 87 + return req->resp_addr; 88 + } 89 + 90 + static inline void __set_cmdq_base_resp_addr(struct cmdq_base *req, 91 + u32 size, __le64 val) 92 + { 93 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 94 + ((struct cmdq_base *)GET_TLV_DATA(req))->resp_addr = val; 95 + else 96 + req->resp_addr = val; 97 + } 98 + 99 + static inline u8 __get_cmdq_base_resp_size(struct cmdq_base *req, u32 size) 100 + { 101 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 102 + return ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size; 103 + else 104 + return req->resp_size; 105 + } 106 + 107 + static inline void __set_cmdq_base_resp_size(struct cmdq_base *req, 108 + u32 size, u8 val) 109 + { 110 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 111 + ((struct cmdq_base *)GET_TLV_DATA(req))->resp_size = val; 112 + else 113 + req->resp_size = val; 114 + } 115 + 116 + static inline u8 __get_cmdq_base_cmd_size(struct cmdq_base *req, u32 size) 117 + { 118 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 119 + return ((struct roce_tlv *)(req))->total_size; 120 + else 121 + return req->cmd_size; 122 + } 123 + 124 + static inline void __set_cmdq_base_cmd_size(struct cmdq_base *req, 125 + u32 size, u8 val) 126 + { 127 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 128 + ((struct cmdq_base *)GET_TLV_DATA(req))->cmd_size = val; 129 + else 130 + req->cmd_size = val; 131 + } 132 + 133 + static inline __le16 __get_cmdq_base_flags(struct cmdq_base *req, u32 size) 134 + { 135 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 136 + return ((struct cmdq_base *)GET_TLV_DATA(req))->flags; 137 + else 138 + return req->flags; 139 + } 140 + 141 + static inline void __set_cmdq_base_flags(struct cmdq_base *req, 142 + u32 size, __le16 val) 143 + { 144 + if (HAS_TLV_HEADER(req) && size > TLV_BYTES) 145 + ((struct cmdq_base *)GET_TLV_DATA(req))->flags = val; 146 + else 147 + req->flags = val; 148 + } 149 + 150 + struct bnxt_qplib_tlv_modify_cc_req { 151 + struct roce_tlv tlv_hdr; 152 + struct cmdq_modify_roce_cc base_req; 153 + __le64 tlvpad; 154 + struct cmdq_modify_roce_cc_gen1_tlv ext_req; 155 + }; 156 + 157 + struct bnxt_qplib_tlv_query_rcc_sb { 158 + struct roce_tlv tlv_hdr; 159 + struct creq_query_roce_cc_resp_sb base_sb; 160 + struct creq_query_roce_cc_gen1_resp_sb_tlv gen1_sb; 161 + }; 162 + #endif /* __QPLIB_TLV_H__ */
+4213 -2942
drivers/infiniband/hw/bnxt_re/roce_hsi.h
··· 42 42 /* include bnxt_hsi.h from bnxt_en driver */ 43 43 #include "bnxt_hsi.h" 44 44 45 - /* CMP Door Bell Format (4 bytes) */ 45 + /* tx_doorbell (size:32b/4B) */ 46 + struct tx_doorbell { 47 + __le32 key_idx; 48 + #define TX_DOORBELL_IDX_MASK 0xffffffUL 49 + #define TX_DOORBELL_IDX_SFT 0 50 + #define TX_DOORBELL_KEY_MASK 0xf0000000UL 51 + #define TX_DOORBELL_KEY_SFT 28 52 + #define TX_DOORBELL_KEY_TX (0x0UL << 28) 53 + #define TX_DOORBELL_KEY_LAST TX_DOORBELL_KEY_TX 54 + }; 55 + 56 + /* rx_doorbell (size:32b/4B) */ 57 + struct rx_doorbell { 58 + __le32 key_idx; 59 + #define RX_DOORBELL_IDX_MASK 0xffffffUL 60 + #define RX_DOORBELL_IDX_SFT 0 61 + #define RX_DOORBELL_KEY_MASK 0xf0000000UL 62 + #define RX_DOORBELL_KEY_SFT 28 63 + #define RX_DOORBELL_KEY_RX (0x1UL << 28) 64 + #define RX_DOORBELL_KEY_LAST RX_DOORBELL_KEY_RX 65 + }; 66 + 67 + /* cmpl_doorbell (size:32b/4B) */ 46 68 struct cmpl_doorbell { 47 - __le32 key_mask_valid_idx; 48 - #define CMPL_DOORBELL_IDX_MASK 0xffffffUL 49 - #define CMPL_DOORBELL_IDX_SFT 0 50 - #define CMPL_DOORBELL_RESERVED_MASK 0x3000000UL 51 - #define CMPL_DOORBELL_RESERVED_SFT 24 52 - #define CMPL_DOORBELL_IDX_VALID 0x4000000UL 53 - #define CMPL_DOORBELL_MASK 0x8000000UL 54 - #define CMPL_DOORBELL_KEY_MASK 0xf0000000UL 55 - #define CMPL_DOORBELL_KEY_SFT 28 56 - #define CMPL_DOORBELL_KEY_CMPL (0x2UL << 28) 69 + __le32 key_mask_valid_idx; 70 + #define CMPL_DOORBELL_IDX_MASK 0xffffffUL 71 + #define CMPL_DOORBELL_IDX_SFT 0 72 + #define CMPL_DOORBELL_IDX_VALID 0x4000000UL 73 + #define CMPL_DOORBELL_MASK 0x8000000UL 74 + #define CMPL_DOORBELL_KEY_MASK 0xf0000000UL 75 + #define CMPL_DOORBELL_KEY_SFT 28 76 + #define CMPL_DOORBELL_KEY_CMPL (0x2UL << 28) 77 + #define CMPL_DOORBELL_KEY_LAST CMPL_DOORBELL_KEY_CMPL 57 78 }; 58 79 59 - /* Status Door Bell Format (4 bytes) */ 80 + /* status_doorbell (size:32b/4B) */ 60 81 struct status_doorbell { 61 - __le32 key_idx; 62 - #define STATUS_DOORBELL_IDX_MASK 0xffffffUL 63 - #define STATUS_DOORBELL_IDX_SFT 0 64 - #define STATUS_DOORBELL_RESERVED_MASK 0xf000000UL 65 - #define STATUS_DOORBELL_RESERVED_SFT 24 66 - #define STATUS_DOORBELL_KEY_MASK 0xf0000000UL 67 - #define STATUS_DOORBELL_KEY_SFT 28 68 - #define STATUS_DOORBELL_KEY_STAT (0x3UL << 28) 82 + __le32 key_idx; 83 + #define STATUS_DOORBELL_IDX_MASK 0xffffffUL 84 + #define STATUS_DOORBELL_IDX_SFT 0 85 + #define STATUS_DOORBELL_KEY_MASK 0xf0000000UL 86 + #define STATUS_DOORBELL_KEY_SFT 28 87 + #define STATUS_DOORBELL_KEY_STAT (0x3UL << 28) 88 + #define STATUS_DOORBELL_KEY_LAST STATUS_DOORBELL_KEY_STAT 69 89 }; 70 90 71 - /* RoCE Host Structures */ 72 - 73 - /* Doorbell Structures */ 74 - /* dbc_dbc (size:64b/8B) */ 75 - struct dbc_dbc { 76 - __le32 index; 77 - #define DBC_DBC_INDEX_MASK 0xffffffUL 78 - #define DBC_DBC_INDEX_SFT 0 79 - __le32 type_path_xid; 80 - #define DBC_DBC_XID_MASK 0xfffffUL 81 - #define DBC_DBC_XID_SFT 0 82 - #define DBC_DBC_PATH_MASK 0x3000000UL 83 - #define DBC_DBC_PATH_SFT 24 84 - #define DBC_DBC_PATH_ROCE (0x0UL << 24) 85 - #define DBC_DBC_PATH_L2 (0x1UL << 24) 86 - #define DBC_DBC_PATH_ENGINE (0x2UL << 24) 87 - #define DBC_DBC_PATH_LAST DBC_DBC_PATH_ENGINE 88 - #define DBC_DBC_DEBUG_TRACE 0x8000000UL 89 - #define DBC_DBC_TYPE_MASK 0xf0000000UL 90 - #define DBC_DBC_TYPE_SFT 28 91 - #define DBC_DBC_TYPE_SQ (0x0UL << 28) 92 - #define DBC_DBC_TYPE_RQ (0x1UL << 28) 93 - #define DBC_DBC_TYPE_SRQ (0x2UL << 28) 94 - #define DBC_DBC_TYPE_SRQ_ARM (0x3UL << 28) 95 - #define DBC_DBC_TYPE_CQ (0x4UL << 28) 96 - #define DBC_DBC_TYPE_CQ_ARMSE (0x5UL << 28) 97 - #define DBC_DBC_TYPE_CQ_ARMALL (0x6UL << 28) 98 - #define DBC_DBC_TYPE_CQ_ARMENA (0x7UL << 28) 99 - #define DBC_DBC_TYPE_SRQ_ARMENA (0x8UL << 28) 100 - #define DBC_DBC_TYPE_CQ_CUTOFF_ACK (0x9UL << 28) 101 - #define DBC_DBC_TYPE_NQ (0xaUL << 28) 102 - #define DBC_DBC_TYPE_NQ_ARM (0xbUL << 28) 103 - #define DBC_DBC_TYPE_NULL (0xfUL << 28) 104 - #define DBC_DBC_TYPE_LAST DBC_DBC_TYPE_NULL 105 - }; 106 - 107 - /* dbc_dbc32 (size:32b/4B) */ 108 - struct dbc_dbc32 { 109 - __le32 type_abs_incr_xid; 110 - #define DBC_DBC32_XID_MASK 0xfffffUL 111 - #define DBC_DBC32_XID_SFT 0 112 - #define DBC_DBC32_PATH_MASK 0xc00000UL 113 - #define DBC_DBC32_PATH_SFT 22 114 - #define DBC_DBC32_PATH_ROCE (0x0UL << 22) 115 - #define DBC_DBC32_PATH_L2 (0x1UL << 22) 116 - #define DBC_DBC32_PATH_LAST DBC_DBC32_PATH_L2 117 - #define DBC_DBC32_INCR_MASK 0xf000000UL 118 - #define DBC_DBC32_INCR_SFT 24 119 - #define DBC_DBC32_ABS 0x10000000UL 120 - #define DBC_DBC32_TYPE_MASK 0xe0000000UL 121 - #define DBC_DBC32_TYPE_SFT 29 122 - #define DBC_DBC32_TYPE_SQ (0x0UL << 29) 123 - #define DBC_DBC32_TYPE_LAST DBC_DBC32_TYPE_SQ 124 - }; 125 - 126 - /* SQ WQE Structures */ 127 - /* Base SQ WQE (8 bytes) */ 128 - struct sq_base { 129 - u8 wqe_type; 130 - #define SQ_BASE_WQE_TYPE_SEND 0x0UL 131 - #define SQ_BASE_WQE_TYPE_SEND_W_IMMEAD 0x1UL 132 - #define SQ_BASE_WQE_TYPE_SEND_W_INVALID 0x2UL 133 - #define SQ_BASE_WQE_TYPE_WRITE_WQE 0x4UL 134 - #define SQ_BASE_WQE_TYPE_WRITE_W_IMMEAD 0x5UL 135 - #define SQ_BASE_WQE_TYPE_READ_WQE 0x6UL 136 - #define SQ_BASE_WQE_TYPE_ATOMIC_CS 0x8UL 137 - #define SQ_BASE_WQE_TYPE_ATOMIC_FA 0xbUL 138 - #define SQ_BASE_WQE_TYPE_LOCAL_INVALID 0xcUL 139 - #define SQ_BASE_WQE_TYPE_FR_PMR 0xdUL 140 - #define SQ_BASE_WQE_TYPE_BIND 0xeUL 141 - u8 unused_0[7]; 142 - }; 143 - 144 - /* WQE SGE (16 bytes) */ 145 - struct sq_sge { 146 - __le64 va_or_pa; 147 - __le32 l_key; 148 - __le32 size; 149 - }; 150 - 151 - /* PSN Search Structure (8 bytes) */ 152 - struct sq_psn_search { 153 - __le32 opcode_start_psn; 154 - #define SQ_PSN_SEARCH_START_PSN_MASK 0xffffffUL 155 - #define SQ_PSN_SEARCH_START_PSN_SFT 0 156 - #define SQ_PSN_SEARCH_OPCODE_MASK 0xff000000UL 157 - #define SQ_PSN_SEARCH_OPCODE_SFT 24 158 - __le32 flags_next_psn; 159 - #define SQ_PSN_SEARCH_NEXT_PSN_MASK 0xffffffUL 160 - #define SQ_PSN_SEARCH_NEXT_PSN_SFT 0 161 - #define SQ_PSN_SEARCH_FLAGS_MASK 0xff000000UL 162 - #define SQ_PSN_SEARCH_FLAGS_SFT 24 163 - }; 164 - 165 - /* sq_psn_search_ext (size:128b/16B) */ 166 - struct sq_psn_search_ext { 167 - __le32 opcode_start_psn; 168 - #define SQ_PSN_SEARCH_EXT_START_PSN_MASK 0xffffffUL 169 - #define SQ_PSN_SEARCH_EXT_START_PSN_SFT 0 170 - #define SQ_PSN_SEARCH_EXT_OPCODE_MASK 0xff000000UL 171 - #define SQ_PSN_SEARCH_EXT_OPCODE_SFT 24 172 - __le32 flags_next_psn; 173 - #define SQ_PSN_SEARCH_EXT_NEXT_PSN_MASK 0xffffffUL 174 - #define SQ_PSN_SEARCH_EXT_NEXT_PSN_SFT 0 175 - #define SQ_PSN_SEARCH_EXT_FLAGS_MASK 0xff000000UL 176 - #define SQ_PSN_SEARCH_EXT_FLAGS_SFT 24 177 - __le16 start_slot_idx; 178 - __le16 reserved16; 179 - __le32 reserved32; 180 - }; 181 - 182 - /* Send SQ WQE (40 bytes) */ 183 - struct sq_send { 184 - u8 wqe_type; 185 - #define SQ_SEND_WQE_TYPE_SEND 0x0UL 186 - #define SQ_SEND_WQE_TYPE_SEND_W_IMMEAD 0x1UL 187 - #define SQ_SEND_WQE_TYPE_SEND_W_INVALID 0x2UL 188 - u8 flags; 189 - #define SQ_SEND_FLAGS_SIGNAL_COMP 0x1UL 190 - #define SQ_SEND_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 191 - #define SQ_SEND_FLAGS_UC_FENCE 0x4UL 192 - #define SQ_SEND_FLAGS_SE 0x8UL 193 - #define SQ_SEND_FLAGS_INLINE 0x10UL 194 - u8 wqe_size; 195 - u8 reserved8_1; 196 - __le32 inv_key_or_imm_data; 197 - __le32 length; 198 - __le32 q_key; 199 - __le32 dst_qp; 200 - #define SQ_SEND_DST_QP_MASK 0xffffffUL 201 - #define SQ_SEND_DST_QP_SFT 0 202 - #define SQ_SEND_RESERVED8_2_MASK 0xff000000UL 203 - #define SQ_SEND_RESERVED8_2_SFT 24 204 - __le32 avid; 205 - #define SQ_SEND_AVID_MASK 0xfffffUL 206 - #define SQ_SEND_AVID_SFT 0 207 - #define SQ_SEND_RESERVED_AVID_MASK 0xfff00000UL 208 - #define SQ_SEND_RESERVED_AVID_SFT 20 209 - __le64 reserved64; 210 - __le32 data[24]; 211 - }; 212 - 213 - /* sq_send_hdr (size:256b/32B) */ 214 - struct sq_send_hdr { 215 - u8 wqe_type; 216 - u8 flags; 217 - u8 wqe_size; 218 - u8 reserved8_1; 219 - __le32 inv_key_or_imm_data; 220 - __le32 length; 221 - __le32 q_key; 222 - __le32 dst_qp; 223 - __le32 avid; 224 - __le64 reserved64; 225 - }; 226 - 227 - /* Send Raw Ethernet and QP1 SQ WQE (40 bytes) */ 228 - struct sq_send_raweth_qp1 { 229 - u8 wqe_type; 230 - #define SQ_SEND_RAWETH_QP1_WQE_TYPE_SEND 0x0UL 231 - u8 flags; 232 - #define SQ_SEND_RAWETH_QP1_FLAGS_SIGNAL_COMP 0x1UL 233 - #define SQ_SEND_RAWETH_QP1_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 234 - #define SQ_SEND_RAWETH_QP1_FLAGS_UC_FENCE 0x4UL 235 - #define SQ_SEND_RAWETH_QP1_FLAGS_SE 0x8UL 236 - #define SQ_SEND_RAWETH_QP1_FLAGS_INLINE 0x10UL 237 - u8 wqe_size; 238 - u8 reserved8; 239 - __le16 lflags; 240 - #define SQ_SEND_RAWETH_QP1_LFLAGS_TCP_UDP_CHKSUM 0x1UL 241 - #define SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM 0x2UL 242 - #define SQ_SEND_RAWETH_QP1_LFLAGS_NOCRC 0x4UL 243 - #define SQ_SEND_RAWETH_QP1_LFLAGS_STAMP 0x8UL 244 - #define SQ_SEND_RAWETH_QP1_LFLAGS_T_IP_CHKSUM 0x10UL 245 - #define SQ_SEND_RAWETH_QP1_LFLAGS_RESERVED1_1 0x20UL 246 - #define SQ_SEND_RAWETH_QP1_LFLAGS_RESERVED1_2 0x40UL 247 - #define SQ_SEND_RAWETH_QP1_LFLAGS_RESERVED1_3 0x80UL 248 - #define SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC 0x100UL 249 - #define SQ_SEND_RAWETH_QP1_LFLAGS_FCOE_CRC 0x200UL 250 - __le16 cfa_action; 251 - __le32 length; 252 - __le32 reserved32_1; 253 - __le32 cfa_meta; 254 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_VID_MASK 0xfffUL 255 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_VID_SFT 0 256 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_DE 0x1000UL 257 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_PRI_MASK 0xe000UL 258 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_PRI_SFT 13 259 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_MASK 0x70000UL 260 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_SFT 16 261 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID88A8 (0x0UL << 16) 262 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID8100 (0x1UL << 16) 263 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9100 (0x2UL << 16) 264 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9200 (0x3UL << 16) 265 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9300 (0x4UL << 16) 266 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPIDCFG (0x5UL << 16) 267 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_LAST \ 268 - SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPIDCFG 269 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_RESERVED_MASK 0xff80000UL 270 - #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_RESERVED_SFT 19 271 - #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_MASK 0xf0000000UL 272 - #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_SFT 28 273 - #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_NONE (0x0UL << 28) 274 - #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_VLAN_TAG (0x1UL << 28) 275 - #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_LAST \ 276 - SQ_SEND_RAWETH_QP1_CFA_META_KEY_VLAN_TAG 277 - __le32 reserved32_2; 278 - __le64 reserved64; 279 - __le32 data[24]; 280 - }; 281 - 282 - /* sq_send_raweth_qp1_hdr (size:256b/32B) */ 283 - struct sq_send_raweth_qp1_hdr { 284 - u8 wqe_type; 285 - u8 flags; 286 - u8 wqe_size; 287 - u8 reserved8; 288 - __le16 lflags; 289 - __le16 cfa_action; 290 - __le32 length; 291 - __le32 reserved32_1; 292 - __le32 cfa_meta; 293 - __le32 reserved32_2; 294 - __le64 reserved64; 295 - }; 296 - 297 - /* RDMA SQ WQE (40 bytes) */ 298 - struct sq_rdma { 299 - u8 wqe_type; 300 - #define SQ_RDMA_WQE_TYPE_WRITE_WQE 0x4UL 301 - #define SQ_RDMA_WQE_TYPE_WRITE_W_IMMEAD 0x5UL 302 - #define SQ_RDMA_WQE_TYPE_READ_WQE 0x6UL 303 - u8 flags; 304 - #define SQ_RDMA_FLAGS_SIGNAL_COMP 0x1UL 305 - #define SQ_RDMA_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 306 - #define SQ_RDMA_FLAGS_UC_FENCE 0x4UL 307 - #define SQ_RDMA_FLAGS_SE 0x8UL 308 - #define SQ_RDMA_FLAGS_INLINE 0x10UL 309 - u8 wqe_size; 310 - u8 reserved8; 311 - __le32 imm_data; 312 - __le32 length; 313 - __le32 reserved32_1; 314 - __le64 remote_va; 315 - __le32 remote_key; 316 - __le32 reserved32_2; 317 - __le32 data[24]; 318 - }; 319 - 320 - /* sq_rdma_hdr (size:256b/32B) */ 321 - struct sq_rdma_hdr { 322 - u8 wqe_type; 323 - u8 flags; 324 - u8 wqe_size; 325 - u8 reserved8; 326 - __le32 imm_data; 327 - __le32 length; 328 - __le32 reserved32_1; 329 - __le64 remote_va; 330 - __le32 remote_key; 331 - __le32 reserved32_2; 332 - }; 333 - 334 - /* Atomic SQ WQE (40 bytes) */ 335 - struct sq_atomic { 336 - u8 wqe_type; 337 - #define SQ_ATOMIC_WQE_TYPE_ATOMIC_CS 0x8UL 338 - #define SQ_ATOMIC_WQE_TYPE_ATOMIC_FA 0xbUL 339 - u8 flags; 340 - #define SQ_ATOMIC_FLAGS_SIGNAL_COMP 0x1UL 341 - #define SQ_ATOMIC_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 342 - #define SQ_ATOMIC_FLAGS_UC_FENCE 0x4UL 343 - #define SQ_ATOMIC_FLAGS_SE 0x8UL 344 - #define SQ_ATOMIC_FLAGS_INLINE 0x10UL 345 - __le16 reserved16; 346 - __le32 remote_key; 347 - __le64 remote_va; 348 - __le64 swap_data; 349 - __le64 cmp_data; 350 - __le32 data[24]; 351 - }; 352 - 353 - /* sq_atomic_hdr (size:256b/32B) */ 354 - struct sq_atomic_hdr { 355 - u8 wqe_type; 356 - u8 flags; 357 - __le16 reserved16; 358 - __le32 remote_key; 359 - __le64 remote_va; 360 - __le64 swap_data; 361 - __le64 cmp_data; 362 - }; 363 - 364 - /* Local Invalidate SQ WQE (40 bytes) */ 365 - struct sq_localinvalidate { 366 - u8 wqe_type; 367 - #define SQ_LOCALINVALIDATE_WQE_TYPE_LOCAL_INVALID 0xcUL 368 - u8 flags; 369 - #define SQ_LOCALINVALIDATE_FLAGS_SIGNAL_COMP 0x1UL 370 - #define SQ_LOCALINVALIDATE_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 371 - #define SQ_LOCALINVALIDATE_FLAGS_UC_FENCE 0x4UL 372 - #define SQ_LOCALINVALIDATE_FLAGS_SE 0x8UL 373 - #define SQ_LOCALINVALIDATE_FLAGS_INLINE 0x10UL 374 - __le16 reserved16; 375 - __le32 inv_l_key; 376 - __le64 reserved64; 377 - __le32 reserved128[4]; 378 - __le32 data[24]; 379 - }; 380 - 381 - /* sq_localinvalidate_hdr (size:256b/32B) */ 382 - struct sq_localinvalidate_hdr { 383 - u8 wqe_type; 384 - u8 flags; 385 - __le16 reserved16; 386 - __le32 inv_l_key; 387 - __le64 reserved64; 388 - u8 reserved128[16]; 389 - }; 390 - 391 - /* FR-PMR SQ WQE (40 bytes) */ 392 - struct sq_fr_pmr { 393 - u8 wqe_type; 394 - #define SQ_FR_PMR_WQE_TYPE_FR_PMR 0xdUL 395 - u8 flags; 396 - #define SQ_FR_PMR_FLAGS_SIGNAL_COMP 0x1UL 397 - #define SQ_FR_PMR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 398 - #define SQ_FR_PMR_FLAGS_UC_FENCE 0x4UL 399 - #define SQ_FR_PMR_FLAGS_SE 0x8UL 400 - #define SQ_FR_PMR_FLAGS_INLINE 0x10UL 401 - u8 access_cntl; 402 - #define SQ_FR_PMR_ACCESS_CNTL_LOCAL_WRITE 0x1UL 403 - #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_READ 0x2UL 404 - #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_WRITE 0x4UL 405 - #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 406 - #define SQ_FR_PMR_ACCESS_CNTL_WINDOW_BIND 0x10UL 407 - u8 zero_based_page_size_log; 408 - #define SQ_FR_PMR_PAGE_SIZE_LOG_MASK 0x1fUL 409 - #define SQ_FR_PMR_PAGE_SIZE_LOG_SFT 0 410 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 411 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 412 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 413 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 414 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 415 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 416 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 417 - #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 418 - #define SQ_FR_PMR_ZERO_BASED 0x20UL 419 - #define SQ_FR_PMR_RESERVED2_MASK 0xc0UL 420 - #define SQ_FR_PMR_RESERVED2_SFT 6 421 - __le32 l_key; 422 - u8 length[5]; 423 - u8 reserved8_1; 424 - u8 reserved8_2; 425 - u8 numlevels_pbl_page_size_log; 426 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_MASK 0x1fUL 427 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_SFT 0 428 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 429 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 430 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 431 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 432 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 433 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 434 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 435 - #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 436 - #define SQ_FR_PMR_RESERVED1 0x20UL 437 - #define SQ_FR_PMR_NUMLEVELS_MASK 0xc0UL 438 - #define SQ_FR_PMR_NUMLEVELS_SFT 6 439 - #define SQ_FR_PMR_NUMLEVELS_PHYSICAL (0x0UL << 6) 440 - #define SQ_FR_PMR_NUMLEVELS_LAYER1 (0x1UL << 6) 441 - #define SQ_FR_PMR_NUMLEVELS_LAYER2 (0x2UL << 6) 442 - __le64 pblptr; 443 - __le64 va; 444 - __le32 data[24]; 445 - }; 446 - 447 - /* sq_fr_pmr_hdr (size:256b/32B) */ 448 - struct sq_fr_pmr_hdr { 449 - u8 wqe_type; 450 - u8 flags; 451 - u8 access_cntl; 452 - u8 zero_based_page_size_log; 453 - __le32 l_key; 454 - u8 length[5]; 455 - u8 reserved8_1; 456 - u8 reserved8_2; 457 - u8 numlevels_pbl_page_size_log; 458 - __le64 pblptr; 459 - __le64 va; 460 - }; 461 - 462 - /* Bind SQ WQE (40 bytes) */ 463 - struct sq_bind { 464 - u8 wqe_type; 465 - #define SQ_BIND_WQE_TYPE_BIND 0xeUL 466 - u8 flags; 467 - #define SQ_BIND_FLAGS_SIGNAL_COMP 0x1UL 468 - #define SQ_BIND_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 469 - #define SQ_BIND_FLAGS_UC_FENCE 0x4UL 470 - #define SQ_BIND_FLAGS_SE 0x8UL 471 - #define SQ_BIND_FLAGS_INLINE 0x10UL 472 - u8 access_cntl; 473 - #define SQ_BIND_ACCESS_CNTL_LOCAL_WRITE 0x1UL 474 - #define SQ_BIND_ACCESS_CNTL_REMOTE_READ 0x2UL 475 - #define SQ_BIND_ACCESS_CNTL_REMOTE_WRITE 0x4UL 476 - #define SQ_BIND_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 477 - #define SQ_BIND_ACCESS_CNTL_WINDOW_BIND 0x10UL 478 - u8 reserved8_1; 479 - u8 mw_type_zero_based; 480 - #define SQ_BIND_ZERO_BASED 0x1UL 481 - #define SQ_BIND_MW_TYPE 0x2UL 482 - #define SQ_BIND_MW_TYPE_TYPE1 (0x0UL << 1) 483 - #define SQ_BIND_MW_TYPE_TYPE2 (0x1UL << 1) 484 - #define SQ_BIND_RESERVED6_MASK 0xfcUL 485 - #define SQ_BIND_RESERVED6_SFT 2 486 - u8 reserved8_2; 487 - __le16 reserved16; 488 - __le32 parent_l_key; 489 - __le32 l_key; 490 - __le64 va; 491 - u8 length[5]; 492 - u8 data_reserved24[99]; 493 - #define SQ_BIND_RESERVED24_MASK 0xffffff00UL 494 - #define SQ_BIND_RESERVED24_SFT 8 495 - #define SQ_BIND_DATA_MASK 0xffffffffUL 496 - #define SQ_BIND_DATA_SFT 0 497 - }; 498 - 499 - /* sq_bind_hdr (size:256b/32B) */ 500 - struct sq_bind_hdr { 501 - u8 wqe_type; 502 - u8 flags; 503 - u8 access_cntl; 504 - u8 reserved8_1; 505 - u8 mw_type_zero_based; 506 - u8 reserved8_2; 507 - __le16 reserved16; 508 - __le32 parent_l_key; 509 - __le32 l_key; 510 - __le64 va; 511 - u8 length[5]; 512 - u8 reserved24[3]; 513 - }; 514 - 515 - /* RQ/SRQ WQE Structures */ 516 - /* RQ/SRQ WQE (40 bytes) */ 517 - struct rq_wqe { 518 - u8 wqe_type; 519 - #define RQ_WQE_WQE_TYPE_RCV 0x80UL 520 - u8 flags; 521 - u8 wqe_size; 522 - u8 reserved8; 523 - __le32 reserved32; 524 - __le32 wr_id[2]; 525 - #define RQ_WQE_WR_ID_MASK 0xfffffUL 526 - #define RQ_WQE_WR_ID_SFT 0 527 - #define RQ_WQE_RESERVED44_MASK 0xfff00000UL 528 - #define RQ_WQE_RESERVED44_SFT 20 529 - __le32 reserved128[4]; 530 - __le32 data[24]; 531 - }; 532 - 533 - /* rq_wqe_hdr (size:256b/32B) */ 534 - struct rq_wqe_hdr { 535 - u8 wqe_type; 536 - u8 flags; 537 - u8 wqe_size; 538 - u8 reserved8; 539 - __le32 reserved32; 540 - __le32 wr_id[2]; 541 - u8 reserved128[16]; 542 - }; 543 - 544 - /* CQ CQE Structures */ 545 - /* Base CQE (32 bytes) */ 546 - struct cq_base { 547 - __le64 reserved64_1; 548 - __le64 reserved64_2; 549 - __le64 reserved64_3; 550 - u8 cqe_type_toggle; 551 - #define CQ_BASE_TOGGLE 0x1UL 552 - #define CQ_BASE_CQE_TYPE_MASK 0x1eUL 553 - #define CQ_BASE_CQE_TYPE_SFT 1 554 - #define CQ_BASE_CQE_TYPE_REQ (0x0UL << 1) 555 - #define CQ_BASE_CQE_TYPE_RES_RC (0x1UL << 1) 556 - #define CQ_BASE_CQE_TYPE_RES_UD (0x2UL << 1) 557 - #define CQ_BASE_CQE_TYPE_RES_RAWETH_QP1 (0x3UL << 1) 558 - #define CQ_BASE_CQE_TYPE_TERMINAL (0xeUL << 1) 559 - #define CQ_BASE_CQE_TYPE_CUT_OFF (0xfUL << 1) 560 - #define CQ_BASE_RESERVED3_MASK 0xe0UL 561 - #define CQ_BASE_RESERVED3_SFT 5 562 - u8 status; 563 - __le16 reserved16; 564 - __le32 reserved32; 565 - }; 566 - 567 - /* Requester CQ CQE (32 bytes) */ 568 - struct cq_req { 569 - __le64 qp_handle; 570 - __le16 sq_cons_idx; 571 - __le16 reserved16_1; 572 - __le32 reserved32_2; 573 - __le64 reserved64; 574 - u8 cqe_type_toggle; 575 - #define CQ_REQ_TOGGLE 0x1UL 576 - #define CQ_REQ_CQE_TYPE_MASK 0x1eUL 577 - #define CQ_REQ_CQE_TYPE_SFT 1 578 - #define CQ_REQ_CQE_TYPE_REQ (0x0UL << 1) 579 - #define CQ_REQ_RESERVED3_MASK 0xe0UL 580 - #define CQ_REQ_RESERVED3_SFT 5 581 - u8 status; 582 - #define CQ_REQ_STATUS_OK 0x0UL 583 - #define CQ_REQ_STATUS_BAD_RESPONSE_ERR 0x1UL 584 - #define CQ_REQ_STATUS_LOCAL_LENGTH_ERR 0x2UL 585 - #define CQ_REQ_STATUS_LOCAL_QP_OPERATION_ERR 0x3UL 586 - #define CQ_REQ_STATUS_LOCAL_PROTECTION_ERR 0x4UL 587 - #define CQ_REQ_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 588 - #define CQ_REQ_STATUS_REMOTE_INVALID_REQUEST_ERR 0x6UL 589 - #define CQ_REQ_STATUS_REMOTE_ACCESS_ERR 0x7UL 590 - #define CQ_REQ_STATUS_REMOTE_OPERATION_ERR 0x8UL 591 - #define CQ_REQ_STATUS_RNR_NAK_RETRY_CNT_ERR 0x9UL 592 - #define CQ_REQ_STATUS_TRANSPORT_RETRY_CNT_ERR 0xaUL 593 - #define CQ_REQ_STATUS_WORK_REQUEST_FLUSHED_ERR 0xbUL 594 - __le16 reserved16_2; 595 - __le32 reserved32_1; 596 - }; 597 - 598 - /* Responder RC CQE (32 bytes) */ 599 - struct cq_res_rc { 600 - __le32 length; 601 - __le32 imm_data_or_inv_r_key; 602 - __le64 qp_handle; 603 - __le64 mr_handle; 604 - u8 cqe_type_toggle; 605 - #define CQ_RES_RC_TOGGLE 0x1UL 606 - #define CQ_RES_RC_CQE_TYPE_MASK 0x1eUL 607 - #define CQ_RES_RC_CQE_TYPE_SFT 1 608 - #define CQ_RES_RC_CQE_TYPE_RES_RC (0x1UL << 1) 609 - #define CQ_RES_RC_RESERVED3_MASK 0xe0UL 610 - #define CQ_RES_RC_RESERVED3_SFT 5 611 - u8 status; 612 - #define CQ_RES_RC_STATUS_OK 0x0UL 613 - #define CQ_RES_RC_STATUS_LOCAL_ACCESS_ERROR 0x1UL 614 - #define CQ_RES_RC_STATUS_LOCAL_LENGTH_ERR 0x2UL 615 - #define CQ_RES_RC_STATUS_LOCAL_PROTECTION_ERR 0x3UL 616 - #define CQ_RES_RC_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 617 - #define CQ_RES_RC_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 618 - #define CQ_RES_RC_STATUS_REMOTE_INVALID_REQUEST_ERR 0x6UL 619 - #define CQ_RES_RC_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 620 - #define CQ_RES_RC_STATUS_HW_FLUSH_ERR 0x8UL 621 - __le16 flags; 622 - #define CQ_RES_RC_FLAGS_SRQ 0x1UL 623 - #define CQ_RES_RC_FLAGS_SRQ_RQ (0x0UL << 0) 624 - #define CQ_RES_RC_FLAGS_SRQ_SRQ (0x1UL << 0) 625 - #define CQ_RES_RC_FLAGS_SRQ_LAST CQ_RES_RC_FLAGS_SRQ_SRQ 626 - #define CQ_RES_RC_FLAGS_IMM 0x2UL 627 - #define CQ_RES_RC_FLAGS_INV 0x4UL 628 - #define CQ_RES_RC_FLAGS_RDMA 0x8UL 629 - #define CQ_RES_RC_FLAGS_RDMA_SEND (0x0UL << 3) 630 - #define CQ_RES_RC_FLAGS_RDMA_RDMA_WRITE (0x1UL << 3) 631 - #define CQ_RES_RC_FLAGS_RDMA_LAST CQ_RES_RC_FLAGS_RDMA_RDMA_WRITE 632 - __le32 srq_or_rq_wr_id; 633 - #define CQ_RES_RC_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 634 - #define CQ_RES_RC_SRQ_OR_RQ_WR_ID_SFT 0 635 - #define CQ_RES_RC_RESERVED12_MASK 0xfff00000UL 636 - #define CQ_RES_RC_RESERVED12_SFT 20 637 - }; 638 - 639 - /* Responder UD CQE (32 bytes) */ 640 - struct cq_res_ud { 641 - __le16 length; 642 - #define CQ_RES_UD_LENGTH_MASK 0x3fffUL 643 - #define CQ_RES_UD_LENGTH_SFT 0 644 - __le16 cfa_metadata; 645 - #define CQ_RES_UD_CFA_METADATA_VID_MASK 0xfffUL 646 - #define CQ_RES_UD_CFA_METADATA_VID_SFT 0 647 - #define CQ_RES_UD_CFA_METADATA_DE 0x1000UL 648 - #define CQ_RES_UD_CFA_METADATA_PRI_MASK 0xe000UL 649 - #define CQ_RES_UD_CFA_METADATA_PRI_SFT 13 650 - __le32 imm_data; 651 - __le64 qp_handle; 652 - __le16 src_mac[3]; 653 - __le16 src_qp_low; 654 - u8 cqe_type_toggle; 655 - #define CQ_RES_UD_TOGGLE 0x1UL 656 - #define CQ_RES_UD_CQE_TYPE_MASK 0x1eUL 657 - #define CQ_RES_UD_CQE_TYPE_SFT 1 658 - #define CQ_RES_UD_CQE_TYPE_RES_UD (0x2UL << 1) 659 - u8 status; 660 - #define CQ_RES_UD_STATUS_OK 0x0UL 661 - #define CQ_RES_UD_STATUS_LOCAL_ACCESS_ERROR 0x1UL 662 - #define CQ_RES_UD_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 663 - #define CQ_RES_UD_STATUS_LOCAL_PROTECTION_ERR 0x3UL 664 - #define CQ_RES_UD_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 665 - #define CQ_RES_UD_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 666 - #define CQ_RES_UD_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 667 - #define CQ_RES_UD_STATUS_HW_FLUSH_ERR 0x8UL 668 - __le16 flags; 669 - #define CQ_RES_UD_FLAGS_SRQ 0x1UL 670 - #define CQ_RES_UD_FLAGS_SRQ_RQ (0x0UL << 0) 671 - #define CQ_RES_UD_FLAGS_SRQ_SRQ (0x1UL << 0) 672 - #define CQ_RES_UD_FLAGS_SRQ_LAST CQ_RES_UD_FLAGS_SRQ_SRQ 673 - #define CQ_RES_UD_FLAGS_IMM 0x2UL 674 - #define CQ_RES_UD_FLAGS_UNUSED_MASK 0xcUL 675 - #define CQ_RES_UD_FLAGS_UNUSED_SFT 2 676 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK 0x30UL 677 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT 4 678 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V1 (0x0UL << 4) 679 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV4 (0x2UL << 4) 680 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV6 (0x3UL << 4) 681 - #define CQ_RES_UD_FLAGS_ROCE_IP_VER_LAST \ 682 - CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV6 683 - #define CQ_RES_UD_FLAGS_META_FORMAT_MASK 0x3c0UL 684 - #define CQ_RES_UD_FLAGS_META_FORMAT_SFT 6 685 - #define CQ_RES_UD_FLAGS_META_FORMAT_NONE (0x0UL << 6) 686 - #define CQ_RES_UD_FLAGS_META_FORMAT_VLAN (0x1UL << 6) 687 - #define CQ_RES_UD_FLAGS_META_FORMAT_TUNNEL_ID (0x2UL << 6) 688 - #define CQ_RES_UD_FLAGS_META_FORMAT_CHDR_DATA (0x3UL << 6) 689 - #define CQ_RES_UD_FLAGS_META_FORMAT_HDR_OFFSET (0x4UL << 6) 690 - #define CQ_RES_UD_FLAGS_META_FORMAT_LAST \ 691 - CQ_RES_UD_FLAGS_META_FORMAT_HDR_OFFSET 692 - #define CQ_RES_UD_FLAGS_EXT_META_FORMAT_MASK 0xc00UL 693 - #define CQ_RES_UD_FLAGS_EXT_META_FORMAT_SFT 10 694 - 695 - __le32 src_qp_high_srq_or_rq_wr_id; 696 - #define CQ_RES_UD_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 697 - #define CQ_RES_UD_SRQ_OR_RQ_WR_ID_SFT 0 698 - #define CQ_RES_UD_SRC_QP_HIGH_MASK 0xff000000UL 699 - #define CQ_RES_UD_SRC_QP_HIGH_SFT 24 700 - }; 701 - 702 - /* Responder RawEth and QP1 CQE (32 bytes) */ 703 - struct cq_res_raweth_qp1 { 704 - __le16 length; 705 - #define CQ_RES_RAWETH_QP1_LENGTH_MASK 0x3fffUL 706 - #define CQ_RES_RAWETH_QP1_LENGTH_SFT 0 707 - #define CQ_RES_RAWETH_QP1_RESERVED2_MASK 0xc000UL 708 - #define CQ_RES_RAWETH_QP1_RESERVED2_SFT 14 709 - __le16 raweth_qp1_flags; 710 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ERROR 0x1UL 711 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_RESERVED5_1_MASK 0x3eUL 712 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_RESERVED5_1_SFT 1 713 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_MASK 0x3c0UL 714 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_SFT 6 715 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_NOT_KNOWN (0x0UL << 6) 716 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_IP (0x1UL << 6) 717 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_TCP (0x2UL << 6) 718 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_UDP (0x3UL << 6) 719 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_FCOE (0x4UL << 6) 720 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ROCE (0x5UL << 6) 721 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ICMP (0x7UL << 6) 722 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_WO_TIMESTAMP \ 723 - (0x8UL << 6) 724 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP \ 725 - (0x9UL << 6) 726 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_LAST \ 727 - CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP 728 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_MASK 0x3ffUL 729 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_SFT 0 730 - #define CQ_RES_RAWETH_QP1_RESERVED6_MASK 0xfc00UL 731 - #define CQ_RES_RAWETH_QP1_RESERVED6_SFT 10 732 - __le16 raweth_qp1_errors; 733 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_RESERVED4_MASK 0xfUL 734 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_RESERVED4_SFT 0 735 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_IP_CS_ERROR 0x10UL 736 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_L4_CS_ERROR 0x20UL 737 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_IP_CS_ERROR 0x40UL 738 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_L4_CS_ERROR 0x80UL 739 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_CRC_ERROR 0x100UL 740 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_MASK 0xe00UL 741 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_SFT 9 742 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_NO_ERROR \ 743 - (0x0UL << 9) 744 - #define \ 745 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION \ 746 - (0x1UL << 9) 747 - #define \ 748 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN \ 749 - (0x2UL << 9) 750 - #define \ 751 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR \ 752 - (0x3UL << 9) 753 - #define \ 754 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR \ 755 - (0x4UL << 9) 756 - #define \ 757 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR \ 758 - (0x5UL << 9) 759 - #define \ 760 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL \ 761 - (0x6UL << 9) 762 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_LAST \ 763 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL 764 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_MASK 0xf000UL 765 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_SFT 12 766 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_NO_ERROR \ 767 - (0x0UL << 12) 768 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_VERSION \ 769 - (0x1UL << 12) 770 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN \ 771 - (0x2UL << 12) 772 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_TTL \ 773 - (0x3UL << 12) 774 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_IP_TOTAL_ERROR \ 775 - (0x4UL << 12) 776 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR \ 777 - (0x5UL << 12) 778 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN \ 779 - (0x6UL << 12) 780 - #define \ 781 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL\ 782 - (0x7UL << 12) 783 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN \ 784 - (0x8UL << 12) 785 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_LAST \ 786 - CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN 787 - __le16 raweth_qp1_cfa_code; 788 - __le64 qp_handle; 789 - __le32 raweth_qp1_flags2; 790 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_CS_CALC 0x1UL 791 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_L4_CS_CALC 0x2UL 792 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_T_IP_CS_CALC 0x4UL 793 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_T_L4_CS_CALC 0x8UL 794 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_MASK 0xf0UL 795 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_SFT 4 796 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_NONE \ 797 - (0x0UL << 4) 798 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN \ 799 - (0x1UL << 4) 800 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_LAST\ 801 - CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN 802 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_TYPE 0x100UL 803 - __le32 raweth_qp1_metadata; 804 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_MASK 0xfffUL 805 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_SFT 0 806 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_DE 0x1000UL 807 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_MASK 0xe000UL 808 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_SFT 13 809 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_MASK 0xffff0000UL 810 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_SFT 16 811 - u8 cqe_type_toggle; 812 - #define CQ_RES_RAWETH_QP1_TOGGLE 0x1UL 813 - #define CQ_RES_RAWETH_QP1_CQE_TYPE_MASK 0x1eUL 814 - #define CQ_RES_RAWETH_QP1_CQE_TYPE_SFT 1 815 - #define CQ_RES_RAWETH_QP1_CQE_TYPE_RES_RAWETH_QP1 (0x3UL << 1) 816 - #define CQ_RES_RAWETH_QP1_RESERVED3_MASK 0xe0UL 817 - #define CQ_RES_RAWETH_QP1_RESERVED3_SFT 5 818 - u8 status; 819 - #define CQ_RES_RAWETH_QP1_STATUS_OK 0x0UL 820 - #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_ACCESS_ERROR 0x1UL 821 - #define CQ_RES_RAWETH_QP1_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 822 - #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_PROTECTION_ERR 0x3UL 823 - #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 824 - #define CQ_RES_RAWETH_QP1_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 825 - #define CQ_RES_RAWETH_QP1_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 826 - #define CQ_RES_RAWETH_QP1_STATUS_HW_FLUSH_ERR 0x8UL 827 - __le16 flags; 828 - #define CQ_RES_RAWETH_QP1_FLAGS_SRQ 0x1UL 829 - #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_RQ 0x0UL 830 - #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_SRQ 0x1UL 831 - #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_LAST \ 832 - CQ_RES_RAWETH_QP1_FLAGS_SRQ_SRQ 833 - __le32 raweth_qp1_payload_offset_srq_or_rq_wr_id; 834 - #define CQ_RES_RAWETH_QP1_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 835 - #define CQ_RES_RAWETH_QP1_SRQ_OR_RQ_WR_ID_SFT 0 836 - #define CQ_RES_RAWETH_QP1_RESERVED4_MASK 0xf00000UL 837 - #define CQ_RES_RAWETH_QP1_RESERVED4_SFT 20 838 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_PAYLOAD_OFFSET_MASK 0xff000000UL 839 - #define CQ_RES_RAWETH_QP1_RAWETH_QP1_PAYLOAD_OFFSET_SFT 24 840 - }; 841 - 842 - /* Terminal CQE (32 bytes) */ 843 - struct cq_terminal { 844 - __le64 qp_handle; 845 - __le16 sq_cons_idx; 846 - __le16 rq_cons_idx; 847 - __le32 reserved32_1; 848 - __le64 reserved64_3; 849 - u8 cqe_type_toggle; 850 - #define CQ_TERMINAL_TOGGLE 0x1UL 851 - #define CQ_TERMINAL_CQE_TYPE_MASK 0x1eUL 852 - #define CQ_TERMINAL_CQE_TYPE_SFT 1 853 - #define CQ_TERMINAL_CQE_TYPE_TERMINAL (0xeUL << 1) 854 - #define CQ_TERMINAL_RESERVED3_MASK 0xe0UL 855 - #define CQ_TERMINAL_RESERVED3_SFT 5 856 - u8 status; 857 - #define CQ_TERMINAL_STATUS_OK 0x0UL 858 - __le16 reserved16; 859 - __le32 reserved32_2; 860 - }; 861 - 862 - /* Cutoff CQE (32 bytes) */ 863 - struct cq_cutoff { 864 - __le64 reserved64_1; 865 - __le64 reserved64_2; 866 - __le64 reserved64_3; 867 - u8 cqe_type_toggle; 868 - #define CQ_CUTOFF_TOGGLE 0x1UL 869 - #define CQ_CUTOFF_CQE_TYPE_MASK 0x1eUL 870 - #define CQ_CUTOFF_CQE_TYPE_SFT 1 871 - #define CQ_CUTOFF_CQE_TYPE_CUT_OFF (0xfUL << 1) 872 - #define CQ_CUTOFF_RESERVED3_MASK 0xe0UL 873 - #define CQ_CUTOFF_RESERVED3_SFT 5 874 - u8 status; 875 - #define CQ_CUTOFF_STATUS_OK 0x0UL 876 - __le16 reserved16; 877 - __le32 reserved32; 878 - }; 879 - 880 - /* Notification Queue (NQ) Structures */ 881 - /* Base NQ Record (16 bytes) */ 882 - struct nq_base { 883 - __le16 info10_type; 884 - #define NQ_BASE_TYPE_MASK 0x3fUL 885 - #define NQ_BASE_TYPE_SFT 0 886 - #define NQ_BASE_TYPE_CQ_NOTIFICATION 0x30UL 887 - #define NQ_BASE_TYPE_SRQ_EVENT 0x32UL 888 - #define NQ_BASE_TYPE_DBQ_EVENT 0x34UL 889 - #define NQ_BASE_TYPE_QP_EVENT 0x38UL 890 - #define NQ_BASE_TYPE_FUNC_EVENT 0x3aUL 891 - #define NQ_BASE_INFO10_MASK 0xffc0UL 892 - #define NQ_BASE_INFO10_SFT 6 893 - __le16 info16; 894 - __le32 info32; 895 - __le32 info63_v[2]; 896 - #define NQ_BASE_V 0x1UL 897 - #define NQ_BASE_INFO63_MASK 0xfffffffeUL 898 - #define NQ_BASE_INFO63_SFT 1 899 - }; 900 - 901 - /* Completion Queue Notification (16 bytes) */ 902 - struct nq_cn { 903 - __le16 type; 904 - #define NQ_CN_TYPE_MASK 0x3fUL 905 - #define NQ_CN_TYPE_SFT 0 906 - #define NQ_CN_TYPE_CQ_NOTIFICATION 0x30UL 907 - #define NQ_CN_RESERVED9_MASK 0xffc0UL 908 - #define NQ_CN_RESERVED9_SFT 6 909 - __le16 reserved16; 910 - __le32 cq_handle_low; 911 - __le32 v; 912 - #define NQ_CN_V 0x1UL 913 - #define NQ_CN_RESERVED31_MASK 0xfffffffeUL 914 - #define NQ_CN_RESERVED31_SFT 1 915 - __le32 cq_handle_high; 916 - }; 917 - 918 - /* SRQ Event Notification (16 bytes) */ 919 - struct nq_srq_event { 920 - u8 type; 921 - #define NQ_SRQ_EVENT_TYPE_MASK 0x3fUL 922 - #define NQ_SRQ_EVENT_TYPE_SFT 0 923 - #define NQ_SRQ_EVENT_TYPE_SRQ_EVENT 0x32UL 924 - #define NQ_SRQ_EVENT_RESERVED1_MASK 0xc0UL 925 - #define NQ_SRQ_EVENT_RESERVED1_SFT 6 926 - u8 event; 927 - #define NQ_SRQ_EVENT_EVENT_SRQ_THRESHOLD_EVENT 0x1UL 928 - __le16 reserved16; 929 - __le32 srq_handle_low; 930 - __le32 v; 931 - #define NQ_SRQ_EVENT_V 0x1UL 932 - #define NQ_SRQ_EVENT_RESERVED31_MASK 0xfffffffeUL 933 - #define NQ_SRQ_EVENT_RESERVED31_SFT 1 934 - __le32 srq_handle_high; 935 - }; 936 - 937 - /* DBQ Async Event Notification (16 bytes) */ 938 - struct nq_dbq_event { 939 - u8 type; 940 - #define NQ_DBQ_EVENT_TYPE_MASK 0x3fUL 941 - #define NQ_DBQ_EVENT_TYPE_SFT 0 942 - #define NQ_DBQ_EVENT_TYPE_DBQ_EVENT 0x34UL 943 - #define NQ_DBQ_EVENT_RESERVED1_MASK 0xc0UL 944 - #define NQ_DBQ_EVENT_RESERVED1_SFT 6 945 - u8 event; 946 - #define NQ_DBQ_EVENT_EVENT_DBQ_THRESHOLD_EVENT 0x1UL 947 - __le16 db_pfid; 948 - #define NQ_DBQ_EVENT_DB_PFID_MASK 0xfUL 949 - #define NQ_DBQ_EVENT_DB_PFID_SFT 0 950 - #define NQ_DBQ_EVENT_RESERVED12_MASK 0xfff0UL 951 - #define NQ_DBQ_EVENT_RESERVED12_SFT 4 952 - __le32 db_dpi; 953 - #define NQ_DBQ_EVENT_DB_DPI_MASK 0xfffffUL 954 - #define NQ_DBQ_EVENT_DB_DPI_SFT 0 955 - #define NQ_DBQ_EVENT_RESERVED12_2_MASK 0xfff00000UL 956 - #define NQ_DBQ_EVENT_RESERVED12_2_SFT 20 957 - __le32 v; 958 - #define NQ_DBQ_EVENT_V 0x1UL 959 - #define NQ_DBQ_EVENT_RESERVED32_MASK 0xfffffffeUL 960 - #define NQ_DBQ_EVENT_RESERVED32_SFT 1 961 - __le32 db_type_db_xid; 962 - #define NQ_DBQ_EVENT_DB_XID_MASK 0xfffffUL 963 - #define NQ_DBQ_EVENT_DB_XID_SFT 0 964 - #define NQ_DBQ_EVENT_RESERVED8_MASK 0xff00000UL 965 - #define NQ_DBQ_EVENT_RESERVED8_SFT 20 966 - #define NQ_DBQ_EVENT_DB_TYPE_MASK 0xf0000000UL 967 - #define NQ_DBQ_EVENT_DB_TYPE_SFT 28 968 - }; 969 - 970 - /* Read Request/Response Queue Structures */ 971 - /* Input Read Request Queue (IRRQ) Message (32 bytes) */ 972 - struct xrrq_irrq { 973 - __le16 credits_type; 974 - #define XRRQ_IRRQ_TYPE 0x1UL 975 - #define XRRQ_IRRQ_TYPE_READ_REQ 0x0UL 976 - #define XRRQ_IRRQ_TYPE_ATOMIC_REQ 0x1UL 977 - #define XRRQ_IRRQ_RESERVED10_MASK 0x7feUL 978 - #define XRRQ_IRRQ_RESERVED10_SFT 1 979 - #define XRRQ_IRRQ_CREDITS_MASK 0xf800UL 980 - #define XRRQ_IRRQ_CREDITS_SFT 11 981 - __le16 reserved16; 982 - __le32 reserved32; 983 - __le32 psn; 984 - #define XRRQ_IRRQ_PSN_MASK 0xffffffUL 985 - #define XRRQ_IRRQ_PSN_SFT 0 986 - #define XRRQ_IRRQ_RESERVED8_1_MASK 0xff000000UL 987 - #define XRRQ_IRRQ_RESERVED8_1_SFT 24 988 - __le32 msn; 989 - #define XRRQ_IRRQ_MSN_MASK 0xffffffUL 990 - #define XRRQ_IRRQ_MSN_SFT 0 991 - #define XRRQ_IRRQ_RESERVED8_2_MASK 0xff000000UL 992 - #define XRRQ_IRRQ_RESERVED8_2_SFT 24 993 - __le64 va_or_atomic_result; 994 - __le32 rdma_r_key; 995 - __le32 length; 996 - }; 997 - 998 - /* Output Read Request Queue (ORRQ) Message (32 bytes) */ 999 - struct xrrq_orrq { 1000 - __le16 num_sges_type; 1001 - #define XRRQ_ORRQ_TYPE 0x1UL 1002 - #define XRRQ_ORRQ_TYPE_READ_REQ 0x0UL 1003 - #define XRRQ_ORRQ_TYPE_ATOMIC_REQ 0x1UL 1004 - #define XRRQ_ORRQ_RESERVED10_MASK 0x7feUL 1005 - #define XRRQ_ORRQ_RESERVED10_SFT 1 1006 - #define XRRQ_ORRQ_NUM_SGES_MASK 0xf800UL 1007 - #define XRRQ_ORRQ_NUM_SGES_SFT 11 1008 - __le16 reserved16; 1009 - __le32 length; 1010 - __le32 psn; 1011 - #define XRRQ_ORRQ_PSN_MASK 0xffffffUL 1012 - #define XRRQ_ORRQ_PSN_SFT 0 1013 - #define XRRQ_ORRQ_RESERVED8_1_MASK 0xff000000UL 1014 - #define XRRQ_ORRQ_RESERVED8_1_SFT 24 1015 - __le32 end_psn; 1016 - #define XRRQ_ORRQ_END_PSN_MASK 0xffffffUL 1017 - #define XRRQ_ORRQ_END_PSN_SFT 0 1018 - #define XRRQ_ORRQ_RESERVED8_2_MASK 0xff000000UL 1019 - #define XRRQ_ORRQ_RESERVED8_2_SFT 24 1020 - __le64 first_sge_phy_or_sing_sge_va; 1021 - __le32 single_sge_l_key; 1022 - __le32 single_sge_size; 1023 - }; 1024 - 1025 - /* Page Buffer List Memory Structures (PBL) */ 1026 - /* Page Table Entry (PTE) (8 bytes) */ 1027 - struct ptu_pte { 1028 - __le32 page_next_to_last_last_valid[2]; 1029 - #define PTU_PTE_VALID 0x1UL 1030 - #define PTU_PTE_LAST 0x2UL 1031 - #define PTU_PTE_NEXT_TO_LAST 0x4UL 1032 - #define PTU_PTE_PAGE_MASK 0xfffff000UL 1033 - #define PTU_PTE_PAGE_SFT 12 1034 - }; 1035 - 1036 - /* Page Directory Entry (PDE) (8 bytes) */ 1037 - struct ptu_pde { 1038 - __le32 page_valid[2]; 1039 - #define PTU_PDE_VALID 0x1UL 1040 - #define PTU_PDE_PAGE_MASK 0xfffff000UL 1041 - #define PTU_PDE_PAGE_SFT 12 1042 - }; 1043 - 1044 - /* RoCE Fastpath Host Structures */ 1045 - /* Command Queue (CMDQ) Interface */ 1046 - /* Init CMDQ (16 bytes) */ 91 + /* cmdq_init (size:128b/16B) */ 1047 92 struct cmdq_init { 1048 - __le64 cmdq_pbl; 1049 - __le16 cmdq_size_cmdq_lvl; 1050 - #define CMDQ_INIT_CMDQ_LVL_MASK 0x3UL 1051 - #define CMDQ_INIT_CMDQ_LVL_SFT 0 1052 - #define CMDQ_INIT_CMDQ_SIZE_MASK 0xfffcUL 1053 - #define CMDQ_INIT_CMDQ_SIZE_SFT 2 1054 - __le16 creq_ring_id; 1055 - __le32 prod_idx; 93 + __le64 cmdq_pbl; 94 + __le16 cmdq_size_cmdq_lvl; 95 + #define CMDQ_INIT_CMDQ_LVL_MASK 0x3UL 96 + #define CMDQ_INIT_CMDQ_LVL_SFT 0 97 + #define CMDQ_INIT_CMDQ_SIZE_MASK 0xfffcUL 98 + #define CMDQ_INIT_CMDQ_SIZE_SFT 2 99 + __le16 creq_ring_id; 100 + __le32 prod_idx; 1056 101 }; 1057 102 1058 - /* Update CMDQ producer index (16 bytes) */ 1059 - struct cmdq_update { 1060 - __le64 reserved64; 1061 - __le32 reserved32; 1062 - __le32 prod_idx; 1063 - }; 1064 - 1065 - /* CMDQ common header structure (16 bytes) */ 103 + /* cmdq_base (size:128b/16B) */ 1066 104 struct cmdq_base { 1067 - u8 opcode; 1068 - #define CMDQ_BASE_OPCODE_CREATE_QP 0x1UL 1069 - #define CMDQ_BASE_OPCODE_DESTROY_QP 0x2UL 1070 - #define CMDQ_BASE_OPCODE_MODIFY_QP 0x3UL 1071 - #define CMDQ_BASE_OPCODE_QUERY_QP 0x4UL 1072 - #define CMDQ_BASE_OPCODE_CREATE_SRQ 0x5UL 1073 - #define CMDQ_BASE_OPCODE_DESTROY_SRQ 0x6UL 1074 - #define CMDQ_BASE_OPCODE_QUERY_SRQ 0x8UL 1075 - #define CMDQ_BASE_OPCODE_CREATE_CQ 0x9UL 1076 - #define CMDQ_BASE_OPCODE_DESTROY_CQ 0xaUL 1077 - #define CMDQ_BASE_OPCODE_RESIZE_CQ 0xcUL 1078 - #define CMDQ_BASE_OPCODE_ALLOCATE_MRW 0xdUL 1079 - #define CMDQ_BASE_OPCODE_DEALLOCATE_KEY 0xeUL 1080 - #define CMDQ_BASE_OPCODE_REGISTER_MR 0xfUL 1081 - #define CMDQ_BASE_OPCODE_DEREGISTER_MR 0x10UL 1082 - #define CMDQ_BASE_OPCODE_ADD_GID 0x11UL 1083 - #define CMDQ_BASE_OPCODE_DELETE_GID 0x12UL 1084 - #define CMDQ_BASE_OPCODE_MODIFY_GID 0x17UL 1085 - #define CMDQ_BASE_OPCODE_QUERY_GID 0x18UL 1086 - #define CMDQ_BASE_OPCODE_CREATE_QP1 0x13UL 1087 - #define CMDQ_BASE_OPCODE_DESTROY_QP1 0x14UL 1088 - #define CMDQ_BASE_OPCODE_CREATE_AH 0x15UL 1089 - #define CMDQ_BASE_OPCODE_DESTROY_AH 0x16UL 1090 - #define CMDQ_BASE_OPCODE_INITIALIZE_FW 0x80UL 1091 - #define CMDQ_BASE_OPCODE_DEINITIALIZE_FW 0x81UL 1092 - #define CMDQ_BASE_OPCODE_STOP_FUNC 0x82UL 1093 - #define CMDQ_BASE_OPCODE_QUERY_FUNC 0x83UL 1094 - #define CMDQ_BASE_OPCODE_SET_FUNC_RESOURCES 0x84UL 1095 - #define CMDQ_BASE_OPCODE_READ_CONTEXT 0x85UL 1096 - #define CMDQ_BASE_OPCODE_VF_BACKCHANNEL_REQUEST 0x86UL 1097 - #define CMDQ_BASE_OPCODE_READ_VF_MEMORY 0x87UL 1098 - #define CMDQ_BASE_OPCODE_COMPLETE_VF_REQUEST 0x88UL 1099 - #define CMDQ_BASE_OPCODE_EXTEND_CONTEXT_ARRRAY 0x89UL 1100 - #define CMDQ_BASE_OPCODE_MAP_TC_TO_COS 0x8aUL 1101 - #define CMDQ_BASE_OPCODE_QUERY_VERSION 0x8bUL 1102 - #define CMDQ_BASE_OPCODE_MODIFY_CC 0x8cUL 1103 - #define CMDQ_BASE_OPCODE_QUERY_CC 0x8dUL 1104 - #define CMDQ_BASE_OPCODE_QUERY_ROCE_STATS 0x8eUL 1105 - #define CMDQ_BASE_OPCODE_QUERY_ROCE_STATS_EXT 0x92UL 1106 - u8 cmd_size; 1107 - __le16 flags; 1108 - __le16 cookie; 1109 - u8 resp_size; 1110 - u8 reserved8; 1111 - __le64 resp_addr; 105 + u8 opcode; 106 + #define CMDQ_BASE_OPCODE_CREATE_QP 0x1UL 107 + #define CMDQ_BASE_OPCODE_DESTROY_QP 0x2UL 108 + #define CMDQ_BASE_OPCODE_MODIFY_QP 0x3UL 109 + #define CMDQ_BASE_OPCODE_QUERY_QP 0x4UL 110 + #define CMDQ_BASE_OPCODE_CREATE_SRQ 0x5UL 111 + #define CMDQ_BASE_OPCODE_DESTROY_SRQ 0x6UL 112 + #define CMDQ_BASE_OPCODE_QUERY_SRQ 0x8UL 113 + #define CMDQ_BASE_OPCODE_CREATE_CQ 0x9UL 114 + #define CMDQ_BASE_OPCODE_DESTROY_CQ 0xaUL 115 + #define CMDQ_BASE_OPCODE_RESIZE_CQ 0xcUL 116 + #define CMDQ_BASE_OPCODE_ALLOCATE_MRW 0xdUL 117 + #define CMDQ_BASE_OPCODE_DEALLOCATE_KEY 0xeUL 118 + #define CMDQ_BASE_OPCODE_REGISTER_MR 0xfUL 119 + #define CMDQ_BASE_OPCODE_DEREGISTER_MR 0x10UL 120 + #define CMDQ_BASE_OPCODE_ADD_GID 0x11UL 121 + #define CMDQ_BASE_OPCODE_DELETE_GID 0x12UL 122 + #define CMDQ_BASE_OPCODE_MODIFY_GID 0x17UL 123 + #define CMDQ_BASE_OPCODE_QUERY_GID 0x18UL 124 + #define CMDQ_BASE_OPCODE_CREATE_QP1 0x13UL 125 + #define CMDQ_BASE_OPCODE_DESTROY_QP1 0x14UL 126 + #define CMDQ_BASE_OPCODE_CREATE_AH 0x15UL 127 + #define CMDQ_BASE_OPCODE_DESTROY_AH 0x16UL 128 + #define CMDQ_BASE_OPCODE_INITIALIZE_FW 0x80UL 129 + #define CMDQ_BASE_OPCODE_DEINITIALIZE_FW 0x81UL 130 + #define CMDQ_BASE_OPCODE_STOP_FUNC 0x82UL 131 + #define CMDQ_BASE_OPCODE_QUERY_FUNC 0x83UL 132 + #define CMDQ_BASE_OPCODE_SET_FUNC_RESOURCES 0x84UL 133 + #define CMDQ_BASE_OPCODE_READ_CONTEXT 0x85UL 134 + #define CMDQ_BASE_OPCODE_VF_BACKCHANNEL_REQUEST 0x86UL 135 + #define CMDQ_BASE_OPCODE_READ_VF_MEMORY 0x87UL 136 + #define CMDQ_BASE_OPCODE_COMPLETE_VF_REQUEST 0x88UL 137 + #define CMDQ_BASE_OPCODE_EXTEND_CONTEXT_ARRRAY 0x89UL 138 + #define CMDQ_BASE_OPCODE_MAP_TC_TO_COS 0x8aUL 139 + #define CMDQ_BASE_OPCODE_QUERY_VERSION 0x8bUL 140 + #define CMDQ_BASE_OPCODE_MODIFY_ROCE_CC 0x8cUL 141 + #define CMDQ_BASE_OPCODE_QUERY_ROCE_CC 0x8dUL 142 + #define CMDQ_BASE_OPCODE_QUERY_ROCE_STATS 0x8eUL 143 + #define CMDQ_BASE_OPCODE_SET_LINK_AGGR_MODE 0x8fUL 144 + #define CMDQ_BASE_OPCODE_MODIFY_CQ 0x90UL 145 + #define CMDQ_BASE_OPCODE_QUERY_QP_EXTEND 0x91UL 146 + #define CMDQ_BASE_OPCODE_QUERY_ROCE_STATS_EXT 0x92UL 147 + #define CMDQ_BASE_OPCODE_LAST CMDQ_BASE_OPCODE_QUERY_ROCE_STATS_EXT 148 + u8 cmd_size; 149 + __le16 flags; 150 + __le16 cookie; 151 + u8 resp_size; 152 + u8 reserved8; 153 + __le64 resp_addr; 1112 154 }; 1113 155 1114 - /* Create QP command (96 bytes) */ 156 + /* creq_base (size:128b/16B) */ 157 + struct creq_base { 158 + u8 type; 159 + #define CREQ_BASE_TYPE_MASK 0x3fUL 160 + #define CREQ_BASE_TYPE_SFT 0 161 + #define CREQ_BASE_TYPE_QP_EVENT 0x38UL 162 + #define CREQ_BASE_TYPE_FUNC_EVENT 0x3aUL 163 + #define CREQ_BASE_TYPE_LAST CREQ_BASE_TYPE_FUNC_EVENT 164 + u8 reserved56[7]; 165 + u8 v; 166 + #define CREQ_BASE_V 0x1UL 167 + u8 event; 168 + u8 reserved48[6]; 169 + }; 170 + 171 + /* cmdq_query_version (size:128b/16B) */ 172 + struct cmdq_query_version { 173 + u8 opcode; 174 + #define CMDQ_QUERY_VERSION_OPCODE_QUERY_VERSION 0x8bUL 175 + #define CMDQ_QUERY_VERSION_OPCODE_LAST CMDQ_QUERY_VERSION_OPCODE_QUERY_VERSION 176 + u8 cmd_size; 177 + __le16 flags; 178 + __le16 cookie; 179 + u8 resp_size; 180 + u8 reserved8; 181 + __le64 resp_addr; 182 + }; 183 + 184 + /* creq_query_version_resp (size:128b/16B) */ 185 + struct creq_query_version_resp { 186 + u8 type; 187 + #define CREQ_QUERY_VERSION_RESP_TYPE_MASK 0x3fUL 188 + #define CREQ_QUERY_VERSION_RESP_TYPE_SFT 0 189 + #define CREQ_QUERY_VERSION_RESP_TYPE_QP_EVENT 0x38UL 190 + #define CREQ_QUERY_VERSION_RESP_TYPE_LAST CREQ_QUERY_VERSION_RESP_TYPE_QP_EVENT 191 + u8 status; 192 + __le16 cookie; 193 + u8 fw_maj; 194 + u8 fw_minor; 195 + u8 fw_bld; 196 + u8 fw_rsvd; 197 + u8 v; 198 + #define CREQ_QUERY_VERSION_RESP_V 0x1UL 199 + u8 event; 200 + #define CREQ_QUERY_VERSION_RESP_EVENT_QUERY_VERSION 0x8bUL 201 + #define CREQ_QUERY_VERSION_RESP_EVENT_LAST \ 202 + CREQ_QUERY_VERSION_RESP_EVENT_QUERY_VERSION 203 + __le16 reserved16; 204 + u8 intf_maj; 205 + u8 intf_minor; 206 + u8 intf_bld; 207 + u8 intf_rsvd; 208 + }; 209 + 210 + /* cmdq_initialize_fw (size:896b/112B) */ 211 + struct cmdq_initialize_fw { 212 + u8 opcode; 213 + #define CMDQ_INITIALIZE_FW_OPCODE_INITIALIZE_FW 0x80UL 214 + #define CMDQ_INITIALIZE_FW_OPCODE_LAST CMDQ_INITIALIZE_FW_OPCODE_INITIALIZE_FW 215 + u8 cmd_size; 216 + __le16 flags; 217 + #define CMDQ_INITIALIZE_FW_FLAGS_MRAV_RESERVATION_SPLIT 0x1UL 218 + #define CMDQ_INITIALIZE_FW_FLAGS_HW_REQUESTER_RETX_SUPPORTED 0x2UL 219 + __le16 cookie; 220 + u8 resp_size; 221 + u8 reserved8; 222 + __le64 resp_addr; 223 + u8 qpc_pg_size_qpc_lvl; 224 + #define CMDQ_INITIALIZE_FW_QPC_LVL_MASK 0xfUL 225 + #define CMDQ_INITIALIZE_FW_QPC_LVL_SFT 0 226 + #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_0 0x0UL 227 + #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_1 0x1UL 228 + #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_2 0x2UL 229 + #define CMDQ_INITIALIZE_FW_QPC_LVL_LAST CMDQ_INITIALIZE_FW_QPC_LVL_LVL_2 230 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_MASK 0xf0UL 231 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_SFT 4 232 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_4K (0x0UL << 4) 233 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_8K (0x1UL << 4) 234 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_64K (0x2UL << 4) 235 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_2M (0x3UL << 4) 236 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_8M (0x4UL << 4) 237 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_1G (0x5UL << 4) 238 + #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_LAST CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_1G 239 + u8 mrw_pg_size_mrw_lvl; 240 + #define CMDQ_INITIALIZE_FW_MRW_LVL_MASK 0xfUL 241 + #define CMDQ_INITIALIZE_FW_MRW_LVL_SFT 0 242 + #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_0 0x0UL 243 + #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_1 0x1UL 244 + #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_2 0x2UL 245 + #define CMDQ_INITIALIZE_FW_MRW_LVL_LAST CMDQ_INITIALIZE_FW_MRW_LVL_LVL_2 246 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_MASK 0xf0UL 247 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_SFT 4 248 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_4K (0x0UL << 4) 249 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_8K (0x1UL << 4) 250 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_64K (0x2UL << 4) 251 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_2M (0x3UL << 4) 252 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_8M (0x4UL << 4) 253 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_1G (0x5UL << 4) 254 + #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_LAST CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_1G 255 + u8 srq_pg_size_srq_lvl; 256 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_MASK 0xfUL 257 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_SFT 0 258 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_0 0x0UL 259 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_1 0x1UL 260 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_2 0x2UL 261 + #define CMDQ_INITIALIZE_FW_SRQ_LVL_LAST CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_2 262 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_MASK 0xf0UL 263 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_SFT 4 264 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_4K (0x0UL << 4) 265 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_8K (0x1UL << 4) 266 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_64K (0x2UL << 4) 267 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_2M (0x3UL << 4) 268 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_8M (0x4UL << 4) 269 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_1G (0x5UL << 4) 270 + #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_LAST CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_1G 271 + u8 cq_pg_size_cq_lvl; 272 + #define CMDQ_INITIALIZE_FW_CQ_LVL_MASK 0xfUL 273 + #define CMDQ_INITIALIZE_FW_CQ_LVL_SFT 0 274 + #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_0 0x0UL 275 + #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_1 0x1UL 276 + #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_2 0x2UL 277 + #define CMDQ_INITIALIZE_FW_CQ_LVL_LAST CMDQ_INITIALIZE_FW_CQ_LVL_LVL_2 278 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_MASK 0xf0UL 279 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_SFT 4 280 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_4K (0x0UL << 4) 281 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_8K (0x1UL << 4) 282 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_64K (0x2UL << 4) 283 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_2M (0x3UL << 4) 284 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_8M (0x4UL << 4) 285 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_1G (0x5UL << 4) 286 + #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_LAST CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_1G 287 + u8 tqm_pg_size_tqm_lvl; 288 + #define CMDQ_INITIALIZE_FW_TQM_LVL_MASK 0xfUL 289 + #define CMDQ_INITIALIZE_FW_TQM_LVL_SFT 0 290 + #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_0 0x0UL 291 + #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_1 0x1UL 292 + #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_2 0x2UL 293 + #define CMDQ_INITIALIZE_FW_TQM_LVL_LAST CMDQ_INITIALIZE_FW_TQM_LVL_LVL_2 294 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_MASK 0xf0UL 295 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_SFT 4 296 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_4K (0x0UL << 4) 297 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_8K (0x1UL << 4) 298 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_64K (0x2UL << 4) 299 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_2M (0x3UL << 4) 300 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_8M (0x4UL << 4) 301 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_1G (0x5UL << 4) 302 + #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_LAST CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_1G 303 + u8 tim_pg_size_tim_lvl; 304 + #define CMDQ_INITIALIZE_FW_TIM_LVL_MASK 0xfUL 305 + #define CMDQ_INITIALIZE_FW_TIM_LVL_SFT 0 306 + #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_0 0x0UL 307 + #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_1 0x1UL 308 + #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_2 0x2UL 309 + #define CMDQ_INITIALIZE_FW_TIM_LVL_LAST CMDQ_INITIALIZE_FW_TIM_LVL_LVL_2 310 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_MASK 0xf0UL 311 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_SFT 4 312 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_4K (0x0UL << 4) 313 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_8K (0x1UL << 4) 314 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_64K (0x2UL << 4) 315 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_2M (0x3UL << 4) 316 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_8M (0x4UL << 4) 317 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_1G (0x5UL << 4) 318 + #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_LAST CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_1G 319 + __le16 log2_dbr_pg_size; 320 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_MASK 0xfUL 321 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_SFT 0 322 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_4K 0x0UL 323 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_8K 0x1UL 324 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_16K 0x2UL 325 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_32K 0x3UL 326 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_64K 0x4UL 327 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128K 0x5UL 328 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_256K 0x6UL 329 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_512K 0x7UL 330 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_1M 0x8UL 331 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_2M 0x9UL 332 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_4M 0xaUL 333 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_8M 0xbUL 334 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_16M 0xcUL 335 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_32M 0xdUL 336 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_64M 0xeUL 337 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128M 0xfUL 338 + #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_LAST \ 339 + CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128M 340 + #define CMDQ_INITIALIZE_FW_RSVD_MASK 0xfff0UL 341 + #define CMDQ_INITIALIZE_FW_RSVD_SFT 4 342 + __le64 qpc_page_dir; 343 + __le64 mrw_page_dir; 344 + __le64 srq_page_dir; 345 + __le64 cq_page_dir; 346 + __le64 tqm_page_dir; 347 + __le64 tim_page_dir; 348 + __le32 number_of_qp; 349 + __le32 number_of_mrw; 350 + __le32 number_of_srq; 351 + __le32 number_of_cq; 352 + __le32 max_qp_per_vf; 353 + __le32 max_mrw_per_vf; 354 + __le32 max_srq_per_vf; 355 + __le32 max_cq_per_vf; 356 + __le32 max_gid_per_vf; 357 + __le32 stat_ctx_id; 358 + }; 359 + 360 + /* creq_initialize_fw_resp (size:128b/16B) */ 361 + struct creq_initialize_fw_resp { 362 + u8 type; 363 + #define CREQ_INITIALIZE_FW_RESP_TYPE_MASK 0x3fUL 364 + #define CREQ_INITIALIZE_FW_RESP_TYPE_SFT 0 365 + #define CREQ_INITIALIZE_FW_RESP_TYPE_QP_EVENT 0x38UL 366 + #define CREQ_INITIALIZE_FW_RESP_TYPE_LAST CREQ_INITIALIZE_FW_RESP_TYPE_QP_EVENT 367 + u8 status; 368 + __le16 cookie; 369 + __le32 reserved32; 370 + u8 v; 371 + #define CREQ_INITIALIZE_FW_RESP_V 0x1UL 372 + u8 event; 373 + #define CREQ_INITIALIZE_FW_RESP_EVENT_INITIALIZE_FW 0x80UL 374 + #define CREQ_INITIALIZE_FW_RESP_EVENT_LAST \ 375 + CREQ_INITIALIZE_FW_RESP_EVENT_INITIALIZE_FW 376 + u8 reserved48[6]; 377 + }; 378 + 379 + /* cmdq_deinitialize_fw (size:128b/16B) */ 380 + struct cmdq_deinitialize_fw { 381 + u8 opcode; 382 + #define CMDQ_DEINITIALIZE_FW_OPCODE_DEINITIALIZE_FW 0x81UL 383 + #define CMDQ_DEINITIALIZE_FW_OPCODE_LAST \ 384 + CMDQ_DEINITIALIZE_FW_OPCODE_DEINITIALIZE_FW 385 + u8 cmd_size; 386 + __le16 flags; 387 + __le16 cookie; 388 + u8 resp_size; 389 + u8 reserved8; 390 + __le64 resp_addr; 391 + }; 392 + 393 + /* creq_deinitialize_fw_resp (size:128b/16B) */ 394 + struct creq_deinitialize_fw_resp { 395 + u8 type; 396 + #define CREQ_DEINITIALIZE_FW_RESP_TYPE_MASK 0x3fUL 397 + #define CREQ_DEINITIALIZE_FW_RESP_TYPE_SFT 0 398 + #define CREQ_DEINITIALIZE_FW_RESP_TYPE_QP_EVENT 0x38UL 399 + #define CREQ_DEINITIALIZE_FW_RESP_TYPE_LAST CREQ_DEINITIALIZE_FW_RESP_TYPE_QP_EVENT 400 + u8 status; 401 + __le16 cookie; 402 + __le32 reserved32; 403 + u8 v; 404 + #define CREQ_DEINITIALIZE_FW_RESP_V 0x1UL 405 + u8 event; 406 + #define CREQ_DEINITIALIZE_FW_RESP_EVENT_DEINITIALIZE_FW 0x81UL 407 + #define CREQ_DEINITIALIZE_FW_RESP_EVENT_LAST \ 408 + CREQ_DEINITIALIZE_FW_RESP_EVENT_DEINITIALIZE_FW 409 + u8 reserved48[6]; 410 + }; 411 + 412 + /* cmdq_create_qp (size:768b/96B) */ 1115 413 struct cmdq_create_qp { 1116 - u8 opcode; 1117 - #define CMDQ_CREATE_QP_OPCODE_CREATE_QP 0x1UL 1118 - u8 cmd_size; 1119 - __le16 flags; 1120 - __le16 cookie; 1121 - u8 resp_size; 1122 - u8 reserved8; 1123 - __le64 resp_addr; 1124 - __le64 qp_handle; 1125 - __le32 qp_flags; 1126 - #define CMDQ_CREATE_QP_QP_FLAGS_SRQ_USED 0x1UL 1127 - #define CMDQ_CREATE_QP_QP_FLAGS_FORCE_COMPLETION 0x2UL 1128 - #define CMDQ_CREATE_QP_QP_FLAGS_RESERVED_LKEY_ENABLE 0x4UL 1129 - #define CMDQ_CREATE_QP_QP_FLAGS_FR_PMR_ENABLED 0x8UL 414 + u8 opcode; 415 + #define CMDQ_CREATE_QP_OPCODE_CREATE_QP 0x1UL 416 + #define CMDQ_CREATE_QP_OPCODE_LAST CMDQ_CREATE_QP_OPCODE_CREATE_QP 417 + u8 cmd_size; 418 + __le16 flags; 419 + __le16 cookie; 420 + u8 resp_size; 421 + u8 reserved8; 422 + __le64 resp_addr; 423 + __le64 qp_handle; 424 + __le32 qp_flags; 425 + #define CMDQ_CREATE_QP_QP_FLAGS_SRQ_USED 0x1UL 426 + #define CMDQ_CREATE_QP_QP_FLAGS_FORCE_COMPLETION 0x2UL 427 + #define CMDQ_CREATE_QP_QP_FLAGS_RESERVED_LKEY_ENABLE 0x4UL 428 + #define CMDQ_CREATE_QP_QP_FLAGS_FR_PMR_ENABLED 0x8UL 1130 429 #define CMDQ_CREATE_QP_QP_FLAGS_VARIABLE_SIZED_WQE_ENABLED 0x10UL 430 + #define CMDQ_CREATE_QP_QP_FLAGS_OPTIMIZED_TRANSMIT_ENABLED 0x20UL 431 + #define CMDQ_CREATE_QP_QP_FLAGS_RESPONDER_UD_CQE_WITH_CFA 0x40UL 1131 432 #define CMDQ_CREATE_QP_QP_FLAGS_EXT_STATS_ENABLED 0x80UL 1132 - #define CMDQ_CREATE_QP_QP_FLAGS_LAST \ 433 + #define CMDQ_CREATE_QP_QP_FLAGS_LAST \ 1133 434 CMDQ_CREATE_QP_QP_FLAGS_EXT_STATS_ENABLED 1134 - 1135 - u8 type; 1136 - #define CMDQ_CREATE_QP_TYPE_RC 0x2UL 1137 - #define CMDQ_CREATE_QP_TYPE_UD 0x4UL 1138 - #define CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE 0x6UL 1139 - #define CMDQ_CREATE_QP_TYPE_GSI 0x7UL 1140 - u8 sq_pg_size_sq_lvl; 1141 - #define CMDQ_CREATE_QP_SQ_LVL_MASK 0xfUL 1142 - #define CMDQ_CREATE_QP_SQ_LVL_SFT 0 1143 - #define CMDQ_CREATE_QP_SQ_LVL_LVL_0 0x0UL 1144 - #define CMDQ_CREATE_QP_SQ_LVL_LVL_1 0x1UL 1145 - #define CMDQ_CREATE_QP_SQ_LVL_LVL_2 0x2UL 1146 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_MASK 0xf0UL 1147 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_SFT 4 1148 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_4K (0x0UL << 4) 1149 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_8K (0x1UL << 4) 1150 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_64K (0x2UL << 4) 1151 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_2M (0x3UL << 4) 1152 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_8M (0x4UL << 4) 1153 - #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_1G (0x5UL << 4) 1154 - u8 rq_pg_size_rq_lvl; 1155 - #define CMDQ_CREATE_QP_RQ_LVL_MASK 0xfUL 1156 - #define CMDQ_CREATE_QP_RQ_LVL_SFT 0 1157 - #define CMDQ_CREATE_QP_RQ_LVL_LVL_0 0x0UL 1158 - #define CMDQ_CREATE_QP_RQ_LVL_LVL_1 0x1UL 1159 - #define CMDQ_CREATE_QP_RQ_LVL_LVL_2 0x2UL 1160 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_MASK 0xf0UL 1161 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_SFT 4 1162 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_4K (0x0UL << 4) 1163 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_8K (0x1UL << 4) 1164 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_64K (0x2UL << 4) 1165 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_2M (0x3UL << 4) 1166 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_8M (0x4UL << 4) 1167 - #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_1G (0x5UL << 4) 1168 - u8 unused_0; 1169 - __le32 dpi; 1170 - __le32 sq_size; 1171 - __le32 rq_size; 1172 - __le16 sq_fwo_sq_sge; 1173 - #define CMDQ_CREATE_QP_SQ_SGE_MASK 0xfUL 1174 - #define CMDQ_CREATE_QP_SQ_SGE_SFT 0 1175 - #define CMDQ_CREATE_QP_SQ_FWO_MASK 0xfff0UL 1176 - #define CMDQ_CREATE_QP_SQ_FWO_SFT 4 1177 - __le16 rq_fwo_rq_sge; 1178 - #define CMDQ_CREATE_QP_RQ_SGE_MASK 0xfUL 1179 - #define CMDQ_CREATE_QP_RQ_SGE_SFT 0 1180 - #define CMDQ_CREATE_QP_RQ_FWO_MASK 0xfff0UL 1181 - #define CMDQ_CREATE_QP_RQ_FWO_SFT 4 1182 - __le32 scq_cid; 1183 - __le32 rcq_cid; 1184 - __le32 srq_cid; 1185 - __le32 pd_id; 1186 - __le64 sq_pbl; 1187 - __le64 rq_pbl; 1188 - __le64 irrq_addr; 1189 - __le64 orrq_addr; 435 + u8 type; 436 + #define CMDQ_CREATE_QP_TYPE_RC 0x2UL 437 + #define CMDQ_CREATE_QP_TYPE_UD 0x4UL 438 + #define CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE 0x6UL 439 + #define CMDQ_CREATE_QP_TYPE_GSI 0x7UL 440 + #define CMDQ_CREATE_QP_TYPE_LAST CMDQ_CREATE_QP_TYPE_GSI 441 + u8 sq_pg_size_sq_lvl; 442 + #define CMDQ_CREATE_QP_SQ_LVL_MASK 0xfUL 443 + #define CMDQ_CREATE_QP_SQ_LVL_SFT 0 444 + #define CMDQ_CREATE_QP_SQ_LVL_LVL_0 0x0UL 445 + #define CMDQ_CREATE_QP_SQ_LVL_LVL_1 0x1UL 446 + #define CMDQ_CREATE_QP_SQ_LVL_LVL_2 0x2UL 447 + #define CMDQ_CREATE_QP_SQ_LVL_LAST CMDQ_CREATE_QP_SQ_LVL_LVL_2 448 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_MASK 0xf0UL 449 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_SFT 4 450 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_4K (0x0UL << 4) 451 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_8K (0x1UL << 4) 452 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_64K (0x2UL << 4) 453 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_2M (0x3UL << 4) 454 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_8M (0x4UL << 4) 455 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_PG_1G (0x5UL << 4) 456 + #define CMDQ_CREATE_QP_SQ_PG_SIZE_LAST CMDQ_CREATE_QP_SQ_PG_SIZE_PG_1G 457 + u8 rq_pg_size_rq_lvl; 458 + #define CMDQ_CREATE_QP_RQ_LVL_MASK 0xfUL 459 + #define CMDQ_CREATE_QP_RQ_LVL_SFT 0 460 + #define CMDQ_CREATE_QP_RQ_LVL_LVL_0 0x0UL 461 + #define CMDQ_CREATE_QP_RQ_LVL_LVL_1 0x1UL 462 + #define CMDQ_CREATE_QP_RQ_LVL_LVL_2 0x2UL 463 + #define CMDQ_CREATE_QP_RQ_LVL_LAST CMDQ_CREATE_QP_RQ_LVL_LVL_2 464 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_MASK 0xf0UL 465 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_SFT 4 466 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_4K (0x0UL << 4) 467 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_8K (0x1UL << 4) 468 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_64K (0x2UL << 4) 469 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_2M (0x3UL << 4) 470 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_8M (0x4UL << 4) 471 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_PG_1G (0x5UL << 4) 472 + #define CMDQ_CREATE_QP_RQ_PG_SIZE_LAST CMDQ_CREATE_QP_RQ_PG_SIZE_PG_1G 473 + u8 unused_0; 474 + __le32 dpi; 475 + __le32 sq_size; 476 + __le32 rq_size; 477 + __le16 sq_fwo_sq_sge; 478 + #define CMDQ_CREATE_QP_SQ_SGE_MASK 0xfUL 479 + #define CMDQ_CREATE_QP_SQ_SGE_SFT 0 480 + #define CMDQ_CREATE_QP_SQ_FWO_MASK 0xfff0UL 481 + #define CMDQ_CREATE_QP_SQ_FWO_SFT 4 482 + __le16 rq_fwo_rq_sge; 483 + #define CMDQ_CREATE_QP_RQ_SGE_MASK 0xfUL 484 + #define CMDQ_CREATE_QP_RQ_SGE_SFT 0 485 + #define CMDQ_CREATE_QP_RQ_FWO_MASK 0xfff0UL 486 + #define CMDQ_CREATE_QP_RQ_FWO_SFT 4 487 + __le32 scq_cid; 488 + __le32 rcq_cid; 489 + __le32 srq_cid; 490 + __le32 pd_id; 491 + __le64 sq_pbl; 492 + __le64 rq_pbl; 493 + __le64 irrq_addr; 494 + __le64 orrq_addr; 1190 495 }; 1191 496 1192 - /* Destroy QP command (24 bytes) */ 497 + /* creq_create_qp_resp (size:128b/16B) */ 498 + struct creq_create_qp_resp { 499 + u8 type; 500 + #define CREQ_CREATE_QP_RESP_TYPE_MASK 0x3fUL 501 + #define CREQ_CREATE_QP_RESP_TYPE_SFT 0 502 + #define CREQ_CREATE_QP_RESP_TYPE_QP_EVENT 0x38UL 503 + #define CREQ_CREATE_QP_RESP_TYPE_LAST CREQ_CREATE_QP_RESP_TYPE_QP_EVENT 504 + u8 status; 505 + __le16 cookie; 506 + __le32 xid; 507 + u8 v; 508 + #define CREQ_CREATE_QP_RESP_V 0x1UL 509 + u8 event; 510 + #define CREQ_CREATE_QP_RESP_EVENT_CREATE_QP 0x1UL 511 + #define CREQ_CREATE_QP_RESP_EVENT_LAST CREQ_CREATE_QP_RESP_EVENT_CREATE_QP 512 + u8 optimized_transmit_enabled; 513 + u8 reserved48[5]; 514 + }; 515 + 516 + /* cmdq_destroy_qp (size:192b/24B) */ 1193 517 struct cmdq_destroy_qp { 1194 - u8 opcode; 1195 - #define CMDQ_DESTROY_QP_OPCODE_DESTROY_QP 0x2UL 1196 - u8 cmd_size; 1197 - __le16 flags; 1198 - __le16 cookie; 1199 - u8 resp_size; 1200 - u8 reserved8; 1201 - __le64 resp_addr; 1202 - __le32 qp_cid; 1203 - __le32 unused_0; 518 + u8 opcode; 519 + #define CMDQ_DESTROY_QP_OPCODE_DESTROY_QP 0x2UL 520 + #define CMDQ_DESTROY_QP_OPCODE_LAST CMDQ_DESTROY_QP_OPCODE_DESTROY_QP 521 + u8 cmd_size; 522 + __le16 flags; 523 + __le16 cookie; 524 + u8 resp_size; 525 + u8 reserved8; 526 + __le64 resp_addr; 527 + __le32 qp_cid; 528 + __le32 unused_0; 1204 529 }; 1205 530 1206 - /* Modify QP command (112 bytes) */ 531 + /* creq_destroy_qp_resp (size:128b/16B) */ 532 + struct creq_destroy_qp_resp { 533 + u8 type; 534 + #define CREQ_DESTROY_QP_RESP_TYPE_MASK 0x3fUL 535 + #define CREQ_DESTROY_QP_RESP_TYPE_SFT 0 536 + #define CREQ_DESTROY_QP_RESP_TYPE_QP_EVENT 0x38UL 537 + #define CREQ_DESTROY_QP_RESP_TYPE_LAST CREQ_DESTROY_QP_RESP_TYPE_QP_EVENT 538 + u8 status; 539 + __le16 cookie; 540 + __le32 xid; 541 + u8 v; 542 + #define CREQ_DESTROY_QP_RESP_V 0x1UL 543 + u8 event; 544 + #define CREQ_DESTROY_QP_RESP_EVENT_DESTROY_QP 0x2UL 545 + #define CREQ_DESTROY_QP_RESP_EVENT_LAST CREQ_DESTROY_QP_RESP_EVENT_DESTROY_QP 546 + u8 reserved48[6]; 547 + }; 548 + 549 + /* cmdq_modify_qp (size:1024b/128B) */ 1207 550 struct cmdq_modify_qp { 1208 - u8 opcode; 1209 - #define CMDQ_MODIFY_QP_OPCODE_MODIFY_QP 0x3UL 1210 - u8 cmd_size; 1211 - __le16 flags; 1212 - __le16 cookie; 1213 - u8 resp_size; 1214 - u8 reserved8; 1215 - __le64 resp_addr; 1216 - __le32 modify_mask; 1217 - #define CMDQ_MODIFY_QP_MODIFY_MASK_STATE 0x1UL 551 + u8 opcode; 552 + #define CMDQ_MODIFY_QP_OPCODE_MODIFY_QP 0x3UL 553 + #define CMDQ_MODIFY_QP_OPCODE_LAST CMDQ_MODIFY_QP_OPCODE_MODIFY_QP 554 + u8 cmd_size; 555 + __le16 flags; 556 + __le16 cookie; 557 + u8 resp_size; 558 + u8 reserved8; 559 + __le64 resp_addr; 560 + __le32 modify_mask; 561 + #define CMDQ_MODIFY_QP_MODIFY_MASK_STATE 0x1UL 1218 562 #define CMDQ_MODIFY_QP_MODIFY_MASK_EN_SQD_ASYNC_NOTIFY 0x2UL 1219 - #define CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS 0x4UL 1220 - #define CMDQ_MODIFY_QP_MODIFY_MASK_PKEY 0x8UL 1221 - #define CMDQ_MODIFY_QP_MODIFY_MASK_QKEY 0x10UL 1222 - #define CMDQ_MODIFY_QP_MODIFY_MASK_DGID 0x20UL 1223 - #define CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL 0x40UL 1224 - #define CMDQ_MODIFY_QP_MODIFY_MASK_SGID_INDEX 0x80UL 1225 - #define CMDQ_MODIFY_QP_MODIFY_MASK_HOP_LIMIT 0x100UL 1226 - #define CMDQ_MODIFY_QP_MODIFY_MASK_TRAFFIC_CLASS 0x200UL 1227 - #define CMDQ_MODIFY_QP_MODIFY_MASK_DEST_MAC 0x400UL 1228 - #define CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU 0x1000UL 1229 - #define CMDQ_MODIFY_QP_MODIFY_MASK_TIMEOUT 0x2000UL 1230 - #define CMDQ_MODIFY_QP_MODIFY_MASK_RETRY_CNT 0x4000UL 1231 - #define CMDQ_MODIFY_QP_MODIFY_MASK_RNR_RETRY 0x8000UL 1232 - #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_PSN 0x10000UL 1233 - #define CMDQ_MODIFY_QP_MODIFY_MASK_MAX_RD_ATOMIC 0x20000UL 1234 - #define CMDQ_MODIFY_QP_MODIFY_MASK_MIN_RNR_TIMER 0x40000UL 1235 - #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_PSN 0x80000UL 563 + #define CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS 0x4UL 564 + #define CMDQ_MODIFY_QP_MODIFY_MASK_PKEY 0x8UL 565 + #define CMDQ_MODIFY_QP_MODIFY_MASK_QKEY 0x10UL 566 + #define CMDQ_MODIFY_QP_MODIFY_MASK_DGID 0x20UL 567 + #define CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL 0x40UL 568 + #define CMDQ_MODIFY_QP_MODIFY_MASK_SGID_INDEX 0x80UL 569 + #define CMDQ_MODIFY_QP_MODIFY_MASK_HOP_LIMIT 0x100UL 570 + #define CMDQ_MODIFY_QP_MODIFY_MASK_TRAFFIC_CLASS 0x200UL 571 + #define CMDQ_MODIFY_QP_MODIFY_MASK_DEST_MAC 0x400UL 572 + #define CMDQ_MODIFY_QP_MODIFY_MASK_PINGPONG_PUSH_MODE 0x800UL 573 + #define CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU 0x1000UL 574 + #define CMDQ_MODIFY_QP_MODIFY_MASK_TIMEOUT 0x2000UL 575 + #define CMDQ_MODIFY_QP_MODIFY_MASK_RETRY_CNT 0x4000UL 576 + #define CMDQ_MODIFY_QP_MODIFY_MASK_RNR_RETRY 0x8000UL 577 + #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_PSN 0x10000UL 578 + #define CMDQ_MODIFY_QP_MODIFY_MASK_MAX_RD_ATOMIC 0x20000UL 579 + #define CMDQ_MODIFY_QP_MODIFY_MASK_MIN_RNR_TIMER 0x40000UL 580 + #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_PSN 0x80000UL 1236 581 #define CMDQ_MODIFY_QP_MODIFY_MASK_MAX_DEST_RD_ATOMIC 0x100000UL 1237 - #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SIZE 0x200000UL 1238 - #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SIZE 0x400000UL 1239 - #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SGE 0x800000UL 1240 - #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SGE 0x1000000UL 1241 - #define CMDQ_MODIFY_QP_MODIFY_MASK_MAX_INLINE_DATA 0x2000000UL 1242 - #define CMDQ_MODIFY_QP_MODIFY_MASK_DEST_QP_ID 0x4000000UL 1243 - #define CMDQ_MODIFY_QP_MODIFY_MASK_SRC_MAC 0x8000000UL 1244 - #define CMDQ_MODIFY_QP_MODIFY_MASK_VLAN_ID 0x10000000UL 1245 - #define CMDQ_MODIFY_QP_MODIFY_MASK_ENABLE_CC 0x20000000UL 1246 - #define CMDQ_MODIFY_QP_MODIFY_MASK_TOS_ECN 0x40000000UL 1247 - #define CMDQ_MODIFY_QP_MODIFY_MASK_TOS_DSCP 0x80000000UL 1248 - __le32 qp_cid; 1249 - u8 network_type_en_sqd_async_notify_new_state; 1250 - #define CMDQ_MODIFY_QP_NEW_STATE_MASK 0xfUL 1251 - #define CMDQ_MODIFY_QP_NEW_STATE_SFT 0 1252 - #define CMDQ_MODIFY_QP_NEW_STATE_RESET 0x0UL 1253 - #define CMDQ_MODIFY_QP_NEW_STATE_INIT 0x1UL 1254 - #define CMDQ_MODIFY_QP_NEW_STATE_RTR 0x2UL 1255 - #define CMDQ_MODIFY_QP_NEW_STATE_RTS 0x3UL 1256 - #define CMDQ_MODIFY_QP_NEW_STATE_SQD 0x4UL 1257 - #define CMDQ_MODIFY_QP_NEW_STATE_SQE 0x5UL 1258 - #define CMDQ_MODIFY_QP_NEW_STATE_ERR 0x6UL 1259 - #define CMDQ_MODIFY_QP_EN_SQD_ASYNC_NOTIFY 0x10UL 1260 - #define CMDQ_MODIFY_QP_NETWORK_TYPE_MASK 0xc0UL 1261 - #define CMDQ_MODIFY_QP_NETWORK_TYPE_SFT 6 1262 - #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1 (0x0UL << 6) 1263 - #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4 (0x2UL << 6) 1264 - #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6 (0x3UL << 6) 1265 - u8 access; 1266 - #define CMDQ_MODIFY_QP_ACCESS_LOCAL_WRITE 0x1UL 1267 - #define CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE 0x2UL 1268 - #define CMDQ_MODIFY_QP_ACCESS_REMOTE_READ 0x4UL 1269 - #define CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC 0x8UL 1270 - __le16 pkey; 1271 - __le32 qkey; 1272 - __le32 dgid[4]; 1273 - __le32 flow_label; 1274 - __le16 sgid_index; 1275 - u8 hop_limit; 1276 - u8 traffic_class; 1277 - __le16 dest_mac[3]; 1278 - u8 tos_dscp_tos_ecn; 1279 - #define CMDQ_MODIFY_QP_TOS_ECN_MASK 0x3UL 1280 - #define CMDQ_MODIFY_QP_TOS_ECN_SFT 0 1281 - #define CMDQ_MODIFY_QP_TOS_DSCP_MASK 0xfcUL 1282 - #define CMDQ_MODIFY_QP_TOS_DSCP_SFT 2 1283 - u8 path_mtu; 1284 - #define CMDQ_MODIFY_QP_PATH_MTU_MASK 0xf0UL 1285 - #define CMDQ_MODIFY_QP_PATH_MTU_SFT 4 1286 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_256 (0x0UL << 4) 1287 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_512 (0x1UL << 4) 1288 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_1024 (0x2UL << 4) 1289 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_2048 (0x3UL << 4) 1290 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_4096 (0x4UL << 4) 1291 - #define CMDQ_MODIFY_QP_PATH_MTU_MTU_8192 (0x5UL << 4) 1292 - u8 timeout; 1293 - u8 retry_cnt; 1294 - u8 rnr_retry; 1295 - u8 min_rnr_timer; 1296 - __le32 rq_psn; 1297 - __le32 sq_psn; 1298 - u8 max_rd_atomic; 1299 - u8 max_dest_rd_atomic; 1300 - __le16 enable_cc; 1301 - #define CMDQ_MODIFY_QP_ENABLE_CC 0x1UL 1302 - __le32 sq_size; 1303 - __le32 rq_size; 1304 - __le16 sq_sge; 1305 - __le16 rq_sge; 1306 - __le32 max_inline_data; 1307 - __le32 dest_qp_id; 1308 - __le32 unused_3; 1309 - __le16 src_mac[3]; 1310 - __le16 vlan_pcp_vlan_dei_vlan_id; 1311 - #define CMDQ_MODIFY_QP_VLAN_ID_MASK 0xfffUL 1312 - #define CMDQ_MODIFY_QP_VLAN_ID_SFT 0 1313 - #define CMDQ_MODIFY_QP_VLAN_DEI 0x1000UL 1314 - #define CMDQ_MODIFY_QP_VLAN_PCP_MASK 0xe000UL 1315 - #define CMDQ_MODIFY_QP_VLAN_PCP_SFT 13 582 + #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SIZE 0x200000UL 583 + #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SIZE 0x400000UL 584 + #define CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SGE 0x800000UL 585 + #define CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SGE 0x1000000UL 586 + #define CMDQ_MODIFY_QP_MODIFY_MASK_MAX_INLINE_DATA 0x2000000UL 587 + #define CMDQ_MODIFY_QP_MODIFY_MASK_DEST_QP_ID 0x4000000UL 588 + #define CMDQ_MODIFY_QP_MODIFY_MASK_SRC_MAC 0x8000000UL 589 + #define CMDQ_MODIFY_QP_MODIFY_MASK_VLAN_ID 0x10000000UL 590 + #define CMDQ_MODIFY_QP_MODIFY_MASK_ENABLE_CC 0x20000000UL 591 + #define CMDQ_MODIFY_QP_MODIFY_MASK_TOS_ECN 0x40000000UL 592 + #define CMDQ_MODIFY_QP_MODIFY_MASK_TOS_DSCP 0x80000000UL 593 + __le32 qp_cid; 594 + u8 network_type_en_sqd_async_notify_new_state; 595 + #define CMDQ_MODIFY_QP_NEW_STATE_MASK 0xfUL 596 + #define CMDQ_MODIFY_QP_NEW_STATE_SFT 0 597 + #define CMDQ_MODIFY_QP_NEW_STATE_RESET 0x0UL 598 + #define CMDQ_MODIFY_QP_NEW_STATE_INIT 0x1UL 599 + #define CMDQ_MODIFY_QP_NEW_STATE_RTR 0x2UL 600 + #define CMDQ_MODIFY_QP_NEW_STATE_RTS 0x3UL 601 + #define CMDQ_MODIFY_QP_NEW_STATE_SQD 0x4UL 602 + #define CMDQ_MODIFY_QP_NEW_STATE_SQE 0x5UL 603 + #define CMDQ_MODIFY_QP_NEW_STATE_ERR 0x6UL 604 + #define CMDQ_MODIFY_QP_NEW_STATE_LAST CMDQ_MODIFY_QP_NEW_STATE_ERR 605 + #define CMDQ_MODIFY_QP_EN_SQD_ASYNC_NOTIFY 0x10UL 606 + #define CMDQ_MODIFY_QP_UNUSED1 0x20UL 607 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_MASK 0xc0UL 608 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_SFT 6 609 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1 (0x0UL << 6) 610 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4 (0x2UL << 6) 611 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6 (0x3UL << 6) 612 + #define CMDQ_MODIFY_QP_NETWORK_TYPE_LAST CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6 613 + u8 access; 614 + #define CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC_REMOTE_READ_REMOTE_WRITE_LOCAL_WRITE_MASK \ 615 + 0xffUL 616 + #define CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC_REMOTE_READ_REMOTE_WRITE_LOCAL_WRITE_SFT \ 617 + 0 618 + #define CMDQ_MODIFY_QP_ACCESS_LOCAL_WRITE 0x1UL 619 + #define CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE 0x2UL 620 + #define CMDQ_MODIFY_QP_ACCESS_REMOTE_READ 0x4UL 621 + #define CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC 0x8UL 622 + __le16 pkey; 623 + __le32 qkey; 624 + __le32 dgid[4]; 625 + __le32 flow_label; 626 + __le16 sgid_index; 627 + u8 hop_limit; 628 + u8 traffic_class; 629 + __le16 dest_mac[3]; 630 + u8 tos_dscp_tos_ecn; 631 + #define CMDQ_MODIFY_QP_TOS_ECN_MASK 0x3UL 632 + #define CMDQ_MODIFY_QP_TOS_ECN_SFT 0 633 + #define CMDQ_MODIFY_QP_TOS_DSCP_MASK 0xfcUL 634 + #define CMDQ_MODIFY_QP_TOS_DSCP_SFT 2 635 + u8 path_mtu_pingpong_push_enable; 636 + #define CMDQ_MODIFY_QP_PINGPONG_PUSH_ENABLE 0x1UL 637 + #define CMDQ_MODIFY_QP_UNUSED3_MASK 0xeUL 638 + #define CMDQ_MODIFY_QP_UNUSED3_SFT 1 639 + #define CMDQ_MODIFY_QP_PATH_MTU_MASK 0xf0UL 640 + #define CMDQ_MODIFY_QP_PATH_MTU_SFT 4 641 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_256 (0x0UL << 4) 642 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_512 (0x1UL << 4) 643 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_1024 (0x2UL << 4) 644 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_2048 (0x3UL << 4) 645 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_4096 (0x4UL << 4) 646 + #define CMDQ_MODIFY_QP_PATH_MTU_MTU_8192 (0x5UL << 4) 647 + #define CMDQ_MODIFY_QP_PATH_MTU_LAST CMDQ_MODIFY_QP_PATH_MTU_MTU_8192 648 + u8 timeout; 649 + u8 retry_cnt; 650 + u8 rnr_retry; 651 + u8 min_rnr_timer; 652 + __le32 rq_psn; 653 + __le32 sq_psn; 654 + u8 max_rd_atomic; 655 + u8 max_dest_rd_atomic; 656 + __le16 enable_cc; 657 + #define CMDQ_MODIFY_QP_ENABLE_CC 0x1UL 658 + #define CMDQ_MODIFY_QP_UNUSED15_MASK 0xfffeUL 659 + #define CMDQ_MODIFY_QP_UNUSED15_SFT 1 660 + __le32 sq_size; 661 + __le32 rq_size; 662 + __le16 sq_sge; 663 + __le16 rq_sge; 664 + __le32 max_inline_data; 665 + __le32 dest_qp_id; 666 + __le32 pingpong_push_dpi; 667 + __le16 src_mac[3]; 668 + __le16 vlan_pcp_vlan_dei_vlan_id; 669 + #define CMDQ_MODIFY_QP_VLAN_ID_MASK 0xfffUL 670 + #define CMDQ_MODIFY_QP_VLAN_ID_SFT 0 671 + #define CMDQ_MODIFY_QP_VLAN_DEI 0x1000UL 672 + #define CMDQ_MODIFY_QP_VLAN_PCP_MASK 0xe000UL 673 + #define CMDQ_MODIFY_QP_VLAN_PCP_SFT 13 674 + __le64 irrq_addr; 675 + __le64 orrq_addr; 1316 676 }; 1317 677 1318 - /* Query QP command (24 bytes) */ 678 + /* creq_modify_qp_resp (size:128b/16B) */ 679 + struct creq_modify_qp_resp { 680 + u8 type; 681 + #define CREQ_MODIFY_QP_RESP_TYPE_MASK 0x3fUL 682 + #define CREQ_MODIFY_QP_RESP_TYPE_SFT 0 683 + #define CREQ_MODIFY_QP_RESP_TYPE_QP_EVENT 0x38UL 684 + #define CREQ_MODIFY_QP_RESP_TYPE_LAST CREQ_MODIFY_QP_RESP_TYPE_QP_EVENT 685 + u8 status; 686 + __le16 cookie; 687 + __le32 xid; 688 + u8 v; 689 + #define CREQ_MODIFY_QP_RESP_V 0x1UL 690 + u8 event; 691 + #define CREQ_MODIFY_QP_RESP_EVENT_MODIFY_QP 0x3UL 692 + #define CREQ_MODIFY_QP_RESP_EVENT_LAST CREQ_MODIFY_QP_RESP_EVENT_MODIFY_QP 693 + u8 pingpong_push_state_index_enabled; 694 + #define CREQ_MODIFY_QP_RESP_PINGPONG_PUSH_ENABLED 0x1UL 695 + #define CREQ_MODIFY_QP_RESP_PINGPONG_PUSH_INDEX_MASK 0xeUL 696 + #define CREQ_MODIFY_QP_RESP_PINGPONG_PUSH_INDEX_SFT 1 697 + #define CREQ_MODIFY_QP_RESP_PINGPONG_PUSH_STATE 0x10UL 698 + u8 reserved8; 699 + __le32 lag_src_mac; 700 + }; 701 + 702 + /* cmdq_query_qp (size:192b/24B) */ 1319 703 struct cmdq_query_qp { 1320 - u8 opcode; 1321 - #define CMDQ_QUERY_QP_OPCODE_QUERY_QP 0x4UL 1322 - u8 cmd_size; 1323 - __le16 flags; 1324 - __le16 cookie; 1325 - u8 resp_size; 1326 - u8 reserved8; 1327 - __le64 resp_addr; 1328 - __le32 qp_cid; 1329 - __le32 unused_0; 704 + u8 opcode; 705 + #define CMDQ_QUERY_QP_OPCODE_QUERY_QP 0x4UL 706 + #define CMDQ_QUERY_QP_OPCODE_LAST CMDQ_QUERY_QP_OPCODE_QUERY_QP 707 + u8 cmd_size; 708 + __le16 flags; 709 + __le16 cookie; 710 + u8 resp_size; 711 + u8 reserved8; 712 + __le64 resp_addr; 713 + __le32 qp_cid; 714 + __le32 unused_0; 1330 715 }; 1331 716 1332 - /* Create SRQ command (48 bytes) */ 717 + /* creq_query_qp_resp (size:128b/16B) */ 718 + struct creq_query_qp_resp { 719 + u8 type; 720 + #define CREQ_QUERY_QP_RESP_TYPE_MASK 0x3fUL 721 + #define CREQ_QUERY_QP_RESP_TYPE_SFT 0 722 + #define CREQ_QUERY_QP_RESP_TYPE_QP_EVENT 0x38UL 723 + #define CREQ_QUERY_QP_RESP_TYPE_LAST CREQ_QUERY_QP_RESP_TYPE_QP_EVENT 724 + u8 status; 725 + __le16 cookie; 726 + __le32 size; 727 + u8 v; 728 + #define CREQ_QUERY_QP_RESP_V 0x1UL 729 + u8 event; 730 + #define CREQ_QUERY_QP_RESP_EVENT_QUERY_QP 0x4UL 731 + #define CREQ_QUERY_QP_RESP_EVENT_LAST CREQ_QUERY_QP_RESP_EVENT_QUERY_QP 732 + u8 reserved48[6]; 733 + }; 734 + 735 + /* creq_query_qp_resp_sb (size:832b/104B) */ 736 + struct creq_query_qp_resp_sb { 737 + u8 opcode; 738 + #define CREQ_QUERY_QP_RESP_SB_OPCODE_QUERY_QP 0x4UL 739 + #define CREQ_QUERY_QP_RESP_SB_OPCODE_LAST CREQ_QUERY_QP_RESP_SB_OPCODE_QUERY_QP 740 + u8 status; 741 + __le16 cookie; 742 + __le16 flags; 743 + u8 resp_size; 744 + u8 reserved8; 745 + __le32 xid; 746 + u8 en_sqd_async_notify_state; 747 + #define CREQ_QUERY_QP_RESP_SB_STATE_MASK 0xfUL 748 + #define CREQ_QUERY_QP_RESP_SB_STATE_SFT 0 749 + #define CREQ_QUERY_QP_RESP_SB_STATE_RESET 0x0UL 750 + #define CREQ_QUERY_QP_RESP_SB_STATE_INIT 0x1UL 751 + #define CREQ_QUERY_QP_RESP_SB_STATE_RTR 0x2UL 752 + #define CREQ_QUERY_QP_RESP_SB_STATE_RTS 0x3UL 753 + #define CREQ_QUERY_QP_RESP_SB_STATE_SQD 0x4UL 754 + #define CREQ_QUERY_QP_RESP_SB_STATE_SQE 0x5UL 755 + #define CREQ_QUERY_QP_RESP_SB_STATE_ERR 0x6UL 756 + #define CREQ_QUERY_QP_RESP_SB_STATE_LAST CREQ_QUERY_QP_RESP_SB_STATE_ERR 757 + #define CREQ_QUERY_QP_RESP_SB_EN_SQD_ASYNC_NOTIFY 0x10UL 758 + #define CREQ_QUERY_QP_RESP_SB_UNUSED3_MASK 0xe0UL 759 + #define CREQ_QUERY_QP_RESP_SB_UNUSED3_SFT 5 760 + u8 access; 761 + #define \ 762 + CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_ATOMIC_REMOTE_READ_REMOTE_WRITE_LOCAL_WRITE_MASK\ 763 + 0xffUL 764 + #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_ATOMIC_REMOTE_READ_REMOTE_WRITE_LOCAL_WRITE_SFT\ 765 + 0 766 + #define CREQ_QUERY_QP_RESP_SB_ACCESS_LOCAL_WRITE 0x1UL 767 + #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_WRITE 0x2UL 768 + #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_READ 0x4UL 769 + #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_ATOMIC 0x8UL 770 + __le16 pkey; 771 + __le32 qkey; 772 + __le32 reserved32; 773 + __le32 dgid[4]; 774 + __le32 flow_label; 775 + __le16 sgid_index; 776 + u8 hop_limit; 777 + u8 traffic_class; 778 + __le16 dest_mac[3]; 779 + __le16 path_mtu_dest_vlan_id; 780 + #define CREQ_QUERY_QP_RESP_SB_DEST_VLAN_ID_MASK 0xfffUL 781 + #define CREQ_QUERY_QP_RESP_SB_DEST_VLAN_ID_SFT 0 782 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MASK 0xf000UL 783 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_SFT 12 784 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_256 (0x0UL << 12) 785 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_512 (0x1UL << 12) 786 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_1024 (0x2UL << 12) 787 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_2048 (0x3UL << 12) 788 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_4096 (0x4UL << 12) 789 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_8192 (0x5UL << 12) 790 + #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_LAST CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_8192 791 + u8 timeout; 792 + u8 retry_cnt; 793 + u8 rnr_retry; 794 + u8 min_rnr_timer; 795 + __le32 rq_psn; 796 + __le32 sq_psn; 797 + u8 max_rd_atomic; 798 + u8 max_dest_rd_atomic; 799 + u8 tos_dscp_tos_ecn; 800 + #define CREQ_QUERY_QP_RESP_SB_TOS_ECN_MASK 0x3UL 801 + #define CREQ_QUERY_QP_RESP_SB_TOS_ECN_SFT 0 802 + #define CREQ_QUERY_QP_RESP_SB_TOS_DSCP_MASK 0xfcUL 803 + #define CREQ_QUERY_QP_RESP_SB_TOS_DSCP_SFT 2 804 + u8 enable_cc; 805 + #define CREQ_QUERY_QP_RESP_SB_ENABLE_CC 0x1UL 806 + __le32 sq_size; 807 + __le32 rq_size; 808 + __le16 sq_sge; 809 + __le16 rq_sge; 810 + __le32 max_inline_data; 811 + __le32 dest_qp_id; 812 + __le16 port_id; 813 + u8 unused_0; 814 + u8 stat_collection_id; 815 + __le16 src_mac[3]; 816 + __le16 vlan_pcp_vlan_dei_vlan_id; 817 + #define CREQ_QUERY_QP_RESP_SB_VLAN_ID_MASK 0xfffUL 818 + #define CREQ_QUERY_QP_RESP_SB_VLAN_ID_SFT 0 819 + #define CREQ_QUERY_QP_RESP_SB_VLAN_DEI 0x1000UL 820 + #define CREQ_QUERY_QP_RESP_SB_VLAN_PCP_MASK 0xe000UL 821 + #define CREQ_QUERY_QP_RESP_SB_VLAN_PCP_SFT 13 822 + }; 823 + 824 + /* cmdq_query_qp_extend (size:192b/24B) */ 825 + struct cmdq_query_qp_extend { 826 + u8 opcode; 827 + #define CMDQ_QUERY_QP_EXTEND_OPCODE_QUERY_QP_EXTEND 0x91UL 828 + #define CMDQ_QUERY_QP_EXTEND_OPCODE_LAST CMDQ_QUERY_QP_EXTEND_OPCODE_QUERY_QP_EXTEND 829 + u8 cmd_size; 830 + __le16 flags; 831 + __le16 cookie; 832 + u8 resp_size; 833 + u8 num_qps; 834 + __le64 resp_addr; 835 + __le32 function_id; 836 + #define CMDQ_QUERY_QP_EXTEND_PF_NUM_MASK 0xffUL 837 + #define CMDQ_QUERY_QP_EXTEND_PF_NUM_SFT 0 838 + #define CMDQ_QUERY_QP_EXTEND_VF_NUM_MASK 0xffff00UL 839 + #define CMDQ_QUERY_QP_EXTEND_VF_NUM_SFT 8 840 + #define CMDQ_QUERY_QP_EXTEND_VF_VALID 0x1000000UL 841 + __le32 current_index; 842 + }; 843 + 844 + /* creq_query_qp_extend_resp (size:128b/16B) */ 845 + struct creq_query_qp_extend_resp { 846 + u8 type; 847 + #define CREQ_QUERY_QP_EXTEND_RESP_TYPE_MASK 0x3fUL 848 + #define CREQ_QUERY_QP_EXTEND_RESP_TYPE_SFT 0 849 + #define CREQ_QUERY_QP_EXTEND_RESP_TYPE_QP_EVENT 0x38UL 850 + #define CREQ_QUERY_QP_EXTEND_RESP_TYPE_LAST CREQ_QUERY_QP_EXTEND_RESP_TYPE_QP_EVENT 851 + u8 status; 852 + __le16 cookie; 853 + __le32 size; 854 + u8 v; 855 + #define CREQ_QUERY_QP_EXTEND_RESP_V 0x1UL 856 + u8 event; 857 + #define CREQ_QUERY_QP_EXTEND_RESP_EVENT_QUERY_QP_EXTEND 0x91UL 858 + #define CREQ_QUERY_QP_EXTEND_RESP_EVENT_LAST CREQ_QUERY_QP_EXTEND_RESP_EVENT_QUERY_QP_EXTEND 859 + __le16 reserved16; 860 + __le32 current_index; 861 + }; 862 + 863 + /* creq_query_qp_extend_resp_sb (size:384b/48B) */ 864 + struct creq_query_qp_extend_resp_sb { 865 + u8 opcode; 866 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_OPCODE_QUERY_QP_EXTEND 0x91UL 867 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_OPCODE_LAST \ 868 + CREQ_QUERY_QP_EXTEND_RESP_SB_OPCODE_QUERY_QP_EXTEND 869 + u8 status; 870 + __le16 cookie; 871 + __le16 flags; 872 + u8 resp_size; 873 + u8 reserved8; 874 + __le32 xid; 875 + u8 state; 876 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_MASK 0xfUL 877 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_SFT 0 878 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_RESET 0x0UL 879 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_INIT 0x1UL 880 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_RTR 0x2UL 881 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_RTS 0x3UL 882 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_SQD 0x4UL 883 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_SQE 0x5UL 884 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_ERR 0x6UL 885 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_LAST CREQ_QUERY_QP_EXTEND_RESP_SB_STATE_ERR 886 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_UNUSED4_MASK 0xf0UL 887 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_UNUSED4_SFT 4 888 + u8 reserved_8; 889 + __le16 port_id; 890 + __le32 qkey; 891 + __le16 sgid_index; 892 + u8 network_type; 893 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_NETWORK_TYPE_ROCEV1 0x0UL 894 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_NETWORK_TYPE_ROCEV2_IPV4 0x2UL 895 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_NETWORK_TYPE_ROCEV2_IPV6 0x3UL 896 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_NETWORK_TYPE_LAST \ 897 + CREQ_QUERY_QP_EXTEND_RESP_SB_NETWORK_TYPE_ROCEV2_IPV6 898 + u8 unused_0; 899 + __le32 dgid[4]; 900 + __le32 dest_qp_id; 901 + u8 stat_collection_id; 902 + u8 reservred_8; 903 + __le16 reserved_16; 904 + }; 905 + 906 + /* creq_query_qp_extend_resp_sb_tlv (size:512b/64B) */ 907 + struct creq_query_qp_extend_resp_sb_tlv { 908 + __le16 cmd_discr; 909 + u8 reserved_8b; 910 + u8 tlv_flags; 911 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_MORE 0x1UL 912 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_MORE_LAST 0x0UL 913 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_MORE_NOT_LAST 0x1UL 914 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_REQUIRED 0x2UL 915 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_REQUIRED_NO (0x0UL << 1) 916 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES (0x1UL << 1) 917 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_REQUIRED_LAST \ 918 + CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES 919 + __le16 tlv_type; 920 + __le16 length; 921 + u8 total_size; 922 + u8 reserved56[7]; 923 + u8 opcode; 924 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_OPCODE_QUERY_QP_EXTEND 0x91UL 925 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_OPCODE_LAST \ 926 + CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_OPCODE_QUERY_QP_EXTEND 927 + u8 status; 928 + __le16 cookie; 929 + __le16 flags; 930 + u8 resp_size; 931 + u8 reserved8; 932 + __le32 xid; 933 + u8 state; 934 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_MASK 0xfUL 935 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_SFT 0 936 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_RESET 0x0UL 937 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_INIT 0x1UL 938 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_RTR 0x2UL 939 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_RTS 0x3UL 940 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_SQD 0x4UL 941 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_SQE 0x5UL 942 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_ERR 0x6UL 943 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_LAST \ 944 + CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_STATE_ERR 945 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_UNUSED4_MASK 0xf0UL 946 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_UNUSED4_SFT 4 947 + u8 reserved_8; 948 + __le16 port_id; 949 + __le32 qkey; 950 + __le16 sgid_index; 951 + u8 network_type; 952 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_NETWORK_TYPE_ROCEV1 0x0UL 953 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_NETWORK_TYPE_ROCEV2_IPV4 0x2UL 954 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_NETWORK_TYPE_ROCEV2_IPV6 0x3UL 955 + #define CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_NETWORK_TYPE_LAST \ 956 + CREQ_QUERY_QP_EXTEND_RESP_SB_TLV_NETWORK_TYPE_ROCEV2_IPV6 957 + u8 unused_0; 958 + __le32 dgid[4]; 959 + __le32 dest_qp_id; 960 + u8 stat_collection_id; 961 + u8 reservred_8; 962 + __le16 reserved_16; 963 + }; 964 + 965 + /* cmdq_create_srq (size:384b/48B) */ 1333 966 struct cmdq_create_srq { 1334 - u8 opcode; 1335 - #define CMDQ_CREATE_SRQ_OPCODE_CREATE_SRQ 0x5UL 1336 - u8 cmd_size; 1337 - __le16 flags; 1338 - __le16 cookie; 1339 - u8 resp_size; 1340 - u8 reserved8; 1341 - __le64 resp_addr; 1342 - __le64 srq_handle; 1343 - __le16 pg_size_lvl; 1344 - #define CMDQ_CREATE_SRQ_LVL_MASK 0x3UL 1345 - #define CMDQ_CREATE_SRQ_LVL_SFT 0 1346 - #define CMDQ_CREATE_SRQ_LVL_LVL_0 0x0UL 1347 - #define CMDQ_CREATE_SRQ_LVL_LVL_1 0x1UL 1348 - #define CMDQ_CREATE_SRQ_LVL_LVL_2 0x2UL 1349 - #define CMDQ_CREATE_SRQ_PG_SIZE_MASK 0x1cUL 1350 - #define CMDQ_CREATE_SRQ_PG_SIZE_SFT 2 1351 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_4K (0x0UL << 2) 1352 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_8K (0x1UL << 2) 1353 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_64K (0x2UL << 2) 1354 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_2M (0x3UL << 2) 1355 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_8M (0x4UL << 2) 1356 - #define CMDQ_CREATE_SRQ_PG_SIZE_PG_1G (0x5UL << 2) 1357 - __le16 eventq_id; 1358 - #define CMDQ_CREATE_SRQ_EVENTQ_ID_MASK 0xfffUL 1359 - #define CMDQ_CREATE_SRQ_EVENTQ_ID_SFT 0 1360 - __le16 srq_size; 1361 - __le16 srq_fwo; 1362 - __le32 dpi; 1363 - __le32 pd_id; 1364 - __le64 pbl; 967 + u8 opcode; 968 + #define CMDQ_CREATE_SRQ_OPCODE_CREATE_SRQ 0x5UL 969 + #define CMDQ_CREATE_SRQ_OPCODE_LAST CMDQ_CREATE_SRQ_OPCODE_CREATE_SRQ 970 + u8 cmd_size; 971 + __le16 flags; 972 + __le16 cookie; 973 + u8 resp_size; 974 + u8 reserved8; 975 + __le64 resp_addr; 976 + __le64 srq_handle; 977 + __le16 pg_size_lvl; 978 + #define CMDQ_CREATE_SRQ_LVL_MASK 0x3UL 979 + #define CMDQ_CREATE_SRQ_LVL_SFT 0 980 + #define CMDQ_CREATE_SRQ_LVL_LVL_0 0x0UL 981 + #define CMDQ_CREATE_SRQ_LVL_LVL_1 0x1UL 982 + #define CMDQ_CREATE_SRQ_LVL_LVL_2 0x2UL 983 + #define CMDQ_CREATE_SRQ_LVL_LAST CMDQ_CREATE_SRQ_LVL_LVL_2 984 + #define CMDQ_CREATE_SRQ_PG_SIZE_MASK 0x1cUL 985 + #define CMDQ_CREATE_SRQ_PG_SIZE_SFT 2 986 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_4K (0x0UL << 2) 987 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_8K (0x1UL << 2) 988 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_64K (0x2UL << 2) 989 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_2M (0x3UL << 2) 990 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_8M (0x4UL << 2) 991 + #define CMDQ_CREATE_SRQ_PG_SIZE_PG_1G (0x5UL << 2) 992 + #define CMDQ_CREATE_SRQ_PG_SIZE_LAST CMDQ_CREATE_SRQ_PG_SIZE_PG_1G 993 + #define CMDQ_CREATE_SRQ_UNUSED11_MASK 0xffe0UL 994 + #define CMDQ_CREATE_SRQ_UNUSED11_SFT 5 995 + __le16 eventq_id; 996 + #define CMDQ_CREATE_SRQ_EVENTQ_ID_MASK 0xfffUL 997 + #define CMDQ_CREATE_SRQ_EVENTQ_ID_SFT 0 998 + #define CMDQ_CREATE_SRQ_UNUSED4_MASK 0xf000UL 999 + #define CMDQ_CREATE_SRQ_UNUSED4_SFT 12 1000 + __le16 srq_size; 1001 + __le16 srq_fwo; 1002 + __le32 dpi; 1003 + __le32 pd_id; 1004 + __le64 pbl; 1365 1005 }; 1366 1006 1367 - /* Destroy SRQ command (24 bytes) */ 1007 + /* creq_create_srq_resp (size:128b/16B) */ 1008 + struct creq_create_srq_resp { 1009 + u8 type; 1010 + #define CREQ_CREATE_SRQ_RESP_TYPE_MASK 0x3fUL 1011 + #define CREQ_CREATE_SRQ_RESP_TYPE_SFT 0 1012 + #define CREQ_CREATE_SRQ_RESP_TYPE_QP_EVENT 0x38UL 1013 + #define CREQ_CREATE_SRQ_RESP_TYPE_LAST CREQ_CREATE_SRQ_RESP_TYPE_QP_EVENT 1014 + u8 status; 1015 + __le16 cookie; 1016 + __le32 xid; 1017 + u8 v; 1018 + #define CREQ_CREATE_SRQ_RESP_V 0x1UL 1019 + u8 event; 1020 + #define CREQ_CREATE_SRQ_RESP_EVENT_CREATE_SRQ 0x5UL 1021 + #define CREQ_CREATE_SRQ_RESP_EVENT_LAST CREQ_CREATE_SRQ_RESP_EVENT_CREATE_SRQ 1022 + u8 reserved48[6]; 1023 + }; 1024 + 1025 + /* cmdq_destroy_srq (size:192b/24B) */ 1368 1026 struct cmdq_destroy_srq { 1369 - u8 opcode; 1370 - #define CMDQ_DESTROY_SRQ_OPCODE_DESTROY_SRQ 0x6UL 1371 - u8 cmd_size; 1372 - __le16 flags; 1373 - __le16 cookie; 1374 - u8 resp_size; 1375 - u8 reserved8; 1376 - __le64 resp_addr; 1377 - __le32 srq_cid; 1378 - __le32 unused_0; 1027 + u8 opcode; 1028 + #define CMDQ_DESTROY_SRQ_OPCODE_DESTROY_SRQ 0x6UL 1029 + #define CMDQ_DESTROY_SRQ_OPCODE_LAST CMDQ_DESTROY_SRQ_OPCODE_DESTROY_SRQ 1030 + u8 cmd_size; 1031 + __le16 flags; 1032 + __le16 cookie; 1033 + u8 resp_size; 1034 + u8 reserved8; 1035 + __le64 resp_addr; 1036 + __le32 srq_cid; 1037 + __le32 unused_0; 1379 1038 }; 1380 1039 1381 - /* Query SRQ command (24 bytes) */ 1040 + /* creq_destroy_srq_resp (size:128b/16B) */ 1041 + struct creq_destroy_srq_resp { 1042 + u8 type; 1043 + #define CREQ_DESTROY_SRQ_RESP_TYPE_MASK 0x3fUL 1044 + #define CREQ_DESTROY_SRQ_RESP_TYPE_SFT 0 1045 + #define CREQ_DESTROY_SRQ_RESP_TYPE_QP_EVENT 0x38UL 1046 + #define CREQ_DESTROY_SRQ_RESP_TYPE_LAST CREQ_DESTROY_SRQ_RESP_TYPE_QP_EVENT 1047 + u8 status; 1048 + __le16 cookie; 1049 + __le32 xid; 1050 + u8 v; 1051 + #define CREQ_DESTROY_SRQ_RESP_V 0x1UL 1052 + u8 event; 1053 + #define CREQ_DESTROY_SRQ_RESP_EVENT_DESTROY_SRQ 0x6UL 1054 + #define CREQ_DESTROY_SRQ_RESP_EVENT_LAST CREQ_DESTROY_SRQ_RESP_EVENT_DESTROY_SRQ 1055 + __le16 enable_for_arm[3]; 1056 + #define CREQ_DESTROY_SRQ_RESP_UNUSED0_MASK 0xffffUL 1057 + #define CREQ_DESTROY_SRQ_RESP_UNUSED0_SFT 0 1058 + #define CREQ_DESTROY_SRQ_RESP_ENABLE_FOR_ARM_MASK 0x30000UL 1059 + #define CREQ_DESTROY_SRQ_RESP_ENABLE_FOR_ARM_SFT 16 1060 + }; 1061 + 1062 + /* cmdq_query_srq (size:192b/24B) */ 1382 1063 struct cmdq_query_srq { 1383 - u8 opcode; 1384 - #define CMDQ_QUERY_SRQ_OPCODE_QUERY_SRQ 0x8UL 1385 - u8 cmd_size; 1386 - __le16 flags; 1387 - __le16 cookie; 1388 - u8 resp_size; 1389 - u8 reserved8; 1390 - __le64 resp_addr; 1391 - __le32 srq_cid; 1392 - __le32 unused_0; 1064 + u8 opcode; 1065 + #define CMDQ_QUERY_SRQ_OPCODE_QUERY_SRQ 0x8UL 1066 + #define CMDQ_QUERY_SRQ_OPCODE_LAST CMDQ_QUERY_SRQ_OPCODE_QUERY_SRQ 1067 + u8 cmd_size; 1068 + __le16 flags; 1069 + __le16 cookie; 1070 + u8 resp_size; 1071 + u8 reserved8; 1072 + __le64 resp_addr; 1073 + __le32 srq_cid; 1074 + __le32 unused_0; 1393 1075 }; 1394 1076 1395 - /* Create CQ command (48 bytes) */ 1077 + /* creq_query_srq_resp (size:128b/16B) */ 1078 + struct creq_query_srq_resp { 1079 + u8 type; 1080 + #define CREQ_QUERY_SRQ_RESP_TYPE_MASK 0x3fUL 1081 + #define CREQ_QUERY_SRQ_RESP_TYPE_SFT 0 1082 + #define CREQ_QUERY_SRQ_RESP_TYPE_QP_EVENT 0x38UL 1083 + #define CREQ_QUERY_SRQ_RESP_TYPE_LAST CREQ_QUERY_SRQ_RESP_TYPE_QP_EVENT 1084 + u8 status; 1085 + __le16 cookie; 1086 + __le32 size; 1087 + u8 v; 1088 + #define CREQ_QUERY_SRQ_RESP_V 0x1UL 1089 + u8 event; 1090 + #define CREQ_QUERY_SRQ_RESP_EVENT_QUERY_SRQ 0x8UL 1091 + #define CREQ_QUERY_SRQ_RESP_EVENT_LAST CREQ_QUERY_SRQ_RESP_EVENT_QUERY_SRQ 1092 + u8 reserved48[6]; 1093 + }; 1094 + 1095 + /* creq_query_srq_resp_sb (size:256b/32B) */ 1096 + struct creq_query_srq_resp_sb { 1097 + u8 opcode; 1098 + #define CREQ_QUERY_SRQ_RESP_SB_OPCODE_QUERY_SRQ 0x8UL 1099 + #define CREQ_QUERY_SRQ_RESP_SB_OPCODE_LAST CREQ_QUERY_SRQ_RESP_SB_OPCODE_QUERY_SRQ 1100 + u8 status; 1101 + __le16 cookie; 1102 + __le16 flags; 1103 + u8 resp_size; 1104 + u8 reserved8; 1105 + __le32 xid; 1106 + __le16 srq_limit; 1107 + __le16 reserved16; 1108 + __le32 data[4]; 1109 + }; 1110 + 1111 + /* cmdq_create_cq (size:384b/48B) */ 1396 1112 struct cmdq_create_cq { 1397 - u8 opcode; 1398 - #define CMDQ_CREATE_CQ_OPCODE_CREATE_CQ 0x9UL 1399 - u8 cmd_size; 1400 - __le16 flags; 1401 - __le16 cookie; 1402 - u8 resp_size; 1403 - u8 reserved8; 1404 - __le64 resp_addr; 1405 - __le64 cq_handle; 1406 - __le32 pg_size_lvl; 1407 - #define CMDQ_CREATE_CQ_LVL_MASK 0x3UL 1408 - #define CMDQ_CREATE_CQ_LVL_SFT 0 1409 - #define CMDQ_CREATE_CQ_LVL_LVL_0 0x0UL 1410 - #define CMDQ_CREATE_CQ_LVL_LVL_1 0x1UL 1411 - #define CMDQ_CREATE_CQ_LVL_LVL_2 0x2UL 1412 - #define CMDQ_CREATE_CQ_PG_SIZE_MASK 0x1cUL 1413 - #define CMDQ_CREATE_CQ_PG_SIZE_SFT 2 1414 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_4K (0x0UL << 2) 1415 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_8K (0x1UL << 2) 1416 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_64K (0x2UL << 2) 1417 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_2M (0x3UL << 2) 1418 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_8M (0x4UL << 2) 1419 - #define CMDQ_CREATE_CQ_PG_SIZE_PG_1G (0x5UL << 2) 1420 - __le32 cq_fco_cnq_id; 1421 - #define CMDQ_CREATE_CQ_CNQ_ID_MASK 0xfffUL 1422 - #define CMDQ_CREATE_CQ_CNQ_ID_SFT 0 1423 - #define CMDQ_CREATE_CQ_CQ_FCO_MASK 0xfffff000UL 1424 - #define CMDQ_CREATE_CQ_CQ_FCO_SFT 12 1425 - __le32 dpi; 1426 - __le32 cq_size; 1427 - __le64 pbl; 1113 + u8 opcode; 1114 + #define CMDQ_CREATE_CQ_OPCODE_CREATE_CQ 0x9UL 1115 + #define CMDQ_CREATE_CQ_OPCODE_LAST CMDQ_CREATE_CQ_OPCODE_CREATE_CQ 1116 + u8 cmd_size; 1117 + __le16 flags; 1118 + #define CMDQ_CREATE_CQ_FLAGS_DISABLE_CQ_OVERFLOW_DETECTION 0x1UL 1119 + __le16 cookie; 1120 + u8 resp_size; 1121 + u8 reserved8; 1122 + __le64 resp_addr; 1123 + __le64 cq_handle; 1124 + __le32 pg_size_lvl; 1125 + #define CMDQ_CREATE_CQ_LVL_MASK 0x3UL 1126 + #define CMDQ_CREATE_CQ_LVL_SFT 0 1127 + #define CMDQ_CREATE_CQ_LVL_LVL_0 0x0UL 1128 + #define CMDQ_CREATE_CQ_LVL_LVL_1 0x1UL 1129 + #define CMDQ_CREATE_CQ_LVL_LVL_2 0x2UL 1130 + #define CMDQ_CREATE_CQ_LVL_LAST CMDQ_CREATE_CQ_LVL_LVL_2 1131 + #define CMDQ_CREATE_CQ_PG_SIZE_MASK 0x1cUL 1132 + #define CMDQ_CREATE_CQ_PG_SIZE_SFT 2 1133 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_4K (0x0UL << 2) 1134 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_8K (0x1UL << 2) 1135 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_64K (0x2UL << 2) 1136 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_2M (0x3UL << 2) 1137 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_8M (0x4UL << 2) 1138 + #define CMDQ_CREATE_CQ_PG_SIZE_PG_1G (0x5UL << 2) 1139 + #define CMDQ_CREATE_CQ_PG_SIZE_LAST CMDQ_CREATE_CQ_PG_SIZE_PG_1G 1140 + #define CMDQ_CREATE_CQ_UNUSED27_MASK 0xffffffe0UL 1141 + #define CMDQ_CREATE_CQ_UNUSED27_SFT 5 1142 + __le32 cq_fco_cnq_id; 1143 + #define CMDQ_CREATE_CQ_CNQ_ID_MASK 0xfffUL 1144 + #define CMDQ_CREATE_CQ_CNQ_ID_SFT 0 1145 + #define CMDQ_CREATE_CQ_CQ_FCO_MASK 0xfffff000UL 1146 + #define CMDQ_CREATE_CQ_CQ_FCO_SFT 12 1147 + __le32 dpi; 1148 + __le32 cq_size; 1149 + __le64 pbl; 1428 1150 }; 1429 1151 1430 - /* Destroy CQ command (24 bytes) */ 1152 + /* creq_create_cq_resp (size:128b/16B) */ 1153 + struct creq_create_cq_resp { 1154 + u8 type; 1155 + #define CREQ_CREATE_CQ_RESP_TYPE_MASK 0x3fUL 1156 + #define CREQ_CREATE_CQ_RESP_TYPE_SFT 0 1157 + #define CREQ_CREATE_CQ_RESP_TYPE_QP_EVENT 0x38UL 1158 + #define CREQ_CREATE_CQ_RESP_TYPE_LAST CREQ_CREATE_CQ_RESP_TYPE_QP_EVENT 1159 + u8 status; 1160 + __le16 cookie; 1161 + __le32 xid; 1162 + u8 v; 1163 + #define CREQ_CREATE_CQ_RESP_V 0x1UL 1164 + u8 event; 1165 + #define CREQ_CREATE_CQ_RESP_EVENT_CREATE_CQ 0x9UL 1166 + #define CREQ_CREATE_CQ_RESP_EVENT_LAST CREQ_CREATE_CQ_RESP_EVENT_CREATE_CQ 1167 + u8 reserved48[6]; 1168 + }; 1169 + 1170 + /* cmdq_destroy_cq (size:192b/24B) */ 1431 1171 struct cmdq_destroy_cq { 1432 - u8 opcode; 1433 - #define CMDQ_DESTROY_CQ_OPCODE_DESTROY_CQ 0xaUL 1434 - u8 cmd_size; 1435 - __le16 flags; 1436 - __le16 cookie; 1437 - u8 resp_size; 1438 - u8 reserved8; 1439 - __le64 resp_addr; 1440 - __le32 cq_cid; 1441 - __le32 unused_0; 1172 + u8 opcode; 1173 + #define CMDQ_DESTROY_CQ_OPCODE_DESTROY_CQ 0xaUL 1174 + #define CMDQ_DESTROY_CQ_OPCODE_LAST CMDQ_DESTROY_CQ_OPCODE_DESTROY_CQ 1175 + u8 cmd_size; 1176 + __le16 flags; 1177 + __le16 cookie; 1178 + u8 resp_size; 1179 + u8 reserved8; 1180 + __le64 resp_addr; 1181 + __le32 cq_cid; 1182 + __le32 unused_0; 1442 1183 }; 1443 1184 1444 - /* Resize CQ command (40 bytes) */ 1185 + /* creq_destroy_cq_resp (size:128b/16B) */ 1186 + struct creq_destroy_cq_resp { 1187 + u8 type; 1188 + #define CREQ_DESTROY_CQ_RESP_TYPE_MASK 0x3fUL 1189 + #define CREQ_DESTROY_CQ_RESP_TYPE_SFT 0 1190 + #define CREQ_DESTROY_CQ_RESP_TYPE_QP_EVENT 0x38UL 1191 + #define CREQ_DESTROY_CQ_RESP_TYPE_LAST CREQ_DESTROY_CQ_RESP_TYPE_QP_EVENT 1192 + u8 status; 1193 + __le16 cookie; 1194 + __le32 xid; 1195 + u8 v; 1196 + #define CREQ_DESTROY_CQ_RESP_V 0x1UL 1197 + u8 event; 1198 + #define CREQ_DESTROY_CQ_RESP_EVENT_DESTROY_CQ 0xaUL 1199 + #define CREQ_DESTROY_CQ_RESP_EVENT_LAST CREQ_DESTROY_CQ_RESP_EVENT_DESTROY_CQ 1200 + __le16 cq_arm_lvl; 1201 + #define CREQ_DESTROY_CQ_RESP_CQ_ARM_LVL_MASK 0x3UL 1202 + #define CREQ_DESTROY_CQ_RESP_CQ_ARM_LVL_SFT 0 1203 + __le16 total_cnq_events; 1204 + __le16 reserved16; 1205 + }; 1206 + 1207 + /* cmdq_resize_cq (size:320b/40B) */ 1445 1208 struct cmdq_resize_cq { 1446 - u8 opcode; 1447 - #define CMDQ_RESIZE_CQ_OPCODE_RESIZE_CQ 0xcUL 1448 - u8 cmd_size; 1449 - __le16 flags; 1450 - __le16 cookie; 1451 - u8 resp_size; 1452 - u8 reserved8; 1453 - __le64 resp_addr; 1454 - __le32 cq_cid; 1455 - __le32 new_cq_size_pg_size_lvl; 1456 - #define CMDQ_RESIZE_CQ_LVL_MASK 0x3UL 1457 - #define CMDQ_RESIZE_CQ_LVL_SFT 0 1458 - #define CMDQ_RESIZE_CQ_LVL_LVL_0 0x0UL 1459 - #define CMDQ_RESIZE_CQ_LVL_LVL_1 0x1UL 1460 - #define CMDQ_RESIZE_CQ_LVL_LVL_2 0x2UL 1461 - #define CMDQ_RESIZE_CQ_PG_SIZE_MASK 0x1cUL 1462 - #define CMDQ_RESIZE_CQ_PG_SIZE_SFT 2 1463 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_4K (0x0UL << 2) 1464 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_8K (0x1UL << 2) 1465 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_64K (0x2UL << 2) 1466 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_2M (0x3UL << 2) 1467 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_8M (0x4UL << 2) 1468 - #define CMDQ_RESIZE_CQ_PG_SIZE_PG_1G (0x5UL << 2) 1469 - #define CMDQ_RESIZE_CQ_NEW_CQ_SIZE_MASK 0x1fffe0UL 1470 - #define CMDQ_RESIZE_CQ_NEW_CQ_SIZE_SFT 5 1471 - __le64 new_pbl; 1472 - __le32 new_cq_fco; 1473 - __le32 unused_2; 1209 + u8 opcode; 1210 + #define CMDQ_RESIZE_CQ_OPCODE_RESIZE_CQ 0xcUL 1211 + #define CMDQ_RESIZE_CQ_OPCODE_LAST CMDQ_RESIZE_CQ_OPCODE_RESIZE_CQ 1212 + u8 cmd_size; 1213 + __le16 flags; 1214 + __le16 cookie; 1215 + u8 resp_size; 1216 + u8 reserved8; 1217 + __le64 resp_addr; 1218 + __le32 cq_cid; 1219 + __le32 new_cq_size_pg_size_lvl; 1220 + #define CMDQ_RESIZE_CQ_LVL_MASK 0x3UL 1221 + #define CMDQ_RESIZE_CQ_LVL_SFT 0 1222 + #define CMDQ_RESIZE_CQ_LVL_LVL_0 0x0UL 1223 + #define CMDQ_RESIZE_CQ_LVL_LVL_1 0x1UL 1224 + #define CMDQ_RESIZE_CQ_LVL_LVL_2 0x2UL 1225 + #define CMDQ_RESIZE_CQ_LVL_LAST CMDQ_RESIZE_CQ_LVL_LVL_2 1226 + #define CMDQ_RESIZE_CQ_PG_SIZE_MASK 0x1cUL 1227 + #define CMDQ_RESIZE_CQ_PG_SIZE_SFT 2 1228 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_4K (0x0UL << 2) 1229 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_8K (0x1UL << 2) 1230 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_64K (0x2UL << 2) 1231 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_2M (0x3UL << 2) 1232 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_8M (0x4UL << 2) 1233 + #define CMDQ_RESIZE_CQ_PG_SIZE_PG_1G (0x5UL << 2) 1234 + #define CMDQ_RESIZE_CQ_PG_SIZE_LAST CMDQ_RESIZE_CQ_PG_SIZE_PG_1G 1235 + #define CMDQ_RESIZE_CQ_NEW_CQ_SIZE_MASK 0x1fffffe0UL 1236 + #define CMDQ_RESIZE_CQ_NEW_CQ_SIZE_SFT 5 1237 + __le64 new_pbl; 1238 + __le32 new_cq_fco; 1239 + __le32 unused_0; 1474 1240 }; 1475 1241 1476 - /* Allocate MRW command (32 bytes) */ 1242 + /* creq_resize_cq_resp (size:128b/16B) */ 1243 + struct creq_resize_cq_resp { 1244 + u8 type; 1245 + #define CREQ_RESIZE_CQ_RESP_TYPE_MASK 0x3fUL 1246 + #define CREQ_RESIZE_CQ_RESP_TYPE_SFT 0 1247 + #define CREQ_RESIZE_CQ_RESP_TYPE_QP_EVENT 0x38UL 1248 + #define CREQ_RESIZE_CQ_RESP_TYPE_LAST CREQ_RESIZE_CQ_RESP_TYPE_QP_EVENT 1249 + u8 status; 1250 + __le16 cookie; 1251 + __le32 xid; 1252 + u8 v; 1253 + #define CREQ_RESIZE_CQ_RESP_V 0x1UL 1254 + u8 event; 1255 + #define CREQ_RESIZE_CQ_RESP_EVENT_RESIZE_CQ 0xcUL 1256 + #define CREQ_RESIZE_CQ_RESP_EVENT_LAST CREQ_RESIZE_CQ_RESP_EVENT_RESIZE_CQ 1257 + u8 reserved48[6]; 1258 + }; 1259 + 1260 + /* cmdq_allocate_mrw (size:256b/32B) */ 1477 1261 struct cmdq_allocate_mrw { 1478 - u8 opcode; 1479 - #define CMDQ_ALLOCATE_MRW_OPCODE_ALLOCATE_MRW 0xdUL 1480 - u8 cmd_size; 1481 - __le16 flags; 1482 - __le16 cookie; 1483 - u8 resp_size; 1484 - u8 reserved8; 1485 - __le64 resp_addr; 1486 - __le64 mrw_handle; 1487 - u8 mrw_flags; 1488 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MASK 0xfUL 1489 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_SFT 0 1490 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MR 0x0UL 1491 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_PMR 0x1UL 1492 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE1 0x2UL 1493 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2A 0x3UL 1494 - #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2B 0x4UL 1495 - u8 access; 1496 - #define CMDQ_ALLOCATE_MRW_ACCESS_RESERVED_MASK 0x1fUL 1497 - #define CMDQ_ALLOCATE_MRW_ACCESS_RESERVED_SFT 0 1498 - #define CMDQ_ALLOCATE_MRW_ACCESS_CONSUMER_OWNED_KEY 0x20UL 1499 - __le16 unused_1; 1500 - __le32 pd_id; 1262 + u8 opcode; 1263 + #define CMDQ_ALLOCATE_MRW_OPCODE_ALLOCATE_MRW 0xdUL 1264 + #define CMDQ_ALLOCATE_MRW_OPCODE_LAST CMDQ_ALLOCATE_MRW_OPCODE_ALLOCATE_MRW 1265 + u8 cmd_size; 1266 + __le16 flags; 1267 + __le16 cookie; 1268 + u8 resp_size; 1269 + u8 reserved8; 1270 + __le64 resp_addr; 1271 + __le64 mrw_handle; 1272 + u8 mrw_flags; 1273 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MASK 0xfUL 1274 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_SFT 0 1275 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MR 0x0UL 1276 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_PMR 0x1UL 1277 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE1 0x2UL 1278 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2A 0x3UL 1279 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2B 0x4UL 1280 + #define CMDQ_ALLOCATE_MRW_MRW_FLAGS_LAST CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2B 1281 + #define CMDQ_ALLOCATE_MRW_UNUSED4_MASK 0xf0UL 1282 + #define CMDQ_ALLOCATE_MRW_UNUSED4_SFT 4 1283 + u8 access; 1284 + #define CMDQ_ALLOCATE_MRW_ACCESS_CONSUMER_OWNED_KEY 0x20UL 1285 + __le16 unused16; 1286 + __le32 pd_id; 1501 1287 }; 1502 1288 1503 - /* De-allocate key command (24 bytes) */ 1289 + /* creq_allocate_mrw_resp (size:128b/16B) */ 1290 + struct creq_allocate_mrw_resp { 1291 + u8 type; 1292 + #define CREQ_ALLOCATE_MRW_RESP_TYPE_MASK 0x3fUL 1293 + #define CREQ_ALLOCATE_MRW_RESP_TYPE_SFT 0 1294 + #define CREQ_ALLOCATE_MRW_RESP_TYPE_QP_EVENT 0x38UL 1295 + #define CREQ_ALLOCATE_MRW_RESP_TYPE_LAST CREQ_ALLOCATE_MRW_RESP_TYPE_QP_EVENT 1296 + u8 status; 1297 + __le16 cookie; 1298 + __le32 xid; 1299 + u8 v; 1300 + #define CREQ_ALLOCATE_MRW_RESP_V 0x1UL 1301 + u8 event; 1302 + #define CREQ_ALLOCATE_MRW_RESP_EVENT_ALLOCATE_MRW 0xdUL 1303 + #define CREQ_ALLOCATE_MRW_RESP_EVENT_LAST CREQ_ALLOCATE_MRW_RESP_EVENT_ALLOCATE_MRW 1304 + u8 reserved48[6]; 1305 + }; 1306 + 1307 + /* cmdq_deallocate_key (size:192b/24B) */ 1504 1308 struct cmdq_deallocate_key { 1505 - u8 opcode; 1506 - #define CMDQ_DEALLOCATE_KEY_OPCODE_DEALLOCATE_KEY 0xeUL 1507 - u8 cmd_size; 1508 - __le16 flags; 1509 - __le16 cookie; 1510 - u8 resp_size; 1511 - u8 reserved8; 1512 - __le64 resp_addr; 1513 - u8 mrw_flags; 1514 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MASK 0xfUL 1515 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_SFT 0 1516 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MR 0x0UL 1517 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_PMR 0x1UL 1518 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE1 0x2UL 1519 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE2A 0x3UL 1520 - #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE2B 0x4UL 1521 - u8 unused_1[3]; 1522 - __le32 key; 1309 + u8 opcode; 1310 + #define CMDQ_DEALLOCATE_KEY_OPCODE_DEALLOCATE_KEY 0xeUL 1311 + #define CMDQ_DEALLOCATE_KEY_OPCODE_LAST CMDQ_DEALLOCATE_KEY_OPCODE_DEALLOCATE_KEY 1312 + u8 cmd_size; 1313 + __le16 flags; 1314 + __le16 cookie; 1315 + u8 resp_size; 1316 + u8 reserved8; 1317 + __le64 resp_addr; 1318 + u8 mrw_flags; 1319 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MASK 0xfUL 1320 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_SFT 0 1321 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MR 0x0UL 1322 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_PMR 0x1UL 1323 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE1 0x2UL 1324 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE2A 0x3UL 1325 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE2B 0x4UL 1326 + #define CMDQ_DEALLOCATE_KEY_MRW_FLAGS_LAST CMDQ_DEALLOCATE_KEY_MRW_FLAGS_MW_TYPE2B 1327 + #define CMDQ_DEALLOCATE_KEY_UNUSED4_MASK 0xf0UL 1328 + #define CMDQ_DEALLOCATE_KEY_UNUSED4_SFT 4 1329 + u8 unused24[3]; 1330 + __le32 key; 1523 1331 }; 1524 1332 1525 - /* Register MR command (48 bytes) */ 1333 + /* creq_deallocate_key_resp (size:128b/16B) */ 1334 + struct creq_deallocate_key_resp { 1335 + u8 type; 1336 + #define CREQ_DEALLOCATE_KEY_RESP_TYPE_MASK 0x3fUL 1337 + #define CREQ_DEALLOCATE_KEY_RESP_TYPE_SFT 0 1338 + #define CREQ_DEALLOCATE_KEY_RESP_TYPE_QP_EVENT 0x38UL 1339 + #define CREQ_DEALLOCATE_KEY_RESP_TYPE_LAST CREQ_DEALLOCATE_KEY_RESP_TYPE_QP_EVENT 1340 + u8 status; 1341 + __le16 cookie; 1342 + __le32 xid; 1343 + u8 v; 1344 + #define CREQ_DEALLOCATE_KEY_RESP_V 0x1UL 1345 + u8 event; 1346 + #define CREQ_DEALLOCATE_KEY_RESP_EVENT_DEALLOCATE_KEY 0xeUL 1347 + #define CREQ_DEALLOCATE_KEY_RESP_EVENT_LAST CREQ_DEALLOCATE_KEY_RESP_EVENT_DEALLOCATE_KEY 1348 + __le16 reserved16; 1349 + __le32 bound_window_info; 1350 + }; 1351 + 1352 + /* cmdq_register_mr (size:384b/48B) */ 1526 1353 struct cmdq_register_mr { 1527 - u8 opcode; 1528 - #define CMDQ_REGISTER_MR_OPCODE_REGISTER_MR 0xfUL 1529 - u8 cmd_size; 1530 - __le16 flags; 1531 - __le16 cookie; 1532 - u8 resp_size; 1533 - u8 reserved8; 1534 - __le64 resp_addr; 1535 - u8 log2_pg_size_lvl; 1536 - #define CMDQ_REGISTER_MR_LVL_MASK 0x3UL 1537 - #define CMDQ_REGISTER_MR_LVL_SFT 0 1538 - #define CMDQ_REGISTER_MR_LVL_LVL_0 0x0UL 1539 - #define CMDQ_REGISTER_MR_LVL_LVL_1 0x1UL 1540 - #define CMDQ_REGISTER_MR_LVL_LVL_2 0x2UL 1354 + u8 opcode; 1355 + #define CMDQ_REGISTER_MR_OPCODE_REGISTER_MR 0xfUL 1356 + #define CMDQ_REGISTER_MR_OPCODE_LAST CMDQ_REGISTER_MR_OPCODE_REGISTER_MR 1357 + u8 cmd_size; 1358 + __le16 flags; 1359 + #define CMDQ_REGISTER_MR_FLAGS_ALLOC_MR 0x1UL 1360 + __le16 cookie; 1361 + u8 resp_size; 1362 + u8 reserved8; 1363 + __le64 resp_addr; 1364 + u8 log2_pg_size_lvl; 1365 + #define CMDQ_REGISTER_MR_LVL_MASK 0x3UL 1366 + #define CMDQ_REGISTER_MR_LVL_SFT 0 1367 + #define CMDQ_REGISTER_MR_LVL_LVL_0 0x0UL 1368 + #define CMDQ_REGISTER_MR_LVL_LVL_1 0x1UL 1369 + #define CMDQ_REGISTER_MR_LVL_LVL_2 0x2UL 1541 1370 #define CMDQ_REGISTER_MR_LVL_LAST CMDQ_REGISTER_MR_LVL_LVL_2 1542 - #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_MASK 0x7cUL 1543 - #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_SFT 2 1371 + #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_MASK 0x7cUL 1372 + #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_SFT 2 1544 1373 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_4K (0xcUL << 2) 1545 1374 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_8K (0xdUL << 2) 1546 1375 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_64K (0x10UL << 2) ··· 1378 1549 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_2M (0x15UL << 2) 1379 1550 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_4M (0x16UL << 2) 1380 1551 #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_1G (0x1eUL << 2) 1381 - #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_LAST \ 1382 - CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_1G 1552 + #define CMDQ_REGISTER_MR_LOG2_PG_SIZE_LAST CMDQ_REGISTER_MR_LOG2_PG_SIZE_PG_1G 1383 1553 #define CMDQ_REGISTER_MR_UNUSED1 0x80UL 1384 - u8 access; 1385 - #define CMDQ_REGISTER_MR_ACCESS_LOCAL_WRITE 0x1UL 1386 - #define CMDQ_REGISTER_MR_ACCESS_REMOTE_READ 0x2UL 1387 - #define CMDQ_REGISTER_MR_ACCESS_REMOTE_WRITE 0x4UL 1388 - #define CMDQ_REGISTER_MR_ACCESS_REMOTE_ATOMIC 0x8UL 1389 - #define CMDQ_REGISTER_MR_ACCESS_MW_BIND 0x10UL 1390 - #define CMDQ_REGISTER_MR_ACCESS_ZERO_BASED 0x20UL 1554 + u8 access; 1555 + #define CMDQ_REGISTER_MR_ACCESS_LOCAL_WRITE 0x1UL 1556 + #define CMDQ_REGISTER_MR_ACCESS_REMOTE_READ 0x2UL 1557 + #define CMDQ_REGISTER_MR_ACCESS_REMOTE_WRITE 0x4UL 1558 + #define CMDQ_REGISTER_MR_ACCESS_REMOTE_ATOMIC 0x8UL 1559 + #define CMDQ_REGISTER_MR_ACCESS_MW_BIND 0x10UL 1560 + #define CMDQ_REGISTER_MR_ACCESS_ZERO_BASED 0x20UL 1391 1561 __le16 log2_pbl_pg_size; 1392 1562 #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_MASK 0x1fUL 1393 1563 #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_SFT 0 ··· 1398 1570 #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_2M 0x15UL 1399 1571 #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_4M 0x16UL 1400 1572 #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_1G 0x1eUL 1401 - #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_LAST \ 1402 - CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_1G 1573 + #define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_LAST CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_1G 1403 1574 #define CMDQ_REGISTER_MR_UNUSED11_MASK 0xffe0UL 1404 1575 #define CMDQ_REGISTER_MR_UNUSED11_SFT 5 1405 - __le32 key; 1406 - __le64 pbl; 1407 - __le64 va; 1408 - __le64 mr_size; 1576 + __le32 key; 1577 + __le64 pbl; 1578 + __le64 va; 1579 + __le64 mr_size; 1409 1580 }; 1410 1581 1411 - /* Deregister MR command (24 bytes) */ 1582 + /* creq_register_mr_resp (size:128b/16B) */ 1583 + struct creq_register_mr_resp { 1584 + u8 type; 1585 + #define CREQ_REGISTER_MR_RESP_TYPE_MASK 0x3fUL 1586 + #define CREQ_REGISTER_MR_RESP_TYPE_SFT 0 1587 + #define CREQ_REGISTER_MR_RESP_TYPE_QP_EVENT 0x38UL 1588 + #define CREQ_REGISTER_MR_RESP_TYPE_LAST CREQ_REGISTER_MR_RESP_TYPE_QP_EVENT 1589 + u8 status; 1590 + __le16 cookie; 1591 + __le32 xid; 1592 + u8 v; 1593 + #define CREQ_REGISTER_MR_RESP_V 0x1UL 1594 + u8 event; 1595 + #define CREQ_REGISTER_MR_RESP_EVENT_REGISTER_MR 0xfUL 1596 + #define CREQ_REGISTER_MR_RESP_EVENT_LAST CREQ_REGISTER_MR_RESP_EVENT_REGISTER_MR 1597 + u8 reserved48[6]; 1598 + }; 1599 + 1600 + /* cmdq_deregister_mr (size:192b/24B) */ 1412 1601 struct cmdq_deregister_mr { 1413 - u8 opcode; 1414 - #define CMDQ_DEREGISTER_MR_OPCODE_DEREGISTER_MR 0x10UL 1415 - u8 cmd_size; 1416 - __le16 flags; 1417 - __le16 cookie; 1418 - u8 resp_size; 1419 - u8 reserved8; 1420 - __le64 resp_addr; 1421 - __le32 lkey; 1422 - __le32 unused_0; 1423 - }; 1424 - 1425 - /* Add GID command (48 bytes) */ 1426 - struct cmdq_add_gid { 1427 - u8 opcode; 1428 - #define CMDQ_ADD_GID_OPCODE_ADD_GID 0x11UL 1429 - u8 cmd_size; 1430 - __le16 flags; 1431 - __le16 cookie; 1432 - u8 resp_size; 1433 - u8 reserved8; 1434 - __le64 resp_addr; 1435 - __be32 gid[4]; 1436 - __be16 src_mac[3]; 1437 - __le16 vlan; 1438 - #define CMDQ_ADD_GID_VLAN_VLAN_ID_MASK 0xfffUL 1439 - #define CMDQ_ADD_GID_VLAN_VLAN_ID_SFT 0 1440 - #define CMDQ_ADD_GID_VLAN_TPID_MASK 0x7000UL 1441 - #define CMDQ_ADD_GID_VLAN_TPID_SFT 12 1442 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_88A8 (0x0UL << 12) 1443 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_8100 (0x1UL << 12) 1444 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_9100 (0x2UL << 12) 1445 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_9200 (0x3UL << 12) 1446 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_9300 (0x4UL << 12) 1447 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 1448 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 1449 - #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 1450 - #define CMDQ_ADD_GID_VLAN_TPID_LAST CMDQ_ADD_GID_VLAN_TPID_TPID_CFG3 1451 - #define CMDQ_ADD_GID_VLAN_VLAN_EN 0x8000UL 1452 - __le16 ipid; 1453 - __le16 stats_ctx; 1454 - #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_ID_MASK 0x7fffUL 1455 - #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_ID_SFT 0 1456 - #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_VALID 0x8000UL 1457 - __le32 unused_0; 1458 - }; 1459 - 1460 - /* Delete GID command (24 bytes) */ 1461 - struct cmdq_delete_gid { 1462 - u8 opcode; 1463 - #define CMDQ_DELETE_GID_OPCODE_DELETE_GID 0x12UL 1464 - u8 cmd_size; 1465 - __le16 flags; 1466 - __le16 cookie; 1467 - u8 resp_size; 1468 - u8 reserved8; 1469 - __le64 resp_addr; 1470 - __le16 gid_index; 1471 - __le16 unused_0; 1472 - __le32 unused_1; 1473 - }; 1474 - 1475 - /* Modify GID command (48 bytes) */ 1476 - struct cmdq_modify_gid { 1477 - u8 opcode; 1478 - #define CMDQ_MODIFY_GID_OPCODE_MODIFY_GID 0x17UL 1479 - u8 cmd_size; 1480 - __le16 flags; 1481 - __le16 cookie; 1482 - u8 resp_size; 1483 - u8 reserved8; 1484 - __le64 resp_addr; 1485 - __be32 gid[4]; 1486 - __be16 src_mac[3]; 1487 - __le16 vlan; 1488 - #define CMDQ_MODIFY_GID_VLAN_VLAN_ID_MASK 0xfffUL 1489 - #define CMDQ_MODIFY_GID_VLAN_VLAN_ID_SFT 0 1490 - #define CMDQ_MODIFY_GID_VLAN_TPID_MASK 0x7000UL 1491 - #define CMDQ_MODIFY_GID_VLAN_TPID_SFT 12 1492 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_88A8 (0x0UL << 12) 1493 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_8100 (0x1UL << 12) 1494 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9100 (0x2UL << 12) 1495 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9200 (0x3UL << 12) 1496 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9300 (0x4UL << 12) 1497 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 1498 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 1499 - #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 1500 - #define CMDQ_MODIFY_GID_VLAN_TPID_LAST \ 1501 - CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG3 1502 - #define CMDQ_MODIFY_GID_VLAN_VLAN_EN 0x8000UL 1503 - __le16 ipid; 1504 - __le16 gid_index; 1505 - __le16 stats_ctx; 1506 - #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_ID_MASK 0x7fffUL 1507 - #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_ID_SFT 0 1508 - #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_VALID 0x8000UL 1509 - __le16 unused_0; 1510 - }; 1511 - 1512 - /* Query GID command (24 bytes) */ 1513 - struct cmdq_query_gid { 1514 - u8 opcode; 1515 - #define CMDQ_QUERY_GID_OPCODE_QUERY_GID 0x18UL 1516 - u8 cmd_size; 1517 - __le16 flags; 1518 - __le16 cookie; 1519 - u8 resp_size; 1520 - u8 reserved8; 1521 - __le64 resp_addr; 1522 - __le16 gid_index; 1523 - __le16 unused_0; 1524 - __le32 unused_1; 1525 - }; 1526 - 1527 - /* Create QP1 command (80 bytes) */ 1528 - struct cmdq_create_qp1 { 1529 - u8 opcode; 1530 - #define CMDQ_CREATE_QP1_OPCODE_CREATE_QP1 0x13UL 1531 - u8 cmd_size; 1532 - __le16 flags; 1533 - __le16 cookie; 1534 - u8 resp_size; 1535 - u8 reserved8; 1536 - __le64 resp_addr; 1537 - __le64 qp_handle; 1538 - __le32 qp_flags; 1539 - #define CMDQ_CREATE_QP1_QP_FLAGS_SRQ_USED 0x1UL 1540 - #define CMDQ_CREATE_QP1_QP_FLAGS_FORCE_COMPLETION 0x2UL 1541 - #define CMDQ_CREATE_QP1_QP_FLAGS_RESERVED_LKEY_ENABLE 0x4UL 1542 - u8 type; 1543 - #define CMDQ_CREATE_QP1_TYPE_GSI 0x1UL 1544 - u8 sq_pg_size_sq_lvl; 1545 - #define CMDQ_CREATE_QP1_SQ_LVL_MASK 0xfUL 1546 - #define CMDQ_CREATE_QP1_SQ_LVL_SFT 0 1547 - #define CMDQ_CREATE_QP1_SQ_LVL_LVL_0 0x0UL 1548 - #define CMDQ_CREATE_QP1_SQ_LVL_LVL_1 0x1UL 1549 - #define CMDQ_CREATE_QP1_SQ_LVL_LVL_2 0x2UL 1550 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_MASK 0xf0UL 1551 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_SFT 4 1552 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_4K (0x0UL << 4) 1553 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_8K (0x1UL << 4) 1554 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_64K (0x2UL << 4) 1555 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_2M (0x3UL << 4) 1556 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_8M (0x4UL << 4) 1557 - #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_1G (0x5UL << 4) 1558 - u8 rq_pg_size_rq_lvl; 1559 - #define CMDQ_CREATE_QP1_RQ_LVL_MASK 0xfUL 1560 - #define CMDQ_CREATE_QP1_RQ_LVL_SFT 0 1561 - #define CMDQ_CREATE_QP1_RQ_LVL_LVL_0 0x0UL 1562 - #define CMDQ_CREATE_QP1_RQ_LVL_LVL_1 0x1UL 1563 - #define CMDQ_CREATE_QP1_RQ_LVL_LVL_2 0x2UL 1564 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_MASK 0xf0UL 1565 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_SFT 4 1566 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_4K (0x0UL << 4) 1567 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_8K (0x1UL << 4) 1568 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_64K (0x2UL << 4) 1569 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_2M (0x3UL << 4) 1570 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_8M (0x4UL << 4) 1571 - #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_1G (0x5UL << 4) 1572 - u8 unused_0; 1573 - __le32 dpi; 1574 - __le32 sq_size; 1575 - __le32 rq_size; 1576 - __le16 sq_fwo_sq_sge; 1577 - #define CMDQ_CREATE_QP1_SQ_SGE_MASK 0xfUL 1578 - #define CMDQ_CREATE_QP1_SQ_SGE_SFT 0 1579 - #define CMDQ_CREATE_QP1_SQ_FWO_MASK 0xfff0UL 1580 - #define CMDQ_CREATE_QP1_SQ_FWO_SFT 4 1581 - __le16 rq_fwo_rq_sge; 1582 - #define CMDQ_CREATE_QP1_RQ_SGE_MASK 0xfUL 1583 - #define CMDQ_CREATE_QP1_RQ_SGE_SFT 0 1584 - #define CMDQ_CREATE_QP1_RQ_FWO_MASK 0xfff0UL 1585 - #define CMDQ_CREATE_QP1_RQ_FWO_SFT 4 1586 - __le32 scq_cid; 1587 - __le32 rcq_cid; 1588 - __le32 srq_cid; 1589 - __le32 pd_id; 1590 - __le64 sq_pbl; 1591 - __le64 rq_pbl; 1592 - }; 1593 - 1594 - /* Destroy QP1 command (24 bytes) */ 1595 - struct cmdq_destroy_qp1 { 1596 - u8 opcode; 1597 - #define CMDQ_DESTROY_QP1_OPCODE_DESTROY_QP1 0x14UL 1598 - u8 cmd_size; 1599 - __le16 flags; 1600 - __le16 cookie; 1601 - u8 resp_size; 1602 - u8 reserved8; 1603 - __le64 resp_addr; 1604 - __le32 qp1_cid; 1605 - __le32 unused_0; 1606 - }; 1607 - 1608 - /* Create AH command (64 bytes) */ 1609 - struct cmdq_create_ah { 1610 - u8 opcode; 1611 - #define CMDQ_CREATE_AH_OPCODE_CREATE_AH 0x15UL 1612 - u8 cmd_size; 1613 - __le16 flags; 1614 - __le16 cookie; 1615 - u8 resp_size; 1616 - u8 reserved8; 1617 - __le64 resp_addr; 1618 - __le64 ah_handle; 1619 - __le32 dgid[4]; 1620 - u8 type; 1621 - #define CMDQ_CREATE_AH_TYPE_V1 0x0UL 1622 - #define CMDQ_CREATE_AH_TYPE_V2IPV4 0x2UL 1623 - #define CMDQ_CREATE_AH_TYPE_V2IPV6 0x3UL 1624 - u8 hop_limit; 1625 - __le16 sgid_index; 1626 - __le32 dest_vlan_id_flow_label; 1627 - #define CMDQ_CREATE_AH_FLOW_LABEL_MASK 0xfffffUL 1628 - #define CMDQ_CREATE_AH_FLOW_LABEL_SFT 0 1629 - #define CMDQ_CREATE_AH_DEST_VLAN_ID_MASK 0xfff00000UL 1630 - #define CMDQ_CREATE_AH_DEST_VLAN_ID_SFT 20 1631 - __le32 pd_id; 1632 - __le32 unused_0; 1633 - __le16 dest_mac[3]; 1634 - u8 traffic_class; 1635 - u8 unused_1; 1636 - }; 1637 - 1638 - /* Destroy AH command (24 bytes) */ 1639 - struct cmdq_destroy_ah { 1640 - u8 opcode; 1641 - #define CMDQ_DESTROY_AH_OPCODE_DESTROY_AH 0x16UL 1642 - u8 cmd_size; 1643 - __le16 flags; 1644 - __le16 cookie; 1645 - u8 resp_size; 1646 - u8 reserved8; 1647 - __le64 resp_addr; 1648 - __le32 ah_cid; 1649 - __le32 unused_0; 1650 - }; 1651 - 1652 - /* Initialize Firmware command (112 bytes) */ 1653 - struct cmdq_initialize_fw { 1654 - u8 opcode; 1655 - #define CMDQ_INITIALIZE_FW_OPCODE_INITIALIZE_FW 0x80UL 1656 - u8 cmd_size; 1657 - __le16 flags; 1658 - __le16 cookie; 1659 - u8 resp_size; 1660 - u8 reserved8; 1661 - __le64 resp_addr; 1662 - u8 qpc_pg_size_qpc_lvl; 1663 - #define CMDQ_INITIALIZE_FW_QPC_LVL_MASK 0xfUL 1664 - #define CMDQ_INITIALIZE_FW_QPC_LVL_SFT 0 1665 - #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_0 0x0UL 1666 - #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_1 0x1UL 1667 - #define CMDQ_INITIALIZE_FW_QPC_LVL_LVL_2 0x2UL 1668 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_MASK 0xf0UL 1669 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_SFT 4 1670 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_4K (0x0UL << 4) 1671 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_8K (0x1UL << 4) 1672 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_64K (0x2UL << 4) 1673 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_2M (0x3UL << 4) 1674 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_8M (0x4UL << 4) 1675 - #define CMDQ_INITIALIZE_FW_QPC_PG_SIZE_PG_1G (0x5UL << 4) 1676 - u8 mrw_pg_size_mrw_lvl; 1677 - #define CMDQ_INITIALIZE_FW_MRW_LVL_MASK 0xfUL 1678 - #define CMDQ_INITIALIZE_FW_MRW_LVL_SFT 0 1679 - #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_0 0x0UL 1680 - #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_1 0x1UL 1681 - #define CMDQ_INITIALIZE_FW_MRW_LVL_LVL_2 0x2UL 1682 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_MASK 0xf0UL 1683 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_SFT 4 1684 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_4K (0x0UL << 4) 1685 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_8K (0x1UL << 4) 1686 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_64K (0x2UL << 4) 1687 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_2M (0x3UL << 4) 1688 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_8M (0x4UL << 4) 1689 - #define CMDQ_INITIALIZE_FW_MRW_PG_SIZE_PG_1G (0x5UL << 4) 1690 - u8 srq_pg_size_srq_lvl; 1691 - #define CMDQ_INITIALIZE_FW_SRQ_LVL_MASK 0xfUL 1692 - #define CMDQ_INITIALIZE_FW_SRQ_LVL_SFT 0 1693 - #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_0 0x0UL 1694 - #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_1 0x1UL 1695 - #define CMDQ_INITIALIZE_FW_SRQ_LVL_LVL_2 0x2UL 1696 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_MASK 0xf0UL 1697 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_SFT 4 1698 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_4K (0x0UL << 4) 1699 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_8K (0x1UL << 4) 1700 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_64K (0x2UL << 4) 1701 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_2M (0x3UL << 4) 1702 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_8M (0x4UL << 4) 1703 - #define CMDQ_INITIALIZE_FW_SRQ_PG_SIZE_PG_1G (0x5UL << 4) 1704 - u8 cq_pg_size_cq_lvl; 1705 - #define CMDQ_INITIALIZE_FW_CQ_LVL_MASK 0xfUL 1706 - #define CMDQ_INITIALIZE_FW_CQ_LVL_SFT 0 1707 - #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_0 0x0UL 1708 - #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_1 0x1UL 1709 - #define CMDQ_INITIALIZE_FW_CQ_LVL_LVL_2 0x2UL 1710 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_MASK 0xf0UL 1711 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_SFT 4 1712 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_4K (0x0UL << 4) 1713 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_8K (0x1UL << 4) 1714 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_64K (0x2UL << 4) 1715 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_2M (0x3UL << 4) 1716 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_8M (0x4UL << 4) 1717 - #define CMDQ_INITIALIZE_FW_CQ_PG_SIZE_PG_1G (0x5UL << 4) 1718 - u8 tqm_pg_size_tqm_lvl; 1719 - #define CMDQ_INITIALIZE_FW_TQM_LVL_MASK 0xfUL 1720 - #define CMDQ_INITIALIZE_FW_TQM_LVL_SFT 0 1721 - #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_0 0x0UL 1722 - #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_1 0x1UL 1723 - #define CMDQ_INITIALIZE_FW_TQM_LVL_LVL_2 0x2UL 1724 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_MASK 0xf0UL 1725 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_SFT 4 1726 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_4K (0x0UL << 4) 1727 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_8K (0x1UL << 4) 1728 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_64K (0x2UL << 4) 1729 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_2M (0x3UL << 4) 1730 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_8M (0x4UL << 4) 1731 - #define CMDQ_INITIALIZE_FW_TQM_PG_SIZE_PG_1G (0x5UL << 4) 1732 - u8 tim_pg_size_tim_lvl; 1733 - #define CMDQ_INITIALIZE_FW_TIM_LVL_MASK 0xfUL 1734 - #define CMDQ_INITIALIZE_FW_TIM_LVL_SFT 0 1735 - #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_0 0x0UL 1736 - #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_1 0x1UL 1737 - #define CMDQ_INITIALIZE_FW_TIM_LVL_LVL_2 0x2UL 1738 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_MASK 0xf0UL 1739 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_SFT 4 1740 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_4K (0x0UL << 4) 1741 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_8K (0x1UL << 4) 1742 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_64K (0x2UL << 4) 1743 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_2M (0x3UL << 4) 1744 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_8M (0x4UL << 4) 1745 - #define CMDQ_INITIALIZE_FW_TIM_PG_SIZE_PG_1G (0x5UL << 4) 1746 - /* This value is (log-base-2-of-DBR-page-size - 12). 1747 - * 0 for 4KB. HW supported values are enumerated below. 1748 - */ 1749 - __le16 log2_dbr_pg_size; 1750 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_MASK 0xfUL 1751 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_SFT 0 1752 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_4K 0x0UL 1753 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_8K 0x1UL 1754 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_16K 0x2UL 1755 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_32K 0x3UL 1756 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_64K 0x4UL 1757 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128K 0x5UL 1758 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_256K 0x6UL 1759 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_512K 0x7UL 1760 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_1M 0x8UL 1761 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_2M 0x9UL 1762 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_4M 0xaUL 1763 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_8M 0xbUL 1764 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_16M 0xcUL 1765 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_32M 0xdUL 1766 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_64M 0xeUL 1767 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128M 0xfUL 1768 - #define CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_LAST \ 1769 - CMDQ_INITIALIZE_FW_LOG2_DBR_PG_SIZE_PG_128M 1770 - __le64 qpc_page_dir; 1771 - __le64 mrw_page_dir; 1772 - __le64 srq_page_dir; 1773 - __le64 cq_page_dir; 1774 - __le64 tqm_page_dir; 1775 - __le64 tim_page_dir; 1776 - __le32 number_of_qp; 1777 - __le32 number_of_mrw; 1778 - __le32 number_of_srq; 1779 - __le32 number_of_cq; 1780 - __le32 max_qp_per_vf; 1781 - __le32 max_mrw_per_vf; 1782 - __le32 max_srq_per_vf; 1783 - __le32 max_cq_per_vf; 1784 - __le32 max_gid_per_vf; 1785 - __le32 stat_ctx_id; 1786 - }; 1787 - 1788 - /* De-initialize Firmware command (16 bytes) */ 1789 - struct cmdq_deinitialize_fw { 1790 - u8 opcode; 1791 - #define CMDQ_DEINITIALIZE_FW_OPCODE_DEINITIALIZE_FW 0x81UL 1792 - u8 cmd_size; 1793 - __le16 flags; 1794 - __le16 cookie; 1795 - u8 resp_size; 1796 - u8 reserved8; 1797 - __le64 resp_addr; 1798 - }; 1799 - 1800 - /* Stop function command (16 bytes) */ 1801 - struct cmdq_stop_func { 1802 - u8 opcode; 1803 - #define CMDQ_STOP_FUNC_OPCODE_STOP_FUNC 0x82UL 1804 - u8 cmd_size; 1805 - __le16 flags; 1806 - __le16 cookie; 1807 - u8 resp_size; 1808 - u8 reserved8; 1809 - __le64 resp_addr; 1810 - }; 1811 - 1812 - /* Query function command (16 bytes) */ 1813 - struct cmdq_query_func { 1814 - u8 opcode; 1815 - #define CMDQ_QUERY_FUNC_OPCODE_QUERY_FUNC 0x83UL 1816 - u8 cmd_size; 1817 - __le16 flags; 1818 - __le16 cookie; 1819 - u8 resp_size; 1820 - u8 reserved8; 1821 - __le64 resp_addr; 1822 - }; 1823 - 1824 - /* Set function resources command (16 bytes) */ 1825 - struct cmdq_set_func_resources { 1826 - u8 opcode; 1827 - #define CMDQ_SET_FUNC_RESOURCES_OPCODE_SET_FUNC_RESOURCES 0x84UL 1828 - u8 cmd_size; 1829 - __le16 flags; 1830 - __le16 cookie; 1831 - u8 resp_size; 1832 - u8 reserved8; 1833 - __le64 resp_addr; 1834 - __le32 number_of_qp; 1835 - __le32 number_of_mrw; 1836 - __le32 number_of_srq; 1837 - __le32 number_of_cq; 1838 - __le32 max_qp_per_vf; 1839 - __le32 max_mrw_per_vf; 1840 - __le32 max_srq_per_vf; 1841 - __le32 max_cq_per_vf; 1842 - __le32 max_gid_per_vf; 1843 - __le32 stat_ctx_id; 1844 - }; 1845 - 1846 - /* Read hardware resource context command (24 bytes) */ 1847 - struct cmdq_read_context { 1848 - u8 opcode; 1849 - #define CMDQ_READ_CONTEXT_OPCODE_READ_CONTEXT 0x85UL 1850 - u8 cmd_size; 1851 - __le16 flags; 1852 - __le16 cookie; 1853 - u8 resp_size; 1854 - u8 reserved8; 1855 - __le64 resp_addr; 1856 - __le32 type_xid; 1857 - #define CMDQ_READ_CONTEXT_XID_MASK 0xffffffUL 1858 - #define CMDQ_READ_CONTEXT_XID_SFT 0 1859 - #define CMDQ_READ_CONTEXT_TYPE_MASK 0xff000000UL 1860 - #define CMDQ_READ_CONTEXT_TYPE_SFT 24 1861 - #define CMDQ_READ_CONTEXT_TYPE_QPC (0x0UL << 24) 1862 - #define CMDQ_READ_CONTEXT_TYPE_CQ (0x1UL << 24) 1863 - #define CMDQ_READ_CONTEXT_TYPE_MRW (0x2UL << 24) 1864 - #define CMDQ_READ_CONTEXT_TYPE_SRQ (0x3UL << 24) 1865 - __le32 unused_0; 1866 - }; 1867 - 1868 - /* Map TC to COS. Can only be issued from a PF (24 bytes) */ 1869 - struct cmdq_map_tc_to_cos { 1870 - u8 opcode; 1871 - #define CMDQ_MAP_TC_TO_COS_OPCODE_MAP_TC_TO_COS 0x8aUL 1872 - u8 cmd_size; 1873 - __le16 flags; 1874 - __le16 cookie; 1875 - u8 resp_size; 1876 - u8 reserved8; 1877 - __le64 resp_addr; 1878 - __le16 cos0; 1879 - #define CMDQ_MAP_TC_TO_COS_COS0_NO_CHANGE 0xffffUL 1880 - __le16 cos1; 1881 - #define CMDQ_MAP_TC_TO_COS_COS1_DISABLE 0x8000UL 1882 - #define CMDQ_MAP_TC_TO_COS_COS1_NO_CHANGE 0xffffUL 1883 - __le32 unused_0; 1884 - }; 1885 - 1886 - /* Query version command (16 bytes) */ 1887 - struct cmdq_query_version { 1888 - u8 opcode; 1889 - #define CMDQ_QUERY_VERSION_OPCODE_QUERY_VERSION 0x8bUL 1890 - u8 cmd_size; 1891 - __le16 flags; 1892 - __le16 cookie; 1893 - u8 resp_size; 1894 - u8 reserved8; 1895 - __le64 resp_addr; 1896 - }; 1897 - 1898 - /* Command-Response Event Queue (CREQ) Structures */ 1899 - /* Base CREQ Record (16 bytes) */ 1900 - struct creq_base { 1901 - u8 type; 1902 - #define CREQ_BASE_TYPE_MASK 0x3fUL 1903 - #define CREQ_BASE_TYPE_SFT 0 1904 - #define CREQ_BASE_TYPE_QP_EVENT 0x38UL 1905 - #define CREQ_BASE_TYPE_FUNC_EVENT 0x3aUL 1906 - #define CREQ_BASE_RESERVED2_MASK 0xc0UL 1907 - #define CREQ_BASE_RESERVED2_SFT 6 1908 - u8 reserved56[7]; 1909 - u8 v; 1910 - #define CREQ_BASE_V 0x1UL 1911 - #define CREQ_BASE_RESERVED7_MASK 0xfeUL 1912 - #define CREQ_BASE_RESERVED7_SFT 1 1913 - u8 event; 1914 - __le16 reserved48[3]; 1915 - }; 1916 - 1917 - /* RoCE Function Async Event Notification (16 bytes) */ 1918 - struct creq_func_event { 1919 - u8 type; 1920 - #define CREQ_FUNC_EVENT_TYPE_MASK 0x3fUL 1921 - #define CREQ_FUNC_EVENT_TYPE_SFT 0 1922 - #define CREQ_FUNC_EVENT_TYPE_FUNC_EVENT 0x3aUL 1923 - #define CREQ_FUNC_EVENT_RESERVED2_MASK 0xc0UL 1924 - #define CREQ_FUNC_EVENT_RESERVED2_SFT 6 1925 - u8 reserved56[7]; 1926 - u8 v; 1927 - #define CREQ_FUNC_EVENT_V 0x1UL 1928 - #define CREQ_FUNC_EVENT_RESERVED7_MASK 0xfeUL 1929 - #define CREQ_FUNC_EVENT_RESERVED7_SFT 1 1930 - u8 event; 1931 - #define CREQ_FUNC_EVENT_EVENT_TX_WQE_ERROR 0x1UL 1932 - #define CREQ_FUNC_EVENT_EVENT_TX_DATA_ERROR 0x2UL 1933 - #define CREQ_FUNC_EVENT_EVENT_RX_WQE_ERROR 0x3UL 1934 - #define CREQ_FUNC_EVENT_EVENT_RX_DATA_ERROR 0x4UL 1935 - #define CREQ_FUNC_EVENT_EVENT_CQ_ERROR 0x5UL 1936 - #define CREQ_FUNC_EVENT_EVENT_TQM_ERROR 0x6UL 1937 - #define CREQ_FUNC_EVENT_EVENT_CFCQ_ERROR 0x7UL 1938 - #define CREQ_FUNC_EVENT_EVENT_CFCS_ERROR 0x8UL 1939 - #define CREQ_FUNC_EVENT_EVENT_CFCC_ERROR 0x9UL 1940 - #define CREQ_FUNC_EVENT_EVENT_CFCM_ERROR 0xaUL 1941 - #define CREQ_FUNC_EVENT_EVENT_TIM_ERROR 0xbUL 1942 - #define CREQ_FUNC_EVENT_EVENT_VF_COMM_REQUEST 0x80UL 1943 - #define CREQ_FUNC_EVENT_EVENT_RESOURCE_EXHAUSTED 0x81UL 1944 - __le16 reserved48[3]; 1945 - }; 1946 - 1947 - /* RoCE Slowpath Command Completion (16 bytes) */ 1948 - struct creq_qp_event { 1949 - u8 type; 1950 - #define CREQ_QP_EVENT_TYPE_MASK 0x3fUL 1951 - #define CREQ_QP_EVENT_TYPE_SFT 0 1952 - #define CREQ_QP_EVENT_TYPE_QP_EVENT 0x38UL 1953 - #define CREQ_QP_EVENT_RESERVED2_MASK 0xc0UL 1954 - #define CREQ_QP_EVENT_RESERVED2_SFT 6 1955 - u8 status; 1956 - __le16 cookie; 1957 - __le32 reserved32; 1958 - u8 v; 1959 - #define CREQ_QP_EVENT_V 0x1UL 1960 - #define CREQ_QP_EVENT_RESERVED7_MASK 0xfeUL 1961 - #define CREQ_QP_EVENT_RESERVED7_SFT 1 1962 - u8 event; 1963 - #define CREQ_QP_EVENT_EVENT_CREATE_QP 0x1UL 1964 - #define CREQ_QP_EVENT_EVENT_DESTROY_QP 0x2UL 1965 - #define CREQ_QP_EVENT_EVENT_MODIFY_QP 0x3UL 1966 - #define CREQ_QP_EVENT_EVENT_QUERY_QP 0x4UL 1967 - #define CREQ_QP_EVENT_EVENT_CREATE_SRQ 0x5UL 1968 - #define CREQ_QP_EVENT_EVENT_DESTROY_SRQ 0x6UL 1969 - #define CREQ_QP_EVENT_EVENT_QUERY_SRQ 0x8UL 1970 - #define CREQ_QP_EVENT_EVENT_CREATE_CQ 0x9UL 1971 - #define CREQ_QP_EVENT_EVENT_DESTROY_CQ 0xaUL 1972 - #define CREQ_QP_EVENT_EVENT_RESIZE_CQ 0xcUL 1973 - #define CREQ_QP_EVENT_EVENT_ALLOCATE_MRW 0xdUL 1974 - #define CREQ_QP_EVENT_EVENT_DEALLOCATE_KEY 0xeUL 1975 - #define CREQ_QP_EVENT_EVENT_REGISTER_MR 0xfUL 1976 - #define CREQ_QP_EVENT_EVENT_DEREGISTER_MR 0x10UL 1977 - #define CREQ_QP_EVENT_EVENT_ADD_GID 0x11UL 1978 - #define CREQ_QP_EVENT_EVENT_DELETE_GID 0x12UL 1979 - #define CREQ_QP_EVENT_EVENT_MODIFY_GID 0x17UL 1980 - #define CREQ_QP_EVENT_EVENT_QUERY_GID 0x18UL 1981 - #define CREQ_QP_EVENT_EVENT_CREATE_QP1 0x13UL 1982 - #define CREQ_QP_EVENT_EVENT_DESTROY_QP1 0x14UL 1983 - #define CREQ_QP_EVENT_EVENT_CREATE_AH 0x15UL 1984 - #define CREQ_QP_EVENT_EVENT_DESTROY_AH 0x16UL 1985 - #define CREQ_QP_EVENT_EVENT_INITIALIZE_FW 0x80UL 1986 - #define CREQ_QP_EVENT_EVENT_DEINITIALIZE_FW 0x81UL 1987 - #define CREQ_QP_EVENT_EVENT_STOP_FUNC 0x82UL 1988 - #define CREQ_QP_EVENT_EVENT_QUERY_FUNC 0x83UL 1989 - #define CREQ_QP_EVENT_EVENT_SET_FUNC_RESOURCES 0x84UL 1990 - #define CREQ_QP_EVENT_EVENT_MAP_TC_TO_COS 0x8aUL 1991 - #define CREQ_QP_EVENT_EVENT_QUERY_VERSION 0x8bUL 1992 - #define CREQ_QP_EVENT_EVENT_MODIFY_CC 0x8cUL 1993 - #define CREQ_QP_EVENT_EVENT_QUERY_CC 0x8dUL 1994 - #define CREQ_QP_EVENT_EVENT_QP_ERROR_NOTIFICATION 0xc0UL 1995 - __le16 reserved48[3]; 1996 - }; 1997 - 1998 - /* Create QP command response (16 bytes) */ 1999 - struct creq_create_qp_resp { 2000 - u8 type; 2001 - #define CREQ_CREATE_QP_RESP_TYPE_MASK 0x3fUL 2002 - #define CREQ_CREATE_QP_RESP_TYPE_SFT 0 2003 - #define CREQ_CREATE_QP_RESP_TYPE_QP_EVENT 0x38UL 2004 - #define CREQ_CREATE_QP_RESP_RESERVED2_MASK 0xc0UL 2005 - #define CREQ_CREATE_QP_RESP_RESERVED2_SFT 6 2006 - u8 status; 2007 - __le16 cookie; 2008 - __le32 xid; 2009 - u8 v; 2010 - #define CREQ_CREATE_QP_RESP_V 0x1UL 2011 - #define CREQ_CREATE_QP_RESP_RESERVED7_MASK 0xfeUL 2012 - #define CREQ_CREATE_QP_RESP_RESERVED7_SFT 1 2013 - u8 event; 2014 - #define CREQ_CREATE_QP_RESP_EVENT_CREATE_QP 0x1UL 2015 - __le16 reserved48[3]; 2016 - }; 2017 - 2018 - /* Destroy QP command response (16 bytes) */ 2019 - struct creq_destroy_qp_resp { 2020 - u8 type; 2021 - #define CREQ_DESTROY_QP_RESP_TYPE_MASK 0x3fUL 2022 - #define CREQ_DESTROY_QP_RESP_TYPE_SFT 0 2023 - #define CREQ_DESTROY_QP_RESP_TYPE_QP_EVENT 0x38UL 2024 - #define CREQ_DESTROY_QP_RESP_RESERVED2_MASK 0xc0UL 2025 - #define CREQ_DESTROY_QP_RESP_RESERVED2_SFT 6 2026 - u8 status; 2027 - __le16 cookie; 2028 - __le32 xid; 2029 - u8 v; 2030 - #define CREQ_DESTROY_QP_RESP_V 0x1UL 2031 - #define CREQ_DESTROY_QP_RESP_RESERVED7_MASK 0xfeUL 2032 - #define CREQ_DESTROY_QP_RESP_RESERVED7_SFT 1 2033 - u8 event; 2034 - #define CREQ_DESTROY_QP_RESP_EVENT_DESTROY_QP 0x2UL 2035 - __le16 reserved48[3]; 2036 - }; 2037 - 2038 - /* Modify QP command response (16 bytes) */ 2039 - struct creq_modify_qp_resp { 2040 - u8 type; 2041 - #define CREQ_MODIFY_QP_RESP_TYPE_MASK 0x3fUL 2042 - #define CREQ_MODIFY_QP_RESP_TYPE_SFT 0 2043 - #define CREQ_MODIFY_QP_RESP_TYPE_QP_EVENT 0x38UL 2044 - #define CREQ_MODIFY_QP_RESP_RESERVED2_MASK 0xc0UL 2045 - #define CREQ_MODIFY_QP_RESP_RESERVED2_SFT 6 2046 - u8 status; 2047 - __le16 cookie; 2048 - __le32 xid; 2049 - u8 v; 2050 - #define CREQ_MODIFY_QP_RESP_V 0x1UL 2051 - #define CREQ_MODIFY_QP_RESP_RESERVED7_MASK 0xfeUL 2052 - #define CREQ_MODIFY_QP_RESP_RESERVED7_SFT 1 2053 - u8 event; 2054 - #define CREQ_MODIFY_QP_RESP_EVENT_MODIFY_QP 0x3UL 2055 - __le16 reserved48[3]; 2056 - }; 2057 - 2058 - /* cmdq_query_roce_stats (size:128b/16B) */ 2059 - struct cmdq_query_roce_stats { 2060 1602 u8 opcode; 2061 - #define CMDQ_QUERY_ROCE_STATS_OPCODE_QUERY_ROCE_STATS 0x8eUL 2062 - #define CMDQ_QUERY_ROCE_STATS_OPCODE_LAST \ 2063 - CMDQ_QUERY_ROCE_STATS_OPCODE_QUERY_ROCE_STATS 1603 + #define CMDQ_DEREGISTER_MR_OPCODE_DEREGISTER_MR 0x10UL 1604 + #define CMDQ_DEREGISTER_MR_OPCODE_LAST CMDQ_DEREGISTER_MR_OPCODE_DEREGISTER_MR 2064 1605 u8 cmd_size; 2065 1606 __le16 flags; 2066 1607 __le16 cookie; 2067 1608 u8 resp_size; 2068 1609 u8 reserved8; 2069 1610 __le64 resp_addr; 1611 + __le32 lkey; 1612 + __le32 unused_0; 2070 1613 }; 2071 1614 2072 - /* Query QP command response (16 bytes) */ 2073 - struct creq_query_qp_resp { 2074 - u8 type; 2075 - #define CREQ_QUERY_QP_RESP_TYPE_MASK 0x3fUL 2076 - #define CREQ_QUERY_QP_RESP_TYPE_SFT 0 2077 - #define CREQ_QUERY_QP_RESP_TYPE_QP_EVENT 0x38UL 2078 - #define CREQ_QUERY_QP_RESP_RESERVED2_MASK 0xc0UL 2079 - #define CREQ_QUERY_QP_RESP_RESERVED2_SFT 6 2080 - u8 status; 2081 - __le16 cookie; 2082 - __le32 size; 2083 - u8 v; 2084 - #define CREQ_QUERY_QP_RESP_V 0x1UL 2085 - #define CREQ_QUERY_QP_RESP_RESERVED7_MASK 0xfeUL 2086 - #define CREQ_QUERY_QP_RESP_RESERVED7_SFT 1 2087 - u8 event; 2088 - #define CREQ_QUERY_QP_RESP_EVENT_QUERY_QP 0x4UL 2089 - __le16 reserved48[3]; 2090 - }; 2091 - 2092 - /* Query QP command response side buffer structure (104 bytes) */ 2093 - struct creq_query_qp_resp_sb { 2094 - u8 opcode; 2095 - #define CREQ_QUERY_QP_RESP_SB_OPCODE_QUERY_QP 0x4UL 2096 - u8 status; 2097 - __le16 cookie; 2098 - __le16 flags; 2099 - u8 resp_size; 2100 - u8 reserved8; 2101 - __le32 xid; 2102 - u8 en_sqd_async_notify_state; 2103 - #define CREQ_QUERY_QP_RESP_SB_STATE_MASK 0xfUL 2104 - #define CREQ_QUERY_QP_RESP_SB_STATE_SFT 0 2105 - #define CREQ_QUERY_QP_RESP_SB_STATE_RESET 0x0UL 2106 - #define CREQ_QUERY_QP_RESP_SB_STATE_INIT 0x1UL 2107 - #define CREQ_QUERY_QP_RESP_SB_STATE_RTR 0x2UL 2108 - #define CREQ_QUERY_QP_RESP_SB_STATE_RTS 0x3UL 2109 - #define CREQ_QUERY_QP_RESP_SB_STATE_SQD 0x4UL 2110 - #define CREQ_QUERY_QP_RESP_SB_STATE_SQE 0x5UL 2111 - #define CREQ_QUERY_QP_RESP_SB_STATE_ERR 0x6UL 2112 - #define CREQ_QUERY_QP_RESP_SB_EN_SQD_ASYNC_NOTIFY 0x10UL 2113 - u8 access; 2114 - #define CREQ_QUERY_QP_RESP_SB_ACCESS_LOCAL_WRITE 0x1UL 2115 - #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_WRITE 0x2UL 2116 - #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_READ 0x4UL 2117 - #define CREQ_QUERY_QP_RESP_SB_ACCESS_REMOTE_ATOMIC 0x8UL 2118 - __le16 pkey; 2119 - __le32 qkey; 2120 - __le32 reserved32; 2121 - __le32 dgid[4]; 2122 - __le32 flow_label; 2123 - __le16 sgid_index; 2124 - u8 hop_limit; 2125 - u8 traffic_class; 2126 - __le16 dest_mac[3]; 2127 - __le16 path_mtu_dest_vlan_id; 2128 - #define CREQ_QUERY_QP_RESP_SB_DEST_VLAN_ID_MASK 0xfffUL 2129 - #define CREQ_QUERY_QP_RESP_SB_DEST_VLAN_ID_SFT 0 2130 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MASK 0xf000UL 2131 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_SFT 12 2132 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_256 (0x0UL << 12) 2133 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_512 (0x1UL << 12) 2134 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_1024 (0x2UL << 12) 2135 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_2048 (0x3UL << 12) 2136 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_4096 (0x4UL << 12) 2137 - #define CREQ_QUERY_QP_RESP_SB_PATH_MTU_MTU_8192 (0x5UL << 12) 2138 - u8 timeout; 2139 - u8 retry_cnt; 2140 - u8 rnr_retry; 2141 - u8 min_rnr_timer; 2142 - __le32 rq_psn; 2143 - __le32 sq_psn; 2144 - u8 max_rd_atomic; 2145 - u8 max_dest_rd_atomic; 2146 - u8 tos_dscp_tos_ecn; 2147 - #define CREQ_QUERY_QP_RESP_SB_TOS_ECN_MASK 0x3UL 2148 - #define CREQ_QUERY_QP_RESP_SB_TOS_ECN_SFT 0 2149 - #define CREQ_QUERY_QP_RESP_SB_TOS_DSCP_MASK 0xfcUL 2150 - #define CREQ_QUERY_QP_RESP_SB_TOS_DSCP_SFT 2 2151 - u8 enable_cc; 2152 - #define CREQ_QUERY_QP_RESP_SB_ENABLE_CC 0x1UL 2153 - #define CREQ_QUERY_QP_RESP_SB_RESERVED7_MASK 0xfeUL 2154 - #define CREQ_QUERY_QP_RESP_SB_RESERVED7_SFT 1 2155 - __le32 sq_size; 2156 - __le32 rq_size; 2157 - __le16 sq_sge; 2158 - __le16 rq_sge; 2159 - __le32 max_inline_data; 2160 - __le32 dest_qp_id; 2161 - __le32 unused_1; 2162 - __le16 src_mac[3]; 2163 - __le16 vlan_pcp_vlan_dei_vlan_id; 2164 - #define CREQ_QUERY_QP_RESP_SB_VLAN_ID_MASK 0xfffUL 2165 - #define CREQ_QUERY_QP_RESP_SB_VLAN_ID_SFT 0 2166 - #define CREQ_QUERY_QP_RESP_SB_VLAN_DEI 0x1000UL 2167 - #define CREQ_QUERY_QP_RESP_SB_VLAN_PCP_MASK 0xe000UL 2168 - #define CREQ_QUERY_QP_RESP_SB_VLAN_PCP_SFT 13 2169 - }; 2170 - 2171 - /* Create SRQ command response (16 bytes) */ 2172 - struct creq_create_srq_resp { 2173 - u8 type; 2174 - #define CREQ_CREATE_SRQ_RESP_TYPE_MASK 0x3fUL 2175 - #define CREQ_CREATE_SRQ_RESP_TYPE_SFT 0 2176 - #define CREQ_CREATE_SRQ_RESP_TYPE_QP_EVENT 0x38UL 2177 - #define CREQ_CREATE_SRQ_RESP_RESERVED2_MASK 0xc0UL 2178 - #define CREQ_CREATE_SRQ_RESP_RESERVED2_SFT 6 2179 - u8 status; 2180 - __le16 cookie; 2181 - __le32 xid; 2182 - u8 v; 2183 - #define CREQ_CREATE_SRQ_RESP_V 0x1UL 2184 - #define CREQ_CREATE_SRQ_RESP_RESERVED7_MASK 0xfeUL 2185 - #define CREQ_CREATE_SRQ_RESP_RESERVED7_SFT 1 2186 - u8 event; 2187 - #define CREQ_CREATE_SRQ_RESP_EVENT_CREATE_SRQ 0x5UL 2188 - __le16 reserved48[3]; 2189 - }; 2190 - 2191 - /* Destroy SRQ command response (16 bytes) */ 2192 - struct creq_destroy_srq_resp { 2193 - u8 type; 2194 - #define CREQ_DESTROY_SRQ_RESP_TYPE_MASK 0x3fUL 2195 - #define CREQ_DESTROY_SRQ_RESP_TYPE_SFT 0 2196 - #define CREQ_DESTROY_SRQ_RESP_TYPE_QP_EVENT 0x38UL 2197 - #define CREQ_DESTROY_SRQ_RESP_RESERVED2_MASK 0xc0UL 2198 - #define CREQ_DESTROY_SRQ_RESP_RESERVED2_SFT 6 2199 - u8 status; 2200 - __le16 cookie; 2201 - __le32 xid; 2202 - u8 v; 2203 - #define CREQ_DESTROY_SRQ_RESP_V 0x1UL 2204 - #define CREQ_DESTROY_SRQ_RESP_RESERVED7_MASK 0xfeUL 2205 - #define CREQ_DESTROY_SRQ_RESP_RESERVED7_SFT 1 2206 - u8 event; 2207 - #define CREQ_DESTROY_SRQ_RESP_EVENT_DESTROY_SRQ 0x6UL 2208 - __le16 enable_for_arm[3]; 2209 - #define CREQ_DESTROY_SRQ_RESP_ENABLE_FOR_ARM_MASK 0x30000UL 2210 - #define CREQ_DESTROY_SRQ_RESP_ENABLE_FOR_ARM_SFT 16 2211 - #define CREQ_DESTROY_SRQ_RESP_RESERVED46_MASK 0xfffc0000UL 2212 - #define CREQ_DESTROY_SRQ_RESP_RESERVED46_SFT 18 2213 - }; 2214 - 2215 - /* Query SRQ command response (16 bytes) */ 2216 - struct creq_query_srq_resp { 2217 - u8 type; 2218 - #define CREQ_QUERY_SRQ_RESP_TYPE_MASK 0x3fUL 2219 - #define CREQ_QUERY_SRQ_RESP_TYPE_SFT 0 2220 - #define CREQ_QUERY_SRQ_RESP_TYPE_QP_EVENT 0x38UL 2221 - #define CREQ_QUERY_SRQ_RESP_RESERVED2_MASK 0xc0UL 2222 - #define CREQ_QUERY_SRQ_RESP_RESERVED2_SFT 6 2223 - u8 status; 2224 - __le16 cookie; 2225 - __le32 size; 2226 - u8 v; 2227 - #define CREQ_QUERY_SRQ_RESP_V 0x1UL 2228 - #define CREQ_QUERY_SRQ_RESP_RESERVED7_MASK 0xfeUL 2229 - #define CREQ_QUERY_SRQ_RESP_RESERVED7_SFT 1 2230 - u8 event; 2231 - #define CREQ_QUERY_SRQ_RESP_EVENT_QUERY_SRQ 0x8UL 2232 - __le16 reserved48[3]; 2233 - }; 2234 - 2235 - /* Query SRQ command response side buffer structure (24 bytes) */ 2236 - struct creq_query_srq_resp_sb { 2237 - u8 opcode; 2238 - #define CREQ_QUERY_SRQ_RESP_SB_OPCODE_QUERY_SRQ 0x8UL 2239 - u8 status; 2240 - __le16 cookie; 2241 - __le16 flags; 2242 - u8 resp_size; 2243 - u8 reserved8; 2244 - __le32 xid; 2245 - __le16 srq_limit; 2246 - __le16 reserved16; 2247 - __le32 data[4]; 2248 - }; 2249 - 2250 - /* Create CQ command Response (16 bytes) */ 2251 - struct creq_create_cq_resp { 2252 - u8 type; 2253 - #define CREQ_CREATE_CQ_RESP_TYPE_MASK 0x3fUL 2254 - #define CREQ_CREATE_CQ_RESP_TYPE_SFT 0 2255 - #define CREQ_CREATE_CQ_RESP_TYPE_QP_EVENT 0x38UL 2256 - #define CREQ_CREATE_CQ_RESP_RESERVED2_MASK 0xc0UL 2257 - #define CREQ_CREATE_CQ_RESP_RESERVED2_SFT 6 2258 - u8 status; 2259 - __le16 cookie; 2260 - __le32 xid; 2261 - u8 v; 2262 - #define CREQ_CREATE_CQ_RESP_V 0x1UL 2263 - #define CREQ_CREATE_CQ_RESP_RESERVED7_MASK 0xfeUL 2264 - #define CREQ_CREATE_CQ_RESP_RESERVED7_SFT 1 2265 - u8 event; 2266 - #define CREQ_CREATE_CQ_RESP_EVENT_CREATE_CQ 0x9UL 2267 - __le16 reserved48[3]; 2268 - }; 2269 - 2270 - /* Destroy CQ command response (16 bytes) */ 2271 - struct creq_destroy_cq_resp { 2272 - u8 type; 2273 - #define CREQ_DESTROY_CQ_RESP_TYPE_MASK 0x3fUL 2274 - #define CREQ_DESTROY_CQ_RESP_TYPE_SFT 0 2275 - #define CREQ_DESTROY_CQ_RESP_TYPE_QP_EVENT 0x38UL 2276 - #define CREQ_DESTROY_CQ_RESP_RESERVED2_MASK 0xc0UL 2277 - #define CREQ_DESTROY_CQ_RESP_RESERVED2_SFT 6 2278 - u8 status; 2279 - __le16 cookie; 2280 - __le32 xid; 2281 - u8 v; 2282 - #define CREQ_DESTROY_CQ_RESP_V 0x1UL 2283 - #define CREQ_DESTROY_CQ_RESP_RESERVED7_MASK 0xfeUL 2284 - #define CREQ_DESTROY_CQ_RESP_RESERVED7_SFT 1 2285 - u8 event; 2286 - #define CREQ_DESTROY_CQ_RESP_EVENT_DESTROY_CQ 0xaUL 2287 - __le16 cq_arm_lvl; 2288 - #define CREQ_DESTROY_CQ_RESP_CQ_ARM_LVL_MASK 0x3UL 2289 - #define CREQ_DESTROY_CQ_RESP_CQ_ARM_LVL_SFT 0 2290 - #define CREQ_DESTROY_CQ_RESP_RESERVED14_MASK 0xfffcUL 2291 - #define CREQ_DESTROY_CQ_RESP_RESERVED14_SFT 2 2292 - __le16 total_cnq_events; 2293 - __le16 reserved16; 2294 - }; 2295 - 2296 - /* Resize CQ command response (16 bytes) */ 2297 - struct creq_resize_cq_resp { 2298 - u8 type; 2299 - #define CREQ_RESIZE_CQ_RESP_TYPE_MASK 0x3fUL 2300 - #define CREQ_RESIZE_CQ_RESP_TYPE_SFT 0 2301 - #define CREQ_RESIZE_CQ_RESP_TYPE_QP_EVENT 0x38UL 2302 - #define CREQ_RESIZE_CQ_RESP_RESERVED2_MASK 0xc0UL 2303 - #define CREQ_RESIZE_CQ_RESP_RESERVED2_SFT 6 2304 - u8 status; 2305 - __le16 cookie; 2306 - __le32 xid; 2307 - u8 v; 2308 - #define CREQ_RESIZE_CQ_RESP_V 0x1UL 2309 - #define CREQ_RESIZE_CQ_RESP_RESERVED7_MASK 0xfeUL 2310 - #define CREQ_RESIZE_CQ_RESP_RESERVED7_SFT 1 2311 - u8 event; 2312 - #define CREQ_RESIZE_CQ_RESP_EVENT_RESIZE_CQ 0xcUL 2313 - __le16 reserved48[3]; 2314 - }; 2315 - 2316 - /* Allocate MRW command response (16 bytes) */ 2317 - struct creq_allocate_mrw_resp { 2318 - u8 type; 2319 - #define CREQ_ALLOCATE_MRW_RESP_TYPE_MASK 0x3fUL 2320 - #define CREQ_ALLOCATE_MRW_RESP_TYPE_SFT 0 2321 - #define CREQ_ALLOCATE_MRW_RESP_TYPE_QP_EVENT 0x38UL 2322 - #define CREQ_ALLOCATE_MRW_RESP_RESERVED2_MASK 0xc0UL 2323 - #define CREQ_ALLOCATE_MRW_RESP_RESERVED2_SFT 6 2324 - u8 status; 2325 - __le16 cookie; 2326 - __le32 xid; 2327 - u8 v; 2328 - #define CREQ_ALLOCATE_MRW_RESP_V 0x1UL 2329 - #define CREQ_ALLOCATE_MRW_RESP_RESERVED7_MASK 0xfeUL 2330 - #define CREQ_ALLOCATE_MRW_RESP_RESERVED7_SFT 1 2331 - u8 event; 2332 - #define CREQ_ALLOCATE_MRW_RESP_EVENT_ALLOCATE_MRW 0xdUL 2333 - __le16 reserved48[3]; 2334 - }; 2335 - 2336 - /* De-allocate key command response (16 bytes) */ 2337 - struct creq_deallocate_key_resp { 2338 - u8 type; 2339 - #define CREQ_DEALLOCATE_KEY_RESP_TYPE_MASK 0x3fUL 2340 - #define CREQ_DEALLOCATE_KEY_RESP_TYPE_SFT 0 2341 - #define CREQ_DEALLOCATE_KEY_RESP_TYPE_QP_EVENT 0x38UL 2342 - #define CREQ_DEALLOCATE_KEY_RESP_RESERVED2_MASK 0xc0UL 2343 - #define CREQ_DEALLOCATE_KEY_RESP_RESERVED2_SFT 6 2344 - u8 status; 2345 - __le16 cookie; 2346 - __le32 xid; 2347 - u8 v; 2348 - #define CREQ_DEALLOCATE_KEY_RESP_V 0x1UL 2349 - #define CREQ_DEALLOCATE_KEY_RESP_RESERVED7_MASK 0xfeUL 2350 - #define CREQ_DEALLOCATE_KEY_RESP_RESERVED7_SFT 1 2351 - u8 event; 2352 - #define CREQ_DEALLOCATE_KEY_RESP_EVENT_DEALLOCATE_KEY 0xeUL 2353 - __le16 reserved16; 2354 - __le32 bound_window_info; 2355 - }; 2356 - 2357 - /* Register MR command response (16 bytes) */ 2358 - struct creq_register_mr_resp { 2359 - u8 type; 2360 - #define CREQ_REGISTER_MR_RESP_TYPE_MASK 0x3fUL 2361 - #define CREQ_REGISTER_MR_RESP_TYPE_SFT 0 2362 - #define CREQ_REGISTER_MR_RESP_TYPE_QP_EVENT 0x38UL 2363 - #define CREQ_REGISTER_MR_RESP_RESERVED2_MASK 0xc0UL 2364 - #define CREQ_REGISTER_MR_RESP_RESERVED2_SFT 6 2365 - u8 status; 2366 - __le16 cookie; 2367 - __le32 xid; 2368 - u8 v; 2369 - #define CREQ_REGISTER_MR_RESP_V 0x1UL 2370 - #define CREQ_REGISTER_MR_RESP_RESERVED7_MASK 0xfeUL 2371 - #define CREQ_REGISTER_MR_RESP_RESERVED7_SFT 1 2372 - u8 event; 2373 - #define CREQ_REGISTER_MR_RESP_EVENT_REGISTER_MR 0xfUL 2374 - __le16 reserved48[3]; 2375 - }; 2376 - 2377 - /* Deregister MR command response (16 bytes) */ 1615 + /* creq_deregister_mr_resp (size:128b/16B) */ 2378 1616 struct creq_deregister_mr_resp { 2379 - u8 type; 2380 - #define CREQ_DEREGISTER_MR_RESP_TYPE_MASK 0x3fUL 2381 - #define CREQ_DEREGISTER_MR_RESP_TYPE_SFT 0 2382 - #define CREQ_DEREGISTER_MR_RESP_TYPE_QP_EVENT 0x38UL 2383 - #define CREQ_DEREGISTER_MR_RESP_RESERVED2_MASK 0xc0UL 2384 - #define CREQ_DEREGISTER_MR_RESP_RESERVED2_SFT 6 2385 - u8 status; 2386 - __le16 cookie; 2387 - __le32 xid; 2388 - u8 v; 2389 - #define CREQ_DEREGISTER_MR_RESP_V 0x1UL 2390 - #define CREQ_DEREGISTER_MR_RESP_RESERVED7_MASK 0xfeUL 2391 - #define CREQ_DEREGISTER_MR_RESP_RESERVED7_SFT 1 2392 - u8 event; 2393 - #define CREQ_DEREGISTER_MR_RESP_EVENT_DEREGISTER_MR 0x10UL 2394 - __le16 reserved16; 2395 - __le32 bound_windows; 1617 + u8 type; 1618 + #define CREQ_DEREGISTER_MR_RESP_TYPE_MASK 0x3fUL 1619 + #define CREQ_DEREGISTER_MR_RESP_TYPE_SFT 0 1620 + #define CREQ_DEREGISTER_MR_RESP_TYPE_QP_EVENT 0x38UL 1621 + #define CREQ_DEREGISTER_MR_RESP_TYPE_LAST CREQ_DEREGISTER_MR_RESP_TYPE_QP_EVENT 1622 + u8 status; 1623 + __le16 cookie; 1624 + __le32 xid; 1625 + u8 v; 1626 + #define CREQ_DEREGISTER_MR_RESP_V 0x1UL 1627 + u8 event; 1628 + #define CREQ_DEREGISTER_MR_RESP_EVENT_DEREGISTER_MR 0x10UL 1629 + #define CREQ_DEREGISTER_MR_RESP_EVENT_LAST CREQ_DEREGISTER_MR_RESP_EVENT_DEREGISTER_MR 1630 + __le16 reserved16; 1631 + __le32 bound_windows; 2396 1632 }; 2397 1633 2398 - /* Add GID command response (16 bytes) */ 1634 + /* cmdq_add_gid (size:384b/48B) */ 1635 + struct cmdq_add_gid { 1636 + u8 opcode; 1637 + #define CMDQ_ADD_GID_OPCODE_ADD_GID 0x11UL 1638 + #define CMDQ_ADD_GID_OPCODE_LAST CMDQ_ADD_GID_OPCODE_ADD_GID 1639 + u8 cmd_size; 1640 + __le16 flags; 1641 + __le16 cookie; 1642 + u8 resp_size; 1643 + u8 reserved8; 1644 + __le64 resp_addr; 1645 + __be32 gid[4]; 1646 + __be16 src_mac[3]; 1647 + __le16 vlan; 1648 + #define CMDQ_ADD_GID_VLAN_VLAN_EN_TPID_VLAN_ID_MASK 0xffffUL 1649 + #define CMDQ_ADD_GID_VLAN_VLAN_EN_TPID_VLAN_ID_SFT 0 1650 + #define CMDQ_ADD_GID_VLAN_VLAN_ID_MASK 0xfffUL 1651 + #define CMDQ_ADD_GID_VLAN_VLAN_ID_SFT 0 1652 + #define CMDQ_ADD_GID_VLAN_TPID_MASK 0x7000UL 1653 + #define CMDQ_ADD_GID_VLAN_TPID_SFT 12 1654 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_88A8 (0x0UL << 12) 1655 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_8100 (0x1UL << 12) 1656 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_9100 (0x2UL << 12) 1657 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_9200 (0x3UL << 12) 1658 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_9300 (0x4UL << 12) 1659 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 1660 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 1661 + #define CMDQ_ADD_GID_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 1662 + #define CMDQ_ADD_GID_VLAN_TPID_LAST CMDQ_ADD_GID_VLAN_TPID_TPID_CFG3 1663 + #define CMDQ_ADD_GID_VLAN_VLAN_EN 0x8000UL 1664 + __le16 ipid; 1665 + __le16 stats_ctx; 1666 + #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_VALID_STATS_CTX_ID_MASK 0xffffUL 1667 + #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_VALID_STATS_CTX_ID_SFT 0 1668 + #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_ID_MASK 0x7fffUL 1669 + #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_ID_SFT 0 1670 + #define CMDQ_ADD_GID_STATS_CTX_STATS_CTX_VALID 0x8000UL 1671 + __le32 unused_0; 1672 + }; 1673 + 1674 + /* creq_add_gid_resp (size:128b/16B) */ 2399 1675 struct creq_add_gid_resp { 2400 - u8 type; 2401 - #define CREQ_ADD_GID_RESP_TYPE_MASK 0x3fUL 2402 - #define CREQ_ADD_GID_RESP_TYPE_SFT 0 2403 - #define CREQ_ADD_GID_RESP_TYPE_QP_EVENT 0x38UL 2404 - #define CREQ_ADD_GID_RESP_RESERVED2_MASK 0xc0UL 2405 - #define CREQ_ADD_GID_RESP_RESERVED2_SFT 6 2406 - u8 status; 2407 - __le16 cookie; 2408 - __le32 xid; 2409 - u8 v; 2410 - #define CREQ_ADD_GID_RESP_V 0x1UL 2411 - #define CREQ_ADD_GID_RESP_RESERVED7_MASK 0xfeUL 2412 - #define CREQ_ADD_GID_RESP_RESERVED7_SFT 1 2413 - u8 event; 2414 - #define CREQ_ADD_GID_RESP_EVENT_ADD_GID 0x11UL 2415 - __le16 reserved48[3]; 1676 + u8 type; 1677 + #define CREQ_ADD_GID_RESP_TYPE_MASK 0x3fUL 1678 + #define CREQ_ADD_GID_RESP_TYPE_SFT 0 1679 + #define CREQ_ADD_GID_RESP_TYPE_QP_EVENT 0x38UL 1680 + #define CREQ_ADD_GID_RESP_TYPE_LAST CREQ_ADD_GID_RESP_TYPE_QP_EVENT 1681 + u8 status; 1682 + __le16 cookie; 1683 + __le32 xid; 1684 + u8 v; 1685 + #define CREQ_ADD_GID_RESP_V 0x1UL 1686 + u8 event; 1687 + #define CREQ_ADD_GID_RESP_EVENT_ADD_GID 0x11UL 1688 + #define CREQ_ADD_GID_RESP_EVENT_LAST CREQ_ADD_GID_RESP_EVENT_ADD_GID 1689 + u8 reserved48[6]; 2416 1690 }; 2417 1691 2418 - /* Delete GID command response (16 bytes) */ 1692 + /* cmdq_delete_gid (size:192b/24B) */ 1693 + struct cmdq_delete_gid { 1694 + u8 opcode; 1695 + #define CMDQ_DELETE_GID_OPCODE_DELETE_GID 0x12UL 1696 + #define CMDQ_DELETE_GID_OPCODE_LAST CMDQ_DELETE_GID_OPCODE_DELETE_GID 1697 + u8 cmd_size; 1698 + __le16 flags; 1699 + __le16 cookie; 1700 + u8 resp_size; 1701 + u8 reserved8; 1702 + __le64 resp_addr; 1703 + __le16 gid_index; 1704 + u8 unused_0[6]; 1705 + }; 1706 + 1707 + /* creq_delete_gid_resp (size:128b/16B) */ 2419 1708 struct creq_delete_gid_resp { 2420 - u8 type; 2421 - #define CREQ_DELETE_GID_RESP_TYPE_MASK 0x3fUL 2422 - #define CREQ_DELETE_GID_RESP_TYPE_SFT 0 2423 - #define CREQ_DELETE_GID_RESP_TYPE_QP_EVENT 0x38UL 2424 - #define CREQ_DELETE_GID_RESP_RESERVED2_MASK 0xc0UL 2425 - #define CREQ_DELETE_GID_RESP_RESERVED2_SFT 6 2426 - u8 status; 2427 - __le16 cookie; 2428 - __le32 xid; 2429 - u8 v; 2430 - #define CREQ_DELETE_GID_RESP_V 0x1UL 2431 - #define CREQ_DELETE_GID_RESP_RESERVED7_MASK 0xfeUL 2432 - #define CREQ_DELETE_GID_RESP_RESERVED7_SFT 1 2433 - u8 event; 2434 - #define CREQ_DELETE_GID_RESP_EVENT_DELETE_GID 0x12UL 2435 - __le16 reserved48[3]; 1709 + u8 type; 1710 + #define CREQ_DELETE_GID_RESP_TYPE_MASK 0x3fUL 1711 + #define CREQ_DELETE_GID_RESP_TYPE_SFT 0 1712 + #define CREQ_DELETE_GID_RESP_TYPE_QP_EVENT 0x38UL 1713 + #define CREQ_DELETE_GID_RESP_TYPE_LAST CREQ_DELETE_GID_RESP_TYPE_QP_EVENT 1714 + u8 status; 1715 + __le16 cookie; 1716 + __le32 xid; 1717 + u8 v; 1718 + #define CREQ_DELETE_GID_RESP_V 0x1UL 1719 + u8 event; 1720 + #define CREQ_DELETE_GID_RESP_EVENT_DELETE_GID 0x12UL 1721 + #define CREQ_DELETE_GID_RESP_EVENT_LAST CREQ_DELETE_GID_RESP_EVENT_DELETE_GID 1722 + u8 reserved48[6]; 2436 1723 }; 2437 1724 2438 - /* Modify GID command response (16 bytes) */ 1725 + /* cmdq_modify_gid (size:384b/48B) */ 1726 + struct cmdq_modify_gid { 1727 + u8 opcode; 1728 + #define CMDQ_MODIFY_GID_OPCODE_MODIFY_GID 0x17UL 1729 + #define CMDQ_MODIFY_GID_OPCODE_LAST CMDQ_MODIFY_GID_OPCODE_MODIFY_GID 1730 + u8 cmd_size; 1731 + __le16 flags; 1732 + __le16 cookie; 1733 + u8 resp_size; 1734 + u8 reserved8; 1735 + __le64 resp_addr; 1736 + __be32 gid[4]; 1737 + __be16 src_mac[3]; 1738 + __le16 vlan; 1739 + #define CMDQ_MODIFY_GID_VLAN_VLAN_ID_MASK 0xfffUL 1740 + #define CMDQ_MODIFY_GID_VLAN_VLAN_ID_SFT 0 1741 + #define CMDQ_MODIFY_GID_VLAN_TPID_MASK 0x7000UL 1742 + #define CMDQ_MODIFY_GID_VLAN_TPID_SFT 12 1743 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_88A8 (0x0UL << 12) 1744 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_8100 (0x1UL << 12) 1745 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9100 (0x2UL << 12) 1746 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9200 (0x3UL << 12) 1747 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_9300 (0x4UL << 12) 1748 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 1749 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 1750 + #define CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 1751 + #define CMDQ_MODIFY_GID_VLAN_TPID_LAST CMDQ_MODIFY_GID_VLAN_TPID_TPID_CFG3 1752 + #define CMDQ_MODIFY_GID_VLAN_VLAN_EN 0x8000UL 1753 + __le16 ipid; 1754 + __le16 gid_index; 1755 + __le16 stats_ctx; 1756 + #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_ID_MASK 0x7fffUL 1757 + #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_ID_SFT 0 1758 + #define CMDQ_MODIFY_GID_STATS_CTX_STATS_CTX_VALID 0x8000UL 1759 + __le16 unused_0; 1760 + }; 1761 + 1762 + /* creq_modify_gid_resp (size:128b/16B) */ 2439 1763 struct creq_modify_gid_resp { 2440 - u8 type; 2441 - #define CREQ_MODIFY_GID_RESP_TYPE_MASK 0x3fUL 2442 - #define CREQ_MODIFY_GID_RESP_TYPE_SFT 0 2443 - #define CREQ_MODIFY_GID_RESP_TYPE_QP_EVENT 0x38UL 2444 - #define CREQ_MODIFY_GID_RESP_RESERVED2_MASK 0xc0UL 2445 - #define CREQ_MODIFY_GID_RESP_RESERVED2_SFT 6 2446 - u8 status; 2447 - __le16 cookie; 2448 - __le32 xid; 2449 - u8 v; 2450 - #define CREQ_MODIFY_GID_RESP_V 0x1UL 2451 - #define CREQ_MODIFY_GID_RESP_RESERVED7_MASK 0xfeUL 2452 - #define CREQ_MODIFY_GID_RESP_RESERVED7_SFT 1 2453 - u8 event; 2454 - #define CREQ_MODIFY_GID_RESP_EVENT_ADD_GID 0x11UL 2455 - __le16 reserved48[3]; 1764 + u8 type; 1765 + #define CREQ_MODIFY_GID_RESP_TYPE_MASK 0x3fUL 1766 + #define CREQ_MODIFY_GID_RESP_TYPE_SFT 0 1767 + #define CREQ_MODIFY_GID_RESP_TYPE_QP_EVENT 0x38UL 1768 + #define CREQ_MODIFY_GID_RESP_TYPE_LAST CREQ_MODIFY_GID_RESP_TYPE_QP_EVENT 1769 + u8 status; 1770 + __le16 cookie; 1771 + __le32 xid; 1772 + u8 v; 1773 + #define CREQ_MODIFY_GID_RESP_V 0x1UL 1774 + u8 event; 1775 + #define CREQ_MODIFY_GID_RESP_EVENT_ADD_GID 0x11UL 1776 + #define CREQ_MODIFY_GID_RESP_EVENT_LAST CREQ_MODIFY_GID_RESP_EVENT_ADD_GID 1777 + u8 reserved48[6]; 2456 1778 }; 2457 1779 2458 - /* Query GID command response (16 bytes) */ 1780 + /* cmdq_query_gid (size:192b/24B) */ 1781 + struct cmdq_query_gid { 1782 + u8 opcode; 1783 + #define CMDQ_QUERY_GID_OPCODE_QUERY_GID 0x18UL 1784 + #define CMDQ_QUERY_GID_OPCODE_LAST CMDQ_QUERY_GID_OPCODE_QUERY_GID 1785 + u8 cmd_size; 1786 + __le16 flags; 1787 + __le16 cookie; 1788 + u8 resp_size; 1789 + u8 reserved8; 1790 + __le64 resp_addr; 1791 + __le16 gid_index; 1792 + u8 unused16[6]; 1793 + }; 1794 + 1795 + /* creq_query_gid_resp (size:128b/16B) */ 2459 1796 struct creq_query_gid_resp { 2460 - u8 type; 2461 - #define CREQ_QUERY_GID_RESP_TYPE_MASK 0x3fUL 2462 - #define CREQ_QUERY_GID_RESP_TYPE_SFT 0 2463 - #define CREQ_QUERY_GID_RESP_TYPE_QP_EVENT 0x38UL 2464 - #define CREQ_QUERY_GID_RESP_RESERVED2_MASK 0xc0UL 2465 - #define CREQ_QUERY_GID_RESP_RESERVED2_SFT 6 2466 - u8 status; 2467 - __le16 cookie; 2468 - __le32 size; 2469 - u8 v; 2470 - #define CREQ_QUERY_GID_RESP_V 0x1UL 2471 - #define CREQ_QUERY_GID_RESP_RESERVED7_MASK 0xfeUL 2472 - #define CREQ_QUERY_GID_RESP_RESERVED7_SFT 1 2473 - u8 event; 2474 - #define CREQ_QUERY_GID_RESP_EVENT_QUERY_GID 0x18UL 2475 - __le16 reserved48[3]; 1797 + u8 type; 1798 + #define CREQ_QUERY_GID_RESP_TYPE_MASK 0x3fUL 1799 + #define CREQ_QUERY_GID_RESP_TYPE_SFT 0 1800 + #define CREQ_QUERY_GID_RESP_TYPE_QP_EVENT 0x38UL 1801 + #define CREQ_QUERY_GID_RESP_TYPE_LAST CREQ_QUERY_GID_RESP_TYPE_QP_EVENT 1802 + u8 status; 1803 + __le16 cookie; 1804 + __le32 size; 1805 + u8 v; 1806 + #define CREQ_QUERY_GID_RESP_V 0x1UL 1807 + u8 event; 1808 + #define CREQ_QUERY_GID_RESP_EVENT_QUERY_GID 0x18UL 1809 + #define CREQ_QUERY_GID_RESP_EVENT_LAST CREQ_QUERY_GID_RESP_EVENT_QUERY_GID 1810 + u8 reserved48[6]; 2476 1811 }; 2477 1812 2478 - /* Query GID command response side buffer structure (40 bytes) */ 1813 + /* creq_query_gid_resp_sb (size:320b/40B) */ 2479 1814 struct creq_query_gid_resp_sb { 2480 - u8 opcode; 2481 - #define CREQ_QUERY_GID_RESP_SB_OPCODE_QUERY_GID 0x18UL 2482 - u8 status; 2483 - __le16 cookie; 2484 - __le16 flags; 2485 - u8 resp_size; 2486 - u8 reserved8; 2487 - __le32 gid[4]; 2488 - __le16 src_mac[3]; 2489 - __le16 vlan; 2490 - #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_ID_MASK 0xfffUL 2491 - #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_ID_SFT 0 2492 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_MASK 0x7000UL 2493 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_SFT 12 2494 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_88A8 (0x0UL << 12) 2495 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_8100 (0x1UL << 12) 2496 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9100 (0x2UL << 12) 2497 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9200 (0x3UL << 12) 2498 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9300 (0x4UL << 12) 2499 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 2500 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 2501 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 2502 - #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_LAST \ 2503 - CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG3 2504 - #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_EN 0x8000UL 2505 - __le16 ipid; 2506 - __le16 gid_index; 2507 - __le32 unused_0; 1815 + u8 opcode; 1816 + #define CREQ_QUERY_GID_RESP_SB_OPCODE_QUERY_GID 0x18UL 1817 + #define CREQ_QUERY_GID_RESP_SB_OPCODE_LAST CREQ_QUERY_GID_RESP_SB_OPCODE_QUERY_GID 1818 + u8 status; 1819 + __le16 cookie; 1820 + __le16 flags; 1821 + u8 resp_size; 1822 + u8 reserved8; 1823 + __le32 gid[4]; 1824 + __le16 src_mac[3]; 1825 + __le16 vlan; 1826 + #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_EN_TPID_VLAN_ID_MASK 0xffffUL 1827 + #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_EN_TPID_VLAN_ID_SFT 0 1828 + #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_ID_MASK 0xfffUL 1829 + #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_ID_SFT 0 1830 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_MASK 0x7000UL 1831 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_SFT 12 1832 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_88A8 (0x0UL << 12) 1833 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_8100 (0x1UL << 12) 1834 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9100 (0x2UL << 12) 1835 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9200 (0x3UL << 12) 1836 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_9300 (0x4UL << 12) 1837 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG1 (0x5UL << 12) 1838 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG2 (0x6UL << 12) 1839 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG3 (0x7UL << 12) 1840 + #define CREQ_QUERY_GID_RESP_SB_VLAN_TPID_LAST CREQ_QUERY_GID_RESP_SB_VLAN_TPID_TPID_CFG3 1841 + #define CREQ_QUERY_GID_RESP_SB_VLAN_VLAN_EN 0x8000UL 1842 + __le16 ipid; 1843 + __le16 gid_index; 1844 + __le32 unused_0; 2508 1845 }; 2509 1846 2510 - /* Create QP1 command response (16 bytes) */ 1847 + /* cmdq_create_qp1 (size:640b/80B) */ 1848 + struct cmdq_create_qp1 { 1849 + u8 opcode; 1850 + #define CMDQ_CREATE_QP1_OPCODE_CREATE_QP1 0x13UL 1851 + #define CMDQ_CREATE_QP1_OPCODE_LAST CMDQ_CREATE_QP1_OPCODE_CREATE_QP1 1852 + u8 cmd_size; 1853 + __le16 flags; 1854 + __le16 cookie; 1855 + u8 resp_size; 1856 + u8 reserved8; 1857 + __le64 resp_addr; 1858 + __le64 qp_handle; 1859 + __le32 qp_flags; 1860 + #define CMDQ_CREATE_QP1_QP_FLAGS_SRQ_USED 0x1UL 1861 + #define CMDQ_CREATE_QP1_QP_FLAGS_FORCE_COMPLETION 0x2UL 1862 + #define CMDQ_CREATE_QP1_QP_FLAGS_RESERVED_LKEY_ENABLE 0x4UL 1863 + #define CMDQ_CREATE_QP1_QP_FLAGS_LAST CMDQ_CREATE_QP1_QP_FLAGS_RESERVED_LKEY_ENABLE 1864 + u8 type; 1865 + #define CMDQ_CREATE_QP1_TYPE_GSI 0x1UL 1866 + #define CMDQ_CREATE_QP1_TYPE_LAST CMDQ_CREATE_QP1_TYPE_GSI 1867 + u8 sq_pg_size_sq_lvl; 1868 + #define CMDQ_CREATE_QP1_SQ_LVL_MASK 0xfUL 1869 + #define CMDQ_CREATE_QP1_SQ_LVL_SFT 0 1870 + #define CMDQ_CREATE_QP1_SQ_LVL_LVL_0 0x0UL 1871 + #define CMDQ_CREATE_QP1_SQ_LVL_LVL_1 0x1UL 1872 + #define CMDQ_CREATE_QP1_SQ_LVL_LVL_2 0x2UL 1873 + #define CMDQ_CREATE_QP1_SQ_LVL_LAST CMDQ_CREATE_QP1_SQ_LVL_LVL_2 1874 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_MASK 0xf0UL 1875 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_SFT 4 1876 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_4K (0x0UL << 4) 1877 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_8K (0x1UL << 4) 1878 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_64K (0x2UL << 4) 1879 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_2M (0x3UL << 4) 1880 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_8M (0x4UL << 4) 1881 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_1G (0x5UL << 4) 1882 + #define CMDQ_CREATE_QP1_SQ_PG_SIZE_LAST CMDQ_CREATE_QP1_SQ_PG_SIZE_PG_1G 1883 + u8 rq_pg_size_rq_lvl; 1884 + #define CMDQ_CREATE_QP1_RQ_LVL_MASK 0xfUL 1885 + #define CMDQ_CREATE_QP1_RQ_LVL_SFT 0 1886 + #define CMDQ_CREATE_QP1_RQ_LVL_LVL_0 0x0UL 1887 + #define CMDQ_CREATE_QP1_RQ_LVL_LVL_1 0x1UL 1888 + #define CMDQ_CREATE_QP1_RQ_LVL_LVL_2 0x2UL 1889 + #define CMDQ_CREATE_QP1_RQ_LVL_LAST CMDQ_CREATE_QP1_RQ_LVL_LVL_2 1890 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_MASK 0xf0UL 1891 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_SFT 4 1892 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_4K (0x0UL << 4) 1893 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_8K (0x1UL << 4) 1894 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_64K (0x2UL << 4) 1895 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_2M (0x3UL << 4) 1896 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_8M (0x4UL << 4) 1897 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_1G (0x5UL << 4) 1898 + #define CMDQ_CREATE_QP1_RQ_PG_SIZE_LAST CMDQ_CREATE_QP1_RQ_PG_SIZE_PG_1G 1899 + u8 unused_0; 1900 + __le32 dpi; 1901 + __le32 sq_size; 1902 + __le32 rq_size; 1903 + __le16 sq_fwo_sq_sge; 1904 + #define CMDQ_CREATE_QP1_SQ_SGE_MASK 0xfUL 1905 + #define CMDQ_CREATE_QP1_SQ_SGE_SFT 0 1906 + #define CMDQ_CREATE_QP1_SQ_FWO_MASK 0xfff0UL 1907 + #define CMDQ_CREATE_QP1_SQ_FWO_SFT 4 1908 + __le16 rq_fwo_rq_sge; 1909 + #define CMDQ_CREATE_QP1_RQ_SGE_MASK 0xfUL 1910 + #define CMDQ_CREATE_QP1_RQ_SGE_SFT 0 1911 + #define CMDQ_CREATE_QP1_RQ_FWO_MASK 0xfff0UL 1912 + #define CMDQ_CREATE_QP1_RQ_FWO_SFT 4 1913 + __le32 scq_cid; 1914 + __le32 rcq_cid; 1915 + __le32 srq_cid; 1916 + __le32 pd_id; 1917 + __le64 sq_pbl; 1918 + __le64 rq_pbl; 1919 + }; 1920 + 1921 + /* creq_create_qp1_resp (size:128b/16B) */ 2511 1922 struct creq_create_qp1_resp { 2512 - u8 type; 2513 - #define CREQ_CREATE_QP1_RESP_TYPE_MASK 0x3fUL 2514 - #define CREQ_CREATE_QP1_RESP_TYPE_SFT 0 2515 - #define CREQ_CREATE_QP1_RESP_TYPE_QP_EVENT 0x38UL 2516 - #define CREQ_CREATE_QP1_RESP_RESERVED2_MASK 0xc0UL 2517 - #define CREQ_CREATE_QP1_RESP_RESERVED2_SFT 6 2518 - u8 status; 2519 - __le16 cookie; 2520 - __le32 xid; 2521 - u8 v; 2522 - #define CREQ_CREATE_QP1_RESP_V 0x1UL 2523 - #define CREQ_CREATE_QP1_RESP_RESERVED7_MASK 0xfeUL 2524 - #define CREQ_CREATE_QP1_RESP_RESERVED7_SFT 1 2525 - u8 event; 2526 - #define CREQ_CREATE_QP1_RESP_EVENT_CREATE_QP1 0x13UL 2527 - __le16 reserved48[3]; 1923 + u8 type; 1924 + #define CREQ_CREATE_QP1_RESP_TYPE_MASK 0x3fUL 1925 + #define CREQ_CREATE_QP1_RESP_TYPE_SFT 0 1926 + #define CREQ_CREATE_QP1_RESP_TYPE_QP_EVENT 0x38UL 1927 + #define CREQ_CREATE_QP1_RESP_TYPE_LAST CREQ_CREATE_QP1_RESP_TYPE_QP_EVENT 1928 + u8 status; 1929 + __le16 cookie; 1930 + __le32 xid; 1931 + u8 v; 1932 + #define CREQ_CREATE_QP1_RESP_V 0x1UL 1933 + u8 event; 1934 + #define CREQ_CREATE_QP1_RESP_EVENT_CREATE_QP1 0x13UL 1935 + #define CREQ_CREATE_QP1_RESP_EVENT_LAST CREQ_CREATE_QP1_RESP_EVENT_CREATE_QP1 1936 + u8 reserved48[6]; 2528 1937 }; 2529 1938 2530 - /* Destroy QP1 command response (16 bytes) */ 1939 + /* cmdq_destroy_qp1 (size:192b/24B) */ 1940 + struct cmdq_destroy_qp1 { 1941 + u8 opcode; 1942 + #define CMDQ_DESTROY_QP1_OPCODE_DESTROY_QP1 0x14UL 1943 + #define CMDQ_DESTROY_QP1_OPCODE_LAST CMDQ_DESTROY_QP1_OPCODE_DESTROY_QP1 1944 + u8 cmd_size; 1945 + __le16 flags; 1946 + __le16 cookie; 1947 + u8 resp_size; 1948 + u8 reserved8; 1949 + __le64 resp_addr; 1950 + __le32 qp1_cid; 1951 + __le32 unused_0; 1952 + }; 1953 + 1954 + /* creq_destroy_qp1_resp (size:128b/16B) */ 2531 1955 struct creq_destroy_qp1_resp { 2532 - u8 type; 2533 - #define CREQ_DESTROY_QP1_RESP_TYPE_MASK 0x3fUL 2534 - #define CREQ_DESTROY_QP1_RESP_TYPE_SFT 0 2535 - #define CREQ_DESTROY_QP1_RESP_TYPE_QP_EVENT 0x38UL 2536 - #define CREQ_DESTROY_QP1_RESP_RESERVED2_MASK 0xc0UL 2537 - #define CREQ_DESTROY_QP1_RESP_RESERVED2_SFT 6 2538 - u8 status; 2539 - __le16 cookie; 2540 - __le32 xid; 2541 - u8 v; 2542 - #define CREQ_DESTROY_QP1_RESP_V 0x1UL 2543 - #define CREQ_DESTROY_QP1_RESP_RESERVED7_MASK 0xfeUL 2544 - #define CREQ_DESTROY_QP1_RESP_RESERVED7_SFT 1 2545 - u8 event; 2546 - #define CREQ_DESTROY_QP1_RESP_EVENT_DESTROY_QP1 0x14UL 2547 - __le16 reserved48[3]; 1956 + u8 type; 1957 + #define CREQ_DESTROY_QP1_RESP_TYPE_MASK 0x3fUL 1958 + #define CREQ_DESTROY_QP1_RESP_TYPE_SFT 0 1959 + #define CREQ_DESTROY_QP1_RESP_TYPE_QP_EVENT 0x38UL 1960 + #define CREQ_DESTROY_QP1_RESP_TYPE_LAST CREQ_DESTROY_QP1_RESP_TYPE_QP_EVENT 1961 + u8 status; 1962 + __le16 cookie; 1963 + __le32 xid; 1964 + u8 v; 1965 + #define CREQ_DESTROY_QP1_RESP_V 0x1UL 1966 + u8 event; 1967 + #define CREQ_DESTROY_QP1_RESP_EVENT_DESTROY_QP1 0x14UL 1968 + #define CREQ_DESTROY_QP1_RESP_EVENT_LAST CREQ_DESTROY_QP1_RESP_EVENT_DESTROY_QP1 1969 + u8 reserved48[6]; 2548 1970 }; 2549 1971 2550 - /* Create AH command response (16 bytes) */ 1972 + /* cmdq_create_ah (size:512b/64B) */ 1973 + struct cmdq_create_ah { 1974 + u8 opcode; 1975 + #define CMDQ_CREATE_AH_OPCODE_CREATE_AH 0x15UL 1976 + #define CMDQ_CREATE_AH_OPCODE_LAST CMDQ_CREATE_AH_OPCODE_CREATE_AH 1977 + u8 cmd_size; 1978 + __le16 flags; 1979 + __le16 cookie; 1980 + u8 resp_size; 1981 + u8 reserved8; 1982 + __le64 resp_addr; 1983 + __le64 ah_handle; 1984 + __le32 dgid[4]; 1985 + u8 type; 1986 + #define CMDQ_CREATE_AH_TYPE_V1 0x0UL 1987 + #define CMDQ_CREATE_AH_TYPE_V2IPV4 0x2UL 1988 + #define CMDQ_CREATE_AH_TYPE_V2IPV6 0x3UL 1989 + #define CMDQ_CREATE_AH_TYPE_LAST CMDQ_CREATE_AH_TYPE_V2IPV6 1990 + u8 hop_limit; 1991 + __le16 sgid_index; 1992 + __le32 dest_vlan_id_flow_label; 1993 + #define CMDQ_CREATE_AH_FLOW_LABEL_MASK 0xfffffUL 1994 + #define CMDQ_CREATE_AH_FLOW_LABEL_SFT 0 1995 + #define CMDQ_CREATE_AH_DEST_VLAN_ID_MASK 0xfff00000UL 1996 + #define CMDQ_CREATE_AH_DEST_VLAN_ID_SFT 20 1997 + __le32 pd_id; 1998 + __le32 unused_0; 1999 + __le16 dest_mac[3]; 2000 + u8 traffic_class; 2001 + u8 enable_cc; 2002 + #define CMDQ_CREATE_AH_ENABLE_CC 0x1UL 2003 + }; 2004 + 2005 + /* creq_create_ah_resp (size:128b/16B) */ 2551 2006 struct creq_create_ah_resp { 2552 - u8 type; 2553 - #define CREQ_CREATE_AH_RESP_TYPE_MASK 0x3fUL 2554 - #define CREQ_CREATE_AH_RESP_TYPE_SFT 0 2555 - #define CREQ_CREATE_AH_RESP_TYPE_QP_EVENT 0x38UL 2556 - #define CREQ_CREATE_AH_RESP_RESERVED2_MASK 0xc0UL 2557 - #define CREQ_CREATE_AH_RESP_RESERVED2_SFT 6 2558 - u8 status; 2559 - __le16 cookie; 2560 - __le32 xid; 2561 - u8 v; 2562 - #define CREQ_CREATE_AH_RESP_V 0x1UL 2563 - #define CREQ_CREATE_AH_RESP_RESERVED7_MASK 0xfeUL 2564 - #define CREQ_CREATE_AH_RESP_RESERVED7_SFT 1 2565 - u8 event; 2566 - #define CREQ_CREATE_AH_RESP_EVENT_CREATE_AH 0x15UL 2567 - __le16 reserved48[3]; 2007 + u8 type; 2008 + #define CREQ_CREATE_AH_RESP_TYPE_MASK 0x3fUL 2009 + #define CREQ_CREATE_AH_RESP_TYPE_SFT 0 2010 + #define CREQ_CREATE_AH_RESP_TYPE_QP_EVENT 0x38UL 2011 + #define CREQ_CREATE_AH_RESP_TYPE_LAST CREQ_CREATE_AH_RESP_TYPE_QP_EVENT 2012 + u8 status; 2013 + __le16 cookie; 2014 + __le32 xid; 2015 + u8 v; 2016 + #define CREQ_CREATE_AH_RESP_V 0x1UL 2017 + u8 event; 2018 + #define CREQ_CREATE_AH_RESP_EVENT_CREATE_AH 0x15UL 2019 + #define CREQ_CREATE_AH_RESP_EVENT_LAST CREQ_CREATE_AH_RESP_EVENT_CREATE_AH 2020 + u8 reserved48[6]; 2568 2021 }; 2569 2022 2570 - /* Destroy AH command response (16 bytes) */ 2023 + /* cmdq_destroy_ah (size:192b/24B) */ 2024 + struct cmdq_destroy_ah { 2025 + u8 opcode; 2026 + #define CMDQ_DESTROY_AH_OPCODE_DESTROY_AH 0x16UL 2027 + #define CMDQ_DESTROY_AH_OPCODE_LAST CMDQ_DESTROY_AH_OPCODE_DESTROY_AH 2028 + u8 cmd_size; 2029 + __le16 flags; 2030 + __le16 cookie; 2031 + u8 resp_size; 2032 + u8 reserved8; 2033 + __le64 resp_addr; 2034 + __le32 ah_cid; 2035 + __le32 unused_0; 2036 + }; 2037 + 2038 + /* creq_destroy_ah_resp (size:128b/16B) */ 2571 2039 struct creq_destroy_ah_resp { 2572 - u8 type; 2573 - #define CREQ_DESTROY_AH_RESP_TYPE_MASK 0x3fUL 2574 - #define CREQ_DESTROY_AH_RESP_TYPE_SFT 0 2575 - #define CREQ_DESTROY_AH_RESP_TYPE_QP_EVENT 0x38UL 2576 - #define CREQ_DESTROY_AH_RESP_RESERVED2_MASK 0xc0UL 2577 - #define CREQ_DESTROY_AH_RESP_RESERVED2_SFT 6 2578 - u8 status; 2579 - __le16 cookie; 2580 - __le32 xid; 2581 - u8 v; 2582 - #define CREQ_DESTROY_AH_RESP_V 0x1UL 2583 - #define CREQ_DESTROY_AH_RESP_RESERVED7_MASK 0xfeUL 2584 - #define CREQ_DESTROY_AH_RESP_RESERVED7_SFT 1 2585 - u8 event; 2586 - #define CREQ_DESTROY_AH_RESP_EVENT_DESTROY_AH 0x16UL 2587 - __le16 reserved48[3]; 2040 + u8 type; 2041 + #define CREQ_DESTROY_AH_RESP_TYPE_MASK 0x3fUL 2042 + #define CREQ_DESTROY_AH_RESP_TYPE_SFT 0 2043 + #define CREQ_DESTROY_AH_RESP_TYPE_QP_EVENT 0x38UL 2044 + #define CREQ_DESTROY_AH_RESP_TYPE_LAST CREQ_DESTROY_AH_RESP_TYPE_QP_EVENT 2045 + u8 status; 2046 + __le16 cookie; 2047 + __le32 xid; 2048 + u8 v; 2049 + #define CREQ_DESTROY_AH_RESP_V 0x1UL 2050 + u8 event; 2051 + #define CREQ_DESTROY_AH_RESP_EVENT_DESTROY_AH 0x16UL 2052 + #define CREQ_DESTROY_AH_RESP_EVENT_LAST CREQ_DESTROY_AH_RESP_EVENT_DESTROY_AH 2053 + u8 reserved48[6]; 2588 2054 }; 2589 2055 2590 - /* Initialize Firmware command response (16 bytes) */ 2591 - struct creq_initialize_fw_resp { 2592 - u8 type; 2593 - #define CREQ_INITIALIZE_FW_RESP_TYPE_MASK 0x3fUL 2594 - #define CREQ_INITIALIZE_FW_RESP_TYPE_SFT 0 2595 - #define CREQ_INITIALIZE_FW_RESP_TYPE_QP_EVENT 0x38UL 2596 - #define CREQ_INITIALIZE_FW_RESP_RESERVED2_MASK 0xc0UL 2597 - #define CREQ_INITIALIZE_FW_RESP_RESERVED2_SFT 6 2598 - u8 status; 2599 - __le16 cookie; 2600 - __le32 reserved32; 2601 - u8 v; 2602 - #define CREQ_INITIALIZE_FW_RESP_V 0x1UL 2603 - #define CREQ_INITIALIZE_FW_RESP_RESERVED7_MASK 0xfeUL 2604 - #define CREQ_INITIALIZE_FW_RESP_RESERVED7_SFT 1 2605 - u8 event; 2606 - #define CREQ_INITIALIZE_FW_RESP_EVENT_INITIALIZE_FW 0x80UL 2607 - __le16 reserved48[3]; 2608 - }; 2609 - 2610 - /* De-initialize Firmware command response (16 bytes) */ 2611 - struct creq_deinitialize_fw_resp { 2612 - u8 type; 2613 - #define CREQ_DEINITIALIZE_FW_RESP_TYPE_MASK 0x3fUL 2614 - #define CREQ_DEINITIALIZE_FW_RESP_TYPE_SFT 0 2615 - #define CREQ_DEINITIALIZE_FW_RESP_TYPE_QP_EVENT 0x38UL 2616 - #define CREQ_DEINITIALIZE_FW_RESP_RESERVED2_MASK 0xc0UL 2617 - #define CREQ_DEINITIALIZE_FW_RESP_RESERVED2_SFT 6 2618 - u8 status; 2619 - __le16 cookie; 2620 - __le32 reserved32; 2621 - u8 v; 2622 - #define CREQ_DEINITIALIZE_FW_RESP_V 0x1UL 2623 - #define CREQ_DEINITIALIZE_FW_RESP_RESERVED7_MASK 0xfeUL 2624 - #define CREQ_DEINITIALIZE_FW_RESP_RESERVED7_SFT 1 2625 - u8 event; 2626 - #define CREQ_DEINITIALIZE_FW_RESP_EVENT_DEINITIALIZE_FW 0x81UL 2627 - __le16 reserved48[3]; 2628 - }; 2629 - 2630 - /* Stop function command response (16 bytes) */ 2631 - struct creq_stop_func_resp { 2632 - u8 type; 2633 - #define CREQ_STOP_FUNC_RESP_TYPE_MASK 0x3fUL 2634 - #define CREQ_STOP_FUNC_RESP_TYPE_SFT 0 2635 - #define CREQ_STOP_FUNC_RESP_TYPE_QP_EVENT 0x38UL 2636 - #define CREQ_STOP_FUNC_RESP_RESERVED2_MASK 0xc0UL 2637 - #define CREQ_STOP_FUNC_RESP_RESERVED2_SFT 6 2638 - u8 status; 2639 - __le16 cookie; 2640 - __le32 reserved32; 2641 - u8 v; 2642 - #define CREQ_STOP_FUNC_RESP_V 0x1UL 2643 - #define CREQ_STOP_FUNC_RESP_RESERVED7_MASK 0xfeUL 2644 - #define CREQ_STOP_FUNC_RESP_RESERVED7_SFT 1 2645 - u8 event; 2646 - #define CREQ_STOP_FUNC_RESP_EVENT_STOP_FUNC 0x82UL 2647 - __le16 reserved48[3]; 2648 - }; 2649 - 2650 - /* Query function command response (16 bytes) */ 2651 - struct creq_query_func_resp { 2652 - u8 type; 2653 - #define CREQ_QUERY_FUNC_RESP_TYPE_MASK 0x3fUL 2654 - #define CREQ_QUERY_FUNC_RESP_TYPE_SFT 0 2655 - #define CREQ_QUERY_FUNC_RESP_TYPE_QP_EVENT 0x38UL 2656 - #define CREQ_QUERY_FUNC_RESP_RESERVED2_MASK 0xc0UL 2657 - #define CREQ_QUERY_FUNC_RESP_RESERVED2_SFT 6 2658 - u8 status; 2659 - __le16 cookie; 2660 - __le32 size; 2661 - u8 v; 2662 - #define CREQ_QUERY_FUNC_RESP_V 0x1UL 2663 - #define CREQ_QUERY_FUNC_RESP_RESERVED7_MASK 0xfeUL 2664 - #define CREQ_QUERY_FUNC_RESP_RESERVED7_SFT 1 2665 - u8 event; 2666 - #define CREQ_QUERY_FUNC_RESP_EVENT_QUERY_FUNC 0x83UL 2667 - __le16 reserved48[3]; 2668 - }; 2669 - 2670 - /* Query function command response side buffer structure (88 bytes) */ 2671 - struct creq_query_func_resp_sb { 2672 - u8 opcode; 2673 - #define CREQ_QUERY_FUNC_RESP_SB_OPCODE_QUERY_FUNC 0x83UL 2674 - u8 status; 2675 - __le16 cookie; 2676 - __le16 flags; 2677 - u8 resp_size; 2678 - u8 reserved8; 2679 - __le64 max_mr_size; 2680 - __le32 max_qp; 2681 - __le16 max_qp_wr; 2682 - __le16 dev_cap_flags; 2683 - #define CREQ_QUERY_FUNC_RESP_SB_DEV_CAP_FLAGS_RESIZE_QP 0x1UL 2684 - #define CREQ_QUERY_FUNC_RESP_SB_EXT_STATS 0x10UL 2685 - __le32 max_cq; 2686 - __le32 max_cqe; 2687 - __le32 max_pd; 2688 - u8 max_sge; 2689 - u8 max_srq_sge; 2690 - u8 max_qp_rd_atom; 2691 - u8 max_qp_init_rd_atom; 2692 - __le32 max_mr; 2693 - __le32 max_mw; 2694 - __le32 max_raw_eth_qp; 2695 - __le32 max_ah; 2696 - __le32 max_fmr; 2697 - __le32 max_srq_wr; 2698 - __le32 max_pkeys; 2699 - __le32 max_inline_data; 2700 - u8 max_map_per_fmr; 2701 - u8 l2_db_space_size; 2702 - __le16 max_srq; 2703 - __le32 max_gid; 2704 - __le32 tqm_alloc_reqs[12]; 2705 - __le32 max_dpi; 2706 - __le32 reserved_32; 2707 - }; 2708 - 2709 - /* Set resources command response (16 bytes) */ 2710 - struct creq_set_func_resources_resp { 2711 - u8 type; 2712 - #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_MASK 0x3fUL 2713 - #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_SFT 0 2714 - #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_QP_EVENT 0x38UL 2715 - #define CREQ_SET_FUNC_RESOURCES_RESP_RESERVED2_MASK 0xc0UL 2716 - #define CREQ_SET_FUNC_RESOURCES_RESP_RESERVED2_SFT 6 2717 - u8 status; 2718 - __le16 cookie; 2719 - __le32 reserved32; 2720 - u8 v; 2721 - #define CREQ_SET_FUNC_RESOURCES_RESP_V 0x1UL 2722 - #define CREQ_SET_FUNC_RESOURCES_RESP_RESERVED7_MASK 0xfeUL 2723 - #define CREQ_SET_FUNC_RESOURCES_RESP_RESERVED7_SFT 1 2724 - u8 event; 2725 - #define CREQ_SET_FUNC_RESOURCES_RESP_EVENT_SET_FUNC_RESOURCES 0x84UL 2726 - __le16 reserved48[3]; 2727 - }; 2728 - 2729 - /* Map TC to COS response (16 bytes) */ 2730 - struct creq_map_tc_to_cos_resp { 2731 - u8 type; 2732 - #define CREQ_MAP_TC_TO_COS_RESP_TYPE_MASK 0x3fUL 2733 - #define CREQ_MAP_TC_TO_COS_RESP_TYPE_SFT 0 2734 - #define CREQ_MAP_TC_TO_COS_RESP_TYPE_QP_EVENT 0x38UL 2735 - #define CREQ_MAP_TC_TO_COS_RESP_RESERVED2_MASK 0xc0UL 2736 - #define CREQ_MAP_TC_TO_COS_RESP_RESERVED2_SFT 6 2737 - u8 status; 2738 - __le16 cookie; 2739 - __le32 reserved32; 2740 - u8 v; 2741 - #define CREQ_MAP_TC_TO_COS_RESP_V 0x1UL 2742 - #define CREQ_MAP_TC_TO_COS_RESP_RESERVED7_MASK 0xfeUL 2743 - #define CREQ_MAP_TC_TO_COS_RESP_RESERVED7_SFT 1 2744 - u8 event; 2745 - #define CREQ_MAP_TC_TO_COS_RESP_EVENT_MAP_TC_TO_COS 0x8aUL 2746 - __le16 reserved48[3]; 2747 - }; 2748 - 2749 - /* Query version response (16 bytes) */ 2750 - struct creq_query_version_resp { 2751 - u8 type; 2752 - #define CREQ_QUERY_VERSION_RESP_TYPE_MASK 0x3fUL 2753 - #define CREQ_QUERY_VERSION_RESP_TYPE_SFT 0 2754 - #define CREQ_QUERY_VERSION_RESP_TYPE_QP_EVENT 0x38UL 2755 - #define CREQ_QUERY_VERSION_RESP_RESERVED2_MASK 0xc0UL 2756 - #define CREQ_QUERY_VERSION_RESP_RESERVED2_SFT 6 2757 - u8 status; 2758 - __le16 cookie; 2759 - u8 fw_maj; 2760 - u8 fw_minor; 2761 - u8 fw_bld; 2762 - u8 fw_rsvd; 2763 - u8 v; 2764 - #define CREQ_QUERY_VERSION_RESP_V 0x1UL 2765 - #define CREQ_QUERY_VERSION_RESP_RESERVED7_MASK 0xfeUL 2766 - #define CREQ_QUERY_VERSION_RESP_RESERVED7_SFT 1 2767 - u8 event; 2768 - #define CREQ_QUERY_VERSION_RESP_EVENT_QUERY_VERSION 0x8bUL 2769 - __le16 reserved16; 2770 - u8 intf_maj; 2771 - u8 intf_minor; 2772 - u8 intf_bld; 2773 - u8 intf_rsvd; 2774 - }; 2775 - 2776 - /* Modify congestion control command response (16 bytes) */ 2777 - struct creq_modify_cc_resp { 2778 - u8 type; 2779 - #define CREQ_MODIFY_CC_RESP_TYPE_MASK 0x3fUL 2780 - #define CREQ_MODIFY_CC_RESP_TYPE_SFT 0 2781 - #define CREQ_MODIFY_CC_RESP_TYPE_QP_EVENT 0x38UL 2782 - #define CREQ_MODIFY_CC_RESP_RESERVED2_MASK 0xc0UL 2783 - #define CREQ_MODIFY_CC_RESP_RESERVED2_SFT 6 2784 - u8 status; 2785 - __le16 cookie; 2786 - __le32 reserved32; 2787 - u8 v; 2788 - #define CREQ_MODIFY_CC_RESP_V 0x1UL 2789 - #define CREQ_MODIFY_CC_RESP_RESERVED7_MASK 0xfeUL 2790 - #define CREQ_MODIFY_CC_RESP_RESERVED7_SFT 1 2791 - u8 event; 2792 - #define CREQ_MODIFY_CC_RESP_EVENT_MODIFY_CC 0x8cUL 2793 - __le16 reserved48[3]; 2794 - }; 2795 - 2796 - /* Query congestion control command response (16 bytes) */ 2797 - struct creq_query_cc_resp { 2798 - u8 type; 2799 - #define CREQ_QUERY_CC_RESP_TYPE_MASK 0x3fUL 2800 - #define CREQ_QUERY_CC_RESP_TYPE_SFT 0 2801 - #define CREQ_QUERY_CC_RESP_TYPE_QP_EVENT 0x38UL 2802 - #define CREQ_QUERY_CC_RESP_RESERVED2_MASK 0xc0UL 2803 - #define CREQ_QUERY_CC_RESP_RESERVED2_SFT 6 2804 - u8 status; 2805 - __le16 cookie; 2806 - __le32 size; 2807 - u8 v; 2808 - #define CREQ_QUERY_CC_RESP_V 0x1UL 2809 - #define CREQ_QUERY_CC_RESP_RESERVED7_MASK 0xfeUL 2810 - #define CREQ_QUERY_CC_RESP_RESERVED7_SFT 1 2811 - u8 event; 2812 - #define CREQ_QUERY_CC_RESP_EVENT_QUERY_CC 0x8dUL 2813 - __le16 reserved48[3]; 2814 - }; 2815 - 2816 - /* Query congestion control command response side buffer structure (32 bytes) */ 2817 - struct creq_query_cc_resp_sb { 2818 - u8 opcode; 2819 - #define CREQ_QUERY_CC_RESP_SB_OPCODE_QUERY_CC 0x8dUL 2820 - u8 status; 2821 - __le16 cookie; 2822 - __le16 flags; 2823 - u8 resp_size; 2824 - u8 reserved8; 2825 - u8 enable_cc; 2826 - #define CREQ_QUERY_CC_RESP_SB_ENABLE_CC 0x1UL 2827 - u8 g; 2828 - #define CREQ_QUERY_CC_RESP_SB_G_MASK 0x7UL 2829 - #define CREQ_QUERY_CC_RESP_SB_G_SFT 0 2830 - u8 num_phases_per_state; 2831 - __le16 init_cr; 2832 - u8 unused_2; 2833 - __le16 unused_3; 2834 - u8 unused_4; 2835 - __le16 init_tr; 2836 - u8 tos_dscp_tos_ecn; 2837 - #define CREQ_QUERY_CC_RESP_SB_TOS_ECN_MASK 0x3UL 2838 - #define CREQ_QUERY_CC_RESP_SB_TOS_ECN_SFT 0 2839 - #define CREQ_QUERY_CC_RESP_SB_TOS_DSCP_MASK 0xfcUL 2840 - #define CREQ_QUERY_CC_RESP_SB_TOS_DSCP_SFT 2 2841 - __le64 reserved64; 2842 - __le64 reserved64_1; 2056 + /* cmdq_query_roce_stats (size:192b/24B) */ 2057 + struct cmdq_query_roce_stats { 2058 + u8 opcode; 2059 + #define CMDQ_QUERY_ROCE_STATS_OPCODE_QUERY_ROCE_STATS 0x8eUL 2060 + #define CMDQ_QUERY_ROCE_STATS_OPCODE_LAST CMDQ_QUERY_ROCE_STATS_OPCODE_QUERY_ROCE_STATS 2061 + u8 cmd_size; 2062 + __le16 flags; 2063 + #define CMDQ_QUERY_ROCE_STATS_FLAGS_COLLECTION_ID 0x1UL 2064 + #define CMDQ_QUERY_ROCE_STATS_FLAGS_FUNCTION_ID 0x2UL 2065 + __le16 cookie; 2066 + u8 resp_size; 2067 + u8 collection_id; 2068 + __le64 resp_addr; 2069 + __le32 function_id; 2070 + #define CMDQ_QUERY_ROCE_STATS_PF_NUM_MASK 0xffUL 2071 + #define CMDQ_QUERY_ROCE_STATS_PF_NUM_SFT 0 2072 + #define CMDQ_QUERY_ROCE_STATS_VF_NUM_MASK 0xffff00UL 2073 + #define CMDQ_QUERY_ROCE_STATS_VF_NUM_SFT 8 2074 + #define CMDQ_QUERY_ROCE_STATS_VF_VALID 0x1000000UL 2075 + __le32 reserved32; 2843 2076 }; 2844 2077 2845 2078 /* creq_query_roce_stats_resp (size:128b/16B) */ ··· 1909 3020 #define CREQ_QUERY_ROCE_STATS_RESP_TYPE_MASK 0x3fUL 1910 3021 #define CREQ_QUERY_ROCE_STATS_RESP_TYPE_SFT 0 1911 3022 #define CREQ_QUERY_ROCE_STATS_RESP_TYPE_QP_EVENT 0x38UL 1912 - #define CREQ_QUERY_ROCE_STATS_RESP_TYPE_LAST \ 1913 - CREQ_QUERY_ROCE_STATS_RESP_TYPE_QP_EVENT 3023 + #define CREQ_QUERY_ROCE_STATS_RESP_TYPE_LAST CREQ_QUERY_ROCE_STATS_RESP_TYPE_QP_EVENT 1914 3024 u8 status; 1915 3025 __le16 cookie; 1916 3026 __le32 size; ··· 1917 3029 #define CREQ_QUERY_ROCE_STATS_RESP_V 0x1UL 1918 3030 u8 event; 1919 3031 #define CREQ_QUERY_ROCE_STATS_RESP_EVENT_QUERY_ROCE_STATS 0x8eUL 1920 - #define CREQ_QUERY_ROCE_STATS_RESP_EVENT_LAST \ 1921 - CREQ_QUERY_ROCE_STATS_RESP_EVENT_QUERY_ROCE_STATS 3032 + #define CREQ_QUERY_ROCE_STATS_RESP_EVENT_LAST \ 3033 + CREQ_QUERY_ROCE_STATS_RESP_EVENT_QUERY_ROCE_STATS 1922 3034 u8 reserved48[6]; 1923 3035 }; 1924 3036 1925 - /* creq_query_roce_stats_resp_sb (size:2624b/328B) */ 3037 + /* creq_query_roce_stats_resp_sb (size:2944b/368B) */ 1926 3038 struct creq_query_roce_stats_resp_sb { 1927 3039 u8 opcode; 1928 3040 #define CREQ_QUERY_ROCE_STATS_RESP_SB_OPCODE_QUERY_ROCE_STATS 0x8eUL 1929 3041 #define CREQ_QUERY_ROCE_STATS_RESP_SB_OPCODE_LAST \ 1930 - CREQ_QUERY_ROCE_STATS_RESP_SB_OPCODE_QUERY_ROCE_STATS 3042 + CREQ_QUERY_ROCE_STATS_RESP_SB_OPCODE_QUERY_ROCE_STATS 1931 3043 u8 status; 1932 3044 __le16 cookie; 1933 3045 __le16 flags; ··· 1974 3086 __le64 res_srq_load_err; 1975 3087 __le64 res_tx_pci_err; 1976 3088 __le64 res_rx_pci_err; 1977 - __le64 res_oos_drop_count; 1978 - __le64 active_qp_count_p0; 1979 - __le64 active_qp_count_p1; 1980 - __le64 active_qp_count_p2; 1981 - __le64 active_qp_count_p3; 3089 + __le64 res_oos_drop_count; 3090 + __le64 active_qp_count_p0; 3091 + __le64 active_qp_count_p1; 3092 + __le64 active_qp_count_p2; 3093 + __le64 active_qp_count_p3; 1982 3094 }; 1983 3095 1984 3096 /* cmdq_query_roce_stats_ext (size:192b/24B) */ 1985 3097 struct cmdq_query_roce_stats_ext { 1986 - u8 opcode; 3098 + u8 opcode; 1987 3099 #define CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_QUERY_ROCE_STATS 0x92UL 1988 - #define CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_LAST \ 1989 - CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_QUERY_ROCE_STATS 1990 - u8 cmd_size; 1991 - __le16 flags; 3100 + #define CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_LAST \ 3101 + CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_QUERY_ROCE_STATS 3102 + u8 cmd_size; 3103 + __le16 flags; 1992 3104 #define CMDQ_QUERY_ROCE_STATS_EXT_FLAGS_COLLECTION_ID 0x1UL 1993 3105 #define CMDQ_QUERY_ROCE_STATS_EXT_FLAGS_FUNCTION_ID 0x2UL 1994 - __le16 cookie; 1995 - u8 resp_size; 1996 - u8 collection_id; 1997 - __le64 resp_addr; 1998 - __le32 function_id; 3106 + __le16 cookie; 3107 + u8 resp_size; 3108 + u8 collection_id; 3109 + __le64 resp_addr; 3110 + __le32 function_id; 1999 3111 #define CMDQ_QUERY_ROCE_STATS_EXT_PF_NUM_MASK 0xffUL 2000 3112 #define CMDQ_QUERY_ROCE_STATS_EXT_PF_NUM_SFT 0 2001 3113 #define CMDQ_QUERY_ROCE_STATS_EXT_VF_NUM_MASK 0xffff00UL 2002 3114 #define CMDQ_QUERY_ROCE_STATS_EXT_VF_NUM_SFT 8 2003 3115 #define CMDQ_QUERY_ROCE_STATS_EXT_VF_VALID 0x1000000UL 2004 - __le32 reserved32; 3116 + __le32 reserved32; 2005 3117 }; 2006 3118 2007 3119 /* creq_query_roce_stats_ext_resp (size:128b/16B) */ 2008 3120 struct creq_query_roce_stats_ext_resp { 2009 - u8 type; 3121 + u8 type; 2010 3122 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_MASK 0x3fUL 2011 3123 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_SFT 0 2012 3124 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_QP_EVENT 0x38UL 2013 - #define CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_LAST \ 3125 + #define CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_LAST \ 2014 3126 CREQ_QUERY_ROCE_STATS_EXT_RESP_TYPE_QP_EVENT 2015 - u8 status; 2016 - __le16 cookie; 2017 - __le32 size; 2018 - u8 v; 3127 + u8 status; 3128 + __le16 cookie; 3129 + __le32 size; 3130 + u8 v; 2019 3131 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_V 0x1UL 2020 - u8 event; 3132 + u8 event; 2021 3133 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_EVENT_QUERY_ROCE_STATS_EXT 0x92UL 2022 3134 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_EVENT_LAST \ 2023 3135 CREQ_QUERY_ROCE_STATS_EXT_RESP_EVENT_QUERY_ROCE_STATS_EXT 2024 - u8 reserved48[6]; 3136 + u8 reserved48[6]; 2025 3137 }; 2026 3138 2027 - /* creq_query_roce_stats_ext_resp_sb (size:1536b/192B) */ 3139 + /* creq_query_roce_stats_ext_resp_sb (size:1856b/232B) */ 2028 3140 struct creq_query_roce_stats_ext_resp_sb { 2029 - u8 opcode; 3141 + u8 opcode; 2030 3142 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_SB_OPCODE_QUERY_ROCE_STATS_EXT 0x92UL 2031 3143 #define CREQ_QUERY_ROCE_STATS_EXT_RESP_SB_OPCODE_LAST \ 2032 3144 CREQ_QUERY_ROCE_STATS_EXT_RESP_SB_OPCODE_QUERY_ROCE_STATS_EXT 2033 - u8 status; 2034 - __le16 cookie; 2035 - __le16 flags; 2036 - u8 resp_size; 2037 - u8 rsvd; 2038 - __le64 tx_atomic_req_pkts; 2039 - __le64 tx_read_req_pkts; 2040 - __le64 tx_read_res_pkts; 2041 - __le64 tx_write_req_pkts; 2042 - __le64 tx_send_req_pkts; 2043 - __le64 tx_roce_pkts; 2044 - __le64 tx_roce_bytes; 2045 - __le64 rx_atomic_req_pkts; 2046 - __le64 rx_read_req_pkts; 2047 - __le64 rx_read_res_pkts; 2048 - __le64 rx_write_req_pkts; 2049 - __le64 rx_send_req_pkts; 2050 - __le64 rx_roce_pkts; 2051 - __le64 rx_roce_bytes; 2052 - __le64 rx_roce_good_pkts; 2053 - __le64 rx_roce_good_bytes; 2054 - __le64 rx_out_of_buffer_pkts; 2055 - __le64 rx_out_of_sequence_pkts; 2056 - __le64 tx_cnp_pkts; 2057 - __le64 rx_cnp_pkts; 2058 - __le64 rx_ecn_marked_pkts; 2059 - __le64 tx_cnp_bytes; 2060 - __le64 rx_cnp_bytes; 3145 + u8 status; 3146 + __le16 cookie; 3147 + __le16 flags; 3148 + u8 resp_size; 3149 + u8 rsvd; 3150 + __le64 tx_atomic_req_pkts; 3151 + __le64 tx_read_req_pkts; 3152 + __le64 tx_read_res_pkts; 3153 + __le64 tx_write_req_pkts; 3154 + __le64 tx_send_req_pkts; 3155 + __le64 tx_roce_pkts; 3156 + __le64 tx_roce_bytes; 3157 + __le64 rx_atomic_req_pkts; 3158 + __le64 rx_read_req_pkts; 3159 + __le64 rx_read_res_pkts; 3160 + __le64 rx_write_req_pkts; 3161 + __le64 rx_send_req_pkts; 3162 + __le64 rx_roce_pkts; 3163 + __le64 rx_roce_bytes; 3164 + __le64 rx_roce_good_pkts; 3165 + __le64 rx_roce_good_bytes; 3166 + __le64 rx_out_of_buffer_pkts; 3167 + __le64 rx_out_of_sequence_pkts; 3168 + __le64 tx_cnp_pkts; 3169 + __le64 rx_cnp_pkts; 3170 + __le64 rx_ecn_marked_pkts; 3171 + __le64 tx_cnp_bytes; 3172 + __le64 rx_cnp_bytes; 3173 + __le64 seq_err_naks_rcvd; 3174 + __le64 rnr_naks_rcvd; 3175 + __le64 missing_resp; 3176 + __le64 to_retransmit; 3177 + __le64 dup_req; 2061 3178 }; 2062 3179 2063 - /* QP error notification event (16 bytes) */ 3180 + /* cmdq_query_func (size:128b/16B) */ 3181 + struct cmdq_query_func { 3182 + u8 opcode; 3183 + #define CMDQ_QUERY_FUNC_OPCODE_QUERY_FUNC 0x83UL 3184 + #define CMDQ_QUERY_FUNC_OPCODE_LAST CMDQ_QUERY_FUNC_OPCODE_QUERY_FUNC 3185 + u8 cmd_size; 3186 + __le16 flags; 3187 + __le16 cookie; 3188 + u8 resp_size; 3189 + u8 reserved8; 3190 + __le64 resp_addr; 3191 + }; 3192 + 3193 + /* creq_query_func_resp (size:128b/16B) */ 3194 + struct creq_query_func_resp { 3195 + u8 type; 3196 + #define CREQ_QUERY_FUNC_RESP_TYPE_MASK 0x3fUL 3197 + #define CREQ_QUERY_FUNC_RESP_TYPE_SFT 0 3198 + #define CREQ_QUERY_FUNC_RESP_TYPE_QP_EVENT 0x38UL 3199 + #define CREQ_QUERY_FUNC_RESP_TYPE_LAST CREQ_QUERY_FUNC_RESP_TYPE_QP_EVENT 3200 + u8 status; 3201 + __le16 cookie; 3202 + __le32 size; 3203 + u8 v; 3204 + #define CREQ_QUERY_FUNC_RESP_V 0x1UL 3205 + u8 event; 3206 + #define CREQ_QUERY_FUNC_RESP_EVENT_QUERY_FUNC 0x83UL 3207 + #define CREQ_QUERY_FUNC_RESP_EVENT_LAST CREQ_QUERY_FUNC_RESP_EVENT_QUERY_FUNC 3208 + u8 reserved48[6]; 3209 + }; 3210 + 3211 + /* creq_query_func_resp_sb (size:1088b/136B) */ 3212 + struct creq_query_func_resp_sb { 3213 + u8 opcode; 3214 + #define CREQ_QUERY_FUNC_RESP_SB_OPCODE_QUERY_FUNC 0x83UL 3215 + #define CREQ_QUERY_FUNC_RESP_SB_OPCODE_LAST CREQ_QUERY_FUNC_RESP_SB_OPCODE_QUERY_FUNC 3216 + u8 status; 3217 + __le16 cookie; 3218 + __le16 flags; 3219 + u8 resp_size; 3220 + u8 reserved8; 3221 + __le64 max_mr_size; 3222 + __le32 max_qp; 3223 + __le16 max_qp_wr; 3224 + __le16 dev_cap_flags; 3225 + #define CREQ_QUERY_FUNC_RESP_SB_RESIZE_QP 0x1UL 3226 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_MASK 0xeUL 3227 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_SFT 1 3228 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_CC_GEN0 (0x0UL << 1) 3229 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_CC_GEN1 (0x1UL << 1) 3230 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_CC_GEN1_EXT (0x2UL << 1) 3231 + #define CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_LAST \ 3232 + CREQ_QUERY_FUNC_RESP_SB_CC_GENERATION_CC_GEN1_EXT 3233 + #define CREQ_QUERY_FUNC_RESP_SB_EXT_STATS 0x10UL 3234 + #define CREQ_QUERY_FUNC_RESP_SB_MR_REGISTER_ALLOC 0x20UL 3235 + #define CREQ_QUERY_FUNC_RESP_SB_OPTIMIZED_TRANSMIT_ENABLED 0x40UL 3236 + #define CREQ_QUERY_FUNC_RESP_SB_CQE_V2 0x80UL 3237 + #define CREQ_QUERY_FUNC_RESP_SB_PINGPONG_PUSH_MODE 0x100UL 3238 + #define CREQ_QUERY_FUNC_RESP_SB_HW_REQUESTER_RETX_ENABLED 0x200UL 3239 + #define CREQ_QUERY_FUNC_RESP_SB_HW_RESPONDER_RETX_ENABLED 0x400UL 3240 + __le32 max_cq; 3241 + __le32 max_cqe; 3242 + __le32 max_pd; 3243 + u8 max_sge; 3244 + u8 max_srq_sge; 3245 + u8 max_qp_rd_atom; 3246 + u8 max_qp_init_rd_atom; 3247 + __le32 max_mr; 3248 + __le32 max_mw; 3249 + __le32 max_raw_eth_qp; 3250 + __le32 max_ah; 3251 + __le32 max_fmr; 3252 + __le32 max_srq_wr; 3253 + __le32 max_pkeys; 3254 + __le32 max_inline_data; 3255 + u8 max_map_per_fmr; 3256 + u8 l2_db_space_size; 3257 + __le16 max_srq; 3258 + __le32 max_gid; 3259 + __le32 tqm_alloc_reqs[12]; 3260 + __le32 max_dpi; 3261 + u8 max_sge_var_wqe; 3262 + u8 reserved_8; 3263 + __le16 max_inline_data_var_wqe; 3264 + }; 3265 + 3266 + /* cmdq_set_func_resources (size:448b/56B) */ 3267 + struct cmdq_set_func_resources { 3268 + u8 opcode; 3269 + #define CMDQ_SET_FUNC_RESOURCES_OPCODE_SET_FUNC_RESOURCES 0x84UL 3270 + #define CMDQ_SET_FUNC_RESOURCES_OPCODE_LAST\ 3271 + CMDQ_SET_FUNC_RESOURCES_OPCODE_SET_FUNC_RESOURCES 3272 + u8 cmd_size; 3273 + __le16 flags; 3274 + #define CMDQ_SET_FUNC_RESOURCES_FLAGS_MRAV_RESERVATION_SPLIT 0x1UL 3275 + __le16 cookie; 3276 + u8 resp_size; 3277 + u8 reserved8; 3278 + __le64 resp_addr; 3279 + __le32 number_of_qp; 3280 + __le32 number_of_mrw; 3281 + __le32 number_of_srq; 3282 + __le32 number_of_cq; 3283 + __le32 max_qp_per_vf; 3284 + __le32 max_mrw_per_vf; 3285 + __le32 max_srq_per_vf; 3286 + __le32 max_cq_per_vf; 3287 + __le32 max_gid_per_vf; 3288 + __le32 stat_ctx_id; 3289 + }; 3290 + 3291 + /* creq_set_func_resources_resp (size:128b/16B) */ 3292 + struct creq_set_func_resources_resp { 3293 + u8 type; 3294 + #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_MASK 0x3fUL 3295 + #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_SFT 0 3296 + #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_QP_EVENT 0x38UL 3297 + #define CREQ_SET_FUNC_RESOURCES_RESP_TYPE_LAST CREQ_SET_FUNC_RESOURCES_RESP_TYPE_QP_EVENT 3298 + u8 status; 3299 + __le16 cookie; 3300 + __le32 reserved32; 3301 + u8 v; 3302 + #define CREQ_SET_FUNC_RESOURCES_RESP_V 0x1UL 3303 + u8 event; 3304 + #define CREQ_SET_FUNC_RESOURCES_RESP_EVENT_SET_FUNC_RESOURCES 0x84UL 3305 + #define CREQ_SET_FUNC_RESOURCES_RESP_EVENT_LAST \ 3306 + CREQ_SET_FUNC_RESOURCES_RESP_EVENT_SET_FUNC_RESOURCES 3307 + u8 reserved48[6]; 3308 + }; 3309 + 3310 + /* cmdq_map_tc_to_cos (size:192b/24B) */ 3311 + struct cmdq_map_tc_to_cos { 3312 + u8 opcode; 3313 + #define CMDQ_MAP_TC_TO_COS_OPCODE_MAP_TC_TO_COS 0x8aUL 3314 + #define CMDQ_MAP_TC_TO_COS_OPCODE_LAST CMDQ_MAP_TC_TO_COS_OPCODE_MAP_TC_TO_COS 3315 + u8 cmd_size; 3316 + __le16 flags; 3317 + __le16 cookie; 3318 + u8 resp_size; 3319 + u8 reserved8; 3320 + __le64 resp_addr; 3321 + __le16 cos0; 3322 + #define CMDQ_MAP_TC_TO_COS_COS0_NO_CHANGE 0xffffUL 3323 + #define CMDQ_MAP_TC_TO_COS_COS0_LAST CMDQ_MAP_TC_TO_COS_COS0_NO_CHANGE 3324 + __le16 cos1; 3325 + #define CMDQ_MAP_TC_TO_COS_COS1_DISABLE 0x8000UL 3326 + #define CMDQ_MAP_TC_TO_COS_COS1_NO_CHANGE 0xffffUL 3327 + #define CMDQ_MAP_TC_TO_COS_COS1_LAST CMDQ_MAP_TC_TO_COS_COS1_NO_CHANGE 3328 + __le32 unused_0; 3329 + }; 3330 + 3331 + /* creq_map_tc_to_cos_resp (size:128b/16B) */ 3332 + struct creq_map_tc_to_cos_resp { 3333 + u8 type; 3334 + #define CREQ_MAP_TC_TO_COS_RESP_TYPE_MASK 0x3fUL 3335 + #define CREQ_MAP_TC_TO_COS_RESP_TYPE_SFT 0 3336 + #define CREQ_MAP_TC_TO_COS_RESP_TYPE_QP_EVENT 0x38UL 3337 + #define CREQ_MAP_TC_TO_COS_RESP_TYPE_LAST CREQ_MAP_TC_TO_COS_RESP_TYPE_QP_EVENT 3338 + u8 status; 3339 + __le16 cookie; 3340 + __le32 reserved32; 3341 + u8 v; 3342 + #define CREQ_MAP_TC_TO_COS_RESP_V 0x1UL 3343 + u8 event; 3344 + #define CREQ_MAP_TC_TO_COS_RESP_EVENT_MAP_TC_TO_COS 0x8aUL 3345 + #define CREQ_MAP_TC_TO_COS_RESP_EVENT_LAST CREQ_MAP_TC_TO_COS_RESP_EVENT_MAP_TC_TO_COS 3346 + u8 reserved48[6]; 3347 + }; 3348 + 3349 + /* cmdq_query_roce_cc (size:128b/16B) */ 3350 + struct cmdq_query_roce_cc { 3351 + u8 opcode; 3352 + #define CMDQ_QUERY_ROCE_CC_OPCODE_QUERY_ROCE_CC 0x8dUL 3353 + #define CMDQ_QUERY_ROCE_CC_OPCODE_LAST CMDQ_QUERY_ROCE_CC_OPCODE_QUERY_ROCE_CC 3354 + u8 cmd_size; 3355 + __le16 flags; 3356 + __le16 cookie; 3357 + u8 resp_size; 3358 + u8 reserved8; 3359 + __le64 resp_addr; 3360 + }; 3361 + 3362 + /* creq_query_roce_cc_resp (size:128b/16B) */ 3363 + struct creq_query_roce_cc_resp { 3364 + u8 type; 3365 + #define CREQ_QUERY_ROCE_CC_RESP_TYPE_MASK 0x3fUL 3366 + #define CREQ_QUERY_ROCE_CC_RESP_TYPE_SFT 0 3367 + #define CREQ_QUERY_ROCE_CC_RESP_TYPE_QP_EVENT 0x38UL 3368 + #define CREQ_QUERY_ROCE_CC_RESP_TYPE_LAST CREQ_QUERY_ROCE_CC_RESP_TYPE_QP_EVENT 3369 + u8 status; 3370 + __le16 cookie; 3371 + __le32 size; 3372 + u8 v; 3373 + #define CREQ_QUERY_ROCE_CC_RESP_V 0x1UL 3374 + u8 event; 3375 + #define CREQ_QUERY_ROCE_CC_RESP_EVENT_QUERY_ROCE_CC 0x8dUL 3376 + #define CREQ_QUERY_ROCE_CC_RESP_EVENT_LAST CREQ_QUERY_ROCE_CC_RESP_EVENT_QUERY_ROCE_CC 3377 + u8 reserved48[6]; 3378 + }; 3379 + 3380 + /* creq_query_roce_cc_resp_sb (size:256b/32B) */ 3381 + struct creq_query_roce_cc_resp_sb { 3382 + u8 opcode; 3383 + #define CREQ_QUERY_ROCE_CC_RESP_SB_OPCODE_QUERY_ROCE_CC 0x8dUL 3384 + #define CREQ_QUERY_ROCE_CC_RESP_SB_OPCODE_LAST \ 3385 + CREQ_QUERY_ROCE_CC_RESP_SB_OPCODE_QUERY_ROCE_CC 3386 + u8 status; 3387 + __le16 cookie; 3388 + __le16 flags; 3389 + u8 resp_size; 3390 + u8 reserved8; 3391 + u8 enable_cc; 3392 + #define CREQ_QUERY_ROCE_CC_RESP_SB_ENABLE_CC 0x1UL 3393 + #define CREQ_QUERY_ROCE_CC_RESP_SB_UNUSED7_MASK 0xfeUL 3394 + #define CREQ_QUERY_ROCE_CC_RESP_SB_UNUSED7_SFT 1 3395 + u8 tos_dscp_tos_ecn; 3396 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TOS_ECN_MASK 0x3UL 3397 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TOS_ECN_SFT 0 3398 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TOS_DSCP_MASK 0xfcUL 3399 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TOS_DSCP_SFT 2 3400 + u8 g; 3401 + u8 num_phases_per_state; 3402 + __le16 init_cr; 3403 + __le16 init_tr; 3404 + u8 alt_vlan_pcp; 3405 + #define CREQ_QUERY_ROCE_CC_RESP_SB_ALT_VLAN_PCP_MASK 0x7UL 3406 + #define CREQ_QUERY_ROCE_CC_RESP_SB_ALT_VLAN_PCP_SFT 0 3407 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD1_MASK 0xf8UL 3408 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD1_SFT 3 3409 + u8 alt_tos_dscp; 3410 + #define CREQ_QUERY_ROCE_CC_RESP_SB_ALT_TOS_DSCP_MASK 0x3fUL 3411 + #define CREQ_QUERY_ROCE_CC_RESP_SB_ALT_TOS_DSCP_SFT 0 3412 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD4_MASK 0xc0UL 3413 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD4_SFT 6 3414 + u8 cc_mode; 3415 + #define CREQ_QUERY_ROCE_CC_RESP_SB_CC_MODE_DCTCP 0x0UL 3416 + #define CREQ_QUERY_ROCE_CC_RESP_SB_CC_MODE_PROBABILISTIC 0x1UL 3417 + #define CREQ_QUERY_ROCE_CC_RESP_SB_CC_MODE_LAST \ 3418 + CREQ_QUERY_ROCE_CC_RESP_SB_CC_MODE_PROBABILISTIC 3419 + u8 tx_queue; 3420 + __le16 rtt; 3421 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RTT_MASK 0x3fffUL 3422 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RTT_SFT 0 3423 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD5_MASK 0xc000UL 3424 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD5_SFT 14 3425 + __le16 tcp_cp; 3426 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TCP_CP_MASK 0x3ffUL 3427 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TCP_CP_SFT 0 3428 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD6_MASK 0xfc00UL 3429 + #define CREQ_QUERY_ROCE_CC_RESP_SB_RSVD6_SFT 10 3430 + __le16 inactivity_th; 3431 + u8 pkts_per_phase; 3432 + u8 time_per_phase; 3433 + __le32 reserved32; 3434 + }; 3435 + 3436 + /* creq_query_roce_cc_resp_sb_tlv (size:384b/48B) */ 3437 + struct creq_query_roce_cc_resp_sb_tlv { 3438 + __le16 cmd_discr; 3439 + u8 reserved_8b; 3440 + u8 tlv_flags; 3441 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_MORE 0x1UL 3442 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_MORE_LAST 0x0UL 3443 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_MORE_NOT_LAST 0x1UL 3444 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_REQUIRED 0x2UL 3445 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_REQUIRED_NO (0x0UL << 1) 3446 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES (0x1UL << 1) 3447 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_REQUIRED_LAST \ 3448 + CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES 3449 + __le16 tlv_type; 3450 + __le16 length; 3451 + u8 total_size; 3452 + u8 reserved56[7]; 3453 + u8 opcode; 3454 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_OPCODE_QUERY_ROCE_CC 0x8dUL 3455 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_OPCODE_LAST \ 3456 + CREQ_QUERY_ROCE_CC_RESP_SB_TLV_OPCODE_QUERY_ROCE_CC 3457 + u8 status; 3458 + __le16 cookie; 3459 + __le16 flags; 3460 + u8 resp_size; 3461 + u8 reserved8; 3462 + u8 enable_cc; 3463 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_ENABLE_CC 0x1UL 3464 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_UNUSED7_MASK 0xfeUL 3465 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_UNUSED7_SFT 1 3466 + u8 tos_dscp_tos_ecn; 3467 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TOS_ECN_MASK 0x3UL 3468 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TOS_ECN_SFT 0 3469 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TOS_DSCP_MASK 0xfcUL 3470 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TOS_DSCP_SFT 2 3471 + u8 g; 3472 + u8 num_phases_per_state; 3473 + __le16 init_cr; 3474 + __le16 init_tr; 3475 + u8 alt_vlan_pcp; 3476 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_ALT_VLAN_PCP_MASK 0x7UL 3477 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_ALT_VLAN_PCP_SFT 0 3478 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD1_MASK 0xf8UL 3479 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD1_SFT 3 3480 + u8 alt_tos_dscp; 3481 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_ALT_TOS_DSCP_MASK 0x3fUL 3482 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_ALT_TOS_DSCP_SFT 0 3483 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD4_MASK 0xc0UL 3484 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD4_SFT 6 3485 + u8 cc_mode; 3486 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_CC_MODE_DCTCP 0x0UL 3487 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_CC_MODE_PROBABILISTIC 0x1UL 3488 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_CC_MODE_LAST\ 3489 + CREQ_QUERY_ROCE_CC_RESP_SB_TLV_CC_MODE_PROBABILISTIC 3490 + u8 tx_queue; 3491 + __le16 rtt; 3492 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RTT_MASK 0x3fffUL 3493 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RTT_SFT 0 3494 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD5_MASK 0xc000UL 3495 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD5_SFT 14 3496 + __le16 tcp_cp; 3497 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TCP_CP_MASK 0x3ffUL 3498 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_TCP_CP_SFT 0 3499 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD6_MASK 0xfc00UL 3500 + #define CREQ_QUERY_ROCE_CC_RESP_SB_TLV_RSVD6_SFT 10 3501 + __le16 inactivity_th; 3502 + u8 pkts_per_phase; 3503 + u8 time_per_phase; 3504 + __le32 reserved32; 3505 + }; 3506 + 3507 + /* creq_query_roce_cc_gen1_resp_sb_tlv (size:704b/88B) */ 3508 + struct creq_query_roce_cc_gen1_resp_sb_tlv { 3509 + __le16 cmd_discr; 3510 + u8 reserved_8b; 3511 + u8 tlv_flags; 3512 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_MORE 0x1UL 3513 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_MORE_LAST 0x0UL 3514 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_MORE_NOT_LAST 0x1UL 3515 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_REQUIRED 0x2UL 3516 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_REQUIRED_NO (0x0UL << 1) 3517 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES (0x1UL << 1) 3518 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_REQUIRED_LAST \ 3519 + CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_TLV_FLAGS_REQUIRED_YES 3520 + __le16 tlv_type; 3521 + __le16 length; 3522 + __le64 reserved64; 3523 + __le16 inactivity_th_hi; 3524 + __le16 min_time_between_cnps; 3525 + __le16 init_cp; 3526 + u8 tr_update_mode; 3527 + u8 tr_update_cycles; 3528 + u8 fr_num_rtts; 3529 + u8 ai_rate_increase; 3530 + __le16 reduction_relax_rtts_th; 3531 + __le16 additional_relax_cr_th; 3532 + __le16 cr_min_th; 3533 + u8 bw_avg_weight; 3534 + u8 actual_cr_factor; 3535 + __le16 max_cp_cr_th; 3536 + u8 cp_bias_en; 3537 + u8 cp_bias; 3538 + u8 cnp_ecn; 3539 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_CNP_ECN_NOT_ECT 0x0UL 3540 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_CNP_ECN_ECT_1 0x1UL 3541 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_CNP_ECN_ECT_0 0x2UL 3542 + #define CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_CNP_ECN_LAST \ 3543 + CREQ_QUERY_ROCE_CC_GEN1_RESP_SB_TLV_CNP_ECN_ECT_0 3544 + u8 rtt_jitter_en; 3545 + __le16 link_bytes_per_usec; 3546 + __le16 reset_cc_cr_th; 3547 + u8 cr_width; 3548 + u8 quota_period_min; 3549 + u8 quota_period_max; 3550 + u8 quota_period_abs_max; 3551 + __le16 tr_lower_bound; 3552 + u8 cr_prob_factor; 3553 + u8 tr_prob_factor; 3554 + __le16 fairness_cr_th; 3555 + u8 red_div; 3556 + u8 cnp_ratio_th; 3557 + __le16 exp_ai_rtts; 3558 + u8 exp_ai_cr_cp_ratio; 3559 + u8 use_rate_table; 3560 + __le16 cp_exp_update_th; 3561 + __le16 high_exp_ai_rtts_th1; 3562 + __le16 high_exp_ai_rtts_th2; 3563 + __le16 actual_cr_cong_free_rtts_th; 3564 + __le16 severe_cong_cr_th1; 3565 + __le16 severe_cong_cr_th2; 3566 + __le32 link64B_per_rtt; 3567 + u8 cc_ack_bytes; 3568 + u8 reduce_init_en; 3569 + __le16 reduce_init_cong_free_rtts_th; 3570 + u8 random_no_red_en; 3571 + u8 actual_cr_shift_correction_en; 3572 + u8 quota_period_adjust_en; 3573 + u8 reserved[5]; 3574 + }; 3575 + 3576 + /* cmdq_modify_roce_cc (size:448b/56B) */ 3577 + struct cmdq_modify_roce_cc { 3578 + u8 opcode; 3579 + #define CMDQ_MODIFY_ROCE_CC_OPCODE_MODIFY_ROCE_CC 0x8cUL 3580 + #define CMDQ_MODIFY_ROCE_CC_OPCODE_LAST CMDQ_MODIFY_ROCE_CC_OPCODE_MODIFY_ROCE_CC 3581 + u8 cmd_size; 3582 + __le16 flags; 3583 + __le16 cookie; 3584 + u8 resp_size; 3585 + u8 reserved8; 3586 + __le64 resp_addr; 3587 + __le32 modify_mask; 3588 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ENABLE_CC 0x1UL 3589 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_G 0x2UL 3590 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_NUMPHASEPERSTATE 0x4UL 3591 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_INIT_CR 0x8UL 3592 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_INIT_TR 0x10UL 3593 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_ECN 0x20UL 3594 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP 0x40UL 3595 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_VLAN_PCP 0x80UL 3596 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_TOS_DSCP 0x100UL 3597 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_RTT 0x200UL 3598 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE 0x400UL 3599 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TCP_CP 0x800UL 3600 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TX_QUEUE 0x1000UL 3601 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_INACTIVITY_CP 0x2000UL 3602 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TIME_PER_PHASE 0x4000UL 3603 + #define CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_PKTS_PER_PHASE 0x8000UL 3604 + u8 enable_cc; 3605 + #define CMDQ_MODIFY_ROCE_CC_ENABLE_CC 0x1UL 3606 + #define CMDQ_MODIFY_ROCE_CC_RSVD1_MASK 0xfeUL 3607 + #define CMDQ_MODIFY_ROCE_CC_RSVD1_SFT 1 3608 + u8 g; 3609 + u8 num_phases_per_state; 3610 + u8 pkts_per_phase; 3611 + __le16 init_cr; 3612 + __le16 init_tr; 3613 + u8 tos_dscp_tos_ecn; 3614 + #define CMDQ_MODIFY_ROCE_CC_TOS_ECN_MASK 0x3UL 3615 + #define CMDQ_MODIFY_ROCE_CC_TOS_ECN_SFT 0 3616 + #define CMDQ_MODIFY_ROCE_CC_TOS_DSCP_MASK 0xfcUL 3617 + #define CMDQ_MODIFY_ROCE_CC_TOS_DSCP_SFT 2 3618 + u8 alt_vlan_pcp; 3619 + #define CMDQ_MODIFY_ROCE_CC_ALT_VLAN_PCP_MASK 0x7UL 3620 + #define CMDQ_MODIFY_ROCE_CC_ALT_VLAN_PCP_SFT 0 3621 + #define CMDQ_MODIFY_ROCE_CC_RSVD3_MASK 0xf8UL 3622 + #define CMDQ_MODIFY_ROCE_CC_RSVD3_SFT 3 3623 + __le16 alt_tos_dscp; 3624 + #define CMDQ_MODIFY_ROCE_CC_ALT_TOS_DSCP_MASK 0x3fUL 3625 + #define CMDQ_MODIFY_ROCE_CC_ALT_TOS_DSCP_SFT 0 3626 + #define CMDQ_MODIFY_ROCE_CC_RSVD4_MASK 0xffc0UL 3627 + #define CMDQ_MODIFY_ROCE_CC_RSVD4_SFT 6 3628 + __le16 rtt; 3629 + #define CMDQ_MODIFY_ROCE_CC_RTT_MASK 0x3fffUL 3630 + #define CMDQ_MODIFY_ROCE_CC_RTT_SFT 0 3631 + #define CMDQ_MODIFY_ROCE_CC_RSVD5_MASK 0xc000UL 3632 + #define CMDQ_MODIFY_ROCE_CC_RSVD5_SFT 14 3633 + __le16 tcp_cp; 3634 + #define CMDQ_MODIFY_ROCE_CC_TCP_CP_MASK 0x3ffUL 3635 + #define CMDQ_MODIFY_ROCE_CC_TCP_CP_SFT 0 3636 + #define CMDQ_MODIFY_ROCE_CC_RSVD6_MASK 0xfc00UL 3637 + #define CMDQ_MODIFY_ROCE_CC_RSVD6_SFT 10 3638 + u8 cc_mode; 3639 + #define CMDQ_MODIFY_ROCE_CC_CC_MODE_DCTCP_CC_MODE 0x0UL 3640 + #define CMDQ_MODIFY_ROCE_CC_CC_MODE_PROBABILISTIC_CC_MODE 0x1UL 3641 + #define CMDQ_MODIFY_ROCE_CC_CC_MODE_LAST CMDQ_MODIFY_ROCE_CC_CC_MODE_PROBABILISTIC_CC_MODE 3642 + u8 tx_queue; 3643 + __le16 inactivity_th; 3644 + u8 time_per_phase; 3645 + u8 reserved8_1; 3646 + __le16 reserved16; 3647 + __le32 reserved32; 3648 + __le64 reserved64; 3649 + }; 3650 + 3651 + /* cmdq_modify_roce_cc_tlv (size:640b/80B) */ 3652 + struct cmdq_modify_roce_cc_tlv { 3653 + __le16 cmd_discr; 3654 + u8 reserved_8b; 3655 + u8 tlv_flags; 3656 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_MORE 0x1UL 3657 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_MORE_LAST 0x0UL 3658 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_MORE_NOT_LAST 0x1UL 3659 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_REQUIRED 0x2UL 3660 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_REQUIRED_NO (0x0UL << 1) 3661 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_REQUIRED_YES (0x1UL << 1) 3662 + #define CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_REQUIRED_LAST \ 3663 + CMDQ_MODIFY_ROCE_CC_TLV_TLV_FLAGS_REQUIRED_YES 3664 + __le16 tlv_type; 3665 + __le16 length; 3666 + u8 total_size; 3667 + u8 reserved56[7]; 3668 + u8 opcode; 3669 + #define CMDQ_MODIFY_ROCE_CC_TLV_OPCODE_MODIFY_ROCE_CC 0x8cUL 3670 + #define CMDQ_MODIFY_ROCE_CC_TLV_OPCODE_LAST CMDQ_MODIFY_ROCE_CC_TLV_OPCODE_MODIFY_ROCE_CC 3671 + u8 cmd_size; 3672 + __le16 flags; 3673 + __le16 cookie; 3674 + u8 resp_size; 3675 + u8 reserved8; 3676 + __le64 resp_addr; 3677 + __le32 modify_mask; 3678 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_ENABLE_CC 0x1UL 3679 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_G 0x2UL 3680 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_NUMPHASEPERSTATE 0x4UL 3681 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_INIT_CR 0x8UL 3682 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_INIT_TR 0x10UL 3683 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_TOS_ECN 0x20UL 3684 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_TOS_DSCP 0x40UL 3685 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_ALT_VLAN_PCP 0x80UL 3686 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_ALT_TOS_DSCP 0x100UL 3687 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_RTT 0x200UL 3688 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_CC_MODE 0x400UL 3689 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_TCP_CP 0x800UL 3690 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_TX_QUEUE 0x1000UL 3691 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_INACTIVITY_CP 0x2000UL 3692 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_TIME_PER_PHASE 0x4000UL 3693 + #define CMDQ_MODIFY_ROCE_CC_TLV_MODIFY_MASK_PKTS_PER_PHASE 0x8000UL 3694 + u8 enable_cc; 3695 + #define CMDQ_MODIFY_ROCE_CC_TLV_ENABLE_CC 0x1UL 3696 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD1_MASK 0xfeUL 3697 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD1_SFT 1 3698 + u8 g; 3699 + u8 num_phases_per_state; 3700 + u8 pkts_per_phase; 3701 + __le16 init_cr; 3702 + __le16 init_tr; 3703 + u8 tos_dscp_tos_ecn; 3704 + #define CMDQ_MODIFY_ROCE_CC_TLV_TOS_ECN_MASK 0x3UL 3705 + #define CMDQ_MODIFY_ROCE_CC_TLV_TOS_ECN_SFT 0 3706 + #define CMDQ_MODIFY_ROCE_CC_TLV_TOS_DSCP_MASK 0xfcUL 3707 + #define CMDQ_MODIFY_ROCE_CC_TLV_TOS_DSCP_SFT 2 3708 + u8 alt_vlan_pcp; 3709 + #define CMDQ_MODIFY_ROCE_CC_TLV_ALT_VLAN_PCP_MASK 0x7UL 3710 + #define CMDQ_MODIFY_ROCE_CC_TLV_ALT_VLAN_PCP_SFT 0 3711 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD3_MASK 0xf8UL 3712 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD3_SFT 3 3713 + __le16 alt_tos_dscp; 3714 + #define CMDQ_MODIFY_ROCE_CC_TLV_ALT_TOS_DSCP_MASK 0x3fUL 3715 + #define CMDQ_MODIFY_ROCE_CC_TLV_ALT_TOS_DSCP_SFT 0 3716 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD4_MASK 0xffc0UL 3717 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD4_SFT 6 3718 + __le16 rtt; 3719 + #define CMDQ_MODIFY_ROCE_CC_TLV_RTT_MASK 0x3fffUL 3720 + #define CMDQ_MODIFY_ROCE_CC_TLV_RTT_SFT 0 3721 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD5_MASK 0xc000UL 3722 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD5_SFT 14 3723 + __le16 tcp_cp; 3724 + #define CMDQ_MODIFY_ROCE_CC_TLV_TCP_CP_MASK 0x3ffUL 3725 + #define CMDQ_MODIFY_ROCE_CC_TLV_TCP_CP_SFT 0 3726 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD6_MASK 0xfc00UL 3727 + #define CMDQ_MODIFY_ROCE_CC_TLV_RSVD6_SFT 10 3728 + u8 cc_mode; 3729 + #define CMDQ_MODIFY_ROCE_CC_TLV_CC_MODE_DCTCP_CC_MODE 0x0UL 3730 + #define CMDQ_MODIFY_ROCE_CC_TLV_CC_MODE_PROBABILISTIC_CC_MODE 0x1UL 3731 + #define CMDQ_MODIFY_ROCE_CC_TLV_CC_MODE_LAST\ 3732 + CMDQ_MODIFY_ROCE_CC_TLV_CC_MODE_PROBABILISTIC_CC_MODE 3733 + u8 tx_queue; 3734 + __le16 inactivity_th; 3735 + u8 time_per_phase; 3736 + u8 reserved8_1; 3737 + __le16 reserved16; 3738 + __le32 reserved32; 3739 + __le64 reserved64; 3740 + __le64 reservedtlvpad; 3741 + }; 3742 + 3743 + /* cmdq_modify_roce_cc_gen1_tlv (size:768b/96B) */ 3744 + struct cmdq_modify_roce_cc_gen1_tlv { 3745 + __le16 cmd_discr; 3746 + u8 reserved_8b; 3747 + u8 tlv_flags; 3748 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_MORE 0x1UL 3749 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_MORE_LAST 0x0UL 3750 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_MORE_NOT_LAST 0x1UL 3751 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_REQUIRED 0x2UL 3752 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_REQUIRED_NO (0x0UL << 1) 3753 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_REQUIRED_YES (0x1UL << 1) 3754 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_REQUIRED_LAST\ 3755 + CMDQ_MODIFY_ROCE_CC_GEN1_TLV_TLV_FLAGS_REQUIRED_YES 3756 + __le16 tlv_type; 3757 + __le16 length; 3758 + __le64 reserved64; 3759 + __le64 modify_mask; 3760 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_MIN_TIME_BETWEEN_CNPS 0x1UL 3761 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_INIT_CP 0x2UL 3762 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_TR_UPDATE_MODE 0x4UL 3763 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_TR_UPDATE_CYCLES 0x8UL 3764 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_FR_NUM_RTTS 0x10UL 3765 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_AI_RATE_INCREASE 0x20UL 3766 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_REDUCTION_RELAX_RTTS_TH 0x40UL 3767 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_ADDITIONAL_RELAX_CR_TH 0x80UL 3768 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CR_MIN_TH 0x100UL 3769 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_BW_AVG_WEIGHT 0x200UL 3770 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_ACTUAL_CR_FACTOR 0x400UL 3771 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_MAX_CP_CR_TH 0x800UL 3772 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CP_BIAS_EN 0x1000UL 3773 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CP_BIAS 0x2000UL 3774 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CNP_ECN 0x4000UL 3775 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_RTT_JITTER_EN 0x8000UL 3776 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_LINK_BYTES_PER_USEC 0x10000UL 3777 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_RESET_CC_CR_TH 0x20000UL 3778 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CR_WIDTH 0x40000UL 3779 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_QUOTA_PERIOD_MIN 0x80000UL 3780 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_QUOTA_PERIOD_MAX 0x100000UL 3781 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_QUOTA_PERIOD_ABS_MAX 0x200000UL 3782 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_TR_LOWER_BOUND 0x400000UL 3783 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CR_PROB_FACTOR 0x800000UL 3784 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_TR_PROB_FACTOR 0x1000000UL 3785 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_FAIRNESS_CR_TH 0x2000000UL 3786 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_RED_DIV 0x4000000UL 3787 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CNP_RATIO_TH 0x8000000UL 3788 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_EXP_AI_RTTS 0x10000000UL 3789 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_EXP_AI_CR_CP_RATIO 0x20000000UL 3790 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CP_EXP_UPDATE_TH 0x40000000UL 3791 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_HIGH_EXP_AI_RTTS_TH1 0x80000000UL 3792 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_HIGH_EXP_AI_RTTS_TH2 0x100000000ULL 3793 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_USE_RATE_TABLE 0x200000000ULL 3794 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_LINK64B_PER_RTT 0x400000000ULL 3795 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_ACTUAL_CR_CONG_FREE_RTTS_TH 0x800000000ULL 3796 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_SEVERE_CONG_CR_TH1 0x1000000000ULL 3797 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_SEVERE_CONG_CR_TH2 0x2000000000ULL 3798 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_CC_ACK_BYTES 0x4000000000ULL 3799 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_REDUCE_INIT_EN 0x8000000000ULL 3800 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_REDUCE_INIT_CONG_FREE_RTTS_TH \ 3801 + 0x10000000000ULL 3802 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_RANDOM_NO_RED_EN 0x20000000000ULL 3803 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_ACTUAL_CR_SHIFT_CORRECTION_EN \ 3804 + 0x40000000000ULL 3805 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_MODIFY_MASK_QUOTA_PERIOD_ADJUST_EN 0x80000000000ULL 3806 + __le16 inactivity_th_hi; 3807 + __le16 min_time_between_cnps; 3808 + __le16 init_cp; 3809 + u8 tr_update_mode; 3810 + u8 tr_update_cycles; 3811 + u8 fr_num_rtts; 3812 + u8 ai_rate_increase; 3813 + __le16 reduction_relax_rtts_th; 3814 + __le16 additional_relax_cr_th; 3815 + __le16 cr_min_th; 3816 + u8 bw_avg_weight; 3817 + u8 actual_cr_factor; 3818 + __le16 max_cp_cr_th; 3819 + u8 cp_bias_en; 3820 + u8 cp_bias; 3821 + u8 cnp_ecn; 3822 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_CNP_ECN_NOT_ECT 0x0UL 3823 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_CNP_ECN_ECT_1 0x1UL 3824 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_CNP_ECN_ECT_0 0x2UL 3825 + #define CMDQ_MODIFY_ROCE_CC_GEN1_TLV_CNP_ECN_LAST CMDQ_MODIFY_ROCE_CC_GEN1_TLV_CNP_ECN_ECT_0 3826 + u8 rtt_jitter_en; 3827 + __le16 link_bytes_per_usec; 3828 + __le16 reset_cc_cr_th; 3829 + u8 cr_width; 3830 + u8 quota_period_min; 3831 + u8 quota_period_max; 3832 + u8 quota_period_abs_max; 3833 + __le16 tr_lower_bound; 3834 + u8 cr_prob_factor; 3835 + u8 tr_prob_factor; 3836 + __le16 fairness_cr_th; 3837 + u8 red_div; 3838 + u8 cnp_ratio_th; 3839 + __le16 exp_ai_rtts; 3840 + u8 exp_ai_cr_cp_ratio; 3841 + u8 use_rate_table; 3842 + __le16 cp_exp_update_th; 3843 + __le16 high_exp_ai_rtts_th1; 3844 + __le16 high_exp_ai_rtts_th2; 3845 + __le16 actual_cr_cong_free_rtts_th; 3846 + __le16 severe_cong_cr_th1; 3847 + __le16 severe_cong_cr_th2; 3848 + __le32 link64B_per_rtt; 3849 + u8 cc_ack_bytes; 3850 + u8 reduce_init_en; 3851 + __le16 reduce_init_cong_free_rtts_th; 3852 + u8 random_no_red_en; 3853 + u8 actual_cr_shift_correction_en; 3854 + u8 quota_period_adjust_en; 3855 + u8 reserved[5]; 3856 + }; 3857 + 3858 + /* creq_modify_roce_cc_resp (size:128b/16B) */ 3859 + struct creq_modify_roce_cc_resp { 3860 + u8 type; 3861 + #define CREQ_MODIFY_ROCE_CC_RESP_TYPE_MASK 0x3fUL 3862 + #define CREQ_MODIFY_ROCE_CC_RESP_TYPE_SFT 0 3863 + #define CREQ_MODIFY_ROCE_CC_RESP_TYPE_QP_EVENT 0x38UL 3864 + #define CREQ_MODIFY_ROCE_CC_RESP_TYPE_LAST CREQ_MODIFY_ROCE_CC_RESP_TYPE_QP_EVENT 3865 + u8 status; 3866 + __le16 cookie; 3867 + __le32 reserved32; 3868 + u8 v; 3869 + #define CREQ_MODIFY_ROCE_CC_RESP_V 0x1UL 3870 + u8 event; 3871 + #define CREQ_MODIFY_ROCE_CC_RESP_EVENT_MODIFY_ROCE_CC 0x8cUL 3872 + #define CREQ_MODIFY_ROCE_CC_RESP_EVENT_LAST CREQ_MODIFY_ROCE_CC_RESP_EVENT_MODIFY_ROCE_CC 3873 + u8 reserved48[6]; 3874 + }; 3875 + 3876 + /* cmdq_set_link_aggr_mode_cc (size:320b/40B) */ 3877 + struct cmdq_set_link_aggr_mode_cc { 3878 + u8 opcode; 3879 + #define CMDQ_SET_LINK_AGGR_MODE_OPCODE_SET_LINK_AGGR_MODE 0x8fUL 3880 + #define CMDQ_SET_LINK_AGGR_MODE_OPCODE_LAST \ 3881 + CMDQ_SET_LINK_AGGR_MODE_OPCODE_SET_LINK_AGGR_MODE 3882 + u8 cmd_size; 3883 + __le16 flags; 3884 + __le16 cookie; 3885 + u8 resp_size; 3886 + u8 reserved8; 3887 + __le64 resp_addr; 3888 + __le32 modify_mask; 3889 + #define CMDQ_SET_LINK_AGGR_MODE_MODIFY_MASK_AGGR_EN 0x1UL 3890 + #define CMDQ_SET_LINK_AGGR_MODE_MODIFY_MASK_ACTIVE_PORT_MAP 0x2UL 3891 + #define CMDQ_SET_LINK_AGGR_MODE_MODIFY_MASK_MEMBER_PORT_MAP 0x4UL 3892 + #define CMDQ_SET_LINK_AGGR_MODE_MODIFY_MASK_AGGR_MODE 0x8UL 3893 + #define CMDQ_SET_LINK_AGGR_MODE_MODIFY_MASK_STAT_CTX_ID 0x10UL 3894 + u8 aggr_enable; 3895 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_ENABLE 0x1UL 3896 + #define CMDQ_SET_LINK_AGGR_MODE_RSVD1_MASK 0xfeUL 3897 + #define CMDQ_SET_LINK_AGGR_MODE_RSVD1_SFT 1 3898 + u8 active_port_map; 3899 + #define CMDQ_SET_LINK_AGGR_MODE_ACTIVE_PORT_MAP_MASK 0xfUL 3900 + #define CMDQ_SET_LINK_AGGR_MODE_ACTIVE_PORT_MAP_SFT 0 3901 + #define CMDQ_SET_LINK_AGGR_MODE_RSVD2_MASK 0xf0UL 3902 + #define CMDQ_SET_LINK_AGGR_MODE_RSVD2_SFT 4 3903 + u8 member_port_map; 3904 + u8 link_aggr_mode; 3905 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_ACTIVE_ACTIVE 0x1UL 3906 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_ACTIVE_BACKUP 0x2UL 3907 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_BALANCE_XOR 0x3UL 3908 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_802_3_AD 0x4UL 3909 + #define CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_LAST CMDQ_SET_LINK_AGGR_MODE_AGGR_MODE_802_3_AD 3910 + __le16 stat_ctx_id[4]; 3911 + __le64 rsvd1; 3912 + }; 3913 + 3914 + /* creq_set_link_aggr_mode_resources_resp (size:128b/16B) */ 3915 + struct creq_set_link_aggr_mode_resources_resp { 3916 + u8 type; 3917 + #define CREQ_SET_LINK_AGGR_MODE_RESP_TYPE_MASK 0x3fUL 3918 + #define CREQ_SET_LINK_AGGR_MODE_RESP_TYPE_SFT 0 3919 + #define CREQ_SET_LINK_AGGR_MODE_RESP_TYPE_QP_EVENT 0x38UL 3920 + #define CREQ_SET_LINK_AGGR_MODE_RESP_TYPE_LAST CREQ_SET_LINK_AGGR_MODE_RESP_TYPE_QP_EVENT 3921 + u8 status; 3922 + __le16 cookie; 3923 + __le32 reserved32; 3924 + u8 v; 3925 + #define CREQ_SET_LINK_AGGR_MODE_RESP_V 0x1UL 3926 + u8 event; 3927 + #define CREQ_SET_LINK_AGGR_MODE_RESP_EVENT_SET_LINK_AGGR_MODE 0x8fUL 3928 + #define CREQ_SET_LINK_AGGR_MODE_RESP_EVENT_LAST\ 3929 + CREQ_SET_LINK_AGGR_MODE_RESP_EVENT_SET_LINK_AGGR_MODE 3930 + u8 reserved48[6]; 3931 + }; 3932 + 3933 + /* creq_func_event (size:128b/16B) */ 3934 + struct creq_func_event { 3935 + u8 type; 3936 + #define CREQ_FUNC_EVENT_TYPE_MASK 0x3fUL 3937 + #define CREQ_FUNC_EVENT_TYPE_SFT 0 3938 + #define CREQ_FUNC_EVENT_TYPE_FUNC_EVENT 0x3aUL 3939 + #define CREQ_FUNC_EVENT_TYPE_LAST CREQ_FUNC_EVENT_TYPE_FUNC_EVENT 3940 + u8 reserved56[7]; 3941 + u8 v; 3942 + #define CREQ_FUNC_EVENT_V 0x1UL 3943 + u8 event; 3944 + #define CREQ_FUNC_EVENT_EVENT_TX_WQE_ERROR 0x1UL 3945 + #define CREQ_FUNC_EVENT_EVENT_TX_DATA_ERROR 0x2UL 3946 + #define CREQ_FUNC_EVENT_EVENT_RX_WQE_ERROR 0x3UL 3947 + #define CREQ_FUNC_EVENT_EVENT_RX_DATA_ERROR 0x4UL 3948 + #define CREQ_FUNC_EVENT_EVENT_CQ_ERROR 0x5UL 3949 + #define CREQ_FUNC_EVENT_EVENT_TQM_ERROR 0x6UL 3950 + #define CREQ_FUNC_EVENT_EVENT_CFCQ_ERROR 0x7UL 3951 + #define CREQ_FUNC_EVENT_EVENT_CFCS_ERROR 0x8UL 3952 + #define CREQ_FUNC_EVENT_EVENT_CFCC_ERROR 0x9UL 3953 + #define CREQ_FUNC_EVENT_EVENT_CFCM_ERROR 0xaUL 3954 + #define CREQ_FUNC_EVENT_EVENT_TIM_ERROR 0xbUL 3955 + #define CREQ_FUNC_EVENT_EVENT_VF_COMM_REQUEST 0x80UL 3956 + #define CREQ_FUNC_EVENT_EVENT_RESOURCE_EXHAUSTED 0x81UL 3957 + #define CREQ_FUNC_EVENT_EVENT_LAST CREQ_FUNC_EVENT_EVENT_RESOURCE_EXHAUSTED 3958 + u8 reserved48[6]; 3959 + }; 3960 + 3961 + /* creq_qp_event (size:128b/16B) */ 3962 + struct creq_qp_event { 3963 + u8 type; 3964 + #define CREQ_QP_EVENT_TYPE_MASK 0x3fUL 3965 + #define CREQ_QP_EVENT_TYPE_SFT 0 3966 + #define CREQ_QP_EVENT_TYPE_QP_EVENT 0x38UL 3967 + #define CREQ_QP_EVENT_TYPE_LAST CREQ_QP_EVENT_TYPE_QP_EVENT 3968 + u8 status; 3969 + #define CREQ_QP_EVENT_STATUS_SUCCESS 0x0UL 3970 + #define CREQ_QP_EVENT_STATUS_FAIL 0x1UL 3971 + #define CREQ_QP_EVENT_STATUS_RESOURCES 0x2UL 3972 + #define CREQ_QP_EVENT_STATUS_INVALID_CMD 0x3UL 3973 + #define CREQ_QP_EVENT_STATUS_NOT_IMPLEMENTED 0x4UL 3974 + #define CREQ_QP_EVENT_STATUS_INVALID_PARAMETER 0x5UL 3975 + #define CREQ_QP_EVENT_STATUS_HARDWARE_ERROR 0x6UL 3976 + #define CREQ_QP_EVENT_STATUS_INTERNAL_ERROR 0x7UL 3977 + #define CREQ_QP_EVENT_STATUS_LAST CREQ_QP_EVENT_STATUS_INTERNAL_ERROR 3978 + __le16 cookie; 3979 + __le32 reserved32; 3980 + u8 v; 3981 + #define CREQ_QP_EVENT_V 0x1UL 3982 + u8 event; 3983 + #define CREQ_QP_EVENT_EVENT_CREATE_QP 0x1UL 3984 + #define CREQ_QP_EVENT_EVENT_DESTROY_QP 0x2UL 3985 + #define CREQ_QP_EVENT_EVENT_MODIFY_QP 0x3UL 3986 + #define CREQ_QP_EVENT_EVENT_QUERY_QP 0x4UL 3987 + #define CREQ_QP_EVENT_EVENT_CREATE_SRQ 0x5UL 3988 + #define CREQ_QP_EVENT_EVENT_DESTROY_SRQ 0x6UL 3989 + #define CREQ_QP_EVENT_EVENT_QUERY_SRQ 0x8UL 3990 + #define CREQ_QP_EVENT_EVENT_CREATE_CQ 0x9UL 3991 + #define CREQ_QP_EVENT_EVENT_DESTROY_CQ 0xaUL 3992 + #define CREQ_QP_EVENT_EVENT_RESIZE_CQ 0xcUL 3993 + #define CREQ_QP_EVENT_EVENT_ALLOCATE_MRW 0xdUL 3994 + #define CREQ_QP_EVENT_EVENT_DEALLOCATE_KEY 0xeUL 3995 + #define CREQ_QP_EVENT_EVENT_REGISTER_MR 0xfUL 3996 + #define CREQ_QP_EVENT_EVENT_DEREGISTER_MR 0x10UL 3997 + #define CREQ_QP_EVENT_EVENT_ADD_GID 0x11UL 3998 + #define CREQ_QP_EVENT_EVENT_DELETE_GID 0x12UL 3999 + #define CREQ_QP_EVENT_EVENT_MODIFY_GID 0x17UL 4000 + #define CREQ_QP_EVENT_EVENT_QUERY_GID 0x18UL 4001 + #define CREQ_QP_EVENT_EVENT_CREATE_QP1 0x13UL 4002 + #define CREQ_QP_EVENT_EVENT_DESTROY_QP1 0x14UL 4003 + #define CREQ_QP_EVENT_EVENT_CREATE_AH 0x15UL 4004 + #define CREQ_QP_EVENT_EVENT_DESTROY_AH 0x16UL 4005 + #define CREQ_QP_EVENT_EVENT_INITIALIZE_FW 0x80UL 4006 + #define CREQ_QP_EVENT_EVENT_DEINITIALIZE_FW 0x81UL 4007 + #define CREQ_QP_EVENT_EVENT_STOP_FUNC 0x82UL 4008 + #define CREQ_QP_EVENT_EVENT_QUERY_FUNC 0x83UL 4009 + #define CREQ_QP_EVENT_EVENT_SET_FUNC_RESOURCES 0x84UL 4010 + #define CREQ_QP_EVENT_EVENT_READ_CONTEXT 0x85UL 4011 + #define CREQ_QP_EVENT_EVENT_MAP_TC_TO_COS 0x8aUL 4012 + #define CREQ_QP_EVENT_EVENT_QUERY_VERSION 0x8bUL 4013 + #define CREQ_QP_EVENT_EVENT_MODIFY_CC 0x8cUL 4014 + #define CREQ_QP_EVENT_EVENT_QUERY_CC 0x8dUL 4015 + #define CREQ_QP_EVENT_EVENT_QUERY_ROCE_STATS 0x8eUL 4016 + #define CREQ_QP_EVENT_EVENT_SET_LINK_AGGR_MODE 0x8fUL 4017 + #define CREQ_QP_EVENT_EVENT_QUERY_QP_EXTEND 0x91UL 4018 + #define CREQ_QP_EVENT_EVENT_QP_ERROR_NOTIFICATION 0xc0UL 4019 + #define CREQ_QP_EVENT_EVENT_CQ_ERROR_NOTIFICATION 0xc1UL 4020 + #define CREQ_QP_EVENT_EVENT_LAST CREQ_QP_EVENT_EVENT_CQ_ERROR_NOTIFICATION 4021 + u8 reserved48[6]; 4022 + }; 4023 + 4024 + /* creq_qp_error_notification (size:128b/16B) */ 2064 4025 struct creq_qp_error_notification { 2065 - u8 type; 2066 - #define CREQ_QP_ERROR_NOTIFICATION_TYPE_MASK 0x3fUL 2067 - #define CREQ_QP_ERROR_NOTIFICATION_TYPE_SFT 0 2068 - #define CREQ_QP_ERROR_NOTIFICATION_TYPE_QP_EVENT 0x38UL 2069 - #define CREQ_QP_ERROR_NOTIFICATION_RESERVED2_MASK 0xc0UL 2070 - #define CREQ_QP_ERROR_NOTIFICATION_RESERVED2_SFT 6 2071 - u8 status; 2072 - u8 req_slow_path_state; 2073 - u8 req_err_state_reason; 2074 - __le32 xid; 2075 - u8 v; 2076 - #define CREQ_QP_ERROR_NOTIFICATION_V 0x1UL 2077 - #define CREQ_QP_ERROR_NOTIFICATION_RESERVED7_MASK 0xfeUL 2078 - #define CREQ_QP_ERROR_NOTIFICATION_RESERVED7_SFT 1 2079 - u8 event; 4026 + u8 type; 4027 + #define CREQ_QP_ERROR_NOTIFICATION_TYPE_MASK 0x3fUL 4028 + #define CREQ_QP_ERROR_NOTIFICATION_TYPE_SFT 0 4029 + #define CREQ_QP_ERROR_NOTIFICATION_TYPE_QP_EVENT 0x38UL 4030 + #define CREQ_QP_ERROR_NOTIFICATION_TYPE_LAST CREQ_QP_ERROR_NOTIFICATION_TYPE_QP_EVENT 4031 + u8 status; 4032 + u8 req_slow_path_state; 4033 + u8 req_err_state_reason; 4034 + __le32 xid; 4035 + u8 v; 4036 + #define CREQ_QP_ERROR_NOTIFICATION_V 0x1UL 4037 + u8 event; 2080 4038 #define CREQ_QP_ERROR_NOTIFICATION_EVENT_QP_ERROR_NOTIFICATION 0xc0UL 2081 - u8 res_slow_path_state; 2082 - u8 res_err_state_reason; 2083 - __le16 sq_cons_idx; 2084 - __le16 rq_cons_idx; 4039 + #define CREQ_QP_ERROR_NOTIFICATION_EVENT_LAST \ 4040 + CREQ_QP_ERROR_NOTIFICATION_EVENT_QP_ERROR_NOTIFICATION 4041 + u8 res_slow_path_state; 4042 + u8 res_err_state_reason; 4043 + __le16 sq_cons_idx; 4044 + __le16 rq_cons_idx; 2085 4045 }; 2086 4046 2087 - /* RoCE Slowpath HSI Specification 1.6.0 */ 2088 - #define ROCE_SP_HSI_VERSION_MAJOR 1 2089 - #define ROCE_SP_HSI_VERSION_MINOR 6 2090 - #define ROCE_SP_HSI_VERSION_UPDATE 0 4047 + /* creq_cq_error_notification (size:128b/16B) */ 4048 + struct creq_cq_error_notification { 4049 + u8 type; 4050 + #define CREQ_CQ_ERROR_NOTIFICATION_TYPE_MASK 0x3fUL 4051 + #define CREQ_CQ_ERROR_NOTIFICATION_TYPE_SFT 0 4052 + #define CREQ_CQ_ERROR_NOTIFICATION_TYPE_CQ_EVENT 0x38UL 4053 + #define CREQ_CQ_ERROR_NOTIFICATION_TYPE_LAST CREQ_CQ_ERROR_NOTIFICATION_TYPE_CQ_EVENT 4054 + u8 status; 4055 + u8 cq_err_reason; 4056 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_INVALID_ERROR 0x1UL 4057 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_OVERFLOW_ERROR 0x2UL 4058 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_LOAD_ERROR 0x3UL 4059 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_INVALID_ERROR 0x4UL 4060 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_OVERFLOW_ERROR 0x5UL 4061 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_LOAD_ERROR 0x6UL 4062 + #define CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_LAST \ 4063 + CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_LOAD_ERROR 4064 + u8 reserved8; 4065 + __le32 xid; 4066 + u8 v; 4067 + #define CREQ_CQ_ERROR_NOTIFICATION_V 0x1UL 4068 + u8 event; 4069 + #define CREQ_CQ_ERROR_NOTIFICATION_EVENT_CQ_ERROR_NOTIFICATION 0xc1UL 4070 + #define CREQ_CQ_ERROR_NOTIFICATION_EVENT_LAST \ 4071 + CREQ_CQ_ERROR_NOTIFICATION_EVENT_CQ_ERROR_NOTIFICATION 4072 + u8 reserved48[6]; 4073 + }; 2091 4074 2092 - #define ROCE_SP_HSI_VERSION_STR "1.6.0" 2093 - /* 2094 - * Following is the signature for ROCE_SP_HSI message field that indicates not 2095 - * applicable (All F's). Need to cast it the size of the field if needed. 2096 - */ 2097 - #define ROCE_SP_HSI_NA_SIGNATURE ((__le32)(-1)) 2098 - #endif /* __BNXT_RE_HSI_H__ */ 4075 + /* sq_base (size:64b/8B) */ 4076 + struct sq_base { 4077 + u8 wqe_type; 4078 + #define SQ_BASE_WQE_TYPE_SEND 0x0UL 4079 + #define SQ_BASE_WQE_TYPE_SEND_W_IMMEAD 0x1UL 4080 + #define SQ_BASE_WQE_TYPE_SEND_W_INVALID 0x2UL 4081 + #define SQ_BASE_WQE_TYPE_WRITE_WQE 0x4UL 4082 + #define SQ_BASE_WQE_TYPE_WRITE_W_IMMEAD 0x5UL 4083 + #define SQ_BASE_WQE_TYPE_READ_WQE 0x6UL 4084 + #define SQ_BASE_WQE_TYPE_ATOMIC_CS 0x8UL 4085 + #define SQ_BASE_WQE_TYPE_ATOMIC_FA 0xbUL 4086 + #define SQ_BASE_WQE_TYPE_LOCAL_INVALID 0xcUL 4087 + #define SQ_BASE_WQE_TYPE_FR_PMR 0xdUL 4088 + #define SQ_BASE_WQE_TYPE_BIND 0xeUL 4089 + #define SQ_BASE_WQE_TYPE_FR_PPMR 0xfUL 4090 + #define SQ_BASE_WQE_TYPE_LAST SQ_BASE_WQE_TYPE_FR_PPMR 4091 + u8 unused_0[7]; 4092 + }; 4093 + 4094 + /* sq_sge (size:128b/16B) */ 4095 + struct sq_sge { 4096 + __le64 va_or_pa; 4097 + __le32 l_key; 4098 + __le32 size; 4099 + }; 4100 + 4101 + /* sq_psn_search (size:64b/8B) */ 4102 + struct sq_psn_search { 4103 + __le32 opcode_start_psn; 4104 + #define SQ_PSN_SEARCH_START_PSN_MASK 0xffffffUL 4105 + #define SQ_PSN_SEARCH_START_PSN_SFT 0 4106 + #define SQ_PSN_SEARCH_OPCODE_MASK 0xff000000UL 4107 + #define SQ_PSN_SEARCH_OPCODE_SFT 24 4108 + __le32 flags_next_psn; 4109 + #define SQ_PSN_SEARCH_NEXT_PSN_MASK 0xffffffUL 4110 + #define SQ_PSN_SEARCH_NEXT_PSN_SFT 0 4111 + #define SQ_PSN_SEARCH_FLAGS_MASK 0xff000000UL 4112 + #define SQ_PSN_SEARCH_FLAGS_SFT 24 4113 + }; 4114 + 4115 + /* sq_psn_search_ext (size:128b/16B) */ 4116 + struct sq_psn_search_ext { 4117 + __le32 opcode_start_psn; 4118 + #define SQ_PSN_SEARCH_EXT_START_PSN_MASK 0xffffffUL 4119 + #define SQ_PSN_SEARCH_EXT_START_PSN_SFT 0 4120 + #define SQ_PSN_SEARCH_EXT_OPCODE_MASK 0xff000000UL 4121 + #define SQ_PSN_SEARCH_EXT_OPCODE_SFT 24 4122 + __le32 flags_next_psn; 4123 + #define SQ_PSN_SEARCH_EXT_NEXT_PSN_MASK 0xffffffUL 4124 + #define SQ_PSN_SEARCH_EXT_NEXT_PSN_SFT 0 4125 + #define SQ_PSN_SEARCH_EXT_FLAGS_MASK 0xff000000UL 4126 + #define SQ_PSN_SEARCH_EXT_FLAGS_SFT 24 4127 + __le16 start_slot_idx; 4128 + __le16 reserved16; 4129 + __le32 reserved32; 4130 + }; 4131 + 4132 + /* sq_send (size:1024b/128B) */ 4133 + struct sq_send { 4134 + u8 wqe_type; 4135 + #define SQ_SEND_WQE_TYPE_SEND 0x0UL 4136 + #define SQ_SEND_WQE_TYPE_SEND_W_IMMEAD 0x1UL 4137 + #define SQ_SEND_WQE_TYPE_SEND_W_INVALID 0x2UL 4138 + #define SQ_SEND_WQE_TYPE_LAST SQ_SEND_WQE_TYPE_SEND_W_INVALID 4139 + u8 flags; 4140 + #define SQ_SEND_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4141 + #define SQ_SEND_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4142 + #define SQ_SEND_FLAGS_SIGNAL_COMP 0x1UL 4143 + #define SQ_SEND_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4144 + #define SQ_SEND_FLAGS_UC_FENCE 0x4UL 4145 + #define SQ_SEND_FLAGS_SE 0x8UL 4146 + #define SQ_SEND_FLAGS_INLINE 0x10UL 4147 + #define SQ_SEND_FLAGS_WQE_TS_EN 0x20UL 4148 + #define SQ_SEND_FLAGS_DEBUG_TRACE 0x40UL 4149 + u8 wqe_size; 4150 + u8 reserved8_1; 4151 + __le32 inv_key_or_imm_data; 4152 + __le32 length; 4153 + __le32 q_key; 4154 + __le32 dst_qp; 4155 + #define SQ_SEND_DST_QP_MASK 0xffffffUL 4156 + #define SQ_SEND_DST_QP_SFT 0 4157 + __le32 avid; 4158 + #define SQ_SEND_AVID_MASK 0xfffffUL 4159 + #define SQ_SEND_AVID_SFT 0 4160 + __le32 reserved32; 4161 + __le32 timestamp; 4162 + #define SQ_SEND_TIMESTAMP_MASK 0xffffffUL 4163 + #define SQ_SEND_TIMESTAMP_SFT 0 4164 + __le32 data[24]; 4165 + }; 4166 + 4167 + /* sq_send_hdr (size:256b/32B) */ 4168 + struct sq_send_hdr { 4169 + u8 wqe_type; 4170 + #define SQ_SEND_HDR_WQE_TYPE_SEND 0x0UL 4171 + #define SQ_SEND_HDR_WQE_TYPE_SEND_W_IMMEAD 0x1UL 4172 + #define SQ_SEND_HDR_WQE_TYPE_SEND_W_INVALID 0x2UL 4173 + #define SQ_SEND_HDR_WQE_TYPE_LAST SQ_SEND_HDR_WQE_TYPE_SEND_W_INVALID 4174 + u8 flags; 4175 + #define SQ_SEND_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4176 + #define SQ_SEND_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4177 + #define SQ_SEND_HDR_FLAGS_SIGNAL_COMP 0x1UL 4178 + #define SQ_SEND_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4179 + #define SQ_SEND_HDR_FLAGS_UC_FENCE 0x4UL 4180 + #define SQ_SEND_HDR_FLAGS_SE 0x8UL 4181 + #define SQ_SEND_HDR_FLAGS_INLINE 0x10UL 4182 + #define SQ_SEND_HDR_FLAGS_WQE_TS_EN 0x20UL 4183 + #define SQ_SEND_HDR_FLAGS_DEBUG_TRACE 0x40UL 4184 + u8 wqe_size; 4185 + u8 reserved8_1; 4186 + __le32 inv_key_or_imm_data; 4187 + __le32 length; 4188 + __le32 q_key; 4189 + __le32 dst_qp; 4190 + #define SQ_SEND_HDR_DST_QP_MASK 0xffffffUL 4191 + #define SQ_SEND_HDR_DST_QP_SFT 0 4192 + __le32 avid; 4193 + #define SQ_SEND_HDR_AVID_MASK 0xfffffUL 4194 + #define SQ_SEND_HDR_AVID_SFT 0 4195 + __le32 reserved32; 4196 + __le32 timestamp; 4197 + #define SQ_SEND_HDR_TIMESTAMP_MASK 0xffffffUL 4198 + #define SQ_SEND_HDR_TIMESTAMP_SFT 0 4199 + }; 4200 + 4201 + /* sq_send_raweth_qp1 (size:1024b/128B) */ 4202 + struct sq_send_raweth_qp1 { 4203 + u8 wqe_type; 4204 + #define SQ_SEND_RAWETH_QP1_WQE_TYPE_SEND 0x0UL 4205 + #define SQ_SEND_RAWETH_QP1_WQE_TYPE_LAST SQ_SEND_RAWETH_QP1_WQE_TYPE_SEND 4206 + u8 flags; 4207 + #define SQ_SEND_RAWETH_QP1_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK \ 4208 + 0xffUL 4209 + #define SQ_SEND_RAWETH_QP1_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT \ 4210 + 0 4211 + #define SQ_SEND_RAWETH_QP1_FLAGS_SIGNAL_COMP 0x1UL 4212 + #define SQ_SEND_RAWETH_QP1_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4213 + #define SQ_SEND_RAWETH_QP1_FLAGS_UC_FENCE 0x4UL 4214 + #define SQ_SEND_RAWETH_QP1_FLAGS_SE 0x8UL 4215 + #define SQ_SEND_RAWETH_QP1_FLAGS_INLINE 0x10UL 4216 + #define SQ_SEND_RAWETH_QP1_FLAGS_WQE_TS_EN 0x20UL 4217 + #define SQ_SEND_RAWETH_QP1_FLAGS_DEBUG_TRACE 0x40UL 4218 + u8 wqe_size; 4219 + u8 reserved8; 4220 + __le16 lflags; 4221 + #define SQ_SEND_RAWETH_QP1_LFLAGS_TCP_UDP_CHKSUM 0x1UL 4222 + #define SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM 0x2UL 4223 + #define SQ_SEND_RAWETH_QP1_LFLAGS_NOCRC 0x4UL 4224 + #define SQ_SEND_RAWETH_QP1_LFLAGS_STAMP 0x8UL 4225 + #define SQ_SEND_RAWETH_QP1_LFLAGS_T_IP_CHKSUM 0x10UL 4226 + #define SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC 0x100UL 4227 + #define SQ_SEND_RAWETH_QP1_LFLAGS_FCOE_CRC 0x200UL 4228 + __le16 cfa_action; 4229 + __le32 length; 4230 + __le32 reserved32_1; 4231 + __le32 cfa_meta; 4232 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_VID_MASK 0xfffUL 4233 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_VID_SFT 0 4234 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_DE 0x1000UL 4235 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_PRI_MASK 0xe000UL 4236 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_PRI_SFT 13 4237 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_MASK 0x70000UL 4238 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_SFT 16 4239 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID88A8 (0x0UL << 16) 4240 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID8100 (0x1UL << 16) 4241 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9100 (0x2UL << 16) 4242 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9200 (0x3UL << 16) 4243 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPID9300 (0x4UL << 16) 4244 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPIDCFG (0x5UL << 16) 4245 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_LAST\ 4246 + SQ_SEND_RAWETH_QP1_CFA_META_VLAN_TPID_TPIDCFG 4247 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_RESERVED_MASK 0xff80000UL 4248 + #define SQ_SEND_RAWETH_QP1_CFA_META_VLAN_RESERVED_SFT 19 4249 + #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_MASK 0xf0000000UL 4250 + #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_SFT 28 4251 + #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_NONE (0x0UL << 28) 4252 + #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_VLAN_TAG (0x1UL << 28) 4253 + #define SQ_SEND_RAWETH_QP1_CFA_META_KEY_LAST SQ_SEND_RAWETH_QP1_CFA_META_KEY_VLAN_TAG 4254 + __le32 reserved32_2; 4255 + __le32 reserved32_3; 4256 + __le32 timestamp; 4257 + #define SQ_SEND_RAWETH_QP1_TIMESTAMP_MASK 0xffffffUL 4258 + #define SQ_SEND_RAWETH_QP1_TIMESTAMP_SFT 0 4259 + __le32 data[24]; 4260 + }; 4261 + 4262 + /* sq_send_raweth_qp1_hdr (size:256b/32B) */ 4263 + struct sq_send_raweth_qp1_hdr { 4264 + u8 wqe_type; 4265 + #define SQ_SEND_RAWETH_QP1_HDR_WQE_TYPE_SEND 0x0UL 4266 + #define SQ_SEND_RAWETH_QP1_HDR_WQE_TYPE_LAST SQ_SEND_RAWETH_QP1_HDR_WQE_TYPE_SEND 4267 + u8 flags; 4268 + #define \ 4269 + SQ_SEND_RAWETH_QP1_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4270 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT\ 4271 + 0 4272 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_SIGNAL_COMP 0x1UL 4273 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4274 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_UC_FENCE 0x4UL 4275 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_SE 0x8UL 4276 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_INLINE 0x10UL 4277 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_WQE_TS_EN 0x20UL 4278 + #define SQ_SEND_RAWETH_QP1_HDR_FLAGS_DEBUG_TRACE 0x40UL 4279 + u8 wqe_size; 4280 + u8 reserved8; 4281 + __le16 lflags; 4282 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_TCP_UDP_CHKSUM 0x1UL 4283 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_IP_CHKSUM 0x2UL 4284 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_NOCRC 0x4UL 4285 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_STAMP 0x8UL 4286 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_T_IP_CHKSUM 0x10UL 4287 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_ROCE_CRC 0x100UL 4288 + #define SQ_SEND_RAWETH_QP1_HDR_LFLAGS_FCOE_CRC 0x200UL 4289 + __le16 cfa_action; 4290 + __le32 length; 4291 + __le32 reserved32_1; 4292 + __le32 cfa_meta; 4293 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_VID_MASK 0xfffUL 4294 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_VID_SFT 0 4295 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_DE 0x1000UL 4296 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_PRI_MASK 0xe000UL 4297 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_PRI_SFT 13 4298 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_MASK 0x70000UL 4299 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_SFT 16 4300 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPID88A8 (0x0UL << 16) 4301 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPID8100 (0x1UL << 16) 4302 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPID9100 (0x2UL << 16) 4303 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPID9200 (0x3UL << 16) 4304 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPID9300 (0x4UL << 16) 4305 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPIDCFG (0x5UL << 16) 4306 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_LAST\ 4307 + SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_TPID_TPIDCFG 4308 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_RESERVED_MASK 0xff80000UL 4309 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_VLAN_RESERVED_SFT 19 4310 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_MASK 0xf0000000UL 4311 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_SFT 28 4312 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_NONE (0x0UL << 28) 4313 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_VLAN_TAG (0x1UL << 28) 4314 + #define SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_LAST\ 4315 + SQ_SEND_RAWETH_QP1_HDR_CFA_META_KEY_VLAN_TAG 4316 + __le32 reserved32_2; 4317 + __le32 reserved32_3; 4318 + __le32 timestamp; 4319 + #define SQ_SEND_RAWETH_QP1_HDR_TIMESTAMP_MASK 0xffffffUL 4320 + #define SQ_SEND_RAWETH_QP1_HDR_TIMESTAMP_SFT 0 4321 + }; 4322 + 4323 + /* sq_rdma (size:1024b/128B) */ 4324 + struct sq_rdma { 4325 + u8 wqe_type; 4326 + #define SQ_RDMA_WQE_TYPE_WRITE_WQE 0x4UL 4327 + #define SQ_RDMA_WQE_TYPE_WRITE_W_IMMEAD 0x5UL 4328 + #define SQ_RDMA_WQE_TYPE_READ_WQE 0x6UL 4329 + #define SQ_RDMA_WQE_TYPE_LAST SQ_RDMA_WQE_TYPE_READ_WQE 4330 + u8 flags; 4331 + #define SQ_RDMA_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4332 + #define SQ_RDMA_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4333 + #define SQ_RDMA_FLAGS_SIGNAL_COMP 0x1UL 4334 + #define SQ_RDMA_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4335 + #define SQ_RDMA_FLAGS_UC_FENCE 0x4UL 4336 + #define SQ_RDMA_FLAGS_SE 0x8UL 4337 + #define SQ_RDMA_FLAGS_INLINE 0x10UL 4338 + #define SQ_RDMA_FLAGS_WQE_TS_EN 0x20UL 4339 + #define SQ_RDMA_FLAGS_DEBUG_TRACE 0x40UL 4340 + u8 wqe_size; 4341 + u8 reserved8; 4342 + __le32 imm_data; 4343 + __le32 length; 4344 + __le32 reserved32_1; 4345 + __le64 remote_va; 4346 + __le32 remote_key; 4347 + __le32 timestamp; 4348 + #define SQ_RDMA_TIMESTAMP_MASK 0xffffffUL 4349 + #define SQ_RDMA_TIMESTAMP_SFT 0 4350 + __le32 data[24]; 4351 + }; 4352 + 4353 + /* sq_rdma_hdr (size:256b/32B) */ 4354 + struct sq_rdma_hdr { 4355 + u8 wqe_type; 4356 + #define SQ_RDMA_HDR_WQE_TYPE_WRITE_WQE 0x4UL 4357 + #define SQ_RDMA_HDR_WQE_TYPE_WRITE_W_IMMEAD 0x5UL 4358 + #define SQ_RDMA_HDR_WQE_TYPE_READ_WQE 0x6UL 4359 + #define SQ_RDMA_HDR_WQE_TYPE_LAST SQ_RDMA_HDR_WQE_TYPE_READ_WQE 4360 + u8 flags; 4361 + #define SQ_RDMA_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4362 + #define SQ_RDMA_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4363 + #define SQ_RDMA_HDR_FLAGS_SIGNAL_COMP 0x1UL 4364 + #define SQ_RDMA_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4365 + #define SQ_RDMA_HDR_FLAGS_UC_FENCE 0x4UL 4366 + #define SQ_RDMA_HDR_FLAGS_SE 0x8UL 4367 + #define SQ_RDMA_HDR_FLAGS_INLINE 0x10UL 4368 + #define SQ_RDMA_HDR_FLAGS_WQE_TS_EN 0x20UL 4369 + #define SQ_RDMA_HDR_FLAGS_DEBUG_TRACE 0x40UL 4370 + u8 wqe_size; 4371 + u8 reserved8; 4372 + __le32 imm_data; 4373 + __le32 length; 4374 + __le32 reserved32_1; 4375 + __le64 remote_va; 4376 + __le32 remote_key; 4377 + __le32 timestamp; 4378 + #define SQ_RDMA_HDR_TIMESTAMP_MASK 0xffffffUL 4379 + #define SQ_RDMA_HDR_TIMESTAMP_SFT 0 4380 + }; 4381 + 4382 + /* sq_atomic (size:1024b/128B) */ 4383 + struct sq_atomic { 4384 + u8 wqe_type; 4385 + #define SQ_ATOMIC_WQE_TYPE_ATOMIC_CS 0x8UL 4386 + #define SQ_ATOMIC_WQE_TYPE_ATOMIC_FA 0xbUL 4387 + #define SQ_ATOMIC_WQE_TYPE_LAST SQ_ATOMIC_WQE_TYPE_ATOMIC_FA 4388 + u8 flags; 4389 + #define SQ_ATOMIC_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4390 + #define SQ_ATOMIC_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4391 + #define SQ_ATOMIC_FLAGS_SIGNAL_COMP 0x1UL 4392 + #define SQ_ATOMIC_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4393 + #define SQ_ATOMIC_FLAGS_UC_FENCE 0x4UL 4394 + #define SQ_ATOMIC_FLAGS_SE 0x8UL 4395 + #define SQ_ATOMIC_FLAGS_INLINE 0x10UL 4396 + #define SQ_ATOMIC_FLAGS_WQE_TS_EN 0x20UL 4397 + #define SQ_ATOMIC_FLAGS_DEBUG_TRACE 0x40UL 4398 + __le16 reserved16; 4399 + __le32 remote_key; 4400 + __le64 remote_va; 4401 + __le64 swap_data; 4402 + __le64 cmp_data; 4403 + __le32 data[24]; 4404 + }; 4405 + 4406 + /* sq_atomic_hdr (size:256b/32B) */ 4407 + struct sq_atomic_hdr { 4408 + u8 wqe_type; 4409 + #define SQ_ATOMIC_HDR_WQE_TYPE_ATOMIC_CS 0x8UL 4410 + #define SQ_ATOMIC_HDR_WQE_TYPE_ATOMIC_FA 0xbUL 4411 + #define SQ_ATOMIC_HDR_WQE_TYPE_LAST SQ_ATOMIC_HDR_WQE_TYPE_ATOMIC_FA 4412 + u8 flags; 4413 + #define SQ_ATOMIC_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4414 + #define SQ_ATOMIC_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4415 + #define SQ_ATOMIC_HDR_FLAGS_SIGNAL_COMP 0x1UL 4416 + #define SQ_ATOMIC_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4417 + #define SQ_ATOMIC_HDR_FLAGS_UC_FENCE 0x4UL 4418 + #define SQ_ATOMIC_HDR_FLAGS_SE 0x8UL 4419 + #define SQ_ATOMIC_HDR_FLAGS_INLINE 0x10UL 4420 + #define SQ_ATOMIC_HDR_FLAGS_WQE_TS_EN 0x20UL 4421 + #define SQ_ATOMIC_HDR_FLAGS_DEBUG_TRACE 0x40UL 4422 + __le16 reserved16; 4423 + __le32 remote_key; 4424 + __le64 remote_va; 4425 + __le64 swap_data; 4426 + __le64 cmp_data; 4427 + }; 4428 + 4429 + /* sq_localinvalidate (size:1024b/128B) */ 4430 + struct sq_localinvalidate { 4431 + u8 wqe_type; 4432 + #define SQ_LOCALINVALIDATE_WQE_TYPE_LOCAL_INVALID 0xcUL 4433 + #define SQ_LOCALINVALIDATE_WQE_TYPE_LAST SQ_LOCALINVALIDATE_WQE_TYPE_LOCAL_INVALID 4434 + u8 flags; 4435 + #define SQ_LOCALINVALIDATE_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK\ 4436 + 0xffUL 4437 + #define SQ_LOCALINVALIDATE_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT\ 4438 + 0 4439 + #define SQ_LOCALINVALIDATE_FLAGS_SIGNAL_COMP 0x1UL 4440 + #define SQ_LOCALINVALIDATE_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4441 + #define SQ_LOCALINVALIDATE_FLAGS_UC_FENCE 0x4UL 4442 + #define SQ_LOCALINVALIDATE_FLAGS_SE 0x8UL 4443 + #define SQ_LOCALINVALIDATE_FLAGS_INLINE 0x10UL 4444 + #define SQ_LOCALINVALIDATE_FLAGS_WQE_TS_EN 0x20UL 4445 + #define SQ_LOCALINVALIDATE_FLAGS_DEBUG_TRACE 0x40UL 4446 + __le16 reserved16; 4447 + __le32 inv_l_key; 4448 + __le64 reserved64; 4449 + u8 reserved128[16]; 4450 + __le32 data[24]; 4451 + }; 4452 + 4453 + /* sq_localinvalidate_hdr (size:256b/32B) */ 4454 + struct sq_localinvalidate_hdr { 4455 + u8 wqe_type; 4456 + #define SQ_LOCALINVALIDATE_HDR_WQE_TYPE_LOCAL_INVALID 0xcUL 4457 + #define SQ_LOCALINVALIDATE_HDR_WQE_TYPE_LAST SQ_LOCALINVALIDATE_HDR_WQE_TYPE_LOCAL_INVALID 4458 + u8 flags; 4459 + #define \ 4460 + SQ_LOCALINVALIDATE_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4461 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT\ 4462 + 0 4463 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_SIGNAL_COMP 0x1UL 4464 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4465 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_UC_FENCE 0x4UL 4466 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_SE 0x8UL 4467 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_INLINE 0x10UL 4468 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_WQE_TS_EN 0x20UL 4469 + #define SQ_LOCALINVALIDATE_HDR_FLAGS_DEBUG_TRACE 0x40UL 4470 + __le16 reserved16; 4471 + __le32 inv_l_key; 4472 + __le64 reserved64; 4473 + u8 reserved128[16]; 4474 + }; 4475 + 4476 + /* sq_fr_pmr (size:1024b/128B) */ 4477 + struct sq_fr_pmr { 4478 + u8 wqe_type; 4479 + #define SQ_FR_PMR_WQE_TYPE_FR_PMR 0xdUL 4480 + #define SQ_FR_PMR_WQE_TYPE_LAST SQ_FR_PMR_WQE_TYPE_FR_PMR 4481 + u8 flags; 4482 + #define SQ_FR_PMR_FLAGS_SIGNAL_COMP 0x1UL 4483 + #define SQ_FR_PMR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4484 + #define SQ_FR_PMR_FLAGS_UC_FENCE 0x4UL 4485 + #define SQ_FR_PMR_FLAGS_SE 0x8UL 4486 + #define SQ_FR_PMR_FLAGS_INLINE 0x10UL 4487 + #define SQ_FR_PMR_FLAGS_WQE_TS_EN 0x20UL 4488 + #define SQ_FR_PMR_FLAGS_DEBUG_TRACE 0x40UL 4489 + u8 access_cntl; 4490 + #define SQ_FR_PMR_ACCESS_CNTL_LOCAL_WRITE 0x1UL 4491 + #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_READ 0x2UL 4492 + #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_WRITE 0x4UL 4493 + #define SQ_FR_PMR_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 4494 + #define SQ_FR_PMR_ACCESS_CNTL_WINDOW_BIND 0x10UL 4495 + u8 zero_based_page_size_log; 4496 + #define SQ_FR_PMR_PAGE_SIZE_LOG_MASK 0x1fUL 4497 + #define SQ_FR_PMR_PAGE_SIZE_LOG_SFT 0 4498 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 4499 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 4500 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_16K 0x2UL 4501 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_32K 0x3UL 4502 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 4503 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_128K 0x5UL 4504 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 4505 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_512K 0x7UL 4506 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 4507 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 4508 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 4509 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8M 0xbUL 4510 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_16M 0xcUL 4511 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_32M 0xdUL 4512 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_64M 0xeUL 4513 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_128M 0xfUL 4514 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_256M 0x10UL 4515 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_512M 0x11UL 4516 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 4517 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_2G 0x13UL 4518 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4G 0x14UL 4519 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8G 0x15UL 4520 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_16G 0x16UL 4521 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_32G 0x17UL 4522 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_64G 0x18UL 4523 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_128G 0x19UL 4524 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_256G 0x1aUL 4525 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_512G 0x1bUL 4526 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_1T 0x1cUL 4527 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_2T 0x1dUL 4528 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_4T 0x1eUL 4529 + #define SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8T 0x1fUL 4530 + #define SQ_FR_PMR_PAGE_SIZE_LOG_LAST SQ_FR_PMR_PAGE_SIZE_LOG_PGSZ_8T 4531 + #define SQ_FR_PMR_ZERO_BASED 0x20UL 4532 + __le32 l_key; 4533 + u8 length[5]; 4534 + u8 reserved8_1; 4535 + u8 reserved8_2; 4536 + u8 numlevels_pbl_page_size_log; 4537 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_MASK 0x1fUL 4538 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_SFT 0 4539 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 4540 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 4541 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_16K 0x2UL 4542 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_32K 0x3UL 4543 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 4544 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_128K 0x5UL 4545 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 4546 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_512K 0x7UL 4547 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 4548 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 4549 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 4550 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8M 0xbUL 4551 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_16M 0xcUL 4552 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_32M 0xdUL 4553 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_64M 0xeUL 4554 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_128M 0xfUL 4555 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_256M 0x10UL 4556 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_512M 0x11UL 4557 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 4558 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_2G 0x13UL 4559 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4G 0x14UL 4560 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8G 0x15UL 4561 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_16G 0x16UL 4562 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_32G 0x17UL 4563 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_64G 0x18UL 4564 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_128G 0x19UL 4565 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_256G 0x1aUL 4566 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_512G 0x1bUL 4567 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_1T 0x1cUL 4568 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_2T 0x1dUL 4569 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_4T 0x1eUL 4570 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8T 0x1fUL 4571 + #define SQ_FR_PMR_PBL_PAGE_SIZE_LOG_LAST SQ_FR_PMR_PBL_PAGE_SIZE_LOG_PGSZ_8T 4572 + #define SQ_FR_PMR_NUMLEVELS_MASK 0xc0UL 4573 + #define SQ_FR_PMR_NUMLEVELS_SFT 6 4574 + #define SQ_FR_PMR_NUMLEVELS_PHYSICAL (0x0UL << 6) 4575 + #define SQ_FR_PMR_NUMLEVELS_LAYER1 (0x1UL << 6) 4576 + #define SQ_FR_PMR_NUMLEVELS_LAYER2 (0x2UL << 6) 4577 + #define SQ_FR_PMR_NUMLEVELS_LAST SQ_FR_PMR_NUMLEVELS_LAYER2 4578 + __le64 pblptr; 4579 + __le64 va; 4580 + __le32 data[24]; 4581 + }; 4582 + 4583 + /* sq_fr_pmr_hdr (size:256b/32B) */ 4584 + struct sq_fr_pmr_hdr { 4585 + u8 wqe_type; 4586 + #define SQ_FR_PMR_HDR_WQE_TYPE_FR_PMR 0xdUL 4587 + #define SQ_FR_PMR_HDR_WQE_TYPE_LAST SQ_FR_PMR_HDR_WQE_TYPE_FR_PMR 4588 + u8 flags; 4589 + #define SQ_FR_PMR_HDR_FLAGS_SIGNAL_COMP 0x1UL 4590 + #define SQ_FR_PMR_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4591 + #define SQ_FR_PMR_HDR_FLAGS_UC_FENCE 0x4UL 4592 + #define SQ_FR_PMR_HDR_FLAGS_SE 0x8UL 4593 + #define SQ_FR_PMR_HDR_FLAGS_INLINE 0x10UL 4594 + #define SQ_FR_PMR_HDR_FLAGS_WQE_TS_EN 0x20UL 4595 + #define SQ_FR_PMR_HDR_FLAGS_DEBUG_TRACE 0x40UL 4596 + u8 access_cntl; 4597 + #define SQ_FR_PMR_HDR_ACCESS_CNTL_LOCAL_WRITE 0x1UL 4598 + #define SQ_FR_PMR_HDR_ACCESS_CNTL_REMOTE_READ 0x2UL 4599 + #define SQ_FR_PMR_HDR_ACCESS_CNTL_REMOTE_WRITE 0x4UL 4600 + #define SQ_FR_PMR_HDR_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 4601 + #define SQ_FR_PMR_HDR_ACCESS_CNTL_WINDOW_BIND 0x10UL 4602 + u8 zero_based_page_size_log; 4603 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_MASK 0x1fUL 4604 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_SFT 0 4605 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 4606 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 4607 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_16K 0x2UL 4608 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_32K 0x3UL 4609 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 4610 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_128K 0x5UL 4611 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 4612 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_512K 0x7UL 4613 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 4614 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 4615 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 4616 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_8M 0xbUL 4617 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_16M 0xcUL 4618 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_32M 0xdUL 4619 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_64M 0xeUL 4620 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_128M 0xfUL 4621 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_256M 0x10UL 4622 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_512M 0x11UL 4623 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 4624 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_2G 0x13UL 4625 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_4G 0x14UL 4626 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_8G 0x15UL 4627 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_16G 0x16UL 4628 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_32G 0x17UL 4629 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_64G 0x18UL 4630 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_128G 0x19UL 4631 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_256G 0x1aUL 4632 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_512G 0x1bUL 4633 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_1T 0x1cUL 4634 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_2T 0x1dUL 4635 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_4T 0x1eUL 4636 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_8T 0x1fUL 4637 + #define SQ_FR_PMR_HDR_PAGE_SIZE_LOG_LAST SQ_FR_PMR_HDR_PAGE_SIZE_LOG_PGSZ_8T 4638 + #define SQ_FR_PMR_HDR_ZERO_BASED 0x20UL 4639 + __le32 l_key; 4640 + u8 length[5]; 4641 + u8 reserved8_1; 4642 + u8 reserved8_2; 4643 + u8 numlevels_pbl_page_size_log; 4644 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_MASK 0x1fUL 4645 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_SFT 0 4646 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_4K 0x0UL 4647 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_8K 0x1UL 4648 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_16K 0x2UL 4649 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_32K 0x3UL 4650 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_64K 0x4UL 4651 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_128K 0x5UL 4652 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_256K 0x6UL 4653 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_512K 0x7UL 4654 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_1M 0x8UL 4655 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_2M 0x9UL 4656 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_4M 0xaUL 4657 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_8M 0xbUL 4658 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_16M 0xcUL 4659 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_32M 0xdUL 4660 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_64M 0xeUL 4661 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_128M 0xfUL 4662 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_256M 0x10UL 4663 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_512M 0x11UL 4664 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_1G 0x12UL 4665 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_2G 0x13UL 4666 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_4G 0x14UL 4667 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_8G 0x15UL 4668 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_16G 0x16UL 4669 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_32G 0x17UL 4670 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_64G 0x18UL 4671 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_128G 0x19UL 4672 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_256G 0x1aUL 4673 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_512G 0x1bUL 4674 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_1T 0x1cUL 4675 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_2T 0x1dUL 4676 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_4T 0x1eUL 4677 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_8T 0x1fUL 4678 + #define SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_LAST SQ_FR_PMR_HDR_PBL_PAGE_SIZE_LOG_PGSZ_8T 4679 + #define SQ_FR_PMR_HDR_NUMLEVELS_MASK 0xc0UL 4680 + #define SQ_FR_PMR_HDR_NUMLEVELS_SFT 6 4681 + #define SQ_FR_PMR_HDR_NUMLEVELS_PHYSICAL (0x0UL << 6) 4682 + #define SQ_FR_PMR_HDR_NUMLEVELS_LAYER1 (0x1UL << 6) 4683 + #define SQ_FR_PMR_HDR_NUMLEVELS_LAYER2 (0x2UL << 6) 4684 + #define SQ_FR_PMR_HDR_NUMLEVELS_LAST SQ_FR_PMR_HDR_NUMLEVELS_LAYER2 4685 + __le64 pblptr; 4686 + __le64 va; 4687 + }; 4688 + 4689 + /* sq_bind (size:1024b/128B) */ 4690 + struct sq_bind { 4691 + u8 wqe_type; 4692 + #define SQ_BIND_WQE_TYPE_BIND 0xeUL 4693 + #define SQ_BIND_WQE_TYPE_LAST SQ_BIND_WQE_TYPE_BIND 4694 + u8 flags; 4695 + #define SQ_BIND_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4696 + #define SQ_BIND_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4697 + #define SQ_BIND_FLAGS_SIGNAL_COMP 0x1UL 4698 + #define SQ_BIND_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4699 + #define SQ_BIND_FLAGS_UC_FENCE 0x4UL 4700 + #define SQ_BIND_FLAGS_SE 0x8UL 4701 + #define SQ_BIND_FLAGS_INLINE 0x10UL 4702 + #define SQ_BIND_FLAGS_WQE_TS_EN 0x20UL 4703 + #define SQ_BIND_FLAGS_DEBUG_TRACE 0x40UL 4704 + u8 access_cntl; 4705 + #define \ 4706 + SQ_BIND_ACCESS_CNTL_WINDOW_BIND_REMOTE_ATOMIC_REMOTE_WRITE_REMOTE_READ_LOCAL_WRITE_MASK\ 4707 + 0xffUL 4708 + #define \ 4709 + SQ_BIND_ACCESS_CNTL_WINDOW_BIND_REMOTE_ATOMIC_REMOTE_WRITE_REMOTE_READ_LOCAL_WRITE_SFT 0 4710 + #define SQ_BIND_ACCESS_CNTL_LOCAL_WRITE 0x1UL 4711 + #define SQ_BIND_ACCESS_CNTL_REMOTE_READ 0x2UL 4712 + #define SQ_BIND_ACCESS_CNTL_REMOTE_WRITE 0x4UL 4713 + #define SQ_BIND_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 4714 + #define SQ_BIND_ACCESS_CNTL_WINDOW_BIND 0x10UL 4715 + u8 reserved8_1; 4716 + u8 mw_type_zero_based; 4717 + #define SQ_BIND_ZERO_BASED 0x1UL 4718 + #define SQ_BIND_MW_TYPE 0x2UL 4719 + #define SQ_BIND_MW_TYPE_TYPE1 (0x0UL << 1) 4720 + #define SQ_BIND_MW_TYPE_TYPE2 (0x1UL << 1) 4721 + #define SQ_BIND_MW_TYPE_LAST SQ_BIND_MW_TYPE_TYPE2 4722 + u8 reserved8_2; 4723 + __le16 reserved16; 4724 + __le32 parent_l_key; 4725 + __le32 l_key; 4726 + __le64 va; 4727 + u8 length[5]; 4728 + u8 reserved24[3]; 4729 + __le32 data[24]; 4730 + }; 4731 + 4732 + /* sq_bind_hdr (size:256b/32B) */ 4733 + struct sq_bind_hdr { 4734 + u8 wqe_type; 4735 + #define SQ_BIND_HDR_WQE_TYPE_BIND 0xeUL 4736 + #define SQ_BIND_HDR_WQE_TYPE_LAST SQ_BIND_HDR_WQE_TYPE_BIND 4737 + u8 flags; 4738 + #define SQ_BIND_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_MASK 0xffUL 4739 + #define SQ_BIND_HDR_FLAGS_INLINE_SE_UC_FENCE_RD_OR_ATOMIC_FENCE_SIGNAL_COMP_SFT 0 4740 + #define SQ_BIND_HDR_FLAGS_SIGNAL_COMP 0x1UL 4741 + #define SQ_BIND_HDR_FLAGS_RD_OR_ATOMIC_FENCE 0x2UL 4742 + #define SQ_BIND_HDR_FLAGS_UC_FENCE 0x4UL 4743 + #define SQ_BIND_HDR_FLAGS_SE 0x8UL 4744 + #define SQ_BIND_HDR_FLAGS_INLINE 0x10UL 4745 + #define SQ_BIND_HDR_FLAGS_WQE_TS_EN 0x20UL 4746 + #define SQ_BIND_HDR_FLAGS_DEBUG_TRACE 0x40UL 4747 + u8 access_cntl; 4748 + #define \ 4749 + SQ_BIND_HDR_ACCESS_CNTL_WINDOW_BIND_REMOTE_ATOMIC_REMOTE_WRITE_REMOTE_READ_LOCAL_WRITE_MASK\ 4750 + 0xffUL 4751 + #define \ 4752 + SQ_BIND_HDR_ACCESS_CNTL_WINDOW_BIND_REMOTE_ATOMIC_REMOTE_WRITE_REMOTE_READ_LOCAL_WRITE_SFT \ 4753 + 0 4754 + #define SQ_BIND_HDR_ACCESS_CNTL_LOCAL_WRITE 0x1UL 4755 + #define SQ_BIND_HDR_ACCESS_CNTL_REMOTE_READ 0x2UL 4756 + #define SQ_BIND_HDR_ACCESS_CNTL_REMOTE_WRITE 0x4UL 4757 + #define SQ_BIND_HDR_ACCESS_CNTL_REMOTE_ATOMIC 0x8UL 4758 + #define SQ_BIND_HDR_ACCESS_CNTL_WINDOW_BIND 0x10UL 4759 + u8 reserved8_1; 4760 + u8 mw_type_zero_based; 4761 + #define SQ_BIND_HDR_ZERO_BASED 0x1UL 4762 + #define SQ_BIND_HDR_MW_TYPE 0x2UL 4763 + #define SQ_BIND_HDR_MW_TYPE_TYPE1 (0x0UL << 1) 4764 + #define SQ_BIND_HDR_MW_TYPE_TYPE2 (0x1UL << 1) 4765 + #define SQ_BIND_HDR_MW_TYPE_LAST SQ_BIND_HDR_MW_TYPE_TYPE2 4766 + u8 reserved8_2; 4767 + __le16 reserved16; 4768 + __le32 parent_l_key; 4769 + __le32 l_key; 4770 + __le64 va; 4771 + u8 length[5]; 4772 + u8 reserved24[3]; 4773 + }; 4774 + 4775 + /* rq_wqe (size:1024b/128B) */ 4776 + struct rq_wqe { 4777 + u8 wqe_type; 4778 + #define RQ_WQE_WQE_TYPE_RCV 0x80UL 4779 + #define RQ_WQE_WQE_TYPE_LAST RQ_WQE_WQE_TYPE_RCV 4780 + u8 flags; 4781 + u8 wqe_size; 4782 + u8 reserved8; 4783 + __le32 reserved32; 4784 + __le32 wr_id[2]; 4785 + #define RQ_WQE_WR_ID_MASK 0xfffffUL 4786 + #define RQ_WQE_WR_ID_SFT 0 4787 + u8 reserved128[16]; 4788 + __le32 data[24]; 4789 + }; 4790 + 4791 + /* rq_wqe_hdr (size:256b/32B) */ 4792 + struct rq_wqe_hdr { 4793 + u8 wqe_type; 4794 + #define RQ_WQE_HDR_WQE_TYPE_RCV 0x80UL 4795 + #define RQ_WQE_HDR_WQE_TYPE_LAST RQ_WQE_HDR_WQE_TYPE_RCV 4796 + u8 flags; 4797 + u8 wqe_size; 4798 + u8 reserved8; 4799 + __le32 reserved32; 4800 + __le32 wr_id[2]; 4801 + #define RQ_WQE_HDR_WR_ID_MASK 0xfffffUL 4802 + #define RQ_WQE_HDR_WR_ID_SFT 0 4803 + u8 reserved128[16]; 4804 + }; 4805 + 4806 + /* cq_base (size:256b/32B) */ 4807 + struct cq_base { 4808 + __le64 reserved64_1; 4809 + __le64 reserved64_2; 4810 + __le64 reserved64_3; 4811 + u8 cqe_type_toggle; 4812 + #define CQ_BASE_TOGGLE 0x1UL 4813 + #define CQ_BASE_CQE_TYPE_MASK 0x1eUL 4814 + #define CQ_BASE_CQE_TYPE_SFT 1 4815 + #define CQ_BASE_CQE_TYPE_REQ (0x0UL << 1) 4816 + #define CQ_BASE_CQE_TYPE_RES_RC (0x1UL << 1) 4817 + #define CQ_BASE_CQE_TYPE_RES_UD (0x2UL << 1) 4818 + #define CQ_BASE_CQE_TYPE_RES_RAWETH_QP1 (0x3UL << 1) 4819 + #define CQ_BASE_CQE_TYPE_RES_UD_CFA (0x4UL << 1) 4820 + #define CQ_BASE_CQE_TYPE_NO_OP (0xdUL << 1) 4821 + #define CQ_BASE_CQE_TYPE_TERMINAL (0xeUL << 1) 4822 + #define CQ_BASE_CQE_TYPE_CUT_OFF (0xfUL << 1) 4823 + #define CQ_BASE_CQE_TYPE_LAST CQ_BASE_CQE_TYPE_CUT_OFF 4824 + u8 status; 4825 + __le16 reserved16; 4826 + __le32 reserved32; 4827 + }; 4828 + 4829 + /* cq_req (size:256b/32B) */ 4830 + struct cq_req { 4831 + __le64 qp_handle; 4832 + __le16 sq_cons_idx; 4833 + __le16 reserved16_1; 4834 + __le32 reserved32_2; 4835 + __le64 reserved64; 4836 + u8 cqe_type_toggle; 4837 + #define CQ_REQ_TOGGLE 0x1UL 4838 + #define CQ_REQ_CQE_TYPE_MASK 0x1eUL 4839 + #define CQ_REQ_CQE_TYPE_SFT 1 4840 + #define CQ_REQ_CQE_TYPE_REQ (0x0UL << 1) 4841 + #define CQ_REQ_CQE_TYPE_LAST CQ_REQ_CQE_TYPE_REQ 4842 + #define CQ_REQ_PUSH 0x20UL 4843 + u8 status; 4844 + #define CQ_REQ_STATUS_OK 0x0UL 4845 + #define CQ_REQ_STATUS_BAD_RESPONSE_ERR 0x1UL 4846 + #define CQ_REQ_STATUS_LOCAL_LENGTH_ERR 0x2UL 4847 + #define CQ_REQ_STATUS_LOCAL_QP_OPERATION_ERR 0x3UL 4848 + #define CQ_REQ_STATUS_LOCAL_PROTECTION_ERR 0x4UL 4849 + #define CQ_REQ_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 4850 + #define CQ_REQ_STATUS_REMOTE_INVALID_REQUEST_ERR 0x6UL 4851 + #define CQ_REQ_STATUS_REMOTE_ACCESS_ERR 0x7UL 4852 + #define CQ_REQ_STATUS_REMOTE_OPERATION_ERR 0x8UL 4853 + #define CQ_REQ_STATUS_RNR_NAK_RETRY_CNT_ERR 0x9UL 4854 + #define CQ_REQ_STATUS_TRANSPORT_RETRY_CNT_ERR 0xaUL 4855 + #define CQ_REQ_STATUS_WORK_REQUEST_FLUSHED_ERR 0xbUL 4856 + #define CQ_REQ_STATUS_LAST CQ_REQ_STATUS_WORK_REQUEST_FLUSHED_ERR 4857 + __le16 reserved16_2; 4858 + __le32 reserved32_1; 4859 + }; 4860 + 4861 + /* cq_res_rc (size:256b/32B) */ 4862 + struct cq_res_rc { 4863 + __le32 length; 4864 + __le32 imm_data_or_inv_r_key; 4865 + __le64 qp_handle; 4866 + __le64 mr_handle; 4867 + u8 cqe_type_toggle; 4868 + #define CQ_RES_RC_TOGGLE 0x1UL 4869 + #define CQ_RES_RC_CQE_TYPE_MASK 0x1eUL 4870 + #define CQ_RES_RC_CQE_TYPE_SFT 1 4871 + #define CQ_RES_RC_CQE_TYPE_RES_RC (0x1UL << 1) 4872 + #define CQ_RES_RC_CQE_TYPE_LAST CQ_RES_RC_CQE_TYPE_RES_RC 4873 + u8 status; 4874 + #define CQ_RES_RC_STATUS_OK 0x0UL 4875 + #define CQ_RES_RC_STATUS_LOCAL_ACCESS_ERROR 0x1UL 4876 + #define CQ_RES_RC_STATUS_LOCAL_LENGTH_ERR 0x2UL 4877 + #define CQ_RES_RC_STATUS_LOCAL_PROTECTION_ERR 0x3UL 4878 + #define CQ_RES_RC_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 4879 + #define CQ_RES_RC_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 4880 + #define CQ_RES_RC_STATUS_REMOTE_INVALID_REQUEST_ERR 0x6UL 4881 + #define CQ_RES_RC_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 4882 + #define CQ_RES_RC_STATUS_HW_FLUSH_ERR 0x8UL 4883 + #define CQ_RES_RC_STATUS_LAST CQ_RES_RC_STATUS_HW_FLUSH_ERR 4884 + __le16 flags; 4885 + #define CQ_RES_RC_FLAGS_SRQ 0x1UL 4886 + #define CQ_RES_RC_FLAGS_SRQ_RQ 0x0UL 4887 + #define CQ_RES_RC_FLAGS_SRQ_SRQ 0x1UL 4888 + #define CQ_RES_RC_FLAGS_SRQ_LAST CQ_RES_RC_FLAGS_SRQ_SRQ 4889 + #define CQ_RES_RC_FLAGS_IMM 0x2UL 4890 + #define CQ_RES_RC_FLAGS_INV 0x4UL 4891 + #define CQ_RES_RC_FLAGS_RDMA 0x8UL 4892 + #define CQ_RES_RC_FLAGS_RDMA_SEND (0x0UL << 3) 4893 + #define CQ_RES_RC_FLAGS_RDMA_RDMA_WRITE (0x1UL << 3) 4894 + #define CQ_RES_RC_FLAGS_RDMA_LAST CQ_RES_RC_FLAGS_RDMA_RDMA_WRITE 4895 + __le32 srq_or_rq_wr_id; 4896 + #define CQ_RES_RC_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 4897 + #define CQ_RES_RC_SRQ_OR_RQ_WR_ID_SFT 0 4898 + }; 4899 + 4900 + /* cq_res_ud (size:256b/32B) */ 4901 + struct cq_res_ud { 4902 + __le16 length; 4903 + #define CQ_RES_UD_LENGTH_MASK 0x3fffUL 4904 + #define CQ_RES_UD_LENGTH_SFT 0 4905 + __le16 cfa_metadata; 4906 + #define CQ_RES_UD_CFA_METADATA_VID_MASK 0xfffUL 4907 + #define CQ_RES_UD_CFA_METADATA_VID_SFT 0 4908 + #define CQ_RES_UD_CFA_METADATA_DE 0x1000UL 4909 + #define CQ_RES_UD_CFA_METADATA_PRI_MASK 0xe000UL 4910 + #define CQ_RES_UD_CFA_METADATA_PRI_SFT 13 4911 + __le32 imm_data; 4912 + __le64 qp_handle; 4913 + __le16 src_mac[3]; 4914 + __le16 src_qp_low; 4915 + u8 cqe_type_toggle; 4916 + #define CQ_RES_UD_TOGGLE 0x1UL 4917 + #define CQ_RES_UD_CQE_TYPE_MASK 0x1eUL 4918 + #define CQ_RES_UD_CQE_TYPE_SFT 1 4919 + #define CQ_RES_UD_CQE_TYPE_RES_UD (0x2UL << 1) 4920 + #define CQ_RES_UD_CQE_TYPE_LAST CQ_RES_UD_CQE_TYPE_RES_UD 4921 + u8 status; 4922 + #define CQ_RES_UD_STATUS_OK 0x0UL 4923 + #define CQ_RES_UD_STATUS_LOCAL_ACCESS_ERROR 0x1UL 4924 + #define CQ_RES_UD_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 4925 + #define CQ_RES_UD_STATUS_LOCAL_PROTECTION_ERR 0x3UL 4926 + #define CQ_RES_UD_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 4927 + #define CQ_RES_UD_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 4928 + #define CQ_RES_UD_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 4929 + #define CQ_RES_UD_STATUS_HW_FLUSH_ERR 0x8UL 4930 + #define CQ_RES_UD_STATUS_LAST CQ_RES_UD_STATUS_HW_FLUSH_ERR 4931 + __le16 flags; 4932 + #define CQ_RES_UD_FLAGS_SRQ 0x1UL 4933 + #define CQ_RES_UD_FLAGS_SRQ_RQ 0x0UL 4934 + #define CQ_RES_UD_FLAGS_SRQ_SRQ 0x1UL 4935 + #define CQ_RES_UD_FLAGS_SRQ_LAST CQ_RES_UD_FLAGS_SRQ_SRQ 4936 + #define CQ_RES_UD_FLAGS_IMM 0x2UL 4937 + #define CQ_RES_UD_FLAGS_UNUSED_MASK 0xcUL 4938 + #define CQ_RES_UD_FLAGS_UNUSED_SFT 2 4939 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK 0x30UL 4940 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT 4 4941 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V1 (0x0UL << 4) 4942 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV4 (0x2UL << 4) 4943 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV6 (0x3UL << 4) 4944 + #define CQ_RES_UD_FLAGS_ROCE_IP_VER_LAST CQ_RES_UD_FLAGS_ROCE_IP_VER_V2IPV6 4945 + #define CQ_RES_UD_FLAGS_META_FORMAT_MASK 0x3c0UL 4946 + #define CQ_RES_UD_FLAGS_META_FORMAT_SFT 6 4947 + #define CQ_RES_UD_FLAGS_META_FORMAT_NONE (0x0UL << 6) 4948 + #define CQ_RES_UD_FLAGS_META_FORMAT_VLAN (0x1UL << 6) 4949 + #define CQ_RES_UD_FLAGS_META_FORMAT_TUNNEL_ID (0x2UL << 6) 4950 + #define CQ_RES_UD_FLAGS_META_FORMAT_CHDR_DATA (0x3UL << 6) 4951 + #define CQ_RES_UD_FLAGS_META_FORMAT_HDR_OFFSET (0x4UL << 6) 4952 + #define CQ_RES_UD_FLAGS_META_FORMAT_LAST CQ_RES_UD_FLAGS_META_FORMAT_HDR_OFFSET 4953 + #define CQ_RES_UD_FLAGS_EXT_META_FORMAT_MASK 0xc00UL 4954 + #define CQ_RES_UD_FLAGS_EXT_META_FORMAT_SFT 10 4955 + __le32 src_qp_high_srq_or_rq_wr_id; 4956 + #define CQ_RES_UD_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 4957 + #define CQ_RES_UD_SRQ_OR_RQ_WR_ID_SFT 0 4958 + #define CQ_RES_UD_SRC_QP_HIGH_MASK 0xff000000UL 4959 + #define CQ_RES_UD_SRC_QP_HIGH_SFT 24 4960 + }; 4961 + 4962 + /* cq_res_ud_v2 (size:256b/32B) */ 4963 + struct cq_res_ud_v2 { 4964 + __le16 length; 4965 + #define CQ_RES_UD_V2_LENGTH_MASK 0x3fffUL 4966 + #define CQ_RES_UD_V2_LENGTH_SFT 0 4967 + __le16 cfa_metadata0; 4968 + #define CQ_RES_UD_V2_CFA_METADATA0_VID_MASK 0xfffUL 4969 + #define CQ_RES_UD_V2_CFA_METADATA0_VID_SFT 0 4970 + #define CQ_RES_UD_V2_CFA_METADATA0_DE 0x1000UL 4971 + #define CQ_RES_UD_V2_CFA_METADATA0_PRI_MASK 0xe000UL 4972 + #define CQ_RES_UD_V2_CFA_METADATA0_PRI_SFT 13 4973 + __le32 imm_data; 4974 + __le64 qp_handle; 4975 + __le16 src_mac[3]; 4976 + __le16 src_qp_low; 4977 + u8 cqe_type_toggle; 4978 + #define CQ_RES_UD_V2_TOGGLE 0x1UL 4979 + #define CQ_RES_UD_V2_CQE_TYPE_MASK 0x1eUL 4980 + #define CQ_RES_UD_V2_CQE_TYPE_SFT 1 4981 + #define CQ_RES_UD_V2_CQE_TYPE_RES_UD (0x2UL << 1) 4982 + #define CQ_RES_UD_V2_CQE_TYPE_LAST CQ_RES_UD_V2_CQE_TYPE_RES_UD 4983 + u8 status; 4984 + #define CQ_RES_UD_V2_STATUS_OK 0x0UL 4985 + #define CQ_RES_UD_V2_STATUS_LOCAL_ACCESS_ERROR 0x1UL 4986 + #define CQ_RES_UD_V2_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 4987 + #define CQ_RES_UD_V2_STATUS_LOCAL_PROTECTION_ERR 0x3UL 4988 + #define CQ_RES_UD_V2_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 4989 + #define CQ_RES_UD_V2_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 4990 + #define CQ_RES_UD_V2_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 4991 + #define CQ_RES_UD_V2_STATUS_HW_FLUSH_ERR 0x8UL 4992 + #define CQ_RES_UD_V2_STATUS_LAST CQ_RES_UD_V2_STATUS_HW_FLUSH_ERR 4993 + __le16 flags; 4994 + #define CQ_RES_UD_V2_FLAGS_SRQ 0x1UL 4995 + #define CQ_RES_UD_V2_FLAGS_SRQ_RQ 0x0UL 4996 + #define CQ_RES_UD_V2_FLAGS_SRQ_SRQ 0x1UL 4997 + #define CQ_RES_UD_V2_FLAGS_SRQ_LAST CQ_RES_UD_V2_FLAGS_SRQ_SRQ 4998 + #define CQ_RES_UD_V2_FLAGS_IMM 0x2UL 4999 + #define CQ_RES_UD_V2_FLAGS_UNUSED_MASK 0xcUL 5000 + #define CQ_RES_UD_V2_FLAGS_UNUSED_SFT 2 5001 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_MASK 0x30UL 5002 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_SFT 4 5003 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_V1 (0x0UL << 4) 5004 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_V2IPV4 (0x2UL << 4) 5005 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_V2IPV6 (0x3UL << 4) 5006 + #define CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_LAST CQ_RES_UD_V2_FLAGS_ROCE_IP_VER_V2IPV6 5007 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_MASK 0x3c0UL 5008 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_SFT 6 5009 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_NONE (0x0UL << 6) 5010 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_ACT_REC_PTR (0x1UL << 6) 5011 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_TUNNEL_ID (0x2UL << 6) 5012 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_CHDR_DATA (0x3UL << 6) 5013 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_HDR_OFFSET (0x4UL << 6) 5014 + #define CQ_RES_UD_V2_FLAGS_META_FORMAT_LAST CQ_RES_UD_V2_FLAGS_META_FORMAT_HDR_OFFSET 5015 + __le32 src_qp_high_srq_or_rq_wr_id; 5016 + #define CQ_RES_UD_V2_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 5017 + #define CQ_RES_UD_V2_SRQ_OR_RQ_WR_ID_SFT 0 5018 + #define CQ_RES_UD_V2_CFA_METADATA1_MASK 0xf00000UL 5019 + #define CQ_RES_UD_V2_CFA_METADATA1_SFT 20 5020 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_MASK 0x700000UL 5021 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_SFT 20 5022 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPID88A8 (0x0UL << 20) 5023 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPID8100 (0x1UL << 20) 5024 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPID9100 (0x2UL << 20) 5025 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPID9200 (0x3UL << 20) 5026 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPID9300 (0x4UL << 20) 5027 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPIDCFG (0x5UL << 20) 5028 + #define CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_LAST CQ_RES_UD_V2_CFA_METADATA1_TPID_SEL_TPIDCFG 5029 + #define CQ_RES_UD_V2_CFA_METADATA1_VALID 0x800000UL 5030 + #define CQ_RES_UD_V2_SRC_QP_HIGH_MASK 0xff000000UL 5031 + #define CQ_RES_UD_V2_SRC_QP_HIGH_SFT 24 5032 + }; 5033 + 5034 + /* cq_res_ud_cfa (size:256b/32B) */ 5035 + struct cq_res_ud_cfa { 5036 + __le16 length; 5037 + #define CQ_RES_UD_CFA_LENGTH_MASK 0x3fffUL 5038 + #define CQ_RES_UD_CFA_LENGTH_SFT 0 5039 + __le16 cfa_code; 5040 + __le32 imm_data; 5041 + __le32 qid; 5042 + #define CQ_RES_UD_CFA_QID_MASK 0xfffffUL 5043 + #define CQ_RES_UD_CFA_QID_SFT 0 5044 + __le32 cfa_metadata; 5045 + #define CQ_RES_UD_CFA_CFA_METADATA_VID_MASK 0xfffUL 5046 + #define CQ_RES_UD_CFA_CFA_METADATA_VID_SFT 0 5047 + #define CQ_RES_UD_CFA_CFA_METADATA_DE 0x1000UL 5048 + #define CQ_RES_UD_CFA_CFA_METADATA_PRI_MASK 0xe000UL 5049 + #define CQ_RES_UD_CFA_CFA_METADATA_PRI_SFT 13 5050 + #define CQ_RES_UD_CFA_CFA_METADATA_TPID_MASK 0xffff0000UL 5051 + #define CQ_RES_UD_CFA_CFA_METADATA_TPID_SFT 16 5052 + __le16 src_mac[3]; 5053 + __le16 src_qp_low; 5054 + u8 cqe_type_toggle; 5055 + #define CQ_RES_UD_CFA_TOGGLE 0x1UL 5056 + #define CQ_RES_UD_CFA_CQE_TYPE_MASK 0x1eUL 5057 + #define CQ_RES_UD_CFA_CQE_TYPE_SFT 1 5058 + #define CQ_RES_UD_CFA_CQE_TYPE_RES_UD_CFA (0x4UL << 1) 5059 + #define CQ_RES_UD_CFA_CQE_TYPE_LAST CQ_RES_UD_CFA_CQE_TYPE_RES_UD_CFA 5060 + u8 status; 5061 + #define CQ_RES_UD_CFA_STATUS_OK 0x0UL 5062 + #define CQ_RES_UD_CFA_STATUS_LOCAL_ACCESS_ERROR 0x1UL 5063 + #define CQ_RES_UD_CFA_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 5064 + #define CQ_RES_UD_CFA_STATUS_LOCAL_PROTECTION_ERR 0x3UL 5065 + #define CQ_RES_UD_CFA_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 5066 + #define CQ_RES_UD_CFA_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 5067 + #define CQ_RES_UD_CFA_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 5068 + #define CQ_RES_UD_CFA_STATUS_HW_FLUSH_ERR 0x8UL 5069 + #define CQ_RES_UD_CFA_STATUS_LAST CQ_RES_UD_CFA_STATUS_HW_FLUSH_ERR 5070 + __le16 flags; 5071 + #define CQ_RES_UD_CFA_FLAGS_SRQ 0x1UL 5072 + #define CQ_RES_UD_CFA_FLAGS_SRQ_RQ 0x0UL 5073 + #define CQ_RES_UD_CFA_FLAGS_SRQ_SRQ 0x1UL 5074 + #define CQ_RES_UD_CFA_FLAGS_SRQ_LAST CQ_RES_UD_CFA_FLAGS_SRQ_SRQ 5075 + #define CQ_RES_UD_CFA_FLAGS_IMM 0x2UL 5076 + #define CQ_RES_UD_CFA_FLAGS_UNUSED_MASK 0xcUL 5077 + #define CQ_RES_UD_CFA_FLAGS_UNUSED_SFT 2 5078 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_MASK 0x30UL 5079 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_SFT 4 5080 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_V1 (0x0UL << 4) 5081 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_V2IPV4 (0x2UL << 4) 5082 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_V2IPV6 (0x3UL << 4) 5083 + #define CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_LAST CQ_RES_UD_CFA_FLAGS_ROCE_IP_VER_V2IPV6 5084 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_MASK 0x3c0UL 5085 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_SFT 6 5086 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_NONE (0x0UL << 6) 5087 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_VLAN (0x1UL << 6) 5088 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_TUNNEL_ID (0x2UL << 6) 5089 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_CHDR_DATA (0x3UL << 6) 5090 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_HDR_OFFSET (0x4UL << 6) 5091 + #define CQ_RES_UD_CFA_FLAGS_META_FORMAT_LAST CQ_RES_UD_CFA_FLAGS_META_FORMAT_HDR_OFFSET 5092 + #define CQ_RES_UD_CFA_FLAGS_EXT_META_FORMAT_MASK 0xc00UL 5093 + #define CQ_RES_UD_CFA_FLAGS_EXT_META_FORMAT_SFT 10 5094 + __le32 src_qp_high_srq_or_rq_wr_id; 5095 + #define CQ_RES_UD_CFA_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 5096 + #define CQ_RES_UD_CFA_SRQ_OR_RQ_WR_ID_SFT 0 5097 + #define CQ_RES_UD_CFA_SRC_QP_HIGH_MASK 0xff000000UL 5098 + #define CQ_RES_UD_CFA_SRC_QP_HIGH_SFT 24 5099 + }; 5100 + 5101 + /* cq_res_ud_cfa_v2 (size:256b/32B) */ 5102 + struct cq_res_ud_cfa_v2 { 5103 + __le16 length; 5104 + #define CQ_RES_UD_CFA_V2_LENGTH_MASK 0x3fffUL 5105 + #define CQ_RES_UD_CFA_V2_LENGTH_SFT 0 5106 + __le16 cfa_metadata0; 5107 + #define CQ_RES_UD_CFA_V2_CFA_METADATA0_VID_MASK 0xfffUL 5108 + #define CQ_RES_UD_CFA_V2_CFA_METADATA0_VID_SFT 0 5109 + #define CQ_RES_UD_CFA_V2_CFA_METADATA0_DE 0x1000UL 5110 + #define CQ_RES_UD_CFA_V2_CFA_METADATA0_PRI_MASK 0xe000UL 5111 + #define CQ_RES_UD_CFA_V2_CFA_METADATA0_PRI_SFT 13 5112 + __le32 imm_data; 5113 + __le32 qid; 5114 + #define CQ_RES_UD_CFA_V2_QID_MASK 0xfffffUL 5115 + #define CQ_RES_UD_CFA_V2_QID_SFT 0 5116 + __le32 cfa_metadata2; 5117 + __le16 src_mac[3]; 5118 + __le16 src_qp_low; 5119 + u8 cqe_type_toggle; 5120 + #define CQ_RES_UD_CFA_V2_TOGGLE 0x1UL 5121 + #define CQ_RES_UD_CFA_V2_CQE_TYPE_MASK 0x1eUL 5122 + #define CQ_RES_UD_CFA_V2_CQE_TYPE_SFT 1 5123 + #define CQ_RES_UD_CFA_V2_CQE_TYPE_RES_UD_CFA (0x4UL << 1) 5124 + #define CQ_RES_UD_CFA_V2_CQE_TYPE_LAST CQ_RES_UD_CFA_V2_CQE_TYPE_RES_UD_CFA 5125 + u8 status; 5126 + #define CQ_RES_UD_CFA_V2_STATUS_OK 0x0UL 5127 + #define CQ_RES_UD_CFA_V2_STATUS_LOCAL_ACCESS_ERROR 0x1UL 5128 + #define CQ_RES_UD_CFA_V2_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 5129 + #define CQ_RES_UD_CFA_V2_STATUS_LOCAL_PROTECTION_ERR 0x3UL 5130 + #define CQ_RES_UD_CFA_V2_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 5131 + #define CQ_RES_UD_CFA_V2_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 5132 + #define CQ_RES_UD_CFA_V2_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 5133 + #define CQ_RES_UD_CFA_V2_STATUS_HW_FLUSH_ERR 0x8UL 5134 + #define CQ_RES_UD_CFA_V2_STATUS_LAST CQ_RES_UD_CFA_V2_STATUS_HW_FLUSH_ERR 5135 + __le16 flags; 5136 + #define CQ_RES_UD_CFA_V2_FLAGS_SRQ 0x1UL 5137 + #define CQ_RES_UD_CFA_V2_FLAGS_SRQ_RQ 0x0UL 5138 + #define CQ_RES_UD_CFA_V2_FLAGS_SRQ_SRQ 0x1UL 5139 + #define CQ_RES_UD_CFA_V2_FLAGS_SRQ_LAST CQ_RES_UD_CFA_V2_FLAGS_SRQ_SRQ 5140 + #define CQ_RES_UD_CFA_V2_FLAGS_IMM 0x2UL 5141 + #define CQ_RES_UD_CFA_V2_FLAGS_UNUSED_MASK 0xcUL 5142 + #define CQ_RES_UD_CFA_V2_FLAGS_UNUSED_SFT 2 5143 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_MASK 0x30UL 5144 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_SFT 4 5145 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_V1 (0x0UL << 4) 5146 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_V2IPV4 (0x2UL << 4) 5147 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_V2IPV6 (0x3UL << 4) 5148 + #define CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_LAST CQ_RES_UD_CFA_V2_FLAGS_ROCE_IP_VER_V2IPV6 5149 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_MASK 0x3c0UL 5150 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_SFT 6 5151 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_NONE (0x0UL << 6) 5152 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_ACT_REC_PTR (0x1UL << 6) 5153 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_TUNNEL_ID (0x2UL << 6) 5154 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_CHDR_DATA (0x3UL << 6) 5155 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_HDR_OFFSET (0x4UL << 6) 5156 + #define CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_LAST \ 5157 + CQ_RES_UD_CFA_V2_FLAGS_META_FORMAT_HDR_OFFSET 5158 + __le32 src_qp_high_srq_or_rq_wr_id; 5159 + #define CQ_RES_UD_CFA_V2_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 5160 + #define CQ_RES_UD_CFA_V2_SRQ_OR_RQ_WR_ID_SFT 0 5161 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_MASK 0xf00000UL 5162 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_SFT 20 5163 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_MASK 0x700000UL 5164 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_SFT 20 5165 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPID88A8 (0x0UL << 20) 5166 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPID8100 (0x1UL << 20) 5167 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPID9100 (0x2UL << 20) 5168 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPID9200 (0x3UL << 20) 5169 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPID9300 (0x4UL << 20) 5170 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPIDCFG (0x5UL << 20) 5171 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_LAST \ 5172 + CQ_RES_UD_CFA_V2_CFA_METADATA1_TPID_SEL_TPIDCFG 5173 + #define CQ_RES_UD_CFA_V2_CFA_METADATA1_VALID 0x800000UL 5174 + #define CQ_RES_UD_CFA_V2_SRC_QP_HIGH_MASK 0xff000000UL 5175 + #define CQ_RES_UD_CFA_V2_SRC_QP_HIGH_SFT 24 5176 + }; 5177 + 5178 + /* cq_res_raweth_qp1 (size:256b/32B) */ 5179 + struct cq_res_raweth_qp1 { 5180 + __le16 length; 5181 + #define CQ_RES_RAWETH_QP1_LENGTH_MASK 0x3fffUL 5182 + #define CQ_RES_RAWETH_QP1_LENGTH_SFT 0 5183 + __le16 raweth_qp1_flags; 5184 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_MASK 0x3ffUL 5185 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_SFT 0 5186 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ERROR 0x1UL 5187 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_MASK 0x3c0UL 5188 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_SFT 6 5189 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_NOT_KNOWN (0x0UL << 6) 5190 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_IP (0x1UL << 6) 5191 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_TCP (0x2UL << 6) 5192 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_UDP (0x3UL << 6) 5193 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_FCOE (0x4UL << 6) 5194 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ROCE (0x5UL << 6) 5195 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ICMP (0x7UL << 6) 5196 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_WO_TIMESTAMP (0x8UL << 6) 5197 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP (0x9UL << 6) 5198 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_LAST \ 5199 + CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP 5200 + __le16 raweth_qp1_errors; 5201 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_IP_CS_ERROR 0x10UL 5202 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_L4_CS_ERROR 0x20UL 5203 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_IP_CS_ERROR 0x40UL 5204 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_L4_CS_ERROR 0x80UL 5205 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_CRC_ERROR 0x100UL 5206 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_MASK 0xe00UL 5207 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_SFT 9 5208 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_NO_ERROR (0x0UL << 9) 5209 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION (0x1UL << 9) 5210 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN (0x2UL << 9) 5211 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR (0x3UL << 9) 5212 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR (0x4UL << 9) 5213 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR (0x5UL << 9) 5214 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL (0x6UL << 9) 5215 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_LAST \ 5216 + CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL 5217 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_MASK 0xf000UL 5218 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_SFT 12 5219 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_NO_ERROR (0x0UL << 12) 5220 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_VERSION (0x1UL << 12) 5221 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN (0x2UL << 12) 5222 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_TTL (0x3UL << 12) 5223 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_IP_TOTAL_ERROR (0x4UL << 12) 5224 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR (0x5UL << 12) 5225 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN (0x6UL << 12) 5226 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL (0x7UL << 12) 5227 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN (0x8UL << 12) 5228 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_LAST \ 5229 + CQ_RES_RAWETH_QP1_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN 5230 + __le16 raweth_qp1_cfa_code; 5231 + __le64 qp_handle; 5232 + __le32 raweth_qp1_flags2; 5233 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_CS_CALC 0x1UL 5234 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_L4_CS_CALC 0x2UL 5235 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_T_IP_CS_CALC 0x4UL 5236 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_T_L4_CS_CALC 0x8UL 5237 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_MASK 0xf0UL 5238 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_SFT 4 5239 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_NONE (0x0UL << 4) 5240 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN (0x1UL << 4) 5241 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_TUNNEL_ID (0x2UL << 4) 5242 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_CHDR_DATA (0x3UL << 4) 5243 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_HDR_OFFSET (0x4UL << 4) 5244 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_LAST \ 5245 + CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_HDR_OFFSET 5246 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_TYPE 0x100UL 5247 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_CALC 0x200UL 5248 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_EXT_META_FORMAT_MASK 0xc00UL 5249 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_EXT_META_FORMAT_SFT 10 5250 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_MASK 0xffff0000UL 5251 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_SFT 16 5252 + __le32 raweth_qp1_metadata; 5253 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_DE_VID_MASK 0xffffUL 5254 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_DE_VID_SFT 0 5255 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_MASK 0xfffUL 5256 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_SFT 0 5257 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_DE 0x1000UL 5258 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_MASK 0xe000UL 5259 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_SFT 13 5260 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_MASK 0xffff0000UL 5261 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_SFT 16 5262 + u8 cqe_type_toggle; 5263 + #define CQ_RES_RAWETH_QP1_TOGGLE 0x1UL 5264 + #define CQ_RES_RAWETH_QP1_CQE_TYPE_MASK 0x1eUL 5265 + #define CQ_RES_RAWETH_QP1_CQE_TYPE_SFT 1 5266 + #define CQ_RES_RAWETH_QP1_CQE_TYPE_RES_RAWETH_QP1 (0x3UL << 1) 5267 + #define CQ_RES_RAWETH_QP1_CQE_TYPE_LAST CQ_RES_RAWETH_QP1_CQE_TYPE_RES_RAWETH_QP1 5268 + u8 status; 5269 + #define CQ_RES_RAWETH_QP1_STATUS_OK 0x0UL 5270 + #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_ACCESS_ERROR 0x1UL 5271 + #define CQ_RES_RAWETH_QP1_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 5272 + #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_PROTECTION_ERR 0x3UL 5273 + #define CQ_RES_RAWETH_QP1_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 5274 + #define CQ_RES_RAWETH_QP1_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 5275 + #define CQ_RES_RAWETH_QP1_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 5276 + #define CQ_RES_RAWETH_QP1_STATUS_HW_FLUSH_ERR 0x8UL 5277 + #define CQ_RES_RAWETH_QP1_STATUS_LAST CQ_RES_RAWETH_QP1_STATUS_HW_FLUSH_ERR 5278 + __le16 flags; 5279 + #define CQ_RES_RAWETH_QP1_FLAGS_SRQ 0x1UL 5280 + #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_RQ 0x0UL 5281 + #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_SRQ 0x1UL 5282 + #define CQ_RES_RAWETH_QP1_FLAGS_SRQ_LAST CQ_RES_RAWETH_QP1_FLAGS_SRQ_SRQ 5283 + __le32 raweth_qp1_payload_offset_srq_or_rq_wr_id; 5284 + #define CQ_RES_RAWETH_QP1_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 5285 + #define CQ_RES_RAWETH_QP1_SRQ_OR_RQ_WR_ID_SFT 0 5286 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_PAYLOAD_OFFSET_MASK 0xff000000UL 5287 + #define CQ_RES_RAWETH_QP1_RAWETH_QP1_PAYLOAD_OFFSET_SFT 24 5288 + }; 5289 + 5290 + /* cq_res_raweth_qp1_v2 (size:256b/32B) */ 5291 + struct cq_res_raweth_qp1_v2 { 5292 + __le16 length; 5293 + #define CQ_RES_RAWETH_QP1_V2_LENGTH_MASK 0x3fffUL 5294 + #define CQ_RES_RAWETH_QP1_V2_LENGTH_SFT 0 5295 + __le16 raweth_qp1_flags; 5296 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_MASK 0x3ffUL 5297 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_SFT 0 5298 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ERROR 0x1UL 5299 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_MASK 0x3c0UL 5300 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_SFT 6 5301 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_NOT_KNOWN (0x0UL << 6) 5302 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_IP (0x1UL << 6) 5303 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_TCP (0x2UL << 6) 5304 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_UDP (0x3UL << 6) 5305 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_FCOE (0x4UL << 6) 5306 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_ROCE (0x5UL << 6) 5307 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_ICMP (0x7UL << 6) 5308 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_PTP_WO_TIMESTAMP (0x8UL << 6) 5309 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP (0x9UL << 6) 5310 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_LAST \ 5311 + CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS_ITYPE_PTP_W_TIMESTAMP 5312 + __le16 raweth_qp1_errors; 5313 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_IP_CS_ERROR 0x10UL 5314 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_L4_CS_ERROR 0x20UL 5315 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_IP_CS_ERROR 0x40UL 5316 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_L4_CS_ERROR 0x80UL 5317 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_CRC_ERROR 0x100UL 5318 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_MASK 0xe00UL 5319 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_SFT 9 5320 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_NO_ERROR (0x0UL << 9) 5321 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION (0x1UL << 9) 5322 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN (0x2UL << 9) 5323 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR (0x3UL << 9) 5324 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR (0x4UL << 9) 5325 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR (0x5UL << 9) 5326 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL (0x6UL << 9) 5327 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_LAST \ 5328 + CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL 5329 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_MASK 0xf000UL 5330 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_SFT 12 5331 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_NO_ERROR (0x0UL << 12) 5332 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_VERSION (0x1UL << 12) 5333 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN (0x2UL << 12) 5334 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L3_BAD_TTL (0x3UL << 12) 5335 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_IP_TOTAL_ERROR (0x4UL << 12) 5336 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR (0x5UL << 12) 5337 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN (0x6UL << 12) 5338 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL \ 5339 + (0x7UL << 12) 5340 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN \ 5341 + (0x8UL << 12) 5342 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_LAST \ 5343 + CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN 5344 + __le16 cfa_metadata0; 5345 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA0_VID_MASK 0xfffUL 5346 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA0_VID_SFT 0 5347 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA0_DE 0x1000UL 5348 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA0_PRI_MASK 0xe000UL 5349 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA0_PRI_SFT 13 5350 + __le64 qp_handle; 5351 + __le32 raweth_qp1_flags2; 5352 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_CS_ALL_OK_MODE 0x8UL 5353 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_MASK 0xf0UL 5354 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_SFT 4 5355 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_NONE (0x0UL << 4) 5356 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_ACT_REC_PTR (0x1UL << 4) 5357 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_TUNNEL_ID (0x2UL << 4) 5358 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_CHDR_DATA (0x3UL << 4) 5359 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_HDR_OFFSET (0x4UL << 4) 5360 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_LAST \ 5361 + CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_META_FORMAT_HDR_OFFSET 5362 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_IP_TYPE 0x100UL 5363 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_CALC 0x200UL 5364 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_CS_OK_MASK 0xfc00UL 5365 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_CS_OK_SFT 10 5366 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_MASK 0xffff0000UL 5367 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_FLAGS2_COMPLETE_CHECKSUM_SFT 16 5368 + __le32 cfa_metadata2; 5369 + u8 cqe_type_toggle; 5370 + #define CQ_RES_RAWETH_QP1_V2_TOGGLE 0x1UL 5371 + #define CQ_RES_RAWETH_QP1_V2_CQE_TYPE_MASK 0x1eUL 5372 + #define CQ_RES_RAWETH_QP1_V2_CQE_TYPE_SFT 1 5373 + #define CQ_RES_RAWETH_QP1_V2_CQE_TYPE_RES_RAWETH_QP1 (0x3UL << 1) 5374 + #define CQ_RES_RAWETH_QP1_V2_CQE_TYPE_LAST CQ_RES_RAWETH_QP1_V2_CQE_TYPE_RES_RAWETH_QP1 5375 + u8 status; 5376 + #define CQ_RES_RAWETH_QP1_V2_STATUS_OK 0x0UL 5377 + #define CQ_RES_RAWETH_QP1_V2_STATUS_LOCAL_ACCESS_ERROR 0x1UL 5378 + #define CQ_RES_RAWETH_QP1_V2_STATUS_HW_LOCAL_LENGTH_ERR 0x2UL 5379 + #define CQ_RES_RAWETH_QP1_V2_STATUS_LOCAL_PROTECTION_ERR 0x3UL 5380 + #define CQ_RES_RAWETH_QP1_V2_STATUS_LOCAL_QP_OPERATION_ERR 0x4UL 5381 + #define CQ_RES_RAWETH_QP1_V2_STATUS_MEMORY_MGT_OPERATION_ERR 0x5UL 5382 + #define CQ_RES_RAWETH_QP1_V2_STATUS_WORK_REQUEST_FLUSHED_ERR 0x7UL 5383 + #define CQ_RES_RAWETH_QP1_V2_STATUS_HW_FLUSH_ERR 0x8UL 5384 + #define CQ_RES_RAWETH_QP1_V2_STATUS_LAST CQ_RES_RAWETH_QP1_V2_STATUS_HW_FLUSH_ERR 5385 + __le16 flags; 5386 + #define CQ_RES_RAWETH_QP1_V2_FLAGS_SRQ 0x1UL 5387 + #define CQ_RES_RAWETH_QP1_V2_FLAGS_SRQ_RQ 0x0UL 5388 + #define CQ_RES_RAWETH_QP1_V2_FLAGS_SRQ_SRQ 0x1UL 5389 + #define CQ_RES_RAWETH_QP1_V2_FLAGS_SRQ_LAST CQ_RES_RAWETH_QP1_V2_FLAGS_SRQ_SRQ 5390 + __le32 raweth_qp1_payload_offset_srq_or_rq_wr_id; 5391 + #define CQ_RES_RAWETH_QP1_V2_SRQ_OR_RQ_WR_ID_MASK 0xfffffUL 5392 + #define CQ_RES_RAWETH_QP1_V2_SRQ_OR_RQ_WR_ID_SFT 0 5393 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_MASK 0xf00000UL 5394 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_SFT 20 5395 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_MASK 0x700000UL 5396 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_SFT 20 5397 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPID88A8 (0x0UL << 20) 5398 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPID8100 (0x1UL << 20) 5399 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPID9100 (0x2UL << 20) 5400 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPID9200 (0x3UL << 20) 5401 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPID9300 (0x4UL << 20) 5402 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPIDCFG (0x5UL << 20) 5403 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_LAST \ 5404 + CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_TPID_SEL_TPIDCFG 5405 + #define CQ_RES_RAWETH_QP1_V2_CFA_METADATA1_VALID 0x800000UL 5406 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_PAYLOAD_OFFSET_MASK 0xff000000UL 5407 + #define CQ_RES_RAWETH_QP1_V2_RAWETH_QP1_PAYLOAD_OFFSET_SFT 24 5408 + }; 5409 + 5410 + /* cq_terminal (size:256b/32B) */ 5411 + struct cq_terminal { 5412 + __le64 qp_handle; 5413 + __le16 sq_cons_idx; 5414 + __le16 rq_cons_idx; 5415 + __le32 reserved32_1; 5416 + __le64 reserved64_3; 5417 + u8 cqe_type_toggle; 5418 + #define CQ_TERMINAL_TOGGLE 0x1UL 5419 + #define CQ_TERMINAL_CQE_TYPE_MASK 0x1eUL 5420 + #define CQ_TERMINAL_CQE_TYPE_SFT 1 5421 + #define CQ_TERMINAL_CQE_TYPE_TERMINAL (0xeUL << 1) 5422 + #define CQ_TERMINAL_CQE_TYPE_LAST CQ_TERMINAL_CQE_TYPE_TERMINAL 5423 + u8 status; 5424 + #define CQ_TERMINAL_STATUS_OK 0x0UL 5425 + #define CQ_TERMINAL_STATUS_LAST CQ_TERMINAL_STATUS_OK 5426 + __le16 reserved16; 5427 + __le32 reserved32_2; 5428 + }; 5429 + 5430 + /* cq_cutoff (size:256b/32B) */ 5431 + struct cq_cutoff { 5432 + __le64 reserved64_1; 5433 + __le64 reserved64_2; 5434 + __le64 reserved64_3; 5435 + u8 cqe_type_toggle; 5436 + #define CQ_CUTOFF_TOGGLE 0x1UL 5437 + #define CQ_CUTOFF_CQE_TYPE_MASK 0x1eUL 5438 + #define CQ_CUTOFF_CQE_TYPE_SFT 1 5439 + #define CQ_CUTOFF_CQE_TYPE_CUT_OFF (0xfUL << 1) 5440 + #define CQ_CUTOFF_CQE_TYPE_LAST CQ_CUTOFF_CQE_TYPE_CUT_OFF 5441 + u8 status; 5442 + #define CQ_CUTOFF_STATUS_OK 0x0UL 5443 + #define CQ_CUTOFF_STATUS_LAST CQ_CUTOFF_STATUS_OK 5444 + __le16 reserved16; 5445 + __le32 reserved32; 5446 + }; 5447 + 5448 + /* nq_base (size:128b/16B) */ 5449 + struct nq_base { 5450 + __le16 info10_type; 5451 + #define NQ_BASE_TYPE_MASK 0x3fUL 5452 + #define NQ_BASE_TYPE_SFT 0 5453 + #define NQ_BASE_TYPE_CQ_NOTIFICATION 0x30UL 5454 + #define NQ_BASE_TYPE_SRQ_EVENT 0x32UL 5455 + #define NQ_BASE_TYPE_DBQ_EVENT 0x34UL 5456 + #define NQ_BASE_TYPE_QP_EVENT 0x38UL 5457 + #define NQ_BASE_TYPE_FUNC_EVENT 0x3aUL 5458 + #define NQ_BASE_TYPE_LAST NQ_BASE_TYPE_FUNC_EVENT 5459 + #define NQ_BASE_INFO10_MASK 0xffc0UL 5460 + #define NQ_BASE_INFO10_SFT 6 5461 + __le16 info16; 5462 + __le32 info32; 5463 + __le32 info63_v[2]; 5464 + #define NQ_BASE_V 0x1UL 5465 + #define NQ_BASE_INFO63_MASK 0xfffffffeUL 5466 + #define NQ_BASE_INFO63_SFT 1 5467 + }; 5468 + 5469 + /* nq_cn (size:128b/16B) */ 5470 + struct nq_cn { 5471 + __le16 type; 5472 + #define NQ_CN_TYPE_MASK 0x3fUL 5473 + #define NQ_CN_TYPE_SFT 0 5474 + #define NQ_CN_TYPE_CQ_NOTIFICATION 0x30UL 5475 + #define NQ_CN_TYPE_LAST NQ_CN_TYPE_CQ_NOTIFICATION 5476 + #define NQ_CN_TOGGLE_MASK 0xc0UL 5477 + #define NQ_CN_TOGGLE_SFT 6 5478 + __le16 reserved16; 5479 + __le32 cq_handle_low; 5480 + __le32 v; 5481 + #define NQ_CN_V 0x1UL 5482 + __le32 cq_handle_high; 5483 + }; 5484 + 5485 + /* nq_srq_event (size:128b/16B) */ 5486 + struct nq_srq_event { 5487 + u8 type; 5488 + #define NQ_SRQ_EVENT_TYPE_MASK 0x3fUL 5489 + #define NQ_SRQ_EVENT_TYPE_SFT 0 5490 + #define NQ_SRQ_EVENT_TYPE_SRQ_EVENT 0x32UL 5491 + #define NQ_SRQ_EVENT_TYPE_LAST NQ_SRQ_EVENT_TYPE_SRQ_EVENT 5492 + u8 event; 5493 + #define NQ_SRQ_EVENT_EVENT_SRQ_THRESHOLD_EVENT 0x1UL 5494 + #define NQ_SRQ_EVENT_EVENT_LAST NQ_SRQ_EVENT_EVENT_SRQ_THRESHOLD_EVENT 5495 + __le16 reserved16; 5496 + __le32 srq_handle_low; 5497 + __le32 v; 5498 + #define NQ_SRQ_EVENT_V 0x1UL 5499 + __le32 srq_handle_high; 5500 + }; 5501 + 5502 + /* nq_dbq_event (size:128b/16B) */ 5503 + struct nq_dbq_event { 5504 + u8 type; 5505 + #define NQ_DBQ_EVENT_TYPE_MASK 0x3fUL 5506 + #define NQ_DBQ_EVENT_TYPE_SFT 0 5507 + #define NQ_DBQ_EVENT_TYPE_DBQ_EVENT 0x34UL 5508 + #define NQ_DBQ_EVENT_TYPE_LAST NQ_DBQ_EVENT_TYPE_DBQ_EVENT 5509 + u8 event; 5510 + #define NQ_DBQ_EVENT_EVENT_DBQ_THRESHOLD_EVENT 0x1UL 5511 + #define NQ_DBQ_EVENT_EVENT_LAST NQ_DBQ_EVENT_EVENT_DBQ_THRESHOLD_EVENT 5512 + __le16 db_pfid; 5513 + #define NQ_DBQ_EVENT_DB_PFID_MASK 0xfUL 5514 + #define NQ_DBQ_EVENT_DB_PFID_SFT 0 5515 + __le32 db_dpi; 5516 + #define NQ_DBQ_EVENT_DB_DPI_MASK 0xfffffUL 5517 + #define NQ_DBQ_EVENT_DB_DPI_SFT 0 5518 + __le32 v; 5519 + #define NQ_DBQ_EVENT_V 0x1UL 5520 + __le32 db_type_db_xid; 5521 + #define NQ_DBQ_EVENT_DB_XID_MASK 0xfffffUL 5522 + #define NQ_DBQ_EVENT_DB_XID_SFT 0 5523 + #define NQ_DBQ_EVENT_DB_TYPE_MASK 0xf0000000UL 5524 + #define NQ_DBQ_EVENT_DB_TYPE_SFT 28 5525 + }; 5526 + 5527 + /* xrrq_irrq (size:256b/32B) */ 5528 + struct xrrq_irrq { 5529 + __le16 credits_type; 5530 + #define XRRQ_IRRQ_TYPE 0x1UL 5531 + #define XRRQ_IRRQ_TYPE_READ_REQ 0x0UL 5532 + #define XRRQ_IRRQ_TYPE_ATOMIC_REQ 0x1UL 5533 + #define XRRQ_IRRQ_TYPE_LAST XRRQ_IRRQ_TYPE_ATOMIC_REQ 5534 + #define XRRQ_IRRQ_CREDITS_MASK 0xf800UL 5535 + #define XRRQ_IRRQ_CREDITS_SFT 11 5536 + __le16 reserved16; 5537 + __le32 reserved32; 5538 + __le32 psn; 5539 + #define XRRQ_IRRQ_PSN_MASK 0xffffffUL 5540 + #define XRRQ_IRRQ_PSN_SFT 0 5541 + __le32 msn; 5542 + #define XRRQ_IRRQ_MSN_MASK 0xffffffUL 5543 + #define XRRQ_IRRQ_MSN_SFT 0 5544 + __le64 va_or_atomic_result; 5545 + __le32 rdma_r_key; 5546 + __le32 length; 5547 + }; 5548 + 5549 + /* xrrq_orrq (size:256b/32B) */ 5550 + struct xrrq_orrq { 5551 + __le16 num_sges_type; 5552 + #define XRRQ_ORRQ_TYPE 0x1UL 5553 + #define XRRQ_ORRQ_TYPE_READ_REQ 0x0UL 5554 + #define XRRQ_ORRQ_TYPE_ATOMIC_REQ 0x1UL 5555 + #define XRRQ_ORRQ_TYPE_LAST XRRQ_ORRQ_TYPE_ATOMIC_REQ 5556 + #define XRRQ_ORRQ_NUM_SGES_MASK 0xf800UL 5557 + #define XRRQ_ORRQ_NUM_SGES_SFT 11 5558 + __le16 reserved16; 5559 + __le32 length; 5560 + __le32 psn; 5561 + #define XRRQ_ORRQ_PSN_MASK 0xffffffUL 5562 + #define XRRQ_ORRQ_PSN_SFT 0 5563 + __le32 end_psn; 5564 + #define XRRQ_ORRQ_END_PSN_MASK 0xffffffUL 5565 + #define XRRQ_ORRQ_END_PSN_SFT 0 5566 + __le64 first_sge_phy_or_sing_sge_va; 5567 + __le32 single_sge_l_key; 5568 + __le32 single_sge_size; 5569 + }; 5570 + 5571 + /* ptu_pte (size:64b/8B) */ 5572 + struct ptu_pte { 5573 + __le32 page_next_to_last_last_valid[2]; 5574 + #define PTU_PTE_VALID 0x1UL 5575 + #define PTU_PTE_LAST 0x2UL 5576 + #define PTU_PTE_NEXT_TO_LAST 0x4UL 5577 + #define PTU_PTE_UNUSED_MASK 0xff8UL 5578 + #define PTU_PTE_UNUSED_SFT 3 5579 + #define PTU_PTE_PAGE_MASK 0xfffff000UL 5580 + #define PTU_PTE_PAGE_SFT 12 5581 + }; 5582 + 5583 + /* ptu_pde (size:64b/8B) */ 5584 + struct ptu_pde { 5585 + __le32 page_valid[2]; 5586 + #define PTU_PDE_VALID 0x1UL 5587 + #define PTU_PDE_UNUSED_MASK 0xffeUL 5588 + #define PTU_PDE_UNUSED_SFT 1 5589 + #define PTU_PDE_PAGE_MASK 0xfffff000UL 5590 + #define PTU_PDE_PAGE_SFT 12 5591 + }; 5592 + 5593 + #endif /* ___BNXT_RE_HSI_H__ */
+13 -4
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 2 /* 3 - * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #ifndef _EFA_ADMIN_CMDS_H_ ··· 376 376 * 0 : local_write_enable - Local write permissions: 377 377 * must be set for RQ buffers and buffers posted for 378 378 * RDMA Read requests 379 - * 1 : reserved1 - MBZ 379 + * 1 : remote_write_enable - Remote write 380 + * permissions: must be set to enable RDMA write to 381 + * the region 380 382 * 2 : remote_read_enable - Remote read permissions: 381 383 * must be set to enable RDMA read from the region 382 384 * 7:3 : reserved2 - MBZ ··· 620 618 * TX queues 621 619 * 1 : rnr_retry - If set, RNR retry is supported on 622 620 * modify QP command 623 - * 31:2 : reserved - MBZ 621 + * 2 : data_polling_128 - If set, 128 bytes data 622 + * polling is supported 623 + * 3 : rdma_write - If set, RDMA Write is supported 624 + * on TX queues 625 + * 31:4 : reserved - MBZ 624 626 */ 625 627 u32 device_caps; 626 628 ··· 678 672 /* The maximum size of LLQ in bytes */ 679 673 u32 max_llq_size; 680 674 681 - /* Maximum number of SGEs for a single RDMA read WQE */ 675 + /* Maximum number of SGEs for a single RDMA read/write WQE */ 682 676 u16 max_wr_rdma_sges; 683 677 684 678 /* ··· 983 977 #define EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT_MASK GENMASK(4, 0) 984 978 #define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_MASK BIT(7) 985 979 #define EFA_ADMIN_REG_MR_CMD_LOCAL_WRITE_ENABLE_MASK BIT(0) 980 + #define EFA_ADMIN_REG_MR_CMD_REMOTE_WRITE_ENABLE_MASK BIT(1) 986 981 #define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_MASK BIT(2) 987 982 988 983 /* create_cq_cmd */ ··· 998 991 /* feature_device_attr_desc */ 999 992 #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_READ_MASK BIT(0) 1000 993 #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RNR_RETRY_MASK BIT(1) 994 + #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_DATA_POLLING_128_MASK BIT(2) 995 + #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_WRITE_MASK BIT(3) 1001 996 1002 997 /* create_eq_cmd */ 1003 998 #define EFA_ADMIN_CREATE_EQ_CMD_ENTRY_SIZE_WORDS_MASK GENMASK(4, 0)
+29 -13
drivers/infiniband/hw/efa/efa_io_defs.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 2 /* 3 - * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #ifndef _EFA_IO_H_ ··· 23 23 EFA_IO_SEND = 0, 24 24 /* RDMA read */ 25 25 EFA_IO_RDMA_READ = 1, 26 + /* RDMA write */ 27 + EFA_IO_RDMA_WRITE = 2, 26 28 }; 27 29 28 30 enum efa_io_comp_status { ··· 64 62 65 63 /* 66 64 * control flags 67 - * 3:0 : op_type - operation type: send/rdma/fast mem 68 - * ops/etc 65 + * 3:0 : op_type - enum efa_io_send_op_type 69 66 * 4 : has_imm - immediate_data field carries valid 70 67 * data. 71 68 * 5 : inline_msg - inline mode - inline message data ··· 220 219 * 2:1 : q_type - enum efa_io_queue_type: send/recv 221 220 * 3 : has_imm - indicates that immediate data is 222 221 * present - for RX completions only 223 - * 7:4 : reserved28 - MBZ 222 + * 6:4 : op_type - enum efa_io_send_op_type 223 + * 7 : reserved31 - MBZ 224 224 */ 225 225 u8 flags; 226 226 227 227 /* local QP number */ 228 228 u16 qp_num; 229 - 230 - /* Transferred length */ 231 - u16 length; 232 229 }; 233 230 234 231 /* Tx completion descriptor */ 235 232 struct efa_io_tx_cdesc { 236 233 /* Common completion info */ 237 234 struct efa_io_cdesc_common common; 235 + 236 + /* MBZ */ 237 + u16 reserved16; 238 238 }; 239 239 240 240 /* Rx Completion Descriptor */ 241 241 struct efa_io_rx_cdesc { 242 242 /* Common completion info */ 243 243 struct efa_io_cdesc_common common; 244 + 245 + /* Transferred length bits[15:0] */ 246 + u16 length; 244 247 245 248 /* Remote Address Handle FW index, 0xFFFF indicates invalid ah */ 246 249 u16 ah; ··· 255 250 u32 imm; 256 251 }; 257 252 253 + /* Rx Completion Descriptor RDMA write info */ 254 + struct efa_io_rx_cdesc_rdma_write { 255 + /* Transferred length bits[31:16] */ 256 + u16 length_hi; 257 + }; 258 + 258 259 /* Extended Rx Completion Descriptor */ 259 260 struct efa_io_rx_cdesc_ex { 260 261 /* Base RX completion info */ 261 - struct efa_io_rx_cdesc rx_cdesc_base; 262 + struct efa_io_rx_cdesc base; 262 263 263 - /* 264 - * Valid only in case of unknown AH (0xFFFF) and CQ set_src_addr is 265 - * enabled. 266 - */ 267 - u8 src_addr[16]; 264 + union { 265 + struct efa_io_rx_cdesc_rdma_write rdma_write; 266 + 267 + /* 268 + * Valid only in case of unknown AH (0xFFFF) and CQ 269 + * set_src_addr is enabled. 270 + */ 271 + u8 src_addr[16]; 272 + } u; 268 273 }; 269 274 270 275 /* tx_meta_desc */ ··· 300 285 #define EFA_IO_CDESC_COMMON_PHASE_MASK BIT(0) 301 286 #define EFA_IO_CDESC_COMMON_Q_TYPE_MASK GENMASK(2, 1) 302 287 #define EFA_IO_CDESC_COMMON_HAS_IMM_MASK BIT(3) 288 + #define EFA_IO_CDESC_COMMON_OP_TYPE_MASK GENMASK(6, 4) 303 289 304 290 #endif /* _EFA_IO_H_ */
+9 -2
drivers/infiniband/hw/efa/efa_verbs.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2 2 /* 3 - * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #include <linux/dma-buf.h> ··· 249 249 250 250 if (EFA_DEV_CAP(dev, RNR_RETRY)) 251 251 resp.device_caps |= EFA_QUERY_DEVICE_CAPS_RNR_RETRY; 252 + 253 + if (EFA_DEV_CAP(dev, DATA_POLLING_128)) 254 + resp.device_caps |= EFA_QUERY_DEVICE_CAPS_DATA_POLLING_128; 255 + 256 + if (EFA_DEV_CAP(dev, RDMA_WRITE)) 257 + resp.device_caps |= EFA_QUERY_DEVICE_CAPS_RDMA_WRITE; 252 258 253 259 if (dev->neqs) 254 260 resp.device_caps |= EFA_QUERY_DEVICE_CAPS_CQ_NOTIFICATIONS; ··· 1575 1569 1576 1570 supp_access_flags = 1577 1571 IB_ACCESS_LOCAL_WRITE | 1578 - (EFA_DEV_CAP(dev, RDMA_READ) ? IB_ACCESS_REMOTE_READ : 0); 1572 + (EFA_DEV_CAP(dev, RDMA_READ) ? IB_ACCESS_REMOTE_READ : 0) | 1573 + (EFA_DEV_CAP(dev, RDMA_WRITE) ? IB_ACCESS_REMOTE_WRITE : 0); 1579 1574 1580 1575 access_flags &= ~IB_ACCESS_OPTIONAL; 1581 1576 if (access_flags & ~supp_access_flags) {
+1 -1
drivers/infiniband/hw/erdma/erdma.h
··· 32 32 atomic64_t event_num; 33 33 atomic64_t notify_num; 34 34 35 - u64 __iomem *db_addr; 35 + void __iomem *db; 36 36 u64 *db_record; 37 37 }; 38 38
+5 -5
drivers/infiniband/hw/erdma/erdma_cm.h
··· 33 33 * MPA request/response Hdr bits & fields 34 34 */ 35 35 enum { 36 - MPA_RR_FLAG_MARKERS = __cpu_to_be16(0x8000), 37 - MPA_RR_FLAG_CRC = __cpu_to_be16(0x4000), 38 - MPA_RR_FLAG_REJECT = __cpu_to_be16(0x2000), 39 - MPA_RR_RESERVED = __cpu_to_be16(0x1f00), 40 - MPA_RR_MASK_REVISION = __cpu_to_be16(0x00ff) 36 + MPA_RR_FLAG_MARKERS = cpu_to_be16(0x8000), 37 + MPA_RR_FLAG_CRC = cpu_to_be16(0x4000), 38 + MPA_RR_FLAG_REJECT = cpu_to_be16(0x2000), 39 + MPA_RR_RESERVED = cpu_to_be16(0x1f00), 40 + MPA_RR_MASK_REVISION = cpu_to_be16(0x00ff) 41 41 }; 42 42 43 43 /*
+7 -35
drivers/infiniband/hw/erdma/erdma_cmdq.c
··· 166 166 spin_lock_init(&eq->lock); 167 167 atomic64_set(&eq->event_num, 0); 168 168 169 - eq->db_addr = 170 - (u64 __iomem *)(dev->func_bar + ERDMA_REGS_CEQ_DB_BASE_REG); 169 + eq->db = dev->func_bar + ERDMA_REGS_CEQ_DB_BASE_REG; 171 170 eq->db_record = (u64 *)(eq->qbuf + buf_size); 172 171 173 172 erdma_reg_write32(dev, ERDMA_REGS_CMDQ_EQ_ADDR_H_REG, ··· 182 183 183 184 int erdma_cmdq_init(struct erdma_dev *dev) 184 185 { 185 - int err, i; 186 186 struct erdma_cmdq *cmdq = &dev->cmdq; 187 - u32 sts, ctrl; 187 + int err; 188 188 189 189 cmdq->max_outstandings = ERDMA_CMDQ_MAX_OUTSTANDING; 190 190 cmdq->use_event = false; ··· 206 208 if (err) 207 209 goto err_destroy_cq; 208 210 209 - ctrl = FIELD_PREP(ERDMA_REG_DEV_CTRL_INIT_MASK, 1); 210 - erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG, ctrl); 211 - 212 - for (i = 0; i < ERDMA_WAIT_DEV_DONE_CNT; i++) { 213 - sts = erdma_reg_read32_filed(dev, ERDMA_REGS_DEV_ST_REG, 214 - ERDMA_REG_DEV_ST_INIT_DONE_MASK); 215 - if (sts) 216 - break; 217 - 218 - msleep(ERDMA_REG_ACCESS_WAIT_MS); 219 - } 220 - 221 - if (i == ERDMA_WAIT_DEV_DONE_CNT) { 222 - dev_err(&dev->pdev->dev, "wait init done failed.\n"); 223 - err = -ETIMEDOUT; 224 - goto err_destroy_eq; 225 - } 226 - 227 211 set_bit(ERDMA_CMDQ_STATE_OK_BIT, &cmdq->state); 228 212 229 213 return 0; 230 - 231 - err_destroy_eq: 232 - dma_free_coherent(&dev->pdev->dev, 233 - (cmdq->eq.depth << EQE_SHIFT) + 234 - ERDMA_EXTRA_BUFFER_SIZE, 235 - cmdq->eq.qbuf, cmdq->eq.qbuf_dma_addr); 236 214 237 215 err_destroy_cq: 238 216 dma_free_coherent(&dev->pdev->dev, ··· 257 283 __be32 *cqe = get_queue_entry(cmdq->cq.qbuf, cmdq->cq.ci, 258 284 cmdq->cq.depth, CQE_SHIFT); 259 285 u32 owner = FIELD_GET(ERDMA_CQE_HDR_OWNER_MASK, 260 - __be32_to_cpu(READ_ONCE(*cqe))); 286 + be32_to_cpu(READ_ONCE(*cqe))); 261 287 262 288 return owner ^ !!(cmdq->cq.ci & cmdq->cq.depth) ? cqe : NULL; 263 289 } ··· 293 319 __be32 *cqe; 294 320 u16 ctx_id; 295 321 u64 *sqe; 296 - int i; 297 322 298 323 cqe = get_next_valid_cmdq_cqe(cmdq); 299 324 if (!cqe) ··· 301 328 cmdq->cq.ci++; 302 329 303 330 dma_rmb(); 304 - hdr0 = __be32_to_cpu(*cqe); 305 - sqe_idx = __be32_to_cpu(*(cqe + 1)); 331 + hdr0 = be32_to_cpu(*cqe); 332 + sqe_idx = be32_to_cpu(*(cqe + 1)); 306 333 307 334 sqe = get_queue_entry(cmdq->sq.qbuf, sqe_idx, cmdq->sq.depth, 308 335 SQEBB_SHIFT); ··· 314 341 comp_wait->cmd_status = ERDMA_CMD_STATUS_FINISHED; 315 342 comp_wait->comp_status = FIELD_GET(ERDMA_CQE_HDR_SYNDROME_MASK, hdr0); 316 343 cmdq->sq.ci += cmdq->sq.wqebb_cnt; 317 - 318 - for (i = 0; i < 4; i++) 319 - comp_wait->comp_data[i] = __be32_to_cpu(*(cqe + 2 + i)); 344 + /* Copy 16B comp data after cqe hdr to outer */ 345 + be32_to_cpu_array(comp_wait->comp_data, cqe + 2, 4); 320 346 321 347 if (cmdq->use_event) 322 348 complete(&comp_wait->wait_event);
+1 -1
drivers/infiniband/hw/erdma/erdma_cq.c
··· 11 11 __be32 *cqe = get_queue_entry(cq->kern_cq.qbuf, cq->kern_cq.ci, 12 12 cq->depth, CQE_SHIFT); 13 13 u32 owner = FIELD_GET(ERDMA_CQE_HDR_OWNER_MASK, 14 - __be32_to_cpu(READ_ONCE(*cqe))); 14 + be32_to_cpu(READ_ONCE(*cqe))); 15 15 16 16 return owner ^ !!(cq->kern_cq.ci & cq->depth) ? cqe : NULL; 17 17 }
+4 -5
drivers/infiniband/hw/erdma/erdma_eq.c
··· 14 14 FIELD_PREP(ERDMA_EQDB_ARM_MASK, 1); 15 15 16 16 *eq->db_record = db_data; 17 - writeq(db_data, eq->db_addr); 17 + writeq(db_data, eq->db); 18 18 19 19 atomic64_inc(&eq->notify_num); 20 20 } ··· 98 98 atomic64_set(&eq->event_num, 0); 99 99 atomic64_set(&eq->notify_num, 0); 100 100 101 - eq->db_addr = (u64 __iomem *)(dev->func_bar + ERDMA_REGS_AEQ_DB_REG); 101 + eq->db = dev->func_bar + ERDMA_REGS_AEQ_DB_REG; 102 102 eq->db_record = (u64 *)(eq->qbuf + buf_size); 103 103 104 104 erdma_reg_write32(dev, ERDMA_REGS_AEQ_ADDR_H_REG, ··· 243 243 atomic64_set(&eq->notify_num, 0); 244 244 245 245 eq->depth = ERDMA_DEFAULT_EQ_DEPTH; 246 - eq->db_addr = 247 - (u64 __iomem *)(dev->func_bar + ERDMA_REGS_CEQ_DB_BASE_REG + 248 - (ceqn + 1) * ERDMA_DB_SIZE); 246 + eq->db = dev->func_bar + ERDMA_REGS_CEQ_DB_BASE_REG + 247 + (ceqn + 1) * ERDMA_DB_SIZE; 249 248 eq->db_record = (u64 *)(eq->qbuf + buf_size); 250 249 eq->ci = 0; 251 250 dev->ceqs[ceqn].dev = dev;
+4
drivers/infiniband/hw/erdma/erdma_hw.h
··· 112 112 113 113 #define ERDMA_PAGE_SIZE_SUPPORT 0x7FFFF000 114 114 115 + /* Hardware page size definition */ 116 + #define ERDMA_HW_PAGE_SHIFT 12 117 + #define ERDMA_HW_PAGE_SIZE 4096 118 + 115 119 /* WQE related. */ 116 120 #define EQE_SIZE 16 117 121 #define EQE_SHIFT 4
+33 -6
drivers/infiniband/hw/erdma/erdma_main.c
··· 211 211 return 0; 212 212 } 213 213 214 - static void erdma_device_uninit(struct erdma_dev *dev) 214 + static void erdma_hw_reset(struct erdma_dev *dev) 215 215 { 216 216 u32 ctrl = FIELD_PREP(ERDMA_REG_DEV_CTRL_RESET_MASK, 1); 217 217 218 218 erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG, ctrl); 219 + } 220 + 221 + static int erdma_wait_hw_init_done(struct erdma_dev *dev) 222 + { 223 + int i; 224 + 225 + erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG, 226 + FIELD_PREP(ERDMA_REG_DEV_CTRL_INIT_MASK, 1)); 227 + 228 + for (i = 0; i < ERDMA_WAIT_DEV_DONE_CNT; i++) { 229 + if (erdma_reg_read32_filed(dev, ERDMA_REGS_DEV_ST_REG, 230 + ERDMA_REG_DEV_ST_INIT_DONE_MASK)) 231 + break; 232 + 233 + msleep(ERDMA_REG_ACCESS_WAIT_MS); 234 + } 235 + 236 + if (i == ERDMA_WAIT_DEV_DONE_CNT) { 237 + dev_err(&dev->pdev->dev, "wait init done failed.\n"); 238 + return -ETIMEDOUT; 239 + } 240 + 241 + return 0; 219 242 } 220 243 221 244 static const struct pci_device_id erdma_pci_tbl[] = { ··· 316 293 if (err) 317 294 goto err_uninit_aeq; 318 295 319 - err = erdma_ceqs_init(dev); 296 + err = erdma_wait_hw_init_done(dev); 320 297 if (err) 321 298 goto err_uninit_cmdq; 299 + 300 + err = erdma_ceqs_init(dev); 301 + if (err) 302 + goto err_reset_hw; 322 303 323 304 erdma_finish_cmdq_init(dev); 324 305 325 306 return 0; 326 307 308 + err_reset_hw: 309 + erdma_hw_reset(dev); 310 + 327 311 err_uninit_cmdq: 328 - erdma_device_uninit(dev); 329 312 erdma_cmdq_destroy(dev); 330 313 331 314 err_uninit_aeq: ··· 363 334 struct erdma_dev *dev = pci_get_drvdata(pdev); 364 335 365 336 erdma_ceqs_uninit(dev); 366 - 367 - erdma_device_uninit(dev); 368 - 337 + erdma_hw_reset(dev); 369 338 erdma_cmdq_destroy(dev); 370 339 erdma_aeq_destroy(dev); 371 340 erdma_comm_irq_uninit(dev);
+9 -8
drivers/infiniband/hw/erdma/erdma_verbs.c
··· 38 38 FIELD_PREP(ERDMA_CMD_CREATE_QP_PD_MASK, pd->pdn); 39 39 40 40 if (rdma_is_kernel_res(&qp->ibqp.res)) { 41 - u32 pgsz_range = ilog2(SZ_1M) - PAGE_SHIFT; 41 + u32 pgsz_range = ilog2(SZ_1M) - ERDMA_HW_PAGE_SHIFT; 42 42 43 43 req.sq_cqn_mtt_cfg = 44 44 FIELD_PREP(ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK, ··· 66 66 user_qp = &qp->user_qp; 67 67 req.sq_cqn_mtt_cfg = FIELD_PREP( 68 68 ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK, 69 - ilog2(user_qp->sq_mtt.page_size) - PAGE_SHIFT); 69 + ilog2(user_qp->sq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT); 70 70 req.sq_cqn_mtt_cfg |= 71 71 FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->scq->cqn); 72 72 73 73 req.rq_cqn_mtt_cfg = FIELD_PREP( 74 74 ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK, 75 - ilog2(user_qp->rq_mtt.page_size) - PAGE_SHIFT); 75 + ilog2(user_qp->rq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT); 76 76 req.rq_cqn_mtt_cfg |= 77 77 FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->rcq->cqn); 78 78 ··· 162 162 if (rdma_is_kernel_res(&cq->ibcq.res)) { 163 163 page_size = SZ_32M; 164 164 req.cfg0 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK, 165 - ilog2(page_size) - PAGE_SHIFT); 165 + ilog2(page_size) - ERDMA_HW_PAGE_SHIFT); 166 166 req.qbuf_addr_l = lower_32_bits(cq->kern_cq.qbuf_dma_addr); 167 167 req.qbuf_addr_h = upper_32_bits(cq->kern_cq.qbuf_dma_addr); 168 168 ··· 175 175 cq->kern_cq.qbuf_dma_addr + (cq->depth << CQE_SHIFT); 176 176 } else { 177 177 mtt = &cq->user_cq.qbuf_mtt; 178 - req.cfg0 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK, 179 - ilog2(mtt->page_size) - PAGE_SHIFT); 178 + req.cfg0 |= 179 + FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK, 180 + ilog2(mtt->page_size) - ERDMA_HW_PAGE_SHIFT); 180 181 if (mtt->mtt_nents == 1) { 181 182 req.qbuf_addr_l = lower_32_bits(*(u64 *)mtt->mtt_buf); 182 183 req.qbuf_addr_h = upper_32_bits(*(u64 *)mtt->mtt_buf); ··· 637 636 u32 rq_offset; 638 637 int ret; 639 638 640 - if (len < (PAGE_ALIGN(qp->attrs.sq_size * SQEBB_SIZE) + 639 + if (len < (ALIGN(qp->attrs.sq_size * SQEBB_SIZE, ERDMA_HW_PAGE_SIZE) + 641 640 qp->attrs.rq_size * RQE_SIZE)) 642 641 return -EINVAL; 643 642 ··· 647 646 if (ret) 648 647 return ret; 649 648 650 - rq_offset = PAGE_ALIGN(qp->attrs.sq_size << SQEBB_SHIFT); 649 + rq_offset = ALIGN(qp->attrs.sq_size << SQEBB_SHIFT, ERDMA_HW_PAGE_SIZE); 651 650 qp->user_qp.rq_offset = rq_offset; 652 651 653 652 ret = get_mtt_entries(qp->dev, &qp->user_qp.rq_mtt, va + rq_offset,
+9 -9
drivers/infiniband/hw/hfi1/chip.c
··· 12135 12135 set_intr_bits(dd, IS_RCVURGENT_START + rcd->ctxt, 12136 12136 IS_RCVURGENT_START + rcd->ctxt, false); 12137 12137 12138 - hfi1_cdbg(RCVCTRL, "ctxt %d rcvctrl 0x%llx\n", ctxt, rcvctrl); 12138 + hfi1_cdbg(RCVCTRL, "ctxt %d rcvctrl 0x%llx", ctxt, rcvctrl); 12139 12139 write_kctxt_csr(dd, ctxt, RCV_CTXT_CTRL, rcvctrl); 12140 12140 12141 12141 /* work around sticky RcvCtxtStatus.BlockedRHQFull */ ··· 12205 12205 hfi1_cdbg(CNTR, "reading %s", entry->name); 12206 12206 if (entry->flags & CNTR_DISABLED) { 12207 12207 /* Nothing */ 12208 - hfi1_cdbg(CNTR, "\tDisabled\n"); 12208 + hfi1_cdbg(CNTR, "\tDisabled"); 12209 12209 } else { 12210 12210 if (entry->flags & CNTR_VL) { 12211 - hfi1_cdbg(CNTR, "\tPer VL\n"); 12211 + hfi1_cdbg(CNTR, "\tPer VL"); 12212 12212 for (j = 0; j < C_VL_COUNT; j++) { 12213 12213 val = entry->rw_cntr(entry, 12214 12214 dd, j, ··· 12216 12216 0); 12217 12217 hfi1_cdbg( 12218 12218 CNTR, 12219 - "\t\tRead 0x%llx for %d\n", 12219 + "\t\tRead 0x%llx for %d", 12220 12220 val, j); 12221 12221 dd->cntrs[entry->offset + j] = 12222 12222 val; 12223 12223 } 12224 12224 } else if (entry->flags & CNTR_SDMA) { 12225 12225 hfi1_cdbg(CNTR, 12226 - "\t Per SDMA Engine\n"); 12226 + "\t Per SDMA Engine"); 12227 12227 for (j = 0; j < chip_sdma_engines(dd); 12228 12228 j++) { 12229 12229 val = 12230 12230 entry->rw_cntr(entry, dd, j, 12231 12231 CNTR_MODE_R, 0); 12232 12232 hfi1_cdbg(CNTR, 12233 - "\t\tRead 0x%llx for %d\n", 12233 + "\t\tRead 0x%llx for %d", 12234 12234 val, j); 12235 12235 dd->cntrs[entry->offset + j] = 12236 12236 val; ··· 12271 12271 hfi1_cdbg(CNTR, "reading %s", entry->name); 12272 12272 if (entry->flags & CNTR_DISABLED) { 12273 12273 /* Nothing */ 12274 - hfi1_cdbg(CNTR, "\tDisabled\n"); 12274 + hfi1_cdbg(CNTR, "\tDisabled"); 12275 12275 continue; 12276 12276 } 12277 12277 ··· 12513 12513 12514 12514 hfi1_cdbg( 12515 12515 CNTR, 12516 - "[%d] curr tx=0x%llx rx=0x%llx :: last tx=0x%llx rx=0x%llx\n", 12516 + "[%d] curr tx=0x%llx rx=0x%llx :: last tx=0x%llx rx=0x%llx", 12517 12517 dd->unit, cur_tx, cur_rx, dd->last_tx, dd->last_rx); 12518 12518 12519 12519 if ((cur_tx < dd->last_tx) || (cur_rx < dd->last_rx)) { ··· 12527 12527 } else { 12528 12528 total_flits = (cur_tx - dd->last_tx) + (cur_rx - dd->last_rx); 12529 12529 hfi1_cdbg(CNTR, 12530 - "[%d] total flits 0x%llx limit 0x%llx\n", dd->unit, 12530 + "[%d] total flits 0x%llx limit 0x%llx", dd->unit, 12531 12531 total_flits, (u64)CNTR_32BIT_MAX); 12532 12532 if (total_flits >= CNTR_32BIT_MAX) { 12533 12533 hfi1_cdbg(CNTR, "[%d] 32bit limit hit, updating",
+1 -1
drivers/infiniband/hw/hfi1/driver.c
··· 1597 1597 1598 1598 return 0; 1599 1599 drop: 1600 - hfi1_cdbg(PKT, "%s: packet dropped\n", __func__); 1600 + hfi1_cdbg(PKT, "%s: packet dropped", __func__); 1601 1601 ibp->rvp.n_pkt_drops++; 1602 1602 return -EINVAL; 1603 1603 }
+1 -1
drivers/infiniband/hw/hfi1/file_ops.c
··· 975 975 ret = -ENOMEM; 976 976 goto ctxdata_free; 977 977 } 978 - hfi1_cdbg(PROC, "allocated send context %u(%u)\n", uctxt->sc->sw_index, 978 + hfi1_cdbg(PROC, "allocated send context %u(%u)", uctxt->sc->sw_index, 979 979 uctxt->sc->hw_context); 980 980 ret = sc_enable(uctxt->sc); 981 981 if (ret)
+6 -6
drivers/infiniband/hw/hfi1/init.c
··· 342 342 INIT_LIST_HEAD(&rcd->flow_queue.queue_head); 343 343 INIT_LIST_HEAD(&rcd->rarr_queue.queue_head); 344 344 345 - hfi1_cdbg(PROC, "setting up context %u\n", rcd->ctxt); 345 + hfi1_cdbg(PROC, "setting up context %u", rcd->ctxt); 346 346 347 347 /* 348 348 * Calculate the context's RcvArray entry starting point. ··· 400 400 rcd->egrbufs.count = MAX_EAGER_ENTRIES; 401 401 } 402 402 hfi1_cdbg(PROC, 403 - "ctxt%u: max Eager buffer RcvArray entries: %u\n", 403 + "ctxt%u: max Eager buffer RcvArray entries: %u", 404 404 rcd->ctxt, rcd->egrbufs.count); 405 405 406 406 /* ··· 432 432 if (rcd->egrbufs.size < hfi1_max_mtu) { 433 433 rcd->egrbufs.size = __roundup_pow_of_two(hfi1_max_mtu); 434 434 hfi1_cdbg(PROC, 435 - "ctxt%u: eager bufs size too small. Adjusting to %u\n", 435 + "ctxt%u: eager bufs size too small. Adjusting to %u", 436 436 rcd->ctxt, rcd->egrbufs.size); 437 437 } 438 438 rcd->egrbufs.rcvtid_size = HFI1_MAX_EAGER_BUFFER_SIZE; ··· 1920 1920 rcd->egrbufs.size = alloced_bytes; 1921 1921 1922 1922 hfi1_cdbg(PROC, 1923 - "ctxt%u: Alloced %u rcv tid entries @ %uKB, total %uKB\n", 1923 + "ctxt%u: Alloced %u rcv tid entries @ %uKB, total %uKB", 1924 1924 rcd->ctxt, rcd->egrbufs.alloced, 1925 1925 rcd->egrbufs.rcvtid_size / 1024, rcd->egrbufs.size / 1024); 1926 1926 ··· 1943 1943 rcd->expected_count = MAX_TID_PAIR_ENTRIES * 2; 1944 1944 1945 1945 rcd->expected_base = rcd->eager_base + egrtop; 1946 - hfi1_cdbg(PROC, "ctxt%u: eager:%u, exp:%u, egrbase:%u, expbase:%u\n", 1946 + hfi1_cdbg(PROC, "ctxt%u: eager:%u, exp:%u, egrbase:%u, expbase:%u", 1947 1947 rcd->ctxt, rcd->egrbufs.alloced, rcd->expected_count, 1948 1948 rcd->eager_base, rcd->expected_base); 1949 1949 1950 1950 if (!hfi1_rcvbuf_validate(rcd->egrbufs.rcvtid_size, PT_EAGER, &order)) { 1951 1951 hfi1_cdbg(PROC, 1952 - "ctxt%u: current Eager buffer size is invalid %u\n", 1952 + "ctxt%u: current Eager buffer size is invalid %u", 1953 1953 rcd->ctxt, rcd->egrbufs.rcvtid_size); 1954 1954 ret = -EINVAL; 1955 1955 goto bail_rcvegrbuf_phys;
+5 -1
drivers/infiniband/hw/hfi1/ipoib_tx.c
··· 215 215 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 216 216 217 217 ret = sdma_txadd_page(dd, 218 + NULL, 218 219 txreq, 219 220 skb_frag_page(frag), 220 221 frag->bv_offset, ··· 738 737 txq->tx_ring.shift = ilog2(tx_item_size); 739 738 txq->tx_ring.avail = hfi1_ipoib_ring_hwat(txq); 740 739 tx_ring = &txq->tx_ring; 741 - for (j = 0; j < tx_ring_size; j++) 740 + for (j = 0; j < tx_ring_size; j++) { 742 741 hfi1_txreq_from_idx(tx_ring, j)->sdma_hdr = 743 742 kzalloc_node(sizeof(*tx->sdma_hdr), 744 743 GFP_KERNEL, priv->dd->node); 744 + if (!hfi1_txreq_from_idx(tx_ring, j)->sdma_hdr) 745 + goto free_txqs; 746 + } 745 747 746 748 netif_napi_add_tx(dev, &txq->napi, hfi1_ipoib_poll_tx_ring); 747 749 }
+24 -60
drivers/infiniband/hw/hfi1/mmu_rb.c
··· 46 46 struct mmu_rb_handler **handler) 47 47 { 48 48 struct mmu_rb_handler *h; 49 + void *free_ptr; 49 50 int ret; 50 51 51 - h = kzalloc(sizeof(*h), GFP_KERNEL); 52 - if (!h) 52 + free_ptr = kzalloc(sizeof(*h) + cache_line_size() - 1, GFP_KERNEL); 53 + if (!free_ptr) 53 54 return -ENOMEM; 54 55 56 + h = PTR_ALIGN(free_ptr, cache_line_size()); 55 57 h->root = RB_ROOT_CACHED; 56 58 h->ops = ops; 57 59 h->ops_arg = ops_arg; ··· 64 62 INIT_LIST_HEAD(&h->del_list); 65 63 INIT_LIST_HEAD(&h->lru_list); 66 64 h->wq = wq; 65 + h->free_ptr = free_ptr; 67 66 68 67 ret = mmu_notifier_register(&h->mn, current->mm); 69 68 if (ret) { 70 - kfree(h); 69 + kfree(free_ptr); 71 70 return ret; 72 71 } 73 72 ··· 111 108 /* Now the mm may be freed. */ 112 109 mmdrop(handler->mn.mm); 113 110 114 - kfree(handler); 111 + kfree(handler->free_ptr); 115 112 } 116 113 117 114 int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler, ··· 129 126 spin_lock_irqsave(&handler->lock, flags); 130 127 node = __mmu_rb_search(handler, mnode->addr, mnode->len); 131 128 if (node) { 132 - ret = -EINVAL; 129 + ret = -EEXIST; 133 130 goto unlock; 134 131 } 135 132 __mmu_int_rb_insert(mnode, &handler->root); 136 - list_add(&mnode->list, &handler->lru_list); 133 + list_add_tail(&mnode->list, &handler->lru_list); 137 134 138 135 ret = handler->ops->insert(handler->ops_arg, mnode); 139 136 if (ret) { ··· 144 141 unlock: 145 142 spin_unlock_irqrestore(&handler->lock, flags); 146 143 return ret; 144 + } 145 + 146 + /* Caller must hold handler lock */ 147 + struct mmu_rb_node *hfi1_mmu_rb_get_first(struct mmu_rb_handler *handler, 148 + unsigned long addr, unsigned long len) 149 + { 150 + struct mmu_rb_node *node; 151 + 152 + trace_hfi1_mmu_rb_search(addr, len); 153 + node = __mmu_int_rb_iter_first(&handler->root, addr, (addr + len) - 1); 154 + if (node) 155 + list_move_tail(&node->list, &handler->lru_list); 156 + return node; 147 157 } 148 158 149 159 /* Caller must hold handler lock */ ··· 183 167 return node; 184 168 } 185 169 186 - bool hfi1_mmu_rb_remove_unless_exact(struct mmu_rb_handler *handler, 187 - unsigned long addr, unsigned long len, 188 - struct mmu_rb_node **rb_node) 189 - { 190 - struct mmu_rb_node *node; 191 - unsigned long flags; 192 - bool ret = false; 193 - 194 - if (current->mm != handler->mn.mm) 195 - return ret; 196 - 197 - spin_lock_irqsave(&handler->lock, flags); 198 - node = __mmu_rb_search(handler, addr, len); 199 - if (node) { 200 - if (node->addr == addr && node->len == len) 201 - goto unlock; 202 - __mmu_int_rb_remove(node, &handler->root); 203 - list_del(&node->list); /* remove from LRU list */ 204 - ret = true; 205 - } 206 - unlock: 207 - spin_unlock_irqrestore(&handler->lock, flags); 208 - *rb_node = node; 209 - return ret; 210 - } 211 - 212 170 void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg) 213 171 { 214 172 struct mmu_rb_node *rbnode, *ptr; ··· 196 206 INIT_LIST_HEAD(&del_list); 197 207 198 208 spin_lock_irqsave(&handler->lock, flags); 199 - list_for_each_entry_safe_reverse(rbnode, ptr, &handler->lru_list, 200 - list) { 209 + list_for_each_entry_safe(rbnode, ptr, &handler->lru_list, list) { 201 210 if (handler->ops->evict(handler->ops_arg, rbnode, evict_arg, 202 211 &stop)) { 203 212 __mmu_int_rb_remove(rbnode, &handler->root); ··· 208 219 } 209 220 spin_unlock_irqrestore(&handler->lock, flags); 210 221 211 - while (!list_empty(&del_list)) { 212 - rbnode = list_first_entry(&del_list, struct mmu_rb_node, list); 213 - list_del(&rbnode->list); 222 + list_for_each_entry_safe(rbnode, ptr, &del_list, list) { 214 223 handler->ops->remove(handler->ops_arg, rbnode); 215 224 } 216 - } 217 - 218 - /* 219 - * It is up to the caller to ensure that this function does not race with the 220 - * mmu invalidate notifier which may be calling the users remove callback on 221 - * 'node'. 222 - */ 223 - void hfi1_mmu_rb_remove(struct mmu_rb_handler *handler, 224 - struct mmu_rb_node *node) 225 - { 226 - unsigned long flags; 227 - 228 - if (current->mm != handler->mn.mm) 229 - return; 230 - 231 - /* Validity of handler and node pointers has been checked by caller. */ 232 - trace_hfi1_mmu_rb_remove(node->addr, node->len); 233 - spin_lock_irqsave(&handler->lock, flags); 234 - __mmu_int_rb_remove(node, &handler->root); 235 - list_del(&node->list); /* remove from LRU list */ 236 - spin_unlock_irqrestore(&handler->lock, flags); 237 - 238 - handler->ops->remove(handler->ops_arg, node); 239 225 } 240 226 241 227 static int mmu_notifier_range_start(struct mmu_notifier *mn,
+15 -7
drivers/infiniband/hw/hfi1/mmu_rb.h
··· 33 33 }; 34 34 35 35 struct mmu_rb_handler { 36 + /* 37 + * struct mmu_notifier is 56 bytes, and spinlock_t is 4 bytes, so 38 + * they fit together in one cache line. mn is relatively rarely 39 + * accessed, so co-locating the spinlock with it achieves much of 40 + * the cacheline contention reduction of giving the spinlock its own 41 + * cacheline without the overhead of doing so. 42 + */ 36 43 struct mmu_notifier mn; 37 - struct rb_root_cached root; 38 - void *ops_arg; 39 44 spinlock_t lock; /* protect the RB tree */ 45 + 46 + /* Begin on a new cachline boundary here */ 47 + struct rb_root_cached root ____cacheline_aligned_in_smp; 48 + void *ops_arg; 40 49 struct mmu_rb_ops *ops; 41 50 struct list_head lru_list; 42 51 struct work_struct del_work; 43 52 struct list_head del_list; 44 53 struct workqueue_struct *wq; 54 + void *free_ptr; 45 55 }; 46 56 47 57 int hfi1_mmu_rb_register(void *ops_arg, ··· 62 52 int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler, 63 53 struct mmu_rb_node *mnode); 64 54 void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg); 65 - void hfi1_mmu_rb_remove(struct mmu_rb_handler *handler, 66 - struct mmu_rb_node *mnode); 67 - bool hfi1_mmu_rb_remove_unless_exact(struct mmu_rb_handler *handler, 68 - unsigned long addr, unsigned long len, 69 - struct mmu_rb_node **rb_node); 55 + struct mmu_rb_node *hfi1_mmu_rb_get_first(struct mmu_rb_handler *handler, 56 + unsigned long addr, 57 + unsigned long len); 70 58 71 59 #endif /* _HFI1_MMU_RB_H */
-2
drivers/infiniband/hw/hfi1/pcie.c
··· 7 7 #include <linux/io.h> 8 8 #include <linux/delay.h> 9 9 #include <linux/vmalloc.h> 10 - #include <linux/aer.h> 11 10 #include <linux/module.h> 12 11 13 12 #include "hfi.h" ··· 64 65 } 65 66 66 67 pci_set_master(pdev); 67 - (void)pci_enable_pcie_error_reporting(pdev); 68 68 return 0; 69 69 70 70 bail:
+1 -1
drivers/infiniband/hw/hfi1/pio.c
··· 820 820 } 821 821 822 822 hfi1_cdbg(PIO, 823 - "Send context %u(%u) %s group %u credits %u credit_ctrl 0x%llx threshold %u\n", 823 + "Send context %u(%u) %s group %u credits %u credit_ctrl 0x%llx threshold %u", 824 824 sw_index, 825 825 hw_context, 826 826 sc_type_name(type),
+4 -17
drivers/infiniband/hw/hfi1/sdma.c
··· 1593 1593 struct hfi1_devdata *dd, 1594 1594 struct sdma_desc *descp) 1595 1595 { 1596 - switch (sdma_mapping_type(descp)) { 1597 - case SDMA_MAP_SINGLE: 1598 - dma_unmap_single( 1599 - &dd->pcidev->dev, 1600 - sdma_mapping_addr(descp), 1601 - sdma_mapping_len(descp), 1602 - DMA_TO_DEVICE); 1603 - break; 1604 - case SDMA_MAP_PAGE: 1605 - dma_unmap_page( 1606 - &dd->pcidev->dev, 1607 - sdma_mapping_addr(descp), 1608 - sdma_mapping_len(descp), 1609 - DMA_TO_DEVICE); 1610 - break; 1611 - } 1596 + system_descriptor_complete(dd, descp); 1612 1597 } 1613 1598 1614 1599 /* ··· 3113 3128 3114 3129 /* Add descriptor for coalesce buffer */ 3115 3130 tx->desc_limit = MAX_DESC; 3116 - return _sdma_txadd_daddr(dd, SDMA_MAP_SINGLE, tx, 3131 + return _sdma_txadd_daddr(dd, SDMA_MAP_SINGLE, NULL, tx, 3117 3132 addr, tx->tlen); 3118 3133 } 3119 3134 ··· 3152 3167 return rval; 3153 3168 } 3154 3169 } 3170 + 3155 3171 /* finish the one just added */ 3156 3172 make_tx_sdma_desc( 3157 3173 tx, 3158 3174 SDMA_MAP_NONE, 3175 + NULL, 3159 3176 dd->sdma_pad_phys, 3160 3177 sizeof(u32) - (tx->packet_len & (sizeof(u32) - 1))); 3161 3178 tx->num_desc++;
+11 -5
drivers/infiniband/hw/hfi1/sdma.h
··· 594 594 static inline void make_tx_sdma_desc( 595 595 struct sdma_txreq *tx, 596 596 int type, 597 + void *pinning_ctx, 597 598 dma_addr_t addr, 598 599 size_t len) 599 600 { ··· 613 612 << SDMA_DESC0_PHY_ADDR_SHIFT) | 614 613 (((u64)len & SDMA_DESC0_BYTE_COUNT_MASK) 615 614 << SDMA_DESC0_BYTE_COUNT_SHIFT); 615 + desc->pinning_ctx = pinning_ctx; 616 616 } 617 617 618 618 /* helper to extend txreq */ ··· 645 643 static inline int _sdma_txadd_daddr( 646 644 struct hfi1_devdata *dd, 647 645 int type, 646 + void *pinning_ctx, 648 647 struct sdma_txreq *tx, 649 648 dma_addr_t addr, 650 649 u16 len) ··· 655 652 make_tx_sdma_desc( 656 653 tx, 657 654 type, 655 + pinning_ctx, 658 656 addr, len); 659 657 WARN_ON(len > tx->tlen); 660 658 tx->num_desc++; ··· 676 672 /** 677 673 * sdma_txadd_page() - add a page to the sdma_txreq 678 674 * @dd: the device to use for mapping 675 + * @pinning_ctx: context to be released at descriptor retirement 679 676 * @tx: tx request to which the page is added 680 677 * @page: page to map 681 678 * @offset: offset within the page ··· 692 687 */ 693 688 static inline int sdma_txadd_page( 694 689 struct hfi1_devdata *dd, 690 + void *pinning_ctx, 695 691 struct sdma_txreq *tx, 696 692 struct page *page, 697 693 unsigned long offset, ··· 720 714 return -ENOSPC; 721 715 } 722 716 723 - return _sdma_txadd_daddr( 724 - dd, SDMA_MAP_PAGE, tx, addr, len); 717 + return _sdma_txadd_daddr(dd, SDMA_MAP_PAGE, pinning_ctx, tx, addr, len); 725 718 } 726 719 727 720 /** ··· 754 749 return rval; 755 750 } 756 751 757 - return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len); 752 + return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, NULL, tx, 753 + addr, len); 758 754 } 759 755 760 756 /** ··· 801 795 return -ENOSPC; 802 796 } 803 797 804 - return _sdma_txadd_daddr( 805 - dd, SDMA_MAP_SINGLE, tx, addr, len); 798 + return _sdma_txadd_daddr(dd, SDMA_MAP_SINGLE, NULL, tx, addr, len); 806 799 } 807 800 808 801 struct iowait_work; ··· 1035 1030 1036 1031 void sdma_update_lmc(struct hfi1_devdata *dd, u64 mask, u32 lid); 1037 1032 1033 + void system_descriptor_complete(struct hfi1_devdata *dd, struct sdma_desc *descp); 1038 1034 #endif
+1
drivers/infiniband/hw/hfi1/sdma_txreq.h
··· 19 19 struct sdma_desc { 20 20 /* private: don't use directly */ 21 21 u64 qw[2]; 22 + void *pinning_ctx; 22 23 }; 23 24 24 25 /**
+7
drivers/infiniband/hw/hfi1/trace_dbg.h
··· 22 22 23 23 #define MAX_MSG_LEN 512 24 24 25 + #pragma GCC diagnostic push 26 + #ifndef __clang__ 27 + #pragma GCC diagnostic ignored "-Wsuggest-attribute=format" 28 + #endif 29 + 25 30 DECLARE_EVENT_CLASS(hfi1_trace_template, 26 31 TP_PROTO(const char *function, struct va_format *vaf), 27 32 TP_ARGS(function, vaf), ··· 40 35 __get_str(function), 41 36 __get_str(msg)) 42 37 ); 38 + 39 + #pragma GCC diagnostic pop 43 40 44 41 /* 45 42 * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an
-4
drivers/infiniband/hw/hfi1/trace_mmu.h
··· 37 37 TP_PROTO(unsigned long addr, unsigned long len), 38 38 TP_ARGS(addr, len)); 39 39 40 - DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_rb_remove, 41 - TP_PROTO(unsigned long addr, unsigned long len), 42 - TP_ARGS(addr, len)); 43 - 44 40 DEFINE_EVENT(hfi1_mmu_rb_template, hfi1_mmu_mem_invalidate, 45 41 TP_PROTO(unsigned long addr, unsigned long len), 46 42 TP_ARGS(addr, len));
+386 -214
drivers/infiniband/hw/hfi1/user_sdma.c
··· 24 24 25 25 #include "hfi.h" 26 26 #include "sdma.h" 27 - #include "mmu_rb.h" 28 27 #include "user_sdma.h" 29 28 #include "verbs.h" /* for the headers */ 30 29 #include "common.h" /* for struct hfi1_tid_info */ ··· 38 39 static int user_sdma_send_pkts(struct user_sdma_request *req, u16 maxpkts); 39 40 static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status); 40 41 static inline void pq_update(struct hfi1_user_sdma_pkt_q *pq); 41 - static void user_sdma_free_request(struct user_sdma_request *req, bool unpin); 42 - static int pin_vector_pages(struct user_sdma_request *req, 43 - struct user_sdma_iovec *iovec); 44 - static void unpin_vector_pages(struct mm_struct *mm, struct page **pages, 45 - unsigned start, unsigned npages); 42 + static void user_sdma_free_request(struct user_sdma_request *req); 46 43 static int check_header_template(struct user_sdma_request *req, 47 44 struct hfi1_pkt_header *hdr, u32 lrhlen, 48 45 u32 datalen); ··· 75 80 .remove = sdma_rb_remove, 76 81 .invalidate = sdma_rb_invalidate 77 82 }; 83 + 84 + static int add_system_pages_to_sdma_packet(struct user_sdma_request *req, 85 + struct user_sdma_txreq *tx, 86 + struct user_sdma_iovec *iovec, 87 + u32 *pkt_remaining); 78 88 79 89 static int defer_packet_queue( 80 90 struct sdma_engine *sde, ··· 410 410 ret = -EINVAL; 411 411 goto free_req; 412 412 } 413 + 413 414 /* Copy the header from the user buffer */ 414 415 ret = copy_from_user(&req->hdr, iovec[idx].iov_base + sizeof(info), 415 416 sizeof(req->hdr)); ··· 485 484 memcpy(&req->iovs[i].iov, 486 485 iovec + idx++, 487 486 sizeof(req->iovs[i].iov)); 488 - ret = pin_vector_pages(req, &req->iovs[i]); 489 - if (ret) { 490 - req->data_iovs = i; 487 + if (req->iovs[i].iov.iov_len == 0) { 488 + ret = -EINVAL; 491 489 goto free_req; 492 490 } 493 491 req->data_len += req->iovs[i].iov.iov_len; ··· 584 584 if (req->seqsubmitted) 585 585 wait_event(pq->busy.wait_dma, 586 586 (req->seqcomp == req->seqsubmitted - 1)); 587 - user_sdma_free_request(req, true); 587 + user_sdma_free_request(req); 588 588 pq_update(pq); 589 589 set_comp_state(pq, cq, info.comp_idx, ERROR, ret); 590 590 } ··· 696 696 return ret; 697 697 } 698 698 699 - static int user_sdma_txadd(struct user_sdma_request *req, 700 - struct user_sdma_txreq *tx, 701 - struct user_sdma_iovec *iovec, u32 datalen, 702 - u32 *queued_ptr, u32 *data_sent_ptr, 703 - u64 *iov_offset_ptr) 704 - { 705 - int ret; 706 - unsigned int pageidx, len; 707 - unsigned long base, offset; 708 - u64 iov_offset = *iov_offset_ptr; 709 - u32 queued = *queued_ptr, data_sent = *data_sent_ptr; 710 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 711 - 712 - base = (unsigned long)iovec->iov.iov_base; 713 - offset = offset_in_page(base + iovec->offset + iov_offset); 714 - pageidx = (((iovec->offset + iov_offset + base) - (base & PAGE_MASK)) >> 715 - PAGE_SHIFT); 716 - len = offset + req->info.fragsize > PAGE_SIZE ? 717 - PAGE_SIZE - offset : req->info.fragsize; 718 - len = min((datalen - queued), len); 719 - ret = sdma_txadd_page(pq->dd, &tx->txreq, iovec->pages[pageidx], 720 - offset, len); 721 - if (ret) { 722 - SDMA_DBG(req, "SDMA txreq add page failed %d\n", ret); 723 - return ret; 724 - } 725 - iov_offset += len; 726 - queued += len; 727 - data_sent += len; 728 - if (unlikely(queued < datalen && pageidx == iovec->npages && 729 - req->iov_idx < req->data_iovs - 1)) { 730 - iovec->offset += iov_offset; 731 - iovec = &req->iovs[++req->iov_idx]; 732 - iov_offset = 0; 733 - } 734 - 735 - *queued_ptr = queued; 736 - *data_sent_ptr = data_sent; 737 - *iov_offset_ptr = iov_offset; 738 - return ret; 739 - } 740 - 741 699 static int user_sdma_send_pkts(struct user_sdma_request *req, u16 maxpkts) 742 700 { 743 701 int ret = 0; ··· 727 769 maxpkts = req->info.npkts - req->seqnum; 728 770 729 771 while (npkts < maxpkts) { 730 - u32 datalen = 0, queued = 0, data_sent = 0; 731 - u64 iov_offset = 0; 772 + u32 datalen = 0; 732 773 733 774 /* 734 775 * Check whether any of the completions have come back ··· 820 863 goto free_txreq; 821 864 } 822 865 823 - /* 824 - * If the request contains any data vectors, add up to 825 - * fragsize bytes to the descriptor. 826 - */ 827 - while (queued < datalen && 828 - (req->sent + data_sent) < req->data_len) { 829 - ret = user_sdma_txadd(req, tx, iovec, datalen, 830 - &queued, &data_sent, &iov_offset); 831 - if (ret) 832 - goto free_txreq; 833 - } 834 - /* 835 - * The txreq was submitted successfully so we can update 836 - * the counters. 837 - */ 838 866 req->koffset += datalen; 839 867 if (req_opcode(req->info.ctrl) == EXPECTED) 840 868 req->tidoffset += datalen; 841 - req->sent += data_sent; 842 - if (req->data_len) 843 - iovec->offset += iov_offset; 869 + req->sent += datalen; 870 + while (datalen) { 871 + ret = add_system_pages_to_sdma_packet(req, tx, iovec, 872 + &datalen); 873 + if (ret) 874 + goto free_txreq; 875 + iovec = &req->iovs[req->iov_idx]; 876 + } 844 877 list_add_tail(&tx->txreq.list, &req->txps); 845 878 /* 846 879 * It is important to increment this here as it is used to ··· 867 920 static u32 sdma_cache_evict(struct hfi1_user_sdma_pkt_q *pq, u32 npages) 868 921 { 869 922 struct evict_data evict_data; 923 + struct mmu_rb_handler *handler = pq->handler; 870 924 871 925 evict_data.cleared = 0; 872 926 evict_data.target = npages; 873 - hfi1_mmu_rb_evict(pq->handler, &evict_data); 927 + hfi1_mmu_rb_evict(handler, &evict_data); 874 928 return evict_data.cleared; 875 - } 876 - 877 - static int pin_sdma_pages(struct user_sdma_request *req, 878 - struct user_sdma_iovec *iovec, 879 - struct sdma_mmu_node *node, 880 - int npages) 881 - { 882 - int pinned, cleared; 883 - struct page **pages; 884 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 885 - 886 - pages = kcalloc(npages, sizeof(*pages), GFP_KERNEL); 887 - if (!pages) 888 - return -ENOMEM; 889 - memcpy(pages, node->pages, node->npages * sizeof(*pages)); 890 - 891 - npages -= node->npages; 892 - retry: 893 - if (!hfi1_can_pin_pages(pq->dd, current->mm, 894 - atomic_read(&pq->n_locked), npages)) { 895 - cleared = sdma_cache_evict(pq, npages); 896 - if (cleared >= npages) 897 - goto retry; 898 - } 899 - pinned = hfi1_acquire_user_pages(current->mm, 900 - ((unsigned long)iovec->iov.iov_base + 901 - (node->npages * PAGE_SIZE)), npages, 0, 902 - pages + node->npages); 903 - if (pinned < 0) { 904 - kfree(pages); 905 - return pinned; 906 - } 907 - if (pinned != npages) { 908 - unpin_vector_pages(current->mm, pages, node->npages, pinned); 909 - return -EFAULT; 910 - } 911 - kfree(node->pages); 912 - node->rb.len = iovec->iov.iov_len; 913 - node->pages = pages; 914 - atomic_add(pinned, &pq->n_locked); 915 - return pinned; 916 - } 917 - 918 - static void unpin_sdma_pages(struct sdma_mmu_node *node) 919 - { 920 - if (node->npages) { 921 - unpin_vector_pages(mm_from_sdma_node(node), node->pages, 0, 922 - node->npages); 923 - atomic_sub(node->npages, &node->pq->n_locked); 924 - } 925 - } 926 - 927 - static int pin_vector_pages(struct user_sdma_request *req, 928 - struct user_sdma_iovec *iovec) 929 - { 930 - int ret = 0, pinned, npages; 931 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 932 - struct sdma_mmu_node *node = NULL; 933 - struct mmu_rb_node *rb_node; 934 - struct iovec *iov; 935 - bool extracted; 936 - 937 - extracted = 938 - hfi1_mmu_rb_remove_unless_exact(pq->handler, 939 - (unsigned long) 940 - iovec->iov.iov_base, 941 - iovec->iov.iov_len, &rb_node); 942 - if (rb_node) { 943 - node = container_of(rb_node, struct sdma_mmu_node, rb); 944 - if (!extracted) { 945 - atomic_inc(&node->refcount); 946 - iovec->pages = node->pages; 947 - iovec->npages = node->npages; 948 - iovec->node = node; 949 - return 0; 950 - } 951 - } 952 - 953 - if (!node) { 954 - node = kzalloc(sizeof(*node), GFP_KERNEL); 955 - if (!node) 956 - return -ENOMEM; 957 - 958 - node->rb.addr = (unsigned long)iovec->iov.iov_base; 959 - node->pq = pq; 960 - atomic_set(&node->refcount, 0); 961 - } 962 - 963 - iov = &iovec->iov; 964 - npages = num_user_pages((unsigned long)iov->iov_base, iov->iov_len); 965 - if (node->npages < npages) { 966 - pinned = pin_sdma_pages(req, iovec, node, npages); 967 - if (pinned < 0) { 968 - ret = pinned; 969 - goto bail; 970 - } 971 - node->npages += pinned; 972 - npages = node->npages; 973 - } 974 - iovec->pages = node->pages; 975 - iovec->npages = npages; 976 - iovec->node = node; 977 - 978 - ret = hfi1_mmu_rb_insert(req->pq->handler, &node->rb); 979 - if (ret) { 980 - iovec->node = NULL; 981 - goto bail; 982 - } 983 - return 0; 984 - bail: 985 - unpin_sdma_pages(node); 986 - kfree(node); 987 - return ret; 988 - } 989 - 990 - static void unpin_vector_pages(struct mm_struct *mm, struct page **pages, 991 - unsigned start, unsigned npages) 992 - { 993 - hfi1_release_user_pages(mm, pages + start, npages, false); 994 - kfree(pages); 995 929 } 996 930 997 931 static int check_header_template(struct user_sdma_request *req, ··· 1216 1388 if (req->seqcomp != req->info.npkts - 1) 1217 1389 return; 1218 1390 1219 - user_sdma_free_request(req, false); 1391 + user_sdma_free_request(req); 1220 1392 set_comp_state(pq, cq, req->info.comp_idx, state, status); 1221 1393 pq_update(pq); 1222 1394 } ··· 1227 1399 wake_up(&pq->wait); 1228 1400 } 1229 1401 1230 - static void user_sdma_free_request(struct user_sdma_request *req, bool unpin) 1402 + static void user_sdma_free_request(struct user_sdma_request *req) 1231 1403 { 1232 - int i; 1233 - 1234 1404 if (!list_empty(&req->txps)) { 1235 1405 struct sdma_txreq *t, *p; 1236 1406 ··· 1239 1413 sdma_txclean(req->pq->dd, t); 1240 1414 kmem_cache_free(req->pq->txreq_cache, tx); 1241 1415 } 1242 - } 1243 - 1244 - for (i = 0; i < req->data_iovs; i++) { 1245 - struct sdma_mmu_node *node = req->iovs[i].node; 1246 - 1247 - if (!node) 1248 - continue; 1249 - 1250 - req->iovs[i].node = NULL; 1251 - 1252 - if (unpin) 1253 - hfi1_mmu_rb_remove(req->pq->handler, 1254 - &node->rb); 1255 - else 1256 - atomic_dec(&node->refcount); 1257 1416 } 1258 1417 1259 1418 kfree(req->tids); ··· 1256 1445 cq->comps[idx].status = state; 1257 1446 trace_hfi1_sdma_user_completion(pq->dd, pq->ctxt, pq->subctxt, 1258 1447 idx, state, ret); 1448 + } 1449 + 1450 + static void unpin_vector_pages(struct mm_struct *mm, struct page **pages, 1451 + unsigned int start, unsigned int npages) 1452 + { 1453 + hfi1_release_user_pages(mm, pages + start, npages, false); 1454 + kfree(pages); 1455 + } 1456 + 1457 + static void free_system_node(struct sdma_mmu_node *node) 1458 + { 1459 + if (node->npages) { 1460 + unpin_vector_pages(mm_from_sdma_node(node), node->pages, 0, 1461 + node->npages); 1462 + atomic_sub(node->npages, &node->pq->n_locked); 1463 + } 1464 + kfree(node); 1465 + } 1466 + 1467 + static inline void acquire_node(struct sdma_mmu_node *node) 1468 + { 1469 + atomic_inc(&node->refcount); 1470 + WARN_ON(atomic_read(&node->refcount) < 0); 1471 + } 1472 + 1473 + static inline void release_node(struct mmu_rb_handler *handler, 1474 + struct sdma_mmu_node *node) 1475 + { 1476 + atomic_dec(&node->refcount); 1477 + WARN_ON(atomic_read(&node->refcount) < 0); 1478 + } 1479 + 1480 + static struct sdma_mmu_node *find_system_node(struct mmu_rb_handler *handler, 1481 + unsigned long start, 1482 + unsigned long end) 1483 + { 1484 + struct mmu_rb_node *rb_node; 1485 + struct sdma_mmu_node *node; 1486 + unsigned long flags; 1487 + 1488 + spin_lock_irqsave(&handler->lock, flags); 1489 + rb_node = hfi1_mmu_rb_get_first(handler, start, (end - start)); 1490 + if (!rb_node) { 1491 + spin_unlock_irqrestore(&handler->lock, flags); 1492 + return NULL; 1493 + } 1494 + node = container_of(rb_node, struct sdma_mmu_node, rb); 1495 + acquire_node(node); 1496 + spin_unlock_irqrestore(&handler->lock, flags); 1497 + 1498 + return node; 1499 + } 1500 + 1501 + static int pin_system_pages(struct user_sdma_request *req, 1502 + uintptr_t start_address, size_t length, 1503 + struct sdma_mmu_node *node, int npages) 1504 + { 1505 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 1506 + int pinned, cleared; 1507 + struct page **pages; 1508 + 1509 + pages = kcalloc(npages, sizeof(*pages), GFP_KERNEL); 1510 + if (!pages) 1511 + return -ENOMEM; 1512 + 1513 + retry: 1514 + if (!hfi1_can_pin_pages(pq->dd, current->mm, atomic_read(&pq->n_locked), 1515 + npages)) { 1516 + SDMA_DBG(req, "Evicting: nlocked %u npages %u", 1517 + atomic_read(&pq->n_locked), npages); 1518 + cleared = sdma_cache_evict(pq, npages); 1519 + if (cleared >= npages) 1520 + goto retry; 1521 + } 1522 + 1523 + SDMA_DBG(req, "Acquire user pages start_address %lx node->npages %u npages %u", 1524 + start_address, node->npages, npages); 1525 + pinned = hfi1_acquire_user_pages(current->mm, start_address, npages, 0, 1526 + pages); 1527 + 1528 + if (pinned < 0) { 1529 + kfree(pages); 1530 + SDMA_DBG(req, "pinned %d", pinned); 1531 + return pinned; 1532 + } 1533 + if (pinned != npages) { 1534 + unpin_vector_pages(current->mm, pages, node->npages, pinned); 1535 + SDMA_DBG(req, "npages %u pinned %d", npages, pinned); 1536 + return -EFAULT; 1537 + } 1538 + node->rb.addr = start_address; 1539 + node->rb.len = length; 1540 + node->pages = pages; 1541 + node->npages = npages; 1542 + atomic_add(pinned, &pq->n_locked); 1543 + SDMA_DBG(req, "done. pinned %d", pinned); 1544 + return 0; 1545 + } 1546 + 1547 + static int add_system_pinning(struct user_sdma_request *req, 1548 + struct sdma_mmu_node **node_p, 1549 + unsigned long start, unsigned long len) 1550 + 1551 + { 1552 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 1553 + struct sdma_mmu_node *node; 1554 + int ret; 1555 + 1556 + node = kzalloc(sizeof(*node), GFP_KERNEL); 1557 + if (!node) 1558 + return -ENOMEM; 1559 + 1560 + node->pq = pq; 1561 + ret = pin_system_pages(req, start, len, node, PFN_DOWN(len)); 1562 + if (ret == 0) { 1563 + ret = hfi1_mmu_rb_insert(pq->handler, &node->rb); 1564 + if (ret) 1565 + free_system_node(node); 1566 + else 1567 + *node_p = node; 1568 + 1569 + return ret; 1570 + } 1571 + 1572 + kfree(node); 1573 + return ret; 1574 + } 1575 + 1576 + static int get_system_cache_entry(struct user_sdma_request *req, 1577 + struct sdma_mmu_node **node_p, 1578 + size_t req_start, size_t req_len) 1579 + { 1580 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 1581 + u64 start = ALIGN_DOWN(req_start, PAGE_SIZE); 1582 + u64 end = PFN_ALIGN(req_start + req_len); 1583 + struct mmu_rb_handler *handler = pq->handler; 1584 + int ret; 1585 + 1586 + if ((end - start) == 0) { 1587 + SDMA_DBG(req, 1588 + "Request for empty cache entry req_start %lx req_len %lx start %llx end %llx", 1589 + req_start, req_len, start, end); 1590 + return -EINVAL; 1591 + } 1592 + 1593 + SDMA_DBG(req, "req_start %lx req_len %lu", req_start, req_len); 1594 + 1595 + while (1) { 1596 + struct sdma_mmu_node *node = 1597 + find_system_node(handler, start, end); 1598 + u64 prepend_len = 0; 1599 + 1600 + SDMA_DBG(req, "node %p start %llx end %llu", node, start, end); 1601 + if (!node) { 1602 + ret = add_system_pinning(req, node_p, start, 1603 + end - start); 1604 + if (ret == -EEXIST) { 1605 + /* 1606 + * Another execution context has inserted a 1607 + * conficting entry first. 1608 + */ 1609 + continue; 1610 + } 1611 + return ret; 1612 + } 1613 + 1614 + if (node->rb.addr <= start) { 1615 + /* 1616 + * This entry covers at least part of the region. If it doesn't extend 1617 + * to the end, then this will be called again for the next segment. 1618 + */ 1619 + *node_p = node; 1620 + return 0; 1621 + } 1622 + 1623 + SDMA_DBG(req, "prepend: node->rb.addr %lx, node->refcount %d", 1624 + node->rb.addr, atomic_read(&node->refcount)); 1625 + prepend_len = node->rb.addr - start; 1626 + 1627 + /* 1628 + * This node will not be returned, instead a new node 1629 + * will be. So release the reference. 1630 + */ 1631 + release_node(handler, node); 1632 + 1633 + /* Prepend a node to cover the beginning of the allocation */ 1634 + ret = add_system_pinning(req, node_p, start, prepend_len); 1635 + if (ret == -EEXIST) { 1636 + /* Another execution context has inserted a conficting entry first. */ 1637 + continue; 1638 + } 1639 + return ret; 1640 + } 1641 + } 1642 + 1643 + static int add_mapping_to_sdma_packet(struct user_sdma_request *req, 1644 + struct user_sdma_txreq *tx, 1645 + struct sdma_mmu_node *cache_entry, 1646 + size_t start, 1647 + size_t from_this_cache_entry) 1648 + { 1649 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 1650 + unsigned int page_offset; 1651 + unsigned int from_this_page; 1652 + size_t page_index; 1653 + void *ctx; 1654 + int ret; 1655 + 1656 + /* 1657 + * Because the cache may be more fragmented than the memory that is being accessed, 1658 + * it's not strictly necessary to have a descriptor per cache entry. 1659 + */ 1660 + 1661 + while (from_this_cache_entry) { 1662 + page_index = PFN_DOWN(start - cache_entry->rb.addr); 1663 + 1664 + if (page_index >= cache_entry->npages) { 1665 + SDMA_DBG(req, 1666 + "Request for page_index %zu >= cache_entry->npages %u", 1667 + page_index, cache_entry->npages); 1668 + return -EINVAL; 1669 + } 1670 + 1671 + page_offset = start - ALIGN_DOWN(start, PAGE_SIZE); 1672 + from_this_page = PAGE_SIZE - page_offset; 1673 + 1674 + if (from_this_page < from_this_cache_entry) { 1675 + ctx = NULL; 1676 + } else { 1677 + /* 1678 + * In the case they are equal the next line has no practical effect, 1679 + * but it's better to do a register to register copy than a conditional 1680 + * branch. 1681 + */ 1682 + from_this_page = from_this_cache_entry; 1683 + ctx = cache_entry; 1684 + } 1685 + 1686 + ret = sdma_txadd_page(pq->dd, ctx, &tx->txreq, 1687 + cache_entry->pages[page_index], 1688 + page_offset, from_this_page); 1689 + if (ret) { 1690 + /* 1691 + * When there's a failure, the entire request is freed by 1692 + * user_sdma_send_pkts(). 1693 + */ 1694 + SDMA_DBG(req, 1695 + "sdma_txadd_page failed %d page_index %lu page_offset %u from_this_page %u", 1696 + ret, page_index, page_offset, from_this_page); 1697 + return ret; 1698 + } 1699 + start += from_this_page; 1700 + from_this_cache_entry -= from_this_page; 1701 + } 1702 + return 0; 1703 + } 1704 + 1705 + static int add_system_iovec_to_sdma_packet(struct user_sdma_request *req, 1706 + struct user_sdma_txreq *tx, 1707 + struct user_sdma_iovec *iovec, 1708 + size_t from_this_iovec) 1709 + { 1710 + struct mmu_rb_handler *handler = req->pq->handler; 1711 + 1712 + while (from_this_iovec > 0) { 1713 + struct sdma_mmu_node *cache_entry; 1714 + size_t from_this_cache_entry; 1715 + size_t start; 1716 + int ret; 1717 + 1718 + start = (uintptr_t)iovec->iov.iov_base + iovec->offset; 1719 + ret = get_system_cache_entry(req, &cache_entry, start, 1720 + from_this_iovec); 1721 + if (ret) { 1722 + SDMA_DBG(req, "pin system segment failed %d", ret); 1723 + return ret; 1724 + } 1725 + 1726 + from_this_cache_entry = cache_entry->rb.len - (start - cache_entry->rb.addr); 1727 + if (from_this_cache_entry > from_this_iovec) 1728 + from_this_cache_entry = from_this_iovec; 1729 + 1730 + ret = add_mapping_to_sdma_packet(req, tx, cache_entry, start, 1731 + from_this_cache_entry); 1732 + if (ret) { 1733 + /* 1734 + * We're guaranteed that there will be no descriptor 1735 + * completion callback that releases this node 1736 + * because only the last descriptor referencing it 1737 + * has a context attached, and a failure means the 1738 + * last descriptor was never added. 1739 + */ 1740 + release_node(handler, cache_entry); 1741 + SDMA_DBG(req, "add system segment failed %d", ret); 1742 + return ret; 1743 + } 1744 + 1745 + iovec->offset += from_this_cache_entry; 1746 + from_this_iovec -= from_this_cache_entry; 1747 + } 1748 + 1749 + return 0; 1750 + } 1751 + 1752 + static int add_system_pages_to_sdma_packet(struct user_sdma_request *req, 1753 + struct user_sdma_txreq *tx, 1754 + struct user_sdma_iovec *iovec, 1755 + u32 *pkt_data_remaining) 1756 + { 1757 + size_t remaining_to_add = *pkt_data_remaining; 1758 + /* 1759 + * Walk through iovec entries, ensure the associated pages 1760 + * are pinned and mapped, add data to the packet until no more 1761 + * data remains to be added. 1762 + */ 1763 + while (remaining_to_add > 0) { 1764 + struct user_sdma_iovec *cur_iovec; 1765 + size_t from_this_iovec; 1766 + int ret; 1767 + 1768 + cur_iovec = iovec; 1769 + from_this_iovec = iovec->iov.iov_len - iovec->offset; 1770 + 1771 + if (from_this_iovec > remaining_to_add) { 1772 + from_this_iovec = remaining_to_add; 1773 + } else { 1774 + /* The current iovec entry will be consumed by this pass. */ 1775 + req->iov_idx++; 1776 + iovec++; 1777 + } 1778 + 1779 + ret = add_system_iovec_to_sdma_packet(req, tx, cur_iovec, 1780 + from_this_iovec); 1781 + if (ret) 1782 + return ret; 1783 + 1784 + remaining_to_add -= from_this_iovec; 1785 + } 1786 + *pkt_data_remaining = remaining_to_add; 1787 + 1788 + return 0; 1789 + } 1790 + 1791 + void system_descriptor_complete(struct hfi1_devdata *dd, 1792 + struct sdma_desc *descp) 1793 + { 1794 + switch (sdma_mapping_type(descp)) { 1795 + case SDMA_MAP_SINGLE: 1796 + dma_unmap_single(&dd->pcidev->dev, sdma_mapping_addr(descp), 1797 + sdma_mapping_len(descp), DMA_TO_DEVICE); 1798 + break; 1799 + case SDMA_MAP_PAGE: 1800 + dma_unmap_page(&dd->pcidev->dev, sdma_mapping_addr(descp), 1801 + sdma_mapping_len(descp), DMA_TO_DEVICE); 1802 + break; 1803 + } 1804 + 1805 + if (descp->pinning_ctx) { 1806 + struct sdma_mmu_node *node = descp->pinning_ctx; 1807 + 1808 + release_node(node->rb.handler, node); 1809 + } 1259 1810 } 1260 1811 1261 1812 static bool sdma_rb_filter(struct mmu_rb_node *node, unsigned long addr, ··· 1666 1493 struct sdma_mmu_node *node = 1667 1494 container_of(mnode, struct sdma_mmu_node, rb); 1668 1495 1669 - unpin_sdma_pages(node); 1670 - kfree(node); 1496 + free_system_node(node); 1671 1497 } 1672 1498 1673 1499 static int sdma_rb_invalidate(void *arg, struct mmu_rb_node *mnode)
-5
drivers/infiniband/hw/hfi1/user_sdma.h
··· 112 112 struct user_sdma_iovec { 113 113 struct list_head list; 114 114 struct iovec iov; 115 - /* number of pages in this vector */ 116 - unsigned int npages; 117 - /* array of pinned pages for this vector */ 118 - struct page **pages; 119 115 /* 120 116 * offset into the virtual address space of the vector at 121 117 * which we last left off. 122 118 */ 123 119 u64 offset; 124 - struct sdma_mmu_node *node; 125 120 }; 126 121 127 122 /* evict operation argument */
+2 -2
drivers/infiniband/hw/hfi1/verbs.c
··· 778 778 779 779 /* add icrc, lt byte, and padding to flit */ 780 780 if (extra_bytes) 781 - ret = sdma_txadd_daddr(sde->dd, &tx->txreq, 782 - sde->dd->sdma_pad_phys, extra_bytes); 781 + ret = sdma_txadd_daddr(sde->dd, &tx->txreq, sde->dd->sdma_pad_phys, 782 + extra_bytes); 783 783 784 784 bail_txadd: 785 785 return ret;
+1
drivers/infiniband/hw/hfi1/vnic_sdma.c
··· 64 64 65 65 /* combine physically continuous fragments later? */ 66 66 ret = sdma_txadd_page(sde->dd, 67 + NULL, 67 68 &tx->txreq, 68 69 skb_frag_page(frag), 69 70 skb_frag_off(frag),
+53 -134
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
··· 1960 1960 return hns_roce_cmq_send(hr_dev, &desc, 1); 1961 1961 } 1962 1962 1963 - /* Use default caps when hns_roce_query_pf_caps() failed or init VF profile */ 1964 - static void set_default_caps(struct hns_roce_dev *hr_dev) 1965 - { 1966 - struct hns_roce_caps *caps = &hr_dev->caps; 1967 - 1968 - caps->num_qps = HNS_ROCE_V2_MAX_QP_NUM; 1969 - caps->max_wqes = HNS_ROCE_V2_MAX_WQE_NUM; 1970 - caps->num_cqs = HNS_ROCE_V2_MAX_CQ_NUM; 1971 - caps->num_srqs = HNS_ROCE_V2_MAX_SRQ_NUM; 1972 - caps->min_cqes = HNS_ROCE_MIN_CQE_NUM; 1973 - caps->max_cqes = HNS_ROCE_V2_MAX_CQE_NUM; 1974 - caps->max_sq_sg = HNS_ROCE_V2_MAX_SQ_SGE_NUM; 1975 - caps->max_rq_sg = HNS_ROCE_V2_MAX_RQ_SGE_NUM; 1976 - 1977 - caps->num_uars = HNS_ROCE_V2_UAR_NUM; 1978 - caps->phy_num_uars = HNS_ROCE_V2_PHY_UAR_NUM; 1979 - caps->num_aeq_vectors = HNS_ROCE_V2_AEQE_VEC_NUM; 1980 - caps->num_other_vectors = HNS_ROCE_V2_ABNORMAL_VEC_NUM; 1981 - caps->num_comp_vectors = 0; 1982 - 1983 - caps->num_mtpts = HNS_ROCE_V2_MAX_MTPT_NUM; 1984 - caps->num_pds = HNS_ROCE_V2_MAX_PD_NUM; 1985 - caps->qpc_timer_bt_num = HNS_ROCE_V2_MAX_QPC_TIMER_BT_NUM; 1986 - caps->cqc_timer_bt_num = HNS_ROCE_V2_MAX_CQC_TIMER_BT_NUM; 1987 - 1988 - caps->max_qp_init_rdma = HNS_ROCE_V2_MAX_QP_INIT_RDMA; 1989 - caps->max_qp_dest_rdma = HNS_ROCE_V2_MAX_QP_DEST_RDMA; 1990 - caps->max_sq_desc_sz = HNS_ROCE_V2_MAX_SQ_DESC_SZ; 1991 - caps->max_rq_desc_sz = HNS_ROCE_V2_MAX_RQ_DESC_SZ; 1992 - caps->irrl_entry_sz = HNS_ROCE_V2_IRRL_ENTRY_SZ; 1993 - caps->trrl_entry_sz = HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ; 1994 - caps->cqc_entry_sz = HNS_ROCE_V2_CQC_ENTRY_SZ; 1995 - caps->srqc_entry_sz = HNS_ROCE_V2_SRQC_ENTRY_SZ; 1996 - caps->mtpt_entry_sz = HNS_ROCE_V2_MTPT_ENTRY_SZ; 1997 - caps->idx_entry_sz = HNS_ROCE_V2_IDX_ENTRY_SZ; 1998 - caps->page_size_cap = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED; 1999 - caps->reserved_lkey = 0; 2000 - caps->reserved_pds = 0; 2001 - caps->reserved_mrws = 1; 2002 - caps->reserved_uars = 0; 2003 - caps->reserved_cqs = 0; 2004 - caps->reserved_srqs = 0; 2005 - caps->reserved_qps = HNS_ROCE_V2_RSV_QPS; 2006 - 2007 - caps->qpc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM; 2008 - caps->srqc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM; 2009 - caps->cqc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM; 2010 - caps->mpt_hop_num = HNS_ROCE_CONTEXT_HOP_NUM; 2011 - caps->sccc_hop_num = HNS_ROCE_SCCC_HOP_NUM; 2012 - 2013 - caps->mtt_hop_num = HNS_ROCE_MTT_HOP_NUM; 2014 - caps->wqe_sq_hop_num = HNS_ROCE_SQWQE_HOP_NUM; 2015 - caps->wqe_sge_hop_num = HNS_ROCE_EXT_SGE_HOP_NUM; 2016 - caps->wqe_rq_hop_num = HNS_ROCE_RQWQE_HOP_NUM; 2017 - caps->cqe_hop_num = HNS_ROCE_CQE_HOP_NUM; 2018 - caps->srqwqe_hop_num = HNS_ROCE_SRQWQE_HOP_NUM; 2019 - caps->idx_hop_num = HNS_ROCE_IDX_HOP_NUM; 2020 - caps->chunk_sz = HNS_ROCE_V2_TABLE_CHUNK_SIZE; 2021 - 2022 - caps->flags = HNS_ROCE_CAP_FLAG_REREG_MR | 2023 - HNS_ROCE_CAP_FLAG_ROCE_V1_V2 | 2024 - HNS_ROCE_CAP_FLAG_CQ_RECORD_DB | 2025 - HNS_ROCE_CAP_FLAG_QP_RECORD_DB; 2026 - 2027 - caps->pkey_table_len[0] = 1; 2028 - caps->ceqe_depth = HNS_ROCE_V2_COMP_EQE_NUM; 2029 - caps->aeqe_depth = HNS_ROCE_V2_ASYNC_EQE_NUM; 2030 - caps->local_ca_ack_delay = 0; 2031 - caps->max_mtu = IB_MTU_4096; 2032 - 2033 - caps->max_srq_wrs = HNS_ROCE_V2_MAX_SRQ_WR; 2034 - caps->max_srq_sges = HNS_ROCE_V2_MAX_SRQ_SGE; 2035 - 2036 - caps->flags |= HNS_ROCE_CAP_FLAG_ATOMIC | HNS_ROCE_CAP_FLAG_MW | 2037 - HNS_ROCE_CAP_FLAG_SRQ | HNS_ROCE_CAP_FLAG_FRMR | 2038 - HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL; 2039 - 2040 - caps->gid_table_len[0] = HNS_ROCE_V2_GID_INDEX_NUM; 2041 - 2042 - if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) { 2043 - caps->flags |= HNS_ROCE_CAP_FLAG_STASH | 2044 - HNS_ROCE_CAP_FLAG_DIRECT_WQE | 2045 - HNS_ROCE_CAP_FLAG_XRC; 2046 - caps->max_sq_inline = HNS_ROCE_V3_MAX_SQ_INLINE; 2047 - } else { 2048 - caps->max_sq_inline = HNS_ROCE_V2_MAX_SQ_INLINE; 2049 - 2050 - /* The following configuration are only valid for HIP08 */ 2051 - caps->qpc_sz = HNS_ROCE_V2_QPC_SZ; 2052 - caps->sccc_sz = HNS_ROCE_V2_SCCC_SZ; 2053 - caps->cqe_sz = HNS_ROCE_V2_CQE_SIZE; 2054 - } 2055 - } 2056 - 2057 1963 static void calc_pg_sz(u32 obj_num, u32 obj_size, u32 hop_num, u32 ctx_bt_num, 2058 1964 u32 *buf_page_size, u32 *bt_page_size, u32 hem_type) 2059 1965 { ··· 2145 2239 set_hem_page_size(hr_dev); 2146 2240 } 2147 2241 2148 - static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev) 2242 + static int hns_roce_query_caps(struct hns_roce_dev *hr_dev) 2149 2243 { 2150 2244 struct hns_roce_cmq_desc desc[HNS_ROCE_QUERY_PF_CAPS_CMD_NUM]; 2151 2245 struct hns_roce_caps *caps = &hr_dev->caps; ··· 2154 2248 struct hns_roce_query_pf_caps_c *resp_c; 2155 2249 struct hns_roce_query_pf_caps_d *resp_d; 2156 2250 struct hns_roce_query_pf_caps_e *resp_e; 2251 + enum hns_roce_opcode_type cmd; 2157 2252 int ctx_hop_num; 2158 2253 int pbl_hop_num; 2159 2254 int ret; 2160 2255 int i; 2161 2256 2257 + cmd = hr_dev->is_vf ? HNS_ROCE_OPC_QUERY_VF_CAPS_NUM : 2258 + HNS_ROCE_OPC_QUERY_PF_CAPS_NUM; 2259 + 2162 2260 for (i = 0; i < HNS_ROCE_QUERY_PF_CAPS_CMD_NUM; i++) { 2163 - hns_roce_cmq_setup_basic_desc(&desc[i], 2164 - HNS_ROCE_OPC_QUERY_PF_CAPS_NUM, 2165 - true); 2261 + hns_roce_cmq_setup_basic_desc(&desc[i], cmd, true); 2166 2262 if (i < (HNS_ROCE_QUERY_PF_CAPS_CMD_NUM - 1)) 2167 2263 desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); 2168 2264 else ··· 2181 2273 resp_d = (struct hns_roce_query_pf_caps_d *)desc[3].data; 2182 2274 resp_e = (struct hns_roce_query_pf_caps_e *)desc[4].data; 2183 2275 2184 - caps->local_ca_ack_delay = resp_a->local_ca_ack_delay; 2185 - caps->max_sq_sg = le16_to_cpu(resp_a->max_sq_sg); 2186 - caps->max_sq_inline = le16_to_cpu(resp_a->max_sq_inline); 2187 - caps->max_rq_sg = le16_to_cpu(resp_a->max_rq_sg); 2276 + caps->local_ca_ack_delay = resp_a->local_ca_ack_delay; 2277 + caps->max_sq_sg = le16_to_cpu(resp_a->max_sq_sg); 2278 + caps->max_sq_inline = le16_to_cpu(resp_a->max_sq_inline); 2279 + caps->max_rq_sg = le16_to_cpu(resp_a->max_rq_sg); 2188 2280 caps->max_rq_sg = roundup_pow_of_two(caps->max_rq_sg); 2189 - caps->max_srq_sges = le16_to_cpu(resp_a->max_srq_sges); 2281 + caps->max_srq_sges = le16_to_cpu(resp_a->max_srq_sges); 2190 2282 caps->max_srq_sges = roundup_pow_of_two(caps->max_srq_sges); 2191 - caps->num_aeq_vectors = resp_a->num_aeq_vectors; 2192 - caps->num_other_vectors = resp_a->num_other_vectors; 2193 - caps->max_sq_desc_sz = resp_a->max_sq_desc_sz; 2194 - caps->max_rq_desc_sz = resp_a->max_rq_desc_sz; 2195 - caps->cqe_sz = resp_a->cqe_sz; 2283 + caps->num_aeq_vectors = resp_a->num_aeq_vectors; 2284 + caps->num_other_vectors = resp_a->num_other_vectors; 2285 + caps->max_sq_desc_sz = resp_a->max_sq_desc_sz; 2286 + caps->max_rq_desc_sz = resp_a->max_rq_desc_sz; 2196 2287 2197 - caps->mtpt_entry_sz = resp_b->mtpt_entry_sz; 2198 - caps->irrl_entry_sz = resp_b->irrl_entry_sz; 2199 - caps->trrl_entry_sz = resp_b->trrl_entry_sz; 2200 - caps->cqc_entry_sz = resp_b->cqc_entry_sz; 2201 - caps->srqc_entry_sz = resp_b->srqc_entry_sz; 2202 - caps->idx_entry_sz = resp_b->idx_entry_sz; 2203 - caps->sccc_sz = resp_b->sccc_sz; 2204 - caps->max_mtu = resp_b->max_mtu; 2205 - caps->qpc_sz = le16_to_cpu(resp_b->qpc_sz); 2206 - caps->min_cqes = resp_b->min_cqes; 2207 - caps->min_wqes = resp_b->min_wqes; 2208 - caps->page_size_cap = le32_to_cpu(resp_b->page_size_cap); 2209 - caps->pkey_table_len[0] = resp_b->pkey_table_len; 2210 - caps->phy_num_uars = resp_b->phy_num_uars; 2211 - ctx_hop_num = resp_b->ctx_hop_num; 2212 - pbl_hop_num = resp_b->pbl_hop_num; 2288 + caps->mtpt_entry_sz = resp_b->mtpt_entry_sz; 2289 + caps->irrl_entry_sz = resp_b->irrl_entry_sz; 2290 + caps->trrl_entry_sz = resp_b->trrl_entry_sz; 2291 + caps->cqc_entry_sz = resp_b->cqc_entry_sz; 2292 + caps->srqc_entry_sz = resp_b->srqc_entry_sz; 2293 + caps->idx_entry_sz = resp_b->idx_entry_sz; 2294 + caps->sccc_sz = resp_b->sccc_sz; 2295 + caps->max_mtu = resp_b->max_mtu; 2296 + caps->min_cqes = resp_b->min_cqes; 2297 + caps->min_wqes = resp_b->min_wqes; 2298 + caps->page_size_cap = le32_to_cpu(resp_b->page_size_cap); 2299 + caps->pkey_table_len[0] = resp_b->pkey_table_len; 2300 + caps->phy_num_uars = resp_b->phy_num_uars; 2301 + ctx_hop_num = resp_b->ctx_hop_num; 2302 + pbl_hop_num = resp_b->pbl_hop_num; 2213 2303 2214 2304 caps->num_pds = 1 << hr_reg_read(resp_c, PF_CAPS_C_NUM_PDS); 2215 2305 ··· 2230 2324 caps->ceqe_depth = 1 << hr_reg_read(resp_d, PF_CAPS_D_CEQ_DEPTH); 2231 2325 caps->num_comp_vectors = hr_reg_read(resp_d, PF_CAPS_D_NUM_CEQS); 2232 2326 caps->aeqe_depth = 1 << hr_reg_read(resp_d, PF_CAPS_D_AEQ_DEPTH); 2233 - caps->default_aeq_arm_st = hr_reg_read(resp_d, PF_CAPS_D_AEQ_ARM_ST); 2234 - caps->default_ceq_arm_st = hr_reg_read(resp_d, PF_CAPS_D_CEQ_ARM_ST); 2235 2327 caps->reserved_pds = hr_reg_read(resp_d, PF_CAPS_D_RSV_PDS); 2236 2328 caps->num_uars = 1 << hr_reg_read(resp_d, PF_CAPS_D_NUM_UARS); 2237 2329 caps->reserved_qps = hr_reg_read(resp_d, PF_CAPS_D_RSV_QPS); ··· 2240 2336 caps->reserved_cqs = hr_reg_read(resp_e, PF_CAPS_E_RSV_CQS); 2241 2337 caps->reserved_srqs = hr_reg_read(resp_e, PF_CAPS_E_RSV_SRQS); 2242 2338 caps->reserved_lkey = hr_reg_read(resp_e, PF_CAPS_E_RSV_LKEYS); 2243 - caps->default_ceq_max_cnt = le16_to_cpu(resp_e->ceq_max_cnt); 2244 - caps->default_ceq_period = le16_to_cpu(resp_e->ceq_period); 2245 - caps->default_aeq_max_cnt = le16_to_cpu(resp_e->aeq_max_cnt); 2246 - caps->default_aeq_period = le16_to_cpu(resp_e->aeq_period); 2247 2339 2248 2340 caps->qpc_hop_num = ctx_hop_num; 2249 2341 caps->sccc_hop_num = ctx_hop_num; ··· 2256 2356 2257 2357 if (!(caps->page_size_cap & PAGE_SIZE)) 2258 2358 caps->page_size_cap = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED; 2359 + 2360 + if (!hr_dev->is_vf) { 2361 + caps->cqe_sz = resp_a->cqe_sz; 2362 + caps->qpc_sz = le16_to_cpu(resp_b->qpc_sz); 2363 + caps->default_aeq_arm_st = 2364 + hr_reg_read(resp_d, PF_CAPS_D_AEQ_ARM_ST); 2365 + caps->default_ceq_arm_st = 2366 + hr_reg_read(resp_d, PF_CAPS_D_CEQ_ARM_ST); 2367 + caps->default_ceq_max_cnt = le16_to_cpu(resp_e->ceq_max_cnt); 2368 + caps->default_ceq_period = le16_to_cpu(resp_e->ceq_period); 2369 + caps->default_aeq_max_cnt = le16_to_cpu(resp_e->aeq_max_cnt); 2370 + caps->default_aeq_period = le16_to_cpu(resp_e->aeq_period); 2371 + } 2259 2372 2260 2373 return 0; 2261 2374 } ··· 2317 2404 2318 2405 hr_dev->func_num = 1; 2319 2406 2320 - set_default_caps(hr_dev); 2407 + ret = hns_roce_query_caps(hr_dev); 2408 + if (ret) { 2409 + dev_err(dev, "failed to query VF caps, ret = %d.\n", ret); 2410 + return ret; 2411 + } 2321 2412 2322 2413 ret = hns_roce_query_vf_resource(hr_dev); 2323 2414 if (ret) { ··· 2361 2444 return ret; 2362 2445 } 2363 2446 2364 - ret = hns_roce_query_pf_caps(hr_dev); 2365 - if (ret) 2366 - set_default_caps(hr_dev); 2447 + ret = hns_roce_query_caps(hr_dev); 2448 + if (ret) { 2449 + dev_err(dev, "failed to query PF caps, ret = %d.\n", ret); 2450 + return ret; 2451 + } 2367 2452 2368 2453 ret = hns_roce_query_pf_resource(hr_dev); 2369 2454 if (ret) {
+2 -29
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
··· 35 35 36 36 #include <linux/bitops.h> 37 37 38 - #define HNS_ROCE_V2_MAX_QP_NUM 0x1000 39 - #define HNS_ROCE_V2_MAX_WQE_NUM 0x8000 40 - #define HNS_ROCE_V2_MAX_SRQ_WR 0x8000 41 - #define HNS_ROCE_V2_MAX_SRQ_SGE 64 42 - #define HNS_ROCE_V2_MAX_CQ_NUM 0x100000 43 - #define HNS_ROCE_V2_MAX_QPC_TIMER_BT_NUM 0x100 44 - #define HNS_ROCE_V2_MAX_CQC_TIMER_BT_NUM 0x100 45 - #define HNS_ROCE_V2_MAX_SRQ_NUM 0x100000 46 - #define HNS_ROCE_V2_MAX_CQE_NUM 0x400000 47 - #define HNS_ROCE_V2_MAX_RQ_SGE_NUM 64 48 - #define HNS_ROCE_V2_MAX_SQ_SGE_NUM 64 49 - #define HNS_ROCE_V2_MAX_SQ_INLINE 0x20 50 - #define HNS_ROCE_V3_MAX_SQ_INLINE 0x400 51 38 #define HNS_ROCE_V2_MAX_RC_INL_INN_SZ 32 52 - #define HNS_ROCE_V2_UAR_NUM 256 53 - #define HNS_ROCE_V2_PHY_UAR_NUM 1 39 + #define HNS_ROCE_V2_MTT_ENTRY_SZ 64 54 40 #define HNS_ROCE_V2_AEQE_VEC_NUM 1 55 41 #define HNS_ROCE_V2_ABNORMAL_VEC_NUM 1 56 - #define HNS_ROCE_V2_MAX_MTPT_NUM 0x100000 57 42 #define HNS_ROCE_V2_MAX_SRQWQE_SEGS 0x1000000 58 43 #define HNS_ROCE_V2_MAX_IDX_SEGS 0x1000000 59 - #define HNS_ROCE_V2_MAX_PD_NUM 0x1000000 60 44 #define HNS_ROCE_V2_MAX_XRCD_NUM 0x1000000 61 45 #define HNS_ROCE_V2_RSV_XRCD_NUM 0 62 - #define HNS_ROCE_V2_MAX_QP_INIT_RDMA 128 63 - #define HNS_ROCE_V2_MAX_QP_DEST_RDMA 128 64 - #define HNS_ROCE_V2_MAX_SQ_DESC_SZ 64 65 - #define HNS_ROCE_V2_MAX_RQ_DESC_SZ 16 66 - #define HNS_ROCE_V2_IRRL_ENTRY_SZ 64 67 - #define HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ 100 68 - #define HNS_ROCE_V2_CQC_ENTRY_SZ 64 69 - #define HNS_ROCE_V2_SRQC_ENTRY_SZ 64 70 - #define HNS_ROCE_V2_MTPT_ENTRY_SZ 64 71 - #define HNS_ROCE_V2_MTT_ENTRY_SZ 64 72 - #define HNS_ROCE_V2_IDX_ENTRY_SZ 4 73 46 74 - #define HNS_ROCE_V2_SCCC_SZ 32 75 47 #define HNS_ROCE_V3_SCCC_SZ 64 76 48 #define HNS_ROCE_V3_GMV_ENTRY_SZ 32 77 49 ··· 204 232 HNS_ROCE_OPC_QUERY_FUNC_INFO = 0x8407, 205 233 HNS_ROCE_OPC_QUERY_PF_CAPS_NUM = 0x8408, 206 234 HNS_ROCE_OPC_CFG_ENTRY_SIZE = 0x8409, 235 + HNS_ROCE_OPC_QUERY_VF_CAPS_NUM = 0x8410, 207 236 HNS_ROCE_OPC_CFG_SGID_TB = 0x8500, 208 237 HNS_ROCE_OPC_CFG_SMAC_TB = 0x8501, 209 238 HNS_ROCE_OPC_POST_MB = 0x8504,
+1 -1
drivers/infiniband/hw/irdma/cm.c
··· 337 337 338 338 pktsize = sizeof(*tcph) + opts_len + hdr_len + pd_len; 339 339 340 - memset(buf, 0, pktsize); 340 + memset(buf, 0, sizeof(*tcph)); 341 341 342 342 sqbuf->totallen = pktsize; 343 343 sqbuf->tcphlen = sizeof(*tcph) + opts_len;
+107 -211
drivers/infiniband/hw/irdma/ctrl.c
··· 1867 1867 vsi->mtu = info->params->mtu; 1868 1868 vsi->exception_lan_q = info->exception_lan_q; 1869 1869 vsi->vsi_idx = info->pf_data_vsi_num; 1870 - if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1) 1871 - vsi->fcn_id = info->dev->hmc_fn_id; 1872 1870 1873 1871 irdma_set_qos_info(vsi, info->params); 1874 1872 for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++) { ··· 1885 1887 } 1886 1888 1887 1889 /** 1888 - * irdma_get_fcn_id - Return the function id 1890 + * irdma_get_stats_idx - Return stats index 1889 1891 * @vsi: pointer to the vsi 1890 1892 */ 1891 - static u8 irdma_get_fcn_id(struct irdma_sc_vsi *vsi) 1893 + static u8 irdma_get_stats_idx(struct irdma_sc_vsi *vsi) 1892 1894 { 1893 1895 struct irdma_stats_inst_info stats_info = {}; 1894 1896 struct irdma_sc_dev *dev = vsi->dev; 1895 - u8 fcn_id = IRDMA_INVALID_FCN_ID; 1896 - u8 start_idx, max_stats, i; 1897 + u8 i; 1897 1898 1898 - if (dev->hw_attrs.uk_attrs.hw_rev != IRDMA_GEN_1) { 1899 + if (dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { 1899 1900 if (!irdma_cqp_stats_inst_cmd(vsi, IRDMA_OP_STATS_ALLOCATE, 1900 1901 &stats_info)) 1901 1902 return stats_info.stats_idx; 1902 1903 } 1903 1904 1904 - start_idx = 1; 1905 - max_stats = 16; 1906 - for (i = start_idx; i < max_stats; i++) 1907 - if (!dev->fcn_id_array[i]) { 1908 - fcn_id = i; 1909 - dev->fcn_id_array[i] = true; 1910 - break; 1905 + for (i = 0; i < IRDMA_MAX_STATS_COUNT_GEN_1; i++) { 1906 + if (!dev->stats_idx_array[i]) { 1907 + dev->stats_idx_array[i] = true; 1908 + return i; 1911 1909 } 1910 + } 1912 1911 1913 - return fcn_id; 1912 + return IRDMA_INVALID_STATS_IDX; 1913 + } 1914 + 1915 + /** 1916 + * irdma_hw_stats_init_gen1 - Initialize stat reg table used for gen1 1917 + * @vsi: vsi structure where hw_regs are set 1918 + * 1919 + * Populate the HW stats table 1920 + */ 1921 + static void irdma_hw_stats_init_gen1(struct irdma_sc_vsi *vsi) 1922 + { 1923 + struct irdma_sc_dev *dev = vsi->dev; 1924 + const struct irdma_hw_stat_map *map; 1925 + u64 *stat_reg = vsi->hw_stats_regs; 1926 + u64 *regs = dev->hw_stats_regs; 1927 + u16 i, stats_reg_set = vsi->stats_idx; 1928 + 1929 + map = dev->hw_stats_map; 1930 + 1931 + /* First 4 stat instances are reserved for port level statistics. */ 1932 + stats_reg_set += vsi->stats_inst_alloc ? IRDMA_FIRST_NON_PF_STAT : 0; 1933 + 1934 + for (i = 0; i < dev->hw_attrs.max_stat_idx; i++) { 1935 + if (map[i].bitmask <= IRDMA_MAX_STATS_32) 1936 + stat_reg[i] = regs[i] + stats_reg_set * sizeof(u32); 1937 + else 1938 + stat_reg[i] = regs[i] + stats_reg_set * sizeof(u64); 1939 + } 1914 1940 } 1915 1941 1916 1942 /** ··· 1945 1923 int irdma_vsi_stats_init(struct irdma_sc_vsi *vsi, 1946 1924 struct irdma_vsi_stats_info *info) 1947 1925 { 1948 - u8 fcn_id = info->fcn_id; 1949 1926 struct irdma_dma_mem *stats_buff_mem; 1950 1927 1951 1928 vsi->pestat = info->pestat; ··· 1965 1944 IRDMA_GATHER_STATS_BUF_SIZE); 1966 1945 1967 1946 irdma_hw_stats_start_timer(vsi); 1968 - if (info->alloc_fcn_id) 1969 - fcn_id = irdma_get_fcn_id(vsi); 1970 - if (fcn_id == IRDMA_INVALID_FCN_ID) 1971 - goto stats_error; 1972 1947 1973 - vsi->stats_fcn_id_alloc = info->alloc_fcn_id; 1974 - vsi->fcn_id = fcn_id; 1975 - if (info->alloc_fcn_id) { 1976 - vsi->pestat->gather_info.use_stats_inst = true; 1977 - vsi->pestat->gather_info.stats_inst_index = fcn_id; 1948 + /* when stat allocation is not required default to fcn_id. */ 1949 + vsi->stats_idx = info->fcn_id; 1950 + if (info->alloc_stats_inst) { 1951 + u8 stats_idx = irdma_get_stats_idx(vsi); 1952 + 1953 + if (stats_idx != IRDMA_INVALID_STATS_IDX) { 1954 + vsi->stats_inst_alloc = true; 1955 + vsi->stats_idx = stats_idx; 1956 + vsi->pestat->gather_info.use_stats_inst = true; 1957 + vsi->pestat->gather_info.stats_inst_index = stats_idx; 1958 + } 1978 1959 } 1979 1960 1961 + if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1) 1962 + irdma_hw_stats_init_gen1(vsi); 1963 + 1980 1964 return 0; 1981 - 1982 - stats_error: 1983 - dma_free_coherent(vsi->pestat->hw->device, stats_buff_mem->size, 1984 - stats_buff_mem->va, stats_buff_mem->pa); 1985 - stats_buff_mem->va = NULL; 1986 - 1987 - return -EIO; 1988 1965 } 1989 1966 1990 1967 /** ··· 1992 1973 void irdma_vsi_stats_free(struct irdma_sc_vsi *vsi) 1993 1974 { 1994 1975 struct irdma_stats_inst_info stats_info = {}; 1995 - u8 fcn_id = vsi->fcn_id; 1996 1976 struct irdma_sc_dev *dev = vsi->dev; 1977 + u8 stats_idx = vsi->stats_idx; 1997 1978 1998 - if (dev->hw_attrs.uk_attrs.hw_rev != IRDMA_GEN_1) { 1999 - if (vsi->stats_fcn_id_alloc) { 2000 - stats_info.stats_idx = vsi->fcn_id; 1979 + if (dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { 1980 + if (vsi->stats_inst_alloc) { 1981 + stats_info.stats_idx = vsi->stats_idx; 2001 1982 irdma_cqp_stats_inst_cmd(vsi, IRDMA_OP_STATS_FREE, 2002 1983 &stats_info); 2003 1984 } 2004 1985 } else { 2005 - if (vsi->stats_fcn_id_alloc && 2006 - fcn_id < vsi->dev->hw_attrs.max_stat_inst) 2007 - vsi->dev->fcn_id_array[fcn_id] = false; 1986 + if (vsi->stats_inst_alloc && 1987 + stats_idx < vsi->dev->hw_attrs.max_stat_inst) 1988 + vsi->dev->stats_idx_array[stats_idx] = false; 2008 1989 } 2009 1990 2010 1991 if (!vsi->pestat) ··· 5316 5297 gather_stats = vsi->pestat->gather_info.gather_stats_va; 5317 5298 last_gather_stats = vsi->pestat->gather_info.last_gather_stats_va; 5318 5299 irdma_update_stats(&vsi->pestat->hw_stats, gather_stats, 5319 - last_gather_stats); 5300 + last_gather_stats, vsi->dev->hw_stats_map, 5301 + vsi->dev->hw_attrs.max_stat_idx); 5320 5302 } 5321 5303 5322 5304 /** ··· 5425 5405 } 5426 5406 5427 5407 /** 5408 + * irdma_stat_val - Extract HW counter value from statistics buffer 5409 + * @stats_val: pointer to statistics buffer 5410 + * @byteoff: byte offset of counter value in the buffer (8B-aligned) 5411 + * @bitoff: bit offset of counter value within 8B entry 5412 + * @bitmask: maximum counter value (e.g. 0xffffff for 24-bit counter) 5413 + */ 5414 + static inline u64 irdma_stat_val(const u64 *stats_val, u16 byteoff, u8 bitoff, 5415 + u64 bitmask) 5416 + { 5417 + u16 idx = byteoff / sizeof(*stats_val); 5418 + 5419 + return (stats_val[idx] >> bitoff) & bitmask; 5420 + } 5421 + 5422 + /** 5423 + * irdma_stat_delta - Calculate counter delta 5424 + * @new_val: updated counter value 5425 + * @old_val: last counter value 5426 + * @max_val: maximum counter value (e.g. 0xffffff for 24-bit counter) 5427 + */ 5428 + static inline u64 irdma_stat_delta(u64 new_val, u64 old_val, u64 max_val) 5429 + { 5430 + if (new_val >= old_val) 5431 + return new_val - old_val; 5432 + 5433 + /* roll-over case */ 5434 + return max_val - old_val + new_val + 1; 5435 + } 5436 + 5437 + /** 5428 5438 * irdma_update_stats - Update statistics 5429 5439 * @hw_stats: hw_stats instance to update 5430 5440 * @gather_stats: updated stat counters 5431 5441 * @last_gather_stats: last stat counters 5442 + * @map: HW stat map (hw_stats => gather_stats) 5443 + * @max_stat_idx: number of HW stats 5432 5444 */ 5433 5445 void irdma_update_stats(struct irdma_dev_hw_stats *hw_stats, 5434 5446 struct irdma_gather_stats *gather_stats, 5435 - struct irdma_gather_stats *last_gather_stats) 5447 + struct irdma_gather_stats *last_gather_stats, 5448 + const struct irdma_hw_stat_map *map, u16 max_stat_idx) 5436 5449 { 5437 - u64 *stats_val = hw_stats->stats_val_32; 5450 + u64 *stats_val = hw_stats->stats_val; 5451 + u16 i; 5438 5452 5439 - stats_val[IRDMA_HW_STAT_INDEX_RXVLANERR] += 5440 - IRDMA_STATS_DELTA(gather_stats->rxvlanerr, 5441 - last_gather_stats->rxvlanerr, 5442 - IRDMA_MAX_STATS_32); 5443 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXDISCARD] += 5444 - IRDMA_STATS_DELTA(gather_stats->ip4rxdiscard, 5445 - last_gather_stats->ip4rxdiscard, 5446 - IRDMA_MAX_STATS_32); 5447 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXTRUNC] += 5448 - IRDMA_STATS_DELTA(gather_stats->ip4rxtrunc, 5449 - last_gather_stats->ip4rxtrunc, 5450 - IRDMA_MAX_STATS_32); 5451 - stats_val[IRDMA_HW_STAT_INDEX_IP4TXNOROUTE] += 5452 - IRDMA_STATS_DELTA(gather_stats->ip4txnoroute, 5453 - last_gather_stats->ip4txnoroute, 5454 - IRDMA_MAX_STATS_32); 5455 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXDISCARD] += 5456 - IRDMA_STATS_DELTA(gather_stats->ip6rxdiscard, 5457 - last_gather_stats->ip6rxdiscard, 5458 - IRDMA_MAX_STATS_32); 5459 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXTRUNC] += 5460 - IRDMA_STATS_DELTA(gather_stats->ip6rxtrunc, 5461 - last_gather_stats->ip6rxtrunc, 5462 - IRDMA_MAX_STATS_32); 5463 - stats_val[IRDMA_HW_STAT_INDEX_IP6TXNOROUTE] += 5464 - IRDMA_STATS_DELTA(gather_stats->ip6txnoroute, 5465 - last_gather_stats->ip6txnoroute, 5466 - IRDMA_MAX_STATS_32); 5467 - stats_val[IRDMA_HW_STAT_INDEX_TCPRTXSEG] += 5468 - IRDMA_STATS_DELTA(gather_stats->tcprtxseg, 5469 - last_gather_stats->tcprtxseg, 5470 - IRDMA_MAX_STATS_32); 5471 - stats_val[IRDMA_HW_STAT_INDEX_TCPRXOPTERR] += 5472 - IRDMA_STATS_DELTA(gather_stats->tcprxopterr, 5473 - last_gather_stats->tcprxopterr, 5474 - IRDMA_MAX_STATS_32); 5475 - stats_val[IRDMA_HW_STAT_INDEX_TCPRXPROTOERR] += 5476 - IRDMA_STATS_DELTA(gather_stats->tcprxprotoerr, 5477 - last_gather_stats->tcprxprotoerr, 5478 - IRDMA_MAX_STATS_32); 5479 - stats_val[IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED] += 5480 - IRDMA_STATS_DELTA(gather_stats->rxrpcnphandled, 5481 - last_gather_stats->rxrpcnphandled, 5482 - IRDMA_MAX_STATS_32); 5483 - stats_val[IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED] += 5484 - IRDMA_STATS_DELTA(gather_stats->rxrpcnpignored, 5485 - last_gather_stats->rxrpcnpignored, 5486 - IRDMA_MAX_STATS_32); 5487 - stats_val[IRDMA_HW_STAT_INDEX_TXNPCNPSENT] += 5488 - IRDMA_STATS_DELTA(gather_stats->txnpcnpsent, 5489 - last_gather_stats->txnpcnpsent, 5490 - IRDMA_MAX_STATS_32); 5491 - stats_val = hw_stats->stats_val_64; 5492 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXOCTS] += 5493 - IRDMA_STATS_DELTA(gather_stats->ip4rxocts, 5494 - last_gather_stats->ip4rxocts, 5495 - IRDMA_MAX_STATS_48); 5496 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXPKTS] += 5497 - IRDMA_STATS_DELTA(gather_stats->ip4rxpkts, 5498 - last_gather_stats->ip4rxpkts, 5499 - IRDMA_MAX_STATS_48); 5500 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXFRAGS] += 5501 - IRDMA_STATS_DELTA(gather_stats->ip4txfrag, 5502 - last_gather_stats->ip4txfrag, 5503 - IRDMA_MAX_STATS_48); 5504 - stats_val[IRDMA_HW_STAT_INDEX_IP4RXMCPKTS] += 5505 - IRDMA_STATS_DELTA(gather_stats->ip4rxmcpkts, 5506 - last_gather_stats->ip4rxmcpkts, 5507 - IRDMA_MAX_STATS_48); 5508 - stats_val[IRDMA_HW_STAT_INDEX_IP4TXOCTS] += 5509 - IRDMA_STATS_DELTA(gather_stats->ip4txocts, 5510 - last_gather_stats->ip4txocts, 5511 - IRDMA_MAX_STATS_48); 5512 - stats_val[IRDMA_HW_STAT_INDEX_IP4TXPKTS] += 5513 - IRDMA_STATS_DELTA(gather_stats->ip4txpkts, 5514 - last_gather_stats->ip4txpkts, 5515 - IRDMA_MAX_STATS_48); 5516 - stats_val[IRDMA_HW_STAT_INDEX_IP4TXFRAGS] += 5517 - IRDMA_STATS_DELTA(gather_stats->ip4txfrag, 5518 - last_gather_stats->ip4txfrag, 5519 - IRDMA_MAX_STATS_48); 5520 - stats_val[IRDMA_HW_STAT_INDEX_IP4TXMCPKTS] += 5521 - IRDMA_STATS_DELTA(gather_stats->ip4txmcpkts, 5522 - last_gather_stats->ip4txmcpkts, 5523 - IRDMA_MAX_STATS_48); 5524 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXOCTS] += 5525 - IRDMA_STATS_DELTA(gather_stats->ip6rxocts, 5526 - last_gather_stats->ip6rxocts, 5527 - IRDMA_MAX_STATS_48); 5528 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXPKTS] += 5529 - IRDMA_STATS_DELTA(gather_stats->ip6rxpkts, 5530 - last_gather_stats->ip6rxpkts, 5531 - IRDMA_MAX_STATS_48); 5532 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXFRAGS] += 5533 - IRDMA_STATS_DELTA(gather_stats->ip6txfrags, 5534 - last_gather_stats->ip6txfrags, 5535 - IRDMA_MAX_STATS_48); 5536 - stats_val[IRDMA_HW_STAT_INDEX_IP6RXMCPKTS] += 5537 - IRDMA_STATS_DELTA(gather_stats->ip6rxmcpkts, 5538 - last_gather_stats->ip6rxmcpkts, 5539 - IRDMA_MAX_STATS_48); 5540 - stats_val[IRDMA_HW_STAT_INDEX_IP6TXOCTS] += 5541 - IRDMA_STATS_DELTA(gather_stats->ip6txocts, 5542 - last_gather_stats->ip6txocts, 5543 - IRDMA_MAX_STATS_48); 5544 - stats_val[IRDMA_HW_STAT_INDEX_IP6TXPKTS] += 5545 - IRDMA_STATS_DELTA(gather_stats->ip6txpkts, 5546 - last_gather_stats->ip6txpkts, 5547 - IRDMA_MAX_STATS_48); 5548 - stats_val[IRDMA_HW_STAT_INDEX_IP6TXFRAGS] += 5549 - IRDMA_STATS_DELTA(gather_stats->ip6txfrags, 5550 - last_gather_stats->ip6txfrags, 5551 - IRDMA_MAX_STATS_48); 5552 - stats_val[IRDMA_HW_STAT_INDEX_IP6TXMCPKTS] += 5553 - IRDMA_STATS_DELTA(gather_stats->ip6txmcpkts, 5554 - last_gather_stats->ip6txmcpkts, 5555 - IRDMA_MAX_STATS_48); 5556 - stats_val[IRDMA_HW_STAT_INDEX_TCPRXSEGS] += 5557 - IRDMA_STATS_DELTA(gather_stats->tcprxsegs, 5558 - last_gather_stats->tcprxsegs, 5559 - IRDMA_MAX_STATS_48); 5560 - stats_val[IRDMA_HW_STAT_INDEX_TCPTXSEG] += 5561 - IRDMA_STATS_DELTA(gather_stats->tcptxsegs, 5562 - last_gather_stats->tcptxsegs, 5563 - IRDMA_MAX_STATS_48); 5564 - stats_val[IRDMA_HW_STAT_INDEX_RDMARXRDS] += 5565 - IRDMA_STATS_DELTA(gather_stats->rdmarxrds, 5566 - last_gather_stats->rdmarxrds, 5567 - IRDMA_MAX_STATS_48); 5568 - stats_val[IRDMA_HW_STAT_INDEX_RDMARXSNDS] += 5569 - IRDMA_STATS_DELTA(gather_stats->rdmarxsnds, 5570 - last_gather_stats->rdmarxsnds, 5571 - IRDMA_MAX_STATS_48); 5572 - stats_val[IRDMA_HW_STAT_INDEX_RDMARXWRS] += 5573 - IRDMA_STATS_DELTA(gather_stats->rdmarxwrs, 5574 - last_gather_stats->rdmarxwrs, 5575 - IRDMA_MAX_STATS_48); 5576 - stats_val[IRDMA_HW_STAT_INDEX_RDMATXRDS] += 5577 - IRDMA_STATS_DELTA(gather_stats->rdmatxrds, 5578 - last_gather_stats->rdmatxrds, 5579 - IRDMA_MAX_STATS_48); 5580 - stats_val[IRDMA_HW_STAT_INDEX_RDMATXSNDS] += 5581 - IRDMA_STATS_DELTA(gather_stats->rdmatxsnds, 5582 - last_gather_stats->rdmatxsnds, 5583 - IRDMA_MAX_STATS_48); 5584 - stats_val[IRDMA_HW_STAT_INDEX_RDMATXWRS] += 5585 - IRDMA_STATS_DELTA(gather_stats->rdmatxwrs, 5586 - last_gather_stats->rdmatxwrs, 5587 - IRDMA_MAX_STATS_48); 5588 - stats_val[IRDMA_HW_STAT_INDEX_RDMAVBND] += 5589 - IRDMA_STATS_DELTA(gather_stats->rdmavbn, 5590 - last_gather_stats->rdmavbn, 5591 - IRDMA_MAX_STATS_48); 5592 - stats_val[IRDMA_HW_STAT_INDEX_RDMAVINV] += 5593 - IRDMA_STATS_DELTA(gather_stats->rdmavinv, 5594 - last_gather_stats->rdmavinv, 5595 - IRDMA_MAX_STATS_48); 5596 - stats_val[IRDMA_HW_STAT_INDEX_UDPRXPKTS] += 5597 - IRDMA_STATS_DELTA(gather_stats->udprxpkts, 5598 - last_gather_stats->udprxpkts, 5599 - IRDMA_MAX_STATS_48); 5600 - stats_val[IRDMA_HW_STAT_INDEX_UDPTXPKTS] += 5601 - IRDMA_STATS_DELTA(gather_stats->udptxpkts, 5602 - last_gather_stats->udptxpkts, 5603 - IRDMA_MAX_STATS_48); 5604 - stats_val[IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS] += 5605 - IRDMA_STATS_DELTA(gather_stats->rxnpecnmrkpkts, 5606 - last_gather_stats->rxnpecnmrkpkts, 5607 - IRDMA_MAX_STATS_48); 5453 + for (i = 0; i < max_stat_idx; i++) { 5454 + u64 new_val = irdma_stat_val(gather_stats->val, map[i].byteoff, 5455 + map[i].bitoff, map[i].bitmask); 5456 + u64 last_val = irdma_stat_val(last_gather_stats->val, 5457 + map[i].byteoff, map[i].bitoff, 5458 + map[i].bitmask); 5459 + 5460 + stats_val[i] += 5461 + irdma_stat_delta(new_val, last_val, map[i].bitmask); 5462 + } 5463 + 5608 5464 memcpy(last_gather_stats, gather_stats, sizeof(*last_gather_stats)); 5609 5465 }
+6 -3
drivers/infiniband/hw/irdma/defs.h
··· 36 36 #define IRDMA_QP_STATE_ERROR 6 37 37 38 38 #define IRDMA_MAX_TRAFFIC_CLASS 8 39 + #define IRDMA_MAX_STATS_COUNT_GEN_1 12 39 40 #define IRDMA_MAX_USER_PRIORITY 8 40 41 #define IRDMA_MAX_APPS 8 41 42 #define IRDMA_MAX_STATS_COUNT 128 ··· 366 365 #define FLD_RS_32(dev, val, field) \ 367 366 ((u64)((val) & (dev)->hw_masks[field ## _M]) >> (dev)->hw_shifts[field ## _S]) 368 367 369 - #define IRDMA_STATS_DELTA(a, b, c) ((a) >= (b) ? (a) - (b) : (a) + (c) - (b)) 370 - #define IRDMA_MAX_STATS_32 0xFFFFFFFFULL 371 - #define IRDMA_MAX_STATS_48 0xFFFFFFFFFFFFULL 368 + #define IRDMA_MAX_STATS_24 0xffffffULL 369 + #define IRDMA_MAX_STATS_32 0xffffffffULL 370 + #define IRDMA_MAX_STATS_48 0xffffffffffffULL 371 + #define IRDMA_MAX_STATS_56 0xffffffffffffffULL 372 + #define IRDMA_MAX_STATS_64 0xffffffffffffffffULL 372 373 373 374 #define IRDMA_MAX_CQ_READ_THRESH 0x3FFFF 374 375 #define IRDMA_CQPSQ_QHASH_VLANID GENMASK_ULL(43, 32)
+12 -5
drivers/infiniband/hw/irdma/hw.c
··· 1092 1092 int status; 1093 1093 1094 1094 if (rf->msix_shared && !ceq_id) { 1095 + snprintf(msix_vec->name, sizeof(msix_vec->name) - 1, 1096 + "irdma-%s-AEQCEQ-0", dev_name(&rf->pcidev->dev)); 1095 1097 tasklet_setup(&rf->dpc_tasklet, irdma_dpc); 1096 1098 status = request_irq(msix_vec->irq, irdma_irq_handler, 0, 1097 - "AEQCEQ", rf); 1099 + msix_vec->name, rf); 1098 1100 } else { 1101 + snprintf(msix_vec->name, sizeof(msix_vec->name) - 1, 1102 + "irdma-%s-CEQ-%d", 1103 + dev_name(&rf->pcidev->dev), ceq_id); 1099 1104 tasklet_setup(&iwceq->dpc_tasklet, irdma_ceq_dpc); 1100 1105 1101 1106 status = request_irq(msix_vec->irq, irdma_ceq_handler, 0, 1102 - "CEQ", iwceq); 1107 + msix_vec->name, iwceq); 1103 1108 } 1104 1109 cpumask_clear(&msix_vec->mask); 1105 1110 cpumask_set_cpu(msix_vec->cpu_affinity, &msix_vec->mask); ··· 1133 1128 u32 ret = 0; 1134 1129 1135 1130 if (!rf->msix_shared) { 1131 + snprintf(msix_vec->name, sizeof(msix_vec->name) - 1, 1132 + "irdma-%s-AEQ", dev_name(&rf->pcidev->dev)); 1136 1133 tasklet_setup(&rf->dpc_tasklet, irdma_dpc); 1137 1134 ret = request_irq(msix_vec->irq, irdma_irq_handler, 0, 1138 - "irdma", rf); 1135 + msix_vec->name, rf); 1139 1136 } 1140 1137 if (ret) { 1141 1138 ibdev_dbg(&rf->iwdev->ibdev, "ERR: aeq irq config fail\n"); ··· 1911 1904 break; 1912 1905 rf->init_state = CEQ0_CREATED; 1913 1906 /* Handles processing of CQP completions */ 1914 - rf->cqp_cmpl_wq = alloc_ordered_workqueue("cqp_cmpl_wq", 1915 - WQ_HIGHPRI | WQ_UNBOUND); 1907 + rf->cqp_cmpl_wq = 1908 + alloc_ordered_workqueue("cqp_cmpl_wq", WQ_HIGHPRI); 1916 1909 if (!rf->cqp_cmpl_wq) { 1917 1910 status = -ENOMEM; 1918 1911 break;
+51 -9
drivers/infiniband/hw/irdma/i40iw_hw.c
··· 32 32 0xffffffff /* PFINT_RATEN not used in FPK */ 33 33 }; 34 34 35 - static u32 i40iw_stat_offsets_32[IRDMA_HW_STAT_INDEX_MAX_32] = { 35 + static u32 i40iw_stat_offsets[] = { 36 36 I40E_GLPES_PFIP4RXDISCARD(0), 37 37 I40E_GLPES_PFIP4RXTRUNC(0), 38 38 I40E_GLPES_PFIP4TXNOROUTE(0), ··· 42 42 I40E_GLPES_PFTCPRTXSEG(0), 43 43 I40E_GLPES_PFTCPRXOPTERR(0), 44 44 I40E_GLPES_PFTCPRXPROTOERR(0), 45 - I40E_GLPES_PFRXVLANERR(0) 46 - }; 45 + I40E_GLPES_PFRXVLANERR(0), 47 46 48 - static u32 i40iw_stat_offsets_64[IRDMA_HW_STAT_INDEX_MAX_64] = { 49 47 I40E_GLPES_PFIP4RXOCTSLO(0), 50 48 I40E_GLPES_PFIP4RXPKTSLO(0), 51 49 I40E_GLPES_PFIP4RXFRAGSLO(0), ··· 156 158 .irdma_en_irq = i40iw_ena_irq, 157 159 }; 158 160 161 + static const struct irdma_hw_stat_map i40iw_hw_stat_map[] = { 162 + [IRDMA_HW_STAT_INDEX_RXVLANERR] = { 0, 0, IRDMA_MAX_STATS_24 }, 163 + [IRDMA_HW_STAT_INDEX_IP4RXOCTS] = { 8, 0, IRDMA_MAX_STATS_48 }, 164 + [IRDMA_HW_STAT_INDEX_IP4RXPKTS] = { 16, 0, IRDMA_MAX_STATS_48 }, 165 + [IRDMA_HW_STAT_INDEX_IP4RXDISCARD] = { 24, 0, IRDMA_MAX_STATS_32 }, 166 + [IRDMA_HW_STAT_INDEX_IP4RXTRUNC] = { 32, 0, IRDMA_MAX_STATS_32 }, 167 + [IRDMA_HW_STAT_INDEX_IP4RXFRAGS] = { 40, 0, IRDMA_MAX_STATS_48 }, 168 + [IRDMA_HW_STAT_INDEX_IP4RXMCPKTS] = { 48, 0, IRDMA_MAX_STATS_48 }, 169 + [IRDMA_HW_STAT_INDEX_IP6RXOCTS] = { 56, 0, IRDMA_MAX_STATS_48 }, 170 + [IRDMA_HW_STAT_INDEX_IP6RXPKTS] = { 64, 0, IRDMA_MAX_STATS_48 }, 171 + [IRDMA_HW_STAT_INDEX_IP6RXDISCARD] = { 72, 0, IRDMA_MAX_STATS_32 }, 172 + [IRDMA_HW_STAT_INDEX_IP6RXTRUNC] = { 80, 0, IRDMA_MAX_STATS_32 }, 173 + [IRDMA_HW_STAT_INDEX_IP6RXFRAGS] = { 88, 0, IRDMA_MAX_STATS_48 }, 174 + [IRDMA_HW_STAT_INDEX_IP6RXMCPKTS] = { 96, 0, IRDMA_MAX_STATS_48 }, 175 + [IRDMA_HW_STAT_INDEX_IP4TXOCTS] = { 104, 0, IRDMA_MAX_STATS_48 }, 176 + [IRDMA_HW_STAT_INDEX_IP4TXPKTS] = { 112, 0, IRDMA_MAX_STATS_48 }, 177 + [IRDMA_HW_STAT_INDEX_IP4TXFRAGS] = { 120, 0, IRDMA_MAX_STATS_48 }, 178 + [IRDMA_HW_STAT_INDEX_IP4TXMCPKTS] = { 128, 0, IRDMA_MAX_STATS_48 }, 179 + [IRDMA_HW_STAT_INDEX_IP6TXOCTS] = { 136, 0, IRDMA_MAX_STATS_48 }, 180 + [IRDMA_HW_STAT_INDEX_IP6TXPKTS] = { 144, 0, IRDMA_MAX_STATS_48 }, 181 + [IRDMA_HW_STAT_INDEX_IP6TXFRAGS] = { 152, 0, IRDMA_MAX_STATS_48 }, 182 + [IRDMA_HW_STAT_INDEX_IP6TXMCPKTS] = { 160, 0, IRDMA_MAX_STATS_48 }, 183 + [IRDMA_HW_STAT_INDEX_IP4TXNOROUTE] = { 168, 0, IRDMA_MAX_STATS_24 }, 184 + [IRDMA_HW_STAT_INDEX_IP6TXNOROUTE] = { 176, 0, IRDMA_MAX_STATS_24 }, 185 + [IRDMA_HW_STAT_INDEX_TCPRXSEGS] = { 184, 0, IRDMA_MAX_STATS_48 }, 186 + [IRDMA_HW_STAT_INDEX_TCPRXOPTERR] = { 192, 0, IRDMA_MAX_STATS_24 }, 187 + [IRDMA_HW_STAT_INDEX_TCPRXPROTOERR] = { 200, 0, IRDMA_MAX_STATS_24 }, 188 + [IRDMA_HW_STAT_INDEX_TCPTXSEG] = { 208, 0, IRDMA_MAX_STATS_48 }, 189 + [IRDMA_HW_STAT_INDEX_TCPRTXSEG] = { 216, 0, IRDMA_MAX_STATS_32 }, 190 + [IRDMA_HW_STAT_INDEX_RDMARXWRS] = { 224, 0, IRDMA_MAX_STATS_48 }, 191 + [IRDMA_HW_STAT_INDEX_RDMARXRDS] = { 232, 0, IRDMA_MAX_STATS_48 }, 192 + [IRDMA_HW_STAT_INDEX_RDMARXSNDS] = { 240, 0, IRDMA_MAX_STATS_48 }, 193 + [IRDMA_HW_STAT_INDEX_RDMATXWRS] = { 248, 0, IRDMA_MAX_STATS_48 }, 194 + [IRDMA_HW_STAT_INDEX_RDMATXRDS] = { 256, 0, IRDMA_MAX_STATS_48 }, 195 + [IRDMA_HW_STAT_INDEX_RDMATXSNDS] = { 264, 0, IRDMA_MAX_STATS_48 }, 196 + [IRDMA_HW_STAT_INDEX_RDMAVBND] = { 272, 0, IRDMA_MAX_STATS_48 }, 197 + [IRDMA_HW_STAT_INDEX_RDMAVINV] = { 280, 0, IRDMA_MAX_STATS_48 }, 198 + [IRDMA_HW_STAT_INDEX_IP4RXMCOCTS] = { 288, 0, IRDMA_MAX_STATS_48 }, 199 + [IRDMA_HW_STAT_INDEX_IP4TXMCOCTS] = { 296, 0, IRDMA_MAX_STATS_48 }, 200 + [IRDMA_HW_STAT_INDEX_IP6RXMCOCTS] = { 304, 0, IRDMA_MAX_STATS_48 }, 201 + [IRDMA_HW_STAT_INDEX_IP6TXMCOCTS] = { 312, 0, IRDMA_MAX_STATS_48 }, 202 + [IRDMA_HW_STAT_INDEX_UDPRXPKTS] = { 320, 0, IRDMA_MAX_STATS_48 }, 203 + [IRDMA_HW_STAT_INDEX_UDPTXPKTS] = { 328, 0, IRDMA_MAX_STATS_48 }, 204 + }; 205 + 159 206 void i40iw_init_hw(struct irdma_sc_dev *dev) 160 207 { 161 208 int i; ··· 215 172 dev->hw_regs[i] = (u32 __iomem *)(i40iw_regs[i] + hw_addr); 216 173 } 217 174 218 - for (i = 0; i < IRDMA_HW_STAT_INDEX_MAX_32; ++i) 219 - dev->hw_stats_regs_32[i] = i40iw_stat_offsets_32[i]; 220 - 221 - for (i = 0; i < IRDMA_HW_STAT_INDEX_MAX_64; ++i) 222 - dev->hw_stats_regs_64[i] = i40iw_stat_offsets_64[i]; 175 + for (i = 0; i < IRDMA_HW_STAT_INDEX_MAX_GEN_1; ++i) 176 + dev->hw_stats_regs[i] = i40iw_stat_offsets[i]; 223 177 224 178 dev->hw_attrs.first_hw_vf_fpm_id = I40IW_FIRST_VF_FPM_ID; 225 179 dev->hw_attrs.max_hw_vf_fpm_id = IRDMA_MAX_VF_FPM_ID; ··· 235 195 dev->ceq_itr_mask_db = NULL; 236 196 dev->aeq_itr_mask_db = NULL; 237 197 dev->irq_ops = &i40iw_irq_ops; 198 + dev->hw_stats_map = i40iw_hw_stat_map; 238 199 239 200 /* Setup the hardware limits, hmc may limit further */ 240 201 dev->hw_attrs.uk_attrs.max_hw_wq_frags = I40IW_MAX_WQ_FRAGMENT_COUNT; ··· 251 210 dev->hw_attrs.uk_attrs.max_hw_sq_chunk = I40IW_MAX_QUANTA_PER_WR; 252 211 dev->hw_attrs.max_hw_pds = I40IW_MAX_PDS; 253 212 dev->hw_attrs.max_stat_inst = I40IW_MAX_STATS_COUNT; 213 + dev->hw_attrs.max_stat_idx = IRDMA_HW_STAT_INDEX_MAX_GEN_1; 254 214 dev->hw_attrs.max_hw_outbound_msg_size = I40IW_MAX_OUTBOUND_MSG_SIZE; 255 215 dev->hw_attrs.max_hw_inbound_msg_size = I40IW_MAX_INBOUND_MSG_SIZE; 256 216 dev->hw_attrs.max_qp_wr = I40IW_MAX_QP_WRS;
+51
drivers/infiniband/hw/irdma/icrdma_hw.c
··· 111 111 .irdma_en_irq = icrdma_ena_irq, 112 112 }; 113 113 114 + static const struct irdma_hw_stat_map icrdma_hw_stat_map[] = { 115 + [IRDMA_HW_STAT_INDEX_RXVLANERR] = { 0, 32, IRDMA_MAX_STATS_24 }, 116 + [IRDMA_HW_STAT_INDEX_IP4RXOCTS] = { 8, 0, IRDMA_MAX_STATS_48 }, 117 + [IRDMA_HW_STAT_INDEX_IP4RXPKTS] = { 16, 0, IRDMA_MAX_STATS_48 }, 118 + [IRDMA_HW_STAT_INDEX_IP4RXDISCARD] = { 24, 32, IRDMA_MAX_STATS_32 }, 119 + [IRDMA_HW_STAT_INDEX_IP4RXTRUNC] = { 24, 0, IRDMA_MAX_STATS_32 }, 120 + [IRDMA_HW_STAT_INDEX_IP4RXFRAGS] = { 32, 0, IRDMA_MAX_STATS_48 }, 121 + [IRDMA_HW_STAT_INDEX_IP4RXMCOCTS] = { 40, 0, IRDMA_MAX_STATS_48 }, 122 + [IRDMA_HW_STAT_INDEX_IP4RXMCPKTS] = { 48, 0, IRDMA_MAX_STATS_48 }, 123 + [IRDMA_HW_STAT_INDEX_IP6RXOCTS] = { 56, 0, IRDMA_MAX_STATS_48 }, 124 + [IRDMA_HW_STAT_INDEX_IP6RXPKTS] = { 64, 0, IRDMA_MAX_STATS_48 }, 125 + [IRDMA_HW_STAT_INDEX_IP6RXDISCARD] = { 72, 32, IRDMA_MAX_STATS_32 }, 126 + [IRDMA_HW_STAT_INDEX_IP6RXTRUNC] = { 72, 0, IRDMA_MAX_STATS_32 }, 127 + [IRDMA_HW_STAT_INDEX_IP6RXFRAGS] = { 80, 0, IRDMA_MAX_STATS_48 }, 128 + [IRDMA_HW_STAT_INDEX_IP6RXMCOCTS] = { 88, 0, IRDMA_MAX_STATS_48 }, 129 + [IRDMA_HW_STAT_INDEX_IP6RXMCPKTS] = { 96, 0, IRDMA_MAX_STATS_48 }, 130 + [IRDMA_HW_STAT_INDEX_IP4TXOCTS] = { 104, 0, IRDMA_MAX_STATS_48 }, 131 + [IRDMA_HW_STAT_INDEX_IP4TXPKTS] = { 112, 0, IRDMA_MAX_STATS_48 }, 132 + [IRDMA_HW_STAT_INDEX_IP4TXFRAGS] = { 120, 0, IRDMA_MAX_STATS_48 }, 133 + [IRDMA_HW_STAT_INDEX_IP4TXMCOCTS] = { 128, 0, IRDMA_MAX_STATS_48 }, 134 + [IRDMA_HW_STAT_INDEX_IP4TXMCPKTS] = { 136, 0, IRDMA_MAX_STATS_48 }, 135 + [IRDMA_HW_STAT_INDEX_IP6TXOCTS] = { 144, 0, IRDMA_MAX_STATS_48 }, 136 + [IRDMA_HW_STAT_INDEX_IP6TXPKTS] = { 152, 0, IRDMA_MAX_STATS_48 }, 137 + [IRDMA_HW_STAT_INDEX_IP6TXFRAGS] = { 160, 0, IRDMA_MAX_STATS_48 }, 138 + [IRDMA_HW_STAT_INDEX_IP6TXMCOCTS] = { 168, 0, IRDMA_MAX_STATS_48 }, 139 + [IRDMA_HW_STAT_INDEX_IP6TXMCPKTS] = { 176, 0, IRDMA_MAX_STATS_48 }, 140 + [IRDMA_HW_STAT_INDEX_IP4TXNOROUTE] = { 184, 32, IRDMA_MAX_STATS_24 }, 141 + [IRDMA_HW_STAT_INDEX_IP6TXNOROUTE] = { 184, 0, IRDMA_MAX_STATS_24 }, 142 + [IRDMA_HW_STAT_INDEX_TCPRXSEGS] = { 192, 32, IRDMA_MAX_STATS_48 }, 143 + [IRDMA_HW_STAT_INDEX_TCPRXOPTERR] = { 200, 32, IRDMA_MAX_STATS_24 }, 144 + [IRDMA_HW_STAT_INDEX_TCPRXPROTOERR] = { 200, 0, IRDMA_MAX_STATS_24 }, 145 + [IRDMA_HW_STAT_INDEX_TCPTXSEG] = { 208, 0, IRDMA_MAX_STATS_48 }, 146 + [IRDMA_HW_STAT_INDEX_TCPRTXSEG] = { 216, 32, IRDMA_MAX_STATS_32 }, 147 + [IRDMA_HW_STAT_INDEX_UDPRXPKTS] = { 224, 0, IRDMA_MAX_STATS_48 }, 148 + [IRDMA_HW_STAT_INDEX_UDPTXPKTS] = { 232, 0, IRDMA_MAX_STATS_48 }, 149 + [IRDMA_HW_STAT_INDEX_RDMARXWRS] = { 240, 0, IRDMA_MAX_STATS_48 }, 150 + [IRDMA_HW_STAT_INDEX_RDMARXRDS] = { 248, 0, IRDMA_MAX_STATS_48 }, 151 + [IRDMA_HW_STAT_INDEX_RDMARXSNDS] = { 256, 0, IRDMA_MAX_STATS_48 }, 152 + [IRDMA_HW_STAT_INDEX_RDMATXWRS] = { 264, 0, IRDMA_MAX_STATS_48 }, 153 + [IRDMA_HW_STAT_INDEX_RDMATXRDS] = { 272, 0, IRDMA_MAX_STATS_48 }, 154 + [IRDMA_HW_STAT_INDEX_RDMATXSNDS] = { 280, 0, IRDMA_MAX_STATS_48 }, 155 + [IRDMA_HW_STAT_INDEX_RDMAVBND] = { 288, 0, IRDMA_MAX_STATS_48 }, 156 + [IRDMA_HW_STAT_INDEX_RDMAVINV] = { 296, 0, IRDMA_MAX_STATS_48 }, 157 + [IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS] = { 304, 0, IRDMA_MAX_STATS_56 }, 158 + [IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED] = { 312, 32, IRDMA_MAX_STATS_24 }, 159 + [IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED] = { 312, 0, IRDMA_MAX_STATS_32 }, 160 + [IRDMA_HW_STAT_INDEX_TXNPCNPSENT] = { 320, 0, IRDMA_MAX_STATS_32 }, 161 + }; 162 + 114 163 void icrdma_init_hw(struct irdma_sc_dev *dev) 115 164 { 116 165 int i; ··· 189 140 dev->cq_ack_db = dev->hw_regs[IRDMA_CQACK]; 190 141 dev->irq_ops = &icrdma_irq_ops; 191 142 dev->hw_attrs.page_size_cap = SZ_4K | SZ_2M | SZ_1G; 143 + dev->hw_stats_map = icrdma_hw_stat_map; 192 144 dev->hw_attrs.max_hw_ird = ICRDMA_MAX_IRD_SIZE; 193 145 dev->hw_attrs.max_hw_ord = ICRDMA_MAX_ORD_SIZE; 194 146 dev->hw_attrs.max_stat_inst = ICRDMA_MAX_STATS_COUNT; 147 + dev->hw_attrs.max_stat_idx = IRDMA_HW_STAT_INDEX_MAX_GEN_2; 195 148 196 149 dev->hw_attrs.uk_attrs.max_hw_sq_chunk = IRDMA_MAX_QUANTA_PER_WR; 197 150 dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_RTS_AE |
+1
drivers/infiniband/hw/irdma/irdma.h
··· 147 147 u32 max_sleep_count; 148 148 u32 max_cqp_compl_wait_time_ms; 149 149 u16 max_stat_inst; 150 + u16 max_stat_idx; 150 151 }; 151 152 152 153 void i40iw_init_hw(struct irdma_sc_dev *dev);
+3
drivers/infiniband/hw/irdma/main.h
··· 115 115 #define IRDMA_REFLUSH BIT(2) 116 116 #define IRDMA_FLUSH_WAIT BIT(3) 117 117 118 + #define IRDMA_IRQ_NAME_STR_LEN (64) 119 + 118 120 enum init_completion_state { 119 121 INVALID_STATE = 0, 120 122 INITIAL_STATE, ··· 214 212 u32 cpu_affinity; 215 213 u32 ceq_id; 216 214 cpumask_t mask; 215 + char name[IRDMA_IRQ_NAME_STR_LEN]; 217 216 }; 218 217 219 218 struct irdma_mc_table_info {
+8 -8
drivers/infiniband/hw/irdma/pble.c
··· 423 423 * get_lvl1_lvl2_pble - calls get_lvl1 and get_lvl2 pble routine 424 424 * @pble_rsrc: pble resources 425 425 * @palloc: contains all inforamtion regarding pble (idx + pble addr) 426 - * @level1_only: flag for a level 1 PBLE 426 + * @lvl: Bitmask for requested pble level 427 427 */ 428 428 static int get_lvl1_lvl2_pble(struct irdma_hmc_pble_rsrc *pble_rsrc, 429 - struct irdma_pble_alloc *palloc, bool level1_only) 429 + struct irdma_pble_alloc *palloc, u8 lvl) 430 430 { 431 431 int status = 0; 432 432 433 433 status = get_lvl1_pble(pble_rsrc, palloc); 434 - if (!status || level1_only || palloc->total_cnt <= PBLE_PER_PAGE) 434 + if (!status || lvl == PBLE_LEVEL_1 || palloc->total_cnt <= PBLE_PER_PAGE) 435 435 return status; 436 436 437 437 status = get_lvl2_pble(pble_rsrc, palloc); ··· 444 444 * @pble_rsrc: pble resources 445 445 * @palloc: contains all inforamtion regarding pble (idx + pble addr) 446 446 * @pble_cnt: #of pbles requested 447 - * @level1_only: true if only pble level 1 to acquire 447 + * @lvl: requested pble level mask 448 448 */ 449 449 int irdma_get_pble(struct irdma_hmc_pble_rsrc *pble_rsrc, 450 450 struct irdma_pble_alloc *palloc, u32 pble_cnt, 451 - bool level1_only) 451 + u8 lvl) 452 452 { 453 453 int status = 0; 454 454 int max_sds = 0; ··· 462 462 /*check first to see if we can get pble's without acquiring 463 463 * additional sd's 464 464 */ 465 - status = get_lvl1_lvl2_pble(pble_rsrc, palloc, level1_only); 465 + status = get_lvl1_lvl2_pble(pble_rsrc, palloc, lvl); 466 466 if (!status) 467 467 goto exit; 468 468 ··· 472 472 if (status) 473 473 break; 474 474 475 - status = get_lvl1_lvl2_pble(pble_rsrc, palloc, level1_only); 475 + status = get_lvl1_lvl2_pble(pble_rsrc, palloc, lvl); 476 476 /* if level1_only, only go through it once */ 477 - if (!status || level1_only) 477 + if (!status || lvl) 478 478 break; 479 479 } 480 480
+1 -1
drivers/infiniband/hw/irdma/pble.h
··· 114 114 struct irdma_pble_alloc *palloc); 115 115 int irdma_get_pble(struct irdma_hmc_pble_rsrc *pble_rsrc, 116 116 struct irdma_pble_alloc *palloc, u32 pble_cnt, 117 - bool level1_only); 117 + u8 lvl); 118 118 int irdma_prm_add_pble_mem(struct irdma_pble_prm *pprm, 119 119 struct irdma_chunk *pchunk); 120 120 int irdma_prm_get_pbles(struct irdma_pble_prm *pprm,
+4 -4
drivers/infiniband/hw/irdma/protos.h
··· 28 28 void irdma_cqp_gather_stats_gen1(struct irdma_sc_dev *dev, 29 29 struct irdma_vsi_pestat *pestat); 30 30 void irdma_hw_stats_read_all(struct irdma_vsi_pestat *stats, 31 - struct irdma_dev_hw_stats *stats_values, 32 - u64 *hw_stats_regs_32, u64 *hw_stats_regs_64, 33 - u8 hw_rev); 31 + const u64 *hw_stats_regs); 34 32 int irdma_cqp_ws_node_cmd(struct irdma_sc_dev *dev, u8 cmd, 35 33 struct irdma_ws_node_info *node_info); 36 34 int irdma_cqp_ceq_cmd(struct irdma_sc_dev *dev, struct irdma_sc_ceq *sc_ceq, ··· 41 43 void irdma_free_ws_node_id(struct irdma_sc_dev *dev, u16 node_id); 42 44 void irdma_update_stats(struct irdma_dev_hw_stats *hw_stats, 43 45 struct irdma_gather_stats *gather_stats, 44 - struct irdma_gather_stats *last_gather_stats); 46 + struct irdma_gather_stats *last_gather_stats, 47 + const struct irdma_hw_stat_map *map, u16 max_stat_idx); 48 + 45 49 /* vsi functions */ 46 50 int irdma_vsi_stats_init(struct irdma_sc_vsi *vsi, 47 51 struct irdma_vsi_stats_info *info);
+61 -105
drivers/infiniband/hw/irdma/type.h
··· 101 101 IRDMA_QP_EVENT_REQ_ERR, 102 102 }; 103 103 104 - enum irdma_hw_stats_index_32b { 104 + enum irdma_hw_stats_index { 105 + /* gen1 - 32-bit */ 105 106 IRDMA_HW_STAT_INDEX_IP4RXDISCARD = 0, 106 107 IRDMA_HW_STAT_INDEX_IP4RXTRUNC = 1, 107 108 IRDMA_HW_STAT_INDEX_IP4TXNOROUTE = 2, ··· 112 111 IRDMA_HW_STAT_INDEX_TCPRTXSEG = 6, 113 112 IRDMA_HW_STAT_INDEX_TCPRXOPTERR = 7, 114 113 IRDMA_HW_STAT_INDEX_TCPRXPROTOERR = 8, 115 - IRDMA_HW_STAT_INDEX_MAX_32_GEN_1 = 9, /* Must be same value as next entry */ 116 114 IRDMA_HW_STAT_INDEX_RXVLANERR = 9, 117 - IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED = 10, 118 - IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED = 11, 119 - IRDMA_HW_STAT_INDEX_TXNPCNPSENT = 12, 120 - IRDMA_HW_STAT_INDEX_MAX_32, /* Must be last entry */ 121 - }; 122 - 123 - enum irdma_hw_stats_index_64b { 124 - IRDMA_HW_STAT_INDEX_IP4RXOCTS = 0, 125 - IRDMA_HW_STAT_INDEX_IP4RXPKTS = 1, 126 - IRDMA_HW_STAT_INDEX_IP4RXFRAGS = 2, 127 - IRDMA_HW_STAT_INDEX_IP4RXMCPKTS = 3, 128 - IRDMA_HW_STAT_INDEX_IP4TXOCTS = 4, 129 - IRDMA_HW_STAT_INDEX_IP4TXPKTS = 5, 130 - IRDMA_HW_STAT_INDEX_IP4TXFRAGS = 6, 131 - IRDMA_HW_STAT_INDEX_IP4TXMCPKTS = 7, 132 - IRDMA_HW_STAT_INDEX_IP6RXOCTS = 8, 133 - IRDMA_HW_STAT_INDEX_IP6RXPKTS = 9, 134 - IRDMA_HW_STAT_INDEX_IP6RXFRAGS = 10, 135 - IRDMA_HW_STAT_INDEX_IP6RXMCPKTS = 11, 136 - IRDMA_HW_STAT_INDEX_IP6TXOCTS = 12, 137 - IRDMA_HW_STAT_INDEX_IP6TXPKTS = 13, 138 - IRDMA_HW_STAT_INDEX_IP6TXFRAGS = 14, 139 - IRDMA_HW_STAT_INDEX_IP6TXMCPKTS = 15, 140 - IRDMA_HW_STAT_INDEX_TCPRXSEGS = 16, 141 - IRDMA_HW_STAT_INDEX_TCPTXSEG = 17, 142 - IRDMA_HW_STAT_INDEX_RDMARXRDS = 18, 143 - IRDMA_HW_STAT_INDEX_RDMARXSNDS = 19, 144 - IRDMA_HW_STAT_INDEX_RDMARXWRS = 20, 145 - IRDMA_HW_STAT_INDEX_RDMATXRDS = 21, 146 - IRDMA_HW_STAT_INDEX_RDMATXSNDS = 22, 147 - IRDMA_HW_STAT_INDEX_RDMATXWRS = 23, 148 - IRDMA_HW_STAT_INDEX_RDMAVBND = 24, 149 - IRDMA_HW_STAT_INDEX_RDMAVINV = 25, 150 - IRDMA_HW_STAT_INDEX_MAX_64_GEN_1 = 26, /* Must be same value as next entry */ 151 - IRDMA_HW_STAT_INDEX_IP4RXMCOCTS = 26, 152 - IRDMA_HW_STAT_INDEX_IP4TXMCOCTS = 27, 153 - IRDMA_HW_STAT_INDEX_IP6RXMCOCTS = 28, 154 - IRDMA_HW_STAT_INDEX_IP6TXMCOCTS = 29, 155 - IRDMA_HW_STAT_INDEX_UDPRXPKTS = 30, 156 - IRDMA_HW_STAT_INDEX_UDPTXPKTS = 31, 157 - IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS = 32, 158 - IRDMA_HW_STAT_INDEX_MAX_64, /* Must be last entry */ 115 + /* gen1 - 64-bit */ 116 + IRDMA_HW_STAT_INDEX_IP4RXOCTS = 10, 117 + IRDMA_HW_STAT_INDEX_IP4RXPKTS = 11, 118 + IRDMA_HW_STAT_INDEX_IP4RXFRAGS = 12, 119 + IRDMA_HW_STAT_INDEX_IP4RXMCPKTS = 13, 120 + IRDMA_HW_STAT_INDEX_IP4TXOCTS = 14, 121 + IRDMA_HW_STAT_INDEX_IP4TXPKTS = 15, 122 + IRDMA_HW_STAT_INDEX_IP4TXFRAGS = 16, 123 + IRDMA_HW_STAT_INDEX_IP4TXMCPKTS = 17, 124 + IRDMA_HW_STAT_INDEX_IP6RXOCTS = 18, 125 + IRDMA_HW_STAT_INDEX_IP6RXPKTS = 19, 126 + IRDMA_HW_STAT_INDEX_IP6RXFRAGS = 20, 127 + IRDMA_HW_STAT_INDEX_IP6RXMCPKTS = 21, 128 + IRDMA_HW_STAT_INDEX_IP6TXOCTS = 22, 129 + IRDMA_HW_STAT_INDEX_IP6TXPKTS = 23, 130 + IRDMA_HW_STAT_INDEX_IP6TXFRAGS = 24, 131 + IRDMA_HW_STAT_INDEX_IP6TXMCPKTS = 25, 132 + IRDMA_HW_STAT_INDEX_TCPRXSEGS = 26, 133 + IRDMA_HW_STAT_INDEX_TCPTXSEG = 27, 134 + IRDMA_HW_STAT_INDEX_RDMARXRDS = 28, 135 + IRDMA_HW_STAT_INDEX_RDMARXSNDS = 29, 136 + IRDMA_HW_STAT_INDEX_RDMARXWRS = 30, 137 + IRDMA_HW_STAT_INDEX_RDMATXRDS = 31, 138 + IRDMA_HW_STAT_INDEX_RDMATXSNDS = 32, 139 + IRDMA_HW_STAT_INDEX_RDMATXWRS = 33, 140 + IRDMA_HW_STAT_INDEX_RDMAVBND = 34, 141 + IRDMA_HW_STAT_INDEX_RDMAVINV = 35, 142 + IRDMA_HW_STAT_INDEX_IP4RXMCOCTS = 36, 143 + IRDMA_HW_STAT_INDEX_IP4TXMCOCTS = 37, 144 + IRDMA_HW_STAT_INDEX_IP6RXMCOCTS = 38, 145 + IRDMA_HW_STAT_INDEX_IP6TXMCOCTS = 39, 146 + IRDMA_HW_STAT_INDEX_UDPRXPKTS = 40, 147 + IRDMA_HW_STAT_INDEX_UDPTXPKTS = 41, 148 + IRDMA_HW_STAT_INDEX_MAX_GEN_1 = 42, /* Must be same value as next entry */ 149 + /* gen2 - 64-bit */ 150 + IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS = 42, 151 + /* gen2 - 32-bit */ 152 + IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED = 43, 153 + IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED = 44, 154 + IRDMA_HW_STAT_INDEX_TXNPCNPSENT = 45, 155 + IRDMA_HW_STAT_INDEX_MAX_GEN_2 = 46, 159 156 }; 160 157 161 158 enum irdma_feature_type { ··· 273 274 }; 274 275 275 276 struct irdma_dev_hw_stats_offsets { 276 - u32 stats_offset_32[IRDMA_HW_STAT_INDEX_MAX_32]; 277 - u32 stats_offset_64[IRDMA_HW_STAT_INDEX_MAX_64]; 277 + u32 stats_offset[IRDMA_HW_STAT_INDEX_MAX_GEN_1]; 278 278 }; 279 279 280 280 struct irdma_dev_hw_stats { 281 - u64 stats_val_32[IRDMA_HW_STAT_INDEX_MAX_32]; 282 - u64 stats_val_64[IRDMA_HW_STAT_INDEX_MAX_64]; 281 + u64 stats_val[IRDMA_GATHER_STATS_BUF_SIZE / sizeof(u64)]; 283 282 }; 284 283 285 284 struct irdma_gather_stats { 286 - u32 rsvd1; 287 - u32 rxvlanerr; 288 - u64 ip4rxocts; 289 - u64 ip4rxpkts; 290 - u32 ip4rxtrunc; 291 - u32 ip4rxdiscard; 292 - u64 ip4rxfrags; 293 - u64 ip4rxmcocts; 294 - u64 ip4rxmcpkts; 295 - u64 ip6rxocts; 296 - u64 ip6rxpkts; 297 - u32 ip6rxtrunc; 298 - u32 ip6rxdiscard; 299 - u64 ip6rxfrags; 300 - u64 ip6rxmcocts; 301 - u64 ip6rxmcpkts; 302 - u64 ip4txocts; 303 - u64 ip4txpkts; 304 - u64 ip4txfrag; 305 - u64 ip4txmcocts; 306 - u64 ip4txmcpkts; 307 - u64 ip6txocts; 308 - u64 ip6txpkts; 309 - u64 ip6txfrags; 310 - u64 ip6txmcocts; 311 - u64 ip6txmcpkts; 312 - u32 ip6txnoroute; 313 - u32 ip4txnoroute; 314 - u64 tcprxsegs; 315 - u32 tcprxprotoerr; 316 - u32 tcprxopterr; 317 - u64 tcptxsegs; 318 - u32 rsvd2; 319 - u32 tcprtxseg; 320 - u64 udprxpkts; 321 - u64 udptxpkts; 322 - u64 rdmarxwrs; 323 - u64 rdmarxrds; 324 - u64 rdmarxsnds; 325 - u64 rdmatxwrs; 326 - u64 rdmatxrds; 327 - u64 rdmatxsnds; 328 - u64 rdmavbn; 329 - u64 rdmavinv; 330 - u64 rxnpecnmrkpkts; 331 - u32 rxrpcnphandled; 332 - u32 rxrpcnpignored; 333 - u32 txnpcnpsent; 334 - u32 rsvd3[88]; 285 + u64 val[IRDMA_GATHER_STATS_BUF_SIZE / sizeof(u64)]; 286 + }; 287 + 288 + struct irdma_hw_stat_map { 289 + u16 byteoff; 290 + u8 bitoff; 291 + u64 bitmask; 335 292 }; 336 293 337 294 struct irdma_stats_gather_info { ··· 539 584 bool valid; 540 585 }; 541 586 542 - #define IRDMA_INVALID_FCN_ID 0xff 587 + #define IRDMA_INVALID_STATS_IDX 0xff 543 588 struct irdma_sc_vsi { 544 589 u16 vsi_idx; 545 590 struct irdma_sc_dev *dev; ··· 553 598 u32 exception_lan_q; 554 599 u16 mtu; 555 600 u16 vm_id; 556 - u8 fcn_id; 557 601 enum irdma_vm_vf_type vm_vf_type; 558 - bool stats_fcn_id_alloc:1; 602 + bool stats_inst_alloc:1; 559 603 bool tc_change_pending:1; 560 - struct irdma_qos qos[IRDMA_MAX_USER_PRIORITY]; 561 604 struct irdma_vsi_pestat *pestat; 562 605 atomic_t qp_suspend_reqs; 563 606 int (*register_qset)(struct irdma_sc_vsi *vsi, ··· 564 611 struct irdma_ws_node *tc_node); 565 612 u8 qos_rel_bw; 566 613 u8 qos_prio_type; 614 + u8 stats_idx; 567 615 u8 dscp_map[IIDC_MAX_DSCP_MAPPING]; 616 + struct irdma_qos qos[IRDMA_MAX_USER_PRIORITY]; 617 + u64 hw_stats_regs[IRDMA_HW_STAT_INDEX_MAX_GEN_1]; 568 618 bool dscp_mode:1; 569 619 }; 570 620 571 621 struct irdma_sc_dev { 572 622 struct list_head cqp_cmd_head; /* head of the CQP command list */ 573 623 spinlock_t cqp_lock; /* protect CQP list access */ 574 - bool fcn_id_array[IRDMA_MAX_STATS_COUNT]; 624 + bool stats_idx_array[IRDMA_MAX_STATS_COUNT_GEN_1]; 575 625 struct irdma_dma_mem vf_fpm_query_buf[IRDMA_MAX_PE_ENA_VF_COUNT]; 576 626 u64 fpm_query_buf_pa; 577 627 u64 fpm_commit_buf_pa; ··· 593 637 u32 ceq_itr; /* Interrupt throttle, usecs between interrupts: 0 disabled. 2 - 8160 */ 594 638 u64 hw_masks[IRDMA_MAX_MASKS]; 595 639 u64 hw_shifts[IRDMA_MAX_SHIFTS]; 596 - u64 hw_stats_regs_32[IRDMA_HW_STAT_INDEX_MAX_32]; 597 - u64 hw_stats_regs_64[IRDMA_HW_STAT_INDEX_MAX_64]; 640 + const struct irdma_hw_stat_map *hw_stats_map; 641 + u64 hw_stats_regs[IRDMA_HW_STAT_INDEX_MAX_GEN_1]; 598 642 u64 feature_info[IRDMA_MAX_FEATURES]; 599 643 u64 cqp_cmd_stats[IRDMA_MAX_CQP_OPS]; 600 644 struct irdma_hw_attrs hw_attrs; ··· 719 763 struct irdma_vsi_stats_info { 720 764 struct irdma_vsi_pestat *pestat; 721 765 u8 fcn_id; 722 - bool alloc_fcn_id; 766 + bool alloc_stats_inst; 723 767 }; 724 768 725 769 struct irdma_device_init_info {
+18 -154
drivers/infiniband/hw/irdma/utils.c
··· 1634 1634 from_timer(pf_devstat, t, stats_timer); 1635 1635 struct irdma_sc_vsi *sc_vsi = pf_devstat->vsi; 1636 1636 1637 - if (sc_vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1) 1638 - irdma_cqp_gather_stats_gen1(sc_vsi->dev, sc_vsi->pestat); 1639 - else 1637 + if (sc_vsi->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) 1640 1638 irdma_cqp_gather_stats_cmd(sc_vsi->dev, sc_vsi->pestat, false); 1639 + else 1640 + irdma_cqp_gather_stats_gen1(sc_vsi->dev, sc_vsi->pestat); 1641 1641 1642 1642 mod_timer(&pf_devstat->stats_timer, 1643 1643 jiffies + msecs_to_jiffies(STATS_TIMER_DELAY)); ··· 1686 1686 { 1687 1687 struct irdma_gather_stats *gather_stats = 1688 1688 pestat->gather_info.gather_stats_va; 1689 + const struct irdma_hw_stat_map *map = dev->hw_stats_map; 1690 + u16 max_stats_idx = dev->hw_attrs.max_stat_idx; 1689 1691 u32 stats_inst_offset_32; 1690 1692 u32 stats_inst_offset_64; 1693 + u64 new_val; 1694 + u16 i; 1691 1695 1692 1696 stats_inst_offset_32 = (pestat->gather_info.use_stats_inst) ? 1693 - pestat->gather_info.stats_inst_index : 1694 - pestat->hw->hmc.hmc_fn_id; 1697 + pestat->gather_info.stats_inst_index : 1698 + pestat->hw->hmc.hmc_fn_id; 1695 1699 stats_inst_offset_32 *= 4; 1696 1700 stats_inst_offset_64 = stats_inst_offset_32 * 2; 1697 1701 1698 - gather_stats->rxvlanerr = 1699 - rd32(dev->hw, 1700 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_RXVLANERR] 1701 - + stats_inst_offset_32); 1702 - gather_stats->ip4rxdiscard = 1703 - rd32(dev->hw, 1704 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP4RXDISCARD] 1705 - + stats_inst_offset_32); 1706 - gather_stats->ip4rxtrunc = 1707 - rd32(dev->hw, 1708 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP4RXTRUNC] 1709 - + stats_inst_offset_32); 1710 - gather_stats->ip4txnoroute = 1711 - rd32(dev->hw, 1712 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP4TXNOROUTE] 1713 - + stats_inst_offset_32); 1714 - gather_stats->ip6rxdiscard = 1715 - rd32(dev->hw, 1716 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP6RXDISCARD] 1717 - + stats_inst_offset_32); 1718 - gather_stats->ip6rxtrunc = 1719 - rd32(dev->hw, 1720 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP6RXTRUNC] 1721 - + stats_inst_offset_32); 1722 - gather_stats->ip6txnoroute = 1723 - rd32(dev->hw, 1724 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_IP6TXNOROUTE] 1725 - + stats_inst_offset_32); 1726 - gather_stats->tcprtxseg = 1727 - rd32(dev->hw, 1728 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_TCPRTXSEG] 1729 - + stats_inst_offset_32); 1730 - gather_stats->tcprxopterr = 1731 - rd32(dev->hw, 1732 - dev->hw_stats_regs_32[IRDMA_HW_STAT_INDEX_TCPRXOPTERR] 1733 - + stats_inst_offset_32); 1734 - 1735 - gather_stats->ip4rxocts = 1736 - rd64(dev->hw, 1737 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4RXOCTS] 1738 - + stats_inst_offset_64); 1739 - gather_stats->ip4rxpkts = 1740 - rd64(dev->hw, 1741 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4RXPKTS] 1742 - + stats_inst_offset_64); 1743 - gather_stats->ip4txfrag = 1744 - rd64(dev->hw, 1745 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4RXFRAGS] 1746 - + stats_inst_offset_64); 1747 - gather_stats->ip4rxmcpkts = 1748 - rd64(dev->hw, 1749 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4RXMCPKTS] 1750 - + stats_inst_offset_64); 1751 - gather_stats->ip4txocts = 1752 - rd64(dev->hw, 1753 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4TXOCTS] 1754 - + stats_inst_offset_64); 1755 - gather_stats->ip4txpkts = 1756 - rd64(dev->hw, 1757 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4TXPKTS] 1758 - + stats_inst_offset_64); 1759 - gather_stats->ip4txfrag = 1760 - rd64(dev->hw, 1761 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4TXFRAGS] 1762 - + stats_inst_offset_64); 1763 - gather_stats->ip4txmcpkts = 1764 - rd64(dev->hw, 1765 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP4TXMCPKTS] 1766 - + stats_inst_offset_64); 1767 - gather_stats->ip6rxocts = 1768 - rd64(dev->hw, 1769 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6RXOCTS] 1770 - + stats_inst_offset_64); 1771 - gather_stats->ip6rxpkts = 1772 - rd64(dev->hw, 1773 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6RXPKTS] 1774 - + stats_inst_offset_64); 1775 - gather_stats->ip6txfrags = 1776 - rd64(dev->hw, 1777 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6RXFRAGS] 1778 - + stats_inst_offset_64); 1779 - gather_stats->ip6rxmcpkts = 1780 - rd64(dev->hw, 1781 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6RXMCPKTS] 1782 - + stats_inst_offset_64); 1783 - gather_stats->ip6txocts = 1784 - rd64(dev->hw, 1785 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6TXOCTS] 1786 - + stats_inst_offset_64); 1787 - gather_stats->ip6txpkts = 1788 - rd64(dev->hw, 1789 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6TXPKTS] 1790 - + stats_inst_offset_64); 1791 - gather_stats->ip6txfrags = 1792 - rd64(dev->hw, 1793 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6TXFRAGS] 1794 - + stats_inst_offset_64); 1795 - gather_stats->ip6txmcpkts = 1796 - rd64(dev->hw, 1797 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_IP6TXMCPKTS] 1798 - + stats_inst_offset_64); 1799 - gather_stats->tcprxsegs = 1800 - rd64(dev->hw, 1801 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_TCPRXSEGS] 1802 - + stats_inst_offset_64); 1803 - gather_stats->tcptxsegs = 1804 - rd64(dev->hw, 1805 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_TCPTXSEG] 1806 - + stats_inst_offset_64); 1807 - gather_stats->rdmarxrds = 1808 - rd64(dev->hw, 1809 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMARXRDS] 1810 - + stats_inst_offset_64); 1811 - gather_stats->rdmarxsnds = 1812 - rd64(dev->hw, 1813 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMARXSNDS] 1814 - + stats_inst_offset_64); 1815 - gather_stats->rdmarxwrs = 1816 - rd64(dev->hw, 1817 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMARXWRS] 1818 - + stats_inst_offset_64); 1819 - gather_stats->rdmatxrds = 1820 - rd64(dev->hw, 1821 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMATXRDS] 1822 - + stats_inst_offset_64); 1823 - gather_stats->rdmatxsnds = 1824 - rd64(dev->hw, 1825 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMATXSNDS] 1826 - + stats_inst_offset_64); 1827 - gather_stats->rdmatxwrs = 1828 - rd64(dev->hw, 1829 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMATXWRS] 1830 - + stats_inst_offset_64); 1831 - gather_stats->rdmavbn = 1832 - rd64(dev->hw, 1833 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMAVBND] 1834 - + stats_inst_offset_64); 1835 - gather_stats->rdmavinv = 1836 - rd64(dev->hw, 1837 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_RDMAVINV] 1838 - + stats_inst_offset_64); 1839 - gather_stats->udprxpkts = 1840 - rd64(dev->hw, 1841 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_UDPRXPKTS] 1842 - + stats_inst_offset_64); 1843 - gather_stats->udptxpkts = 1844 - rd64(dev->hw, 1845 - dev->hw_stats_regs_64[IRDMA_HW_STAT_INDEX_UDPTXPKTS] 1846 - + stats_inst_offset_64); 1702 + for (i = 0; i < max_stats_idx; i++) { 1703 + if (map[i].bitmask <= IRDMA_MAX_STATS_32) 1704 + new_val = rd32(dev->hw, 1705 + dev->hw_stats_regs[i] + stats_inst_offset_32); 1706 + else 1707 + new_val = rd64(dev->hw, 1708 + dev->hw_stats_regs[i] + stats_inst_offset_64); 1709 + gather_stats->val[map[i].byteoff / sizeof(u64)] = new_val; 1710 + } 1847 1711 1848 1712 irdma_process_stats(pestat); 1849 1713 }
+81 -117
drivers/infiniband/hw/irdma/verbs.c
··· 1226 1226 udp_info->ipv4 = false; 1227 1227 irdma_copy_ip_ntohl(local_ip, daddr); 1228 1228 1229 - udp_info->arp_idx = irdma_arp_table(iwdev->rf, 1230 - &local_ip[0], 1231 - false, NULL, 1232 - IRDMA_ARP_RESOLVE); 1233 1229 } else if (av->net_type == RDMA_NETWORK_IPV4) { 1234 1230 __be32 saddr = av->sgid_addr.saddr_in.sin_addr.s_addr; 1235 1231 __be32 daddr = av->dgid_addr.saddr_in.sin_addr.s_addr; ··· 2325 2329 * irdma_setup_pbles - copy user pg address to pble's 2326 2330 * @rf: RDMA PCI function 2327 2331 * @iwmr: mr pointer for this memory registration 2328 - * @use_pbles: flag if to use pble's 2329 - * @lvl_1_only: request only level 1 pble if true 2332 + * @lvl: requested pble levels 2330 2333 */ 2331 2334 static int irdma_setup_pbles(struct irdma_pci_f *rf, struct irdma_mr *iwmr, 2332 - bool use_pbles, bool lvl_1_only) 2335 + u8 lvl) 2333 2336 { 2334 2337 struct irdma_pbl *iwpbl = &iwmr->iwpbl; 2335 2338 struct irdma_pble_alloc *palloc = &iwpbl->pble_alloc; ··· 2337 2342 int status; 2338 2343 enum irdma_pble_level level = PBLE_LEVEL_1; 2339 2344 2340 - if (use_pbles) { 2345 + if (lvl) { 2341 2346 status = irdma_get_pble(rf->pble_rsrc, palloc, iwmr->page_cnt, 2342 - lvl_1_only); 2347 + lvl); 2343 2348 if (status) 2344 2349 return status; 2345 2350 ··· 2354 2359 2355 2360 irdma_copy_user_pgaddrs(iwmr, pbl, level); 2356 2361 2357 - if (use_pbles) 2362 + if (lvl) 2358 2363 iwmr->pgaddrmem[0] = *pbl; 2359 2364 2360 2365 return 0; ··· 2365 2370 * @iwdev: irdma device 2366 2371 * @req: information for q memory management 2367 2372 * @iwpbl: pble struct 2368 - * @use_pbles: flag to use pble 2373 + * @lvl: pble level mask 2369 2374 */ 2370 2375 static int irdma_handle_q_mem(struct irdma_device *iwdev, 2371 2376 struct irdma_mem_reg_req *req, 2372 - struct irdma_pbl *iwpbl, bool use_pbles) 2377 + struct irdma_pbl *iwpbl, u8 lvl) 2373 2378 { 2374 2379 struct irdma_pble_alloc *palloc = &iwpbl->pble_alloc; 2375 2380 struct irdma_mr *iwmr = iwpbl->iwmr; ··· 2382 2387 bool ret = true; 2383 2388 2384 2389 pg_size = iwmr->page_size; 2385 - err = irdma_setup_pbles(iwdev->rf, iwmr, use_pbles, true); 2390 + err = irdma_setup_pbles(iwdev->rf, iwmr, lvl); 2386 2391 if (err) 2387 2392 return err; 2388 2393 2389 - if (use_pbles) 2394 + if (lvl) 2390 2395 arr = palloc->level1.addr; 2391 2396 2392 2397 switch (iwmr->type) { ··· 2395 2400 hmc_p = &qpmr->sq_pbl; 2396 2401 qpmr->shadow = (dma_addr_t)arr[total]; 2397 2402 2398 - if (use_pbles) { 2403 + if (lvl) { 2399 2404 ret = irdma_check_mem_contiguous(arr, req->sq_pages, 2400 2405 pg_size); 2401 2406 if (ret) ··· 2420 2425 if (!cqmr->split) 2421 2426 cqmr->shadow = (dma_addr_t)arr[req->cq_pages]; 2422 2427 2423 - if (use_pbles) 2428 + if (lvl) 2424 2429 ret = irdma_check_mem_contiguous(arr, req->cq_pages, 2425 2430 pg_size); 2426 2431 ··· 2434 2439 err = -EINVAL; 2435 2440 } 2436 2441 2437 - if (use_pbles && ret) { 2442 + if (lvl && ret) { 2438 2443 irdma_free_pble(iwdev->rf->pble_rsrc, palloc); 2439 2444 iwpbl->pbl_allocated = false; 2440 2445 } ··· 2744 2749 { 2745 2750 struct irdma_device *iwdev = to_iwdev(iwmr->ibmr.device); 2746 2751 struct irdma_pbl *iwpbl = &iwmr->iwpbl; 2747 - bool use_pbles; 2748 2752 u32 stag; 2753 + u8 lvl; 2749 2754 int err; 2750 2755 2751 - use_pbles = iwmr->page_cnt != 1; 2756 + lvl = iwmr->page_cnt != 1 ? PBLE_LEVEL_1 | PBLE_LEVEL_2 : PBLE_LEVEL_0; 2752 2757 2753 - err = irdma_setup_pbles(iwdev->rf, iwmr, use_pbles, false); 2758 + err = irdma_setup_pbles(iwdev->rf, iwmr, lvl); 2754 2759 if (err) 2755 2760 return err; 2756 2761 2757 - if (use_pbles) { 2762 + if (lvl) { 2758 2763 err = irdma_check_mr_contiguous(&iwpbl->pble_alloc, 2759 2764 iwmr->page_size); 2760 2765 if (err) { ··· 2838 2843 struct irdma_pbl *iwpbl = &iwmr->iwpbl; 2839 2844 struct irdma_ucontext *ucontext = NULL; 2840 2845 unsigned long flags; 2841 - bool use_pbles; 2842 2846 u32 total; 2843 2847 int err; 2848 + u8 lvl; 2844 2849 2845 2850 total = req.sq_pages + req.rq_pages + 1; 2846 2851 if (total > iwmr->page_cnt) 2847 2852 return -EINVAL; 2848 2853 2849 2854 total = req.sq_pages + req.rq_pages; 2850 - use_pbles = total > 2; 2851 - err = irdma_handle_q_mem(iwdev, &req, iwpbl, use_pbles); 2855 + lvl = total > 2 ? PBLE_LEVEL_1 : PBLE_LEVEL_0; 2856 + err = irdma_handle_q_mem(iwdev, &req, iwpbl, lvl); 2852 2857 if (err) 2853 2858 return err; 2854 2859 ··· 2871 2876 struct irdma_ucontext *ucontext = NULL; 2872 2877 u8 shadow_pgcnt = 1; 2873 2878 unsigned long flags; 2874 - bool use_pbles; 2875 2879 u32 total; 2876 2880 int err; 2881 + u8 lvl; 2877 2882 2878 2883 if (iwdev->rf->sc_dev.hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_CQ_RESIZE) 2879 2884 shadow_pgcnt = 0; ··· 2881 2886 if (total > iwmr->page_cnt) 2882 2887 return -EINVAL; 2883 2888 2884 - use_pbles = req.cq_pages > 1; 2885 - err = irdma_handle_q_mem(iwdev, &req, iwpbl, use_pbles); 2889 + lvl = req.cq_pages > 1 ? PBLE_LEVEL_1 : PBLE_LEVEL_0; 2890 + err = irdma_handle_q_mem(iwdev, &req, iwpbl, lvl); 2886 2891 if (err) 2887 2892 return err; 2888 2893 ··· 3703 3708 return 0; 3704 3709 } 3705 3710 3706 - static const struct rdma_stat_desc irdma_hw_stat_descs[] = { 3707 - /* 32bit names */ 3708 - [IRDMA_HW_STAT_INDEX_RXVLANERR].name = "rxVlanErrors", 3709 - [IRDMA_HW_STAT_INDEX_IP4RXDISCARD].name = "ip4InDiscards", 3710 - [IRDMA_HW_STAT_INDEX_IP4RXTRUNC].name = "ip4InTruncatedPkts", 3711 - [IRDMA_HW_STAT_INDEX_IP4TXNOROUTE].name = "ip4OutNoRoutes", 3712 - [IRDMA_HW_STAT_INDEX_IP6RXDISCARD].name = "ip6InDiscards", 3713 - [IRDMA_HW_STAT_INDEX_IP6RXTRUNC].name = "ip6InTruncatedPkts", 3714 - [IRDMA_HW_STAT_INDEX_IP6TXNOROUTE].name = "ip6OutNoRoutes", 3715 - [IRDMA_HW_STAT_INDEX_TCPRTXSEG].name = "tcpRetransSegs", 3716 - [IRDMA_HW_STAT_INDEX_TCPRXOPTERR].name = "tcpInOptErrors", 3717 - [IRDMA_HW_STAT_INDEX_TCPRXPROTOERR].name = "tcpInProtoErrors", 3718 - [IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED].name = "cnpHandled", 3719 - [IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED].name = "cnpIgnored", 3720 - [IRDMA_HW_STAT_INDEX_TXNPCNPSENT].name = "cnpSent", 3711 + static const struct rdma_stat_desc irdma_hw_stat_names[] = { 3712 + /* gen1 - 32-bit */ 3713 + [IRDMA_HW_STAT_INDEX_IP4RXDISCARD].name = "ip4InDiscards", 3714 + [IRDMA_HW_STAT_INDEX_IP4RXTRUNC].name = "ip4InTruncatedPkts", 3715 + [IRDMA_HW_STAT_INDEX_IP4TXNOROUTE].name = "ip4OutNoRoutes", 3716 + [IRDMA_HW_STAT_INDEX_IP6RXDISCARD].name = "ip6InDiscards", 3717 + [IRDMA_HW_STAT_INDEX_IP6RXTRUNC].name = "ip6InTruncatedPkts", 3718 + [IRDMA_HW_STAT_INDEX_IP6TXNOROUTE].name = "ip6OutNoRoutes", 3719 + [IRDMA_HW_STAT_INDEX_TCPRTXSEG].name = "tcpRetransSegs", 3720 + [IRDMA_HW_STAT_INDEX_TCPRXOPTERR].name = "tcpInOptErrors", 3721 + [IRDMA_HW_STAT_INDEX_TCPRXPROTOERR].name = "tcpInProtoErrors", 3722 + [IRDMA_HW_STAT_INDEX_RXVLANERR].name = "rxVlanErrors", 3723 + /* gen1 - 64-bit */ 3724 + [IRDMA_HW_STAT_INDEX_IP4RXOCTS].name = "ip4InOctets", 3725 + [IRDMA_HW_STAT_INDEX_IP4RXPKTS].name = "ip4InPkts", 3726 + [IRDMA_HW_STAT_INDEX_IP4RXFRAGS].name = "ip4InReasmRqd", 3727 + [IRDMA_HW_STAT_INDEX_IP4RXMCPKTS].name = "ip4InMcastPkts", 3728 + [IRDMA_HW_STAT_INDEX_IP4TXOCTS].name = "ip4OutOctets", 3729 + [IRDMA_HW_STAT_INDEX_IP4TXPKTS].name = "ip4OutPkts", 3730 + [IRDMA_HW_STAT_INDEX_IP4TXFRAGS].name = "ip4OutSegRqd", 3731 + [IRDMA_HW_STAT_INDEX_IP4TXMCPKTS].name = "ip4OutMcastPkts", 3732 + [IRDMA_HW_STAT_INDEX_IP6RXOCTS].name = "ip6InOctets", 3733 + [IRDMA_HW_STAT_INDEX_IP6RXPKTS].name = "ip6InPkts", 3734 + [IRDMA_HW_STAT_INDEX_IP6RXFRAGS].name = "ip6InReasmRqd", 3735 + [IRDMA_HW_STAT_INDEX_IP6RXMCPKTS].name = "ip6InMcastPkts", 3736 + [IRDMA_HW_STAT_INDEX_IP6TXOCTS].name = "ip6OutOctets", 3737 + [IRDMA_HW_STAT_INDEX_IP6TXPKTS].name = "ip6OutPkts", 3738 + [IRDMA_HW_STAT_INDEX_IP6TXFRAGS].name = "ip6OutSegRqd", 3739 + [IRDMA_HW_STAT_INDEX_IP6TXMCPKTS].name = "ip6OutMcastPkts", 3740 + [IRDMA_HW_STAT_INDEX_TCPRXSEGS].name = "tcpInSegs", 3741 + [IRDMA_HW_STAT_INDEX_TCPTXSEG].name = "tcpOutSegs", 3742 + [IRDMA_HW_STAT_INDEX_RDMARXRDS].name = "iwInRdmaReads", 3743 + [IRDMA_HW_STAT_INDEX_RDMARXSNDS].name = "iwInRdmaSends", 3744 + [IRDMA_HW_STAT_INDEX_RDMARXWRS].name = "iwInRdmaWrites", 3745 + [IRDMA_HW_STAT_INDEX_RDMATXRDS].name = "iwOutRdmaReads", 3746 + [IRDMA_HW_STAT_INDEX_RDMATXSNDS].name = "iwOutRdmaSends", 3747 + [IRDMA_HW_STAT_INDEX_RDMATXWRS].name = "iwOutRdmaWrites", 3748 + [IRDMA_HW_STAT_INDEX_RDMAVBND].name = "iwRdmaBnd", 3749 + [IRDMA_HW_STAT_INDEX_RDMAVINV].name = "iwRdmaInv", 3721 3750 3722 - /* 64bit names */ 3723 - [IRDMA_HW_STAT_INDEX_IP4RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3724 - "ip4InOctets", 3725 - [IRDMA_HW_STAT_INDEX_IP4RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3726 - "ip4InPkts", 3727 - [IRDMA_HW_STAT_INDEX_IP4RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3728 - "ip4InReasmRqd", 3729 - [IRDMA_HW_STAT_INDEX_IP4RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3730 - "ip4InMcastOctets", 3731 - [IRDMA_HW_STAT_INDEX_IP4RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3732 - "ip4InMcastPkts", 3733 - [IRDMA_HW_STAT_INDEX_IP4TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3734 - "ip4OutOctets", 3735 - [IRDMA_HW_STAT_INDEX_IP4TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3736 - "ip4OutPkts", 3737 - [IRDMA_HW_STAT_INDEX_IP4TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3738 - "ip4OutSegRqd", 3739 - [IRDMA_HW_STAT_INDEX_IP4TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3740 - "ip4OutMcastOctets", 3741 - [IRDMA_HW_STAT_INDEX_IP4TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3742 - "ip4OutMcastPkts", 3743 - [IRDMA_HW_STAT_INDEX_IP6RXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3744 - "ip6InOctets", 3745 - [IRDMA_HW_STAT_INDEX_IP6RXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3746 - "ip6InPkts", 3747 - [IRDMA_HW_STAT_INDEX_IP6RXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3748 - "ip6InReasmRqd", 3749 - [IRDMA_HW_STAT_INDEX_IP6RXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3750 - "ip6InMcastOctets", 3751 - [IRDMA_HW_STAT_INDEX_IP6RXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3752 - "ip6InMcastPkts", 3753 - [IRDMA_HW_STAT_INDEX_IP6TXOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3754 - "ip6OutOctets", 3755 - [IRDMA_HW_STAT_INDEX_IP6TXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3756 - "ip6OutPkts", 3757 - [IRDMA_HW_STAT_INDEX_IP6TXFRAGS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3758 - "ip6OutSegRqd", 3759 - [IRDMA_HW_STAT_INDEX_IP6TXMCOCTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3760 - "ip6OutMcastOctets", 3761 - [IRDMA_HW_STAT_INDEX_IP6TXMCPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3762 - "ip6OutMcastPkts", 3763 - [IRDMA_HW_STAT_INDEX_TCPRXSEGS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3764 - "tcpInSegs", 3765 - [IRDMA_HW_STAT_INDEX_TCPTXSEG + IRDMA_HW_STAT_INDEX_MAX_32].name = 3766 - "tcpOutSegs", 3767 - [IRDMA_HW_STAT_INDEX_RDMARXRDS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3768 - "iwInRdmaReads", 3769 - [IRDMA_HW_STAT_INDEX_RDMARXSNDS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3770 - "iwInRdmaSends", 3771 - [IRDMA_HW_STAT_INDEX_RDMARXWRS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3772 - "iwInRdmaWrites", 3773 - [IRDMA_HW_STAT_INDEX_RDMATXRDS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3774 - "iwOutRdmaReads", 3775 - [IRDMA_HW_STAT_INDEX_RDMATXSNDS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3776 - "iwOutRdmaSends", 3777 - [IRDMA_HW_STAT_INDEX_RDMATXWRS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3778 - "iwOutRdmaWrites", 3779 - [IRDMA_HW_STAT_INDEX_RDMAVBND + IRDMA_HW_STAT_INDEX_MAX_32].name = 3780 - "iwRdmaBnd", 3781 - [IRDMA_HW_STAT_INDEX_RDMAVINV + IRDMA_HW_STAT_INDEX_MAX_32].name = 3782 - "iwRdmaInv", 3783 - [IRDMA_HW_STAT_INDEX_UDPRXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3784 - "RxUDP", 3785 - [IRDMA_HW_STAT_INDEX_UDPTXPKTS + IRDMA_HW_STAT_INDEX_MAX_32].name = 3786 - "TxUDP", 3787 - [IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS + IRDMA_HW_STAT_INDEX_MAX_32] 3788 - .name = "RxECNMrkd", 3751 + /* gen2 - 32-bit */ 3752 + [IRDMA_HW_STAT_INDEX_RXRPCNPHANDLED].name = "cnpHandled", 3753 + [IRDMA_HW_STAT_INDEX_RXRPCNPIGNORED].name = "cnpIgnored", 3754 + [IRDMA_HW_STAT_INDEX_TXNPCNPSENT].name = "cnpSent", 3755 + /* gen2 - 64-bit */ 3756 + [IRDMA_HW_STAT_INDEX_IP4RXMCOCTS].name = "ip4InMcastOctets", 3757 + [IRDMA_HW_STAT_INDEX_IP4TXMCOCTS].name = "ip4OutMcastOctets", 3758 + [IRDMA_HW_STAT_INDEX_IP6RXMCOCTS].name = "ip6InMcastOctets", 3759 + [IRDMA_HW_STAT_INDEX_IP6TXMCOCTS].name = "ip6OutMcastOctets", 3760 + [IRDMA_HW_STAT_INDEX_UDPRXPKTS].name = "RxUDP", 3761 + [IRDMA_HW_STAT_INDEX_UDPTXPKTS].name = "TxUDP", 3762 + [IRDMA_HW_STAT_INDEX_RXNPECNMARKEDPKTS].name = "RxECNMrkd", 3763 + 3789 3764 }; 3790 3765 3791 3766 static void irdma_get_dev_fw_str(struct ib_device *dev, char *str) ··· 3775 3810 static struct rdma_hw_stats *irdma_alloc_hw_port_stats(struct ib_device *ibdev, 3776 3811 u32 port_num) 3777 3812 { 3778 - int num_counters = IRDMA_HW_STAT_INDEX_MAX_32 + 3779 - IRDMA_HW_STAT_INDEX_MAX_64; 3813 + struct irdma_device *iwdev = to_iwdev(ibdev); 3814 + struct irdma_sc_dev *dev = &iwdev->rf->sc_dev; 3815 + 3816 + int num_counters = dev->hw_attrs.max_stat_idx; 3780 3817 unsigned long lifespan = RDMA_HW_STATS_DEFAULT_LIFESPAN; 3781 3818 3782 - BUILD_BUG_ON(ARRAY_SIZE(irdma_hw_stat_descs) != 3783 - (IRDMA_HW_STAT_INDEX_MAX_32 + IRDMA_HW_STAT_INDEX_MAX_64)); 3784 - 3785 - return rdma_alloc_hw_stats_struct(irdma_hw_stat_descs, num_counters, 3819 + return rdma_alloc_hw_stats_struct(irdma_hw_stat_names, num_counters, 3786 3820 lifespan); 3787 3821 } 3788 3822 ··· 3804 3840 else 3805 3841 irdma_cqp_gather_stats_gen1(&iwdev->rf->sc_dev, iwdev->vsi.pestat); 3806 3842 3807 - memcpy(&stats->value[0], hw_stats, sizeof(*hw_stats)); 3843 + memcpy(&stats->value[0], hw_stats, sizeof(u64) * stats->num_counters); 3808 3844 3809 3845 return stats->num_counters; 3810 3846 } ··· 4018 4054 mc_qht_elem->mc_grp_ctx.vlan_id = vlan_id; 4019 4055 if (vlan_id < VLAN_N_VID) 4020 4056 mc_qht_elem->mc_grp_ctx.vlan_valid = true; 4021 - mc_qht_elem->mc_grp_ctx.hmc_fcn_id = iwdev->vsi.fcn_id; 4057 + mc_qht_elem->mc_grp_ctx.hmc_fcn_id = iwdev->rf->sc_dev.hmc_fn_id; 4022 4058 mc_qht_elem->mc_grp_ctx.qs_handle = 4023 4059 iwqp->sc_qp.vsi->qos[iwqp->sc_qp.user_pri].qs_handle; 4024 4060 ether_addr_copy(mc_qht_elem->mc_grp_ctx.dest_mac_addr, dmac);
+6 -2
drivers/infiniband/hw/mlx4/qp.c
··· 447 447 struct mlx4_ib_qp *qp, 448 448 struct mlx4_ib_create_qp *ucmd) 449 449 { 450 + u32 cnt; 451 + 450 452 /* Sanity check SQ size before proceeding */ 451 - if ((1 << ucmd->log_sq_bb_count) > dev->dev->caps.max_wqes || 452 - ucmd->log_sq_stride > 453 + if (check_shl_overflow(1, ucmd->log_sq_bb_count, &cnt) || 454 + cnt > dev->dev->caps.max_wqes) 455 + return -EINVAL; 456 + if (ucmd->log_sq_stride > 453 457 ilog2(roundup_pow_of_two(dev->dev->caps.max_sq_desc_sz)) || 454 458 ucmd->log_sq_stride < MLX4_IB_MIN_SQ_STRIDE) 455 459 return -EINVAL;
+142 -29
drivers/infiniband/hw/mlx5/counters.c
··· 5 5 6 6 #include "mlx5_ib.h" 7 7 #include <linux/mlx5/eswitch.h> 8 + #include <linux/mlx5/vport.h> 8 9 #include "counters.h" 9 10 #include "ib_rep.h" 10 11 #include "qp.h" ··· 18 17 19 18 #define INIT_Q_COUNTER(_name) \ 20 19 { .name = #_name, .offset = MLX5_BYTE_OFF(query_q_counter_out, _name)} 20 + 21 + #define INIT_VPORT_Q_COUNTER(_name) \ 22 + { .name = "vport_" #_name, .offset = \ 23 + MLX5_BYTE_OFF(query_q_counter_out, _name)} 21 24 22 25 static const struct mlx5_ib_counter basic_q_cnts[] = { 23 26 INIT_Q_COUNTER(rx_write_requests), ··· 40 35 INIT_Q_COUNTER(packet_seq_err), 41 36 INIT_Q_COUNTER(implied_nak_seq_err), 42 37 INIT_Q_COUNTER(local_ack_timeout_err), 38 + }; 39 + 40 + static const struct mlx5_ib_counter vport_basic_q_cnts[] = { 41 + INIT_VPORT_Q_COUNTER(rx_write_requests), 42 + INIT_VPORT_Q_COUNTER(rx_read_requests), 43 + INIT_VPORT_Q_COUNTER(rx_atomic_requests), 44 + INIT_VPORT_Q_COUNTER(out_of_buffer), 45 + }; 46 + 47 + static const struct mlx5_ib_counter vport_out_of_seq_q_cnts[] = { 48 + INIT_VPORT_Q_COUNTER(out_of_sequence), 49 + }; 50 + 51 + static const struct mlx5_ib_counter vport_retrans_q_cnts[] = { 52 + INIT_VPORT_Q_COUNTER(duplicate_request), 53 + INIT_VPORT_Q_COUNTER(rnr_nak_retry_err), 54 + INIT_VPORT_Q_COUNTER(packet_seq_err), 55 + INIT_VPORT_Q_COUNTER(implied_nak_seq_err), 56 + INIT_VPORT_Q_COUNTER(local_ack_timeout_err), 43 57 }; 44 58 45 59 #define INIT_CONG_COUNTER(_name) \ ··· 89 65 INIT_Q_COUNTER(roce_slow_restart), 90 66 INIT_Q_COUNTER(roce_slow_restart_cnps), 91 67 INIT_Q_COUNTER(roce_slow_restart_trans), 68 + }; 69 + 70 + static const struct mlx5_ib_counter vport_extended_err_cnts[] = { 71 + INIT_VPORT_Q_COUNTER(resp_local_length_error), 72 + INIT_VPORT_Q_COUNTER(resp_cqe_error), 73 + INIT_VPORT_Q_COUNTER(req_cqe_error), 74 + INIT_VPORT_Q_COUNTER(req_remote_invalid_request), 75 + INIT_VPORT_Q_COUNTER(req_remote_access_errors), 76 + INIT_VPORT_Q_COUNTER(resp_remote_access_errors), 77 + INIT_VPORT_Q_COUNTER(resp_cqe_flush_error), 78 + INIT_VPORT_Q_COUNTER(req_cqe_flush_error), 79 + }; 80 + 81 + static const struct mlx5_ib_counter vport_roce_accl_cnts[] = { 82 + INIT_VPORT_Q_COUNTER(roce_adp_retrans), 83 + INIT_VPORT_Q_COUNTER(roce_adp_retrans_to), 84 + INIT_VPORT_Q_COUNTER(roce_slow_restart), 85 + INIT_VPORT_Q_COUNTER(roce_slow_restart_cnps), 86 + INIT_VPORT_Q_COUNTER(roce_slow_restart_trans), 92 87 }; 93 88 94 89 #define INIT_EXT_PPCNT_COUNTER(_name) \ ··· 196 153 return 0; 197 154 } 198 155 156 + static bool vport_qcounters_supported(struct mlx5_ib_dev *dev) 157 + { 158 + return MLX5_CAP_GEN(dev->mdev, q_counter_other_vport) && 159 + MLX5_CAP_GEN(dev->mdev, q_counter_aggregation); 160 + } 199 161 200 162 static const struct mlx5_ib_counters *get_counters(struct mlx5_ib_dev *dev, 201 163 u32 port_num) 202 164 { 203 - return is_mdev_switchdev_mode(dev->mdev) ? &dev->port[0].cnts : 204 - &dev->port[port_num].cnts; 165 + if ((is_mdev_switchdev_mode(dev->mdev) && 166 + !vport_qcounters_supported(dev)) || !port_num) 167 + return &dev->port[0].cnts; 168 + 169 + return &dev->port[port_num - 1].cnts; 205 170 } 206 171 207 172 /** ··· 223 172 */ 224 173 u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u32 port_num) 225 174 { 226 - const struct mlx5_ib_counters *cnts = get_counters(dev, port_num); 175 + const struct mlx5_ib_counters *cnts = get_counters(dev, port_num + 1); 227 176 228 177 return cnts->set_id; 229 178 } ··· 321 270 return ret; 322 271 } 323 272 273 + static int mlx5_ib_query_q_counters_vport(struct mlx5_ib_dev *dev, 274 + u32 port_num, 275 + const struct mlx5_ib_counters *cnts, 276 + struct rdma_hw_stats *stats) 277 + 278 + { 279 + u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {}; 280 + u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {}; 281 + __be32 val; 282 + int ret, i; 283 + 284 + if (!dev->port[port_num].rep || 285 + dev->port[port_num].rep->vport == MLX5_VPORT_UPLINK) 286 + return 0; 287 + 288 + MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER); 289 + MLX5_SET(query_q_counter_in, in, other_vport, 1); 290 + MLX5_SET(query_q_counter_in, in, vport_number, 291 + dev->port[port_num].rep->vport); 292 + MLX5_SET(query_q_counter_in, in, aggregate, 1); 293 + ret = mlx5_cmd_exec_inout(dev->mdev, query_q_counter, in, out); 294 + if (ret) 295 + return ret; 296 + 297 + for (i = 0; i < cnts->num_q_counters; i++) { 298 + val = *(__be32 *)((void *)out + cnts->offsets[i]); 299 + stats->value[i] = (u64)be32_to_cpu(val); 300 + } 301 + 302 + return 0; 303 + } 304 + 324 305 static int do_get_hw_stats(struct ib_device *ibdev, 325 306 struct rdma_hw_stats *stats, 326 307 u32 port_num, int index) 327 308 { 328 309 struct mlx5_ib_dev *dev = to_mdev(ibdev); 329 - const struct mlx5_ib_counters *cnts = get_counters(dev, port_num - 1); 310 + const struct mlx5_ib_counters *cnts = get_counters(dev, port_num); 330 311 struct mlx5_core_dev *mdev; 331 312 int ret, num_counters; 332 313 ··· 369 286 cnts->num_cong_counters + 370 287 cnts->num_ext_ppcnt_counters; 371 288 372 - /* q_counters are per IB device, query the master mdev */ 373 - ret = mlx5_ib_query_q_counters(dev->mdev, cnts, stats, cnts->set_id); 289 + if (is_mdev_switchdev_mode(dev->mdev) && dev->is_rep && port_num != 0) 290 + ret = mlx5_ib_query_q_counters_vport(dev, port_num - 1, cnts, 291 + stats); 292 + else 293 + ret = mlx5_ib_query_q_counters(dev->mdev, cnts, stats, 294 + cnts->set_id); 374 295 if (ret) 375 296 return ret; 297 + 298 + /* We don't expose device counters over Vports */ 299 + if (is_mdev_switchdev_mode(dev->mdev) && port_num != 0) 300 + goto done; 376 301 377 302 if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { 378 303 ret = mlx5_ib_query_ext_ppcnt_counters(dev, cnts, stats); ··· 426 335 u32 type; 427 336 int ret; 428 337 429 - cnts = get_counters(dev, port_num - 1); 338 + cnts = get_counters(dev, port_num); 339 + 430 340 opfcs = cnts->opfcs; 431 341 type = *(u32 *)cnts->descs[index].priv; 432 342 if (type >= MLX5_IB_OPCOUNTER_MAX) ··· 454 362 const struct mlx5_ib_counters *cnts; 455 363 int index, ret, num_hw_counters; 456 364 457 - cnts = get_counters(dev, port_num - 1); 365 + cnts = get_counters(dev, port_num); 458 366 num_hw_counters = cnts->num_q_counters + cnts->num_cong_counters + 459 367 cnts->num_ext_ppcnt_counters; 460 368 for (index = num_hw_counters; ··· 475 383 struct mlx5_ib_dev *dev = to_mdev(ibdev); 476 384 const struct mlx5_ib_counters *cnts; 477 385 478 - cnts = get_counters(dev, port_num - 1); 386 + cnts = get_counters(dev, port_num); 479 387 num_hw_counters = cnts->num_q_counters + cnts->num_cong_counters + 480 388 cnts->num_ext_ppcnt_counters; 481 389 num_counters = num_hw_counters + cnts->num_op_counters; ··· 502 410 mlx5_ib_counter_alloc_stats(struct rdma_counter *counter) 503 411 { 504 412 struct mlx5_ib_dev *dev = to_mdev(counter->device); 505 - const struct mlx5_ib_counters *cnts = 506 - get_counters(dev, counter->port - 1); 413 + const struct mlx5_ib_counters *cnts = get_counters(dev, counter->port); 507 414 508 415 return do_alloc_stats(cnts); 509 416 } ··· 510 419 static int mlx5_ib_counter_update_stats(struct rdma_counter *counter) 511 420 { 512 421 struct mlx5_ib_dev *dev = to_mdev(counter->device); 513 - const struct mlx5_ib_counters *cnts = 514 - get_counters(dev, counter->port - 1); 422 + const struct mlx5_ib_counters *cnts = get_counters(dev, counter->port); 515 423 516 424 return mlx5_ib_query_q_counters(dev->mdev, cnts, 517 425 counter->stats, counter->id); ··· 569 479 } 570 480 571 481 static void mlx5_ib_fill_counters(struct mlx5_ib_dev *dev, 572 - struct rdma_stat_desc *descs, size_t *offsets) 482 + struct rdma_stat_desc *descs, size_t *offsets, 483 + u32 port_num) 573 484 { 574 - int i; 575 - int j = 0; 485 + bool is_vport = is_mdev_switchdev_mode(dev->mdev) && 486 + port_num != MLX5_VPORT_PF; 487 + const struct mlx5_ib_counter *names; 488 + int j = 0, i; 576 489 490 + names = is_vport ? vport_basic_q_cnts : basic_q_cnts; 577 491 for (i = 0; i < ARRAY_SIZE(basic_q_cnts); i++, j++) { 578 - descs[j].name = basic_q_cnts[i].name; 492 + descs[j].name = names[i].name; 579 493 offsets[j] = basic_q_cnts[i].offset; 580 494 } 581 495 496 + names = is_vport ? vport_out_of_seq_q_cnts : out_of_seq_q_cnts; 582 497 if (MLX5_CAP_GEN(dev->mdev, out_of_seq_cnt)) { 583 498 for (i = 0; i < ARRAY_SIZE(out_of_seq_q_cnts); i++, j++) { 584 - descs[j].name = out_of_seq_q_cnts[i].name; 499 + descs[j].name = names[i].name; 585 500 offsets[j] = out_of_seq_q_cnts[i].offset; 586 501 } 587 502 } 588 503 504 + names = is_vport ? vport_retrans_q_cnts : retrans_q_cnts; 589 505 if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) { 590 506 for (i = 0; i < ARRAY_SIZE(retrans_q_cnts); i++, j++) { 591 - descs[j].name = retrans_q_cnts[i].name; 507 + descs[j].name = names[i].name; 592 508 offsets[j] = retrans_q_cnts[i].offset; 593 509 } 594 510 } 595 511 512 + names = is_vport ? vport_extended_err_cnts : extended_err_cnts; 596 513 if (MLX5_CAP_GEN(dev->mdev, enhanced_error_q_counters)) { 597 514 for (i = 0; i < ARRAY_SIZE(extended_err_cnts); i++, j++) { 598 - descs[j].name = extended_err_cnts[i].name; 515 + descs[j].name = names[i].name; 599 516 offsets[j] = extended_err_cnts[i].offset; 600 517 } 601 518 } 602 519 520 + names = is_vport ? vport_roce_accl_cnts : roce_accl_cnts; 603 521 if (MLX5_CAP_GEN(dev->mdev, roce_accl)) { 604 522 for (i = 0; i < ARRAY_SIZE(roce_accl_cnts); i++, j++) { 605 - descs[j].name = roce_accl_cnts[i].name; 523 + descs[j].name = names[i].name; 606 524 offsets[j] = roce_accl_cnts[i].offset; 607 525 } 608 526 } 527 + 528 + if (is_vport) 529 + return; 609 530 610 531 if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { 611 532 for (i = 0; i < ARRAY_SIZE(cong_cnts); i++, j++) { ··· 659 558 660 559 661 560 static int __mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev, 662 - struct mlx5_ib_counters *cnts) 561 + struct mlx5_ib_counters *cnts, u32 port_num) 663 562 { 664 - u32 num_counters, num_op_counters; 563 + u32 num_counters, num_op_counters = 0; 665 564 666 565 num_counters = ARRAY_SIZE(basic_q_cnts); 667 566 ··· 678 577 num_counters += ARRAY_SIZE(roce_accl_cnts); 679 578 680 579 cnts->num_q_counters = num_counters; 580 + 581 + if (is_mdev_switchdev_mode(dev->mdev) && port_num != MLX5_VPORT_PF) 582 + goto skip_non_qcounters; 681 583 682 584 if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { 683 585 cnts->num_cong_counters = ARRAY_SIZE(cong_cnts); ··· 701 597 ft_field_support_2_nic_transmit_rdma.bth_opcode)) 702 598 num_op_counters += ARRAY_SIZE(rdmatx_cnp_op_cnts); 703 599 600 + skip_non_qcounters: 704 601 cnts->num_op_counters = num_op_counters; 705 602 num_counters += num_op_counters; 706 603 cnts->descs = kcalloc(num_counters, ··· 728 623 int num_cnt_ports; 729 624 int i, j; 730 625 731 - num_cnt_ports = is_mdev_switchdev_mode(dev->mdev) ? 1 : dev->num_ports; 626 + num_cnt_ports = (!is_mdev_switchdev_mode(dev->mdev) || 627 + vport_qcounters_supported(dev)) ? dev->num_ports : 1; 732 628 733 629 MLX5_SET(dealloc_q_counter_in, in, opcode, 734 630 MLX5_CMD_OP_DEALLOC_Q_COUNTER); ··· 768 662 769 663 MLX5_SET(alloc_q_counter_in, in, opcode, MLX5_CMD_OP_ALLOC_Q_COUNTER); 770 664 is_shared = MLX5_CAP_GEN(dev->mdev, log_max_uctx) != 0; 771 - num_cnt_ports = is_mdev_switchdev_mode(dev->mdev) ? 1 : dev->num_ports; 665 + num_cnt_ports = (!is_mdev_switchdev_mode(dev->mdev) || 666 + vport_qcounters_supported(dev)) ? dev->num_ports : 1; 772 667 773 668 for (i = 0; i < num_cnt_ports; i++) { 774 - err = __mlx5_ib_alloc_counters(dev, &dev->port[i].cnts); 669 + err = __mlx5_ib_alloc_counters(dev, &dev->port[i].cnts, i); 775 670 if (err) 776 671 goto err_alloc; 777 672 778 673 mlx5_ib_fill_counters(dev, dev->port[i].cnts.descs, 779 - dev->port[i].cnts.offsets); 674 + dev->port[i].cnts.offsets, i); 780 675 781 676 MLX5_SET(alloc_q_counter_in, in, uid, 782 677 is_shared ? MLX5_SHARED_RESOURCE_UID : 0); ··· 996 889 mlx5_ib_modify_stat : NULL, 997 890 }; 998 891 892 + static const struct ib_device_ops hw_switchdev_vport_op = { 893 + .alloc_hw_port_stats = mlx5_ib_alloc_hw_port_stats, 894 + }; 895 + 999 896 static const struct ib_device_ops hw_switchdev_stats_ops = { 1000 897 .alloc_hw_device_stats = mlx5_ib_alloc_hw_device_stats, 1001 898 .get_hw_stats = mlx5_ib_get_hw_stats, ··· 1025 914 if (!MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) 1026 915 return 0; 1027 916 1028 - if (is_mdev_switchdev_mode(dev->mdev)) 917 + if (is_mdev_switchdev_mode(dev->mdev)) { 1029 918 ib_set_device_ops(&dev->ib_dev, &hw_switchdev_stats_ops); 1030 - else 919 + if (vport_qcounters_supported(dev)) 920 + ib_set_device_ops(&dev->ib_dev, &hw_switchdev_vport_op); 921 + } else 1031 922 ib_set_device_ops(&dev->ib_dev, &hw_stats_ops); 1032 923 return mlx5_ib_alloc_counters(dev); 1033 924 }
+26 -7
drivers/infiniband/hw/mlx5/devx.c
··· 666 666 obj_id; 667 667 668 668 case MLX5_IB_OBJECT_DEVX_OBJ: 669 - return ((struct devx_obj *)uobj->object)->obj_id == obj_id; 669 + { 670 + u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode); 671 + struct devx_obj *devx_uobj = uobj->object; 672 + 673 + if (opcode == MLX5_CMD_OP_QUERY_FLOW_COUNTER && 674 + devx_uobj->flow_counter_bulk_size) { 675 + u64 end; 676 + 677 + end = devx_uobj->obj_id + 678 + devx_uobj->flow_counter_bulk_size; 679 + return devx_uobj->obj_id <= obj_id && end > obj_id; 680 + } 681 + 682 + return devx_uobj->obj_id == obj_id; 683 + } 670 684 671 685 default: 672 686 return false; ··· 1531 1517 goto obj_free; 1532 1518 1533 1519 if (opcode == MLX5_CMD_OP_ALLOC_FLOW_COUNTER) { 1534 - u8 bulk = MLX5_GET(alloc_flow_counter_in, 1535 - cmd_in, 1536 - flow_counter_bulk); 1537 - obj->flow_counter_bulk_size = 128UL * bulk; 1520 + u32 bulk = MLX5_GET(alloc_flow_counter_in, 1521 + cmd_in, 1522 + flow_counter_bulk_log_size); 1523 + 1524 + if (bulk) 1525 + bulk = 1 << bulk; 1526 + else 1527 + bulk = 128UL * MLX5_GET(alloc_flow_counter_in, 1528 + cmd_in, 1529 + flow_counter_bulk); 1530 + obj->flow_counter_bulk_size = bulk; 1538 1531 } 1539 1532 1540 1533 uobj->object = obj; ··· 2014 1993 int redirect_fd; 2015 1994 bool use_eventfd = false; 2016 1995 int num_events; 2017 - int num_alloc_xa_entries = 0; 2018 1996 u16 obj_type = 0; 2019 1997 u64 cookie = 0; 2020 1998 u32 obj_id = 0; ··· 2095 2075 if (err) 2096 2076 goto err; 2097 2077 2098 - num_alloc_xa_entries++; 2099 2078 event_sub = kzalloc(sizeof(*event_sub), GFP_KERNEL); 2100 2079 if (!event_sub) { 2101 2080 err = -ENOMEM;
+8 -4
drivers/infiniband/hw/mlx5/mr.c
··· 67 67 MLX5_SET(mkc, mkc, lw, !!(acc & IB_ACCESS_LOCAL_WRITE)); 68 68 MLX5_SET(mkc, mkc, lr, 1); 69 69 70 - if ((acc & IB_ACCESS_RELAXED_ORDERING) && 71 - pcie_relaxed_ordering_enabled(dev->mdev->pdev)) { 70 + if (acc & IB_ACCESS_RELAXED_ORDERING) { 72 71 if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write)) 73 72 MLX5_SET(mkc, mkc, relaxed_ordering_write, 1); 74 - if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read)) 73 + 74 + if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) || 75 + (MLX5_CAP_GEN(dev->mdev, 76 + relaxed_ordering_read_pci_enabled) && 77 + pcie_relaxed_ordering_enabled(dev->mdev->pdev))) 75 78 MLX5_SET(mkc, mkc, relaxed_ordering_read, 1); 76 79 } 77 80 ··· 794 791 ret |= IB_ACCESS_RELAXED_ORDERING; 795 792 796 793 if ((access_flags & IB_ACCESS_RELAXED_ORDERING) && 797 - MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) && 794 + (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) || 795 + MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) && 798 796 !MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_umr)) 799 797 ret |= IB_ACCESS_RELAXED_ORDERING; 800 798
+13 -6
drivers/infiniband/hw/mlx5/qp.c
··· 60 60 MLX5_RAW_QP_RATE_LIMIT = 1UL << 1, 61 61 }; 62 62 63 + enum { 64 + MLX5_QP_RM_GO_BACK_N = 0x1, 65 + }; 66 + 63 67 struct mlx5_modify_raw_qp_param { 64 68 u16 operation; 65 69 ··· 2523 2519 if (qp->flags & IB_QP_CREATE_IPOIB_UD_LSO) 2524 2520 MLX5_SET(qpc, qpc, ulp_stateless_offload_mode, 1); 2525 2521 2522 + if (qp->flags & IB_QP_CREATE_INTEGRITY_EN && 2523 + MLX5_CAP_GEN(mdev, go_back_n)) 2524 + MLX5_SET(qpc, qpc, retry_mode, MLX5_QP_RM_GO_BACK_N); 2525 + 2526 2526 err = mlx5_qpc_create_qp(dev, &base->mqp, in, inlen, out); 2527 2527 kvfree(in); 2528 2528 if (err) ··· 2854 2846 case MLX5_QP_FLAG_SCATTER_CQE: 2855 2847 case MLX5_QP_FLAG_ALLOW_SCATTER_CQE: 2856 2848 /* 2857 - * We don't return error if these flags were provided, 2858 - * and mlx5 doesn't have right capability. 2859 - */ 2849 + * We don't return error if these flags were provided, 2850 + * and mlx5 doesn't have right capability. 2851 + */ 2860 2852 *flags &= ~(MLX5_QP_FLAG_SCATTER_CQE | 2861 2853 MLX5_QP_FLAG_ALLOW_SCATTER_CQE); 2862 2854 return; ··· 4493 4485 return -EINVAL; 4494 4486 4495 4487 if (attr->port_num == 0 || 4496 - attr->port_num > MLX5_CAP_GEN(dev->mdev, num_ports)) { 4488 + attr->port_num > dev->num_ports) { 4497 4489 mlx5_ib_dbg(dev, "invalid port number %d. number of ports is %d\n", 4498 4490 attr->port_num, dev->num_ports); 4499 4491 return -EINVAL; ··· 5600 5592 if (wq_attr->flags_mask & IB_WQ_FLAGS_CVLAN_STRIPPING) { 5601 5593 if (!(MLX5_CAP_GEN(dev->mdev, eth_net_offloads) && 5602 5594 MLX5_CAP_ETH(dev->mdev, vlan_cap))) { 5603 - mlx5_ib_dbg(dev, "VLAN offloads are not " 5604 - "supported\n"); 5595 + mlx5_ib_dbg(dev, "VLAN offloads are not supported\n"); 5605 5596 err = -EOPNOTSUPP; 5606 5597 goto out; 5607 5598 }
+5 -2
drivers/infiniband/hw/mlx5/umr.c
··· 380 380 struct mlx5_mkey_seg *seg, 381 381 unsigned int access_flags) 382 382 { 383 + bool ro_read = (access_flags & IB_ACCESS_RELAXED_ORDERING) && 384 + (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) || 385 + pcie_relaxed_ordering_enabled(dev->mdev->pdev)); 386 + 383 387 MLX5_SET(mkc, seg, a, !!(access_flags & IB_ACCESS_REMOTE_ATOMIC)); 384 388 MLX5_SET(mkc, seg, rw, !!(access_flags & IB_ACCESS_REMOTE_WRITE)); 385 389 MLX5_SET(mkc, seg, rr, !!(access_flags & IB_ACCESS_REMOTE_READ)); ··· 391 387 MLX5_SET(mkc, seg, lr, 1); 392 388 MLX5_SET(mkc, seg, relaxed_ordering_write, 393 389 !!(access_flags & IB_ACCESS_RELAXED_ORDERING)); 394 - MLX5_SET(mkc, seg, relaxed_ordering_read, 395 - !!(access_flags & IB_ACCESS_RELAXED_ORDERING)); 390 + MLX5_SET(mkc, seg, relaxed_ordering_read, ro_read); 396 391 } 397 392 398 393 int mlx5r_umr_rereg_pd_access(struct mlx5_ib_mr *mr, struct ib_pd *pd,
+2 -1
drivers/infiniband/hw/mlx5/umr.h
··· 62 62 return false; 63 63 64 64 if ((diffs & IB_ACCESS_RELAXED_ORDERING) && 65 - MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) && 65 + (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) || 66 + MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) && 66 67 !MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_umr)) 67 68 return false; 68 69
-2
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
··· 1589 1589 { 1590 1590 unsigned long cq_flags; 1591 1591 unsigned long flags; 1592 - int discard_cnt = 0; 1593 1592 u32 cur_getp, stop_getp; 1594 1593 struct ocrdma_cqe *cqe; 1595 1594 u32 qpn = 0, wqe_idx = 0; ··· 1640 1641 /* mark cqe discarded so that it is not picked up later 1641 1642 * in the poll_cq(). 1642 1643 */ 1643 - discard_cnt += 1; 1644 1644 cqe->cmn.qpn = 0; 1645 1645 skip_cqe: 1646 1646 cur_getp = (cur_getp + 1) % cq->max_hw_cqe;
+4 -5
drivers/infiniband/hw/qib/qib_file_ops.c
··· 484 484 const struct qib_tid_info *ti) 485 485 { 486 486 int ret = 0; 487 - u32 tid, ctxttid, cnt, limit, tidcnt; 487 + u32 tid, ctxttid, limit, tidcnt; 488 488 struct qib_devdata *dd = rcd->dd; 489 489 u64 __iomem *tidbase; 490 490 unsigned long tidmap[8]; ··· 520 520 /* just in case size changes in future */ 521 521 limit = tidcnt; 522 522 tid = find_first_bit(tidmap, limit); 523 - for (cnt = 0; tid < limit; tid++) { 523 + for (; tid < limit; tid++) { 524 524 /* 525 525 * small optimization; if we detect a run of 3 or so without 526 526 * any set, use find_first_bit again. That's mainly to ··· 530 530 */ 531 531 if (!test_bit(tid, tidmap)) 532 532 continue; 533 - cnt++; 533 + 534 534 if (dd->pageshadow[ctxttid + tid]) { 535 535 struct page *p; 536 536 dma_addr_t phys; ··· 1768 1768 { 1769 1769 struct qib_devdata *dd = rcd->dd; 1770 1770 int ctxt_tidbase = rcd->ctxt * dd->rcvtidcnt; 1771 - int i, cnt = 0, maxtid = ctxt_tidbase + dd->rcvtidcnt; 1771 + int i, maxtid = ctxt_tidbase + dd->rcvtidcnt; 1772 1772 1773 1773 for (i = ctxt_tidbase; i < maxtid; i++) { 1774 1774 struct page *p = dd->pageshadow[i]; ··· 1783 1783 dma_unmap_page(&dd->pcidev->dev, phys, PAGE_SIZE, 1784 1784 DMA_FROM_DEVICE); 1785 1785 qib_release_user_pages(&p, 1); 1786 - cnt++; 1787 1786 } 1788 1787 } 1789 1788
-8
drivers/infiniband/hw/qib/qib_pcie.c
··· 35 35 #include <linux/io.h> 36 36 #include <linux/delay.h> 37 37 #include <linux/vmalloc.h> 38 - #include <linux/aer.h> 39 38 #include <linux/module.h> 40 39 41 40 #include "qib.h" ··· 104 105 } 105 106 106 107 pci_set_master(pdev); 107 - ret = pci_enable_pcie_error_reporting(pdev); 108 - if (ret) { 109 - qib_early_err(&pdev->dev, 110 - "Unable to enable pcie error reporting: %d\n", 111 - ret); 112 - ret = 0; 113 - } 114 108 goto done; 115 109 116 110 bail:
+3 -8
drivers/infiniband/hw/qib/qib_user_sdma.c
··· 320 320 unpin_user_page(page); 321 321 } else { 322 322 /* coalesce case */ 323 - kunmap(page); 324 323 __free_page(page); 325 324 } 326 325 ret = -ENOMEM; ··· 571 572 goto done; 572 573 } 573 574 574 - mpage = kmap(page); 575 + mpage = page_address(page); 575 576 mpage_save = mpage; 576 577 for (i = 0; i < niov; i++) { 577 578 int cfur; ··· 580 581 iov[i].iov_base, iov[i].iov_len); 581 582 if (cfur) { 582 583 ret = -EFAULT; 583 - goto free_unmap; 584 + goto page_free; 584 585 } 585 586 586 587 mpage += iov[i].iov_len; ··· 591 592 page, 0, 0, len, mpage_save); 592 593 goto done; 593 594 594 - free_unmap: 595 - kunmap(page); 595 + page_free: 596 596 __free_page(page); 597 597 done: 598 598 return ret; ··· 624 626 pkt->addr[i].addr, 625 627 pkt->addr[i].dma_length, 626 628 DMA_TO_DEVICE); 627 - 628 - if (pkt->addr[i].kvaddr) 629 - kunmap(pkt->addr[i].page); 630 629 631 630 if (pkt->addr[i].put_page) 632 631 unpin_user_page(pkt->addr[i].page);
-2
drivers/infiniband/hw/usnic/usnic_ib_main.c
··· 602 602 usnic_vnic_free(vf->vnic); 603 603 out_release_regions: 604 604 pci_set_drvdata(pdev, NULL); 605 - pci_clear_master(pdev); 606 605 pci_release_regions(pdev); 607 606 out_disable_device: 608 607 pci_disable_device(pdev); ··· 622 623 kref_put(&pf->vf_cnt, usnic_ib_undiscover_pf); 623 624 usnic_vnic_free(vf->vnic); 624 625 pci_set_drvdata(pdev, NULL); 625 - pci_clear_master(pdev); 626 626 pci_release_regions(pdev); 627 627 pci_disable_device(pdev); 628 628 kfree(vf);
+1 -3
drivers/infiniband/sw/rdmavt/qp.c
··· 464 464 if (qps_inuse) 465 465 rvt_pr_err(rdi, "QP memory leak! %u still in use\n", 466 466 qps_inuse); 467 - if (!rdi->qp_dev) 468 - return; 469 467 470 468 kfree(rdi->qp_dev->qp_table); 471 469 free_qpn_table(&rdi->qp_dev->qpn_table); ··· 2038 2040 wqe = rvt_get_swqe_ptr(qp, qp->s_head); 2039 2041 2040 2042 /* cplen has length from above */ 2041 - memcpy(&wqe->wr, wr, cplen); 2043 + memcpy(&wqe->ud_wr, wr, cplen); 2042 2044 2043 2045 wqe->length = 0; 2044 2046 j = 0;
+9 -7
drivers/infiniband/sw/rxe/rxe.c
··· 160 160 161 161 port->attr.active_mtu = mtu; 162 162 port->mtu_cap = ib_mtu_enum_to_int(mtu); 163 + 164 + rxe_info_dev(rxe, "Set mtu to %d", port->mtu_cap); 163 165 } 164 166 165 167 /* called by ifc layer to create new rxe device. ··· 177 175 178 176 static int rxe_newlink(const char *ibdev_name, struct net_device *ndev) 179 177 { 180 - struct rxe_dev *exists; 178 + struct rxe_dev *rxe; 181 179 int err = 0; 182 180 183 181 if (is_vlan_dev(ndev)) { 184 - pr_err("rxe creation allowed on top of a real device only\n"); 182 + rxe_err("rxe creation allowed on top of a real device only"); 185 183 err = -EPERM; 186 184 goto err; 187 185 } 188 186 189 - exists = rxe_get_dev_from_net(ndev); 190 - if (exists) { 191 - ib_device_put(&exists->ib_dev); 192 - rxe_dbg(exists, "already configured on %s\n", ndev->name); 187 + rxe = rxe_get_dev_from_net(ndev); 188 + if (rxe) { 189 + ib_device_put(&rxe->ib_dev); 190 + rxe_err_dev(rxe, "already configured on %s", ndev->name); 193 191 err = -EEXIST; 194 192 goto err; 195 193 } 196 194 197 195 err = rxe_net_add(ibdev_name, ndev); 198 196 if (err) { 199 - rxe_dbg(exists, "failed to add %s\n", ndev->name); 197 + rxe_err("failed to add %s\n", ndev->name); 200 198 goto err; 201 199 } 202 200 err:
+44 -2
drivers/infiniband/sw/rxe/rxe.h
··· 38 38 39 39 #define RXE_ROCE_V2_SPORT (0xc000) 40 40 41 - #define rxe_dbg(rxe, fmt, ...) ibdev_dbg(&(rxe)->ib_dev, \ 41 + #define rxe_dbg(fmt, ...) pr_debug("%s: " fmt "\n", __func__, ##__VA_ARGS__) 42 + #define rxe_dbg_dev(rxe, fmt, ...) ibdev_dbg(&(rxe)->ib_dev, \ 42 43 "%s: " fmt, __func__, ##__VA_ARGS__) 43 44 #define rxe_dbg_uc(uc, fmt, ...) ibdev_dbg((uc)->ibuc.device, \ 44 45 "uc#%d %s: " fmt, (uc)->elem.index, __func__, ##__VA_ARGS__) ··· 56 55 #define rxe_dbg_mr(mr, fmt, ...) ibdev_dbg((mr)->ibmr.device, \ 57 56 "mr#%d %s: " fmt, (mr)->elem.index, __func__, ##__VA_ARGS__) 58 57 #define rxe_dbg_mw(mw, fmt, ...) ibdev_dbg((mw)->ibmw.device, \ 58 + "mw#%d %s: " fmt, (mw)->elem.index, __func__, ##__VA_ARGS__) 59 + 60 + #define rxe_err(fmt, ...) pr_err_ratelimited("%s: " fmt "\n", __func__, \ 61 + ##__VA_ARGS__) 62 + #define rxe_err_dev(rxe, fmt, ...) ibdev_err_ratelimited(&(rxe)->ib_dev, \ 63 + "%s: " fmt, __func__, ##__VA_ARGS__) 64 + #define rxe_err_uc(uc, fmt, ...) ibdev_err_ratelimited((uc)->ibuc.device, \ 65 + "uc#%d %s: " fmt, (uc)->elem.index, __func__, ##__VA_ARGS__) 66 + #define rxe_err_pd(pd, fmt, ...) ibdev_err_ratelimited((pd)->ibpd.device, \ 67 + "pd#%d %s: " fmt, (pd)->elem.index, __func__, ##__VA_ARGS__) 68 + #define rxe_err_ah(ah, fmt, ...) ibdev_err_ratelimited((ah)->ibah.device, \ 69 + "ah#%d %s: " fmt, (ah)->elem.index, __func__, ##__VA_ARGS__) 70 + #define rxe_err_srq(srq, fmt, ...) ibdev_err_ratelimited((srq)->ibsrq.device, \ 71 + "srq#%d %s: " fmt, (srq)->elem.index, __func__, ##__VA_ARGS__) 72 + #define rxe_err_qp(qp, fmt, ...) ibdev_err_ratelimited((qp)->ibqp.device, \ 73 + "qp#%d %s: " fmt, (qp)->elem.index, __func__, ##__VA_ARGS__) 74 + #define rxe_err_cq(cq, fmt, ...) ibdev_err_ratelimited((cq)->ibcq.device, \ 75 + "cq#%d %s: " fmt, (cq)->elem.index, __func__, ##__VA_ARGS__) 76 + #define rxe_err_mr(mr, fmt, ...) ibdev_err_ratelimited((mr)->ibmr.device, \ 77 + "mr#%d %s: " fmt, (mr)->elem.index, __func__, ##__VA_ARGS__) 78 + #define rxe_err_mw(mw, fmt, ...) ibdev_err_ratelimited((mw)->ibmw.device, \ 79 + "mw#%d %s: " fmt, (mw)->elem.index, __func__, ##__VA_ARGS__) 80 + 81 + #define rxe_info(fmt, ...) pr_info_ratelimited("%s: " fmt "\n", __func__, \ 82 + ##__VA_ARGS__) 83 + #define rxe_info_dev(rxe, fmt, ...) ibdev_info_ratelimited(&(rxe)->ib_dev, \ 84 + "%s: " fmt, __func__, ##__VA_ARGS__) 85 + #define rxe_info_uc(uc, fmt, ...) ibdev_info_ratelimited((uc)->ibuc.device, \ 86 + "uc#%d %s: " fmt, (uc)->elem.index, __func__, ##__VA_ARGS__) 87 + #define rxe_info_pd(pd, fmt, ...) ibdev_info_ratelimited((pd)->ibpd.device, \ 88 + "pd#%d %s: " fmt, (pd)->elem.index, __func__, ##__VA_ARGS__) 89 + #define rxe_info_ah(ah, fmt, ...) ibdev_info_ratelimited((ah)->ibah.device, \ 90 + "ah#%d %s: " fmt, (ah)->elem.index, __func__, ##__VA_ARGS__) 91 + #define rxe_info_srq(srq, fmt, ...) ibdev_info_ratelimited((srq)->ibsrq.device, \ 92 + "srq#%d %s: " fmt, (srq)->elem.index, __func__, ##__VA_ARGS__) 93 + #define rxe_info_qp(qp, fmt, ...) ibdev_info_ratelimited((qp)->ibqp.device, \ 94 + "qp#%d %s: " fmt, (qp)->elem.index, __func__, ##__VA_ARGS__) 95 + #define rxe_info_cq(cq, fmt, ...) ibdev_info_ratelimited((cq)->ibcq.device, \ 96 + "cq#%d %s: " fmt, (cq)->elem.index, __func__, ##__VA_ARGS__) 97 + #define rxe_info_mr(mr, fmt, ...) ibdev_info_ratelimited((mr)->ibmr.device, \ 98 + "mr#%d %s: " fmt, (mr)->elem.index, __func__, ##__VA_ARGS__) 99 + #define rxe_info_mw(mw, fmt, ...) ibdev_info_ratelimited((mw)->ibmw.device, \ 59 100 "mw#%d %s: " fmt, (mw)->elem.index, __func__, ##__VA_ARGS__) 60 101 61 102 /* responder states */ ··· 133 90 RESPST_ERR_LENGTH, 134 91 RESPST_ERR_CQ_OVERFLOW, 135 92 RESPST_ERROR, 136 - RESPST_RESET, 137 93 RESPST_DONE, 138 94 RESPST_EXIT, 139 95 };
+107 -56
drivers/infiniband/sw/rxe/rxe_comp.c
··· 118 118 119 119 rxe_dbg_qp(qp, "retransmit timer fired\n"); 120 120 121 + spin_lock_bh(&qp->state_lock); 121 122 if (qp->valid) { 122 123 qp->comp.timeout = 1; 123 124 rxe_sched_task(&qp->comp.task); 124 125 } 126 + spin_unlock_bh(&qp->state_lock); 125 127 } 126 128 127 129 void rxe_comp_queue_pkt(struct rxe_qp *qp, struct sk_buff *skb) ··· 324 322 qp->comp.psn = pkt->psn; 325 323 if (qp->req.wait_psn) { 326 324 qp->req.wait_psn = 0; 327 - rxe_run_task(&qp->req.task); 325 + rxe_sched_task(&qp->req.task); 328 326 } 329 327 } 330 328 return COMPST_ERROR_RETRY; ··· 430 428 uwc->wc_flags = IB_WC_WITH_IMM; 431 429 uwc->byte_len = wqe->dma.length; 432 430 } 431 + } else { 432 + if (wqe->status != IB_WC_WR_FLUSH_ERR) 433 + rxe_err_qp(qp, "non-flush error status = %d", 434 + wqe->status); 433 435 } 434 436 } 435 437 ··· 475 469 */ 476 470 if (qp->req.wait_fence) { 477 471 qp->req.wait_fence = 0; 478 - rxe_run_task(&qp->req.task); 472 + rxe_sched_task(&qp->req.task); 479 473 } 474 + } 475 + 476 + static void comp_check_sq_drain_done(struct rxe_qp *qp) 477 + { 478 + spin_lock_bh(&qp->state_lock); 479 + if (unlikely(qp_state(qp) == IB_QPS_SQD)) { 480 + if (qp->attr.sq_draining && qp->comp.psn == qp->req.psn) { 481 + qp->attr.sq_draining = 0; 482 + spin_unlock_bh(&qp->state_lock); 483 + 484 + if (qp->ibqp.event_handler) { 485 + struct ib_event ev; 486 + 487 + ev.device = qp->ibqp.device; 488 + ev.element.qp = &qp->ibqp; 489 + ev.event = IB_EVENT_SQ_DRAINED; 490 + qp->ibqp.event_handler(&ev, 491 + qp->ibqp.qp_context); 492 + } 493 + return; 494 + } 495 + } 496 + spin_unlock_bh(&qp->state_lock); 480 497 } 481 498 482 499 static inline enum comp_state complete_ack(struct rxe_qp *qp, ··· 512 483 if (qp->req.need_rd_atomic) { 513 484 qp->comp.timeout_retry = 0; 514 485 qp->req.need_rd_atomic = 0; 515 - rxe_run_task(&qp->req.task); 486 + rxe_sched_task(&qp->req.task); 516 487 } 517 488 } 518 489 519 - if (unlikely(qp->req.state == QP_STATE_DRAIN)) { 520 - /* state_lock used by requester & completer */ 521 - spin_lock_bh(&qp->state_lock); 522 - if ((qp->req.state == QP_STATE_DRAIN) && 523 - (qp->comp.psn == qp->req.psn)) { 524 - qp->req.state = QP_STATE_DRAINED; 525 - spin_unlock_bh(&qp->state_lock); 526 - 527 - if (qp->ibqp.event_handler) { 528 - struct ib_event ev; 529 - 530 - ev.device = qp->ibqp.device; 531 - ev.element.qp = &qp->ibqp; 532 - ev.event = IB_EVENT_SQ_DRAINED; 533 - qp->ibqp.event_handler(&ev, 534 - qp->ibqp.qp_context); 535 - } 536 - } else { 537 - spin_unlock_bh(&qp->state_lock); 538 - } 539 - } 490 + comp_check_sq_drain_done(qp); 540 491 541 492 do_complete(qp, wqe); 542 493 ··· 547 538 return COMPST_GET_WQE; 548 539 } 549 540 550 - static void rxe_drain_resp_pkts(struct rxe_qp *qp, bool notify) 541 + /* drain incoming response packet queue */ 542 + static void drain_resp_pkts(struct rxe_qp *qp) 551 543 { 552 544 struct sk_buff *skb; 553 - struct rxe_send_wqe *wqe; 554 - struct rxe_queue *q = qp->sq.queue; 555 545 556 546 while ((skb = skb_dequeue(&qp->resp_pkts))) { 557 547 rxe_put(qp); 558 548 kfree_skb(skb); 559 549 ib_device_put(qp->ibqp.device); 560 550 } 551 + } 552 + 553 + /* complete send wqe with flush error */ 554 + static int flush_send_wqe(struct rxe_qp *qp, struct rxe_send_wqe *wqe) 555 + { 556 + struct rxe_cqe cqe = {}; 557 + struct ib_wc *wc = &cqe.ibwc; 558 + struct ib_uverbs_wc *uwc = &cqe.uibwc; 559 + int err; 560 + 561 + if (qp->is_user) { 562 + uwc->wr_id = wqe->wr.wr_id; 563 + uwc->status = IB_WC_WR_FLUSH_ERR; 564 + uwc->qp_num = qp->ibqp.qp_num; 565 + } else { 566 + wc->wr_id = wqe->wr.wr_id; 567 + wc->status = IB_WC_WR_FLUSH_ERR; 568 + wc->qp = &qp->ibqp; 569 + } 570 + 571 + err = rxe_cq_post(qp->scq, &cqe, 0); 572 + if (err) 573 + rxe_dbg_cq(qp->scq, "post cq failed, err = %d", err); 574 + 575 + return err; 576 + } 577 + 578 + /* drain and optionally complete the send queue 579 + * if unable to complete a wqe, i.e. cq is full, stop 580 + * completing and flush the remaining wqes 581 + */ 582 + static void flush_send_queue(struct rxe_qp *qp, bool notify) 583 + { 584 + struct rxe_send_wqe *wqe; 585 + struct rxe_queue *q = qp->sq.queue; 586 + int err; 561 587 562 588 while ((wqe = queue_head(q, q->type))) { 563 589 if (notify) { 564 - wqe->status = IB_WC_WR_FLUSH_ERR; 565 - do_complete(qp, wqe); 566 - } else { 567 - queue_advance_consumer(q, q->type); 590 + err = flush_send_wqe(qp, wqe); 591 + if (err) 592 + notify = 0; 568 593 } 594 + queue_advance_consumer(q, q->type); 569 595 } 570 596 } 571 597 ··· 615 571 ib_device_put(dev); 616 572 } 617 573 618 - int rxe_completer(void *arg) 574 + /* reset the retry timer if 575 + * - QP is type RC 576 + * - there is a packet sent by the requester that 577 + * might be acked (we still might get spurious 578 + * timeouts but try to keep them as few as possible) 579 + * - the timeout parameter is set 580 + * - the QP is alive 581 + */ 582 + static void reset_retry_timer(struct rxe_qp *qp) 619 583 { 620 - struct rxe_qp *qp = (struct rxe_qp *)arg; 584 + if (qp_type(qp) == IB_QPT_RC && qp->qp_timeout_jiffies) { 585 + spin_lock_bh(&qp->state_lock); 586 + if (qp_state(qp) >= IB_QPS_RTS && 587 + psn_compare(qp->req.psn, qp->comp.psn) > 0) 588 + mod_timer(&qp->retrans_timer, 589 + jiffies + qp->qp_timeout_jiffies); 590 + spin_unlock_bh(&qp->state_lock); 591 + } 592 + } 593 + 594 + int rxe_completer(struct rxe_qp *qp) 595 + { 621 596 struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 622 597 struct rxe_send_wqe *wqe = NULL; 623 598 struct sk_buff *skb = NULL; ··· 644 581 enum comp_state state; 645 582 int ret; 646 583 647 - if (!rxe_get(qp)) 648 - return -EAGAIN; 584 + spin_lock_bh(&qp->state_lock); 585 + if (!qp->valid || qp_state(qp) == IB_QPS_ERR || 586 + qp_state(qp) == IB_QPS_RESET) { 587 + bool notify = qp->valid && (qp_state(qp) == IB_QPS_ERR); 649 588 650 - if (!qp->valid || qp->comp.state == QP_STATE_ERROR || 651 - qp->comp.state == QP_STATE_RESET) { 652 - rxe_drain_resp_pkts(qp, qp->valid && 653 - qp->comp.state == QP_STATE_ERROR); 589 + drain_resp_pkts(qp); 590 + flush_send_queue(qp, notify); 591 + spin_unlock_bh(&qp->state_lock); 654 592 goto exit; 655 593 } 594 + spin_unlock_bh(&qp->state_lock); 656 595 657 596 if (qp->comp.timeout) { 658 597 qp->comp.timeout_retry = 1; ··· 742 677 break; 743 678 } 744 679 745 - /* re reset the timeout counter if 746 - * (1) QP is type RC 747 - * (2) the QP is alive 748 - * (3) there is a packet sent by the requester that 749 - * might be acked (we still might get spurious 750 - * timeouts but try to keep them as few as possible) 751 - * (4) the timeout parameter is set 752 - */ 753 - if ((qp_type(qp) == IB_QPT_RC) && 754 - (qp->req.state == QP_STATE_READY) && 755 - (psn_compare(qp->req.psn, qp->comp.psn) > 0) && 756 - qp->qp_timeout_jiffies) 757 - mod_timer(&qp->retrans_timer, 758 - jiffies + qp->qp_timeout_jiffies); 680 + reset_retry_timer(qp); 759 681 goto exit; 760 682 761 683 case COMPST_ERROR_RETRY: ··· 782 730 RXE_CNT_COMP_RETRY); 783 731 qp->req.need_retry = 1; 784 732 qp->comp.started_retry = 1; 785 - rxe_run_task(&qp->req.task); 733 + rxe_sched_task(&qp->req.task); 786 734 } 787 735 goto done; 788 736 ··· 804 752 */ 805 753 qp->req.wait_for_rnr_timer = 1; 806 754 rxe_dbg_qp(qp, "set rnr nak timer\n"); 755 + // TODO who protects from destroy_qp?? 807 756 mod_timer(&qp->rnr_nak_timer, 808 757 jiffies + rnrnak_jiffies(aeth_syn(pkt) 809 758 & ~AETH_TYPE_MASK)); ··· 837 784 out: 838 785 if (pkt) 839 786 free_pkt(pkt); 840 - rxe_put(qp); 841 - 842 787 return ret; 843 788 }
+7 -32
drivers/infiniband/sw/rxe/rxe_cq.c
··· 14 14 int count; 15 15 16 16 if (cqe <= 0) { 17 - rxe_dbg(rxe, "cqe(%d) <= 0\n", cqe); 17 + rxe_dbg_dev(rxe, "cqe(%d) <= 0\n", cqe); 18 18 goto err1; 19 19 } 20 20 21 21 if (cqe > rxe->attr.max_cqe) { 22 - rxe_dbg(rxe, "cqe(%d) > max_cqe(%d)\n", 22 + rxe_dbg_dev(rxe, "cqe(%d) > max_cqe(%d)\n", 23 23 cqe, rxe->attr.max_cqe); 24 24 goto err1; 25 25 } ··· 39 39 return -EINVAL; 40 40 } 41 41 42 - static void rxe_send_complete(struct tasklet_struct *t) 43 - { 44 - struct rxe_cq *cq = from_tasklet(cq, t, comp_task); 45 - unsigned long flags; 46 - 47 - spin_lock_irqsave(&cq->cq_lock, flags); 48 - if (cq->is_dying) { 49 - spin_unlock_irqrestore(&cq->cq_lock, flags); 50 - return; 51 - } 52 - spin_unlock_irqrestore(&cq->cq_lock, flags); 53 - 54 - cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); 55 - } 56 - 57 42 int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe, 58 43 int comp_vector, struct ib_udata *udata, 59 44 struct rxe_create_cq_resp __user *uresp) ··· 50 65 cq->queue = rxe_queue_init(rxe, &cqe, 51 66 sizeof(struct rxe_cqe), type); 52 67 if (!cq->queue) { 53 - rxe_dbg(rxe, "unable to create cq\n"); 68 + rxe_dbg_dev(rxe, "unable to create cq\n"); 54 69 return -ENOMEM; 55 70 } 56 71 ··· 63 78 } 64 79 65 80 cq->is_user = uresp; 66 - 67 - cq->is_dying = false; 68 - 69 - tasklet_setup(&cq->comp_task, rxe_send_complete); 70 81 71 82 spin_lock_init(&cq->cq_lock); 72 83 cq->ibcq.cqe = cqe; ··· 84 103 return err; 85 104 } 86 105 106 + /* caller holds reference to cq */ 87 107 int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited) 88 108 { 89 109 struct ib_event ev; ··· 96 114 97 115 full = queue_full(cq->queue, QUEUE_TYPE_TO_CLIENT); 98 116 if (unlikely(full)) { 117 + rxe_err_cq(cq, "queue full"); 99 118 spin_unlock_irqrestore(&cq->cq_lock, flags); 100 119 if (cq->ibcq.event_handler) { 101 120 ev.device = cq->ibcq.device; ··· 118 135 if ((cq->notify == IB_CQ_NEXT_COMP) || 119 136 (cq->notify == IB_CQ_SOLICITED && solicited)) { 120 137 cq->notify = 0; 121 - tasklet_schedule(&cq->comp_task); 138 + 139 + cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); 122 140 } 123 141 124 142 return 0; 125 - } 126 - 127 - void rxe_cq_disable(struct rxe_cq *cq) 128 - { 129 - unsigned long flags; 130 - 131 - spin_lock_irqsave(&cq->cq_lock, flags); 132 - cq->is_dying = true; 133 - spin_unlock_irqrestore(&cq->cq_lock, flags); 134 143 } 135 144 136 145 void rxe_cq_cleanup(struct rxe_pool_elem *elem)
+2 -2
drivers/infiniband/sw/rxe/rxe_icrc.c
··· 21 21 22 22 tfm = crypto_alloc_shash("crc32", 0, 0); 23 23 if (IS_ERR(tfm)) { 24 - rxe_dbg(rxe, "failed to init crc32 algorithm err: %ld\n", 24 + rxe_dbg_dev(rxe, "failed to init crc32 algorithm err: %ld\n", 25 25 PTR_ERR(tfm)); 26 26 return PTR_ERR(tfm); 27 27 } ··· 51 51 *(__be32 *)shash_desc_ctx(shash) = crc; 52 52 err = crypto_shash_update(shash, next, len); 53 53 if (unlikely(err)) { 54 - rxe_dbg(rxe, "failed crc calculation, err: %d\n", err); 54 + rxe_dbg_dev(rxe, "failed crc calculation, err: %d\n", err); 55 55 return (__force __be32)crc32_le((__force u32)crc, next, len); 56 56 } 57 57
+3 -4
drivers/infiniband/sw/rxe/rxe_loc.h
··· 80 80 int advance_dma_data(struct rxe_dma_info *dma, unsigned int length); 81 81 int rxe_invalidate_mr(struct rxe_qp *qp, u32 key); 82 82 int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe); 83 - int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata); 84 83 void rxe_mr_cleanup(struct rxe_pool_elem *elem); 85 84 86 85 /* rxe_mw.c */ ··· 170 171 171 172 void rxe_dealloc(struct ib_device *ib_dev); 172 173 173 - int rxe_completer(void *arg); 174 - int rxe_requester(void *arg); 175 - int rxe_responder(void *arg); 174 + int rxe_completer(struct rxe_qp *qp); 175 + int rxe_requester(struct rxe_qp *qp); 176 + int rxe_responder(struct rxe_qp *qp); 176 177 177 178 /* rxe_icrc.c */ 178 179 int rxe_icrc_init(struct rxe_dev *rxe);
+3 -3
drivers/infiniband/sw/rxe/rxe_mmap.c
··· 79 79 80 80 /* Don't allow a mmap larger than the object. */ 81 81 if (size > ip->info.size) { 82 - rxe_dbg(rxe, "mmap region is larger than the object!\n"); 82 + rxe_dbg_dev(rxe, "mmap region is larger than the object!\n"); 83 83 spin_unlock_bh(&rxe->pending_lock); 84 84 ret = -EINVAL; 85 85 goto done; ··· 87 87 88 88 goto found_it; 89 89 } 90 - rxe_dbg(rxe, "unable to find pending mmap info\n"); 90 + rxe_dbg_dev(rxe, "unable to find pending mmap info\n"); 91 91 spin_unlock_bh(&rxe->pending_lock); 92 92 ret = -EINVAL; 93 93 goto done; ··· 98 98 99 99 ret = remap_vmalloc_range(vma, ip->obj, 0); 100 100 if (ret) { 101 - rxe_dbg(rxe, "err %d from remap_vmalloc_range\n", ret); 101 + rxe_dbg_dev(rxe, "err %d from remap_vmalloc_range\n", ret); 102 102 goto done; 103 103 } 104 104
+8 -21
drivers/infiniband/sw/rxe/rxe_mr.c
··· 210 210 return err; 211 211 } 212 212 213 - static int rxe_set_page(struct ib_mr *ibmr, u64 iova) 213 + static int rxe_set_page(struct ib_mr *ibmr, u64 dma_addr) 214 214 { 215 215 struct rxe_mr *mr = to_rmr(ibmr); 216 - struct page *page = virt_to_page(iova & mr->page_mask); 216 + struct page *page = ib_virt_dma_to_page(dma_addr); 217 217 bool persistent = !!(mr->access & IB_ACCESS_FLUSH_PERSISTENT); 218 218 int err; 219 219 ··· 279 279 return 0; 280 280 } 281 281 282 - static void rxe_mr_copy_dma(struct rxe_mr *mr, u64 iova, void *addr, 282 + static void rxe_mr_copy_dma(struct rxe_mr *mr, u64 dma_addr, void *addr, 283 283 unsigned int length, enum rxe_mr_copy_dir dir) 284 284 { 285 - unsigned int page_offset = iova & (PAGE_SIZE - 1); 285 + unsigned int page_offset = dma_addr & (PAGE_SIZE - 1); 286 286 unsigned int bytes; 287 287 struct page *page; 288 288 u8 *va; 289 289 290 290 while (length) { 291 - page = virt_to_page(iova & mr->page_mask); 291 + page = ib_virt_dma_to_page(dma_addr); 292 292 bytes = min_t(unsigned int, length, 293 293 PAGE_SIZE - page_offset); 294 294 va = kmap_local_page(page); ··· 300 300 301 301 kunmap_local(va); 302 302 page_offset = 0; 303 - iova += bytes; 303 + dma_addr += bytes; 304 304 addr += bytes; 305 305 length -= bytes; 306 306 } ··· 488 488 489 489 if (mr->ibmr.type == IB_MR_TYPE_DMA) { 490 490 page_offset = iova & (PAGE_SIZE - 1); 491 - page = virt_to_page(iova & PAGE_MASK); 491 + page = ib_virt_dma_to_page(iova); 492 492 } else { 493 493 unsigned long index; 494 494 int err; ··· 545 545 546 546 if (mr->ibmr.type == IB_MR_TYPE_DMA) { 547 547 page_offset = iova & (PAGE_SIZE - 1); 548 - page = virt_to_page(iova & PAGE_MASK); 548 + page = ib_virt_dma_to_page(iova); 549 549 } else { 550 550 unsigned long index; 551 551 int err; ··· 719 719 mr->ibmr.iova = wqe->wr.wr.reg.mr->iova; 720 720 mr->state = RXE_MR_STATE_VALID; 721 721 722 - return 0; 723 - } 724 - 725 - int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) 726 - { 727 - struct rxe_mr *mr = to_rmr(ibmr); 728 - 729 - /* See IBA 10.6.7.2.6 */ 730 - if (atomic_read(&mr->num_mw) > 0) 731 - return -EINVAL; 732 - 733 - rxe_cleanup(mr); 734 - kfree_rcu(mr); 735 722 return 0; 736 723 } 737 724
+7 -4
drivers/infiniband/sw/rxe/rxe_net.c
··· 413 413 int is_request = pkt->mask & RXE_REQ_MASK; 414 414 struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 415 415 416 - if ((is_request && (qp->req.state != QP_STATE_READY)) || 417 - (!is_request && (qp->resp.state != QP_STATE_READY))) { 416 + spin_lock_bh(&qp->state_lock); 417 + if ((is_request && (qp_state(qp) < IB_QPS_RTS)) || 418 + (!is_request && (qp_state(qp) < IB_QPS_RTR))) { 419 + spin_unlock_bh(&qp->state_lock); 418 420 rxe_dbg_qp(qp, "Packet dropped. QP is not in ready state\n"); 419 421 goto drop; 420 422 } 423 + spin_unlock_bh(&qp->state_lock); 421 424 422 425 rxe_icrc_generate(skb, pkt); 423 426 ··· 599 596 rxe_port_down(rxe); 600 597 break; 601 598 case NETDEV_CHANGEMTU: 602 - rxe_dbg(rxe, "%s changed mtu to %d\n", ndev->name, ndev->mtu); 599 + rxe_dbg_dev(rxe, "%s changed mtu to %d\n", ndev->name, ndev->mtu); 603 600 rxe_set_mtu(rxe, ndev->mtu); 604 601 break; 605 602 case NETDEV_CHANGE: ··· 611 608 case NETDEV_CHANGENAME: 612 609 case NETDEV_FEAT_CHANGE: 613 610 default: 614 - rxe_dbg(rxe, "ignoring netdev event = %ld for %s\n", 611 + rxe_dbg_dev(rxe, "ignoring netdev event = %ld for %s\n", 615 612 event, ndev->name); 616 613 break; 617 614 }
+118 -149
drivers/infiniband/sw/rxe/rxe_qp.c
··· 19 19 int has_srq) 20 20 { 21 21 if (cap->max_send_wr > rxe->attr.max_qp_wr) { 22 - rxe_dbg(rxe, "invalid send wr = %u > %d\n", 22 + rxe_dbg_dev(rxe, "invalid send wr = %u > %d\n", 23 23 cap->max_send_wr, rxe->attr.max_qp_wr); 24 24 goto err1; 25 25 } 26 26 27 27 if (cap->max_send_sge > rxe->attr.max_send_sge) { 28 - rxe_dbg(rxe, "invalid send sge = %u > %d\n", 28 + rxe_dbg_dev(rxe, "invalid send sge = %u > %d\n", 29 29 cap->max_send_sge, rxe->attr.max_send_sge); 30 30 goto err1; 31 31 } 32 32 33 33 if (!has_srq) { 34 34 if (cap->max_recv_wr > rxe->attr.max_qp_wr) { 35 - rxe_dbg(rxe, "invalid recv wr = %u > %d\n", 35 + rxe_dbg_dev(rxe, "invalid recv wr = %u > %d\n", 36 36 cap->max_recv_wr, rxe->attr.max_qp_wr); 37 37 goto err1; 38 38 } 39 39 40 40 if (cap->max_recv_sge > rxe->attr.max_recv_sge) { 41 - rxe_dbg(rxe, "invalid recv sge = %u > %d\n", 41 + rxe_dbg_dev(rxe, "invalid recv sge = %u > %d\n", 42 42 cap->max_recv_sge, rxe->attr.max_recv_sge); 43 43 goto err1; 44 44 } 45 45 } 46 46 47 47 if (cap->max_inline_data > rxe->max_inline_data) { 48 - rxe_dbg(rxe, "invalid max inline data = %u > %d\n", 48 + rxe_dbg_dev(rxe, "invalid max inline data = %u > %d\n", 49 49 cap->max_inline_data, rxe->max_inline_data); 50 50 goto err1; 51 51 } ··· 73 73 } 74 74 75 75 if (!init->recv_cq || !init->send_cq) { 76 - rxe_dbg(rxe, "missing cq\n"); 76 + rxe_dbg_dev(rxe, "missing cq\n"); 77 77 goto err1; 78 78 } 79 79 ··· 82 82 83 83 if (init->qp_type == IB_QPT_GSI) { 84 84 if (!rdma_is_port_valid(&rxe->ib_dev, port_num)) { 85 - rxe_dbg(rxe, "invalid port = %d\n", port_num); 85 + rxe_dbg_dev(rxe, "invalid port = %d\n", port_num); 86 86 goto err1; 87 87 } 88 88 89 89 port = &rxe->port; 90 90 91 91 if (init->qp_type == IB_QPT_GSI && port->qp_gsi_index) { 92 - rxe_dbg(rxe, "GSI QP exists for port %d\n", port_num); 92 + rxe_dbg_dev(rxe, "GSI QP exists for port %d\n", port_num); 93 93 goto err1; 94 94 } 95 95 } ··· 231 231 qp->req.wqe_index = queue_get_producer(qp->sq.queue, 232 232 QUEUE_TYPE_FROM_CLIENT); 233 233 234 - qp->req.state = QP_STATE_RESET; 235 - qp->comp.state = QP_STATE_RESET; 236 234 qp->req.opcode = -1; 237 235 qp->comp.opcode = -1; 238 236 ··· 285 287 286 288 qp->resp.opcode = OPCODE_NONE; 287 289 qp->resp.msn = 0; 288 - qp->resp.state = QP_STATE_RESET; 289 290 290 291 return 0; 291 292 } ··· 325 328 if (err) 326 329 goto err2; 327 330 331 + spin_lock_bh(&qp->state_lock); 328 332 qp->attr.qp_state = IB_QPS_RESET; 329 333 qp->valid = 1; 334 + spin_unlock_bh(&qp->state_lock); 330 335 331 336 return 0; 332 337 ··· 379 380 return 0; 380 381 } 381 382 382 - /* called by the modify qp verb, this routine checks all the parameters before 383 - * making any changes 384 - */ 385 383 int rxe_qp_chk_attr(struct rxe_dev *rxe, struct rxe_qp *qp, 386 384 struct ib_qp_attr *attr, int mask) 387 385 { 388 - enum ib_qp_state cur_state = (mask & IB_QP_CUR_STATE) ? 389 - attr->cur_qp_state : qp->attr.qp_state; 390 - enum ib_qp_state new_state = (mask & IB_QP_STATE) ? 391 - attr->qp_state : cur_state; 392 - 393 - if (!ib_modify_qp_is_ok(cur_state, new_state, qp_type(qp), mask)) { 394 - rxe_dbg_qp(qp, "invalid mask or state\n"); 395 - goto err1; 396 - } 397 - 398 - if (mask & IB_QP_STATE) { 399 - if (cur_state == IB_QPS_SQD) { 400 - if (qp->req.state == QP_STATE_DRAIN && 401 - new_state != IB_QPS_ERR) 402 - goto err1; 403 - } 404 - } 405 - 406 386 if (mask & IB_QP_PORT) { 407 387 if (!rdma_is_port_valid(&rxe->ib_dev, attr->port_num)) { 408 388 rxe_dbg_qp(qp, "invalid port %d\n", attr->port_num); ··· 451 473 { 452 474 /* stop tasks from running */ 453 475 rxe_disable_task(&qp->resp.task); 476 + rxe_disable_task(&qp->comp.task); 477 + rxe_disable_task(&qp->req.task); 454 478 455 - /* stop request/comp */ 456 - if (qp->sq.queue) { 457 - if (qp_type(qp) == IB_QPT_RC) 458 - rxe_disable_task(&qp->comp.task); 459 - rxe_disable_task(&qp->req.task); 460 - } 479 + /* drain work and packet queuesc */ 480 + rxe_requester(qp); 481 + rxe_completer(qp); 482 + rxe_responder(qp); 461 483 462 - /* move qp to the reset state */ 463 - qp->req.state = QP_STATE_RESET; 464 - qp->comp.state = QP_STATE_RESET; 465 - qp->resp.state = QP_STATE_RESET; 466 - 467 - /* let state machines reset themselves drain work and packet queues 468 - * etc. 469 - */ 470 - __rxe_do_task(&qp->resp.task); 471 - 472 - if (qp->sq.queue) { 473 - __rxe_do_task(&qp->comp.task); 474 - __rxe_do_task(&qp->req.task); 484 + if (qp->rq.queue) 485 + rxe_queue_reset(qp->rq.queue); 486 + if (qp->sq.queue) 475 487 rxe_queue_reset(qp->sq.queue); 476 - } 477 488 478 489 /* cleanup attributes */ 479 490 atomic_set(&qp->ssn, 0); ··· 485 518 486 519 /* reenable tasks */ 487 520 rxe_enable_task(&qp->resp.task); 488 - 489 - if (qp->sq.queue) { 490 - if (qp_type(qp) == IB_QPT_RC) 491 - rxe_enable_task(&qp->comp.task); 492 - 493 - rxe_enable_task(&qp->req.task); 494 - } 495 - } 496 - 497 - /* drain the send queue */ 498 - static void rxe_qp_drain(struct rxe_qp *qp) 499 - { 500 - if (qp->sq.queue) { 501 - if (qp->req.state != QP_STATE_DRAINED) { 502 - qp->req.state = QP_STATE_DRAIN; 503 - if (qp_type(qp) == IB_QPT_RC) 504 - rxe_sched_task(&qp->comp.task); 505 - else 506 - __rxe_do_task(&qp->comp.task); 507 - rxe_sched_task(&qp->req.task); 508 - } 509 - } 521 + rxe_enable_task(&qp->comp.task); 522 + rxe_enable_task(&qp->req.task); 510 523 } 511 524 512 525 /* move the qp to the error state */ 513 526 void rxe_qp_error(struct rxe_qp *qp) 514 527 { 515 - qp->req.state = QP_STATE_ERROR; 516 - qp->resp.state = QP_STATE_ERROR; 517 - qp->comp.state = QP_STATE_ERROR; 528 + spin_lock_bh(&qp->state_lock); 518 529 qp->attr.qp_state = IB_QPS_ERR; 519 530 520 531 /* drain work and packet queues */ 521 532 rxe_sched_task(&qp->resp.task); 522 - 523 - if (qp_type(qp) == IB_QPT_RC) 524 - rxe_sched_task(&qp->comp.task); 525 - else 526 - __rxe_do_task(&qp->comp.task); 533 + rxe_sched_task(&qp->comp.task); 527 534 rxe_sched_task(&qp->req.task); 535 + spin_unlock_bh(&qp->state_lock); 528 536 } 537 + 538 + static void rxe_qp_sqd(struct rxe_qp *qp, struct ib_qp_attr *attr, 539 + int mask) 540 + { 541 + spin_lock_bh(&qp->state_lock); 542 + qp->attr.sq_draining = 1; 543 + rxe_sched_task(&qp->comp.task); 544 + rxe_sched_task(&qp->req.task); 545 + spin_unlock_bh(&qp->state_lock); 546 + } 547 + 548 + /* caller should hold qp->state_lock */ 549 + static int __qp_chk_state(struct rxe_qp *qp, struct ib_qp_attr *attr, 550 + int mask) 551 + { 552 + enum ib_qp_state cur_state; 553 + enum ib_qp_state new_state; 554 + 555 + cur_state = (mask & IB_QP_CUR_STATE) ? 556 + attr->cur_qp_state : qp->attr.qp_state; 557 + new_state = (mask & IB_QP_STATE) ? 558 + attr->qp_state : cur_state; 559 + 560 + if (!ib_modify_qp_is_ok(cur_state, new_state, qp_type(qp), mask)) 561 + return -EINVAL; 562 + 563 + if (mask & IB_QP_STATE && cur_state == IB_QPS_SQD) { 564 + if (qp->attr.sq_draining && new_state != IB_QPS_ERR) 565 + return -EINVAL; 566 + } 567 + 568 + return 0; 569 + } 570 + 571 + static const char *const qps2str[] = { 572 + [IB_QPS_RESET] = "RESET", 573 + [IB_QPS_INIT] = "INIT", 574 + [IB_QPS_RTR] = "RTR", 575 + [IB_QPS_RTS] = "RTS", 576 + [IB_QPS_SQD] = "SQD", 577 + [IB_QPS_SQE] = "SQE", 578 + [IB_QPS_ERR] = "ERR", 579 + }; 529 580 530 581 /* called by the modify qp verb */ 531 582 int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask, 532 583 struct ib_udata *udata) 533 584 { 534 585 int err; 586 + 587 + if (mask & IB_QP_CUR_STATE) 588 + qp->attr.cur_qp_state = attr->qp_state; 589 + 590 + if (mask & IB_QP_STATE) { 591 + spin_lock_bh(&qp->state_lock); 592 + err = __qp_chk_state(qp, attr, mask); 593 + if (!err) { 594 + qp->attr.qp_state = attr->qp_state; 595 + rxe_dbg_qp(qp, "state -> %s\n", 596 + qps2str[attr->qp_state]); 597 + } 598 + spin_unlock_bh(&qp->state_lock); 599 + 600 + if (err) 601 + return err; 602 + 603 + switch (attr->qp_state) { 604 + case IB_QPS_RESET: 605 + rxe_qp_reset(qp); 606 + break; 607 + case IB_QPS_SQD: 608 + rxe_qp_sqd(qp, attr, mask); 609 + break; 610 + case IB_QPS_ERR: 611 + rxe_qp_error(qp); 612 + break; 613 + default: 614 + break; 615 + } 616 + } 535 617 536 618 if (mask & IB_QP_MAX_QP_RD_ATOMIC) { 537 619 int max_rd_atomic = attr->max_rd_atomic ? ··· 602 586 if (err) 603 587 return err; 604 588 } 605 - 606 - if (mask & IB_QP_CUR_STATE) 607 - qp->attr.cur_qp_state = attr->qp_state; 608 589 609 590 if (mask & IB_QP_EN_SQD_ASYNC_NOTIFY) 610 591 qp->attr.en_sqd_async_notify = attr->en_sqd_async_notify; ··· 682 669 if (mask & IB_QP_DEST_QPN) 683 670 qp->attr.dest_qp_num = attr->dest_qp_num; 684 671 685 - if (mask & IB_QP_STATE) { 686 - qp->attr.qp_state = attr->qp_state; 687 - 688 - switch (attr->qp_state) { 689 - case IB_QPS_RESET: 690 - rxe_dbg_qp(qp, "state -> RESET\n"); 691 - rxe_qp_reset(qp); 692 - break; 693 - 694 - case IB_QPS_INIT: 695 - rxe_dbg_qp(qp, "state -> INIT\n"); 696 - qp->req.state = QP_STATE_INIT; 697 - qp->resp.state = QP_STATE_INIT; 698 - qp->comp.state = QP_STATE_INIT; 699 - break; 700 - 701 - case IB_QPS_RTR: 702 - rxe_dbg_qp(qp, "state -> RTR\n"); 703 - qp->resp.state = QP_STATE_READY; 704 - break; 705 - 706 - case IB_QPS_RTS: 707 - rxe_dbg_qp(qp, "state -> RTS\n"); 708 - qp->req.state = QP_STATE_READY; 709 - qp->comp.state = QP_STATE_READY; 710 - break; 711 - 712 - case IB_QPS_SQD: 713 - rxe_dbg_qp(qp, "state -> SQD\n"); 714 - rxe_qp_drain(qp); 715 - break; 716 - 717 - case IB_QPS_SQE: 718 - rxe_dbg_qp(qp, "state -> SQE !!?\n"); 719 - /* Not possible from modify_qp. */ 720 - break; 721 - 722 - case IB_QPS_ERR: 723 - rxe_dbg_qp(qp, "state -> ERR\n"); 724 - rxe_qp_error(qp); 725 - break; 726 - } 727 - } 728 - 729 672 return 0; 730 673 } 731 674 ··· 705 736 rxe_av_to_attr(&qp->pri_av, &attr->ah_attr); 706 737 rxe_av_to_attr(&qp->alt_av, &attr->alt_ah_attr); 707 738 708 - if (qp->req.state == QP_STATE_DRAIN) { 709 - attr->sq_draining = 1; 710 - /* applications that get this state 711 - * typically spin on it. yield the 712 - * processor 713 - */ 739 + /* Applications that get this state typically spin on it. 740 + * Yield the processor 741 + */ 742 + spin_lock_bh(&qp->state_lock); 743 + if (qp->attr.sq_draining) { 744 + spin_unlock_bh(&qp->state_lock); 714 745 cond_resched(); 715 - } else { 716 - attr->sq_draining = 0; 717 746 } 718 - 719 - rxe_dbg_qp(qp, "attr->sq_draining = %d\n", attr->sq_draining); 747 + spin_unlock_bh(&qp->state_lock); 720 748 721 749 return 0; 722 750 } ··· 737 771 { 738 772 struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work); 739 773 774 + spin_lock_bh(&qp->state_lock); 740 775 qp->valid = 0; 776 + spin_unlock_bh(&qp->state_lock); 741 777 qp->qp_timeout_jiffies = 0; 742 - rxe_cleanup_task(&qp->resp.task); 743 778 744 779 if (qp_type(qp) == IB_QPT_RC) { 745 780 del_timer_sync(&qp->retrans_timer); 746 781 del_timer_sync(&qp->rnr_nak_timer); 747 782 } 748 783 749 - rxe_cleanup_task(&qp->req.task); 750 - rxe_cleanup_task(&qp->comp.task); 784 + if (qp->resp.task.func) 785 + rxe_cleanup_task(&qp->resp.task); 786 + 787 + if (qp->req.task.func) 788 + rxe_cleanup_task(&qp->req.task); 789 + 790 + if (qp->comp.task.func) 791 + rxe_cleanup_task(&qp->comp.task); 751 792 752 793 /* flush out any receive wr's or pending requests */ 753 - if (qp->req.task.func) 754 - __rxe_do_task(&qp->req.task); 755 - 756 - if (qp->sq.queue) { 757 - __rxe_do_task(&qp->comp.task); 758 - __rxe_do_task(&qp->req.task); 759 - } 794 + rxe_requester(qp); 795 + rxe_completer(qp); 796 + rxe_responder(qp); 760 797 761 798 if (qp->sq.queue) 762 799 rxe_queue_cleanup(qp->sq.queue);
+2 -3
drivers/infiniband/sw/rxe/rxe_queue.c
··· 61 61 62 62 /* num_elem == 0 is allowed, but uninteresting */ 63 63 if (*num_elem < 0) 64 - goto err1; 64 + return NULL; 65 65 66 66 q = kzalloc(sizeof(*q), GFP_KERNEL); 67 67 if (!q) 68 - goto err1; 68 + return NULL; 69 69 70 70 q->rxe = rxe; 71 71 q->type = type; ··· 100 100 101 101 err2: 102 102 kfree(q); 103 - err1: 104 103 return NULL; 105 104 } 106 105
+11 -4
drivers/infiniband/sw/rxe/rxe_recv.c
··· 38 38 return -EINVAL; 39 39 } 40 40 41 + spin_lock_bh(&qp->state_lock); 41 42 if (pkt->mask & RXE_REQ_MASK) { 42 - if (unlikely(qp->resp.state != QP_STATE_READY)) 43 + if (unlikely(qp_state(qp) < IB_QPS_RTR)) { 44 + spin_unlock_bh(&qp->state_lock); 43 45 return -EINVAL; 44 - } else if (unlikely(qp->req.state < QP_STATE_READY || 45 - qp->req.state > QP_STATE_DRAINED)) 46 - return -EINVAL; 46 + } 47 + } else { 48 + if (unlikely(qp_state(qp) < IB_QPS_RTS)) { 49 + spin_unlock_bh(&qp->state_lock); 50 + return -EINVAL; 51 + } 52 + } 53 + spin_unlock_bh(&qp->state_lock); 47 54 48 55 return 0; 49 56 }
+62 -42
drivers/infiniband/sw/rxe/rxe_req.c
··· 102 102 103 103 rxe_dbg_qp(qp, "nak timer fired\n"); 104 104 105 - /* request a send queue retry */ 106 - qp->req.need_retry = 1; 107 - qp->req.wait_for_rnr_timer = 0; 108 - rxe_sched_task(&qp->req.task); 105 + spin_lock_bh(&qp->state_lock); 106 + if (qp->valid) { 107 + /* request a send queue retry */ 108 + qp->req.need_retry = 1; 109 + qp->req.wait_for_rnr_timer = 0; 110 + rxe_sched_task(&qp->req.task); 111 + } 112 + spin_unlock_bh(&qp->state_lock); 109 113 } 110 114 111 - static struct rxe_send_wqe *req_next_wqe(struct rxe_qp *qp) 115 + static void req_check_sq_drain_done(struct rxe_qp *qp) 112 116 { 113 - struct rxe_send_wqe *wqe; 114 - struct rxe_queue *q = qp->sq.queue; 115 - unsigned int index = qp->req.wqe_index; 117 + struct rxe_queue *q; 118 + unsigned int index; 116 119 unsigned int cons; 117 - unsigned int prod; 120 + struct rxe_send_wqe *wqe; 118 121 119 - wqe = queue_head(q, QUEUE_TYPE_FROM_CLIENT); 120 - cons = queue_get_consumer(q, QUEUE_TYPE_FROM_CLIENT); 121 - prod = queue_get_producer(q, QUEUE_TYPE_FROM_CLIENT); 122 + spin_lock_bh(&qp->state_lock); 123 + if (qp_state(qp) == IB_QPS_SQD) { 124 + q = qp->sq.queue; 125 + index = qp->req.wqe_index; 126 + cons = queue_get_consumer(q, QUEUE_TYPE_FROM_CLIENT); 127 + wqe = queue_addr_from_index(q, cons); 122 128 123 - if (unlikely(qp->req.state == QP_STATE_DRAIN)) { 124 129 /* check to see if we are drained; 125 130 * state_lock used by requester and completer 126 131 */ 127 - spin_lock_bh(&qp->state_lock); 128 132 do { 129 - if (qp->req.state != QP_STATE_DRAIN) { 133 + if (!qp->attr.sq_draining) 130 134 /* comp just finished */ 131 - spin_unlock_bh(&qp->state_lock); 132 135 break; 133 - } 134 136 135 137 if (wqe && ((index != cons) || 136 - (wqe->state != wqe_state_posted))) { 138 + (wqe->state != wqe_state_posted))) 137 139 /* comp not done yet */ 138 - spin_unlock_bh(&qp->state_lock); 139 140 break; 140 - } 141 141 142 - qp->req.state = QP_STATE_DRAINED; 142 + qp->attr.sq_draining = 0; 143 143 spin_unlock_bh(&qp->state_lock); 144 144 145 145 if (qp->ibqp.event_handler) { ··· 151 151 qp->ibqp.event_handler(&ev, 152 152 qp->ibqp.qp_context); 153 153 } 154 + return; 154 155 } while (0); 155 156 } 157 + spin_unlock_bh(&qp->state_lock); 158 + } 156 159 160 + static struct rxe_send_wqe *__req_next_wqe(struct rxe_qp *qp) 161 + { 162 + struct rxe_queue *q = qp->sq.queue; 163 + unsigned int index = qp->req.wqe_index; 164 + unsigned int prod; 165 + 166 + prod = queue_get_producer(q, QUEUE_TYPE_FROM_CLIENT); 157 167 if (index == prod) 158 168 return NULL; 169 + else 170 + return queue_addr_from_index(q, index); 171 + } 159 172 160 - wqe = queue_addr_from_index(q, index); 173 + static struct rxe_send_wqe *req_next_wqe(struct rxe_qp *qp) 174 + { 175 + struct rxe_send_wqe *wqe; 161 176 162 - if (unlikely((qp->req.state == QP_STATE_DRAIN || 163 - qp->req.state == QP_STATE_DRAINED) && 164 - (wqe->state != wqe_state_processing))) 177 + req_check_sq_drain_done(qp); 178 + 179 + wqe = __req_next_wqe(qp); 180 + if (wqe == NULL) 165 181 return NULL; 182 + 183 + spin_lock_bh(&qp->state_lock); 184 + if (unlikely((qp_state(qp) == IB_QPS_SQD) && 185 + (wqe->state != wqe_state_processing))) { 186 + spin_unlock_bh(&qp->state_lock); 187 + return NULL; 188 + } 189 + spin_unlock_bh(&qp->state_lock); 166 190 167 191 wqe->mask = wr_opcode_mask(wqe->wr.opcode, qp); 168 192 return wqe; ··· 659 635 return 0; 660 636 } 661 637 662 - int rxe_requester(void *arg) 638 + int rxe_requester(struct rxe_qp *qp) 663 639 { 664 - struct rxe_qp *qp = (struct rxe_qp *)arg; 665 640 struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 666 641 struct rxe_pkt_info pkt; 667 642 struct sk_buff *skb; ··· 677 654 struct rxe_ah *ah; 678 655 struct rxe_av *av; 679 656 680 - if (!rxe_get(qp)) 681 - return -EAGAIN; 682 - 683 - if (unlikely(!qp->valid)) 657 + spin_lock_bh(&qp->state_lock); 658 + if (unlikely(!qp->valid)) { 659 + spin_unlock_bh(&qp->state_lock); 684 660 goto exit; 661 + } 685 662 686 - if (unlikely(qp->req.state == QP_STATE_ERROR)) { 687 - wqe = req_next_wqe(qp); 663 + if (unlikely(qp_state(qp) == IB_QPS_ERR)) { 664 + wqe = __req_next_wqe(qp); 665 + spin_unlock_bh(&qp->state_lock); 688 666 if (wqe) 689 - /* 690 - * Generate an error completion for error qp state 691 - */ 692 667 goto err; 693 668 else 694 669 goto exit; 695 670 } 696 671 697 - if (unlikely(qp->req.state == QP_STATE_RESET)) { 672 + if (unlikely(qp_state(qp) == IB_QPS_RESET)) { 698 673 qp->req.wqe_index = queue_get_consumer(q, 699 674 QUEUE_TYPE_FROM_CLIENT); 700 675 qp->req.opcode = -1; ··· 700 679 qp->req.wait_psn = 0; 701 680 qp->req.need_retry = 0; 702 681 qp->req.wait_for_rnr_timer = 0; 682 + spin_unlock_bh(&qp->state_lock); 703 683 goto exit; 704 684 } 685 + spin_unlock_bh(&qp->state_lock); 705 686 706 687 /* we come here if the retransmit timer has fired 707 688 * or if the rnr timer has fired. If the retransmit ··· 780 757 qp->req.wqe_index); 781 758 wqe->state = wqe_state_done; 782 759 wqe->status = IB_WC_SUCCESS; 783 - rxe_run_task(&qp->comp.task); 760 + rxe_sched_task(&qp->comp.task); 784 761 goto done; 785 762 } 786 763 payload = mtu; ··· 863 840 /* update wqe_index for each wqe completion */ 864 841 qp->req.wqe_index = queue_next_index(qp->sq.queue, qp->req.wqe_index); 865 842 wqe->state = wqe_state_error; 866 - qp->req.state = QP_STATE_ERROR; 867 - rxe_run_task(&qp->comp.task); 843 + rxe_qp_error(qp); 868 844 exit: 869 845 ret = -EAGAIN; 870 846 out: 871 - rxe_put(qp); 872 - 873 847 return ret; 874 848 }
+75 -61
drivers/infiniband/sw/rxe/rxe_resp.c
··· 42 42 [RESPST_ERR_LENGTH] = "ERR_LENGTH", 43 43 [RESPST_ERR_CQ_OVERFLOW] = "ERR_CQ_OVERFLOW", 44 44 [RESPST_ERROR] = "ERROR", 45 - [RESPST_RESET] = "RESET", 46 45 [RESPST_DONE] = "DONE", 47 46 [RESPST_EXIT] = "EXIT", 48 47 }; ··· 67 68 struct rxe_pkt_info **pkt_p) 68 69 { 69 70 struct sk_buff *skb; 70 - 71 - if (qp->resp.state == QP_STATE_ERROR) { 72 - while ((skb = skb_dequeue(&qp->req_pkts))) { 73 - rxe_put(qp); 74 - kfree_skb(skb); 75 - ib_device_put(qp->ibqp.device); 76 - } 77 - 78 - /* go drain recv wr queue */ 79 - return RESPST_CHK_RESOURCE; 80 - } 81 71 82 72 skb = skb_peek(&qp->req_pkts); 83 73 if (!skb) ··· 321 333 struct rxe_pkt_info *pkt) 322 334 { 323 335 struct rxe_srq *srq = qp->srq; 324 - 325 - if (qp->resp.state == QP_STATE_ERROR) { 326 - if (qp->resp.wqe) { 327 - qp->resp.status = IB_WC_WR_FLUSH_ERR; 328 - return RESPST_COMPLETE; 329 - } else if (!srq) { 330 - qp->resp.wqe = queue_head(qp->rq.queue, 331 - QUEUE_TYPE_FROM_CLIENT); 332 - if (qp->resp.wqe) { 333 - qp->resp.status = IB_WC_WR_FLUSH_ERR; 334 - return RESPST_COMPLETE; 335 - } else { 336 - return RESPST_EXIT; 337 - } 338 - } else { 339 - return RESPST_EXIT; 340 - } 341 - } 342 336 343 337 if (pkt->mask & (RXE_READ_OR_ATOMIC_MASK | RXE_ATOMIC_WRITE_MASK)) { 344 338 /* it is the requesters job to not send ··· 1121 1151 1122 1152 wc->port_num = qp->attr.port_num; 1123 1153 } 1154 + } else { 1155 + if (wc->status != IB_WC_WR_FLUSH_ERR) 1156 + rxe_err_qp(qp, "non-flush error status = %d", 1157 + wc->status); 1124 1158 } 1125 1159 1126 1160 /* have copy for srq and reference for !srq */ ··· 1137 1163 return RESPST_ERR_CQ_OVERFLOW; 1138 1164 1139 1165 finish: 1140 - if (unlikely(qp->resp.state == QP_STATE_ERROR)) 1166 + spin_lock_bh(&qp->state_lock); 1167 + if (unlikely(qp_state(qp) == IB_QPS_ERR)) { 1168 + spin_unlock_bh(&qp->state_lock); 1141 1169 return RESPST_CHK_RESOURCE; 1170 + } 1171 + spin_unlock_bh(&qp->state_lock); 1172 + 1142 1173 if (unlikely(!pkt)) 1143 1174 return RESPST_DONE; 1144 1175 if (qp_type(qp) == IB_QPT_RC) ··· 1400 1421 } 1401 1422 } 1402 1423 1403 - static void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify) 1424 + /* drain incoming request packet queue */ 1425 + static void drain_req_pkts(struct rxe_qp *qp) 1404 1426 { 1405 1427 struct sk_buff *skb; 1406 - struct rxe_queue *q = qp->rq.queue; 1407 1428 1408 1429 while ((skb = skb_dequeue(&qp->req_pkts))) { 1409 1430 rxe_put(qp); 1410 1431 kfree_skb(skb); 1411 1432 ib_device_put(qp->ibqp.device); 1412 1433 } 1413 - 1414 - if (notify) 1415 - return; 1416 - 1417 - while (!qp->srq && q && queue_head(q, q->type)) 1418 - queue_advance_consumer(q, q->type); 1419 1434 } 1420 1435 1421 - int rxe_responder(void *arg) 1436 + /* complete receive wqe with flush error */ 1437 + static int flush_recv_wqe(struct rxe_qp *qp, struct rxe_recv_wqe *wqe) 1422 1438 { 1423 - struct rxe_qp *qp = (struct rxe_qp *)arg; 1439 + struct rxe_cqe cqe = {}; 1440 + struct ib_wc *wc = &cqe.ibwc; 1441 + struct ib_uverbs_wc *uwc = &cqe.uibwc; 1442 + int err; 1443 + 1444 + if (qp->rcq->is_user) { 1445 + uwc->wr_id = wqe->wr_id; 1446 + uwc->status = IB_WC_WR_FLUSH_ERR; 1447 + uwc->qp_num = qp_num(qp); 1448 + } else { 1449 + wc->wr_id = wqe->wr_id; 1450 + wc->status = IB_WC_WR_FLUSH_ERR; 1451 + wc->qp = &qp->ibqp; 1452 + } 1453 + 1454 + err = rxe_cq_post(qp->rcq, &cqe, 0); 1455 + if (err) 1456 + rxe_dbg_cq(qp->rcq, "post cq failed err = %d", err); 1457 + 1458 + return err; 1459 + } 1460 + 1461 + /* drain and optionally complete the recive queue 1462 + * if unable to complete a wqe stop completing and 1463 + * just flush the remaining wqes 1464 + */ 1465 + static void flush_recv_queue(struct rxe_qp *qp, bool notify) 1466 + { 1467 + struct rxe_queue *q = qp->rq.queue; 1468 + struct rxe_recv_wqe *wqe; 1469 + int err; 1470 + 1471 + if (qp->srq) 1472 + return; 1473 + 1474 + while ((wqe = queue_head(q, q->type))) { 1475 + if (notify) { 1476 + err = flush_recv_wqe(qp, wqe); 1477 + if (err) 1478 + notify = 0; 1479 + } 1480 + queue_advance_consumer(q, q->type); 1481 + } 1482 + 1483 + qp->resp.wqe = NULL; 1484 + } 1485 + 1486 + int rxe_responder(struct rxe_qp *qp) 1487 + { 1424 1488 struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 1425 1489 enum resp_states state; 1426 1490 struct rxe_pkt_info *pkt = NULL; 1427 1491 int ret; 1428 1492 1429 - if (!rxe_get(qp)) 1430 - return -EAGAIN; 1493 + spin_lock_bh(&qp->state_lock); 1494 + if (!qp->valid || qp_state(qp) == IB_QPS_ERR || 1495 + qp_state(qp) == IB_QPS_RESET) { 1496 + bool notify = qp->valid && (qp_state(qp) == IB_QPS_ERR); 1497 + 1498 + drain_req_pkts(qp); 1499 + flush_recv_queue(qp, notify); 1500 + spin_unlock_bh(&qp->state_lock); 1501 + goto exit; 1502 + } 1503 + spin_unlock_bh(&qp->state_lock); 1431 1504 1432 1505 qp->resp.aeth_syndrome = AETH_ACK_UNLIMITED; 1433 1506 1434 - if (!qp->valid) 1435 - goto exit; 1436 - 1437 - switch (qp->resp.state) { 1438 - case QP_STATE_RESET: 1439 - state = RESPST_RESET; 1440 - break; 1441 - 1442 - default: 1443 - state = RESPST_GET_REQ; 1444 - break; 1445 - } 1507 + state = RESPST_GET_REQ; 1446 1508 1447 1509 while (1) { 1448 1510 rxe_dbg_qp(qp, "state = %s\n", resp_state_name[state]); ··· 1642 1622 1643 1623 goto exit; 1644 1624 1645 - case RESPST_RESET: 1646 - rxe_drain_req_pkts(qp, false); 1647 - qp->resp.wqe = NULL; 1648 - goto exit; 1649 - 1650 1625 case RESPST_ERROR: 1651 1626 qp->resp.goto_error = 0; 1652 1627 rxe_dbg_qp(qp, "moved to error state\n"); ··· 1663 1648 exit: 1664 1649 ret = -EAGAIN; 1665 1650 out: 1666 - rxe_put(qp); 1667 1651 return ret; 1668 1652 }
+3 -3
drivers/infiniband/sw/rxe/rxe_srq.c
··· 13 13 struct ib_srq_attr *attr = &init->attr; 14 14 15 15 if (attr->max_wr > rxe->attr.max_srq_wr) { 16 - rxe_dbg(rxe, "max_wr(%d) > max_srq_wr(%d)\n", 16 + rxe_dbg_dev(rxe, "max_wr(%d) > max_srq_wr(%d)\n", 17 17 attr->max_wr, rxe->attr.max_srq_wr); 18 18 goto err1; 19 19 } 20 20 21 21 if (attr->max_wr <= 0) { 22 - rxe_dbg(rxe, "max_wr(%d) <= 0\n", attr->max_wr); 22 + rxe_dbg_dev(rxe, "max_wr(%d) <= 0\n", attr->max_wr); 23 23 goto err1; 24 24 } 25 25 ··· 27 27 attr->max_wr = RXE_MIN_SRQ_WR; 28 28 29 29 if (attr->max_sge > rxe->attr.max_srq_sge) { 30 - rxe_dbg(rxe, "max_sge(%d) > max_srq_sge(%d)\n", 30 + rxe_dbg_dev(rxe, "max_sge(%d) > max_srq_sge(%d)\n", 31 31 attr->max_sge, rxe->attr.max_srq_sge); 32 32 goto err1; 33 33 }
+208 -62
drivers/infiniband/sw/rxe/rxe_task.c
··· 6 6 7 7 #include "rxe.h" 8 8 9 - int __rxe_do_task(struct rxe_task *task) 10 - 9 + /* Check if task is idle i.e. not running, not scheduled in 10 + * tasklet queue and not draining. If so move to busy to 11 + * reserve a slot in do_task() by setting to busy and taking 12 + * a qp reference to cover the gap from now until the task finishes. 13 + * state will move out of busy if task returns a non zero value 14 + * in do_task(). If state is already busy it is raised to armed 15 + * to indicate to do_task that additional pass should be made 16 + * over the task. 17 + * Context: caller should hold task->lock. 18 + * Returns: true if state transitioned from idle to busy else false. 19 + */ 20 + static bool __reserve_if_idle(struct rxe_task *task) 11 21 { 12 - int ret; 22 + WARN_ON(rxe_read(task->qp) <= 0); 13 23 14 - while ((ret = task->func(task->arg)) == 0) 15 - ; 24 + if (task->tasklet.state & BIT(TASKLET_STATE_SCHED)) 25 + return false; 16 26 17 - task->ret = ret; 27 + if (task->state == TASK_STATE_IDLE) { 28 + rxe_get(task->qp); 29 + task->state = TASK_STATE_BUSY; 30 + task->num_sched++; 31 + return true; 32 + } 18 33 19 - return ret; 34 + if (task->state == TASK_STATE_BUSY) 35 + task->state = TASK_STATE_ARMED; 36 + 37 + return false; 20 38 } 21 39 22 - /* 23 - * this locking is due to a potential race where 24 - * a second caller finds the task already running 25 - * but looks just after the last call to func 40 + /* check if task is idle or drained and not currently 41 + * scheduled in the tasklet queue. This routine is 42 + * called by rxe_cleanup_task or rxe_disable_task to 43 + * see if the queue is empty. 44 + * Context: caller should hold task->lock. 45 + * Returns true if done else false. 46 + */ 47 + static bool __is_done(struct rxe_task *task) 48 + { 49 + if (task->tasklet.state & BIT(TASKLET_STATE_SCHED)) 50 + return false; 51 + 52 + if (task->state == TASK_STATE_IDLE || 53 + task->state == TASK_STATE_DRAINED) { 54 + return true; 55 + } 56 + 57 + return false; 58 + } 59 + 60 + /* a locked version of __is_done */ 61 + static bool is_done(struct rxe_task *task) 62 + { 63 + unsigned long flags; 64 + int done; 65 + 66 + spin_lock_irqsave(&task->lock, flags); 67 + done = __is_done(task); 68 + spin_unlock_irqrestore(&task->lock, flags); 69 + 70 + return done; 71 + } 72 + 73 + /* do_task is a wrapper for the three tasks (requester, 74 + * completer, responder) and calls them in a loop until 75 + * they return a non-zero value. It is called either 76 + * directly by rxe_run_task or indirectly if rxe_sched_task 77 + * schedules the task. They must call __reserve_if_idle to 78 + * move the task to busy before calling or scheduling. 79 + * The task can also be moved to drained or invalid 80 + * by calls to rxe-cleanup_task or rxe_disable_task. 81 + * In that case tasks which get here are not executed but 82 + * just flushed. The tasks are designed to look to see if 83 + * there is work to do and do part of it before returning 84 + * here with a return value of zero until all the work 85 + * has been consumed then it retuens a non-zero value. 86 + * The number of times the task can be run is limited by 87 + * max iterations so one task cannot hold the cpu forever. 26 88 */ 27 89 static void do_task(struct tasklet_struct *t) 28 90 { 29 91 int cont; 30 92 int ret; 31 93 struct rxe_task *task = from_tasklet(task, t, tasklet); 32 - struct rxe_qp *qp = (struct rxe_qp *)task->arg; 33 - unsigned int iterations = RXE_MAX_ITERATIONS; 94 + unsigned int iterations; 95 + unsigned long flags; 96 + int resched = 0; 34 97 35 - spin_lock_bh(&task->lock); 36 - switch (task->state) { 37 - case TASK_STATE_START: 38 - task->state = TASK_STATE_BUSY; 39 - spin_unlock_bh(&task->lock); 40 - break; 98 + WARN_ON(rxe_read(task->qp) <= 0); 41 99 42 - case TASK_STATE_BUSY: 43 - task->state = TASK_STATE_ARMED; 44 - fallthrough; 45 - case TASK_STATE_ARMED: 46 - spin_unlock_bh(&task->lock); 47 - return; 48 - 49 - default: 50 - spin_unlock_bh(&task->lock); 51 - rxe_dbg_qp(qp, "failed with bad state %d\n", task->state); 100 + spin_lock_irqsave(&task->lock, flags); 101 + if (task->state >= TASK_STATE_DRAINED) { 102 + rxe_put(task->qp); 103 + task->num_done++; 104 + spin_unlock_irqrestore(&task->lock, flags); 52 105 return; 53 106 } 107 + spin_unlock_irqrestore(&task->lock, flags); 54 108 55 109 do { 110 + iterations = RXE_MAX_ITERATIONS; 56 111 cont = 0; 57 - ret = task->func(task->arg); 58 112 59 - spin_lock_bh(&task->lock); 113 + do { 114 + ret = task->func(task->qp); 115 + } while (ret == 0 && iterations-- > 0); 116 + 117 + spin_lock_irqsave(&task->lock, flags); 60 118 switch (task->state) { 61 119 case TASK_STATE_BUSY: 62 120 if (ret) { 63 - task->state = TASK_STATE_START; 64 - } else if (iterations--) { 65 - cont = 1; 121 + task->state = TASK_STATE_IDLE; 66 122 } else { 67 - /* reschedule the tasklet and exit 123 + /* This can happen if the client 124 + * can add work faster than the 125 + * tasklet can finish it. 126 + * Reschedule the tasklet and exit 68 127 * the loop to give up the cpu 69 128 */ 70 - tasklet_schedule(&task->tasklet); 71 - task->state = TASK_STATE_START; 129 + task->state = TASK_STATE_IDLE; 130 + resched = 1; 72 131 } 73 132 break; 74 133 ··· 140 81 cont = 1; 141 82 break; 142 83 84 + case TASK_STATE_DRAINING: 85 + if (ret) 86 + task->state = TASK_STATE_DRAINED; 87 + else 88 + cont = 1; 89 + break; 90 + 143 91 default: 144 - rxe_dbg_qp(qp, "failed with bad state %d\n", 145 - task->state); 92 + WARN_ON(1); 93 + rxe_info_qp(task->qp, "unexpected task state = %d", task->state); 146 94 } 147 - spin_unlock_bh(&task->lock); 95 + 96 + if (!cont) { 97 + task->num_done++; 98 + if (WARN_ON(task->num_done != task->num_sched)) 99 + rxe_err_qp(task->qp, "%ld tasks scheduled, %ld tasks done", 100 + task->num_sched, task->num_done); 101 + } 102 + spin_unlock_irqrestore(&task->lock, flags); 148 103 } while (cont); 149 104 150 105 task->ret = ret; 106 + 107 + if (resched) 108 + rxe_sched_task(task); 109 + 110 + rxe_put(task->qp); 151 111 } 152 112 153 - int rxe_init_task(struct rxe_task *task, void *arg, int (*func)(void *)) 113 + int rxe_init_task(struct rxe_task *task, struct rxe_qp *qp, 114 + int (*func)(struct rxe_qp *)) 154 115 { 155 - task->arg = arg; 156 - task->func = func; 157 - task->destroyed = false; 116 + WARN_ON(rxe_read(qp) <= 0); 117 + 118 + task->qp = qp; 119 + task->func = func; 158 120 159 121 tasklet_setup(&task->tasklet, do_task); 160 122 161 - task->state = TASK_STATE_START; 123 + task->state = TASK_STATE_IDLE; 162 124 spin_lock_init(&task->lock); 163 125 164 126 return 0; 165 127 } 166 128 129 + /* rxe_cleanup_task is only called from rxe_do_qp_cleanup in 130 + * process context. The qp is already completed with no 131 + * remaining references. Once the queue is drained the 132 + * task is moved to invalid and returns. The qp cleanup 133 + * code then calls the task functions directly without 134 + * using the task struct to drain any late arriving packets 135 + * or work requests. 136 + */ 167 137 void rxe_cleanup_task(struct rxe_task *task) 168 138 { 169 - bool idle; 139 + unsigned long flags; 170 140 171 - /* 172 - * Mark the task, then wait for it to finish. It might be 173 - * running in a non-tasklet (direct call) context. 141 + spin_lock_irqsave(&task->lock, flags); 142 + if (!__is_done(task) && task->state < TASK_STATE_DRAINED) { 143 + task->state = TASK_STATE_DRAINING; 144 + } else { 145 + task->state = TASK_STATE_INVALID; 146 + spin_unlock_irqrestore(&task->lock, flags); 147 + return; 148 + } 149 + spin_unlock_irqrestore(&task->lock, flags); 150 + 151 + /* now the task cannot be scheduled or run just wait 152 + * for the previously scheduled tasks to finish. 174 153 */ 175 - task->destroyed = true; 176 - 177 - do { 178 - spin_lock_bh(&task->lock); 179 - idle = (task->state == TASK_STATE_START); 180 - spin_unlock_bh(&task->lock); 181 - } while (!idle); 154 + while (!is_done(task)) 155 + cond_resched(); 182 156 183 157 tasklet_kill(&task->tasklet); 158 + 159 + spin_lock_irqsave(&task->lock, flags); 160 + task->state = TASK_STATE_INVALID; 161 + spin_unlock_irqrestore(&task->lock, flags); 184 162 } 185 163 164 + /* run the task inline if it is currently idle 165 + * cannot call do_task holding the lock 166 + */ 186 167 void rxe_run_task(struct rxe_task *task) 187 168 { 188 - if (task->destroyed) 189 - return; 169 + unsigned long flags; 170 + int run; 190 171 191 - do_task(&task->tasklet); 172 + WARN_ON(rxe_read(task->qp) <= 0); 173 + 174 + spin_lock_irqsave(&task->lock, flags); 175 + run = __reserve_if_idle(task); 176 + spin_unlock_irqrestore(&task->lock, flags); 177 + 178 + if (run) 179 + do_task(&task->tasklet); 192 180 } 193 181 182 + /* schedule the task to run later as a tasklet. 183 + * the tasklet)schedule call can be called holding 184 + * the lock. 185 + */ 194 186 void rxe_sched_task(struct rxe_task *task) 195 187 { 196 - if (task->destroyed) 197 - return; 188 + unsigned long flags; 198 189 199 - tasklet_schedule(&task->tasklet); 190 + WARN_ON(rxe_read(task->qp) <= 0); 191 + 192 + spin_lock_irqsave(&task->lock, flags); 193 + if (__reserve_if_idle(task)) 194 + tasklet_schedule(&task->tasklet); 195 + spin_unlock_irqrestore(&task->lock, flags); 200 196 } 201 197 198 + /* rxe_disable/enable_task are only called from 199 + * rxe_modify_qp in process context. Task is moved 200 + * to the drained state by do_task. 201 + */ 202 202 void rxe_disable_task(struct rxe_task *task) 203 203 { 204 + unsigned long flags; 205 + 206 + WARN_ON(rxe_read(task->qp) <= 0); 207 + 208 + spin_lock_irqsave(&task->lock, flags); 209 + if (!__is_done(task) && task->state < TASK_STATE_DRAINED) { 210 + task->state = TASK_STATE_DRAINING; 211 + } else { 212 + task->state = TASK_STATE_DRAINED; 213 + spin_unlock_irqrestore(&task->lock, flags); 214 + return; 215 + } 216 + spin_unlock_irqrestore(&task->lock, flags); 217 + 218 + while (!is_done(task)) 219 + cond_resched(); 220 + 204 221 tasklet_disable(&task->tasklet); 205 222 } 206 223 207 224 void rxe_enable_task(struct rxe_task *task) 208 225 { 226 + unsigned long flags; 227 + 228 + WARN_ON(rxe_read(task->qp) <= 0); 229 + 230 + spin_lock_irqsave(&task->lock, flags); 231 + if (task->state == TASK_STATE_INVALID) { 232 + spin_unlock_irqrestore(&task->lock, flags); 233 + return; 234 + } 235 + task->state = TASK_STATE_IDLE; 209 236 tasklet_enable(&task->tasklet); 237 + spin_unlock_irqrestore(&task->lock, flags); 210 238 }
+11 -12
drivers/infiniband/sw/rxe/rxe_task.h
··· 8 8 #define RXE_TASK_H 9 9 10 10 enum { 11 - TASK_STATE_START = 0, 11 + TASK_STATE_IDLE = 0, 12 12 TASK_STATE_BUSY = 1, 13 13 TASK_STATE_ARMED = 2, 14 + TASK_STATE_DRAINING = 3, 15 + TASK_STATE_DRAINED = 4, 16 + TASK_STATE_INVALID = 5, 14 17 }; 15 18 16 19 /* ··· 25 22 struct tasklet_struct tasklet; 26 23 int state; 27 24 spinlock_t lock; 28 - void *arg; 29 - int (*func)(void *arg); 25 + struct rxe_qp *qp; 26 + int (*func)(struct rxe_qp *qp); 30 27 int ret; 31 - bool destroyed; 28 + long num_sched; 29 + long num_done; 32 30 }; 33 31 34 32 /* 35 33 * init rxe_task structure 36 - * arg => parameter to pass to fcn 34 + * qp => parameter to pass to func 37 35 * func => function to call until it returns != 0 38 36 */ 39 - int rxe_init_task(struct rxe_task *task, void *arg, int (*func)(void *)); 37 + int rxe_init_task(struct rxe_task *task, struct rxe_qp *qp, 38 + int (*func)(struct rxe_qp *)); 40 39 41 40 /* cleanup task */ 42 41 void rxe_cleanup_task(struct rxe_task *task); 43 - 44 - /* 45 - * raw call to func in loop without any checking 46 - * can call when tasklets are disabled 47 - */ 48 - int __rxe_do_task(struct rxe_task *task); 49 42 50 43 void rxe_run_task(struct rxe_task *task); 51 44
+706 -317
drivers/infiniband/sw/rxe/rxe_verbs.c
··· 12 12 #include "rxe_queue.h" 13 13 #include "rxe_hw_counters.h" 14 14 15 - static int rxe_query_device(struct ib_device *dev, 15 + static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr); 16 + 17 + /* dev */ 18 + static int rxe_query_device(struct ib_device *ibdev, 16 19 struct ib_device_attr *attr, 17 - struct ib_udata *uhw) 20 + struct ib_udata *udata) 18 21 { 19 - struct rxe_dev *rxe = to_rdev(dev); 22 + struct rxe_dev *rxe = to_rdev(ibdev); 23 + int err; 20 24 21 - if (uhw->inlen || uhw->outlen) 22 - return -EINVAL; 25 + if (udata->inlen || udata->outlen) { 26 + rxe_dbg_dev(rxe, "malformed udata"); 27 + err = -EINVAL; 28 + goto err_out; 29 + } 23 30 24 - *attr = rxe->attr; 31 + memcpy(attr, &rxe->attr, sizeof(*attr)); 32 + 25 33 return 0; 34 + 35 + err_out: 36 + rxe_err_dev(rxe, "returned err = %d", err); 37 + return err; 26 38 } 27 39 28 - static int rxe_query_port(struct ib_device *dev, 40 + static int rxe_query_port(struct ib_device *ibdev, 29 41 u32 port_num, struct ib_port_attr *attr) 30 42 { 31 - struct rxe_dev *rxe = to_rdev(dev); 32 - int rc; 43 + struct rxe_dev *rxe = to_rdev(ibdev); 44 + int err, ret; 33 45 34 - /* *attr being zeroed by the caller, avoid zeroing it here */ 35 - *attr = rxe->port.attr; 46 + if (port_num != 1) { 47 + err = -EINVAL; 48 + rxe_dbg_dev(rxe, "bad port_num = %d", port_num); 49 + goto err_out; 50 + } 51 + 52 + memcpy(attr, &rxe->port.attr, sizeof(*attr)); 36 53 37 54 mutex_lock(&rxe->usdev_lock); 38 - rc = ib_get_eth_speed(dev, port_num, &attr->active_speed, 39 - &attr->active_width); 55 + ret = ib_get_eth_speed(ibdev, port_num, &attr->active_speed, 56 + &attr->active_width); 40 57 41 58 if (attr->state == IB_PORT_ACTIVE) 42 59 attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; ··· 64 47 65 48 mutex_unlock(&rxe->usdev_lock); 66 49 67 - return rc; 50 + return ret; 51 + 52 + err_out: 53 + rxe_err_dev(rxe, "returned err = %d", err); 54 + return err; 68 55 } 69 56 70 - static int rxe_query_pkey(struct ib_device *device, 57 + static int rxe_query_pkey(struct ib_device *ibdev, 71 58 u32 port_num, u16 index, u16 *pkey) 72 59 { 73 - if (index > 0) 74 - return -EINVAL; 60 + struct rxe_dev *rxe = to_rdev(ibdev); 61 + int err; 62 + 63 + if (index != 0) { 64 + err = -EINVAL; 65 + rxe_dbg_dev(rxe, "bad pkey index = %d", index); 66 + goto err_out; 67 + } 75 68 76 69 *pkey = IB_DEFAULT_PKEY_FULL; 77 70 return 0; 71 + 72 + err_out: 73 + rxe_err_dev(rxe, "returned err = %d", err); 74 + return err; 78 75 } 79 76 80 - static int rxe_modify_device(struct ib_device *dev, 77 + static int rxe_modify_device(struct ib_device *ibdev, 81 78 int mask, struct ib_device_modify *attr) 82 79 { 83 - struct rxe_dev *rxe = to_rdev(dev); 80 + struct rxe_dev *rxe = to_rdev(ibdev); 81 + int err; 84 82 85 83 if (mask & ~(IB_DEVICE_MODIFY_SYS_IMAGE_GUID | 86 - IB_DEVICE_MODIFY_NODE_DESC)) 87 - return -EOPNOTSUPP; 84 + IB_DEVICE_MODIFY_NODE_DESC)) { 85 + err = -EOPNOTSUPP; 86 + rxe_dbg_dev(rxe, "unsupported mask = 0x%x", mask); 87 + goto err_out; 88 + } 88 89 89 90 if (mask & IB_DEVICE_MODIFY_SYS_IMAGE_GUID) 90 91 rxe->attr.sys_image_guid = cpu_to_be64(attr->sys_image_guid); ··· 113 78 } 114 79 115 80 return 0; 81 + 82 + err_out: 83 + rxe_err_dev(rxe, "returned err = %d", err); 84 + return err; 116 85 } 117 86 118 - static int rxe_modify_port(struct ib_device *dev, 119 - u32 port_num, int mask, struct ib_port_modify *attr) 87 + static int rxe_modify_port(struct ib_device *ibdev, u32 port_num, 88 + int mask, struct ib_port_modify *attr) 120 89 { 121 - struct rxe_dev *rxe = to_rdev(dev); 90 + struct rxe_dev *rxe = to_rdev(ibdev); 122 91 struct rxe_port *port; 92 + int err; 93 + 94 + if (port_num != 1) { 95 + err = -EINVAL; 96 + rxe_dbg_dev(rxe, "bad port_num = %d", port_num); 97 + goto err_out; 98 + } 99 + 100 + //TODO is shutdown useful 101 + if (mask & ~(IB_PORT_RESET_QKEY_CNTR)) { 102 + err = -EOPNOTSUPP; 103 + rxe_dbg_dev(rxe, "unsupported mask = 0x%x", mask); 104 + goto err_out; 105 + } 123 106 124 107 port = &rxe->port; 125 - 126 108 port->attr.port_cap_flags |= attr->set_port_cap_mask; 127 109 port->attr.port_cap_flags &= ~attr->clr_port_cap_mask; 128 110 ··· 147 95 port->attr.qkey_viol_cntr = 0; 148 96 149 97 return 0; 98 + 99 + err_out: 100 + rxe_err_dev(rxe, "returned err = %d", err); 101 + return err; 150 102 } 151 103 152 - static enum rdma_link_layer rxe_get_link_layer(struct ib_device *dev, 104 + static enum rdma_link_layer rxe_get_link_layer(struct ib_device *ibdev, 153 105 u32 port_num) 154 106 { 107 + struct rxe_dev *rxe = to_rdev(ibdev); 108 + int err; 109 + 110 + if (port_num != 1) { 111 + err = -EINVAL; 112 + rxe_dbg_dev(rxe, "bad port_num = %d", port_num); 113 + goto err_out; 114 + } 115 + 155 116 return IB_LINK_LAYER_ETHERNET; 117 + 118 + err_out: 119 + rxe_err_dev(rxe, "returned err = %d", err); 120 + return err; 156 121 } 157 122 158 - static int rxe_alloc_ucontext(struct ib_ucontext *ibuc, struct ib_udata *udata) 159 - { 160 - struct rxe_dev *rxe = to_rdev(ibuc->device); 161 - struct rxe_ucontext *uc = to_ruc(ibuc); 162 - 163 - return rxe_add_to_pool(&rxe->uc_pool, uc); 164 - } 165 - 166 - static void rxe_dealloc_ucontext(struct ib_ucontext *ibuc) 167 - { 168 - struct rxe_ucontext *uc = to_ruc(ibuc); 169 - 170 - rxe_cleanup(uc); 171 - } 172 - 173 - static int rxe_port_immutable(struct ib_device *dev, u32 port_num, 123 + static int rxe_port_immutable(struct ib_device *ibdev, u32 port_num, 174 124 struct ib_port_immutable *immutable) 175 125 { 126 + struct rxe_dev *rxe = to_rdev(ibdev); 127 + struct ib_port_attr attr = {}; 176 128 int err; 177 - struct ib_port_attr attr; 129 + 130 + if (port_num != 1) { 131 + err = -EINVAL; 132 + rxe_dbg_dev(rxe, "bad port_num = %d", port_num); 133 + goto err_out; 134 + } 135 + 136 + err = ib_query_port(ibdev, port_num, &attr); 137 + if (err) 138 + goto err_out; 178 139 179 140 immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP; 180 - 181 - err = ib_query_port(dev, port_num, &attr); 182 - if (err) 183 - return err; 184 - 185 141 immutable->pkey_tbl_len = attr.pkey_tbl_len; 186 142 immutable->gid_tbl_len = attr.gid_tbl_len; 187 143 immutable->max_mad_size = IB_MGMT_MAD_SIZE; 188 144 189 145 return 0; 146 + 147 + err_out: 148 + rxe_err_dev(rxe, "returned err = %d", err); 149 + return err; 190 150 } 191 151 152 + /* uc */ 153 + static int rxe_alloc_ucontext(struct ib_ucontext *ibuc, struct ib_udata *udata) 154 + { 155 + struct rxe_dev *rxe = to_rdev(ibuc->device); 156 + struct rxe_ucontext *uc = to_ruc(ibuc); 157 + int err; 158 + 159 + err = rxe_add_to_pool(&rxe->uc_pool, uc); 160 + if (err) 161 + rxe_err_dev(rxe, "unable to create uc"); 162 + 163 + return err; 164 + } 165 + 166 + static void rxe_dealloc_ucontext(struct ib_ucontext *ibuc) 167 + { 168 + struct rxe_ucontext *uc = to_ruc(ibuc); 169 + int err; 170 + 171 + err = rxe_cleanup(uc); 172 + if (err) 173 + rxe_err_uc(uc, "cleanup failed, err = %d", err); 174 + } 175 + 176 + /* pd */ 192 177 static int rxe_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) 193 178 { 194 179 struct rxe_dev *rxe = to_rdev(ibpd->device); 195 180 struct rxe_pd *pd = to_rpd(ibpd); 181 + int err; 196 182 197 - return rxe_add_to_pool(&rxe->pd_pool, pd); 183 + err = rxe_add_to_pool(&rxe->pd_pool, pd); 184 + if (err) { 185 + rxe_dbg_dev(rxe, "unable to alloc pd"); 186 + goto err_out; 187 + } 188 + 189 + return 0; 190 + 191 + err_out: 192 + rxe_err_dev(rxe, "returned err = %d", err); 193 + return err; 198 194 } 199 195 200 196 static int rxe_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) 201 197 { 202 198 struct rxe_pd *pd = to_rpd(ibpd); 199 + int err; 203 200 204 - rxe_cleanup(pd); 201 + err = rxe_cleanup(pd); 202 + if (err) 203 + rxe_err_pd(pd, "cleanup failed, err = %d", err); 204 + 205 205 return 0; 206 206 } 207 207 208 + /* ah */ 208 209 static int rxe_create_ah(struct ib_ah *ibah, 209 210 struct rdma_ah_init_attr *init_attr, 210 211 struct ib_udata *udata) 211 - 212 212 { 213 213 struct rxe_dev *rxe = to_rdev(ibah->device); 214 214 struct rxe_ah *ah = to_rah(ibah); 215 215 struct rxe_create_ah_resp __user *uresp = NULL; 216 - int err; 216 + int err, cleanup_err; 217 217 218 218 if (udata) { 219 219 /* test if new user provider */ ··· 278 174 279 175 err = rxe_add_to_pool_ah(&rxe->ah_pool, ah, 280 176 init_attr->flags & RDMA_CREATE_AH_SLEEPABLE); 281 - if (err) 282 - return err; 177 + if (err) { 178 + rxe_dbg_dev(rxe, "unable to create ah"); 179 + goto err_out; 180 + } 283 181 284 182 /* create index > 0 */ 285 183 ah->ah_num = ah->elem.index; 286 184 287 185 err = rxe_ah_chk_attr(ah, init_attr->ah_attr); 288 186 if (err) { 289 - rxe_cleanup(ah); 290 - return err; 187 + rxe_dbg_ah(ah, "bad attr"); 188 + goto err_cleanup; 291 189 } 292 190 293 191 if (uresp) { ··· 297 191 err = copy_to_user(&uresp->ah_num, &ah->ah_num, 298 192 sizeof(uresp->ah_num)); 299 193 if (err) { 300 - rxe_cleanup(ah); 301 - return -EFAULT; 194 + err = -EFAULT; 195 + rxe_dbg_ah(ah, "unable to copy to user"); 196 + goto err_cleanup; 302 197 } 303 198 } else if (ah->is_user) { 304 199 /* only if old user provider */ ··· 310 203 rxe_finalize(ah); 311 204 312 205 return 0; 206 + 207 + err_cleanup: 208 + cleanup_err = rxe_cleanup(ah); 209 + if (cleanup_err) 210 + rxe_err_ah(ah, "cleanup failed, err = %d", cleanup_err); 211 + err_out: 212 + rxe_err_ah(ah, "returned err = %d", err); 213 + return err; 313 214 } 314 215 315 216 static int rxe_modify_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr) 316 217 { 317 - int err; 318 218 struct rxe_ah *ah = to_rah(ibah); 219 + int err; 319 220 320 221 err = rxe_ah_chk_attr(ah, attr); 321 - if (err) 322 - return err; 222 + if (err) { 223 + rxe_dbg_ah(ah, "bad attr"); 224 + goto err_out; 225 + } 323 226 324 227 rxe_init_av(attr, &ah->av); 228 + 325 229 return 0; 230 + 231 + err_out: 232 + rxe_err_ah(ah, "returned err = %d", err); 233 + return err; 326 234 } 327 235 328 236 static int rxe_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr) ··· 347 225 memset(attr, 0, sizeof(*attr)); 348 226 attr->type = ibah->type; 349 227 rxe_av_to_attr(&ah->av, attr); 228 + 350 229 return 0; 351 230 } 352 231 353 232 static int rxe_destroy_ah(struct ib_ah *ibah, u32 flags) 354 233 { 355 234 struct rxe_ah *ah = to_rah(ibah); 235 + int err; 356 236 357 - rxe_cleanup_ah(ah, flags & RDMA_DESTROY_AH_SLEEPABLE); 358 - 359 - return 0; 360 - } 361 - 362 - static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr) 363 - { 364 - int i; 365 - u32 length; 366 - struct rxe_recv_wqe *recv_wqe; 367 - int num_sge = ibwr->num_sge; 368 - int full; 369 - 370 - full = queue_full(rq->queue, QUEUE_TYPE_FROM_ULP); 371 - if (unlikely(full)) 372 - return -ENOMEM; 373 - 374 - if (unlikely(num_sge > rq->max_sge)) 375 - return -EINVAL; 376 - 377 - length = 0; 378 - for (i = 0; i < num_sge; i++) 379 - length += ibwr->sg_list[i].length; 380 - 381 - recv_wqe = queue_producer_addr(rq->queue, QUEUE_TYPE_FROM_ULP); 382 - recv_wqe->wr_id = ibwr->wr_id; 383 - 384 - memcpy(recv_wqe->dma.sge, ibwr->sg_list, 385 - num_sge * sizeof(struct ib_sge)); 386 - 387 - recv_wqe->dma.length = length; 388 - recv_wqe->dma.resid = length; 389 - recv_wqe->dma.num_sge = num_sge; 390 - recv_wqe->dma.cur_sge = 0; 391 - recv_wqe->dma.sge_offset = 0; 392 - 393 - queue_advance_producer(rq->queue, QUEUE_TYPE_FROM_ULP); 237 + err = rxe_cleanup_ah(ah, flags & RDMA_DESTROY_AH_SLEEPABLE); 238 + if (err) 239 + rxe_err_ah(ah, "cleanup failed, err = %d", err); 394 240 395 241 return 0; 396 242 } 397 243 244 + /* srq */ 398 245 static int rxe_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init, 399 246 struct ib_udata *udata) 400 247 { 401 - int err; 402 248 struct rxe_dev *rxe = to_rdev(ibsrq->device); 403 249 struct rxe_pd *pd = to_rpd(ibsrq->pd); 404 250 struct rxe_srq *srq = to_rsrq(ibsrq); 405 251 struct rxe_create_srq_resp __user *uresp = NULL; 252 + int err, cleanup_err; 406 253 407 254 if (udata) { 408 - if (udata->outlen < sizeof(*uresp)) 409 - return -EINVAL; 255 + if (udata->outlen < sizeof(*uresp)) { 256 + err = -EINVAL; 257 + rxe_err_dev(rxe, "malformed udata"); 258 + goto err_out; 259 + } 410 260 uresp = udata->outbuf; 411 261 } 412 262 413 - if (init->srq_type != IB_SRQT_BASIC) 414 - return -EOPNOTSUPP; 263 + if (init->srq_type != IB_SRQT_BASIC) { 264 + err = -EOPNOTSUPP; 265 + rxe_dbg_dev(rxe, "srq type = %d, not supported", 266 + init->srq_type); 267 + goto err_out; 268 + } 415 269 416 270 err = rxe_srq_chk_init(rxe, init); 417 - if (err) 418 - return err; 271 + if (err) { 272 + rxe_dbg_dev(rxe, "invalid init attributes"); 273 + goto err_out; 274 + } 419 275 420 276 err = rxe_add_to_pool(&rxe->srq_pool, srq); 421 - if (err) 422 - return err; 277 + if (err) { 278 + rxe_dbg_dev(rxe, "unable to create srq, err = %d", err); 279 + goto err_out; 280 + } 423 281 424 282 rxe_get(pd); 425 283 srq->pd = pd; 426 284 427 285 err = rxe_srq_from_init(rxe, srq, init, udata, uresp); 428 - if (err) 286 + if (err) { 287 + rxe_dbg_srq(srq, "create srq failed, err = %d", err); 429 288 goto err_cleanup; 289 + } 430 290 431 291 return 0; 432 292 433 293 err_cleanup: 434 - rxe_cleanup(srq); 435 - 294 + cleanup_err = rxe_cleanup(srq); 295 + if (cleanup_err) 296 + rxe_err_srq(srq, "cleanup failed, err = %d", cleanup_err); 297 + err_out: 298 + rxe_err_dev(rxe, "returned err = %d", err); 436 299 return err; 437 300 } 438 301 ··· 425 318 enum ib_srq_attr_mask mask, 426 319 struct ib_udata *udata) 427 320 { 428 - int err; 429 321 struct rxe_srq *srq = to_rsrq(ibsrq); 430 322 struct rxe_dev *rxe = to_rdev(ibsrq->device); 431 - struct rxe_modify_srq_cmd ucmd = {}; 323 + struct rxe_modify_srq_cmd cmd = {}; 324 + int err; 432 325 433 326 if (udata) { 434 - if (udata->inlen < sizeof(ucmd)) 435 - return -EINVAL; 327 + if (udata->inlen < sizeof(cmd)) { 328 + err = -EINVAL; 329 + rxe_dbg_srq(srq, "malformed udata"); 330 + goto err_out; 331 + } 436 332 437 - err = ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)); 438 - if (err) 439 - return err; 333 + err = ib_copy_from_udata(&cmd, udata, sizeof(cmd)); 334 + if (err) { 335 + err = -EFAULT; 336 + rxe_dbg_srq(srq, "unable to read udata"); 337 + goto err_out; 338 + } 440 339 } 441 340 442 341 err = rxe_srq_chk_attr(rxe, srq, attr, mask); 443 - if (err) 444 - return err; 342 + if (err) { 343 + rxe_dbg_srq(srq, "bad init attributes"); 344 + goto err_out; 345 + } 445 346 446 - return rxe_srq_from_attr(rxe, srq, attr, mask, &ucmd, udata); 347 + err = rxe_srq_from_attr(rxe, srq, attr, mask, &cmd, udata); 348 + if (err) { 349 + rxe_dbg_srq(srq, "bad attr"); 350 + goto err_out; 351 + } 352 + 353 + return 0; 354 + 355 + err_out: 356 + rxe_err_srq(srq, "returned err = %d", err); 357 + return err; 447 358 } 448 359 449 360 static int rxe_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr) 450 361 { 451 362 struct rxe_srq *srq = to_rsrq(ibsrq); 363 + int err; 452 364 453 - if (srq->error) 454 - return -EINVAL; 365 + if (srq->error) { 366 + err = -EINVAL; 367 + rxe_dbg_srq(srq, "srq in error state"); 368 + goto err_out; 369 + } 455 370 456 371 attr->max_wr = srq->rq.queue->buf->index_mask; 457 372 attr->max_sge = srq->rq.max_sge; 458 373 attr->srq_limit = srq->limit; 459 374 return 0; 460 - } 461 375 462 - static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata) 463 - { 464 - struct rxe_srq *srq = to_rsrq(ibsrq); 465 - 466 - rxe_cleanup(srq); 467 - return 0; 376 + err_out: 377 + rxe_err_srq(srq, "returned err = %d", err); 378 + return err; 468 379 } 469 380 470 381 static int rxe_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr, ··· 503 378 504 379 spin_unlock_irqrestore(&srq->rq.producer_lock, flags); 505 380 506 - if (err) 381 + if (err) { 507 382 *bad_wr = wr; 383 + rxe_err_srq(srq, "returned err = %d", err); 384 + } 508 385 509 386 return err; 510 387 } 511 388 389 + static int rxe_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata) 390 + { 391 + struct rxe_srq *srq = to_rsrq(ibsrq); 392 + int err; 393 + 394 + err = rxe_cleanup(srq); 395 + if (err) 396 + rxe_err_srq(srq, "cleanup failed, err = %d", err); 397 + 398 + return 0; 399 + } 400 + 401 + /* qp */ 512 402 static int rxe_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init, 513 403 struct ib_udata *udata) 514 404 { 515 - int err; 516 405 struct rxe_dev *rxe = to_rdev(ibqp->device); 517 406 struct rxe_pd *pd = to_rpd(ibqp->pd); 518 407 struct rxe_qp *qp = to_rqp(ibqp); 519 408 struct rxe_create_qp_resp __user *uresp = NULL; 409 + int err, cleanup_err; 520 410 521 411 if (udata) { 522 - if (udata->outlen < sizeof(*uresp)) 523 - return -EINVAL; 524 - uresp = udata->outbuf; 525 - } 412 + if (udata->inlen) { 413 + err = -EINVAL; 414 + rxe_dbg_dev(rxe, "malformed udata, err = %d", err); 415 + goto err_out; 416 + } 526 417 527 - if (init->create_flags) 528 - return -EOPNOTSUPP; 529 - 530 - err = rxe_qp_chk_init(rxe, init); 531 - if (err) 532 - return err; 533 - 534 - if (udata) { 535 - if (udata->inlen) 536 - return -EINVAL; 418 + if (udata->outlen < sizeof(*uresp)) { 419 + err = -EINVAL; 420 + rxe_dbg_dev(rxe, "malformed udata, err = %d", err); 421 + goto err_out; 422 + } 537 423 538 424 qp->is_user = true; 425 + uresp = udata->outbuf; 539 426 } else { 540 427 qp->is_user = false; 541 428 } 542 429 430 + if (init->create_flags) { 431 + err = -EOPNOTSUPP; 432 + rxe_dbg_dev(rxe, "unsupported create_flags, err = %d", err); 433 + goto err_out; 434 + } 435 + 436 + err = rxe_qp_chk_init(rxe, init); 437 + if (err) { 438 + rxe_dbg_dev(rxe, "bad init attr, err = %d", err); 439 + goto err_out; 440 + } 441 + 543 442 err = rxe_add_to_pool(&rxe->qp_pool, qp); 544 - if (err) 545 - return err; 443 + if (err) { 444 + rxe_dbg_dev(rxe, "unable to create qp, err = %d", err); 445 + goto err_out; 446 + } 546 447 547 448 err = rxe_qp_from_init(rxe, qp, pd, init, uresp, ibqp->pd, udata); 548 - if (err) 549 - goto qp_init; 449 + if (err) { 450 + rxe_dbg_qp(qp, "create qp failed, err = %d", err); 451 + goto err_cleanup; 452 + } 550 453 551 454 rxe_finalize(qp); 552 455 return 0; 553 456 554 - qp_init: 555 - rxe_cleanup(qp); 457 + err_cleanup: 458 + cleanup_err = rxe_cleanup(qp); 459 + if (cleanup_err) 460 + rxe_err_qp(qp, "cleanup failed, err = %d", cleanup_err); 461 + err_out: 462 + rxe_err_dev(rxe, "returned err = %d", err); 556 463 return err; 557 464 } 558 465 559 466 static int rxe_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 560 467 int mask, struct ib_udata *udata) 561 468 { 562 - int err; 563 469 struct rxe_dev *rxe = to_rdev(ibqp->device); 564 470 struct rxe_qp *qp = to_rqp(ibqp); 471 + int err; 565 472 566 - if (mask & ~IB_QP_ATTR_STANDARD_BITS) 567 - return -EOPNOTSUPP; 473 + if (mask & ~IB_QP_ATTR_STANDARD_BITS) { 474 + err = -EOPNOTSUPP; 475 + rxe_dbg_qp(qp, "unsupported mask = 0x%x, err = %d", 476 + mask, err); 477 + goto err_out; 478 + } 568 479 569 480 err = rxe_qp_chk_attr(rxe, qp, attr, mask); 570 - if (err) 571 - return err; 481 + if (err) { 482 + rxe_dbg_qp(qp, "bad mask/attr, err = %d", err); 483 + goto err_out; 484 + } 572 485 573 486 err = rxe_qp_from_attr(qp, attr, mask, udata); 574 - if (err) 575 - return err; 487 + if (err) { 488 + rxe_dbg_qp(qp, "modify qp failed, err = %d", err); 489 + goto err_out; 490 + } 576 491 577 492 if ((mask & IB_QP_AV) && (attr->ah_attr.ah_flags & IB_AH_GRH)) 578 493 qp->src_port = rdma_get_udp_sport(attr->ah_attr.grh.flow_label, ··· 620 455 qp->attr.dest_qp_num); 621 456 622 457 return 0; 458 + 459 + err_out: 460 + rxe_err_qp(qp, "returned err = %d", err); 461 + return err; 623 462 } 624 463 625 464 static int rxe_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ··· 640 471 static int rxe_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) 641 472 { 642 473 struct rxe_qp *qp = to_rqp(ibqp); 643 - int ret; 474 + int err; 644 475 645 - ret = rxe_qp_chk_destroy(qp); 646 - if (ret) 647 - return ret; 476 + err = rxe_qp_chk_destroy(qp); 477 + if (err) { 478 + rxe_dbg_qp(qp, "unable to destroy qp, err = %d", err); 479 + goto err_out; 480 + } 648 481 649 - rxe_cleanup(qp); 482 + err = rxe_cleanup(qp); 483 + if (err) 484 + rxe_err_qp(qp, "cleanup failed, err = %d", err); 485 + 650 486 return 0; 487 + 488 + err_out: 489 + rxe_err_qp(qp, "returned err = %d", err); 490 + return err; 651 491 } 652 492 493 + /* send wr */ 494 + 495 + /* sanity check incoming send work request */ 653 496 static int validate_send_wr(struct rxe_qp *qp, const struct ib_send_wr *ibwr, 654 - unsigned int mask, unsigned int length) 497 + unsigned int *maskp, unsigned int *lengthp) 655 498 { 656 499 int num_sge = ibwr->num_sge; 657 500 struct rxe_sq *sq = &qp->sq; 501 + unsigned int mask = 0; 502 + unsigned long length = 0; 503 + int err = -EINVAL; 504 + int i; 658 505 659 - if (unlikely(num_sge > sq->max_sge)) 660 - return -EINVAL; 506 + do { 507 + mask = wr_opcode_mask(ibwr->opcode, qp); 508 + if (!mask) { 509 + rxe_err_qp(qp, "bad wr opcode for qp type"); 510 + break; 511 + } 661 512 662 - if (unlikely(mask & WR_ATOMIC_MASK)) { 663 - if (length < 8) 664 - return -EINVAL; 513 + if (num_sge > sq->max_sge) { 514 + rxe_err_qp(qp, "num_sge > max_sge"); 515 + break; 516 + } 665 517 666 - if (atomic_wr(ibwr)->remote_addr & 0x7) 667 - return -EINVAL; 668 - } 518 + length = 0; 519 + for (i = 0; i < ibwr->num_sge; i++) 520 + length += ibwr->sg_list[i].length; 669 521 670 - if (unlikely((ibwr->send_flags & IB_SEND_INLINE) && 671 - (length > sq->max_inline))) 672 - return -EINVAL; 522 + if (length > (1UL << 31)) { 523 + rxe_err_qp(qp, "message length too long"); 524 + break; 525 + } 673 526 674 - return 0; 527 + if (mask & WR_ATOMIC_MASK) { 528 + if (length != 8) { 529 + rxe_err_qp(qp, "atomic length != 8"); 530 + break; 531 + } 532 + if (atomic_wr(ibwr)->remote_addr & 0x7) { 533 + rxe_err_qp(qp, "misaligned atomic address"); 534 + break; 535 + } 536 + } 537 + if (ibwr->send_flags & IB_SEND_INLINE) { 538 + if (!(mask & WR_INLINE_MASK)) { 539 + rxe_err_qp(qp, "opcode doesn't support inline data"); 540 + break; 541 + } 542 + if (length > sq->max_inline) { 543 + rxe_err_qp(qp, "inline length too big"); 544 + break; 545 + } 546 + } 547 + 548 + err = 0; 549 + } while (0); 550 + 551 + *maskp = mask; 552 + *lengthp = (int)length; 553 + 554 + return err; 675 555 } 676 556 677 - static void init_send_wr(struct rxe_qp *qp, struct rxe_send_wr *wr, 557 + static int init_send_wr(struct rxe_qp *qp, struct rxe_send_wr *wr, 678 558 const struct ib_send_wr *ibwr) 679 559 { 680 560 wr->wr_id = ibwr->wr_id; ··· 739 521 wr->wr.ud.ah_num = to_rah(ibah)->ah_num; 740 522 if (qp_type(qp) == IB_QPT_GSI) 741 523 wr->wr.ud.pkey_index = ud_wr(ibwr)->pkey_index; 742 - if (wr->opcode == IB_WR_SEND_WITH_IMM) 524 + 525 + switch (wr->opcode) { 526 + case IB_WR_SEND_WITH_IMM: 743 527 wr->ex.imm_data = ibwr->ex.imm_data; 528 + break; 529 + case IB_WR_SEND: 530 + break; 531 + default: 532 + rxe_err_qp(qp, "bad wr opcode %d for UD/GSI QP", 533 + wr->opcode); 534 + return -EINVAL; 535 + } 744 536 } else { 745 537 switch (wr->opcode) { 746 538 case IB_WR_RDMA_WRITE_WITH_IMM: ··· 767 539 case IB_WR_SEND_WITH_INV: 768 540 wr->ex.invalidate_rkey = ibwr->ex.invalidate_rkey; 769 541 break; 542 + case IB_WR_RDMA_READ_WITH_INV: 543 + wr->ex.invalidate_rkey = ibwr->ex.invalidate_rkey; 544 + wr->wr.rdma.remote_addr = rdma_wr(ibwr)->remote_addr; 545 + wr->wr.rdma.rkey = rdma_wr(ibwr)->rkey; 546 + break; 770 547 case IB_WR_ATOMIC_CMP_AND_SWP: 771 548 case IB_WR_ATOMIC_FETCH_AND_ADD: 772 549 wr->wr.atomic.remote_addr = ··· 783 550 break; 784 551 case IB_WR_LOCAL_INV: 785 552 wr->ex.invalidate_rkey = ibwr->ex.invalidate_rkey; 786 - break; 553 + break; 787 554 case IB_WR_REG_MR: 788 555 wr->wr.reg.mr = reg_wr(ibwr)->mr; 789 556 wr->wr.reg.key = reg_wr(ibwr)->key; 790 557 wr->wr.reg.access = reg_wr(ibwr)->access; 791 - break; 558 + break; 559 + case IB_WR_SEND: 560 + case IB_WR_BIND_MW: 561 + case IB_WR_FLUSH: 562 + case IB_WR_ATOMIC_WRITE: 563 + break; 792 564 default: 565 + rxe_err_qp(qp, "unsupported wr opcode %d", 566 + wr->opcode); 567 + return -EINVAL; 793 568 break; 794 569 } 795 570 } 571 + 572 + return 0; 796 573 } 797 574 798 575 static void copy_inline_data_to_wqe(struct rxe_send_wqe *wqe, ··· 813 570 int i; 814 571 815 572 for (i = 0; i < ibwr->num_sge; i++, sge++) { 816 - memcpy(p, (void *)(uintptr_t)sge->addr, sge->length); 573 + memcpy(p, ib_virt_dma_to_page(sge->addr), sge->length); 817 574 p += sge->length; 818 575 } 819 576 } 820 577 821 - static void init_send_wqe(struct rxe_qp *qp, const struct ib_send_wr *ibwr, 578 + static int init_send_wqe(struct rxe_qp *qp, const struct ib_send_wr *ibwr, 822 579 unsigned int mask, unsigned int length, 823 580 struct rxe_send_wqe *wqe) 824 581 { 825 582 int num_sge = ibwr->num_sge; 583 + int err; 826 584 827 - init_send_wr(qp, &wqe->wr, ibwr); 585 + err = init_send_wr(qp, &wqe->wr, ibwr); 586 + if (err) 587 + return err; 828 588 829 589 /* local operation */ 830 590 if (unlikely(mask & WR_LOCAL_OP_MASK)) { 831 591 wqe->mask = mask; 832 592 wqe->state = wqe_state_posted; 833 - return; 593 + return 0; 834 594 } 835 595 836 596 if (unlikely(ibwr->send_flags & IB_SEND_INLINE)) ··· 852 606 wqe->dma.sge_offset = 0; 853 607 wqe->state = wqe_state_posted; 854 608 wqe->ssn = atomic_add_return(1, &qp->ssn); 855 - } 856 - 857 - static int post_one_send(struct rxe_qp *qp, const struct ib_send_wr *ibwr, 858 - unsigned int mask, u32 length) 859 - { 860 - int err; 861 - struct rxe_sq *sq = &qp->sq; 862 - struct rxe_send_wqe *send_wqe; 863 - unsigned long flags; 864 - int full; 865 - 866 - err = validate_send_wr(qp, ibwr, mask, length); 867 - if (err) 868 - return err; 869 - 870 - spin_lock_irqsave(&qp->sq.sq_lock, flags); 871 - 872 - full = queue_full(sq->queue, QUEUE_TYPE_FROM_ULP); 873 - 874 - if (unlikely(full)) { 875 - spin_unlock_irqrestore(&qp->sq.sq_lock, flags); 876 - return -ENOMEM; 877 - } 878 - 879 - send_wqe = queue_producer_addr(sq->queue, QUEUE_TYPE_FROM_ULP); 880 - init_send_wqe(qp, ibwr, mask, length, send_wqe); 881 - 882 - queue_advance_producer(sq->queue, QUEUE_TYPE_FROM_ULP); 883 - 884 - spin_unlock_irqrestore(&qp->sq.sq_lock, flags); 885 609 886 610 return 0; 887 611 } 888 612 889 - static int rxe_post_send_kernel(struct rxe_qp *qp, const struct ib_send_wr *wr, 613 + static int post_one_send(struct rxe_qp *qp, const struct ib_send_wr *ibwr) 614 + { 615 + int err; 616 + struct rxe_sq *sq = &qp->sq; 617 + struct rxe_send_wqe *send_wqe; 618 + unsigned int mask; 619 + unsigned int length; 620 + int full; 621 + 622 + err = validate_send_wr(qp, ibwr, &mask, &length); 623 + if (err) 624 + return err; 625 + 626 + full = queue_full(sq->queue, QUEUE_TYPE_FROM_ULP); 627 + if (unlikely(full)) { 628 + rxe_err_qp(qp, "send queue full"); 629 + return -ENOMEM; 630 + } 631 + 632 + send_wqe = queue_producer_addr(sq->queue, QUEUE_TYPE_FROM_ULP); 633 + err = init_send_wqe(qp, ibwr, mask, length, send_wqe); 634 + if (!err) 635 + queue_advance_producer(sq->queue, QUEUE_TYPE_FROM_ULP); 636 + 637 + return err; 638 + } 639 + 640 + static int rxe_post_send_kernel(struct rxe_qp *qp, 641 + const struct ib_send_wr *ibwr, 890 642 const struct ib_send_wr **bad_wr) 891 643 { 892 644 int err = 0; 893 - unsigned int mask; 894 - unsigned int length = 0; 895 - int i; 896 - struct ib_send_wr *next; 645 + unsigned long flags; 897 646 898 - while (wr) { 899 - mask = wr_opcode_mask(wr->opcode, qp); 900 - if (unlikely(!mask)) { 901 - err = -EINVAL; 902 - *bad_wr = wr; 903 - break; 904 - } 905 - 906 - if (unlikely((wr->send_flags & IB_SEND_INLINE) && 907 - !(mask & WR_INLINE_MASK))) { 908 - err = -EINVAL; 909 - *bad_wr = wr; 910 - break; 911 - } 912 - 913 - next = wr->next; 914 - 915 - length = 0; 916 - for (i = 0; i < wr->num_sge; i++) 917 - length += wr->sg_list[i].length; 918 - 919 - err = post_one_send(qp, wr, mask, length); 920 - 647 + spin_lock_irqsave(&qp->sq.sq_lock, flags); 648 + while (ibwr) { 649 + err = post_one_send(qp, ibwr); 921 650 if (err) { 922 - *bad_wr = wr; 651 + *bad_wr = ibwr; 923 652 break; 924 653 } 925 - wr = next; 654 + ibwr = ibwr->next; 926 655 } 656 + spin_unlock_irqrestore(&qp->sq.sq_lock, flags); 927 657 928 - rxe_sched_task(&qp->req.task); 929 - if (unlikely(qp->req.state == QP_STATE_ERROR)) 658 + if (!err) 659 + rxe_sched_task(&qp->req.task); 660 + 661 + spin_lock_bh(&qp->state_lock); 662 + if (qp_state(qp) == IB_QPS_ERR) 930 663 rxe_sched_task(&qp->comp.task); 664 + spin_unlock_bh(&qp->state_lock); 931 665 932 666 return err; 933 667 } ··· 916 690 const struct ib_send_wr **bad_wr) 917 691 { 918 692 struct rxe_qp *qp = to_rqp(ibqp); 693 + int err; 919 694 920 - if (unlikely(!qp->valid)) { 921 - *bad_wr = wr; 695 + spin_lock_bh(&qp->state_lock); 696 + /* caller has already called destroy_qp */ 697 + if (WARN_ON_ONCE(!qp->valid)) { 698 + spin_unlock_bh(&qp->state_lock); 699 + rxe_err_qp(qp, "qp has been destroyed"); 922 700 return -EINVAL; 923 701 } 924 702 925 - if (unlikely(qp->req.state < QP_STATE_READY)) { 703 + if (unlikely(qp_state(qp) < IB_QPS_RTS)) { 704 + spin_unlock_bh(&qp->state_lock); 926 705 *bad_wr = wr; 706 + rxe_err_qp(qp, "qp not ready to send"); 927 707 return -EINVAL; 928 708 } 709 + spin_unlock_bh(&qp->state_lock); 929 710 930 711 if (qp->is_user) { 931 712 /* Utilize process context to do protocol processing */ 932 713 rxe_run_task(&qp->req.task); 933 - return 0; 934 - } else 935 - return rxe_post_send_kernel(qp, wr, bad_wr); 714 + } else { 715 + err = rxe_post_send_kernel(qp, wr, bad_wr); 716 + if (err) 717 + return err; 718 + } 719 + 720 + return 0; 721 + } 722 + 723 + /* recv wr */ 724 + static int post_one_recv(struct rxe_rq *rq, const struct ib_recv_wr *ibwr) 725 + { 726 + int i; 727 + unsigned long length; 728 + struct rxe_recv_wqe *recv_wqe; 729 + int num_sge = ibwr->num_sge; 730 + int full; 731 + int err; 732 + 733 + full = queue_full(rq->queue, QUEUE_TYPE_FROM_ULP); 734 + if (unlikely(full)) { 735 + err = -ENOMEM; 736 + rxe_dbg("queue full"); 737 + goto err_out; 738 + } 739 + 740 + if (unlikely(num_sge > rq->max_sge)) { 741 + err = -EINVAL; 742 + rxe_dbg("bad num_sge > max_sge"); 743 + goto err_out; 744 + } 745 + 746 + length = 0; 747 + for (i = 0; i < num_sge; i++) 748 + length += ibwr->sg_list[i].length; 749 + 750 + /* IBA max message size is 2^31 */ 751 + if (length >= (1UL<<31)) { 752 + err = -EINVAL; 753 + rxe_dbg("message length too long"); 754 + goto err_out; 755 + } 756 + 757 + recv_wqe = queue_producer_addr(rq->queue, QUEUE_TYPE_FROM_ULP); 758 + 759 + recv_wqe->wr_id = ibwr->wr_id; 760 + recv_wqe->dma.length = length; 761 + recv_wqe->dma.resid = length; 762 + recv_wqe->dma.num_sge = num_sge; 763 + recv_wqe->dma.cur_sge = 0; 764 + recv_wqe->dma.sge_offset = 0; 765 + memcpy(recv_wqe->dma.sge, ibwr->sg_list, 766 + num_sge * sizeof(struct ib_sge)); 767 + 768 + queue_advance_producer(rq->queue, QUEUE_TYPE_FROM_ULP); 769 + 770 + return 0; 771 + 772 + err_out: 773 + rxe_dbg("returned err = %d", err); 774 + return err; 936 775 } 937 776 938 777 static int rxe_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, ··· 1008 717 struct rxe_rq *rq = &qp->rq; 1009 718 unsigned long flags; 1010 719 1011 - if (unlikely((qp_state(qp) < IB_QPS_INIT) || !qp->valid)) { 1012 - *bad_wr = wr; 720 + spin_lock_bh(&qp->state_lock); 721 + /* caller has already called destroy_qp */ 722 + if (WARN_ON_ONCE(!qp->valid)) { 723 + spin_unlock_bh(&qp->state_lock); 724 + rxe_err_qp(qp, "qp has been destroyed"); 1013 725 return -EINVAL; 1014 726 } 1015 727 728 + /* see C10-97.2.1 */ 729 + if (unlikely((qp_state(qp) < IB_QPS_INIT))) { 730 + spin_unlock_bh(&qp->state_lock); 731 + *bad_wr = wr; 732 + rxe_dbg_qp(qp, "qp not ready to post recv"); 733 + return -EINVAL; 734 + } 735 + spin_unlock_bh(&qp->state_lock); 736 + 1016 737 if (unlikely(qp->srq)) { 1017 738 *bad_wr = wr; 739 + rxe_dbg_qp(qp, "qp has srq, use post_srq_recv instead"); 1018 740 return -EINVAL; 1019 741 } 1020 742 ··· 1044 740 1045 741 spin_unlock_irqrestore(&rq->producer_lock, flags); 1046 742 1047 - if (qp->resp.state == QP_STATE_ERROR) 743 + spin_lock_bh(&qp->state_lock); 744 + if (qp_state(qp) == IB_QPS_ERR) 1048 745 rxe_sched_task(&qp->resp.task); 746 + spin_unlock_bh(&qp->state_lock); 1049 747 1050 748 return err; 1051 749 } 1052 750 751 + /* cq */ 1053 752 static int rxe_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 1054 753 struct ib_udata *udata) 1055 754 { 1056 - int err; 1057 755 struct ib_device *dev = ibcq->device; 1058 756 struct rxe_dev *rxe = to_rdev(dev); 1059 757 struct rxe_cq *cq = to_rcq(ibcq); 1060 758 struct rxe_create_cq_resp __user *uresp = NULL; 759 + int err, cleanup_err; 1061 760 1062 761 if (udata) { 1063 - if (udata->outlen < sizeof(*uresp)) 1064 - return -EINVAL; 762 + if (udata->outlen < sizeof(*uresp)) { 763 + err = -EINVAL; 764 + rxe_dbg_dev(rxe, "malformed udata, err = %d", err); 765 + goto err_out; 766 + } 1065 767 uresp = udata->outbuf; 1066 768 } 1067 769 1068 - if (attr->flags) 1069 - return -EOPNOTSUPP; 770 + if (attr->flags) { 771 + err = -EOPNOTSUPP; 772 + rxe_dbg_dev(rxe, "bad attr->flags, err = %d", err); 773 + goto err_out; 774 + } 1070 775 1071 776 err = rxe_cq_chk_attr(rxe, NULL, attr->cqe, attr->comp_vector); 1072 - if (err) 1073 - return err; 777 + if (err) { 778 + rxe_dbg_dev(rxe, "bad init attributes, err = %d", err); 779 + goto err_out; 780 + } 781 + 782 + err = rxe_add_to_pool(&rxe->cq_pool, cq); 783 + if (err) { 784 + rxe_dbg_dev(rxe, "unable to create cq, err = %d", err); 785 + goto err_out; 786 + } 1074 787 1075 788 err = rxe_cq_from_init(rxe, cq, attr->cqe, attr->comp_vector, udata, 1076 789 uresp); 1077 - if (err) 1078 - return err; 790 + if (err) { 791 + rxe_dbg_cq(cq, "create cq failed, err = %d", err); 792 + goto err_cleanup; 793 + } 1079 794 1080 - return rxe_add_to_pool(&rxe->cq_pool, cq); 1081 - } 1082 - 1083 - static int rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) 1084 - { 1085 - struct rxe_cq *cq = to_rcq(ibcq); 1086 - 1087 - /* See IBA C11-17: The CI shall return an error if this Verb is 1088 - * invoked while a Work Queue is still associated with the CQ. 1089 - */ 1090 - if (atomic_read(&cq->num_wq)) 1091 - return -EINVAL; 1092 - 1093 - rxe_cq_disable(cq); 1094 - 1095 - rxe_cleanup(cq); 1096 795 return 0; 796 + 797 + err_cleanup: 798 + cleanup_err = rxe_cleanup(cq); 799 + if (cleanup_err) 800 + rxe_err_cq(cq, "cleanup failed, err = %d", cleanup_err); 801 + err_out: 802 + rxe_err_dev(rxe, "returned err = %d", err); 803 + return err; 1097 804 } 1098 805 1099 806 static int rxe_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata) 1100 807 { 1101 - int err; 1102 808 struct rxe_cq *cq = to_rcq(ibcq); 1103 809 struct rxe_dev *rxe = to_rdev(ibcq->device); 1104 810 struct rxe_resize_cq_resp __user *uresp = NULL; 811 + int err; 1105 812 1106 813 if (udata) { 1107 - if (udata->outlen < sizeof(*uresp)) 1108 - return -EINVAL; 814 + if (udata->outlen < sizeof(*uresp)) { 815 + err = -EINVAL; 816 + rxe_dbg_cq(cq, "malformed udata"); 817 + goto err_out; 818 + } 1109 819 uresp = udata->outbuf; 1110 820 } 1111 821 1112 822 err = rxe_cq_chk_attr(rxe, cq, cqe, 0); 1113 - if (err) 1114 - return err; 823 + if (err) { 824 + rxe_dbg_cq(cq, "bad attr, err = %d", err); 825 + goto err_out; 826 + } 1115 827 1116 - return rxe_cq_resize_queue(cq, cqe, uresp, udata); 828 + err = rxe_cq_resize_queue(cq, cqe, uresp, udata); 829 + if (err) { 830 + rxe_dbg_cq(cq, "resize cq failed, err = %d", err); 831 + goto err_out; 832 + } 833 + 834 + return 0; 835 + 836 + err_out: 837 + rxe_err_cq(cq, "returned err = %d", err); 838 + return err; 1117 839 } 1118 840 1119 841 static int rxe_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc) ··· 1153 823 for (i = 0; i < num_entries; i++) { 1154 824 cqe = queue_head(cq->queue, QUEUE_TYPE_TO_ULP); 1155 825 if (!cqe) 1156 - break; 826 + break; /* queue empty */ 1157 827 1158 828 memcpy(wc++, &cqe->ibwc, sizeof(*wc)); 1159 829 queue_advance_consumer(cq->queue, QUEUE_TYPE_TO_ULP); ··· 1194 864 return ret; 1195 865 } 1196 866 867 + static int rxe_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) 868 + { 869 + struct rxe_cq *cq = to_rcq(ibcq); 870 + int err; 871 + 872 + /* See IBA C11-17: The CI shall return an error if this Verb is 873 + * invoked while a Work Queue is still associated with the CQ. 874 + */ 875 + if (atomic_read(&cq->num_wq)) { 876 + err = -EINVAL; 877 + rxe_dbg_cq(cq, "still in use"); 878 + goto err_out; 879 + } 880 + 881 + err = rxe_cleanup(cq); 882 + if (err) 883 + rxe_err_cq(cq, "cleanup failed, err = %d", err); 884 + 885 + return 0; 886 + 887 + err_out: 888 + rxe_err_cq(cq, "returned err = %d", err); 889 + return err; 890 + } 891 + 892 + /* mr */ 1197 893 static struct ib_mr *rxe_get_dma_mr(struct ib_pd *ibpd, int access) 1198 894 { 1199 895 struct rxe_dev *rxe = to_rdev(ibpd->device); ··· 1228 872 int err; 1229 873 1230 874 mr = kzalloc(sizeof(*mr), GFP_KERNEL); 1231 - if (!mr) { 1232 - err = -ENOMEM; 1233 - goto err_out; 1234 - } 875 + if (!mr) 876 + return ERR_PTR(-ENOMEM); 1235 877 1236 878 err = rxe_add_to_pool(&rxe->mr_pool, mr); 1237 - if (err) 879 + if (err) { 880 + rxe_dbg_dev(rxe, "unable to create mr"); 1238 881 goto err_free; 882 + } 1239 883 1240 884 rxe_get(pd); 1241 885 mr->ibmr.pd = ibpd; ··· 1247 891 1248 892 err_free: 1249 893 kfree(mr); 1250 - err_out: 894 + rxe_err_pd(pd, "returned err = %d", err); 1251 895 return ERR_PTR(err); 1252 896 } 1253 897 1254 - static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, 1255 - u64 start, 1256 - u64 length, 1257 - u64 iova, 1258 - int access, struct ib_udata *udata) 898 + static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start, 899 + u64 length, u64 iova, int access, 900 + struct ib_udata *udata) 1259 901 { 1260 - int err; 1261 902 struct rxe_dev *rxe = to_rdev(ibpd->device); 1262 903 struct rxe_pd *pd = to_rpd(ibpd); 1263 904 struct rxe_mr *mr; 905 + int err, cleanup_err; 1264 906 1265 907 mr = kzalloc(sizeof(*mr), GFP_KERNEL); 1266 - if (!mr) { 1267 - err = -ENOMEM; 1268 - goto err_out; 1269 - } 908 + if (!mr) 909 + return ERR_PTR(-ENOMEM); 1270 910 1271 911 err = rxe_add_to_pool(&rxe->mr_pool, mr); 1272 - if (err) 912 + if (err) { 913 + rxe_dbg_pd(pd, "unable to create mr"); 1273 914 goto err_free; 915 + } 1274 916 1275 917 rxe_get(pd); 1276 918 mr->ibmr.pd = ibpd; 1277 919 mr->ibmr.device = ibpd->device; 1278 920 1279 921 err = rxe_mr_init_user(rxe, start, length, iova, access, mr); 1280 - if (err) 922 + if (err) { 923 + rxe_dbg_mr(mr, "reg_user_mr failed, err = %d", err); 1281 924 goto err_cleanup; 925 + } 1282 926 1283 927 rxe_finalize(mr); 1284 928 return &mr->ibmr; 1285 929 1286 930 err_cleanup: 1287 - rxe_cleanup(mr); 931 + cleanup_err = rxe_cleanup(mr); 932 + if (cleanup_err) 933 + rxe_err_mr(mr, "cleanup failed, err = %d", cleanup_err); 1288 934 err_free: 1289 935 kfree(mr); 1290 - err_out: 936 + rxe_err_pd(pd, "returned err = %d", err); 1291 937 return ERR_PTR(err); 1292 938 } 1293 939 ··· 1299 941 struct rxe_dev *rxe = to_rdev(ibpd->device); 1300 942 struct rxe_pd *pd = to_rpd(ibpd); 1301 943 struct rxe_mr *mr; 1302 - int err; 944 + int err, cleanup_err; 1303 945 1304 - if (mr_type != IB_MR_TYPE_MEM_REG) 1305 - return ERR_PTR(-EINVAL); 1306 - 1307 - mr = kzalloc(sizeof(*mr), GFP_KERNEL); 1308 - if (!mr) { 1309 - err = -ENOMEM; 946 + if (mr_type != IB_MR_TYPE_MEM_REG) { 947 + err = -EINVAL; 948 + rxe_dbg_pd(pd, "mr type %d not supported, err = %d", 949 + mr_type, err); 1310 950 goto err_out; 1311 951 } 952 + 953 + mr = kzalloc(sizeof(*mr), GFP_KERNEL); 954 + if (!mr) 955 + return ERR_PTR(-ENOMEM); 1312 956 1313 957 err = rxe_add_to_pool(&rxe->mr_pool, mr); 1314 958 if (err) ··· 1321 961 mr->ibmr.device = ibpd->device; 1322 962 1323 963 err = rxe_mr_init_fast(max_num_sg, mr); 1324 - if (err) 964 + if (err) { 965 + rxe_dbg_mr(mr, "alloc_mr failed, err = %d", err); 1325 966 goto err_cleanup; 967 + } 1326 968 1327 969 rxe_finalize(mr); 1328 970 return &mr->ibmr; 1329 971 1330 972 err_cleanup: 1331 - rxe_cleanup(mr); 973 + cleanup_err = rxe_cleanup(mr); 974 + if (cleanup_err) 975 + rxe_err_mr(mr, "cleanup failed, err = %d", err); 1332 976 err_free: 1333 977 kfree(mr); 1334 978 err_out: 979 + rxe_err_pd(pd, "returned err = %d", err); 1335 980 return ERR_PTR(err); 981 + } 982 + 983 + static int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata) 984 + { 985 + struct rxe_mr *mr = to_rmr(ibmr); 986 + int err, cleanup_err; 987 + 988 + /* See IBA 10.6.7.2.6 */ 989 + if (atomic_read(&mr->num_mw) > 0) { 990 + err = -EINVAL; 991 + rxe_dbg_mr(mr, "mr has mw's bound"); 992 + goto err_out; 993 + } 994 + 995 + cleanup_err = rxe_cleanup(mr); 996 + if (cleanup_err) 997 + rxe_err_mr(mr, "cleanup failed, err = %d", cleanup_err); 998 + 999 + kfree_rcu(mr); 1000 + return 0; 1001 + 1002 + err_out: 1003 + rxe_err_mr(mr, "returned err = %d", err); 1004 + return err; 1336 1005 } 1337 1006 1338 1007 static ssize_t parent_show(struct device *device, ··· 1484 1095 1485 1096 err = ib_register_device(dev, ibdev_name, NULL); 1486 1097 if (err) 1487 - rxe_dbg(rxe, "failed with error %d\n", err); 1098 + rxe_dbg_dev(rxe, "failed with error %d\n", err); 1488 1099 1489 1100 /* 1490 1101 * Note that rxe may be invalid at this point if another thread
-14
drivers/infiniband/sw/rxe/rxe_verbs.h
··· 63 63 struct rxe_queue *queue; 64 64 spinlock_t cq_lock; 65 65 u8 notify; 66 - bool is_dying; 67 66 bool is_user; 68 - struct tasklet_struct comp_task; 69 67 atomic_t num_wq; 70 68 }; 71 69 ··· 102 104 int error; 103 105 }; 104 106 105 - enum rxe_qp_state { 106 - QP_STATE_RESET, 107 - QP_STATE_INIT, 108 - QP_STATE_READY, 109 - QP_STATE_DRAIN, /* req only */ 110 - QP_STATE_DRAINED, /* req only */ 111 - QP_STATE_ERROR 112 - }; 113 - 114 107 struct rxe_req_info { 115 - enum rxe_qp_state state; 116 108 int wqe_index; 117 109 u32 psn; 118 110 int opcode; ··· 117 129 }; 118 130 119 131 struct rxe_comp_info { 120 - enum rxe_qp_state state; 121 132 u32 psn; 122 133 int opcode; 123 134 int timeout; ··· 162 175 }; 163 176 164 177 struct rxe_resp_info { 165 - enum rxe_qp_state state; 166 178 u32 msn; 167 179 u32 psn; 168 180 u32 ack_psn;
-3
drivers/infiniband/sw/siw/siw_main.c
··· 437 437 438 438 dev_dbg(&netdev->dev, "siw: event %lu\n", event); 439 439 440 - if (dev_net(netdev) != &init_net) 441 - return NOTIFY_OK; 442 - 443 440 base_dev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_SIW); 444 441 if (!base_dev) 445 442 return NOTIFY_OK;
+3 -3
drivers/infiniband/sw/siw/siw_qp_rx.c
··· 139 139 break; 140 140 141 141 bytes = min(bytes, len); 142 - if (siw_rx_kva(srx, (void *)(uintptr_t)buf_addr, bytes) == 142 + if (siw_rx_kva(srx, ib_virt_dma_to_ptr(buf_addr), bytes) == 143 143 bytes) { 144 144 copied += bytes; 145 145 offset += bytes; ··· 487 487 mem_p = *mem; 488 488 if (mem_p->mem_obj == NULL) 489 489 rv = siw_rx_kva(srx, 490 - (void *)(uintptr_t)(sge->laddr + frx->sge_off), 490 + ib_virt_dma_to_ptr(sge->laddr + frx->sge_off), 491 491 sge_bytes); 492 492 else if (!mem_p->is_pbl) 493 493 rv = siw_rx_umem(srx, mem_p->umem, ··· 852 852 853 853 if (mem_p->mem_obj == NULL) 854 854 rv = siw_rx_kva(srx, 855 - (void *)(uintptr_t)(sge->laddr + wqe->processed), 855 + ib_virt_dma_to_ptr(sge->laddr + wqe->processed), 856 856 bytes); 857 857 else if (!mem_p->is_pbl) 858 858 rv = siw_rx_umem(srx, mem_p->umem, sge->laddr + wqe->processed,
+7 -14
drivers/infiniband/sw/siw/siw_qp_tx.c
··· 29 29 dma_addr_t paddr = siw_pbl_get_buffer(pbl, offset, NULL, idx); 30 30 31 31 if (paddr) 32 - return virt_to_page((void *)(uintptr_t)paddr); 32 + return ib_virt_dma_to_page(paddr); 33 33 34 34 return NULL; 35 35 } ··· 56 56 57 57 if (!mem->mem_obj) { 58 58 /* Kernel client using kva */ 59 - memcpy(paddr, 60 - (const void *)(uintptr_t)sge->laddr, bytes); 59 + memcpy(paddr, ib_virt_dma_to_ptr(sge->laddr), bytes); 61 60 } else if (c_tx->in_syscall) { 62 61 if (copy_from_user(paddr, u64_to_user_ptr(sge->laddr), 63 62 bytes)) ··· 476 477 * or memory region with assigned kernel buffer 477 478 */ 478 479 iov[seg].iov_base = 479 - (void *)(uintptr_t)(sge->laddr + sge_off); 480 + ib_virt_dma_to_ptr(sge->laddr + sge_off); 480 481 iov[seg].iov_len = sge_len; 481 482 482 483 if (do_crc) ··· 536 537 * Cast to an uintptr_t to preserve all 64 bits 537 538 * in sge->laddr. 538 539 */ 539 - uintptr_t va = (uintptr_t)(sge->laddr + sge_off); 540 + u64 va = sge->laddr + sge_off; 540 541 541 - /* 542 - * virt_to_page() takes a (void *) pointer 543 - * so cast to a (void *) meaning it will be 64 544 - * bits on a 64 bit platform and 32 bits on a 545 - * 32 bit platform. 546 - */ 547 - page_array[seg] = virt_to_page((void *)(va & PAGE_MASK)); 542 + page_array[seg] = ib_virt_dma_to_page(va); 548 543 if (do_crc) 549 544 crypto_shash_update( 550 545 c_tx->mpa_crc_hd, 551 - (void *)va, 546 + ib_virt_dma_to_ptr(va), 552 547 plen); 553 548 } 554 549 ··· 551 558 data_len -= plen; 552 559 fp_off = 0; 553 560 554 - if (++seg > (int)MAX_ARRAY) { 561 + if (++seg >= (int)MAX_ARRAY) { 555 562 siw_dbg_qp(tx_qp(c_tx), "to many fragments\n"); 556 563 siw_unmap_pages(iov, kmap_mask, seg-1); 557 564 wqe->processed -= c_tx->bytes_unsent;
+2 -2
drivers/infiniband/sw/siw/siw_verbs.c
··· 660 660 bytes = -EINVAL; 661 661 break; 662 662 } 663 - memcpy(kbuf, (void *)(uintptr_t)core_sge->addr, 663 + memcpy(kbuf, ib_virt_dma_to_ptr(core_sge->addr), 664 664 core_sge->length); 665 665 666 666 kbuf += core_sge->length; ··· 1523 1523 } 1524 1524 siw_dbg_mem(mem, 1525 1525 "sge[%d], size %u, addr 0x%p, total %lu\n", 1526 - i, pble->size, (void *)(uintptr_t)pble->addr, 1526 + i, pble->size, ib_virt_dma_to_ptr(pble->addr), 1527 1527 pbl_size); 1528 1528 } 1529 1529 rv = ib_sg_to_pages(base_mr, sl, num_sle, sg_off, siw_set_pbl_page);
+9 -8
drivers/infiniband/ulp/iser/iser_initiator.c
··· 141 141 142 142 /* creates a new tx descriptor and adds header regd buffer */ 143 143 static void iser_create_send_desc(struct iser_conn *iser_conn, 144 - struct iser_tx_desc *tx_desc) 144 + struct iser_tx_desc *tx_desc, enum iser_desc_type type, 145 + void (*done)(struct ib_cq *cq, struct ib_wc *wc)) 145 146 { 146 147 struct iser_device *device = iser_conn->ib_conn.device; 148 + 149 + tx_desc->type = type; 150 + tx_desc->cqe.done = done; 147 151 148 152 ib_dma_sync_single_for_cpu(device->ib_device, 149 153 tx_desc->dma_addr, ISER_HEADERS_LEN, DMA_TO_DEVICE); ··· 353 349 edtl = ntohl(hdr->data_length); 354 350 355 351 /* build the tx desc regd header and add it to the tx desc dto */ 356 - tx_desc->type = ISCSI_TX_SCSI_COMMAND; 357 - tx_desc->cqe.done = iser_cmd_comp; 358 - iser_create_send_desc(iser_conn, tx_desc); 352 + iser_create_send_desc(iser_conn, tx_desc, ISCSI_TX_SCSI_COMMAND, 353 + iser_cmd_comp); 359 354 360 355 if (hdr->flags & ISCSI_FLAG_CMD_READ) { 361 356 data_buf = &iser_task->data[ISER_DIR_IN]; ··· 460 457 iser_dbg("data-out itt: %d, offset: %ld, sz: %ld\n", 461 458 itt, buf_offset, data_seg_len); 462 459 463 - 464 460 err = iser_post_send(&iser_conn->ib_conn, tx_desc); 465 461 if (!err) 466 462 return 0; ··· 480 478 struct iser_device *device; 481 479 482 480 /* build the tx desc regd header and add it to the tx desc dto */ 483 - mdesc->type = ISCSI_TX_CONTROL; 484 - mdesc->cqe.done = iser_ctrl_comp; 485 - iser_create_send_desc(iser_conn, mdesc); 481 + iser_create_send_desc(iser_conn, mdesc, ISCSI_TX_CONTROL, 482 + iser_ctrl_comp); 486 483 487 484 device = iser_conn->ib_conn.device; 488 485
-6
drivers/infiniband/ulp/iser/iser_verbs.c
··· 37 37 38 38 #include "iscsi_iser.h" 39 39 40 - #define ISCSI_ISER_MAX_CONN 8 41 - #define ISER_MAX_RX_LEN (ISER_QP_MAX_RECV_DTOS * ISCSI_ISER_MAX_CONN) 42 - #define ISER_MAX_TX_LEN (ISER_QP_MAX_REQ_DTOS * ISCSI_ISER_MAX_CONN) 43 - #define ISER_MAX_CQ_LEN (ISER_MAX_RX_LEN + ISER_MAX_TX_LEN + \ 44 - ISCSI_ISER_MAX_CONN) 45 - 46 40 static void iser_qp_event_callback(struct ib_event *cause, void *context) 47 41 { 48 42 iser_err("qp event %s (%d)\n",
+13 -10
drivers/infiniband/ulp/srpt/ib_srpt.c
··· 549 549 */ 550 550 static int srpt_refresh_port(struct srpt_port *sport) 551 551 { 552 + struct ib_mad_agent *mad_agent; 552 553 struct ib_mad_reg_req reg_req; 553 554 struct ib_port_modify port_modify; 554 555 struct ib_port_attr port_attr; ··· 594 593 set_bit(IB_MGMT_METHOD_GET, reg_req.method_mask); 595 594 set_bit(IB_MGMT_METHOD_SET, reg_req.method_mask); 596 595 597 - sport->mad_agent = ib_register_mad_agent(sport->sdev->device, 598 - sport->port, 599 - IB_QPT_GSI, 600 - &reg_req, 0, 601 - srpt_mad_send_handler, 602 - srpt_mad_recv_handler, 603 - sport, 0); 604 - if (IS_ERR(sport->mad_agent)) { 596 + mad_agent = ib_register_mad_agent(sport->sdev->device, 597 + sport->port, 598 + IB_QPT_GSI, 599 + &reg_req, 0, 600 + srpt_mad_send_handler, 601 + srpt_mad_recv_handler, 602 + sport, 0); 603 + if (IS_ERR(mad_agent)) { 605 604 pr_err("%s-%d: MAD agent registration failed (%ld). Note: this is expected if SR-IOV is enabled.\n", 606 605 dev_name(&sport->sdev->device->dev), sport->port, 607 - PTR_ERR(sport->mad_agent)); 606 + PTR_ERR(mad_agent)); 608 607 sport->mad_agent = NULL; 609 608 memset(&port_modify, 0, sizeof(port_modify)); 610 609 port_modify.clr_port_cap_mask = IB_PORT_DEVICE_MGMT_SUP; 611 610 ib_modify_port(sport->sdev->device, sport->port, 0, 612 611 &port_modify); 613 - 612 + return 0; 614 613 } 614 + 615 + sport->mad_agent = mad_agent; 615 616 } 616 617 617 618 return 0;
+81
drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h
··· 10321 10321 u8 valid; 10322 10322 }; 10323 10323 10324 + /* dbc_dbc (size:64b/8B) */ 10325 + struct dbc_dbc { 10326 + u32 index; 10327 + #define DBC_DBC_INDEX_MASK 0xffffffUL 10328 + #define DBC_DBC_INDEX_SFT 0 10329 + #define DBC_DBC_EPOCH 0x1000000UL 10330 + #define DBC_DBC_TOGGLE_MASK 0x6000000UL 10331 + #define DBC_DBC_TOGGLE_SFT 25 10332 + u32 type_path_xid; 10333 + #define DBC_DBC_XID_MASK 0xfffffUL 10334 + #define DBC_DBC_XID_SFT 0 10335 + #define DBC_DBC_PATH_MASK 0x3000000UL 10336 + #define DBC_DBC_PATH_SFT 24 10337 + #define DBC_DBC_PATH_ROCE (0x0UL << 24) 10338 + #define DBC_DBC_PATH_L2 (0x1UL << 24) 10339 + #define DBC_DBC_PATH_ENGINE (0x2UL << 24) 10340 + #define DBC_DBC_PATH_LAST DBC_DBC_PATH_ENGINE 10341 + #define DBC_DBC_VALID 0x4000000UL 10342 + #define DBC_DBC_DEBUG_TRACE 0x8000000UL 10343 + #define DBC_DBC_TYPE_MASK 0xf0000000UL 10344 + #define DBC_DBC_TYPE_SFT 28 10345 + #define DBC_DBC_TYPE_SQ (0x0UL << 28) 10346 + #define DBC_DBC_TYPE_RQ (0x1UL << 28) 10347 + #define DBC_DBC_TYPE_SRQ (0x2UL << 28) 10348 + #define DBC_DBC_TYPE_SRQ_ARM (0x3UL << 28) 10349 + #define DBC_DBC_TYPE_CQ (0x4UL << 28) 10350 + #define DBC_DBC_TYPE_CQ_ARMSE (0x5UL << 28) 10351 + #define DBC_DBC_TYPE_CQ_ARMALL (0x6UL << 28) 10352 + #define DBC_DBC_TYPE_CQ_ARMENA (0x7UL << 28) 10353 + #define DBC_DBC_TYPE_SRQ_ARMENA (0x8UL << 28) 10354 + #define DBC_DBC_TYPE_CQ_CUTOFF_ACK (0x9UL << 28) 10355 + #define DBC_DBC_TYPE_NQ (0xaUL << 28) 10356 + #define DBC_DBC_TYPE_NQ_ARM (0xbUL << 28) 10357 + #define DBC_DBC_TYPE_NQ_MASK (0xeUL << 28) 10358 + #define DBC_DBC_TYPE_NULL (0xfUL << 28) 10359 + #define DBC_DBC_TYPE_LAST DBC_DBC_TYPE_NULL 10360 + }; 10361 + 10362 + /* db_push_start (size:64b/8B) */ 10363 + struct db_push_start { 10364 + u64 db; 10365 + #define DB_PUSH_START_DB_INDEX_MASK 0xffffffUL 10366 + #define DB_PUSH_START_DB_INDEX_SFT 0 10367 + #define DB_PUSH_START_DB_PI_LO_MASK 0xff000000UL 10368 + #define DB_PUSH_START_DB_PI_LO_SFT 24 10369 + #define DB_PUSH_START_DB_XID_MASK 0xfffff00000000ULL 10370 + #define DB_PUSH_START_DB_XID_SFT 32 10371 + #define DB_PUSH_START_DB_PI_HI_MASK 0xf0000000000000ULL 10372 + #define DB_PUSH_START_DB_PI_HI_SFT 52 10373 + #define DB_PUSH_START_DB_TYPE_MASK 0xf000000000000000ULL 10374 + #define DB_PUSH_START_DB_TYPE_SFT 60 10375 + #define DB_PUSH_START_DB_TYPE_PUSH_START (0xcULL << 60) 10376 + #define DB_PUSH_START_DB_TYPE_PUSH_END (0xdULL << 60) 10377 + #define DB_PUSH_START_DB_TYPE_LAST DB_PUSH_START_DB_TYPE_PUSH_END 10378 + }; 10379 + 10380 + /* db_push_end (size:64b/8B) */ 10381 + struct db_push_end { 10382 + u64 db; 10383 + #define DB_PUSH_END_DB_INDEX_MASK 0xffffffUL 10384 + #define DB_PUSH_END_DB_INDEX_SFT 0 10385 + #define DB_PUSH_END_DB_PI_LO_MASK 0xff000000UL 10386 + #define DB_PUSH_END_DB_PI_LO_SFT 24 10387 + #define DB_PUSH_END_DB_XID_MASK 0xfffff00000000ULL 10388 + #define DB_PUSH_END_DB_XID_SFT 32 10389 + #define DB_PUSH_END_DB_PI_HI_MASK 0xf0000000000000ULL 10390 + #define DB_PUSH_END_DB_PI_HI_SFT 52 10391 + #define DB_PUSH_END_DB_PATH_MASK 0x300000000000000ULL 10392 + #define DB_PUSH_END_DB_PATH_SFT 56 10393 + #define DB_PUSH_END_DB_PATH_ROCE (0x0ULL << 56) 10394 + #define DB_PUSH_END_DB_PATH_L2 (0x1ULL << 56) 10395 + #define DB_PUSH_END_DB_PATH_ENGINE (0x2ULL << 56) 10396 + #define DB_PUSH_END_DB_PATH_LAST DB_PUSH_END_DB_PATH_ENGINE 10397 + #define DB_PUSH_END_DB_DEBUG_TRACE 0x800000000000000ULL 10398 + #define DB_PUSH_END_DB_TYPE_MASK 0xf000000000000000ULL 10399 + #define DB_PUSH_END_DB_TYPE_SFT 60 10400 + #define DB_PUSH_END_DB_TYPE_PUSH_START (0xcULL << 60) 10401 + #define DB_PUSH_END_DB_TYPE_PUSH_END (0xdULL << 60) 10402 + #define DB_PUSH_END_DB_TYPE_LAST DB_PUSH_END_DB_TYPE_PUSH_END 10403 + }; 10404 + 10324 10405 /* db_push_info (size:64b/8B) */ 10325 10406 struct db_push_info { 10326 10407 u32 push_size_push_index;
+1 -2
drivers/net/ethernet/mellanox/mlx5/core/en/params.c
··· 930 930 static u8 rq_end_pad_mode(struct mlx5_core_dev *mdev, struct mlx5e_params *params) 931 931 { 932 932 bool lro_en = params->packet_merge.type == MLX5E_PACKET_MERGE_LRO; 933 - bool ro = pcie_relaxed_ordering_enabled(mdev->pdev) && 934 - MLX5_CAP_GEN(mdev, relaxed_ordering_write); 933 + bool ro = MLX5_CAP_GEN(mdev, relaxed_ordering_write); 935 934 936 935 return ro && lro_en ? 937 936 MLX5_WQ_END_PAD_MODE_NONE : MLX5_WQ_END_PAD_MODE_ALIGN;
+5 -4
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
··· 39 39 40 40 void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc) 41 41 { 42 - bool ro_pci_enable = pcie_relaxed_ordering_enabled(mdev->pdev); 43 42 bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write); 44 - bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read); 43 + bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read) || 44 + (pcie_relaxed_ordering_enabled(mdev->pdev) && 45 + MLX5_CAP_GEN(mdev, relaxed_ordering_read_pci_enabled)); 45 46 46 - MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_pci_enable && ro_read); 47 - MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_pci_enable && ro_write); 47 + MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_read); 48 + MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_write); 48 49 } 49 50 50 51 int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey)
+3
drivers/net/ethernet/mellanox/mlx5/core/main.c
··· 691 691 MLX5_ST_SZ_BYTES(roce_cap)); 692 692 MLX5_SET(roce_cap, set_hca_cap, sw_r_roce_src_udp_port, 1); 693 693 694 + if (MLX5_CAP_ROCE_MAX(dev, qp_ooo_transmit_default)) 695 + MLX5_SET(roce_cap, set_hca_cap, qp_ooo_transmit_default, 1); 696 + 694 697 err = set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ROCE); 695 698 return err; 696 699 }
+22 -9
include/linux/mlx5/mlx5_ifc.h
··· 1100 1100 u8 sw_r_roce_src_udp_port[0x1]; 1101 1101 u8 fl_rc_qp_when_roce_disabled[0x1]; 1102 1102 u8 fl_rc_qp_when_roce_enabled[0x1]; 1103 - u8 reserved_at_7[0x17]; 1103 + u8 reserved_at_7[0x1]; 1104 + u8 qp_ooo_transmit_default[0x1]; 1105 + u8 reserved_at_9[0x15]; 1104 1106 u8 qp_ts_format[0x2]; 1105 1107 1106 1108 u8 reserved_at_20[0x60]; ··· 1518 1516 u8 reserved_at_b0[0x1]; 1519 1517 u8 uplink_follow[0x1]; 1520 1518 u8 ts_cqe_to_dest_cqn[0x1]; 1521 - u8 reserved_at_b3[0x7]; 1519 + u8 reserved_at_b3[0x6]; 1520 + u8 go_back_n[0x1]; 1522 1521 u8 shampo[0x1]; 1523 1522 u8 reserved_at_bb[0x5]; 1524 1523 ··· 1534 1531 1535 1532 u8 log_max_eq_sz[0x8]; 1536 1533 u8 relaxed_ordering_write[0x1]; 1537 - u8 relaxed_ordering_read[0x1]; 1534 + u8 relaxed_ordering_read_pci_enabled[0x1]; 1538 1535 u8 log_max_mkey[0x6]; 1539 1536 u8 reserved_at_f0[0x6]; 1540 1537 u8 terminate_scatter_list_mkey[0x1]; ··· 1750 1747 1751 1748 u8 reserved_at_320[0x3]; 1752 1749 u8 log_max_transport_domain[0x5]; 1753 - u8 reserved_at_328[0x3]; 1750 + u8 reserved_at_328[0x2]; 1751 + u8 relaxed_ordering_read[0x1]; 1754 1752 u8 log_max_pd[0x5]; 1755 - u8 reserved_at_330[0xb]; 1753 + u8 reserved_at_330[0x9]; 1754 + u8 q_counter_aggregation[0x1]; 1755 + u8 q_counter_other_vport[0x1]; 1756 1756 u8 log_max_xrcd[0x5]; 1757 1757 1758 1758 u8 nic_receive_steering_discard[0x1]; ··· 3297 3291 u8 log_rq_stride[0x3]; 3298 3292 u8 no_sq[0x1]; 3299 3293 u8 log_sq_size[0x4]; 3300 - u8 reserved_at_55[0x3]; 3294 + u8 reserved_at_55[0x1]; 3295 + u8 retry_mode[0x2]; 3301 3296 u8 ts_format[0x2]; 3302 3297 u8 reserved_at_5a[0x1]; 3303 3298 u8 rlky[0x1]; ··· 5636 5629 u8 reserved_at_20[0x10]; 5637 5630 u8 op_mod[0x10]; 5638 5631 5639 - u8 reserved_at_40[0x80]; 5632 + u8 other_vport[0x1]; 5633 + u8 reserved_at_41[0xf]; 5634 + u8 vport_number[0x10]; 5635 + 5636 + u8 reserved_at_60[0x60]; 5640 5637 5641 5638 u8 clear[0x1]; 5642 - u8 reserved_at_c1[0x1f]; 5639 + u8 aggregate[0x1]; 5640 + u8 reserved_at_c2[0x1e]; 5643 5641 5644 5642 u8 reserved_at_e0[0x18]; 5645 5643 u8 counter_set_id[0x8]; ··· 9327 9315 u8 reserved_at_20[0x10]; 9328 9316 u8 op_mod[0x10]; 9329 9317 9330 - u8 reserved_at_40[0x38]; 9318 + u8 reserved_at_40[0x33]; 9319 + u8 flow_counter_bulk_log_size[0x5]; 9331 9320 u8 flow_counter_bulk[0x8]; 9332 9321 }; 9333 9322
+25
include/rdma/ib_verbs.h
··· 4036 4036 } 4037 4037 4038 4038 /** 4039 + * ib_virt_dma_to_ptr - Convert a dma_addr to a kernel pointer 4040 + * @dma_addr: The DMA address 4041 + * 4042 + * Used by ib_uses_virt_dma() devices to get back to the kernel pointer after 4043 + * going through the dma_addr marshalling. 4044 + */ 4045 + static inline void *ib_virt_dma_to_ptr(u64 dma_addr) 4046 + { 4047 + /* virt_dma mode maps the kvs's directly into the dma addr */ 4048 + return (void *)(uintptr_t)dma_addr; 4049 + } 4050 + 4051 + /** 4052 + * ib_virt_dma_to_page - Convert a dma_addr to a struct page 4053 + * @dma_addr: The DMA address 4054 + * 4055 + * Used by ib_uses_virt_dma() device to get back to the struct page after going 4056 + * through the dma_addr marshalling. 4057 + */ 4058 + static inline struct page *ib_virt_dma_to_page(u64 dma_addr) 4059 + { 4060 + return virt_to_page(ib_virt_dma_to_ptr(dma_addr)); 4061 + } 4062 + 4063 + /** 4039 4064 * ib_dma_mapping_error - check a DMA addr for error 4040 4065 * @dev: The device for which the dma_addr was created 4041 4066 * @dma_addr: The DMA address to check
+4
include/uapi/rdma/bnxt_re-abi.h
··· 96 96 __u32 rsvd; 97 97 }; 98 98 99 + struct bnxt_re_resize_cq_req { 100 + __aligned_u64 cq_va; 101 + }; 102 + 99 103 struct bnxt_re_qp_req { 100 104 __aligned_u64 qpsva; 101 105 __aligned_u64 qprva;
+3 -1
include/uapi/rdma/efa-abi.h
··· 1 1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */ 2 2 /* 3 - * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #ifndef EFA_ABI_USER_H ··· 120 120 EFA_QUERY_DEVICE_CAPS_RNR_RETRY = 1 << 1, 121 121 EFA_QUERY_DEVICE_CAPS_CQ_NOTIFICATIONS = 1 << 2, 122 122 EFA_QUERY_DEVICE_CAPS_CQ_WITH_SGID = 1 << 3, 123 + EFA_QUERY_DEVICE_CAPS_DATA_POLLING_128 = 1 << 4, 124 + EFA_QUERY_DEVICE_CAPS_RDMA_WRITE = 1 << 5, 123 125 }; 124 126 125 127 struct efa_ibv_ex_query_device_resp {