RDMA/bnxt_re: Update the correct DB FIFO depth and mask for GenP7
authorSelvin Xavier <selvin.xavier@broadcom.com>
Thu, 27 Jun 2024 02:41:03 +0000 (19:41 -0700)
committerLeon Romanovsky <leon@kernel.org>
Mon, 1 Jul 2024 11:36:50 +0000 (14:36 +0300)
GenP5 and P7 devices have different DB FIFO depth. Use different
values based on the chip context.

Instead of hardcoding doorbell FIFO related values, get it
from the HWRM interface. Maintain backward compatibility
by having default values when FW is not providing the doorbell
FIFO related values.

Signed-off-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://lore.kernel.org/r/1719456065-27394-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/bnxt_re.h
drivers/infiniband/hw/bnxt_re/main.c

index 9dca451ed5221a7bab7eb303258895974017911a..0880b4b745aee87490b3196c3e63625b59a3d80a 100644 (file)
@@ -131,9 +131,15 @@ struct bnxt_re_pacing {
 #define BNXT_RE_PACING_ALARM_TH_MULTIPLE 2 /* Multiple of pacing algo threshold */
 /* Default do_pacing value when there is no congestion */
 #define BNXT_RE_DBR_DO_PACING_NO_CONGESTION 0x7F /* 1 in 512 probability */
-#define BNXT_RE_DB_FIFO_ROOM_MASK 0x1FFF8000
-#define BNXT_RE_MAX_FIFO_DEPTH 0x2c00
-#define BNXT_RE_DB_FIFO_ROOM_SHIFT 15
+
+#define BNXT_RE_MAX_FIFO_DEPTH_P5       0x2c00
+#define BNXT_RE_MAX_FIFO_DEPTH_P7       0x8000
+
+#define BNXT_RE_MAX_FIFO_DEPTH(ctx)    \
+       (bnxt_qplib_is_chip_gen_p7((ctx)) ? \
+        BNXT_RE_MAX_FIFO_DEPTH_P7 :\
+        BNXT_RE_MAX_FIFO_DEPTH_P5)
+
 #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000
 
 #define MAX_CQ_HASH_BITS               (16)
index 54b4d2f3a5d885d1f17643a2416420cb6b805b8a..2a727f4e5584010467c2b4ba518e889017d90e36 100644 (file)
@@ -444,6 +444,7 @@ int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)
 
 static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev)
 {
+       struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
        struct hwrm_func_dbr_pacing_qcfg_output resp = {};
        struct hwrm_func_dbr_pacing_qcfg_input req = {};
        struct bnxt_en_dev *en_dev = rdev->en_dev;
@@ -465,6 +466,13 @@ static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev)
                cctx->dbr_stat_db_fifo =
                        le32_to_cpu(resp.dbr_stat_db_fifo_reg) &
                        ~FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK;
+
+       pacing_data->fifo_max_depth = le32_to_cpu(resp.dbr_stat_db_max_fifo_depth);
+       if (!pacing_data->fifo_max_depth)
+               pacing_data->fifo_max_depth = BNXT_RE_MAX_FIFO_DEPTH(cctx);
+       pacing_data->fifo_room_mask = le32_to_cpu(resp.dbr_stat_db_fifo_reg_fifo_room_mask);
+       pacing_data->fifo_room_shift = resp.dbr_stat_db_fifo_reg_fifo_room_shift;
+
        return 0;
 }
 
@@ -481,6 +489,7 @@ static void bnxt_re_set_default_pacing_data(struct bnxt_re_dev *rdev)
 
 static void __wait_for_fifo_occupancy_below_th(struct bnxt_re_dev *rdev)
 {
+       struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
        u32 read_val, fifo_occup;
 
        /* loop shouldn't run infintely as the occupancy usually goes
@@ -488,14 +497,14 @@ static void __wait_for_fifo_occupancy_below_th(struct bnxt_re_dev *rdev)
         */
        while (1) {
                read_val = readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off);
-               fifo_occup = BNXT_RE_MAX_FIFO_DEPTH -
-                       ((read_val & BNXT_RE_DB_FIFO_ROOM_MASK) >>
-                        BNXT_RE_DB_FIFO_ROOM_SHIFT);
+               fifo_occup = pacing_data->fifo_max_depth -
+                            ((read_val & pacing_data->fifo_room_mask) >>
+                             pacing_data->fifo_room_shift);
                /* Fifo occupancy cannot be greater the MAX FIFO depth */
-               if (fifo_occup > BNXT_RE_MAX_FIFO_DEPTH)
+               if (fifo_occup > pacing_data->fifo_max_depth)
                        break;
 
-               if (fifo_occup < rdev->qplib_res.pacing_data->pacing_th)
+               if (fifo_occup < pacing_data->pacing_th)
                        break;
        }
 }
@@ -553,9 +562,9 @@ static void bnxt_re_pacing_timer_exp(struct work_struct *work)
 
        pacing_data = rdev->qplib_res.pacing_data;
        read_val = readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off);
-       fifo_occup = BNXT_RE_MAX_FIFO_DEPTH -
-               ((read_val & BNXT_RE_DB_FIFO_ROOM_MASK) >>
-                BNXT_RE_DB_FIFO_ROOM_SHIFT);
+       fifo_occup = pacing_data->fifo_max_depth -
+                    ((read_val & pacing_data->fifo_room_mask) >>
+                     pacing_data->fifo_room_shift);
 
        if (fifo_occup > pacing_data->pacing_th)
                goto restart_timer;
@@ -594,7 +603,7 @@ void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev)
         * Increase the alarm_th to max so that other user lib instances do not
         * keep alerting the driver.
         */
-       pacing_data->alarm_th = BNXT_RE_MAX_FIFO_DEPTH;
+       pacing_data->alarm_th = pacing_data->fifo_max_depth;
        pacing_data->do_pacing = BNXT_RE_MAX_DBR_DO_PACING;
        cancel_work_sync(&rdev->dbq_fifo_check_work);
        schedule_work(&rdev->dbq_fifo_check_work);
@@ -603,8 +612,6 @@ void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev)
 
 static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev)
 {
-       if (bnxt_re_hwrm_dbr_pacing_qcfg(rdev))
-               return -EIO;
 
        /* Allocate a page for app use */
        rdev->pacing.dbr_page = (void *)__get_free_page(GFP_KERNEL);
@@ -614,6 +621,12 @@ static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev)
        memset((u8 *)rdev->pacing.dbr_page, 0, PAGE_SIZE);
        rdev->qplib_res.pacing_data = (struct bnxt_qplib_db_pacing_data *)rdev->pacing.dbr_page;
 
+       if (bnxt_re_hwrm_dbr_pacing_qcfg(rdev)) {
+               free_page((u64)rdev->pacing.dbr_page);
+               rdev->pacing.dbr_page = NULL;
+               return -EIO;
+       }
+
        /* MAP HW window 2 for reading db fifo depth */
        writel(rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_BASE_MASK,
               rdev->en_dev->bar0 + BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4);
@@ -627,9 +640,6 @@ static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev)
        rdev->pacing.dbq_pacing_time = BNXT_RE_DBR_PACING_TIME;
        rdev->pacing.dbr_def_do_pacing = BNXT_RE_DBR_DO_PACING_NO_CONGESTION;
        rdev->pacing.do_pacing_save = rdev->pacing.dbr_def_do_pacing;
-       rdev->qplib_res.pacing_data->fifo_max_depth = BNXT_RE_MAX_FIFO_DEPTH;
-       rdev->qplib_res.pacing_data->fifo_room_mask = BNXT_RE_DB_FIFO_ROOM_MASK;
-       rdev->qplib_res.pacing_data->fifo_room_shift = BNXT_RE_DB_FIFO_ROOM_SHIFT;
        rdev->qplib_res.pacing_data->grc_reg_offset = rdev->pacing.dbr_db_fifo_reg_off;
        bnxt_re_set_default_pacing_data(rdev);
        /* Initialize worker for DBR Pacing */