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 : : uint64_t 305 : 0 : roc_idev_nix_inl_meta_aura_get(void) 306 : : { 307 : 0 : struct idev_cfg *idev = idev_get_cfg(); 308 : : 309 [ # # ]: 0 : if (idev != NULL) 310 : 0 : return idev->inl_cfg.meta_aura; 311 : : return 0; 312 : : }