Commit d1e8884e authored by Hariprasad Kelam's avatar Hariprasad Kelam Committed by Paolo Abeni
Browse files

octeontx2-af: RPM: Fix low network performance



Low network performance is observed even on RPMs with larger
FIFO lengths.

The cn10kb silicon has three RPM blocks with the following
FIFO sizes:

         --------------------
         | RPM0  |   256KB  |
         | RPM1  |   256KB  |
         | RPM2  |   128KB  |
         --------------------

The current design stores the FIFO length in a common structure for all
RPMs (mac_ops). As a result, the FIFO length of the last RPM is applied
to all RPMs, leading to reduced network performance.

This patch resolved the problem by storing the fifo length in per MAC
structure (cgx).

Fixes: b9d0fedc ("octeontx2-af: cn10kb: Add RPM_USX MAC support")
Signed-off-by: default avatarHariprasad Kelam <hkelam@marvell.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 7ebbbb23
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -112,6 +112,11 @@ struct mac_ops *get_mac_ops(void *cgxd)
	return ((struct cgx *)cgxd)->mac_ops;
}

u32 cgx_get_fifo_len(void *cgxd)
{
	return ((struct cgx *)cgxd)->fifo_len;
}

void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val)
{
	writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) +
@@ -501,7 +506,7 @@ static u32 cgx_get_lmac_fifo_len(void *cgxd, int lmac_id)
	u8 num_lmacs;
	u32 fifo_len;

	fifo_len = cgx->mac_ops->fifo_len;
	fifo_len = cgx->fifo_len;
	num_lmacs = cgx->mac_ops->get_nr_lmacs(cgx);

	switch (num_lmacs) {
@@ -1764,7 +1769,7 @@ static void cgx_populate_features(struct cgx *cgx)
	u64 cfg;

	cfg = cgx_read(cgx, 0, CGX_CONST);
	cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
	cgx->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
	cgx->max_lmac_per_mac = FIELD_GET(CGX_CONST_MAX_LMACS, cfg);

	if (is_dev_rpm(cgx))
+1 −0
Original line number Diff line number Diff line
@@ -185,4 +185,5 @@ int cgx_lmac_get_pfc_frm_cfg(void *cgxd, int lmac_id, u8 *tx_pause,
int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,
		       int pfvf_idx);
int cgx_lmac_reset(void *cgxd, int lmac_id, u8 pf_req_flr);
u32 cgx_get_fifo_len(void *cgxd);
#endif /* CGX_H */
+4 −1
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ struct mac_ops {
	u8			irq_offset;
	u8			int_ena_bit;
	u8			lmac_fwi;
	u32			fifo_len;
	bool			non_contiguous_serdes_lane;
	/* RPM & CGX differs in number of Receive/transmit stats */
	u8			rx_stats_cnt;
@@ -142,6 +141,10 @@ struct cgx {
	u8			lmac_count;
	/* number of LMACs per MAC could be 4 or 8 */
	u8			max_lmac_per_mac;
	/* length of fifo varies depending on the number
	 * of LMACS
	 */
	u32			fifo_len;
#define MAX_LMAC_COUNT		8
	struct lmac             *lmac_idmap[MAX_LMAC_COUNT];
	struct			work_struct cgx_cmd_work;
+3 −3
Original line number Diff line number Diff line
@@ -480,7 +480,7 @@ u32 rpm_get_lmac_fifo_len(void *rpmd, int lmac_id)
	u8 num_lmacs;
	u32 fifo_len;

	fifo_len = rpm->mac_ops->fifo_len;
	fifo_len = rpm->fifo_len;
	num_lmacs = rpm->mac_ops->get_nr_lmacs(rpm);

	switch (num_lmacs) {
@@ -533,9 +533,9 @@ u32 rpm2_get_lmac_fifo_len(void *rpmd, int lmac_id)
	 */
	max_lmac = (rpm_read(rpm, 0, CGX_CONST) >> 24) & 0xFF;
	if (max_lmac > 4)
		fifo_len = rpm->mac_ops->fifo_len / 2;
		fifo_len = rpm->fifo_len / 2;
	else
		fifo_len = rpm->mac_ops->fifo_len;
		fifo_len = rpm->fifo_len;

	if (lmac_id < 4) {
		num_lmacs = hweight8(lmac_info & 0xF);
+4 −5
Original line number Diff line number Diff line
@@ -923,13 +923,12 @@ int rvu_mbox_handler_cgx_features_get(struct rvu *rvu,

u32 rvu_cgx_get_fifolen(struct rvu *rvu)
{
	struct mac_ops *mac_ops;
	u32 fifo_len;
	void *cgxd = rvu_first_cgx_pdata(rvu);

	mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
	fifo_len = mac_ops ? mac_ops->fifo_len : 0;
	if (!cgxd)
		return 0;

	return fifo_len;
	return cgx_get_fifo_len(cgxd);
}

u32 rvu_cgx_get_lmac_fifolen(struct rvu *rvu, int cgx, int lmac)