octeontx2-af: Mailbox changes for 98xx CPT block
authorSrujana Challa <schalla@marvell.com>
Tue, 2 Feb 2021 15:27:07 +0000 (20:57 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 4 Feb 2021 01:31:34 +0000 (17:31 -0800)
This patch changes CPT mailbox message format to
support new block CPT1 in 98xx silicon.

cpt_rd_wr_reg ->
    Modify cpt_rd_wr_reg mailbox and its handler to
    accommodate new block CPT1.
cpt_lf_alloc ->
    Modify cpt_lf_alloc mailbox and its handler to
    configure LFs from a block address out of multiple
    blocks of same type. If a PF/VF needs to configure
    LFs from both the blocks then this mbox should be
    called twice.

Signed-off-by: Mahipal Challa <mchalla@marvell.com>
Signed-off-by: Srujana Challa <schalla@marvell.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/af/mbox.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c

index 89e93eb46ab733de56034f8d630e6fb4bec613fa..a0fa44941204aad295fa6c0fd205fe2eb27ce184 100644 (file)
@@ -1073,6 +1073,7 @@ struct cpt_rd_wr_reg_msg {
        u64 *ret_val;
        u64 val;
        u8 is_write;
+       int blkaddr;
 };
 
 struct cpt_lf_alloc_req_msg {
@@ -1080,6 +1081,7 @@ struct cpt_lf_alloc_req_msg {
        u16 nix_pf_func;
        u16 sso_pf_func;
        u16 eng_grpmsk;
+       int blkaddr;
 };
 
 #endif /* MBOX_H */
index 35261d52c997f1f6cfe470dfc8f7d97c2003e4bd..b6de4b95a72a05552bb57a2a37131d4528606365 100644 (file)
@@ -65,13 +65,13 @@ int rvu_mbox_handler_cpt_lf_alloc(struct rvu *rvu,
        int num_lfs, slot;
        u64 val;
 
+       blkaddr = req->blkaddr ? req->blkaddr : BLKADDR_CPT0;
+       if (blkaddr != BLKADDR_CPT0 && blkaddr != BLKADDR_CPT1)
+               return -ENODEV;
+
        if (req->eng_grpmsk == 0x0)
                return CPT_AF_ERR_GRP_INVALID;
 
-       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_CPT, 0);
-       if (blkaddr < 0)
-               return blkaddr;
-
        block = &rvu->hw->block[blkaddr];
        num_lfs = rvu_get_rsrc_mapcount(rvu_get_pfvf(rvu, pcifunc),
                                        block->addr);
@@ -114,23 +114,17 @@ int rvu_mbox_handler_cpt_lf_alloc(struct rvu *rvu,
        return 0;
 }
 
-int rvu_mbox_handler_cpt_lf_free(struct rvu *rvu, struct msg_req *req,
-                                struct msg_rsp *rsp)
+static int cpt_lf_free(struct rvu *rvu, struct msg_req *req, int blkaddr)
 {
        u16 pcifunc = req->hdr.pcifunc;
+       int num_lfs, cptlf, slot;
        struct rvu_block *block;
-       int cptlf, blkaddr;
-       int num_lfs, slot;
-
-       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_CPT, 0);
-       if (blkaddr < 0)
-               return blkaddr;
 
        block = &rvu->hw->block[blkaddr];
        num_lfs = rvu_get_rsrc_mapcount(rvu_get_pfvf(rvu, pcifunc),
                                        block->addr);
        if (!num_lfs)
-               return CPT_AF_ERR_LF_INVALID;
+               return 0;
 
        for (slot = 0; slot < num_lfs; slot++) {
                cptlf = rvu_get_lf(rvu, block, pcifunc, slot);
@@ -146,6 +140,21 @@ int rvu_mbox_handler_cpt_lf_free(struct rvu *rvu, struct msg_req *req,
        return 0;
 }
 
+int rvu_mbox_handler_cpt_lf_free(struct rvu *rvu, struct msg_req *req,
+                                struct msg_rsp *rsp)
+{
+       int ret;
+
+       ret = cpt_lf_free(rvu, req, BLKADDR_CPT0);
+       if (ret)
+               return ret;
+
+       if (is_block_implemented(rvu->hw, BLKADDR_CPT1))
+               ret = cpt_lf_free(rvu, req, BLKADDR_CPT1);
+
+       return ret;
+}
+
 static bool is_valid_offset(struct rvu *rvu, struct cpt_rd_wr_reg_msg *req)
 {
        u64 offset = req->reg_offset;
@@ -208,9 +217,9 @@ int rvu_mbox_handler_cpt_rd_wr_register(struct rvu *rvu,
 {
        int blkaddr;
 
-       blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_CPT, 0);
-       if (blkaddr < 0)
-               return blkaddr;
+       blkaddr = req->blkaddr ? req->blkaddr : BLKADDR_CPT0;
+       if (blkaddr != BLKADDR_CPT0 && blkaddr != BLKADDR_CPT1)
+               return -ENODEV;
 
        /* This message is accepted only if sent from CPT PF/VF */
        if (!is_cpt_pf(rvu, req->hdr.pcifunc) &&