]> www.infradead.org Git - users/hch/xfs.git/commitdiff
octeontx2-af: replace cpt slot with lf id on reg write
authorNithin Dabilpuram <ndabilpuram@marvell.com>
Wed, 10 Jul 2024 07:51:23 +0000 (13:21 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Jul 2024 12:42:00 +0000 (13:42 +0100)
Replace slot id with global CPT lf id on reg read/write as
CPTPF/VF driver would send slot number instead of global
lf id in the reg offset. And also update the mailbox response
with the global lf's register offset.

Fixes: ae454086e3c2 ("octeontx2-af: add mailbox interface for CPT")
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c

index f047185f38e0f38066037b744ec98d2a59fd9572..3e09d2285814709c0f4c3141f1b819580385abac 100644 (file)
@@ -696,7 +696,8 @@ int rvu_mbox_handler_cpt_rd_wr_register(struct rvu *rvu,
                                        struct cpt_rd_wr_reg_msg *req,
                                        struct cpt_rd_wr_reg_msg *rsp)
 {
-       int blkaddr;
+       u64 offset = req->reg_offset;
+       int blkaddr, lf;
 
        blkaddr = validate_and_get_cpt_blkaddr(req->blkaddr);
        if (blkaddr < 0)
@@ -707,17 +708,25 @@ int rvu_mbox_handler_cpt_rd_wr_register(struct rvu *rvu,
            !is_cpt_vf(rvu, req->hdr.pcifunc))
                return CPT_AF_ERR_ACCESS_DENIED;
 
-       rsp->reg_offset = req->reg_offset;
-       rsp->ret_val = req->ret_val;
-       rsp->is_write = req->is_write;
-
        if (!is_valid_offset(rvu, req))
                return CPT_AF_ERR_ACCESS_DENIED;
 
+       /* Translate local LF used by VFs to global CPT LF */
+       lf = rvu_get_lf(rvu, &rvu->hw->block[blkaddr], req->hdr.pcifunc,
+                       (offset & 0xFFF) >> 3);
+
+       /* Translate local LF's offset to global CPT LF's offset */
+       offset &= 0xFF000;
+       offset += lf << 3;
+
+       rsp->reg_offset = offset;
+       rsp->ret_val = req->ret_val;
+       rsp->is_write = req->is_write;
+
        if (req->is_write)
-               rvu_write64(rvu, blkaddr, req->reg_offset, req->val);
+               rvu_write64(rvu, blkaddr, offset, req->val);
        else
-               rsp->val = rvu_read64(rvu, blkaddr, req->reg_offset);
+               rsp->val = rvu_read64(rvu, blkaddr, offset);
 
        return 0;
 }