Skip to content

Commit 84fcd94

Browse files
Shruti Parabkuba-moo
authored andcommitted
bnxt_en: Manage the FW trace context memory
The FW trace memory pages will be added to the ethtool -w coredump in later patches. In addition to the raw data, the driver has to add a header to provide the head and tail information on each FW trace log segment when creating the coredump. The FW sends an async message to the driver after DMAing a chunk of logs to the context memory to indicate the last offset containing the tail of the logs. The driver needs to keep track of that. Reviewed-by: Hongguang Gao <hongguang.gao@broadcom.com> Signed-off-by: Shruti Parab <shruti.parab@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Link: https://patch.msgid.link/20241115151438.550106-7-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 24d694a commit 84fcd94

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,21 @@ static const u16 bnxt_async_events_arr[] = {
245245
ASYNC_EVENT_CMPL_EVENT_ID_PPS_TIMESTAMP,
246246
ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT,
247247
ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE,
248+
ASYNC_EVENT_CMPL_EVENT_ID_DBG_BUF_PRODUCER,
249+
};
250+
251+
const u16 bnxt_bstore_to_trace[] = {
252+
[BNXT_CTX_SRT] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_SRT_TRACE,
253+
[BNXT_CTX_SRT2] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_SRT2_TRACE,
254+
[BNXT_CTX_CRT] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CRT_TRACE,
255+
[BNXT_CTX_CRT2] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CRT2_TRACE,
256+
[BNXT_CTX_RIGP0] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_RIGP0_TRACE,
257+
[BNXT_CTX_L2HWRM] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_L2_HWRM_TRACE,
258+
[BNXT_CTX_REHWRM] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_ROCE_HWRM_TRACE,
259+
[BNXT_CTX_CA0] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CA0_TRACE,
260+
[BNXT_CTX_CA1] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CA1_TRACE,
261+
[BNXT_CTX_CA2] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CA2_TRACE,
262+
[BNXT_CTX_RIGP1] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_RIGP1_TRACE,
248263
};
249264

250265
static struct workqueue_struct *bnxt_pf_wq;
@@ -2470,6 +2485,50 @@ bool bnxt_bs_trace_avail(struct bnxt *bp, u16 type)
24702485
(flags & BNXT_CTX_MEM_FW_BIN_TRACE));
24712486
}
24722487

2488+
static void bnxt_bs_trace_init(struct bnxt *bp, struct bnxt_ctx_mem_type *ctxm)
2489+
{
2490+
u32 mem_size, pages, rem_bytes, magic_byte_offset;
2491+
u16 trace_type = bnxt_bstore_to_trace[ctxm->type];
2492+
struct bnxt_ctx_pg_info *ctx_pg = ctxm->pg_info;
2493+
struct bnxt_ring_mem_info *rmem, *rmem_pg_tbl;
2494+
struct bnxt_bs_trace_info *bs_trace;
2495+
int last_pg;
2496+
2497+
if (ctxm->instance_bmap && ctxm->instance_bmap > 1)
2498+
return;
2499+
2500+
mem_size = ctxm->max_entries * ctxm->entry_size;
2501+
rem_bytes = mem_size % BNXT_PAGE_SIZE;
2502+
pages = DIV_ROUND_UP(mem_size, BNXT_PAGE_SIZE);
2503+
2504+
last_pg = (pages - 1) & (MAX_CTX_PAGES - 1);
2505+
magic_byte_offset = (rem_bytes ? rem_bytes : BNXT_PAGE_SIZE) - 1;
2506+
2507+
rmem = &ctx_pg[0].ring_mem;
2508+
bs_trace = &bp->bs_trace[trace_type];
2509+
bs_trace->ctx_type = ctxm->type;
2510+
bs_trace->trace_type = trace_type;
2511+
if (pages > MAX_CTX_PAGES) {
2512+
int last_pg_dir = rmem->nr_pages - 1;
2513+
2514+
rmem_pg_tbl = &ctx_pg[0].ctx_pg_tbl[last_pg_dir]->ring_mem;
2515+
bs_trace->magic_byte = rmem_pg_tbl->pg_arr[last_pg];
2516+
} else {
2517+
bs_trace->magic_byte = rmem->pg_arr[last_pg];
2518+
}
2519+
bs_trace->magic_byte += magic_byte_offset;
2520+
*bs_trace->magic_byte = BNXT_TRACE_BUF_MAGIC_BYTE;
2521+
}
2522+
2523+
#define BNXT_EVENT_BUF_PRODUCER_TYPE(data1) \
2524+
(((data1) & ASYNC_EVENT_CMPL_DBG_BUF_PRODUCER_EVENT_DATA1_TYPE_MASK) >>\
2525+
ASYNC_EVENT_CMPL_DBG_BUF_PRODUCER_EVENT_DATA1_TYPE_SFT)
2526+
2527+
#define BNXT_EVENT_BUF_PRODUCER_OFFSET(data2) \
2528+
(((data2) & \
2529+
ASYNC_EVENT_CMPL_DBG_BUF_PRODUCER_EVENT_DATA2_CURR_OFF_MASK) >>\
2530+
ASYNC_EVENT_CMPL_DBG_BUF_PRODUCER_EVENT_DATA2_CURR_OFF_SFT)
2531+
24732532
#define BNXT_EVENT_THERMAL_CURRENT_TEMP(data2) \
24742533
((data2) & \
24752534
ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK)
@@ -2786,6 +2845,13 @@ static int bnxt_async_event_process(struct bnxt *bp,
27862845
hwrm_update_token(bp, seq_id, BNXT_HWRM_DEFERRED);
27872846
goto async_event_process_exit;
27882847
}
2848+
case ASYNC_EVENT_CMPL_EVENT_ID_DBG_BUF_PRODUCER: {
2849+
u16 type = (u16)BNXT_EVENT_BUF_PRODUCER_TYPE(data1);
2850+
u32 offset = BNXT_EVENT_BUF_PRODUCER_OFFSET(data2);
2851+
2852+
bnxt_bs_trace_check_wrap(&bp->bs_trace[type], offset);
2853+
goto async_event_process_exit;
2854+
}
27892855
default:
27902856
goto async_event_process_exit;
27912857
}
@@ -8769,6 +8835,7 @@ static int bnxt_backing_store_cfg_v2(struct bnxt *bp, u32 ena)
87698835
type);
87708836
continue;
87718837
}
8838+
bnxt_bs_trace_init(bp, ctxm);
87728839
last_type = type;
87738840
}
87748841
}

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,6 +2112,26 @@ enum board_idx {
21122112
NETXTREME_E_P7_VF,
21132113
};
21142114

2115+
#define BNXT_TRACE_BUF_MAGIC_BYTE ((u8)0xbc)
2116+
#define BNXT_TRACE_MAX 11
2117+
2118+
struct bnxt_bs_trace_info {
2119+
u8 *magic_byte;
2120+
u32 last_offset;
2121+
u8 wrapped:1;
2122+
u16 ctx_type;
2123+
u16 trace_type;
2124+
};
2125+
2126+
static inline void bnxt_bs_trace_check_wrap(struct bnxt_bs_trace_info *bs_trace,
2127+
u32 offset)
2128+
{
2129+
if (!bs_trace->wrapped &&
2130+
*bs_trace->magic_byte != BNXT_TRACE_BUF_MAGIC_BYTE)
2131+
bs_trace->wrapped = 1;
2132+
bs_trace->last_offset = offset;
2133+
}
2134+
21152135
struct bnxt {
21162136
void __iomem *bar0;
21172137
void __iomem *bar1;
@@ -2668,6 +2688,7 @@ struct bnxt {
26682688

26692689
struct bnxt_ctx_pg_info *fw_crash_mem;
26702690
u32 fw_crash_len;
2691+
struct bnxt_bs_trace_info bs_trace[BNXT_TRACE_MAX];
26712692
};
26722693

26732694
#define BNXT_NUM_RX_RING_STATS 8
@@ -2803,6 +2824,7 @@ static inline bool bnxt_sriov_cfg(struct bnxt *bp)
28032824
#endif
28042825
}
28052826

2827+
extern const u16 bnxt_bstore_to_trace[];
28062828
extern const u16 bnxt_lhint_arr[];
28072829

28082830
int bnxt_alloc_rx_data(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,

0 commit comments

Comments
 (0)