1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
12 case TIM_AF_NO_RINGS_LEFT:
13 plt_err("Unable to allocate new TIM ring.");
15 case TIM_AF_INVALID_NPA_PF_FUNC:
16 plt_err("Invalid NPA pf func.");
18 case TIM_AF_INVALID_SSO_PF_FUNC:
19 plt_err("Invalid SSO pf func.");
21 case TIM_AF_RING_STILL_RUNNING:
22 plt_err("Ring busy.");
24 case TIM_AF_LF_INVALID:
25 plt_err("Invalid Ring id.");
27 case TIM_AF_CSIZE_NOT_ALIGNED:
28 plt_err("Chunk size specified needs to be multiple of 16.");
30 case TIM_AF_CSIZE_TOO_SMALL:
31 plt_err("Chunk size too small.");
33 case TIM_AF_CSIZE_TOO_BIG:
34 plt_err("Chunk size too big.");
36 case TIM_AF_INTERVAL_TOO_SMALL:
37 plt_err("Bucket traversal interval too small.");
39 case TIM_AF_INVALID_BIG_ENDIAN_VALUE:
40 plt_err("Invalid Big endian value.");
42 case TIM_AF_INVALID_CLOCK_SOURCE:
43 plt_err("Invalid Clock source specified.");
45 case TIM_AF_GPIO_CLK_SRC_NOT_ENABLED:
46 plt_err("GPIO clock source not enabled.");
48 case TIM_AF_INVALID_BSIZE:
49 plt_err("Invalid bucket size.");
51 case TIM_AF_INVALID_ENABLE_PERIODIC:
52 plt_err("Invalid bucket size.");
54 case TIM_AF_INVALID_ENABLE_DONTFREE:
55 plt_err("Invalid Don't free value.");
57 case TIM_AF_ENA_DONTFRE_NSET_PERIODIC:
58 plt_err("Don't free bit not set when periodic is enabled.");
60 case TIM_AF_RING_ALREADY_DISABLED:
61 plt_err("Ring already stopped");
64 plt_err("Unknown Error.");
69 roc_tim_lf_enable(struct roc_tim *roc_tim, uint8_t ring_id, uint64_t *start_tsc,
72 struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
73 struct tim_enable_rsp *rsp;
74 struct tim_ring_req *req;
77 req = mbox_alloc_msg_tim_enable_ring(dev->mbox);
82 rc = mbox_process_msg(dev->mbox, (void **)&rsp);
89 *cur_bkt = rsp->currentbucket;
91 *start_tsc = rsp->timestarted;
97 roc_tim_lf_disable(struct roc_tim *roc_tim, uint8_t ring_id)
99 struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
100 struct tim_ring_req *req;
103 req = mbox_alloc_msg_tim_disable_ring(dev->mbox);
108 rc = mbox_process(dev->mbox);
118 roc_tim_lf_base_get(struct roc_tim *roc_tim, uint8_t ring_id)
120 struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
122 return dev->bar2 + (RVU_BLOCK_ADDR_TIM << 20 | ring_id << 12);
126 roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id,
127 enum roc_tim_clk_src clk_src, uint8_t ena_periodic,
128 uint8_t ena_dfb, uint32_t bucket_sz, uint32_t chunk_sz,
131 struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
132 struct tim_config_req *req;
135 req = mbox_alloc_msg_tim_config_ring(dev->mbox);
139 req->bigendian = false;
140 req->bucketsize = bucket_sz;
141 req->chunksize = chunk_sz;
142 req->clocksource = clk_src;
143 req->enableperiodic = ena_periodic;
144 req->enabledontfreebuffer = ena_dfb;
145 req->interval = interval;
146 req->gpioedge = TIM_GPIO_LTOH_TRANS;
148 rc = mbox_process(dev->mbox);
158 roc_tim_lf_alloc(struct roc_tim *roc_tim, uint8_t ring_id, uint64_t *clk)
160 struct sso *sso = roc_sso_to_sso_priv(roc_tim->roc_sso);
161 struct tim_lf_alloc_req *req;
162 struct tim_lf_alloc_rsp *rsp;
163 struct dev *dev = &sso->dev;
166 req = mbox_alloc_msg_tim_lf_alloc(dev->mbox);
169 req->npa_pf_func = idev_npa_pffunc_get();
170 req->sso_pf_func = idev_sso_pffunc_get();
173 rc = mbox_process_msg(dev->mbox, (void **)&rsp);
180 *clk = rsp->tenns_clk;
186 roc_tim_lf_free(struct roc_tim *roc_tim, uint8_t ring_id)
188 struct sso *sso = roc_sso_to_sso_priv(roc_tim->roc_sso);
189 struct dev *dev = &sso->dev;
190 struct tim_ring_req *req;
193 req = mbox_alloc_msg_tim_lf_free(dev->mbox);
198 rc = mbox_process(dev->mbox);
208 roc_tim_init(struct roc_tim *roc_tim)
210 struct rsrc_attach_req *attach_req;
211 struct free_rsrcs_rsp *free_rsrc;
216 if (roc_tim == NULL || roc_tim->roc_sso == NULL)
217 return TIM_ERR_PARAM;
219 PLT_STATIC_ASSERT(sizeof(struct tim) <= TIM_MEM_SZ);
220 dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
221 nb_lfs = roc_tim->nb_lfs;
222 mbox_alloc_msg_free_rsrc_cnt(dev->mbox);
223 rc = mbox_process_msg(dev->mbox, (void *)&free_rsrc);
225 plt_err("Unable to get free rsrc count.");
229 if (nb_lfs && (free_rsrc->tim < nb_lfs)) {
230 plt_tim_dbg("Requested LFs : %d Available LFs : %d", nb_lfs,
235 attach_req = mbox_alloc_msg_attach_resources(dev->mbox);
236 if (attach_req == NULL)
238 attach_req->modify = true;
239 attach_req->timlfs = nb_lfs ? nb_lfs : free_rsrc->tim;
240 nb_lfs = attach_req->timlfs;
242 rc = mbox_process(dev->mbox);
244 plt_err("Unable to attach TIM LFs.");
252 roc_tim_fini(struct roc_tim *roc_tim)
254 struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev;
255 struct rsrc_detach_req *detach_req;
257 detach_req = mbox_alloc_msg_detach_resources(dev->mbox);
258 PLT_ASSERT(detach_req);
259 detach_req->partial = true;
260 detach_req->timlfs = true;
262 mbox_process(dev->mbox);