19b727f85SPavan Nikhilesh /* SPDX-License-Identifier: BSD-3-Clause 29b727f85SPavan Nikhilesh * Copyright(C) 2021 Marvell. 39b727f85SPavan Nikhilesh */ 49b727f85SPavan Nikhilesh 59b727f85SPavan Nikhilesh #include "roc_api.h" 69b727f85SPavan Nikhilesh #include "roc_priv.h" 79b727f85SPavan Nikhilesh 8efd8b8a7SPavan Nikhilesh #define SSO_XAQ_CACHE_CNT (0x3) 9efd8b8a7SPavan Nikhilesh #define SSO_XAQ_RSVD_CNT (0x4) 10c3320d21SPavan Nikhilesh #define SSO_XAQ_SLACK (16) 1149b0424fSPavan Nikhilesh 129b727f85SPavan Nikhilesh /* Private functions. */ 130423387fSNithin Dabilpuram int 140423387fSNithin Dabilpuram sso_lf_alloc(struct dev *dev, enum sso_lf_type lf_type, uint16_t nb_lf, 159b727f85SPavan Nikhilesh void **rsp) 169b727f85SPavan Nikhilesh { 1744a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 189b727f85SPavan Nikhilesh int rc = -ENOSPC; 199b727f85SPavan Nikhilesh 2080fa49e6SPavan Nikhilesh if (!nb_lf) { 2180fa49e6SPavan Nikhilesh mbox_put(mbox); 2280fa49e6SPavan Nikhilesh return 0; 2380fa49e6SPavan Nikhilesh } 2480fa49e6SPavan Nikhilesh 259b727f85SPavan Nikhilesh switch (lf_type) { 269b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWS: { 279b727f85SPavan Nikhilesh struct ssow_lf_alloc_req *req; 289b727f85SPavan Nikhilesh 2944a9307cSRakesh Kudurumalla req = mbox_alloc_msg_ssow_lf_alloc(mbox); 309b727f85SPavan Nikhilesh if (req == NULL) 3144a9307cSRakesh Kudurumalla goto exit; 329b727f85SPavan Nikhilesh req->hws = nb_lf; 339b727f85SPavan Nikhilesh } break; 349b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWGRP: { 359b727f85SPavan Nikhilesh struct sso_lf_alloc_req *req; 369b727f85SPavan Nikhilesh 3744a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_lf_alloc(mbox); 389b727f85SPavan Nikhilesh if (req == NULL) 3944a9307cSRakesh Kudurumalla goto exit; 409b727f85SPavan Nikhilesh req->hwgrps = nb_lf; 419b727f85SPavan Nikhilesh } break; 429b727f85SPavan Nikhilesh default: 439b727f85SPavan Nikhilesh break; 449b727f85SPavan Nikhilesh } 459b727f85SPavan Nikhilesh 4644a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, rsp); 4744a9307cSRakesh Kudurumalla if (rc) { 4844a9307cSRakesh Kudurumalla rc = -EIO; 4944a9307cSRakesh Kudurumalla goto exit; 5044a9307cSRakesh Kudurumalla } 519b727f85SPavan Nikhilesh 5244a9307cSRakesh Kudurumalla rc = 0; 5344a9307cSRakesh Kudurumalla exit: 5444a9307cSRakesh Kudurumalla mbox_put(mbox); 5544a9307cSRakesh Kudurumalla return rc; 569b727f85SPavan Nikhilesh } 579b727f85SPavan Nikhilesh 580423387fSNithin Dabilpuram int 590423387fSNithin Dabilpuram sso_lf_free(struct dev *dev, enum sso_lf_type lf_type, uint16_t nb_lf) 609b727f85SPavan Nikhilesh { 6144a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 629b727f85SPavan Nikhilesh int rc = -ENOSPC; 639b727f85SPavan Nikhilesh 6480fa49e6SPavan Nikhilesh if (!nb_lf) { 6580fa49e6SPavan Nikhilesh mbox_put(mbox); 6680fa49e6SPavan Nikhilesh return 0; 6780fa49e6SPavan Nikhilesh } 6880fa49e6SPavan Nikhilesh 699b727f85SPavan Nikhilesh switch (lf_type) { 709b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWS: { 719b727f85SPavan Nikhilesh struct ssow_lf_free_req *req; 729b727f85SPavan Nikhilesh 7344a9307cSRakesh Kudurumalla req = mbox_alloc_msg_ssow_lf_free(mbox); 749b727f85SPavan Nikhilesh if (req == NULL) 7544a9307cSRakesh Kudurumalla goto exit; 769b727f85SPavan Nikhilesh req->hws = nb_lf; 779b727f85SPavan Nikhilesh } break; 789b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWGRP: { 799b727f85SPavan Nikhilesh struct sso_lf_free_req *req; 809b727f85SPavan Nikhilesh 8144a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_lf_free(mbox); 829b727f85SPavan Nikhilesh if (req == NULL) 8344a9307cSRakesh Kudurumalla goto exit; 849b727f85SPavan Nikhilesh req->hwgrps = nb_lf; 859b727f85SPavan Nikhilesh } break; 869b727f85SPavan Nikhilesh default: 879b727f85SPavan Nikhilesh break; 889b727f85SPavan Nikhilesh } 899b727f85SPavan Nikhilesh 9044a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 9144a9307cSRakesh Kudurumalla if (rc) { 9244a9307cSRakesh Kudurumalla rc = -EIO; 9344a9307cSRakesh Kudurumalla goto exit; 9444a9307cSRakesh Kudurumalla } 959b727f85SPavan Nikhilesh 9644a9307cSRakesh Kudurumalla rc = 0; 9744a9307cSRakesh Kudurumalla exit: 9844a9307cSRakesh Kudurumalla mbox_put(mbox); 9944a9307cSRakesh Kudurumalla return rc; 1009b727f85SPavan Nikhilesh } 1019b727f85SPavan Nikhilesh 1029b727f85SPavan Nikhilesh static int 1039b727f85SPavan Nikhilesh sso_rsrc_attach(struct roc_sso *roc_sso, enum sso_lf_type lf_type, 1049b727f85SPavan Nikhilesh uint16_t nb_lf) 1059b727f85SPavan Nikhilesh { 1069b727f85SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 10744a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 1089b727f85SPavan Nikhilesh struct rsrc_attach_req *req; 1099b727f85SPavan Nikhilesh int rc = -ENOSPC; 1109b727f85SPavan Nikhilesh 11180fa49e6SPavan Nikhilesh if (!nb_lf) { 11280fa49e6SPavan Nikhilesh mbox_put(mbox); 11380fa49e6SPavan Nikhilesh return 0; 11480fa49e6SPavan Nikhilesh } 11580fa49e6SPavan Nikhilesh 11644a9307cSRakesh Kudurumalla req = mbox_alloc_msg_attach_resources(mbox); 1179b727f85SPavan Nikhilesh if (req == NULL) 11844a9307cSRakesh Kudurumalla goto exit; 1199b727f85SPavan Nikhilesh switch (lf_type) { 1209b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWS: 1219b727f85SPavan Nikhilesh req->ssow = nb_lf; 1229b727f85SPavan Nikhilesh break; 1239b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWGRP: 1249b727f85SPavan Nikhilesh req->sso = nb_lf; 1259b727f85SPavan Nikhilesh break; 1269b727f85SPavan Nikhilesh default: 12744a9307cSRakesh Kudurumalla rc = SSO_ERR_PARAM; 12844a9307cSRakesh Kudurumalla goto exit; 1299b727f85SPavan Nikhilesh } 1309b727f85SPavan Nikhilesh 1319b727f85SPavan Nikhilesh req->modify = true; 13244a9307cSRakesh Kudurumalla if (mbox_process(mbox)) { 13344a9307cSRakesh Kudurumalla rc = -EIO; 13444a9307cSRakesh Kudurumalla goto exit; 13544a9307cSRakesh Kudurumalla } 1369b727f85SPavan Nikhilesh 13744a9307cSRakesh Kudurumalla rc = 0; 13844a9307cSRakesh Kudurumalla exit: 13944a9307cSRakesh Kudurumalla mbox_put(mbox); 14044a9307cSRakesh Kudurumalla return rc; 1419b727f85SPavan Nikhilesh } 1429b727f85SPavan Nikhilesh 1439b727f85SPavan Nikhilesh static int 1449b727f85SPavan Nikhilesh sso_rsrc_detach(struct roc_sso *roc_sso, enum sso_lf_type lf_type) 1459b727f85SPavan Nikhilesh { 1469b727f85SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 1479b727f85SPavan Nikhilesh struct rsrc_detach_req *req; 14844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 1499b727f85SPavan Nikhilesh int rc = -ENOSPC; 1509b727f85SPavan Nikhilesh 15144a9307cSRakesh Kudurumalla req = mbox_alloc_msg_detach_resources(mbox); 1529b727f85SPavan Nikhilesh if (req == NULL) 15344a9307cSRakesh Kudurumalla goto exit; 1549b727f85SPavan Nikhilesh switch (lf_type) { 1559b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWS: 1569b727f85SPavan Nikhilesh req->ssow = true; 1579b727f85SPavan Nikhilesh break; 1589b727f85SPavan Nikhilesh case SSO_LF_TYPE_HWGRP: 1599b727f85SPavan Nikhilesh req->sso = true; 1609b727f85SPavan Nikhilesh break; 1619b727f85SPavan Nikhilesh default: 16244a9307cSRakesh Kudurumalla rc = SSO_ERR_PARAM; 16344a9307cSRakesh Kudurumalla goto exit; 1649b727f85SPavan Nikhilesh } 1659b727f85SPavan Nikhilesh 1669b727f85SPavan Nikhilesh req->partial = true; 16744a9307cSRakesh Kudurumalla if (mbox_process(mbox)) { 16844a9307cSRakesh Kudurumalla rc = -EIO; 16944a9307cSRakesh Kudurumalla goto exit; 17044a9307cSRakesh Kudurumalla } 1719b727f85SPavan Nikhilesh 17244a9307cSRakesh Kudurumalla rc = 0; 17344a9307cSRakesh Kudurumalla exit: 17444a9307cSRakesh Kudurumalla mbox_put(mbox); 17544a9307cSRakesh Kudurumalla return rc; 1769b727f85SPavan Nikhilesh } 1779b727f85SPavan Nikhilesh 1789b727f85SPavan Nikhilesh static int 1799b727f85SPavan Nikhilesh sso_rsrc_get(struct roc_sso *roc_sso) 1809b727f85SPavan Nikhilesh { 1819b727f85SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 1829b727f85SPavan Nikhilesh struct free_rsrcs_rsp *rsrc_cnt; 18344a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 1849b727f85SPavan Nikhilesh int rc; 1859b727f85SPavan Nikhilesh 18644a9307cSRakesh Kudurumalla mbox_alloc_msg_free_rsrc_cnt(mbox); 18744a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, (void **)&rsrc_cnt); 188be541d37SPavan Nikhilesh if (rc) { 189f665790aSDavid Marchand plt_err("Failed to get free resource count"); 19044a9307cSRakesh Kudurumalla rc = -EIO; 19144a9307cSRakesh Kudurumalla goto exit; 1929b727f85SPavan Nikhilesh } 1939b727f85SPavan Nikhilesh 19482526521SPavan Nikhilesh roc_sso->max_hwgrp = PLT_MIN(rsrc_cnt->sso, roc_sso->feat.hwgrps_per_pf); 1959b727f85SPavan Nikhilesh roc_sso->max_hws = rsrc_cnt->ssow; 1969b727f85SPavan Nikhilesh 19744a9307cSRakesh Kudurumalla rc = 0; 19844a9307cSRakesh Kudurumalla exit: 19944a9307cSRakesh Kudurumalla mbox_put(mbox); 20044a9307cSRakesh Kudurumalla return rc; 2019b727f85SPavan Nikhilesh } 2029b727f85SPavan Nikhilesh 20382526521SPavan Nikhilesh static int 20482526521SPavan Nikhilesh sso_hw_info_get(struct roc_sso *roc_sso) 20582526521SPavan Nikhilesh { 20682526521SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 20782526521SPavan Nikhilesh struct mbox *mbox = mbox_get(dev->mbox); 20882526521SPavan Nikhilesh struct sso_hw_info *rsp; 20982526521SPavan Nikhilesh int rc; 21082526521SPavan Nikhilesh 21182526521SPavan Nikhilesh mbox_alloc_msg_sso_get_hw_info(mbox); 21282526521SPavan Nikhilesh rc = mbox_process_msg(mbox, (void **)&rsp); 21382526521SPavan Nikhilesh if (rc && rc != MBOX_MSG_INVALID) { 21482526521SPavan Nikhilesh plt_err("Failed to get SSO HW info"); 21582526521SPavan Nikhilesh rc = -EIO; 21682526521SPavan Nikhilesh goto exit; 21782526521SPavan Nikhilesh } 21882526521SPavan Nikhilesh 21982526521SPavan Nikhilesh if (rc == MBOX_MSG_INVALID) { 22082526521SPavan Nikhilesh roc_sso->feat.hwgrps_per_pf = ROC_SSO_MAX_HWGRP_PER_PF; 22182526521SPavan Nikhilesh } else { 22282526521SPavan Nikhilesh mbox_memcpy(&roc_sso->feat, &rsp->feat, sizeof(roc_sso->feat)); 22382526521SPavan Nikhilesh 22482526521SPavan Nikhilesh if (!roc_sso->feat.hwgrps_per_pf) 22582526521SPavan Nikhilesh roc_sso->feat.hwgrps_per_pf = ROC_SSO_MAX_HWGRP_PER_PF; 22682526521SPavan Nikhilesh } 22782526521SPavan Nikhilesh 22882526521SPavan Nikhilesh rc = 0; 22982526521SPavan Nikhilesh exit: 23082526521SPavan Nikhilesh mbox_put(mbox); 23182526521SPavan Nikhilesh return rc; 23282526521SPavan Nikhilesh } 23382526521SPavan Nikhilesh 2340423387fSNithin Dabilpuram void 235da693ffeSPavan Nikhilesh sso_hws_link_modify(uint8_t hws, uintptr_t base, struct plt_bitmap *bmp, uint16_t hwgrp[], 236da693ffeSPavan Nikhilesh uint16_t n, uint8_t set, uint16_t enable) 23746ee7b23SPavan Nikhilesh { 23846ee7b23SPavan Nikhilesh uint64_t reg; 23946ee7b23SPavan Nikhilesh int i, j, k; 24046ee7b23SPavan Nikhilesh 24146ee7b23SPavan Nikhilesh i = 0; 24246ee7b23SPavan Nikhilesh while (n) { 24346ee7b23SPavan Nikhilesh uint64_t mask[4] = { 24446ee7b23SPavan Nikhilesh 0x8000, 24546ee7b23SPavan Nikhilesh 0x8000, 24646ee7b23SPavan Nikhilesh 0x8000, 24746ee7b23SPavan Nikhilesh 0x8000, 24846ee7b23SPavan Nikhilesh }; 24946ee7b23SPavan Nikhilesh 25046ee7b23SPavan Nikhilesh k = n % 4; 25146ee7b23SPavan Nikhilesh k = k ? k : 4; 25246ee7b23SPavan Nikhilesh for (j = 0; j < k; j++) { 253da693ffeSPavan Nikhilesh mask[j] = hwgrp[i + j] | (uint32_t)set << 12 | enable << 14; 2540423387fSNithin Dabilpuram if (bmp) { 25546ee7b23SPavan Nikhilesh enable ? plt_bitmap_set(bmp, hwgrp[i + j]) : 25646ee7b23SPavan Nikhilesh plt_bitmap_clear(bmp, hwgrp[i + j]); 2570423387fSNithin Dabilpuram } 25846ee7b23SPavan Nikhilesh plt_sso_dbg("HWS %d Linked to HWGRP %d", hws, 25946ee7b23SPavan Nikhilesh hwgrp[i + j]); 26046ee7b23SPavan Nikhilesh } 26146ee7b23SPavan Nikhilesh 26246ee7b23SPavan Nikhilesh n -= j; 26346ee7b23SPavan Nikhilesh i += j; 26446ee7b23SPavan Nikhilesh reg = mask[0] | mask[1] << 16 | mask[2] << 32 | mask[3] << 48; 26546ee7b23SPavan Nikhilesh plt_write64(reg, base + SSOW_LF_GWS_GRPMSK_CHG); 26646ee7b23SPavan Nikhilesh } 26746ee7b23SPavan Nikhilesh } 26846ee7b23SPavan Nikhilesh 26984ed1a5bSPavan Nikhilesh static int 270ac09cd72SPavan Nikhilesh sso_hws_link_modify_af(struct dev *dev, uint8_t hws, struct plt_bitmap *bmp, uint16_t hwgrp[], 271ac09cd72SPavan Nikhilesh uint16_t n, uint8_t set, uint16_t enable) 272ac09cd72SPavan Nikhilesh { 273ac09cd72SPavan Nikhilesh struct mbox *mbox = mbox_get(dev->mbox); 274ac09cd72SPavan Nikhilesh struct ssow_chng_mship *req; 275ac09cd72SPavan Nikhilesh int rc, i; 276ac09cd72SPavan Nikhilesh 277ac09cd72SPavan Nikhilesh req = mbox_alloc_msg_ssow_chng_mship(mbox); 278ac09cd72SPavan Nikhilesh if (req == NULL) { 279ac09cd72SPavan Nikhilesh rc = mbox_process(mbox); 280ac09cd72SPavan Nikhilesh if (rc) { 281ac09cd72SPavan Nikhilesh mbox_put(mbox); 282ac09cd72SPavan Nikhilesh return -EIO; 283ac09cd72SPavan Nikhilesh } 284ac09cd72SPavan Nikhilesh req = mbox_alloc_msg_ssow_chng_mship(mbox); 285ac09cd72SPavan Nikhilesh if (req == NULL) { 286ac09cd72SPavan Nikhilesh mbox_put(mbox); 287ac09cd72SPavan Nikhilesh return -ENOSPC; 288ac09cd72SPavan Nikhilesh } 289ac09cd72SPavan Nikhilesh } 290ac09cd72SPavan Nikhilesh req->enable = enable; 291ac09cd72SPavan Nikhilesh req->set = set; 292ac09cd72SPavan Nikhilesh req->hws = hws; 293ac09cd72SPavan Nikhilesh req->nb_hwgrps = n; 294ac09cd72SPavan Nikhilesh for (i = 0; i < n; i++) 295ac09cd72SPavan Nikhilesh req->hwgrps[i] = hwgrp[i]; 296ac09cd72SPavan Nikhilesh rc = mbox_process(mbox); 297ac09cd72SPavan Nikhilesh mbox_put(mbox); 298ac09cd72SPavan Nikhilesh if (rc == MBOX_MSG_INVALID) 299ac09cd72SPavan Nikhilesh return rc; 300ac09cd72SPavan Nikhilesh if (rc) 301ac09cd72SPavan Nikhilesh return -EIO; 302ac09cd72SPavan Nikhilesh 303ac09cd72SPavan Nikhilesh for (i = 0; i < n; i++) 304ac09cd72SPavan Nikhilesh enable ? plt_bitmap_set(bmp, hwgrp[i]) : 305ac09cd72SPavan Nikhilesh plt_bitmap_clear(bmp, hwgrp[i]); 306ac09cd72SPavan Nikhilesh 307ac09cd72SPavan Nikhilesh return 0; 308ac09cd72SPavan Nikhilesh } 309ac09cd72SPavan Nikhilesh 310ac09cd72SPavan Nikhilesh static int 31184ed1a5bSPavan Nikhilesh sso_msix_fill(struct roc_sso *roc_sso, uint16_t nb_hws, uint16_t nb_hwgrp) 31284ed1a5bSPavan Nikhilesh { 31384ed1a5bSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 31484ed1a5bSPavan Nikhilesh struct msix_offset_rsp *rsp; 31584ed1a5bSPavan Nikhilesh struct dev *dev = &sso->dev; 31684ed1a5bSPavan Nikhilesh int i, rc; 31784ed1a5bSPavan Nikhilesh 31844a9307cSRakesh Kudurumalla mbox_alloc_msg_msix_offset(mbox_get(dev->mbox)); 31984ed1a5bSPavan Nikhilesh rc = mbox_process_msg(dev->mbox, (void **)&rsp); 32044a9307cSRakesh Kudurumalla if (rc) { 32144a9307cSRakesh Kudurumalla rc = -EIO; 32244a9307cSRakesh Kudurumalla goto exit; 32344a9307cSRakesh Kudurumalla } 32484ed1a5bSPavan Nikhilesh 32584ed1a5bSPavan Nikhilesh for (i = 0; i < nb_hws; i++) 32684ed1a5bSPavan Nikhilesh sso->hws_msix_offset[i] = rsp->ssow_msixoff[i]; 32784ed1a5bSPavan Nikhilesh for (i = 0; i < nb_hwgrp; i++) 32884ed1a5bSPavan Nikhilesh sso->hwgrp_msix_offset[i] = rsp->sso_msixoff[i]; 32984ed1a5bSPavan Nikhilesh 33044a9307cSRakesh Kudurumalla rc = 0; 33144a9307cSRakesh Kudurumalla exit: 33244a9307cSRakesh Kudurumalla mbox_put(dev->mbox); 33344a9307cSRakesh Kudurumalla return rc; 33484ed1a5bSPavan Nikhilesh } 33584ed1a5bSPavan Nikhilesh 33646ee7b23SPavan Nikhilesh /* Public Functions. */ 33746ee7b23SPavan Nikhilesh uintptr_t 33846ee7b23SPavan Nikhilesh roc_sso_hws_base_get(struct roc_sso *roc_sso, uint8_t hws) 33946ee7b23SPavan Nikhilesh { 34046ee7b23SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 34146ee7b23SPavan Nikhilesh 34246ee7b23SPavan Nikhilesh return dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | hws << 12); 34346ee7b23SPavan Nikhilesh } 34446ee7b23SPavan Nikhilesh 345111a6122SPavan Nikhilesh uintptr_t 346111a6122SPavan Nikhilesh roc_sso_hwgrp_base_get(struct roc_sso *roc_sso, uint16_t hwgrp) 347111a6122SPavan Nikhilesh { 348111a6122SPavan Nikhilesh struct dev *dev = &roc_sso_to_sso_priv(roc_sso)->dev; 349111a6122SPavan Nikhilesh 350111a6122SPavan Nikhilesh return dev->bar2 + (RVU_BLOCK_ADDR_SSO << 20 | hwgrp << 12); 351111a6122SPavan Nikhilesh } 352111a6122SPavan Nikhilesh 35359c15941SAkhil Goyal uint16_t 35459c15941SAkhil Goyal roc_sso_pf_func_get(void) 35559c15941SAkhil Goyal { 35659c15941SAkhil Goyal return idev_sso_pffunc_get(); 35759c15941SAkhil Goyal } 35859c15941SAkhil Goyal 35946ee7b23SPavan Nikhilesh uint64_t 36080fa49e6SPavan Nikhilesh roc_sso_ns_to_gw(uint64_t base, uint64_t ns) 36146ee7b23SPavan Nikhilesh { 36280fa49e6SPavan Nikhilesh uint64_t current_us; 36346ee7b23SPavan Nikhilesh 36446ee7b23SPavan Nikhilesh current_us = plt_read64(base + SSOW_LF_GWS_NW_TIM); 36546ee7b23SPavan Nikhilesh /* From HRM, table 14-19: 36646ee7b23SPavan Nikhilesh * The SSOW_LF_GWS_NW_TIM[NW_TIM] period is specified in n-1 notation. 36746ee7b23SPavan Nikhilesh */ 36846ee7b23SPavan Nikhilesh current_us += 1; 36946ee7b23SPavan Nikhilesh 37046ee7b23SPavan Nikhilesh /* From HRM, table 14-1: 37146ee7b23SPavan Nikhilesh * SSOW_LF_GWS_NW_TIM[NW_TIM] specifies the minimum timeout. The SSO 37280fa49e6SPavan Nikhilesh * hardware times out a GET_WORK request within 1 usec of the minimum 37346ee7b23SPavan Nikhilesh * timeout specified by SSOW_LF_GWS_NW_TIM[NW_TIM]. 37446ee7b23SPavan Nikhilesh */ 37580fa49e6SPavan Nikhilesh current_us += 1; 37680fa49e6SPavan Nikhilesh return PLT_MAX(1UL, (uint64_t)PLT_DIV_CEIL(ns, (current_us * 1E3))); 37746ee7b23SPavan Nikhilesh } 37846ee7b23SPavan Nikhilesh 37946ee7b23SPavan Nikhilesh int 380da693ffeSPavan Nikhilesh roc_sso_hws_link(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[], uint16_t nb_hwgrp, 381ac09cd72SPavan Nikhilesh uint8_t set, bool use_mbox) 38246ee7b23SPavan Nikhilesh { 383ac09cd72SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 384ac09cd72SPavan Nikhilesh struct dev *dev = &sso->dev; 38546ee7b23SPavan Nikhilesh uintptr_t base; 386ac09cd72SPavan Nikhilesh int rc; 38746ee7b23SPavan Nikhilesh 388ac09cd72SPavan Nikhilesh if (!nb_hwgrp) 389ac09cd72SPavan Nikhilesh return 0; 390ac09cd72SPavan Nikhilesh 391ac09cd72SPavan Nikhilesh if (use_mbox && roc_model_is_cn10k()) { 392ac09cd72SPavan Nikhilesh rc = sso_hws_link_modify_af(dev, hws, sso->link_map[hws], hwgrp, nb_hwgrp, set, 1); 393ac09cd72SPavan Nikhilesh if (rc == MBOX_MSG_INVALID) 394ac09cd72SPavan Nikhilesh goto lf_access; 395ac09cd72SPavan Nikhilesh if (rc < 0) 396ac09cd72SPavan Nikhilesh return 0; 397ac09cd72SPavan Nikhilesh goto done; 398ac09cd72SPavan Nikhilesh } 399ac09cd72SPavan Nikhilesh lf_access: 40046ee7b23SPavan Nikhilesh base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | hws << 12); 401da693ffeSPavan Nikhilesh sso_hws_link_modify(hws, base, sso->link_map[hws], hwgrp, nb_hwgrp, set, 1); 402ac09cd72SPavan Nikhilesh done: 40346ee7b23SPavan Nikhilesh return nb_hwgrp; 40446ee7b23SPavan Nikhilesh } 40546ee7b23SPavan Nikhilesh 40646ee7b23SPavan Nikhilesh int 407ac09cd72SPavan Nikhilesh roc_sso_hws_unlink(struct roc_sso *roc_sso, uint8_t hws, uint16_t hwgrp[], 408ac09cd72SPavan Nikhilesh uint16_t nb_hwgrp, uint8_t set, bool use_mbox) 40946ee7b23SPavan Nikhilesh { 410ac09cd72SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 411ac09cd72SPavan Nikhilesh struct dev *dev = &sso->dev; 41246ee7b23SPavan Nikhilesh uintptr_t base; 413ac09cd72SPavan Nikhilesh int rc; 41446ee7b23SPavan Nikhilesh 415ac09cd72SPavan Nikhilesh if (!nb_hwgrp) 416ac09cd72SPavan Nikhilesh return 0; 417ac09cd72SPavan Nikhilesh 418ac09cd72SPavan Nikhilesh if (use_mbox && roc_model_is_cn10k()) { 419ac09cd72SPavan Nikhilesh rc = sso_hws_link_modify_af(dev, hws, sso->link_map[hws], hwgrp, nb_hwgrp, set, 0); 420ac09cd72SPavan Nikhilesh if (rc == MBOX_MSG_INVALID) 421ac09cd72SPavan Nikhilesh goto lf_access; 422ac09cd72SPavan Nikhilesh if (rc < 0) 423ac09cd72SPavan Nikhilesh return 0; 424ac09cd72SPavan Nikhilesh goto done; 425ac09cd72SPavan Nikhilesh } 426ac09cd72SPavan Nikhilesh lf_access: 42746ee7b23SPavan Nikhilesh base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20 | hws << 12); 428da693ffeSPavan Nikhilesh sso_hws_link_modify(hws, base, sso->link_map[hws], hwgrp, nb_hwgrp, set, 0); 429ac09cd72SPavan Nikhilesh done: 43046ee7b23SPavan Nikhilesh return nb_hwgrp; 43146ee7b23SPavan Nikhilesh } 43246ee7b23SPavan Nikhilesh 4339b727f85SPavan Nikhilesh int 434b5a52c9dSPavan Nikhilesh roc_sso_hws_stats_get(struct roc_sso *roc_sso, uint8_t hws, 435b5a52c9dSPavan Nikhilesh struct roc_sso_hws_stats *stats) 436b5a52c9dSPavan Nikhilesh { 437be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 438b5a52c9dSPavan Nikhilesh struct sso_hws_stats *req_rsp; 439be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 44044a9307cSRakesh Kudurumalla struct mbox *mbox; 441b5a52c9dSPavan Nikhilesh int rc; 442b5a52c9dSPavan Nikhilesh 44344a9307cSRakesh Kudurumalla mbox = mbox_get(dev->mbox); 444b5a52c9dSPavan Nikhilesh req_rsp = (struct sso_hws_stats *)mbox_alloc_msg_sso_hws_get_stats( 44544a9307cSRakesh Kudurumalla mbox); 446b5a52c9dSPavan Nikhilesh if (req_rsp == NULL) { 44744a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 448be541d37SPavan Nikhilesh if (rc) { 449be541d37SPavan Nikhilesh rc = -EIO; 450be541d37SPavan Nikhilesh goto fail; 451be541d37SPavan Nikhilesh } 452b5a52c9dSPavan Nikhilesh req_rsp = (struct sso_hws_stats *) 45344a9307cSRakesh Kudurumalla mbox_alloc_msg_sso_hws_get_stats(mbox); 454be541d37SPavan Nikhilesh if (req_rsp == NULL) { 455be541d37SPavan Nikhilesh rc = -ENOSPC; 456be541d37SPavan Nikhilesh goto fail; 457be541d37SPavan Nikhilesh } 458b5a52c9dSPavan Nikhilesh } 459b5a52c9dSPavan Nikhilesh req_rsp->hws = hws; 46044a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, (void **)&req_rsp); 461be541d37SPavan Nikhilesh if (rc) { 462be541d37SPavan Nikhilesh rc = -EIO; 463be541d37SPavan Nikhilesh goto fail; 464be541d37SPavan Nikhilesh } 465b5a52c9dSPavan Nikhilesh 466b5a52c9dSPavan Nikhilesh stats->arbitration = req_rsp->arbitration; 467be541d37SPavan Nikhilesh fail: 46844a9307cSRakesh Kudurumalla mbox_put(mbox); 469be541d37SPavan Nikhilesh return rc; 470b5a52c9dSPavan Nikhilesh } 471b5a52c9dSPavan Nikhilesh 4729e350a8aSPavan Nikhilesh void 4739e350a8aSPavan Nikhilesh roc_sso_hws_gwc_invalidate(struct roc_sso *roc_sso, uint8_t *hws, 4749e350a8aSPavan Nikhilesh uint8_t nb_hws) 4759e350a8aSPavan Nikhilesh { 4769e350a8aSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 4779e350a8aSPavan Nikhilesh struct ssow_lf_inv_req *req; 4789e350a8aSPavan Nikhilesh struct dev *dev = &sso->dev; 4799e350a8aSPavan Nikhilesh struct mbox *mbox; 4809e350a8aSPavan Nikhilesh int i; 4819e350a8aSPavan Nikhilesh 4829e350a8aSPavan Nikhilesh if (!nb_hws) 4839e350a8aSPavan Nikhilesh return; 4849e350a8aSPavan Nikhilesh 4859e350a8aSPavan Nikhilesh mbox = mbox_get(dev->mbox); 4869e350a8aSPavan Nikhilesh req = mbox_alloc_msg_sso_ws_cache_inv(mbox); 4879e350a8aSPavan Nikhilesh if (req == NULL) { 4889e350a8aSPavan Nikhilesh mbox_process(mbox); 4899e350a8aSPavan Nikhilesh req = mbox_alloc_msg_sso_ws_cache_inv(mbox); 4909e350a8aSPavan Nikhilesh if (req == NULL) { 4919e350a8aSPavan Nikhilesh mbox_put(mbox); 4929e350a8aSPavan Nikhilesh return; 4939e350a8aSPavan Nikhilesh } 4949e350a8aSPavan Nikhilesh } 4959e350a8aSPavan Nikhilesh req->hdr.ver = SSOW_INVAL_SELECTIVE_VER; 4969e350a8aSPavan Nikhilesh req->nb_hws = nb_hws; 4979e350a8aSPavan Nikhilesh for (i = 0; i < nb_hws; i++) 4989e350a8aSPavan Nikhilesh req->hws[i] = hws[i]; 4999e350a8aSPavan Nikhilesh mbox_process(mbox); 5009e350a8aSPavan Nikhilesh mbox_put(mbox); 5019e350a8aSPavan Nikhilesh } 5029e350a8aSPavan Nikhilesh 503*62afdd8dSPavan Nikhilesh static void 504*62afdd8dSPavan Nikhilesh sso_agq_op_wait(struct roc_sso *roc_sso, uint16_t hwgrp) 505*62afdd8dSPavan Nikhilesh { 506*62afdd8dSPavan Nikhilesh uint64_t reg; 507*62afdd8dSPavan Nikhilesh 508*62afdd8dSPavan Nikhilesh reg = plt_read64(roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_INSTOP); 509*62afdd8dSPavan Nikhilesh while (reg & BIT_ULL(2)) { 510*62afdd8dSPavan Nikhilesh plt_delay_us(100); 511*62afdd8dSPavan Nikhilesh reg = plt_read64(roc_sso_hwgrp_base_get(roc_sso, hwgrp) + 512*62afdd8dSPavan Nikhilesh SSO_LF_GGRP_AGGR_CTX_INSTOP); 513*62afdd8dSPavan Nikhilesh } 514*62afdd8dSPavan Nikhilesh } 515*62afdd8dSPavan Nikhilesh 516b5a52c9dSPavan Nikhilesh int 517*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_alloc(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_agq_data *data) 518*62afdd8dSPavan Nikhilesh { 519*62afdd8dSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 520*62afdd8dSPavan Nikhilesh struct sso_aggr_setconfig *req; 521*62afdd8dSPavan Nikhilesh struct sso_agq_ctx *ctx; 522*62afdd8dSPavan Nikhilesh uint32_t cnt, off; 523*62afdd8dSPavan Nikhilesh struct mbox *mbox; 524*62afdd8dSPavan Nikhilesh uintptr_t ptr; 525*62afdd8dSPavan Nikhilesh uint64_t reg; 526*62afdd8dSPavan Nikhilesh int rc; 527*62afdd8dSPavan Nikhilesh 528*62afdd8dSPavan Nikhilesh if (sso->agg_mem[hwgrp] == 0) { 529*62afdd8dSPavan Nikhilesh mbox = mbox_get(sso->dev.mbox); 530*62afdd8dSPavan Nikhilesh req = mbox_alloc_msg_sso_aggr_setconfig(mbox); 531*62afdd8dSPavan Nikhilesh if (req == NULL) { 532*62afdd8dSPavan Nikhilesh mbox_process(mbox); 533*62afdd8dSPavan Nikhilesh req = mbox_alloc_msg_sso_aggr_setconfig(mbox); 534*62afdd8dSPavan Nikhilesh if (req == NULL) { 535*62afdd8dSPavan Nikhilesh plt_err("Failed to allocate AGQ config mbox."); 536*62afdd8dSPavan Nikhilesh mbox_put(mbox); 537*62afdd8dSPavan Nikhilesh return -EIO; 538*62afdd8dSPavan Nikhilesh } 539*62afdd8dSPavan Nikhilesh } 540*62afdd8dSPavan Nikhilesh 541*62afdd8dSPavan Nikhilesh req->hwgrp = hwgrp; 542*62afdd8dSPavan Nikhilesh req->npa_pf_func = idev_npa_pffunc_get(); 543*62afdd8dSPavan Nikhilesh rc = mbox_process(mbox); 544*62afdd8dSPavan Nikhilesh if (rc < 0) { 545*62afdd8dSPavan Nikhilesh plt_err("Failed to set HWGRP AGQ config rc=%d", rc); 546*62afdd8dSPavan Nikhilesh mbox_put(mbox); 547*62afdd8dSPavan Nikhilesh return rc; 548*62afdd8dSPavan Nikhilesh } 549*62afdd8dSPavan Nikhilesh 550*62afdd8dSPavan Nikhilesh mbox_put(mbox); 551*62afdd8dSPavan Nikhilesh 552*62afdd8dSPavan Nikhilesh sso->agg_mem[hwgrp] = 553*62afdd8dSPavan Nikhilesh (uintptr_t)plt_zmalloc(SSO_AGGR_MIN_CTX * sizeof(struct sso_agq_ctx), 554*62afdd8dSPavan Nikhilesh roc_model_optimal_align_sz()); 555*62afdd8dSPavan Nikhilesh if (sso->agg_mem[hwgrp] == 0) 556*62afdd8dSPavan Nikhilesh return -ENOMEM; 557*62afdd8dSPavan Nikhilesh sso->agg_cnt[hwgrp] = SSO_AGGR_MIN_CTX; 558*62afdd8dSPavan Nikhilesh sso->agg_used[hwgrp] = 0; 559*62afdd8dSPavan Nikhilesh plt_wmb(); 560*62afdd8dSPavan Nikhilesh plt_write64(sso->agg_mem[hwgrp], 561*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_BASE); 562*62afdd8dSPavan Nikhilesh reg = (plt_log2_u32(SSO_AGGR_MIN_CTX) - 6) << 16; 563*62afdd8dSPavan Nikhilesh reg |= (SSO_AGGR_DEF_TMO << 4) | 1; 564*62afdd8dSPavan Nikhilesh plt_write64(reg, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CFG); 565*62afdd8dSPavan Nikhilesh } 566*62afdd8dSPavan Nikhilesh 567*62afdd8dSPavan Nikhilesh if (sso->agg_cnt[hwgrp] >= SSO_AGGR_MAX_CTX) 568*62afdd8dSPavan Nikhilesh return -ENOSPC; 569*62afdd8dSPavan Nikhilesh 570*62afdd8dSPavan Nikhilesh if (sso->agg_cnt[hwgrp] == sso->agg_used[hwgrp]) { 571*62afdd8dSPavan Nikhilesh ptr = sso->agg_mem[hwgrp]; 572*62afdd8dSPavan Nikhilesh cnt = sso->agg_cnt[hwgrp] << 1; 573*62afdd8dSPavan Nikhilesh sso->agg_mem[hwgrp] = (uintptr_t)plt_zmalloc(cnt * sizeof(struct sso_agq_ctx), 574*62afdd8dSPavan Nikhilesh roc_model_optimal_align_sz()); 575*62afdd8dSPavan Nikhilesh if (sso->agg_mem[hwgrp] == 0) { 576*62afdd8dSPavan Nikhilesh sso->agg_mem[hwgrp] = ptr; 577*62afdd8dSPavan Nikhilesh return -ENOMEM; 578*62afdd8dSPavan Nikhilesh } 579*62afdd8dSPavan Nikhilesh 580*62afdd8dSPavan Nikhilesh memcpy((void *)sso->agg_mem[hwgrp], (void *)ptr, 581*62afdd8dSPavan Nikhilesh sso->agg_cnt[hwgrp] * sizeof(struct sso_agq_ctx)); 582*62afdd8dSPavan Nikhilesh plt_wmb(); 583*62afdd8dSPavan Nikhilesh sso_agq_op_wait(roc_sso, hwgrp); 584*62afdd8dSPavan Nikhilesh /* Base address has changed, evict old entries. */ 585*62afdd8dSPavan Nikhilesh plt_write64(sso->agg_mem[hwgrp], 586*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_BASE); 587*62afdd8dSPavan Nikhilesh reg = plt_read64(roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CFG); 588*62afdd8dSPavan Nikhilesh reg &= ~GENMASK_ULL(19, 16); 589*62afdd8dSPavan Nikhilesh reg |= (uint64_t)(plt_log2_u32(cnt) - 6) << 16; 590*62afdd8dSPavan Nikhilesh plt_write64(reg, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CFG); 591*62afdd8dSPavan Nikhilesh reg = SSO_LF_AGGR_INSTOP_GLOBAL_EVICT << 4; 592*62afdd8dSPavan Nikhilesh plt_write64(reg, 593*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_INSTOP); 594*62afdd8dSPavan Nikhilesh sso_agq_op_wait(roc_sso, hwgrp); 595*62afdd8dSPavan Nikhilesh plt_free((void *)ptr); 596*62afdd8dSPavan Nikhilesh 597*62afdd8dSPavan Nikhilesh sso->agg_cnt[hwgrp] = cnt; 598*62afdd8dSPavan Nikhilesh off = sso->agg_used[hwgrp]; 599*62afdd8dSPavan Nikhilesh } else { 600*62afdd8dSPavan Nikhilesh ctx = (struct sso_agq_ctx *)sso->agg_mem[hwgrp]; 601*62afdd8dSPavan Nikhilesh for (cnt = 0; cnt < sso->agg_cnt[hwgrp]; cnt++) { 602*62afdd8dSPavan Nikhilesh if (!ctx[cnt].ena) 603*62afdd8dSPavan Nikhilesh break; 604*62afdd8dSPavan Nikhilesh } 605*62afdd8dSPavan Nikhilesh if (cnt == sso->agg_cnt[hwgrp]) 606*62afdd8dSPavan Nikhilesh return -EINVAL; 607*62afdd8dSPavan Nikhilesh off = cnt; 608*62afdd8dSPavan Nikhilesh } 609*62afdd8dSPavan Nikhilesh 610*62afdd8dSPavan Nikhilesh ctx = (struct sso_agq_ctx *)sso->agg_mem[hwgrp]; 611*62afdd8dSPavan Nikhilesh ctx += off; 612*62afdd8dSPavan Nikhilesh ctx->ena = 1; 613*62afdd8dSPavan Nikhilesh ctx->tt = data->tt; 614*62afdd8dSPavan Nikhilesh ctx->tag = data->tag; 615*62afdd8dSPavan Nikhilesh ctx->swqe_tag = data->stag; 616*62afdd8dSPavan Nikhilesh ctx->cnt_ena = data->cnt_ena; 617*62afdd8dSPavan Nikhilesh ctx->xqe_type = data->xqe_type; 618*62afdd8dSPavan Nikhilesh ctx->vtimewait = data->vwqe_wait_tmo; 619*62afdd8dSPavan Nikhilesh ctx->vwqe_aura = data->vwqe_aura; 620*62afdd8dSPavan Nikhilesh ctx->max_vsize_exp = data->vwqe_max_sz_exp - 2; 621*62afdd8dSPavan Nikhilesh 622*62afdd8dSPavan Nikhilesh plt_wmb(); 623*62afdd8dSPavan Nikhilesh sso->agg_used[hwgrp]++; 624*62afdd8dSPavan Nikhilesh 625*62afdd8dSPavan Nikhilesh return 0; 626*62afdd8dSPavan Nikhilesh } 627*62afdd8dSPavan Nikhilesh 628*62afdd8dSPavan Nikhilesh void 629*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_free(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t agq_id) 630*62afdd8dSPavan Nikhilesh { 631*62afdd8dSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 632*62afdd8dSPavan Nikhilesh struct sso_agq_ctx *ctx; 633*62afdd8dSPavan Nikhilesh uint64_t reg; 634*62afdd8dSPavan Nikhilesh 635*62afdd8dSPavan Nikhilesh ctx = (struct sso_agq_ctx *)sso->agg_mem[hwgrp]; 636*62afdd8dSPavan Nikhilesh ctx += agq_id; 637*62afdd8dSPavan Nikhilesh 638*62afdd8dSPavan Nikhilesh if (!ctx->ena) 639*62afdd8dSPavan Nikhilesh return; 640*62afdd8dSPavan Nikhilesh 641*62afdd8dSPavan Nikhilesh reg = SSO_LF_AGGR_INSTOP_FLUSH << 4; 642*62afdd8dSPavan Nikhilesh reg |= (uint64_t)(agq_id << 8); 643*62afdd8dSPavan Nikhilesh 644*62afdd8dSPavan Nikhilesh plt_write64(reg, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_INSTOP); 645*62afdd8dSPavan Nikhilesh sso_agq_op_wait(roc_sso, hwgrp); 646*62afdd8dSPavan Nikhilesh 647*62afdd8dSPavan Nikhilesh memset(ctx, 0, sizeof(struct sso_agq_ctx)); 648*62afdd8dSPavan Nikhilesh plt_wmb(); 649*62afdd8dSPavan Nikhilesh sso->agg_used[hwgrp]--; 650*62afdd8dSPavan Nikhilesh 651*62afdd8dSPavan Nikhilesh /* Flush the context from CTX Cache */ 652*62afdd8dSPavan Nikhilesh reg = SSO_LF_AGGR_INSTOP_EVICT << 4; 653*62afdd8dSPavan Nikhilesh reg |= (uint64_t)(agq_id << 8); 654*62afdd8dSPavan Nikhilesh 655*62afdd8dSPavan Nikhilesh plt_write64(reg, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_INSTOP); 656*62afdd8dSPavan Nikhilesh sso_agq_op_wait(roc_sso, hwgrp); 657*62afdd8dSPavan Nikhilesh } 658*62afdd8dSPavan Nikhilesh 659*62afdd8dSPavan Nikhilesh void 660*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_release(struct roc_sso *roc_sso, uint16_t hwgrp) 661*62afdd8dSPavan Nikhilesh { 662*62afdd8dSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 663*62afdd8dSPavan Nikhilesh struct sso_aggr_setconfig *req; 664*62afdd8dSPavan Nikhilesh struct sso_agq_ctx *ctx; 665*62afdd8dSPavan Nikhilesh struct mbox *mbox; 666*62afdd8dSPavan Nikhilesh uint32_t cnt; 667*62afdd8dSPavan Nikhilesh int rc; 668*62afdd8dSPavan Nikhilesh 669*62afdd8dSPavan Nikhilesh if (!roc_sso->feat.eva_present) 670*62afdd8dSPavan Nikhilesh return; 671*62afdd8dSPavan Nikhilesh 672*62afdd8dSPavan Nikhilesh plt_write64(0, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CFG); 673*62afdd8dSPavan Nikhilesh ctx = (struct sso_agq_ctx *)sso->agg_mem[hwgrp]; 674*62afdd8dSPavan Nikhilesh for (cnt = 0; cnt < sso->agg_cnt[hwgrp]; cnt++) { 675*62afdd8dSPavan Nikhilesh if (!ctx[cnt].ena) 676*62afdd8dSPavan Nikhilesh continue; 677*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_free(roc_sso, hwgrp, cnt); 678*62afdd8dSPavan Nikhilesh } 679*62afdd8dSPavan Nikhilesh 680*62afdd8dSPavan Nikhilesh plt_write64(0, roc_sso_hwgrp_base_get(roc_sso, hwgrp) + SSO_LF_GGRP_AGGR_CTX_BASE); 681*62afdd8dSPavan Nikhilesh plt_free((void *)sso->agg_mem[hwgrp]); 682*62afdd8dSPavan Nikhilesh sso->agg_mem[hwgrp] = 0; 683*62afdd8dSPavan Nikhilesh sso->agg_cnt[hwgrp] = 0; 684*62afdd8dSPavan Nikhilesh sso->agg_used[hwgrp] = 0; 685*62afdd8dSPavan Nikhilesh 686*62afdd8dSPavan Nikhilesh mbox = mbox_get(sso->dev.mbox); 687*62afdd8dSPavan Nikhilesh req = mbox_alloc_msg_sso_aggr_setconfig(mbox); 688*62afdd8dSPavan Nikhilesh if (req == NULL) { 689*62afdd8dSPavan Nikhilesh mbox_process(mbox); 690*62afdd8dSPavan Nikhilesh req = mbox_alloc_msg_sso_aggr_setconfig(mbox); 691*62afdd8dSPavan Nikhilesh if (req == NULL) { 692*62afdd8dSPavan Nikhilesh plt_err("Failed to allocate AGQ config mbox."); 693*62afdd8dSPavan Nikhilesh mbox_put(mbox); 694*62afdd8dSPavan Nikhilesh return; 695*62afdd8dSPavan Nikhilesh } 696*62afdd8dSPavan Nikhilesh } 697*62afdd8dSPavan Nikhilesh 698*62afdd8dSPavan Nikhilesh req->hwgrp = hwgrp; 699*62afdd8dSPavan Nikhilesh req->npa_pf_func = 0; 700*62afdd8dSPavan Nikhilesh rc = mbox_process(mbox); 701*62afdd8dSPavan Nikhilesh if (rc < 0) 702*62afdd8dSPavan Nikhilesh plt_err("Failed to set HWGRP AGQ config rc=%d", rc); 703*62afdd8dSPavan Nikhilesh mbox_put(mbox); 704*62afdd8dSPavan Nikhilesh } 705*62afdd8dSPavan Nikhilesh 706*62afdd8dSPavan Nikhilesh uint32_t 707*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_from_tag(struct roc_sso *roc_sso, uint16_t hwgrp, uint32_t tag_mask, 708*62afdd8dSPavan Nikhilesh uint8_t xqe_type) 709*62afdd8dSPavan Nikhilesh { 710*62afdd8dSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 711*62afdd8dSPavan Nikhilesh struct sso_agq_ctx *ctx; 712*62afdd8dSPavan Nikhilesh uint32_t i; 713*62afdd8dSPavan Nikhilesh 714*62afdd8dSPavan Nikhilesh plt_rmb(); 715*62afdd8dSPavan Nikhilesh ctx = (struct sso_agq_ctx *)sso->agg_mem[hwgrp]; 716*62afdd8dSPavan Nikhilesh for (i = 0; i < sso->agg_used[hwgrp]; i++) { 717*62afdd8dSPavan Nikhilesh if (!ctx[i].ena) 718*62afdd8dSPavan Nikhilesh continue; 719*62afdd8dSPavan Nikhilesh if (ctx[i].tag == tag_mask && ctx[i].xqe_type == xqe_type) 720*62afdd8dSPavan Nikhilesh return i; 721*62afdd8dSPavan Nikhilesh } 722*62afdd8dSPavan Nikhilesh 723*62afdd8dSPavan Nikhilesh return UINT32_MAX; 724*62afdd8dSPavan Nikhilesh } 725*62afdd8dSPavan Nikhilesh 726*62afdd8dSPavan Nikhilesh int 727*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_stats_get(struct roc_sso *roc_sso, uint16_t hwgrp, struct roc_sso_hwgrp_stats *stats) 728b5a52c9dSPavan Nikhilesh { 729be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 730b5a52c9dSPavan Nikhilesh struct sso_grp_stats *req_rsp; 731be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 73244a9307cSRakesh Kudurumalla struct mbox *mbox; 733b5a52c9dSPavan Nikhilesh int rc; 734b5a52c9dSPavan Nikhilesh 73544a9307cSRakesh Kudurumalla mbox = mbox_get(dev->mbox); 736b5a52c9dSPavan Nikhilesh req_rsp = (struct sso_grp_stats *)mbox_alloc_msg_sso_grp_get_stats( 73744a9307cSRakesh Kudurumalla mbox); 738b5a52c9dSPavan Nikhilesh if (req_rsp == NULL) { 73944a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 740be541d37SPavan Nikhilesh if (rc) { 741be541d37SPavan Nikhilesh rc = -EIO; 742be541d37SPavan Nikhilesh goto fail; 743be541d37SPavan Nikhilesh } 744b5a52c9dSPavan Nikhilesh req_rsp = (struct sso_grp_stats *) 74544a9307cSRakesh Kudurumalla mbox_alloc_msg_sso_grp_get_stats(mbox); 746be541d37SPavan Nikhilesh if (req_rsp == NULL) { 747be541d37SPavan Nikhilesh rc = -ENOSPC; 748be541d37SPavan Nikhilesh goto fail; 749be541d37SPavan Nikhilesh } 750b5a52c9dSPavan Nikhilesh } 751b5a52c9dSPavan Nikhilesh req_rsp->grp = hwgrp; 75244a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, (void **)&req_rsp); 753be541d37SPavan Nikhilesh if (rc) { 754be541d37SPavan Nikhilesh rc = -EIO; 755be541d37SPavan Nikhilesh goto fail; 756be541d37SPavan Nikhilesh } 757b5a52c9dSPavan Nikhilesh 758b5a52c9dSPavan Nikhilesh stats->aw_status = req_rsp->aw_status; 759b5a52c9dSPavan Nikhilesh stats->dq_pc = req_rsp->dq_pc; 760b5a52c9dSPavan Nikhilesh stats->ds_pc = req_rsp->ds_pc; 761b5a52c9dSPavan Nikhilesh stats->ext_pc = req_rsp->ext_pc; 762b5a52c9dSPavan Nikhilesh stats->page_cnt = req_rsp->page_cnt; 763b5a52c9dSPavan Nikhilesh stats->ts_pc = req_rsp->ts_pc; 764b5a52c9dSPavan Nikhilesh stats->wa_pc = req_rsp->wa_pc; 765b5a52c9dSPavan Nikhilesh stats->ws_pc = req_rsp->ws_pc; 766be541d37SPavan Nikhilesh 767be541d37SPavan Nikhilesh fail: 76844a9307cSRakesh Kudurumalla mbox_put(mbox); 769be541d37SPavan Nikhilesh return rc; 770b5a52c9dSPavan Nikhilesh } 771b5a52c9dSPavan Nikhilesh 772b5a52c9dSPavan Nikhilesh int 773111a6122SPavan Nikhilesh roc_sso_hwgrp_hws_link_status(struct roc_sso *roc_sso, uint8_t hws, 774111a6122SPavan Nikhilesh uint16_t hwgrp) 775111a6122SPavan Nikhilesh { 776111a6122SPavan Nikhilesh struct sso *sso; 777111a6122SPavan Nikhilesh 778111a6122SPavan Nikhilesh sso = roc_sso_to_sso_priv(roc_sso); 779111a6122SPavan Nikhilesh return plt_bitmap_get(sso->link_map[hws], hwgrp); 780111a6122SPavan Nikhilesh } 781111a6122SPavan Nikhilesh 782111a6122SPavan Nikhilesh int 78320345cbdSPavan Nikhilesh roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_qos *qos, uint16_t nb_qos) 784111a6122SPavan Nikhilesh { 785be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 786be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 787111a6122SPavan Nikhilesh struct sso_grp_qos_cfg *req; 78844a9307cSRakesh Kudurumalla struct mbox *mbox; 789111a6122SPavan Nikhilesh int i, rc; 790111a6122SPavan Nikhilesh 79120345cbdSPavan Nikhilesh if (!nb_qos) 79220345cbdSPavan Nikhilesh return 0; 79320345cbdSPavan Nikhilesh 79444a9307cSRakesh Kudurumalla mbox = mbox_get(dev->mbox); 795111a6122SPavan Nikhilesh for (i = 0; i < nb_qos; i++) { 796111a6122SPavan Nikhilesh uint8_t iaq_prcnt = qos[i].iaq_prcnt; 797111a6122SPavan Nikhilesh uint8_t taq_prcnt = qos[i].taq_prcnt; 798111a6122SPavan Nikhilesh 79944a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_grp_qos_config(mbox); 800111a6122SPavan Nikhilesh if (req == NULL) { 80144a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 802be541d37SPavan Nikhilesh if (rc) { 803be541d37SPavan Nikhilesh rc = -EIO; 804be541d37SPavan Nikhilesh goto fail; 805be541d37SPavan Nikhilesh } 806be541d37SPavan Nikhilesh 80744a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_grp_qos_config(mbox); 808be541d37SPavan Nikhilesh if (req == NULL) { 809be541d37SPavan Nikhilesh rc = -ENOSPC; 810be541d37SPavan Nikhilesh goto fail; 811be541d37SPavan Nikhilesh } 812111a6122SPavan Nikhilesh } 813111a6122SPavan Nikhilesh req->grp = qos[i].hwgrp; 814448e2400SShijith Thotton req->iaq_thr = (SSO_HWGRP_IAQ_MAX_THR_MASK * 815111a6122SPavan Nikhilesh (iaq_prcnt ? iaq_prcnt : 100)) / 816111a6122SPavan Nikhilesh 100; 817448e2400SShijith Thotton req->taq_thr = (SSO_HWGRP_TAQ_MAX_THR_MASK * 818111a6122SPavan Nikhilesh (taq_prcnt ? taq_prcnt : 100)) / 819111a6122SPavan Nikhilesh 100; 820111a6122SPavan Nikhilesh } 821111a6122SPavan Nikhilesh 82244a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 823be541d37SPavan Nikhilesh if (rc) 824be541d37SPavan Nikhilesh rc = -EIO; 825be541d37SPavan Nikhilesh fail: 82644a9307cSRakesh Kudurumalla mbox_put(mbox); 827be541d37SPavan Nikhilesh return rc; 828111a6122SPavan Nikhilesh } 829111a6122SPavan Nikhilesh 830111a6122SPavan Nikhilesh int 83149b0424fSPavan Nikhilesh sso_hwgrp_init_xaq_aura(struct dev *dev, struct roc_sso_xaq_data *xaq, 83249b0424fSPavan Nikhilesh uint32_t nb_xae, uint32_t xae_waes, 83349b0424fSPavan Nikhilesh uint32_t xaq_buf_size, uint16_t nb_hwgrp) 83449b0424fSPavan Nikhilesh { 83549b0424fSPavan Nikhilesh struct npa_pool_s pool; 83649b0424fSPavan Nikhilesh struct npa_aura_s aura; 83749b0424fSPavan Nikhilesh plt_iova_t iova; 83849b0424fSPavan Nikhilesh uint32_t i; 83949b0424fSPavan Nikhilesh int rc; 84049b0424fSPavan Nikhilesh 84149b0424fSPavan Nikhilesh if (xaq->mem != NULL) { 84249b0424fSPavan Nikhilesh rc = sso_hwgrp_release_xaq(dev, nb_hwgrp); 84349b0424fSPavan Nikhilesh if (rc < 0) { 84449b0424fSPavan Nikhilesh plt_err("Failed to release XAQ %d", rc); 84549b0424fSPavan Nikhilesh return rc; 84649b0424fSPavan Nikhilesh } 84749b0424fSPavan Nikhilesh roc_npa_pool_destroy(xaq->aura_handle); 84849b0424fSPavan Nikhilesh plt_free(xaq->fc); 84949b0424fSPavan Nikhilesh plt_free(xaq->mem); 85049b0424fSPavan Nikhilesh memset(xaq, 0, sizeof(struct roc_sso_xaq_data)); 85149b0424fSPavan Nikhilesh } 85249b0424fSPavan Nikhilesh 85349b0424fSPavan Nikhilesh xaq->fc = plt_zmalloc(ROC_ALIGN, ROC_ALIGN); 85449b0424fSPavan Nikhilesh if (xaq->fc == NULL) { 85549b0424fSPavan Nikhilesh plt_err("Failed to allocate XAQ FC"); 85649b0424fSPavan Nikhilesh rc = -ENOMEM; 85749b0424fSPavan Nikhilesh goto fail; 85849b0424fSPavan Nikhilesh } 85949b0424fSPavan Nikhilesh 86049b0424fSPavan Nikhilesh xaq->nb_xae = nb_xae; 86149b0424fSPavan Nikhilesh 862c3320d21SPavan Nikhilesh /** SSO will reserve up to 0x4 XAQ buffers per group when GetWork engine 863c3320d21SPavan Nikhilesh * is inactive and it might prefetch an additional 0x3 buffers due to 864c3320d21SPavan Nikhilesh * pipelining. 865c3320d21SPavan Nikhilesh */ 86649b0424fSPavan Nikhilesh xaq->nb_xaq = (SSO_XAQ_CACHE_CNT * nb_hwgrp); 867efd8b8a7SPavan Nikhilesh xaq->nb_xaq += (SSO_XAQ_RSVD_CNT * nb_hwgrp); 86849b0424fSPavan Nikhilesh xaq->nb_xaq += PLT_MAX(1 + ((xaq->nb_xae - 1) / xae_waes), xaq->nb_xaq); 869c3320d21SPavan Nikhilesh xaq->nb_xaq += SSO_XAQ_SLACK; 87049b0424fSPavan Nikhilesh 87149b0424fSPavan Nikhilesh xaq->mem = plt_zmalloc(xaq_buf_size * xaq->nb_xaq, xaq_buf_size); 87249b0424fSPavan Nikhilesh if (xaq->mem == NULL) { 87349b0424fSPavan Nikhilesh plt_err("Failed to allocate XAQ mem"); 87449b0424fSPavan Nikhilesh rc = -ENOMEM; 87549b0424fSPavan Nikhilesh goto free_fc; 87649b0424fSPavan Nikhilesh } 87749b0424fSPavan Nikhilesh 87849b0424fSPavan Nikhilesh memset(&pool, 0, sizeof(struct npa_pool_s)); 87949b0424fSPavan Nikhilesh pool.nat_align = 1; 88049b0424fSPavan Nikhilesh 88149b0424fSPavan Nikhilesh memset(&aura, 0, sizeof(aura)); 88249b0424fSPavan Nikhilesh aura.fc_ena = 1; 88349b0424fSPavan Nikhilesh aura.fc_addr = (uint64_t)xaq->fc; 88449b0424fSPavan Nikhilesh aura.fc_hyst_bits = 0; /* Store count on all updates */ 88549b0424fSPavan Nikhilesh rc = roc_npa_pool_create(&xaq->aura_handle, xaq_buf_size, xaq->nb_xaq, 8868e5a4adbSNithin Dabilpuram &aura, &pool, 0); 88749b0424fSPavan Nikhilesh if (rc) { 88849b0424fSPavan Nikhilesh plt_err("Failed to create XAQ pool"); 88949b0424fSPavan Nikhilesh goto npa_fail; 89049b0424fSPavan Nikhilesh } 89149b0424fSPavan Nikhilesh 89249b0424fSPavan Nikhilesh iova = (uint64_t)xaq->mem; 89349b0424fSPavan Nikhilesh for (i = 0; i < xaq->nb_xaq; i++) { 89449b0424fSPavan Nikhilesh roc_npa_aura_op_free(xaq->aura_handle, 0, iova); 89549b0424fSPavan Nikhilesh iova += xaq_buf_size; 89649b0424fSPavan Nikhilesh } 8970bdad505SAshwin Sekhar T K roc_npa_pool_op_range_set(xaq->aura_handle, (uint64_t)xaq->mem, iova); 89849b0424fSPavan Nikhilesh 89992734378SAshwin Sekhar T K if (roc_npa_aura_op_available_wait(xaq->aura_handle, xaq->nb_xaq, 0) != 90092734378SAshwin Sekhar T K xaq->nb_xaq) { 90192734378SAshwin Sekhar T K plt_err("Failed to free all pointers to the pool"); 90292734378SAshwin Sekhar T K rc = -ENOMEM; 90392734378SAshwin Sekhar T K goto npa_fill_fail; 90492734378SAshwin Sekhar T K } 90592734378SAshwin Sekhar T K 90649b0424fSPavan Nikhilesh /* When SW does addwork (enqueue) check if there is space in XAQ by 90749b0424fSPavan Nikhilesh * comparing fc_addr above against the xaq_lmt calculated below. 90849b0424fSPavan Nikhilesh * There should be a minimum headroom of 7 XAQs per HWGRP for SSO 90949b0424fSPavan Nikhilesh * to request XAQ to cache them even before enqueue is called. 91049b0424fSPavan Nikhilesh */ 911efd8b8a7SPavan Nikhilesh xaq->xaq_lmt = xaq->nb_xaq - (nb_hwgrp * SSO_XAQ_CACHE_CNT) - SSO_XAQ_SLACK; 91249b0424fSPavan Nikhilesh 91349b0424fSPavan Nikhilesh return 0; 91492734378SAshwin Sekhar T K npa_fill_fail: 91592734378SAshwin Sekhar T K roc_npa_pool_destroy(xaq->aura_handle); 91649b0424fSPavan Nikhilesh npa_fail: 91749b0424fSPavan Nikhilesh plt_free(xaq->mem); 91849b0424fSPavan Nikhilesh free_fc: 91949b0424fSPavan Nikhilesh plt_free(xaq->fc); 92049b0424fSPavan Nikhilesh fail: 92149b0424fSPavan Nikhilesh memset(xaq, 0, sizeof(struct roc_sso_xaq_data)); 92249b0424fSPavan Nikhilesh return rc; 92349b0424fSPavan Nikhilesh } 92449b0424fSPavan Nikhilesh 92549b0424fSPavan Nikhilesh int 92649b0424fSPavan Nikhilesh roc_sso_hwgrp_init_xaq_aura(struct roc_sso *roc_sso, uint32_t nb_xae) 92749b0424fSPavan Nikhilesh { 928be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 929be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 930be541d37SPavan Nikhilesh int rc; 93149b0424fSPavan Nikhilesh 93282526521SPavan Nikhilesh rc = sso_hwgrp_init_xaq_aura(dev, &roc_sso->xaq, nb_xae, roc_sso->feat.xaq_wq_entries, 93382526521SPavan Nikhilesh roc_sso->feat.xaq_buf_size, roc_sso->nb_hwgrp); 934be541d37SPavan Nikhilesh return rc; 93549b0424fSPavan Nikhilesh } 93649b0424fSPavan Nikhilesh 93749b0424fSPavan Nikhilesh int 93849b0424fSPavan Nikhilesh sso_hwgrp_free_xaq_aura(struct dev *dev, struct roc_sso_xaq_data *xaq, 93949b0424fSPavan Nikhilesh uint16_t nb_hwgrp) 94049b0424fSPavan Nikhilesh { 94149b0424fSPavan Nikhilesh int rc; 94249b0424fSPavan Nikhilesh 94349b0424fSPavan Nikhilesh if (xaq->mem != NULL) { 94449b0424fSPavan Nikhilesh if (nb_hwgrp) { 94549b0424fSPavan Nikhilesh rc = sso_hwgrp_release_xaq(dev, nb_hwgrp); 94649b0424fSPavan Nikhilesh if (rc < 0) { 94749b0424fSPavan Nikhilesh plt_err("Failed to release XAQ %d", rc); 94849b0424fSPavan Nikhilesh return rc; 94949b0424fSPavan Nikhilesh } 95049b0424fSPavan Nikhilesh } 95149b0424fSPavan Nikhilesh roc_npa_pool_destroy(xaq->aura_handle); 95249b0424fSPavan Nikhilesh plt_free(xaq->fc); 95349b0424fSPavan Nikhilesh plt_free(xaq->mem); 95449b0424fSPavan Nikhilesh } 95549b0424fSPavan Nikhilesh memset(xaq, 0, sizeof(struct roc_sso_xaq_data)); 95649b0424fSPavan Nikhilesh 95749b0424fSPavan Nikhilesh return 0; 95849b0424fSPavan Nikhilesh } 95949b0424fSPavan Nikhilesh 96049b0424fSPavan Nikhilesh int 96149b0424fSPavan Nikhilesh roc_sso_hwgrp_free_xaq_aura(struct roc_sso *roc_sso, uint16_t nb_hwgrp) 96249b0424fSPavan Nikhilesh { 963be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 964be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 965be541d37SPavan Nikhilesh int rc; 96649b0424fSPavan Nikhilesh 967be541d37SPavan Nikhilesh rc = sso_hwgrp_free_xaq_aura(dev, &roc_sso->xaq, nb_hwgrp); 968be541d37SPavan Nikhilesh return rc; 96949b0424fSPavan Nikhilesh } 97049b0424fSPavan Nikhilesh 97149b0424fSPavan Nikhilesh int 9720423387fSNithin Dabilpuram sso_hwgrp_alloc_xaq(struct dev *dev, uint32_t npa_aura_id, uint16_t hwgrps) 973111a6122SPavan Nikhilesh { 974111a6122SPavan Nikhilesh struct sso_hw_setconfig *req; 97544a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 976111a6122SPavan Nikhilesh int rc = -ENOSPC; 977111a6122SPavan Nikhilesh 97844a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_hw_setconfig(mbox); 979111a6122SPavan Nikhilesh if (req == NULL) 98044a9307cSRakesh Kudurumalla goto exit; 981111a6122SPavan Nikhilesh req->npa_pf_func = idev_npa_pffunc_get(); 982111a6122SPavan Nikhilesh req->npa_aura_id = npa_aura_id; 983111a6122SPavan Nikhilesh req->hwgrps = hwgrps; 984111a6122SPavan Nikhilesh 98544a9307cSRakesh Kudurumalla if (mbox_process(dev->mbox)) { 98644a9307cSRakesh Kudurumalla rc = -EIO; 98744a9307cSRakesh Kudurumalla goto exit; 98844a9307cSRakesh Kudurumalla } 989be541d37SPavan Nikhilesh 99044a9307cSRakesh Kudurumalla rc = 0; 99144a9307cSRakesh Kudurumalla exit: 99244a9307cSRakesh Kudurumalla mbox_put(mbox); 99344a9307cSRakesh Kudurumalla return rc; 994111a6122SPavan Nikhilesh } 995111a6122SPavan Nikhilesh 996111a6122SPavan Nikhilesh int 9970423387fSNithin Dabilpuram roc_sso_hwgrp_alloc_xaq(struct roc_sso *roc_sso, uint32_t npa_aura_id, 9980423387fSNithin Dabilpuram uint16_t hwgrps) 999111a6122SPavan Nikhilesh { 1000be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 1001be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 1002be541d37SPavan Nikhilesh int rc; 10030423387fSNithin Dabilpuram 1004be541d37SPavan Nikhilesh rc = sso_hwgrp_alloc_xaq(dev, npa_aura_id, hwgrps); 1005be541d37SPavan Nikhilesh return rc; 10060423387fSNithin Dabilpuram } 10070423387fSNithin Dabilpuram 10080423387fSNithin Dabilpuram int 10090423387fSNithin Dabilpuram sso_hwgrp_release_xaq(struct dev *dev, uint16_t hwgrps) 10100423387fSNithin Dabilpuram { 1011111a6122SPavan Nikhilesh struct sso_hw_xaq_release *req; 101244a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 101344a9307cSRakesh Kudurumalla int rc; 1014111a6122SPavan Nikhilesh 101544a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_hw_release_xaq_aura(mbox); 101644a9307cSRakesh Kudurumalla if (req == NULL) { 101744a9307cSRakesh Kudurumalla rc = -EINVAL; 101844a9307cSRakesh Kudurumalla goto exit; 101944a9307cSRakesh Kudurumalla } 1020111a6122SPavan Nikhilesh req->hwgrps = hwgrps; 1021111a6122SPavan Nikhilesh 102244a9307cSRakesh Kudurumalla if (mbox_process(mbox)) { 102344a9307cSRakesh Kudurumalla rc = -EIO; 102444a9307cSRakesh Kudurumalla goto exit; 102544a9307cSRakesh Kudurumalla } 1026be541d37SPavan Nikhilesh 102744a9307cSRakesh Kudurumalla rc = 0; 102844a9307cSRakesh Kudurumalla exit: 102944a9307cSRakesh Kudurumalla mbox_put(mbox); 103044a9307cSRakesh Kudurumalla return rc; 1031111a6122SPavan Nikhilesh } 1032111a6122SPavan Nikhilesh 1033111a6122SPavan Nikhilesh int 10340423387fSNithin Dabilpuram roc_sso_hwgrp_release_xaq(struct roc_sso *roc_sso, uint16_t hwgrps) 10350423387fSNithin Dabilpuram { 1036be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 1037be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 1038be541d37SPavan Nikhilesh int rc; 10390423387fSNithin Dabilpuram 104080fa49e6SPavan Nikhilesh if (!hwgrps) 104180fa49e6SPavan Nikhilesh return 0; 104280fa49e6SPavan Nikhilesh 1043be541d37SPavan Nikhilesh rc = sso_hwgrp_release_xaq(dev, hwgrps); 1044be541d37SPavan Nikhilesh return rc; 10450423387fSNithin Dabilpuram } 10460423387fSNithin Dabilpuram 10470423387fSNithin Dabilpuram int 1048111a6122SPavan Nikhilesh roc_sso_hwgrp_set_priority(struct roc_sso *roc_sso, uint16_t hwgrp, 1049111a6122SPavan Nikhilesh uint8_t weight, uint8_t affinity, uint8_t priority) 1050111a6122SPavan Nikhilesh { 1051be541d37SPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 1052be541d37SPavan Nikhilesh struct dev *dev = &sso->dev; 1053111a6122SPavan Nikhilesh struct sso_grp_priority *req; 105444a9307cSRakesh Kudurumalla struct mbox *mbox; 1055111a6122SPavan Nikhilesh int rc = -ENOSPC; 1056111a6122SPavan Nikhilesh 105744a9307cSRakesh Kudurumalla mbox = mbox_get(dev->mbox); 105844a9307cSRakesh Kudurumalla req = mbox_alloc_msg_sso_grp_set_priority(mbox); 1059111a6122SPavan Nikhilesh if (req == NULL) 1060be541d37SPavan Nikhilesh goto fail; 1061111a6122SPavan Nikhilesh req->grp = hwgrp; 1062111a6122SPavan Nikhilesh req->weight = weight; 1063111a6122SPavan Nikhilesh req->affinity = affinity; 1064111a6122SPavan Nikhilesh req->priority = priority; 1065111a6122SPavan Nikhilesh 106644a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 1067be541d37SPavan Nikhilesh if (rc) { 1068be541d37SPavan Nikhilesh rc = -EIO; 1069be541d37SPavan Nikhilesh goto fail; 1070be541d37SPavan Nikhilesh } 107144a9307cSRakesh Kudurumalla mbox_put(mbox); 1072111a6122SPavan Nikhilesh plt_sso_dbg("HWGRP %d weight %d affinity %d priority %d", hwgrp, weight, 1073111a6122SPavan Nikhilesh affinity, priority); 1074111a6122SPavan Nikhilesh 1075111a6122SPavan Nikhilesh return 0; 1076be541d37SPavan Nikhilesh fail: 107744a9307cSRakesh Kudurumalla mbox_put(mbox); 1078be541d37SPavan Nikhilesh return rc; 1079111a6122SPavan Nikhilesh } 1080111a6122SPavan Nikhilesh 1081993107f0SShijith Thotton static int 1082993107f0SShijith Thotton sso_update_msix_vec_count(struct roc_sso *roc_sso, uint16_t sso_vec_cnt) 1083993107f0SShijith Thotton { 1084993107f0SShijith Thotton struct plt_pci_device *pci_dev = roc_sso->pci_dev; 1085993107f0SShijith Thotton struct sso *sso = roc_sso_to_sso_priv(roc_sso); 1086993107f0SShijith Thotton uint16_t mbox_vec_cnt, npa_vec_cnt; 1087993107f0SShijith Thotton struct dev *dev = &sso->dev; 1088993107f0SShijith Thotton struct idev_cfg *idev; 1089993107f0SShijith Thotton int rc; 1090993107f0SShijith Thotton 1091993107f0SShijith Thotton idev = idev_get_cfg(); 1092993107f0SShijith Thotton if (idev == NULL) 1093993107f0SShijith Thotton return -ENODEV; 1094993107f0SShijith Thotton 109545ce5425SPavan Nikhilesh if (roc_model_is_cn20k()) 109645ce5425SPavan Nikhilesh mbox_vec_cnt = RVU_MBOX_PF_INT_VEC_AFPF_MBOX + 1; 109745ce5425SPavan Nikhilesh else 1098993107f0SShijith Thotton mbox_vec_cnt = RVU_PF_INT_VEC_AFPF_MBOX + 1; 1099993107f0SShijith Thotton 1100993107f0SShijith Thotton /* Allocating vectors for the first time */ 1101993107f0SShijith Thotton if (plt_intr_max_intr_get(pci_dev->intr_handle) == 0) { 1102993107f0SShijith Thotton npa_vec_cnt = idev->npa_refcnt ? 0 : NPA_LF_INT_VEC_POISON + 1; 1103993107f0SShijith Thotton return dev_irq_reconfigure(pci_dev->intr_handle, mbox_vec_cnt + npa_vec_cnt); 1104993107f0SShijith Thotton } 1105993107f0SShijith Thotton 1106758b58f0SPavan Nikhilesh /* Before re-configuring unregister irqs */ 1107993107f0SShijith Thotton npa_vec_cnt = (dev->npa.pci_dev == pci_dev) ? NPA_LF_INT_VEC_POISON + 1 : 0; 1108758b58f0SPavan Nikhilesh if (npa_vec_cnt) 1109758b58f0SPavan Nikhilesh npa_unregister_irqs(&dev->npa); 1110758b58f0SPavan Nikhilesh 1111758b58f0SPavan Nikhilesh dev_mbox_unregister_irq(pci_dev, dev); 1112758b58f0SPavan Nikhilesh if (!dev_is_vf(dev)) 1113758b58f0SPavan Nikhilesh dev_vf_flr_unregister_irqs(pci_dev, dev); 1114993107f0SShijith Thotton 1115993107f0SShijith Thotton /* Re-configure to include SSO vectors */ 1116993107f0SShijith Thotton rc = dev_irq_reconfigure(pci_dev->intr_handle, mbox_vec_cnt + npa_vec_cnt + sso_vec_cnt); 1117993107f0SShijith Thotton if (rc) 1118993107f0SShijith Thotton return rc; 1119993107f0SShijith Thotton 1120993107f0SShijith Thotton rc = dev_mbox_register_irq(pci_dev, dev); 1121993107f0SShijith Thotton if (rc) 1122993107f0SShijith Thotton return rc; 1123993107f0SShijith Thotton 1124993107f0SShijith Thotton if (!dev_is_vf(dev)) { 1125993107f0SShijith Thotton rc = dev_vf_flr_register_irqs(pci_dev, dev); 1126993107f0SShijith Thotton if (rc) 1127993107f0SShijith Thotton return rc; 1128993107f0SShijith Thotton } 1129993107f0SShijith Thotton 1130993107f0SShijith Thotton if (npa_vec_cnt) 1131993107f0SShijith Thotton rc = npa_register_irqs(&dev->npa); 1132993107f0SShijith Thotton 1133993107f0SShijith Thotton return rc; 1134993107f0SShijith Thotton } 1135993107f0SShijith Thotton 1136111a6122SPavan Nikhilesh int 113720345cbdSPavan Nikhilesh roc_sso_hwgrp_stash_config(struct roc_sso *roc_sso, struct roc_sso_hwgrp_stash *stash, 113820345cbdSPavan Nikhilesh uint16_t nb_stash) 113920345cbdSPavan Nikhilesh { 114020345cbdSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 114120345cbdSPavan Nikhilesh struct sso_grp_stash_cfg *req; 114220345cbdSPavan Nikhilesh struct dev *dev = &sso->dev; 114320345cbdSPavan Nikhilesh struct mbox *mbox; 114420345cbdSPavan Nikhilesh int i, rc; 114520345cbdSPavan Nikhilesh 114620345cbdSPavan Nikhilesh if (!nb_stash) 114720345cbdSPavan Nikhilesh return 0; 114820345cbdSPavan Nikhilesh 114920345cbdSPavan Nikhilesh mbox = mbox_get(dev->mbox); 115020345cbdSPavan Nikhilesh for (i = 0; i < nb_stash; i++) { 115120345cbdSPavan Nikhilesh req = mbox_alloc_msg_sso_grp_stash_config(mbox); 115220345cbdSPavan Nikhilesh if (req == NULL) { 115320345cbdSPavan Nikhilesh rc = mbox_process(mbox); 115420345cbdSPavan Nikhilesh if (rc) { 115520345cbdSPavan Nikhilesh rc = -EIO; 115620345cbdSPavan Nikhilesh goto fail; 115720345cbdSPavan Nikhilesh } 115820345cbdSPavan Nikhilesh 115920345cbdSPavan Nikhilesh req = mbox_alloc_msg_sso_grp_stash_config(mbox); 116020345cbdSPavan Nikhilesh if (req == NULL) { 116120345cbdSPavan Nikhilesh rc = -ENOSPC; 116220345cbdSPavan Nikhilesh goto fail; 116320345cbdSPavan Nikhilesh } 116420345cbdSPavan Nikhilesh } 116520345cbdSPavan Nikhilesh req->ena = true; 116620345cbdSPavan Nikhilesh req->grp = stash[i].hwgrp; 116720345cbdSPavan Nikhilesh req->offset = stash[i].stash_offset; 116820345cbdSPavan Nikhilesh req->num_linesm1 = stash[i].stash_count - 1; 116920345cbdSPavan Nikhilesh } 117020345cbdSPavan Nikhilesh 117120345cbdSPavan Nikhilesh rc = mbox_process(mbox); 117220345cbdSPavan Nikhilesh if (rc) 117320345cbdSPavan Nikhilesh rc = -EIO; 117420345cbdSPavan Nikhilesh fail: 117520345cbdSPavan Nikhilesh mbox_put(mbox); 117620345cbdSPavan Nikhilesh return rc; 117720345cbdSPavan Nikhilesh } 117820345cbdSPavan Nikhilesh 117920345cbdSPavan Nikhilesh int 1180993107f0SShijith Thotton roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp, uint16_t nb_tim_lfs) 11819b727f85SPavan Nikhilesh { 118284ed1a5bSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 11839b727f85SPavan Nikhilesh struct sso_lf_alloc_rsp *rsp_hwgrp; 1184993107f0SShijith Thotton uint16_t sso_vec_cnt, free_tim_lfs; 11859b727f85SPavan Nikhilesh int rc; 11869b727f85SPavan Nikhilesh 118761da0fe6SHanumanth Pothula if (!nb_hwgrp || roc_sso->max_hwgrp < nb_hwgrp) 11889b727f85SPavan Nikhilesh return -ENOENT; 118961da0fe6SHanumanth Pothula if (!nb_hws || roc_sso->max_hws < nb_hws) 11909b727f85SPavan Nikhilesh return -ENOENT; 11919b727f85SPavan Nikhilesh 11929b727f85SPavan Nikhilesh rc = sso_rsrc_attach(roc_sso, SSO_LF_TYPE_HWS, nb_hws); 11939b727f85SPavan Nikhilesh if (rc < 0) { 11949b727f85SPavan Nikhilesh plt_err("Unable to attach SSO HWS LFs"); 1195be541d37SPavan Nikhilesh goto fail; 11969b727f85SPavan Nikhilesh } 11979b727f85SPavan Nikhilesh 11989b727f85SPavan Nikhilesh rc = sso_rsrc_attach(roc_sso, SSO_LF_TYPE_HWGRP, nb_hwgrp); 11999b727f85SPavan Nikhilesh if (rc < 0) { 12009b727f85SPavan Nikhilesh plt_err("Unable to attach SSO HWGRP LFs"); 12019b727f85SPavan Nikhilesh goto hwgrp_atch_fail; 12029b727f85SPavan Nikhilesh } 12039b727f85SPavan Nikhilesh 12040423387fSNithin Dabilpuram rc = sso_lf_alloc(&sso->dev, SSO_LF_TYPE_HWS, nb_hws, NULL); 12059b727f85SPavan Nikhilesh if (rc < 0) { 12069b727f85SPavan Nikhilesh plt_err("Unable to alloc SSO HWS LFs"); 12079b727f85SPavan Nikhilesh goto hws_alloc_fail; 12089b727f85SPavan Nikhilesh } 12099b727f85SPavan Nikhilesh 12100423387fSNithin Dabilpuram rc = sso_lf_alloc(&sso->dev, SSO_LF_TYPE_HWGRP, nb_hwgrp, 12119b727f85SPavan Nikhilesh (void **)&rsp_hwgrp); 12129b727f85SPavan Nikhilesh if (rc < 0) { 12139b727f85SPavan Nikhilesh plt_err("Unable to alloc SSO HWGRP Lfs"); 12149b727f85SPavan Nikhilesh goto hwgrp_alloc_fail; 12159b727f85SPavan Nikhilesh } 12169b727f85SPavan Nikhilesh 121782526521SPavan Nikhilesh if (!roc_sso->feat.xaq_buf_size || !roc_sso->feat.xaq_wq_entries || !roc_sso->feat.iue) { 121882526521SPavan Nikhilesh roc_sso->feat.xaq_buf_size = rsp_hwgrp->xaq_buf_size; 121982526521SPavan Nikhilesh roc_sso->feat.xaq_wq_entries = rsp_hwgrp->xaq_wq_entries; 122082526521SPavan Nikhilesh roc_sso->feat.iue = rsp_hwgrp->in_unit_entries; 122182526521SPavan Nikhilesh } 12229b727f85SPavan Nikhilesh 122384ed1a5bSPavan Nikhilesh rc = sso_msix_fill(roc_sso, nb_hws, nb_hwgrp); 122484ed1a5bSPavan Nikhilesh if (rc < 0) { 122584ed1a5bSPavan Nikhilesh plt_err("Unable to get MSIX offsets for SSO LFs"); 122684ed1a5bSPavan Nikhilesh goto sso_msix_fail; 122784ed1a5bSPavan Nikhilesh } 122884ed1a5bSPavan Nikhilesh 1229993107f0SShijith Thotton /* 1 error interrupt per SSO HWS/HWGRP */ 1230993107f0SShijith Thotton sso_vec_cnt = nb_hws + nb_hwgrp; 1231993107f0SShijith Thotton 1232993107f0SShijith Thotton if (sso->dev.roc_tim) { 1233993107f0SShijith Thotton nb_tim_lfs = ((struct roc_tim *)sso->dev.roc_tim)->nb_lfs; 1234993107f0SShijith Thotton } else { 1235993107f0SShijith Thotton rc = tim_free_lf_count_get(&sso->dev, &free_tim_lfs); 1236993107f0SShijith Thotton if (rc < 0) { 1237993107f0SShijith Thotton plt_err("Failed to get TIM resource count"); 1238993107f0SShijith Thotton goto sso_msix_fail; 1239993107f0SShijith Thotton } 1240993107f0SShijith Thotton 124137a94462SPavan Nikhilesh nb_tim_lfs = PLT_MIN(nb_tim_lfs, free_tim_lfs); 1242993107f0SShijith Thotton } 1243993107f0SShijith Thotton 1244993107f0SShijith Thotton /* 2 error interrupt per TIM LF */ 124545ce5425SPavan Nikhilesh if (roc_model_is_cn20k()) 124645ce5425SPavan Nikhilesh sso_vec_cnt += 3 * nb_tim_lfs; 124745ce5425SPavan Nikhilesh else 1248993107f0SShijith Thotton sso_vec_cnt += 2 * nb_tim_lfs; 1249993107f0SShijith Thotton 1250993107f0SShijith Thotton rc = sso_update_msix_vec_count(roc_sso, sso_vec_cnt); 1251993107f0SShijith Thotton if (rc < 0) { 1252993107f0SShijith Thotton plt_err("Failed to update SSO MSIX vector count"); 1253993107f0SShijith Thotton goto sso_msix_fail; 1254993107f0SShijith Thotton } 1255993107f0SShijith Thotton 1256d61138d4SHarman Kalra rc = sso_register_irqs_priv(roc_sso, sso->pci_dev->intr_handle, nb_hws, 125784ed1a5bSPavan Nikhilesh nb_hwgrp); 125884ed1a5bSPavan Nikhilesh if (rc < 0) { 125984ed1a5bSPavan Nikhilesh plt_err("Failed to register SSO LF IRQs"); 126084ed1a5bSPavan Nikhilesh goto sso_msix_fail; 126184ed1a5bSPavan Nikhilesh } 126284ed1a5bSPavan Nikhilesh 12639b727f85SPavan Nikhilesh roc_sso->nb_hwgrp = nb_hwgrp; 12649b727f85SPavan Nikhilesh roc_sso->nb_hws = nb_hws; 12659b727f85SPavan Nikhilesh 12669b727f85SPavan Nikhilesh return 0; 126784ed1a5bSPavan Nikhilesh sso_msix_fail: 12680423387fSNithin Dabilpuram sso_lf_free(&sso->dev, SSO_LF_TYPE_HWGRP, nb_hwgrp); 12699b727f85SPavan Nikhilesh hwgrp_alloc_fail: 12700423387fSNithin Dabilpuram sso_lf_free(&sso->dev, SSO_LF_TYPE_HWS, nb_hws); 12719b727f85SPavan Nikhilesh hws_alloc_fail: 12729b727f85SPavan Nikhilesh sso_rsrc_detach(roc_sso, SSO_LF_TYPE_HWGRP); 12739b727f85SPavan Nikhilesh hwgrp_atch_fail: 12749b727f85SPavan Nikhilesh sso_rsrc_detach(roc_sso, SSO_LF_TYPE_HWS); 1275be541d37SPavan Nikhilesh fail: 12769b727f85SPavan Nikhilesh return rc; 12779b727f85SPavan Nikhilesh } 12789b727f85SPavan Nikhilesh 12799b727f85SPavan Nikhilesh void 12809b727f85SPavan Nikhilesh roc_sso_rsrc_fini(struct roc_sso *roc_sso) 12819b727f85SPavan Nikhilesh { 128284ed1a5bSPavan Nikhilesh struct sso *sso = roc_sso_to_sso_priv(roc_sso); 1283*62afdd8dSPavan Nikhilesh uint32_t cnt; 128484ed1a5bSPavan Nikhilesh 12859b727f85SPavan Nikhilesh if (!roc_sso->nb_hws && !roc_sso->nb_hwgrp) 12869b727f85SPavan Nikhilesh return; 12879b727f85SPavan Nikhilesh 1288*62afdd8dSPavan Nikhilesh for (cnt = 0; cnt < roc_sso->nb_hwgrp; cnt++) 1289*62afdd8dSPavan Nikhilesh roc_sso_hwgrp_agq_release(roc_sso, cnt); 1290*62afdd8dSPavan Nikhilesh 1291d61138d4SHarman Kalra sso_unregister_irqs_priv(roc_sso, sso->pci_dev->intr_handle, 129284ed1a5bSPavan Nikhilesh roc_sso->nb_hws, roc_sso->nb_hwgrp); 12930423387fSNithin Dabilpuram sso_lf_free(&sso->dev, SSO_LF_TYPE_HWS, roc_sso->nb_hws); 12940423387fSNithin Dabilpuram sso_lf_free(&sso->dev, SSO_LF_TYPE_HWGRP, roc_sso->nb_hwgrp); 12959b727f85SPavan Nikhilesh 12969b727f85SPavan Nikhilesh sso_rsrc_detach(roc_sso, SSO_LF_TYPE_HWS); 12979b727f85SPavan Nikhilesh sso_rsrc_detach(roc_sso, SSO_LF_TYPE_HWGRP); 12989b727f85SPavan Nikhilesh 12999b727f85SPavan Nikhilesh roc_sso->nb_hwgrp = 0; 13009b727f85SPavan Nikhilesh roc_sso->nb_hws = 0; 13019b727f85SPavan Nikhilesh } 13029b727f85SPavan Nikhilesh 13039b727f85SPavan Nikhilesh int 13049b727f85SPavan Nikhilesh roc_sso_dev_init(struct roc_sso *roc_sso) 13059b727f85SPavan Nikhilesh { 13069b727f85SPavan Nikhilesh struct plt_pci_device *pci_dev; 130746ee7b23SPavan Nikhilesh uint32_t link_map_sz; 13089b727f85SPavan Nikhilesh struct sso *sso; 130946ee7b23SPavan Nikhilesh void *link_mem; 131046ee7b23SPavan Nikhilesh int i, rc; 13119b727f85SPavan Nikhilesh 13129b727f85SPavan Nikhilesh if (roc_sso == NULL || roc_sso->pci_dev == NULL) 13139b727f85SPavan Nikhilesh return SSO_ERR_PARAM; 13149b727f85SPavan Nikhilesh 13159b727f85SPavan Nikhilesh PLT_STATIC_ASSERT(sizeof(struct sso) <= ROC_SSO_MEM_SZ); 13169b727f85SPavan Nikhilesh sso = roc_sso_to_sso_priv(roc_sso); 13179b727f85SPavan Nikhilesh memset(sso, 0, sizeof(*sso)); 13189b727f85SPavan Nikhilesh pci_dev = roc_sso->pci_dev; 13199b727f85SPavan Nikhilesh 1320993107f0SShijith Thotton rc = sso_update_msix_vec_count(roc_sso, 0); 1321993107f0SShijith Thotton if (rc < 0) { 1322993107f0SShijith Thotton plt_err("Failed to set SSO MSIX vector count"); 1323993107f0SShijith Thotton return rc; 1324993107f0SShijith Thotton } 1325993107f0SShijith Thotton 13269b727f85SPavan Nikhilesh rc = dev_init(&sso->dev, pci_dev); 13279b727f85SPavan Nikhilesh if (rc < 0) { 13289b727f85SPavan Nikhilesh plt_err("Failed to init roc device"); 13299b727f85SPavan Nikhilesh goto fail; 13309b727f85SPavan Nikhilesh } 13319b727f85SPavan Nikhilesh 133282526521SPavan Nikhilesh rc = sso_hw_info_get(roc_sso); 133382526521SPavan Nikhilesh if (rc < 0) { 133482526521SPavan Nikhilesh plt_err("Failed to get SSO HW info"); 133582526521SPavan Nikhilesh goto fail; 133682526521SPavan Nikhilesh } 133782526521SPavan Nikhilesh 13389b727f85SPavan Nikhilesh rc = sso_rsrc_get(roc_sso); 13399b727f85SPavan Nikhilesh if (rc < 0) { 13409b727f85SPavan Nikhilesh plt_err("Failed to get SSO resources"); 13419b727f85SPavan Nikhilesh goto rsrc_fail; 13429b727f85SPavan Nikhilesh } 13439b727f85SPavan Nikhilesh rc = -ENOMEM; 13449b727f85SPavan Nikhilesh 13457ecf3083SShijith Thotton if (roc_sso->max_hws) { 13467ecf3083SShijith Thotton sso->link_map = plt_zmalloc( 13477ecf3083SShijith Thotton sizeof(struct plt_bitmap *) * roc_sso->max_hws, 0); 134846ee7b23SPavan Nikhilesh if (sso->link_map == NULL) { 134946ee7b23SPavan Nikhilesh plt_err("Failed to allocate memory for link_map array"); 135046ee7b23SPavan Nikhilesh goto rsrc_fail; 135146ee7b23SPavan Nikhilesh } 135246ee7b23SPavan Nikhilesh 13537ecf3083SShijith Thotton link_map_sz = 13547ecf3083SShijith Thotton plt_bitmap_get_memory_footprint(roc_sso->max_hwgrp); 13557ecf3083SShijith Thotton sso->link_map_mem = 13567ecf3083SShijith Thotton plt_zmalloc(link_map_sz * roc_sso->max_hws, 0); 135746ee7b23SPavan Nikhilesh if (sso->link_map_mem == NULL) { 135846ee7b23SPavan Nikhilesh plt_err("Failed to get link_map memory"); 135946ee7b23SPavan Nikhilesh goto rsrc_fail; 136046ee7b23SPavan Nikhilesh } 136146ee7b23SPavan Nikhilesh 136246ee7b23SPavan Nikhilesh link_mem = sso->link_map_mem; 13637ecf3083SShijith Thotton 136446ee7b23SPavan Nikhilesh for (i = 0; i < roc_sso->max_hws; i++) { 13657ecf3083SShijith Thotton sso->link_map[i] = plt_bitmap_init( 13667ecf3083SShijith Thotton roc_sso->max_hwgrp, link_mem, link_map_sz); 136746ee7b23SPavan Nikhilesh if (sso->link_map[i] == NULL) { 136846ee7b23SPavan Nikhilesh plt_err("Failed to allocate link map"); 136946ee7b23SPavan Nikhilesh goto link_mem_free; 137046ee7b23SPavan Nikhilesh } 137146ee7b23SPavan Nikhilesh link_mem = PLT_PTR_ADD(link_mem, link_map_sz); 137246ee7b23SPavan Nikhilesh } 13737ecf3083SShijith Thotton } 13749b727f85SPavan Nikhilesh idev_sso_pffunc_set(sso->dev.pf_func); 1375cb0e45cbSPavan Nikhilesh idev_sso_set(roc_sso); 13769b727f85SPavan Nikhilesh sso->pci_dev = pci_dev; 13779b727f85SPavan Nikhilesh sso->dev.drv_inited = true; 13789b727f85SPavan Nikhilesh roc_sso->lmt_base = sso->dev.lmt_base; 13799b727f85SPavan Nikhilesh 13809b727f85SPavan Nikhilesh return 0; 138146ee7b23SPavan Nikhilesh link_mem_free: 138246ee7b23SPavan Nikhilesh plt_free(sso->link_map_mem); 13839b727f85SPavan Nikhilesh rsrc_fail: 13849b727f85SPavan Nikhilesh rc |= dev_fini(&sso->dev, pci_dev); 13859b727f85SPavan Nikhilesh fail: 13869b727f85SPavan Nikhilesh return rc; 13879b727f85SPavan Nikhilesh } 13889b727f85SPavan Nikhilesh 13899b727f85SPavan Nikhilesh int 13909b727f85SPavan Nikhilesh roc_sso_dev_fini(struct roc_sso *roc_sso) 13919b727f85SPavan Nikhilesh { 13929b727f85SPavan Nikhilesh struct sso *sso; 13939b727f85SPavan Nikhilesh 13949b727f85SPavan Nikhilesh sso = roc_sso_to_sso_priv(roc_sso); 13959b727f85SPavan Nikhilesh sso->dev.drv_inited = false; 13969b727f85SPavan Nikhilesh 13979b727f85SPavan Nikhilesh return dev_fini(&sso->dev, sso->pci_dev); 13989b727f85SPavan Nikhilesh } 1399