1124ff1a4SAshwin Sekhar T K /* SPDX-License-Identifier: BSD-3-Clause 2124ff1a4SAshwin Sekhar T K * Copyright(C) 2021 Marvell. 3124ff1a4SAshwin Sekhar T K */ 4124ff1a4SAshwin Sekhar T K 5124ff1a4SAshwin Sekhar T K #include "roc_api.h" 6124ff1a4SAshwin Sekhar T K #include "roc_priv.h" 7124ff1a4SAshwin Sekhar T K 880e1239eSVolodymyr Fialko static roc_npa_lf_init_cb_t lf_init_cb; 980e1239eSVolodymyr Fialko 1080e1239eSVolodymyr Fialko int 1180e1239eSVolodymyr Fialko roc_npa_lf_init_cb_register(roc_npa_lf_init_cb_t cb) 1280e1239eSVolodymyr Fialko { 1380e1239eSVolodymyr Fialko if (lf_init_cb != NULL) 1480e1239eSVolodymyr Fialko return -EEXIST; 1580e1239eSVolodymyr Fialko 1680e1239eSVolodymyr Fialko lf_init_cb = cb; 1780e1239eSVolodymyr Fialko return 0; 1880e1239eSVolodymyr Fialko } 1980e1239eSVolodymyr Fialko 20*59c15941SAkhil Goyal uint16_t 21*59c15941SAkhil Goyal roc_npa_pf_func_get(void) 22*59c15941SAkhil Goyal { 23*59c15941SAkhil Goyal return idev_npa_pffunc_get(); 24*59c15941SAkhil Goyal } 25*59c15941SAkhil Goyal 26f765f561SAshwin Sekhar T K void 270bdad505SAshwin Sekhar T K roc_npa_pool_op_range_set(uint64_t aura_handle, uint64_t start_iova, 28f765f561SAshwin Sekhar T K uint64_t end_iova) 29f765f561SAshwin Sekhar T K { 30f765f561SAshwin Sekhar T K const uint64_t start = roc_npa_aura_handle_to_base(aura_handle) + 31f765f561SAshwin Sekhar T K NPA_LF_POOL_OP_PTR_START0; 32f765f561SAshwin Sekhar T K const uint64_t end = roc_npa_aura_handle_to_base(aura_handle) + 33f765f561SAshwin Sekhar T K NPA_LF_POOL_OP_PTR_END0; 34f765f561SAshwin Sekhar T K uint64_t reg = roc_npa_aura_handle_to_aura(aura_handle); 35f765f561SAshwin Sekhar T K struct npa_lf *lf = idev_npa_obj_get(); 36f765f561SAshwin Sekhar T K struct npa_aura_lim *lim; 37f765f561SAshwin Sekhar T K 38f765f561SAshwin Sekhar T K PLT_ASSERT(lf); 39f765f561SAshwin Sekhar T K lim = lf->aura_lim; 40f765f561SAshwin Sekhar T K 410bdad505SAshwin Sekhar T K /* Change the range bookkeeping in software as well as in hardware */ 42f765f561SAshwin Sekhar T K lim[reg].ptr_start = PLT_MIN(lim[reg].ptr_start, start_iova); 43f765f561SAshwin Sekhar T K lim[reg].ptr_end = PLT_MAX(lim[reg].ptr_end, end_iova); 44f765f561SAshwin Sekhar T K 45f765f561SAshwin Sekhar T K roc_store_pair(lim[reg].ptr_start, reg, start); 46f765f561SAshwin Sekhar T K roc_store_pair(lim[reg].ptr_end, reg, end); 47f765f561SAshwin Sekhar T K } 48f765f561SAshwin Sekhar T K 490bdad505SAshwin Sekhar T K void 500bdad505SAshwin Sekhar T K roc_npa_aura_op_range_set(uint64_t aura_handle, uint64_t start_iova, 510bdad505SAshwin Sekhar T K uint64_t end_iova) 520bdad505SAshwin Sekhar T K { 530bdad505SAshwin Sekhar T K uint64_t reg = roc_npa_aura_handle_to_aura(aura_handle); 540bdad505SAshwin Sekhar T K struct npa_lf *lf = idev_npa_obj_get(); 550bdad505SAshwin Sekhar T K struct npa_aura_lim *lim; 560bdad505SAshwin Sekhar T K 570bdad505SAshwin Sekhar T K PLT_ASSERT(lf); 580bdad505SAshwin Sekhar T K lim = lf->aura_lim; 590bdad505SAshwin Sekhar T K 600bdad505SAshwin Sekhar T K /* Change only the bookkeeping in software */ 610bdad505SAshwin Sekhar T K lim[reg].ptr_start = PLT_MIN(lim[reg].ptr_start, start_iova); 620bdad505SAshwin Sekhar T K lim[reg].ptr_end = PLT_MAX(lim[reg].ptr_end, end_iova); 630bdad505SAshwin Sekhar T K } 640bdad505SAshwin Sekhar T K 650bdad505SAshwin Sekhar T K void 660bdad505SAshwin Sekhar T K roc_npa_aura_op_range_get(uint64_t aura_handle, uint64_t *start_iova, 670bdad505SAshwin Sekhar T K uint64_t *end_iova) 680bdad505SAshwin Sekhar T K { 690bdad505SAshwin Sekhar T K uint64_t aura_id = roc_npa_aura_handle_to_aura(aura_handle); 700bdad505SAshwin Sekhar T K struct npa_aura_lim *lim; 710bdad505SAshwin Sekhar T K struct npa_lf *lf; 720bdad505SAshwin Sekhar T K 730bdad505SAshwin Sekhar T K lf = idev_npa_obj_get(); 740bdad505SAshwin Sekhar T K PLT_ASSERT(lf); 750bdad505SAshwin Sekhar T K 760bdad505SAshwin Sekhar T K lim = lf->aura_lim; 770bdad505SAshwin Sekhar T K *start_iova = lim[aura_id].ptr_start; 780bdad505SAshwin Sekhar T K *end_iova = lim[aura_id].ptr_end; 790bdad505SAshwin Sekhar T K } 800bdad505SAshwin Sekhar T K 81f765f561SAshwin Sekhar T K static int 8244a9307cSRakesh Kudurumalla npa_aura_pool_init(struct mbox *m_box, uint32_t aura_id, struct npa_aura_s *aura, 83f765f561SAshwin Sekhar T K struct npa_pool_s *pool) 84f765f561SAshwin Sekhar T K { 85143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_init_req_cn20k, *pool_init_req_cn20k; 86f765f561SAshwin Sekhar T K struct npa_aq_enq_req *aura_init_req, *pool_init_req; 87f765f561SAshwin Sekhar T K struct npa_aq_enq_rsp *aura_init_rsp, *pool_init_rsp; 8844a9307cSRakesh Kudurumalla struct mbox_dev *mdev = &m_box->dev[0]; 89f765f561SAshwin Sekhar T K int rc = -ENOSPC, off; 9044a9307cSRakesh Kudurumalla struct mbox *mbox; 91f765f561SAshwin Sekhar T K 9244a9307cSRakesh Kudurumalla mbox = mbox_get(m_box); 93143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 94143a419eSAshwin Sekhar T K aura_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 95143a419eSAshwin Sekhar T K aura_init_req = (struct npa_aq_enq_req *)aura_init_req_cn20k; 96143a419eSAshwin Sekhar T K } else { 97f765f561SAshwin Sekhar T K aura_init_req = mbox_alloc_msg_npa_aq_enq(mbox); 98143a419eSAshwin Sekhar T K } 99f765f561SAshwin Sekhar T K if (aura_init_req == NULL) 10044a9307cSRakesh Kudurumalla goto exit; 101f765f561SAshwin Sekhar T K aura_init_req->aura_id = aura_id; 102f765f561SAshwin Sekhar T K aura_init_req->ctype = NPA_AQ_CTYPE_AURA; 103f765f561SAshwin Sekhar T K aura_init_req->op = NPA_AQ_INSTOP_INIT; 104f765f561SAshwin Sekhar T K mbox_memcpy(&aura_init_req->aura, aura, sizeof(*aura)); 105f765f561SAshwin Sekhar T K 106143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 107143a419eSAshwin Sekhar T K pool_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 108143a419eSAshwin Sekhar T K pool_init_req = (struct npa_aq_enq_req *)pool_init_req_cn20k; 109143a419eSAshwin Sekhar T K } else { 110143a419eSAshwin Sekhar T K pool_init_req = mbox_alloc_msg_npa_aq_enq(mbox); 111143a419eSAshwin Sekhar T K } 112f765f561SAshwin Sekhar T K pool_init_req = mbox_alloc_msg_npa_aq_enq(mbox); 113f765f561SAshwin Sekhar T K if (pool_init_req == NULL) 11444a9307cSRakesh Kudurumalla goto exit; 115f765f561SAshwin Sekhar T K pool_init_req->aura_id = aura_id; 116f765f561SAshwin Sekhar T K pool_init_req->ctype = NPA_AQ_CTYPE_POOL; 117f765f561SAshwin Sekhar T K pool_init_req->op = NPA_AQ_INSTOP_INIT; 118f765f561SAshwin Sekhar T K mbox_memcpy(&pool_init_req->pool, pool, sizeof(*pool)); 119f765f561SAshwin Sekhar T K 120f765f561SAshwin Sekhar T K rc = mbox_process(mbox); 121f765f561SAshwin Sekhar T K if (rc < 0) 12244a9307cSRakesh Kudurumalla goto exit; 123f765f561SAshwin Sekhar T K 124f765f561SAshwin Sekhar T K off = mbox->rx_start + 125f765f561SAshwin Sekhar T K PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN); 126f765f561SAshwin Sekhar T K aura_init_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off); 127f765f561SAshwin Sekhar T K off = mbox->rx_start + aura_init_rsp->hdr.next_msgoff; 128f765f561SAshwin Sekhar T K pool_init_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off); 129f765f561SAshwin Sekhar T K 130f765f561SAshwin Sekhar T K if (aura_init_rsp->hdr.rc == 0 && pool_init_rsp->hdr.rc == 0) 13144a9307cSRakesh Kudurumalla rc = 0; 132f765f561SAshwin Sekhar T K else 13344a9307cSRakesh Kudurumalla rc = NPA_ERR_AURA_POOL_INIT; 13444a9307cSRakesh Kudurumalla exit: 13544a9307cSRakesh Kudurumalla mbox_put(mbox); 13644a9307cSRakesh Kudurumalla return rc; 137f765f561SAshwin Sekhar T K } 138f765f561SAshwin Sekhar T K 139f765f561SAshwin Sekhar T K static int 140ea4d70ccSAshwin Sekhar T K npa_aura_init(struct mbox *m_box, uint32_t aura_id, struct npa_aura_s *aura) 141ea4d70ccSAshwin Sekhar T K { 142143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_init_req_cn20k; 143ea4d70ccSAshwin Sekhar T K struct npa_aq_enq_req *aura_init_req; 144ea4d70ccSAshwin Sekhar T K struct npa_aq_enq_rsp *aura_init_rsp; 145ea4d70ccSAshwin Sekhar T K struct mbox *mbox; 146ea4d70ccSAshwin Sekhar T K int rc = -ENOSPC; 147ea4d70ccSAshwin Sekhar T K 148ea4d70ccSAshwin Sekhar T K mbox = mbox_get(m_box); 149143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 150143a419eSAshwin Sekhar T K aura_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 151143a419eSAshwin Sekhar T K aura_init_req = (struct npa_aq_enq_req *)aura_init_req_cn20k; 152143a419eSAshwin Sekhar T K } else { 153ea4d70ccSAshwin Sekhar T K aura_init_req = mbox_alloc_msg_npa_aq_enq(mbox); 154143a419eSAshwin Sekhar T K } 155ea4d70ccSAshwin Sekhar T K if (aura_init_req == NULL) 156ea4d70ccSAshwin Sekhar T K goto exit; 157ea4d70ccSAshwin Sekhar T K aura_init_req->aura_id = aura_id; 158ea4d70ccSAshwin Sekhar T K aura_init_req->ctype = NPA_AQ_CTYPE_AURA; 159ea4d70ccSAshwin Sekhar T K aura_init_req->op = NPA_AQ_INSTOP_INIT; 160ea4d70ccSAshwin Sekhar T K mbox_memcpy(&aura_init_req->aura, aura, sizeof(*aura)); 161ea4d70ccSAshwin Sekhar T K 162ea4d70ccSAshwin Sekhar T K rc = mbox_process_msg(mbox, (void **)&aura_init_rsp); 163ea4d70ccSAshwin Sekhar T K if (rc < 0) 164ea4d70ccSAshwin Sekhar T K goto exit; 165ea4d70ccSAshwin Sekhar T K 166ea4d70ccSAshwin Sekhar T K if (aura_init_rsp->hdr.rc == 0) 167ea4d70ccSAshwin Sekhar T K rc = 0; 168ea4d70ccSAshwin Sekhar T K else 169ea4d70ccSAshwin Sekhar T K rc = NPA_ERR_AURA_POOL_INIT; 170ea4d70ccSAshwin Sekhar T K exit: 171ea4d70ccSAshwin Sekhar T K mbox_put(mbox); 172ea4d70ccSAshwin Sekhar T K return rc; 173ea4d70ccSAshwin Sekhar T K } 174ea4d70ccSAshwin Sekhar T K 175ea4d70ccSAshwin Sekhar T K static int 17644a9307cSRakesh Kudurumalla npa_aura_pool_fini(struct mbox *m_box, uint32_t aura_id, uint64_t aura_handle) 177f765f561SAshwin Sekhar T K { 178143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_req_cn20k, *pool_req_cn20k; 179f765f561SAshwin Sekhar T K struct npa_aq_enq_req *aura_req, *pool_req; 180f765f561SAshwin Sekhar T K struct npa_aq_enq_rsp *aura_rsp, *pool_rsp; 18144a9307cSRakesh Kudurumalla struct mbox_dev *mdev = &m_box->dev[0]; 182f765f561SAshwin Sekhar T K struct ndc_sync_op *ndc_req; 183f765f561SAshwin Sekhar T K int rc = -ENOSPC, off; 18444a9307cSRakesh Kudurumalla struct mbox *mbox; 185f765f561SAshwin Sekhar T K uint64_t ptr; 186f765f561SAshwin Sekhar T K 187f765f561SAshwin Sekhar T K /* Procedure for disabling an aura/pool */ 188f765f561SAshwin Sekhar T K plt_delay_us(10); 189f765f561SAshwin Sekhar T K 190f765f561SAshwin Sekhar T K /* Clear all the pointers from the aura */ 191f765f561SAshwin Sekhar T K do { 192f765f561SAshwin Sekhar T K ptr = roc_npa_aura_op_alloc(aura_handle, 0); 193f765f561SAshwin Sekhar T K } while (ptr); 194f765f561SAshwin Sekhar T K 19544a9307cSRakesh Kudurumalla mbox = mbox_get(m_box); 196143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 197143a419eSAshwin Sekhar T K pool_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 198143a419eSAshwin Sekhar T K pool_req = (struct npa_aq_enq_req *)pool_req_cn20k; 199143a419eSAshwin Sekhar T K } else { 200f765f561SAshwin Sekhar T K pool_req = mbox_alloc_msg_npa_aq_enq(mbox); 201143a419eSAshwin Sekhar T K } 202f765f561SAshwin Sekhar T K if (pool_req == NULL) 20344a9307cSRakesh Kudurumalla goto exit; 204f765f561SAshwin Sekhar T K pool_req->aura_id = aura_id; 205f765f561SAshwin Sekhar T K pool_req->ctype = NPA_AQ_CTYPE_POOL; 206f765f561SAshwin Sekhar T K pool_req->op = NPA_AQ_INSTOP_WRITE; 207f765f561SAshwin Sekhar T K pool_req->pool.ena = 0; 208f765f561SAshwin Sekhar T K pool_req->pool_mask.ena = ~pool_req->pool_mask.ena; 209f765f561SAshwin Sekhar T K 210143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 211143a419eSAshwin Sekhar T K aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 212143a419eSAshwin Sekhar T K aura_req = (struct npa_aq_enq_req *)aura_req_cn20k; 213143a419eSAshwin Sekhar T K } else { 214f765f561SAshwin Sekhar T K aura_req = mbox_alloc_msg_npa_aq_enq(mbox); 215143a419eSAshwin Sekhar T K } 216f765f561SAshwin Sekhar T K if (aura_req == NULL) 21744a9307cSRakesh Kudurumalla goto exit; 218f765f561SAshwin Sekhar T K aura_req->aura_id = aura_id; 219f765f561SAshwin Sekhar T K aura_req->ctype = NPA_AQ_CTYPE_AURA; 220f765f561SAshwin Sekhar T K aura_req->op = NPA_AQ_INSTOP_WRITE; 221f765f561SAshwin Sekhar T K aura_req->aura.ena = 0; 222f765f561SAshwin Sekhar T K aura_req->aura_mask.ena = ~aura_req->aura_mask.ena; 223143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 224143a419eSAshwin Sekhar T K __io struct npa_cn20k_aura_s *aura_cn20k, *aura_mask_cn20k; 225143a419eSAshwin Sekhar T K 226143a419eSAshwin Sekhar T K /* The bit positions/width of bp_ena has changed in cn20k */ 227143a419eSAshwin Sekhar T K aura_cn20k = (__io struct npa_cn20k_aura_s *)&aura_req->aura; 228143a419eSAshwin Sekhar T K aura_cn20k->bp_ena = 0; 229143a419eSAshwin Sekhar T K aura_mask_cn20k = (__io struct npa_cn20k_aura_s *)&aura_req->aura_mask; 230143a419eSAshwin Sekhar T K aura_mask_cn20k->bp_ena = ~aura_mask_cn20k->bp_ena; 231143a419eSAshwin Sekhar T K } else { 232b1c7a08bSAshwin Sekhar T K aura_req->aura.bp_ena = 0; 233b1c7a08bSAshwin Sekhar T K aura_req->aura_mask.bp_ena = ~aura_req->aura_mask.bp_ena; 234143a419eSAshwin Sekhar T K } 235f765f561SAshwin Sekhar T K 236f765f561SAshwin Sekhar T K rc = mbox_process(mbox); 237f765f561SAshwin Sekhar T K if (rc < 0) 23844a9307cSRakesh Kudurumalla goto exit; 239f765f561SAshwin Sekhar T K 240f765f561SAshwin Sekhar T K off = mbox->rx_start + 241f765f561SAshwin Sekhar T K PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN); 242f765f561SAshwin Sekhar T K pool_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off); 243f765f561SAshwin Sekhar T K 244f765f561SAshwin Sekhar T K off = mbox->rx_start + pool_rsp->hdr.next_msgoff; 245f765f561SAshwin Sekhar T K aura_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off); 246f765f561SAshwin Sekhar T K 24702e5aaacSThierry Herbelot if (aura_rsp->hdr.rc != 0 || pool_rsp->hdr.rc != 0) { 24802e5aaacSThierry Herbelot rc = NPA_ERR_AURA_POOL_FINI; 24902e5aaacSThierry Herbelot goto exit; 25002e5aaacSThierry Herbelot } 251f765f561SAshwin Sekhar T K 252143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 253143a419eSAshwin Sekhar T K /* In cn20k, NPA does not use NDC */ 254143a419eSAshwin Sekhar T K rc = 0; 255143a419eSAshwin Sekhar T K goto exit; 256143a419eSAshwin Sekhar T K } 257143a419eSAshwin Sekhar T K 258f765f561SAshwin Sekhar T K /* Sync NDC-NPA for LF */ 259f765f561SAshwin Sekhar T K ndc_req = mbox_alloc_msg_ndc_sync_op(mbox); 26044a9307cSRakesh Kudurumalla if (ndc_req == NULL) { 26144a9307cSRakesh Kudurumalla rc = -ENOSPC; 26244a9307cSRakesh Kudurumalla goto exit; 26344a9307cSRakesh Kudurumalla } 264f765f561SAshwin Sekhar T K ndc_req->npa_lf_sync = 1; 265f765f561SAshwin Sekhar T K rc = mbox_process(mbox); 266f765f561SAshwin Sekhar T K if (rc) { 267f765f561SAshwin Sekhar T K plt_err("Error on NDC-NPA LF sync, rc %d", rc); 26844a9307cSRakesh Kudurumalla rc = NPA_ERR_AURA_POOL_FINI; 26944a9307cSRakesh Kudurumalla goto exit; 270f765f561SAshwin Sekhar T K } 27144a9307cSRakesh Kudurumalla rc = 0; 27244a9307cSRakesh Kudurumalla exit: 27344a9307cSRakesh Kudurumalla mbox_put(mbox); 27444a9307cSRakesh Kudurumalla return rc; 275f765f561SAshwin Sekhar T K } 276f765f561SAshwin Sekhar T K 277ea4d70ccSAshwin Sekhar T K static int 278ea4d70ccSAshwin Sekhar T K npa_aura_fini(struct mbox *m_box, uint32_t aura_id) 279ea4d70ccSAshwin Sekhar T K { 280143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_req_cn20k; 281ea4d70ccSAshwin Sekhar T K struct npa_aq_enq_req *aura_req; 282ea4d70ccSAshwin Sekhar T K struct npa_aq_enq_rsp *aura_rsp; 283ea4d70ccSAshwin Sekhar T K struct ndc_sync_op *ndc_req; 284ea4d70ccSAshwin Sekhar T K struct mbox *mbox; 285ea4d70ccSAshwin Sekhar T K int rc = -ENOSPC; 286ea4d70ccSAshwin Sekhar T K 287ea4d70ccSAshwin Sekhar T K /* Procedure for disabling an aura/pool */ 288ea4d70ccSAshwin Sekhar T K plt_delay_us(10); 289ea4d70ccSAshwin Sekhar T K 290ea4d70ccSAshwin Sekhar T K mbox = mbox_get(m_box); 291143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 292143a419eSAshwin Sekhar T K aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 293143a419eSAshwin Sekhar T K aura_req = (struct npa_aq_enq_req *)aura_req_cn20k; 294143a419eSAshwin Sekhar T K } else { 295ea4d70ccSAshwin Sekhar T K aura_req = mbox_alloc_msg_npa_aq_enq(mbox); 296143a419eSAshwin Sekhar T K } 297ea4d70ccSAshwin Sekhar T K if (aura_req == NULL) 298ea4d70ccSAshwin Sekhar T K goto exit; 299ea4d70ccSAshwin Sekhar T K aura_req->aura_id = aura_id; 300ea4d70ccSAshwin Sekhar T K aura_req->ctype = NPA_AQ_CTYPE_AURA; 301ea4d70ccSAshwin Sekhar T K aura_req->op = NPA_AQ_INSTOP_WRITE; 302ea4d70ccSAshwin Sekhar T K aura_req->aura.ena = 0; 303ea4d70ccSAshwin Sekhar T K aura_req->aura_mask.ena = ~aura_req->aura_mask.ena; 304ea4d70ccSAshwin Sekhar T K 305ea4d70ccSAshwin Sekhar T K rc = mbox_process_msg(mbox, (void **)&aura_rsp); 306ea4d70ccSAshwin Sekhar T K if (rc < 0) 307ea4d70ccSAshwin Sekhar T K goto exit; 308ea4d70ccSAshwin Sekhar T K 30902e5aaacSThierry Herbelot if (aura_rsp->hdr.rc != 0) { 31002e5aaacSThierry Herbelot rc = NPA_ERR_AURA_POOL_FINI; 31102e5aaacSThierry Herbelot goto exit; 31202e5aaacSThierry Herbelot } 313ea4d70ccSAshwin Sekhar T K 314143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 315143a419eSAshwin Sekhar T K /* In cn20k, NPA does not use NDC */ 316143a419eSAshwin Sekhar T K rc = 0; 317143a419eSAshwin Sekhar T K goto exit; 318143a419eSAshwin Sekhar T K } 319143a419eSAshwin Sekhar T K 320ea4d70ccSAshwin Sekhar T K /* Sync NDC-NPA for LF */ 321ea4d70ccSAshwin Sekhar T K ndc_req = mbox_alloc_msg_ndc_sync_op(mbox); 322ea4d70ccSAshwin Sekhar T K if (ndc_req == NULL) { 323ea4d70ccSAshwin Sekhar T K rc = -ENOSPC; 324ea4d70ccSAshwin Sekhar T K goto exit; 325ea4d70ccSAshwin Sekhar T K } 326ea4d70ccSAshwin Sekhar T K ndc_req->npa_lf_sync = 1; 327ea4d70ccSAshwin Sekhar T K rc = mbox_process(mbox); 328ea4d70ccSAshwin Sekhar T K if (rc) { 329ea4d70ccSAshwin Sekhar T K plt_err("Error on NDC-NPA LF sync, rc %d", rc); 330ea4d70ccSAshwin Sekhar T K rc = NPA_ERR_AURA_POOL_FINI; 331ea4d70ccSAshwin Sekhar T K goto exit; 332ea4d70ccSAshwin Sekhar T K } 333ea4d70ccSAshwin Sekhar T K rc = 0; 334ea4d70ccSAshwin Sekhar T K exit: 335ea4d70ccSAshwin Sekhar T K mbox_put(mbox); 336ea4d70ccSAshwin Sekhar T K return rc; 337ea4d70ccSAshwin Sekhar T K } 338ea4d70ccSAshwin Sekhar T K 3391d9f8a48SAshwin Sekhar T K int 3401d9f8a48SAshwin Sekhar T K roc_npa_pool_op_pc_reset(uint64_t aura_handle) 3411d9f8a48SAshwin Sekhar T K { 3421d9f8a48SAshwin Sekhar T K struct npa_lf *lf = idev_npa_obj_get(); 3431d9f8a48SAshwin Sekhar T K struct npa_aq_enq_req *pool_req; 3441d9f8a48SAshwin Sekhar T K struct npa_aq_enq_rsp *pool_rsp; 3451d9f8a48SAshwin Sekhar T K struct ndc_sync_op *ndc_req; 3461d9f8a48SAshwin Sekhar T K struct mbox_dev *mdev; 3471d9f8a48SAshwin Sekhar T K int rc = -ENOSPC, off; 3481d9f8a48SAshwin Sekhar T K struct mbox *mbox; 3491d9f8a48SAshwin Sekhar T K 3501d9f8a48SAshwin Sekhar T K if (lf == NULL) 3511d9f8a48SAshwin Sekhar T K return NPA_ERR_PARAM; 3521d9f8a48SAshwin Sekhar T K 35344a9307cSRakesh Kudurumalla mbox = mbox_get(lf->mbox); 3541d9f8a48SAshwin Sekhar T K mdev = &mbox->dev[0]; 3551d9f8a48SAshwin Sekhar T K plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle); 3561d9f8a48SAshwin Sekhar T K 3571d9f8a48SAshwin Sekhar T K pool_req = mbox_alloc_msg_npa_aq_enq(mbox); 3581d9f8a48SAshwin Sekhar T K if (pool_req == NULL) 35944a9307cSRakesh Kudurumalla goto exit; 3601d9f8a48SAshwin Sekhar T K pool_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle); 3611d9f8a48SAshwin Sekhar T K pool_req->ctype = NPA_AQ_CTYPE_POOL; 3621d9f8a48SAshwin Sekhar T K pool_req->op = NPA_AQ_INSTOP_WRITE; 3631d9f8a48SAshwin Sekhar T K pool_req->pool.op_pc = 0; 3641d9f8a48SAshwin Sekhar T K pool_req->pool_mask.op_pc = ~pool_req->pool_mask.op_pc; 3651d9f8a48SAshwin Sekhar T K 3661d9f8a48SAshwin Sekhar T K rc = mbox_process(mbox); 3671d9f8a48SAshwin Sekhar T K if (rc < 0) 36844a9307cSRakesh Kudurumalla goto exit; 3691d9f8a48SAshwin Sekhar T K 3701d9f8a48SAshwin Sekhar T K off = mbox->rx_start + 3711d9f8a48SAshwin Sekhar T K PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN); 3721d9f8a48SAshwin Sekhar T K pool_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off); 3731d9f8a48SAshwin Sekhar T K 37444a9307cSRakesh Kudurumalla if (pool_rsp->hdr.rc != 0) { 37544a9307cSRakesh Kudurumalla rc = NPA_ERR_AURA_POOL_FINI; 37644a9307cSRakesh Kudurumalla goto exit; 37744a9307cSRakesh Kudurumalla } 3781d9f8a48SAshwin Sekhar T K 3791d9f8a48SAshwin Sekhar T K /* Sync NDC-NPA for LF */ 3801d9f8a48SAshwin Sekhar T K ndc_req = mbox_alloc_msg_ndc_sync_op(mbox); 38144a9307cSRakesh Kudurumalla if (ndc_req == NULL) { 38244a9307cSRakesh Kudurumalla rc = -ENOSPC; 38344a9307cSRakesh Kudurumalla goto exit; 38444a9307cSRakesh Kudurumalla } 3851d9f8a48SAshwin Sekhar T K ndc_req->npa_lf_sync = 1; 3861d9f8a48SAshwin Sekhar T K rc = mbox_process(mbox); 3871d9f8a48SAshwin Sekhar T K if (rc) { 3881d9f8a48SAshwin Sekhar T K plt_err("Error on NDC-NPA LF sync, rc %d", rc); 38944a9307cSRakesh Kudurumalla rc = NPA_ERR_AURA_POOL_FINI; 39044a9307cSRakesh Kudurumalla goto exit; 3911d9f8a48SAshwin Sekhar T K } 39244a9307cSRakesh Kudurumalla rc = 0; 39344a9307cSRakesh Kudurumalla exit: 39444a9307cSRakesh Kudurumalla mbox_put(mbox); 39544a9307cSRakesh Kudurumalla return rc; 3961d9f8a48SAshwin Sekhar T K } 397c8c967e1SNithin Dabilpuram 398c8c967e1SNithin Dabilpuram int 399c8c967e1SNithin Dabilpuram roc_npa_aura_drop_set(uint64_t aura_handle, uint64_t limit, bool ena) 400c8c967e1SNithin Dabilpuram { 401143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_req_cn20k; 402c8c967e1SNithin Dabilpuram struct npa_aq_enq_req *aura_req; 403c8c967e1SNithin Dabilpuram struct npa_lf *lf; 40444a9307cSRakesh Kudurumalla struct mbox *mbox; 405c8c967e1SNithin Dabilpuram int rc; 406c8c967e1SNithin Dabilpuram 407c8c967e1SNithin Dabilpuram lf = idev_npa_obj_get(); 408c8c967e1SNithin Dabilpuram if (lf == NULL) 409c8c967e1SNithin Dabilpuram return NPA_ERR_DEVICE_NOT_BOUNDED; 41044a9307cSRakesh Kudurumalla mbox = mbox_get(lf->mbox); 411143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 412143a419eSAshwin Sekhar T K aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 413143a419eSAshwin Sekhar T K aura_req = (struct npa_aq_enq_req *)aura_req_cn20k; 414143a419eSAshwin Sekhar T K } else { 41544a9307cSRakesh Kudurumalla aura_req = mbox_alloc_msg_npa_aq_enq(mbox); 416143a419eSAshwin Sekhar T K } 41744a9307cSRakesh Kudurumalla if (aura_req == NULL) { 41844a9307cSRakesh Kudurumalla rc = -ENOMEM; 41944a9307cSRakesh Kudurumalla goto exit; 42044a9307cSRakesh Kudurumalla } 421c8c967e1SNithin Dabilpuram aura_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle); 422c8c967e1SNithin Dabilpuram aura_req->ctype = NPA_AQ_CTYPE_AURA; 423c8c967e1SNithin Dabilpuram aura_req->op = NPA_AQ_INSTOP_WRITE; 424c8c967e1SNithin Dabilpuram 425c8c967e1SNithin Dabilpuram aura_req->aura.aura_drop_ena = ena; 426c8c967e1SNithin Dabilpuram aura_req->aura.aura_drop = limit; 427c8c967e1SNithin Dabilpuram aura_req->aura_mask.aura_drop_ena = 428c8c967e1SNithin Dabilpuram ~(aura_req->aura_mask.aura_drop_ena); 429c8c967e1SNithin Dabilpuram aura_req->aura_mask.aura_drop = ~(aura_req->aura_mask.aura_drop); 43044a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 431c8c967e1SNithin Dabilpuram 43244a9307cSRakesh Kudurumalla exit: 43344a9307cSRakesh Kudurumalla mbox_put(mbox); 434c8c967e1SNithin Dabilpuram return rc; 435c8c967e1SNithin Dabilpuram } 436c8c967e1SNithin Dabilpuram 437f765f561SAshwin Sekhar T K static inline char * 438f765f561SAshwin Sekhar T K npa_stack_memzone_name(struct npa_lf *lf, int pool_id, char *name) 439f765f561SAshwin Sekhar T K { 440f765f561SAshwin Sekhar T K snprintf(name, PLT_MEMZONE_NAMESIZE, "roc_npa_stack_%x_%d", lf->pf_func, 441f765f561SAshwin Sekhar T K pool_id); 442f765f561SAshwin Sekhar T K return name; 443f765f561SAshwin Sekhar T K } 444f765f561SAshwin Sekhar T K 445f765f561SAshwin Sekhar T K static inline const struct plt_memzone * 446f765f561SAshwin Sekhar T K npa_stack_dma_alloc(struct npa_lf *lf, char *name, int pool_id, size_t size) 447f765f561SAshwin Sekhar T K { 448f765f561SAshwin Sekhar T K const char *mz_name = npa_stack_memzone_name(lf, pool_id, name); 449e587e0d5SAshwin Sekhar T K size = PLT_ALIGN_CEIL(size, ROC_ALIGN); 450f765f561SAshwin Sekhar T K 45114a4e284SAshwin Sekhar T K return plt_memzone_reserve_aligned(mz_name, size, 0, ROC_ALIGN); 452f765f561SAshwin Sekhar T K } 453f765f561SAshwin Sekhar T K 454f765f561SAshwin Sekhar T K static inline int 455f765f561SAshwin Sekhar T K npa_stack_dma_free(struct npa_lf *lf, char *name, int pool_id) 456f765f561SAshwin Sekhar T K { 457f765f561SAshwin Sekhar T K const struct plt_memzone *mz; 458f765f561SAshwin Sekhar T K 459f765f561SAshwin Sekhar T K mz = plt_memzone_lookup(npa_stack_memzone_name(lf, pool_id, name)); 460f765f561SAshwin Sekhar T K if (mz == NULL) 461f765f561SAshwin Sekhar T K return NPA_ERR_PARAM; 462f765f561SAshwin Sekhar T K 463f765f561SAshwin Sekhar T K return plt_memzone_free(mz); 464f765f561SAshwin Sekhar T K } 465f765f561SAshwin Sekhar T K 466f765f561SAshwin Sekhar T K static inline int 467f765f561SAshwin Sekhar T K bitmap_ctzll(uint64_t slab) 468f765f561SAshwin Sekhar T K { 469f765f561SAshwin Sekhar T K if (slab == 0) 470f765f561SAshwin Sekhar T K return 0; 471f765f561SAshwin Sekhar T K 472354bf671SJerin Jacob return plt_ctz64(slab); 473f765f561SAshwin Sekhar T K } 474f765f561SAshwin Sekhar T K 475f765f561SAshwin Sekhar T K static int 4768e5a4adbSNithin Dabilpuram find_free_aura(struct npa_lf *lf, uint32_t flags) 4778e5a4adbSNithin Dabilpuram { 4788e5a4adbSNithin Dabilpuram struct plt_bitmap *bmp = lf->npa_bmp; 4798e5a4adbSNithin Dabilpuram uint64_t aura0_state = 0; 4808e5a4adbSNithin Dabilpuram uint64_t slab; 4818e5a4adbSNithin Dabilpuram uint32_t pos; 4828e5a4adbSNithin Dabilpuram int idx = -1; 4838e5a4adbSNithin Dabilpuram int rc; 4848e5a4adbSNithin Dabilpuram 4858e5a4adbSNithin Dabilpuram if (flags & ROC_NPA_ZERO_AURA_F) { 4868e5a4adbSNithin Dabilpuram /* Only look for zero aura */ 4878e5a4adbSNithin Dabilpuram if (plt_bitmap_get(bmp, 0)) 4888e5a4adbSNithin Dabilpuram return 0; 4898e5a4adbSNithin Dabilpuram plt_err("Zero aura already in use"); 4908e5a4adbSNithin Dabilpuram return -1; 4918e5a4adbSNithin Dabilpuram } 4928e5a4adbSNithin Dabilpuram 4938e5a4adbSNithin Dabilpuram if (lf->zero_aura_rsvd) { 4948e5a4adbSNithin Dabilpuram /* Save and clear zero aura bit if needed */ 4958e5a4adbSNithin Dabilpuram aura0_state = plt_bitmap_get(bmp, 0); 4968e5a4adbSNithin Dabilpuram if (aura0_state) 4978e5a4adbSNithin Dabilpuram plt_bitmap_clear(bmp, 0); 4988e5a4adbSNithin Dabilpuram } 4998e5a4adbSNithin Dabilpuram 5008e5a4adbSNithin Dabilpuram pos = 0; 5018e5a4adbSNithin Dabilpuram slab = 0; 5028e5a4adbSNithin Dabilpuram /* Scan from the beginning */ 5038e5a4adbSNithin Dabilpuram plt_bitmap_scan_init(bmp); 5048e5a4adbSNithin Dabilpuram /* Scan bitmap to get the free pool */ 5058e5a4adbSNithin Dabilpuram rc = plt_bitmap_scan(bmp, &pos, &slab); 5068e5a4adbSNithin Dabilpuram /* Empty bitmap */ 5078e5a4adbSNithin Dabilpuram if (rc == 0) { 5088e5a4adbSNithin Dabilpuram plt_err("Aura's exhausted"); 5098e5a4adbSNithin Dabilpuram goto empty; 5108e5a4adbSNithin Dabilpuram } 5118e5a4adbSNithin Dabilpuram 5128e5a4adbSNithin Dabilpuram idx = pos + bitmap_ctzll(slab); 5138e5a4adbSNithin Dabilpuram empty: 5148e5a4adbSNithin Dabilpuram if (lf->zero_aura_rsvd && aura0_state) 5158e5a4adbSNithin Dabilpuram plt_bitmap_set(bmp, 0); 5168e5a4adbSNithin Dabilpuram 5178e5a4adbSNithin Dabilpuram return idx; 5188e5a4adbSNithin Dabilpuram } 5198e5a4adbSNithin Dabilpuram 5208e5a4adbSNithin Dabilpuram static int 521f765f561SAshwin Sekhar T K npa_aura_pool_pair_alloc(struct npa_lf *lf, const uint32_t block_size, 522f765f561SAshwin Sekhar T K const uint32_t block_count, struct npa_aura_s *aura, 5238e5a4adbSNithin Dabilpuram struct npa_pool_s *pool, uint64_t *aura_handle, 5248e5a4adbSNithin Dabilpuram uint32_t flags) 525f765f561SAshwin Sekhar T K { 526f765f561SAshwin Sekhar T K int rc, aura_id, pool_id, stack_size, alloc_size; 527f765f561SAshwin Sekhar T K char name[PLT_MEMZONE_NAMESIZE]; 528f765f561SAshwin Sekhar T K const struct plt_memzone *mz; 529f765f561SAshwin Sekhar T K 530f765f561SAshwin Sekhar T K /* Sanity check */ 531f765f561SAshwin Sekhar T K if (!lf || !block_size || !block_count || !pool || !aura || 532f765f561SAshwin Sekhar T K !aura_handle) 533f765f561SAshwin Sekhar T K return NPA_ERR_PARAM; 534f765f561SAshwin Sekhar T K 535f765f561SAshwin Sekhar T K /* Block size should be cache line aligned and in range of 128B-128KB */ 536f765f561SAshwin Sekhar T K if (block_size % ROC_ALIGN || block_size < 128 || 53750d08d39SJerin Jacob block_size > ROC_NPA_MAX_BLOCK_SZ) 538f765f561SAshwin Sekhar T K return NPA_ERR_INVALID_BLOCK_SZ; 539f765f561SAshwin Sekhar T K 540f765f561SAshwin Sekhar T K /* Get aura_id from resource bitmap */ 54144a9307cSRakesh Kudurumalla roc_npa_dev_lock(); 5428e5a4adbSNithin Dabilpuram aura_id = find_free_aura(lf, flags); 54344a9307cSRakesh Kudurumalla if (aura_id < 0) { 54444a9307cSRakesh Kudurumalla roc_npa_dev_unlock(); 5458e5a4adbSNithin Dabilpuram return NPA_ERR_AURA_ID_ALLOC; 54644a9307cSRakesh Kudurumalla } 5478e5a4adbSNithin Dabilpuram 548f765f561SAshwin Sekhar T K /* Mark pool as reserved */ 549f765f561SAshwin Sekhar T K plt_bitmap_clear(lf->npa_bmp, aura_id); 55044a9307cSRakesh Kudurumalla roc_npa_dev_unlock(); 551f765f561SAshwin Sekhar T K 552f765f561SAshwin Sekhar T K /* Configuration based on each aura has separate pool(aura-pool pair) */ 553f765f561SAshwin Sekhar T K pool_id = aura_id; 554f765f561SAshwin Sekhar T K rc = (aura_id < 0 || pool_id >= (int)lf->nr_pools || 555f765f561SAshwin Sekhar T K aura_id >= (int)BIT_ULL(6 + lf->aura_sz)) ? 556f765f561SAshwin Sekhar T K NPA_ERR_AURA_ID_ALLOC : 557f765f561SAshwin Sekhar T K 0; 558f765f561SAshwin Sekhar T K if (rc) 559f765f561SAshwin Sekhar T K goto exit; 560f765f561SAshwin Sekhar T K 561f765f561SAshwin Sekhar T K /* Allocate stack memory */ 562f765f561SAshwin Sekhar T K stack_size = (block_count + lf->stack_pg_ptrs - 1) / lf->stack_pg_ptrs; 563f765f561SAshwin Sekhar T K alloc_size = stack_size * lf->stack_pg_bytes; 564f765f561SAshwin Sekhar T K 565f765f561SAshwin Sekhar T K mz = npa_stack_dma_alloc(lf, name, pool_id, alloc_size); 566f765f561SAshwin Sekhar T K if (mz == NULL) { 567f765f561SAshwin Sekhar T K rc = NPA_ERR_ALLOC; 568f765f561SAshwin Sekhar T K goto aura_res_put; 569f765f561SAshwin Sekhar T K } 570f765f561SAshwin Sekhar T K 571f765f561SAshwin Sekhar T K /* Update aura fields */ 572f765f561SAshwin Sekhar T K aura->pool_addr = pool_id; /* AF will translate to associated poolctx */ 573f765f561SAshwin Sekhar T K aura->ena = 1; 57495bec117SSatha Rao aura->shift = plt_log2_u32(block_count); 57595bec117SSatha Rao aura->shift = aura->shift < 8 ? 0 : aura->shift - 8; 576f765f561SAshwin Sekhar T K aura->limit = block_count; 577f765f561SAshwin Sekhar T K aura->pool_caching = 1; 578f765f561SAshwin Sekhar T K aura->err_int_ena = BIT(NPA_AURA_ERR_INT_AURA_ADD_OVER); 579f765f561SAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_ADD_UNDER); 580f765f561SAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_FREE_UNDER); 581f765f561SAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_POOL_DIS); 582c8c967e1SNithin Dabilpuram aura->avg_con = 0; 583f765f561SAshwin Sekhar T K /* Many to one reduction */ 584f765f561SAshwin Sekhar T K aura->err_qint_idx = aura_id % lf->qints; 585f765f561SAshwin Sekhar T K 586f765f561SAshwin Sekhar T K /* Update pool fields */ 587f765f561SAshwin Sekhar T K pool->stack_base = mz->iova; 588f765f561SAshwin Sekhar T K pool->ena = 1; 58995377ce2SKommula Shiva Shankar /* In opaque mode buffer size must be 0 */ 59095377ce2SKommula Shiva Shankar if (!pool->nat_align) 59195377ce2SKommula Shiva Shankar pool->buf_size = 0; 59295377ce2SKommula Shiva Shankar else 593f765f561SAshwin Sekhar T K pool->buf_size = block_size / ROC_ALIGN; 594f765f561SAshwin Sekhar T K pool->stack_max_pages = stack_size; 59595bec117SSatha Rao pool->shift = plt_log2_u32(block_count); 59695bec117SSatha Rao pool->shift = pool->shift < 8 ? 0 : pool->shift - 8; 597f765f561SAshwin Sekhar T K pool->ptr_start = 0; 598f765f561SAshwin Sekhar T K pool->ptr_end = ~0; 599f765f561SAshwin Sekhar T K pool->stack_caching = 1; 600f765f561SAshwin Sekhar T K pool->err_int_ena = BIT(NPA_POOL_ERR_INT_OVFLS); 601f765f561SAshwin Sekhar T K pool->err_int_ena |= BIT(NPA_POOL_ERR_INT_RANGE); 602f765f561SAshwin Sekhar T K pool->err_int_ena |= BIT(NPA_POOL_ERR_INT_PERR); 603c8c967e1SNithin Dabilpuram pool->avg_con = 0; 604f765f561SAshwin Sekhar T K 605f765f561SAshwin Sekhar T K /* Many to one reduction */ 606f765f561SAshwin Sekhar T K pool->err_qint_idx = pool_id % lf->qints; 607f765f561SAshwin Sekhar T K 608f765f561SAshwin Sekhar T K /* Issue AURA_INIT and POOL_INIT op */ 609f765f561SAshwin Sekhar T K rc = npa_aura_pool_init(lf->mbox, aura_id, aura, pool); 610f765f561SAshwin Sekhar T K if (rc) 611f765f561SAshwin Sekhar T K goto stack_mem_free; 612f765f561SAshwin Sekhar T K 6135c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].shift = aura->shift; 6145c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].limit = aura->limit; 615f765f561SAshwin Sekhar T K *aura_handle = roc_npa_aura_handle_gen(aura_id, lf->base); 616f765f561SAshwin Sekhar T K /* Update aura count */ 617f765f561SAshwin Sekhar T K roc_npa_aura_op_cnt_set(*aura_handle, 0, block_count); 618f765f561SAshwin Sekhar T K /* Read it back to make sure aura count is updated */ 619f765f561SAshwin Sekhar T K roc_npa_aura_op_cnt_get(*aura_handle); 620f765f561SAshwin Sekhar T K 621f765f561SAshwin Sekhar T K return 0; 622f765f561SAshwin Sekhar T K 623f765f561SAshwin Sekhar T K stack_mem_free: 624f765f561SAshwin Sekhar T K plt_memzone_free(mz); 625f765f561SAshwin Sekhar T K aura_res_put: 62644a9307cSRakesh Kudurumalla roc_npa_dev_lock(); 627f765f561SAshwin Sekhar T K plt_bitmap_set(lf->npa_bmp, aura_id); 62844a9307cSRakesh Kudurumalla roc_npa_dev_unlock(); 629f765f561SAshwin Sekhar T K exit: 630f765f561SAshwin Sekhar T K return rc; 631f765f561SAshwin Sekhar T K } 632f765f561SAshwin Sekhar T K 633f765f561SAshwin Sekhar T K int 634f765f561SAshwin Sekhar T K roc_npa_pool_create(uint64_t *aura_handle, uint32_t block_size, 635f765f561SAshwin Sekhar T K uint32_t block_count, struct npa_aura_s *aura, 6368e5a4adbSNithin Dabilpuram struct npa_pool_s *pool, uint32_t flags) 637f765f561SAshwin Sekhar T K { 638f765f561SAshwin Sekhar T K struct npa_aura_s defaura; 639f765f561SAshwin Sekhar T K struct npa_pool_s defpool; 640f765f561SAshwin Sekhar T K struct idev_cfg *idev; 641f765f561SAshwin Sekhar T K struct npa_lf *lf; 642f765f561SAshwin Sekhar T K int rc; 643f765f561SAshwin Sekhar T K 644f765f561SAshwin Sekhar T K lf = idev_npa_obj_get(); 645f765f561SAshwin Sekhar T K if (lf == NULL) { 646f765f561SAshwin Sekhar T K rc = NPA_ERR_DEVICE_NOT_BOUNDED; 647f765f561SAshwin Sekhar T K goto error; 648f765f561SAshwin Sekhar T K } 649f765f561SAshwin Sekhar T K 650f765f561SAshwin Sekhar T K idev = idev_get_cfg(); 651f765f561SAshwin Sekhar T K if (idev == NULL) { 652f765f561SAshwin Sekhar T K rc = NPA_ERR_ALLOC; 653f765f561SAshwin Sekhar T K goto error; 654f765f561SAshwin Sekhar T K } 655f765f561SAshwin Sekhar T K 6568e5a4adbSNithin Dabilpuram if (flags & ROC_NPA_ZERO_AURA_F && !lf->zero_aura_rsvd) { 6578e5a4adbSNithin Dabilpuram rc = NPA_ERR_ALLOC; 6588e5a4adbSNithin Dabilpuram goto error; 6598e5a4adbSNithin Dabilpuram } 6608e5a4adbSNithin Dabilpuram 661f765f561SAshwin Sekhar T K if (aura == NULL) { 662f765f561SAshwin Sekhar T K memset(&defaura, 0, sizeof(struct npa_aura_s)); 663f765f561SAshwin Sekhar T K aura = &defaura; 664f765f561SAshwin Sekhar T K } 665f765f561SAshwin Sekhar T K if (pool == NULL) { 666f765f561SAshwin Sekhar T K memset(&defpool, 0, sizeof(struct npa_pool_s)); 667f765f561SAshwin Sekhar T K defpool.nat_align = 1; 668f765f561SAshwin Sekhar T K defpool.buf_offset = 1; 669f765f561SAshwin Sekhar T K pool = &defpool; 670f765f561SAshwin Sekhar T K } 671f765f561SAshwin Sekhar T K 672f765f561SAshwin Sekhar T K rc = npa_aura_pool_pair_alloc(lf, block_size, block_count, aura, pool, 6738e5a4adbSNithin Dabilpuram aura_handle, flags); 674f765f561SAshwin Sekhar T K if (rc) { 675f765f561SAshwin Sekhar T K plt_err("Failed to alloc pool or aura rc=%d", rc); 676f765f561SAshwin Sekhar T K goto error; 677f765f561SAshwin Sekhar T K } 678f765f561SAshwin Sekhar T K 679f765f561SAshwin Sekhar T K plt_npa_dbg("lf=%p block_sz=%d block_count=%d aura_handle=0x%" PRIx64, 680f765f561SAshwin Sekhar T K lf, block_size, block_count, *aura_handle); 681f765f561SAshwin Sekhar T K 682f765f561SAshwin Sekhar T K /* Just hold the reference of the object */ 683f765f561SAshwin Sekhar T K __atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST); 684f765f561SAshwin Sekhar T K error: 685f765f561SAshwin Sekhar T K return rc; 686f765f561SAshwin Sekhar T K } 687f765f561SAshwin Sekhar T K 688ea4d70ccSAshwin Sekhar T K static int 689ea4d70ccSAshwin Sekhar T K npa_aura_alloc(struct npa_lf *lf, const uint32_t block_count, int pool_id, 690ea4d70ccSAshwin Sekhar T K struct npa_aura_s *aura, uint64_t *aura_handle, uint32_t flags) 691ea4d70ccSAshwin Sekhar T K { 692ea4d70ccSAshwin Sekhar T K int rc, aura_id; 693ea4d70ccSAshwin Sekhar T K 694ea4d70ccSAshwin Sekhar T K /* Sanity check */ 695ea4d70ccSAshwin Sekhar T K if (!lf || !aura || !aura_handle) 696ea4d70ccSAshwin Sekhar T K return NPA_ERR_PARAM; 697ea4d70ccSAshwin Sekhar T K 698ea4d70ccSAshwin Sekhar T K roc_npa_dev_lock(); 699ea4d70ccSAshwin Sekhar T K /* Get aura_id from resource bitmap */ 700ea4d70ccSAshwin Sekhar T K aura_id = find_free_aura(lf, flags); 701ea4d70ccSAshwin Sekhar T K if (aura_id < 0) { 702ea4d70ccSAshwin Sekhar T K roc_npa_dev_unlock(); 703ea4d70ccSAshwin Sekhar T K return NPA_ERR_AURA_ID_ALLOC; 704ea4d70ccSAshwin Sekhar T K } 705ea4d70ccSAshwin Sekhar T K 706ea4d70ccSAshwin Sekhar T K /* Mark aura as reserved */ 707ea4d70ccSAshwin Sekhar T K plt_bitmap_clear(lf->npa_bmp, aura_id); 708ea4d70ccSAshwin Sekhar T K 709ea4d70ccSAshwin Sekhar T K roc_npa_dev_unlock(); 710ea4d70ccSAshwin Sekhar T K rc = (aura_id < 0 || pool_id >= (int)lf->nr_pools || 711ea4d70ccSAshwin Sekhar T K aura_id >= (int)BIT_ULL(6 + lf->aura_sz)) ? 712ea4d70ccSAshwin Sekhar T K NPA_ERR_AURA_ID_ALLOC : 713ea4d70ccSAshwin Sekhar T K 0; 714ea4d70ccSAshwin Sekhar T K if (rc) 715ea4d70ccSAshwin Sekhar T K goto exit; 716ea4d70ccSAshwin Sekhar T K 717ea4d70ccSAshwin Sekhar T K /* Update aura fields */ 718ea4d70ccSAshwin Sekhar T K aura->pool_addr = pool_id; /* AF will translate to associated poolctx */ 719ea4d70ccSAshwin Sekhar T K aura->ena = 1; 720ea4d70ccSAshwin Sekhar T K aura->shift = plt_log2_u32(block_count); 721ea4d70ccSAshwin Sekhar T K aura->shift = aura->shift < 8 ? 0 : aura->shift - 8; 722ea4d70ccSAshwin Sekhar T K aura->limit = block_count; 723ea4d70ccSAshwin Sekhar T K aura->pool_caching = 1; 724ea4d70ccSAshwin Sekhar T K aura->err_int_ena = BIT(NPA_AURA_ERR_INT_AURA_ADD_OVER); 725ea4d70ccSAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_ADD_UNDER); 726ea4d70ccSAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_FREE_UNDER); 727ea4d70ccSAshwin Sekhar T K aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_POOL_DIS); 728ea4d70ccSAshwin Sekhar T K aura->avg_con = 0; 729ea4d70ccSAshwin Sekhar T K /* Many to one reduction */ 730ea4d70ccSAshwin Sekhar T K aura->err_qint_idx = aura_id % lf->qints; 731ea4d70ccSAshwin Sekhar T K 732ea4d70ccSAshwin Sekhar T K /* Issue AURA_INIT and POOL_INIT op */ 733ea4d70ccSAshwin Sekhar T K rc = npa_aura_init(lf->mbox, aura_id, aura); 734ea4d70ccSAshwin Sekhar T K if (rc) 735ea4d70ccSAshwin Sekhar T K return rc; 736ea4d70ccSAshwin Sekhar T K 7375c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].shift = aura->shift; 7385c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].limit = aura->limit; 739ea4d70ccSAshwin Sekhar T K *aura_handle = roc_npa_aura_handle_gen(aura_id, lf->base); 740ea4d70ccSAshwin Sekhar T K 741ea4d70ccSAshwin Sekhar T K return 0; 742ea4d70ccSAshwin Sekhar T K 743ea4d70ccSAshwin Sekhar T K exit: 744ea4d70ccSAshwin Sekhar T K return rc; 745ea4d70ccSAshwin Sekhar T K } 746ea4d70ccSAshwin Sekhar T K 747ea4d70ccSAshwin Sekhar T K int 748ea4d70ccSAshwin Sekhar T K roc_npa_aura_create(uint64_t *aura_handle, uint32_t block_count, 749ea4d70ccSAshwin Sekhar T K struct npa_aura_s *aura, int pool_id, uint32_t flags) 750ea4d70ccSAshwin Sekhar T K { 751ea4d70ccSAshwin Sekhar T K struct npa_aura_s defaura; 752ea4d70ccSAshwin Sekhar T K struct idev_cfg *idev; 753ea4d70ccSAshwin Sekhar T K struct npa_lf *lf; 754ea4d70ccSAshwin Sekhar T K int rc; 755ea4d70ccSAshwin Sekhar T K 756ea4d70ccSAshwin Sekhar T K lf = idev_npa_obj_get(); 757ea4d70ccSAshwin Sekhar T K if (lf == NULL) { 758ea4d70ccSAshwin Sekhar T K rc = NPA_ERR_DEVICE_NOT_BOUNDED; 759ea4d70ccSAshwin Sekhar T K goto error; 760ea4d70ccSAshwin Sekhar T K } 761ea4d70ccSAshwin Sekhar T K 762ea4d70ccSAshwin Sekhar T K idev = idev_get_cfg(); 763ea4d70ccSAshwin Sekhar T K if (idev == NULL) { 764ea4d70ccSAshwin Sekhar T K rc = NPA_ERR_ALLOC; 765ea4d70ccSAshwin Sekhar T K goto error; 766ea4d70ccSAshwin Sekhar T K } 767ea4d70ccSAshwin Sekhar T K 768ea4d70ccSAshwin Sekhar T K if (flags & ROC_NPA_ZERO_AURA_F && !lf->zero_aura_rsvd) { 769ea4d70ccSAshwin Sekhar T K rc = NPA_ERR_ALLOC; 770ea4d70ccSAshwin Sekhar T K goto error; 771ea4d70ccSAshwin Sekhar T K } 772ea4d70ccSAshwin Sekhar T K 773ea4d70ccSAshwin Sekhar T K if (aura == NULL) { 774ea4d70ccSAshwin Sekhar T K memset(&defaura, 0, sizeof(struct npa_aura_s)); 775ea4d70ccSAshwin Sekhar T K aura = &defaura; 776ea4d70ccSAshwin Sekhar T K } 777ea4d70ccSAshwin Sekhar T K 778ea4d70ccSAshwin Sekhar T K rc = npa_aura_alloc(lf, block_count, pool_id, aura, aura_handle, flags); 779ea4d70ccSAshwin Sekhar T K if (rc) { 780ea4d70ccSAshwin Sekhar T K plt_err("Failed to alloc aura rc=%d", rc); 781ea4d70ccSAshwin Sekhar T K goto error; 782ea4d70ccSAshwin Sekhar T K } 783ea4d70ccSAshwin Sekhar T K 784ea4d70ccSAshwin Sekhar T K plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, *aura_handle); 785ea4d70ccSAshwin Sekhar T K 786ea4d70ccSAshwin Sekhar T K /* Just hold the reference of the object */ 787ea4d70ccSAshwin Sekhar T K __atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST); 788ea4d70ccSAshwin Sekhar T K error: 789ea4d70ccSAshwin Sekhar T K return rc; 790ea4d70ccSAshwin Sekhar T K } 791ea4d70ccSAshwin Sekhar T K 792f765f561SAshwin Sekhar T K int 793f765f561SAshwin Sekhar T K roc_npa_aura_limit_modify(uint64_t aura_handle, uint16_t aura_limit) 794f765f561SAshwin Sekhar T K { 795143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *aura_req_cn20k; 796f765f561SAshwin Sekhar T K struct npa_aq_enq_req *aura_req; 797f765f561SAshwin Sekhar T K struct npa_lf *lf; 79844a9307cSRakesh Kudurumalla struct mbox *mbox; 799f765f561SAshwin Sekhar T K int rc; 800f765f561SAshwin Sekhar T K 801f765f561SAshwin Sekhar T K lf = idev_npa_obj_get(); 802f765f561SAshwin Sekhar T K if (lf == NULL) 803f765f561SAshwin Sekhar T K return NPA_ERR_DEVICE_NOT_BOUNDED; 804f765f561SAshwin Sekhar T K 80544a9307cSRakesh Kudurumalla mbox = mbox_get(lf->mbox); 806143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 807143a419eSAshwin Sekhar T K aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 808143a419eSAshwin Sekhar T K aura_req = (struct npa_aq_enq_req *)aura_req_cn20k; 809143a419eSAshwin Sekhar T K } else { 81044a9307cSRakesh Kudurumalla aura_req = mbox_alloc_msg_npa_aq_enq(mbox); 811143a419eSAshwin Sekhar T K } 81244a9307cSRakesh Kudurumalla if (aura_req == NULL) { 81344a9307cSRakesh Kudurumalla rc = -ENOMEM; 81444a9307cSRakesh Kudurumalla goto exit; 81544a9307cSRakesh Kudurumalla } 816f765f561SAshwin Sekhar T K aura_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle); 817f765f561SAshwin Sekhar T K aura_req->ctype = NPA_AQ_CTYPE_AURA; 818f765f561SAshwin Sekhar T K aura_req->op = NPA_AQ_INSTOP_WRITE; 819f765f561SAshwin Sekhar T K 820f765f561SAshwin Sekhar T K aura_req->aura.limit = aura_limit; 821f765f561SAshwin Sekhar T K aura_req->aura_mask.limit = ~(aura_req->aura_mask.limit); 82244a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 8235c9ccdd7SRakesh Kudurumalla if (rc) 8245c9ccdd7SRakesh Kudurumalla goto exit; 8255c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_req->aura_id].limit = aura_req->aura.limit; 82644a9307cSRakesh Kudurumalla exit: 82744a9307cSRakesh Kudurumalla mbox_put(mbox); 828f765f561SAshwin Sekhar T K return rc; 829f765f561SAshwin Sekhar T K } 830f765f561SAshwin Sekhar T K 831f765f561SAshwin Sekhar T K static int 832f765f561SAshwin Sekhar T K npa_aura_pool_pair_free(struct npa_lf *lf, uint64_t aura_handle) 833f765f561SAshwin Sekhar T K { 834f765f561SAshwin Sekhar T K char name[PLT_MEMZONE_NAMESIZE]; 835f765f561SAshwin Sekhar T K int aura_id, pool_id, rc; 836f765f561SAshwin Sekhar T K 837f765f561SAshwin Sekhar T K if (!lf || !aura_handle) 838f765f561SAshwin Sekhar T K return NPA_ERR_PARAM; 839f765f561SAshwin Sekhar T K 840f765f561SAshwin Sekhar T K aura_id = roc_npa_aura_handle_to_aura(aura_handle); 841f765f561SAshwin Sekhar T K pool_id = aura_id; 842f765f561SAshwin Sekhar T K rc = npa_aura_pool_fini(lf->mbox, aura_id, aura_handle); 843f765f561SAshwin Sekhar T K rc |= npa_stack_dma_free(lf, name, pool_id); 844de00cc35SNithin Dabilpuram memset(&lf->aura_attr[aura_id], 0, sizeof(struct npa_aura_attr)); 845f765f561SAshwin Sekhar T K 84644a9307cSRakesh Kudurumalla roc_npa_dev_lock(); 847f765f561SAshwin Sekhar T K plt_bitmap_set(lf->npa_bmp, aura_id); 84844a9307cSRakesh Kudurumalla roc_npa_dev_unlock(); 849f765f561SAshwin Sekhar T K 850f765f561SAshwin Sekhar T K return rc; 851f765f561SAshwin Sekhar T K } 852f765f561SAshwin Sekhar T K 853f765f561SAshwin Sekhar T K int 854f765f561SAshwin Sekhar T K roc_npa_pool_destroy(uint64_t aura_handle) 855f765f561SAshwin Sekhar T K { 856f765f561SAshwin Sekhar T K struct npa_lf *lf = idev_npa_obj_get(); 857f765f561SAshwin Sekhar T K int rc = 0; 858f765f561SAshwin Sekhar T K 859f765f561SAshwin Sekhar T K plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle); 860f765f561SAshwin Sekhar T K rc = npa_aura_pool_pair_free(lf, aura_handle); 861f765f561SAshwin Sekhar T K if (rc) 862f765f561SAshwin Sekhar T K plt_err("Failed to destroy pool or aura rc=%d", rc); 863f765f561SAshwin Sekhar T K 864f765f561SAshwin Sekhar T K /* Release the reference of npa */ 865f765f561SAshwin Sekhar T K rc |= npa_lf_fini(); 866f765f561SAshwin Sekhar T K return rc; 867f765f561SAshwin Sekhar T K } 868f765f561SAshwin Sekhar T K 869ea4d70ccSAshwin Sekhar T K static int 870ea4d70ccSAshwin Sekhar T K npa_aura_free(struct npa_lf *lf, uint64_t aura_handle) 871ea4d70ccSAshwin Sekhar T K { 872ea4d70ccSAshwin Sekhar T K int aura_id, rc; 873ea4d70ccSAshwin Sekhar T K 874ea4d70ccSAshwin Sekhar T K if (!lf || !aura_handle) 875ea4d70ccSAshwin Sekhar T K return NPA_ERR_PARAM; 876ea4d70ccSAshwin Sekhar T K 877ea4d70ccSAshwin Sekhar T K aura_id = roc_npa_aura_handle_to_aura(aura_handle); 878ea4d70ccSAshwin Sekhar T K rc = npa_aura_fini(lf->mbox, aura_id); 879ea4d70ccSAshwin Sekhar T K 880ea4d70ccSAshwin Sekhar T K if (rc) 881ea4d70ccSAshwin Sekhar T K return rc; 882ea4d70ccSAshwin Sekhar T K 883ea4d70ccSAshwin Sekhar T K memset(&lf->aura_attr[aura_id], 0, sizeof(struct npa_aura_attr)); 884ea4d70ccSAshwin Sekhar T K 885ea4d70ccSAshwin Sekhar T K roc_npa_dev_lock(); 886ea4d70ccSAshwin Sekhar T K plt_bitmap_set(lf->npa_bmp, aura_id); 887ea4d70ccSAshwin Sekhar T K roc_npa_dev_unlock(); 888ea4d70ccSAshwin Sekhar T K 889ea4d70ccSAshwin Sekhar T K return rc; 890ea4d70ccSAshwin Sekhar T K } 891ea4d70ccSAshwin Sekhar T K 892ea4d70ccSAshwin Sekhar T K int 893ea4d70ccSAshwin Sekhar T K roc_npa_aura_destroy(uint64_t aura_handle) 894ea4d70ccSAshwin Sekhar T K { 895ea4d70ccSAshwin Sekhar T K struct npa_lf *lf = idev_npa_obj_get(); 896ea4d70ccSAshwin Sekhar T K int rc = 0; 897ea4d70ccSAshwin Sekhar T K 898ea4d70ccSAshwin Sekhar T K plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle); 899ea4d70ccSAshwin Sekhar T K rc = npa_aura_free(lf, aura_handle); 900ea4d70ccSAshwin Sekhar T K if (rc) 901ea4d70ccSAshwin Sekhar T K plt_err("Failed to destroy aura rc=%d", rc); 902ea4d70ccSAshwin Sekhar T K 903ea4d70ccSAshwin Sekhar T K /* Release the reference of npa */ 904ea4d70ccSAshwin Sekhar T K rc |= npa_lf_fini(); 905ea4d70ccSAshwin Sekhar T K return rc; 906ea4d70ccSAshwin Sekhar T K } 907ea4d70ccSAshwin Sekhar T K 908f765f561SAshwin Sekhar T K int 909f765f561SAshwin Sekhar T K roc_npa_pool_range_update_check(uint64_t aura_handle) 910f765f561SAshwin Sekhar T K { 911f765f561SAshwin Sekhar T K uint64_t aura_id = roc_npa_aura_handle_to_aura(aura_handle); 912143a419eSAshwin Sekhar T K struct npa_cn20k_aq_enq_req *req_cn20k; 913f765f561SAshwin Sekhar T K __io struct npa_pool_s *pool; 914f765f561SAshwin Sekhar T K struct npa_aq_enq_req *req; 915f765f561SAshwin Sekhar T K struct npa_aq_enq_rsp *rsp; 916143a419eSAshwin Sekhar T K struct npa_aura_lim *lim; 91744a9307cSRakesh Kudurumalla struct mbox *mbox; 918143a419eSAshwin Sekhar T K struct npa_lf *lf; 919f765f561SAshwin Sekhar T K int rc; 920f765f561SAshwin Sekhar T K 921f765f561SAshwin Sekhar T K lf = idev_npa_obj_get(); 922f765f561SAshwin Sekhar T K if (lf == NULL) 923f765f561SAshwin Sekhar T K return NPA_ERR_PARAM; 924f765f561SAshwin Sekhar T K 925f765f561SAshwin Sekhar T K lim = lf->aura_lim; 926f765f561SAshwin Sekhar T K 92744a9307cSRakesh Kudurumalla mbox = mbox_get(lf->mbox); 928143a419eSAshwin Sekhar T K if (roc_model_is_cn20k()) { 929143a419eSAshwin Sekhar T K req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox); 930143a419eSAshwin Sekhar T K req = (struct npa_aq_enq_req *)req_cn20k; 931143a419eSAshwin Sekhar T K } else { 93244a9307cSRakesh Kudurumalla req = mbox_alloc_msg_npa_aq_enq(mbox); 933143a419eSAshwin Sekhar T K } 93444a9307cSRakesh Kudurumalla if (req == NULL) { 93544a9307cSRakesh Kudurumalla rc = -ENOSPC; 93644a9307cSRakesh Kudurumalla goto exit; 93744a9307cSRakesh Kudurumalla } 938f765f561SAshwin Sekhar T K 939f765f561SAshwin Sekhar T K req->aura_id = aura_id; 940f765f561SAshwin Sekhar T K req->ctype = NPA_AQ_CTYPE_POOL; 941f765f561SAshwin Sekhar T K req->op = NPA_AQ_INSTOP_READ; 942f765f561SAshwin Sekhar T K 94344a9307cSRakesh Kudurumalla rc = mbox_process_msg(mbox, (void *)&rsp); 944f765f561SAshwin Sekhar T K if (rc) { 945f765f561SAshwin Sekhar T K plt_err("Failed to get pool(0x%" PRIx64 ") context", aura_id); 94644a9307cSRakesh Kudurumalla goto exit; 947f765f561SAshwin Sekhar T K } 948f765f561SAshwin Sekhar T K 949f765f561SAshwin Sekhar T K pool = &rsp->pool; 950f765f561SAshwin Sekhar T K if (lim[aura_id].ptr_start != pool->ptr_start || 951f765f561SAshwin Sekhar T K lim[aura_id].ptr_end != pool->ptr_end) { 952f765f561SAshwin Sekhar T K plt_err("Range update failed on pool(0x%" PRIx64 ")", aura_id); 95344a9307cSRakesh Kudurumalla rc = NPA_ERR_PARAM; 95444a9307cSRakesh Kudurumalla goto exit; 955f765f561SAshwin Sekhar T K } 956f765f561SAshwin Sekhar T K 95744a9307cSRakesh Kudurumalla rc = 0; 95844a9307cSRakesh Kudurumalla exit: 95944a9307cSRakesh Kudurumalla mbox_put(mbox); 96044a9307cSRakesh Kudurumalla return rc; 961f765f561SAshwin Sekhar T K } 962f765f561SAshwin Sekhar T K 9638e5a4adbSNithin Dabilpuram uint64_t 9648e5a4adbSNithin Dabilpuram roc_npa_zero_aura_handle(void) 9658e5a4adbSNithin Dabilpuram { 9668e5a4adbSNithin Dabilpuram struct idev_cfg *idev; 9678e5a4adbSNithin Dabilpuram struct npa_lf *lf; 9688e5a4adbSNithin Dabilpuram 9698e5a4adbSNithin Dabilpuram lf = idev_npa_obj_get(); 9708e5a4adbSNithin Dabilpuram if (lf == NULL) 9718e5a4adbSNithin Dabilpuram return NPA_ERR_DEVICE_NOT_BOUNDED; 9728e5a4adbSNithin Dabilpuram 9738e5a4adbSNithin Dabilpuram idev = idev_get_cfg(); 9748e5a4adbSNithin Dabilpuram if (idev == NULL) 9758e5a4adbSNithin Dabilpuram return NPA_ERR_ALLOC; 9768e5a4adbSNithin Dabilpuram 9778e5a4adbSNithin Dabilpuram /* Return aura handle only if reserved */ 9788e5a4adbSNithin Dabilpuram if (lf->zero_aura_rsvd) 9798e5a4adbSNithin Dabilpuram return roc_npa_aura_handle_gen(0, lf->base); 9808e5a4adbSNithin Dabilpuram return 0; 9818e5a4adbSNithin Dabilpuram } 9828e5a4adbSNithin Dabilpuram 983ec7c2f5aSShijith Thotton int 984ec7c2f5aSShijith Thotton roc_npa_aura_bp_configure(uint64_t aura_handle, uint16_t bpid, uint8_t bp_intf, uint8_t bp_thresh, 985ec7c2f5aSShijith Thotton bool enable) 986ec7c2f5aSShijith Thotton { 987143a419eSAshwin Sekhar T K /* TODO: Add support for CN20K */ 988ec7c2f5aSShijith Thotton uint32_t aura_id = roc_npa_aura_handle_to_aura(aura_handle); 989ec7c2f5aSShijith Thotton struct npa_lf *lf = idev_npa_obj_get(); 990ec7c2f5aSShijith Thotton struct npa_aq_enq_req *req; 991ec7c2f5aSShijith Thotton struct mbox *mbox; 992ec7c2f5aSShijith Thotton int rc = 0; 993ec7c2f5aSShijith Thotton 994747cd5e9SNithin Dabilpuram plt_npa_dbg("Setting BPID %u BP_INTF 0x%x BP_THRESH %u enable %u on aura %" PRIx64, 995747cd5e9SNithin Dabilpuram bpid, bp_intf, bp_thresh, enable, aura_handle); 996747cd5e9SNithin Dabilpuram 997ec7c2f5aSShijith Thotton if (lf == NULL) 998ec7c2f5aSShijith Thotton return NPA_ERR_PARAM; 999ec7c2f5aSShijith Thotton 1000ec7c2f5aSShijith Thotton mbox = mbox_get(lf->mbox); 1001ec7c2f5aSShijith Thotton req = mbox_alloc_msg_npa_aq_enq(mbox); 1002ec7c2f5aSShijith Thotton if (req == NULL) { 1003ec7c2f5aSShijith Thotton rc = -ENOMEM; 1004ec7c2f5aSShijith Thotton goto fail; 1005ec7c2f5aSShijith Thotton } 1006ec7c2f5aSShijith Thotton 1007ec7c2f5aSShijith Thotton req->aura_id = aura_id; 1008ec7c2f5aSShijith Thotton req->ctype = NPA_AQ_CTYPE_AURA; 1009ec7c2f5aSShijith Thotton req->op = NPA_AQ_INSTOP_WRITE; 1010ec7c2f5aSShijith Thotton 1011ec7c2f5aSShijith Thotton if (enable) { 1012ec7c2f5aSShijith Thotton if (bp_intf & 0x1) { 1013ec7c2f5aSShijith Thotton req->aura.nix0_bpid = bpid; 1014ec7c2f5aSShijith Thotton req->aura_mask.nix0_bpid = ~(req->aura_mask.nix0_bpid); 1015ec7c2f5aSShijith Thotton } else { 1016ec7c2f5aSShijith Thotton req->aura.nix1_bpid = bpid; 1017ec7c2f5aSShijith Thotton req->aura_mask.nix1_bpid = ~(req->aura_mask.nix1_bpid); 1018ec7c2f5aSShijith Thotton } 1019ec7c2f5aSShijith Thotton req->aura.bp = bp_thresh; 1020ec7c2f5aSShijith Thotton req->aura_mask.bp = ~(req->aura_mask.bp); 1021ec7c2f5aSShijith Thotton } else { 1022ec7c2f5aSShijith Thotton req->aura.bp = 0; 1023ec7c2f5aSShijith Thotton req->aura_mask.bp = ~(req->aura_mask.bp); 1024ec7c2f5aSShijith Thotton } 1025ec7c2f5aSShijith Thotton 1026ec7c2f5aSShijith Thotton req->aura.bp_ena = bp_intf; 1027ec7c2f5aSShijith Thotton req->aura_mask.bp_ena = ~(req->aura_mask.bp_ena); 1028ec7c2f5aSShijith Thotton 10295c9ccdd7SRakesh Kudurumalla rc = mbox_process(mbox); 10305c9ccdd7SRakesh Kudurumalla if (rc) 10315c9ccdd7SRakesh Kudurumalla goto fail; 10325c9ccdd7SRakesh Kudurumalla 10335c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].nix0_bpid = req->aura.nix0_bpid; 10345c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].nix1_bpid = req->aura.nix1_bpid; 10355c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].bp_ena = req->aura.bp_ena; 10365c9ccdd7SRakesh Kudurumalla lf->aura_attr[aura_id].bp = req->aura.bp; 1037ec7c2f5aSShijith Thotton fail: 1038ec7c2f5aSShijith Thotton mbox_put(mbox); 1039ec7c2f5aSShijith Thotton return rc; 1040ec7c2f5aSShijith Thotton } 1041ec7c2f5aSShijith Thotton 1042124ff1a4SAshwin Sekhar T K static inline int 104344a9307cSRakesh Kudurumalla npa_attach(struct mbox *m_box) 1044124ff1a4SAshwin Sekhar T K { 104544a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(m_box); 1046124ff1a4SAshwin Sekhar T K struct rsrc_attach_req *req; 104744a9307cSRakesh Kudurumalla int rc; 1048124ff1a4SAshwin Sekhar T K 1049124ff1a4SAshwin Sekhar T K req = mbox_alloc_msg_attach_resources(mbox); 105044a9307cSRakesh Kudurumalla if (req == NULL) { 105144a9307cSRakesh Kudurumalla rc = -ENOSPC; 105244a9307cSRakesh Kudurumalla goto exit; 105344a9307cSRakesh Kudurumalla } 1054124ff1a4SAshwin Sekhar T K req->modify = true; 1055124ff1a4SAshwin Sekhar T K req->npalf = true; 1056124ff1a4SAshwin Sekhar T K 105744a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 105844a9307cSRakesh Kudurumalla exit: 105944a9307cSRakesh Kudurumalla mbox_put(mbox); 106044a9307cSRakesh Kudurumalla return rc; 1061124ff1a4SAshwin Sekhar T K } 1062124ff1a4SAshwin Sekhar T K 1063124ff1a4SAshwin Sekhar T K static inline int 106444a9307cSRakesh Kudurumalla npa_detach(struct mbox *m_box) 1065124ff1a4SAshwin Sekhar T K { 106644a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(m_box); 1067124ff1a4SAshwin Sekhar T K struct rsrc_detach_req *req; 106844a9307cSRakesh Kudurumalla int rc; 1069124ff1a4SAshwin Sekhar T K 1070124ff1a4SAshwin Sekhar T K req = mbox_alloc_msg_detach_resources(mbox); 107144a9307cSRakesh Kudurumalla if (req == NULL) { 107244a9307cSRakesh Kudurumalla rc = -ENOSPC; 107344a9307cSRakesh Kudurumalla goto exit; 107444a9307cSRakesh Kudurumalla } 1075124ff1a4SAshwin Sekhar T K req->partial = true; 1076124ff1a4SAshwin Sekhar T K req->npalf = true; 1077124ff1a4SAshwin Sekhar T K 107844a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 107944a9307cSRakesh Kudurumalla exit: 108044a9307cSRakesh Kudurumalla mbox_put(mbox); 108144a9307cSRakesh Kudurumalla return rc; 1082124ff1a4SAshwin Sekhar T K } 1083124ff1a4SAshwin Sekhar T K 1084124ff1a4SAshwin Sekhar T K static inline int 108544a9307cSRakesh Kudurumalla npa_get_msix_offset(struct mbox *m_box, uint16_t *npa_msixoff) 1086124ff1a4SAshwin Sekhar T K { 108744a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(m_box); 1088124ff1a4SAshwin Sekhar T K struct msix_offset_rsp *msix_rsp; 1089124ff1a4SAshwin Sekhar T K int rc; 1090124ff1a4SAshwin Sekhar T K 109144a9307cSRakesh Kudurumalla /* Initialize msixoff */ 109244a9307cSRakesh Kudurumalla *npa_msixoff = 0; 1093124ff1a4SAshwin Sekhar T K /* Get NPA MSIX vector offsets */ 1094124ff1a4SAshwin Sekhar T K mbox_alloc_msg_msix_offset(mbox); 1095124ff1a4SAshwin Sekhar T K rc = mbox_process_msg(mbox, (void *)&msix_rsp); 1096124ff1a4SAshwin Sekhar T K if (rc == 0) 1097124ff1a4SAshwin Sekhar T K *npa_msixoff = msix_rsp->npa_msixoff; 1098124ff1a4SAshwin Sekhar T K 109944a9307cSRakesh Kudurumalla mbox_put(mbox); 1100124ff1a4SAshwin Sekhar T K return rc; 1101124ff1a4SAshwin Sekhar T K } 1102124ff1a4SAshwin Sekhar T K 1103124ff1a4SAshwin Sekhar T K static inline int 1104124ff1a4SAshwin Sekhar T K npa_lf_alloc(struct npa_lf *lf) 1105124ff1a4SAshwin Sekhar T K { 110644a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(lf->mbox); 1107124ff1a4SAshwin Sekhar T K struct npa_lf_alloc_req *req; 1108124ff1a4SAshwin Sekhar T K struct npa_lf_alloc_rsp *rsp; 1109124ff1a4SAshwin Sekhar T K int rc; 1110124ff1a4SAshwin Sekhar T K 1111124ff1a4SAshwin Sekhar T K req = mbox_alloc_msg_npa_lf_alloc(mbox); 111244a9307cSRakesh Kudurumalla if (req == NULL) { 111344a9307cSRakesh Kudurumalla rc = -ENOSPC; 111444a9307cSRakesh Kudurumalla goto exit; 111544a9307cSRakesh Kudurumalla } 1116124ff1a4SAshwin Sekhar T K req->aura_sz = lf->aura_sz; 1117124ff1a4SAshwin Sekhar T K req->nr_pools = lf->nr_pools; 1118124ff1a4SAshwin Sekhar T K 1119124ff1a4SAshwin Sekhar T K rc = mbox_process_msg(mbox, (void *)&rsp); 112044a9307cSRakesh Kudurumalla if (rc) { 112144a9307cSRakesh Kudurumalla rc = NPA_ERR_ALLOC; 112244a9307cSRakesh Kudurumalla goto exit; 112344a9307cSRakesh Kudurumalla } 1124124ff1a4SAshwin Sekhar T K 1125124ff1a4SAshwin Sekhar T K lf->stack_pg_ptrs = rsp->stack_pg_ptrs; 1126124ff1a4SAshwin Sekhar T K lf->stack_pg_bytes = rsp->stack_pg_bytes; 1127124ff1a4SAshwin Sekhar T K lf->qints = rsp->qints; 1128124ff1a4SAshwin Sekhar T K 112944a9307cSRakesh Kudurumalla rc = 0; 113044a9307cSRakesh Kudurumalla exit: 113144a9307cSRakesh Kudurumalla mbox_put(mbox); 113244a9307cSRakesh Kudurumalla return rc; 1133124ff1a4SAshwin Sekhar T K } 1134124ff1a4SAshwin Sekhar T K 1135124ff1a4SAshwin Sekhar T K static int 113644a9307cSRakesh Kudurumalla npa_lf_free(struct mbox *mail_box) 1137124ff1a4SAshwin Sekhar T K { 113844a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(mail_box); 113944a9307cSRakesh Kudurumalla int rc; 114044a9307cSRakesh Kudurumalla 1141124ff1a4SAshwin Sekhar T K mbox_alloc_msg_npa_lf_free(mbox); 114244a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 114344a9307cSRakesh Kudurumalla mbox_put(mbox); 114444a9307cSRakesh Kudurumalla return rc; 1145124ff1a4SAshwin Sekhar T K } 1146124ff1a4SAshwin Sekhar T K 1147124ff1a4SAshwin Sekhar T K static inline uint32_t 1148124ff1a4SAshwin Sekhar T K aura_size_to_u32(uint8_t val) 1149124ff1a4SAshwin Sekhar T K { 1150124ff1a4SAshwin Sekhar T K if (val == NPA_AURA_SZ_0) 1151124ff1a4SAshwin Sekhar T K return 128; 1152124ff1a4SAshwin Sekhar T K if (val >= NPA_AURA_SZ_MAX) 1153124ff1a4SAshwin Sekhar T K return BIT_ULL(20); 1154124ff1a4SAshwin Sekhar T K 1155124ff1a4SAshwin Sekhar T K return 1 << (val + 6); 1156124ff1a4SAshwin Sekhar T K } 1157124ff1a4SAshwin Sekhar T K 1158124ff1a4SAshwin Sekhar T K static inline void 1159124ff1a4SAshwin Sekhar T K pool_count_aura_sz_get(uint32_t *nr_pools, uint8_t *aura_sz) 1160124ff1a4SAshwin Sekhar T K { 1161124ff1a4SAshwin Sekhar T K uint32_t val; 1162124ff1a4SAshwin Sekhar T K 1163124ff1a4SAshwin Sekhar T K val = roc_idev_npa_maxpools_get(); 1164124ff1a4SAshwin Sekhar T K if (val < aura_size_to_u32(NPA_AURA_SZ_128)) 1165124ff1a4SAshwin Sekhar T K val = 128; 1166124ff1a4SAshwin Sekhar T K if (val > aura_size_to_u32(NPA_AURA_SZ_1M)) 1167124ff1a4SAshwin Sekhar T K val = BIT_ULL(20); 1168124ff1a4SAshwin Sekhar T K 1169124ff1a4SAshwin Sekhar T K roc_idev_npa_maxpools_set(val); 1170124ff1a4SAshwin Sekhar T K *nr_pools = val; 1171124ff1a4SAshwin Sekhar T K *aura_sz = plt_log2_u32(val) - 6; 1172124ff1a4SAshwin Sekhar T K } 1173124ff1a4SAshwin Sekhar T K 1174124ff1a4SAshwin Sekhar T K static int 1175124ff1a4SAshwin Sekhar T K npa_dev_init(struct npa_lf *lf, uintptr_t base, struct mbox *mbox) 1176124ff1a4SAshwin Sekhar T K { 1177124ff1a4SAshwin Sekhar T K uint32_t i, bmp_sz, nr_pools; 1178124ff1a4SAshwin Sekhar T K uint8_t aura_sz; 1179124ff1a4SAshwin Sekhar T K int rc; 1180124ff1a4SAshwin Sekhar T K 1181124ff1a4SAshwin Sekhar T K /* Sanity checks */ 1182124ff1a4SAshwin Sekhar T K if (!lf || !base || !mbox) 1183124ff1a4SAshwin Sekhar T K return NPA_ERR_PARAM; 1184124ff1a4SAshwin Sekhar T K 1185124ff1a4SAshwin Sekhar T K if (base & ROC_AURA_ID_MASK) 1186124ff1a4SAshwin Sekhar T K return NPA_ERR_BASE_INVALID; 1187124ff1a4SAshwin Sekhar T K 1188124ff1a4SAshwin Sekhar T K pool_count_aura_sz_get(&nr_pools, &aura_sz); 1189124ff1a4SAshwin Sekhar T K if (aura_sz == NPA_AURA_SZ_0 || aura_sz >= NPA_AURA_SZ_MAX) 1190124ff1a4SAshwin Sekhar T K return NPA_ERR_PARAM; 1191124ff1a4SAshwin Sekhar T K 1192124ff1a4SAshwin Sekhar T K memset(lf, 0x0, sizeof(*lf)); 1193124ff1a4SAshwin Sekhar T K lf->base = base; 1194124ff1a4SAshwin Sekhar T K lf->aura_sz = aura_sz; 1195124ff1a4SAshwin Sekhar T K lf->nr_pools = nr_pools; 1196124ff1a4SAshwin Sekhar T K lf->mbox = mbox; 1197124ff1a4SAshwin Sekhar T K 1198124ff1a4SAshwin Sekhar T K rc = npa_lf_alloc(lf); 1199124ff1a4SAshwin Sekhar T K if (rc) 1200124ff1a4SAshwin Sekhar T K goto exit; 1201124ff1a4SAshwin Sekhar T K 1202124ff1a4SAshwin Sekhar T K bmp_sz = plt_bitmap_get_memory_footprint(nr_pools); 1203124ff1a4SAshwin Sekhar T K 1204124ff1a4SAshwin Sekhar T K /* Allocate memory for bitmap */ 1205124ff1a4SAshwin Sekhar T K lf->npa_bmp_mem = plt_zmalloc(bmp_sz, ROC_ALIGN); 1206124ff1a4SAshwin Sekhar T K if (lf->npa_bmp_mem == NULL) { 1207124ff1a4SAshwin Sekhar T K rc = NPA_ERR_ALLOC; 1208124ff1a4SAshwin Sekhar T K goto lf_free; 1209124ff1a4SAshwin Sekhar T K } 1210124ff1a4SAshwin Sekhar T K 1211124ff1a4SAshwin Sekhar T K /* Initialize pool resource bitmap array */ 1212124ff1a4SAshwin Sekhar T K lf->npa_bmp = plt_bitmap_init(nr_pools, lf->npa_bmp_mem, bmp_sz); 1213124ff1a4SAshwin Sekhar T K if (lf->npa_bmp == NULL) { 1214124ff1a4SAshwin Sekhar T K rc = NPA_ERR_PARAM; 1215124ff1a4SAshwin Sekhar T K goto bmap_mem_free; 1216124ff1a4SAshwin Sekhar T K } 1217124ff1a4SAshwin Sekhar T K 1218124ff1a4SAshwin Sekhar T K /* Mark all pools available */ 1219124ff1a4SAshwin Sekhar T K for (i = 0; i < nr_pools; i++) 1220124ff1a4SAshwin Sekhar T K plt_bitmap_set(lf->npa_bmp, i); 1221124ff1a4SAshwin Sekhar T K 12228e5a4adbSNithin Dabilpuram /* Reserve zero aura for all models other than CN9K */ 12238e5a4adbSNithin Dabilpuram if (!roc_model_is_cn9k()) 12248e5a4adbSNithin Dabilpuram lf->zero_aura_rsvd = true; 12258e5a4adbSNithin Dabilpuram 1226124ff1a4SAshwin Sekhar T K /* Allocate memory for qint context */ 1227124ff1a4SAshwin Sekhar T K lf->npa_qint_mem = plt_zmalloc(sizeof(struct npa_qint) * nr_pools, 0); 1228124ff1a4SAshwin Sekhar T K if (lf->npa_qint_mem == NULL) { 1229124ff1a4SAshwin Sekhar T K rc = NPA_ERR_ALLOC; 1230124ff1a4SAshwin Sekhar T K goto bmap_free; 1231124ff1a4SAshwin Sekhar T K } 1232124ff1a4SAshwin Sekhar T K 1233124ff1a4SAshwin Sekhar T K /* Allocate memory for nap_aura_lim memory */ 1234124ff1a4SAshwin Sekhar T K lf->aura_lim = plt_zmalloc(sizeof(struct npa_aura_lim) * nr_pools, 0); 1235124ff1a4SAshwin Sekhar T K if (lf->aura_lim == NULL) { 1236124ff1a4SAshwin Sekhar T K rc = NPA_ERR_ALLOC; 1237124ff1a4SAshwin Sekhar T K goto qint_free; 1238124ff1a4SAshwin Sekhar T K } 1239124ff1a4SAshwin Sekhar T K 1240de00cc35SNithin Dabilpuram /* Allocate per-aura attribute */ 1241de00cc35SNithin Dabilpuram lf->aura_attr = plt_zmalloc(sizeof(struct npa_aura_attr) * nr_pools, 0); 1242de00cc35SNithin Dabilpuram if (lf->aura_attr == NULL) { 1243de00cc35SNithin Dabilpuram rc = NPA_ERR_PARAM; 1244de00cc35SNithin Dabilpuram goto lim_free; 1245de00cc35SNithin Dabilpuram } 1246de00cc35SNithin Dabilpuram 1247124ff1a4SAshwin Sekhar T K /* Init aura start & end limits */ 1248124ff1a4SAshwin Sekhar T K for (i = 0; i < nr_pools; i++) { 1249124ff1a4SAshwin Sekhar T K lf->aura_lim[i].ptr_start = UINT64_MAX; 1250124ff1a4SAshwin Sekhar T K lf->aura_lim[i].ptr_end = 0x0ull; 1251124ff1a4SAshwin Sekhar T K } 1252124ff1a4SAshwin Sekhar T K 1253124ff1a4SAshwin Sekhar T K return 0; 1254124ff1a4SAshwin Sekhar T K 1255de00cc35SNithin Dabilpuram lim_free: 1256de00cc35SNithin Dabilpuram plt_free(lf->aura_lim); 1257124ff1a4SAshwin Sekhar T K qint_free: 1258124ff1a4SAshwin Sekhar T K plt_free(lf->npa_qint_mem); 1259124ff1a4SAshwin Sekhar T K bmap_free: 1260124ff1a4SAshwin Sekhar T K plt_bitmap_free(lf->npa_bmp); 1261124ff1a4SAshwin Sekhar T K bmap_mem_free: 1262124ff1a4SAshwin Sekhar T K plt_free(lf->npa_bmp_mem); 1263124ff1a4SAshwin Sekhar T K lf_free: 1264124ff1a4SAshwin Sekhar T K npa_lf_free(lf->mbox); 1265124ff1a4SAshwin Sekhar T K exit: 1266124ff1a4SAshwin Sekhar T K return rc; 1267124ff1a4SAshwin Sekhar T K } 1268124ff1a4SAshwin Sekhar T K 1269124ff1a4SAshwin Sekhar T K static int 1270124ff1a4SAshwin Sekhar T K npa_dev_fini(struct npa_lf *lf) 1271124ff1a4SAshwin Sekhar T K { 1272124ff1a4SAshwin Sekhar T K if (!lf) 1273124ff1a4SAshwin Sekhar T K return NPA_ERR_PARAM; 1274124ff1a4SAshwin Sekhar T K 1275124ff1a4SAshwin Sekhar T K plt_free(lf->aura_lim); 1276124ff1a4SAshwin Sekhar T K plt_free(lf->npa_qint_mem); 1277124ff1a4SAshwin Sekhar T K plt_bitmap_free(lf->npa_bmp); 1278124ff1a4SAshwin Sekhar T K plt_free(lf->npa_bmp_mem); 1279de00cc35SNithin Dabilpuram plt_free(lf->aura_attr); 1280124ff1a4SAshwin Sekhar T K 1281124ff1a4SAshwin Sekhar T K return npa_lf_free(lf->mbox); 1282124ff1a4SAshwin Sekhar T K } 1283124ff1a4SAshwin Sekhar T K 1284124ff1a4SAshwin Sekhar T K int 1285124ff1a4SAshwin Sekhar T K npa_lf_init(struct dev *dev, struct plt_pci_device *pci_dev) 1286124ff1a4SAshwin Sekhar T K { 1287fdbec406SAnoob Joseph uint16_t npa_msixoff = 0; 1288124ff1a4SAshwin Sekhar T K struct idev_cfg *idev; 1289124ff1a4SAshwin Sekhar T K struct npa_lf *lf; 1290124ff1a4SAshwin Sekhar T K int rc; 1291124ff1a4SAshwin Sekhar T K 1292124ff1a4SAshwin Sekhar T K idev = idev_get_cfg(); 1293124ff1a4SAshwin Sekhar T K if (idev == NULL) 1294124ff1a4SAshwin Sekhar T K return NPA_ERR_ALLOC; 1295124ff1a4SAshwin Sekhar T K 1296124ff1a4SAshwin Sekhar T K /* Not the first PCI device */ 1297124ff1a4SAshwin Sekhar T K if (__atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST) != 0) 1298124ff1a4SAshwin Sekhar T K return 0; 1299124ff1a4SAshwin Sekhar T K 130080e1239eSVolodymyr Fialko if (lf_init_cb) { 130180e1239eSVolodymyr Fialko rc = (*lf_init_cb)(pci_dev); 130280e1239eSVolodymyr Fialko if (rc) 130380e1239eSVolodymyr Fialko goto fail; 130480e1239eSVolodymyr Fialko } 130580e1239eSVolodymyr Fialko 1306124ff1a4SAshwin Sekhar T K rc = npa_attach(dev->mbox); 1307124ff1a4SAshwin Sekhar T K if (rc) 1308124ff1a4SAshwin Sekhar T K goto fail; 1309124ff1a4SAshwin Sekhar T K 1310124ff1a4SAshwin Sekhar T K rc = npa_get_msix_offset(dev->mbox, &npa_msixoff); 1311124ff1a4SAshwin Sekhar T K if (rc) 1312124ff1a4SAshwin Sekhar T K goto npa_detach; 1313124ff1a4SAshwin Sekhar T K 1314124ff1a4SAshwin Sekhar T K lf = &dev->npa; 1315124ff1a4SAshwin Sekhar T K rc = npa_dev_init(lf, dev->bar2 + (RVU_BLOCK_ADDR_NPA << 20), 1316124ff1a4SAshwin Sekhar T K dev->mbox); 1317124ff1a4SAshwin Sekhar T K if (rc) 1318124ff1a4SAshwin Sekhar T K goto npa_detach; 1319124ff1a4SAshwin Sekhar T K 1320124ff1a4SAshwin Sekhar T K lf->pf_func = dev->pf_func; 1321124ff1a4SAshwin Sekhar T K lf->npa_msixoff = npa_msixoff; 1322d61138d4SHarman Kalra lf->intr_handle = pci_dev->intr_handle; 1323124ff1a4SAshwin Sekhar T K lf->pci_dev = pci_dev; 1324124ff1a4SAshwin Sekhar T K 1325124ff1a4SAshwin Sekhar T K idev->npa_pf_func = dev->pf_func; 1326124ff1a4SAshwin Sekhar T K idev->npa = lf; 1327124ff1a4SAshwin Sekhar T K plt_wmb(); 1328124ff1a4SAshwin Sekhar T K 1329e67f633eSAshwin Sekhar T K rc = npa_register_irqs(lf); 1330e67f633eSAshwin Sekhar T K if (rc) 1331e67f633eSAshwin Sekhar T K goto npa_fini; 1332e67f633eSAshwin Sekhar T K 1333124ff1a4SAshwin Sekhar T K plt_npa_dbg("npa=%p max_pools=%d pf_func=0x%x msix=0x%x", lf, 1334124ff1a4SAshwin Sekhar T K roc_idev_npa_maxpools_get(), lf->pf_func, npa_msixoff); 1335124ff1a4SAshwin Sekhar T K 1336124ff1a4SAshwin Sekhar T K return 0; 1337124ff1a4SAshwin Sekhar T K 1338e67f633eSAshwin Sekhar T K npa_fini: 1339e67f633eSAshwin Sekhar T K npa_dev_fini(idev->npa); 1340124ff1a4SAshwin Sekhar T K npa_detach: 1341124ff1a4SAshwin Sekhar T K npa_detach(dev->mbox); 1342124ff1a4SAshwin Sekhar T K fail: 1343124ff1a4SAshwin Sekhar T K __atomic_fetch_sub(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST); 1344124ff1a4SAshwin Sekhar T K return rc; 1345124ff1a4SAshwin Sekhar T K } 1346124ff1a4SAshwin Sekhar T K 1347124ff1a4SAshwin Sekhar T K int 1348124ff1a4SAshwin Sekhar T K npa_lf_fini(void) 1349124ff1a4SAshwin Sekhar T K { 1350124ff1a4SAshwin Sekhar T K struct idev_cfg *idev; 1351124ff1a4SAshwin Sekhar T K int rc = 0; 1352124ff1a4SAshwin Sekhar T K 1353124ff1a4SAshwin Sekhar T K idev = idev_get_cfg(); 1354124ff1a4SAshwin Sekhar T K if (idev == NULL) 1355124ff1a4SAshwin Sekhar T K return NPA_ERR_ALLOC; 1356124ff1a4SAshwin Sekhar T K 1357124ff1a4SAshwin Sekhar T K /* Not the last PCI device */ 1358ed090599STyler Retzlaff if (__atomic_fetch_sub(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST) - 1 != 0) 1359124ff1a4SAshwin Sekhar T K return 0; 1360124ff1a4SAshwin Sekhar T K 1361e67f633eSAshwin Sekhar T K npa_unregister_irqs(idev->npa); 1362124ff1a4SAshwin Sekhar T K rc |= npa_dev_fini(idev->npa); 1363124ff1a4SAshwin Sekhar T K rc |= npa_detach(idev->npa->mbox); 1364124ff1a4SAshwin Sekhar T K idev_set_defaults(idev); 1365124ff1a4SAshwin Sekhar T K 1366124ff1a4SAshwin Sekhar T K return rc; 1367124ff1a4SAshwin Sekhar T K } 1368124ff1a4SAshwin Sekhar T K 1369124ff1a4SAshwin Sekhar T K int 1370124ff1a4SAshwin Sekhar T K roc_npa_dev_init(struct roc_npa *roc_npa) 1371124ff1a4SAshwin Sekhar T K { 1372124ff1a4SAshwin Sekhar T K struct plt_pci_device *pci_dev; 1373124ff1a4SAshwin Sekhar T K struct npa *npa; 1374124ff1a4SAshwin Sekhar T K struct dev *dev; 1375124ff1a4SAshwin Sekhar T K int rc; 1376124ff1a4SAshwin Sekhar T K 1377124ff1a4SAshwin Sekhar T K if (roc_npa == NULL || roc_npa->pci_dev == NULL) 1378124ff1a4SAshwin Sekhar T K return NPA_ERR_PARAM; 1379124ff1a4SAshwin Sekhar T K 1380124ff1a4SAshwin Sekhar T K PLT_STATIC_ASSERT(sizeof(struct npa) <= ROC_NPA_MEM_SZ); 1381124ff1a4SAshwin Sekhar T K npa = roc_npa_to_npa_priv(roc_npa); 1382124ff1a4SAshwin Sekhar T K memset(npa, 0, sizeof(*npa)); 1383124ff1a4SAshwin Sekhar T K pci_dev = roc_npa->pci_dev; 1384124ff1a4SAshwin Sekhar T K dev = &npa->dev; 1385124ff1a4SAshwin Sekhar T K 1386124ff1a4SAshwin Sekhar T K /* Initialize device */ 1387124ff1a4SAshwin Sekhar T K rc = dev_init(dev, pci_dev); 1388124ff1a4SAshwin Sekhar T K if (rc) { 1389124ff1a4SAshwin Sekhar T K plt_err("Failed to init roc device"); 1390124ff1a4SAshwin Sekhar T K goto fail; 1391124ff1a4SAshwin Sekhar T K } 1392124ff1a4SAshwin Sekhar T K 1393124ff1a4SAshwin Sekhar T K npa->pci_dev = pci_dev; 1394124ff1a4SAshwin Sekhar T K dev->drv_inited = true; 1395124ff1a4SAshwin Sekhar T K fail: 1396124ff1a4SAshwin Sekhar T K return rc; 1397124ff1a4SAshwin Sekhar T K } 1398124ff1a4SAshwin Sekhar T K 1399124ff1a4SAshwin Sekhar T K int 1400124ff1a4SAshwin Sekhar T K roc_npa_dev_fini(struct roc_npa *roc_npa) 1401124ff1a4SAshwin Sekhar T K { 1402124ff1a4SAshwin Sekhar T K struct npa *npa = roc_npa_to_npa_priv(roc_npa); 1403124ff1a4SAshwin Sekhar T K 1404124ff1a4SAshwin Sekhar T K if (npa == NULL) 1405124ff1a4SAshwin Sekhar T K return NPA_ERR_PARAM; 1406124ff1a4SAshwin Sekhar T K 1407124ff1a4SAshwin Sekhar T K npa->dev.drv_inited = false; 1408124ff1a4SAshwin Sekhar T K return dev_fini(&npa->dev, npa->pci_dev); 1409124ff1a4SAshwin Sekhar T K } 141044a9307cSRakesh Kudurumalla 141144a9307cSRakesh Kudurumalla void 141244a9307cSRakesh Kudurumalla roc_npa_dev_lock(void) 141344a9307cSRakesh Kudurumalla { 141444a9307cSRakesh Kudurumalla struct idev_cfg *idev = idev_get_cfg(); 141544a9307cSRakesh Kudurumalla 141644a9307cSRakesh Kudurumalla if (idev != NULL) 141744a9307cSRakesh Kudurumalla plt_spinlock_lock(&idev->npa_dev_lock); 141844a9307cSRakesh Kudurumalla } 141944a9307cSRakesh Kudurumalla 142044a9307cSRakesh Kudurumalla void 142144a9307cSRakesh Kudurumalla roc_npa_dev_unlock(void) 142244a9307cSRakesh Kudurumalla { 142344a9307cSRakesh Kudurumalla struct idev_cfg *idev = idev_get_cfg(); 142444a9307cSRakesh Kudurumalla 142544a9307cSRakesh Kudurumalla if (idev != NULL) 142644a9307cSRakesh Kudurumalla plt_spinlock_unlock(&idev->npa_dev_lock); 142744a9307cSRakesh Kudurumalla } 1428