Skip to content

Commit 6e54e1c

Browse files
Hariprasad Kelamdavem330
authored andcommitted
octeontx2-af: cn10K: Add MTU configuration
OcteonTx3 CN10K silicon supports bigger MTU when compared to 9216 MTU supported by OcteonTx2 silicon variants. Lookback interface supports upto 64K and RPM LMAC interfaces support upto 16K. This patch does the necessary configuration and adds support for PF/VF drivers to retrieve max packet size supported via mbox This patch also configures tx link credit by considering supported fifo size and max packet length for Octeontx3 silicon. This patch also removes platform specific name from the driver name. Signed-off-by: Hariprasad Kelam <[email protected]> Signed-off-by: Geetha sowjanya <[email protected]> Signed-off-by: Sunil Goutham <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 242da43 commit 6e54e1c

File tree

11 files changed

+138
-12
lines changed

11 files changed

+138
-12
lines changed

drivers/net/ethernet/marvell/octeontx2/af/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
#
55

66
ccflags-y += -I$(src)
7-
obj-$(CONFIG_OCTEONTX2_MBOX) += octeontx2_mbox.o
8-
obj-$(CONFIG_OCTEONTX2_AF) += octeontx2_af.o
7+
obj-$(CONFIG_OCTEONTX2_MBOX) += rvu_mbox.o
8+
obj-$(CONFIG_OCTEONTX2_AF) += rvu_af.o
99

10-
octeontx2_mbox-y := mbox.o rvu_trace.o
11-
octeontx2_af-y := cgx.o rvu.o rvu_cgx.o rvu_npa.o rvu_nix.o \
10+
rvu_mbox-y := mbox.o rvu_trace.o
11+
rvu_af-y := cgx.o rvu.o rvu_cgx.o rvu_npa.o rvu_nix.o \
1212
rvu_reg.o rvu_npc.o rvu_debugfs.o ptp.o rvu_npc_fs.o \
1313
rvu_cpt.o rvu_devlink.o rpm.o rvu_cn10k.o

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,14 @@ int cgx_lmac_linkup_start(void *cgxd)
11511151
return 0;
11521152
}
11531153

1154+
static void cgx_lmac_get_fifolen(struct cgx *cgx)
1155+
{
1156+
u64 cfg;
1157+
1158+
cfg = cgx_read(cgx, 0, CGX_CONST);
1159+
cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
1160+
}
1161+
11541162
static int cgx_configure_interrupt(struct cgx *cgx, struct lmac *lmac,
11551163
int cnt, bool req_free)
11561164
{
@@ -1205,6 +1213,8 @@ static int cgx_lmac_init(struct cgx *cgx)
12051213
u64 lmac_list;
12061214
int i, err;
12071215

1216+
cgx_lmac_get_fifolen(cgx);
1217+
12081218
cgx->lmac_count = cgx->mac_ops->get_nr_lmacs(cgx);
12091219
/* lmac_list specifies which lmacs are enabled
12101220
* when bit n is set to 1, LMAC[n] is enabled

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#define CGXX_SCRATCH0_REG 0x1050
5757
#define CGXX_SCRATCH1_REG 0x1058
5858
#define CGX_CONST 0x2000
59+
#define CGX_CONST_RXFIFO_SIZE GENMASK_ULL(23, 0)
5960
#define CGXX_SPUX_CONTROL1 0x10000
6061
#define CGXX_SPUX_LNX_FEC_CORR_BLOCKS 0x10700
6162
#define CGXX_SPUX_LNX_FEC_UNCORR_BLOCKS 0x10800

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ enum nix_scheduler {
155155
#define NIC_HW_MIN_FRS 40
156156
#define NIC_HW_MAX_FRS 9212
157157
#define SDP_HW_MAX_FRS 65535
158+
#define CN10K_LMAC_LINK_MAX_FRS 16380 /* 16k - FCS */
159+
#define CN10K_LBK_LINK_MAX_FRS 65535 /* 64k */
158160

159161
/* NIX RX action operation*/
160162
#define NIX_RX_ACTIONOP_DROP (0x0ull)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct mac_ops {
6161
u8 irq_offset;
6262
u8 int_ena_bit;
6363
u8 lmac_fwi;
64+
u32 fifo_len;
6465
bool non_contiguous_serdes_lane;
6566
/* Incase of RPM get number of lmacs from RPMX_CMR_RX_LMACS[LMAC_EXIST]
6667
* number of setbits in lmac_exist tells number of lmacs

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ M(NIX_BP_ENABLE, 0x8016, nix_bp_enable, nix_bp_cfg_req, \
251251
M(NIX_BP_DISABLE, 0x8017, nix_bp_disable, nix_bp_cfg_req, msg_rsp) \
252252
M(NIX_GET_MAC_ADDR, 0x8018, nix_get_mac_addr, msg_req, nix_get_mac_addr_rsp) \
253253
M(NIX_CN10K_AQ_ENQ, 0x8019, nix_cn10k_aq_enq, nix_cn10k_aq_enq_req, \
254-
nix_cn10k_aq_enq_rsp)
254+
nix_cn10k_aq_enq_rsp) \
255+
M(NIX_GET_HW_INFO, 0x801a, nix_get_hw_info, msg_req, nix_hw_info)
255256

256257
/* Messages initiated by AF (range 0xC00 - 0xDFF) */
257258
#define MBOX_UP_CGX_MESSAGES \
@@ -948,6 +949,12 @@ struct nix_bp_cfg_rsp {
948949
u8 chan_cnt; /* Number of channel for which bpids are assigned */
949950
};
950951

952+
struct nix_hw_info {
953+
struct mbox_msghdr hdr;
954+
u16 max_mtu;
955+
u16 min_mtu;
956+
};
957+
951958
/* NPC mbox message structs */
952959

953960
#define NPC_MCAM_ENTRY_INVALID 0xFFFF

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
#include "rvu_trace.h"
2424

25-
#define DRV_NAME "octeontx2-af"
25+
#define DRV_NAME "rvu_af"
2626
#define DRV_STRING "Marvell OcteonTX2 RVU Admin Function Driver"
2727

2828
static int rvu_get_hwvf(struct rvu *rvu, int pcifunc);
@@ -855,6 +855,31 @@ static int rvu_setup_cpt_hw_resource(struct rvu *rvu, int blkaddr)
855855
return rvu_alloc_bitmap(&block->lf);
856856
}
857857

858+
static void rvu_get_lbk_bufsize(struct rvu *rvu)
859+
{
860+
struct pci_dev *pdev = NULL;
861+
void __iomem *base;
862+
u64 lbk_const;
863+
864+
pdev = pci_get_device(PCI_VENDOR_ID_CAVIUM,
865+
PCI_DEVID_OCTEONTX2_LBK, pdev);
866+
if (!pdev)
867+
return;
868+
869+
base = pci_ioremap_bar(pdev, 0);
870+
if (!base)
871+
goto err_put;
872+
873+
lbk_const = readq(base + LBK_CONST);
874+
875+
/* cache fifo size */
876+
rvu->hw->lbk_bufsize = FIELD_GET(LBK_CONST_BUF_SIZE, lbk_const);
877+
878+
iounmap(base);
879+
err_put:
880+
pci_dev_put(pdev);
881+
}
882+
858883
static int rvu_setup_hw_resources(struct rvu *rvu)
859884
{
860885
struct rvu_hwinfo *hw = rvu->hw;
@@ -1025,6 +1050,8 @@ static int rvu_setup_hw_resources(struct rvu *rvu)
10251050
if (err)
10261051
goto npa_err;
10271052

1053+
rvu_get_lbk_bufsize(rvu);
1054+
10281055
err = rvu_nix_init(rvu);
10291056
if (err)
10301057
goto nix_err;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ struct rvu_hwinfo {
329329
u8 npc_intfs; /* No of interfaces */
330330
u8 npc_kpu_entries; /* No of KPU entries */
331331
u16 npc_counters; /* No of match stats counters */
332+
u32 lbk_bufsize; /* FIFO size supported by LBK */
332333
bool npc_ext_set; /* Extended register set */
333334

334335
struct hw_cap cap;
@@ -676,6 +677,7 @@ void npc_read_mcam_entry(struct rvu *rvu, struct npc_mcam *mcam,
676677
int blkaddr, u16 src, struct mcam_entry *entry,
677678
u8 *intf, u8 *ena);
678679
bool is_mac_feature_supported(struct rvu *rvu, int pf, int feature);
680+
u32 rvu_cgx_get_fifolen(struct rvu *rvu);
679681

680682
/* CPT APIs */
681683
int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int lf, int slot);

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "rvu.h"
1616
#include "cgx.h"
17+
#include "lmac_common.h"
1718
#include "rvu_reg.h"
1819
#include "rvu_trace.h"
1920

@@ -685,6 +686,18 @@ int rvu_mbox_handler_cgx_features_get(struct rvu *rvu,
685686
return 0;
686687
}
687688

689+
u32 rvu_cgx_get_fifolen(struct rvu *rvu)
690+
{
691+
struct mac_ops *mac_ops;
692+
int rvu_def_cgx_id = 0;
693+
u32 fifo_len;
694+
695+
mac_ops = get_mac_ops(rvu_cgx_pdata(rvu_def_cgx_id, rvu));
696+
fifo_len = mac_ops ? mac_ops->fifo_len : 0;
697+
698+
return fifo_len;
699+
}
700+
688701
static int rvu_cgx_config_intlbk(struct rvu *rvu, u16 pcifunc, bool en)
689702
{
690703
int pf = rvu_get_pf(pcifunc);

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

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,6 +2543,43 @@ static int nix_af_mark_format_setup(struct rvu *rvu, struct nix_hw *nix_hw,
25432543
return 0;
25442544
}
25452545

2546+
static void rvu_get_lbk_link_max_frs(struct rvu *rvu, u16 *max_mtu)
2547+
{
2548+
/* CN10K supports LBK FIFO size 72 KB */
2549+
if (rvu->hw->lbk_bufsize == 0x12000)
2550+
*max_mtu = CN10K_LBK_LINK_MAX_FRS;
2551+
else
2552+
*max_mtu = NIC_HW_MAX_FRS;
2553+
}
2554+
2555+
static void rvu_get_lmac_link_max_frs(struct rvu *rvu, u16 *max_mtu)
2556+
{
2557+
/* RPM supports FIFO len 128 KB */
2558+
if (rvu_cgx_get_fifolen(rvu) == 0x20000)
2559+
*max_mtu = CN10K_LMAC_LINK_MAX_FRS;
2560+
else
2561+
*max_mtu = NIC_HW_MAX_FRS;
2562+
}
2563+
2564+
int rvu_mbox_handler_nix_get_hw_info(struct rvu *rvu, struct msg_req *req,
2565+
struct nix_hw_info *rsp)
2566+
{
2567+
u16 pcifunc = req->hdr.pcifunc;
2568+
int blkaddr;
2569+
2570+
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
2571+
if (blkaddr < 0)
2572+
return NIX_AF_ERR_AF_LF_INVALID;
2573+
2574+
if (is_afvf(pcifunc))
2575+
rvu_get_lbk_link_max_frs(rvu, &rsp->max_mtu);
2576+
else
2577+
rvu_get_lmac_link_max_frs(rvu, &rsp->max_mtu);
2578+
2579+
rsp->min_mtu = NIC_HW_MIN_FRS;
2580+
return 0;
2581+
}
2582+
25462583
int rvu_mbox_handler_nix_stats_rst(struct rvu *rvu, struct msg_req *req,
25472584
struct msg_rsp *rsp)
25482585
{
@@ -3107,6 +3144,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
31073144
u64 cfg, lmac_fifo_len;
31083145
struct nix_hw *nix_hw;
31093146
u8 cgx = 0, lmac = 0;
3147+
u16 max_mtu;
31103148

31113149
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
31123150
if (blkaddr < 0)
@@ -3116,7 +3154,12 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
31163154
if (!nix_hw)
31173155
return -EINVAL;
31183156

3119-
if (!req->sdp_link && req->maxlen > NIC_HW_MAX_FRS)
3157+
if (is_afvf(pcifunc))
3158+
rvu_get_lbk_link_max_frs(rvu, &max_mtu);
3159+
else
3160+
rvu_get_lmac_link_max_frs(rvu, &max_mtu);
3161+
3162+
if (!req->sdp_link && req->maxlen > max_mtu)
31203163
return NIX_AF_ERR_FRS_INVALID;
31213164

31223165
if (req->update_minlen && req->minlen < NIC_HW_MIN_FRS)
@@ -3176,7 +3219,8 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
31763219

31773220
/* Update transmit credits for CGX links */
31783221
lmac_fifo_len =
3179-
CGX_FIFO_LEN / cgx_get_lmac_cnt(rvu_cgx_pdata(cgx, rvu));
3222+
rvu_cgx_get_fifolen(rvu) /
3223+
cgx_get_lmac_cnt(rvu_cgx_pdata(cgx, rvu));
31803224
cfg = rvu_read64(rvu, blkaddr, NIX_AF_TX_LINKX_NORM_CREDIT(link));
31813225
cfg &= ~(0xFFFFFULL << 12);
31823226
cfg |= ((lmac_fifo_len - req->maxlen) / 16) << 12;
@@ -3216,23 +3260,40 @@ int rvu_mbox_handler_nix_set_rx_cfg(struct rvu *rvu, struct nix_rx_cfg *req,
32163260
return 0;
32173261
}
32183262

3263+
static u64 rvu_get_lbk_link_credits(struct rvu *rvu, u16 lbk_max_frs)
3264+
{
3265+
/* CN10k supports 72KB FIFO size and max packet size of 64k */
3266+
if (rvu->hw->lbk_bufsize == 0x12000)
3267+
return (rvu->hw->lbk_bufsize - lbk_max_frs) / 16;
3268+
3269+
return 1600; /* 16 * max LBK datarate = 16 * 100Gbps */
3270+
}
3271+
32193272
static void nix_link_config(struct rvu *rvu, int blkaddr)
32203273
{
32213274
struct rvu_hwinfo *hw = rvu->hw;
32223275
int cgx, lmac_cnt, slink, link;
3276+
u16 lbk_max_frs, lmac_max_frs;
32233277
u64 tx_credits;
32243278

3279+
rvu_get_lbk_link_max_frs(rvu, &lbk_max_frs);
3280+
rvu_get_lmac_link_max_frs(rvu, &lmac_max_frs);
3281+
32253282
/* Set default min/max packet lengths allowed on NIX Rx links.
32263283
*
32273284
* With HW reset minlen value of 60byte, HW will treat ARP pkts
32283285
* as undersize and report them to SW as error pkts, hence
32293286
* setting it to 40 bytes.
32303287
*/
3231-
for (link = 0; link < (hw->cgx_links + hw->lbk_links); link++) {
3288+
for (link = 0; link < hw->cgx_links; link++) {
32323289
rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link),
3233-
NIC_HW_MAX_FRS << 16 | NIC_HW_MIN_FRS);
3290+
((u64)lmac_max_frs << 16) | NIC_HW_MIN_FRS);
32343291
}
32353292

3293+
for (link = hw->cgx_links; link < hw->lbk_links; link++) {
3294+
rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link),
3295+
((u64)lbk_max_frs << 16) | NIC_HW_MIN_FRS);
3296+
}
32363297
if (hw->sdp_links) {
32373298
link = hw->cgx_links + hw->lbk_links;
32383299
rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link),
@@ -3244,7 +3305,8 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
32443305
*/
32453306
for (cgx = 0; cgx < hw->cgx; cgx++) {
32463307
lmac_cnt = cgx_get_lmac_cnt(rvu_cgx_pdata(cgx, rvu));
3247-
tx_credits = ((CGX_FIFO_LEN / lmac_cnt) - NIC_HW_MAX_FRS) / 16;
3308+
tx_credits = ((rvu_cgx_get_fifolen(rvu) / lmac_cnt) -
3309+
lmac_max_frs) / 16;
32483310
/* Enable credits and set credit pkt count to max allowed */
32493311
tx_credits = (tx_credits << 12) | (0x1FF << 2) | BIT_ULL(1);
32503312
slink = cgx * hw->lmac_per_cgx;
@@ -3258,7 +3320,7 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
32583320
/* Set Tx credits for LBK link */
32593321
slink = hw->cgx_links;
32603322
for (link = slink; link < (slink + hw->lbk_links); link++) {
3261-
tx_credits = 1000; /* 10 * max LBK datarate = 10 * 100Gbps */
3323+
tx_credits = rvu_get_lbk_link_credits(rvu, lbk_max_frs);
32623324
/* Enable credits and set credit pkt count to max allowed */
32633325
tx_credits = (tx_credits << 12) | (0x1FF << 2) | BIT_ULL(1);
32643326
rvu_write64(rvu, blkaddr,

0 commit comments

Comments
 (0)