Skip to content

Commit 8299ffe

Browse files
SruChalladavem330
authored andcommitted
octeontx2-af: add mbox to return CPT_AF_FLT_INT info
CPT HW would trigger the CPT AF FLT interrupt when CPT engines hits some uncorrectable errors and AF is the one which receives the interrupt and recovers the engines. This patch adds a mailbox for CPT VFs to request for CPT faulted and recovered engines info. Signed-off-by: Srujana Challa <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c0688ec commit 8299ffe

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ M(CPT_RXC_TIME_CFG, 0xA06, cpt_rxc_time_cfg, cpt_rxc_time_cfg_req, \
196196
msg_rsp) \
197197
M(CPT_CTX_CACHE_SYNC, 0xA07, cpt_ctx_cache_sync, msg_req, msg_rsp) \
198198
M(CPT_LF_RESET, 0xA08, cpt_lf_reset, cpt_lf_rst_req, msg_rsp) \
199+
M(CPT_FLT_ENG_INFO, 0xA09, cpt_flt_eng_info, cpt_flt_eng_info_req, \
200+
cpt_flt_eng_info_rsp) \
199201
/* SDP mbox IDs (range 0x1000 - 0x11FF) */ \
200202
M(SET_SDP_CHAN_INFO, 0x1000, set_sdp_chan_info, sdp_chan_info_msg, msg_rsp) \
201203
M(GET_SDP_CHAN_INFO, 0x1001, get_sdp_chan_info, msg_req, sdp_get_chan_info_msg) \
@@ -1702,6 +1704,21 @@ struct cpt_lf_rst_req {
17021704
u32 rsvd;
17031705
};
17041706

1707+
/* Mailbox message format to request for CPT faulted engines */
1708+
struct cpt_flt_eng_info_req {
1709+
struct mbox_msghdr hdr;
1710+
int blkaddr;
1711+
bool reset;
1712+
u32 rsvd;
1713+
};
1714+
1715+
struct cpt_flt_eng_info_rsp {
1716+
struct mbox_msghdr hdr;
1717+
u64 flt_eng_map[CPT_10K_AF_INT_VEC_RVU];
1718+
u64 rcvrd_eng_map[CPT_10K_AF_INT_VEC_RVU];
1719+
u64 rsvd;
1720+
};
1721+
17051722
struct sdp_node_info {
17061723
/* Node to which this PF belons to */
17071724
u8 node_id;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ struct rvu_block {
108108
u64 lfreset_reg;
109109
unsigned char name[NAME_SIZE];
110110
struct rvu *rvu;
111+
u64 cpt_flt_eng_map[3];
112+
u64 cpt_rcvrd_eng_map[3];
111113
};
112114

113115
struct nix_mcast {
@@ -526,6 +528,8 @@ struct rvu {
526528
struct list_head mcs_intrq_head;
527529
/* mcs interrupt queue lock */
528530
spinlock_t mcs_intrq_lock;
531+
/* CPT interrupt lock */
532+
spinlock_t cpt_intr_lock;
529533
};
530534

531535
static inline void rvu_write64(struct rvu *rvu, u64 block, u64 offset, u64 val)

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ static irqreturn_t cpt_af_flt_intr_handler(int vec, void *ptr)
7070

7171
rvu_write64(rvu, blkaddr, CPT_AF_EXEX_CTL2(eng), grp);
7272
rvu_write64(rvu, blkaddr, CPT_AF_EXEX_CTL(eng), val | 1ULL);
73+
74+
spin_lock(&rvu->cpt_intr_lock);
75+
block->cpt_flt_eng_map[vec] |= BIT_ULL(i);
76+
val = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_STS(eng));
77+
val = val & 0x3;
78+
if (val == 0x1 || val == 0x2)
79+
block->cpt_rcvrd_eng_map[vec] |= BIT_ULL(i);
80+
spin_unlock(&rvu->cpt_intr_lock);
7381
}
7482
rvu_write64(rvu, blkaddr, CPT_AF_FLTX_INT(vec), reg);
7583

@@ -899,6 +907,31 @@ int rvu_mbox_handler_cpt_lf_reset(struct rvu *rvu, struct cpt_lf_rst_req *req,
899907
return 0;
900908
}
901909

910+
int rvu_mbox_handler_cpt_flt_eng_info(struct rvu *rvu, struct cpt_flt_eng_info_req *req,
911+
struct cpt_flt_eng_info_rsp *rsp)
912+
{
913+
struct rvu_block *block;
914+
unsigned long flags;
915+
int blkaddr, vec;
916+
917+
blkaddr = validate_and_get_cpt_blkaddr(req->blkaddr);
918+
if (blkaddr < 0)
919+
return blkaddr;
920+
921+
block = &rvu->hw->block[blkaddr];
922+
for (vec = 0; vec < CPT_10K_AF_INT_VEC_RVU; vec++) {
923+
spin_lock_irqsave(&rvu->cpt_intr_lock, flags);
924+
rsp->flt_eng_map[vec] = block->cpt_flt_eng_map[vec];
925+
rsp->rcvrd_eng_map[vec] = block->cpt_rcvrd_eng_map[vec];
926+
if (req->reset) {
927+
block->cpt_flt_eng_map[vec] = 0x0;
928+
block->cpt_rcvrd_eng_map[vec] = 0x0;
929+
}
930+
spin_unlock_irqrestore(&rvu->cpt_intr_lock, flags);
931+
}
932+
return 0;
933+
}
934+
902935
static void cpt_rxc_teardown(struct rvu *rvu, int blkaddr)
903936
{
904937
struct cpt_rxc_time_cfg_req req, prev;
@@ -1182,5 +1215,7 @@ int rvu_cpt_init(struct rvu *rvu)
11821215
{
11831216
/* Retrieve CPT PF number */
11841217
rvu->cpt_pf_num = get_cpt_pf_num(rvu);
1218+
spin_lock_init(&rvu->cpt_intr_lock);
1219+
11851220
return 0;
11861221
}

0 commit comments

Comments
 (0)