net/mlx5_core: New device capabilities handling
- Query all supported types of dev caps on driver load. - Store the Cap data outbox per cap type into driver private data. - Introduce new Macros to access/dump stored caps (using the auto generated data types). - Obsolete SW representation of dev caps (no need for SW copy for each cap). - Modify IB driver to use new macros for checking caps. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Amir Vadai <amirv@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
e281682bf2
commit
938fe83c8d
@@ -59,6 +59,8 @@
|
||||
#define MLX5_FLD_SZ_BYTES(typ, fld) (__mlx5_bit_sz(typ, fld) / 8)
|
||||
#define MLX5_ST_SZ_BYTES(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 8)
|
||||
#define MLX5_ST_SZ_DW(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 32)
|
||||
#define MLX5_UN_SZ_BYTES(typ) (sizeof(union mlx5_ifc_##typ##_bits) / 8)
|
||||
#define MLX5_UN_SZ_DW(typ) (sizeof(union mlx5_ifc_##typ##_bits) / 32)
|
||||
#define MLX5_BYTE_OFF(typ, fld) (__mlx5_bit_off(typ, fld) / 8)
|
||||
#define MLX5_ADDR_OF(typ, p, fld) ((char *)(p) + MLX5_BYTE_OFF(typ, fld))
|
||||
|
||||
@@ -322,13 +324,6 @@ enum {
|
||||
MLX5_CAP_OFF_CMDIF_CSUM = 46,
|
||||
};
|
||||
|
||||
enum {
|
||||
HCA_CAP_OPMOD_GET_MAX = 0,
|
||||
HCA_CAP_OPMOD_GET_CUR = 1,
|
||||
HCA_CAP_OPMOD_GET_ODP_MAX = 4,
|
||||
HCA_CAP_OPMOD_GET_ODP_CUR = 5
|
||||
};
|
||||
|
||||
struct mlx5_inbox_hdr {
|
||||
__be16 opcode;
|
||||
u8 rsvd[4];
|
||||
@@ -1101,4 +1096,61 @@ enum {
|
||||
MLX5_RQC_RQ_TYPE_MEMORY_RQ_RPM = 0x1,
|
||||
};
|
||||
|
||||
/* MLX5 DEV CAPs */
|
||||
|
||||
/* TODO: EAT.ME */
|
||||
enum mlx5_cap_mode {
|
||||
HCA_CAP_OPMOD_GET_MAX = 0,
|
||||
HCA_CAP_OPMOD_GET_CUR = 1,
|
||||
};
|
||||
|
||||
enum mlx5_cap_type {
|
||||
MLX5_CAP_GENERAL = 0,
|
||||
MLX5_CAP_ETHERNET_OFFLOADS,
|
||||
MLX5_CAP_ODP,
|
||||
MLX5_CAP_ATOMIC,
|
||||
MLX5_CAP_ROCE,
|
||||
MLX5_CAP_IPOIB_OFFLOADS,
|
||||
MLX5_CAP_EOIB_OFFLOADS,
|
||||
MLX5_CAP_FLOW_TABLE,
|
||||
/* NUM OF CAP Types */
|
||||
MLX5_CAP_NUM
|
||||
};
|
||||
|
||||
/* GET Dev Caps macros */
|
||||
#define MLX5_CAP_GEN(mdev, cap) \
|
||||
MLX5_GET(cmd_hca_cap, mdev->hca_caps_cur[MLX5_CAP_GENERAL], cap)
|
||||
|
||||
#define MLX5_CAP_GEN_MAX(mdev, cap) \
|
||||
MLX5_GET(cmd_hca_cap, mdev->hca_caps_max[MLX5_CAP_GENERAL], cap)
|
||||
|
||||
#define MLX5_CAP_ETH(mdev, cap) \
|
||||
MLX5_GET(per_protocol_networking_offload_caps,\
|
||||
mdev->hca_caps_cur[MLX5_CAP_ETHERNET_OFFLOADS], cap)
|
||||
|
||||
#define MLX5_CAP_ETH_MAX(mdev, cap) \
|
||||
MLX5_GET(per_protocol_networking_offload_caps,\
|
||||
mdev->hca_caps_max[MLX5_CAP_ETHERNET_OFFLOADS], cap)
|
||||
|
||||
#define MLX5_CAP_ROCE(mdev, cap) \
|
||||
MLX5_GET(roce_cap, mdev->hca_caps_cur[MLX5_CAP_ROCE], cap)
|
||||
|
||||
#define MLX5_CAP_ROCE_MAX(mdev, cap) \
|
||||
MLX5_GET(roce_cap, mdev->hca_caps_max[MLX5_CAP_ROCE], cap)
|
||||
|
||||
#define MLX5_CAP_ATOMIC(mdev, cap) \
|
||||
MLX5_GET(atomic_caps, mdev->hca_caps_cur[MLX5_CAP_ATOMIC], cap)
|
||||
|
||||
#define MLX5_CAP_ATOMIC_MAX(mdev, cap) \
|
||||
MLX5_GET(atomic_caps, mdev->hca_caps_max[MLX5_CAP_ATOMIC], cap)
|
||||
|
||||
#define MLX5_CAP_FLOWTABLE(mdev, cap) \
|
||||
MLX5_GET(flow_table_nic_cap, mdev->hca_caps_cur[MLX5_CAP_FLOW_TABLE], cap)
|
||||
|
||||
#define MLX5_CAP_FLOWTABLE_MAX(mdev, cap) \
|
||||
MLX5_GET(flow_table_nic_cap, mdev->hca_caps_max[MLX5_CAP_FLOW_TABLE], cap)
|
||||
|
||||
#define MLX5_CAP_ODP(mdev, cap)\
|
||||
MLX5_GET(odp_cap, mdev->hca_caps_cur[MLX5_CAP_ODP], cap)
|
||||
|
||||
#endif /* MLX5_DEVICE_H */
|
||||
|
@@ -268,55 +268,7 @@ struct mlx5_cmd {
|
||||
struct mlx5_port_caps {
|
||||
int gid_table_len;
|
||||
int pkey_table_len;
|
||||
};
|
||||
|
||||
struct mlx5_general_caps {
|
||||
u8 log_max_eq;
|
||||
u8 log_max_cq;
|
||||
u8 log_max_qp;
|
||||
u8 log_max_mkey;
|
||||
u8 log_max_pd;
|
||||
u8 log_max_srq;
|
||||
u8 log_max_mrw_sz;
|
||||
u8 log_max_bsf_list_size;
|
||||
u8 log_max_klm_list_size;
|
||||
u32 max_cqes;
|
||||
int max_wqes;
|
||||
u32 max_eqes;
|
||||
u32 max_indirection;
|
||||
int max_sq_desc_sz;
|
||||
int max_rq_desc_sz;
|
||||
int max_dc_sq_desc_sz;
|
||||
u64 flags;
|
||||
u16 stat_rate_support;
|
||||
int log_max_msg;
|
||||
int num_ports;
|
||||
u8 log_max_ra_res_qp;
|
||||
u8 log_max_ra_req_qp;
|
||||
int max_srq_wqes;
|
||||
int bf_reg_size;
|
||||
int bf_regs_per_page;
|
||||
struct mlx5_port_caps port[MLX5_MAX_PORTS];
|
||||
u8 ext_port_cap[MLX5_MAX_PORTS];
|
||||
int max_vf;
|
||||
u32 reserved_lkey;
|
||||
u8 local_ca_ack_delay;
|
||||
u8 log_max_mcg;
|
||||
u32 max_qp_mcg;
|
||||
int min_page_sz;
|
||||
int pd_cap;
|
||||
u32 max_qp_counters;
|
||||
u32 pkey_table_size;
|
||||
u8 log_max_ra_req_dc;
|
||||
u8 log_max_ra_res_dc;
|
||||
u32 uar_sz;
|
||||
u8 min_log_pg_sz;
|
||||
u8 log_max_xrcd;
|
||||
u16 log_uar_page_sz;
|
||||
};
|
||||
|
||||
struct mlx5_caps {
|
||||
struct mlx5_general_caps gen;
|
||||
u8 ext_port_cap;
|
||||
};
|
||||
|
||||
struct mlx5_cmd_mailbox {
|
||||
@@ -521,7 +473,9 @@ struct mlx5_core_dev {
|
||||
u8 rev_id;
|
||||
char board_id[MLX5_BOARD_ID_LEN];
|
||||
struct mlx5_cmd cmd;
|
||||
struct mlx5_caps caps;
|
||||
struct mlx5_port_caps port_caps[MLX5_MAX_PORTS];
|
||||
u32 hca_caps_cur[MLX5_CAP_NUM][MLX5_UN_SZ_DW(hca_cap_union)];
|
||||
u32 hca_caps_max[MLX5_CAP_NUM][MLX5_UN_SZ_DW(hca_cap_union)];
|
||||
phys_addr_t iseg_base;
|
||||
struct mlx5_init_seg __iomem *iseg;
|
||||
void (*event) (struct mlx5_core_dev *dev,
|
||||
@@ -651,8 +605,8 @@ void mlx5_cmd_use_events(struct mlx5_core_dev *dev);
|
||||
void mlx5_cmd_use_polling(struct mlx5_core_dev *dev);
|
||||
int mlx5_cmd_status_to_err(struct mlx5_outbox_hdr *hdr);
|
||||
int mlx5_cmd_status_to_err_v2(void *ptr);
|
||||
int mlx5_core_get_caps(struct mlx5_core_dev *dev, struct mlx5_caps *caps,
|
||||
u16 opmod);
|
||||
int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type,
|
||||
enum mlx5_cap_mode cap_mode);
|
||||
int mlx5_cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
|
||||
int out_size);
|
||||
int mlx5_cmd_exec_cb(struct mlx5_core_dev *dev, void *in, int in_size,
|
||||
|
Reference in New Issue
Block a user