You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
RDMA/bnxt_re: Add bnxt_re RoCE driver
This patch introduces the RoCE driver for the Broadcom NetXtreme-E 10/25/40/50G RoCE HCAs. The RoCE driver is a two part driver that relies on the parent bnxt_en NIC driver to operate. The changes needed in the bnxt_en driver have already been incorporated via Dave Miller's net tree into the mainline kernel. The vendor official git repository for this driver is available on github as: https://github.com/Broadcom/linux-rdma-nxt/ Signed-off-by: Eddie Wai <eddie.wai@broadcom.com> Signed-off-by: Devesh Sharma <devesh.sharma@broadcom.com> Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com> Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com> Reviewed-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
committed by
Doug Ledford
parent
24dc831b77
commit
1ac5a40479
146
drivers/infiniband/hw/bnxt_re/bnxt_re.h
Normal file
146
drivers/infiniband/hw/bnxt_re/bnxt_re.h
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: Slow Path Operators (header)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_RE_H__
|
||||
#define __BNXT_RE_H__
|
||||
#define ROCE_DRV_MODULE_NAME "bnxt_re"
|
||||
#define ROCE_DRV_MODULE_VERSION "1.0.0"
|
||||
|
||||
#define BNXT_RE_DESC "Broadcom NetXtreme-C/E RoCE Driver"
|
||||
|
||||
#define BNXT_RE_PAGE_SIZE_4K BIT(12)
|
||||
#define BNXT_RE_PAGE_SIZE_8K BIT(13)
|
||||
#define BNXT_RE_PAGE_SIZE_64K BIT(16)
|
||||
#define BNXT_RE_PAGE_SIZE_2M BIT(21)
|
||||
#define BNXT_RE_PAGE_SIZE_8M BIT(23)
|
||||
#define BNXT_RE_PAGE_SIZE_1G BIT(30)
|
||||
|
||||
#define BNXT_RE_MAX_QPC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_SRQC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_CQ_COUNT (64 * 1024)
|
||||
|
||||
struct bnxt_re_work {
|
||||
struct work_struct work;
|
||||
unsigned long event;
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct net_device *vlan_dev;
|
||||
};
|
||||
|
||||
struct bnxt_re_sqp_entries {
|
||||
struct bnxt_qplib_sge sge;
|
||||
u64 wrid;
|
||||
/* For storing the actual qp1 cqe */
|
||||
struct bnxt_qplib_cqe cqe;
|
||||
struct bnxt_re_qp *qp1_qp;
|
||||
};
|
||||
|
||||
#define BNXT_RE_MIN_MSIX 2
|
||||
#define BNXT_RE_MAX_MSIX 16
|
||||
#define BNXT_RE_AEQ_IDX 0
|
||||
#define BNXT_RE_NQ_IDX 1
|
||||
|
||||
struct bnxt_re_dev {
|
||||
struct ib_device ibdev;
|
||||
struct list_head list;
|
||||
unsigned long flags;
|
||||
#define BNXT_RE_FLAG_NETDEV_REGISTERED 0
|
||||
#define BNXT_RE_FLAG_IBDEV_REGISTERED 1
|
||||
#define BNXT_RE_FLAG_GOT_MSIX 2
|
||||
#define BNXT_RE_FLAG_RCFW_CHANNEL_EN 8
|
||||
#define BNXT_RE_FLAG_QOS_WORK_REG 16
|
||||
struct net_device *netdev;
|
||||
unsigned int version, major, minor;
|
||||
struct bnxt_en_dev *en_dev;
|
||||
struct bnxt_msix_entry msix_entries[BNXT_RE_MAX_MSIX];
|
||||
int num_msix;
|
||||
|
||||
int id;
|
||||
|
||||
struct delayed_work worker;
|
||||
u8 cur_prio_map;
|
||||
|
||||
/* FP Notification Queue (CQ & SRQ) */
|
||||
struct tasklet_struct nq_task;
|
||||
|
||||
/* RCFW Channel */
|
||||
struct bnxt_qplib_rcfw rcfw;
|
||||
|
||||
/* NQ */
|
||||
struct bnxt_qplib_nq nq;
|
||||
|
||||
/* Device Resources */
|
||||
struct bnxt_qplib_dev_attr dev_attr;
|
||||
struct bnxt_qplib_ctx qplib_ctx;
|
||||
struct bnxt_qplib_res qplib_res;
|
||||
struct bnxt_qplib_dpi dpi_privileged;
|
||||
|
||||
atomic_t qp_count;
|
||||
struct mutex qp_lock; /* protect qp list */
|
||||
struct list_head qp_list;
|
||||
|
||||
atomic_t cq_count;
|
||||
atomic_t srq_count;
|
||||
atomic_t mr_count;
|
||||
atomic_t mw_count;
|
||||
/* Max of 2 lossless traffic class supported per port */
|
||||
u16 cosq[2];
|
||||
|
||||
/* QP for for handling QP1 packets */
|
||||
u32 sqp_id;
|
||||
struct bnxt_re_qp *qp1_sqp;
|
||||
struct bnxt_re_ah *sqp_ah;
|
||||
struct bnxt_re_sqp_entries sqp_tbl[1024];
|
||||
};
|
||||
|
||||
#define to_bnxt_re_dev(ptr, member) \
|
||||
container_of((ptr), struct bnxt_re_dev, member)
|
||||
|
||||
#define BNXT_RE_ROCE_V1_PACKET 0
|
||||
#define BNXT_RE_ROCEV2_IPV4_PACKET 2
|
||||
#define BNXT_RE_ROCEV2_IPV6_PACKET 3
|
||||
|
||||
static inline struct device *rdev_to_dev(struct bnxt_re_dev *rdev)
|
||||
{
|
||||
if (rdev)
|
||||
return &rdev->ibdev.dev;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
3202
drivers/infiniband/hw/bnxt_re/ib_verbs.c
Normal file
3202
drivers/infiniband/hw/bnxt_re/ib_verbs.c
Normal file
File diff suppressed because it is too large
Load Diff
197
drivers/infiniband/hw/bnxt_re/ib_verbs.h
Normal file
197
drivers/infiniband/hw/bnxt_re/ib_verbs.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: IB Verbs interpreter (header)
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_RE_IB_VERBS_H__
|
||||
#define __BNXT_RE_IB_VERBS_H__
|
||||
|
||||
struct bnxt_re_gid_ctx {
|
||||
u32 idx;
|
||||
u32 refcnt;
|
||||
};
|
||||
|
||||
struct bnxt_re_pd {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_pd ib_pd;
|
||||
struct bnxt_qplib_pd qplib_pd;
|
||||
struct bnxt_qplib_dpi dpi;
|
||||
};
|
||||
|
||||
struct bnxt_re_ah {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_ah ib_ah;
|
||||
struct bnxt_qplib_ah qplib_ah;
|
||||
};
|
||||
|
||||
struct bnxt_re_qp {
|
||||
struct list_head list;
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_qp ib_qp;
|
||||
spinlock_t sq_lock; /* protect sq */
|
||||
struct bnxt_qplib_qp qplib_qp;
|
||||
struct ib_umem *sumem;
|
||||
struct ib_umem *rumem;
|
||||
/* QP1 */
|
||||
u32 send_psn;
|
||||
struct ib_ud_header qp1_hdr;
|
||||
};
|
||||
|
||||
struct bnxt_re_cq {
|
||||
struct bnxt_re_dev *rdev;
|
||||
spinlock_t cq_lock; /* protect cq */
|
||||
u16 cq_count;
|
||||
u16 cq_period;
|
||||
struct ib_cq ib_cq;
|
||||
struct bnxt_qplib_cq qplib_cq;
|
||||
struct bnxt_qplib_cqe *cql;
|
||||
#define MAX_CQL_PER_POLL 1024
|
||||
u32 max_cql;
|
||||
struct ib_umem *umem;
|
||||
};
|
||||
|
||||
struct bnxt_re_mr {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_mr ib_mr;
|
||||
struct ib_umem *ib_umem;
|
||||
struct bnxt_qplib_mrw qplib_mr;
|
||||
u32 npages;
|
||||
u64 *pages;
|
||||
struct bnxt_qplib_frpl qplib_frpl;
|
||||
};
|
||||
|
||||
struct bnxt_re_frpl {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct bnxt_qplib_frpl qplib_frpl;
|
||||
u64 *page_list;
|
||||
};
|
||||
|
||||
struct bnxt_re_fmr {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_fmr ib_fmr;
|
||||
struct bnxt_qplib_mrw qplib_fmr;
|
||||
};
|
||||
|
||||
struct bnxt_re_mw {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_mw ib_mw;
|
||||
struct bnxt_qplib_mrw qplib_mw;
|
||||
};
|
||||
|
||||
struct bnxt_re_ucontext {
|
||||
struct bnxt_re_dev *rdev;
|
||||
struct ib_ucontext ib_uctx;
|
||||
struct bnxt_qplib_dpi *dpi;
|
||||
void *shpg;
|
||||
spinlock_t sh_lock; /* protect shpg */
|
||||
};
|
||||
|
||||
struct net_device *bnxt_re_get_netdev(struct ib_device *ibdev, u8 port_num);
|
||||
|
||||
int bnxt_re_query_device(struct ib_device *ibdev,
|
||||
struct ib_device_attr *ib_attr,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_modify_device(struct ib_device *ibdev,
|
||||
int device_modify_mask,
|
||||
struct ib_device_modify *device_modify);
|
||||
int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
|
||||
struct ib_port_attr *port_attr);
|
||||
int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num,
|
||||
int port_modify_mask,
|
||||
struct ib_port_modify *port_modify);
|
||||
int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
|
||||
struct ib_port_immutable *immutable);
|
||||
int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
|
||||
u16 index, u16 *pkey);
|
||||
int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
|
||||
unsigned int index, void **context);
|
||||
int bnxt_re_add_gid(struct ib_device *ibdev, u8 port_num,
|
||||
unsigned int index, const union ib_gid *gid,
|
||||
const struct ib_gid_attr *attr, void **context);
|
||||
int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
|
||||
int index, union ib_gid *gid);
|
||||
enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
|
||||
u8 port_num);
|
||||
struct ib_pd *bnxt_re_alloc_pd(struct ib_device *ibdev,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_dealloc_pd(struct ib_pd *pd);
|
||||
struct ib_ah *bnxt_re_create_ah(struct ib_pd *pd,
|
||||
struct ib_ah_attr *ah_attr,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
|
||||
int bnxt_re_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
|
||||
int bnxt_re_destroy_ah(struct ib_ah *ah);
|
||||
struct ib_qp *bnxt_re_create_qp(struct ib_pd *pd,
|
||||
struct ib_qp_init_attr *qp_init_attr,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_modify_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
|
||||
int qp_attr_mask, struct ib_udata *udata);
|
||||
int bnxt_re_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
|
||||
int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
|
||||
int bnxt_re_destroy_qp(struct ib_qp *qp);
|
||||
int bnxt_re_post_send(struct ib_qp *qp, struct ib_send_wr *send_wr,
|
||||
struct ib_send_wr **bad_send_wr);
|
||||
int bnxt_re_post_recv(struct ib_qp *qp, struct ib_recv_wr *recv_wr,
|
||||
struct ib_recv_wr **bad_recv_wr);
|
||||
struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
|
||||
const struct ib_cq_init_attr *attr,
|
||||
struct ib_ucontext *context,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_destroy_cq(struct ib_cq *cq);
|
||||
int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc);
|
||||
int bnxt_re_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
|
||||
struct ib_mr *bnxt_re_get_dma_mr(struct ib_pd *pd, int mr_access_flags);
|
||||
|
||||
int bnxt_re_map_mr_sg(struct ib_mr *ib_mr, struct scatterlist *sg, int sg_nents,
|
||||
unsigned int *sg_offset);
|
||||
struct ib_mr *bnxt_re_alloc_mr(struct ib_pd *ib_pd, enum ib_mr_type mr_type,
|
||||
u32 max_num_sg);
|
||||
int bnxt_re_dereg_mr(struct ib_mr *mr);
|
||||
struct ib_fmr *bnxt_re_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
|
||||
struct ib_fmr_attr *fmr_attr);
|
||||
int bnxt_re_map_phys_fmr(struct ib_fmr *fmr, u64 *page_list, int list_len,
|
||||
u64 iova);
|
||||
int bnxt_re_unmap_fmr(struct list_head *fmr_list);
|
||||
int bnxt_re_dealloc_fmr(struct ib_fmr *fmr);
|
||||
struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
|
||||
u64 virt_addr, int mr_access_flags,
|
||||
struct ib_udata *udata);
|
||||
struct ib_ucontext *bnxt_re_alloc_ucontext(struct ib_device *ibdev,
|
||||
struct ib_udata *udata);
|
||||
int bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
|
||||
int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
|
||||
#endif /* __BNXT_RE_IB_VERBS_H__ */
|
||||
1315
drivers/infiniband/hw/bnxt_re/main.c
Normal file
1315
drivers/infiniband/hw/bnxt_re/main.c
Normal file
File diff suppressed because it is too large
Load Diff
2167
drivers/infiniband/hw/bnxt_re/qplib_fp.c
Normal file
2167
drivers/infiniband/hw/bnxt_re/qplib_fp.c
Normal file
File diff suppressed because it is too large
Load Diff
439
drivers/infiniband/hw/bnxt_re/qplib_fp.h
Normal file
439
drivers/infiniband/hw/bnxt_re/qplib_fp.h
Normal file
@@ -0,0 +1,439 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: Fast Path Operators (header)
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_QPLIB_FP_H__
|
||||
#define __BNXT_QPLIB_FP_H__
|
||||
|
||||
struct bnxt_qplib_sge {
|
||||
u64 addr;
|
||||
u32 lkey;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_MAX_SQE_ENTRY_SIZE sizeof(struct sq_send)
|
||||
|
||||
#define SQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_MAX_SQE_ENTRY_SIZE)
|
||||
#define SQE_MAX_IDX_PER_PG (SQE_CNT_PER_PG - 1)
|
||||
|
||||
static inline u32 get_sqe_pg(u32 val)
|
||||
{
|
||||
return ((val & ~SQE_MAX_IDX_PER_PG) / SQE_CNT_PER_PG);
|
||||
}
|
||||
|
||||
static inline u32 get_sqe_idx(u32 val)
|
||||
{
|
||||
return (val & SQE_MAX_IDX_PER_PG);
|
||||
}
|
||||
|
||||
#define BNXT_QPLIB_MAX_PSNE_ENTRY_SIZE sizeof(struct sq_psn_search)
|
||||
|
||||
#define PSNE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_MAX_PSNE_ENTRY_SIZE)
|
||||
#define PSNE_MAX_IDX_PER_PG (PSNE_CNT_PER_PG - 1)
|
||||
|
||||
static inline u32 get_psne_pg(u32 val)
|
||||
{
|
||||
return ((val & ~PSNE_MAX_IDX_PER_PG) / PSNE_CNT_PER_PG);
|
||||
}
|
||||
|
||||
static inline u32 get_psne_idx(u32 val)
|
||||
{
|
||||
return (val & PSNE_MAX_IDX_PER_PG);
|
||||
}
|
||||
|
||||
#define BNXT_QPLIB_QP_MAX_SGL 6
|
||||
|
||||
struct bnxt_qplib_swq {
|
||||
u64 wr_id;
|
||||
u8 type;
|
||||
u8 flags;
|
||||
u32 start_psn;
|
||||
u32 next_psn;
|
||||
struct sq_psn_search *psn_search;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_swqe {
|
||||
/* General */
|
||||
u64 wr_id;
|
||||
u8 reqs_type;
|
||||
u8 type;
|
||||
#define BNXT_QPLIB_SWQE_TYPE_SEND 0
|
||||
#define BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM 1
|
||||
#define BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV 2
|
||||
#define BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE 4
|
||||
#define BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM 5
|
||||
#define BNXT_QPLIB_SWQE_TYPE_RDMA_READ 6
|
||||
#define BNXT_QPLIB_SWQE_TYPE_ATOMIC_CMP_AND_SWP 8
|
||||
#define BNXT_QPLIB_SWQE_TYPE_ATOMIC_FETCH_AND_ADD 11
|
||||
#define BNXT_QPLIB_SWQE_TYPE_LOCAL_INV 12
|
||||
#define BNXT_QPLIB_SWQE_TYPE_FAST_REG_MR 13
|
||||
#define BNXT_QPLIB_SWQE_TYPE_REG_MR 13
|
||||
#define BNXT_QPLIB_SWQE_TYPE_BIND_MW 14
|
||||
#define BNXT_QPLIB_SWQE_TYPE_RECV 128
|
||||
#define BNXT_QPLIB_SWQE_TYPE_RECV_RDMA_IMM 129
|
||||
u8 flags;
|
||||
#define BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP BIT(0)
|
||||
#define BNXT_QPLIB_SWQE_FLAGS_RD_ATOMIC_FENCE BIT(1)
|
||||
#define BNXT_QPLIB_SWQE_FLAGS_UC_FENCE BIT(2)
|
||||
#define BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT BIT(3)
|
||||
#define BNXT_QPLIB_SWQE_FLAGS_INLINE BIT(4)
|
||||
struct bnxt_qplib_sge sg_list[BNXT_QPLIB_QP_MAX_SGL];
|
||||
int num_sge;
|
||||
/* Max inline data is 96 bytes */
|
||||
u32 inline_len;
|
||||
#define BNXT_QPLIB_SWQE_MAX_INLINE_LENGTH 96
|
||||
u8 inline_data[BNXT_QPLIB_SWQE_MAX_INLINE_LENGTH];
|
||||
|
||||
union {
|
||||
/* Send, with imm, inval key */
|
||||
struct {
|
||||
union {
|
||||
__be32 imm_data;
|
||||
u32 inv_key;
|
||||
};
|
||||
u32 q_key;
|
||||
u32 dst_qp;
|
||||
u16 avid;
|
||||
} send;
|
||||
|
||||
/* Send Raw Ethernet and QP1 */
|
||||
struct {
|
||||
u16 lflags;
|
||||
u16 cfa_action;
|
||||
u32 cfa_meta;
|
||||
} rawqp1;
|
||||
|
||||
/* RDMA write, with imm, read */
|
||||
struct {
|
||||
union {
|
||||
__be32 imm_data;
|
||||
u32 inv_key;
|
||||
};
|
||||
u64 remote_va;
|
||||
u32 r_key;
|
||||
} rdma;
|
||||
|
||||
/* Atomic cmp/swap, fetch/add */
|
||||
struct {
|
||||
u64 remote_va;
|
||||
u32 r_key;
|
||||
u64 swap_data;
|
||||
u64 cmp_data;
|
||||
} atomic;
|
||||
|
||||
/* Local Invalidate */
|
||||
struct {
|
||||
u32 inv_l_key;
|
||||
} local_inv;
|
||||
|
||||
/* FR-PMR */
|
||||
struct {
|
||||
u8 access_cntl;
|
||||
u8 pg_sz_log;
|
||||
bool zero_based;
|
||||
u32 l_key;
|
||||
u32 length;
|
||||
u8 pbl_pg_sz_log;
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_4K 0
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_8K 1
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_64K 4
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_256K 6
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_1M 8
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_2M 9
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_4M 10
|
||||
#define BNXT_QPLIB_SWQE_PAGE_SIZE_1G 18
|
||||
u8 levels;
|
||||
#define PAGE_SHIFT_4K 12
|
||||
__le64 *pbl_ptr;
|
||||
dma_addr_t pbl_dma_ptr;
|
||||
u64 *page_list;
|
||||
u16 page_list_len;
|
||||
u64 va;
|
||||
} frmr;
|
||||
|
||||
/* Bind */
|
||||
struct {
|
||||
u8 access_cntl;
|
||||
#define BNXT_QPLIB_BIND_SWQE_ACCESS_LOCAL_WRITE BIT(0)
|
||||
#define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_READ BIT(1)
|
||||
#define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_WRITE BIT(2)
|
||||
#define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_ATOMIC BIT(3)
|
||||
#define BNXT_QPLIB_BIND_SWQE_ACCESS_WINDOW_BIND BIT(4)
|
||||
bool zero_based;
|
||||
u8 mw_type;
|
||||
u32 parent_l_key;
|
||||
u32 r_key;
|
||||
u64 va;
|
||||
u32 length;
|
||||
} bind;
|
||||
};
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_MAX_RQE_ENTRY_SIZE sizeof(struct rq_wqe)
|
||||
|
||||
#define RQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_MAX_RQE_ENTRY_SIZE)
|
||||
#define RQE_MAX_IDX_PER_PG (RQE_CNT_PER_PG - 1)
|
||||
#define RQE_PG(x) (((x) & ~RQE_MAX_IDX_PER_PG) / RQE_CNT_PER_PG)
|
||||
#define RQE_IDX(x) ((x) & RQE_MAX_IDX_PER_PG)
|
||||
|
||||
struct bnxt_qplib_q {
|
||||
struct bnxt_qplib_hwq hwq;
|
||||
struct bnxt_qplib_swq *swq;
|
||||
struct scatterlist *sglist;
|
||||
u32 nmap;
|
||||
u32 max_wqe;
|
||||
u16 max_sge;
|
||||
u32 psn;
|
||||
bool flush_in_progress;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_qp {
|
||||
struct bnxt_qplib_pd *pd;
|
||||
struct bnxt_qplib_dpi *dpi;
|
||||
u64 qp_handle;
|
||||
u32 id;
|
||||
u8 type;
|
||||
u8 sig_type;
|
||||
u32 modify_flags;
|
||||
u8 state;
|
||||
u8 cur_qp_state;
|
||||
u32 max_inline_data;
|
||||
u32 mtu;
|
||||
u8 path_mtu;
|
||||
bool en_sqd_async_notify;
|
||||
u16 pkey_index;
|
||||
u32 qkey;
|
||||
u32 dest_qp_id;
|
||||
u8 access;
|
||||
u8 timeout;
|
||||
u8 retry_cnt;
|
||||
u8 rnr_retry;
|
||||
u32 min_rnr_timer;
|
||||
u32 max_rd_atomic;
|
||||
u32 max_dest_rd_atomic;
|
||||
u32 dest_qpn;
|
||||
u8 smac[6];
|
||||
u16 vlan_id;
|
||||
u8 nw_type;
|
||||
struct bnxt_qplib_ah ah;
|
||||
|
||||
#define BTH_PSN_MASK ((1 << 24) - 1)
|
||||
/* SQ */
|
||||
struct bnxt_qplib_q sq;
|
||||
/* RQ */
|
||||
struct bnxt_qplib_q rq;
|
||||
/* SRQ */
|
||||
struct bnxt_qplib_srq *srq;
|
||||
/* CQ */
|
||||
struct bnxt_qplib_cq *scq;
|
||||
struct bnxt_qplib_cq *rcq;
|
||||
/* IRRQ and ORRQ */
|
||||
struct bnxt_qplib_hwq irrq;
|
||||
struct bnxt_qplib_hwq orrq;
|
||||
/* Header buffer for QP1 */
|
||||
int sq_hdr_buf_size;
|
||||
int rq_hdr_buf_size;
|
||||
/*
|
||||
* Buffer space for ETH(14), IP or GRH(40), UDP header(8)
|
||||
* and ib_bth + ib_deth (20).
|
||||
* Max required is 82 when RoCE V2 is enabled
|
||||
*/
|
||||
#define BNXT_QPLIB_MAX_QP1_SQ_HDR_SIZE_V2 86
|
||||
/* Ethernet header = 14 */
|
||||
/* ib_grh = 40 (provided by MAD) */
|
||||
/* ib_bth + ib_deth = 20 */
|
||||
/* MAD = 256 (provided by MAD) */
|
||||
/* iCRC = 4 */
|
||||
#define BNXT_QPLIB_MAX_QP1_RQ_ETH_HDR_SIZE 14
|
||||
#define BNXT_QPLIB_MAX_QP1_RQ_HDR_SIZE_V2 512
|
||||
#define BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV4 20
|
||||
#define BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV6 40
|
||||
#define BNXT_QPLIB_MAX_QP1_RQ_BDETH_HDR_SIZE 20
|
||||
void *sq_hdr_buf;
|
||||
dma_addr_t sq_hdr_buf_map;
|
||||
void *rq_hdr_buf;
|
||||
dma_addr_t rq_hdr_buf_map;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE sizeof(struct cq_base)
|
||||
|
||||
#define CQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_MAX_CQE_ENTRY_SIZE)
|
||||
#define CQE_MAX_IDX_PER_PG (CQE_CNT_PER_PG - 1)
|
||||
#define CQE_PG(x) (((x) & ~CQE_MAX_IDX_PER_PG) / CQE_CNT_PER_PG)
|
||||
#define CQE_IDX(x) ((x) & CQE_MAX_IDX_PER_PG)
|
||||
|
||||
#define ROCE_CQE_CMP_V 0
|
||||
#define CQE_CMP_VALID(hdr, raw_cons, cp_bit) \
|
||||
(!!((hdr)->cqe_type_toggle & CQ_BASE_TOGGLE) == \
|
||||
!((raw_cons) & (cp_bit)))
|
||||
|
||||
struct bnxt_qplib_cqe {
|
||||
u8 status;
|
||||
u8 type;
|
||||
u8 opcode;
|
||||
u32 length;
|
||||
u64 wr_id;
|
||||
union {
|
||||
__be32 immdata;
|
||||
u32 invrkey;
|
||||
};
|
||||
u64 qp_handle;
|
||||
u64 mr_handle;
|
||||
u16 flags;
|
||||
u8 smac[6];
|
||||
u32 src_qp;
|
||||
u16 raweth_qp1_flags;
|
||||
u16 raweth_qp1_errors;
|
||||
u16 raweth_qp1_cfa_code;
|
||||
u32 raweth_qp1_flags2;
|
||||
u32 raweth_qp1_metadata;
|
||||
u8 raweth_qp1_payload_offset;
|
||||
u16 pkey_index;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_QUEUE_START_PERIOD 0x01
|
||||
struct bnxt_qplib_cq {
|
||||
struct bnxt_qplib_dpi *dpi;
|
||||
void __iomem *dbr_base;
|
||||
u32 max_wqe;
|
||||
u32 id;
|
||||
u16 count;
|
||||
u16 period;
|
||||
struct bnxt_qplib_hwq hwq;
|
||||
u32 cnq_hw_ring_id;
|
||||
bool resize_in_progress;
|
||||
struct scatterlist *sghead;
|
||||
u32 nmap;
|
||||
u64 cq_handle;
|
||||
|
||||
#define CQ_RESIZE_WAIT_TIME_MS 500
|
||||
unsigned long flags;
|
||||
#define CQ_FLAGS_RESIZE_IN_PROG 1
|
||||
wait_queue_head_t waitq;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_MAX_IRRQE_ENTRY_SIZE sizeof(struct xrrq_irrq)
|
||||
#define BNXT_QPLIB_MAX_ORRQE_ENTRY_SIZE sizeof(struct xrrq_orrq)
|
||||
#define IRD_LIMIT_TO_IRRQ_SLOTS(x) (2 * (x) + 2)
|
||||
#define IRRQ_SLOTS_TO_IRD_LIMIT(s) (((s) >> 1) - 1)
|
||||
#define ORD_LIMIT_TO_ORRQ_SLOTS(x) ((x) + 1)
|
||||
#define ORRQ_SLOTS_TO_ORD_LIMIT(s) ((s) - 1)
|
||||
|
||||
#define BNXT_QPLIB_MAX_NQE_ENTRY_SIZE sizeof(struct nq_base)
|
||||
|
||||
#define NQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_MAX_NQE_ENTRY_SIZE)
|
||||
#define NQE_MAX_IDX_PER_PG (NQE_CNT_PER_PG - 1)
|
||||
#define NQE_PG(x) (((x) & ~NQE_MAX_IDX_PER_PG) / NQE_CNT_PER_PG)
|
||||
#define NQE_IDX(x) ((x) & NQE_MAX_IDX_PER_PG)
|
||||
|
||||
#define NQE_CMP_VALID(hdr, raw_cons, cp_bit) \
|
||||
(!!(le32_to_cpu((hdr)->info63_v[0]) & NQ_BASE_V) == \
|
||||
!((raw_cons) & (cp_bit)))
|
||||
|
||||
#define BNXT_QPLIB_NQE_MAX_CNT (128 * 1024)
|
||||
|
||||
#define NQ_CONS_PCI_BAR_REGION 2
|
||||
#define NQ_DB_KEY_CP (0x2 << CMPL_DOORBELL_KEY_SFT)
|
||||
#define NQ_DB_IDX_VALID CMPL_DOORBELL_IDX_VALID
|
||||
#define NQ_DB_IRQ_DIS CMPL_DOORBELL_MASK
|
||||
#define NQ_DB_CP_FLAGS_REARM (NQ_DB_KEY_CP | \
|
||||
NQ_DB_IDX_VALID)
|
||||
#define NQ_DB_CP_FLAGS (NQ_DB_KEY_CP | \
|
||||
NQ_DB_IDX_VALID | \
|
||||
NQ_DB_IRQ_DIS)
|
||||
#define NQ_DB_REARM(db, raw_cons, cp_bit) \
|
||||
writel(NQ_DB_CP_FLAGS_REARM | ((raw_cons) & ((cp_bit) - 1)), db)
|
||||
#define NQ_DB(db, raw_cons, cp_bit) \
|
||||
writel(NQ_DB_CP_FLAGS | ((raw_cons) & ((cp_bit) - 1)), db)
|
||||
|
||||
struct bnxt_qplib_nq {
|
||||
struct pci_dev *pdev;
|
||||
|
||||
int vector;
|
||||
int budget;
|
||||
bool requested;
|
||||
struct tasklet_struct worker;
|
||||
struct bnxt_qplib_hwq hwq;
|
||||
|
||||
u16 bar_reg;
|
||||
u16 bar_reg_off;
|
||||
u16 ring_id;
|
||||
void __iomem *bar_reg_iomem;
|
||||
|
||||
int (*cqn_handler)
|
||||
(struct bnxt_qplib_nq *nq,
|
||||
struct bnxt_qplib_cq *cq);
|
||||
int (*srqn_handler)
|
||||
(struct bnxt_qplib_nq *nq,
|
||||
void *srq,
|
||||
u8 event);
|
||||
};
|
||||
|
||||
void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq);
|
||||
int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
||||
int msix_vector, int bar_reg_offset,
|
||||
int (*cqn_handler)(struct bnxt_qplib_nq *nq,
|
||||
struct bnxt_qplib_cq *cq),
|
||||
int (*srqn_handler)(struct bnxt_qplib_nq *nq,
|
||||
void *srq,
|
||||
u8 event));
|
||||
int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_destroy_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
|
||||
void *bnxt_qplib_get_qp1_sq_buf(struct bnxt_qplib_qp *qp,
|
||||
struct bnxt_qplib_sge *sge);
|
||||
void *bnxt_qplib_get_qp1_rq_buf(struct bnxt_qplib_qp *qp,
|
||||
struct bnxt_qplib_sge *sge);
|
||||
u32 bnxt_qplib_get_rq_prod_index(struct bnxt_qplib_qp *qp);
|
||||
dma_addr_t bnxt_qplib_get_qp_buf_from_index(struct bnxt_qplib_qp *qp,
|
||||
u32 index);
|
||||
void bnxt_qplib_post_send_db(struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
|
||||
struct bnxt_qplib_swqe *wqe);
|
||||
void bnxt_qplib_post_recv_db(struct bnxt_qplib_qp *qp);
|
||||
int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp,
|
||||
struct bnxt_qplib_swqe *wqe);
|
||||
int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
|
||||
int bnxt_qplib_destroy_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
|
||||
int bnxt_qplib_poll_cq(struct bnxt_qplib_cq *cq, struct bnxt_qplib_cqe *cqe,
|
||||
int num);
|
||||
void bnxt_qplib_req_notify_cq(struct bnxt_qplib_cq *cq, u32 arm_type);
|
||||
void bnxt_qplib_free_nq(struct bnxt_qplib_nq *nq);
|
||||
int bnxt_qplib_alloc_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq);
|
||||
#endif /* __BNXT_QPLIB_FP_H__ */
|
||||
694
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
Normal file
694
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
Normal file
File diff suppressed because it is too large
Load Diff
231
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
Normal file
231
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
Normal file
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: RDMA Controller HW interface (header)
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_QPLIB_RCFW_H__
|
||||
#define __BNXT_QPLIB_RCFW_H__
|
||||
|
||||
#define RCFW_CMDQ_TRIG_VAL 1
|
||||
#define RCFW_COMM_PCI_BAR_REGION 0
|
||||
#define RCFW_COMM_CONS_PCI_BAR_REGION 2
|
||||
#define RCFW_COMM_BASE_OFFSET 0x600
|
||||
#define RCFW_PF_COMM_PROD_OFFSET 0xc
|
||||
#define RCFW_VF_COMM_PROD_OFFSET 0xc
|
||||
#define RCFW_COMM_TRIG_OFFSET 0x100
|
||||
#define RCFW_COMM_SIZE 0x104
|
||||
|
||||
#define RCFW_DBR_PCI_BAR_REGION 2
|
||||
|
||||
#define RCFW_CMD_PREP(req, CMD, cmd_flags) \
|
||||
do { \
|
||||
memset(&(req), 0, sizeof((req))); \
|
||||
(req).opcode = CMDQ_BASE_OPCODE_##CMD; \
|
||||
(req).cmd_size = (sizeof((req)) + \
|
||||
BNXT_QPLIB_CMDQE_UNITS - 1) / \
|
||||
BNXT_QPLIB_CMDQE_UNITS; \
|
||||
(req).flags = cpu_to_le16(cmd_flags); \
|
||||
} while (0)
|
||||
|
||||
#define RCFW_CMD_WAIT_TIME_MS 20000 /* 20 Seconds timeout */
|
||||
|
||||
/* CMDQ elements */
|
||||
#define BNXT_QPLIB_CMDQE_MAX_CNT 256
|
||||
#define BNXT_QPLIB_CMDQE_UNITS sizeof(struct bnxt_qplib_cmdqe)
|
||||
#define BNXT_QPLIB_CMDQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_CMDQE_UNITS)
|
||||
|
||||
#define MAX_CMDQ_IDX (BNXT_QPLIB_CMDQE_MAX_CNT - 1)
|
||||
#define MAX_CMDQ_IDX_PER_PG (BNXT_QPLIB_CMDQE_CNT_PER_PG - 1)
|
||||
|
||||
#define RCFW_MAX_OUTSTANDING_CMD BNXT_QPLIB_CMDQE_MAX_CNT
|
||||
#define RCFW_MAX_COOKIE_VALUE 0x7FFF
|
||||
#define RCFW_CMD_IS_BLOCKING 0x8000
|
||||
|
||||
/* Cmdq contains a fix number of a 16-Byte slots */
|
||||
struct bnxt_qplib_cmdqe {
|
||||
u8 data[16];
|
||||
};
|
||||
|
||||
static inline u32 get_cmdq_pg(u32 val)
|
||||
{
|
||||
return (val & ~MAX_CMDQ_IDX_PER_PG) / BNXT_QPLIB_CMDQE_CNT_PER_PG;
|
||||
}
|
||||
|
||||
static inline u32 get_cmdq_idx(u32 val)
|
||||
{
|
||||
return val & MAX_CMDQ_IDX_PER_PG;
|
||||
}
|
||||
|
||||
/* Crsq buf is 1024-Byte */
|
||||
struct bnxt_qplib_crsbe {
|
||||
u8 data[1024];
|
||||
};
|
||||
|
||||
/* CRSQ SB */
|
||||
#define BNXT_QPLIB_CRSBE_MAX_CNT 4
|
||||
#define BNXT_QPLIB_CRSBE_UNITS sizeof(struct bnxt_qplib_crsbe)
|
||||
#define BNXT_QPLIB_CRSBE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_CRSBE_UNITS)
|
||||
|
||||
#define MAX_CRSB_IDX (BNXT_QPLIB_CRSBE_MAX_CNT - 1)
|
||||
#define MAX_CRSB_IDX_PER_PG (BNXT_QPLIB_CRSBE_CNT_PER_PG - 1)
|
||||
|
||||
static inline u32 get_crsb_pg(u32 val)
|
||||
{
|
||||
return (val & ~MAX_CRSB_IDX_PER_PG) / BNXT_QPLIB_CRSBE_CNT_PER_PG;
|
||||
}
|
||||
|
||||
static inline u32 get_crsb_idx(u32 val)
|
||||
{
|
||||
return val & MAX_CRSB_IDX_PER_PG;
|
||||
}
|
||||
|
||||
static inline void bnxt_qplib_crsb_dma_next(dma_addr_t *pg_map_arr,
|
||||
u32 prod, dma_addr_t *dma_addr)
|
||||
{
|
||||
*dma_addr = pg_map_arr[(prod) / BNXT_QPLIB_CRSBE_CNT_PER_PG];
|
||||
*dma_addr += ((prod) % BNXT_QPLIB_CRSBE_CNT_PER_PG) *
|
||||
BNXT_QPLIB_CRSBE_UNITS;
|
||||
}
|
||||
|
||||
/* CREQ */
|
||||
/* Allocate 1 per QP for async error notification for now */
|
||||
#define BNXT_QPLIB_CREQE_MAX_CNT (64 * 1024)
|
||||
#define BNXT_QPLIB_CREQE_UNITS 16 /* 16-Bytes per prod unit */
|
||||
#define BNXT_QPLIB_CREQE_CNT_PER_PG (PAGE_SIZE / BNXT_QPLIB_CREQE_UNITS)
|
||||
|
||||
#define MAX_CREQ_IDX (BNXT_QPLIB_CREQE_MAX_CNT - 1)
|
||||
#define MAX_CREQ_IDX_PER_PG (BNXT_QPLIB_CREQE_CNT_PER_PG - 1)
|
||||
|
||||
static inline u32 get_creq_pg(u32 val)
|
||||
{
|
||||
return (val & ~MAX_CREQ_IDX_PER_PG) / BNXT_QPLIB_CREQE_CNT_PER_PG;
|
||||
}
|
||||
|
||||
static inline u32 get_creq_idx(u32 val)
|
||||
{
|
||||
return val & MAX_CREQ_IDX_PER_PG;
|
||||
}
|
||||
|
||||
#define BNXT_QPLIB_CREQE_PER_PG (PAGE_SIZE / sizeof(struct creq_base))
|
||||
|
||||
#define CREQ_CMP_VALID(hdr, raw_cons, cp_bit) \
|
||||
(!!((hdr)->v & CREQ_BASE_V) == \
|
||||
!((raw_cons) & (cp_bit)))
|
||||
|
||||
#define CREQ_DB_KEY_CP (0x2 << CMPL_DOORBELL_KEY_SFT)
|
||||
#define CREQ_DB_IDX_VALID CMPL_DOORBELL_IDX_VALID
|
||||
#define CREQ_DB_IRQ_DIS CMPL_DOORBELL_MASK
|
||||
#define CREQ_DB_CP_FLAGS_REARM (CREQ_DB_KEY_CP | \
|
||||
CREQ_DB_IDX_VALID)
|
||||
#define CREQ_DB_CP_FLAGS (CREQ_DB_KEY_CP | \
|
||||
CREQ_DB_IDX_VALID | \
|
||||
CREQ_DB_IRQ_DIS)
|
||||
#define CREQ_DB_REARM(db, raw_cons, cp_bit) \
|
||||
writel(CREQ_DB_CP_FLAGS_REARM | ((raw_cons) & ((cp_bit) - 1)), db)
|
||||
#define CREQ_DB(db, raw_cons, cp_bit) \
|
||||
writel(CREQ_DB_CP_FLAGS | ((raw_cons) & ((cp_bit) - 1)), db)
|
||||
|
||||
/* HWQ */
|
||||
struct bnxt_qplib_crsqe {
|
||||
struct creq_qp_event qp_event;
|
||||
u32 req_size;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_crsq {
|
||||
struct bnxt_qplib_crsqe *crsq;
|
||||
u32 prod;
|
||||
u32 cons;
|
||||
u32 max_elements;
|
||||
};
|
||||
|
||||
/* RCFW Communication Channels */
|
||||
struct bnxt_qplib_rcfw {
|
||||
struct pci_dev *pdev;
|
||||
int vector;
|
||||
struct tasklet_struct worker;
|
||||
bool requested;
|
||||
unsigned long *cmdq_bitmap;
|
||||
u32 bmap_size;
|
||||
unsigned long flags;
|
||||
#define FIRMWARE_INITIALIZED_FLAG 1
|
||||
#define FIRMWARE_FIRST_FLAG BIT(31)
|
||||
wait_queue_head_t waitq;
|
||||
int (*aeq_handler)(struct bnxt_qplib_rcfw *,
|
||||
struct creq_func_event *);
|
||||
atomic_t seq_num;
|
||||
|
||||
/* Bar region info */
|
||||
void __iomem *cmdq_bar_reg_iomem;
|
||||
u16 cmdq_bar_reg;
|
||||
u16 cmdq_bar_reg_prod_off;
|
||||
u16 cmdq_bar_reg_trig_off;
|
||||
u16 creq_ring_id;
|
||||
u16 creq_bar_reg;
|
||||
void __iomem *creq_bar_reg_iomem;
|
||||
|
||||
/* Cmd-Resp and Async Event notification queue */
|
||||
struct bnxt_qplib_hwq creq;
|
||||
u64 creq_qp_event_processed;
|
||||
u64 creq_func_event_processed;
|
||||
|
||||
/* Actual Cmd and Resp Queues */
|
||||
struct bnxt_qplib_hwq cmdq;
|
||||
struct bnxt_qplib_crsq crsq;
|
||||
struct bnxt_qplib_hwq crsb;
|
||||
};
|
||||
|
||||
void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_alloc_rcfw_channel(struct pci_dev *pdev,
|
||||
struct bnxt_qplib_rcfw *rcfw);
|
||||
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
||||
struct bnxt_qplib_rcfw *rcfw,
|
||||
int msix_vector,
|
||||
int cp_bar_reg_off, int virt_fn,
|
||||
int (*aeq_handler)
|
||||
(struct bnxt_qplib_rcfw *,
|
||||
struct creq_func_event *));
|
||||
|
||||
int bnxt_qplib_rcfw_block_for_resp(struct bnxt_qplib_rcfw *rcfw, u16 cookie);
|
||||
int bnxt_qplib_rcfw_wait_for_resp(struct bnxt_qplib_rcfw *rcfw, u16 cookie);
|
||||
void *bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
|
||||
struct cmdq_base *req, void **crsbe,
|
||||
u8 is_block);
|
||||
|
||||
int bnxt_qplib_deinit_rcfw(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_ctx *ctx, int is_virtfn);
|
||||
#endif /* __BNXT_QPLIB_RCFW_H__ */
|
||||
825
drivers/infiniband/hw/bnxt_re/qplib_res.c
Normal file
825
drivers/infiniband/hw/bnxt_re/qplib_res.c
Normal file
File diff suppressed because it is too large
Load Diff
223
drivers/infiniband/hw/bnxt_re/qplib_res.h
Normal file
223
drivers/infiniband/hw/bnxt_re/qplib_res.h
Normal file
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: QPLib resource manager (header)
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_QPLIB_RES_H__
|
||||
#define __BNXT_QPLIB_RES_H__
|
||||
|
||||
extern const struct bnxt_qplib_gid bnxt_qplib_gid_zero;
|
||||
|
||||
#define PTR_CNT_PER_PG (PAGE_SIZE / sizeof(void *))
|
||||
#define PTR_MAX_IDX_PER_PG (PTR_CNT_PER_PG - 1)
|
||||
#define PTR_PG(x) (((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG)
|
||||
#define PTR_IDX(x) ((x) & PTR_MAX_IDX_PER_PG)
|
||||
|
||||
#define HWQ_CMP(idx, hwq) ((idx) & ((hwq)->max_elements - 1))
|
||||
|
||||
enum bnxt_qplib_hwq_type {
|
||||
HWQ_TYPE_CTX,
|
||||
HWQ_TYPE_QUEUE,
|
||||
HWQ_TYPE_L2_CMPL
|
||||
};
|
||||
|
||||
#define MAX_PBL_LVL_0_PGS 1
|
||||
#define MAX_PBL_LVL_1_PGS 512
|
||||
#define MAX_PBL_LVL_1_PGS_SHIFT 9
|
||||
#define MAX_PBL_LVL_1_PGS_FOR_LVL_2 256
|
||||
#define MAX_PBL_LVL_2_PGS (256 * 512)
|
||||
|
||||
enum bnxt_qplib_pbl_lvl {
|
||||
PBL_LVL_0,
|
||||
PBL_LVL_1,
|
||||
PBL_LVL_2,
|
||||
PBL_LVL_MAX
|
||||
};
|
||||
|
||||
#define ROCE_PG_SIZE_4K (4 * 1024)
|
||||
#define ROCE_PG_SIZE_8K (8 * 1024)
|
||||
#define ROCE_PG_SIZE_64K (64 * 1024)
|
||||
#define ROCE_PG_SIZE_2M (2 * 1024 * 1024)
|
||||
#define ROCE_PG_SIZE_8M (8 * 1024 * 1024)
|
||||
#define ROCE_PG_SIZE_1G (1024 * 1024 * 1024)
|
||||
|
||||
struct bnxt_qplib_pbl {
|
||||
u32 pg_count;
|
||||
u32 pg_size;
|
||||
void **pg_arr;
|
||||
dma_addr_t *pg_map_arr;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_hwq {
|
||||
struct pci_dev *pdev;
|
||||
/* lock to protect qplib_hwq */
|
||||
spinlock_t lock;
|
||||
struct bnxt_qplib_pbl pbl[PBL_LVL_MAX];
|
||||
enum bnxt_qplib_pbl_lvl level; /* 0, 1, or 2 */
|
||||
/* ptr for easy access to the PBL entries */
|
||||
void **pbl_ptr;
|
||||
/* ptr for easy access to the dma_addr */
|
||||
dma_addr_t *pbl_dma_ptr;
|
||||
u32 max_elements;
|
||||
u16 element_size; /* Size of each entry */
|
||||
|
||||
u32 prod; /* raw */
|
||||
u32 cons; /* raw */
|
||||
u8 cp_bit;
|
||||
u8 is_user;
|
||||
};
|
||||
|
||||
/* Tables */
|
||||
struct bnxt_qplib_pd_tbl {
|
||||
unsigned long *tbl;
|
||||
u32 max;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_sgid_tbl {
|
||||
struct bnxt_qplib_gid *tbl;
|
||||
u16 *hw_id;
|
||||
u16 max;
|
||||
u16 active;
|
||||
void *ctx;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_pkey_tbl {
|
||||
u16 *tbl;
|
||||
u16 max;
|
||||
u16 active;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_dpi {
|
||||
u32 dpi;
|
||||
void __iomem *dbr;
|
||||
u64 umdbr;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_dpi_tbl {
|
||||
void **app_tbl;
|
||||
unsigned long *tbl;
|
||||
u16 max;
|
||||
void __iomem *dbr_bar_reg_iomem;
|
||||
u64 unmapped_dbr;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_stats {
|
||||
dma_addr_t dma_map;
|
||||
void *dma;
|
||||
u32 size;
|
||||
u32 fw_id;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_vf_res {
|
||||
u32 max_qp_per_vf;
|
||||
u32 max_mrw_per_vf;
|
||||
u32 max_srq_per_vf;
|
||||
u32 max_cq_per_vf;
|
||||
u32 max_gid_per_vf;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_MAX_QP_CTX_ENTRY_SIZE 448
|
||||
#define BNXT_QPLIB_MAX_SRQ_CTX_ENTRY_SIZE 64
|
||||
#define BNXT_QPLIB_MAX_CQ_CTX_ENTRY_SIZE 64
|
||||
#define BNXT_QPLIB_MAX_MRW_CTX_ENTRY_SIZE 128
|
||||
|
||||
struct bnxt_qplib_ctx {
|
||||
u32 qpc_count;
|
||||
struct bnxt_qplib_hwq qpc_tbl;
|
||||
u32 mrw_count;
|
||||
struct bnxt_qplib_hwq mrw_tbl;
|
||||
u32 srqc_count;
|
||||
struct bnxt_qplib_hwq srqc_tbl;
|
||||
u32 cq_count;
|
||||
struct bnxt_qplib_hwq cq_tbl;
|
||||
struct bnxt_qplib_hwq tim_tbl;
|
||||
#define MAX_TQM_ALLOC_REQ 32
|
||||
#define MAX_TQM_ALLOC_BLK_SIZE 8
|
||||
u8 tqm_count[MAX_TQM_ALLOC_REQ];
|
||||
struct bnxt_qplib_hwq tqm_pde;
|
||||
u32 tqm_pde_level;
|
||||
struct bnxt_qplib_hwq tqm_tbl[MAX_TQM_ALLOC_REQ];
|
||||
struct bnxt_qplib_stats stats;
|
||||
struct bnxt_qplib_vf_res vf_res;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_res {
|
||||
struct pci_dev *pdev;
|
||||
struct net_device *netdev;
|
||||
|
||||
struct bnxt_qplib_rcfw *rcfw;
|
||||
|
||||
struct bnxt_qplib_pd_tbl pd_tbl;
|
||||
struct bnxt_qplib_sgid_tbl sgid_tbl;
|
||||
struct bnxt_qplib_pkey_tbl pkey_tbl;
|
||||
struct bnxt_qplib_dpi_tbl dpi_tbl;
|
||||
};
|
||||
|
||||
#define to_bnxt_qplib(ptr, type, member) \
|
||||
container_of(ptr, type, member)
|
||||
|
||||
struct bnxt_qplib_pd;
|
||||
struct bnxt_qplib_dev_attr;
|
||||
|
||||
void bnxt_qplib_free_hwq(struct pci_dev *pdev, struct bnxt_qplib_hwq *hwq);
|
||||
int bnxt_qplib_alloc_init_hwq(struct pci_dev *pdev, struct bnxt_qplib_hwq *hwq,
|
||||
struct scatterlist *sl, int nmap, u32 *elements,
|
||||
u32 elements_per_page, u32 aux, u32 pg_size,
|
||||
enum bnxt_qplib_hwq_type hwq_type);
|
||||
void bnxt_qplib_get_guid(u8 *dev_addr, u8 *guid);
|
||||
int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pd_tbl,
|
||||
struct bnxt_qplib_pd *pd);
|
||||
int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_pd_tbl *pd_tbl,
|
||||
struct bnxt_qplib_pd *pd);
|
||||
int bnxt_qplib_alloc_dpi(struct bnxt_qplib_dpi_tbl *dpit,
|
||||
struct bnxt_qplib_dpi *dpi,
|
||||
void *app);
|
||||
int bnxt_qplib_dealloc_dpi(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_dpi_tbl *dpi_tbl,
|
||||
struct bnxt_qplib_dpi *dpi);
|
||||
void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res);
|
||||
int bnxt_qplib_init_res(struct bnxt_qplib_res *res);
|
||||
void bnxt_qplib_free_res(struct bnxt_qplib_res *res);
|
||||
int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev,
|
||||
struct net_device *netdev,
|
||||
struct bnxt_qplib_dev_attr *dev_attr);
|
||||
void bnxt_qplib_free_ctx(struct pci_dev *pdev,
|
||||
struct bnxt_qplib_ctx *ctx);
|
||||
int bnxt_qplib_alloc_ctx(struct pci_dev *pdev,
|
||||
struct bnxt_qplib_ctx *ctx,
|
||||
bool virt_fn);
|
||||
#endif /* __BNXT_QPLIB_RES_H__ */
|
||||
838
drivers/infiniband/hw/bnxt_re/qplib_sp.c
Normal file
838
drivers/infiniband/hw/bnxt_re/qplib_sp.c
Normal file
File diff suppressed because it is too large
Load Diff
160
drivers/infiniband/hw/bnxt_re/qplib_sp.h
Normal file
160
drivers/infiniband/hw/bnxt_re/qplib_sp.h
Normal file
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: Slow Path Operators (header)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_QPLIB_SP_H__
|
||||
#define __BNXT_QPLIB_SP_H__
|
||||
|
||||
struct bnxt_qplib_dev_attr {
|
||||
char fw_ver[32];
|
||||
u16 max_sgid;
|
||||
u16 max_mrw;
|
||||
u32 max_qp;
|
||||
#define BNXT_QPLIB_MAX_OUT_RD_ATOM 126
|
||||
u32 max_qp_rd_atom;
|
||||
u32 max_qp_init_rd_atom;
|
||||
u32 max_qp_wqes;
|
||||
u32 max_qp_sges;
|
||||
u32 max_cq;
|
||||
u32 max_cq_wqes;
|
||||
u32 max_cq_sges;
|
||||
u32 max_mr;
|
||||
u64 max_mr_size;
|
||||
u32 max_pd;
|
||||
u32 max_mw;
|
||||
u32 max_raw_ethy_qp;
|
||||
u32 max_ah;
|
||||
u32 max_fmr;
|
||||
u32 max_map_per_fmr;
|
||||
u32 max_srq;
|
||||
u32 max_srq_wqes;
|
||||
u32 max_srq_sges;
|
||||
u32 max_pkey;
|
||||
u32 max_inline_data;
|
||||
u32 l2_db_size;
|
||||
u8 tqm_alloc_reqs[MAX_TQM_ALLOC_REQ];
|
||||
};
|
||||
|
||||
struct bnxt_qplib_pd {
|
||||
u32 id;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_gid {
|
||||
u8 data[16];
|
||||
};
|
||||
|
||||
struct bnxt_qplib_ah {
|
||||
struct bnxt_qplib_gid dgid;
|
||||
struct bnxt_qplib_pd *pd;
|
||||
u32 id;
|
||||
u8 sgid_index;
|
||||
/* For Query AH if the hw table and SW table are differnt */
|
||||
u8 host_sgid_index;
|
||||
u8 traffic_class;
|
||||
u32 flow_label;
|
||||
u8 hop_limit;
|
||||
u8 sl;
|
||||
u8 dmac[6];
|
||||
u16 vlan_id;
|
||||
u8 nw_type;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_mrw {
|
||||
struct bnxt_qplib_pd *pd;
|
||||
int type;
|
||||
u32 flags;
|
||||
#define BNXT_QPLIB_FR_PMR 0x80000000
|
||||
u32 lkey;
|
||||
u32 rkey;
|
||||
#define BNXT_QPLIB_RSVD_LKEY 0xFFFFFFFF
|
||||
u64 va;
|
||||
u64 total_size;
|
||||
u32 npages;
|
||||
u64 mr_handle;
|
||||
struct bnxt_qplib_hwq hwq;
|
||||
};
|
||||
|
||||
struct bnxt_qplib_frpl {
|
||||
int max_pg_ptrs;
|
||||
struct bnxt_qplib_hwq hwq;
|
||||
};
|
||||
|
||||
#define BNXT_QPLIB_ACCESS_LOCAL_WRITE BIT(0)
|
||||
#define BNXT_QPLIB_ACCESS_REMOTE_READ BIT(1)
|
||||
#define BNXT_QPLIB_ACCESS_REMOTE_WRITE BIT(2)
|
||||
#define BNXT_QPLIB_ACCESS_REMOTE_ATOMIC BIT(3)
|
||||
#define BNXT_QPLIB_ACCESS_MW_BIND BIT(4)
|
||||
#define BNXT_QPLIB_ACCESS_ZERO_BASED BIT(5)
|
||||
#define BNXT_QPLIB_ACCESS_ON_DEMAND BIT(6)
|
||||
|
||||
int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_sgid_tbl *sgid_tbl, int index,
|
||||
struct bnxt_qplib_gid *gid);
|
||||
int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl,
|
||||
struct bnxt_qplib_gid *gid, bool update);
|
||||
int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl,
|
||||
struct bnxt_qplib_gid *gid, u8 *mac, u16 vlan_id,
|
||||
bool update, u32 *index);
|
||||
int bnxt_qplib_get_pkey(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 index,
|
||||
u16 *pkey);
|
||||
int bnxt_qplib_del_pkey(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
|
||||
bool update);
|
||||
int bnxt_qplib_add_pkey(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_pkey_tbl *pkey_tbl, u16 *pkey,
|
||||
bool update);
|
||||
int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_dev_attr *attr);
|
||||
int bnxt_qplib_create_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah);
|
||||
int bnxt_qplib_destroy_ah(struct bnxt_qplib_res *res, struct bnxt_qplib_ah *ah);
|
||||
int bnxt_qplib_alloc_mrw(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_mrw *mrw);
|
||||
int bnxt_qplib_dereg_mrw(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mrw,
|
||||
bool block);
|
||||
int bnxt_qplib_reg_mr(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mr,
|
||||
u64 *pbl_tbl, int num_pbls, bool block);
|
||||
int bnxt_qplib_free_mrw(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mr);
|
||||
int bnxt_qplib_alloc_fast_reg_mr(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_mrw *mr, int max);
|
||||
int bnxt_qplib_alloc_fast_reg_page_list(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_frpl *frpl, int max);
|
||||
int bnxt_qplib_free_fast_reg_page_list(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_frpl *frpl);
|
||||
int bnxt_qplib_map_tc2cos(struct bnxt_qplib_res *res, u16 *cids);
|
||||
#endif /* __BNXT_QPLIB_SP_H__*/
|
||||
2821
drivers/infiniband/hw/bnxt_re/roce_hsi.h
Normal file
2821
drivers/infiniband/hw/bnxt_re/roce_hsi.h
Normal file
File diff suppressed because it is too large
Load Diff
89
include/uapi/rdma/bnxt_re-abi.h
Normal file
89
include/uapi/rdma/bnxt_re-abi.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Broadcom NetXtreme-E RoCE driver.
|
||||
*
|
||||
* Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
|
||||
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Description: Uverbs ABI header file
|
||||
*/
|
||||
|
||||
#ifndef __BNXT_RE_UVERBS_ABI_H__
|
||||
#define __BNXT_RE_UVERBS_ABI_H__
|
||||
|
||||
#define BNXT_RE_ABI_VERSION 1
|
||||
|
||||
struct bnxt_re_uctx_resp {
|
||||
__u32 dev_id;
|
||||
__u32 max_qp;
|
||||
__u32 pg_size;
|
||||
__u32 cqe_sz;
|
||||
__u32 max_cqd;
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
struct bnxt_re_pd_resp {
|
||||
__u32 pdid;
|
||||
__u32 dpi;
|
||||
__u64 dbr;
|
||||
};
|
||||
|
||||
struct bnxt_re_cq_req {
|
||||
__u64 cq_va;
|
||||
__u64 cq_handle;
|
||||
};
|
||||
|
||||
struct bnxt_re_cq_resp {
|
||||
__u32 cqid;
|
||||
__u32 tail;
|
||||
__u32 phase;
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
struct bnxt_re_qp_req {
|
||||
__u64 qpsva;
|
||||
__u64 qprva;
|
||||
__u64 qp_handle;
|
||||
};
|
||||
|
||||
struct bnxt_re_qp_resp {
|
||||
__u32 qpid;
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
enum bnxt_re_shpg_offt {
|
||||
BNXT_RE_BEG_RESV_OFFT = 0x00,
|
||||
BNXT_RE_AVID_OFFT = 0x10,
|
||||
BNXT_RE_AVID_SIZE = 0x04,
|
||||
BNXT_RE_END_RESV_OFFT = 0xFF0
|
||||
};
|
||||
|
||||
#endif /* __BNXT_RE_UVERBS_ABI_H__*/
|
||||
Reference in New Issue
Block a user