Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/mlx4/mlx4_core/mlx4_fw.c
Show First 20 Lines • Show All 173 Lines • ▼ Show 20 Lines | #define MOD_STAT_CFG_PG_SZ_OFFSET 0x003 | ||||
err = mlx4_cmd(dev, mailbox->dma, 0, 0, MLX4_CMD_MOD_STAT_CFG, | err = mlx4_cmd(dev, mailbox->dma, 0, 0, MLX4_CMD_MOD_STAT_CFG, | ||||
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE); | MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE); | ||||
mlx4_free_cmd_mailbox(dev, mailbox); | mlx4_free_cmd_mailbox(dev, mailbox); | ||||
return err; | return err; | ||||
} | } | ||||
int mlx4_QUERY_FUNC(struct mlx4_dev *dev, struct mlx4_func *func, int slave) | |||||
{ | |||||
struct mlx4_cmd_mailbox *mailbox; | |||||
u32 *outbox; | |||||
u8 in_modifier; | |||||
u8 field; | |||||
u16 field16; | |||||
int err; | |||||
#define QUERY_FUNC_BUS_OFFSET 0x00 | |||||
#define QUERY_FUNC_DEVICE_OFFSET 0x01 | |||||
#define QUERY_FUNC_FUNCTION_OFFSET 0x01 | |||||
#define QUERY_FUNC_PHYSICAL_FUNCTION_OFFSET 0x03 | |||||
#define QUERY_FUNC_RSVD_EQS_OFFSET 0x04 | |||||
#define QUERY_FUNC_MAX_EQ_OFFSET 0x06 | |||||
#define QUERY_FUNC_RSVD_UARS_OFFSET 0x0b | |||||
mailbox = mlx4_alloc_cmd_mailbox(dev); | |||||
if (IS_ERR(mailbox)) | |||||
return PTR_ERR(mailbox); | |||||
outbox = mailbox->buf; | |||||
in_modifier = slave; | |||||
err = mlx4_cmd_box(dev, 0, mailbox->dma, in_modifier, 0, | |||||
MLX4_CMD_QUERY_FUNC, | |||||
MLX4_CMD_TIME_CLASS_A, | |||||
MLX4_CMD_NATIVE); | |||||
if (err) | |||||
goto out; | |||||
MLX4_GET(field, outbox, QUERY_FUNC_BUS_OFFSET); | |||||
func->bus = field & 0xf; | |||||
MLX4_GET(field, outbox, QUERY_FUNC_DEVICE_OFFSET); | |||||
func->device = field & 0xf1; | |||||
MLX4_GET(field, outbox, QUERY_FUNC_FUNCTION_OFFSET); | |||||
func->function = field & 0x7; | |||||
MLX4_GET(field, outbox, QUERY_FUNC_PHYSICAL_FUNCTION_OFFSET); | |||||
func->physical_function = field & 0xf; | |||||
MLX4_GET(field16, outbox, QUERY_FUNC_RSVD_EQS_OFFSET); | |||||
func->rsvd_eqs = field16 & 0xffff; | |||||
MLX4_GET(field16, outbox, QUERY_FUNC_MAX_EQ_OFFSET); | |||||
func->max_eq = field16 & 0xffff; | |||||
MLX4_GET(field, outbox, QUERY_FUNC_RSVD_UARS_OFFSET); | |||||
func->rsvd_uars = field & 0x0f; | |||||
mlx4_dbg(dev, "Bus: %d, Device: %d, Function: %d, Physical function: %d, Max EQs: %d, Reserved EQs: %d, Reserved UARs: %d\n", | |||||
func->bus, func->device, func->function, func->physical_function, | |||||
func->max_eq, func->rsvd_eqs, func->rsvd_uars); | |||||
out: | |||||
mlx4_free_cmd_mailbox(dev, mailbox); | |||||
return err; | |||||
} | |||||
int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave, | int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave, | ||||
struct mlx4_vhcr *vhcr, | struct mlx4_vhcr *vhcr, | ||||
struct mlx4_cmd_mailbox *inbox, | struct mlx4_cmd_mailbox *inbox, | ||||
struct mlx4_cmd_mailbox *outbox, | struct mlx4_cmd_mailbox *outbox, | ||||
struct mlx4_cmd_info *cmd) | struct mlx4_cmd_info *cmd) | ||||
{ | { | ||||
struct mlx4_priv *priv = mlx4_priv(dev); | struct mlx4_priv *priv = mlx4_priv(dev); | ||||
u8 field, port; | u8 field, port; | ||||
u32 size; | u32 size; | ||||
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 | ||||
#define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4 | #define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4 | ||||
#define QUERY_FUNC_CAP_FMR_OFFSET 0x8 | #define QUERY_FUNC_CAP_FMR_OFFSET 0x8 | ||||
#define QUERY_FUNC_CAP_QP_QUOTA_OFFSET_DEP 0x10 | #define QUERY_FUNC_CAP_QP_QUOTA_OFFSET_DEP 0x10 | ||||
#define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET_DEP 0x14 | #define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET_DEP 0x14 | ||||
#define QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET_DEP 0x18 | #define QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET_DEP 0x18 | ||||
Show All 26 Lines | |||||
#define QUERY_FUNC_CAP_QP1_TUNNEL 0x18 | #define QUERY_FUNC_CAP_QP1_TUNNEL 0x18 | ||||
#define QUERY_FUNC_CAP_QP1_PROXY 0x1c | #define QUERY_FUNC_CAP_QP1_PROXY 0x1c | ||||
#define QUERY_FUNC_CAP_ETH_PROPS_FORCE_MAC 0x40 | #define QUERY_FUNC_CAP_ETH_PROPS_FORCE_MAC 0x40 | ||||
#define QUERY_FUNC_CAP_ETH_PROPS_FORCE_VLAN 0x80 | #define QUERY_FUNC_CAP_ETH_PROPS_FORCE_VLAN 0x80 | ||||
#define QUERY_FUNC_CAP_PROPS_DEF_COUNTER 0x20 | #define QUERY_FUNC_CAP_PROPS_DEF_COUNTER 0x20 | ||||
#define QUERY_FUNC_CAP_RDMA_PROPS_FORCE_PHY_WQE_GID 0x80 | #define QUERY_FUNC_CAP_RDMA_PROPS_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) { | ||||
port = vhcr->in_modifier; /* phys-port = logical-port */ | port = vhcr->in_modifier; /* phys-port = logical-port */ | ||||
MLX4_PUT(outbox->buf, port, QUERY_FUNC_CAP_PHYS_PORT_OFFSET); | MLX4_PUT(outbox->buf, port, QUERY_FUNC_CAP_PHYS_PORT_OFFSET); | ||||
field = 0; | field = 0; | ||||
/* ensure that phy_wqe_gid bit is not set */ | /* ensure that phy_wqe_gid bit is not set */ | ||||
MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS0_OFFSET); | MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS0_OFFSET); | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | if (vhcr->op_modifier == 1) { | ||||
size = dev->caps.num_srqs; | size = dev->caps.num_srqs; | ||||
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET_DEP); | MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET_DEP); | ||||
size = priv->mfunc.master.res_tracker.res_alloc[RES_CQ].quota[slave]; | size = priv->mfunc.master.res_tracker.res_alloc[RES_CQ].quota[slave]; | ||||
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_CQ_QUOTA_OFFSET); | MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_CQ_QUOTA_OFFSET); | ||||
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; | 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); | MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MAX_EQ_OFFSET); | ||||
size = dev->caps.reserved_eqs; | size = dev->caps.reserved_eqs; | ||||
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_RESERVED_EQ_OFFSET); | 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); | ||||
size = dev->caps.num_mpts; | size = dev->caps.num_mpts; | ||||
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MPT_QUOTA_OFFSET_DEP); | MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MPT_QUOTA_OFFSET_DEP); | ||||
size = priv->mfunc.master.res_tracker.res_alloc[RES_MTT].quota[slave]; | size = priv->mfunc.master.res_tracker.res_alloc[RES_MTT].quota[slave]; | ||||
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MTT_QUOTA_OFFSET); | MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_MTT_QUOTA_OFFSET); | ||||
Show All 13 Lines | |||||
int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u32 gen_or_port, | int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u32 gen_or_port, | ||||
struct mlx4_func_cap *func_cap) | struct mlx4_func_cap *func_cap) | ||||
{ | { | ||||
struct mlx4_cmd_mailbox *mailbox; | struct mlx4_cmd_mailbox *mailbox; | ||||
u32 *outbox; | u32 *outbox; | ||||
u8 field, op_modifier; | u8 field, op_modifier; | ||||
u32 size; | u32 size; | ||||
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) | ||||
goto out; | goto out; | ||||
outbox = mailbox->buf; | outbox = mailbox->buf; | ||||
if (!op_modifier) { | if (!op_modifier) { | ||||
▲ Show 20 Lines • Show All 153 Lines • ▼ Show 20 Lines | |||||
#define QUERY_DEV_CAP_MAX_CQ_OFFSET 0x1b | #define QUERY_DEV_CAP_MAX_CQ_OFFSET 0x1b | ||||
#define QUERY_DEV_CAP_MAX_MPT_OFFSET 0x1d | #define QUERY_DEV_CAP_MAX_MPT_OFFSET 0x1d | ||||
#define QUERY_DEV_CAP_RSVD_EQ_OFFSET 0x1e | #define QUERY_DEV_CAP_RSVD_EQ_OFFSET 0x1e | ||||
#define QUERY_DEV_CAP_MAX_EQ_OFFSET 0x1f | #define QUERY_DEV_CAP_MAX_EQ_OFFSET 0x1f | ||||
#define QUERY_DEV_CAP_RSVD_MTT_OFFSET 0x20 | #define QUERY_DEV_CAP_RSVD_MTT_OFFSET 0x20 | ||||
#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 | ||||
#define QUERY_DEV_CAP_MAX_GSO_OFFSET 0x2d | #define QUERY_DEV_CAP_MAX_GSO_OFFSET 0x2d | ||||
#define QUERY_DEV_CAP_RSS_OFFSET 0x2e | #define QUERY_DEV_CAP_RSS_OFFSET 0x2e | ||||
#define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f | #define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f | ||||
#define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33 | #define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33 | ||||
#define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35 | #define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35 | ||||
▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | #define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0 | ||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MTT_OFFSET); | MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MTT_OFFSET); | ||||
dev_cap->reserved_mtts = 1 << (field >> 4); | dev_cap->reserved_mtts = 1 << (field >> 4); | ||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MRW_SZ_OFFSET); | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MRW_SZ_OFFSET); | ||||
dev_cap->max_mrw_sz = 1 << field; | dev_cap->max_mrw_sz = 1 << field; | ||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MRW_OFFSET); | MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MRW_OFFSET); | ||||
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); | ||||
dev_cap->max_responder_per_qp = 1 << (field & 0x3f); | dev_cap->max_responder_per_qp = 1 << (field & 0x3f); | ||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_GSO_OFFSET); | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_GSO_OFFSET); | ||||
field &= 0x1f; | field &= 0x1f; | ||||
if (!field) | if (!field) | ||||
dev_cap->max_gso_sz = 0; | dev_cap->max_gso_sz = 0; | ||||
▲ Show 20 Lines • Show All 210 Lines • ▼ Show 20 Lines | #define QUERY_PORT_TRANS_CODE_OFFSET 0x20 | ||||
mlx4_dbg(dev, "Base MM extensions: flags %08x, rsvd L_Key %08x\n", | mlx4_dbg(dev, "Base MM extensions: flags %08x, rsvd L_Key %08x\n", | ||||
dev_cap->bmme_flags, dev_cap->reserved_lkey); | dev_cap->bmme_flags, dev_cap->reserved_lkey); | ||||
/* | /* | ||||
* Each UAR has 4 EQ doorbells; so if a UAR is reserved, then | * Each UAR has 4 EQ doorbells; so if a UAR is reserved, then | ||||
* 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. | ||||
*/ | */ | ||||
if (dev_cap->num_sys_eqs == 0) | |||||
dev_cap->reserved_eqs = max(dev_cap->reserved_uars * 4, | dev_cap->reserved_eqs = max(dev_cap->reserved_uars * 4, | ||||
dev_cap->reserved_eqs); | 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); | ||||
mlx4_dbg(dev, "Max QPs: %d, reserved QPs: %d, entry size: %d\n", | mlx4_dbg(dev, "Max QPs: %d, reserved QPs: %d, entry size: %d\n", | ||||
dev_cap->max_qps, dev_cap->reserved_qps, dev_cap->qpc_entry_sz); | dev_cap->max_qps, dev_cap->reserved_qps, dev_cap->qpc_entry_sz); | ||||
mlx4_dbg(dev, "Max SRQs: %d, reserved SRQs: %d, entry size: %d\n", | mlx4_dbg(dev, "Max SRQs: %d, reserved SRQs: %d, entry size: %d\n", | ||||
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", | mlx4_dbg(dev, "Num sys EQs: %d, max EQs: %d, reserved EQs: %d, entry size: %d\n", | ||||
dev_cap->max_eqs, dev_cap->reserved_eqs, dev_cap->eqc_entry_sz); | 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", | ||||
dev_cap->max_pds, dev_cap->reserved_pds, dev_cap->reserved_uars); | dev_cap->max_pds, dev_cap->reserved_pds, dev_cap->reserved_uars); | ||||
mlx4_dbg(dev, "Max QP/MCG: %d, reserved MGMs: %d\n", | mlx4_dbg(dev, "Max QP/MCG: %d, reserved MGMs: %d\n", | ||||
dev_cap->max_pds, dev_cap->reserved_mgms); | dev_cap->max_pds, dev_cap->reserved_mgms); | ||||
mlx4_dbg(dev, "Max CQEs: %d, max WQEs: %d, max SRQ WQEs: %d\n", | mlx4_dbg(dev, "Max CQEs: %d, max WQEs: %d, max SRQ WQEs: %d\n", | ||||
dev_cap->max_cq_sz, dev_cap->max_qp_sz, dev_cap->max_srq_sz); | dev_cap->max_cq_sz, dev_cap->max_qp_sz, dev_cap->max_srq_sz); | ||||
▲ Show 20 Lines • Show All 485 Lines • ▼ Show 20 Lines | |||||
#define INIT_HCA_LOG_SRQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x2f) | #define INIT_HCA_LOG_SRQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x2f) | ||||
#define INIT_HCA_CQC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x30) | #define INIT_HCA_CQC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x30) | ||||
#define INIT_HCA_LOG_CQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x37) | #define INIT_HCA_LOG_CQ_OFFSET (INIT_HCA_QPC_OFFSET + 0x37) | ||||
#define INIT_HCA_EQE_CQE_OFFSETS (INIT_HCA_QPC_OFFSET + 0x38) | #define INIT_HCA_EQE_CQE_OFFSETS (INIT_HCA_QPC_OFFSET + 0x38) | ||||
#define INIT_HCA_ALTC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x40) | #define INIT_HCA_ALTC_BASE_OFFSET (INIT_HCA_QPC_OFFSET + 0x40) | ||||
#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 | ||||
#define INIT_HCA_MC_BASE_OFFSET (INIT_HCA_MCAST_OFFSET + 0x00) | #define INIT_HCA_MC_BASE_OFFSET (INIT_HCA_MCAST_OFFSET + 0x00) | ||||
#define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12) | #define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12) | ||||
#define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x16) | #define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x16) | ||||
#define INIT_HCA_UC_STEERING_OFFSET (INIT_HCA_MCAST_OFFSET + 0x18) | #define INIT_HCA_UC_STEERING_OFFSET (INIT_HCA_MCAST_OFFSET + 0x18) | ||||
#define INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b) | #define INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b) | ||||
▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | #endif | ||||
MLX4_PUT(inbox, param->srqc_base, INIT_HCA_SRQC_BASE_OFFSET); | MLX4_PUT(inbox, param->srqc_base, INIT_HCA_SRQC_BASE_OFFSET); | ||||
MLX4_PUT(inbox, param->log_num_srqs, INIT_HCA_LOG_SRQ_OFFSET); | MLX4_PUT(inbox, param->log_num_srqs, INIT_HCA_LOG_SRQ_OFFSET); | ||||
MLX4_PUT(inbox, param->cqc_base, INIT_HCA_CQC_BASE_OFFSET); | MLX4_PUT(inbox, param->cqc_base, INIT_HCA_CQC_BASE_OFFSET); | ||||
MLX4_PUT(inbox, param->log_num_cqs, INIT_HCA_LOG_CQ_OFFSET); | MLX4_PUT(inbox, param->log_num_cqs, INIT_HCA_LOG_CQ_OFFSET); | ||||
MLX4_PUT(inbox, param->altc_base, INIT_HCA_ALTC_BASE_OFFSET); | MLX4_PUT(inbox, param->altc_base, INIT_HCA_ALTC_BASE_OFFSET); | ||||
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); | ||||
/* steering attributes */ | /* steering attributes */ | ||||
if (dev->caps.steering_mode == | if (dev->caps.steering_mode == | ||||
MLX4_STEERING_MODE_DEVICE_MANAGED) { | MLX4_STEERING_MODE_DEVICE_MANAGED) { | ||||
*(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= | *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= | ||||
cpu_to_be32(1 << | cpu_to_be32(1 << | ||||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | #define QUERY_HCA_CORE_CLOCK_OFFSET 0x0c | ||||
MLX4_GET(param->srqc_base, outbox, INIT_HCA_SRQC_BASE_OFFSET); | MLX4_GET(param->srqc_base, outbox, INIT_HCA_SRQC_BASE_OFFSET); | ||||
MLX4_GET(param->log_num_srqs, outbox, INIT_HCA_LOG_SRQ_OFFSET); | MLX4_GET(param->log_num_srqs, outbox, INIT_HCA_LOG_SRQ_OFFSET); | ||||
MLX4_GET(param->cqc_base, outbox, INIT_HCA_CQC_BASE_OFFSET); | MLX4_GET(param->cqc_base, outbox, INIT_HCA_CQC_BASE_OFFSET); | ||||
MLX4_GET(param->log_num_cqs, outbox, INIT_HCA_LOG_CQ_OFFSET); | MLX4_GET(param->log_num_cqs, outbox, INIT_HCA_LOG_CQ_OFFSET); | ||||
MLX4_GET(param->altc_base, outbox, INIT_HCA_ALTC_BASE_OFFSET); | MLX4_GET(param->altc_base, outbox, INIT_HCA_ALTC_BASE_OFFSET); | ||||
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); | ||||
MLX4_GET(dword_field, outbox, INIT_HCA_FLAGS_OFFSET); | MLX4_GET(dword_field, outbox, INIT_HCA_FLAGS_OFFSET); | ||||
if (dword_field & (1 << INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN)) { | if (dword_field & (1 << INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN)) { | ||||
param->steering_mode = MLX4_STEERING_MODE_DEVICE_MANAGED; | param->steering_mode = MLX4_STEERING_MODE_DEVICE_MANAGED; | ||||
} else { | } else { | ||||
MLX4_GET(byte_field, outbox, INIT_HCA_UC_STEERING_OFFSET); | MLX4_GET(byte_field, outbox, INIT_HCA_UC_STEERING_OFFSET); | ||||
▲ Show 20 Lines • Show All 391 Lines • Show Last 20 Lines |