xref: /dpdk/drivers/common/cnxk/roc_nix.c (revision 9a01217e287197cfc2ac778edcec18d84056d244)
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