RDMA/erdma: Report atomic capacity when hardware supports atomic feature
authorCheng Xu <chengyou@linux.alibaba.com>
Mon, 7 Nov 2022 02:18:44 +0000 (10:18 +0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 7 Nov 2022 07:55:04 +0000 (09:55 +0200)
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>
drivers/infiniband/hw/erdma/erdma.h
drivers/infiniband/hw/erdma/erdma_hw.h
drivers/infiniband/hw/erdma/erdma_main.c
drivers/infiniband/hw/erdma/erdma_verbs.c

index 730783f..bb23d89 100644 (file)
@@ -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;
index 2a9a4c7..808e7ee 100644 (file)
@@ -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)
 
@@ -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 */
index 49778bb..e44b06f 100644 (file)
@@ -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;
index f3bf87f..d843ce1 100644 (file)
@@ -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)