1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
9 roc_nix_is_lbk(struct roc_nix *roc_nix)
11 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
17 roc_nix_get_base_chan(struct roc_nix *roc_nix)
19 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
21 return nix->rx_chan_base;
25 roc_nix_get_vwqe_interval(struct roc_nix *roc_nix)
27 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
29 return nix->vwqe_interval;
33 roc_nix_is_sdp(struct roc_nix *roc_nix)
35 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
41 roc_nix_is_pf(struct roc_nix *roc_nix)
43 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
45 return !dev_is_vf(&nix->dev);
49 roc_nix_get_pf(struct roc_nix *roc_nix)
51 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
52 struct dev *dev = &nix->dev;
54 return dev_get_pf(dev->pf_func);
58 roc_nix_get_vf(struct roc_nix *roc_nix)
60 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
61 struct dev *dev = &nix->dev;
63 return dev_get_vf(dev->pf_func);
67 roc_nix_is_vf_or_sdp(struct roc_nix *roc_nix)
69 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
71 return (dev_is_vf(&nix->dev) != 0) || roc_nix_is_sdp(roc_nix);
75 roc_nix_get_pf_func(struct roc_nix *roc_nix)
77 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
78 struct dev *dev = &nix->dev;
84 roc_nix_lf_inl_ipsec_cfg(struct roc_nix *roc_nix, struct roc_nix_ipsec_cfg *cfg,
87 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
88 struct nix_inline_ipsec_lf_cfg *lf_cfg;
89 struct mbox *mbox = (&nix->dev)->mbox;
91 lf_cfg = mbox_alloc_msg_nix_inline_ipsec_lf_cfg(mbox);
97 lf_cfg->sa_base_addr = cfg->iova;
98 lf_cfg->ipsec_cfg1.sa_idx_w = plt_log2_u32(cfg->max_sa);
99 lf_cfg->ipsec_cfg0.lenm1_max = roc_nix_max_pkt_len(roc_nix) - 1;
100 lf_cfg->ipsec_cfg1.sa_idx_max = cfg->max_sa - 1;
101 lf_cfg->ipsec_cfg0.sa_pow2_size = plt_log2_u32(cfg->sa_size);
102 lf_cfg->ipsec_cfg0.tag_const = cfg->tag_const;
103 lf_cfg->ipsec_cfg0.tt = cfg->tt;
108 return mbox_process(mbox);
112 roc_nix_max_pkt_len(struct roc_nix *roc_nix)
114 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
116 if (roc_nix_is_sdp(roc_nix))
117 return NIX_SDP_MAX_HW_FRS;
119 if (roc_model_is_cn9k())
120 return NIX_CN9K_MAX_HW_FRS;
123 return NIX_LBK_MAX_HW_FRS;
125 return NIX_RPM_MAX_HW_FRS;
129 roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq,
132 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
133 struct mbox *mbox = (&nix->dev)->mbox;
134 struct nix_lf_alloc_req *req;
135 struct nix_lf_alloc_rsp *rsp;
138 req = mbox_alloc_msg_nix_lf_alloc(mbox);
141 req->rq_cnt = nb_rxq;
142 req->sq_cnt = nb_txq;
143 req->cq_cnt = nb_rxq;
144 /* XQESZ can be W64 or W16 */
145 req->xqe_sz = NIX_XQESZ_W16;
146 req->rss_sz = nix->reta_sz;
147 req->rss_grps = ROC_NIX_RSS_GRPS;
148 req->npa_func = idev_npa_pffunc_get();
149 req->sso_func = idev_sso_pffunc_get();
150 req->rx_cfg = rx_cfg;
151 if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop &&
152 roc_model_is_cn98xx())
153 req->flags = NIX_LF_LBK_BLK_SEL;
155 if (!roc_nix->rss_tag_as_xor)
156 req->flags |= NIX_LF_RSS_TAG_LSB_AS_ADDER;
158 rc = mbox_process_msg(mbox, (void *)&rsp);
162 nix->sqb_size = rsp->sqb_size;
163 nix->tx_chan_base = rsp->tx_chan_base;
164 nix->rx_chan_base = rsp->rx_chan_base;
165 if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop)
166 nix->tx_chan_base = rsp->rx_chan_base;
167 nix->rx_chan_cnt = rsp->rx_chan_cnt;
168 nix->tx_chan_cnt = rsp->tx_chan_cnt;
169 nix->lso_tsov4_idx = rsp->lso_tsov4_idx;
170 nix->lso_tsov6_idx = rsp->lso_tsov6_idx;
171 nix->lf_tx_stats = rsp->lf_tx_stats;
172 nix->lf_rx_stats = rsp->lf_rx_stats;
173 nix->cints = rsp->cints;
174 roc_nix->cints = rsp->cints;
175 nix->qints = rsp->qints;
176 nix->ptp_en = rsp->hw_rx_tstamp_en;
177 roc_nix->rx_ptp_ena = rsp->hw_rx_tstamp_en;
178 nix->cgx_links = rsp->cgx_links;
179 nix->lbk_links = rsp->lbk_links;
180 nix->sdp_links = rsp->sdp_links;
181 nix->tx_link = rsp->tx_link;
182 nix->nb_rx_queues = nb_rxq;
183 nix->nb_tx_queues = nb_txq;
184 nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0);
192 roc_nix_lf_free(struct roc_nix *roc_nix)
194 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
195 struct mbox *mbox = (&nix->dev)->mbox;
196 struct nix_lf_free_req *req;
197 struct ndc_sync_op *ndc_req;
203 /* Sync NDC-NIX for LF */
204 ndc_req = mbox_alloc_msg_ndc_sync_op(mbox);
207 ndc_req->nix_lf_tx_sync = 1;
208 ndc_req->nix_lf_rx_sync = 1;
209 rc = mbox_process(mbox);
211 plt_err("Error on NDC-NIX-[TX, RX] LF sync, rc %d", rc);
213 req = mbox_alloc_msg_nix_lf_free(mbox);
216 /* Let AF driver free all this nix lf's
217 * NPC entries allocated using NPC MBOX.
221 return mbox_process(mbox);
225 nix_lf_attach(struct dev *dev)
227 struct mbox *mbox = dev->mbox;
228 struct rsrc_attach_req *req;
232 req = mbox_alloc_msg_attach_resources(mbox);
238 return mbox_process(mbox);
242 nix_lf_get_msix_offset(struct dev *dev, struct nix *nix)
244 struct msix_offset_rsp *msix_rsp;
245 struct mbox *mbox = dev->mbox;
248 /* Get MSIX vector offsets */
249 mbox_alloc_msg_msix_offset(mbox);
250 rc = mbox_process_msg(mbox, (void *)&msix_rsp);
252 nix->msixoff = msix_rsp->nix_msixoff;
258 nix_lf_detach(struct nix *nix)
260 struct mbox *mbox = (&nix->dev)->mbox;
261 struct rsrc_detach_req *req;
264 req = mbox_alloc_msg_detach_resources(mbox);
270 return mbox_process(mbox);
274 roc_nix_get_hw_info(struct roc_nix *roc_nix)
276 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
277 struct mbox *mbox = (&nix->dev)->mbox;
278 struct nix_hw_info *hw_info;
281 mbox_alloc_msg_nix_get_hw_info(mbox);
282 rc = mbox_process_msg(mbox, (void *)&hw_info);
284 nix->vwqe_interval = hw_info->vwqe_delay;
290 sdp_lbk_id_update(struct plt_pci_device *pci_dev, struct nix *nix)
292 nix->sdp_link = false;
293 nix->lbk_link = false;
295 /* Update SDP/LBK link based on PCI device id */
296 switch (pci_dev->id.device_id) {
297 case PCI_DEVID_CNXK_RVU_SDP_PF:
298 case PCI_DEVID_CNXK_RVU_SDP_VF:
299 nix->sdp_link = true;
301 case PCI_DEVID_CNXK_RVU_AF_VF:
302 nix->lbk_link = true;
310 nix_get_blkaddr(struct dev *dev)
314 /* Reading the discovery register to know which NIX is the LF
317 reg = plt_read64(dev->bar2 +
318 RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_NIX0));
320 return reg & 0x1FFULL ? RVU_BLOCK_ADDR_NIX0 : RVU_BLOCK_ADDR_NIX1;
324 roc_nix_dev_init(struct roc_nix *roc_nix)
326 enum roc_nix_rss_reta_sz reta_sz;
327 struct plt_pci_device *pci_dev;
328 uint16_t max_sqb_count;
334 if (roc_nix == NULL || roc_nix->pci_dev == NULL)
335 return NIX_ERR_PARAM;
337 reta_sz = roc_nix->reta_sz;
338 if (reta_sz != 0 && reta_sz != 64 && reta_sz != 128 && reta_sz != 256)
339 return NIX_ERR_PARAM;
342 reta_sz = ROC_NIX_RSS_RETA_SZ_64;
344 max_sqb_count = roc_nix->max_sqb_count;
345 max_sqb_count = PLT_MIN(max_sqb_count, NIX_MAX_SQB);
346 max_sqb_count = PLT_MAX(max_sqb_count, NIX_MIN_SQB);
347 roc_nix->max_sqb_count = max_sqb_count;
349 PLT_STATIC_ASSERT(sizeof(struct nix) <= ROC_NIX_MEM_SZ);
350 nix = roc_nix_to_nix_priv(roc_nix);
351 pci_dev = roc_nix->pci_dev;
354 if (nix->dev.drv_inited)
357 if (dev->mbox_active)
360 memset(nix, 0, sizeof(*nix));
361 /* Initialize device */
362 rc = dev_init(dev, pci_dev);
364 plt_err("Failed to init roc device");
369 dev->roc_nix = roc_nix;
371 nix->lmt_base = dev->lmt_base;
372 /* Expose base LMT line address for
373 * "Per Core LMT line" mode.
375 roc_nix->lmt_base = dev->lmt_base;
378 rc = nix_lf_attach(dev);
382 blkaddr = nix_get_blkaddr(dev);
383 nix->is_nix1 = (blkaddr == RVU_BLOCK_ADDR_NIX1);
385 /* Calculating base address based on which NIX block LF
388 nix->base = dev->bar2 + (blkaddr << 20);
390 /* Get NIX MSIX offset */
391 rc = nix_lf_get_msix_offset(dev, nix);
395 /* Update nix context */
396 sdp_lbk_id_update(pci_dev, nix);
397 nix->pci_dev = pci_dev;
398 nix->reta_sz = reta_sz;
399 nix->mtu = ROC_NIX_DEFAULT_HW_FRS;
401 /* Register error and ras interrupts */
402 rc = nix_register_irqs(nix);
406 rc = nix_tm_conf_init(roc_nix);
408 goto unregister_irqs;
410 /* Get NIX HW info */
411 roc_nix_get_hw_info(roc_nix);
412 nix->dev.drv_inited = true;
416 nix_unregister_irqs(nix);
420 rc |= dev_fini(dev, pci_dev);
426 roc_nix_dev_fini(struct roc_nix *roc_nix)
428 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
432 return NIX_ERR_PARAM;
434 if (!nix->dev.drv_inited)
437 nix_tm_conf_fini(roc_nix);
438 nix_unregister_irqs(nix);
440 rc = nix_lf_detach(nix);
441 nix->dev.drv_inited = false;
443 rc |= dev_fini(&nix->dev, nix->pci_dev);