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