xref: /dpdk/drivers/bus/fslmc/qbman/qbman_debug.c (revision 051f4185f98faa964b6a965b2e8e7b2da68969de)
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