|
@@ -142,7 +142,8 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
|
|
[13] = "Large cache line (>64B) EQE stride support",
|
|
[13] = "Large cache line (>64B) EQE stride support",
|
|
[14] = "Ethernet protocol control support",
|
|
[14] = "Ethernet protocol control support",
|
|
[15] = "Ethernet Backplane autoneg support",
|
|
[15] = "Ethernet Backplane autoneg support",
|
|
- [16] = "CONFIG DEV support"
|
|
|
|
|
|
+ [16] = "CONFIG DEV support",
|
|
|
|
+ [17] = "Asymmetric EQs support"
|
|
};
|
|
};
|
|
int i;
|
|
int i;
|
|
|
|
|
|
@@ -200,7 +201,6 @@ int mlx4_QUERY_FUNC(struct mlx4_dev *dev, struct mlx4_func *func, int slave)
|
|
outbox = mailbox->buf;
|
|
outbox = mailbox->buf;
|
|
|
|
|
|
in_modifier = slave;
|
|
in_modifier = slave;
|
|
- mlx4_dbg(dev, "%s for VF %d\n", __func__, in_modifier);
|
|
|
|
|
|
|
|
err = mlx4_cmd_box(dev, 0, mailbox->dma, in_modifier, 0,
|
|
err = mlx4_cmd_box(dev, 0, mailbox->dma, in_modifier, 0,
|
|
MLX4_CMD_QUERY_FUNC,
|
|
MLX4_CMD_QUERY_FUNC,
|
|
@@ -243,6 +243,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
u8 field, port;
|
|
u8 field, port;
|
|
u32 size, proxy_qp, qkey;
|
|
u32 size, proxy_qp, qkey;
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
+ struct mlx4_func func;
|
|
|
|
|
|
#define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0
|
|
#define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0
|
|
#define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1
|
|
#define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1
|
|
@@ -287,6 +288,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
#define QUERY_FUNC_CAP_VF_ENABLE_QP0 0x08
|
|
#define QUERY_FUNC_CAP_VF_ENABLE_QP0 0x08
|
|
|
|
|
|
#define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80
|
|
#define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80
|
|
|
|
+#define QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS (1 << 31)
|
|
|
|
|
|
if (vhcr->op_modifier == 1) {
|
|
if (vhcr->op_modifier == 1) {
|
|
struct mlx4_active_ports actv_ports =
|
|
struct mlx4_active_ports actv_ports =
|
|
@@ -365,11 +367,24 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
size = dev->caps.num_cqs;
|
|
size = dev->caps.num_cqs;
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_CQ_QUOTA_OFFSET_DEP);
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_CQ_QUOTA_OFFSET_DEP);
|
|
|
|
|
|
- size = dev->caps.num_eqs;
|
|
|
|
- MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MAX_EQ_OFFSET);
|
|
|
|
-
|
|
|
|
- size = dev->caps.reserved_eqs;
|
|
|
|
- MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_RESERVED_EQ_OFFSET);
|
|
|
|
|
|
+ if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SYS_EQS) ||
|
|
|
|
+ mlx4_QUERY_FUNC(dev, &func, slave)) {
|
|
|
|
+ size = vhcr->in_modifier &
|
|
|
|
+ QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS ?
|
|
|
|
+ dev->caps.num_eqs :
|
|
|
|
+ rounddown_pow_of_two(dev->caps.num_eqs);
|
|
|
|
+ MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MAX_EQ_OFFSET);
|
|
|
|
+ size = dev->caps.reserved_eqs;
|
|
|
|
+ MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_RESERVED_EQ_OFFSET);
|
|
|
|
+ } else {
|
|
|
|
+ size = vhcr->in_modifier &
|
|
|
|
+ QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS ?
|
|
|
|
+ func.max_eq :
|
|
|
|
+ rounddown_pow_of_two(func.max_eq);
|
|
|
|
+ MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MAX_EQ_OFFSET);
|
|
|
|
+ size = func.rsvd_eqs;
|
|
|
|
+ MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_RESERVED_EQ_OFFSET);
|
|
|
|
+ }
|
|
|
|
|
|
size = priv->mfunc.master.res_tracker.res_alloc[RES_MPT].quota[slave];
|
|
size = priv->mfunc.master.res_tracker.res_alloc[RES_MPT].quota[slave];
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MPT_QUOTA_OFFSET);
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MPT_QUOTA_OFFSET);
|
|
@@ -399,14 +414,17 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u8 gen_or_port,
|
|
u8 field, op_modifier;
|
|
u8 field, op_modifier;
|
|
u32 size, qkey;
|
|
u32 size, qkey;
|
|
int err = 0, quotas = 0;
|
|
int err = 0, quotas = 0;
|
|
|
|
+ u32 in_modifier;
|
|
|
|
|
|
op_modifier = !!gen_or_port; /* 0 = general, 1 = logical port */
|
|
op_modifier = !!gen_or_port; /* 0 = general, 1 = logical port */
|
|
|
|
+ in_modifier = op_modifier ? gen_or_port :
|
|
|
|
+ QUERY_FUNC_CAP_SUPPORTS_NON_POWER_OF_2_NUM_EQS;
|
|
|
|
|
|
mailbox = mlx4_alloc_cmd_mailbox(dev);
|
|
mailbox = mlx4_alloc_cmd_mailbox(dev);
|
|
if (IS_ERR(mailbox))
|
|
if (IS_ERR(mailbox))
|
|
return PTR_ERR(mailbox);
|
|
return PTR_ERR(mailbox);
|
|
|
|
|
|
- err = mlx4_cmd_box(dev, 0, mailbox->dma, gen_or_port, op_modifier,
|
|
|
|
|
|
+ err = mlx4_cmd_box(dev, 0, mailbox->dma, in_modifier, op_modifier,
|
|
MLX4_CMD_QUERY_FUNC_CAP,
|
|
MLX4_CMD_QUERY_FUNC_CAP,
|
|
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
|
|
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
|
|
if (err)
|
|
if (err)
|
|
@@ -578,6 +596,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
#define QUERY_DEV_CAP_MAX_MRW_SZ_OFFSET 0x21
|
|
#define QUERY_DEV_CAP_MAX_MRW_SZ_OFFSET 0x21
|
|
#define QUERY_DEV_CAP_RSVD_MRW_OFFSET 0x22
|
|
#define QUERY_DEV_CAP_RSVD_MRW_OFFSET 0x22
|
|
#define QUERY_DEV_CAP_MAX_MTT_SEG_OFFSET 0x23
|
|
#define QUERY_DEV_CAP_MAX_MTT_SEG_OFFSET 0x23
|
|
|
|
+#define QUERY_DEV_CAP_NUM_SYS_EQ_OFFSET 0x26
|
|
#define QUERY_DEV_CAP_MAX_AV_OFFSET 0x27
|
|
#define QUERY_DEV_CAP_MAX_AV_OFFSET 0x27
|
|
#define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29
|
|
#define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29
|
|
#define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b
|
|
#define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b
|
|
@@ -678,6 +697,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
dev_cap->reserved_mrws = 1 << (field & 0xf);
|
|
dev_cap->reserved_mrws = 1 << (field & 0xf);
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MTT_SEG_OFFSET);
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MTT_SEG_OFFSET);
|
|
dev_cap->max_mtt_seg = 1 << (field & 0x3f);
|
|
dev_cap->max_mtt_seg = 1 << (field & 0x3f);
|
|
|
|
+ MLX4_GET(size, outbox, QUERY_DEV_CAP_NUM_SYS_EQ_OFFSET);
|
|
|
|
+ dev_cap->num_sys_eqs = size & 0xfff;
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_REQ_QP_OFFSET);
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_REQ_QP_OFFSET);
|
|
dev_cap->max_requester_per_qp = 1 << (field & 0x3f);
|
|
dev_cap->max_requester_per_qp = 1 << (field & 0x3f);
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RES_QP_OFFSET);
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RES_QP_OFFSET);
|
|
@@ -905,8 +926,11 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
* we can't use any EQs whose doorbell falls on that page,
|
|
* we can't use any EQs whose doorbell falls on that page,
|
|
* even if the EQ itself isn't reserved.
|
|
* even if the EQ itself isn't reserved.
|
|
*/
|
|
*/
|
|
- dev_cap->reserved_eqs = max(dev_cap->reserved_uars * 4,
|
|
|
|
- dev_cap->reserved_eqs);
|
|
|
|
|
|
+ if (dev_cap->num_sys_eqs == 0)
|
|
|
|
+ dev_cap->reserved_eqs = max(dev_cap->reserved_uars * 4,
|
|
|
|
+ dev_cap->reserved_eqs);
|
|
|
|
+ else
|
|
|
|
+ dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_SYS_EQS;
|
|
|
|
|
|
mlx4_dbg(dev, "Max ICM size %lld MB\n",
|
|
mlx4_dbg(dev, "Max ICM size %lld MB\n",
|
|
(unsigned long long) dev_cap->max_icm_sz >> 20);
|
|
(unsigned long long) dev_cap->max_icm_sz >> 20);
|
|
@@ -916,8 +940,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
dev_cap->max_srqs, dev_cap->reserved_srqs, dev_cap->srq_entry_sz);
|
|
dev_cap->max_srqs, dev_cap->reserved_srqs, dev_cap->srq_entry_sz);
|
|
mlx4_dbg(dev, "Max CQs: %d, reserved CQs: %d, entry size: %d\n",
|
|
mlx4_dbg(dev, "Max CQs: %d, reserved CQs: %d, entry size: %d\n",
|
|
dev_cap->max_cqs, dev_cap->reserved_cqs, dev_cap->cqc_entry_sz);
|
|
dev_cap->max_cqs, dev_cap->reserved_cqs, dev_cap->cqc_entry_sz);
|
|
- mlx4_dbg(dev, "Max EQs: %d, reserved EQs: %d, entry size: %d\n",
|
|
|
|
- dev_cap->max_eqs, dev_cap->reserved_eqs, dev_cap->eqc_entry_sz);
|
|
|
|
|
|
+ mlx4_dbg(dev, "Num sys EQs: %d, max EQs: %d, reserved EQs: %d, entry size: %d\n",
|
|
|
|
+ dev_cap->num_sys_eqs, dev_cap->max_eqs, dev_cap->reserved_eqs,
|
|
|
|
+ dev_cap->eqc_entry_sz);
|
|
mlx4_dbg(dev, "reserved MPTs: %d, reserved MTTs: %d\n",
|
|
mlx4_dbg(dev, "reserved MPTs: %d, reserved MTTs: %d\n",
|
|
dev_cap->reserved_mrws, dev_cap->reserved_mtts);
|
|
dev_cap->reserved_mrws, dev_cap->reserved_mtts);
|
|
mlx4_dbg(dev, "Max PDs: %d, reserved PDs: %d, reserved UARs: %d\n",
|
|
mlx4_dbg(dev, "Max PDs: %d, reserved PDs: %d, reserved UARs: %d\n",
|
|
@@ -1463,6 +1488,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
|
|
#define INIT_HCA_AUXC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x50)
|
|
#define INIT_HCA_AUXC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x50)
|
|
#define INIT_HCA_EQC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x60)
|
|
#define INIT_HCA_EQC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x60)
|
|
#define INIT_HCA_LOG_EQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x67)
|
|
#define INIT_HCA_LOG_EQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x67)
|
|
|
|
+#define INIT_HCA_NUM_SYS_EQS_OFFSET (INIT_HCA_QPC_OFFSET + 0x6a)
|
|
#define INIT_HCA_RDMARC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x70)
|
|
#define INIT_HCA_RDMARC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x70)
|
|
#define INIT_HCA_LOG_RD_OFFSET (INIT_HCA_QPC_OFFSET + 0x77)
|
|
#define INIT_HCA_LOG_RD_OFFSET (INIT_HCA_QPC_OFFSET + 0x77)
|
|
#define INIT_HCA_MCAST_OFFSET 0x0c0
|
|
#define INIT_HCA_MCAST_OFFSET 0x0c0
|
|
@@ -1566,6 +1592,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
|
|
MLX4_PUT(inbox, param->auxc_base, INIT_HCA_AUXC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->auxc_base, INIT_HCA_AUXC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->eqc_base, INIT_HCA_EQC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->eqc_base, INIT_HCA_EQC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->log_num_eqs, INIT_HCA_LOG_EQ_OFFSET);
|
|
MLX4_PUT(inbox, param->log_num_eqs, INIT_HCA_LOG_EQ_OFFSET);
|
|
|
|
+ MLX4_PUT(inbox, param->num_sys_eqs, INIT_HCA_NUM_SYS_EQS_OFFSET);
|
|
MLX4_PUT(inbox, param->rdmarc_base, INIT_HCA_RDMARC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->rdmarc_base, INIT_HCA_RDMARC_BASE_OFFSET);
|
|
MLX4_PUT(inbox, param->log_rd_per_qp, INIT_HCA_LOG_RD_OFFSET);
|
|
MLX4_PUT(inbox, param->log_rd_per_qp, INIT_HCA_LOG_RD_OFFSET);
|
|
|
|
|
|
@@ -1676,6 +1703,7 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
|
|
MLX4_GET(param->auxc_base, outbox, INIT_HCA_AUXC_BASE_OFFSET);
|
|
MLX4_GET(param->auxc_base, outbox, INIT_HCA_AUXC_BASE_OFFSET);
|
|
MLX4_GET(param->eqc_base, outbox, INIT_HCA_EQC_BASE_OFFSET);
|
|
MLX4_GET(param->eqc_base, outbox, INIT_HCA_EQC_BASE_OFFSET);
|
|
MLX4_GET(param->log_num_eqs, outbox, INIT_HCA_LOG_EQ_OFFSET);
|
|
MLX4_GET(param->log_num_eqs, outbox, INIT_HCA_LOG_EQ_OFFSET);
|
|
|
|
+ MLX4_GET(param->num_sys_eqs, outbox, INIT_HCA_NUM_SYS_EQS_OFFSET);
|
|
MLX4_GET(param->rdmarc_base, outbox, INIT_HCA_RDMARC_BASE_OFFSET);
|
|
MLX4_GET(param->rdmarc_base, outbox, INIT_HCA_RDMARC_BASE_OFFSET);
|
|
MLX4_GET(param->log_rd_per_qp, outbox, INIT_HCA_LOG_RD_OFFSET);
|
|
MLX4_GET(param->log_rd_per_qp, outbox, INIT_HCA_LOG_RD_OFFSET);
|
|
|
|
|