18dcdf319SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 28dcdf319SJerin Jacob * Copyright(C) 2021 Marvell. 38dcdf319SJerin Jacob */ 48dcdf319SJerin Jacob 58dcdf319SJerin Jacob #include "roc_api.h" 68dcdf319SJerin Jacob #include "roc_priv.h" 78dcdf319SJerin Jacob 88dcdf319SJerin Jacob bool 98dcdf319SJerin Jacob roc_nix_is_lbk(struct roc_nix *roc_nix) 108dcdf319SJerin Jacob { 118dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 128dcdf319SJerin Jacob 138dcdf319SJerin Jacob return nix->lbk_link; 148dcdf319SJerin Jacob } 158dcdf319SJerin Jacob 1654ec7c87SHarman Kalra bool 1754ec7c87SHarman Kalra roc_nix_is_esw(struct roc_nix *roc_nix) 1854ec7c87SHarman Kalra { 1954ec7c87SHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 2054ec7c87SHarman Kalra 2154ec7c87SHarman Kalra return nix->esw_link; 2254ec7c87SHarman Kalra } 2354ec7c87SHarman Kalra 248dcdf319SJerin Jacob int 258dcdf319SJerin Jacob roc_nix_get_base_chan(struct roc_nix *roc_nix) 268dcdf319SJerin Jacob { 278dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 288dcdf319SJerin Jacob 298dcdf319SJerin Jacob return nix->rx_chan_base; 308dcdf319SJerin Jacob } 318dcdf319SJerin Jacob 32607a1546SRahul Bhansali uint8_t 33607a1546SRahul Bhansali roc_nix_get_rx_chan_cnt(struct roc_nix *roc_nix) 34607a1546SRahul Bhansali { 35607a1546SRahul Bhansali struct nix *nix = roc_nix_to_nix_priv(roc_nix); 36607a1546SRahul Bhansali 37607a1546SRahul Bhansali return nix->rx_chan_cnt; 38607a1546SRahul Bhansali } 39607a1546SRahul Bhansali 408dcdf319SJerin Jacob uint16_t 418dcdf319SJerin Jacob roc_nix_get_vwqe_interval(struct roc_nix *roc_nix) 428dcdf319SJerin Jacob { 438dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 448dcdf319SJerin Jacob 458dcdf319SJerin Jacob return nix->vwqe_interval; 468dcdf319SJerin Jacob } 478dcdf319SJerin Jacob 488dcdf319SJerin Jacob bool 498dcdf319SJerin Jacob roc_nix_is_sdp(struct roc_nix *roc_nix) 508dcdf319SJerin Jacob { 518dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 528dcdf319SJerin Jacob 538dcdf319SJerin Jacob return nix->sdp_link; 548dcdf319SJerin Jacob } 558dcdf319SJerin Jacob 568dcdf319SJerin Jacob bool 578dcdf319SJerin Jacob roc_nix_is_pf(struct roc_nix *roc_nix) 588dcdf319SJerin Jacob { 598dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 608dcdf319SJerin Jacob 618dcdf319SJerin Jacob return !dev_is_vf(&nix->dev); 628dcdf319SJerin Jacob } 638dcdf319SJerin Jacob 648dcdf319SJerin Jacob int 658dcdf319SJerin Jacob roc_nix_get_pf(struct roc_nix *roc_nix) 668dcdf319SJerin Jacob { 678dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 688dcdf319SJerin Jacob struct dev *dev = &nix->dev; 698dcdf319SJerin Jacob 708dcdf319SJerin Jacob return dev_get_pf(dev->pf_func); 718dcdf319SJerin Jacob } 728dcdf319SJerin Jacob 738dcdf319SJerin Jacob int 748dcdf319SJerin Jacob roc_nix_get_vf(struct roc_nix *roc_nix) 758dcdf319SJerin Jacob { 768dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 778dcdf319SJerin Jacob struct dev *dev = &nix->dev; 788dcdf319SJerin Jacob 798dcdf319SJerin Jacob return dev_get_vf(dev->pf_func); 808dcdf319SJerin Jacob } 818dcdf319SJerin Jacob 828dcdf319SJerin Jacob bool 838dcdf319SJerin Jacob roc_nix_is_vf_or_sdp(struct roc_nix *roc_nix) 848dcdf319SJerin Jacob { 858dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 868dcdf319SJerin Jacob 878dcdf319SJerin Jacob return (dev_is_vf(&nix->dev) != 0) || roc_nix_is_sdp(roc_nix); 888dcdf319SJerin Jacob } 898dcdf319SJerin Jacob 908dcdf319SJerin Jacob uint16_t 918dcdf319SJerin Jacob roc_nix_get_pf_func(struct roc_nix *roc_nix) 928dcdf319SJerin Jacob { 938dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 948dcdf319SJerin Jacob struct dev *dev = &nix->dev; 958dcdf319SJerin Jacob 968dcdf319SJerin Jacob return dev->pf_func; 978dcdf319SJerin Jacob } 988dcdf319SJerin Jacob 998dcdf319SJerin Jacob int 100bd02fe78SVidya Sagar Velumuri roc_nix_lf_inl_ipsec_cfg(struct roc_nix *roc_nix, struct roc_nix_ipsec_cfg *cfg, 101bd02fe78SVidya Sagar Velumuri bool enb) 102bd02fe78SVidya Sagar Velumuri { 103bd02fe78SVidya Sagar Velumuri struct nix *nix = roc_nix_to_nix_priv(roc_nix); 104bd02fe78SVidya Sagar Velumuri struct nix_inline_ipsec_lf_cfg *lf_cfg; 10544a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 10644a9307cSRakesh Kudurumalla int rc; 107bd02fe78SVidya Sagar Velumuri 108bd02fe78SVidya Sagar Velumuri lf_cfg = mbox_alloc_msg_nix_inline_ipsec_lf_cfg(mbox); 10944a9307cSRakesh Kudurumalla if (lf_cfg == NULL) { 11044a9307cSRakesh Kudurumalla rc = -ENOSPC; 11144a9307cSRakesh Kudurumalla goto exit; 11244a9307cSRakesh Kudurumalla } 113bd02fe78SVidya Sagar Velumuri 114bd02fe78SVidya Sagar Velumuri if (enb) { 115bd02fe78SVidya Sagar Velumuri lf_cfg->enable = 1; 116bd02fe78SVidya Sagar Velumuri lf_cfg->sa_base_addr = cfg->iova; 117bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg1.sa_idx_w = plt_log2_u32(cfg->max_sa); 118bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg0.lenm1_max = roc_nix_max_pkt_len(roc_nix) - 1; 119bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg1.sa_idx_max = cfg->max_sa - 1; 120bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg0.sa_pow2_size = plt_log2_u32(cfg->sa_size); 121bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg0.tag_const = cfg->tag_const; 122bd02fe78SVidya Sagar Velumuri lf_cfg->ipsec_cfg0.tt = cfg->tt; 123bd02fe78SVidya Sagar Velumuri } else { 124bd02fe78SVidya Sagar Velumuri lf_cfg->enable = 0; 125bd02fe78SVidya Sagar Velumuri } 126bd02fe78SVidya Sagar Velumuri 12744a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 12844a9307cSRakesh Kudurumalla exit: 12944a9307cSRakesh Kudurumalla mbox_put(mbox); 13044a9307cSRakesh Kudurumalla return rc; 131bd02fe78SVidya Sagar Velumuri } 132bd02fe78SVidya Sagar Velumuri 133bd02fe78SVidya Sagar Velumuri int 1342635c25dSSrujana Challa roc_nix_cpt_ctx_cache_sync(struct roc_nix *roc_nix) 1352635c25dSSrujana Challa { 1362635c25dSSrujana Challa struct nix *nix = roc_nix_to_nix_priv(roc_nix); 13744a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 1382635c25dSSrujana Challa struct msg_req *req; 13944a9307cSRakesh Kudurumalla int rc; 1402635c25dSSrujana Challa 1412635c25dSSrujana Challa req = mbox_alloc_msg_cpt_ctx_cache_sync(mbox); 14244a9307cSRakesh Kudurumalla if (req == NULL) { 14344a9307cSRakesh Kudurumalla rc = -ENOSPC; 14444a9307cSRakesh Kudurumalla goto exit; 14544a9307cSRakesh Kudurumalla } 1462635c25dSSrujana Challa 14744a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 14844a9307cSRakesh Kudurumalla exit: 14944a9307cSRakesh Kudurumalla mbox_put(mbox); 15044a9307cSRakesh Kudurumalla return rc; 1512635c25dSSrujana Challa } 1522635c25dSSrujana Challa 1532635c25dSSrujana Challa int 1548dcdf319SJerin Jacob roc_nix_max_pkt_len(struct roc_nix *roc_nix) 1558dcdf319SJerin Jacob { 1568dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 1578dcdf319SJerin Jacob 158e98f5831SSathesh Edara if (roc_nix_is_sdp(roc_nix)) { 159e98f5831SSathesh Edara if (roc_errata_nix_sdp_send_has_mtu_size_16k()) 160e98f5831SSathesh Edara return NIX_SDP_16K_HW_FRS; 161457d0774SSatha Rao return NIX_SDP_MAX_HW_FRS; 162e98f5831SSathesh Edara } 163457d0774SSatha Rao 1648dcdf319SJerin Jacob if (roc_model_is_cn9k()) 1658dcdf319SJerin Jacob return NIX_CN9K_MAX_HW_FRS; 1668dcdf319SJerin Jacob 16754ec7c87SHarman Kalra if (nix->lbk_link || nix->esw_link) 1688dcdf319SJerin Jacob return NIX_LBK_MAX_HW_FRS; 1698dcdf319SJerin Jacob 1708dcdf319SJerin Jacob return NIX_RPM_MAX_HW_FRS; 1718dcdf319SJerin Jacob } 1728dcdf319SJerin Jacob 1738dcdf319SJerin Jacob int 1748dcdf319SJerin Jacob roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq, 1758dcdf319SJerin Jacob uint64_t rx_cfg) 1768dcdf319SJerin Jacob { 1778dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 17844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 1798dcdf319SJerin Jacob struct nix_lf_alloc_req *req; 1808dcdf319SJerin Jacob struct nix_lf_alloc_rsp *rsp; 1818dcdf319SJerin Jacob int rc = -ENOSPC; 1828dcdf319SJerin Jacob 1838dcdf319SJerin Jacob req = mbox_alloc_msg_nix_lf_alloc(mbox); 1848dcdf319SJerin Jacob if (req == NULL) 18544a9307cSRakesh Kudurumalla goto fail; 1868dcdf319SJerin Jacob req->rq_cnt = nb_rxq; 1878dcdf319SJerin Jacob req->sq_cnt = nb_txq; 188b059bbb8SKommula Shiva Shankar if (roc_nix->tx_compl_ena) 189b059bbb8SKommula Shiva Shankar req->cq_cnt = nb_rxq + nb_txq; 190b059bbb8SKommula Shiva Shankar else 1918dcdf319SJerin Jacob req->cq_cnt = nb_rxq; 1928dcdf319SJerin Jacob /* XQESZ can be W64 or W16 */ 1938dcdf319SJerin Jacob req->xqe_sz = NIX_XQESZ_W16; 1948dcdf319SJerin Jacob req->rss_sz = nix->reta_sz; 1958dcdf319SJerin Jacob req->rss_grps = ROC_NIX_RSS_GRPS; 1968dcdf319SJerin Jacob req->npa_func = idev_npa_pffunc_get(); 1979b727f85SPavan Nikhilesh req->sso_func = idev_sso_pffunc_get(); 1988dcdf319SJerin Jacob req->rx_cfg = rx_cfg; 19970cf1c63SHarman Kalra if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop && 20070cf1c63SHarman Kalra roc_model_is_cn98xx()) 20170cf1c63SHarman Kalra req->flags = NIX_LF_LBK_BLK_SEL; 2028dcdf319SJerin Jacob 2038dcdf319SJerin Jacob if (!roc_nix->rss_tag_as_xor) 20470cf1c63SHarman Kalra req->flags |= NIX_LF_RSS_TAG_LSB_AS_ADDER; 2058dcdf319SJerin Jacob 2068dcdf319SJerin Jacob rc = mbox_process_msg(mbox, (void *)&rsp); 2078dcdf319SJerin Jacob if (rc) 2088dcdf319SJerin Jacob goto fail; 2098dcdf319SJerin Jacob 210c89e976cSNithin Dabilpuram nix->rx_cfg = rx_cfg; 2118dcdf319SJerin Jacob nix->sqb_size = rsp->sqb_size; 2128dcdf319SJerin Jacob nix->tx_chan_base = rsp->tx_chan_base; 2138dcdf319SJerin Jacob nix->rx_chan_base = rsp->rx_chan_base; 2148dcdf319SJerin Jacob if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop) 2158dcdf319SJerin Jacob nix->tx_chan_base = rsp->rx_chan_base; 2168dcdf319SJerin Jacob nix->rx_chan_cnt = rsp->rx_chan_cnt; 2178dcdf319SJerin Jacob nix->tx_chan_cnt = rsp->tx_chan_cnt; 2188dcdf319SJerin Jacob nix->lso_tsov4_idx = rsp->lso_tsov4_idx; 2198dcdf319SJerin Jacob nix->lso_tsov6_idx = rsp->lso_tsov6_idx; 2208dcdf319SJerin Jacob nix->lf_tx_stats = rsp->lf_tx_stats; 2218dcdf319SJerin Jacob nix->lf_rx_stats = rsp->lf_rx_stats; 2228dcdf319SJerin Jacob nix->cints = rsp->cints; 2238dcdf319SJerin Jacob roc_nix->cints = rsp->cints; 2248dcdf319SJerin Jacob nix->qints = rsp->qints; 2258dcdf319SJerin Jacob nix->ptp_en = rsp->hw_rx_tstamp_en; 2268dcdf319SJerin Jacob roc_nix->rx_ptp_ena = rsp->hw_rx_tstamp_en; 2278dcdf319SJerin Jacob nix->cgx_links = rsp->cgx_links; 2288dcdf319SJerin Jacob nix->lbk_links = rsp->lbk_links; 2298dcdf319SJerin Jacob nix->sdp_links = rsp->sdp_links; 2308dcdf319SJerin Jacob nix->tx_link = rsp->tx_link; 2318dcdf319SJerin Jacob nix->nb_rx_queues = nb_rxq; 2328dcdf319SJerin Jacob nix->nb_tx_queues = nb_txq; 23378fb5efeSNithin Dabilpuram 234b77d160fSRahul Bhansali roc_idev_nix_rx_chan_set(roc_nix->port_id, rsp->rx_chan_base); 235b77d160fSRahul Bhansali 23678fb5efeSNithin Dabilpuram nix->rqs = plt_zmalloc(sizeof(struct roc_nix_rq *) * nb_rxq, 0); 23778fb5efeSNithin Dabilpuram if (!nix->rqs) { 23878fb5efeSNithin Dabilpuram rc = -ENOMEM; 23978fb5efeSNithin Dabilpuram goto fail; 24078fb5efeSNithin Dabilpuram } 24178fb5efeSNithin Dabilpuram 2428dcdf319SJerin Jacob nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0); 24344a9307cSRakesh Kudurumalla if (!nix->sqs) { 24444a9307cSRakesh Kudurumalla rc = -ENOMEM; 24544a9307cSRakesh Kudurumalla goto fail; 24644a9307cSRakesh Kudurumalla } 247af75aac7SGowrishankar Muthukrishnan 248af75aac7SGowrishankar Muthukrishnan nix_tel_node_add(roc_nix); 2498dcdf319SJerin Jacob fail: 25044a9307cSRakesh Kudurumalla mbox_put(mbox); 2518dcdf319SJerin Jacob return rc; 2528dcdf319SJerin Jacob } 2538dcdf319SJerin Jacob 2548dcdf319SJerin Jacob int 2558dcdf319SJerin Jacob roc_nix_lf_free(struct roc_nix *roc_nix) 2568dcdf319SJerin Jacob { 2578dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 25844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 2598dcdf319SJerin Jacob struct nix_lf_free_req *req; 2608dcdf319SJerin Jacob struct ndc_sync_op *ndc_req; 2618dcdf319SJerin Jacob int rc = -ENOSPC; 2628dcdf319SJerin Jacob 26378fb5efeSNithin Dabilpuram plt_free(nix->rqs); 2648dcdf319SJerin Jacob plt_free(nix->sqs); 26578fb5efeSNithin Dabilpuram nix->rqs = NULL; 2668dcdf319SJerin Jacob nix->sqs = NULL; 2678dcdf319SJerin Jacob 2688dcdf319SJerin Jacob /* Sync NDC-NIX for LF */ 2698dcdf319SJerin Jacob ndc_req = mbox_alloc_msg_ndc_sync_op(mbox); 2708dcdf319SJerin Jacob if (ndc_req == NULL) 27144a9307cSRakesh Kudurumalla goto exit; 2728dcdf319SJerin Jacob ndc_req->nix_lf_tx_sync = 1; 2738dcdf319SJerin Jacob ndc_req->nix_lf_rx_sync = 1; 2748dcdf319SJerin Jacob rc = mbox_process(mbox); 2758dcdf319SJerin Jacob if (rc) 2768dcdf319SJerin Jacob plt_err("Error on NDC-NIX-[TX, RX] LF sync, rc %d", rc); 2778dcdf319SJerin Jacob 2788dcdf319SJerin Jacob req = mbox_alloc_msg_nix_lf_free(mbox); 27944a9307cSRakesh Kudurumalla if (req == NULL) { 28044a9307cSRakesh Kudurumalla rc = -ENOSPC; 28144a9307cSRakesh Kudurumalla goto exit; 28244a9307cSRakesh Kudurumalla } 2838dcdf319SJerin Jacob /* Let AF driver free all this nix lf's 2848dcdf319SJerin Jacob * NPC entries allocated using NPC MBOX. 2858dcdf319SJerin Jacob */ 2868dcdf319SJerin Jacob req->flags = 0; 2878dcdf319SJerin Jacob 28844a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 28944a9307cSRakesh Kudurumalla exit: 29044a9307cSRakesh Kudurumalla mbox_put(mbox); 29144a9307cSRakesh Kudurumalla return rc; 2928dcdf319SJerin Jacob } 2938dcdf319SJerin Jacob 2948dcdf319SJerin Jacob static inline int 2958dcdf319SJerin Jacob nix_lf_attach(struct dev *dev) 2968dcdf319SJerin Jacob { 29744a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 2988dcdf319SJerin Jacob struct rsrc_attach_req *req; 2998dcdf319SJerin Jacob int rc = -ENOSPC; 3008dcdf319SJerin Jacob 3018dcdf319SJerin Jacob /* Attach NIX(lf) */ 3028dcdf319SJerin Jacob req = mbox_alloc_msg_attach_resources(mbox); 3038dcdf319SJerin Jacob if (req == NULL) 30444a9307cSRakesh Kudurumalla goto exit; 3058dcdf319SJerin Jacob req->modify = true; 3068dcdf319SJerin Jacob req->nixlf = true; 3078dcdf319SJerin Jacob 30844a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 30944a9307cSRakesh Kudurumalla exit: 31044a9307cSRakesh Kudurumalla mbox_put(mbox); 31144a9307cSRakesh Kudurumalla return rc; 3128dcdf319SJerin Jacob } 3138dcdf319SJerin Jacob 3148dcdf319SJerin Jacob static inline int 3158dcdf319SJerin Jacob nix_lf_get_msix_offset(struct dev *dev, struct nix *nix) 3168dcdf319SJerin Jacob { 3178dcdf319SJerin Jacob struct msix_offset_rsp *msix_rsp; 31844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 3198dcdf319SJerin Jacob int rc; 3208dcdf319SJerin Jacob 3218dcdf319SJerin Jacob /* Get MSIX vector offsets */ 3228dcdf319SJerin Jacob mbox_alloc_msg_msix_offset(mbox); 3238dcdf319SJerin Jacob rc = mbox_process_msg(mbox, (void *)&msix_rsp); 3248dcdf319SJerin Jacob if (rc == 0) 3258dcdf319SJerin Jacob nix->msixoff = msix_rsp->nix_msixoff; 3268dcdf319SJerin Jacob 32744a9307cSRakesh Kudurumalla mbox_put(mbox); 3288dcdf319SJerin Jacob return rc; 3298dcdf319SJerin Jacob } 3308dcdf319SJerin Jacob 3318dcdf319SJerin Jacob static inline int 3328dcdf319SJerin Jacob nix_lf_detach(struct nix *nix) 3338dcdf319SJerin Jacob { 33444a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 3358dcdf319SJerin Jacob struct rsrc_detach_req *req; 3368dcdf319SJerin Jacob int rc = -ENOSPC; 3378dcdf319SJerin Jacob 3388dcdf319SJerin Jacob req = mbox_alloc_msg_detach_resources(mbox); 3398dcdf319SJerin Jacob if (req == NULL) 34044a9307cSRakesh Kudurumalla goto exit; 3418dcdf319SJerin Jacob req->partial = true; 3428dcdf319SJerin Jacob req->nixlf = true; 3438dcdf319SJerin Jacob 34444a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 34544a9307cSRakesh Kudurumalla exit: 34644a9307cSRakesh Kudurumalla mbox_put(mbox); 34744a9307cSRakesh Kudurumalla return rc; 3488dcdf319SJerin Jacob } 3498dcdf319SJerin Jacob 3508dcdf319SJerin Jacob static int 3518dcdf319SJerin Jacob roc_nix_get_hw_info(struct roc_nix *roc_nix) 3528dcdf319SJerin Jacob { 3538dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 35444a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 3558dcdf319SJerin Jacob struct nix_hw_info *hw_info; 3568dcdf319SJerin Jacob int rc; 3578dcdf319SJerin Jacob 3588dcdf319SJerin Jacob mbox_alloc_msg_nix_get_hw_info(mbox); 3598dcdf319SJerin Jacob rc = mbox_process_msg(mbox, (void *)&hw_info); 360902a4c02SSatha Rao if (rc == 0) { 3618dcdf319SJerin Jacob nix->vwqe_interval = hw_info->vwqe_delay; 36254ec7c87SHarman Kalra if (nix->lbk_link || nix->esw_link) 363902a4c02SSatha Rao roc_nix->dwrr_mtu = hw_info->lbk_dwrr_mtu; 364902a4c02SSatha Rao else if (nix->sdp_link) 365902a4c02SSatha Rao roc_nix->dwrr_mtu = hw_info->sdp_dwrr_mtu; 366902a4c02SSatha Rao else 367902a4c02SSatha Rao roc_nix->dwrr_mtu = hw_info->rpm_dwrr_mtu; 368902a4c02SSatha Rao } 3698dcdf319SJerin Jacob 37044a9307cSRakesh Kudurumalla mbox_put(mbox); 3718dcdf319SJerin Jacob return rc; 3728dcdf319SJerin Jacob } 3738dcdf319SJerin Jacob 3748dcdf319SJerin Jacob static void 3758dcdf319SJerin Jacob sdp_lbk_id_update(struct plt_pci_device *pci_dev, struct nix *nix) 3768dcdf319SJerin Jacob { 3778dcdf319SJerin Jacob nix->sdp_link = false; 3788dcdf319SJerin Jacob nix->lbk_link = false; 37954ec7c87SHarman Kalra nix->esw_link = false; 3808dcdf319SJerin Jacob 3818dcdf319SJerin Jacob /* Update SDP/LBK link based on PCI device id */ 3828dcdf319SJerin Jacob switch (pci_dev->id.device_id) { 3838dcdf319SJerin Jacob case PCI_DEVID_CNXK_RVU_SDP_PF: 3848dcdf319SJerin Jacob case PCI_DEVID_CNXK_RVU_SDP_VF: 3858dcdf319SJerin Jacob nix->sdp_link = true; 3868dcdf319SJerin Jacob break; 3878dcdf319SJerin Jacob case PCI_DEVID_CNXK_RVU_AF_VF: 3888dcdf319SJerin Jacob nix->lbk_link = true; 3898dcdf319SJerin Jacob break; 39054ec7c87SHarman Kalra case PCI_DEVID_CNXK_RVU_ESWITCH_VF: 39154ec7c87SHarman Kalra nix->esw_link = true; 39254ec7c87SHarman Kalra break; 3938dcdf319SJerin Jacob default: 3948dcdf319SJerin Jacob break; 3958dcdf319SJerin Jacob } 3968dcdf319SJerin Jacob } 3978dcdf319SJerin Jacob 39838b177feSNithin Dabilpuram uint64_t 3998dcdf319SJerin Jacob nix_get_blkaddr(struct dev *dev) 4008dcdf319SJerin Jacob { 401*9a01217eSSatha Rao uint64_t blkaddr; 4028dcdf319SJerin Jacob uint64_t reg; 4038dcdf319SJerin Jacob 4048dcdf319SJerin Jacob /* Reading the discovery register to know which NIX is the LF 4058dcdf319SJerin Jacob * attached to. 4068dcdf319SJerin Jacob */ 407*9a01217eSSatha Rao if (roc_model_is_cn9k() || roc_model_is_cn10k()) { 408*9a01217eSSatha Rao reg = plt_read64(dev->bar2 + RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_NIX0)); 409*9a01217eSSatha Rao blkaddr = reg & 0x1FFULL ? RVU_BLOCK_ADDR_NIX0 : RVU_BLOCK_ADDR_NIX1; 410*9a01217eSSatha Rao } else { 411*9a01217eSSatha Rao reg = plt_read64(dev->bar2 + RVU_PF_DISC); 412*9a01217eSSatha Rao blkaddr = reg & BIT_ULL(RVU_BLOCK_ADDR_NIX0) ? RVU_BLOCK_ADDR_NIX0 : 413*9a01217eSSatha Rao RVU_BLOCK_ADDR_NIX1; 414*9a01217eSSatha Rao blkaddr = RVU_BLOCK_ADDR_NIX0; 415*9a01217eSSatha Rao } 416*9a01217eSSatha Rao return blkaddr; 4178dcdf319SJerin Jacob } 4188dcdf319SJerin Jacob 4198dcdf319SJerin Jacob int 4208dcdf319SJerin Jacob roc_nix_dev_init(struct roc_nix *roc_nix) 4218dcdf319SJerin Jacob { 4228dcdf319SJerin Jacob enum roc_nix_rss_reta_sz reta_sz; 4238dcdf319SJerin Jacob struct plt_pci_device *pci_dev; 424794a9c84SGowrishankar Muthukrishnan struct roc_nix_list *nix_list; 4258dcdf319SJerin Jacob uint16_t max_sqb_count; 4268dcdf319SJerin Jacob uint64_t blkaddr; 4278dcdf319SJerin Jacob struct dev *dev; 4288dcdf319SJerin Jacob struct nix *nix; 4298dcdf319SJerin Jacob int rc; 4308dcdf319SJerin Jacob 4318dcdf319SJerin Jacob if (roc_nix == NULL || roc_nix->pci_dev == NULL) 4328dcdf319SJerin Jacob return NIX_ERR_PARAM; 4338dcdf319SJerin Jacob 4348dcdf319SJerin Jacob reta_sz = roc_nix->reta_sz; 4358dcdf319SJerin Jacob if (reta_sz != 0 && reta_sz != 64 && reta_sz != 128 && reta_sz != 256) 4368dcdf319SJerin Jacob return NIX_ERR_PARAM; 4378dcdf319SJerin Jacob 4388dcdf319SJerin Jacob if (reta_sz == 0) 4398dcdf319SJerin Jacob reta_sz = ROC_NIX_RSS_RETA_SZ_64; 4408dcdf319SJerin Jacob 4418dcdf319SJerin Jacob max_sqb_count = roc_nix->max_sqb_count; 4428dcdf319SJerin Jacob max_sqb_count = PLT_MIN(max_sqb_count, NIX_MAX_SQB); 4438dcdf319SJerin Jacob max_sqb_count = PLT_MAX(max_sqb_count, NIX_MIN_SQB); 4448dcdf319SJerin Jacob roc_nix->max_sqb_count = max_sqb_count; 4458dcdf319SJerin Jacob 4468dcdf319SJerin Jacob PLT_STATIC_ASSERT(sizeof(struct nix) <= ROC_NIX_MEM_SZ); 4478dcdf319SJerin Jacob nix = roc_nix_to_nix_priv(roc_nix); 4488dcdf319SJerin Jacob pci_dev = roc_nix->pci_dev; 4498dcdf319SJerin Jacob dev = &nix->dev; 450794a9c84SGowrishankar Muthukrishnan 451794a9c84SGowrishankar Muthukrishnan nix_list = roc_idev_nix_list_get(); 452794a9c84SGowrishankar Muthukrishnan if (nix_list == NULL) 453794a9c84SGowrishankar Muthukrishnan return -EINVAL; 454794a9c84SGowrishankar Muthukrishnan 455794a9c84SGowrishankar Muthukrishnan TAILQ_INSERT_TAIL(nix_list, roc_nix, next); 4568dcdf319SJerin Jacob 4578dcdf319SJerin Jacob if (nix->dev.drv_inited) 4588dcdf319SJerin Jacob return 0; 4598dcdf319SJerin Jacob 4608dcdf319SJerin Jacob if (dev->mbox_active) 4618dcdf319SJerin Jacob goto skip_dev_init; 4628dcdf319SJerin Jacob 4638dcdf319SJerin Jacob memset(nix, 0, sizeof(*nix)); 464ec7c2f5aSShijith Thotton 465ec7c2f5aSShijith Thotton /* Since 0 is a valid BPID, use -1 to represent invalid value. */ 466ec7c2f5aSShijith Thotton memset(nix->bpid, -1, sizeof(nix->bpid)); 467ec7c2f5aSShijith Thotton 4688dcdf319SJerin Jacob /* Initialize device */ 4698dcdf319SJerin Jacob rc = dev_init(dev, pci_dev); 4708dcdf319SJerin Jacob if (rc) { 4718dcdf319SJerin Jacob plt_err("Failed to init roc device"); 4728dcdf319SJerin Jacob goto fail; 4738dcdf319SJerin Jacob } 4748dcdf319SJerin Jacob 4758dcdf319SJerin Jacob skip_dev_init: 4768dcdf319SJerin Jacob dev->roc_nix = roc_nix; 4778dcdf319SJerin Jacob 4788dcdf319SJerin Jacob nix->lmt_base = dev->lmt_base; 4798dcdf319SJerin Jacob /* Expose base LMT line address for 4808dcdf319SJerin Jacob * "Per Core LMT line" mode. 4818dcdf319SJerin Jacob */ 4828dcdf319SJerin Jacob roc_nix->lmt_base = dev->lmt_base; 4838dcdf319SJerin Jacob 4848dcdf319SJerin Jacob /* Attach NIX LF */ 4858dcdf319SJerin Jacob rc = nix_lf_attach(dev); 4868dcdf319SJerin Jacob if (rc) 4878dcdf319SJerin Jacob goto dev_fini; 4888dcdf319SJerin Jacob 4898dcdf319SJerin Jacob blkaddr = nix_get_blkaddr(dev); 4908dcdf319SJerin Jacob nix->is_nix1 = (blkaddr == RVU_BLOCK_ADDR_NIX1); 4918dcdf319SJerin Jacob 4928dcdf319SJerin Jacob /* Calculating base address based on which NIX block LF 4938dcdf319SJerin Jacob * is attached to. 4948dcdf319SJerin Jacob */ 4958dcdf319SJerin Jacob nix->base = dev->bar2 + (blkaddr << 20); 4968dcdf319SJerin Jacob 4978dcdf319SJerin Jacob /* Get NIX MSIX offset */ 4988dcdf319SJerin Jacob rc = nix_lf_get_msix_offset(dev, nix); 4998dcdf319SJerin Jacob if (rc) 5008dcdf319SJerin Jacob goto lf_detach; 5018dcdf319SJerin Jacob 5028dcdf319SJerin Jacob /* Update nix context */ 5038dcdf319SJerin Jacob sdp_lbk_id_update(pci_dev, nix); 5048dcdf319SJerin Jacob nix->pci_dev = pci_dev; 5058dcdf319SJerin Jacob nix->reta_sz = reta_sz; 506cc9f534fSNithin Dabilpuram nix->mtu = roc_nix_max_pkt_len(roc_nix); 5073c1eae0fSSrujana Challa nix->dmac_flt_idx = -1; 5088dcdf319SJerin Jacob 509f6d567b0SJerin Jacob /* Register error and ras interrupts */ 510f6d567b0SJerin Jacob rc = nix_register_irqs(nix); 511f6d567b0SJerin Jacob if (rc) 512f6d567b0SJerin Jacob goto lf_detach; 513f6d567b0SJerin Jacob 51405d727e8SNithin Dabilpuram rc = nix_tm_conf_init(roc_nix); 51505d727e8SNithin Dabilpuram if (rc) 51605d727e8SNithin Dabilpuram goto unregister_irqs; 51705d727e8SNithin Dabilpuram 5188dcdf319SJerin Jacob /* Get NIX HW info */ 5198dcdf319SJerin Jacob roc_nix_get_hw_info(roc_nix); 5208dcdf319SJerin Jacob nix->dev.drv_inited = true; 5218dcdf319SJerin Jacob 5228dcdf319SJerin Jacob return 0; 52305d727e8SNithin Dabilpuram unregister_irqs: 52405d727e8SNithin Dabilpuram nix_unregister_irqs(nix); 5258dcdf319SJerin Jacob lf_detach: 5268dcdf319SJerin Jacob nix_lf_detach(nix); 5278dcdf319SJerin Jacob dev_fini: 5288dcdf319SJerin Jacob rc |= dev_fini(dev, pci_dev); 5298dcdf319SJerin Jacob fail: 530af75aac7SGowrishankar Muthukrishnan nix_tel_node_del(roc_nix); 5318dcdf319SJerin Jacob return rc; 5328dcdf319SJerin Jacob } 5338dcdf319SJerin Jacob 5348dcdf319SJerin Jacob int 5358dcdf319SJerin Jacob roc_nix_dev_fini(struct roc_nix *roc_nix) 5368dcdf319SJerin Jacob { 5378dcdf319SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 5388dcdf319SJerin Jacob int rc = 0; 5398dcdf319SJerin Jacob 5408dcdf319SJerin Jacob if (nix == NULL) 5418dcdf319SJerin Jacob return NIX_ERR_PARAM; 5428dcdf319SJerin Jacob 5438dcdf319SJerin Jacob if (!nix->dev.drv_inited) 5448dcdf319SJerin Jacob goto fini; 5458dcdf319SJerin Jacob 54605d727e8SNithin Dabilpuram nix_tm_conf_fini(roc_nix); 547f6d567b0SJerin Jacob nix_unregister_irqs(nix); 548f6d567b0SJerin Jacob 5498dcdf319SJerin Jacob rc = nix_lf_detach(nix); 5508dcdf319SJerin Jacob nix->dev.drv_inited = false; 5518dcdf319SJerin Jacob fini: 5528dcdf319SJerin Jacob rc |= dev_fini(&nix->dev, nix->pci_dev); 5538dcdf319SJerin Jacob return rc; 5548dcdf319SJerin Jacob } 555162c77c1SHarman Kalra 556162c77c1SHarman Kalra int 557162c77c1SHarman Kalra roc_nix_max_rep_count(struct roc_nix *roc_nix) 558162c77c1SHarman Kalra { 559162c77c1SHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 560162c77c1SHarman Kalra struct dev *dev = &nix->dev; 561162c77c1SHarman Kalra struct mbox *mbox = mbox_get(dev->mbox); 562162c77c1SHarman Kalra struct get_rep_cnt_rsp *rsp; 563162c77c1SHarman Kalra struct msg_req *req; 564162c77c1SHarman Kalra int rc, i; 565162c77c1SHarman Kalra 566162c77c1SHarman Kalra req = mbox_alloc_msg_get_rep_cnt(mbox); 567162c77c1SHarman Kalra if (!req) { 568162c77c1SHarman Kalra rc = -ENOSPC; 569162c77c1SHarman Kalra goto exit; 570162c77c1SHarman Kalra } 571162c77c1SHarman Kalra 572162c77c1SHarman Kalra req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix); 573162c77c1SHarman Kalra 574162c77c1SHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 575162c77c1SHarman Kalra if (rc) 576162c77c1SHarman Kalra goto exit; 577162c77c1SHarman Kalra 578162c77c1SHarman Kalra roc_nix->rep_cnt = rsp->rep_cnt; 579162c77c1SHarman Kalra for (i = 0; i < rsp->rep_cnt; i++) 580162c77c1SHarman Kalra roc_nix->rep_pfvf_map[i] = rsp->rep_pfvf_map[i]; 581162c77c1SHarman Kalra 582162c77c1SHarman Kalra exit: 583162c77c1SHarman Kalra mbox_put(mbox); 584162c77c1SHarman Kalra return rc; 585162c77c1SHarman Kalra } 586