Skip to content

Commit

Permalink
RDMA/erdma: Report atomic capacity when hardware supports atomic feature
Browse files Browse the repository at this point in the history
Introduce "capacity flags" field at where hardware put all zeros originally
in "query device" response. Using this field, hardware can report atomic
feature if supports.

Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Link: https://lore.kernel.org/r/20221107021845.44598-3-chengyou@linux.alibaba.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
  • Loading branch information
Cheng Xu authored and Leon Romanovsky committed Nov 7, 2022
1 parent ece43fa commit 71c6925
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/infiniband/hw/erdma/erdma.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ struct erdma_devattr {
u32 fw_version;

unsigned char peer_addr[ETH_ALEN];
unsigned long cap_flags;

int numa_node;
enum erdma_cc_alg cc;
Expand Down
5 changes: 5 additions & 0 deletions drivers/infiniband/hw/erdma/erdma_hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ struct erdma_cmdq_destroy_qp_req {

/* cap qword 0 definition */
#define ERDMA_CMD_DEV_CAP_MAX_CQE_MASK GENMASK_ULL(47, 40)
#define ERDMA_CMD_DEV_CAP_FLAGS_MASK GENMASK_ULL(31, 24)
#define ERDMA_CMD_DEV_CAP_MAX_RECV_WR_MASK GENMASK_ULL(23, 16)
#define ERDMA_CMD_DEV_CAP_MAX_MR_SIZE_MASK GENMASK_ULL(7, 0)

Expand All @@ -314,6 +315,10 @@ struct erdma_cmdq_destroy_qp_req {

#define ERDMA_NQP_PER_QBLOCK 1024

enum {
ERDMA_DEV_CAP_FLAGS_ATOMIC = 1 << 7,
};

#define ERDMA_CMD_INFO0_FW_VER_MASK GENMASK_ULL(31, 0)

/* CQE hdr */
Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/hw/erdma/erdma_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ static int erdma_dev_attrs_init(struct erdma_dev *dev)
dev->attrs.max_qp = ERDMA_NQP_PER_QBLOCK * ERDMA_GET_CAP(QBLOCK, cap1);
dev->attrs.max_mr = dev->attrs.max_qp << 1;
dev->attrs.max_cq = dev->attrs.max_qp << 1;
dev->attrs.cap_flags = ERDMA_GET_CAP(FLAGS, cap0);

dev->attrs.max_send_wr = ERDMA_MAX_SEND_WR;
dev->attrs.max_ord = ERDMA_MAX_ORD;
Expand Down
4 changes: 4 additions & 0 deletions drivers/infiniband/hw/erdma/erdma_verbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,10 @@ int erdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
attr->max_mw = dev->attrs.max_mw;
attr->max_fast_reg_page_list_len = ERDMA_MAX_FRMR_PA;
attr->page_size_cap = ERDMA_PAGE_SIZE_SUPPORT;

if (dev->attrs.cap_flags & ERDMA_DEV_CAP_FLAGS_ATOMIC)
attr->atomic_cap = IB_ATOMIC_GLOB;

attr->fw_ver = dev->attrs.fw_version;

if (dev->netdev)
Expand Down

0 comments on commit 71c6925

Please sign in to comment.