1bbcd191cSNithin Dabilpuram /* SPDX-License-Identifier: BSD-3-Clause 2bbcd191cSNithin Dabilpuram * Copyright(C) 2021 Marvell. 3bbcd191cSNithin Dabilpuram */ 4bbcd191cSNithin Dabilpuram 5bbcd191cSNithin Dabilpuram #include "roc_api.h" 6bbcd191cSNithin Dabilpuram #include "roc_priv.h" 7bbcd191cSNithin Dabilpuram 8bea5d990SVamsi Attunuru #include <unistd.h> 9bea5d990SVamsi Attunuru 10c8c967e1SNithin Dabilpuram #define NIX_AURA_DROP_PC_DFLT 40 11c8c967e1SNithin Dabilpuram 12bbcd191cSNithin Dabilpuram /* Default Rx Config for Inline NIX LF */ 13bbcd191cSNithin Dabilpuram #define NIX_INL_LF_RX_CFG \ 14bbcd191cSNithin Dabilpuram (ROC_NIX_LF_RX_CFG_DROP_RE | ROC_NIX_LF_RX_CFG_L2_LEN_ERR | \ 15bbcd191cSNithin Dabilpuram ROC_NIX_LF_RX_CFG_IP6_UDP_OPT | ROC_NIX_LF_RX_CFG_DIS_APAD | \ 16e7597a27SNithin Dabilpuram ROC_NIX_LF_RX_CFG_LEN_IL3 | ROC_NIX_LF_RX_CFG_LEN_OL3) 17bbcd191cSNithin Dabilpuram 1879dc6f32SKommula Shiva Shankar #define INL_NIX_RX_STATS(val) plt_read64(inl_dev->nix_base + NIX_LF_RX_STATX(val)) 1979dc6f32SKommula Shiva Shankar 20bea5d990SVamsi Attunuru extern uint32_t soft_exp_consumer_cnt; 21bea5d990SVamsi Attunuru static bool soft_exp_poll_thread_exit = true; 22bea5d990SVamsi Attunuru 23bbcd191cSNithin Dabilpuram uint16_t 24bbcd191cSNithin Dabilpuram nix_inl_dev_pffunc_get(void) 25bbcd191cSNithin Dabilpuram { 26bbcd191cSNithin Dabilpuram struct idev_cfg *idev = idev_get_cfg(); 27bbcd191cSNithin Dabilpuram struct nix_inl_dev *inl_dev; 28bbcd191cSNithin Dabilpuram 29bbcd191cSNithin Dabilpuram if (idev != NULL) { 30bbcd191cSNithin Dabilpuram inl_dev = idev->nix_inl_dev; 31bbcd191cSNithin Dabilpuram if (inl_dev) 32bbcd191cSNithin Dabilpuram return inl_dev->dev.pf_func; 33bbcd191cSNithin Dabilpuram } 34bbcd191cSNithin Dabilpuram return 0; 35bbcd191cSNithin Dabilpuram } 36bbcd191cSNithin Dabilpuram 37bbcd191cSNithin Dabilpuram static void 38bea5d990SVamsi Attunuru nix_inl_selftest_work_cb(uint64_t *gw, void *args, uint32_t soft_exp_event) 39bbcd191cSNithin Dabilpuram { 40bbcd191cSNithin Dabilpuram uintptr_t work = gw[1]; 41bbcd191cSNithin Dabilpuram 42bea5d990SVamsi Attunuru (void)soft_exp_event; 43bbcd191cSNithin Dabilpuram *((uintptr_t *)args + (gw[0] & 0x1)) = work; 44bbcd191cSNithin Dabilpuram 45bbcd191cSNithin Dabilpuram plt_atomic_thread_fence(__ATOMIC_ACQ_REL); 46bbcd191cSNithin Dabilpuram } 47bbcd191cSNithin Dabilpuram 48bbcd191cSNithin Dabilpuram static int 49bbcd191cSNithin Dabilpuram nix_inl_selftest(void) 50bbcd191cSNithin Dabilpuram { 51bbcd191cSNithin Dabilpuram struct idev_cfg *idev = idev_get_cfg(); 52bbcd191cSNithin Dabilpuram roc_nix_inl_sso_work_cb_t save_cb; 53bbcd191cSNithin Dabilpuram static uintptr_t work_arr[2]; 54bbcd191cSNithin Dabilpuram struct nix_inl_dev *inl_dev; 55bbcd191cSNithin Dabilpuram void *save_cb_args; 56bbcd191cSNithin Dabilpuram uint64_t add_work0; 57bbcd191cSNithin Dabilpuram int rc = 0; 58bbcd191cSNithin Dabilpuram 59bbcd191cSNithin Dabilpuram if (idev == NULL) 60bbcd191cSNithin Dabilpuram return -ENOTSUP; 61bbcd191cSNithin Dabilpuram 62bbcd191cSNithin Dabilpuram inl_dev = idev->nix_inl_dev; 63bbcd191cSNithin Dabilpuram if (inl_dev == NULL) 64bbcd191cSNithin Dabilpuram return -ENOTSUP; 65bbcd191cSNithin Dabilpuram 66bbcd191cSNithin Dabilpuram plt_info("Performing nix inl self test"); 67bbcd191cSNithin Dabilpuram 68bbcd191cSNithin Dabilpuram /* Save and update cb to test cb */ 69bbcd191cSNithin Dabilpuram save_cb = inl_dev->work_cb; 70bbcd191cSNithin Dabilpuram save_cb_args = inl_dev->cb_args; 71bbcd191cSNithin Dabilpuram inl_dev->work_cb = nix_inl_selftest_work_cb; 72bbcd191cSNithin Dabilpuram inl_dev->cb_args = work_arr; 73bbcd191cSNithin Dabilpuram 74bbcd191cSNithin Dabilpuram plt_atomic_thread_fence(__ATOMIC_ACQ_REL); 75bbcd191cSNithin Dabilpuram 76bbcd191cSNithin Dabilpuram #define WORK_MAGIC1 0x335577ff0 77bbcd191cSNithin Dabilpuram #define WORK_MAGIC2 0xdeadbeef0 78bbcd191cSNithin Dabilpuram 79bbcd191cSNithin Dabilpuram /* Add work */ 80bbcd191cSNithin Dabilpuram add_work0 = ((uint64_t)(SSO_TT_ORDERED) << 32) | 0x0; 81bbcd191cSNithin Dabilpuram roc_store_pair(add_work0, WORK_MAGIC1, inl_dev->sso_base); 82bbcd191cSNithin Dabilpuram add_work0 = ((uint64_t)(SSO_TT_ORDERED) << 32) | 0x1; 83bbcd191cSNithin Dabilpuram roc_store_pair(add_work0, WORK_MAGIC2, inl_dev->sso_base); 84bbcd191cSNithin Dabilpuram 85bbcd191cSNithin Dabilpuram plt_delay_ms(10000); 86bbcd191cSNithin Dabilpuram 87bbcd191cSNithin Dabilpuram /* Check if we got expected work */ 88bbcd191cSNithin Dabilpuram if (work_arr[0] != WORK_MAGIC1 || work_arr[1] != WORK_MAGIC2) { 89bbcd191cSNithin Dabilpuram plt_err("Failed to get expected work, [0]=%p [1]=%p", 90bbcd191cSNithin Dabilpuram (void *)work_arr[0], (void *)work_arr[1]); 91bbcd191cSNithin Dabilpuram rc = -EFAULT; 92bbcd191cSNithin Dabilpuram goto exit; 93bbcd191cSNithin Dabilpuram } 94bbcd191cSNithin Dabilpuram 95bbcd191cSNithin Dabilpuram plt_info("Work, [0]=%p [1]=%p", (void *)work_arr[0], 96bbcd191cSNithin Dabilpuram (void *)work_arr[1]); 97bbcd191cSNithin Dabilpuram 98bbcd191cSNithin Dabilpuram exit: 99bbcd191cSNithin Dabilpuram /* Restore state */ 100bbcd191cSNithin Dabilpuram inl_dev->work_cb = save_cb; 101bbcd191cSNithin Dabilpuram inl_dev->cb_args = save_cb_args; 102bbcd191cSNithin Dabilpuram return rc; 103bbcd191cSNithin Dabilpuram } 104bbcd191cSNithin Dabilpuram 105bbcd191cSNithin Dabilpuram static int 1062635c25dSSrujana Challa nix_inl_cpt_ctx_cache_sync(struct nix_inl_dev *inl_dev) 1072635c25dSSrujana Challa { 10844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&inl_dev->dev)->mbox); 1092635c25dSSrujana Challa struct msg_req *req; 11044a9307cSRakesh Kudurumalla int rc; 1112635c25dSSrujana Challa 1122635c25dSSrujana Challa req = mbox_alloc_msg_cpt_ctx_cache_sync(mbox); 11344a9307cSRakesh Kudurumalla if (req == NULL) { 11444a9307cSRakesh Kudurumalla rc = -ENOSPC; 11544a9307cSRakesh Kudurumalla goto exit; 11644a9307cSRakesh Kudurumalla } 1172635c25dSSrujana Challa 11844a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 11944a9307cSRakesh Kudurumalla exit: 12044a9307cSRakesh Kudurumalla mbox_put(mbox); 12144a9307cSRakesh Kudurumalla return rc; 1222635c25dSSrujana Challa } 1232635c25dSSrujana Challa 1242635c25dSSrujana Challa static int 125bbcd191cSNithin Dabilpuram nix_inl_nix_ipsec_cfg(struct nix_inl_dev *inl_dev, bool ena) 126bbcd191cSNithin Dabilpuram { 127bbcd191cSNithin Dabilpuram struct nix_inline_ipsec_lf_cfg *lf_cfg; 12844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&inl_dev->dev)->mbox); 129fe5846bcSNithin Dabilpuram uint64_t max_sa; 130bbcd191cSNithin Dabilpuram uint32_t sa_w; 13144a9307cSRakesh Kudurumalla int rc; 132bbcd191cSNithin Dabilpuram 133bbcd191cSNithin Dabilpuram lf_cfg = mbox_alloc_msg_nix_inline_ipsec_lf_cfg(mbox); 13444a9307cSRakesh Kudurumalla if (lf_cfg == NULL) { 13544a9307cSRakesh Kudurumalla rc = -ENOSPC; 13644a9307cSRakesh Kudurumalla goto exit; 13744a9307cSRakesh Kudurumalla } 138bbcd191cSNithin Dabilpuram 139bbcd191cSNithin Dabilpuram if (ena) { 140fe5846bcSNithin Dabilpuram 141fe5846bcSNithin Dabilpuram max_sa = inl_dev->inb_spi_mask + 1; 142fe5846bcSNithin Dabilpuram sa_w = plt_log2_u32(max_sa); 143bbcd191cSNithin Dabilpuram 144bbcd191cSNithin Dabilpuram lf_cfg->enable = 1; 145bbcd191cSNithin Dabilpuram lf_cfg->sa_base_addr = (uintptr_t)inl_dev->inb_sa_base; 146bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg1.sa_idx_w = sa_w; 147bbcd191cSNithin Dabilpuram /* CN9K SA size is different */ 148bbcd191cSNithin Dabilpuram if (roc_model_is_cn9k()) 149bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg0.lenm1_max = NIX_CN9K_MAX_HW_FRS - 1; 150bbcd191cSNithin Dabilpuram else 151bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg0.lenm1_max = NIX_RPM_MAX_HW_FRS - 1; 152fe5846bcSNithin Dabilpuram lf_cfg->ipsec_cfg1.sa_idx_max = max_sa - 1; 153bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg0.sa_pow2_size = 154bbcd191cSNithin Dabilpuram plt_log2_u32(inl_dev->inb_sa_sz); 155bbcd191cSNithin Dabilpuram 156bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg0.tag_const = 0; 157bbcd191cSNithin Dabilpuram lf_cfg->ipsec_cfg0.tt = SSO_TT_ORDERED; 158bbcd191cSNithin Dabilpuram } else { 159bbcd191cSNithin Dabilpuram lf_cfg->enable = 0; 160bbcd191cSNithin Dabilpuram } 161bbcd191cSNithin Dabilpuram 16244a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 16344a9307cSRakesh Kudurumalla exit: 16444a9307cSRakesh Kudurumalla mbox_put(mbox); 16544a9307cSRakesh Kudurumalla return rc; 166bbcd191cSNithin Dabilpuram } 167bbcd191cSNithin Dabilpuram 168bbcd191cSNithin Dabilpuram static int 1698881cf1cSNithin Dabilpuram nix_inl_cpt_setup(struct nix_inl_dev *inl_dev, bool inl_dev_sso) 170bbcd191cSNithin Dabilpuram { 171de8c60d1SSrujana Challa struct roc_nix_inl_dev_q *q_info; 172bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 1739564023dSNithin Dabilpuram bool ctx_ilen_valid = false; 1744b8eb5bdSRahul Bhansali struct roc_cpt_lf *lf; 175bbcd191cSNithin Dabilpuram uint8_t eng_grpmask; 1769564023dSNithin Dabilpuram uint8_t ctx_ilen = 0; 177bbcd191cSNithin Dabilpuram int rc; 178bbcd191cSNithin Dabilpuram 179bbcd191cSNithin Dabilpuram if (!inl_dev->attach_cptlf) 180bbcd191cSNithin Dabilpuram return 0; 181bbcd191cSNithin Dabilpuram 182bbcd191cSNithin Dabilpuram /* Alloc CPT LF */ 183bbcd191cSNithin Dabilpuram eng_grpmask = (1ULL << ROC_CPT_DFLT_ENG_GRP_SE | 184bbcd191cSNithin Dabilpuram 1ULL << ROC_CPT_DFLT_ENG_GRP_SE_IE | 185bbcd191cSNithin Dabilpuram 1ULL << ROC_CPT_DFLT_ENG_GRP_AE); 1869564023dSNithin Dabilpuram if (roc_errata_cpt_has_ctx_fetch_issue()) { 1879564023dSNithin Dabilpuram ctx_ilen = (ROC_NIX_INL_OT_IPSEC_INB_HW_SZ / 128) - 1; 1889564023dSNithin Dabilpuram ctx_ilen_valid = true; 1899564023dSNithin Dabilpuram } 1909564023dSNithin Dabilpuram 1919564023dSNithin Dabilpuram rc = cpt_lfs_alloc(dev, eng_grpmask, RVU_BLOCK_ADDR_CPT0, inl_dev_sso, ctx_ilen_valid, 1924b8eb5bdSRahul Bhansali ctx_ilen, inl_dev->rx_inj_ena, inl_dev->nb_cptlf - 1); 193bbcd191cSNithin Dabilpuram if (rc) { 194bbcd191cSNithin Dabilpuram plt_err("Failed to alloc CPT LF resources, rc=%d", rc); 195bbcd191cSNithin Dabilpuram return rc; 196bbcd191cSNithin Dabilpuram } 197bbcd191cSNithin Dabilpuram 1984b8eb5bdSRahul Bhansali for (int i = 0; i < inl_dev->nb_cptlf; i++) { 199bbcd191cSNithin Dabilpuram /* Setup CPT LF for submitting control opcode */ 2004b8eb5bdSRahul Bhansali lf = &inl_dev->cpt_lf[i]; 2014b8eb5bdSRahul Bhansali lf->lf_id = i; 202bbcd191cSNithin Dabilpuram lf->nb_desc = 0; /* Set to default */ 203bbcd191cSNithin Dabilpuram lf->dev = &inl_dev->dev; 2044b8eb5bdSRahul Bhansali lf->msixoff = inl_dev->cpt_msixoff[i]; 205bbcd191cSNithin Dabilpuram lf->pci_dev = inl_dev->pci_dev; 206bbcd191cSNithin Dabilpuram 207bbcd191cSNithin Dabilpuram rc = cpt_lf_init(lf); 208bbcd191cSNithin Dabilpuram if (rc) { 209bbcd191cSNithin Dabilpuram plt_err("Failed to initialize CPT LF, rc=%d", rc); 210bbcd191cSNithin Dabilpuram goto lf_free; 211bbcd191cSNithin Dabilpuram } 212bbcd191cSNithin Dabilpuram 213de8c60d1SSrujana Challa q_info = &inl_dev->q_info[i]; 214de8c60d1SSrujana Challa q_info->nb_desc = lf->nb_desc; 215de8c60d1SSrujana Challa q_info->fc_addr = lf->fc_addr; 216de8c60d1SSrujana Challa q_info->io_addr = lf->io_addr; 217de8c60d1SSrujana Challa q_info->lmt_base = lf->lmt_base; 218de8c60d1SSrujana Challa q_info->rbase = lf->rbase; 219de8c60d1SSrujana Challa 220bbcd191cSNithin Dabilpuram roc_cpt_iq_enable(lf); 2214b8eb5bdSRahul Bhansali } 222bbcd191cSNithin Dabilpuram return 0; 223bbcd191cSNithin Dabilpuram lf_free: 224bbcd191cSNithin Dabilpuram rc |= cpt_lfs_free(dev); 225bbcd191cSNithin Dabilpuram return rc; 226bbcd191cSNithin Dabilpuram } 227bbcd191cSNithin Dabilpuram 228bbcd191cSNithin Dabilpuram static int 229bbcd191cSNithin Dabilpuram nix_inl_cpt_release(struct nix_inl_dev *inl_dev) 230bbcd191cSNithin Dabilpuram { 231bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 2324b8eb5bdSRahul Bhansali int rc, i; 233bbcd191cSNithin Dabilpuram 234bbcd191cSNithin Dabilpuram if (!inl_dev->attach_cptlf) 235bbcd191cSNithin Dabilpuram return 0; 236bbcd191cSNithin Dabilpuram 237bbcd191cSNithin Dabilpuram /* Cleanup CPT LF queue */ 2384b8eb5bdSRahul Bhansali for (i = 0; i < inl_dev->nb_cptlf; i++) 2394b8eb5bdSRahul Bhansali cpt_lf_fini(&inl_dev->cpt_lf[i]); 240bbcd191cSNithin Dabilpuram 241bbcd191cSNithin Dabilpuram /* Free LF resources */ 242bbcd191cSNithin Dabilpuram rc = cpt_lfs_free(dev); 2434b8eb5bdSRahul Bhansali if (!rc) { 2444b8eb5bdSRahul Bhansali for (i = 0; i < inl_dev->nb_cptlf; i++) 2454b8eb5bdSRahul Bhansali inl_dev->cpt_lf[i].dev = NULL; 2464b8eb5bdSRahul Bhansali } else 247bbcd191cSNithin Dabilpuram plt_err("Failed to free CPT LF resources, rc=%d", rc); 2488881cf1cSNithin Dabilpuram return rc; 249bbcd191cSNithin Dabilpuram } 250bbcd191cSNithin Dabilpuram 251bbcd191cSNithin Dabilpuram static int 252bbcd191cSNithin Dabilpuram nix_inl_sso_setup(struct nix_inl_dev *inl_dev) 253bbcd191cSNithin Dabilpuram { 254bbcd191cSNithin Dabilpuram struct sso_lf_alloc_rsp *sso_rsp; 255bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 256bbcd191cSNithin Dabilpuram uint16_t hwgrp[1] = {0}; 257bbcd191cSNithin Dabilpuram int rc; 258bbcd191cSNithin Dabilpuram 259bbcd191cSNithin Dabilpuram /* Alloc SSOW LF */ 260bbcd191cSNithin Dabilpuram rc = sso_lf_alloc(dev, SSO_LF_TYPE_HWS, 1, NULL); 261bbcd191cSNithin Dabilpuram if (rc) { 262bbcd191cSNithin Dabilpuram plt_err("Failed to alloc SSO HWS, rc=%d", rc); 263bbcd191cSNithin Dabilpuram return rc; 264bbcd191cSNithin Dabilpuram } 265bbcd191cSNithin Dabilpuram 266bbcd191cSNithin Dabilpuram /* Alloc HWGRP LF */ 267bbcd191cSNithin Dabilpuram rc = sso_lf_alloc(dev, SSO_LF_TYPE_HWGRP, 1, (void **)&sso_rsp); 268bbcd191cSNithin Dabilpuram if (rc) { 269bbcd191cSNithin Dabilpuram plt_err("Failed to alloc SSO HWGRP, rc=%d", rc); 270bbcd191cSNithin Dabilpuram goto free_ssow; 271bbcd191cSNithin Dabilpuram } 272bbcd191cSNithin Dabilpuram 273bbcd191cSNithin Dabilpuram inl_dev->xaq_buf_size = sso_rsp->xaq_buf_size; 274bbcd191cSNithin Dabilpuram inl_dev->xae_waes = sso_rsp->xaq_wq_entries; 275bbcd191cSNithin Dabilpuram inl_dev->iue = sso_rsp->in_unit_entries; 276bbcd191cSNithin Dabilpuram 2777e9a9490SNithin Dabilpuram inl_dev->nb_xae = inl_dev->iue; 2787e9a9490SNithin Dabilpuram rc = sso_hwgrp_init_xaq_aura(dev, &inl_dev->xaq, inl_dev->nb_xae, 2796f30ac80SPavan Nikhilesh inl_dev->xae_waes, inl_dev->xaq_buf_size, 2806f30ac80SPavan Nikhilesh 1); 2816f30ac80SPavan Nikhilesh if (rc) { 2826f30ac80SPavan Nikhilesh plt_err("Failed to alloc SSO XAQ aura, rc=%d", rc); 283bbcd191cSNithin Dabilpuram goto free_sso; 284bbcd191cSNithin Dabilpuram } 285bbcd191cSNithin Dabilpuram 286bbcd191cSNithin Dabilpuram /* Setup xaq for hwgrps */ 287773fdfa6SKommula Shiva Shankar rc = sso_hwgrp_alloc_xaq(dev, roc_npa_aura_handle_to_aura(inl_dev->xaq.aura_handle), 1); 288bbcd191cSNithin Dabilpuram if (rc) { 289bbcd191cSNithin Dabilpuram plt_err("Failed to setup hwgrp xaq aura, rc=%d", rc); 290bbcd191cSNithin Dabilpuram goto destroy_pool; 291bbcd191cSNithin Dabilpuram } 292bbcd191cSNithin Dabilpuram 293bbcd191cSNithin Dabilpuram /* Register SSO, SSOW error and work irq's */ 294bbcd191cSNithin Dabilpuram rc = nix_inl_sso_register_irqs(inl_dev); 295bbcd191cSNithin Dabilpuram if (rc) { 296bbcd191cSNithin Dabilpuram plt_err("Failed to register sso irq's, rc=%d", rc); 297bbcd191cSNithin Dabilpuram goto release_xaq; 298bbcd191cSNithin Dabilpuram } 299bbcd191cSNithin Dabilpuram 300bbcd191cSNithin Dabilpuram /* Setup hwgrp->hws link */ 301da693ffeSPavan Nikhilesh sso_hws_link_modify(0, inl_dev->ssow_base, NULL, hwgrp, 1, 0, true); 302bbcd191cSNithin Dabilpuram 303bbcd191cSNithin Dabilpuram /* Enable HWGRP */ 304bbcd191cSNithin Dabilpuram plt_write64(0x1, inl_dev->sso_base + SSO_LF_GGRP_QCTL); 305bbcd191cSNithin Dabilpuram 306bbcd191cSNithin Dabilpuram return 0; 307bbcd191cSNithin Dabilpuram 308bbcd191cSNithin Dabilpuram release_xaq: 309bbcd191cSNithin Dabilpuram sso_hwgrp_release_xaq(&inl_dev->dev, 1); 310bbcd191cSNithin Dabilpuram destroy_pool: 3116f30ac80SPavan Nikhilesh sso_hwgrp_free_xaq_aura(dev, &inl_dev->xaq, 0); 312bbcd191cSNithin Dabilpuram free_sso: 313bbcd191cSNithin Dabilpuram sso_lf_free(dev, SSO_LF_TYPE_HWGRP, 1); 314bbcd191cSNithin Dabilpuram free_ssow: 315bbcd191cSNithin Dabilpuram sso_lf_free(dev, SSO_LF_TYPE_HWS, 1); 316bbcd191cSNithin Dabilpuram return rc; 317bbcd191cSNithin Dabilpuram } 318bbcd191cSNithin Dabilpuram 319bbcd191cSNithin Dabilpuram static int 320bbcd191cSNithin Dabilpuram nix_inl_sso_release(struct nix_inl_dev *inl_dev) 321bbcd191cSNithin Dabilpuram { 322bbcd191cSNithin Dabilpuram uint16_t hwgrp[1] = {0}; 323bbcd191cSNithin Dabilpuram 324bbcd191cSNithin Dabilpuram /* Disable HWGRP */ 325bbcd191cSNithin Dabilpuram plt_write64(0, inl_dev->sso_base + SSO_LF_GGRP_QCTL); 326bbcd191cSNithin Dabilpuram 327bbcd191cSNithin Dabilpuram /* Unregister SSO/SSOW IRQ's */ 328bbcd191cSNithin Dabilpuram nix_inl_sso_unregister_irqs(inl_dev); 329bbcd191cSNithin Dabilpuram 330bbcd191cSNithin Dabilpuram /* Unlink hws */ 331da693ffeSPavan Nikhilesh sso_hws_link_modify(0, inl_dev->ssow_base, NULL, hwgrp, 1, 0, false); 332bbcd191cSNithin Dabilpuram 333bbcd191cSNithin Dabilpuram /* Release XAQ aura */ 334bbcd191cSNithin Dabilpuram sso_hwgrp_release_xaq(&inl_dev->dev, 1); 335bbcd191cSNithin Dabilpuram 336bbcd191cSNithin Dabilpuram /* Free SSO, SSOW LF's */ 337bbcd191cSNithin Dabilpuram sso_lf_free(&inl_dev->dev, SSO_LF_TYPE_HWS, 1); 338bbcd191cSNithin Dabilpuram sso_lf_free(&inl_dev->dev, SSO_LF_TYPE_HWGRP, 1); 339bbcd191cSNithin Dabilpuram 3406f30ac80SPavan Nikhilesh /* Free the XAQ aura */ 3416f30ac80SPavan Nikhilesh sso_hwgrp_free_xaq_aura(&inl_dev->dev, &inl_dev->xaq, 0); 3426f30ac80SPavan Nikhilesh 343bbcd191cSNithin Dabilpuram return 0; 344bbcd191cSNithin Dabilpuram } 345bbcd191cSNithin Dabilpuram 346bbcd191cSNithin Dabilpuram static int 347bbcd191cSNithin Dabilpuram nix_inl_nix_setup(struct nix_inl_dev *inl_dev) 348bbcd191cSNithin Dabilpuram { 349fe5846bcSNithin Dabilpuram uint32_t ipsec_in_min_spi = inl_dev->ipsec_in_min_spi; 350fe5846bcSNithin Dabilpuram uint32_t ipsec_in_max_spi = inl_dev->ipsec_in_max_spi; 351bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 352bbcd191cSNithin Dabilpuram struct mbox *mbox = dev->mbox; 353bbcd191cSNithin Dabilpuram struct nix_lf_alloc_rsp *rsp; 354bbcd191cSNithin Dabilpuram struct nix_lf_alloc_req *req; 355e9d33faaSPavan Nikhilesh struct nix_hw_info *hw_info; 3563c100e0eSNithin Dabilpuram struct roc_nix_rq *rqs; 357fe5846bcSNithin Dabilpuram uint64_t max_sa, i; 358bbcd191cSNithin Dabilpuram size_t inb_sa_sz; 359fe5846bcSNithin Dabilpuram int rc = -ENOSPC; 36071213a8bSSrujana Challa void *sa; 361bbcd191cSNithin Dabilpuram 362fe5846bcSNithin Dabilpuram max_sa = plt_align32pow2(ipsec_in_max_spi - ipsec_in_min_spi + 1); 363fe5846bcSNithin Dabilpuram 364bbcd191cSNithin Dabilpuram /* Alloc NIX LF needed for single RQ */ 36544a9307cSRakesh Kudurumalla req = mbox_alloc_msg_nix_lf_alloc(mbox_get(mbox)); 36644a9307cSRakesh Kudurumalla if (req == NULL) { 36744a9307cSRakesh Kudurumalla mbox_put(mbox); 368bbcd191cSNithin Dabilpuram return rc; 36944a9307cSRakesh Kudurumalla } 3703c100e0eSNithin Dabilpuram /* We will have per-port RQ if it is not with channel masking */ 3713c100e0eSNithin Dabilpuram req->rq_cnt = inl_dev->nb_rqs; 372bbcd191cSNithin Dabilpuram req->sq_cnt = 1; 373bbcd191cSNithin Dabilpuram req->cq_cnt = 1; 374bbcd191cSNithin Dabilpuram /* XQESZ is W16 */ 375bbcd191cSNithin Dabilpuram req->xqe_sz = NIX_XQESZ_W16; 376bbcd191cSNithin Dabilpuram /* RSS size does not matter as this RQ is only for UCAST_IPSEC action */ 377bbcd191cSNithin Dabilpuram req->rss_sz = ROC_NIX_RSS_RETA_SZ_64; 378bbcd191cSNithin Dabilpuram req->rss_grps = ROC_NIX_RSS_GRPS; 379bbcd191cSNithin Dabilpuram req->npa_func = idev_npa_pffunc_get(); 380bbcd191cSNithin Dabilpuram req->sso_func = dev->pf_func; 381bbcd191cSNithin Dabilpuram req->rx_cfg = NIX_INL_LF_RX_CFG; 382bbcd191cSNithin Dabilpuram req->flags = NIX_LF_RSS_TAG_LSB_AS_ADDER; 383bbcd191cSNithin Dabilpuram 3841f997c06SRahul Bhansali if (roc_errata_nix_has_no_drop_re()) 385bbcd191cSNithin Dabilpuram req->rx_cfg &= ~ROC_NIX_LF_RX_CFG_DROP_RE; 386bbcd191cSNithin Dabilpuram 387bbcd191cSNithin Dabilpuram rc = mbox_process_msg(mbox, (void *)&rsp); 388bbcd191cSNithin Dabilpuram if (rc) { 389bbcd191cSNithin Dabilpuram plt_err("Failed to alloc lf, rc=%d", rc); 39044a9307cSRakesh Kudurumalla mbox_put(mbox); 391bbcd191cSNithin Dabilpuram return rc; 392bbcd191cSNithin Dabilpuram } 393bbcd191cSNithin Dabilpuram 394bbcd191cSNithin Dabilpuram inl_dev->lf_tx_stats = rsp->lf_tx_stats; 395bbcd191cSNithin Dabilpuram inl_dev->lf_rx_stats = rsp->lf_rx_stats; 396bbcd191cSNithin Dabilpuram inl_dev->qints = rsp->qints; 397bbcd191cSNithin Dabilpuram inl_dev->cints = rsp->cints; 39844a9307cSRakesh Kudurumalla mbox_put(mbox); 399bbcd191cSNithin Dabilpuram 400e9d33faaSPavan Nikhilesh /* Get VWQE info if supported */ 401e9d33faaSPavan Nikhilesh if (roc_model_is_cn10k()) { 40244a9307cSRakesh Kudurumalla mbox_alloc_msg_nix_get_hw_info(mbox_get(mbox)); 403e9d33faaSPavan Nikhilesh rc = mbox_process_msg(mbox, (void *)&hw_info); 404e9d33faaSPavan Nikhilesh if (rc) { 405e9d33faaSPavan Nikhilesh plt_err("Failed to get HW info, rc=%d", rc); 40644a9307cSRakesh Kudurumalla mbox_put(mbox); 407e9d33faaSPavan Nikhilesh goto lf_free; 408e9d33faaSPavan Nikhilesh } 409e9d33faaSPavan Nikhilesh inl_dev->vwqe_interval = hw_info->vwqe_delay; 41044a9307cSRakesh Kudurumalla mbox_put(mbox); 411e9d33faaSPavan Nikhilesh } 412e9d33faaSPavan Nikhilesh 413bbcd191cSNithin Dabilpuram /* Register nix interrupts */ 414bbcd191cSNithin Dabilpuram rc = nix_inl_nix_register_irqs(inl_dev); 415bbcd191cSNithin Dabilpuram if (rc) { 416bbcd191cSNithin Dabilpuram plt_err("Failed to register nix irq's, rc=%d", rc); 417bbcd191cSNithin Dabilpuram goto lf_free; 418bbcd191cSNithin Dabilpuram } 419bbcd191cSNithin Dabilpuram 420bbcd191cSNithin Dabilpuram /* CN9K SA is different */ 421bbcd191cSNithin Dabilpuram if (roc_model_is_cn9k()) 4224440eb88SVidya Sagar Velumuri inb_sa_sz = ROC_NIX_INL_ON_IPSEC_INB_SA_SZ; 423*03b15238SSrujana Challa else if (inl_dev->custom_inb_sa) 424*03b15238SSrujana Challa inb_sa_sz = ROC_NIX_INL_INB_CUSTOM_SA_SZ; 425bbcd191cSNithin Dabilpuram else 426bbcd191cSNithin Dabilpuram inb_sa_sz = ROC_NIX_INL_OT_IPSEC_INB_SA_SZ; 427bbcd191cSNithin Dabilpuram 428bbcd191cSNithin Dabilpuram /* Alloc contiguous memory for Inbound SA's */ 429bbcd191cSNithin Dabilpuram inl_dev->inb_sa_sz = inb_sa_sz; 430fe5846bcSNithin Dabilpuram inl_dev->inb_spi_mask = max_sa - 1; 431fe5846bcSNithin Dabilpuram inl_dev->inb_sa_base = plt_zmalloc(inb_sa_sz * max_sa, 432bbcd191cSNithin Dabilpuram ROC_NIX_INL_SA_BASE_ALIGN); 433bbcd191cSNithin Dabilpuram if (!inl_dev->inb_sa_base) { 434bbcd191cSNithin Dabilpuram plt_err("Failed to allocate memory for Inbound SA"); 435bbcd191cSNithin Dabilpuram rc = -ENOMEM; 436bbcd191cSNithin Dabilpuram goto unregister_irqs; 437bbcd191cSNithin Dabilpuram } 438bbcd191cSNithin Dabilpuram 43971213a8bSSrujana Challa if (roc_model_is_cn10k()) { 440fe5846bcSNithin Dabilpuram for (i = 0; i < max_sa; i++) { 44171213a8bSSrujana Challa sa = ((uint8_t *)inl_dev->inb_sa_base) + 44271213a8bSSrujana Challa (i * inb_sa_sz); 4435ece02e7SVidya Sagar Velumuri roc_ot_ipsec_inb_sa_init(sa, true); 44471213a8bSSrujana Challa } 44571213a8bSSrujana Challa } 446bbcd191cSNithin Dabilpuram /* Setup device specific inb SA table */ 447bbcd191cSNithin Dabilpuram rc = nix_inl_nix_ipsec_cfg(inl_dev, true); 448bbcd191cSNithin Dabilpuram if (rc) { 449bbcd191cSNithin Dabilpuram plt_err("Failed to setup NIX Inbound SA conf, rc=%d", rc); 450bbcd191cSNithin Dabilpuram goto free_mem; 451bbcd191cSNithin Dabilpuram } 452bbcd191cSNithin Dabilpuram 4533c100e0eSNithin Dabilpuram /* Allocate memory for RQ's */ 4543c100e0eSNithin Dabilpuram rqs = plt_zmalloc(sizeof(struct roc_nix_rq) * PLT_MAX_ETHPORTS, 0); 4553c100e0eSNithin Dabilpuram if (!rqs) { 4563c100e0eSNithin Dabilpuram plt_err("Failed to allocate memory for RQ's"); 4573c100e0eSNithin Dabilpuram goto free_mem; 4583c100e0eSNithin Dabilpuram } 4593c100e0eSNithin Dabilpuram inl_dev->rqs = rqs; 4603c100e0eSNithin Dabilpuram 461bbcd191cSNithin Dabilpuram return 0; 462bbcd191cSNithin Dabilpuram free_mem: 463bbcd191cSNithin Dabilpuram plt_free(inl_dev->inb_sa_base); 464bbcd191cSNithin Dabilpuram inl_dev->inb_sa_base = NULL; 465bbcd191cSNithin Dabilpuram unregister_irqs: 466bbcd191cSNithin Dabilpuram nix_inl_nix_unregister_irqs(inl_dev); 467bbcd191cSNithin Dabilpuram lf_free: 46844a9307cSRakesh Kudurumalla mbox_alloc_msg_nix_lf_free(mbox_get(mbox)); 469bbcd191cSNithin Dabilpuram rc |= mbox_process(mbox); 47044a9307cSRakesh Kudurumalla mbox_put(mbox); 471bbcd191cSNithin Dabilpuram return rc; 472bbcd191cSNithin Dabilpuram } 473bbcd191cSNithin Dabilpuram 474bbcd191cSNithin Dabilpuram static int 475bbcd191cSNithin Dabilpuram nix_inl_nix_release(struct nix_inl_dev *inl_dev) 476bbcd191cSNithin Dabilpuram { 477bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 478bbcd191cSNithin Dabilpuram struct mbox *mbox = dev->mbox; 479bbcd191cSNithin Dabilpuram struct nix_lf_free_req *req; 480bbcd191cSNithin Dabilpuram struct ndc_sync_op *ndc_req; 481bbcd191cSNithin Dabilpuram int rc = -ENOSPC; 482bbcd191cSNithin Dabilpuram 483bbcd191cSNithin Dabilpuram /* Disable Inbound processing */ 484bbcd191cSNithin Dabilpuram rc = nix_inl_nix_ipsec_cfg(inl_dev, false); 485bbcd191cSNithin Dabilpuram if (rc) 486bbcd191cSNithin Dabilpuram plt_err("Failed to disable Inbound IPSec, rc=%d", rc); 487bbcd191cSNithin Dabilpuram 488bbcd191cSNithin Dabilpuram /* Sync NDC-NIX for LF */ 48944a9307cSRakesh Kudurumalla ndc_req = mbox_alloc_msg_ndc_sync_op(mbox_get(mbox)); 49044a9307cSRakesh Kudurumalla if (ndc_req == NULL) { 49144a9307cSRakesh Kudurumalla mbox_put(mbox); 492bbcd191cSNithin Dabilpuram return rc; 49344a9307cSRakesh Kudurumalla } 494bbcd191cSNithin Dabilpuram ndc_req->nix_lf_rx_sync = 1; 495bbcd191cSNithin Dabilpuram rc = mbox_process(mbox); 496bbcd191cSNithin Dabilpuram if (rc) 497bbcd191cSNithin Dabilpuram plt_err("Error on NDC-NIX-RX LF sync, rc %d", rc); 49844a9307cSRakesh Kudurumalla mbox_put(mbox); 499bbcd191cSNithin Dabilpuram 500bbcd191cSNithin Dabilpuram /* Unregister IRQs */ 501bbcd191cSNithin Dabilpuram nix_inl_nix_unregister_irqs(inl_dev); 502bbcd191cSNithin Dabilpuram 503bbcd191cSNithin Dabilpuram /* By default all associated mcam rules are deleted */ 50444a9307cSRakesh Kudurumalla req = mbox_alloc_msg_nix_lf_free(mbox_get(mbox)); 50544a9307cSRakesh Kudurumalla if (req == NULL) { 50644a9307cSRakesh Kudurumalla mbox_put(mbox); 507bbcd191cSNithin Dabilpuram return -ENOSPC; 50844a9307cSRakesh Kudurumalla } 509bbcd191cSNithin Dabilpuram 5103c100e0eSNithin Dabilpuram rc = mbox_process(mbox); 51144a9307cSRakesh Kudurumalla if (rc) { 51244a9307cSRakesh Kudurumalla mbox_put(mbox); 5133c100e0eSNithin Dabilpuram return rc; 51444a9307cSRakesh Kudurumalla } 51544a9307cSRakesh Kudurumalla mbox_put(mbox); 5163c100e0eSNithin Dabilpuram 5173c100e0eSNithin Dabilpuram plt_free(inl_dev->rqs); 5183c100e0eSNithin Dabilpuram plt_free(inl_dev->inb_sa_base); 5193c100e0eSNithin Dabilpuram inl_dev->rqs = NULL; 5203c100e0eSNithin Dabilpuram inl_dev->inb_sa_base = NULL; 5213c100e0eSNithin Dabilpuram return 0; 522bbcd191cSNithin Dabilpuram } 523bbcd191cSNithin Dabilpuram 524bbcd191cSNithin Dabilpuram static int 525bbcd191cSNithin Dabilpuram nix_inl_lf_attach(struct nix_inl_dev *inl_dev) 526bbcd191cSNithin Dabilpuram { 527bbcd191cSNithin Dabilpuram struct msix_offset_rsp *msix_rsp; 528bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 52944a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 530bbcd191cSNithin Dabilpuram struct rsrc_attach_req *req; 531bbcd191cSNithin Dabilpuram uint64_t nix_blkaddr; 532bbcd191cSNithin Dabilpuram int rc = -ENOSPC; 533bbcd191cSNithin Dabilpuram 534bbcd191cSNithin Dabilpuram req = mbox_alloc_msg_attach_resources(mbox); 535bbcd191cSNithin Dabilpuram if (req == NULL) 53644a9307cSRakesh Kudurumalla goto exit; 537bbcd191cSNithin Dabilpuram req->modify = true; 538bbcd191cSNithin Dabilpuram /* Attach 1 NIXLF, SSO HWS and SSO HWGRP */ 539bbcd191cSNithin Dabilpuram req->nixlf = true; 540bbcd191cSNithin Dabilpuram req->ssow = 1; 541bbcd191cSNithin Dabilpuram req->sso = 1; 542bbcd191cSNithin Dabilpuram if (inl_dev->attach_cptlf) { 5434b8eb5bdSRahul Bhansali req->cptlfs = inl_dev->nb_cptlf; 544bbcd191cSNithin Dabilpuram req->cpt_blkaddr = RVU_BLOCK_ADDR_CPT0; 545bbcd191cSNithin Dabilpuram } 546bbcd191cSNithin Dabilpuram 547bbcd191cSNithin Dabilpuram rc = mbox_process(dev->mbox); 548bbcd191cSNithin Dabilpuram if (rc) 54944a9307cSRakesh Kudurumalla goto exit; 550bbcd191cSNithin Dabilpuram 551bbcd191cSNithin Dabilpuram /* Get MSIX vector offsets */ 552bbcd191cSNithin Dabilpuram mbox_alloc_msg_msix_offset(mbox); 553bbcd191cSNithin Dabilpuram rc = mbox_process_msg(dev->mbox, (void **)&msix_rsp); 554bbcd191cSNithin Dabilpuram if (rc) 55544a9307cSRakesh Kudurumalla goto exit; 556bbcd191cSNithin Dabilpuram 557bbcd191cSNithin Dabilpuram inl_dev->nix_msixoff = msix_rsp->nix_msixoff; 558bbcd191cSNithin Dabilpuram inl_dev->ssow_msixoff = msix_rsp->ssow_msixoff[0]; 559bbcd191cSNithin Dabilpuram inl_dev->sso_msixoff = msix_rsp->sso_msixoff[0]; 5604b8eb5bdSRahul Bhansali 5614b8eb5bdSRahul Bhansali for (int i = 0; i < inl_dev->nb_cptlf; i++) 5624b8eb5bdSRahul Bhansali inl_dev->cpt_msixoff[i] = msix_rsp->cptlf_msixoff[i]; 563bbcd191cSNithin Dabilpuram 564bbcd191cSNithin Dabilpuram nix_blkaddr = nix_get_blkaddr(dev); 565bbcd191cSNithin Dabilpuram inl_dev->is_nix1 = (nix_blkaddr == RVU_BLOCK_ADDR_NIX1); 566bbcd191cSNithin Dabilpuram 567bbcd191cSNithin Dabilpuram /* Update base addresses for LF's */ 568bbcd191cSNithin Dabilpuram inl_dev->nix_base = dev->bar2 + (nix_blkaddr << 20); 569bbcd191cSNithin Dabilpuram inl_dev->ssow_base = dev->bar2 + (RVU_BLOCK_ADDR_SSOW << 20); 570bbcd191cSNithin Dabilpuram inl_dev->sso_base = dev->bar2 + (RVU_BLOCK_ADDR_SSO << 20); 571bbcd191cSNithin Dabilpuram inl_dev->cpt_base = dev->bar2 + (RVU_BLOCK_ADDR_CPT0 << 20); 572bbcd191cSNithin Dabilpuram 57344a9307cSRakesh Kudurumalla rc = 0; 57444a9307cSRakesh Kudurumalla exit: 57544a9307cSRakesh Kudurumalla mbox_put(mbox); 57644a9307cSRakesh Kudurumalla return rc; 577bbcd191cSNithin Dabilpuram } 578bbcd191cSNithin Dabilpuram 579bbcd191cSNithin Dabilpuram static int 580bbcd191cSNithin Dabilpuram nix_inl_lf_detach(struct nix_inl_dev *inl_dev) 581bbcd191cSNithin Dabilpuram { 582bbcd191cSNithin Dabilpuram struct dev *dev = &inl_dev->dev; 58344a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 584bbcd191cSNithin Dabilpuram struct rsrc_detach_req *req; 585bbcd191cSNithin Dabilpuram int rc = -ENOSPC; 586bbcd191cSNithin Dabilpuram 587bbcd191cSNithin Dabilpuram req = mbox_alloc_msg_detach_resources(mbox); 588bbcd191cSNithin Dabilpuram if (req == NULL) 58944a9307cSRakesh Kudurumalla goto exit; 590bbcd191cSNithin Dabilpuram req->partial = true; 591bbcd191cSNithin Dabilpuram req->nixlf = true; 592bbcd191cSNithin Dabilpuram req->ssow = true; 593bbcd191cSNithin Dabilpuram req->sso = true; 594bbcd191cSNithin Dabilpuram req->cptlfs = !!inl_dev->attach_cptlf; 595bbcd191cSNithin Dabilpuram 59644a9307cSRakesh Kudurumalla rc = mbox_process(dev->mbox); 59744a9307cSRakesh Kudurumalla exit: 59844a9307cSRakesh Kudurumalla mbox_put(mbox); 59944a9307cSRakesh Kudurumalla return rc; 600bbcd191cSNithin Dabilpuram } 601bbcd191cSNithin Dabilpuram 6027e9a9490SNithin Dabilpuram static int 6037e9a9490SNithin Dabilpuram nix_inl_dev_wait_for_sso_empty(struct nix_inl_dev *inl_dev) 6047e9a9490SNithin Dabilpuram { 6057e9a9490SNithin Dabilpuram uintptr_t sso_base = inl_dev->sso_base; 6067e9a9490SNithin Dabilpuram int wait_ms = 3000; 6077e9a9490SNithin Dabilpuram 6087e9a9490SNithin Dabilpuram while (wait_ms > 0) { 6097e9a9490SNithin Dabilpuram /* Break when empty */ 6107e9a9490SNithin Dabilpuram if (!plt_read64(sso_base + SSO_LF_GGRP_XAQ_CNT) && 6117e9a9490SNithin Dabilpuram !plt_read64(sso_base + SSO_LF_GGRP_AQ_CNT)) 6127e9a9490SNithin Dabilpuram return 0; 6137e9a9490SNithin Dabilpuram 6147e9a9490SNithin Dabilpuram plt_delay_us(1000); 6157e9a9490SNithin Dabilpuram wait_ms -= 1; 6167e9a9490SNithin Dabilpuram } 6177e9a9490SNithin Dabilpuram 6187e9a9490SNithin Dabilpuram return -ETIMEDOUT; 6197e9a9490SNithin Dabilpuram } 6207e9a9490SNithin Dabilpuram 6217e9a9490SNithin Dabilpuram int 6227e9a9490SNithin Dabilpuram roc_nix_inl_dev_xaq_realloc(uint64_t aura_handle) 6237e9a9490SNithin Dabilpuram { 6247e9a9490SNithin Dabilpuram struct idev_cfg *idev = idev_get_cfg(); 6257e9a9490SNithin Dabilpuram struct nix_inl_dev *inl_dev; 6267e9a9490SNithin Dabilpuram int rc, i; 6277e9a9490SNithin Dabilpuram 6287e9a9490SNithin Dabilpuram if (idev == NULL) 6297e9a9490SNithin Dabilpuram return 0; 6307e9a9490SNithin Dabilpuram 6317e9a9490SNithin Dabilpuram inl_dev = idev->nix_inl_dev; 6327e9a9490SNithin Dabilpuram /* Nothing to do if no inline device */ 6337e9a9490SNithin Dabilpuram if (!inl_dev) 6347e9a9490SNithin Dabilpuram return 0; 6357e9a9490SNithin Dabilpuram 6367e9a9490SNithin Dabilpuram if (!aura_handle) { 6377e9a9490SNithin Dabilpuram inl_dev->nb_xae = inl_dev->iue; 6387e9a9490SNithin Dabilpuram goto no_pool; 6397e9a9490SNithin Dabilpuram } 6407e9a9490SNithin Dabilpuram 6417e9a9490SNithin Dabilpuram /* Check if aura is already considered */ 6427e9a9490SNithin Dabilpuram for (i = 0; i < inl_dev->pkt_pools_cnt; i++) { 6437e9a9490SNithin Dabilpuram if (inl_dev->pkt_pools[i] == aura_handle) 6447e9a9490SNithin Dabilpuram return 0; 6457e9a9490SNithin Dabilpuram } 6467e9a9490SNithin Dabilpuram 6477e9a9490SNithin Dabilpuram no_pool: 6487e9a9490SNithin Dabilpuram /* Disable RQ if enabled */ 6493c100e0eSNithin Dabilpuram for (i = 0; i < inl_dev->nb_rqs; i++) { 6503c100e0eSNithin Dabilpuram if (!inl_dev->rqs[i].inl_dev_refs) 6513c100e0eSNithin Dabilpuram continue; 6523c100e0eSNithin Dabilpuram rc = nix_rq_ena_dis(&inl_dev->dev, &inl_dev->rqs[i], false); 6537e9a9490SNithin Dabilpuram if (rc) { 6543c100e0eSNithin Dabilpuram plt_err("Failed to disable inline dev RQ %d, rc=%d", i, 6553c100e0eSNithin Dabilpuram rc); 6567e9a9490SNithin Dabilpuram return rc; 6577e9a9490SNithin Dabilpuram } 6587e9a9490SNithin Dabilpuram } 6597e9a9490SNithin Dabilpuram 6607e9a9490SNithin Dabilpuram /* Wait for events to be removed */ 6617e9a9490SNithin Dabilpuram rc = nix_inl_dev_wait_for_sso_empty(inl_dev); 6627e9a9490SNithin Dabilpuram if (rc) { 6637e9a9490SNithin Dabilpuram plt_err("Timeout waiting for inline device event cleanup"); 6647e9a9490SNithin Dabilpuram goto exit; 6657e9a9490SNithin Dabilpuram } 6667e9a9490SNithin Dabilpuram 6677e9a9490SNithin Dabilpuram /* Disable HWGRP */ 6687e9a9490SNithin Dabilpuram plt_write64(0, inl_dev->sso_base + SSO_LF_GGRP_QCTL); 6697e9a9490SNithin Dabilpuram 6707e9a9490SNithin Dabilpuram inl_dev->pkt_pools_cnt++; 6717e9a9490SNithin Dabilpuram inl_dev->pkt_pools = 6727e9a9490SNithin Dabilpuram plt_realloc(inl_dev->pkt_pools, 673e4a96623SGowrishankar Muthukrishnan sizeof(uint64_t) * inl_dev->pkt_pools_cnt, 0); 6747e9a9490SNithin Dabilpuram if (!inl_dev->pkt_pools) 6757e9a9490SNithin Dabilpuram inl_dev->pkt_pools_cnt = 0; 6767e9a9490SNithin Dabilpuram else 6777e9a9490SNithin Dabilpuram inl_dev->pkt_pools[inl_dev->pkt_pools_cnt - 1] = aura_handle; 6787e9a9490SNithin Dabilpuram inl_dev->nb_xae += roc_npa_aura_op_limit_get(aura_handle); 6797e9a9490SNithin Dabilpuram 6807e9a9490SNithin Dabilpuram /* Realloc XAQ aura */ 6817e9a9490SNithin Dabilpuram rc = sso_hwgrp_init_xaq_aura(&inl_dev->dev, &inl_dev->xaq, 6827e9a9490SNithin Dabilpuram inl_dev->nb_xae, inl_dev->xae_waes, 6837e9a9490SNithin Dabilpuram inl_dev->xaq_buf_size, 1); 6847e9a9490SNithin Dabilpuram if (rc) { 6857e9a9490SNithin Dabilpuram plt_err("Failed to reinitialize xaq aura, rc=%d", rc); 6867e9a9490SNithin Dabilpuram return rc; 6877e9a9490SNithin Dabilpuram } 6887e9a9490SNithin Dabilpuram 6897e9a9490SNithin Dabilpuram /* Setup xaq for hwgrps */ 690b4655ec6SPavan Nikhilesh rc = sso_hwgrp_alloc_xaq(&inl_dev->dev, 691b4655ec6SPavan Nikhilesh roc_npa_aura_handle_to_aura(inl_dev->xaq.aura_handle), 1); 6927e9a9490SNithin Dabilpuram if (rc) { 6937e9a9490SNithin Dabilpuram plt_err("Failed to setup hwgrp xaq aura, rc=%d", rc); 6947e9a9490SNithin Dabilpuram return rc; 6957e9a9490SNithin Dabilpuram } 6967e9a9490SNithin Dabilpuram 6977e9a9490SNithin Dabilpuram /* Enable HWGRP */ 6987e9a9490SNithin Dabilpuram plt_write64(0x1, inl_dev->sso_base + SSO_LF_GGRP_QCTL); 6997e9a9490SNithin Dabilpuram 7007e9a9490SNithin Dabilpuram exit: 7017e9a9490SNithin Dabilpuram /* Renable RQ */ 7023c100e0eSNithin Dabilpuram for (i = 0; i < inl_dev->nb_rqs; i++) { 7033c100e0eSNithin Dabilpuram if (!inl_dev->rqs[i].inl_dev_refs) 7043c100e0eSNithin Dabilpuram continue; 7053c100e0eSNithin Dabilpuram 7063c100e0eSNithin Dabilpuram rc = nix_rq_ena_dis(&inl_dev->dev, &inl_dev->rqs[i], true); 7077e9a9490SNithin Dabilpuram if (rc) 7083c100e0eSNithin Dabilpuram plt_err("Failed to enable inline dev RQ %d, rc=%d", i, 7093c100e0eSNithin Dabilpuram rc); 7107e9a9490SNithin Dabilpuram } 7117e9a9490SNithin Dabilpuram 7127e9a9490SNithin Dabilpuram return rc; 7137e9a9490SNithin Dabilpuram } 7147e9a9490SNithin Dabilpuram 715bea5d990SVamsi Attunuru static void 716bea5d990SVamsi Attunuru inl_outb_soft_exp_poll(struct nix_inl_dev *inl_dev, uint32_t ring_idx) 717bea5d990SVamsi Attunuru { 718bea5d990SVamsi Attunuru union roc_ot_ipsec_err_ring_head head; 719bea5d990SVamsi Attunuru struct roc_ot_ipsec_outb_sa *sa; 720bea5d990SVamsi Attunuru uint16_t head_l, tail_l; 721bea5d990SVamsi Attunuru uint64_t *ring_base; 722bea5d990SVamsi Attunuru uint32_t port_id; 723bea5d990SVamsi Attunuru 724bea5d990SVamsi Attunuru port_id = ring_idx / ROC_NIX_SOFT_EXP_PER_PORT_MAX_RINGS; 725694e29eaSVamsi Attunuru ring_base = PLT_PTR_CAST(inl_dev->sa_soft_exp_ring[ring_idx]); 726bea5d990SVamsi Attunuru if (!ring_base) { 727bea5d990SVamsi Attunuru plt_err("Invalid soft exp ring base"); 728bea5d990SVamsi Attunuru return; 729bea5d990SVamsi Attunuru } 730bea5d990SVamsi Attunuru 731bea5d990SVamsi Attunuru head.u64 = __atomic_load_n(ring_base, __ATOMIC_ACQUIRE); 732bea5d990SVamsi Attunuru head_l = head.s.head_pos; 733bea5d990SVamsi Attunuru tail_l = head.s.tail_pos; 734bea5d990SVamsi Attunuru 735bea5d990SVamsi Attunuru while (tail_l != head_l) { 736bea5d990SVamsi Attunuru union roc_ot_ipsec_err_ring_entry entry; 737bea5d990SVamsi Attunuru int poll_counter = 0; 738bea5d990SVamsi Attunuru 739bea5d990SVamsi Attunuru while (poll_counter++ < 740bea5d990SVamsi Attunuru ROC_NIX_INL_SA_SOFT_EXP_ERR_MAX_POLL_COUNT) { 741bea5d990SVamsi Attunuru plt_delay_us(20); 742bea5d990SVamsi Attunuru entry.u64 = __atomic_load_n(ring_base + tail_l + 1, 743bea5d990SVamsi Attunuru __ATOMIC_ACQUIRE); 744bea5d990SVamsi Attunuru if (likely(entry.u64)) 745bea5d990SVamsi Attunuru break; 746bea5d990SVamsi Attunuru } 747bea5d990SVamsi Attunuru 748bea5d990SVamsi Attunuru entry.u64 = plt_be_to_cpu_64(entry.u64); 749bea5d990SVamsi Attunuru sa = (struct roc_ot_ipsec_outb_sa *)(((uint64_t)entry.s.data1 750bea5d990SVamsi Attunuru << 51) | 751bea5d990SVamsi Attunuru (entry.s.data0 << 7)); 752bea5d990SVamsi Attunuru 753bea5d990SVamsi Attunuru if (sa != NULL) { 754bea5d990SVamsi Attunuru uint64_t tmp = ~(uint32_t)0x0; 755bea5d990SVamsi Attunuru inl_dev->work_cb(&tmp, sa, (port_id << 8) | 0x1); 756bea5d990SVamsi Attunuru __atomic_store_n(ring_base + tail_l + 1, 0ULL, 757bea5d990SVamsi Attunuru __ATOMIC_RELAXED); 758f9eb7a4bSTyler Retzlaff __atomic_fetch_add((uint32_t *)ring_base, 1, 759bea5d990SVamsi Attunuru __ATOMIC_ACQ_REL); 760bea5d990SVamsi Attunuru } else 761bea5d990SVamsi Attunuru plt_err("Invalid SA"); 762bea5d990SVamsi Attunuru 763bea5d990SVamsi Attunuru tail_l++; 764bea5d990SVamsi Attunuru } 765bea5d990SVamsi Attunuru } 766bea5d990SVamsi Attunuru 767a7ba40b2SThomas Monjalon static uint32_t 768bea5d990SVamsi Attunuru nix_inl_outb_poll_thread(void *args) 769bea5d990SVamsi Attunuru { 770bea5d990SVamsi Attunuru struct nix_inl_dev *inl_dev = args; 771bea5d990SVamsi Attunuru uint32_t poll_freq; 772bea5d990SVamsi Attunuru uint32_t i; 773bea5d990SVamsi Attunuru bool bit; 774bea5d990SVamsi Attunuru 775bea5d990SVamsi Attunuru poll_freq = inl_dev->soft_exp_poll_freq; 776bea5d990SVamsi Attunuru 777bea5d990SVamsi Attunuru while (!soft_exp_poll_thread_exit) { 778bea5d990SVamsi Attunuru if (soft_exp_consumer_cnt) { 779bea5d990SVamsi Attunuru for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) { 780bea5d990SVamsi Attunuru bit = plt_bitmap_get( 781bea5d990SVamsi Attunuru inl_dev->soft_exp_ring_bmap, i); 782bea5d990SVamsi Attunuru if (bit) 783bea5d990SVamsi Attunuru inl_outb_soft_exp_poll(inl_dev, i); 784bea5d990SVamsi Attunuru } 785bea5d990SVamsi Attunuru } 786bea5d990SVamsi Attunuru usleep(poll_freq); 787bea5d990SVamsi Attunuru } 788bea5d990SVamsi Attunuru 789bea5d990SVamsi Attunuru return 0; 790bea5d990SVamsi Attunuru } 791bea5d990SVamsi Attunuru 792bea5d990SVamsi Attunuru static int 793bea5d990SVamsi Attunuru nix_inl_outb_poll_thread_setup(struct nix_inl_dev *inl_dev) 794bea5d990SVamsi Attunuru { 795bea5d990SVamsi Attunuru struct plt_bitmap *bmap; 796bea5d990SVamsi Attunuru size_t bmap_sz; 797bea5d990SVamsi Attunuru uint32_t i; 798bea5d990SVamsi Attunuru void *mem; 799bea5d990SVamsi Attunuru int rc; 800bea5d990SVamsi Attunuru 801bea5d990SVamsi Attunuru /* Allocate a bitmap that pool thread uses to get the port_id 802bea5d990SVamsi Attunuru * that's corresponding to the inl_outb_soft_exp_ring 803bea5d990SVamsi Attunuru */ 804bea5d990SVamsi Attunuru bmap_sz = 805bea5d990SVamsi Attunuru plt_bitmap_get_memory_footprint(ROC_NIX_INL_MAX_SOFT_EXP_RNGS); 806bea5d990SVamsi Attunuru mem = plt_zmalloc(bmap_sz, PLT_CACHE_LINE_SIZE); 807bea5d990SVamsi Attunuru if (mem == NULL) { 808bea5d990SVamsi Attunuru plt_err("soft expiry ring bmap alloc failed"); 809bea5d990SVamsi Attunuru rc = -ENOMEM; 810bea5d990SVamsi Attunuru goto exit; 811bea5d990SVamsi Attunuru } 812bea5d990SVamsi Attunuru 813bea5d990SVamsi Attunuru bmap = plt_bitmap_init(ROC_NIX_INL_MAX_SOFT_EXP_RNGS, mem, bmap_sz); 814bea5d990SVamsi Attunuru if (!bmap) { 815bea5d990SVamsi Attunuru plt_err("soft expiry ring bmap init failed"); 816bea5d990SVamsi Attunuru plt_free(mem); 817bea5d990SVamsi Attunuru rc = -ENOMEM; 818bea5d990SVamsi Attunuru goto exit; 819bea5d990SVamsi Attunuru } 820bea5d990SVamsi Attunuru 821bea5d990SVamsi Attunuru inl_dev->soft_exp_ring_bmap_mem = mem; 822bea5d990SVamsi Attunuru inl_dev->soft_exp_ring_bmap = bmap; 823694e29eaSVamsi Attunuru inl_dev->sa_soft_exp_ring = plt_zmalloc( 824694e29eaSVamsi Attunuru ROC_NIX_INL_MAX_SOFT_EXP_RNGS * sizeof(uint64_t), 0); 825694e29eaSVamsi Attunuru if (!inl_dev->sa_soft_exp_ring) { 826694e29eaSVamsi Attunuru plt_err("soft expiry ring pointer array alloc failed"); 827694e29eaSVamsi Attunuru plt_free(mem); 828694e29eaSVamsi Attunuru rc = -ENOMEM; 829694e29eaSVamsi Attunuru goto exit; 830694e29eaSVamsi Attunuru } 831bea5d990SVamsi Attunuru 832bea5d990SVamsi Attunuru for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) 833bea5d990SVamsi Attunuru plt_bitmap_clear(inl_dev->soft_exp_ring_bmap, i); 834bea5d990SVamsi Attunuru 835bea5d990SVamsi Attunuru soft_exp_consumer_cnt = 0; 836bea5d990SVamsi Attunuru soft_exp_poll_thread_exit = false; 837a7ba40b2SThomas Monjalon rc = plt_thread_create_control(&inl_dev->soft_exp_poll_thread, 838a7ba40b2SThomas Monjalon "outb-poll", nix_inl_outb_poll_thread, inl_dev); 839bea5d990SVamsi Attunuru if (rc) { 840bea5d990SVamsi Attunuru plt_bitmap_free(inl_dev->soft_exp_ring_bmap); 841bea5d990SVamsi Attunuru plt_free(inl_dev->soft_exp_ring_bmap_mem); 842bea5d990SVamsi Attunuru } 843bea5d990SVamsi Attunuru 844bea5d990SVamsi Attunuru exit: 845bea5d990SVamsi Attunuru return rc; 846bea5d990SVamsi Attunuru } 847bea5d990SVamsi Attunuru 848de8c60d1SSrujana Challa void * 849de8c60d1SSrujana Challa roc_nix_inl_dev_qptr_get(uint8_t qid) 850de8c60d1SSrujana Challa { 851de8c60d1SSrujana Challa struct idev_cfg *idev = idev_get_cfg(); 852de8c60d1SSrujana Challa struct nix_inl_dev *inl_dev = NULL; 853de8c60d1SSrujana Challa 854de8c60d1SSrujana Challa if (idev) 855de8c60d1SSrujana Challa inl_dev = idev->nix_inl_dev; 856de8c60d1SSrujana Challa 857de8c60d1SSrujana Challa if (!inl_dev) { 858de8c60d1SSrujana Challa plt_err("Inline Device could not be detected"); 859de8c60d1SSrujana Challa return NULL; 860de8c60d1SSrujana Challa } 861de8c60d1SSrujana Challa if (!inl_dev->attach_cptlf) { 862de8c60d1SSrujana Challa plt_err("No CPT LFs are attached to Inline Device"); 863de8c60d1SSrujana Challa return NULL; 864de8c60d1SSrujana Challa } 865de8c60d1SSrujana Challa if (qid >= inl_dev->nb_cptlf) { 866de8c60d1SSrujana Challa plt_err("Invalid qid: %u total queues: %d", qid, inl_dev->nb_cptlf); 867de8c60d1SSrujana Challa return NULL; 868de8c60d1SSrujana Challa } 869de8c60d1SSrujana Challa return &inl_dev->q_info[qid]; 870de8c60d1SSrujana Challa } 871de8c60d1SSrujana Challa 872bbcd191cSNithin Dabilpuram int 87379dc6f32SKommula Shiva Shankar roc_nix_inl_dev_stats_get(struct roc_nix_stats *stats) 87479dc6f32SKommula Shiva Shankar { 87579dc6f32SKommula Shiva Shankar struct idev_cfg *idev = idev_get_cfg(); 87679dc6f32SKommula Shiva Shankar struct nix_inl_dev *inl_dev = NULL; 87779dc6f32SKommula Shiva Shankar 87879dc6f32SKommula Shiva Shankar if (stats == NULL) 87979dc6f32SKommula Shiva Shankar return NIX_ERR_PARAM; 88079dc6f32SKommula Shiva Shankar 881f7648fb3SGowrishankar Muthukrishnan if (idev && idev->nix_inl_dev) 88279dc6f32SKommula Shiva Shankar inl_dev = idev->nix_inl_dev; 88379dc6f32SKommula Shiva Shankar 88479dc6f32SKommula Shiva Shankar if (!inl_dev) 88579dc6f32SKommula Shiva Shankar return -EINVAL; 88679dc6f32SKommula Shiva Shankar 88779dc6f32SKommula Shiva Shankar stats->rx_octs = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_OCTS); 88879dc6f32SKommula Shiva Shankar stats->rx_ucast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_UCAST); 88979dc6f32SKommula Shiva Shankar stats->rx_bcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_BCAST); 89079dc6f32SKommula Shiva Shankar stats->rx_mcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_MCAST); 89179dc6f32SKommula Shiva Shankar stats->rx_drop = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DROP); 89279dc6f32SKommula Shiva Shankar stats->rx_drop_octs = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DROP_OCTS); 89379dc6f32SKommula Shiva Shankar stats->rx_fcs = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_FCS); 89479dc6f32SKommula Shiva Shankar stats->rx_err = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_ERR); 89579dc6f32SKommula Shiva Shankar stats->rx_drop_bcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_BCAST); 89679dc6f32SKommula Shiva Shankar stats->rx_drop_mcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_MCAST); 89779dc6f32SKommula Shiva Shankar stats->rx_drop_l3_bcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_L3BCAST); 89879dc6f32SKommula Shiva Shankar stats->rx_drop_l3_mcast = INL_NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_L3MCAST); 89979dc6f32SKommula Shiva Shankar 90079dc6f32SKommula Shiva Shankar return 0; 90179dc6f32SKommula Shiva Shankar } 90279dc6f32SKommula Shiva Shankar 90379dc6f32SKommula Shiva Shankar int 904bbcd191cSNithin Dabilpuram roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev) 905bbcd191cSNithin Dabilpuram { 906bbcd191cSNithin Dabilpuram struct plt_pci_device *pci_dev; 907bbcd191cSNithin Dabilpuram struct nix_inl_dev *inl_dev; 908bbcd191cSNithin Dabilpuram struct idev_cfg *idev; 909df5cf15fSKiran Kumar K int start_index; 910df5cf15fSKiran Kumar K int resp_count; 911df5cf15fSKiran Kumar K int rc, i; 912bbcd191cSNithin Dabilpuram 913bbcd191cSNithin Dabilpuram pci_dev = roc_inl_dev->pci_dev; 914bbcd191cSNithin Dabilpuram 915bbcd191cSNithin Dabilpuram /* Skip probe if already done */ 916bbcd191cSNithin Dabilpuram idev = idev_get_cfg(); 917bbcd191cSNithin Dabilpuram if (idev == NULL) 918bbcd191cSNithin Dabilpuram return -ENOTSUP; 919bbcd191cSNithin Dabilpuram 920bbcd191cSNithin Dabilpuram if (idev->nix_inl_dev) { 921bbcd191cSNithin Dabilpuram plt_info("Skipping device %s, inline device already probed", 922bbcd191cSNithin Dabilpuram pci_dev->name); 923bbcd191cSNithin Dabilpuram return -EEXIST; 924bbcd191cSNithin Dabilpuram } 925bbcd191cSNithin Dabilpuram 926bbcd191cSNithin Dabilpuram PLT_STATIC_ASSERT(sizeof(struct nix_inl_dev) <= ROC_NIX_INL_MEM_SZ); 927bbcd191cSNithin Dabilpuram 928bbcd191cSNithin Dabilpuram inl_dev = (struct nix_inl_dev *)roc_inl_dev->reserved; 929bbcd191cSNithin Dabilpuram memset(inl_dev, 0, sizeof(*inl_dev)); 930bbcd191cSNithin Dabilpuram 931bbcd191cSNithin Dabilpuram inl_dev->pci_dev = pci_dev; 932fe5846bcSNithin Dabilpuram inl_dev->ipsec_in_min_spi = roc_inl_dev->ipsec_in_min_spi; 933bbcd191cSNithin Dabilpuram inl_dev->ipsec_in_max_spi = roc_inl_dev->ipsec_in_max_spi; 934bbcd191cSNithin Dabilpuram inl_dev->selftest = roc_inl_dev->selftest; 93557f7b982SSatheesh Paul inl_dev->is_multi_channel = roc_inl_dev->is_multi_channel; 93657f7b982SSatheesh Paul inl_dev->channel = roc_inl_dev->channel; 93757f7b982SSatheesh Paul inl_dev->chan_mask = roc_inl_dev->chan_mask; 938bbcd191cSNithin Dabilpuram inl_dev->attach_cptlf = roc_inl_dev->attach_cptlf; 9394af4e36aSVidya Sagar Velumuri inl_dev->wqe_skip = roc_inl_dev->wqe_skip; 940c8c967e1SNithin Dabilpuram inl_dev->spb_drop_pc = NIX_AURA_DROP_PC_DFLT; 941c8c967e1SNithin Dabilpuram inl_dev->lpb_drop_pc = NIX_AURA_DROP_PC_DFLT; 942aa728ea4SNithin Dabilpuram inl_dev->set_soft_exp_poll = !!roc_inl_dev->soft_exp_poll_freq; 9433c100e0eSNithin Dabilpuram inl_dev->nb_rqs = inl_dev->is_multi_channel ? 1 : PLT_MAX_ETHPORTS; 9440f3f3ad8SNithin Dabilpuram inl_dev->nb_meta_bufs = roc_inl_dev->nb_meta_bufs; 9450f3f3ad8SNithin Dabilpuram inl_dev->meta_buf_sz = roc_inl_dev->meta_buf_sz; 946aa728ea4SNithin Dabilpuram inl_dev->soft_exp_poll_freq = roc_inl_dev->soft_exp_poll_freq; 947*03b15238SSrujana Challa inl_dev->custom_inb_sa = roc_inl_dev->custom_inb_sa; 948c8c967e1SNithin Dabilpuram 9494b8eb5bdSRahul Bhansali if (roc_inl_dev->rx_inj_ena) { 9504b8eb5bdSRahul Bhansali inl_dev->rx_inj_ena = 1; 9514b8eb5bdSRahul Bhansali inl_dev->nb_cptlf = NIX_INL_CPT_LF; 9524b8eb5bdSRahul Bhansali } else 9534b8eb5bdSRahul Bhansali inl_dev->nb_cptlf = 1; 9544b8eb5bdSRahul Bhansali 955c8c967e1SNithin Dabilpuram if (roc_inl_dev->spb_drop_pc) 956c8c967e1SNithin Dabilpuram inl_dev->spb_drop_pc = roc_inl_dev->spb_drop_pc; 957c8c967e1SNithin Dabilpuram if (roc_inl_dev->lpb_drop_pc) 958c8c967e1SNithin Dabilpuram inl_dev->lpb_drop_pc = roc_inl_dev->lpb_drop_pc; 959bbcd191cSNithin Dabilpuram 960bbcd191cSNithin Dabilpuram /* Initialize base device */ 961bbcd191cSNithin Dabilpuram rc = dev_init(&inl_dev->dev, pci_dev); 962bbcd191cSNithin Dabilpuram if (rc) { 963bbcd191cSNithin Dabilpuram plt_err("Failed to init roc device"); 964bbcd191cSNithin Dabilpuram goto error; 965bbcd191cSNithin Dabilpuram } 966bbcd191cSNithin Dabilpuram 967bbcd191cSNithin Dabilpuram /* Attach LF resources */ 968bbcd191cSNithin Dabilpuram rc = nix_inl_lf_attach(inl_dev); 969bbcd191cSNithin Dabilpuram if (rc) { 970bbcd191cSNithin Dabilpuram plt_err("Failed to attach LF resources, rc=%d", rc); 971bbcd191cSNithin Dabilpuram goto dev_cleanup; 972bbcd191cSNithin Dabilpuram } 973bbcd191cSNithin Dabilpuram 974bbcd191cSNithin Dabilpuram /* Setup NIX LF */ 975bbcd191cSNithin Dabilpuram rc = nix_inl_nix_setup(inl_dev); 976bbcd191cSNithin Dabilpuram if (rc) 977bbcd191cSNithin Dabilpuram goto lf_detach; 978bbcd191cSNithin Dabilpuram 979bbcd191cSNithin Dabilpuram /* Setup SSO LF */ 980bbcd191cSNithin Dabilpuram rc = nix_inl_sso_setup(inl_dev); 981bbcd191cSNithin Dabilpuram if (rc) 982bbcd191cSNithin Dabilpuram goto nix_release; 983bbcd191cSNithin Dabilpuram 984bbcd191cSNithin Dabilpuram /* Setup CPT LF */ 9858881cf1cSNithin Dabilpuram rc = nix_inl_cpt_setup(inl_dev, false); 986bbcd191cSNithin Dabilpuram if (rc) 987bbcd191cSNithin Dabilpuram goto sso_release; 988bbcd191cSNithin Dabilpuram 989f5a43270SNithin Dabilpuram if (inl_dev->set_soft_exp_poll) { 990bea5d990SVamsi Attunuru rc = nix_inl_outb_poll_thread_setup(inl_dev); 991bea5d990SVamsi Attunuru if (rc) 992bea5d990SVamsi Attunuru goto cpt_release; 993bea5d990SVamsi Attunuru } 994bea5d990SVamsi Attunuru 995bbcd191cSNithin Dabilpuram /* Perform selftest if asked for */ 996bbcd191cSNithin Dabilpuram if (inl_dev->selftest) { 997bbcd191cSNithin Dabilpuram rc = nix_inl_selftest(); 998bbcd191cSNithin Dabilpuram if (rc) 999bbcd191cSNithin Dabilpuram goto cpt_release; 1000bbcd191cSNithin Dabilpuram } 1001df5cf15fSKiran Kumar K inl_dev->max_ipsec_rules = roc_inl_dev->max_ipsec_rules; 1002df5cf15fSKiran Kumar K 1003df5cf15fSKiran Kumar K if (inl_dev->max_ipsec_rules && roc_inl_dev->is_multi_channel) { 1004df5cf15fSKiran Kumar K inl_dev->ipsec_index = 1005df5cf15fSKiran Kumar K plt_zmalloc(sizeof(int) * inl_dev->max_ipsec_rules, PLT_CACHE_LINE_SIZE); 1006df5cf15fSKiran Kumar K if (inl_dev->ipsec_index == NULL) { 1007df5cf15fSKiran Kumar K rc = NPC_ERR_NO_MEM; 1008df5cf15fSKiran Kumar K goto cpt_release; 1009df5cf15fSKiran Kumar K } 1010df5cf15fSKiran Kumar K rc = npc_mcam_alloc_entries(inl_dev->dev.mbox, inl_dev->max_ipsec_rules, 1011df5cf15fSKiran Kumar K inl_dev->ipsec_index, inl_dev->max_ipsec_rules, 1012df5cf15fSKiran Kumar K NPC_MCAM_HIGHER_PRIO, &resp_count, 1); 1013df5cf15fSKiran Kumar K if (rc) { 1014df5cf15fSKiran Kumar K plt_free(inl_dev->ipsec_index); 1015df5cf15fSKiran Kumar K goto cpt_release; 1016df5cf15fSKiran Kumar K } 1017df5cf15fSKiran Kumar K 1018df5cf15fSKiran Kumar K start_index = inl_dev->ipsec_index[0]; 1019df5cf15fSKiran Kumar K for (i = 0; i < resp_count; i++) 1020df5cf15fSKiran Kumar K inl_dev->ipsec_index[i] = start_index + i; 1021df5cf15fSKiran Kumar K 1022df5cf15fSKiran Kumar K inl_dev->curr_ipsec_idx = 0; 1023df5cf15fSKiran Kumar K inl_dev->alloc_ipsec_rules = resp_count; 1024df5cf15fSKiran Kumar K } 1025bbcd191cSNithin Dabilpuram 1026bbcd191cSNithin Dabilpuram idev->nix_inl_dev = inl_dev; 1027bbcd191cSNithin Dabilpuram 1028bbcd191cSNithin Dabilpuram return 0; 1029bbcd191cSNithin Dabilpuram cpt_release: 1030bbcd191cSNithin Dabilpuram rc |= nix_inl_cpt_release(inl_dev); 1031bbcd191cSNithin Dabilpuram sso_release: 1032bbcd191cSNithin Dabilpuram rc |= nix_inl_sso_release(inl_dev); 1033bbcd191cSNithin Dabilpuram nix_release: 1034bbcd191cSNithin Dabilpuram rc |= nix_inl_nix_release(inl_dev); 1035bbcd191cSNithin Dabilpuram lf_detach: 1036bbcd191cSNithin Dabilpuram rc |= nix_inl_lf_detach(inl_dev); 1037bbcd191cSNithin Dabilpuram dev_cleanup: 1038bbcd191cSNithin Dabilpuram rc |= dev_fini(&inl_dev->dev, pci_dev); 1039bbcd191cSNithin Dabilpuram error: 1040bbcd191cSNithin Dabilpuram return rc; 1041bbcd191cSNithin Dabilpuram } 1042bbcd191cSNithin Dabilpuram 1043bbcd191cSNithin Dabilpuram int 1044bbcd191cSNithin Dabilpuram roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev) 1045bbcd191cSNithin Dabilpuram { 1046bbcd191cSNithin Dabilpuram struct plt_pci_device *pci_dev; 1047bbcd191cSNithin Dabilpuram struct nix_inl_dev *inl_dev; 1048bbcd191cSNithin Dabilpuram struct idev_cfg *idev; 1049df5cf15fSKiran Kumar K uint32_t i; 1050bbcd191cSNithin Dabilpuram int rc; 1051bbcd191cSNithin Dabilpuram 1052bbcd191cSNithin Dabilpuram idev = idev_get_cfg(); 1053bbcd191cSNithin Dabilpuram if (idev == NULL) 1054bbcd191cSNithin Dabilpuram return 0; 1055bbcd191cSNithin Dabilpuram 1056bbcd191cSNithin Dabilpuram if (!idev->nix_inl_dev || 1057bbcd191cSNithin Dabilpuram PLT_PTR_DIFF(roc_inl_dev->reserved, idev->nix_inl_dev)) 1058bbcd191cSNithin Dabilpuram return 0; 1059bbcd191cSNithin Dabilpuram 1060bbcd191cSNithin Dabilpuram inl_dev = idev->nix_inl_dev; 1061bbcd191cSNithin Dabilpuram pci_dev = inl_dev->pci_dev; 1062bbcd191cSNithin Dabilpuram 1063df5cf15fSKiran Kumar K if (inl_dev->ipsec_index && roc_inl_dev->is_multi_channel) { 1064df5cf15fSKiran Kumar K for (i = inl_dev->curr_ipsec_idx; i < inl_dev->alloc_ipsec_rules; i++) 1065df5cf15fSKiran Kumar K npc_mcam_free_entry(inl_dev->dev.mbox, inl_dev->ipsec_index[i]); 1066df5cf15fSKiran Kumar K plt_free(inl_dev->ipsec_index); 1067df5cf15fSKiran Kumar K } 1068df5cf15fSKiran Kumar K 1069f5a43270SNithin Dabilpuram if (inl_dev->set_soft_exp_poll) { 1070bea5d990SVamsi Attunuru soft_exp_poll_thread_exit = true; 1071354bf671SJerin Jacob plt_thread_join(inl_dev->soft_exp_poll_thread, NULL); 1072bea5d990SVamsi Attunuru plt_bitmap_free(inl_dev->soft_exp_ring_bmap); 1073bea5d990SVamsi Attunuru plt_free(inl_dev->soft_exp_ring_bmap_mem); 1074694e29eaSVamsi Attunuru plt_free(inl_dev->sa_soft_exp_ring); 1075bea5d990SVamsi Attunuru } 1076bea5d990SVamsi Attunuru 10772635c25dSSrujana Challa /* Flush Inbound CTX cache entries */ 10782635c25dSSrujana Challa nix_inl_cpt_ctx_cache_sync(inl_dev); 10792635c25dSSrujana Challa 10808881cf1cSNithin Dabilpuram /* Release CPT */ 10818881cf1cSNithin Dabilpuram rc = nix_inl_cpt_release(inl_dev); 10828881cf1cSNithin Dabilpuram 1083bbcd191cSNithin Dabilpuram /* Release SSO */ 10848881cf1cSNithin Dabilpuram rc |= nix_inl_sso_release(inl_dev); 1085bbcd191cSNithin Dabilpuram 1086bbcd191cSNithin Dabilpuram /* Release NIX */ 1087bbcd191cSNithin Dabilpuram rc |= nix_inl_nix_release(inl_dev); 1088bbcd191cSNithin Dabilpuram 1089bbcd191cSNithin Dabilpuram /* Detach LF's */ 1090bbcd191cSNithin Dabilpuram rc |= nix_inl_lf_detach(inl_dev); 1091bbcd191cSNithin Dabilpuram 1092bbcd191cSNithin Dabilpuram /* Cleanup mbox */ 1093bbcd191cSNithin Dabilpuram rc |= dev_fini(&inl_dev->dev, pci_dev); 1094bbcd191cSNithin Dabilpuram if (rc) 1095bbcd191cSNithin Dabilpuram return rc; 1096bbcd191cSNithin Dabilpuram 1097bbcd191cSNithin Dabilpuram idev->nix_inl_dev = NULL; 1098bbcd191cSNithin Dabilpuram return 0; 1099bbcd191cSNithin Dabilpuram } 11008881cf1cSNithin Dabilpuram 11018881cf1cSNithin Dabilpuram int 11028881cf1cSNithin Dabilpuram roc_nix_inl_dev_cpt_setup(bool use_inl_dev_sso) 11038881cf1cSNithin Dabilpuram { 11048881cf1cSNithin Dabilpuram struct idev_cfg *idev = idev_get_cfg(); 11058881cf1cSNithin Dabilpuram struct nix_inl_dev *inl_dev = NULL; 11068881cf1cSNithin Dabilpuram 11078881cf1cSNithin Dabilpuram if (!idev || !idev->nix_inl_dev) 11088881cf1cSNithin Dabilpuram return -ENOENT; 11098881cf1cSNithin Dabilpuram inl_dev = idev->nix_inl_dev; 11108881cf1cSNithin Dabilpuram 11114b8eb5bdSRahul Bhansali if (inl_dev->cpt_lf[0].dev != NULL) 11128881cf1cSNithin Dabilpuram return -EBUSY; 11138881cf1cSNithin Dabilpuram 11148881cf1cSNithin Dabilpuram return nix_inl_cpt_setup(inl_dev, use_inl_dev_sso); 11158881cf1cSNithin Dabilpuram } 11168881cf1cSNithin Dabilpuram 11178881cf1cSNithin Dabilpuram int 11188881cf1cSNithin Dabilpuram roc_nix_inl_dev_cpt_release(void) 11198881cf1cSNithin Dabilpuram { 11208881cf1cSNithin Dabilpuram struct idev_cfg *idev = idev_get_cfg(); 11218881cf1cSNithin Dabilpuram struct nix_inl_dev *inl_dev = NULL; 11228881cf1cSNithin Dabilpuram 11238881cf1cSNithin Dabilpuram if (!idev || !idev->nix_inl_dev) 11248881cf1cSNithin Dabilpuram return -ENOENT; 11258881cf1cSNithin Dabilpuram inl_dev = idev->nix_inl_dev; 11268881cf1cSNithin Dabilpuram 11274b8eb5bdSRahul Bhansali if (inl_dev->cpt_lf[0].dev == NULL) 11288881cf1cSNithin Dabilpuram return 0; 11298881cf1cSNithin Dabilpuram 11308881cf1cSNithin Dabilpuram return nix_inl_cpt_release(inl_dev); 11318881cf1cSNithin Dabilpuram } 1132