Commit 49d6baea authored by Harman Kalra's avatar Harman Kalra Committed by David S. Miller

octeontx2-af: cn10K: support for sched lmtst and other features

Enhancing the mailbox scope to support important configurations
like enabling scheduled LMTST, disable LMTLINE prefetch, disable
early completion for ordered LMTST, as per request from the
application. On FLR these configurations will be reset to default.
This patch also adds the 95XXO silicon version to octeontx2 silicon
list.
Signed-off-by: default avatarHarman Kalra <hkalra@marvell.com>
Signed-off-by: default avatarSunil Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarGeetha sowjanya <gakula@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0c1f5f2a
...@@ -273,7 +273,7 @@ M(NIX_BP_ENABLE, 0x8016, nix_bp_enable, nix_bp_cfg_req, \ ...@@ -273,7 +273,7 @@ M(NIX_BP_ENABLE, 0x8016, nix_bp_enable, nix_bp_cfg_req, \
nix_bp_cfg_rsp) \ nix_bp_cfg_rsp) \
M(NIX_BP_DISABLE, 0x8017, nix_bp_disable, nix_bp_cfg_req, msg_rsp) \ M(NIX_BP_DISABLE, 0x8017, nix_bp_disable, nix_bp_cfg_req, msg_rsp) \
M(NIX_GET_MAC_ADDR, 0x8018, nix_get_mac_addr, msg_req, nix_get_mac_addr_rsp) \ M(NIX_GET_MAC_ADDR, 0x8018, nix_get_mac_addr, msg_req, nix_get_mac_addr_rsp) \
M(NIX_CN10K_AQ_ENQ, 0x8019, nix_cn10k_aq_enq, nix_cn10k_aq_enq_req, \ M(NIX_CN10K_AQ_ENQ, 0x801b, nix_cn10k_aq_enq, nix_cn10k_aq_enq_req, \
nix_cn10k_aq_enq_rsp) \ nix_cn10k_aq_enq_rsp) \
M(NIX_GET_HW_INFO, 0x801c, nix_get_hw_info, msg_req, nix_hw_info) \ M(NIX_GET_HW_INFO, 0x801c, nix_get_hw_info, msg_req, nix_hw_info) \
M(NIX_BANDPROF_ALLOC, 0x801d, nix_bandprof_alloc, nix_bandprof_alloc_req, \ M(NIX_BANDPROF_ALLOC, 0x801d, nix_bandprof_alloc, nix_bandprof_alloc_req, \
...@@ -1383,6 +1383,10 @@ struct set_vf_perm { ...@@ -1383,6 +1383,10 @@ struct set_vf_perm {
struct lmtst_tbl_setup_req { struct lmtst_tbl_setup_req {
struct mbox_msghdr hdr; struct mbox_msghdr hdr;
u64 dis_sched_early_comp :1;
u64 sch_ena :1;
u64 dis_line_pref :1;
u64 ssow_pf_func :13;
u16 base_pcifunc; u16 base_pcifunc;
u8 use_local_lmt_region; u8 use_local_lmt_region;
u64 lmt_iova; u64 lmt_iova;
......
...@@ -245,6 +245,7 @@ struct rvu_pfvf { ...@@ -245,6 +245,7 @@ struct rvu_pfvf {
u8 nix_tx_intf; /* NIX0_TX/NIX1_TX interface to NPC */ u8 nix_tx_intf; /* NIX0_TX/NIX1_TX interface to NPC */
u8 lbkid; /* NIX0/1 lbk link ID */ u8 lbkid; /* NIX0/1 lbk link ID */
u64 lmt_base_addr; /* Preseving the pcifunc's lmtst base addr*/ u64 lmt_base_addr; /* Preseving the pcifunc's lmtst base addr*/
u64 lmt_map_ent_w1; /* Preseving the word1 of lmtst map table entry*/
unsigned long flags; unsigned long flags;
struct sdp_node_info *sdp_info; struct sdp_node_info *sdp_info;
}; };
...@@ -556,9 +557,10 @@ static inline bool is_rvu_95xx_A0(struct rvu *rvu) ...@@ -556,9 +557,10 @@ static inline bool is_rvu_95xx_A0(struct rvu *rvu)
*/ */
#define PCI_REVISION_ID_96XX 0x00 #define PCI_REVISION_ID_96XX 0x00
#define PCI_REVISION_ID_95XX 0x10 #define PCI_REVISION_ID_95XX 0x10
#define PCI_REVISION_ID_LOKI 0x20 #define PCI_REVISION_ID_95XXN 0x20
#define PCI_REVISION_ID_98XX 0x30 #define PCI_REVISION_ID_98XX 0x30
#define PCI_REVISION_ID_95XXMM 0x40 #define PCI_REVISION_ID_95XXMM 0x40
#define PCI_REVISION_ID_95XXO 0xE0
static inline bool is_rvu_otx2(struct rvu *rvu) static inline bool is_rvu_otx2(struct rvu *rvu)
{ {
...@@ -567,8 +569,8 @@ static inline bool is_rvu_otx2(struct rvu *rvu) ...@@ -567,8 +569,8 @@ static inline bool is_rvu_otx2(struct rvu *rvu)
u8 midr = pdev->revision & 0xF0; u8 midr = pdev->revision & 0xF0;
return (midr == PCI_REVISION_ID_96XX || midr == PCI_REVISION_ID_95XX || return (midr == PCI_REVISION_ID_96XX || midr == PCI_REVISION_ID_95XX ||
midr == PCI_REVISION_ID_LOKI || midr == PCI_REVISION_ID_98XX || midr == PCI_REVISION_ID_95XXN || midr == PCI_REVISION_ID_98XX ||
midr == PCI_REVISION_ID_95XXMM); midr == PCI_REVISION_ID_95XXMM || midr == PCI_REVISION_ID_95XXO);
} }
static inline u16 rvu_nix_chan_cgx(struct rvu *rvu, u8 cgxid, static inline u16 rvu_nix_chan_cgx(struct rvu *rvu, u8 cgxid,
......
...@@ -49,6 +49,7 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val, ...@@ -49,6 +49,7 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val,
return 0; return 0;
} }
#define LMT_MAP_TBL_W1_OFF 8
static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc) static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc)
{ {
return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) + return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) +
...@@ -131,9 +132,11 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu, ...@@ -131,9 +132,11 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu,
struct lmtst_tbl_setup_req *req, struct lmtst_tbl_setup_req *req,
struct msg_rsp *rsp) struct msg_rsp *rsp)
{ {
u64 lmt_addr, val; struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
u32 pri_tbl_idx; u32 pri_tbl_idx, tbl_idx;
u64 lmt_addr;
int err = 0; int err = 0;
u64 val;
/* Check if PF_FUNC wants to use it's own local memory as LMTLINE /* Check if PF_FUNC wants to use it's own local memory as LMTLINE
* region, if so, convert that IOVA to physical address and * region, if so, convert that IOVA to physical address and
...@@ -170,7 +173,7 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu, ...@@ -170,7 +173,7 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu,
dev_err(rvu->dev, dev_err(rvu->dev,
"Failed to read LMT map table: index 0x%x err %d\n", "Failed to read LMT map table: index 0x%x err %d\n",
pri_tbl_idx, err); pri_tbl_idx, err);
return err; goto error;
} }
/* Update the base lmt addr of secondary with primary's base /* Update the base lmt addr of secondary with primary's base
...@@ -181,7 +184,53 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu, ...@@ -181,7 +184,53 @@ int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu,
return err; return err;
} }
return 0; /* This mailbox can also be used to update word1 of APR_LMT_MAP_ENTRY_S
* like enabling scheduled LMTST, disable LMTLINE prefetch, disable
* early completion for ordered LMTST.
*/
if (req->sch_ena || req->dis_sched_early_comp || req->dis_line_pref) {
tbl_idx = rvu_get_lmtst_tbl_index(rvu, req->hdr.pcifunc);
err = lmtst_map_table_ops(rvu, tbl_idx + LMT_MAP_TBL_W1_OFF,
&val, LMT_TBL_OP_READ);
if (err) {
dev_err(rvu->dev,
"Failed to read LMT map table: index 0x%x err %d\n",
tbl_idx + LMT_MAP_TBL_W1_OFF, err);
goto error;
}
/* Storing lmt map table entry word1 default value as this needs
* to be reverted in FLR. Also making sure this default value
* doesn't get overwritten on multiple calls to this mailbox.
*/
if (!pfvf->lmt_map_ent_w1)
pfvf->lmt_map_ent_w1 = val;
/* Disable early completion for Ordered LMTSTs. */
if (req->dis_sched_early_comp)
val |= (req->dis_sched_early_comp <<
APR_LMT_MAP_ENT_DIS_SCH_CMP_SHIFT);
/* Enable scheduled LMTST */
if (req->sch_ena)
val |= (req->sch_ena << APR_LMT_MAP_ENT_SCH_ENA_SHIFT) |
req->ssow_pf_func;
/* Disables LMTLINE prefetch before receiving store data. */
if (req->dis_line_pref)
val |= (req->dis_line_pref <<
APR_LMT_MAP_ENT_DIS_LINE_PREF_SHIFT);
err = lmtst_map_table_ops(rvu, tbl_idx + LMT_MAP_TBL_W1_OFF,
&val, LMT_TBL_OP_WRITE);
if (err) {
dev_err(rvu->dev,
"Failed to update LMT map table: index 0x%x err %d\n",
tbl_idx + LMT_MAP_TBL_W1_OFF, err);
goto error;
}
}
error:
return err;
} }
/* Resetting the lmtst map table to original base addresses */ /* Resetting the lmtst map table to original base addresses */
...@@ -194,13 +243,15 @@ void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc) ...@@ -194,13 +243,15 @@ void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc)
if (is_rvu_otx2(rvu)) if (is_rvu_otx2(rvu))
return; return;
if (pfvf->lmt_base_addr) { if (pfvf->lmt_base_addr || pfvf->lmt_map_ent_w1) {
/* This corresponds to lmt map table index */ /* This corresponds to lmt map table index */
tbl_idx = rvu_get_lmtst_tbl_index(rvu, pcifunc); tbl_idx = rvu_get_lmtst_tbl_index(rvu, pcifunc);
/* Reverting back original lmt base addr for respective /* Reverting back original lmt base addr for respective
* pcifunc. * pcifunc.
*/ */
err = lmtst_map_table_ops(rvu, tbl_idx, &pfvf->lmt_base_addr, if (pfvf->lmt_base_addr) {
err = lmtst_map_table_ops(rvu, tbl_idx,
&pfvf->lmt_base_addr,
LMT_TBL_OP_WRITE); LMT_TBL_OP_WRITE);
if (err) if (err)
dev_err(rvu->dev, dev_err(rvu->dev,
...@@ -208,6 +259,21 @@ void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc) ...@@ -208,6 +259,21 @@ void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc)
tbl_idx, err); tbl_idx, err);
pfvf->lmt_base_addr = 0; pfvf->lmt_base_addr = 0;
} }
/* Reverting back to orginal word1 val of lmtst map table entry
* which underwent changes.
*/
if (pfvf->lmt_map_ent_w1) {
err = lmtst_map_table_ops(rvu,
tbl_idx + LMT_MAP_TBL_W1_OFF,
&pfvf->lmt_map_ent_w1,
LMT_TBL_OP_WRITE);
if (err)
dev_err(rvu->dev,
"Failed to update LMT map table: index 0x%x err %d\n",
tbl_idx + LMT_MAP_TBL_W1_OFF, err);
pfvf->lmt_map_ent_w1 = 0;
}
}
} }
int rvu_set_channels_base(struct rvu *rvu) int rvu_set_channels_base(struct rvu *rvu)
......
...@@ -704,5 +704,8 @@ ...@@ -704,5 +704,8 @@
#define APR_AF_LMT_CFG (0x000ull) #define APR_AF_LMT_CFG (0x000ull)
#define APR_AF_LMT_MAP_BASE (0x008ull) #define APR_AF_LMT_MAP_BASE (0x008ull)
#define APR_AF_LMT_CTL (0x010ull) #define APR_AF_LMT_CTL (0x010ull)
#define APR_LMT_MAP_ENT_DIS_SCH_CMP_SHIFT 23
#define APR_LMT_MAP_ENT_SCH_ENA_SHIFT 22
#define APR_LMT_MAP_ENT_DIS_LINE_PREF_SHIFT 21
#endif /* RVU_REG_H */ #endif /* RVU_REG_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment