Loading MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -11068,6 +11068,7 @@ F: drivers/net/ethernet/qlogic/qede/ QLOGIC QL4xxx RDMA DRIVER M: Ram Amrani <Ram.Amrani@cavium.com> M: Michal Kalderon <Michal.Kalderon@cavium.com> M: Ariel Elior <Ariel.Elior@cavium.com> L: linux-rdma@vger.kernel.org S: Supported Loading drivers/infiniband/hw/qedr/Makefile +1 −1 Original line number Diff line number Diff line obj-$(CONFIG_INFINIBAND_QEDR) := qedr.o qedr-y := main.o verbs.o qedr_cm.o qedr-y := main.o verbs.o qedr_roce_cm.o qedr_iw_cm.o drivers/infiniband/hw/qedr/main.c +99 −6 Original line number Diff line number Diff line Loading @@ -33,16 +33,20 @@ #include <rdma/ib_verbs.h> #include <rdma/ib_addr.h> #include <rdma/ib_user_verbs.h> #include <rdma/iw_cm.h> #include <rdma/ib_mad.h> #include <linux/netdevice.h> #include <linux/iommu.h> #include <linux/pci.h> #include <net/addrconf.h> #include <linux/idr.h> #include <linux/qed/qed_chain.h> #include <linux/qed/qed_if.h> #include "qedr.h" #include "verbs.h" #include <rdma/qedr-abi.h> #include "qedr_iw_cm.h" MODULE_DESCRIPTION("QLogic 40G/100G ROCE Driver"); MODULE_AUTHOR("QLogic Corporation"); Loading Loading @@ -92,8 +96,84 @@ static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num) return qdev->ndev; } int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable) { struct ib_port_attr attr; int err; err = qedr_query_port(ibdev, port_num, &attr); if (err) return err; immutable->pkey_tbl_len = attr.pkey_tbl_len; immutable->gid_tbl_len = attr.gid_tbl_len; immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE | RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP; immutable->max_mad_size = IB_MGMT_MAD_SIZE; return 0; } int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable) { struct ib_port_attr attr; int err; err = qedr_query_port(ibdev, port_num, &attr); if (err) return err; immutable->pkey_tbl_len = 1; immutable->gid_tbl_len = 1; immutable->core_cap_flags = RDMA_CORE_PORT_IWARP; immutable->max_mad_size = 0; return 0; } int qedr_iw_register_device(struct qedr_dev *dev) { dev->ibdev.node_type = RDMA_NODE_RNIC; dev->ibdev.query_gid = qedr_iw_query_gid; dev->ibdev.get_port_immutable = qedr_iw_port_immutable; dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL); if (!dev->ibdev.iwcm) return -ENOMEM; dev->ibdev.iwcm->connect = qedr_iw_connect; dev->ibdev.iwcm->accept = qedr_iw_accept; dev->ibdev.iwcm->reject = qedr_iw_reject; dev->ibdev.iwcm->create_listen = qedr_iw_create_listen; dev->ibdev.iwcm->destroy_listen = qedr_iw_destroy_listen; dev->ibdev.iwcm->add_ref = qedr_iw_qp_add_ref; dev->ibdev.iwcm->rem_ref = qedr_iw_qp_rem_ref; dev->ibdev.iwcm->get_qp = qedr_iw_get_qp; memcpy(dev->ibdev.iwcm->ifname, dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname)); return 0; } void qedr_roce_register_device(struct qedr_dev *dev) { dev->ibdev.node_type = RDMA_NODE_IB_CA; dev->ibdev.query_gid = qedr_query_gid; dev->ibdev.add_gid = qedr_add_gid; dev->ibdev.del_gid = qedr_del_gid; dev->ibdev.get_port_immutable = qedr_roce_port_immutable; } static int qedr_register_device(struct qedr_dev *dev) { int rc; strlcpy(dev->ibdev.name, "qedr%d", IB_DEVICE_NAME_MAX); dev->ibdev.node_guid = dev->attr.node_guid; Loading Loading @@ -121,18 +201,21 @@ static int qedr_register_device(struct qedr_dev *dev) QEDR_UVERBS(POST_SEND) | QEDR_UVERBS(POST_RECV); if (IS_IWARP(dev)) { rc = qedr_iw_register_device(dev); if (rc) return rc; } else { qedr_roce_register_device(dev); } dev->ibdev.phys_port_cnt = 1; dev->ibdev.num_comp_vectors = dev->num_cnq; dev->ibdev.node_type = RDMA_NODE_IB_CA; dev->ibdev.query_device = qedr_query_device; dev->ibdev.query_port = qedr_query_port; dev->ibdev.modify_port = qedr_modify_port; dev->ibdev.query_gid = qedr_query_gid; dev->ibdev.add_gid = qedr_add_gid; dev->ibdev.del_gid = qedr_del_gid; dev->ibdev.alloc_ucontext = qedr_alloc_ucontext; dev->ibdev.dealloc_ucontext = qedr_dealloc_ucontext; dev->ibdev.mmap = qedr_mmap; Loading Loading @@ -166,7 +249,7 @@ static int qedr_register_device(struct qedr_dev *dev) dev->ibdev.post_recv = qedr_post_recv; dev->ibdev.process_mad = qedr_process_mad; dev->ibdev.get_port_immutable = qedr_port_immutable; dev->ibdev.get_netdev = qedr_get_netdev; dev->ibdev.dev.parent = &dev->pdev->dev; Loading Loading @@ -217,6 +300,9 @@ static void qedr_free_resources(struct qedr_dev *dev) { int i; if (IS_IWARP(dev)) destroy_workqueue(dev->iwarp_wq); for (i = 0; i < dev->num_cnq; i++) { qedr_free_mem_sb(dev, &dev->sb_array[i], dev->sb_start + i); dev->ops->common->chain_free(dev->cdev, &dev->cnq_array[i].pbl); Loading @@ -241,6 +327,12 @@ static int qedr_alloc_resources(struct qedr_dev *dev) spin_lock_init(&dev->sgid_lock); if (IS_IWARP(dev)) { spin_lock_init(&dev->idr_lock); idr_init(&dev->qpidr); dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq"); } /* Allocate Status blocks for CNQ */ dev->sb_array = kcalloc(dev->num_cnq, sizeof(*dev->sb_array), GFP_KERNEL); Loading Loading @@ -716,6 +808,7 @@ static int qedr_init_hw(struct qedr_dev *dev) in_params->events = &events; in_params->cq_mode = QED_RDMA_CQ_MODE_32_BITS; in_params->max_mtu = dev->ndev->mtu; dev->iwarp_max_mtu = dev->ndev->mtu; ether_addr_copy(&in_params->mac_addr[0], dev->ndev->dev_addr); rc = dev->ops->rdma_init(dev->cdev, in_params); Loading drivers/infiniband/hw/qedr/qedr.h +30 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #define __QEDR_H__ #include <linux/pci.h> #include <linux/idr.h> #include <rdma/ib_addr.h> #include <linux/qed/qed_if.h> #include <linux/qed/qed_chain.h> Loading @@ -43,6 +44,8 @@ #define QEDR_NODE_DESC "QLogic 579xx RoCE HCA" #define DP_NAME(dev) ((dev)->ibdev.name) #define IS_IWARP(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_IWARP) #define IS_ROCE(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_ROCE) #define DP_DEBUG(dev, module, fmt, ...) \ pr_debug("(%s) " module ": " fmt, \ Loading @@ -56,6 +59,7 @@ #define QEDR_MSG_SQ " SQ" #define QEDR_MSG_QP " QP" #define QEDR_MSG_GSI " GSI" #define QEDR_MSG_IWARP " IW" #define QEDR_CQ_MAGIC_NUMBER (0x11223344) Loading Loading @@ -160,6 +164,11 @@ struct qedr_dev { struct qedr_cq *gsi_sqcq; struct qedr_cq *gsi_rqcq; struct qedr_qp *gsi_qp; enum qed_rdma_type rdma_type; spinlock_t idr_lock; /* Protect qpidr data-structure */ struct idr qpidr; struct workqueue_struct *iwarp_wq; u16 iwarp_max_mtu; unsigned long enet_state; Loading Loading @@ -317,6 +326,9 @@ struct qedr_qp_hwq_info { /* DB */ void __iomem *db; union db_prod32 db_data; void __iomem *iwarp_db2; union db_prod32 iwarp_db2_data; }; #define QEDR_INC_SW_IDX(p_info, index) \ Loading @@ -337,7 +349,7 @@ enum qedr_qp_err_bitmap { struct qedr_qp { struct ib_qp ibqp; /* must be first */ struct qedr_dev *dev; struct qedr_iw_ep *ep; struct qedr_qp_hwq_info sq; struct qedr_qp_hwq_info rq; Loading Loading @@ -394,6 +406,8 @@ struct qedr_qp { /* Relevant to qps created from user space only (applications) */ struct qedr_userq usq; struct qedr_userq urq; atomic_t refcnt; bool destroyed; }; struct qedr_ah { Loading Loading @@ -474,6 +488,21 @@ static inline int qedr_get_dmac(struct qedr_dev *dev, return 0; } struct qedr_iw_listener { struct qedr_dev *dev; struct iw_cm_id *cm_id; int backlog; void *qed_handle; }; struct qedr_iw_ep { struct qedr_dev *dev; struct iw_cm_id *cm_id; struct qedr_qp *qp; void *qed_context; u8 during_connect; }; static inline struct qedr_ucontext *get_qedr_ucontext(struct ib_ucontext *ibucontext) { Loading drivers/infiniband/hw/qedr/qedr_hsi_rdma.h +4 −2 Original line number Diff line number Diff line Loading @@ -655,8 +655,10 @@ struct rdma_sq_rdma_wqe_1st { #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x3 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 6 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT 6 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 7 u8 wqe_size; u8 prev_wqe_size; }; Loading Loading
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -11068,6 +11068,7 @@ F: drivers/net/ethernet/qlogic/qede/ QLOGIC QL4xxx RDMA DRIVER M: Ram Amrani <Ram.Amrani@cavium.com> M: Michal Kalderon <Michal.Kalderon@cavium.com> M: Ariel Elior <Ariel.Elior@cavium.com> L: linux-rdma@vger.kernel.org S: Supported Loading
drivers/infiniband/hw/qedr/Makefile +1 −1 Original line number Diff line number Diff line obj-$(CONFIG_INFINIBAND_QEDR) := qedr.o qedr-y := main.o verbs.o qedr_cm.o qedr-y := main.o verbs.o qedr_roce_cm.o qedr_iw_cm.o
drivers/infiniband/hw/qedr/main.c +99 −6 Original line number Diff line number Diff line Loading @@ -33,16 +33,20 @@ #include <rdma/ib_verbs.h> #include <rdma/ib_addr.h> #include <rdma/ib_user_verbs.h> #include <rdma/iw_cm.h> #include <rdma/ib_mad.h> #include <linux/netdevice.h> #include <linux/iommu.h> #include <linux/pci.h> #include <net/addrconf.h> #include <linux/idr.h> #include <linux/qed/qed_chain.h> #include <linux/qed/qed_if.h> #include "qedr.h" #include "verbs.h" #include <rdma/qedr-abi.h> #include "qedr_iw_cm.h" MODULE_DESCRIPTION("QLogic 40G/100G ROCE Driver"); MODULE_AUTHOR("QLogic Corporation"); Loading Loading @@ -92,8 +96,84 @@ static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num) return qdev->ndev; } int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable) { struct ib_port_attr attr; int err; err = qedr_query_port(ibdev, port_num, &attr); if (err) return err; immutable->pkey_tbl_len = attr.pkey_tbl_len; immutable->gid_tbl_len = attr.gid_tbl_len; immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE | RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP; immutable->max_mad_size = IB_MGMT_MAD_SIZE; return 0; } int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable) { struct ib_port_attr attr; int err; err = qedr_query_port(ibdev, port_num, &attr); if (err) return err; immutable->pkey_tbl_len = 1; immutable->gid_tbl_len = 1; immutable->core_cap_flags = RDMA_CORE_PORT_IWARP; immutable->max_mad_size = 0; return 0; } int qedr_iw_register_device(struct qedr_dev *dev) { dev->ibdev.node_type = RDMA_NODE_RNIC; dev->ibdev.query_gid = qedr_iw_query_gid; dev->ibdev.get_port_immutable = qedr_iw_port_immutable; dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL); if (!dev->ibdev.iwcm) return -ENOMEM; dev->ibdev.iwcm->connect = qedr_iw_connect; dev->ibdev.iwcm->accept = qedr_iw_accept; dev->ibdev.iwcm->reject = qedr_iw_reject; dev->ibdev.iwcm->create_listen = qedr_iw_create_listen; dev->ibdev.iwcm->destroy_listen = qedr_iw_destroy_listen; dev->ibdev.iwcm->add_ref = qedr_iw_qp_add_ref; dev->ibdev.iwcm->rem_ref = qedr_iw_qp_rem_ref; dev->ibdev.iwcm->get_qp = qedr_iw_get_qp; memcpy(dev->ibdev.iwcm->ifname, dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname)); return 0; } void qedr_roce_register_device(struct qedr_dev *dev) { dev->ibdev.node_type = RDMA_NODE_IB_CA; dev->ibdev.query_gid = qedr_query_gid; dev->ibdev.add_gid = qedr_add_gid; dev->ibdev.del_gid = qedr_del_gid; dev->ibdev.get_port_immutable = qedr_roce_port_immutable; } static int qedr_register_device(struct qedr_dev *dev) { int rc; strlcpy(dev->ibdev.name, "qedr%d", IB_DEVICE_NAME_MAX); dev->ibdev.node_guid = dev->attr.node_guid; Loading Loading @@ -121,18 +201,21 @@ static int qedr_register_device(struct qedr_dev *dev) QEDR_UVERBS(POST_SEND) | QEDR_UVERBS(POST_RECV); if (IS_IWARP(dev)) { rc = qedr_iw_register_device(dev); if (rc) return rc; } else { qedr_roce_register_device(dev); } dev->ibdev.phys_port_cnt = 1; dev->ibdev.num_comp_vectors = dev->num_cnq; dev->ibdev.node_type = RDMA_NODE_IB_CA; dev->ibdev.query_device = qedr_query_device; dev->ibdev.query_port = qedr_query_port; dev->ibdev.modify_port = qedr_modify_port; dev->ibdev.query_gid = qedr_query_gid; dev->ibdev.add_gid = qedr_add_gid; dev->ibdev.del_gid = qedr_del_gid; dev->ibdev.alloc_ucontext = qedr_alloc_ucontext; dev->ibdev.dealloc_ucontext = qedr_dealloc_ucontext; dev->ibdev.mmap = qedr_mmap; Loading Loading @@ -166,7 +249,7 @@ static int qedr_register_device(struct qedr_dev *dev) dev->ibdev.post_recv = qedr_post_recv; dev->ibdev.process_mad = qedr_process_mad; dev->ibdev.get_port_immutable = qedr_port_immutable; dev->ibdev.get_netdev = qedr_get_netdev; dev->ibdev.dev.parent = &dev->pdev->dev; Loading Loading @@ -217,6 +300,9 @@ static void qedr_free_resources(struct qedr_dev *dev) { int i; if (IS_IWARP(dev)) destroy_workqueue(dev->iwarp_wq); for (i = 0; i < dev->num_cnq; i++) { qedr_free_mem_sb(dev, &dev->sb_array[i], dev->sb_start + i); dev->ops->common->chain_free(dev->cdev, &dev->cnq_array[i].pbl); Loading @@ -241,6 +327,12 @@ static int qedr_alloc_resources(struct qedr_dev *dev) spin_lock_init(&dev->sgid_lock); if (IS_IWARP(dev)) { spin_lock_init(&dev->idr_lock); idr_init(&dev->qpidr); dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq"); } /* Allocate Status blocks for CNQ */ dev->sb_array = kcalloc(dev->num_cnq, sizeof(*dev->sb_array), GFP_KERNEL); Loading Loading @@ -716,6 +808,7 @@ static int qedr_init_hw(struct qedr_dev *dev) in_params->events = &events; in_params->cq_mode = QED_RDMA_CQ_MODE_32_BITS; in_params->max_mtu = dev->ndev->mtu; dev->iwarp_max_mtu = dev->ndev->mtu; ether_addr_copy(&in_params->mac_addr[0], dev->ndev->dev_addr); rc = dev->ops->rdma_init(dev->cdev, in_params); Loading
drivers/infiniband/hw/qedr/qedr.h +30 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #define __QEDR_H__ #include <linux/pci.h> #include <linux/idr.h> #include <rdma/ib_addr.h> #include <linux/qed/qed_if.h> #include <linux/qed/qed_chain.h> Loading @@ -43,6 +44,8 @@ #define QEDR_NODE_DESC "QLogic 579xx RoCE HCA" #define DP_NAME(dev) ((dev)->ibdev.name) #define IS_IWARP(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_IWARP) #define IS_ROCE(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_ROCE) #define DP_DEBUG(dev, module, fmt, ...) \ pr_debug("(%s) " module ": " fmt, \ Loading @@ -56,6 +59,7 @@ #define QEDR_MSG_SQ " SQ" #define QEDR_MSG_QP " QP" #define QEDR_MSG_GSI " GSI" #define QEDR_MSG_IWARP " IW" #define QEDR_CQ_MAGIC_NUMBER (0x11223344) Loading Loading @@ -160,6 +164,11 @@ struct qedr_dev { struct qedr_cq *gsi_sqcq; struct qedr_cq *gsi_rqcq; struct qedr_qp *gsi_qp; enum qed_rdma_type rdma_type; spinlock_t idr_lock; /* Protect qpidr data-structure */ struct idr qpidr; struct workqueue_struct *iwarp_wq; u16 iwarp_max_mtu; unsigned long enet_state; Loading Loading @@ -317,6 +326,9 @@ struct qedr_qp_hwq_info { /* DB */ void __iomem *db; union db_prod32 db_data; void __iomem *iwarp_db2; union db_prod32 iwarp_db2_data; }; #define QEDR_INC_SW_IDX(p_info, index) \ Loading @@ -337,7 +349,7 @@ enum qedr_qp_err_bitmap { struct qedr_qp { struct ib_qp ibqp; /* must be first */ struct qedr_dev *dev; struct qedr_iw_ep *ep; struct qedr_qp_hwq_info sq; struct qedr_qp_hwq_info rq; Loading Loading @@ -394,6 +406,8 @@ struct qedr_qp { /* Relevant to qps created from user space only (applications) */ struct qedr_userq usq; struct qedr_userq urq; atomic_t refcnt; bool destroyed; }; struct qedr_ah { Loading Loading @@ -474,6 +488,21 @@ static inline int qedr_get_dmac(struct qedr_dev *dev, return 0; } struct qedr_iw_listener { struct qedr_dev *dev; struct iw_cm_id *cm_id; int backlog; void *qed_handle; }; struct qedr_iw_ep { struct qedr_dev *dev; struct iw_cm_id *cm_id; struct qedr_qp *qp; void *qed_context; u8 during_connect; }; static inline struct qedr_ucontext *get_qedr_ucontext(struct ib_ucontext *ibucontext) { Loading
drivers/infiniband/hw/qedr/qedr_hsi_rdma.h +4 −2 Original line number Diff line number Diff line Loading @@ -655,8 +655,10 @@ struct rdma_sq_rdma_wqe_1st { #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x3 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 6 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT 6 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x1 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 7 u8 wqe_size; u8 prev_wqe_size; }; Loading