common/cnxk: support SSO device
[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         __atomic_store_n(&idev->npa_refcnt, 0, __ATOMIC_RELEASE);
40 }
41
42 uint16_t
43 idev_sso_pffunc_get(void)
44 {
45         struct idev_cfg *idev;
46         uint16_t sso_pf_func;
47
48         idev = idev_get_cfg();
49         sso_pf_func = 0;
50         if (idev != NULL)
51                 sso_pf_func = __atomic_load_n(&idev->sso_pf_func,
52                                               __ATOMIC_ACQUIRE);
53
54         return sso_pf_func;
55 }
56
57 void
58 idev_sso_pffunc_set(uint16_t sso_pf_func)
59 {
60         struct idev_cfg *idev;
61
62         idev = idev_get_cfg();
63         if (idev != NULL)
64                 __atomic_store_n(&idev->sso_pf_func, sso_pf_func,
65                                  __ATOMIC_RELEASE);
66 }
67
68 uint16_t
69 idev_npa_pffunc_get(void)
70 {
71         struct idev_cfg *idev;
72         uint16_t npa_pf_func;
73
74         idev = idev_get_cfg();
75         npa_pf_func = 0;
76         if (idev != NULL)
77                 npa_pf_func = idev->npa_pf_func;
78
79         return npa_pf_func;
80 }
81
82 struct npa_lf *
83 idev_npa_obj_get(void)
84 {
85         struct idev_cfg *idev;
86
87         idev = idev_get_cfg();
88         if (idev && __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE))
89                 return idev->npa;
90
91         return NULL;
92 }
93
94 uint32_t
95 roc_idev_npa_maxpools_get(void)
96 {
97         struct idev_cfg *idev;
98         uint32_t max_pools;
99
100         idev = idev_get_cfg();
101         max_pools = 0;
102         if (idev != NULL)
103                 max_pools = idev->max_pools;
104
105         return max_pools;
106 }
107
108 void
109 roc_idev_npa_maxpools_set(uint32_t max_pools)
110 {
111         struct idev_cfg *idev;
112
113         idev = idev_get_cfg();
114         if (idev != NULL)
115                 __atomic_store_n(&idev->max_pools, max_pools, __ATOMIC_RELEASE);
116 }
117
118 uint16_t
119 idev_npa_lf_active(struct dev *dev)
120 {
121         struct idev_cfg *idev;
122
123         /* Check if npalf is actively used on this dev */
124         idev = idev_get_cfg();
125         if (!idev || !idev->npa || idev->npa->mbox != dev->mbox)
126                 return 0;
127
128         return __atomic_load_n(&idev->npa_refcnt, __ATOMIC_ACQUIRE);
129 }
130
131 uint16_t
132 idev_lmt_pffunc_get(void)
133 {
134         struct idev_cfg *idev;
135         uint16_t lmt_pf_func;
136
137         idev = idev_get_cfg();
138         lmt_pf_func = 0;
139         if (idev != NULL)
140                 lmt_pf_func = idev->lmt_pf_func;
141
142         return lmt_pf_func;
143 }
144
145 uint64_t
146 roc_idev_lmt_base_addr_get(void)
147 {
148         uint64_t lmt_base_addr;
149         struct idev_cfg *idev;
150
151         idev = idev_get_cfg();
152         lmt_base_addr = 0;
153         if (idev != NULL)
154                 lmt_base_addr = idev->lmt_base_addr;
155
156         return lmt_base_addr;
157 }
158
159 uint16_t
160 roc_idev_num_lmtlines_get(void)
161 {
162         struct idev_cfg *idev;
163         uint16_t num_lmtlines;
164
165         idev = idev_get_cfg();
166         num_lmtlines = 0;
167         if (idev != NULL)
168                 num_lmtlines = idev->num_lmtlines;
169
170         return num_lmtlines;
171 }
172
173 struct roc_nix *
174 roc_idev_npa_nix_get(void)
175 {
176         struct npa_lf *npa_lf = idev_npa_obj_get();
177         struct dev *dev;
178
179         if (!npa_lf)
180                 return NULL;
181
182         dev = container_of(npa_lf, struct dev, npa);
183         return dev->roc_nix;
184 }