RDMA/bnxt_re: Doorbell changes
authorSelvin Xavier <selvin.xavier@broadcom.com>
Thu, 7 Dec 2023 10:47:39 +0000 (02:47 -0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 11 Dec 2023 07:56:29 +0000 (09:56 +0200)
Update the Doorbell routines to support the latest HW
definitions. Use common routine to prepare the Doorbell
key.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://lore.kernel.org/r/1701946060-13931-6-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/qplib_res.h

index 7e6d9074f900c5264614aeea2c949d14b300a15c..c228870eed297d405ea9849f4e8dfb1e35fd0928 100644 (file)
@@ -47,6 +47,9 @@ extern const struct bnxt_qplib_gid bnxt_qplib_gid_zero;
 #define CHIP_NUM_58818          0xd818
 #define CHIP_NUM_57608          0x1760
 
+#define BNXT_QPLIB_DBR_VALID           (0x1UL << 26)
+#define BNXT_QPLIB_DBR_EPOCH_SHIFT     24
+#define BNXT_QPLIB_DBR_TOGGLE_SHIFT    25
 
 struct bnxt_qplib_drv_modes {
        u8      wqe_mode;
@@ -200,6 +203,11 @@ enum bnxt_qplib_db_info_flags_mask {
        BNXT_QPLIB_FLAG_EPOCH_PROD_MASK         = 0x2UL,
 };
 
+enum bnxt_qplib_db_epoch_flag_shift {
+       BNXT_QPLIB_DB_EPOCH_CONS_SHIFT  = BNXT_QPLIB_DBR_EPOCH_SHIFT,
+       BNXT_QPLIB_DB_EPOCH_PROD_SHIFT  = (BNXT_QPLIB_DBR_EPOCH_SHIFT - 1),
+};
+
 /* Tables */
 struct bnxt_qplib_pd_tbl {
        unsigned long                   *tbl;
@@ -453,14 +461,27 @@ static inline void bnxt_qplib_ring_db32(struct bnxt_qplib_db_info *info,
        writel(key, info->db);
 }
 
+#define BNXT_QPLIB_INIT_DBHDR(xid, type, indx, toggle) \
+       (((u64)(((xid) & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE |  \
+               (type) | BNXT_QPLIB_DBR_VALID) << 32) | (indx) |  \
+        (((u32)(toggle)) << (BNXT_QPLIB_DBR_TOGGLE_SHIFT)))
+
 static inline void bnxt_qplib_ring_db(struct bnxt_qplib_db_info *info,
                                      u32 type)
 {
        u64 key = 0;
+       u32 indx;
+       u8 toggle = 0;
+
+       if (type == DBC_DBC_TYPE_CQ_ARMALL ||
+           type == DBC_DBC_TYPE_CQ_ARMSE)
+               toggle = info->toggle;
+
+       indx = (info->hwq->cons & DBC_DBC_INDEX_MASK) |
+              ((info->flags & BNXT_QPLIB_FLAG_EPOCH_CONS_MASK) <<
+                BNXT_QPLIB_DB_EPOCH_CONS_SHIFT);
 
-       key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
-       key <<= 32;
-       key |= (info->hwq->cons & DBC_DBC_INDEX_MASK);
+       key =  BNXT_QPLIB_INIT_DBHDR(info->xid, type, indx, toggle);
        writeq(key, info->db);
 }
 
@@ -468,10 +489,12 @@ static inline void bnxt_qplib_ring_prod_db(struct bnxt_qplib_db_info *info,
                                           u32 type)
 {
        u64 key = 0;
+       u32 indx;
 
-       key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
-       key <<= 32;
-       key |= ((info->hwq->prod / info->max_slot)) & DBC_DBC_INDEX_MASK;
+       indx = (((info->hwq->prod / info->max_slot) & DBC_DBC_INDEX_MASK) |
+               ((info->flags & BNXT_QPLIB_FLAG_EPOCH_PROD_MASK) <<
+                BNXT_QPLIB_DB_EPOCH_PROD_SHIFT));
+       key = BNXT_QPLIB_INIT_DBHDR(info->xid, type, indx, 0);
        writeq(key, info->db);
 }
 
@@ -479,9 +502,12 @@ static inline void bnxt_qplib_armen_db(struct bnxt_qplib_db_info *info,
                                       u32 type)
 {
        u64 key = 0;
+       u8 toggle = 0;
 
-       key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
-       key <<= 32;
+       if (type == DBC_DBC_TYPE_CQ_ARMENA || type == DBC_DBC_TYPE_SRQ_ARMENA)
+               toggle = info->toggle;
+       /* Index always at 0 */
+       key = BNXT_QPLIB_INIT_DBHDR(info->xid, type, 0, toggle);
        writeq(key, info->priv_db);
 }
 
@@ -490,9 +516,7 @@ static inline void bnxt_qplib_srq_arm_db(struct bnxt_qplib_db_info *info,
 {
        u64 key = 0;
 
-       key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | th;
-       key <<= 32;
-       key |=  th & DBC_DBC_INDEX_MASK;
+       key = BNXT_QPLIB_INIT_DBHDR(info->xid, DBC_DBC_TYPE_SRQ_ARM, th, info->toggle);
        writeq(key, info->priv_db);
 }