Skip to content

Commit 84ad364

Browse files
Hariprasad KelamPaolo Abeni
authored andcommitted
octeontx2-af: Add FEC stats for RPM/RPM_USX block
CN10K silicon MAC block RPM and CN10KB silicon MAC block RPM_USX both support BASER and RSFEC modes. Also MAC (CGX) on OcteonTx2 silicon variants and MAC (RPM) on OcteonTx3 CN10K are different and FEC stats need to be read differently. CN10KB MAC block (RPM_USX) fec csr offsets are same as CN10K MAC block (RPM) mac_ops points to same fn(). Upper layer interface between RVU AF and PF netdev is kept same. Based on silicon variant appropriate fn() pointer is called to read FEC stats Signed-off-by: Hariprasad Kelam <hkelam@marvell.com> Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent b441c4a commit 84ad364

File tree

5 files changed

+82
-2
lines changed

5 files changed

+82
-2
lines changed

drivers/net/ethernet/marvell/octeontx2/af/cgx.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,10 @@ int cgx_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
742742

743743
if (!cgx || lmac_id >= cgx->lmac_count)
744744
return -ENODEV;
745+
746+
if (cgx->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_NONE)
747+
return 0;
748+
745749
fec_stats_count =
746750
cgx_set_fec_stats_count(&cgx->lmac_idmap[lmac_id]->link_info);
747751
if (cgx->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) {
@@ -1749,6 +1753,7 @@ static struct mac_ops cgx_mac_ops = {
17491753
.mac_lmac_intl_lbk = cgx_lmac_internal_loopback,
17501754
.mac_get_rx_stats = cgx_get_rx_stats,
17511755
.mac_get_tx_stats = cgx_get_tx_stats,
1756+
.get_fec_stats = cgx_get_fec_stats,
17521757
.mac_enadis_rx_pause_fwding = cgx_lmac_enadis_rx_pause_fwding,
17531758
.mac_get_pause_frm_status = cgx_lmac_get_pause_frm_status,
17541759
.mac_enadis_pause_frm = cgx_lmac_enadis_pause_frm,

drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ struct mac_ops {
126126
int (*mac_get_pfc_frm_cfg)(void *cgxd, int lmac_id,
127127
u8 *tx_pause, u8 *rx_pause);
128128

129+
/* FEC stats */
130+
int (*get_fec_stats)(void *cgxd, int lmac_id,
131+
struct cgx_fec_stats_rsp *rsp);
129132
};
130133

131134
struct cgx {

drivers/net/ethernet/marvell/octeontx2/af/rpm.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static struct mac_ops rpm_mac_ops = {
2727
.mac_lmac_intl_lbk = rpm_lmac_internal_loopback,
2828
.mac_get_rx_stats = rpm_get_rx_stats,
2929
.mac_get_tx_stats = rpm_get_tx_stats,
30+
.get_fec_stats = rpm_get_fec_stats,
3031
.mac_enadis_rx_pause_fwding = rpm_lmac_enadis_rx_pause_fwding,
3132
.mac_get_pause_frm_status = rpm_lmac_get_pause_frm_status,
3233
.mac_enadis_pause_frm = rpm_lmac_enadis_pause_frm,
@@ -57,6 +58,7 @@ static struct mac_ops rpm2_mac_ops = {
5758
.mac_lmac_intl_lbk = rpm_lmac_internal_loopback,
5859
.mac_get_rx_stats = rpm_get_rx_stats,
5960
.mac_get_tx_stats = rpm_get_tx_stats,
61+
.get_fec_stats = rpm_get_fec_stats,
6062
.mac_enadis_rx_pause_fwding = rpm_lmac_enadis_rx_pause_fwding,
6163
.mac_get_pause_frm_status = rpm_lmac_get_pause_frm_status,
6264
.mac_enadis_pause_frm = rpm_lmac_enadis_pause_frm,
@@ -655,3 +657,59 @@ int rpm_lmac_get_pfc_frm_cfg(void *rpmd, int lmac_id, u8 *tx_pause, u8 *rx_paus
655657

656658
return 0;
657659
}
660+
661+
int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
662+
{
663+
u64 val_lo, val_hi;
664+
rpm_t *rpm = rpmd;
665+
u64 cfg;
666+
667+
if (!is_lmac_valid(rpm, lmac_id))
668+
return -ENODEV;
669+
670+
if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_NONE)
671+
return 0;
672+
673+
if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) {
674+
val_lo = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_VL0_CCW_LO);
675+
val_hi = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_CW_HI);
676+
rsp->fec_corr_blks = (val_hi << 16 | val_lo);
677+
678+
val_lo = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_VL0_NCCW_LO);
679+
val_hi = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_CW_HI);
680+
rsp->fec_uncorr_blks = (val_hi << 16 | val_lo);
681+
682+
/* 50G uses 2 Physical serdes lines */
683+
if (rpm->lmac_idmap[lmac_id]->link_info.lmac_type_id ==
684+
LMAC_MODE_50G_R) {
685+
val_lo = rpm_read(rpm, lmac_id,
686+
RPMX_MTI_FCFECX_VL1_CCW_LO);
687+
val_hi = rpm_read(rpm, lmac_id,
688+
RPMX_MTI_FCFECX_CW_HI);
689+
rsp->fec_corr_blks += (val_hi << 16 | val_lo);
690+
691+
val_lo = rpm_read(rpm, lmac_id,
692+
RPMX_MTI_FCFECX_VL1_NCCW_LO);
693+
val_hi = rpm_read(rpm, lmac_id,
694+
RPMX_MTI_FCFECX_CW_HI);
695+
rsp->fec_uncorr_blks += (val_hi << 16 | val_lo);
696+
}
697+
} else {
698+
/* enable RS-FEC capture */
699+
cfg = rpm_read(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL);
700+
cfg |= RPMX_RSFEC_RX_CAPTURE | BIT(lmac_id);
701+
rpm_write(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL, cfg);
702+
703+
val_lo = rpm_read(rpm, 0,
704+
RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2);
705+
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
706+
rsp->fec_corr_blks = (val_hi << 32 | val_lo);
707+
708+
val_lo = rpm_read(rpm, 0,
709+
RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3);
710+
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
711+
rsp->fec_uncorr_blks = (val_hi << 32 | val_lo);
712+
}
713+
714+
return 0;
715+
}

drivers/net/ethernet/marvell/octeontx2/af/rpm.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#define RPMX_CMRX_SW_INT_ENA_W1S 0x198
2626
#define RPMX_CMRX_LINK_CFG 0x1070
2727
#define RPMX_MTI_PCS100X_CONTROL1 0x20000
28-
#define RPMX_MTI_LPCSX_CONTROL1 0x30000
2928
#define RPMX_MTI_PCS_LBK BIT_ULL(14)
3029
#define RPMX_MTI_LPCSX_CONTROL(id) (0x30000 | ((id) * 0x100))
3130

@@ -81,6 +80,18 @@
8180
#define RPMX_TS_BINARY_MODE BIT_ULL(11)
8281
#define RPMX_CONST1 0x2008
8382

83+
/* FEC stats */
84+
#define RPMX_MTI_STAT_STATN_CONTROL 0x10018
85+
#define RPMX_MTI_STAT_DATA_HI_CDC 0x10038
86+
#define RPMX_RSFEC_RX_CAPTURE BIT_ULL(27)
87+
#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 0x40050
88+
#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 0x40058
89+
#define RPMX_MTI_FCFECX_VL0_CCW_LO 0x38618
90+
#define RPMX_MTI_FCFECX_VL0_NCCW_LO 0x38620
91+
#define RPMX_MTI_FCFECX_VL1_CCW_LO 0x38628
92+
#define RPMX_MTI_FCFECX_VL1_NCCW_LO 0x38630
93+
#define RPMX_MTI_FCFECX_CW_HI 0x38638
94+
8495
/* CN10KB CSR Declaration */
8596
#define RPM2_CMRX_SW_INT 0x1b0
8697
#define RPM2_CMRX_SW_INT_ENA_W1S 0x1b8
@@ -119,4 +130,5 @@ int rpm_lmac_get_pfc_frm_cfg(void *rpmd, int lmac_id, u8 *tx_pause,
119130
u8 *rx_pause);
120131
int rpm2_get_nr_lmacs(void *rpmd);
121132
bool is_dev_rpm2(void *rpmd);
133+
int rpm_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp);
122134
#endif /* RPM_H */

drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@ int rvu_mbox_handler_cgx_fec_stats(struct rvu *rvu,
579579
struct cgx_fec_stats_rsp *rsp)
580580
{
581581
int pf = rvu_get_pf(req->hdr.pcifunc);
582+
struct mac_ops *mac_ops;
582583
u8 cgx_idx, lmac;
583584
void *cgxd;
584585

@@ -587,7 +588,8 @@ int rvu_mbox_handler_cgx_fec_stats(struct rvu *rvu,
587588
rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_idx, &lmac);
588589

589590
cgxd = rvu_cgx_pdata(cgx_idx, rvu);
590-
return cgx_get_fec_stats(cgxd, lmac, rsp);
591+
mac_ops = get_mac_ops(cgxd);
592+
return mac_ops->get_fec_stats(cgxd, lmac, rsp);
591593
}
592594

593595
int rvu_mbox_handler_cgx_mac_addr_set(struct rvu *rvu,

0 commit comments

Comments
 (0)