Skip to content

Commit

Permalink
RDMA/efa: Report link speed according to device attributes
Browse files Browse the repository at this point in the history
Set port link speed and width based on max bandwidth acquired from the
device instead of using constant 100 Gbps. Use a default value in case
the device didn't set the field.

Reviewed-by: Daniel Kranzdorf <dkkranzd@amazon.com>
Reviewed-by: Firas Jahjah <firasj@amazon.com>
Signed-off-by: Michael Margolin <mrgolin@amazon.com>
Link: https://patch.msgid.link/20241030093006.21352-1-mrgolin@amazon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
  • Loading branch information
Michael Margolin authored and Leon Romanovsky committed Oct 30, 2024
1 parent 808ca6d commit 1103579
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 2 deletions.
9 changes: 9 additions & 0 deletions drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,15 @@ struct efa_admin_feature_device_attr_desc {

/* Unique global ID for an EFA device */
u64 guid;

/* The device maximum link speed in Gbit/sec */
u16 max_link_speed_gbps;

/* MBZ */
u16 reserved0;

/* MBZ */
u32 reserved1;
};

struct efa_admin_feature_queue_attr_desc {
Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/hw/efa/efa_com_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,7 @@ int efa_com_get_device_attr(struct efa_com_dev *edev,
result->max_rdma_size = resp.u.device_attr.max_rdma_size;
result->device_caps = resp.u.device_attr.device_caps;
result->guid = resp.u.device_attr.guid;
result->max_link_speed_gbps = resp.u.device_attr.max_link_speed_gbps;

if (result->admin_api_version < 1) {
ibdev_err_ratelimited(
Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/hw/efa/efa_com_cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ struct efa_com_get_device_attr_result {
u16 max_wr_rdma_sge;
u16 max_tx_batch;
u16 min_sq_depth;
u16 max_link_speed_gbps;
u8 db_bar;
};

Expand Down
45 changes: 43 additions & 2 deletions drivers/infiniband/hw/efa/efa_verbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ static const struct rdma_stat_desc efa_port_stats_descs[] = {
EFA_DEFINE_PORT_STATS(EFA_STATS_STR)
};

#define EFA_DEFAULT_LINK_SPEED_GBPS 100

#define EFA_CHUNK_PAYLOAD_SHIFT 12
#define EFA_CHUNK_PAYLOAD_SIZE BIT(EFA_CHUNK_PAYLOAD_SHIFT)
#define EFA_CHUNK_PAYLOAD_PTR_SIZE 8
Expand Down Expand Up @@ -277,19 +279,58 @@ int efa_query_device(struct ib_device *ibdev,
return 0;
}

static void efa_link_gbps_to_speed_and_width(u16 gbps,
enum ib_port_speed *speed,
enum ib_port_width *width)
{
if (gbps >= 400) {
*width = IB_WIDTH_8X;
*speed = IB_SPEED_HDR;
} else if (gbps >= 200) {
*width = IB_WIDTH_4X;
*speed = IB_SPEED_HDR;
} else if (gbps >= 120) {
*width = IB_WIDTH_12X;
*speed = IB_SPEED_FDR10;
} else if (gbps >= 100) {
*width = IB_WIDTH_4X;
*speed = IB_SPEED_EDR;
} else if (gbps >= 60) {
*width = IB_WIDTH_12X;
*speed = IB_SPEED_DDR;
} else if (gbps >= 50) {
*width = IB_WIDTH_1X;
*speed = IB_SPEED_HDR;
} else if (gbps >= 40) {
*width = IB_WIDTH_4X;
*speed = IB_SPEED_FDR10;
} else if (gbps >= 30) {
*width = IB_WIDTH_12X;
*speed = IB_SPEED_SDR;
} else {
*width = IB_WIDTH_1X;
*speed = IB_SPEED_EDR;
}
}

int efa_query_port(struct ib_device *ibdev, u32 port,
struct ib_port_attr *props)
{
struct efa_dev *dev = to_edev(ibdev);
enum ib_port_speed link_speed;
enum ib_port_width link_width;
u16 link_gbps;

props->lmc = 1;

props->state = IB_PORT_ACTIVE;
props->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
props->gid_tbl_len = 1;
props->pkey_tbl_len = 1;
props->active_speed = IB_SPEED_EDR;
props->active_width = IB_WIDTH_4X;
link_gbps = dev->dev_attr.max_link_speed_gbps ?: EFA_DEFAULT_LINK_SPEED_GBPS;
efa_link_gbps_to_speed_and_width(link_gbps, &link_speed, &link_width);
props->active_speed = link_speed;
props->active_width = link_width;
props->max_mtu = ib_mtu_int_to_enum(dev->dev_attr.mtu);
props->active_mtu = ib_mtu_int_to_enum(dev->dev_attr.mtu);
props->max_msg_sz = dev->dev_attr.mtu;
Expand Down

0 comments on commit 1103579

Please sign in to comment.