Skip to content

Commit ce7a6c3

Browse files
Hariprasad Kelamdavem330
authored andcommitted
octeontx2-af: cn10k: Add RPM Rx/Tx stats support
RPM supports below list of counters as an extension to existing counters * class based flow control pause frames * vlan/jabber/fragmented packets * fcs/alignment/oversized error packets This patch adds support to display supported RPM counters via debugfs and define new mbox rpm_stats to read all support counters. Signed-off-by: Hariprasad Kelam <[email protected]> Signed-off-by: Geetha sowjanya <[email protected]> Signed-off-by: Sunil Kovvuri Goutham <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1845ada commit ce7a6c3

File tree

8 files changed

+227
-26
lines changed

8 files changed

+227
-26
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,8 @@ void cgx_lmac_enadis_rx_pause_fwding(void *cgxd, int lmac_id, bool enable)
331331

332332
int cgx_get_rx_stats(void *cgxd, int lmac_id, int idx, u64 *rx_stat)
333333
{
334-
struct mac_ops *mac_ops;
335334
struct cgx *cgx = cgxd;
336335

337-
mac_ops = cgx->mac_ops;
338336
if (!is_lmac_valid(cgx, lmac_id))
339337
return -ENODEV;
340338
*rx_stat = cgx_read(cgx, lmac_id, CGXX_CMRX_RX_STAT0 + (idx * 8));
@@ -343,10 +341,8 @@ int cgx_get_rx_stats(void *cgxd, int lmac_id, int idx, u64 *rx_stat)
343341

344342
int cgx_get_tx_stats(void *cgxd, int lmac_id, int idx, u64 *tx_stat)
345343
{
346-
struct mac_ops *mac_ops;
347344
struct cgx *cgx = cgxd;
348345

349-
mac_ops = cgx->mac_ops;
350346
if (!is_lmac_valid(cgx, lmac_id))
351347
return -ENODEV;
352348
*tx_stat = cgx_read(cgx, lmac_id, CGXX_CMRX_TX_STAT0 + (idx * 8));
@@ -1303,7 +1299,11 @@ static struct mac_ops cgx_mac_ops = {
13031299
.int_ena_bit = FW_CGX_INT,
13041300
.lmac_fwi = CGX_LMAC_FWI,
13051301
.non_contiguous_serdes_lane = false,
1302+
.rx_stats_cnt = 9,
1303+
.tx_stats_cnt = 18,
13061304
.get_nr_lmacs = cgx_get_nr_lmacs,
1305+
.mac_get_rx_stats = cgx_get_rx_stats,
1306+
.mac_get_tx_stats = cgx_get_tx_stats,
13071307
.mac_enadis_rx_pause_fwding = cgx_lmac_enadis_rx_pause_fwding,
13081308
.mac_get_pause_frm_status = cgx_lmac_get_pause_frm_status,
13091309
.mac_enadis_pause_frm = cgx_lmac_enadis_pause_frm,
@@ -1376,6 +1376,8 @@ static int cgx_probe(struct pci_dev *pdev, const struct pci_device_id *id)
13761376

13771377
cgx_populate_features(cgx);
13781378

1379+
mutex_init(&cgx->lock);
1380+
13791381
err = cgx_lmac_init(cgx);
13801382
if (err)
13811383
goto err_release_lmac;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
#define FW_CGX_INT BIT_ULL(1)
4242
#define CGXX_CMRX_INT_ENA_W1S 0x058
4343
#define CGXX_CMRX_RX_ID_MAP 0x060
44-
#define CGXX_CMRX_RX_STAT0 (0x070 + mac_ops->csr_offset)
44+
#define CGXX_CMRX_RX_STAT0 0x070
4545
#define CGXX_CMRX_RX_LMACS 0x128
4646
#define CGXX_CMRX_RX_DMAC_CTL0 (0x1F8 + mac_ops->csr_offset)
4747
#define CGX_DMAC_CTL0_CAM_ENABLE BIT_ULL(3)
@@ -52,7 +52,7 @@
5252
#define CGX_DMAC_CAM_ADDR_ENABLE BIT_ULL(48)
5353
#define CGXX_CMRX_RX_DMAC_CAM1 0x400
5454
#define CGX_RX_DMAC_ADR_MASK GENMASK_ULL(47, 0)
55-
#define CGXX_CMRX_TX_STAT0 (0x700 + mac_ops->csr_offset)
55+
#define CGXX_CMRX_TX_STAT0 0x700
5656
#define CGXX_SCRATCH0_REG 0x1050
5757
#define CGXX_SCRATCH1_REG 0x1058
5858
#define CGX_CONST 0x2000

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,25 @@ struct mac_ops {
6363
u8 lmac_fwi;
6464
u32 fifo_len;
6565
bool non_contiguous_serdes_lane;
66+
/* RPM & CGX differs in number of Receive/transmit stats */
67+
u8 rx_stats_cnt;
68+
u8 tx_stats_cnt;
6669
/* Incase of RPM get number of lmacs from RPMX_CMR_RX_LMACS[LMAC_EXIST]
6770
* number of setbits in lmac_exist tells number of lmacs
6871
*/
6972
int (*get_nr_lmacs)(void *cgx);
7073

74+
/* Register Stats related functions */
75+
int (*mac_get_rx_stats)(void *cgx, int lmac_id,
76+
int idx, u64 *rx_stat);
77+
int (*mac_get_tx_stats)(void *cgx, int lmac_id,
78+
int idx, u64 *tx_stat);
79+
7180
/* Enable LMAC Pause Frame Configuration */
7281
void (*mac_enadis_rx_pause_fwding)(void *cgxd,
7382
int lmac_id,
7483
bool enable);
84+
7585
int (*mac_get_pause_frm_status)(void *cgxd,
7686
int lmac_id,
7787
u8 *tx_pause,
@@ -81,10 +91,10 @@ struct mac_ops {
8191
int lmac_id,
8292
u8 tx_pause,
8393
u8 rx_pause);
94+
8495
void (*mac_pause_frm_config)(void *cgxd,
8596
int lmac_id,
8697
bool enable);
87-
8898
};
8999

90100
struct cgx {
@@ -99,6 +109,10 @@ struct cgx {
99109
u64 hw_features;
100110
struct mac_ops *mac_ops;
101111
unsigned long lmac_bmap; /* bitmap of enabled lmacs */
112+
/* Lock to serialize read/write of global csrs like
113+
* RPMX_MTI_STAT_DATA_HI_CDC etc
114+
*/
115+
struct mutex lock;
102116
};
103117

104118
typedef struct cgx rpm_t;

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ M(CGX_SET_LINK_MODE, 0x214, cgx_set_link_mode, cgx_set_link_mode_req,\
161161
cgx_set_link_mode_rsp) \
162162
M(CGX_FEATURES_GET, 0x215, cgx_features_get, msg_req, \
163163
cgx_features_info_msg) \
164+
M(RPM_STATS, 0x216, rpm_stats, msg_req, rpm_stats_rsp) \
164165
/* NPA mbox IDs (range 0x400 - 0x5FF) */ \
165166
/* NPA mbox IDs (range 0x400 - 0x5FF) */ \
166167
M(NPA_LF_ALLOC, 0x400, npa_lf_alloc, \
@@ -490,14 +491,22 @@ struct cgx_set_link_mode_rsp {
490491
#define RVU_LMAC_FEAT_FC BIT_ULL(0) /* pause frames */
491492
#define RVU_LMAC_FEAT_PTP BIT_ULL(1) /* precison time protocol */
492493
#define RVU_MAC_VERSION BIT_ULL(2)
493-
#define RVU_MAC_CGX 0
494-
#define RVU_MAC_RPM 1
494+
#define RVU_MAC_CGX BIT_ULL(3)
495+
#define RVU_MAC_RPM BIT_ULL(4)
495496

496497
struct cgx_features_info_msg {
497498
struct mbox_msghdr hdr;
498499
u64 lmac_features;
499500
};
500501

502+
struct rpm_stats_rsp {
503+
struct mbox_msghdr hdr;
504+
#define RPM_RX_STATS_COUNT 43
505+
#define RPM_TX_STATS_COUNT 34
506+
u64 rx_stats[RPM_RX_STATS_COUNT];
507+
u64 tx_stats[RPM_TX_STATS_COUNT];
508+
};
509+
501510
/* NPA mbox message formats */
502511

503512
/* NPA mailbox error codes

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

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ static struct mac_ops rpm_mac_ops = {
1818
.int_ena_bit = BIT_ULL(0),
1919
.lmac_fwi = RPM_LMAC_FWI,
2020
.non_contiguous_serdes_lane = true,
21+
.rx_stats_cnt = 43,
22+
.tx_stats_cnt = 34,
2123
.get_nr_lmacs = rpm_get_nr_lmacs,
24+
.mac_get_rx_stats = rpm_get_rx_stats,
25+
.mac_get_tx_stats = rpm_get_tx_stats,
2226
.mac_enadis_rx_pause_fwding = rpm_lmac_enadis_rx_pause_fwding,
2327
.mac_get_pause_frm_status = rpm_lmac_get_pause_frm_status,
2428
.mac_enadis_pause_frm = rpm_lmac_enadis_pause_frm,
@@ -49,7 +53,7 @@ int rpm_get_nr_lmacs(void *rpmd)
4953

5054
void rpm_lmac_enadis_rx_pause_fwding(void *rpmd, int lmac_id, bool enable)
5155
{
52-
struct cgx *rpm = rpmd;
56+
rpm_t *rpm = rpmd;
5357
u64 cfg;
5458

5559
if (!rpm)
@@ -171,3 +175,54 @@ void rpm_lmac_pause_frm_config(void *rpmd, int lmac_id, bool enable)
171175
rpm_write(rpm, lmac_id, RPMX_MTI_MAC100X_COMMAND_CONFIG, cfg);
172176
}
173177
}
178+
179+
int rpm_get_rx_stats(void *rpmd, int lmac_id, int idx, u64 *rx_stat)
180+
{
181+
rpm_t *rpm = rpmd;
182+
u64 val_lo, val_hi;
183+
184+
if (!rpm || lmac_id >= rpm->lmac_count)
185+
return -ENODEV;
186+
187+
mutex_lock(&rpm->lock);
188+
189+
/* Update idx to point per lmac Rx statistics page */
190+
idx += lmac_id * rpm->mac_ops->rx_stats_cnt;
191+
192+
/* Read lower 32 bits of counter */
193+
val_lo = rpm_read(rpm, 0, RPMX_MTI_STAT_RX_STAT_PAGES_COUNTERX +
194+
(idx * 8));
195+
196+
/* upon read of lower 32 bits, higher 32 bits are written
197+
* to RPMX_MTI_STAT_DATA_HI_CDC
198+
*/
199+
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
200+
201+
*rx_stat = (val_hi << 32 | val_lo);
202+
203+
mutex_unlock(&rpm->lock);
204+
return 0;
205+
}
206+
207+
int rpm_get_tx_stats(void *rpmd, int lmac_id, int idx, u64 *tx_stat)
208+
{
209+
rpm_t *rpm = rpmd;
210+
u64 val_lo, val_hi;
211+
212+
if (!rpm || lmac_id >= rpm->lmac_count)
213+
return -ENODEV;
214+
215+
mutex_lock(&rpm->lock);
216+
217+
/* Update idx to point per lmac Tx statistics page */
218+
idx += lmac_id * rpm->mac_ops->tx_stats_cnt;
219+
220+
val_lo = rpm_read(rpm, 0, RPMX_MTI_STAT_TX_STAT_PAGES_COUNTERX +
221+
(idx * 8));
222+
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
223+
224+
*tx_stat = (val_hi << 32 | val_lo);
225+
226+
mutex_unlock(&rpm->lock);
227+
return 0;
228+
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define RPMX_CMRX_SW_INT_W1S 0x188
1919
#define RPMX_CMRX_SW_INT_ENA_W1S 0x198
2020
#define RPMX_CMRX_LINK_CFG 0x1070
21+
#define RPMX_MTI_LPCSX_CONTROL(id) (0x30000 | ((id) * 0x100))
2122

2223
#define RPMX_CMRX_LINK_RANGE_MASK GENMASK_ULL(19, 16)
2324
#define RPMX_CMRX_LINK_BASE_MASK GENMASK_ULL(11, 0)
@@ -32,14 +33,20 @@
3233
#define RPMX_CMR_RX_OVR_BP 0x4120
3334
#define RPMX_CMR_RX_OVR_BP_EN(x) BIT_ULL((x) + 8)
3435
#define RPMX_CMR_RX_OVR_BP_BP(x) BIT_ULL((x) + 4)
36+
#define RPMX_MTI_STAT_RX_STAT_PAGES_COUNTERX 0x12000
37+
#define RPMX_MTI_STAT_TX_STAT_PAGES_COUNTERX 0x13000
38+
#define RPMX_MTI_STAT_DATA_HI_CDC 0x10038
39+
3540
#define RPM_LMAC_FWI 0xa
3641

3742
/* Function Declarations */
43+
int rpm_get_nr_lmacs(void *rpmd);
3844
void rpm_lmac_enadis_rx_pause_fwding(void *rpmd, int lmac_id, bool enable);
3945
int rpm_lmac_get_pause_frm_status(void *cgxd, int lmac_id, u8 *tx_pause,
4046
u8 *rx_pause);
4147
void rpm_lmac_pause_frm_config(void *rpmd, int lmac_id, bool enable);
4248
int rpm_lmac_enadis_pause_frm(void *rpmd, int lmac_id, u8 tx_pause,
4349
u8 rx_pause);
44-
int rpm_get_nr_lmacs(void *cgxd);
50+
int rpm_get_tx_stats(void *rpmd, int lmac_id, int idx, u64 *tx_stat);
51+
int rpm_get_rx_stats(void *rpmd, int lmac_id, int idx, u64 *rx_stat);
4552
#endif /* RPM_H */

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,11 @@ int rvu_mbox_handler_cgx_stop_rxtx(struct rvu *rvu, struct msg_req *req,
453453
return 0;
454454
}
455455

456-
int rvu_mbox_handler_cgx_stats(struct rvu *rvu, struct msg_req *req,
457-
struct cgx_stats_rsp *rsp)
456+
static int rvu_lmac_get_stats(struct rvu *rvu, struct msg_req *req,
457+
void *rsp)
458458
{
459459
int pf = rvu_get_pf(req->hdr.pcifunc);
460+
struct mac_ops *mac_ops;
460461
int stat = 0, err = 0;
461462
u64 tx_stat, rx_stat;
462463
u8 cgx_idx, lmac;
@@ -467,28 +468,47 @@ int rvu_mbox_handler_cgx_stats(struct rvu *rvu, struct msg_req *req,
467468

468469
rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_idx, &lmac);
469470
cgxd = rvu_cgx_pdata(cgx_idx, rvu);
471+
mac_ops = get_mac_ops(cgxd);
470472

471473
/* Rx stats */
472-
while (stat < CGX_RX_STATS_COUNT) {
473-
err = cgx_get_rx_stats(cgxd, lmac, stat, &rx_stat);
474+
while (stat < mac_ops->rx_stats_cnt) {
475+
err = mac_ops->mac_get_rx_stats(cgxd, lmac, stat, &rx_stat);
474476
if (err)
475477
return err;
476-
rsp->rx_stats[stat] = rx_stat;
478+
if (mac_ops->rx_stats_cnt == RPM_RX_STATS_COUNT)
479+
((struct rpm_stats_rsp *)rsp)->rx_stats[stat] = rx_stat;
480+
else
481+
((struct cgx_stats_rsp *)rsp)->rx_stats[stat] = rx_stat;
477482
stat++;
478483
}
479484

480485
/* Tx stats */
481486
stat = 0;
482-
while (stat < CGX_TX_STATS_COUNT) {
483-
err = cgx_get_tx_stats(cgxd, lmac, stat, &tx_stat);
487+
while (stat < mac_ops->tx_stats_cnt) {
488+
err = mac_ops->mac_get_tx_stats(cgxd, lmac, stat, &tx_stat);
484489
if (err)
485490
return err;
486-
rsp->tx_stats[stat] = tx_stat;
491+
if (mac_ops->tx_stats_cnt == RPM_TX_STATS_COUNT)
492+
((struct rpm_stats_rsp *)rsp)->tx_stats[stat] = tx_stat;
493+
else
494+
((struct cgx_stats_rsp *)rsp)->tx_stats[stat] = tx_stat;
487495
stat++;
488496
}
489497
return 0;
490498
}
491499

500+
int rvu_mbox_handler_cgx_stats(struct rvu *rvu, struct msg_req *req,
501+
struct cgx_stats_rsp *rsp)
502+
{
503+
return rvu_lmac_get_stats(rvu, req, (void *)rsp);
504+
}
505+
506+
int rvu_mbox_handler_rpm_stats(struct rvu *rvu, struct msg_req *req,
507+
struct rpm_stats_rsp *rsp)
508+
{
509+
return rvu_lmac_get_stats(rvu, req, (void *)rsp);
510+
}
511+
492512
int rvu_mbox_handler_cgx_fec_stats(struct rvu *rvu,
493513
struct msg_req *req,
494514
struct cgx_fec_stats_rsp *rsp)

0 commit comments

Comments
 (0)