119a2b549SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 219a2b549SJerin Jacob * Copyright(C) 2021 Marvell. 319a2b549SJerin Jacob */ 419a2b549SJerin Jacob 5b21f07c9SHarman Kalra #include <math.h> 6b21f07c9SHarman Kalra 719a2b549SJerin Jacob #include "roc_api.h" 819a2b549SJerin Jacob #include "roc_priv.h" 919a2b549SJerin Jacob 10cad8686eSSatha Rao /* Default SQB slack per SQ */ 11cad8686eSSatha Rao #define ROC_NIX_SQB_SLACK_DFLT 24 12cad8686eSSatha Rao 1319a2b549SJerin Jacob static inline uint32_t 1419a2b549SJerin Jacob nix_qsize_to_val(enum nix_q_size qsize) 1519a2b549SJerin Jacob { 1619a2b549SJerin Jacob return (16UL << (qsize * 2)); 1719a2b549SJerin Jacob } 1819a2b549SJerin Jacob 1919a2b549SJerin Jacob static inline enum nix_q_size 2019a2b549SJerin Jacob nix_qsize_clampup(uint32_t val) 2119a2b549SJerin Jacob { 2219a2b549SJerin Jacob int i = nix_q_size_16; 2319a2b549SJerin Jacob 2419a2b549SJerin Jacob for (; i < nix_q_size_max; i++) 2519a2b549SJerin Jacob if (val <= nix_qsize_to_val(i)) 2619a2b549SJerin Jacob break; 2719a2b549SJerin Jacob 2819a2b549SJerin Jacob if (i >= nix_q_size_max) 2919a2b549SJerin Jacob i = nix_q_size_max - 1; 3019a2b549SJerin Jacob 3119a2b549SJerin Jacob return i; 3219a2b549SJerin Jacob } 3319a2b549SJerin Jacob 34e9d33faaSPavan Nikhilesh void 35e9d33faaSPavan Nikhilesh nix_rq_vwqe_flush(struct roc_nix_rq *rq, uint16_t vwqe_interval) 36e9d33faaSPavan Nikhilesh { 37e9d33faaSPavan Nikhilesh uint64_t wait_ns; 38e9d33faaSPavan Nikhilesh 39e9d33faaSPavan Nikhilesh if (!roc_model_is_cn10k()) 40e9d33faaSPavan Nikhilesh return; 41e9d33faaSPavan Nikhilesh /* Due to HW errata writes to VWQE_FLUSH might hang, so instead 42e9d33faaSPavan Nikhilesh * wait for max vwqe timeout interval. 43e9d33faaSPavan Nikhilesh */ 44e9d33faaSPavan Nikhilesh if (rq->vwqe_ena) { 45e9d33faaSPavan Nikhilesh wait_ns = rq->vwqe_wait_tmo * (vwqe_interval + 1) * 100; 46e9d33faaSPavan Nikhilesh plt_delay_us((wait_ns / 1E3) + 1); 47e9d33faaSPavan Nikhilesh } 48e9d33faaSPavan Nikhilesh } 49e9d33faaSPavan Nikhilesh 5019a2b549SJerin Jacob int 5138b177feSNithin Dabilpuram nix_rq_ena_dis(struct dev *dev, struct roc_nix_rq *rq, bool enable) 5219a2b549SJerin Jacob { 5344a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 5444a9307cSRakesh Kudurumalla int rc; 5519a2b549SJerin Jacob 5619a2b549SJerin Jacob /* Pkts will be dropped silently if RQ is disabled */ 5719a2b549SJerin Jacob if (roc_model_is_cn9k()) { 5819a2b549SJerin Jacob struct nix_aq_enq_req *aq; 5919a2b549SJerin Jacob 6019a2b549SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 6144a9307cSRakesh Kudurumalla if (!aq) { 6244a9307cSRakesh Kudurumalla rc = -ENOSPC; 6344a9307cSRakesh Kudurumalla goto exit; 6444a9307cSRakesh Kudurumalla } 65da718c19SNithin Dabilpuram 6619a2b549SJerin Jacob aq->qidx = rq->qid; 6719a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_RQ; 6819a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 6919a2b549SJerin Jacob 7019a2b549SJerin Jacob aq->rq.ena = enable; 7119a2b549SJerin Jacob aq->rq_mask.ena = ~(aq->rq_mask.ena); 724785c406SSatha Rao } else if (roc_model_is_cn10k()) { 7319a2b549SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 7419a2b549SJerin Jacob 7519a2b549SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 7644a9307cSRakesh Kudurumalla if (!aq) { 7744a9307cSRakesh Kudurumalla rc = -ENOSPC; 7844a9307cSRakesh Kudurumalla goto exit; 7944a9307cSRakesh Kudurumalla } 80da718c19SNithin Dabilpuram 8119a2b549SJerin Jacob aq->qidx = rq->qid; 8219a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_RQ; 8319a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 8419a2b549SJerin Jacob 8519a2b549SJerin Jacob aq->rq.ena = enable; 8619a2b549SJerin Jacob aq->rq_mask.ena = ~(aq->rq_mask.ena); 874785c406SSatha Rao } else { 884785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 894785c406SSatha Rao 904785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 914785c406SSatha Rao if (!aq) { 924785c406SSatha Rao rc = -ENOSPC; 934785c406SSatha Rao goto exit; 944785c406SSatha Rao } 954785c406SSatha Rao 964785c406SSatha Rao aq->qidx = rq->qid; 974785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 984785c406SSatha Rao aq->op = NIX_AQ_INSTOP_WRITE; 994785c406SSatha Rao 1004785c406SSatha Rao aq->rq.ena = enable; 1014785c406SSatha Rao aq->rq_mask.ena = ~(aq->rq_mask.ena); 10219a2b549SJerin Jacob } 10319a2b549SJerin Jacob 10444a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 10544a9307cSRakesh Kudurumalla exit: 10644a9307cSRakesh Kudurumalla mbox_put(mbox); 10744a9307cSRakesh Kudurumalla return rc; 10838b177feSNithin Dabilpuram } 10938b177feSNithin Dabilpuram 11038b177feSNithin Dabilpuram int 111f6e0d835SRakesh Kudurumalla roc_nix_sq_ena_dis(struct roc_nix_sq *sq, bool enable) 112f6e0d835SRakesh Kudurumalla { 113f6e0d835SRakesh Kudurumalla int rc = 0; 114f6e0d835SRakesh Kudurumalla 115f6e0d835SRakesh Kudurumalla rc = roc_nix_tm_sq_aura_fc(sq, enable); 116f6e0d835SRakesh Kudurumalla if (rc) 117f6e0d835SRakesh Kudurumalla goto done; 118f6e0d835SRakesh Kudurumalla 119f6e0d835SRakesh Kudurumalla sq->enable = enable; 120f6e0d835SRakesh Kudurumalla done: 121f6e0d835SRakesh Kudurumalla return rc; 122f6e0d835SRakesh Kudurumalla } 123f6e0d835SRakesh Kudurumalla 124f6e0d835SRakesh Kudurumalla int 12538b177feSNithin Dabilpuram roc_nix_rq_ena_dis(struct roc_nix_rq *rq, bool enable) 12638b177feSNithin Dabilpuram { 12738b177feSNithin Dabilpuram struct nix *nix = roc_nix_to_nix_priv(rq->roc_nix); 12838b177feSNithin Dabilpuram int rc; 12938b177feSNithin Dabilpuram 13038b177feSNithin Dabilpuram rc = nix_rq_ena_dis(&nix->dev, rq, enable); 131e9d33faaSPavan Nikhilesh nix_rq_vwqe_flush(rq, nix->vwqe_interval); 1320f3f3ad8SNithin Dabilpuram if (rc) 1330f3f3ad8SNithin Dabilpuram return rc; 13419a2b549SJerin Jacob 1350f3f3ad8SNithin Dabilpuram /* Check for meta aura if RQ is enabled */ 1360f3f3ad8SNithin Dabilpuram if (enable && nix->need_meta_aura) 1374fb24a62SRahul Bhansali rc = roc_nix_inl_meta_aura_check(rq->roc_nix, rq); 13819a2b549SJerin Jacob return rc; 13919a2b549SJerin Jacob } 14019a2b549SJerin Jacob 14138b177feSNithin Dabilpuram int 142174f2f35SSunil Kumar Kori roc_nix_rq_is_sso_enable(struct roc_nix *roc_nix, uint32_t qid) 143174f2f35SSunil Kumar Kori { 144174f2f35SSunil Kumar Kori struct nix *nix = roc_nix_to_nix_priv(roc_nix); 145174f2f35SSunil Kumar Kori struct dev *dev = &nix->dev; 14644a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 147174f2f35SSunil Kumar Kori bool sso_enable; 148174f2f35SSunil Kumar Kori int rc; 149174f2f35SSunil Kumar Kori 150174f2f35SSunil Kumar Kori if (roc_model_is_cn9k()) { 151174f2f35SSunil Kumar Kori struct nix_aq_enq_rsp *rsp; 152174f2f35SSunil Kumar Kori struct nix_aq_enq_req *aq; 153174f2f35SSunil Kumar Kori 154174f2f35SSunil Kumar Kori aq = mbox_alloc_msg_nix_aq_enq(mbox); 15544a9307cSRakesh Kudurumalla if (!aq) { 15644a9307cSRakesh Kudurumalla rc = -ENOSPC; 15744a9307cSRakesh Kudurumalla goto exit; 15844a9307cSRakesh Kudurumalla } 159174f2f35SSunil Kumar Kori 160174f2f35SSunil Kumar Kori aq->qidx = qid; 161174f2f35SSunil Kumar Kori aq->ctype = NIX_AQ_CTYPE_RQ; 162174f2f35SSunil Kumar Kori aq->op = NIX_AQ_INSTOP_READ; 163174f2f35SSunil Kumar Kori rc = mbox_process_msg(mbox, (void *)&rsp); 164174f2f35SSunil Kumar Kori if (rc) 16544a9307cSRakesh Kudurumalla goto exit; 166174f2f35SSunil Kumar Kori 167174f2f35SSunil Kumar Kori sso_enable = rsp->rq.sso_ena; 1684785c406SSatha Rao } else if (roc_model_is_cn10k()) { 169174f2f35SSunil Kumar Kori struct nix_cn10k_aq_enq_rsp *rsp; 170174f2f35SSunil Kumar Kori struct nix_cn10k_aq_enq_req *aq; 171174f2f35SSunil Kumar Kori 172174f2f35SSunil Kumar Kori aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 17344a9307cSRakesh Kudurumalla if (!aq) { 17444a9307cSRakesh Kudurumalla rc = -ENOSPC; 17544a9307cSRakesh Kudurumalla goto exit; 17644a9307cSRakesh Kudurumalla } 177174f2f35SSunil Kumar Kori 178174f2f35SSunil Kumar Kori aq->qidx = qid; 179174f2f35SSunil Kumar Kori aq->ctype = NIX_AQ_CTYPE_RQ; 180174f2f35SSunil Kumar Kori aq->op = NIX_AQ_INSTOP_READ; 181174f2f35SSunil Kumar Kori 182174f2f35SSunil Kumar Kori rc = mbox_process_msg(mbox, (void *)&rsp); 183174f2f35SSunil Kumar Kori if (rc) 18444a9307cSRakesh Kudurumalla goto exit; 185174f2f35SSunil Kumar Kori 186174f2f35SSunil Kumar Kori sso_enable = rsp->rq.sso_ena; 1874785c406SSatha Rao } else { 1884785c406SSatha Rao struct nix_cn20k_aq_enq_rsp *rsp; 1894785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 1904785c406SSatha Rao 1914785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 1924785c406SSatha Rao if (!aq) { 1934785c406SSatha Rao rc = -ENOSPC; 1944785c406SSatha Rao goto exit; 1954785c406SSatha Rao } 1964785c406SSatha Rao 1974785c406SSatha Rao aq->qidx = qid; 1984785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 1994785c406SSatha Rao aq->op = NIX_AQ_INSTOP_READ; 2004785c406SSatha Rao 2014785c406SSatha Rao rc = mbox_process_msg(mbox, (void *)&rsp); 2024785c406SSatha Rao if (rc) 2034785c406SSatha Rao goto exit; 2044785c406SSatha Rao 2054785c406SSatha Rao sso_enable = rsp->rq.sso_ena; 206174f2f35SSunil Kumar Kori } 207174f2f35SSunil Kumar Kori 20844a9307cSRakesh Kudurumalla rc = sso_enable ? true : false; 20944a9307cSRakesh Kudurumalla exit: 21044a9307cSRakesh Kudurumalla mbox_put(mbox); 21144a9307cSRakesh Kudurumalla return rc; 212174f2f35SSunil Kumar Kori } 213174f2f35SSunil Kumar Kori 214aaea4c74SNithin Dabilpuram static int 215aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(struct roc_nix_rq *rq, bool set) 216aaea4c74SNithin Dabilpuram { 217aaea4c74SNithin Dabilpuram struct roc_nix *roc_nix = rq->roc_nix; 218aaea4c74SNithin Dabilpuram struct nix *nix = roc_nix_to_nix_priv(roc_nix); 219aaea4c74SNithin Dabilpuram bool inl_inb_ena = roc_nix_inl_inb_is_enabled(roc_nix); 220aaea4c74SNithin Dabilpuram uint64_t lpb_aura = 0, vwqe_aura = 0, spb_aura = 0; 221aaea4c74SNithin Dabilpuram struct mbox *mbox = nix->dev.mbox; 222aaea4c74SNithin Dabilpuram uint64_t aura_base; 223aaea4c74SNithin Dabilpuram int rc, count; 224aaea4c74SNithin Dabilpuram 225aaea4c74SNithin Dabilpuram count = set ? 1 : -1; 226aaea4c74SNithin Dabilpuram /* For buf type set, use info from RQ context */ 227aaea4c74SNithin Dabilpuram if (set) { 228aaea4c74SNithin Dabilpuram lpb_aura = rq->aura_handle; 229aaea4c74SNithin Dabilpuram spb_aura = rq->spb_ena ? rq->spb_aura_handle : 0; 230aaea4c74SNithin Dabilpuram vwqe_aura = rq->vwqe_ena ? rq->vwqe_aura_handle : 0; 231aaea4c74SNithin Dabilpuram goto skip_ctx_read; 232aaea4c74SNithin Dabilpuram } 233aaea4c74SNithin Dabilpuram 234aaea4c74SNithin Dabilpuram aura_base = roc_npa_aura_handle_to_base(rq->aura_handle); 235aaea4c74SNithin Dabilpuram if (roc_model_is_cn9k()) { 236aaea4c74SNithin Dabilpuram struct nix_aq_enq_rsp *rsp; 237aaea4c74SNithin Dabilpuram struct nix_aq_enq_req *aq; 238aaea4c74SNithin Dabilpuram 23944a9307cSRakesh Kudurumalla aq = mbox_alloc_msg_nix_aq_enq(mbox_get(mbox)); 24044a9307cSRakesh Kudurumalla if (!aq) { 24144a9307cSRakesh Kudurumalla mbox_put(mbox); 242aaea4c74SNithin Dabilpuram return -ENOSPC; 24344a9307cSRakesh Kudurumalla } 244aaea4c74SNithin Dabilpuram 245aaea4c74SNithin Dabilpuram aq->qidx = rq->qid; 246aaea4c74SNithin Dabilpuram aq->ctype = NIX_AQ_CTYPE_RQ; 247aaea4c74SNithin Dabilpuram aq->op = NIX_AQ_INSTOP_READ; 248aaea4c74SNithin Dabilpuram rc = mbox_process_msg(mbox, (void *)&rsp); 24944a9307cSRakesh Kudurumalla if (rc) { 25044a9307cSRakesh Kudurumalla mbox_put(mbox); 251aaea4c74SNithin Dabilpuram return rc; 25244a9307cSRakesh Kudurumalla } 253aaea4c74SNithin Dabilpuram 254aaea4c74SNithin Dabilpuram /* Get aura handle from aura */ 255aaea4c74SNithin Dabilpuram lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base); 256aaea4c74SNithin Dabilpuram if (rsp->rq.spb_ena) 257aaea4c74SNithin Dabilpuram spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base); 25844a9307cSRakesh Kudurumalla mbox_put(mbox); 2594785c406SSatha Rao } else if (roc_model_is_cn10k()) { 260aaea4c74SNithin Dabilpuram struct nix_cn10k_aq_enq_rsp *rsp; 261aaea4c74SNithin Dabilpuram struct nix_cn10k_aq_enq_req *aq; 262aaea4c74SNithin Dabilpuram 26344a9307cSRakesh Kudurumalla aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox_get(mbox)); 26444a9307cSRakesh Kudurumalla if (!aq) { 26544a9307cSRakesh Kudurumalla mbox_put(mbox); 266aaea4c74SNithin Dabilpuram return -ENOSPC; 26744a9307cSRakesh Kudurumalla } 268aaea4c74SNithin Dabilpuram 269aaea4c74SNithin Dabilpuram aq->qidx = rq->qid; 270aaea4c74SNithin Dabilpuram aq->ctype = NIX_AQ_CTYPE_RQ; 271aaea4c74SNithin Dabilpuram aq->op = NIX_AQ_INSTOP_READ; 272aaea4c74SNithin Dabilpuram 273aaea4c74SNithin Dabilpuram rc = mbox_process_msg(mbox, (void *)&rsp); 27444a9307cSRakesh Kudurumalla if (rc) { 27544a9307cSRakesh Kudurumalla mbox_put(mbox); 276aaea4c74SNithin Dabilpuram return rc; 27744a9307cSRakesh Kudurumalla } 278aaea4c74SNithin Dabilpuram 279aaea4c74SNithin Dabilpuram /* Get aura handle from aura */ 280aaea4c74SNithin Dabilpuram lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base); 281aaea4c74SNithin Dabilpuram if (rsp->rq.spb_ena) 282aaea4c74SNithin Dabilpuram spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base); 283aaea4c74SNithin Dabilpuram if (rsp->rq.vwqe_ena) 284aaea4c74SNithin Dabilpuram vwqe_aura = roc_npa_aura_handle_gen(rsp->rq.wqe_aura, aura_base); 28544a9307cSRakesh Kudurumalla 28644a9307cSRakesh Kudurumalla mbox_put(mbox); 2874785c406SSatha Rao } else { 2884785c406SSatha Rao struct nix_cn20k_aq_enq_rsp *rsp; 2894785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 2904785c406SSatha Rao 2914785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox_get(mbox)); 2924785c406SSatha Rao if (!aq) { 2934785c406SSatha Rao mbox_put(mbox); 2944785c406SSatha Rao return -ENOSPC; 2954785c406SSatha Rao } 2964785c406SSatha Rao 2974785c406SSatha Rao aq->qidx = rq->qid; 2984785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 2994785c406SSatha Rao aq->op = NIX_AQ_INSTOP_READ; 3004785c406SSatha Rao 3014785c406SSatha Rao rc = mbox_process_msg(mbox, (void *)&rsp); 3024785c406SSatha Rao if (rc) { 3034785c406SSatha Rao mbox_put(mbox); 3044785c406SSatha Rao return rc; 3054785c406SSatha Rao } 3064785c406SSatha Rao 3074785c406SSatha Rao /* Get aura handle from aura */ 3084785c406SSatha Rao lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base); 3094785c406SSatha Rao if (rsp->rq.spb_ena) 3104785c406SSatha Rao spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base); 3114785c406SSatha Rao 3124785c406SSatha Rao mbox_put(mbox); 313aaea4c74SNithin Dabilpuram } 314aaea4c74SNithin Dabilpuram 315aaea4c74SNithin Dabilpuram skip_ctx_read: 316aaea4c74SNithin Dabilpuram /* Update attributes for LPB aura */ 317aaea4c74SNithin Dabilpuram if (inl_inb_ena) 318aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(lpb_aura, ROC_NPA_BUF_TYPE_PACKET_IPSEC, count); 319aaea4c74SNithin Dabilpuram else 320aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(lpb_aura, ROC_NPA_BUF_TYPE_PACKET, count); 321aaea4c74SNithin Dabilpuram 322aaea4c74SNithin Dabilpuram /* Update attributes for SPB aura */ 323aaea4c74SNithin Dabilpuram if (spb_aura) { 324aaea4c74SNithin Dabilpuram if (inl_inb_ena) 325aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(spb_aura, ROC_NPA_BUF_TYPE_PACKET_IPSEC, count); 326aaea4c74SNithin Dabilpuram else 327aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(spb_aura, ROC_NPA_BUF_TYPE_PACKET, count); 328aaea4c74SNithin Dabilpuram } 329aaea4c74SNithin Dabilpuram 330aaea4c74SNithin Dabilpuram /* Update attributes for VWQE aura */ 331aaea4c74SNithin Dabilpuram if (vwqe_aura) { 332aaea4c74SNithin Dabilpuram if (inl_inb_ena) 333aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(vwqe_aura, ROC_NPA_BUF_TYPE_VWQE_IPSEC, count); 334aaea4c74SNithin Dabilpuram else 335aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(vwqe_aura, ROC_NPA_BUF_TYPE_VWQE, count); 336aaea4c74SNithin Dabilpuram } 337aaea4c74SNithin Dabilpuram 338aaea4c74SNithin Dabilpuram return 0; 339aaea4c74SNithin Dabilpuram } 340aaea4c74SNithin Dabilpuram 3415df46167SSunil Kumar Kori static int 3425df46167SSunil Kumar Kori nix_rq_cn9k_cman_cfg(struct dev *dev, struct roc_nix_rq *rq) 3435df46167SSunil Kumar Kori { 34444a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get(dev->mbox); 3455df46167SSunil Kumar Kori struct nix_aq_enq_req *aq; 34644a9307cSRakesh Kudurumalla int rc; 3475df46167SSunil Kumar Kori 3485df46167SSunil Kumar Kori aq = mbox_alloc_msg_nix_aq_enq(mbox); 34944a9307cSRakesh Kudurumalla if (!aq) { 35044a9307cSRakesh Kudurumalla rc = -ENOSPC; 35144a9307cSRakesh Kudurumalla goto exit; 35244a9307cSRakesh Kudurumalla } 3535df46167SSunil Kumar Kori 3545df46167SSunil Kumar Kori aq->qidx = rq->qid; 3555df46167SSunil Kumar Kori aq->ctype = NIX_AQ_CTYPE_RQ; 3565df46167SSunil Kumar Kori aq->op = NIX_AQ_INSTOP_WRITE; 3575df46167SSunil Kumar Kori 3585df46167SSunil Kumar Kori if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 3595df46167SSunil Kumar Kori aq->rq.lpb_pool_pass = rq->red_pass; 3605df46167SSunil Kumar Kori aq->rq.lpb_pool_drop = rq->red_drop; 3615df46167SSunil Kumar Kori aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass); 3625df46167SSunil Kumar Kori aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop); 3635df46167SSunil Kumar Kori 3645df46167SSunil Kumar Kori } 3655df46167SSunil Kumar Kori 3665df46167SSunil Kumar Kori if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) { 3675df46167SSunil Kumar Kori aq->rq.spb_pool_pass = rq->spb_red_pass; 3685df46167SSunil Kumar Kori aq->rq.spb_pool_drop = rq->spb_red_drop; 3695df46167SSunil Kumar Kori aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass); 3705df46167SSunil Kumar Kori aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop); 3715df46167SSunil Kumar Kori 3725df46167SSunil Kumar Kori } 3735df46167SSunil Kumar Kori 3745df46167SSunil Kumar Kori if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) { 3755df46167SSunil Kumar Kori aq->rq.xqe_pass = rq->xqe_red_pass; 3765df46167SSunil Kumar Kori aq->rq.xqe_drop = rq->xqe_red_drop; 3775df46167SSunil Kumar Kori aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop); 3785df46167SSunil Kumar Kori aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass); 3795df46167SSunil Kumar Kori } 3805df46167SSunil Kumar Kori 38144a9307cSRakesh Kudurumalla rc = mbox_process(mbox); 38244a9307cSRakesh Kudurumalla exit: 38344a9307cSRakesh Kudurumalla mbox_put(mbox); 38444a9307cSRakesh Kudurumalla return rc; 3855df46167SSunil Kumar Kori } 3865df46167SSunil Kumar Kori 387*43e42816SSatha Rao static int 388*43e42816SSatha Rao nix_rq_cn10k_cman_cfg(struct dev *dev, struct roc_nix_rq *rq) 389*43e42816SSatha Rao { 390*43e42816SSatha Rao struct nix_cn10k_aq_enq_req *aq; 391*43e42816SSatha Rao struct mbox *mbox = mbox_get(dev->mbox); 392*43e42816SSatha Rao int rc; 393*43e42816SSatha Rao 394*43e42816SSatha Rao aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 395*43e42816SSatha Rao if (!aq) { 396*43e42816SSatha Rao rc = -ENOSPC; 397*43e42816SSatha Rao goto exit; 398*43e42816SSatha Rao } 399*43e42816SSatha Rao 400*43e42816SSatha Rao aq->qidx = rq->qid; 401*43e42816SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 402*43e42816SSatha Rao aq->op = NIX_AQ_INSTOP_WRITE; 403*43e42816SSatha Rao 404*43e42816SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 405*43e42816SSatha Rao aq->rq.lpb_pool_pass = rq->red_pass; 406*43e42816SSatha Rao aq->rq.lpb_pool_drop = rq->red_drop; 407*43e42816SSatha Rao aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass); 408*43e42816SSatha Rao aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop); 409*43e42816SSatha Rao } 410*43e42816SSatha Rao 411*43e42816SSatha Rao if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) { 412*43e42816SSatha Rao aq->rq.spb_pool_pass = rq->spb_red_pass; 413*43e42816SSatha Rao aq->rq.spb_pool_drop = rq->spb_red_drop; 414*43e42816SSatha Rao aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass); 415*43e42816SSatha Rao aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop); 416*43e42816SSatha Rao } 417*43e42816SSatha Rao 418*43e42816SSatha Rao if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) { 419*43e42816SSatha Rao aq->rq.xqe_pass = rq->xqe_red_pass; 420*43e42816SSatha Rao aq->rq.xqe_drop = rq->xqe_red_drop; 421*43e42816SSatha Rao aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop); 422*43e42816SSatha Rao aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass); 423*43e42816SSatha Rao } 424*43e42816SSatha Rao 425*43e42816SSatha Rao rc = mbox_process(mbox); 426*43e42816SSatha Rao exit: 427*43e42816SSatha Rao mbox_put(mbox); 428*43e42816SSatha Rao return rc; 429*43e42816SSatha Rao } 430*43e42816SSatha Rao 431*43e42816SSatha Rao static int 432*43e42816SSatha Rao nix_rq_cman_cfg(struct dev *dev, struct roc_nix_rq *rq) 433*43e42816SSatha Rao { 434*43e42816SSatha Rao struct nix_cn20k_aq_enq_req *aq; 435*43e42816SSatha Rao struct mbox *mbox = mbox_get(dev->mbox); 436*43e42816SSatha Rao int rc; 437*43e42816SSatha Rao 438*43e42816SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 439*43e42816SSatha Rao if (!aq) { 440*43e42816SSatha Rao rc = -ENOSPC; 441*43e42816SSatha Rao goto exit; 442*43e42816SSatha Rao } 443*43e42816SSatha Rao 444*43e42816SSatha Rao aq->qidx = rq->qid; 445*43e42816SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 446*43e42816SSatha Rao aq->op = NIX_AQ_INSTOP_WRITE; 447*43e42816SSatha Rao 448*43e42816SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 449*43e42816SSatha Rao aq->rq.lpb_pool_pass = rq->red_pass; 450*43e42816SSatha Rao aq->rq.lpb_pool_drop = rq->red_drop; 451*43e42816SSatha Rao aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass); 452*43e42816SSatha Rao aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop); 453*43e42816SSatha Rao } 454*43e42816SSatha Rao 455*43e42816SSatha Rao if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) { 456*43e42816SSatha Rao aq->rq.spb_pool_pass = rq->spb_red_pass; 457*43e42816SSatha Rao aq->rq.spb_pool_drop = rq->spb_red_drop; 458*43e42816SSatha Rao aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass); 459*43e42816SSatha Rao aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop); 460*43e42816SSatha Rao } 461*43e42816SSatha Rao 462*43e42816SSatha Rao if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) { 463*43e42816SSatha Rao aq->rq.xqe_pass = rq->xqe_red_pass; 464*43e42816SSatha Rao aq->rq.xqe_drop = rq->xqe_red_drop; 465*43e42816SSatha Rao aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop); 466*43e42816SSatha Rao aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass); 467*43e42816SSatha Rao } 468*43e42816SSatha Rao 469*43e42816SSatha Rao rc = mbox_process(mbox); 470*43e42816SSatha Rao exit: 471*43e42816SSatha Rao mbox_put(mbox); 472*43e42816SSatha Rao return rc; 473*43e42816SSatha Rao } 474*43e42816SSatha Rao 475174f2f35SSunil Kumar Kori int 47638b177feSNithin Dabilpuram nix_rq_cn9k_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints, 47738b177feSNithin Dabilpuram bool cfg, bool ena) 47819a2b549SJerin Jacob { 47938b177feSNithin Dabilpuram struct mbox *mbox = dev->mbox; 48019a2b549SJerin Jacob struct nix_aq_enq_req *aq; 48119a2b549SJerin Jacob 48219a2b549SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 483da718c19SNithin Dabilpuram if (!aq) 484da718c19SNithin Dabilpuram return -ENOSPC; 485da718c19SNithin Dabilpuram 48619a2b549SJerin Jacob aq->qidx = rq->qid; 48719a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_RQ; 48819a2b549SJerin Jacob aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT; 48919a2b549SJerin Jacob 49019a2b549SJerin Jacob if (rq->sso_ena) { 49119a2b549SJerin Jacob /* SSO mode */ 49219a2b549SJerin Jacob aq->rq.sso_ena = 1; 49319a2b549SJerin Jacob aq->rq.sso_tt = rq->tt; 49419a2b549SJerin Jacob aq->rq.sso_grp = rq->hwgrp; 49519a2b549SJerin Jacob aq->rq.ena_wqwd = 1; 49619a2b549SJerin Jacob aq->rq.wqe_skip = rq->wqe_skip; 49719a2b549SJerin Jacob aq->rq.wqe_caching = 1; 49819a2b549SJerin Jacob 49919a2b549SJerin Jacob aq->rq.good_utag = rq->tag_mask >> 24; 50019a2b549SJerin Jacob aq->rq.bad_utag = rq->tag_mask >> 24; 50119a2b549SJerin Jacob aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 50219a2b549SJerin Jacob } else { 50319a2b549SJerin Jacob /* CQ mode */ 50419a2b549SJerin Jacob aq->rq.sso_ena = 0; 50519a2b549SJerin Jacob aq->rq.good_utag = rq->tag_mask >> 24; 50619a2b549SJerin Jacob aq->rq.bad_utag = rq->tag_mask >> 24; 50719a2b549SJerin Jacob aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 508b059bbb8SKommula Shiva Shankar aq->rq.cq = rq->cqid; 50919a2b549SJerin Jacob } 51019a2b549SJerin Jacob 51119a2b549SJerin Jacob if (rq->ipsech_ena) 51219a2b549SJerin Jacob aq->rq.ipsech_ena = 1; 51319a2b549SJerin Jacob 51419a2b549SJerin Jacob aq->rq.spb_ena = 0; 51519a2b549SJerin Jacob aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle); 51619a2b549SJerin Jacob 51719a2b549SJerin Jacob /* Sizes must be aligned to 8 bytes */ 51819a2b549SJerin Jacob if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7) 51919a2b549SJerin Jacob return -EINVAL; 52019a2b549SJerin Jacob 52119a2b549SJerin Jacob /* Expressed in number of dwords */ 52219a2b549SJerin Jacob aq->rq.first_skip = rq->first_skip / 8; 52319a2b549SJerin Jacob aq->rq.later_skip = rq->later_skip / 8; 52419a2b549SJerin Jacob aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */ 52519a2b549SJerin Jacob aq->rq.lpb_sizem1 = rq->lpb_size / 8; 52619a2b549SJerin Jacob aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */ 52719a2b549SJerin Jacob aq->rq.ena = ena; 52819a2b549SJerin Jacob aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */ 52919a2b549SJerin Jacob aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */ 53019a2b549SJerin Jacob aq->rq.rq_int_ena = 0; 53119a2b549SJerin Jacob /* Many to one reduction */ 53238b177feSNithin Dabilpuram aq->rq.qint_idx = rq->qid % qints; 53319a2b549SJerin Jacob aq->rq.xqe_drop_ena = 1; 53419a2b549SJerin Jacob 53595bec117SSatha Rao /* If RED enabled, then fill enable for all cases */ 53695bec117SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 537ee48f711SNithin Dabilpuram aq->rq.spb_pool_pass = rq->spb_red_pass; 538ee48f711SNithin Dabilpuram aq->rq.lpb_pool_pass = rq->red_pass; 53995bec117SSatha Rao 540ee48f711SNithin Dabilpuram aq->rq.spb_pool_drop = rq->spb_red_drop; 541ee48f711SNithin Dabilpuram aq->rq.lpb_pool_drop = rq->red_drop; 54295bec117SSatha Rao } 54395bec117SSatha Rao 54419a2b549SJerin Jacob if (cfg) { 54519a2b549SJerin Jacob if (rq->sso_ena) { 54619a2b549SJerin Jacob /* SSO mode */ 54719a2b549SJerin Jacob aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 54819a2b549SJerin Jacob aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt; 54919a2b549SJerin Jacob aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp; 55019a2b549SJerin Jacob aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd; 55119a2b549SJerin Jacob aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip; 55219a2b549SJerin Jacob aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching; 55319a2b549SJerin Jacob aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 55419a2b549SJerin Jacob aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 55519a2b549SJerin Jacob aq->rq_mask.ltag = ~aq->rq_mask.ltag; 55619a2b549SJerin Jacob } else { 55719a2b549SJerin Jacob /* CQ mode */ 55819a2b549SJerin Jacob aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 55919a2b549SJerin Jacob aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 56019a2b549SJerin Jacob aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 56119a2b549SJerin Jacob aq->rq_mask.ltag = ~aq->rq_mask.ltag; 56219a2b549SJerin Jacob aq->rq_mask.cq = ~aq->rq_mask.cq; 56319a2b549SJerin Jacob } 56419a2b549SJerin Jacob 56519a2b549SJerin Jacob if (rq->ipsech_ena) 56619a2b549SJerin Jacob aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena; 56719a2b549SJerin Jacob 56819a2b549SJerin Jacob aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena; 56919a2b549SJerin Jacob aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura; 57019a2b549SJerin Jacob aq->rq_mask.first_skip = ~aq->rq_mask.first_skip; 57119a2b549SJerin Jacob aq->rq_mask.later_skip = ~aq->rq_mask.later_skip; 57219a2b549SJerin Jacob aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw; 57319a2b549SJerin Jacob aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1; 57419a2b549SJerin Jacob aq->rq_mask.ena = ~aq->rq_mask.ena; 57519a2b549SJerin Jacob aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching; 57619a2b549SJerin Jacob aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size; 57719a2b549SJerin Jacob aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena; 57819a2b549SJerin Jacob aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx; 57919a2b549SJerin Jacob aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena; 58095bec117SSatha Rao 58195bec117SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 582ee48f711SNithin Dabilpuram aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass; 583ee48f711SNithin Dabilpuram aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass; 58495bec117SSatha Rao 585ee48f711SNithin Dabilpuram aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop; 586ee48f711SNithin Dabilpuram aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop; 58795bec117SSatha Rao } 58819a2b549SJerin Jacob } 58919a2b549SJerin Jacob 59019a2b549SJerin Jacob return 0; 59119a2b549SJerin Jacob } 59219a2b549SJerin Jacob 59338b177feSNithin Dabilpuram int 5944785c406SSatha Rao nix_rq_cn10k_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints, bool cfg, bool ena) 59519a2b549SJerin Jacob { 59619a2b549SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 59738b177feSNithin Dabilpuram struct mbox *mbox = dev->mbox; 59819a2b549SJerin Jacob 59919a2b549SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 600da718c19SNithin Dabilpuram if (!aq) 601da718c19SNithin Dabilpuram return -ENOSPC; 602da718c19SNithin Dabilpuram 60319a2b549SJerin Jacob aq->qidx = rq->qid; 60419a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_RQ; 60519a2b549SJerin Jacob aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT; 60619a2b549SJerin Jacob 60719a2b549SJerin Jacob if (rq->sso_ena) { 60819a2b549SJerin Jacob /* SSO mode */ 60919a2b549SJerin Jacob aq->rq.sso_ena = 1; 61019a2b549SJerin Jacob aq->rq.sso_tt = rq->tt; 61119a2b549SJerin Jacob aq->rq.sso_grp = rq->hwgrp; 61219a2b549SJerin Jacob aq->rq.ena_wqwd = 1; 61319a2b549SJerin Jacob aq->rq.wqe_skip = rq->wqe_skip; 61419a2b549SJerin Jacob aq->rq.wqe_caching = 1; 61519a2b549SJerin Jacob 61619a2b549SJerin Jacob aq->rq.good_utag = rq->tag_mask >> 24; 61719a2b549SJerin Jacob aq->rq.bad_utag = rq->tag_mask >> 24; 61819a2b549SJerin Jacob aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 61919a2b549SJerin Jacob 62019a2b549SJerin Jacob if (rq->vwqe_ena) { 62119a2b549SJerin Jacob aq->rq.vwqe_ena = true; 62219a2b549SJerin Jacob aq->rq.vwqe_skip = rq->vwqe_first_skip; 62319a2b549SJerin Jacob /* Maximal Vector size is (2^(MAX_VSIZE_EXP+2)) */ 62419a2b549SJerin Jacob aq->rq.max_vsize_exp = rq->vwqe_max_sz_exp - 2; 62519a2b549SJerin Jacob aq->rq.vtime_wait = rq->vwqe_wait_tmo; 626aaea4c74SNithin Dabilpuram aq->rq.wqe_aura = roc_npa_aura_handle_to_aura(rq->vwqe_aura_handle); 62719a2b549SJerin Jacob } 62819a2b549SJerin Jacob } else { 62919a2b549SJerin Jacob /* CQ mode */ 63019a2b549SJerin Jacob aq->rq.sso_ena = 0; 63119a2b549SJerin Jacob aq->rq.good_utag = rq->tag_mask >> 24; 63219a2b549SJerin Jacob aq->rq.bad_utag = rq->tag_mask >> 24; 63319a2b549SJerin Jacob aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 634b059bbb8SKommula Shiva Shankar aq->rq.cq = rq->cqid; 63519a2b549SJerin Jacob } 63619a2b549SJerin Jacob 63738b177feSNithin Dabilpuram if (rq->ipsech_ena) { 63819a2b549SJerin Jacob aq->rq.ipsech_ena = 1; 63938b177feSNithin Dabilpuram aq->rq.ipsecd_drop_en = 1; 6408f80a2e3SNithin Dabilpuram aq->rq.ena_wqwd = 1; 6418f80a2e3SNithin Dabilpuram aq->rq.wqe_skip = rq->wqe_skip; 6428f80a2e3SNithin Dabilpuram aq->rq.wqe_caching = 1; 64338b177feSNithin Dabilpuram } 64419a2b549SJerin Jacob 64519a2b549SJerin Jacob aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle); 64619a2b549SJerin Jacob 64719a2b549SJerin Jacob /* Sizes must be aligned to 8 bytes */ 64819a2b549SJerin Jacob if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7) 64919a2b549SJerin Jacob return -EINVAL; 65019a2b549SJerin Jacob 65119a2b549SJerin Jacob /* Expressed in number of dwords */ 65219a2b549SJerin Jacob aq->rq.first_skip = rq->first_skip / 8; 65319a2b549SJerin Jacob aq->rq.later_skip = rq->later_skip / 8; 65419a2b549SJerin Jacob aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */ 65519a2b549SJerin Jacob aq->rq.lpb_sizem1 = rq->lpb_size / 8; 65619a2b549SJerin Jacob aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */ 65719a2b549SJerin Jacob aq->rq.ena = ena; 65819a2b549SJerin Jacob 65919a2b549SJerin Jacob if (rq->spb_ena) { 66019a2b549SJerin Jacob uint32_t spb_sizem1; 66119a2b549SJerin Jacob 66219a2b549SJerin Jacob aq->rq.spb_ena = 1; 66319a2b549SJerin Jacob aq->rq.spb_aura = 66419a2b549SJerin Jacob roc_npa_aura_handle_to_aura(rq->spb_aura_handle); 66519a2b549SJerin Jacob 66619a2b549SJerin Jacob if (rq->spb_size & 0x7 || 66719a2b549SJerin Jacob rq->spb_size > NIX_RQ_CN10K_SPB_MAX_SIZE) 66819a2b549SJerin Jacob return -EINVAL; 66919a2b549SJerin Jacob 67019a2b549SJerin Jacob spb_sizem1 = rq->spb_size / 8; /* Expressed in no. of dwords */ 67119a2b549SJerin Jacob spb_sizem1 -= 1; /* Expressed in size minus one */ 67219a2b549SJerin Jacob aq->rq.spb_sizem1 = spb_sizem1 & 0x3F; 67319a2b549SJerin Jacob aq->rq.spb_high_sizem1 = (spb_sizem1 >> 6) & 0x7; 67419a2b549SJerin Jacob } else { 67519a2b549SJerin Jacob aq->rq.spb_ena = 0; 67619a2b549SJerin Jacob } 67719a2b549SJerin Jacob 67819a2b549SJerin Jacob aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */ 67919a2b549SJerin Jacob aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */ 68019a2b549SJerin Jacob aq->rq.rq_int_ena = 0; 68119a2b549SJerin Jacob /* Many to one reduction */ 68238b177feSNithin Dabilpuram aq->rq.qint_idx = rq->qid % qints; 683c8c967e1SNithin Dabilpuram aq->rq.xqe_drop_ena = 0; 684c8c967e1SNithin Dabilpuram aq->rq.lpb_drop_ena = rq->lpb_drop_ena; 685c8c967e1SNithin Dabilpuram aq->rq.spb_drop_ena = rq->spb_drop_ena; 68619a2b549SJerin Jacob 68795bec117SSatha Rao /* If RED enabled, then fill enable for all cases */ 68895bec117SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 689ee48f711SNithin Dabilpuram aq->rq.spb_pool_pass = rq->spb_red_pass; 69095bec117SSatha Rao aq->rq.lpb_pool_pass = rq->red_pass; 69195bec117SSatha Rao aq->rq.wqe_pool_pass = rq->red_pass; 69295bec117SSatha Rao aq->rq.xqe_pass = rq->red_pass; 69395bec117SSatha Rao 694ee48f711SNithin Dabilpuram aq->rq.spb_pool_drop = rq->spb_red_drop; 69595bec117SSatha Rao aq->rq.lpb_pool_drop = rq->red_drop; 69695bec117SSatha Rao aq->rq.wqe_pool_drop = rq->red_drop; 69795bec117SSatha Rao aq->rq.xqe_drop = rq->red_drop; 69895bec117SSatha Rao } 69995bec117SSatha Rao 70019a2b549SJerin Jacob if (cfg) { 70119a2b549SJerin Jacob if (rq->sso_ena) { 70219a2b549SJerin Jacob /* SSO mode */ 70319a2b549SJerin Jacob aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 70419a2b549SJerin Jacob aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt; 70519a2b549SJerin Jacob aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp; 70619a2b549SJerin Jacob aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd; 70719a2b549SJerin Jacob aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip; 70819a2b549SJerin Jacob aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching; 70919a2b549SJerin Jacob aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 71019a2b549SJerin Jacob aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 71119a2b549SJerin Jacob aq->rq_mask.ltag = ~aq->rq_mask.ltag; 71219a2b549SJerin Jacob if (rq->vwqe_ena) { 71319a2b549SJerin Jacob aq->rq_mask.vwqe_ena = ~aq->rq_mask.vwqe_ena; 71419a2b549SJerin Jacob aq->rq_mask.vwqe_skip = ~aq->rq_mask.vwqe_skip; 71519a2b549SJerin Jacob aq->rq_mask.max_vsize_exp = 71619a2b549SJerin Jacob ~aq->rq_mask.max_vsize_exp; 71719a2b549SJerin Jacob aq->rq_mask.vtime_wait = 71819a2b549SJerin Jacob ~aq->rq_mask.vtime_wait; 71919a2b549SJerin Jacob aq->rq_mask.wqe_aura = ~aq->rq_mask.wqe_aura; 72019a2b549SJerin Jacob } 72119a2b549SJerin Jacob } else { 72219a2b549SJerin Jacob /* CQ mode */ 72319a2b549SJerin Jacob aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 72419a2b549SJerin Jacob aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 72519a2b549SJerin Jacob aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 72619a2b549SJerin Jacob aq->rq_mask.ltag = ~aq->rq_mask.ltag; 72719a2b549SJerin Jacob aq->rq_mask.cq = ~aq->rq_mask.cq; 72819a2b549SJerin Jacob } 72919a2b549SJerin Jacob 73019a2b549SJerin Jacob if (rq->ipsech_ena) 73119a2b549SJerin Jacob aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena; 73219a2b549SJerin Jacob 73319a2b549SJerin Jacob if (rq->spb_ena) { 73419a2b549SJerin Jacob aq->rq_mask.spb_aura = ~aq->rq_mask.spb_aura; 73519a2b549SJerin Jacob aq->rq_mask.spb_sizem1 = ~aq->rq_mask.spb_sizem1; 73619a2b549SJerin Jacob aq->rq_mask.spb_high_sizem1 = 73719a2b549SJerin Jacob ~aq->rq_mask.spb_high_sizem1; 73819a2b549SJerin Jacob } 73919a2b549SJerin Jacob 74019a2b549SJerin Jacob aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena; 74119a2b549SJerin Jacob aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura; 74219a2b549SJerin Jacob aq->rq_mask.first_skip = ~aq->rq_mask.first_skip; 74319a2b549SJerin Jacob aq->rq_mask.later_skip = ~aq->rq_mask.later_skip; 74419a2b549SJerin Jacob aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw; 74519a2b549SJerin Jacob aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1; 74619a2b549SJerin Jacob aq->rq_mask.ena = ~aq->rq_mask.ena; 74719a2b549SJerin Jacob aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching; 74819a2b549SJerin Jacob aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size; 74919a2b549SJerin Jacob aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena; 75019a2b549SJerin Jacob aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx; 75119a2b549SJerin Jacob aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena; 752c8c967e1SNithin Dabilpuram aq->rq_mask.lpb_drop_ena = ~aq->rq_mask.lpb_drop_ena; 753c8c967e1SNithin Dabilpuram aq->rq_mask.spb_drop_ena = ~aq->rq_mask.spb_drop_ena; 75495bec117SSatha Rao 75595bec117SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 75695bec117SSatha Rao aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass; 75795bec117SSatha Rao aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass; 75895bec117SSatha Rao aq->rq_mask.wqe_pool_pass = ~aq->rq_mask.wqe_pool_pass; 75995bec117SSatha Rao aq->rq_mask.xqe_pass = ~aq->rq_mask.xqe_pass; 76095bec117SSatha Rao 76195bec117SSatha Rao aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop; 76295bec117SSatha Rao aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop; 76395bec117SSatha Rao aq->rq_mask.wqe_pool_drop = ~aq->rq_mask.wqe_pool_drop; 76495bec117SSatha Rao aq->rq_mask.xqe_drop = ~aq->rq_mask.xqe_drop; 76595bec117SSatha Rao } 76619a2b549SJerin Jacob } 76719a2b549SJerin Jacob 76819a2b549SJerin Jacob return 0; 76919a2b549SJerin Jacob } 77019a2b549SJerin Jacob 77119a2b549SJerin Jacob int 7724785c406SSatha Rao nix_rq_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints, bool cfg, bool ena) 7734785c406SSatha Rao { 7744785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 7754785c406SSatha Rao struct mbox *mbox = dev->mbox; 7764785c406SSatha Rao 7774785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 7784785c406SSatha Rao if (!aq) 7794785c406SSatha Rao return -ENOSPC; 7804785c406SSatha Rao 7814785c406SSatha Rao aq->qidx = rq->qid; 7824785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_RQ; 7834785c406SSatha Rao aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT; 7844785c406SSatha Rao 7854785c406SSatha Rao if (rq->sso_ena) { 7864785c406SSatha Rao /* SSO mode */ 7874785c406SSatha Rao aq->rq.sso_ena = 1; 7884785c406SSatha Rao aq->rq.sso_tt = rq->tt; 7894785c406SSatha Rao aq->rq.sso_grp = rq->hwgrp; 7904785c406SSatha Rao aq->rq.ena_wqwd = 1; 7914785c406SSatha Rao aq->rq.wqe_skip = rq->wqe_skip; 7924785c406SSatha Rao aq->rq.wqe_caching = 1; 7934785c406SSatha Rao 7944785c406SSatha Rao aq->rq.good_utag = rq->tag_mask >> 24; 7954785c406SSatha Rao aq->rq.bad_utag = rq->tag_mask >> 24; 7964785c406SSatha Rao aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 7974785c406SSatha Rao } else { 7984785c406SSatha Rao /* CQ mode */ 7994785c406SSatha Rao aq->rq.sso_ena = 0; 8004785c406SSatha Rao aq->rq.good_utag = rq->tag_mask >> 24; 8014785c406SSatha Rao aq->rq.bad_utag = rq->tag_mask >> 24; 8024785c406SSatha Rao aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0); 8034785c406SSatha Rao aq->rq.cq = rq->cqid; 8044785c406SSatha Rao } 8054785c406SSatha Rao 8064785c406SSatha Rao if (rq->ipsech_ena) { 8074785c406SSatha Rao aq->rq.ipsech_ena = 1; 8084785c406SSatha Rao aq->rq.ipsecd_drop_en = 1; 8094785c406SSatha Rao aq->rq.ena_wqwd = 1; 8104785c406SSatha Rao aq->rq.wqe_skip = rq->wqe_skip; 8114785c406SSatha Rao aq->rq.wqe_caching = 1; 8124785c406SSatha Rao } 8134785c406SSatha Rao 8144785c406SSatha Rao aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle); 8154785c406SSatha Rao 8164785c406SSatha Rao /* Sizes must be aligned to 8 bytes */ 8174785c406SSatha Rao if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7) 8184785c406SSatha Rao return -EINVAL; 8194785c406SSatha Rao 8204785c406SSatha Rao /* Expressed in number of dwords */ 8214785c406SSatha Rao aq->rq.first_skip = rq->first_skip / 8; 8224785c406SSatha Rao aq->rq.later_skip = rq->later_skip / 8; 8234785c406SSatha Rao aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */ 8244785c406SSatha Rao aq->rq.lpb_sizem1 = rq->lpb_size / 8; 8254785c406SSatha Rao aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */ 8264785c406SSatha Rao aq->rq.ena = ena; 8274785c406SSatha Rao 8284785c406SSatha Rao if (rq->spb_ena) { 8294785c406SSatha Rao uint32_t spb_sizem1; 8304785c406SSatha Rao 8314785c406SSatha Rao aq->rq.spb_ena = 1; 8324785c406SSatha Rao aq->rq.spb_aura = 8334785c406SSatha Rao roc_npa_aura_handle_to_aura(rq->spb_aura_handle); 8344785c406SSatha Rao 8354785c406SSatha Rao if (rq->spb_size & 0x7 || 8364785c406SSatha Rao rq->spb_size > NIX_RQ_CN10K_SPB_MAX_SIZE) 8374785c406SSatha Rao return -EINVAL; 8384785c406SSatha Rao 8394785c406SSatha Rao spb_sizem1 = rq->spb_size / 8; /* Expressed in no. of dwords */ 8404785c406SSatha Rao spb_sizem1 -= 1; /* Expressed in size minus one */ 8414785c406SSatha Rao aq->rq.spb_sizem1 = spb_sizem1 & 0x3F; 8424785c406SSatha Rao aq->rq.spb_high_sizem1 = (spb_sizem1 >> 6) & 0x7; 8434785c406SSatha Rao } else { 8444785c406SSatha Rao aq->rq.spb_ena = 0; 8454785c406SSatha Rao } 8464785c406SSatha Rao 8474785c406SSatha Rao aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */ 8484785c406SSatha Rao aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */ 8494785c406SSatha Rao aq->rq.rq_int_ena = 0; 8504785c406SSatha Rao /* Many to one reduction */ 8514785c406SSatha Rao aq->rq.qint_idx = rq->qid % qints; 8524785c406SSatha Rao aq->rq.xqe_drop_ena = 0; 8534785c406SSatha Rao aq->rq.lpb_drop_ena = rq->lpb_drop_ena; 8544785c406SSatha Rao aq->rq.spb_drop_ena = rq->spb_drop_ena; 8554785c406SSatha Rao 8564785c406SSatha Rao /* If RED enabled, then fill enable for all cases */ 8574785c406SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 8584785c406SSatha Rao aq->rq.spb_pool_pass = rq->spb_red_pass; 8594785c406SSatha Rao aq->rq.lpb_pool_pass = rq->red_pass; 8604785c406SSatha Rao aq->rq.wqe_pool_pass = rq->red_pass; 8614785c406SSatha Rao aq->rq.xqe_pass = rq->red_pass; 8624785c406SSatha Rao 8634785c406SSatha Rao aq->rq.spb_pool_drop = rq->spb_red_drop; 8644785c406SSatha Rao aq->rq.lpb_pool_drop = rq->red_drop; 8654785c406SSatha Rao aq->rq.wqe_pool_drop = rq->red_drop; 8664785c406SSatha Rao aq->rq.xqe_drop = rq->red_drop; 8674785c406SSatha Rao } 8684785c406SSatha Rao 8694785c406SSatha Rao if (cfg) { 8704785c406SSatha Rao if (rq->sso_ena) { 8714785c406SSatha Rao /* SSO mode */ 8724785c406SSatha Rao aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 8734785c406SSatha Rao aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt; 8744785c406SSatha Rao aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp; 8754785c406SSatha Rao aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd; 8764785c406SSatha Rao aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip; 8774785c406SSatha Rao aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching; 8784785c406SSatha Rao aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 8794785c406SSatha Rao aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 8804785c406SSatha Rao aq->rq_mask.ltag = ~aq->rq_mask.ltag; 8814785c406SSatha Rao } else { 8824785c406SSatha Rao /* CQ mode */ 8834785c406SSatha Rao aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena; 8844785c406SSatha Rao aq->rq_mask.good_utag = ~aq->rq_mask.good_utag; 8854785c406SSatha Rao aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag; 8864785c406SSatha Rao aq->rq_mask.ltag = ~aq->rq_mask.ltag; 8874785c406SSatha Rao aq->rq_mask.cq = ~aq->rq_mask.cq; 8884785c406SSatha Rao } 8894785c406SSatha Rao 8904785c406SSatha Rao if (rq->ipsech_ena) 8914785c406SSatha Rao aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena; 8924785c406SSatha Rao 8934785c406SSatha Rao if (rq->spb_ena) { 8944785c406SSatha Rao aq->rq_mask.spb_aura = ~aq->rq_mask.spb_aura; 8954785c406SSatha Rao aq->rq_mask.spb_sizem1 = ~aq->rq_mask.spb_sizem1; 8964785c406SSatha Rao aq->rq_mask.spb_high_sizem1 = 8974785c406SSatha Rao ~aq->rq_mask.spb_high_sizem1; 8984785c406SSatha Rao } 8994785c406SSatha Rao 9004785c406SSatha Rao aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena; 9014785c406SSatha Rao aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura; 9024785c406SSatha Rao aq->rq_mask.first_skip = ~aq->rq_mask.first_skip; 9034785c406SSatha Rao aq->rq_mask.later_skip = ~aq->rq_mask.later_skip; 9044785c406SSatha Rao aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw; 9054785c406SSatha Rao aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1; 9064785c406SSatha Rao aq->rq_mask.ena = ~aq->rq_mask.ena; 9074785c406SSatha Rao aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching; 9084785c406SSatha Rao aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size; 9094785c406SSatha Rao aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena; 9104785c406SSatha Rao aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx; 9114785c406SSatha Rao aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena; 9124785c406SSatha Rao aq->rq_mask.lpb_drop_ena = ~aq->rq_mask.lpb_drop_ena; 9134785c406SSatha Rao aq->rq_mask.spb_drop_ena = ~aq->rq_mask.spb_drop_ena; 9144785c406SSatha Rao 9154785c406SSatha Rao if (rq->red_pass && (rq->red_pass >= rq->red_drop)) { 9164785c406SSatha Rao aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass; 9174785c406SSatha Rao aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass; 9184785c406SSatha Rao aq->rq_mask.wqe_pool_pass = ~aq->rq_mask.wqe_pool_pass; 9194785c406SSatha Rao aq->rq_mask.xqe_pass = ~aq->rq_mask.xqe_pass; 9204785c406SSatha Rao 9214785c406SSatha Rao aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop; 9224785c406SSatha Rao aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop; 9234785c406SSatha Rao aq->rq_mask.wqe_pool_drop = ~aq->rq_mask.wqe_pool_drop; 9244785c406SSatha Rao aq->rq_mask.xqe_drop = ~aq->rq_mask.xqe_drop; 9254785c406SSatha Rao } 9264785c406SSatha Rao } 9274785c406SSatha Rao 9284785c406SSatha Rao return 0; 9294785c406SSatha Rao } 9304785c406SSatha Rao 9314785c406SSatha Rao int 93219a2b549SJerin Jacob roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena) 93319a2b549SJerin Jacob { 93419a2b549SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 93544a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 93619a2b549SJerin Jacob bool is_cn9k = roc_model_is_cn9k(); 93738b177feSNithin Dabilpuram struct dev *dev = &nix->dev; 93819a2b549SJerin Jacob int rc; 93919a2b549SJerin Jacob 94044a9307cSRakesh Kudurumalla if (roc_nix == NULL || rq == NULL) { 94144a9307cSRakesh Kudurumalla mbox_put(mbox); 94219a2b549SJerin Jacob return NIX_ERR_PARAM; 94344a9307cSRakesh Kudurumalla } 94419a2b549SJerin Jacob 94544a9307cSRakesh Kudurumalla if (rq->qid >= nix->nb_rx_queues) { 94644a9307cSRakesh Kudurumalla mbox_put(mbox); 94719a2b549SJerin Jacob return NIX_ERR_QUEUE_INVALID_RANGE; 94844a9307cSRakesh Kudurumalla } 94919a2b549SJerin Jacob 95019a2b549SJerin Jacob rq->roc_nix = roc_nix; 95178fb5efeSNithin Dabilpuram rq->tc = ROC_NIX_PFC_CLASS_INVALID; 95219a2b549SJerin Jacob 95319a2b549SJerin Jacob if (is_cn9k) 95438b177feSNithin Dabilpuram rc = nix_rq_cn9k_cfg(dev, rq, nix->qints, false, ena); 9554785c406SSatha Rao else if (roc_model_is_cn10k()) 9564785c406SSatha Rao rc = nix_rq_cn10k_cfg(dev, rq, nix->qints, false, ena); 95719a2b549SJerin Jacob else 95838b177feSNithin Dabilpuram rc = nix_rq_cfg(dev, rq, nix->qints, false, ena); 95919a2b549SJerin Jacob 96044a9307cSRakesh Kudurumalla if (rc) { 96144a9307cSRakesh Kudurumalla mbox_put(mbox); 96219a2b549SJerin Jacob return rc; 96344a9307cSRakesh Kudurumalla } 96419a2b549SJerin Jacob 965af75aac7SGowrishankar Muthukrishnan rc = mbox_process(mbox); 96644a9307cSRakesh Kudurumalla if (rc) { 96744a9307cSRakesh Kudurumalla mbox_put(mbox); 968af75aac7SGowrishankar Muthukrishnan return rc; 96944a9307cSRakesh Kudurumalla } 97044a9307cSRakesh Kudurumalla mbox_put(mbox); 971af75aac7SGowrishankar Muthukrishnan 972aaea4c74SNithin Dabilpuram /* Update aura buf type to indicate its use */ 973aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(rq, true); 974aaea4c74SNithin Dabilpuram 9750f3f3ad8SNithin Dabilpuram /* Check for meta aura if RQ is enabled */ 9760f3f3ad8SNithin Dabilpuram if (ena && nix->need_meta_aura) { 9774fb24a62SRahul Bhansali rc = roc_nix_inl_meta_aura_check(roc_nix, rq); 9780f3f3ad8SNithin Dabilpuram if (rc) 9790f3f3ad8SNithin Dabilpuram return rc; 9800f3f3ad8SNithin Dabilpuram } 9810f3f3ad8SNithin Dabilpuram 98278fb5efeSNithin Dabilpuram nix->rqs[rq->qid] = rq; 983af75aac7SGowrishankar Muthukrishnan return nix_tel_node_add_rq(rq); 98419a2b549SJerin Jacob } 98519a2b549SJerin Jacob 98619a2b549SJerin Jacob int 98719a2b549SJerin Jacob roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena) 98819a2b549SJerin Jacob { 98919a2b549SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 99044a9307cSRakesh Kudurumalla struct mbox *m_box = (&nix->dev)->mbox; 99119a2b549SJerin Jacob bool is_cn9k = roc_model_is_cn9k(); 99238b177feSNithin Dabilpuram struct dev *dev = &nix->dev; 99344a9307cSRakesh Kudurumalla struct mbox *mbox; 99419a2b549SJerin Jacob int rc; 99519a2b549SJerin Jacob 99619a2b549SJerin Jacob if (roc_nix == NULL || rq == NULL) 99719a2b549SJerin Jacob return NIX_ERR_PARAM; 99819a2b549SJerin Jacob 99919a2b549SJerin Jacob if (rq->qid >= nix->nb_rx_queues) 100019a2b549SJerin Jacob return NIX_ERR_QUEUE_INVALID_RANGE; 100119a2b549SJerin Jacob 1002aaea4c74SNithin Dabilpuram /* Clear attributes for existing aura's */ 1003aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(rq, false); 1004aaea4c74SNithin Dabilpuram 100519a2b549SJerin Jacob rq->roc_nix = roc_nix; 100678fb5efeSNithin Dabilpuram rq->tc = ROC_NIX_PFC_CLASS_INVALID; 100719a2b549SJerin Jacob 100844a9307cSRakesh Kudurumalla mbox = mbox_get(m_box); 100919a2b549SJerin Jacob if (is_cn9k) 101038b177feSNithin Dabilpuram rc = nix_rq_cn9k_cfg(dev, rq, nix->qints, true, ena); 10114785c406SSatha Rao else if (roc_model_is_cn10k()) 10124785c406SSatha Rao rc = nix_rq_cn10k_cfg(dev, rq, nix->qints, true, ena); 101319a2b549SJerin Jacob else 101438b177feSNithin Dabilpuram rc = nix_rq_cfg(dev, rq, nix->qints, true, ena); 101519a2b549SJerin Jacob 101644a9307cSRakesh Kudurumalla if (rc) { 101744a9307cSRakesh Kudurumalla mbox_put(mbox); 101819a2b549SJerin Jacob return rc; 101944a9307cSRakesh Kudurumalla } 102019a2b549SJerin Jacob 1021af75aac7SGowrishankar Muthukrishnan rc = mbox_process(mbox); 102244a9307cSRakesh Kudurumalla if (rc) { 102344a9307cSRakesh Kudurumalla mbox_put(mbox); 1024af75aac7SGowrishankar Muthukrishnan return rc; 102544a9307cSRakesh Kudurumalla } 102644a9307cSRakesh Kudurumalla mbox_put(mbox); 1027af75aac7SGowrishankar Muthukrishnan 1028aaea4c74SNithin Dabilpuram /* Update aura attribute to indicate its use */ 1029aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(rq, true); 1030aaea4c74SNithin Dabilpuram 10310f3f3ad8SNithin Dabilpuram /* Check for meta aura if RQ is enabled */ 10320f3f3ad8SNithin Dabilpuram if (ena && nix->need_meta_aura) { 10334fb24a62SRahul Bhansali rc = roc_nix_inl_meta_aura_check(roc_nix, rq); 10340f3f3ad8SNithin Dabilpuram if (rc) 10350f3f3ad8SNithin Dabilpuram return rc; 10360f3f3ad8SNithin Dabilpuram } 10370f3f3ad8SNithin Dabilpuram 1038af75aac7SGowrishankar Muthukrishnan return nix_tel_node_add_rq(rq); 103919a2b549SJerin Jacob } 104019a2b549SJerin Jacob 104119a2b549SJerin Jacob int 10425df46167SSunil Kumar Kori roc_nix_rq_cman_config(struct roc_nix *roc_nix, struct roc_nix_rq *rq) 10435df46167SSunil Kumar Kori { 10445df46167SSunil Kumar Kori bool is_cn9k = roc_model_is_cn9k(); 10455df46167SSunil Kumar Kori struct nix *nix; 10465df46167SSunil Kumar Kori struct dev *dev; 10475df46167SSunil Kumar Kori int rc; 10485df46167SSunil Kumar Kori 10495df46167SSunil Kumar Kori if (roc_nix == NULL || rq == NULL) 10505df46167SSunil Kumar Kori return NIX_ERR_PARAM; 10515df46167SSunil Kumar Kori 10525df46167SSunil Kumar Kori nix = roc_nix_to_nix_priv(roc_nix); 10535df46167SSunil Kumar Kori 10545df46167SSunil Kumar Kori if (rq->qid >= nix->nb_rx_queues) 10555df46167SSunil Kumar Kori return NIX_ERR_QUEUE_INVALID_RANGE; 10565df46167SSunil Kumar Kori 10575df46167SSunil Kumar Kori dev = &nix->dev; 10585df46167SSunil Kumar Kori 10595df46167SSunil Kumar Kori if (is_cn9k) 10605df46167SSunil Kumar Kori rc = nix_rq_cn9k_cman_cfg(dev, rq); 1061*43e42816SSatha Rao else if (roc_model_is_cn10k()) 1062*43e42816SSatha Rao rc = nix_rq_cn10k_cman_cfg(dev, rq); 10635df46167SSunil Kumar Kori else 10645df46167SSunil Kumar Kori rc = nix_rq_cman_cfg(dev, rq); 10655df46167SSunil Kumar Kori 10665df46167SSunil Kumar Kori return rc; 10675df46167SSunil Kumar Kori } 10685df46167SSunil Kumar Kori 10695df46167SSunil Kumar Kori int 107019a2b549SJerin Jacob roc_nix_rq_fini(struct roc_nix_rq *rq) 107119a2b549SJerin Jacob { 107278fb5efeSNithin Dabilpuram struct nix *nix = roc_nix_to_nix_priv(rq->roc_nix); 1073aaea4c74SNithin Dabilpuram int rc; 1074aaea4c74SNithin Dabilpuram 107519a2b549SJerin Jacob /* Disabling RQ is sufficient */ 1076aaea4c74SNithin Dabilpuram rc = roc_nix_rq_ena_dis(rq, false); 1077aaea4c74SNithin Dabilpuram if (rc) 1078aaea4c74SNithin Dabilpuram return rc; 1079aaea4c74SNithin Dabilpuram 1080aaea4c74SNithin Dabilpuram /* Update aura attribute to indicate its use for */ 1081aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(rq, false); 108278fb5efeSNithin Dabilpuram 108378fb5efeSNithin Dabilpuram nix->rqs[rq->qid] = NULL; 1084aaea4c74SNithin Dabilpuram return 0; 108519a2b549SJerin Jacob } 108619a2b549SJerin Jacob 10874785c406SSatha Rao static inline int 10884785c406SSatha Rao roc_nix_cn20k_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq) 10894785c406SSatha Rao { 10904785c406SSatha Rao struct nix *nix = roc_nix_to_nix_priv(roc_nix); 10914785c406SSatha Rao struct mbox *mbox = (&nix->dev)->mbox; 10924785c406SSatha Rao volatile struct nix_cn20k_cq_ctx_s *cq_ctx; 10934785c406SSatha Rao uint16_t drop_thresh = NIX_CQ_THRESH_LEVEL; 10944785c406SSatha Rao uint16_t cpt_lbpid = nix->cpt_lbpid; 10954785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 10964785c406SSatha Rao enum nix_q_size qsize; 10974785c406SSatha Rao size_t desc_sz; 10984785c406SSatha Rao int rc; 10994785c406SSatha Rao 11004785c406SSatha Rao if (cq == NULL) 11014785c406SSatha Rao return NIX_ERR_PARAM; 11024785c406SSatha Rao 11034785c406SSatha Rao qsize = nix_qsize_clampup(cq->nb_desc); 11044785c406SSatha Rao cq->nb_desc = nix_qsize_to_val(qsize); 11054785c406SSatha Rao cq->qmask = cq->nb_desc - 1; 11064785c406SSatha Rao cq->door = nix->base + NIX_LF_CQ_OP_DOOR; 11074785c406SSatha Rao cq->status = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS); 11084785c406SSatha Rao cq->wdata = (uint64_t)cq->qid << 32; 11094785c406SSatha Rao cq->roc_nix = roc_nix; 11104785c406SSatha Rao 11114785c406SSatha Rao /* CQE of W16 */ 11124785c406SSatha Rao desc_sz = cq->nb_desc * NIX_CQ_ENTRY_SZ; 11134785c406SSatha Rao cq->desc_base = plt_zmalloc(desc_sz, NIX_CQ_ALIGN); 11144785c406SSatha Rao if (cq->desc_base == NULL) { 11154785c406SSatha Rao rc = NIX_ERR_NO_MEM; 11164785c406SSatha Rao goto fail; 11174785c406SSatha Rao } 11184785c406SSatha Rao 11194785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox_get(mbox)); 11204785c406SSatha Rao if (!aq) { 11214785c406SSatha Rao mbox_put(mbox); 11224785c406SSatha Rao return -ENOSPC; 11234785c406SSatha Rao } 11244785c406SSatha Rao 11254785c406SSatha Rao aq->qidx = cq->qid; 11264785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_CQ; 11274785c406SSatha Rao aq->op = NIX_AQ_INSTOP_INIT; 11284785c406SSatha Rao cq_ctx = &aq->cq; 11294785c406SSatha Rao 11304785c406SSatha Rao cq_ctx->ena = 1; 11314785c406SSatha Rao cq_ctx->caching = 1; 11324785c406SSatha Rao cq_ctx->qsize = qsize; 11334785c406SSatha Rao cq_ctx->base = (uint64_t)cq->desc_base; 11344785c406SSatha Rao cq_ctx->avg_level = 0xff; 11354785c406SSatha Rao cq_ctx->cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT); 11364785c406SSatha Rao cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR); 11374785c406SSatha Rao if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(roc_nix)) { 11384785c406SSatha Rao cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_CPT_DROP); 11394785c406SSatha Rao cq_ctx->cpt_drop_err_en = 1; 11404785c406SSatha Rao /* Enable Late BP only when non zero CPT BPID */ 11414785c406SSatha Rao if (cpt_lbpid) { 11424785c406SSatha Rao cq_ctx->lbp_ena = 1; 11434785c406SSatha Rao cq_ctx->lbpid_low = cpt_lbpid & 0x7; 11444785c406SSatha Rao cq_ctx->lbpid_med = (cpt_lbpid >> 3) & 0x7; 11454785c406SSatha Rao cq_ctx->lbpid_high = (cpt_lbpid >> 6) & 0x7; 11464785c406SSatha Rao cq_ctx->lbp_frac = NIX_CQ_LPB_THRESH_FRAC; 11474785c406SSatha Rao } 11484785c406SSatha Rao drop_thresh = NIX_CQ_SEC_THRESH_LEVEL; 11494785c406SSatha Rao } 11504785c406SSatha Rao 11514785c406SSatha Rao /* Many to one reduction */ 11524785c406SSatha Rao cq_ctx->qint_idx = cq->qid % nix->qints; 11534785c406SSatha Rao /* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */ 11544785c406SSatha Rao cq_ctx->cint_idx = cq->qid; 11554785c406SSatha Rao 11564785c406SSatha Rao if (roc_errata_nix_has_cq_min_size_4k()) { 11574785c406SSatha Rao const float rx_cq_skid = NIX_CQ_FULL_ERRATA_SKID; 11584785c406SSatha Rao uint16_t min_rx_drop; 11594785c406SSatha Rao 11604785c406SSatha Rao min_rx_drop = ceil(rx_cq_skid / (float)cq->nb_desc); 11614785c406SSatha Rao cq_ctx->drop = min_rx_drop; 11624785c406SSatha Rao cq_ctx->drop_ena = 1; 11634785c406SSatha Rao cq->drop_thresh = min_rx_drop; 11644785c406SSatha Rao } else { 11654785c406SSatha Rao cq->drop_thresh = drop_thresh; 11664785c406SSatha Rao /* Drop processing or red drop cannot be enabled due to 11674785c406SSatha Rao * due to packets coming for second pass from CPT. 11684785c406SSatha Rao */ 11694785c406SSatha Rao if (!roc_nix_inl_inb_is_enabled(roc_nix)) { 11704785c406SSatha Rao cq_ctx->drop = cq->drop_thresh; 11714785c406SSatha Rao cq_ctx->drop_ena = 1; 11724785c406SSatha Rao } 11734785c406SSatha Rao } 11744785c406SSatha Rao cq_ctx->bp = cq->drop_thresh; 11754785c406SSatha Rao 11764785c406SSatha Rao if (roc_feature_nix_has_cqe_stash()) { 11774785c406SSatha Rao if (cq_ctx->caching) { 11784785c406SSatha Rao cq_ctx->stashing = 1; 11794785c406SSatha Rao cq_ctx->stash_thresh = cq->stash_thresh; 11804785c406SSatha Rao } 11814785c406SSatha Rao } 11824785c406SSatha Rao 11834785c406SSatha Rao rc = mbox_process(mbox); 11844785c406SSatha Rao mbox_put(mbox); 11854785c406SSatha Rao if (rc) 11864785c406SSatha Rao goto free_mem; 11874785c406SSatha Rao 11884785c406SSatha Rao return nix_tel_node_add_cq(cq); 11894785c406SSatha Rao 11904785c406SSatha Rao free_mem: 11914785c406SSatha Rao plt_free(cq->desc_base); 11924785c406SSatha Rao fail: 11934785c406SSatha Rao return rc; 11944785c406SSatha Rao } 11954785c406SSatha Rao 119619a2b549SJerin Jacob int 119719a2b549SJerin Jacob roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq) 119819a2b549SJerin Jacob { 119919a2b549SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 120019a2b549SJerin Jacob struct mbox *mbox = (&nix->dev)->mbox; 12014785c406SSatha Rao volatile struct nix_cq_ctx_s *cq_ctx = NULL; 12028bc924cfSNithin Dabilpuram uint16_t drop_thresh = NIX_CQ_THRESH_LEVEL; 120381164c05SSatha Rao uint16_t cpt_lbpid = nix->cpt_lbpid; 120419a2b549SJerin Jacob enum nix_q_size qsize; 120519a2b549SJerin Jacob size_t desc_sz; 120619a2b549SJerin Jacob int rc; 120719a2b549SJerin Jacob 120819a2b549SJerin Jacob if (cq == NULL) 120919a2b549SJerin Jacob return NIX_ERR_PARAM; 121019a2b549SJerin Jacob 12114785c406SSatha Rao if (roc_model_is_cn20k()) 12124785c406SSatha Rao return roc_nix_cn20k_cq_init(roc_nix, cq); 12134785c406SSatha Rao 121419a2b549SJerin Jacob qsize = nix_qsize_clampup(cq->nb_desc); 121519a2b549SJerin Jacob cq->nb_desc = nix_qsize_to_val(qsize); 121619a2b549SJerin Jacob cq->qmask = cq->nb_desc - 1; 121719a2b549SJerin Jacob cq->door = nix->base + NIX_LF_CQ_OP_DOOR; 121819a2b549SJerin Jacob cq->status = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS); 121919a2b549SJerin Jacob cq->wdata = (uint64_t)cq->qid << 32; 122019a2b549SJerin Jacob cq->roc_nix = roc_nix; 122119a2b549SJerin Jacob 122219a2b549SJerin Jacob /* CQE of W16 */ 122319a2b549SJerin Jacob desc_sz = cq->nb_desc * NIX_CQ_ENTRY_SZ; 122419a2b549SJerin Jacob cq->desc_base = plt_zmalloc(desc_sz, NIX_CQ_ALIGN); 122519a2b549SJerin Jacob if (cq->desc_base == NULL) { 122619a2b549SJerin Jacob rc = NIX_ERR_NO_MEM; 122719a2b549SJerin Jacob goto fail; 122819a2b549SJerin Jacob } 122919a2b549SJerin Jacob 123019a2b549SJerin Jacob if (roc_model_is_cn9k()) { 123119a2b549SJerin Jacob struct nix_aq_enq_req *aq; 123219a2b549SJerin Jacob 123344a9307cSRakesh Kudurumalla aq = mbox_alloc_msg_nix_aq_enq(mbox_get(mbox)); 123444a9307cSRakesh Kudurumalla if (!aq) { 123544a9307cSRakesh Kudurumalla mbox_put(mbox); 1236da718c19SNithin Dabilpuram return -ENOSPC; 123744a9307cSRakesh Kudurumalla } 1238da718c19SNithin Dabilpuram 123919a2b549SJerin Jacob aq->qidx = cq->qid; 124019a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_CQ; 124119a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_INIT; 124219a2b549SJerin Jacob cq_ctx = &aq->cq; 12434785c406SSatha Rao } else if (roc_model_is_cn10k()) { 124419a2b549SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 124519a2b549SJerin Jacob 124644a9307cSRakesh Kudurumalla aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox_get(mbox)); 124744a9307cSRakesh Kudurumalla if (!aq) { 124844a9307cSRakesh Kudurumalla mbox_put(mbox); 1249da718c19SNithin Dabilpuram return -ENOSPC; 125044a9307cSRakesh Kudurumalla } 1251da718c19SNithin Dabilpuram 125219a2b549SJerin Jacob aq->qidx = cq->qid; 125319a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_CQ; 125419a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_INIT; 125519a2b549SJerin Jacob cq_ctx = &aq->cq; 125619a2b549SJerin Jacob } 125719a2b549SJerin Jacob 125819a2b549SJerin Jacob cq_ctx->ena = 1; 125919a2b549SJerin Jacob cq_ctx->caching = 1; 126019a2b549SJerin Jacob cq_ctx->qsize = qsize; 126119a2b549SJerin Jacob cq_ctx->base = (uint64_t)cq->desc_base; 126219a2b549SJerin Jacob cq_ctx->avg_level = 0xff; 126319a2b549SJerin Jacob cq_ctx->cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT); 126419a2b549SJerin Jacob cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR); 1265d2f168dfSNithin Dabilpuram if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(roc_nix)) { 12668bc924cfSNithin Dabilpuram cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_CPT_DROP); 12678bc924cfSNithin Dabilpuram cq_ctx->cpt_drop_err_en = 1; 126881164c05SSatha Rao /* Enable Late BP only when non zero CPT BPID */ 126981164c05SSatha Rao if (cpt_lbpid) { 12708bc924cfSNithin Dabilpuram cq_ctx->lbp_ena = 1; 12718bc924cfSNithin Dabilpuram cq_ctx->lbpid_low = cpt_lbpid & 0x7; 12728bc924cfSNithin Dabilpuram cq_ctx->lbpid_med = (cpt_lbpid >> 3) & 0x7; 12738bc924cfSNithin Dabilpuram cq_ctx->lbpid_high = (cpt_lbpid >> 6) & 0x7; 12748bc924cfSNithin Dabilpuram cq_ctx->lbp_frac = NIX_CQ_LPB_THRESH_FRAC; 127581164c05SSatha Rao } 12768bc924cfSNithin Dabilpuram drop_thresh = NIX_CQ_SEC_THRESH_LEVEL; 12778bc924cfSNithin Dabilpuram } 127819a2b549SJerin Jacob 127919a2b549SJerin Jacob /* Many to one reduction */ 128019a2b549SJerin Jacob cq_ctx->qint_idx = cq->qid % nix->qints; 128119a2b549SJerin Jacob /* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */ 128219a2b549SJerin Jacob cq_ctx->cint_idx = cq->qid; 128319a2b549SJerin Jacob 12841f997c06SRahul Bhansali if (roc_errata_nix_has_cq_min_size_4k()) { 1285b21f07c9SHarman Kalra const float rx_cq_skid = NIX_CQ_FULL_ERRATA_SKID; 1286b21f07c9SHarman Kalra uint16_t min_rx_drop; 1287b21f07c9SHarman Kalra 1288b21f07c9SHarman Kalra min_rx_drop = ceil(rx_cq_skid / (float)cq->nb_desc); 1289b21f07c9SHarman Kalra cq_ctx->drop = min_rx_drop; 1290b21f07c9SHarman Kalra cq_ctx->drop_ena = 1; 1291b21f07c9SHarman Kalra cq->drop_thresh = min_rx_drop; 1292b21f07c9SHarman Kalra } else { 12938bc924cfSNithin Dabilpuram cq->drop_thresh = drop_thresh; 1294b4ea958bSNithin Dabilpuram /* Drop processing or red drop cannot be enabled due to 1295b4ea958bSNithin Dabilpuram * due to packets coming for second pass from CPT. 1296b4ea958bSNithin Dabilpuram */ 1297b4ea958bSNithin Dabilpuram if (!roc_nix_inl_inb_is_enabled(roc_nix)) { 129819a2b549SJerin Jacob cq_ctx->drop = cq->drop_thresh; 129919a2b549SJerin Jacob cq_ctx->drop_ena = 1; 1300b21f07c9SHarman Kalra } 1301b4ea958bSNithin Dabilpuram } 1302d2f168dfSNithin Dabilpuram cq_ctx->bp = cq->drop_thresh; 130319a2b549SJerin Jacob 1304e07ca13fSKommula Shiva Shankar if (roc_feature_nix_has_cqe_stash()) { 1305e07ca13fSKommula Shiva Shankar if (cq_ctx->caching) { 1306e07ca13fSKommula Shiva Shankar cq_ctx->stashing = 1; 1307e07ca13fSKommula Shiva Shankar cq_ctx->stash_thresh = cq->stash_thresh; 1308e07ca13fSKommula Shiva Shankar } 1309e07ca13fSKommula Shiva Shankar } 1310e07ca13fSKommula Shiva Shankar 131119a2b549SJerin Jacob rc = mbox_process(mbox); 131244a9307cSRakesh Kudurumalla mbox_put(mbox); 131319a2b549SJerin Jacob if (rc) 131419a2b549SJerin Jacob goto free_mem; 131519a2b549SJerin Jacob 1316af75aac7SGowrishankar Muthukrishnan return nix_tel_node_add_cq(cq); 131719a2b549SJerin Jacob 131819a2b549SJerin Jacob free_mem: 131919a2b549SJerin Jacob plt_free(cq->desc_base); 132019a2b549SJerin Jacob fail: 132119a2b549SJerin Jacob return rc; 132219a2b549SJerin Jacob } 132319a2b549SJerin Jacob 132419a2b549SJerin Jacob int 132519a2b549SJerin Jacob roc_nix_cq_fini(struct roc_nix_cq *cq) 132619a2b549SJerin Jacob { 132719a2b549SJerin Jacob struct mbox *mbox; 132819a2b549SJerin Jacob struct nix *nix; 132919a2b549SJerin Jacob int rc; 133019a2b549SJerin Jacob 133119a2b549SJerin Jacob if (cq == NULL) 133219a2b549SJerin Jacob return NIX_ERR_PARAM; 133319a2b549SJerin Jacob 133419a2b549SJerin Jacob nix = roc_nix_to_nix_priv(cq->roc_nix); 133544a9307cSRakesh Kudurumalla mbox = mbox_get((&nix->dev)->mbox); 133619a2b549SJerin Jacob 133719a2b549SJerin Jacob /* Disable CQ */ 133819a2b549SJerin Jacob if (roc_model_is_cn9k()) { 133919a2b549SJerin Jacob struct nix_aq_enq_req *aq; 134019a2b549SJerin Jacob 134119a2b549SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 134244a9307cSRakesh Kudurumalla if (!aq) { 134344a9307cSRakesh Kudurumalla mbox_put(mbox); 1344da718c19SNithin Dabilpuram return -ENOSPC; 134544a9307cSRakesh Kudurumalla } 1346da718c19SNithin Dabilpuram 134719a2b549SJerin Jacob aq->qidx = cq->qid; 134819a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_CQ; 134919a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 135019a2b549SJerin Jacob aq->cq.ena = 0; 135119a2b549SJerin Jacob aq->cq.bp_ena = 0; 135219a2b549SJerin Jacob aq->cq_mask.ena = ~aq->cq_mask.ena; 135319a2b549SJerin Jacob aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena; 13544785c406SSatha Rao } else if (roc_model_is_cn10k()) { 135519a2b549SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 135619a2b549SJerin Jacob 135719a2b549SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 135844a9307cSRakesh Kudurumalla if (!aq) { 135944a9307cSRakesh Kudurumalla mbox_put(mbox); 1360da718c19SNithin Dabilpuram return -ENOSPC; 136144a9307cSRakesh Kudurumalla } 1362da718c19SNithin Dabilpuram 136319a2b549SJerin Jacob aq->qidx = cq->qid; 136419a2b549SJerin Jacob aq->ctype = NIX_AQ_CTYPE_CQ; 136519a2b549SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 136619a2b549SJerin Jacob aq->cq.ena = 0; 136719a2b549SJerin Jacob aq->cq.bp_ena = 0; 136819a2b549SJerin Jacob aq->cq_mask.ena = ~aq->cq_mask.ena; 136919a2b549SJerin Jacob aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena; 1370d2f168dfSNithin Dabilpuram if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(cq->roc_nix)) { 137181164c05SSatha Rao aq->cq.lbp_ena = 0; 137281164c05SSatha Rao aq->cq_mask.lbp_ena = ~aq->cq_mask.lbp_ena; 137381164c05SSatha Rao } 13744785c406SSatha Rao } else { 13754785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 13764785c406SSatha Rao 13774785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 13784785c406SSatha Rao if (!aq) { 13794785c406SSatha Rao mbox_put(mbox); 13804785c406SSatha Rao return -ENOSPC; 13814785c406SSatha Rao } 13824785c406SSatha Rao 13834785c406SSatha Rao aq->qidx = cq->qid; 13844785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_CQ; 13854785c406SSatha Rao aq->op = NIX_AQ_INSTOP_WRITE; 13864785c406SSatha Rao aq->cq.ena = 0; 13874785c406SSatha Rao aq->cq.bp_ena = 0; 13884785c406SSatha Rao aq->cq_mask.ena = ~aq->cq_mask.ena; 13894785c406SSatha Rao aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena; 13904785c406SSatha Rao if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(cq->roc_nix)) { 13914785c406SSatha Rao aq->cq.lbp_ena = 0; 13924785c406SSatha Rao aq->cq_mask.lbp_ena = ~aq->cq_mask.lbp_ena; 13934785c406SSatha Rao } 139419a2b549SJerin Jacob } 139519a2b549SJerin Jacob 139619a2b549SJerin Jacob rc = mbox_process(mbox); 139744a9307cSRakesh Kudurumalla if (rc) { 139844a9307cSRakesh Kudurumalla mbox_put(mbox); 139919a2b549SJerin Jacob return rc; 140044a9307cSRakesh Kudurumalla } 140119a2b549SJerin Jacob 140244a9307cSRakesh Kudurumalla mbox_put(mbox); 140319a2b549SJerin Jacob plt_free(cq->desc_base); 140419a2b549SJerin Jacob return 0; 140519a2b549SJerin Jacob } 1406ae060709SJerin Jacob 1407ae060709SJerin Jacob static int 1408ae060709SJerin Jacob sqb_pool_populate(struct roc_nix *roc_nix, struct roc_nix_sq *sq) 1409ae060709SJerin Jacob { 1410ae060709SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 1411641e1024SSatha Rao uint16_t sqes_per_sqb, count, nb_sqb_bufs, thr; 1412ae060709SJerin Jacob struct npa_pool_s pool; 1413ae060709SJerin Jacob struct npa_aura_s aura; 1414ae060709SJerin Jacob uint64_t blk_sz; 1415ae060709SJerin Jacob uint64_t iova; 1416ae060709SJerin Jacob int rc; 1417ae060709SJerin Jacob 1418ae060709SJerin Jacob blk_sz = nix->sqb_size; 1419ae060709SJerin Jacob if (sq->max_sqe_sz == roc_nix_maxsqesz_w16) 1420ae060709SJerin Jacob sqes_per_sqb = (blk_sz / 8) / 16; 1421ae060709SJerin Jacob else 1422ae060709SJerin Jacob sqes_per_sqb = (blk_sz / 8) / 8; 1423ae060709SJerin Jacob 1424641e1024SSatha Rao /* Reserve One SQE in each SQB to hold pointer for next SQB */ 1425641e1024SSatha Rao sqes_per_sqb -= 1; 1426641e1024SSatha Rao 14271134d758SPavan Nikhilesh sq->nb_desc = PLT_MAX(512U, sq->nb_desc); 1428641e1024SSatha Rao nb_sqb_bufs = PLT_DIV_CEIL(sq->nb_desc, sqes_per_sqb); 1429641e1024SSatha Rao thr = PLT_DIV_CEIL((nb_sqb_bufs * ROC_NIX_SQB_THRESH), 100); 1430641e1024SSatha Rao nb_sqb_bufs += NIX_SQB_PREFETCH; 1431ae060709SJerin Jacob /* Clamp up the SQB count */ 1432eac95048SSatha Rao nb_sqb_bufs = PLT_MAX(NIX_DEF_SQB, nb_sqb_bufs); 1433eac95048SSatha Rao nb_sqb_bufs = PLT_MIN(roc_nix->max_sqb_count, (uint16_t)nb_sqb_bufs); 1434ae060709SJerin Jacob 1435ae060709SJerin Jacob sq->nb_sqb_bufs = nb_sqb_bufs; 1436ae060709SJerin Jacob sq->sqes_per_sqb_log2 = (uint16_t)plt_log2_u32(sqes_per_sqb); 1437641e1024SSatha Rao sq->nb_sqb_bufs_adj = nb_sqb_bufs; 1438ae060709SJerin Jacob 1439cad8686eSSatha Rao if (roc_nix->sqb_slack) 1440cad8686eSSatha Rao nb_sqb_bufs += roc_nix->sqb_slack; 1441cad8686eSSatha Rao else 1442cad8686eSSatha Rao nb_sqb_bufs += PLT_MAX((int)thr, (int)ROC_NIX_SQB_SLACK_DFLT); 1443ae060709SJerin Jacob /* Explicitly set nat_align alone as by default pool is with both 1444ae060709SJerin Jacob * nat_align and buf_offset = 1 which we don't want for SQB. 1445ae060709SJerin Jacob */ 1446ae060709SJerin Jacob memset(&pool, 0, sizeof(struct npa_pool_s)); 1447ae060709SJerin Jacob pool.nat_align = 1; 1448ae060709SJerin Jacob 1449ae060709SJerin Jacob memset(&aura, 0, sizeof(aura)); 1450ae060709SJerin Jacob aura.fc_ena = 1; 14511f997c06SRahul Bhansali if (roc_model_is_cn9k() || roc_errata_npa_has_no_fc_stype_ststp()) 1452dd9525a7SAshwin Sekhar T K aura.fc_stype = 0x0; /* STF */ 1453dd9525a7SAshwin Sekhar T K else 1454dd9525a7SAshwin Sekhar T K aura.fc_stype = 0x3; /* STSTP */ 1455ae060709SJerin Jacob aura.fc_addr = (uint64_t)sq->fc; 1456b714421eSSatha Rao aura.fc_hyst_bits = sq->fc_hyst_bits & 0xF; 1457b714421eSSatha Rao rc = roc_npa_pool_create(&sq->aura_handle, blk_sz, nb_sqb_bufs, &aura, &pool, 0); 1458ae060709SJerin Jacob if (rc) 1459ae060709SJerin Jacob goto fail; 1460ae060709SJerin Jacob 1461aaea4c74SNithin Dabilpuram roc_npa_buf_type_update(sq->aura_handle, ROC_NPA_BUF_TYPE_SQB, 1); 14621134d758SPavan Nikhilesh sq->sqe_mem = plt_zmalloc(blk_sz * nb_sqb_bufs, blk_sz); 1463ae060709SJerin Jacob if (sq->sqe_mem == NULL) { 1464ae060709SJerin Jacob rc = NIX_ERR_NO_MEM; 1465ae060709SJerin Jacob goto nomem; 1466ae060709SJerin Jacob } 1467ae060709SJerin Jacob 1468ae060709SJerin Jacob /* Fill the initial buffers */ 1469ae060709SJerin Jacob iova = (uint64_t)sq->sqe_mem; 14701134d758SPavan Nikhilesh for (count = 0; count < nb_sqb_bufs; count++) { 1471ae060709SJerin Jacob roc_npa_aura_op_free(sq->aura_handle, 0, iova); 1472ae060709SJerin Jacob iova += blk_sz; 1473ae060709SJerin Jacob } 147472a6471aSAshwin Sekhar T K 14751134d758SPavan Nikhilesh if (roc_npa_aura_op_available_wait(sq->aura_handle, nb_sqb_bufs, 0) != 14761134d758SPavan Nikhilesh nb_sqb_bufs) { 147772a6471aSAshwin Sekhar T K plt_err("Failed to free all pointers to the pool"); 147872a6471aSAshwin Sekhar T K rc = NIX_ERR_NO_MEM; 147972a6471aSAshwin Sekhar T K goto npa_fail; 148072a6471aSAshwin Sekhar T K } 148172a6471aSAshwin Sekhar T K 14820bdad505SAshwin Sekhar T K roc_npa_pool_op_range_set(sq->aura_handle, (uint64_t)sq->sqe_mem, iova); 14831134d758SPavan Nikhilesh roc_npa_aura_limit_modify(sq->aura_handle, nb_sqb_bufs); 14841134d758SPavan Nikhilesh sq->aura_sqb_bufs = nb_sqb_bufs; 1485ae060709SJerin Jacob 1486ae060709SJerin Jacob return rc; 148772a6471aSAshwin Sekhar T K npa_fail: 148872a6471aSAshwin Sekhar T K plt_free(sq->sqe_mem); 1489ae060709SJerin Jacob nomem: 1490ae060709SJerin Jacob roc_npa_pool_destroy(sq->aura_handle); 1491ae060709SJerin Jacob fail: 1492ae060709SJerin Jacob return rc; 1493ae060709SJerin Jacob } 1494ae060709SJerin Jacob 1495da718c19SNithin Dabilpuram static int 1496ae060709SJerin Jacob sq_cn9k_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum, 1497ae060709SJerin Jacob uint16_t smq) 1498ae060709SJerin Jacob { 149928b283faSSubrahmanyam Nilla struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix); 1500ae060709SJerin Jacob struct mbox *mbox = (&nix->dev)->mbox; 1501ae060709SJerin Jacob struct nix_aq_enq_req *aq; 1502ae060709SJerin Jacob 1503ae060709SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 1504da718c19SNithin Dabilpuram if (!aq) 1505da718c19SNithin Dabilpuram return -ENOSPC; 1506da718c19SNithin Dabilpuram 1507ae060709SJerin Jacob aq->qidx = sq->qid; 1508ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1509ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_INIT; 1510ae060709SJerin Jacob aq->sq.max_sqe_size = sq->max_sqe_sz; 1511ae060709SJerin Jacob 1512ae060709SJerin Jacob aq->sq.max_sqe_size = sq->max_sqe_sz; 1513ae060709SJerin Jacob aq->sq.smq = smq; 1514ae060709SJerin Jacob aq->sq.smq_rr_quantum = rr_quantum; 151528b283faSSubrahmanyam Nilla if (roc_nix_is_sdp(roc_nix)) 151628b283faSSubrahmanyam Nilla aq->sq.default_chan = 151728b283faSSubrahmanyam Nilla nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt); 151828b283faSSubrahmanyam Nilla else 1519ae060709SJerin Jacob aq->sq.default_chan = nix->tx_chan_base; 1520ae060709SJerin Jacob aq->sq.sqe_stype = NIX_STYPE_STF; 1521ae060709SJerin Jacob aq->sq.ena = 1; 15226b7fcb7aSSatha Rao aq->sq.sso_ena = !!sq->sso_ena; 152387254db8SKommula Shiva Shankar aq->sq.cq_ena = !!sq->cq_ena; 152487254db8SKommula Shiva Shankar aq->sq.cq = sq->cqid; 1525ba6855a0SKommula Shiva Shankar aq->sq.cq_limit = sq->cq_drop_thresh; 1526ae060709SJerin Jacob if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8) 1527ae060709SJerin Jacob aq->sq.sqe_stype = NIX_STYPE_STP; 1528ae060709SJerin Jacob aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle); 1529ae060709SJerin Jacob aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR); 1530ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL); 1531ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR); 1532ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR); 1533ae060709SJerin Jacob 1534ae060709SJerin Jacob /* Many to one reduction */ 153570e06693SHarman Kalra aq->sq.qint_idx = sq->qid % nix->qints; 153670e06693SHarman Kalra 1537da718c19SNithin Dabilpuram return 0; 1538ae060709SJerin Jacob } 1539ae060709SJerin Jacob 1540ae060709SJerin Jacob static int 1541ae060709SJerin Jacob sq_cn9k_fini(struct nix *nix, struct roc_nix_sq *sq) 1542ae060709SJerin Jacob { 154344a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 1544ae060709SJerin Jacob struct nix_aq_enq_rsp *rsp; 1545ae060709SJerin Jacob struct nix_aq_enq_req *aq; 1546ae060709SJerin Jacob uint16_t sqes_per_sqb; 1547ae060709SJerin Jacob void *sqb_buf; 1548ae060709SJerin Jacob int rc, count; 1549ae060709SJerin Jacob 1550ae060709SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 155144a9307cSRakesh Kudurumalla if (!aq) { 155244a9307cSRakesh Kudurumalla mbox_put(mbox); 1553da718c19SNithin Dabilpuram return -ENOSPC; 155444a9307cSRakesh Kudurumalla } 1555da718c19SNithin Dabilpuram 1556ae060709SJerin Jacob aq->qidx = sq->qid; 1557ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1558ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_READ; 1559ae060709SJerin Jacob rc = mbox_process_msg(mbox, (void *)&rsp); 156044a9307cSRakesh Kudurumalla if (rc) { 156144a9307cSRakesh Kudurumalla mbox_put(mbox); 1562ae060709SJerin Jacob return rc; 156344a9307cSRakesh Kudurumalla } 1564ae060709SJerin Jacob 1565ae060709SJerin Jacob /* Check if sq is already cleaned up */ 156644a9307cSRakesh Kudurumalla if (!rsp->sq.ena) { 156744a9307cSRakesh Kudurumalla mbox_put(mbox); 1568ae060709SJerin Jacob return 0; 156944a9307cSRakesh Kudurumalla } 1570ae060709SJerin Jacob 1571ae060709SJerin Jacob /* Disable sq */ 1572ae060709SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 157344a9307cSRakesh Kudurumalla if (!aq) { 157444a9307cSRakesh Kudurumalla mbox_put(mbox); 1575da718c19SNithin Dabilpuram return -ENOSPC; 157644a9307cSRakesh Kudurumalla } 1577da718c19SNithin Dabilpuram 1578ae060709SJerin Jacob aq->qidx = sq->qid; 1579ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1580ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 1581ae060709SJerin Jacob aq->sq_mask.ena = ~aq->sq_mask.ena; 1582ae060709SJerin Jacob aq->sq.ena = 0; 1583ae060709SJerin Jacob rc = mbox_process(mbox); 158444a9307cSRakesh Kudurumalla if (rc) { 158544a9307cSRakesh Kudurumalla mbox_put(mbox); 1586ae060709SJerin Jacob return rc; 158744a9307cSRakesh Kudurumalla } 1588ae060709SJerin Jacob 1589ae060709SJerin Jacob /* Read SQ and free sqb's */ 1590ae060709SJerin Jacob aq = mbox_alloc_msg_nix_aq_enq(mbox); 159144a9307cSRakesh Kudurumalla if (!aq) { 159244a9307cSRakesh Kudurumalla mbox_put(mbox); 1593da718c19SNithin Dabilpuram return -ENOSPC; 159444a9307cSRakesh Kudurumalla } 1595da718c19SNithin Dabilpuram 1596ae060709SJerin Jacob aq->qidx = sq->qid; 1597ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1598ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_READ; 1599ae060709SJerin Jacob rc = mbox_process_msg(mbox, (void *)&rsp); 160044a9307cSRakesh Kudurumalla if (rc) { 160144a9307cSRakesh Kudurumalla mbox_put(mbox); 1602ae060709SJerin Jacob return rc; 160344a9307cSRakesh Kudurumalla } 1604ae060709SJerin Jacob 1605ae060709SJerin Jacob if (aq->sq.smq_pend) 1606ae060709SJerin Jacob plt_err("SQ has pending SQE's"); 1607ae060709SJerin Jacob 1608ae060709SJerin Jacob count = aq->sq.sqb_count; 1609ae060709SJerin Jacob sqes_per_sqb = 1 << sq->sqes_per_sqb_log2; 1610ae060709SJerin Jacob /* Free SQB's that are used */ 1611ae060709SJerin Jacob sqb_buf = (void *)rsp->sq.head_sqb; 1612ae060709SJerin Jacob while (count) { 1613ae060709SJerin Jacob void *next_sqb; 1614ae060709SJerin Jacob 1615b7c31b6dSSatha Rao next_sqb = *(void **)((uint64_t *)sqb_buf + 1616b7c31b6dSSatha Rao (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8)); 1617ae060709SJerin Jacob roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf); 1618ae060709SJerin Jacob sqb_buf = next_sqb; 1619ae060709SJerin Jacob count--; 1620ae060709SJerin Jacob } 1621ae060709SJerin Jacob 1622ae060709SJerin Jacob /* Free next to use sqb */ 1623ae060709SJerin Jacob if (rsp->sq.next_sqb) 1624ae060709SJerin Jacob roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb); 162544a9307cSRakesh Kudurumalla mbox_put(mbox); 1626ae060709SJerin Jacob return 0; 1627ae060709SJerin Jacob } 1628ae060709SJerin Jacob 1629da718c19SNithin Dabilpuram static int 16304785c406SSatha Rao sq_cn10k_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum, uint16_t smq) 1631ae060709SJerin Jacob { 163273b16cedSVeerasenareddy Burru struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix); 1633ae060709SJerin Jacob struct mbox *mbox = (&nix->dev)->mbox; 1634ae060709SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 1635ae060709SJerin Jacob 1636ae060709SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 1637da718c19SNithin Dabilpuram if (!aq) 1638da718c19SNithin Dabilpuram return -ENOSPC; 1639da718c19SNithin Dabilpuram 1640ae060709SJerin Jacob aq->qidx = sq->qid; 1641ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1642ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_INIT; 1643ae060709SJerin Jacob aq->sq.max_sqe_size = sq->max_sqe_sz; 1644ae060709SJerin Jacob 1645ae060709SJerin Jacob aq->sq.max_sqe_size = sq->max_sqe_sz; 1646ae060709SJerin Jacob aq->sq.smq = smq; 1647ae060709SJerin Jacob aq->sq.smq_rr_weight = rr_quantum; 164873b16cedSVeerasenareddy Burru if (roc_nix_is_sdp(roc_nix)) 164973b16cedSVeerasenareddy Burru aq->sq.default_chan = nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt); 165073b16cedSVeerasenareddy Burru else 1651ae060709SJerin Jacob aq->sq.default_chan = nix->tx_chan_base; 1652ae060709SJerin Jacob aq->sq.sqe_stype = NIX_STYPE_STF; 1653ae060709SJerin Jacob aq->sq.ena = 1; 16546b7fcb7aSSatha Rao aq->sq.sso_ena = !!sq->sso_ena; 165587254db8SKommula Shiva Shankar aq->sq.cq_ena = !!sq->cq_ena; 165687254db8SKommula Shiva Shankar aq->sq.cq = sq->cqid; 1657ba6855a0SKommula Shiva Shankar aq->sq.cq_limit = sq->cq_drop_thresh; 1658ae060709SJerin Jacob if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8) 1659ae060709SJerin Jacob aq->sq.sqe_stype = NIX_STYPE_STP; 1660ae060709SJerin Jacob aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle); 1661ae060709SJerin Jacob aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR); 1662ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL); 1663ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR); 1664ae060709SJerin Jacob aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR); 1665ae060709SJerin Jacob 166670e06693SHarman Kalra /* Many to one reduction */ 166770e06693SHarman Kalra aq->sq.qint_idx = sq->qid % nix->qints; 166870e06693SHarman Kalra if (roc_errata_nix_assign_incorrect_qint()) { 166989d3557cSHarman Kalra /* Assigning QINT 0 to all the SQs, an errata exists where NIXTX can 167089d3557cSHarman Kalra * send incorrect QINT_IDX when reporting queue interrupt (QINT). This 167189d3557cSHarman Kalra * might result in software missing the interrupt. 167289d3557cSHarman Kalra */ 167389d3557cSHarman Kalra aq->sq.qint_idx = 0; 167470e06693SHarman Kalra } 1675da718c19SNithin Dabilpuram return 0; 1676ae060709SJerin Jacob } 1677ae060709SJerin Jacob 1678ae060709SJerin Jacob static int 16794785c406SSatha Rao sq_cn10k_fini(struct nix *nix, struct roc_nix_sq *sq) 1680ae060709SJerin Jacob { 168144a9307cSRakesh Kudurumalla struct mbox *mbox = mbox_get((&nix->dev)->mbox); 1682ae060709SJerin Jacob struct nix_cn10k_aq_enq_rsp *rsp; 1683ae060709SJerin Jacob struct nix_cn10k_aq_enq_req *aq; 1684ae060709SJerin Jacob uint16_t sqes_per_sqb; 1685ae060709SJerin Jacob void *sqb_buf; 1686ae060709SJerin Jacob int rc, count; 1687ae060709SJerin Jacob 1688ae060709SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 168944a9307cSRakesh Kudurumalla if (!aq) { 169044a9307cSRakesh Kudurumalla mbox_put(mbox); 1691da718c19SNithin Dabilpuram return -ENOSPC; 169244a9307cSRakesh Kudurumalla } 1693da718c19SNithin Dabilpuram 1694ae060709SJerin Jacob aq->qidx = sq->qid; 1695ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1696ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_READ; 1697ae060709SJerin Jacob rc = mbox_process_msg(mbox, (void *)&rsp); 169844a9307cSRakesh Kudurumalla if (rc) { 169944a9307cSRakesh Kudurumalla mbox_put(mbox); 1700ae060709SJerin Jacob return rc; 170144a9307cSRakesh Kudurumalla } 1702ae060709SJerin Jacob 1703ae060709SJerin Jacob /* Check if sq is already cleaned up */ 170444a9307cSRakesh Kudurumalla if (!rsp->sq.ena) { 170544a9307cSRakesh Kudurumalla mbox_put(mbox); 1706ae060709SJerin Jacob return 0; 170744a9307cSRakesh Kudurumalla } 1708ae060709SJerin Jacob 1709ae060709SJerin Jacob /* Disable sq */ 1710ae060709SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 171144a9307cSRakesh Kudurumalla if (!aq) { 171244a9307cSRakesh Kudurumalla mbox_put(mbox); 1713da718c19SNithin Dabilpuram return -ENOSPC; 171444a9307cSRakesh Kudurumalla } 1715da718c19SNithin Dabilpuram 1716ae060709SJerin Jacob aq->qidx = sq->qid; 1717ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1718ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_WRITE; 1719ae060709SJerin Jacob aq->sq_mask.ena = ~aq->sq_mask.ena; 1720ae060709SJerin Jacob aq->sq.ena = 0; 1721ae060709SJerin Jacob rc = mbox_process(mbox); 172244a9307cSRakesh Kudurumalla if (rc) { 172344a9307cSRakesh Kudurumalla mbox_put(mbox); 1724ae060709SJerin Jacob return rc; 172544a9307cSRakesh Kudurumalla } 1726ae060709SJerin Jacob 1727ae060709SJerin Jacob /* Read SQ and free sqb's */ 1728ae060709SJerin Jacob aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox); 172944a9307cSRakesh Kudurumalla if (!aq) { 173044a9307cSRakesh Kudurumalla mbox_put(mbox); 1731da718c19SNithin Dabilpuram return -ENOSPC; 173244a9307cSRakesh Kudurumalla } 1733da718c19SNithin Dabilpuram 1734ae060709SJerin Jacob aq->qidx = sq->qid; 1735ae060709SJerin Jacob aq->ctype = NIX_AQ_CTYPE_SQ; 1736ae060709SJerin Jacob aq->op = NIX_AQ_INSTOP_READ; 1737ae060709SJerin Jacob rc = mbox_process_msg(mbox, (void *)&rsp); 173844a9307cSRakesh Kudurumalla if (rc) { 173944a9307cSRakesh Kudurumalla mbox_put(mbox); 1740ae060709SJerin Jacob return rc; 174144a9307cSRakesh Kudurumalla } 1742ae060709SJerin Jacob 1743ae060709SJerin Jacob if (aq->sq.smq_pend) 1744ae060709SJerin Jacob plt_err("SQ has pending SQE's"); 1745ae060709SJerin Jacob 1746ae060709SJerin Jacob count = aq->sq.sqb_count; 1747ae060709SJerin Jacob sqes_per_sqb = 1 << sq->sqes_per_sqb_log2; 1748ae060709SJerin Jacob /* Free SQB's that are used */ 1749ae060709SJerin Jacob sqb_buf = (void *)rsp->sq.head_sqb; 1750ae060709SJerin Jacob while (count) { 1751ae060709SJerin Jacob void *next_sqb; 1752ae060709SJerin Jacob 1753b7c31b6dSSatha Rao next_sqb = *(void **)((uint64_t *)sqb_buf + 1754b7c31b6dSSatha Rao (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8)); 1755ae060709SJerin Jacob roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf); 1756ae060709SJerin Jacob sqb_buf = next_sqb; 1757ae060709SJerin Jacob count--; 1758ae060709SJerin Jacob } 1759ae060709SJerin Jacob 1760ae060709SJerin Jacob /* Free next to use sqb */ 1761ae060709SJerin Jacob if (rsp->sq.next_sqb) 1762ae060709SJerin Jacob roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb); 176344a9307cSRakesh Kudurumalla mbox_put(mbox); 1764ae060709SJerin Jacob return 0; 1765ae060709SJerin Jacob } 1766ae060709SJerin Jacob 17674785c406SSatha Rao static int 17684785c406SSatha Rao sq_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum, uint16_t smq) 17694785c406SSatha Rao { 17704785c406SSatha Rao struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix); 17714785c406SSatha Rao struct mbox *mbox = (&nix->dev)->mbox; 17724785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 17734785c406SSatha Rao 17744785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 17754785c406SSatha Rao if (!aq) 17764785c406SSatha Rao return -ENOSPC; 17774785c406SSatha Rao 17784785c406SSatha Rao aq->qidx = sq->qid; 17794785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_SQ; 17804785c406SSatha Rao aq->op = NIX_AQ_INSTOP_INIT; 17814785c406SSatha Rao aq->sq.max_sqe_size = sq->max_sqe_sz; 17824785c406SSatha Rao 17834785c406SSatha Rao aq->sq.max_sqe_size = sq->max_sqe_sz; 17844785c406SSatha Rao aq->sq.smq = smq; 17854785c406SSatha Rao aq->sq.smq_rr_weight = rr_quantum; 17864785c406SSatha Rao if (roc_nix_is_sdp(roc_nix)) 17874785c406SSatha Rao aq->sq.default_chan = nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt); 17884785c406SSatha Rao else 17894785c406SSatha Rao aq->sq.default_chan = nix->tx_chan_base; 17904785c406SSatha Rao aq->sq.sqe_stype = NIX_STYPE_STF; 17914785c406SSatha Rao aq->sq.ena = 1; 17924785c406SSatha Rao aq->sq.sso_ena = !!sq->sso_ena; 17934785c406SSatha Rao aq->sq.cq_ena = !!sq->cq_ena; 17944785c406SSatha Rao aq->sq.cq = sq->cqid; 17954785c406SSatha Rao aq->sq.cq_limit = sq->cq_drop_thresh; 17964785c406SSatha Rao if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8) 17974785c406SSatha Rao aq->sq.sqe_stype = NIX_STYPE_STP; 17984785c406SSatha Rao aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle); 17994785c406SSatha Rao aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR); 18004785c406SSatha Rao aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL); 18014785c406SSatha Rao aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR); 18024785c406SSatha Rao aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR); 18034785c406SSatha Rao 18044785c406SSatha Rao /* Many to one reduction */ 18054785c406SSatha Rao aq->sq.qint_idx = sq->qid % nix->qints; 18064785c406SSatha Rao if (roc_errata_nix_assign_incorrect_qint()) { 18074785c406SSatha Rao /* Assigning QINT 0 to all the SQs, an errata exists where NIXTX can 18084785c406SSatha Rao * send incorrect QINT_IDX when reporting queue interrupt (QINT). This 18094785c406SSatha Rao * might result in software missing the interrupt. 18104785c406SSatha Rao */ 18114785c406SSatha Rao aq->sq.qint_idx = 0; 18124785c406SSatha Rao } 18134785c406SSatha Rao return 0; 18144785c406SSatha Rao } 18154785c406SSatha Rao 18164785c406SSatha Rao static int 18174785c406SSatha Rao sq_fini(struct nix *nix, struct roc_nix_sq *sq) 18184785c406SSatha Rao { 18194785c406SSatha Rao struct mbox *mbox = mbox_get((&nix->dev)->mbox); 18204785c406SSatha Rao struct nix_cn20k_aq_enq_rsp *rsp; 18214785c406SSatha Rao struct nix_cn20k_aq_enq_req *aq; 18224785c406SSatha Rao uint16_t sqes_per_sqb; 18234785c406SSatha Rao void *sqb_buf; 18244785c406SSatha Rao int rc, count; 18254785c406SSatha Rao 18264785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 18274785c406SSatha Rao if (!aq) { 18284785c406SSatha Rao mbox_put(mbox); 18294785c406SSatha Rao return -ENOSPC; 18304785c406SSatha Rao } 18314785c406SSatha Rao 18324785c406SSatha Rao aq->qidx = sq->qid; 18334785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_SQ; 18344785c406SSatha Rao aq->op = NIX_AQ_INSTOP_READ; 18354785c406SSatha Rao rc = mbox_process_msg(mbox, (void *)&rsp); 18364785c406SSatha Rao if (rc) { 18374785c406SSatha Rao mbox_put(mbox); 18384785c406SSatha Rao return rc; 18394785c406SSatha Rao } 18404785c406SSatha Rao 18414785c406SSatha Rao /* Check if sq is already cleaned up */ 18424785c406SSatha Rao if (!rsp->sq.ena) { 18434785c406SSatha Rao mbox_put(mbox); 18444785c406SSatha Rao return 0; 18454785c406SSatha Rao } 18464785c406SSatha Rao 18474785c406SSatha Rao /* Disable sq */ 18484785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 18494785c406SSatha Rao if (!aq) { 18504785c406SSatha Rao mbox_put(mbox); 18514785c406SSatha Rao return -ENOSPC; 18524785c406SSatha Rao } 18534785c406SSatha Rao 18544785c406SSatha Rao aq->qidx = sq->qid; 18554785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_SQ; 18564785c406SSatha Rao aq->op = NIX_AQ_INSTOP_WRITE; 18574785c406SSatha Rao aq->sq_mask.ena = ~aq->sq_mask.ena; 18584785c406SSatha Rao aq->sq.ena = 0; 18594785c406SSatha Rao rc = mbox_process(mbox); 18604785c406SSatha Rao if (rc) { 18614785c406SSatha Rao mbox_put(mbox); 18624785c406SSatha Rao return rc; 18634785c406SSatha Rao } 18644785c406SSatha Rao 18654785c406SSatha Rao /* Read SQ and free sqb's */ 18664785c406SSatha Rao aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox); 18674785c406SSatha Rao if (!aq) { 18684785c406SSatha Rao mbox_put(mbox); 18694785c406SSatha Rao return -ENOSPC; 18704785c406SSatha Rao } 18714785c406SSatha Rao 18724785c406SSatha Rao aq->qidx = sq->qid; 18734785c406SSatha Rao aq->ctype = NIX_AQ_CTYPE_SQ; 18744785c406SSatha Rao aq->op = NIX_AQ_INSTOP_READ; 18754785c406SSatha Rao rc = mbox_process_msg(mbox, (void *)&rsp); 18764785c406SSatha Rao if (rc) { 18774785c406SSatha Rao mbox_put(mbox); 18784785c406SSatha Rao return rc; 18794785c406SSatha Rao } 18804785c406SSatha Rao 18814785c406SSatha Rao if (aq->sq.smq_pend) 18824785c406SSatha Rao plt_err("SQ has pending SQE's"); 18834785c406SSatha Rao 18844785c406SSatha Rao count = aq->sq.sqb_count; 18854785c406SSatha Rao sqes_per_sqb = 1 << sq->sqes_per_sqb_log2; 18864785c406SSatha Rao /* Free SQB's that are used */ 18874785c406SSatha Rao sqb_buf = (void *)rsp->sq.head_sqb; 18884785c406SSatha Rao while (count) { 18894785c406SSatha Rao void *next_sqb; 18904785c406SSatha Rao 18914785c406SSatha Rao next_sqb = *(void **)((uint64_t *)sqb_buf + 18924785c406SSatha Rao (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8)); 18934785c406SSatha Rao roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf); 18944785c406SSatha Rao sqb_buf = next_sqb; 18954785c406SSatha Rao count--; 18964785c406SSatha Rao } 18974785c406SSatha Rao 18984785c406SSatha Rao /* Free next to use sqb */ 18994785c406SSatha Rao if (rsp->sq.next_sqb) 19004785c406SSatha Rao roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb); 19014785c406SSatha Rao mbox_put(mbox); 19024785c406SSatha Rao return 0; 19034785c406SSatha Rao } 19044785c406SSatha Rao 1905ae060709SJerin Jacob int 1906ae060709SJerin Jacob roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq) 1907ae060709SJerin Jacob { 1908ae060709SJerin Jacob struct nix *nix = roc_nix_to_nix_priv(roc_nix); 190944a9307cSRakesh Kudurumalla struct mbox *m_box = (&nix->dev)->mbox; 1910ae060709SJerin Jacob uint16_t qid, smq = UINT16_MAX; 1911ae060709SJerin Jacob uint32_t rr_quantum = 0; 191244a9307cSRakesh Kudurumalla struct mbox *mbox; 1913ae060709SJerin Jacob int rc; 1914ae060709SJerin Jacob 1915ae060709SJerin Jacob if (sq == NULL) 1916ae060709SJerin Jacob return NIX_ERR_PARAM; 1917ae060709SJerin Jacob 1918ae060709SJerin Jacob qid = sq->qid; 1919ae060709SJerin Jacob if (qid >= nix->nb_tx_queues) 1920ae060709SJerin Jacob return NIX_ERR_QUEUE_INVALID_RANGE; 1921ae060709SJerin Jacob 1922ae060709SJerin Jacob sq->roc_nix = roc_nix; 1923a24d9de3SSatha Rao sq->tc = ROC_NIX_PFC_CLASS_INVALID; 1924ae060709SJerin Jacob /* 1925ae060709SJerin Jacob * Allocate memory for flow control updates from HW. 1926ae060709SJerin Jacob * Alloc one cache line, so that fits all FC_STYPE modes. 1927ae060709SJerin Jacob */ 1928ae060709SJerin Jacob sq->fc = plt_zmalloc(ROC_ALIGN, ROC_ALIGN); 1929ae060709SJerin Jacob if (sq->fc == NULL) { 1930ae060709SJerin Jacob rc = NIX_ERR_NO_MEM; 1931ae060709SJerin Jacob goto fail; 1932ae060709SJerin Jacob } 1933ae060709SJerin Jacob 1934ae060709SJerin Jacob rc = sqb_pool_populate(roc_nix, sq); 1935ae060709SJerin Jacob if (rc) 1936ae060709SJerin Jacob goto nomem; 1937ae060709SJerin Jacob 193805d727e8SNithin Dabilpuram rc = nix_tm_leaf_data_get(nix, sq->qid, &rr_quantum, &smq); 193905d727e8SNithin Dabilpuram if (rc) { 194005d727e8SNithin Dabilpuram rc = NIX_ERR_TM_LEAF_NODE_GET; 194105d727e8SNithin Dabilpuram goto nomem; 194205d727e8SNithin Dabilpuram } 194305d727e8SNithin Dabilpuram 194444a9307cSRakesh Kudurumalla mbox = mbox_get(m_box); 1945ae060709SJerin Jacob /* Init SQ context */ 1946ae060709SJerin Jacob if (roc_model_is_cn9k()) 1947da718c19SNithin Dabilpuram rc = sq_cn9k_init(nix, sq, rr_quantum, smq); 19484785c406SSatha Rao else if (roc_model_is_cn10k()) 19494785c406SSatha Rao rc = sq_cn10k_init(nix, sq, rr_quantum, smq); 1950ae060709SJerin Jacob else 1951da718c19SNithin Dabilpuram rc = sq_init(nix, sq, rr_quantum, smq); 1952da718c19SNithin Dabilpuram 195344a9307cSRakesh Kudurumalla if (rc) { 195444a9307cSRakesh Kudurumalla mbox_put(mbox); 1955da718c19SNithin Dabilpuram goto nomem; 195644a9307cSRakesh Kudurumalla } 195744a9307cSRakesh Kudurumalla 1958ae060709SJerin Jacob 1959ae060709SJerin Jacob rc = mbox_process(mbox); 196044a9307cSRakesh Kudurumalla if (rc) { 196144a9307cSRakesh Kudurumalla mbox_put(mbox); 1962ae060709SJerin Jacob goto nomem; 196344a9307cSRakesh Kudurumalla } 196444a9307cSRakesh Kudurumalla mbox_put(mbox); 1965ae060709SJerin Jacob 1966f6e0d835SRakesh Kudurumalla sq->enable = true; 1967ae060709SJerin Jacob nix->sqs[qid] = sq; 1968ae060709SJerin Jacob sq->io_addr = nix->base + NIX_LF_OP_SENDX(0); 1969ae060709SJerin Jacob /* Evenly distribute LMT slot for each sq */ 1970ae060709SJerin Jacob if (roc_model_is_cn9k()) { 1971ae060709SJerin Jacob /* Multiple cores/SQ's can use same LMTLINE safely in CN9K */ 1972ae060709SJerin Jacob sq->lmt_addr = (void *)(nix->lmt_base + 1973ae060709SJerin Jacob ((qid & RVU_CN9K_LMT_SLOT_MASK) << 12)); 1974ae060709SJerin Jacob } 1975ae060709SJerin Jacob 1976af75aac7SGowrishankar Muthukrishnan rc = nix_tel_node_add_sq(sq); 1977ae060709SJerin Jacob return rc; 1978ae060709SJerin Jacob nomem: 1979ae060709SJerin Jacob plt_free(sq->fc); 1980ae060709SJerin Jacob fail: 1981ae060709SJerin Jacob return rc; 1982ae060709SJerin Jacob } 1983ae060709SJerin Jacob 1984ae060709SJerin Jacob int 1985ae060709SJerin Jacob roc_nix_sq_fini(struct roc_nix_sq *sq) 1986ae060709SJerin Jacob { 1987ae060709SJerin Jacob struct nix *nix; 1988ae060709SJerin Jacob struct mbox *mbox; 1989ae060709SJerin Jacob struct ndc_sync_op *ndc_req; 1990ae060709SJerin Jacob uint16_t qid; 1991ae060709SJerin Jacob int rc = 0; 1992ae060709SJerin Jacob 1993ae060709SJerin Jacob if (sq == NULL) 1994ae060709SJerin Jacob return NIX_ERR_PARAM; 1995ae060709SJerin Jacob 1996ae060709SJerin Jacob nix = roc_nix_to_nix_priv(sq->roc_nix); 1997ae060709SJerin Jacob mbox = (&nix->dev)->mbox; 1998ae060709SJerin Jacob 1999ae060709SJerin Jacob qid = sq->qid; 2000ae060709SJerin Jacob 200105d727e8SNithin Dabilpuram rc = nix_tm_sq_flush_pre(sq); 200205d727e8SNithin Dabilpuram 2003ae060709SJerin Jacob /* Release SQ context */ 2004ae060709SJerin Jacob if (roc_model_is_cn9k()) 2005ae060709SJerin Jacob rc |= sq_cn9k_fini(roc_nix_to_nix_priv(sq->roc_nix), sq); 20064785c406SSatha Rao else if (roc_model_is_cn10k()) 20074785c406SSatha Rao rc |= sq_cn10k_fini(roc_nix_to_nix_priv(sq->roc_nix), sq); 2008ae060709SJerin Jacob else 2009ae060709SJerin Jacob rc |= sq_fini(roc_nix_to_nix_priv(sq->roc_nix), sq); 2010ae060709SJerin Jacob 2011ae060709SJerin Jacob /* Sync NDC-NIX-TX for LF */ 201244a9307cSRakesh Kudurumalla ndc_req = mbox_alloc_msg_ndc_sync_op(mbox_get(mbox)); 201344a9307cSRakesh Kudurumalla if (ndc_req == NULL) { 201444a9307cSRakesh Kudurumalla mbox_put(mbox); 2015ae060709SJerin Jacob return -ENOSPC; 201644a9307cSRakesh Kudurumalla } 2017ae060709SJerin Jacob ndc_req->nix_lf_tx_sync = 1; 2018ae060709SJerin Jacob if (mbox_process(mbox)) 2019ae060709SJerin Jacob rc |= NIX_ERR_NDC_SYNC; 202044a9307cSRakesh Kudurumalla mbox_put(mbox); 2021ae060709SJerin Jacob 202205d727e8SNithin Dabilpuram rc |= nix_tm_sq_flush_post(sq); 2023780f90e9SNithin Dabilpuram 2024780f90e9SNithin Dabilpuram /* Restore limit to max SQB count that the pool was created 2025780f90e9SNithin Dabilpuram * for aura drain to succeed. 2026780f90e9SNithin Dabilpuram */ 2027780f90e9SNithin Dabilpuram roc_npa_aura_limit_modify(sq->aura_handle, NIX_MAX_SQB); 2028ae060709SJerin Jacob rc |= roc_npa_pool_destroy(sq->aura_handle); 2029ae060709SJerin Jacob plt_free(sq->fc); 2030ae060709SJerin Jacob plt_free(sq->sqe_mem); 2031ae060709SJerin Jacob nix->sqs[qid] = NULL; 2032ae060709SJerin Jacob 2033ae060709SJerin Jacob return rc; 2034ae060709SJerin Jacob } 203509e1df73SRahul Bhansali 203609e1df73SRahul Bhansali void 203709e1df73SRahul Bhansali roc_nix_cq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid, uint32_t *head, 203809e1df73SRahul Bhansali uint32_t *tail) 203909e1df73SRahul Bhansali { 204009e1df73SRahul Bhansali struct nix *nix = roc_nix_to_nix_priv(roc_nix); 204109e1df73SRahul Bhansali uint64_t reg, val; 204209e1df73SRahul Bhansali int64_t *addr; 204309e1df73SRahul Bhansali 204409e1df73SRahul Bhansali if (head == NULL || tail == NULL) 204509e1df73SRahul Bhansali return; 204609e1df73SRahul Bhansali 204709e1df73SRahul Bhansali reg = (((uint64_t)qid) << 32); 204809e1df73SRahul Bhansali addr = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS); 204909e1df73SRahul Bhansali val = roc_atomic64_add_nosync(reg, addr); 205009e1df73SRahul Bhansali if (val & 205109e1df73SRahul Bhansali (BIT_ULL(NIX_CQ_OP_STAT_OP_ERR) | BIT_ULL(NIX_CQ_OP_STAT_CQ_ERR))) 205209e1df73SRahul Bhansali val = 0; 205309e1df73SRahul Bhansali 205409e1df73SRahul Bhansali *tail = (uint32_t)(val & 0xFFFFF); 205509e1df73SRahul Bhansali *head = (uint32_t)((val >> 20) & 0xFFFFF); 205609e1df73SRahul Bhansali } 205709e1df73SRahul Bhansali 205809e1df73SRahul Bhansali void 205909e1df73SRahul Bhansali roc_nix_sq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid, uint32_t *head, 206009e1df73SRahul Bhansali uint32_t *tail) 206109e1df73SRahul Bhansali { 206209e1df73SRahul Bhansali struct nix *nix = roc_nix_to_nix_priv(roc_nix); 206309e1df73SRahul Bhansali struct roc_nix_sq *sq = nix->sqs[qid]; 206409e1df73SRahul Bhansali uint16_t sqes_per_sqb, sqb_cnt; 206509e1df73SRahul Bhansali uint64_t reg, val; 206609e1df73SRahul Bhansali int64_t *addr; 206709e1df73SRahul Bhansali 206809e1df73SRahul Bhansali if (head == NULL || tail == NULL) 206909e1df73SRahul Bhansali return; 207009e1df73SRahul Bhansali 207109e1df73SRahul Bhansali reg = (((uint64_t)qid) << 32); 207209e1df73SRahul Bhansali addr = (int64_t *)(nix->base + NIX_LF_SQ_OP_STATUS); 207309e1df73SRahul Bhansali val = roc_atomic64_add_nosync(reg, addr); 207409e1df73SRahul Bhansali if (val & BIT_ULL(NIX_CQ_OP_STAT_OP_ERR)) { 207509e1df73SRahul Bhansali val = 0; 207609e1df73SRahul Bhansali return; 207709e1df73SRahul Bhansali } 207809e1df73SRahul Bhansali 207909e1df73SRahul Bhansali *tail = (uint32_t)((val >> 28) & 0x3F); 208009e1df73SRahul Bhansali *head = (uint32_t)((val >> 20) & 0x3F); 208109e1df73SRahul Bhansali sqb_cnt = (uint16_t)(val & 0xFFFF); 208209e1df73SRahul Bhansali 208309e1df73SRahul Bhansali sqes_per_sqb = 1 << sq->sqes_per_sqb_log2; 208409e1df73SRahul Bhansali 208509e1df73SRahul Bhansali /* Update tail index as per used sqb count */ 208609e1df73SRahul Bhansali *tail += (sqes_per_sqb * (sqb_cnt - 1)); 208709e1df73SRahul Bhansali } 2088b7c31b6dSSatha Rao 2089b7c31b6dSSatha Rao int 2090b7c31b6dSSatha Rao roc_nix_q_err_cb_register(struct roc_nix *roc_nix, q_err_get_t sq_err_handle) 2091b7c31b6dSSatha Rao { 2092b7c31b6dSSatha Rao struct nix *nix = roc_nix_to_nix_priv(roc_nix); 2093b7c31b6dSSatha Rao struct dev *dev = &nix->dev; 2094b7c31b6dSSatha Rao 2095b7c31b6dSSatha Rao if (sq_err_handle == NULL) 2096b7c31b6dSSatha Rao return NIX_ERR_PARAM; 2097b7c31b6dSSatha Rao 2098b7c31b6dSSatha Rao dev->ops->q_err_cb = (q_err_cb_t)sq_err_handle; 2099b7c31b6dSSatha Rao return 0; 2100b7c31b6dSSatha Rao } 2101b7c31b6dSSatha Rao 2102b7c31b6dSSatha Rao void 2103b7c31b6dSSatha Rao roc_nix_q_err_cb_unregister(struct roc_nix *roc_nix) 2104b7c31b6dSSatha Rao { 2105b7c31b6dSSatha Rao struct nix *nix = roc_nix_to_nix_priv(roc_nix); 2106b7c31b6dSSatha Rao struct dev *dev = &nix->dev; 2107b7c31b6dSSatha Rao 2108b7c31b6dSSatha Rao dev->ops->q_err_cb = NULL; 2109b7c31b6dSSatha Rao } 2110