1c6b57157SStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause 2c6b57157SStephen Hemminger * Copyright (C) 2015 Freescale Semiconductor, Inc. 3*051f4185SRohit Raj * Copyright 2018-2020,2022 NXP 46fef517eSHemant Agrawal */ 56fef517eSHemant Agrawal 66fef517eSHemant Agrawal #include "compat.h" 76fef517eSHemant Agrawal #include <fsl_qbman_debug.h> 86fef517eSHemant Agrawal #include "qbman_portal.h" 96fef517eSHemant Agrawal 106fef517eSHemant Agrawal /* QBMan portal management command code */ 116fef517eSHemant Agrawal #define QBMAN_BP_QUERY 0x32 126fef517eSHemant Agrawal #define QBMAN_FQ_QUERY 0x44 136fef517eSHemant Agrawal #define QBMAN_FQ_QUERY_NP 0x45 146fef517eSHemant Agrawal #define QBMAN_WQ_QUERY 0x47 156fef517eSHemant Agrawal #define QBMAN_CGR_QUERY 0x51 166fef517eSHemant Agrawal #define QBMAN_WRED_QUERY 0x54 176fef517eSHemant Agrawal #define QBMAN_CGR_STAT_QUERY 0x55 186fef517eSHemant Agrawal #define QBMAN_CGR_STAT_QUERY_CLR 0x56 196fef517eSHemant Agrawal 2064f131a8SHemant Agrawal struct qbman_bp_query_desc { 2164f131a8SHemant Agrawal uint8_t verb; 2264f131a8SHemant Agrawal uint8_t reserved; 2364f131a8SHemant Agrawal uint16_t bpid; 2464f131a8SHemant Agrawal uint8_t reserved2[60]; 2564f131a8SHemant Agrawal }; 2664f131a8SHemant Agrawal 2764f131a8SHemant Agrawal #define QB_BP_STATE_SHIFT 24 2864f131a8SHemant Agrawal #define QB_BP_VA_SHIFT 1 2964f131a8SHemant Agrawal #define QB_BP_VA_MASK 0x2 3064f131a8SHemant Agrawal #define QB_BP_WAE_SHIFT 2 3164f131a8SHemant Agrawal #define QB_BP_WAE_MASK 0x4 3264f131a8SHemant Agrawal #define QB_BP_PL_SHIFT 15 3364f131a8SHemant Agrawal #define QB_BP_PL_MASK 0x8000 3464f131a8SHemant Agrawal #define QB_BP_ICID_MASK 0x7FFF 3564f131a8SHemant Agrawal 3664f131a8SHemant Agrawal int qbman_bp_query(struct qbman_swp *s, uint32_t bpid, 3764f131a8SHemant Agrawal struct qbman_bp_query_rslt *r) 3864f131a8SHemant Agrawal { 3964f131a8SHemant Agrawal struct qbman_bp_query_desc *p; 40*051f4185SRohit Raj struct qbman_bp_query_rslt *bp_query_rslt; 4164f131a8SHemant Agrawal 4264f131a8SHemant Agrawal /* Start the management command */ 4364f131a8SHemant Agrawal p = (struct qbman_bp_query_desc *)qbman_swp_mc_start(s); 4464f131a8SHemant Agrawal if (!p) 4564f131a8SHemant Agrawal return -EBUSY; 4664f131a8SHemant Agrawal 4764f131a8SHemant Agrawal /* Encode the caller-provided attributes */ 4864f131a8SHemant Agrawal p->bpid = bpid; 4964f131a8SHemant Agrawal 5064f131a8SHemant Agrawal /* Complete the management command */ 51*051f4185SRohit Raj bp_query_rslt = (struct qbman_bp_query_rslt *)qbman_swp_mc_complete(s, 52*051f4185SRohit Raj p, QBMAN_BP_QUERY); 53*051f4185SRohit Raj if (!bp_query_rslt) { 5464f131a8SHemant Agrawal pr_err("qbman: Query BPID %d failed, no response\n", 5564f131a8SHemant Agrawal bpid); 5664f131a8SHemant Agrawal return -EIO; 5764f131a8SHemant Agrawal } 5864f131a8SHemant Agrawal 59*051f4185SRohit Raj *r = *bp_query_rslt; 60*051f4185SRohit Raj 6164f131a8SHemant Agrawal /* Decode the outcome */ 6264f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_BP_QUERY); 6364f131a8SHemant Agrawal 6464f131a8SHemant Agrawal /* Determine success or failure */ 6564f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 6664f131a8SHemant Agrawal pr_err("Query of BPID 0x%x failed, code=0x%02x\n", bpid, 6764f131a8SHemant Agrawal r->rslt); 6864f131a8SHemant Agrawal return -EIO; 6964f131a8SHemant Agrawal } 7064f131a8SHemant Agrawal 7164f131a8SHemant Agrawal return 0; 7264f131a8SHemant Agrawal } 7364f131a8SHemant Agrawal 7464f131a8SHemant Agrawal int qbman_bp_get_bdi(struct qbman_bp_query_rslt *r) 7564f131a8SHemant Agrawal { 7664f131a8SHemant Agrawal return r->bdi & 1; 7764f131a8SHemant Agrawal } 7864f131a8SHemant Agrawal 7964f131a8SHemant Agrawal int qbman_bp_get_va(struct qbman_bp_query_rslt *r) 8064f131a8SHemant Agrawal { 8164f131a8SHemant Agrawal return (r->bdi & QB_BP_VA_MASK) >> QB_BP_VA_MASK; 8264f131a8SHemant Agrawal } 8364f131a8SHemant Agrawal 8464f131a8SHemant Agrawal int qbman_bp_get_wae(struct qbman_bp_query_rslt *r) 8564f131a8SHemant Agrawal { 8664f131a8SHemant Agrawal return (r->bdi & QB_BP_WAE_MASK) >> QB_BP_WAE_SHIFT; 8764f131a8SHemant Agrawal } 8864f131a8SHemant Agrawal 8964f131a8SHemant Agrawal static uint16_t qbman_bp_thresh_to_value(uint16_t val) 9064f131a8SHemant Agrawal { 9164f131a8SHemant Agrawal return (val & 0xff) << ((val & 0xf00) >> 8); 9264f131a8SHemant Agrawal } 9364f131a8SHemant Agrawal 9464f131a8SHemant Agrawal uint16_t qbman_bp_get_swdet(struct qbman_bp_query_rslt *r) 9564f131a8SHemant Agrawal { 9664f131a8SHemant Agrawal 9764f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->swdet); 9864f131a8SHemant Agrawal } 9964f131a8SHemant Agrawal 10064f131a8SHemant Agrawal uint16_t qbman_bp_get_swdxt(struct qbman_bp_query_rslt *r) 10164f131a8SHemant Agrawal { 10264f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->swdxt); 10364f131a8SHemant Agrawal } 10464f131a8SHemant Agrawal 10564f131a8SHemant Agrawal uint16_t qbman_bp_get_hwdet(struct qbman_bp_query_rslt *r) 10664f131a8SHemant Agrawal { 10764f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->hwdet); 10864f131a8SHemant Agrawal } 10964f131a8SHemant Agrawal 11064f131a8SHemant Agrawal uint16_t qbman_bp_get_hwdxt(struct qbman_bp_query_rslt *r) 11164f131a8SHemant Agrawal { 11264f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->hwdxt); 11364f131a8SHemant Agrawal } 11464f131a8SHemant Agrawal 11564f131a8SHemant Agrawal uint16_t qbman_bp_get_swset(struct qbman_bp_query_rslt *r) 11664f131a8SHemant Agrawal { 11764f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->swset); 11864f131a8SHemant Agrawal } 11964f131a8SHemant Agrawal 12064f131a8SHemant Agrawal uint16_t qbman_bp_get_swsxt(struct qbman_bp_query_rslt *r) 12164f131a8SHemant Agrawal { 12264f131a8SHemant Agrawal 12364f131a8SHemant Agrawal return qbman_bp_thresh_to_value(r->swsxt); 12464f131a8SHemant Agrawal } 12564f131a8SHemant Agrawal 12664f131a8SHemant Agrawal uint16_t qbman_bp_get_vbpid(struct qbman_bp_query_rslt *r) 12764f131a8SHemant Agrawal { 12864f131a8SHemant Agrawal return r->vbpid; 12964f131a8SHemant Agrawal } 13064f131a8SHemant Agrawal 13164f131a8SHemant Agrawal uint16_t qbman_bp_get_icid(struct qbman_bp_query_rslt *r) 13264f131a8SHemant Agrawal { 13364f131a8SHemant Agrawal return r->icid & QB_BP_ICID_MASK; 13464f131a8SHemant Agrawal } 13564f131a8SHemant Agrawal 13664f131a8SHemant Agrawal int qbman_bp_get_pl(struct qbman_bp_query_rslt *r) 13764f131a8SHemant Agrawal { 13864f131a8SHemant Agrawal return (r->icid & QB_BP_PL_MASK) >> QB_BP_PL_SHIFT; 13964f131a8SHemant Agrawal } 14064f131a8SHemant Agrawal 14164f131a8SHemant Agrawal uint64_t qbman_bp_get_bpscn_addr(struct qbman_bp_query_rslt *r) 14264f131a8SHemant Agrawal { 14364f131a8SHemant Agrawal return r->bpscn_addr; 14464f131a8SHemant Agrawal } 14564f131a8SHemant Agrawal 14664f131a8SHemant Agrawal uint64_t qbman_bp_get_bpscn_ctx(struct qbman_bp_query_rslt *r) 14764f131a8SHemant Agrawal { 14864f131a8SHemant Agrawal return r->bpscn_ctx; 14964f131a8SHemant Agrawal } 15064f131a8SHemant Agrawal 15164f131a8SHemant Agrawal uint16_t qbman_bp_get_hw_targ(struct qbman_bp_query_rslt *r) 15264f131a8SHemant Agrawal { 15364f131a8SHemant Agrawal return r->hw_targ; 15464f131a8SHemant Agrawal } 15564f131a8SHemant Agrawal 15664f131a8SHemant Agrawal int qbman_bp_has_free_bufs(struct qbman_bp_query_rslt *r) 15764f131a8SHemant Agrawal { 15864f131a8SHemant Agrawal return !(int)(r->state & 0x1); 15964f131a8SHemant Agrawal } 16064f131a8SHemant Agrawal 16164f131a8SHemant Agrawal int qbman_bp_is_depleted(struct qbman_bp_query_rslt *r) 16264f131a8SHemant Agrawal { 16364f131a8SHemant Agrawal return (int)((r->state & 0x2) >> 1); 16464f131a8SHemant Agrawal } 16564f131a8SHemant Agrawal 16664f131a8SHemant Agrawal int qbman_bp_is_surplus(struct qbman_bp_query_rslt *r) 16764f131a8SHemant Agrawal { 16864f131a8SHemant Agrawal return (int)((r->state & 0x4) >> 2); 16964f131a8SHemant Agrawal } 17064f131a8SHemant Agrawal 17164f131a8SHemant Agrawal uint32_t qbman_bp_num_free_bufs(struct qbman_bp_query_rslt *r) 17264f131a8SHemant Agrawal { 17364f131a8SHemant Agrawal return r->fill; 17464f131a8SHemant Agrawal } 17564f131a8SHemant Agrawal 17664f131a8SHemant Agrawal uint32_t qbman_bp_get_hdptr(struct qbman_bp_query_rslt *r) 17764f131a8SHemant Agrawal { 17864f131a8SHemant Agrawal return r->hdptr; 17964f131a8SHemant Agrawal } 18064f131a8SHemant Agrawal 18164f131a8SHemant Agrawal uint32_t qbman_bp_get_sdcnt(struct qbman_bp_query_rslt *r) 18264f131a8SHemant Agrawal { 18364f131a8SHemant Agrawal return r->sdcnt; 18464f131a8SHemant Agrawal } 18564f131a8SHemant Agrawal 18664f131a8SHemant Agrawal uint32_t qbman_bp_get_hdcnt(struct qbman_bp_query_rslt *r) 18764f131a8SHemant Agrawal { 18864f131a8SHemant Agrawal return r->hdcnt; 18964f131a8SHemant Agrawal } 19064f131a8SHemant Agrawal 19164f131a8SHemant Agrawal uint32_t qbman_bp_get_sscnt(struct qbman_bp_query_rslt *r) 19264f131a8SHemant Agrawal { 19364f131a8SHemant Agrawal return r->sscnt; 19464f131a8SHemant Agrawal } 19564f131a8SHemant Agrawal 1966fef517eSHemant Agrawal struct qbman_fq_query_desc { 1976fef517eSHemant Agrawal uint8_t verb; 1986fef517eSHemant Agrawal uint8_t reserved[3]; 1996fef517eSHemant Agrawal uint32_t fqid; 200231366baSHemant Agrawal uint8_t reserved2[56]; 2016fef517eSHemant Agrawal }; 2026fef517eSHemant Agrawal 20364f131a8SHemant Agrawal /* FQ query function for programmable fields */ 20464f131a8SHemant Agrawal int qbman_fq_query(struct qbman_swp *s, uint32_t fqid, 20564f131a8SHemant Agrawal struct qbman_fq_query_rslt *r) 20664f131a8SHemant Agrawal { 20764f131a8SHemant Agrawal struct qbman_fq_query_desc *p; 208*051f4185SRohit Raj struct qbman_fq_query_rslt *fq_query_rslt; 20964f131a8SHemant Agrawal 21064f131a8SHemant Agrawal p = (struct qbman_fq_query_desc *)qbman_swp_mc_start(s); 21164f131a8SHemant Agrawal if (!p) 21264f131a8SHemant Agrawal return -EBUSY; 21364f131a8SHemant Agrawal 21464f131a8SHemant Agrawal p->fqid = fqid; 215*051f4185SRohit Raj fq_query_rslt = (struct qbman_fq_query_rslt *)qbman_swp_mc_complete(s, 216*051f4185SRohit Raj p, QBMAN_FQ_QUERY); 217*051f4185SRohit Raj if (!fq_query_rslt) { 21864f131a8SHemant Agrawal pr_err("qbman: Query FQID %d failed, no response\n", 21964f131a8SHemant Agrawal fqid); 22064f131a8SHemant Agrawal return -EIO; 22164f131a8SHemant Agrawal } 22264f131a8SHemant Agrawal 223*051f4185SRohit Raj *r = *fq_query_rslt; 224*051f4185SRohit Raj 22564f131a8SHemant Agrawal /* Decode the outcome */ 22664f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_FQ_QUERY); 22764f131a8SHemant Agrawal 22864f131a8SHemant Agrawal /* Determine success or failure */ 22964f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 23064f131a8SHemant Agrawal pr_err("Query of FQID 0x%x failed, code=0x%02x\n", 23164f131a8SHemant Agrawal fqid, r->rslt); 23264f131a8SHemant Agrawal return -EIO; 23364f131a8SHemant Agrawal } 23464f131a8SHemant Agrawal 23564f131a8SHemant Agrawal return 0; 23664f131a8SHemant Agrawal } 23764f131a8SHemant Agrawal 23864f131a8SHemant Agrawal uint8_t qbman_fq_attr_get_fqctrl(struct qbman_fq_query_rslt *r) 23964f131a8SHemant Agrawal { 24064f131a8SHemant Agrawal return r->fq_ctrl; 24164f131a8SHemant Agrawal } 24264f131a8SHemant Agrawal 24364f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_cgrid(struct qbman_fq_query_rslt *r) 24464f131a8SHemant Agrawal { 24564f131a8SHemant Agrawal return r->cgid; 24664f131a8SHemant Agrawal } 24764f131a8SHemant Agrawal 24864f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_destwq(struct qbman_fq_query_rslt *r) 24964f131a8SHemant Agrawal { 25064f131a8SHemant Agrawal return r->dest_wq; 25164f131a8SHemant Agrawal } 25264f131a8SHemant Agrawal 25364f131a8SHemant Agrawal static uint16_t qbman_thresh_to_value(uint16_t val) 25464f131a8SHemant Agrawal { 25564f131a8SHemant Agrawal return ((val & 0x1FE0) >> 5) << (val & 0x1F); 25664f131a8SHemant Agrawal } 25764f131a8SHemant Agrawal 25864f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_tdthresh(struct qbman_fq_query_rslt *r) 25964f131a8SHemant Agrawal { 26064f131a8SHemant Agrawal return qbman_thresh_to_value(r->td_thresh); 26164f131a8SHemant Agrawal } 26264f131a8SHemant Agrawal 26364f131a8SHemant Agrawal int qbman_fq_attr_get_oa_ics(struct qbman_fq_query_rslt *r) 26464f131a8SHemant Agrawal { 26564f131a8SHemant Agrawal return (int)(r->oal_oac >> 14) & 0x1; 26664f131a8SHemant Agrawal } 26764f131a8SHemant Agrawal 26864f131a8SHemant Agrawal int qbman_fq_attr_get_oa_cgr(struct qbman_fq_query_rslt *r) 26964f131a8SHemant Agrawal { 27064f131a8SHemant Agrawal return (int)(r->oal_oac >> 15); 27164f131a8SHemant Agrawal } 27264f131a8SHemant Agrawal 27364f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_oal(struct qbman_fq_query_rslt *r) 27464f131a8SHemant Agrawal { 27564f131a8SHemant Agrawal return (r->oal_oac & 0x0FFF); 27664f131a8SHemant Agrawal } 27764f131a8SHemant Agrawal 27864f131a8SHemant Agrawal int qbman_fq_attr_get_bdi(struct qbman_fq_query_rslt *r) 27964f131a8SHemant Agrawal { 28064f131a8SHemant Agrawal return (r->mctl & 0x1); 28164f131a8SHemant Agrawal } 28264f131a8SHemant Agrawal 28364f131a8SHemant Agrawal int qbman_fq_attr_get_ff(struct qbman_fq_query_rslt *r) 28464f131a8SHemant Agrawal { 28564f131a8SHemant Agrawal return (r->mctl & 0x2) >> 1; 28664f131a8SHemant Agrawal } 28764f131a8SHemant Agrawal 28864f131a8SHemant Agrawal int qbman_fq_attr_get_va(struct qbman_fq_query_rslt *r) 28964f131a8SHemant Agrawal { 29064f131a8SHemant Agrawal return (r->mctl & 0x4) >> 2; 29164f131a8SHemant Agrawal } 29264f131a8SHemant Agrawal 29364f131a8SHemant Agrawal int qbman_fq_attr_get_ps(struct qbman_fq_query_rslt *r) 29464f131a8SHemant Agrawal { 29564f131a8SHemant Agrawal return (r->mctl & 0x8) >> 3; 29664f131a8SHemant Agrawal } 29764f131a8SHemant Agrawal 29864f131a8SHemant Agrawal int qbman_fq_attr_get_pps(struct qbman_fq_query_rslt *r) 29964f131a8SHemant Agrawal { 30064f131a8SHemant Agrawal return (r->mctl & 0x30) >> 4; 30164f131a8SHemant Agrawal } 30264f131a8SHemant Agrawal 30364f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_icid(struct qbman_fq_query_rslt *r) 30464f131a8SHemant Agrawal { 30564f131a8SHemant Agrawal return r->icid & 0x7FFF; 30664f131a8SHemant Agrawal } 30764f131a8SHemant Agrawal 30864f131a8SHemant Agrawal int qbman_fq_attr_get_pl(struct qbman_fq_query_rslt *r) 30964f131a8SHemant Agrawal { 31064f131a8SHemant Agrawal return (int)((r->icid & 0x8000) >> 15); 31164f131a8SHemant Agrawal } 31264f131a8SHemant Agrawal 31364f131a8SHemant Agrawal uint32_t qbman_fq_attr_get_vfqid(struct qbman_fq_query_rslt *r) 31464f131a8SHemant Agrawal { 31564f131a8SHemant Agrawal return r->vfqid & 0x00FFFFFF; 31664f131a8SHemant Agrawal } 31764f131a8SHemant Agrawal 31864f131a8SHemant Agrawal uint32_t qbman_fq_attr_get_erfqid(struct qbman_fq_query_rslt *r) 31964f131a8SHemant Agrawal { 32064f131a8SHemant Agrawal return r->fqid_er & 0x00FFFFFF; 32164f131a8SHemant Agrawal } 32264f131a8SHemant Agrawal 32364f131a8SHemant Agrawal uint16_t qbman_fq_attr_get_opridsz(struct qbman_fq_query_rslt *r) 32464f131a8SHemant Agrawal { 32564f131a8SHemant Agrawal return r->opridsz; 32664f131a8SHemant Agrawal } 32764f131a8SHemant Agrawal 3286fef517eSHemant Agrawal int qbman_fq_query_state(struct qbman_swp *s, uint32_t fqid, 3296fef517eSHemant Agrawal struct qbman_fq_query_np_rslt *r) 3306fef517eSHemant Agrawal { 3316fef517eSHemant Agrawal struct qbman_fq_query_desc *p; 33227ede029SApeksha Gupta struct qbman_fq_query_np_rslt *var; 3336fef517eSHemant Agrawal 3346fef517eSHemant Agrawal p = (struct qbman_fq_query_desc *)qbman_swp_mc_start(s); 3356fef517eSHemant Agrawal if (!p) 3366fef517eSHemant Agrawal return -EBUSY; 3376fef517eSHemant Agrawal 3386fef517eSHemant Agrawal p->fqid = fqid; 33927ede029SApeksha Gupta var = qbman_swp_mc_complete(s, p, QBMAN_FQ_QUERY_NP); 34027ede029SApeksha Gupta if (!var) { 3416fef517eSHemant Agrawal pr_err("qbman: Query FQID %d NP fields failed, no response\n", 3426fef517eSHemant Agrawal fqid); 3436fef517eSHemant Agrawal return -EIO; 3446fef517eSHemant Agrawal } 34527ede029SApeksha Gupta *r = *var; 3466fef517eSHemant Agrawal 3476fef517eSHemant Agrawal /* Decode the outcome */ 3486fef517eSHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_FQ_QUERY_NP); 3496fef517eSHemant Agrawal 3506fef517eSHemant Agrawal /* Determine success or failure */ 3516fef517eSHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 3526fef517eSHemant Agrawal pr_err("Query NP fields of FQID 0x%x failed, code=0x%02x\n", 3536fef517eSHemant Agrawal fqid, r->rslt); 3546fef517eSHemant Agrawal return -EIO; 3556fef517eSHemant Agrawal } 3566fef517eSHemant Agrawal 3576fef517eSHemant Agrawal return 0; 3586fef517eSHemant Agrawal } 3596fef517eSHemant Agrawal 36064f131a8SHemant Agrawal uint8_t qbman_fq_state_schedstate(const struct qbman_fq_query_np_rslt *r) 36164f131a8SHemant Agrawal { 36264f131a8SHemant Agrawal return r->st1 & 0x7; 36364f131a8SHemant Agrawal } 36464f131a8SHemant Agrawal 36564f131a8SHemant Agrawal int qbman_fq_state_force_eligible(const struct qbman_fq_query_np_rslt *r) 36664f131a8SHemant Agrawal { 36764f131a8SHemant Agrawal return (int)((r->st1 & 0x8) >> 3); 36864f131a8SHemant Agrawal } 36964f131a8SHemant Agrawal 37064f131a8SHemant Agrawal int qbman_fq_state_xoff(const struct qbman_fq_query_np_rslt *r) 37164f131a8SHemant Agrawal { 37264f131a8SHemant Agrawal return (int)((r->st1 & 0x10) >> 4); 37364f131a8SHemant Agrawal } 37464f131a8SHemant Agrawal 37564f131a8SHemant Agrawal int qbman_fq_state_retirement_pending(const struct qbman_fq_query_np_rslt *r) 37664f131a8SHemant Agrawal { 37764f131a8SHemant Agrawal return (int)((r->st1 & 0x20) >> 5); 37864f131a8SHemant Agrawal } 37964f131a8SHemant Agrawal 38064f131a8SHemant Agrawal int qbman_fq_state_overflow_error(const struct qbman_fq_query_np_rslt *r) 38164f131a8SHemant Agrawal { 38264f131a8SHemant Agrawal return (int)((r->st1 & 0x40) >> 6); 38364f131a8SHemant Agrawal } 38464f131a8SHemant Agrawal 3856fef517eSHemant Agrawal uint32_t qbman_fq_state_frame_count(const struct qbman_fq_query_np_rslt *r) 3866fef517eSHemant Agrawal { 3876fef517eSHemant Agrawal return (r->frm_cnt & 0x00FFFFFF); 3886fef517eSHemant Agrawal } 3896fef517eSHemant Agrawal 3906fef517eSHemant Agrawal uint32_t qbman_fq_state_byte_count(const struct qbman_fq_query_np_rslt *r) 3916fef517eSHemant Agrawal { 3926fef517eSHemant Agrawal return r->byte_cnt; 3936fef517eSHemant Agrawal } 39464f131a8SHemant Agrawal 39564f131a8SHemant Agrawal /* Query CGR */ 39664f131a8SHemant Agrawal struct qbman_cgr_query_desc { 39764f131a8SHemant Agrawal uint8_t verb; 39864f131a8SHemant Agrawal uint8_t reserved; 39964f131a8SHemant Agrawal uint16_t cgid; 40064f131a8SHemant Agrawal uint8_t reserved2[60]; 40164f131a8SHemant Agrawal }; 40264f131a8SHemant Agrawal 40364f131a8SHemant Agrawal int qbman_cgr_query(struct qbman_swp *s, uint32_t cgid, 40464f131a8SHemant Agrawal struct qbman_cgr_query_rslt *r) 40564f131a8SHemant Agrawal { 40664f131a8SHemant Agrawal struct qbman_cgr_query_desc *p; 407*051f4185SRohit Raj struct qbman_cgr_query_rslt *cgr_query_rslt; 40864f131a8SHemant Agrawal 40964f131a8SHemant Agrawal p = (struct qbman_cgr_query_desc *)qbman_swp_mc_start(s); 41064f131a8SHemant Agrawal if (!p) 41164f131a8SHemant Agrawal return -EBUSY; 41264f131a8SHemant Agrawal 41364f131a8SHemant Agrawal p->cgid = cgid; 414*051f4185SRohit Raj cgr_query_rslt = (struct qbman_cgr_query_rslt *)qbman_swp_mc_complete(s, 415*051f4185SRohit Raj p, QBMAN_CGR_QUERY); 416*051f4185SRohit Raj if (!cgr_query_rslt) { 41764f131a8SHemant Agrawal pr_err("qbman: Query CGID %d failed, no response\n", 41864f131a8SHemant Agrawal cgid); 41964f131a8SHemant Agrawal return -EIO; 42064f131a8SHemant Agrawal } 42164f131a8SHemant Agrawal 422*051f4185SRohit Raj *r = *cgr_query_rslt; 423*051f4185SRohit Raj 42464f131a8SHemant Agrawal /* Decode the outcome */ 42564f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_CGR_QUERY); 42664f131a8SHemant Agrawal 42764f131a8SHemant Agrawal /* Determine success or failure */ 42864f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 42964f131a8SHemant Agrawal pr_err("Query CGID 0x%x failed,code=0x%02x\n", cgid, r->rslt); 43064f131a8SHemant Agrawal return -EIO; 43164f131a8SHemant Agrawal } 43264f131a8SHemant Agrawal 43364f131a8SHemant Agrawal return 0; 43464f131a8SHemant Agrawal } 43564f131a8SHemant Agrawal 43664f131a8SHemant Agrawal int qbman_cgr_get_cscn_wq_en_enter(struct qbman_cgr_query_rslt *r) 43764f131a8SHemant Agrawal { 43864f131a8SHemant Agrawal return (int)(r->ctl1 & 0x1); 43964f131a8SHemant Agrawal } 44064f131a8SHemant Agrawal 44164f131a8SHemant Agrawal int qbman_cgr_get_cscn_wq_en_exit(struct qbman_cgr_query_rslt *r) 44264f131a8SHemant Agrawal { 44364f131a8SHemant Agrawal return (int)((r->ctl1 & 0x2) >> 1); 44464f131a8SHemant Agrawal } 44564f131a8SHemant Agrawal 44664f131a8SHemant Agrawal int qbman_cgr_get_cscn_wq_icd(struct qbman_cgr_query_rslt *r) 44764f131a8SHemant Agrawal { 44864f131a8SHemant Agrawal return (int)((r->ctl1 & 0x4) >> 2); 44964f131a8SHemant Agrawal } 45064f131a8SHemant Agrawal 45164f131a8SHemant Agrawal uint8_t qbman_cgr_get_mode(struct qbman_cgr_query_rslt *r) 45264f131a8SHemant Agrawal { 45364f131a8SHemant Agrawal return r->mode & 0x3; 45464f131a8SHemant Agrawal } 45564f131a8SHemant Agrawal 45664f131a8SHemant Agrawal int qbman_cgr_get_rej_cnt_mode(struct qbman_cgr_query_rslt *r) 45764f131a8SHemant Agrawal { 45864f131a8SHemant Agrawal return (int)((r->mode & 0x4) >> 2); 45964f131a8SHemant Agrawal } 46064f131a8SHemant Agrawal 46164f131a8SHemant Agrawal int qbman_cgr_get_cscn_bdi(struct qbman_cgr_query_rslt *r) 46264f131a8SHemant Agrawal { 46364f131a8SHemant Agrawal return (int)((r->mode & 0x8) >> 3); 46464f131a8SHemant Agrawal } 46564f131a8SHemant Agrawal 46664f131a8SHemant Agrawal uint16_t qbman_cgr_attr_get_cs_thres(struct qbman_cgr_query_rslt *r) 46764f131a8SHemant Agrawal { 46864f131a8SHemant Agrawal return qbman_thresh_to_value(r->cs_thres); 46964f131a8SHemant Agrawal } 47064f131a8SHemant Agrawal 47164f131a8SHemant Agrawal uint16_t qbman_cgr_attr_get_cs_thres_x(struct qbman_cgr_query_rslt *r) 47264f131a8SHemant Agrawal { 47364f131a8SHemant Agrawal return qbman_thresh_to_value(r->cs_thres_x); 47464f131a8SHemant Agrawal } 47564f131a8SHemant Agrawal 47664f131a8SHemant Agrawal uint16_t qbman_cgr_attr_get_td_thres(struct qbman_cgr_query_rslt *r) 47764f131a8SHemant Agrawal { 47864f131a8SHemant Agrawal return qbman_thresh_to_value(r->td_thres); 47964f131a8SHemant Agrawal } 48064f131a8SHemant Agrawal 48164f131a8SHemant Agrawal int qbman_cgr_wred_query(struct qbman_swp *s, uint32_t cgid, 48264f131a8SHemant Agrawal struct qbman_wred_query_rslt *r) 48364f131a8SHemant Agrawal { 48464f131a8SHemant Agrawal struct qbman_cgr_query_desc *p; 485*051f4185SRohit Raj struct qbman_wred_query_rslt *wred_query_rslt; 48664f131a8SHemant Agrawal 48764f131a8SHemant Agrawal p = (struct qbman_cgr_query_desc *)qbman_swp_mc_start(s); 48864f131a8SHemant Agrawal if (!p) 48964f131a8SHemant Agrawal return -EBUSY; 49064f131a8SHemant Agrawal 49164f131a8SHemant Agrawal p->cgid = cgid; 492*051f4185SRohit Raj wred_query_rslt = (struct qbman_wred_query_rslt *)qbman_swp_mc_complete( 493*051f4185SRohit Raj s, p, QBMAN_WRED_QUERY); 494*051f4185SRohit Raj if (!wred_query_rslt) { 49564f131a8SHemant Agrawal pr_err("qbman: Query CGID WRED %d failed, no response\n", 49664f131a8SHemant Agrawal cgid); 49764f131a8SHemant Agrawal return -EIO; 49864f131a8SHemant Agrawal } 49964f131a8SHemant Agrawal 500*051f4185SRohit Raj *r = *wred_query_rslt; 501*051f4185SRohit Raj 50264f131a8SHemant Agrawal /* Decode the outcome */ 50364f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_WRED_QUERY); 50464f131a8SHemant Agrawal 50564f131a8SHemant Agrawal /* Determine success or failure */ 50664f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 50764f131a8SHemant Agrawal pr_err("Query CGID WRED 0x%x failed,code=0x%02x\n", 50864f131a8SHemant Agrawal cgid, r->rslt); 50964f131a8SHemant Agrawal return -EIO; 51064f131a8SHemant Agrawal } 51164f131a8SHemant Agrawal 51264f131a8SHemant Agrawal return 0; 51364f131a8SHemant Agrawal } 51464f131a8SHemant Agrawal 51564f131a8SHemant Agrawal int qbman_cgr_attr_wred_get_edp(struct qbman_wred_query_rslt *r, uint32_t idx) 51664f131a8SHemant Agrawal { 51764f131a8SHemant Agrawal return (int)(r->edp[idx] & 1); 51864f131a8SHemant Agrawal } 51964f131a8SHemant Agrawal 52064f131a8SHemant Agrawal uint32_t qbman_cgr_attr_wred_get_parm_dp(struct qbman_wred_query_rslt *r, 52164f131a8SHemant Agrawal uint32_t idx) 52264f131a8SHemant Agrawal { 52364f131a8SHemant Agrawal return r->wred_parm_dp[idx]; 52464f131a8SHemant Agrawal } 52564f131a8SHemant Agrawal 52664f131a8SHemant Agrawal void qbman_cgr_attr_wred_dp_decompose(uint32_t dp, uint64_t *minth, 52764f131a8SHemant Agrawal uint64_t *maxth, uint8_t *maxp) 52864f131a8SHemant Agrawal { 52964f131a8SHemant Agrawal uint8_t ma, mn, step_i, step_s, pn; 53064f131a8SHemant Agrawal 53164f131a8SHemant Agrawal ma = (uint8_t)(dp >> 24); 53264f131a8SHemant Agrawal mn = (uint8_t)(dp >> 19) & 0x1f; 53364f131a8SHemant Agrawal step_i = (uint8_t)(dp >> 11); 53464f131a8SHemant Agrawal step_s = (uint8_t)(dp >> 6) & 0x1f; 53564f131a8SHemant Agrawal pn = (uint8_t)dp & 0x3f; 53664f131a8SHemant Agrawal 53764f131a8SHemant Agrawal *maxp = (uint8_t)(((pn<<2) * 100)/256); 53864f131a8SHemant Agrawal 53964f131a8SHemant Agrawal if (mn == 0) 54064f131a8SHemant Agrawal *maxth = ma; 54164f131a8SHemant Agrawal else 542*051f4185SRohit Raj *maxth = ((uint64_t)(ma+256) * (1<<(mn-1))); 54364f131a8SHemant Agrawal 54464f131a8SHemant Agrawal if (step_s == 0) 54564f131a8SHemant Agrawal *minth = *maxth - step_i; 54664f131a8SHemant Agrawal else 54764f131a8SHemant Agrawal *minth = *maxth - (256 + step_i) * (1<<(step_s - 1)); 54864f131a8SHemant Agrawal } 54964f131a8SHemant Agrawal 55064f131a8SHemant Agrawal /* Query CGR/CCGR/CQ statistics */ 55164f131a8SHemant Agrawal struct qbman_cgr_statistics_query_desc { 55264f131a8SHemant Agrawal uint8_t verb; 55364f131a8SHemant Agrawal uint8_t reserved; 55464f131a8SHemant Agrawal uint16_t cgid; 55564f131a8SHemant Agrawal uint8_t reserved1; 55664f131a8SHemant Agrawal uint8_t ct; 55764f131a8SHemant Agrawal uint8_t reserved2[58]; 55864f131a8SHemant Agrawal }; 55964f131a8SHemant Agrawal 56064f131a8SHemant Agrawal struct qbman_cgr_statistics_query_rslt { 56164f131a8SHemant Agrawal uint8_t verb; 56264f131a8SHemant Agrawal uint8_t rslt; 56364f131a8SHemant Agrawal uint8_t reserved[14]; 56464f131a8SHemant Agrawal uint64_t frm_cnt; 56564f131a8SHemant Agrawal uint64_t byte_cnt; 56664f131a8SHemant Agrawal uint32_t reserved2[8]; 56764f131a8SHemant Agrawal }; 56864f131a8SHemant Agrawal 56964f131a8SHemant Agrawal static int qbman_cgr_statistics_query(struct qbman_swp *s, uint32_t cgid, 57064f131a8SHemant Agrawal int clear, uint32_t command_type, 57164f131a8SHemant Agrawal uint64_t *frame_cnt, uint64_t *byte_cnt) 57264f131a8SHemant Agrawal { 57364f131a8SHemant Agrawal struct qbman_cgr_statistics_query_desc *p; 57464f131a8SHemant Agrawal struct qbman_cgr_statistics_query_rslt *r; 57564f131a8SHemant Agrawal uint32_t query_verb; 57664f131a8SHemant Agrawal 57764f131a8SHemant Agrawal p = (struct qbman_cgr_statistics_query_desc *)qbman_swp_mc_start(s); 57864f131a8SHemant Agrawal if (!p) 57964f131a8SHemant Agrawal return -EBUSY; 58064f131a8SHemant Agrawal 58164f131a8SHemant Agrawal p->cgid = cgid; 58264f131a8SHemant Agrawal if (command_type < 2) 58364f131a8SHemant Agrawal p->ct = command_type; 58464f131a8SHemant Agrawal query_verb = clear ? 58564f131a8SHemant Agrawal QBMAN_CGR_STAT_QUERY_CLR : QBMAN_CGR_STAT_QUERY; 58664f131a8SHemant Agrawal r = (struct qbman_cgr_statistics_query_rslt *)qbman_swp_mc_complete(s, 58764f131a8SHemant Agrawal p, query_verb); 58864f131a8SHemant Agrawal if (!r) { 58964f131a8SHemant Agrawal pr_err("qbman: Query CGID %d statistics failed, no response\n", 59064f131a8SHemant Agrawal cgid); 59164f131a8SHemant Agrawal return -EIO; 59264f131a8SHemant Agrawal } 59364f131a8SHemant Agrawal 59464f131a8SHemant Agrawal /* Decode the outcome */ 59564f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != query_verb); 59664f131a8SHemant Agrawal 59764f131a8SHemant Agrawal /* Determine success or failure */ 59864f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 59964f131a8SHemant Agrawal pr_err("Query statistics of CGID 0x%x failed, code=0x%02x\n", 60064f131a8SHemant Agrawal cgid, r->rslt); 60164f131a8SHemant Agrawal return -EIO; 60264f131a8SHemant Agrawal } 60364f131a8SHemant Agrawal 60464f131a8SHemant Agrawal if (*frame_cnt) 60564f131a8SHemant Agrawal *frame_cnt = r->frm_cnt & 0xFFFFFFFFFFllu; 60664f131a8SHemant Agrawal if (*byte_cnt) 60764f131a8SHemant Agrawal *byte_cnt = r->byte_cnt & 0xFFFFFFFFFFllu; 60864f131a8SHemant Agrawal 60964f131a8SHemant Agrawal return 0; 61064f131a8SHemant Agrawal } 61164f131a8SHemant Agrawal 61264f131a8SHemant Agrawal int qbman_cgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear, 61364f131a8SHemant Agrawal uint64_t *frame_cnt, uint64_t *byte_cnt) 61464f131a8SHemant Agrawal { 61564f131a8SHemant Agrawal return qbman_cgr_statistics_query(s, cgid, clear, 0xff, 61664f131a8SHemant Agrawal frame_cnt, byte_cnt); 61764f131a8SHemant Agrawal } 61864f131a8SHemant Agrawal 61964f131a8SHemant Agrawal int qbman_ccgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear, 62064f131a8SHemant Agrawal uint64_t *frame_cnt, uint64_t *byte_cnt) 62164f131a8SHemant Agrawal { 62264f131a8SHemant Agrawal return qbman_cgr_statistics_query(s, cgid, clear, 1, 62364f131a8SHemant Agrawal frame_cnt, byte_cnt); 62464f131a8SHemant Agrawal } 62564f131a8SHemant Agrawal 62664f131a8SHemant Agrawal int qbman_cq_dequeue_statistics(struct qbman_swp *s, uint32_t cgid, int clear, 62764f131a8SHemant Agrawal uint64_t *frame_cnt, uint64_t *byte_cnt) 62864f131a8SHemant Agrawal { 62964f131a8SHemant Agrawal return qbman_cgr_statistics_query(s, cgid, clear, 0, 63064f131a8SHemant Agrawal frame_cnt, byte_cnt); 63164f131a8SHemant Agrawal } 63264f131a8SHemant Agrawal 63364f131a8SHemant Agrawal /* WQ Chan Query */ 63464f131a8SHemant Agrawal struct qbman_wqchan_query_desc { 63564f131a8SHemant Agrawal uint8_t verb; 63664f131a8SHemant Agrawal uint8_t reserved; 63764f131a8SHemant Agrawal uint16_t chid; 63864f131a8SHemant Agrawal uint8_t reserved2[60]; 63964f131a8SHemant Agrawal }; 64064f131a8SHemant Agrawal 64164f131a8SHemant Agrawal int qbman_wqchan_query(struct qbman_swp *s, uint16_t chanid, 64264f131a8SHemant Agrawal struct qbman_wqchan_query_rslt *r) 64364f131a8SHemant Agrawal { 64464f131a8SHemant Agrawal struct qbman_wqchan_query_desc *p; 645*051f4185SRohit Raj struct qbman_wqchan_query_rslt *wqchan_query_rslt; 64664f131a8SHemant Agrawal 64764f131a8SHemant Agrawal /* Start the management command */ 64864f131a8SHemant Agrawal p = (struct qbman_wqchan_query_desc *)qbman_swp_mc_start(s); 64964f131a8SHemant Agrawal if (!p) 65064f131a8SHemant Agrawal return -EBUSY; 65164f131a8SHemant Agrawal 65264f131a8SHemant Agrawal /* Encode the caller-provided attributes */ 65364f131a8SHemant Agrawal p->chid = chanid; 65464f131a8SHemant Agrawal 65564f131a8SHemant Agrawal /* Complete the management command */ 656*051f4185SRohit Raj wqchan_query_rslt = (struct qbman_wqchan_query_rslt *)qbman_swp_mc_complete( 657*051f4185SRohit Raj s, p, QBMAN_WQ_QUERY); 658*051f4185SRohit Raj if (!wqchan_query_rslt) { 65964f131a8SHemant Agrawal pr_err("qbman: Query WQ Channel %d failed, no response\n", 66064f131a8SHemant Agrawal chanid); 66164f131a8SHemant Agrawal return -EIO; 66264f131a8SHemant Agrawal } 66364f131a8SHemant Agrawal 664*051f4185SRohit Raj *r = *wqchan_query_rslt; 665*051f4185SRohit Raj 66664f131a8SHemant Agrawal /* Decode the outcome */ 66764f131a8SHemant Agrawal QBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_WQ_QUERY); 66864f131a8SHemant Agrawal 66964f131a8SHemant Agrawal /* Determine success or failure */ 67064f131a8SHemant Agrawal if (r->rslt != QBMAN_MC_RSLT_OK) { 67164f131a8SHemant Agrawal pr_err("Query of WQCHAN 0x%x failed, code=0x%02x\n", 67264f131a8SHemant Agrawal chanid, r->rslt); 67364f131a8SHemant Agrawal return -EIO; 67464f131a8SHemant Agrawal } 67564f131a8SHemant Agrawal 67664f131a8SHemant Agrawal return 0; 67764f131a8SHemant Agrawal } 67864f131a8SHemant Agrawal 67964f131a8SHemant Agrawal uint32_t qbman_wqchan_attr_get_wqlen(struct qbman_wqchan_query_rslt *r, int wq) 68064f131a8SHemant Agrawal { 68164f131a8SHemant Agrawal return r->wq_len[wq] & 0x00FFFFFF; 68264f131a8SHemant Agrawal } 68364f131a8SHemant Agrawal 68464f131a8SHemant Agrawal uint64_t qbman_wqchan_attr_get_cdan_ctx(struct qbman_wqchan_query_rslt *r) 68564f131a8SHemant Agrawal { 68664f131a8SHemant Agrawal return r->cdan_ctx; 68764f131a8SHemant Agrawal } 68864f131a8SHemant Agrawal 68964f131a8SHemant Agrawal uint16_t qbman_wqchan_attr_get_cdan_wqid(struct qbman_wqchan_query_rslt *r) 69064f131a8SHemant Agrawal { 69164f131a8SHemant Agrawal return r->cdan_wqid; 69264f131a8SHemant Agrawal } 69364f131a8SHemant Agrawal 69464f131a8SHemant Agrawal uint8_t qbman_wqchan_attr_get_ctrl(struct qbman_wqchan_query_rslt *r) 69564f131a8SHemant Agrawal { 69664f131a8SHemant Agrawal return r->ctrl; 69764f131a8SHemant Agrawal } 69864f131a8SHemant Agrawal 69964f131a8SHemant Agrawal uint16_t qbman_wqchan_attr_get_chanid(struct qbman_wqchan_query_rslt *r) 70064f131a8SHemant Agrawal { 70164f131a8SHemant Agrawal return r->chid; 70264f131a8SHemant Agrawal } 703