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 : 0 : 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 : 0 : mz = plt_memzone_lookup(name);
16 [ # # ]: 0 : if (mz != NULL)
17 : 0 : return mz->addr;
18 : :
19 : : /* Request for the first time */
20 : 0 : mz = plt_memzone_reserve_cache_align(name, sizeof(struct idev_cfg));
21 [ # # ]: 0 : if (mz != NULL) {
22 : 0 : idev = mz->addr;
23 : 0 : idev_set_defaults(idev);
24 : 0 : return idev;
25 : : }
26 : : return NULL;
27 : : }
28 : :
29 : : void
30 : 0 : idev_set_defaults(struct idev_cfg *idev)
31 : : {
32 : 0 : idev->sso_pf_func = 0;
33 : 0 : idev->npa = NULL;
34 : 0 : idev->npa_pf_func = 0;
35 : 0 : idev->max_pools = 128;
36 : 0 : idev->lmt_pf_func = 0;
37 : 0 : idev->lmt_base_addr = 0;
38 : 0 : idev->num_lmtlines = 0;
39 : 0 : idev->bphy = NULL;
40 : 0 : idev->cpt = NULL;
41 : 0 : TAILQ_INIT(&idev->mcs_list);
42 : 0 : idev->nix_inl_dev = NULL;
43 : 0 : TAILQ_INIT(&idev->roc_nix_list);
44 : : plt_spinlock_init(&idev->nix_inl_dev_lock);
45 : : plt_spinlock_init(&idev->npa_dev_lock);
46 : 0 : __atomic_store_n(&idev->npa_refcnt, 0, __ATOMIC_RELEASE);
47 : 0 : }
48 : :
49 : : uint16_t
50 : 0 : idev_sso_pffunc_get(void)
51 : : {
52 : : struct idev_cfg *idev;
53 : : uint16_t sso_pf_func;
54 : :
55 : 0 : idev = idev_get_cfg();
56 : : sso_pf_func = 0;
57 [ # # ]: 0 : if (idev != NULL)
58 : 0 : sso_pf_func = __atomic_load_n(&idev->sso_pf_func,
59 : : __ATOMIC_ACQUIRE);
60 : :
61 : 0 : return sso_pf_func;
62 : : }
63 : :
64 : : void
65 : 0 : idev_sso_pffunc_set(uint16_t sso_pf_func)
66 : : {
67 : : struct idev_cfg *idev;
68 : :
69 : 0 : idev = idev_get_cfg();
70 [ # # ]: 0 : if (idev != NULL)
71 : 0 : __atomic_store_n(&idev->sso_pf_func, sso_pf_func,
72 : : __ATOMIC_RELEASE);
73 : 0 : }
74 : :
75 : : uint16_t
76 : 0 : idev_npa_pffunc_get(void)
77 : : {
78 : : struct idev_cfg *idev;
79 : : uint16_t npa_pf_func;
80 : :
81 : 0 : idev = idev_get_cfg();
82 : : npa_pf_func = 0;
83 [ # # ]: 0 : if (idev != NULL)
84 : 0 : npa_pf_func = idev->npa_pf_func;
85 : :
86 : 0 : return npa_pf_func;
87 : : }
88 : :
89 : : struct npa_lf *
90 : 0 : idev_npa_obj_get(void)
91 : : {
92 : : struct idev_cfg *idev;
93 : :
94 : 0 : idev = idev_get_cfg();
95 [ # # # # ]: 0 : if (idev && __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE))
96 : 0 : return idev->npa;
97 : :
98 : : return NULL;
99 : : }
100 : :
101 : : uint32_t
102 : 0 : roc_idev_npa_maxpools_get(void)
103 : : {
104 : : struct idev_cfg *idev;
105 : : uint32_t max_pools;
106 : :
107 : 0 : idev = idev_get_cfg();
108 : : max_pools = 0;
109 [ # # ]: 0 : if (idev != NULL)
110 : 0 : max_pools = idev->max_pools;
111 : :
112 : 0 : return max_pools;
113 : : }
114 : :
115 : : void
116 : 0 : roc_idev_npa_maxpools_set(uint32_t max_pools)
117 : : {
118 : : struct idev_cfg *idev;
119 : :
120 : 0 : idev = idev_get_cfg();
121 [ # # ]: 0 : if (idev != NULL)
122 : 0 : __atomic_store_n(&idev->max_pools, max_pools, __ATOMIC_RELEASE);
123 : 0 : }
124 : :
125 : : uint16_t
126 : 0 : idev_npa_lf_active(struct dev *dev)
127 : : {
128 : : struct idev_cfg *idev;
129 : :
130 : : /* Check if npalf is actively used on this dev */
131 : 0 : idev = idev_get_cfg();
132 [ # # # # : 0 : if (!idev || !idev->npa || idev->npa->mbox != dev->mbox)
# # ]
133 : : return 0;
134 : :
135 : 0 : return __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE);
136 : : }
137 : :
138 : : uint16_t
139 : 0 : idev_lmt_pffunc_get(void)
140 : : {
141 : : struct idev_cfg *idev;
142 : : uint16_t lmt_pf_func;
143 : :
144 : 0 : idev = idev_get_cfg();
145 : : lmt_pf_func = 0;
146 [ # # ]: 0 : if (idev != NULL)
147 : 0 : lmt_pf_func = idev->lmt_pf_func;
148 : :
149 : 0 : return lmt_pf_func;
150 : : }
151 : :
152 : : uint64_t
153 : 0 : roc_idev_lmt_base_addr_get(void)
154 : : {
155 : : uint64_t lmt_base_addr;
156 : : struct idev_cfg *idev;
157 : :
158 : 0 : idev = idev_get_cfg();
159 : : lmt_base_addr = 0;
160 [ # # ]: 0 : if (idev != NULL)
161 : 0 : lmt_base_addr = idev->lmt_base_addr;
162 : :
163 : 0 : return lmt_base_addr;
164 : : }
165 : :
166 : : uint16_t
167 : 0 : roc_idev_num_lmtlines_get(void)
168 : : {
169 : : struct idev_cfg *idev;
170 : : uint16_t num_lmtlines;
171 : :
172 : 0 : idev = idev_get_cfg();
173 : : num_lmtlines = 0;
174 [ # # ]: 0 : if (idev != NULL)
175 : 0 : num_lmtlines = idev->num_lmtlines;
176 : :
177 : 0 : return num_lmtlines;
178 : : }
179 : :
180 : : struct roc_cpt *
181 : 0 : roc_idev_cpt_get(void)
182 : : {
183 : 0 : struct idev_cfg *idev = idev_get_cfg();
184 : :
185 [ # # ]: 0 : if (idev != NULL)
186 : 0 : return idev->cpt;
187 : :
188 : : return NULL;
189 : : }
190 : :
191 : : struct roc_mcs *
192 : 0 : roc_idev_mcs_get(uint8_t mcs_idx)
193 : : {
194 : 0 : struct idev_cfg *idev = idev_get_cfg();
195 : : struct roc_mcs *mcs = NULL;
196 : :
197 [ # # ]: 0 : if (idev != NULL) {
198 [ # # ]: 0 : TAILQ_FOREACH(mcs, &idev->mcs_list, next) {
199 [ # # ]: 0 : if (mcs->idx == mcs_idx)
200 : 0 : return mcs;
201 : : }
202 : : }
203 : :
204 : : return NULL;
205 : : }
206 : :
207 : : void
208 : 0 : roc_idev_mcs_set(struct roc_mcs *mcs)
209 : : {
210 : 0 : struct idev_cfg *idev = idev_get_cfg();
211 : : struct roc_mcs *mcs_iter = NULL;
212 : :
213 [ # # ]: 0 : if (idev != NULL) {
214 [ # # ]: 0 : TAILQ_FOREACH(mcs_iter, &idev->mcs_list, next) {
215 [ # # ]: 0 : if (mcs_iter->idx == mcs->idx)
216 : : return;
217 : : }
218 : 0 : TAILQ_INSERT_TAIL(&idev->mcs_list, mcs, next);
219 : : }
220 : : }
221 : :
222 : : void
223 : 0 : roc_idev_mcs_free(struct roc_mcs *mcs)
224 : : {
225 : 0 : struct idev_cfg *idev = idev_get_cfg();
226 : : struct roc_mcs *mcs_iter = NULL;
227 : :
228 [ # # ]: 0 : if (idev != NULL) {
229 [ # # ]: 0 : TAILQ_FOREACH(mcs_iter, &idev->mcs_list, next) {
230 [ # # ]: 0 : if (mcs_iter->idx == mcs->idx)
231 [ # # ]: 0 : TAILQ_REMOVE(&idev->mcs_list, mcs, next);
232 : : }
233 : : }
234 : 0 : }
235 : :
236 : : uint64_t *
237 : 0 : roc_nix_inl_outb_ring_base_get(struct roc_nix *roc_nix)
238 : : {
239 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
240 : 0 : struct idev_cfg *idev = idev_get_cfg();
241 : : struct nix_inl_dev *inl_dev;
242 : :
243 [ # # # # ]: 0 : if (!idev || !idev->nix_inl_dev)
244 : : return NULL;
245 : :
246 : : inl_dev = idev->nix_inl_dev;
247 : :
248 : 0 : return (uint64_t *)&inl_dev->sa_soft_exp_ring[nix->outb_se_ring_base];
249 : : }
250 : :
251 : : struct roc_nix_list *
252 : 0 : roc_idev_nix_list_get(void)
253 : : {
254 : : struct idev_cfg *idev;
255 : :
256 : 0 : idev = idev_get_cfg();
257 [ # # ]: 0 : if (idev != NULL)
258 : 0 : return &idev->roc_nix_list;
259 : : return NULL;
260 : : }
261 : :
262 : : void
263 : 0 : roc_idev_cpt_set(struct roc_cpt *cpt)
264 : : {
265 : 0 : struct idev_cfg *idev = idev_get_cfg();
266 : :
267 [ # # ]: 0 : if (idev != NULL)
268 : 0 : __atomic_store_n(&idev->cpt, cpt, __ATOMIC_RELEASE);
269 : 0 : }
270 : :
271 : : struct roc_nix *
272 : 0 : roc_idev_npa_nix_get(void)
273 : : {
274 : 0 : struct npa_lf *npa_lf = idev_npa_obj_get();
275 : : struct dev *dev;
276 : :
277 [ # # ]: 0 : if (!npa_lf)
278 : : return NULL;
279 : :
280 : 0 : dev = container_of(npa_lf, struct dev, npa);
281 : 0 : return dev->roc_nix;
282 : : }
283 : :
284 : : struct roc_sso *
285 : 0 : idev_sso_get(void)
286 : : {
287 : 0 : struct idev_cfg *idev = idev_get_cfg();
288 : :
289 [ # # ]: 0 : if (idev != NULL)
290 : 0 : return __atomic_load_n(&idev->sso, __ATOMIC_ACQUIRE);
291 : :
292 : : return NULL;
293 : : }
294 : :
295 : : void
296 : 0 : idev_sso_set(struct roc_sso *sso)
297 : : {
298 : 0 : struct idev_cfg *idev = idev_get_cfg();
299 : :
300 [ # # ]: 0 : if (idev != NULL)
301 : 0 : __atomic_store_n(&idev->sso, sso, __ATOMIC_RELEASE);
302 : 0 : }
303 : :
304 : : void
305 : 0 : idev_dma_cs_offset_set(uint8_t offset)
306 : : {
307 : 0 : struct idev_cfg *idev = idev_get_cfg();
308 : :
309 [ # # ]: 0 : if (idev != NULL)
310 : 0 : idev->dma_cs_offset = offset;
311 : 0 : }
312 : :
313 : : uint8_t
314 : 0 : idev_dma_cs_offset_get(void)
315 : : {
316 : 0 : struct idev_cfg *idev = idev_get_cfg();
317 : :
318 [ # # ]: 0 : if (idev != NULL)
319 : 0 : return idev->dma_cs_offset;
320 : :
321 : : return 0;
322 : : }
323 : :
324 : : uint64_t
325 : 0 : roc_idev_nix_inl_meta_aura_get(void)
326 : : {
327 : 0 : struct idev_cfg *idev = idev_get_cfg();
328 : :
329 [ # # ]: 0 : if (idev != NULL)
330 : 0 : return idev->inl_cfg.meta_aura;
331 : : return 0;
332 : : }
333 : :
334 : : uint8_t
335 : 0 : roc_idev_nix_rx_inject_get(uint16_t port)
336 : : {
337 : : struct idev_cfg *idev;
338 : :
339 : 0 : idev = idev_get_cfg();
340 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
341 : 0 : return idev->inl_rx_inj_cfg.rx_inject_en[port];
342 : :
343 : : return 0;
344 : : }
345 : :
346 : : void
347 : 0 : roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable)
348 : : {
349 : : struct idev_cfg *idev;
350 : :
351 : 0 : idev = idev_get_cfg();
352 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
353 : 0 : __atomic_store_n(&idev->inl_rx_inj_cfg.rx_inject_en[port], enable,
354 : : __ATOMIC_RELEASE);
355 : 0 : }
356 : :
357 : : uint16_t *
358 : 0 : roc_idev_nix_rx_chan_base_get(void)
359 : : {
360 : 0 : struct idev_cfg *idev = idev_get_cfg();
361 : :
362 [ # # ]: 0 : if (idev != NULL)
363 : 0 : return (uint16_t *)&idev->inl_rx_inj_cfg.chan;
364 : :
365 : : return NULL;
366 : : }
367 : :
368 : : void
369 : 0 : roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan)
370 : : {
371 : : struct idev_cfg *idev;
372 : :
373 : 0 : idev = idev_get_cfg();
374 [ # # ]: 0 : if (idev != NULL && port < PLT_MAX_ETHPORTS)
375 : 0 : __atomic_store_n(&idev->inl_rx_inj_cfg.chan[port], chan, __ATOMIC_RELEASE);
376 : 0 : }
|