common/cnxk: allow reuse of SSO API for inline dev
[dpdk.git] / drivers / common / cnxk / roc_idev.c
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 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         mz = plt_memzone_lookup(name);
16         if (mz != NULL)
17                 return mz->addr;
18
19         /* Request for the first time */
20         mz = plt_memzone_reserve_cache_align(name, sizeof(struct idev_cfg));
21         if (mz != NULL) {
22                 idev = mz->addr;
23                 idev_set_defaults(idev);
24                 return idev;
25         }
26         return NULL;
27 }
28
29 void
30 idev_set_defaults(struct idev_cfg *idev)
31 {
32         idev->sso_pf_func = 0;
33         idev->npa = NULL;
34         idev->npa_pf_func = 0;
35         idev->max_pools = 128;
36         idev->lmt_pf_func = 0;
37         idev->lmt_base_addr = 0;
38         idev->num_lmtlines = 0;
39         idev->bphy = NULL;
40         idev->cpt = NULL;
41         __atomic_store_n(&idev->npa_refcnt, 0, __ATOMIC_RELEASE);
42 }
43
44 uint16_t
45 idev_sso_pffunc_get(void)
46 {
47         struct idev_cfg *idev;
48         uint16_t sso_pf_func;
49
50         idev = idev_get_cfg();
51         sso_pf_func = 0;
52         if (idev != NULL)
53                 sso_pf_func = __atomic_load_n(&idev->sso_pf_func,
54                                               __ATOMIC_ACQUIRE);
55
56         return sso_pf_func;
57 }
58
59 void
60 idev_sso_pffunc_set(uint16_t sso_pf_func)
61 {
62         struct idev_cfg *idev;
63
64         idev = idev_get_cfg();
65         if (idev != NULL)
66                 __atomic_store_n(&idev->sso_pf_func, sso_pf_func,
67                                  __ATOMIC_RELEASE);
68 }
69
70 uint16_t
71 idev_npa_pffunc_get(void)
72 {
73         struct idev_cfg *idev;
74         uint16_t npa_pf_func;
75
76         idev = idev_get_cfg();
77         npa_pf_func = 0;
78         if (idev != NULL)
79                 npa_pf_func = idev->npa_pf_func;
80
81         return npa_pf_func;
82 }
83
84 struct npa_lf *
85 idev_npa_obj_get(void)
86 {
87         struct idev_cfg *idev;
88
89         idev = idev_get_cfg();
90         if (idev && __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE))
91                 return idev->npa;
92
93         return NULL;
94 }
95
96 uint32_t
97 roc_idev_npa_maxpools_get(void)
98 {
99         struct idev_cfg *idev;
100         uint32_t max_pools;
101
102         idev = idev_get_cfg();
103         max_pools = 0;
104         if (idev != NULL)
105                 max_pools = idev->max_pools;
106
107         return max_pools;
108 }
109
110 void
111 roc_idev_npa_maxpools_set(uint32_t max_pools)
112 {
113         struct idev_cfg *idev;
114
115         idev = idev_get_cfg();
116         if (idev != NULL)
117                 __atomic_store_n(&idev->max_pools, max_pools, __ATOMIC_RELEASE);
118 }
119
120 uint16_t
121 idev_npa_lf_active(struct dev *dev)
122 {
123         struct idev_cfg *idev;
124
125         /* Check if npalf is actively used on this dev */
126         idev = idev_get_cfg();
127         if (!idev || !idev->npa || idev->npa->mbox != dev->mbox)
128                 return 0;
129
130         return __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE);
131 }
132
133 uint16_t
134 idev_lmt_pffunc_get(void)
135 {
136         struct idev_cfg *idev;
137         uint16_t lmt_pf_func;
138
139         idev = idev_get_cfg();
140         lmt_pf_func = 0;
141         if (idev != NULL)
142                 lmt_pf_func = idev->lmt_pf_func;
143
144         return lmt_pf_func;
145 }
146
147 uint64_t
148 roc_idev_lmt_base_addr_get(void)
149 {
150         uint64_t lmt_base_addr;
151         struct idev_cfg *idev;
152
153         idev = idev_get_cfg();
154         lmt_base_addr = 0;
155         if (idev != NULL)
156                 lmt_base_addr = idev->lmt_base_addr;
157
158         return lmt_base_addr;
159 }
160
161 uint16_t
162 roc_idev_num_lmtlines_get(void)
163 {
164         struct idev_cfg *idev;
165         uint16_t num_lmtlines;
166
167         idev = idev_get_cfg();
168         num_lmtlines = 0;
169         if (idev != NULL)
170                 num_lmtlines = idev->num_lmtlines;
171
172         return num_lmtlines;
173 }
174
175 struct roc_cpt *
176 roc_idev_cpt_get(void)
177 {
178         struct idev_cfg *idev = idev_get_cfg();
179
180         if (idev != NULL)
181                 return idev->cpt;
182
183         return NULL;
184 }
185
186 void
187 roc_idev_cpt_set(struct roc_cpt *cpt)
188 {
189         struct idev_cfg *idev = idev_get_cfg();
190
191         if (idev != NULL)
192                 __atomic_store_n(&idev->cpt, cpt, __ATOMIC_RELEASE);
193 }
194
195 struct roc_nix *
196 roc_idev_npa_nix_get(void)
197 {
198         struct npa_lf *npa_lf = idev_npa_obj_get();
199         struct dev *dev;
200
201         if (!npa_lf)
202                 return NULL;
203
204         dev = container_of(npa_lf, struct dev, npa);
205         return dev->roc_nix;
206 }