mirror of https://gitee.com/openkylin/linux.git
Merge branches 'cxgb4', 'mlx4' and 'ocrdma' into for-linus
This commit is contained in:
commit
20952cdd8e
|
@ -140,7 +140,7 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
|
||||||
props->max_mr_size = ~0ull;
|
props->max_mr_size = ~0ull;
|
||||||
props->page_size_cap = dev->dev->caps.page_size_cap;
|
props->page_size_cap = dev->dev->caps.page_size_cap;
|
||||||
props->max_qp = dev->dev->caps.num_qps - dev->dev->caps.reserved_qps;
|
props->max_qp = dev->dev->caps.num_qps - dev->dev->caps.reserved_qps;
|
||||||
props->max_qp_wr = dev->dev->caps.max_wqes;
|
props->max_qp_wr = dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE;
|
||||||
props->max_sge = min(dev->dev->caps.max_sq_sg,
|
props->max_sge = min(dev->dev->caps.max_sq_sg,
|
||||||
dev->dev->caps.max_rq_sg);
|
dev->dev->caps.max_rq_sg);
|
||||||
props->max_cq = dev->dev->caps.num_cqs - dev->dev->caps.reserved_cqs;
|
props->max_cq = dev->dev->caps.num_cqs - dev->dev->caps.reserved_cqs;
|
||||||
|
@ -1084,12 +1084,9 @@ static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
|
||||||
int total_eqs = 0;
|
int total_eqs = 0;
|
||||||
int i, j, eq;
|
int i, j, eq;
|
||||||
|
|
||||||
/* Init eq table */
|
/* Legacy mode or comp_pool is not large enough */
|
||||||
ibdev->eq_table = NULL;
|
if (dev->caps.comp_pool == 0 ||
|
||||||
ibdev->eq_added = 0;
|
dev->caps.num_ports > dev->caps.comp_pool)
|
||||||
|
|
||||||
/* Legacy mode? */
|
|
||||||
if (dev->caps.comp_pool == 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
eq_per_port = rounddown_pow_of_two(dev->caps.comp_pool/
|
eq_per_port = rounddown_pow_of_two(dev->caps.comp_pool/
|
||||||
|
@ -1135,7 +1132,10 @@ static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
|
||||||
static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
|
static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int total_eqs;
|
|
||||||
|
/* no additional eqs were added */
|
||||||
|
if (!ibdev->eq_table)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Reset the advertised EQ number */
|
/* Reset the advertised EQ number */
|
||||||
ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors;
|
ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors;
|
||||||
|
@ -1148,12 +1148,7 @@ static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
|
||||||
mlx4_release_eq(dev, ibdev->eq_table[i]);
|
mlx4_release_eq(dev, ibdev->eq_table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
total_eqs = dev->caps.num_comp_vectors + ibdev->eq_added;
|
|
||||||
memset(ibdev->eq_table, 0, total_eqs * sizeof(int));
|
|
||||||
kfree(ibdev->eq_table);
|
kfree(ibdev->eq_table);
|
||||||
|
|
||||||
ibdev->eq_table = NULL;
|
|
||||||
ibdev->eq_added = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *mlx4_ib_add(struct mlx4_dev *dev)
|
static void *mlx4_ib_add(struct mlx4_dev *dev)
|
||||||
|
|
|
@ -44,6 +44,14 @@
|
||||||
#include <linux/mlx4/device.h>
|
#include <linux/mlx4/device.h>
|
||||||
#include <linux/mlx4/doorbell.h>
|
#include <linux/mlx4/doorbell.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MLX4_IB_SQ_MIN_WQE_SHIFT = 6,
|
||||||
|
MLX4_IB_MAX_HEADROOM = 2048
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MLX4_IB_SQ_HEADROOM(shift) ((MLX4_IB_MAX_HEADROOM >> (shift)) + 1)
|
||||||
|
#define MLX4_IB_SQ_MAX_SPARE (MLX4_IB_SQ_HEADROOM(MLX4_IB_SQ_MIN_WQE_SHIFT))
|
||||||
|
|
||||||
struct mlx4_ib_ucontext {
|
struct mlx4_ib_ucontext {
|
||||||
struct ib_ucontext ibucontext;
|
struct ib_ucontext ibucontext;
|
||||||
struct mlx4_uar uar;
|
struct mlx4_uar uar;
|
||||||
|
|
|
@ -310,8 +310,8 @@ static int set_rq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
||||||
int is_user, int has_rq, struct mlx4_ib_qp *qp)
|
int is_user, int has_rq, struct mlx4_ib_qp *qp)
|
||||||
{
|
{
|
||||||
/* Sanity check RQ size before proceeding */
|
/* Sanity check RQ size before proceeding */
|
||||||
if (cap->max_recv_wr > dev->dev->caps.max_wqes ||
|
if (cap->max_recv_wr > dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE ||
|
||||||
cap->max_recv_sge > dev->dev->caps.max_rq_sg)
|
cap->max_recv_sge > min(dev->dev->caps.max_sq_sg, dev->dev->caps.max_rq_sg))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!has_rq) {
|
if (!has_rq) {
|
||||||
|
@ -329,8 +329,17 @@ static int set_rq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
||||||
qp->rq.wqe_shift = ilog2(qp->rq.max_gs * sizeof (struct mlx4_wqe_data_seg));
|
qp->rq.wqe_shift = ilog2(qp->rq.max_gs * sizeof (struct mlx4_wqe_data_seg));
|
||||||
}
|
}
|
||||||
|
|
||||||
cap->max_recv_wr = qp->rq.max_post = qp->rq.wqe_cnt;
|
/* leave userspace return values as they were, so as not to break ABI */
|
||||||
cap->max_recv_sge = qp->rq.max_gs;
|
if (is_user) {
|
||||||
|
cap->max_recv_wr = qp->rq.max_post = qp->rq.wqe_cnt;
|
||||||
|
cap->max_recv_sge = qp->rq.max_gs;
|
||||||
|
} else {
|
||||||
|
cap->max_recv_wr = qp->rq.max_post =
|
||||||
|
min(dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE, qp->rq.wqe_cnt);
|
||||||
|
cap->max_recv_sge = min(qp->rq.max_gs,
|
||||||
|
min(dev->dev->caps.max_sq_sg,
|
||||||
|
dev->dev->caps.max_rq_sg));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -341,8 +350,8 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
/* Sanity check SQ size before proceeding */
|
/* Sanity check SQ size before proceeding */
|
||||||
if (cap->max_send_wr > dev->dev->caps.max_wqes ||
|
if (cap->max_send_wr > (dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE) ||
|
||||||
cap->max_send_sge > dev->dev->caps.max_sq_sg ||
|
cap->max_send_sge > min(dev->dev->caps.max_sq_sg, dev->dev->caps.max_rq_sg) ||
|
||||||
cap->max_inline_data + send_wqe_overhead(type, qp->flags) +
|
cap->max_inline_data + send_wqe_overhead(type, qp->flags) +
|
||||||
sizeof (struct mlx4_wqe_inline_seg) > dev->dev->caps.max_sq_desc_sz)
|
sizeof (struct mlx4_wqe_inline_seg) > dev->dev->caps.max_sq_desc_sz)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -231,7 +231,6 @@ struct ocrdma_qp_hwq_info {
|
||||||
u32 entry_size;
|
u32 entry_size;
|
||||||
u32 max_cnt;
|
u32 max_cnt;
|
||||||
u32 max_wqe_idx;
|
u32 max_wqe_idx;
|
||||||
u32 free_delta;
|
|
||||||
u16 dbid; /* qid, where to ring the doorbell. */
|
u16 dbid; /* qid, where to ring the doorbell. */
|
||||||
u32 len;
|
u32 len;
|
||||||
dma_addr_t pa;
|
dma_addr_t pa;
|
||||||
|
|
|
@ -101,8 +101,6 @@ struct ocrdma_create_qp_uresp {
|
||||||
u32 rsvd1;
|
u32 rsvd1;
|
||||||
u32 num_wqe_allocated;
|
u32 num_wqe_allocated;
|
||||||
u32 num_rqe_allocated;
|
u32 num_rqe_allocated;
|
||||||
u32 free_wqe_delta;
|
|
||||||
u32 free_rqe_delta;
|
|
||||||
u32 db_sq_offset;
|
u32 db_sq_offset;
|
||||||
u32 db_rq_offset;
|
u32 db_rq_offset;
|
||||||
u32 db_shift;
|
u32 db_shift;
|
||||||
|
@ -126,8 +124,7 @@ struct ocrdma_create_srq_uresp {
|
||||||
u32 db_rq_offset;
|
u32 db_rq_offset;
|
||||||
u32 db_shift;
|
u32 db_shift;
|
||||||
|
|
||||||
u32 free_rqe_delta;
|
u64 rsvd2;
|
||||||
u32 rsvd2;
|
|
||||||
u64 rsvd3;
|
u64 rsvd3;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
|
|
@ -732,7 +732,7 @@ static void ocrdma_dispatch_ibevent(struct ocrdma_dev *dev,
|
||||||
break;
|
break;
|
||||||
case OCRDMA_SRQ_LIMIT_EVENT:
|
case OCRDMA_SRQ_LIMIT_EVENT:
|
||||||
ib_evt.element.srq = &qp->srq->ibsrq;
|
ib_evt.element.srq = &qp->srq->ibsrq;
|
||||||
ib_evt.event = IB_EVENT_QP_LAST_WQE_REACHED;
|
ib_evt.event = IB_EVENT_SRQ_LIMIT_REACHED;
|
||||||
srq_event = 1;
|
srq_event = 1;
|
||||||
qp_event = 0;
|
qp_event = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -1990,19 +1990,12 @@ static void ocrdma_get_create_qp_rsp(struct ocrdma_create_qp_rsp *rsp,
|
||||||
max_wqe_allocated = 1 << max_wqe_allocated;
|
max_wqe_allocated = 1 << max_wqe_allocated;
|
||||||
max_rqe_allocated = 1 << ((u16)rsp->max_wqe_rqe);
|
max_rqe_allocated = 1 << ((u16)rsp->max_wqe_rqe);
|
||||||
|
|
||||||
if (qp->dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {
|
|
||||||
qp->sq.free_delta = 0;
|
|
||||||
qp->rq.free_delta = 1;
|
|
||||||
} else
|
|
||||||
qp->sq.free_delta = 1;
|
|
||||||
|
|
||||||
qp->sq.max_cnt = max_wqe_allocated;
|
qp->sq.max_cnt = max_wqe_allocated;
|
||||||
qp->sq.max_wqe_idx = max_wqe_allocated - 1;
|
qp->sq.max_wqe_idx = max_wqe_allocated - 1;
|
||||||
|
|
||||||
if (!attrs->srq) {
|
if (!attrs->srq) {
|
||||||
qp->rq.max_cnt = max_rqe_allocated;
|
qp->rq.max_cnt = max_rqe_allocated;
|
||||||
qp->rq.max_wqe_idx = max_rqe_allocated - 1;
|
qp->rq.max_wqe_idx = max_rqe_allocated - 1;
|
||||||
qp->rq.free_delta = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/version.h>
|
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <rdma/ib_verbs.h>
|
#include <rdma/ib_verbs.h>
|
||||||
#include <rdma/ib_user_verbs.h>
|
#include <rdma/ib_user_verbs.h>
|
||||||
|
|
|
@ -940,8 +940,6 @@ static int ocrdma_copy_qp_uresp(struct ocrdma_qp *qp,
|
||||||
uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET;
|
uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET;
|
||||||
uresp.db_shift = 16;
|
uresp.db_shift = 16;
|
||||||
}
|
}
|
||||||
uresp.free_wqe_delta = qp->sq.free_delta;
|
|
||||||
uresp.free_rqe_delta = qp->rq.free_delta;
|
|
||||||
|
|
||||||
if (qp->dpp_enabled) {
|
if (qp->dpp_enabled) {
|
||||||
uresp.dpp_credit = dpp_credit_lmt;
|
uresp.dpp_credit = dpp_credit_lmt;
|
||||||
|
@ -1307,8 +1305,6 @@ static int ocrdma_hwq_free_cnt(struct ocrdma_qp_hwq_info *q)
|
||||||
free_cnt = (q->max_cnt - q->head) + q->tail;
|
free_cnt = (q->max_cnt - q->head) + q->tail;
|
||||||
else
|
else
|
||||||
free_cnt = q->tail - q->head;
|
free_cnt = q->tail - q->head;
|
||||||
if (q->free_delta)
|
|
||||||
free_cnt -= q->free_delta;
|
|
||||||
return free_cnt;
|
return free_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1501,7 +1497,6 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_srq *srq, struct ib_udata *udata)
|
||||||
(srq->pd->id * srq->dev->nic_info.db_page_size);
|
(srq->pd->id * srq->dev->nic_info.db_page_size);
|
||||||
uresp.db_page_size = srq->dev->nic_info.db_page_size;
|
uresp.db_page_size = srq->dev->nic_info.db_page_size;
|
||||||
uresp.num_rqe_allocated = srq->rq.max_cnt;
|
uresp.num_rqe_allocated = srq->rq.max_cnt;
|
||||||
uresp.free_rqe_delta = 1;
|
|
||||||
if (srq->dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {
|
if (srq->dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {
|
||||||
uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ1_OFFSET;
|
uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ1_OFFSET;
|
||||||
uresp.db_shift = 24;
|
uresp.db_shift = 24;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#ifndef __OCRDMA_VERBS_H__
|
#ifndef __OCRDMA_VERBS_H__
|
||||||
#define __OCRDMA_VERBS_H__
|
#define __OCRDMA_VERBS_H__
|
||||||
|
|
||||||
#include <linux/version.h>
|
|
||||||
int ocrdma_post_send(struct ib_qp *, struct ib_send_wr *,
|
int ocrdma_post_send(struct ib_qp *, struct ib_send_wr *,
|
||||||
struct ib_send_wr **bad_wr);
|
struct ib_send_wr **bad_wr);
|
||||||
int ocrdma_post_recv(struct ib_qp *, struct ib_recv_wr *,
|
int ocrdma_post_recv(struct ib_qp *, struct ib_recv_wr *,
|
||||||
|
|
|
@ -697,10 +697,10 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
|
||||||
if (slave != dev->caps.function)
|
if (slave != dev->caps.function)
|
||||||
memset(inbox->buf, 0, 256);
|
memset(inbox->buf, 0, 256);
|
||||||
if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
|
if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
|
||||||
*(u8 *) inbox->buf = !!reset_qkey_viols << 6;
|
*(u8 *) inbox->buf |= !!reset_qkey_viols << 6;
|
||||||
((__be32 *) inbox->buf)[2] = agg_cap_mask;
|
((__be32 *) inbox->buf)[2] = agg_cap_mask;
|
||||||
} else {
|
} else {
|
||||||
((u8 *) inbox->buf)[3] = !!reset_qkey_viols;
|
((u8 *) inbox->buf)[3] |= !!reset_qkey_viols;
|
||||||
((__be32 *) inbox->buf)[1] = agg_cap_mask;
|
((__be32 *) inbox->buf)[1] = agg_cap_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue