git: 9ff4cca75c72 - main - if_bnxt: consolidate readl_fbsd/writel_fbsd and fix BAR mapping
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 09 Oct 2026 10:12:30 UTC
The branch main has been updated by ssaxena:
URL: https://cgit.FreeBSD.org/src/commit/?id=9ff4cca75c727a5b65f279fe4bc66e71abb305a1
commit 9ff4cca75c727a5b65f279fe4bc66e71abb305a1
Author: Sumit Saxena <sumit.saxena@broadcom.com>
AuthorDate: 2026-08-18 16:49:36 +0000
Commit: Sumit Saxena <ssaxena@FreeBSD.org>
CommitDate: 2026-10-09 08:24:42 +0000
if_bnxt: consolidate readl_fbsd/writel_fbsd and fix BAR mapping
There are multiple duplicates of readl_fbsd and writel_fbsd spread
accross bnxt_en and bnxt_re drivers. Move a single definition into bnxt.h as static
inline, shared by bnxt_en and bnxt_re, using the correctly sized
bus_space_read_4()/bus_space_write_4() accessors, and drop the other
two copies along with their declarations.
Also, Fix the BAR selection while at it: bar_idx 0 addresses BAR0 (the
HWRM bar) and bar_idx 2 addresses BAR2 (the doorbell bar), matching
every call site (e.g. BNXT_FW_HEALTH_REG_TYPE_BAR0/BAR1 in
if_bnxt.c) and bnxt_pci_mapping()'s own bnxt_map_bar() calls, but
both old copies and bnxt.h's own inline had the two bars swapped.
Add BNXT_HWRM_BAR_IDX/BNXT_DOORBELL_BAR_IDX macros for the two valid
bar_idx values and use them at every readl_fbsd()/writel_fbsd() call
site plus bnxt_pci_mapping(), instead of bare 0/2 literals. Any other
bar_idx is a programming error, so readl_fbsd()/writel_fbsd() panic
on it rather than silently guessing a BAR.
Reviewed by: gallatin
MFC after: 2 weeks
Sponsored by: Broadcom Inc.
Differential Revision: https://reviews.freebsd.org/D58995
---
sys/dev/bnxt/bnxt_en/bnxt.h | 36 +++++++++++++++++++++++++++++++
sys/dev/bnxt/bnxt_en/if_bnxt.c | 39 +++++++++-------------------------
sys/dev/bnxt/bnxt_re/bnxt_re.h | 2 --
sys/dev/bnxt/bnxt_re/main.c | 48 +++++++++++++++++-------------------------
sys/dev/bnxt/bnxt_re/stats.c | 3 ++-
5 files changed, 67 insertions(+), 61 deletions(-)
diff --git a/sys/dev/bnxt/bnxt_en/bnxt.h b/sys/dev/bnxt/bnxt_en/bnxt.h
index d4167301ffff..34afad28377d 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt.h
@@ -33,6 +33,7 @@
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
+#include <sys/systm.h>
#include <sys/taskqueue.h>
#include <sys/bitstring.h>
@@ -394,6 +395,9 @@ struct bnxt_bar_info {
int rid;
};
+#define BNXT_HWRM_BAR_IDX 0
+#define BNXT_DOORBELL_BAR_IDX 2
+
struct bnxt_flow_ctrl {
bool rx;
bool tx;
@@ -1476,4 +1480,36 @@ int bnxt_alloc_ctx_pg_tbls(struct bnxt_softc *softc,
struct bnxt_ctx_pg_info *ctx_pg,
uint32_t mem_size, uint8_t depth,
struct bnxt_ctx_mem_type *ctxm);
+
+static inline u32
+readl_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx)
+{
+ switch (bar_idx) {
+ case BNXT_HWRM_BAR_IDX:
+ return (bus_space_read_4(bp->hwrm_bar.tag,
+ bp->hwrm_bar.handle, reg_off));
+ case BNXT_DOORBELL_BAR_IDX:
+ return (bus_space_read_4(bp->doorbell_bar.tag,
+ bp->doorbell_bar.handle, reg_off));
+ default:
+ panic("%s: invalid bar_idx %u", __func__, bar_idx);
+ }
+}
+
+static inline void
+writel_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx, u32 val)
+{
+ switch (bar_idx) {
+ case BNXT_HWRM_BAR_IDX:
+ bus_space_write_4(bp->hwrm_bar.tag, bp->hwrm_bar.handle,
+ reg_off, htole32(val));
+ break;
+ case BNXT_DOORBELL_BAR_IDX:
+ bus_space_write_4(bp->doorbell_bar.tag, bp->doorbell_bar.handle,
+ reg_off, htole32(val));
+ break;
+ default:
+ panic("%s: invalid bar_idx %u", __func__, bar_idx);
+ }
+}
#endif /* _BNXT_H */
diff --git a/sys/dev/bnxt/bnxt_en/if_bnxt.c b/sys/dev/bnxt/bnxt_en/if_bnxt.c
index deb5a62347bd..205d98585a1e 100644
--- a/sys/dev/bnxt/bnxt_en/if_bnxt.c
+++ b/sys/dev/bnxt/bnxt_en/if_bnxt.c
@@ -312,27 +312,6 @@ MODULE_VERSION(if_bnxt, 1);
IFLIB_PNP_INFO(pci, bnxt, bnxt_vendor_info_array);
-void writel_fbsd(struct bnxt_softc *bp, u32, u8, u32);
-u32 readl_fbsd(struct bnxt_softc *bp, u32, u8);
-
-u32 readl_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx)
-{
-
- if (!bar_idx)
- return bus_space_read_4(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off);
- else
- return bus_space_read_4(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off);
-}
-
-void writel_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx, u32 val)
-{
-
- if (!bar_idx)
- bus_space_write_4(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off, htole32(val));
- else
- bus_space_write_4(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off, htole32(val));
-}
-
static DEFINE_IDA(bnxt_aux_dev_ids);
static device_method_t bnxt_iflib_methods[] = {
@@ -1881,10 +1860,10 @@ static u32 bnxt_fw_health_readl(struct bnxt_softc *bp, int reg_idx)
reg_off = fw_health->mapped_regs[reg_idx];
fallthrough;
case BNXT_FW_HEALTH_REG_TYPE_BAR0:
- val = readl_fbsd(bp, reg_off, 0);
+ val = readl_fbsd(bp, reg_off, BNXT_HWRM_BAR_IDX);
break;
case BNXT_FW_HEALTH_REG_TYPE_BAR1:
- val = readl_fbsd(bp, reg_off, 2);
+ val = readl_fbsd(bp, reg_off, BNXT_DOORBELL_BAR_IDX);
break;
}
if (reg_idx == BNXT_FW_RESET_INPROG_REG)
@@ -2002,14 +1981,15 @@ static void bnxt_fw_reset_writel(struct bnxt_softc *bp, int reg_idx)
pci_write_config_dword(bp->pdev, reg_off, val);
break;
case BNXT_FW_HEALTH_REG_TYPE_GRC:
- writel_fbsd(bp, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4, 0, reg_off & BNXT_GRC_BASE_MASK);
+ writel_fbsd(bp, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4, BNXT_HWRM_BAR_IDX,
+ reg_off & BNXT_GRC_BASE_MASK);
reg_off = (reg_off & BNXT_GRC_OFFSET_MASK) + 0x2000;
fallthrough;
case BNXT_FW_HEALTH_REG_TYPE_BAR0:
- writel_fbsd(bp, reg_off, 0, val);
+ writel_fbsd(bp, reg_off, BNXT_HWRM_BAR_IDX, val);
break;
case BNXT_FW_HEALTH_REG_TYPE_BAR1:
- writel_fbsd(bp, reg_off, 2, val);
+ writel_fbsd(bp, reg_off, BNXT_DOORBELL_BAR_IDX, val);
break;
}
if (delay_msecs) {
@@ -2080,7 +2060,8 @@ static int bnxt_alloc_fw_health(struct bnxt_softc *bp)
static inline void __bnxt_map_fw_health_reg(struct bnxt_softc *bp, u32 reg)
{
- writel_fbsd(bp, BNXT_GRCPF_REG_WINDOW_BASE_OUT + BNXT_FW_HEALTH_WIN_MAP_OFF, 0, reg & BNXT_GRC_BASE_MASK);
+ writel_fbsd(bp, BNXT_GRCPF_REG_WINDOW_BASE_OUT + BNXT_FW_HEALTH_WIN_MAP_OFF,
+ BNXT_HWRM_BAR_IDX, reg & BNXT_GRC_BASE_MASK);
}
static int bnxt_map_fw_health_regs(struct bnxt_softc *bp)
@@ -5041,11 +5022,11 @@ bnxt_pci_mapping(struct bnxt_softc *softc)
{
int rc;
- rc = bnxt_map_bar(softc, &softc->hwrm_bar, 0, true);
+ rc = bnxt_map_bar(softc, &softc->hwrm_bar, BNXT_HWRM_BAR_IDX, true);
if (rc)
return rc;
- rc = bnxt_map_bar(softc, &softc->doorbell_bar, 2, false);
+ rc = bnxt_map_bar(softc, &softc->doorbell_bar, BNXT_DOORBELL_BAR_IDX, false);
return rc;
}
diff --git a/sys/dev/bnxt/bnxt_re/bnxt_re.h b/sys/dev/bnxt/bnxt_re/bnxt_re.h
index 60ff33c1a802..f1457b45a362 100644
--- a/sys/dev/bnxt/bnxt_re/bnxt_re.h
+++ b/sys/dev/bnxt/bnxt_re/bnxt_re.h
@@ -1035,8 +1035,6 @@ int bnxt_re_set_dbq_throttling_reg(struct bnxt_re_dev *rdev,
void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev);
int bnxt_re_hwrm_pri2cos_qcfg(struct bnxt_re_dev *rdev, struct bnxt_re_tc_rec *tc_rec,
u16 target_id);
-void writel_fbsd(struct bnxt_softc *bp, u32, u8, u32);
-u32 readl_fbsd(struct bnxt_softc *bp, u32, u8);
static inline unsigned int bnxt_re_get_total_mr_mw_count(struct bnxt_re_dev *rdev)
{
diff --git a/sys/dev/bnxt/bnxt_re/main.c b/sys/dev/bnxt/bnxt_re/main.c
index 295125218d03..8e8dca0b9441 100644
--- a/sys/dev/bnxt/bnxt_re/main.c
+++ b/sys/dev/bnxt/bnxt_re/main.c
@@ -115,8 +115,6 @@ static int bnxt_re_ib_init(struct bnxt_re_dev *rdev);
static void bnxt_re_ib_init_2(struct bnxt_re_dev *rdev);
void _bnxt_re_remove(struct auxiliary_device *adev);
-void writel_fbsd(struct bnxt_softc *bp, u32, u8, u32);
-u32 readl_fbsd(struct bnxt_softc *bp, u32, u8);
static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev);
int bnxt_re_register_netdevice_notifier(struct notifier_block *nb)
@@ -138,23 +136,6 @@ void bnxt_re_set_dma_device(struct ib_device *ibdev, struct bnxt_re_dev *rdev)
ibdev->dma_device = &rdev->en_dev->pdev->dev;
}
-u32 readl_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx)
-{
-
- if (bar_idx)
- return bus_space_read_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off);
- else
- return bus_space_read_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off);
-}
-
-void writel_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx, u32 val)
-{
- if (bar_idx)
- bus_space_write_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off, htole32(val));
- else
- bus_space_write_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off, htole32(val));
-}
-
static void bnxt_re_update_fifo_occup_slabs(struct bnxt_re_dev *rdev,
u32 fifo_occup)
{
@@ -529,7 +510,8 @@ static void __wait_for_fifo_occupancy_below_th(struct bnxt_re_dev *rdev)
* below pacing algo threshold as soon as pacing kicks in.
*/
while (1) {
- read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_db_fifo_reg_off, 0);
+ read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_db_fifo_reg_off,
+ BNXT_HWRM_BAR_IDX);
fifo_occup = pacing_data->fifo_max_depth -
((read_val & pacing_data->fifo_room_mask) >>
pacing_data->fifo_room_shift);
@@ -567,7 +549,8 @@ static bool bnxt_re_check_if_dbq_intr_triggered(struct bnxt_re_dev *rdev)
int j;
for (j = 0; j < 10; j++) {
- read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0);
+ read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off,
+ BNXT_HWRM_BAR_IDX);
dev_dbg(rdev_to_dev(rdev), "AEQ ARM status = 0x%x\n",
read_val);
if (!read_val)
@@ -587,8 +570,10 @@ int bnxt_re_set_dbq_throttling_reg(struct bnxt_re_dev *rdev, u16 nq_id, u32 thro
if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) {
cag_ring_water_mark = (nq_id & CAG_RING_MASK) << CAG_RING_SHIFT |
(throttle_val & WATERMARK_MASK);
- writel_fbsd(rdev->en_dev->softc, rdev->dbr_throttling_reg_off, 0, cag_ring_water_mark);
- read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_throttling_reg_off, 0);
+ writel_fbsd(rdev->en_dev->softc, rdev->dbr_throttling_reg_off,
+ BNXT_HWRM_BAR_IDX, cag_ring_water_mark);
+ read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_throttling_reg_off,
+ BNXT_HWRM_BAR_IDX);
dev_dbg(rdev_to_dev(rdev),
"%s: dbr_throttling_reg_off read_val = 0x%x\n",
__func__, read_val);
@@ -599,7 +584,7 @@ int bnxt_re_set_dbq_throttling_reg(struct bnxt_re_dev *rdev, u16 nq_id, u32 thro
return 1;
}
}
- writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0, 1);
+ writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, BNXT_HWRM_BAR_IDX, 1);
return 0;
}
@@ -644,7 +629,8 @@ static void bnxt_re_handle_dbr_nq_pacing_notification(struct bnxt_re_dev *rdev)
return;
}
/*Configure GRC access for Throttling and aeq_arm register */
- writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28, 0,
+ writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28,
+ BNXT_HWRM_BAR_IDX,
rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK);
rdev->dbr_throttling_reg_off =
@@ -848,7 +834,8 @@ static void bnxt_re_pacing_timer_exp(struct work_struct *work)
return;
pacing_data = rdev->qplib_res.pacing_data;
- read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_db_fifo_reg_off, 0);
+ read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_db_fifo_reg_off,
+ BNXT_HWRM_BAR_IDX);
fifo_occup = pacing_data->fifo_max_depth -
((read_val & pacing_data->fifo_room_mask) >>
pacing_data->fifo_room_shift);
@@ -3394,7 +3381,8 @@ static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev)
goto fail;
}
/* MAP grc window 2 for reading db fifo depth */
- writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4, 0,
+ writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4,
+ BNXT_HWRM_BAR_IDX,
rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_BASE_MASK);
rdev->dbr_db_fifo_reg_off =
(rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_OFFSET_MASK) +
@@ -3460,12 +3448,14 @@ int bnxt_re_enable_dbr_pacing(struct bnxt_re_dev *rdev)
return -EIO;
}
/* MAP grc window 8 for ARMing the NQ DBQ */
- writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28 , 0,
+ writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28,
+ BNXT_HWRM_BAR_IDX,
rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK);
rdev->dbr_aeq_arm_reg_off =
(rdev->chip_ctx->dbr_aeq_arm_reg &
BNXT_GRC_OFFSET_MASK) + 0x8000;
- writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off , 0, 1);
+ writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off,
+ BNXT_HWRM_BAR_IDX, 1);
}
return 0;
diff --git a/sys/dev/bnxt/bnxt_re/stats.c b/sys/dev/bnxt/bnxt_re/stats.c
index 7b0e6097aae6..e0e9749d9253 100644
--- a/sys/dev/bnxt/bnxt_re/stats.c
+++ b/sys/dev/bnxt/bnxt_re/stats.c
@@ -611,7 +611,8 @@ static void bnxt_re_copy_db_pacing_stats(struct bnxt_re_dev *rdev,
stats->value[BNXT_RE_DBQ_PACING_CMPL] = dbr_sw_stats->dbq_pacing_complete;
stats->value[BNXT_RE_DBQ_PACING_ALERT] = dbr_sw_stats->dbq_pacing_alerts;
stats->value[BNXT_RE_DBQ_DBR_FIFO_REG] = readl_fbsd(rdev->en_dev->softc,
- rdev->dbr_db_fifo_reg_off, 0);
+ rdev->dbr_db_fifo_reg_off,
+ BNXT_HWRM_BAR_IDX);
}
int bnxt_re_get_hw_stats(struct ib_device *ibdev,