1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
9 cpt_get_msix_offset(struct dev *dev, struct msix_offset_rsp **msix_rsp)
11 struct mbox *mbox = dev->mbox;
14 /* Get MSIX vector offsets */
15 mbox_alloc_msg_msix_offset(mbox);
16 rc = mbox_process_msg(mbox, (void *)msix_rsp);
22 cpt_lfs_attach(struct dev *dev, uint8_t blkaddr, bool modify, uint16_t nb_lf)
24 struct mbox *mbox = dev->mbox;
25 struct rsrc_attach_req *req;
27 if (blkaddr != RVU_BLOCK_ADDR_CPT0 && blkaddr != RVU_BLOCK_ADDR_CPT1)
31 req = mbox_alloc_msg_attach_resources(mbox);
37 req->cpt_blkaddr = blkaddr;
39 return mbox_process(mbox);
43 cpt_lfs_detach(struct dev *dev)
45 struct mbox *mbox = dev->mbox;
46 struct rsrc_detach_req *req;
48 req = mbox_alloc_msg_detach_resources(mbox);
55 return mbox_process(mbox);
59 cpt_available_lfs_get(struct dev *dev, uint16_t *nb_lf)
61 struct mbox *mbox = dev->mbox;
62 struct free_rsrcs_rsp *rsp;
65 mbox_alloc_msg_free_rsrc_cnt(mbox);
67 rc = mbox_process_msg(mbox, (void *)&rsp);
76 cpt_lfs_alloc(struct dev *dev, uint8_t eng_grpmsk, uint8_t blkaddr,
79 struct cpt_lf_alloc_req_msg *req;
80 struct mbox *mbox = dev->mbox;
82 if (blkaddr != RVU_BLOCK_ADDR_CPT0 && blkaddr != RVU_BLOCK_ADDR_CPT1)
85 PLT_SET_USED(inl_dev_sso);
87 req = mbox_alloc_msg_cpt_lf_alloc(mbox);
89 req->sso_pf_func = idev_sso_pffunc_get();
90 req->eng_grpmsk = eng_grpmsk;
91 req->blkaddr = blkaddr;
93 return mbox_process(mbox);
97 cpt_lfs_free(struct dev *dev)
99 mbox_alloc_msg_cpt_lf_free(dev->mbox);
101 return mbox_process(dev->mbox);
105 cpt_hardware_caps_get(struct dev *dev, union cpt_eng_caps *hw_caps)
107 struct cpt_caps_rsp_msg *rsp;
110 mbox_alloc_msg_cpt_caps_get(dev->mbox);
112 ret = mbox_process_msg(dev->mbox, (void *)&rsp);
116 mbox_memcpy(hw_caps, rsp->eng_caps,
117 sizeof(union cpt_eng_caps) * CPT_MAX_ENG_TYPES);
123 roc_cpt_dev_configure(struct roc_cpt *roc_cpt, int nb_lf)
125 struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
126 uint8_t blkaddr = RVU_BLOCK_ADDR_CPT0;
127 struct msix_offset_rsp *rsp;
131 /* Request LF resources */
132 rc = cpt_lfs_attach(&cpt->dev, blkaddr, false, nb_lf);
136 eng_grpmsk = (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_AE]) |
137 (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_SE]) |
138 (1 << roc_cpt->eng_grp[CPT_ENG_TYPE_IE]);
140 rc = cpt_lfs_alloc(&cpt->dev, eng_grpmsk, blkaddr, false);
144 rc = cpt_get_msix_offset(&cpt->dev, &rsp);
148 for (i = 0; i < nb_lf; i++)
149 cpt->lf_msix_off[i] =
150 (cpt->lf_blkaddr[i] == RVU_BLOCK_ADDR_CPT1) ?
151 rsp->cpt1_lf_msixoff[i] :
152 rsp->cptlf_msixoff[i];
154 roc_cpt->nb_lf = nb_lf;
159 cpt_lfs_free(&cpt->dev);
161 cpt_lfs_detach(&cpt->dev);
166 cpt_get_blkaddr(struct dev *dev)
171 /* Reading the discovery register to know which CPT is the LF
172 * attached to. Assume CPT LF's of only one block are attached
176 off = RVU_VF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_CPT1);
178 off = RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_CPT1);
180 reg = plt_read64(dev->bar2 + off);
182 return reg & 0x1FFULL ? RVU_BLOCK_ADDR_CPT1 : RVU_BLOCK_ADDR_CPT0;
186 roc_cpt_dev_init(struct roc_cpt *roc_cpt)
188 struct plt_pci_device *pci_dev;
189 uint16_t nb_lf_avail;
194 if (roc_cpt == NULL || roc_cpt->pci_dev == NULL)
197 PLT_STATIC_ASSERT(sizeof(struct cpt) <= ROC_CPT_MEM_SZ);
199 cpt = roc_cpt_to_cpt_priv(roc_cpt);
200 memset(cpt, 0, sizeof(*cpt));
201 pci_dev = roc_cpt->pci_dev;
204 /* Initialize device */
205 rc = dev_init(dev, pci_dev);
207 plt_err("Failed to init roc device");
211 cpt->pci_dev = pci_dev;
212 roc_cpt->lmt_base = dev->lmt_base;
214 rc = cpt_hardware_caps_get(dev, roc_cpt->hw_caps);
216 plt_err("Could not determine hardware capabilities");
220 rc = cpt_available_lfs_get(&cpt->dev, &nb_lf_avail);
222 plt_err("Could not get available lfs");
226 /* Reserve 1 CPT LF for inline inbound */
227 nb_lf_avail = PLT_MIN(nb_lf_avail, ROC_CPT_MAX_LFS - 1);
229 roc_cpt->nb_lf_avail = nb_lf_avail;
231 dev->roc_cpt = roc_cpt;
233 /* Set it to idev if not already present */
234 if (!roc_idev_cpt_get())
235 roc_idev_cpt_set(roc_cpt);
244 roc_cpt_dev_fini(struct roc_cpt *roc_cpt)
246 struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
251 /* Remove idev references */
252 if (roc_idev_cpt_get() == roc_cpt)
253 roc_idev_cpt_set(NULL);
255 roc_cpt->nb_lf_avail = 0;
257 roc_cpt->lmt_base = 0;
259 return dev_fini(&cpt->dev, cpt->pci_dev);
263 roc_cpt_dev_clear(struct roc_cpt *roc_cpt)
265 struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
271 for (i = 0; i < roc_cpt->nb_lf; i++)
272 cpt->lf_msix_off[i] = 0;
276 cpt_lfs_free(&cpt->dev);
278 cpt_lfs_detach(&cpt->dev);
282 roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt, enum cpt_eng_type eng_type)
284 struct cpt *cpt = roc_cpt_to_cpt_priv(roc_cpt);
285 struct dev *dev = &cpt->dev;
286 struct cpt_eng_grp_req *req;
287 struct cpt_eng_grp_rsp *rsp;
290 req = mbox_alloc_msg_cpt_eng_grp_get(dev->mbox);
295 case CPT_ENG_TYPE_AE:
296 case CPT_ENG_TYPE_SE:
297 case CPT_ENG_TYPE_IE:
303 req->eng_type = eng_type;
304 ret = mbox_process_msg(dev->mbox, (void *)&rsp);
308 if (rsp->eng_grp_num > 8) {
309 plt_err("Invalid CPT engine group");
313 roc_cpt->eng_grp[eng_type] = rsp->eng_grp_num;
315 return rsp->eng_grp_num;