Skip to content

Commit e6a1604

Browse files
committed
Merge branch 'octeopntx2-LMTST-regions'
Geetha sowjanya says: ==================== Dynamic LMTST region setup This patch series allows RVU PF/VF to allocate memory for LMTST operations instead of using memory reserved by firmware which is mapped as device memory. The LMTST mapping table contains the RVU PF/VF LMTST memory base address entries. This table is used by hardware for LMTST operations. Patch1 introduces new mailbox message to update the LMTST table with the new allocated memory address. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents dbe69e4 + 5c05120 commit e6a1604

File tree

12 files changed

+281
-74
lines changed

12 files changed

+281
-74
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ M(MSIX_OFFSET, 0x005, msix_offset, msg_req, msix_offset_rsp) \
134134
M(VF_FLR, 0x006, vf_flr, msg_req, msg_rsp) \
135135
M(PTP_OP, 0x007, ptp_op, ptp_req, ptp_rsp) \
136136
M(GET_HW_CAP, 0x008, get_hw_cap, msg_req, get_hw_cap_rsp) \
137+
M(LMTST_TBL_SETUP, 0x00a, lmtst_tbl_setup, lmtst_tbl_setup_req, \
138+
msg_rsp) \
137139
M(SET_VF_PERM, 0x00b, set_vf_perm, set_vf_perm, msg_rsp) \
138140
/* CGX mbox IDs (range 0x200 - 0x3FF) */ \
139141
M(CGX_START_RXTX, 0x200, cgx_start_rxtx, msg_req, msg_rsp) \
@@ -1278,6 +1280,14 @@ struct set_vf_perm {
12781280
u64 flags;
12791281
};
12801282

1283+
struct lmtst_tbl_setup_req {
1284+
struct mbox_msghdr hdr;
1285+
u16 base_pcifunc;
1286+
u8 use_local_lmt_region;
1287+
u64 lmt_iova;
1288+
u64 rsvd[4];
1289+
};
1290+
12811291
/* CPT mailbox error codes
12821292
* Range 901 - 1000.
12831293
*/

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,6 +2333,7 @@ static void __rvu_flr_handler(struct rvu *rvu, u16 pcifunc)
23332333
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_SSOW);
23342334
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_SSO);
23352335
rvu_blklf_teardown(rvu, pcifunc, BLKADDR_NPA);
2336+
rvu_reset_lmt_map_tbl(rvu, pcifunc);
23362337
rvu_detach_rsrcs(rvu, NULL, pcifunc);
23372338
mutex_unlock(&rvu->flr_lock);
23382339
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ struct rvu_pfvf {
243243
u8 nix_blkaddr; /* BLKADDR_NIX0/1 assigned to this PF */
244244
u8 nix_rx_intf; /* NIX0_RX/NIX1_RX interface to NPC */
245245
u8 nix_tx_intf; /* NIX0_TX/NIX1_TX interface to NPC */
246+
u64 lmt_base_addr; /* Preseving the pcifunc's lmtst base addr*/
246247
unsigned long flags;
247248
};
248249

@@ -754,6 +755,9 @@ int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int lf, int slot);
754755
int rvu_set_channels_base(struct rvu *rvu);
755756
void rvu_program_channels(struct rvu *rvu);
756757

758+
/* CN10K RVU - LMT*/
759+
void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc);
760+
757761
#ifdef CONFIG_DEBUG_FS
758762
void rvu_dbg_init(struct rvu *rvu);
759763
void rvu_dbg_exit(struct rvu *rvu);

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

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,206 @@
1010
#include "cgx.h"
1111
#include "rvu_reg.h"
1212

13+
/* RVU LMTST */
14+
#define LMT_TBL_OP_READ 0
15+
#define LMT_TBL_OP_WRITE 1
16+
#define LMT_MAP_TABLE_SIZE (128 * 1024)
17+
#define LMT_MAPTBL_ENTRY_SIZE 16
18+
19+
/* Function to perform operations (read/write) on lmtst map table */
20+
static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val,
21+
int lmt_tbl_op)
22+
{
23+
void __iomem *lmt_map_base;
24+
u64 tbl_base;
25+
26+
tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
27+
28+
lmt_map_base = ioremap_wc(tbl_base, LMT_MAP_TABLE_SIZE);
29+
if (!lmt_map_base) {
30+
dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
31+
return -ENOMEM;
32+
}
33+
34+
if (lmt_tbl_op == LMT_TBL_OP_READ) {
35+
*val = readq(lmt_map_base + index);
36+
} else {
37+
writeq((*val), (lmt_map_base + index));
38+
/* Flushing the AP interceptor cache to make APR_LMT_MAP_ENTRY_S
39+
* changes effective. Write 1 for flush and read is being used as a
40+
* barrier and sets up a data dependency. Write to 0 after a write
41+
* to 1 to complete the flush.
42+
*/
43+
rvu_write64(rvu, BLKADDR_APR, APR_AF_LMT_CTL, BIT_ULL(0));
44+
rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CTL);
45+
rvu_write64(rvu, BLKADDR_APR, APR_AF_LMT_CTL, 0x00);
46+
}
47+
48+
iounmap(lmt_map_base);
49+
return 0;
50+
}
51+
52+
static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc)
53+
{
54+
return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) +
55+
(pcifunc & RVU_PFVF_FUNC_MASK)) * LMT_MAPTBL_ENTRY_SIZE;
56+
}
57+
58+
static int rvu_get_lmtaddr(struct rvu *rvu, u16 pcifunc,
59+
u64 iova, u64 *lmt_addr)
60+
{
61+
u64 pa, val, pf;
62+
int err;
63+
64+
if (!iova) {
65+
dev_err(rvu->dev, "%s Requested Null address for transulation\n", __func__);
66+
return -EINVAL;
67+
}
68+
69+
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_REQ, iova);
70+
pf = rvu_get_pf(pcifunc) & 0x1F;
71+
val = BIT_ULL(63) | BIT_ULL(14) | BIT_ULL(13) | pf << 8 |
72+
((pcifunc & RVU_PFVF_FUNC_MASK) & 0xFF);
73+
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_TXN_REQ, val);
74+
75+
err = rvu_poll_reg(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_RSP_STS, BIT_ULL(0), false);
76+
if (err) {
77+
dev_err(rvu->dev, "%s LMTLINE iova transulation failed\n", __func__);
78+
return err;
79+
}
80+
val = rvu_read64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_RSP_STS);
81+
if (val & ~0x1ULL) {
82+
dev_err(rvu->dev, "%s LMTLINE iova transulation failed err:%llx\n", __func__, val);
83+
return -EIO;
84+
}
85+
/* PA[51:12] = RVU_AF_SMMU_TLN_FLIT1[60:21]
86+
* PA[11:0] = IOVA[11:0]
87+
*/
88+
pa = rvu_read64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_TLN_FLIT1) >> 21;
89+
pa &= GENMASK_ULL(39, 0);
90+
*lmt_addr = (pa << 12) | (iova & 0xFFF);
91+
92+
return 0;
93+
}
94+
95+
static int rvu_update_lmtaddr(struct rvu *rvu, u16 pcifunc, u64 lmt_addr)
96+
{
97+
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
98+
u32 tbl_idx;
99+
int err = 0;
100+
u64 val;
101+
102+
/* Read the current lmt addr of pcifunc */
103+
tbl_idx = rvu_get_lmtst_tbl_index(rvu, pcifunc);
104+
err = lmtst_map_table_ops(rvu, tbl_idx, &val, LMT_TBL_OP_READ);
105+
if (err) {
106+
dev_err(rvu->dev,
107+
"Failed to read LMT map table: index 0x%x err %d\n",
108+
tbl_idx, err);
109+
return err;
110+
}
111+
112+
/* Storing the seondary's lmt base address as this needs to be
113+
* reverted in FLR. Also making sure this default value doesn't
114+
* get overwritten on multiple calls to this mailbox.
115+
*/
116+
if (!pfvf->lmt_base_addr)
117+
pfvf->lmt_base_addr = val;
118+
119+
/* Update the LMT table with new addr */
120+
err = lmtst_map_table_ops(rvu, tbl_idx, &lmt_addr, LMT_TBL_OP_WRITE);
121+
if (err) {
122+
dev_err(rvu->dev,
123+
"Failed to update LMT map table: index 0x%x err %d\n",
124+
tbl_idx, err);
125+
return err;
126+
}
127+
return 0;
128+
}
129+
130+
int rvu_mbox_handler_lmtst_tbl_setup(struct rvu *rvu,
131+
struct lmtst_tbl_setup_req *req,
132+
struct msg_rsp *rsp)
133+
{
134+
u64 lmt_addr, val;
135+
u32 pri_tbl_idx;
136+
int err = 0;
137+
138+
/* Check if PF_FUNC wants to use it's own local memory as LMTLINE
139+
* region, if so, convert that IOVA to physical address and
140+
* populate LMT table with that address
141+
*/
142+
if (req->use_local_lmt_region) {
143+
err = rvu_get_lmtaddr(rvu, req->hdr.pcifunc,
144+
req->lmt_iova, &lmt_addr);
145+
if (err < 0)
146+
return err;
147+
148+
/* Update the lmt addr for this PFFUNC in the LMT table */
149+
err = rvu_update_lmtaddr(rvu, req->hdr.pcifunc, lmt_addr);
150+
if (err)
151+
return err;
152+
}
153+
154+
/* Reconfiguring lmtst map table in lmt region shared mode i.e. make
155+
* multiple PF_FUNCs to share an LMTLINE region, so primary/base
156+
* pcifunc (which is passed as an argument to mailbox) is the one
157+
* whose lmt base address will be shared among other secondary
158+
* pcifunc (will be the one who is calling this mailbox).
159+
*/
160+
if (req->base_pcifunc) {
161+
/* Calculating the LMT table index equivalent to primary
162+
* pcifunc.
163+
*/
164+
pri_tbl_idx = rvu_get_lmtst_tbl_index(rvu, req->base_pcifunc);
165+
166+
/* Read the base lmt addr of the primary pcifunc */
167+
err = lmtst_map_table_ops(rvu, pri_tbl_idx, &val,
168+
LMT_TBL_OP_READ);
169+
if (err) {
170+
dev_err(rvu->dev,
171+
"Failed to read LMT map table: index 0x%x err %d\n",
172+
pri_tbl_idx, err);
173+
return err;
174+
}
175+
176+
/* Update the base lmt addr of secondary with primary's base
177+
* lmt addr.
178+
*/
179+
err = rvu_update_lmtaddr(rvu, req->hdr.pcifunc, val);
180+
if (err)
181+
return err;
182+
}
183+
184+
return 0;
185+
}
186+
187+
/* Resetting the lmtst map table to original base addresses */
188+
void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc)
189+
{
190+
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
191+
u32 tbl_idx;
192+
int err;
193+
194+
if (is_rvu_otx2(rvu))
195+
return;
196+
197+
if (pfvf->lmt_base_addr) {
198+
/* This corresponds to lmt map table index */
199+
tbl_idx = rvu_get_lmtst_tbl_index(rvu, pcifunc);
200+
/* Reverting back original lmt base addr for respective
201+
* pcifunc.
202+
*/
203+
err = lmtst_map_table_ops(rvu, tbl_idx, &pfvf->lmt_base_addr,
204+
LMT_TBL_OP_WRITE);
205+
if (err)
206+
dev_err(rvu->dev,
207+
"Failed to update LMT map table: index 0x%x err %d\n",
208+
tbl_idx, err);
209+
pfvf->lmt_base_addr = 0;
210+
}
211+
}
212+
13213
int rvu_set_channels_base(struct rvu *rvu)
14214
{
15215
struct rvu_hwinfo *hw = rvu->hw;

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949
#define RVU_AF_PFX_VF_BAR4_ADDR (0x5400 | (a) << 4)
5050
#define RVU_AF_PFX_VF_BAR4_CFG (0x5600 | (a) << 4)
5151
#define RVU_AF_PFX_LMTLINE_ADDR (0x5800 | (a) << 4)
52+
#define RVU_AF_SMMU_ADDR_REQ (0x6000)
53+
#define RVU_AF_SMMU_TXN_REQ (0x6008)
54+
#define RVU_AF_SMMU_ADDR_RSP_STS (0x6010)
55+
#define RVU_AF_SMMU_ADDR_TLN (0x6018)
56+
#define RVU_AF_SMMU_TLN_FLIT1 (0x6030)
5257

5358
/* Admin function's privileged PF/VF registers */
5459
#define RVU_PRIV_CONST (0x8000000)
@@ -692,4 +697,9 @@
692697
#define LBK_LINK_CFG_ID_MASK GENMASK_ULL(11, 6)
693698
#define LBK_LINK_CFG_BASE_MASK GENMASK_ULL(5, 0)
694699

700+
/* APR */
701+
#define APR_AF_LMT_CFG (0x000ull)
702+
#define APR_AF_LMT_MAP_BASE (0x008ull)
703+
#define APR_AF_LMT_CTL (0x010ull)
704+
695705
#endif /* RVU_REG_H */

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ enum rvu_block_addr_e {
3535
BLKADDR_NDC_NPA0 = 0xeULL,
3636
BLKADDR_NDC_NIX1_RX = 0x10ULL,
3737
BLKADDR_NDC_NIX1_TX = 0x11ULL,
38-
BLK_COUNT = 0x12ULL,
38+
BLKADDR_APR = 0x16ULL,
39+
BLK_COUNT = 0x17ULL,
3940
};
4041

4142
/* RVU Block Type Enumeration */

0 commit comments

Comments
 (0)