Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #include "roc_api.h"
6 : : #include "roc_priv.h"
7 : :
8 : : struct idev_cfg *
9 : 17 : idev_get_cfg(void)
10 : : {
11 : : static const char name[] = "roc_cn10k_intra_device_conf";
12 : : const struct plt_memzone *mz;
13 : : struct idev_cfg *idev;
14 : :
15 : 17 : mz = plt_memzone_lookup(name);
16 [ + + ]: 17 : if (mz != NULL)
17 : 16 : return mz->addr;
18 : :
19 : : /* Request for the first time */
20 : 1 : mz = plt_memzone_reserve_cache_align(name, sizeof(struct idev_cfg));
21 [ + - ]: 1 : if (mz != NULL) {
22 : 1 : idev = mz->addr;
23 : 1 : idev_set_defaults(idev);
24 : 1 : return idev;
25 : : }
26 : : return NULL;
27 : : }
28 : :
29 : : void
30 : 1 : idev_set_defaults(struct idev_cfg *idev)
31 : : {
32 : 1 : idev->sso_pf_func = 0;
33 : 1 : idev->npa = NULL;
34 : 1 : idev->npa_pf_func = 0;
35 : 1 : idev->max_pools = 128;
36 : 1 : idev->halo_ena = 0;
37 : 1 : idev->lmt_pf_func = 0;
38 : 1 : idev->lmt_base_addr = 0;
39 : 1 : idev->num_lmtlines = 0;
40 : 1 : idev->bphy = NULL;
41 : 1 : idev->cpt = NULL;
42 : 1 : TAILQ_INIT(&idev->rvu_lf_list);
43 : 1 : TAILQ_INIT(&idev->mcs_list);
44 : 1 : idev->nix_inl_dev = NULL;
45 : 1 : TAILQ_INIT(&idev->roc_nix_list);
46 : : plt_spinlock_init(&idev->nix_inl_dev_lock);
47 : : plt_spinlock_init(&idev->npa_dev_lock);
48 : 1 : __atomic_store_n(&idev->npa_refcnt, 0, __ATOMIC_RELEASE);
49 : 1 : }
50 : :
51 : : uint16_t
52 : 0 : idev_sso_pffunc_get(void)
53 : : {
54 : : struct idev_cfg *idev;
55 : : uint16_t sso_pf_func;
56 : :
57 : 0 : idev = idev_get_cfg();
58 : : sso_pf_func = 0;
59 [ # # ]: 0 : if (idev != NULL)
60 : 0 : sso_pf_func = __atomic_load_n(&idev->sso_pf_func,
61 : : __ATOMIC_ACQUIRE);
62 : :
63 : 0 : return sso_pf_func;
64 : : }
65 : :
66 : : void
67 : 0 : idev_sso_pffunc_set(uint16_t sso_pf_func)
68 : : {
69 : : struct idev_cfg *idev;
70 : :
71 : 0 : idev = idev_get_cfg();
72 [ # # ]: 0 : if (idev != NULL)
73 : 0 : __atomic_store_n(&idev->sso_pf_func, sso_pf_func,
74 : : __ATOMIC_RELEASE);
75 : 0 : }
76 : :
77 : : uint16_t
78 : 0 : idev_npa_pffunc_get(void)
79 : : {
80 : : struct idev_cfg *idev;
81 : : uint16_t npa_pf_func;
82 : :
83 : 0 : idev = idev_get_cfg();
84 : : npa_pf_func = 0;
85 [ # # ]: 0 : if (idev != NULL)
86 : 0 : npa_pf_func = idev->npa_pf_func;
87 : :
88 : 0 : return npa_pf_func;
89 : : }
90 : :
91 : : struct npa_lf *
92 : 11 : idev_npa_obj_get(void)
93 : : {
94 : : struct idev_cfg *idev;
95 : :
96 : 11 : idev = idev_get_cfg();
97 [ + - - + ]: 11 : if (idev && __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE))
98 : 0 : return idev->npa;
99 : :
100 : : return NULL;
101 : : }
102 : :
103 : : uint32_t
104 : 0 : roc_idev_npa_maxpools_get(void)
105 : : {
106 : : struct idev_cfg *idev;
107 : : uint32_t max_pools;
108 : :
109 : 0 : idev = idev_get_cfg();
110 : : max_pools = 0;
111 [ # # ]: 0 : if (idev != NULL)
112 : 0 : max_pools = idev->max_pools;
113 : :
114 : 0 : return max_pools;
115 : : }
116 : :
117 : : void
118 : 0 : roc_idev_npa_maxpools_set(uint32_t max_pools)
119 : : {
120 : : struct idev_cfg *idev;
121 : :
122 : 0 : idev = idev_get_cfg();
123 [ # # ]: 0 : if (idev != NULL)
124 : 0 : __atomic_store_n(&idev->max_pools, max_pools, __ATOMIC_RELEASE);
125 : 0 : }
126 : :
127 : : int
128 : 0 : roc_idev_npa_halo_ena_get(void)
129 : : {
130 : : struct idev_cfg *idev;
131 : : int halo_ena;
132 : :
133 : 0 : idev = idev_get_cfg();
134 : : halo_ena = 0;
135 [ # # ]: 0 : if (idev != NULL)
136 : 0 : halo_ena = __atomic_load_n(&idev->halo_ena, __ATOMIC_ACQUIRE);
137 : :
138 : 0 : return halo_ena;
139 : : }
140 : :
141 : : void
142 : 0 : roc_idev_npa_halo_ena_set(int halo_ena)
143 : : {
144 : : struct idev_cfg *idev;
145 : :
146 : 0 : idev = idev_get_cfg();
147 [ # # ]: 0 : if (idev != NULL)
148 : 0 : __atomic_store_n(&idev->halo_ena, halo_ena, __ATOMIC_RELEASE);
149 : 0 : }
150 : :
151 : : uint16_t
152 : 0 : idev_npa_lf_active(struct dev *dev)
153 : : {
154 : : struct idev_cfg *idev;
155 : :
156 : : /* Check if npalf is actively used on this dev */
157 : 0 : idev = idev_get_cfg();
158 [ # # # # : 0 : if (!idev || !idev->npa || idev->npa->mbox != dev->mbox)
# # ]
159 : : return 0;
160 : :
161 : 0 : return __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE);
162 : : }
163 : :
164 : : uint16_t
165 : 0 : idev_lmt_pffunc_get(void)
166 : : {
167 : : struct idev_cfg *idev;
168 : : uint16_t lmt_pf_func;
169 : :
170 : 0 : idev = idev_get_cfg();
171 : : lmt_pf_func = 0;
172 [ # # ]: 0 : if (idev != NULL)
173 : 0 : lmt_pf_func = idev->lmt_pf_func;
174 : :
175 : 0 : return lmt_pf_func;
176 : : }
177 : :
178 : : uint64_t
179 : 0 : roc_idev_lmt_base_addr_get(void)
180 : : {
181 : : uint64_t lmt_base_addr;
182 : : struct idev_cfg *idev;
183 : :
184 : 0 : idev = idev_get_cfg();
185 : : lmt_base_addr = 0;
186 [ # # ]: 0 : if (idev != NULL)
187 : 0 : lmt_base_addr = idev->lmt_base_addr;
188 : :
189 : 0 : return lmt_base_addr;
190 : : }
191 : :
192 : : uint16_t
193 : 0 : roc_idev_num_lmtlines_get(void)
194 : : {
195 : : struct idev_cfg *idev;
196 : : uint16_t num_lmtlines;
197 : :
198 : 0 : idev = idev_get_cfg();
199 : : num_lmtlines = 0;
200 [ # # ]: 0 : if (idev != NULL)
201 : 0 : num_lmtlines = idev->num_lmtlines;
202 : :
203 : 0 : return num_lmtlines;
204 : : }
205 : :
206 : : struct roc_cpt *
207 : 0 : roc_idev_cpt_get(void)
208 : : {
209 : 0 : struct idev_cfg *idev = idev_get_cfg();
210 : :
211 [ # # ]: 0 : if (idev != NULL)
212 : 0 : return idev->cpt;
213 : :
214 : : return NULL;
215 : : }
216 : :
217 : : struct roc_rvu_lf *
218 : 0 : roc_idev_rvu_lf_get(uint8_t rvu_lf_idx)
219 : : {
220 : 0 : struct idev_cfg *idev = idev_get_cfg();
221 : : struct roc_rvu_lf *rvu_lf = NULL;
222 : :
223 [ # # ]: 0 : if (idev != NULL) {
224 [ # # ]: 0 : TAILQ_FOREACH(rvu_lf, &idev->rvu_lf_list, next) {
225 [ # # ]: 0 : if (rvu_lf->idx == rvu_lf_idx)
226 : 0 : return rvu_lf;
227 : : }
228 : : }
229 : :
230 : : return NULL;
231 : : }
232 : :
233 : : void
234 : 0 : roc_idev_rvu_lf_set(struct roc_rvu_lf *rvu)
235 : : {
236 : 0 : struct idev_cfg *idev = idev_get_cfg();
237 : : struct roc_rvu_lf *rvu_lf_iter = NULL;
238 : :
239 [ # # ]: 0 : if (idev != NULL) {
240 [ # # ]: 0 : TAILQ_FOREACH(rvu_lf_iter, &idev->rvu_lf_list, next) {
241 [ # # ]: 0 : if (rvu_lf_iter->idx == rvu->idx)
242 : : return;
243 : : }
244 : 0 : TAILQ_INSERT_TAIL(&idev->rvu_lf_list, rvu, next);
245 : : }
246 : : }
247 : :
248 : : void
249 : 0 : roc_idev_rvu_lf_free(struct roc_rvu_lf *rvu)
250 : : {
251 : 0 : struct idev_cfg *idev = idev_get_cfg();
252 : : struct roc_rvu_lf *rvu_lf_iter = NULL;
253 : :
254 [ # # ]: 0 : if (idev != NULL) {
255 [ # # ]: 0 : TAILQ_FOREACH(rvu_lf_iter, &idev->rvu_lf_list, next) {
256 [ # # ]: 0 : if (rvu_lf_iter->idx == rvu->idx)
257 [ # # ]: 0 : TAILQ_REMOVE(&idev->rvu_lf_list, rvu, next);
258 : : }
259 : : }
260 : 0 : }
261 : :
262 : : struct roc_mcs *
263 : 0 : roc_idev_mcs_get(uint8_t mcs_idx)
264 : : {
265 : 0 : struct idev_cfg *idev = idev_get_cfg();
266 : : struct roc_mcs *mcs = NULL;
267 : :
268 [ # # ]: 0 : if (idev != NULL) {
269 [ # # ]: 0 : TAILQ_FOREACH(mcs, &idev->mcs_list, next) {
270 [ # # ]: 0 : if (mcs->idx == mcs_idx)
271 : 0 : return mcs;
272 : : }
273 : : }
274 : :
275 : : return NULL;
276 : : }
277 : :
278 : : void
279 : 0 : roc_idev_mcs_set(struct roc_mcs *mcs)
280 : : {
281 : 0 : struct idev_cfg *idev = idev_get_cfg();
282 : : struct roc_mcs *mcs_iter = NULL;
283 : :
284 [ # # ]: 0 : if (idev != NULL) {
285 [ # # ]: 0 : TAILQ_FOREACH(mcs_iter, &idev->mcs_list, next) {
286 [ # # ]: 0 : if (mcs_iter->idx == mcs->idx)
287 : : return;
288 : : }
289 : 0 : TAILQ_INSERT_TAIL(&idev->mcs_list, mcs, next);
290 : : }
291 : : }
292 : :
293 : : void
294 : 0 : roc_idev_mcs_free(struct roc_mcs *mcs)
295 : : {
296 : 0 : struct idev_cfg *idev = idev_get_cfg();
297 : : struct roc_mcs *mcs_iter = NULL;
298 : :
299 [ # # ]: 0 : if (idev != NULL) {
300 [ # # ]: 0 : TAILQ_FOREACH(mcs_iter, &idev->mcs_list, next) {
301 [ # # ]: 0 : if (mcs_iter->idx == mcs->idx)
302 [ # # ]: 0 : TAILQ_REMOVE(&idev->mcs_list, mcs, next);
303 : : }
304 : : }
305 : 0 : }
306 : :
307 : : uint64_t *
308 : 0 : roc_nix_inl_outb_ring_base_get(struct roc_nix *roc_nix)
309 : : {
310 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
311 : 0 : struct idev_cfg *idev = idev_get_cfg();
312 : : struct nix_inl_dev *inl_dev;
313 : :
314 [ # # # # ]: 0 : if (!idev || !idev->nix_inl_dev)
315 : : return NULL;
316 : :
317 : : inl_dev = idev->nix_inl_dev;
318 : :
319 : 0 : return (uint64_t *)&inl_dev->sa_soft_exp_ring[nix->outb_se_ring_base];
320 : : }
321 : :
322 : : struct roc_nix_list *
323 : 0 : roc_idev_nix_list_get(void)
324 : : {
325 : : struct idev_cfg *idev;
326 : :
327 : 0 : idev = idev_get_cfg();
328 [ # # ]: 0 : if (idev != NULL)
329 : 0 : return &idev->roc_nix_list;
330 : : return NULL;
331 : : }
332 : :
333 : : void
334 : 0 : roc_idev_cpt_set(struct roc_cpt *cpt)
335 : : {
336 : 0 : struct idev_cfg *idev = idev_get_cfg();
337 : :
338 [ # # ]: 0 : if (idev != NULL)
339 : 0 : __atomic_store_n(&idev->cpt, cpt, __ATOMIC_RELEASE);
340 : 0 : }
341 : :
342 : : struct roc_nix *
343 : 0 : roc_idev_npa_nix_get(void)
344 : : {
345 : 0 : struct npa_lf *npa_lf = idev_npa_obj_get();
346 : : struct dev *dev;
347 : :
348 [ # # ]: 0 : if (!npa_lf)
349 : : return NULL;
350 : :
351 : 0 : dev = container_of(npa_lf, struct dev, npa);
352 : 0 : return dev->roc_nix;
353 : : }
354 : :
355 : : struct roc_sso *
356 : 3 : idev_sso_get(void)
357 : : {
358 : 3 : struct idev_cfg *idev = idev_get_cfg();
359 : :
360 [ + - ]: 3 : if (idev != NULL)
361 : 3 : return __atomic_load_n(&idev->sso, __ATOMIC_ACQUIRE);
362 : :
363 : : return NULL;
364 : : }
365 : :
366 : : void
367 : 0 : idev_sso_set(struct roc_sso *sso)
368 : : {
369 : 0 : struct idev_cfg *idev = idev_get_cfg();
370 : :
371 [ # # ]: 0 : if (idev != NULL)
372 : 0 : __atomic_store_n(&idev->sso, sso, __ATOMIC_RELEASE);
373 : 0 : }
374 : :
375 : : void
376 : 0 : idev_dma_cs_offset_set(uint8_t offset)
377 : : {
378 : 0 : struct idev_cfg *idev = idev_get_cfg();
379 : :
380 [ # # ]: 0 : if (idev != NULL)
381 : 0 : idev->dma_cs_offset = offset;
382 : 0 : }
383 : :
384 : : uint8_t
385 : 0 : idev_dma_cs_offset_get(void)
386 : : {
387 : 0 : struct idev_cfg *idev = idev_get_cfg();
388 : :
389 [ # # ]: 0 : if (idev != NULL)
390 : 0 : return idev->dma_cs_offset;
391 : :
392 : : return 0;
393 : : }
394 : :
395 : : uint64_t
396 : 0 : roc_idev_nix_inl_meta_aura_get(void)
397 : : {
398 : 0 : struct idev_cfg *idev = idev_get_cfg();
399 : :
400 [ # # ]: 0 : if (idev != NULL)
401 : 0 : return idev->inl_cfg.meta_aura;
402 : : return 0;
403 : : }
404 : :
405 : : uint8_t
406 : 0 : roc_idev_nix_rx_inject_get(uint16_t port)
407 : : {
408 : : struct idev_cfg *idev;
409 : :
410 : 0 : idev = idev_get_cfg();
411 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
412 : 0 : return idev->inl_rx_inj_cfg.rx_inject_en[port];
413 : :
414 : : return 0;
415 : : }
416 : :
417 : : void
418 : 0 : roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable)
419 : : {
420 : : struct idev_cfg *idev;
421 : :
422 : 0 : idev = idev_get_cfg();
423 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
424 : 0 : __atomic_store_n(&idev->inl_rx_inj_cfg.rx_inject_en[port], enable,
425 : : __ATOMIC_RELEASE);
426 : 0 : }
427 : :
428 : : uint16_t *
429 : 0 : roc_idev_nix_rx_chan_base_get(void)
430 : : {
431 : 0 : struct idev_cfg *idev = idev_get_cfg();
432 : :
433 [ # # ]: 0 : if (idev != NULL)
434 : 0 : return (uint16_t *)&idev->inl_rx_inj_cfg.chan;
435 : :
436 : : return NULL;
437 : : }
438 : :
439 : : void
440 : 0 : roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan)
441 : : {
442 : : struct idev_cfg *idev;
443 : :
444 : 0 : idev = idev_get_cfg();
445 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
446 : 0 : __atomic_store_n(&idev->inl_rx_inj_cfg.chan[port], chan, __ATOMIC_RELEASE);
447 : 0 : }
448 : :
449 : : uint16_t
450 : 3 : roc_idev_nix_inl_dev_pffunc_get(void)
451 : : {
452 : 3 : return nix_inl_dev_pffunc_get();
453 : : }
|