Commit a84cdcea authored by Subbaraya Sundeep's avatar Subbaraya Sundeep Committed by Jakub Kicinski

octeontx2-af: Mbox changes for 98xx

This patch puts together all mailbox changes
for 98xx silicon:

Attach ->
Modify resource attach mailbox handler to
request LFs from a block address out of multiple
blocks of same type. If a PF/VF need LFs from two
blocks of same type then attach mbox should be
called twice.

Example:
        struct rsrc_attach *attach;
        .. Allocate memory for message ..
        attach->cptlfs = 3; /* 3 LFs from CPT0 */
        .. Send message ..
        .. Allocate memory for message ..
        attach->modify = 1;
        attach->cpt_blkaddr = BLKADDR_CPT1;
        attach->cptlfs = 2; /* 2 LFs from CPT1 */
        .. Send message ..

Detach ->
Update detach mailbox and its handler to detach
resources from CPT1 and NIX1 blocks.

MSIX ->
Updated the MSIX mailbox and its handler to return
MSIX offsets for the new block CPT1.

Free resources ->
Update free_rsrc mailbox and its handler to return
the free resources count of new blocks NIX1 and CPT1

Links ->
Number of CGX,LBK and SDP links may vary between
platforms. For example, in 98xx number of CGX and LBK
links are more than 96xx. Hence the info about number
of links present in hardware is useful for consumers to
request link configuration properly. This patch sends
this info in nix_lf_alloc_rsp.
Signed-off-by: default avatarSubbaraya Sundeep <sbhatta@marvell.com>
Signed-off-by: default avatarSunil Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarRakesh Babu <rsaladi2@marvell.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1c1935c9
...@@ -86,7 +86,7 @@ struct mbox_msghdr { ...@@ -86,7 +86,7 @@ struct mbox_msghdr {
#define OTX2_MBOX_REQ_SIG (0xdead) #define OTX2_MBOX_REQ_SIG (0xdead)
#define OTX2_MBOX_RSP_SIG (0xbeef) #define OTX2_MBOX_RSP_SIG (0xbeef)
u16 sig; /* Signature, for validating corrupted msgs */ u16 sig; /* Signature, for validating corrupted msgs */
#define OTX2_MBOX_VERSION (0x0001) #define OTX2_MBOX_VERSION (0x0007)
u16 ver; /* Version of msg's structure for this ID */ u16 ver; /* Version of msg's structure for this ID */
u16 next_msgoff; /* Offset of next msg within mailbox region */ u16 next_msgoff; /* Offset of next msg within mailbox region */
int rc; /* Msg process'ed response code */ int rc; /* Msg process'ed response code */
...@@ -271,6 +271,17 @@ struct ready_msg_rsp { ...@@ -271,6 +271,17 @@ struct ready_msg_rsp {
* or to detach partial of a cetain resource type. * or to detach partial of a cetain resource type.
* Rest of the fields specify how many of what type to * Rest of the fields specify how many of what type to
* be attached. * be attached.
* To request LFs from two blocks of same type this mailbox
* can be sent twice as below:
* struct rsrc_attach *attach;
* .. Allocate memory for message ..
* attach->cptlfs = 3; <3 LFs from CPT0>
* .. Send message ..
* .. Allocate memory for message ..
* attach->modify = 1;
* attach->cpt_blkaddr = BLKADDR_CPT1;
* attach->cptlfs = 2; <2 LFs from CPT1>
* .. Send message ..
*/ */
struct rsrc_attach { struct rsrc_attach {
struct mbox_msghdr hdr; struct mbox_msghdr hdr;
...@@ -281,6 +292,7 @@ struct rsrc_attach { ...@@ -281,6 +292,7 @@ struct rsrc_attach {
u16 ssow; u16 ssow;
u16 timlfs; u16 timlfs;
u16 cptlfs; u16 cptlfs;
int cpt_blkaddr; /* BLKADDR_CPT0/BLKADDR_CPT1 or 0 for BLKADDR_CPT0 */
}; };
/* Structure for relinquishing resources. /* Structure for relinquishing resources.
...@@ -314,6 +326,8 @@ struct msix_offset_rsp { ...@@ -314,6 +326,8 @@ struct msix_offset_rsp {
u16 ssow_msixoff[MAX_RVU_BLKLF_CNT]; u16 ssow_msixoff[MAX_RVU_BLKLF_CNT];
u16 timlf_msixoff[MAX_RVU_BLKLF_CNT]; u16 timlf_msixoff[MAX_RVU_BLKLF_CNT];
u16 cptlf_msixoff[MAX_RVU_BLKLF_CNT]; u16 cptlf_msixoff[MAX_RVU_BLKLF_CNT];
u8 cpt1_lfs;
u16 cpt1_lf_msixoff[MAX_RVU_BLKLF_CNT];
}; };
struct get_hw_cap_rsp { struct get_hw_cap_rsp {
...@@ -491,6 +505,9 @@ struct nix_lf_alloc_rsp { ...@@ -491,6 +505,9 @@ struct nix_lf_alloc_rsp {
u8 lf_tx_stats; /* NIX_AF_CONST1::LF_TX_STATS */ u8 lf_tx_stats; /* NIX_AF_CONST1::LF_TX_STATS */
u16 cints; /* NIX_AF_CONST2::CINTS */ u16 cints; /* NIX_AF_CONST2::CINTS */
u16 qints; /* NIX_AF_CONST2::QINTS */ u16 qints; /* NIX_AF_CONST2::QINTS */
u8 cgx_links; /* No. of CGX links present in HW */
u8 lbk_links; /* No. of LBK links present in HW */
u8 sdp_links; /* No. of SDP links present in HW */
}; };
/* NIX AQ enqueue msg */ /* NIX AQ enqueue msg */
......
...@@ -1229,6 +1229,8 @@ static int rvu_detach_rsrcs(struct rvu *rvu, struct rsrc_detach *detach, ...@@ -1229,6 +1229,8 @@ static int rvu_detach_rsrcs(struct rvu *rvu, struct rsrc_detach *detach,
continue; continue;
else if ((blkid == BLKADDR_NIX0) && !detach->nixlf) else if ((blkid == BLKADDR_NIX0) && !detach->nixlf)
continue; continue;
else if ((blkid == BLKADDR_NIX1) && !detach->nixlf)
continue;
else if ((blkid == BLKADDR_SSO) && !detach->sso) else if ((blkid == BLKADDR_SSO) && !detach->sso)
continue; continue;
else if ((blkid == BLKADDR_SSOW) && !detach->ssow) else if ((blkid == BLKADDR_SSOW) && !detach->ssow)
...@@ -1237,6 +1239,8 @@ static int rvu_detach_rsrcs(struct rvu *rvu, struct rsrc_detach *detach, ...@@ -1237,6 +1239,8 @@ static int rvu_detach_rsrcs(struct rvu *rvu, struct rsrc_detach *detach,
continue; continue;
else if ((blkid == BLKADDR_CPT0) && !detach->cptlfs) else if ((blkid == BLKADDR_CPT0) && !detach->cptlfs)
continue; continue;
else if ((blkid == BLKADDR_CPT1) && !detach->cptlfs)
continue;
} }
rvu_detach_block(rvu, pcifunc, block->type); rvu_detach_block(rvu, pcifunc, block->type);
} }
...@@ -1290,7 +1294,8 @@ static int rvu_get_nix_blkaddr(struct rvu *rvu, u16 pcifunc) ...@@ -1290,7 +1294,8 @@ static int rvu_get_nix_blkaddr(struct rvu *rvu, u16 pcifunc)
return pfvf->nix_blkaddr; return pfvf->nix_blkaddr;
} }
static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc) static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype,
u16 pcifunc, struct rsrc_attach *attach)
{ {
int blkaddr; int blkaddr;
...@@ -1298,6 +1303,14 @@ static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc) ...@@ -1298,6 +1303,14 @@ static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc)
case BLKTYPE_NIX: case BLKTYPE_NIX:
blkaddr = rvu_get_nix_blkaddr(rvu, pcifunc); blkaddr = rvu_get_nix_blkaddr(rvu, pcifunc);
break; break;
case BLKTYPE_CPT:
if (attach->hdr.ver < RVU_MULTI_BLK_VER)
return rvu_get_blkaddr(rvu, blktype, 0);
blkaddr = attach->cpt_blkaddr ? attach->cpt_blkaddr :
BLKADDR_CPT0;
if (blkaddr != BLKADDR_CPT0 && blkaddr != BLKADDR_CPT1)
return -ENODEV;
break;
default: default:
return rvu_get_blkaddr(rvu, blktype, 0); return rvu_get_blkaddr(rvu, blktype, 0);
}; };
...@@ -1308,8 +1321,8 @@ static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc) ...@@ -1308,8 +1321,8 @@ static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc)
return -ENODEV; return -ENODEV;
} }
static void rvu_attach_block(struct rvu *rvu, int pcifunc, static void rvu_attach_block(struct rvu *rvu, int pcifunc, int blktype,
int blktype, int num_lfs) int num_lfs, struct rsrc_attach *attach)
{ {
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc); struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
struct rvu_hwinfo *hw = rvu->hw; struct rvu_hwinfo *hw = rvu->hw;
...@@ -1321,7 +1334,7 @@ static void rvu_attach_block(struct rvu *rvu, int pcifunc, ...@@ -1321,7 +1334,7 @@ static void rvu_attach_block(struct rvu *rvu, int pcifunc,
if (!num_lfs) if (!num_lfs)
return; return;
blkaddr = rvu_get_attach_blkaddr(rvu, blktype, pcifunc); blkaddr = rvu_get_attach_blkaddr(rvu, blktype, pcifunc, attach);
if (blkaddr < 0) if (blkaddr < 0)
return; return;
...@@ -1369,7 +1382,8 @@ static int rvu_check_rsrc_availability(struct rvu *rvu, ...@@ -1369,7 +1382,8 @@ static int rvu_check_rsrc_availability(struct rvu *rvu,
/* Only one NIX LF can be attached */ /* Only one NIX LF can be attached */
if (req->nixlf && !is_blktype_attached(pfvf, BLKTYPE_NIX)) { if (req->nixlf && !is_blktype_attached(pfvf, BLKTYPE_NIX)) {
blkaddr = rvu_get_attach_blkaddr(rvu, BLKTYPE_NIX, pcifunc); blkaddr = rvu_get_attach_blkaddr(rvu, BLKTYPE_NIX,
pcifunc, req);
if (blkaddr < 0) if (blkaddr < 0)
return blkaddr; return blkaddr;
block = &hw->block[blkaddr]; block = &hw->block[blkaddr];
...@@ -1431,7 +1445,11 @@ static int rvu_check_rsrc_availability(struct rvu *rvu, ...@@ -1431,7 +1445,11 @@ static int rvu_check_rsrc_availability(struct rvu *rvu,
} }
if (req->cptlfs) { if (req->cptlfs) {
block = &hw->block[BLKADDR_CPT0]; blkaddr = rvu_get_attach_blkaddr(rvu, BLKTYPE_CPT,
pcifunc, req);
if (blkaddr < 0)
return blkaddr;
block = &hw->block[blkaddr];
if (req->cptlfs > block->lf.max) { if (req->cptlfs > block->lf.max) {
dev_err(&rvu->pdev->dev, dev_err(&rvu->pdev->dev,
"Func 0x%x: Invalid CPTLF req, %d > max %d\n", "Func 0x%x: Invalid CPTLF req, %d > max %d\n",
...@@ -1452,6 +1470,22 @@ static int rvu_check_rsrc_availability(struct rvu *rvu, ...@@ -1452,6 +1470,22 @@ static int rvu_check_rsrc_availability(struct rvu *rvu,
return -ENOSPC; return -ENOSPC;
} }
static bool rvu_attach_from_same_block(struct rvu *rvu, int blktype,
struct rsrc_attach *attach)
{
int blkaddr, num_lfs;
blkaddr = rvu_get_attach_blkaddr(rvu, blktype,
attach->hdr.pcifunc, attach);
if (blkaddr < 0)
return false;
num_lfs = rvu_get_rsrc_mapcount(rvu_get_pfvf(rvu, attach->hdr.pcifunc),
blkaddr);
/* Requester already has LFs from given block ? */
return !!num_lfs;
}
int rvu_mbox_handler_attach_resources(struct rvu *rvu, int rvu_mbox_handler_attach_resources(struct rvu *rvu,
struct rsrc_attach *attach, struct rsrc_attach *attach,
struct msg_rsp *rsp) struct msg_rsp *rsp)
...@@ -1472,10 +1506,10 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu, ...@@ -1472,10 +1506,10 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu,
/* Now attach the requested resources */ /* Now attach the requested resources */
if (attach->npalf) if (attach->npalf)
rvu_attach_block(rvu, pcifunc, BLKTYPE_NPA, 1); rvu_attach_block(rvu, pcifunc, BLKTYPE_NPA, 1, attach);
if (attach->nixlf) if (attach->nixlf)
rvu_attach_block(rvu, pcifunc, BLKTYPE_NIX, 1); rvu_attach_block(rvu, pcifunc, BLKTYPE_NIX, 1, attach);
if (attach->sso) { if (attach->sso) {
/* RVU func doesn't know which exact LF or slot is attached /* RVU func doesn't know which exact LF or slot is attached
...@@ -1485,25 +1519,30 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu, ...@@ -1485,25 +1519,30 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu,
*/ */
if (attach->modify) if (attach->modify)
rvu_detach_block(rvu, pcifunc, BLKTYPE_SSO); rvu_detach_block(rvu, pcifunc, BLKTYPE_SSO);
rvu_attach_block(rvu, pcifunc, BLKTYPE_SSO, attach->sso); rvu_attach_block(rvu, pcifunc, BLKTYPE_SSO,
attach->sso, attach);
} }
if (attach->ssow) { if (attach->ssow) {
if (attach->modify) if (attach->modify)
rvu_detach_block(rvu, pcifunc, BLKTYPE_SSOW); rvu_detach_block(rvu, pcifunc, BLKTYPE_SSOW);
rvu_attach_block(rvu, pcifunc, BLKTYPE_SSOW, attach->ssow); rvu_attach_block(rvu, pcifunc, BLKTYPE_SSOW,
attach->ssow, attach);
} }
if (attach->timlfs) { if (attach->timlfs) {
if (attach->modify) if (attach->modify)
rvu_detach_block(rvu, pcifunc, BLKTYPE_TIM); rvu_detach_block(rvu, pcifunc, BLKTYPE_TIM);
rvu_attach_block(rvu, pcifunc, BLKTYPE_TIM, attach->timlfs); rvu_attach_block(rvu, pcifunc, BLKTYPE_TIM,
attach->timlfs, attach);
} }
if (attach->cptlfs) { if (attach->cptlfs) {
if (attach->modify) if (attach->modify &&
rvu_attach_from_same_block(rvu, BLKTYPE_CPT, attach))
rvu_detach_block(rvu, pcifunc, BLKTYPE_CPT); rvu_detach_block(rvu, pcifunc, BLKTYPE_CPT);
rvu_attach_block(rvu, pcifunc, BLKTYPE_CPT, attach->cptlfs); rvu_attach_block(rvu, pcifunc, BLKTYPE_CPT,
attach->cptlfs, attach);
} }
exit: exit:
...@@ -1581,7 +1620,7 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req, ...@@ -1581,7 +1620,7 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req,
struct rvu_hwinfo *hw = rvu->hw; struct rvu_hwinfo *hw = rvu->hw;
u16 pcifunc = req->hdr.pcifunc; u16 pcifunc = req->hdr.pcifunc;
struct rvu_pfvf *pfvf; struct rvu_pfvf *pfvf;
int lf, slot; int lf, slot, blkaddr;
pfvf = rvu_get_pfvf(rvu, pcifunc); pfvf = rvu_get_pfvf(rvu, pcifunc);
if (!pfvf->msix.bmap) if (!pfvf->msix.bmap)
...@@ -1591,8 +1630,14 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req, ...@@ -1591,8 +1630,14 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req,
lf = rvu_get_lf(rvu, &hw->block[BLKADDR_NPA], pcifunc, 0); lf = rvu_get_lf(rvu, &hw->block[BLKADDR_NPA], pcifunc, 0);
rsp->npa_msixoff = rvu_get_msix_offset(rvu, pfvf, BLKADDR_NPA, lf); rsp->npa_msixoff = rvu_get_msix_offset(rvu, pfvf, BLKADDR_NPA, lf);
lf = rvu_get_lf(rvu, &hw->block[BLKADDR_NIX0], pcifunc, 0); /* Get BLKADDR from which LFs are attached to pcifunc */
rsp->nix_msixoff = rvu_get_msix_offset(rvu, pfvf, BLKADDR_NIX0, lf); blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
if (blkaddr < 0) {
rsp->nix_msixoff = MSIX_VECTOR_INVALID;
} else {
lf = rvu_get_lf(rvu, &hw->block[blkaddr], pcifunc, 0);
rsp->nix_msixoff = rvu_get_msix_offset(rvu, pfvf, blkaddr, lf);
}
rsp->sso = pfvf->sso; rsp->sso = pfvf->sso;
for (slot = 0; slot < rsp->sso; slot++) { for (slot = 0; slot < rsp->sso; slot++) {
...@@ -1621,6 +1666,14 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req, ...@@ -1621,6 +1666,14 @@ int rvu_mbox_handler_msix_offset(struct rvu *rvu, struct msg_req *req,
rsp->cptlf_msixoff[slot] = rsp->cptlf_msixoff[slot] =
rvu_get_msix_offset(rvu, pfvf, BLKADDR_CPT0, lf); rvu_get_msix_offset(rvu, pfvf, BLKADDR_CPT0, lf);
} }
rsp->cpt1_lfs = pfvf->cpt1_lfs;
for (slot = 0; slot < rsp->cpt1_lfs; slot++) {
lf = rvu_get_lf(rvu, &hw->block[BLKADDR_CPT1], pcifunc, slot);
rsp->cpt1_lf_msixoff[slot] =
rvu_get_msix_offset(rvu, pfvf, BLKADDR_CPT1, lf);
}
return 0; return 0;
} }
......
...@@ -1217,6 +1217,10 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu, ...@@ -1217,6 +1217,10 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2); cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
rsp->qints = ((cfg >> 12) & 0xFFF); rsp->qints = ((cfg >> 12) & 0xFFF);
rsp->cints = ((cfg >> 24) & 0xFFF); rsp->cints = ((cfg >> 24) & 0xFFF);
rsp->cgx_links = hw->cgx_links;
rsp->lbk_links = hw->lbk_links;
rsp->sdp_links = hw->sdp_links;
return rc; return rc;
} }
......
...@@ -35,7 +35,7 @@ static struct hw_reg_map txsch_reg_map[NIX_TXSCH_LVL_CNT] = { ...@@ -35,7 +35,7 @@ static struct hw_reg_map txsch_reg_map[NIX_TXSCH_LVL_CNT] = {
{0x1200, 0x12E0} } }, {0x1200, 0x12E0} } },
{NIX_TXSCH_LVL_TL3, 3, 0xFFFF, {{0x1000, 0x10E0}, {0x1600, 0x1608}, {NIX_TXSCH_LVL_TL3, 3, 0xFFFF, {{0x1000, 0x10E0}, {0x1600, 0x1608},
{0x1610, 0x1618} } }, {0x1610, 0x1618} } },
{NIX_TXSCH_LVL_TL2, 2, 0xFFFF, {{0x0E00, 0x0EE0}, {0x1700, 0x1768} } }, {NIX_TXSCH_LVL_TL2, 2, 0xFFFF, {{0x0E00, 0x0EE0}, {0x1700, 0x17B0} } },
{NIX_TXSCH_LVL_TL1, 1, 0xFFFF, {{0x0C00, 0x0D98} } }, {NIX_TXSCH_LVL_TL1, 1, 0xFFFF, {{0x0C00, 0x0D98} } },
}; };
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
/* RVU Block revision IDs */ /* RVU Block revision IDs */
#define RVU_BLK_RVUM_REVID 0x01 #define RVU_BLK_RVUM_REVID 0x01
#define RVU_MULTI_BLK_VER 0x7ULL
/* RVU Block Address Enumeration */ /* RVU Block Address Enumeration */
enum rvu_block_addr_e { enum rvu_block_addr_e {
BLKADDR_RVUM = 0x0ULL, BLKADDR_RVUM = 0x0ULL,
......
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