get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/99776/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 99776,
    "url": "https://patches.dpdk.org/api/patches/99776/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210927122650.30881-4-nipun.gupta@nxp.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210927122650.30881-4-nipun.gupta@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210927122650.30881-4-nipun.gupta@nxp.com",
    "date": "2021-09-27T12:26:42",
    "name": "[03/11] bus/fslmc: add qbman debug APIs support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "bb275e21f405330e40b463f769b5bb56f0ec1e7d",
    "submitter": {
        "id": 471,
        "url": "https://patches.dpdk.org/api/people/471/?format=api",
        "name": "Nipun Gupta",
        "email": "nipun.gupta@nxp.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210927122650.30881-4-nipun.gupta@nxp.com/mbox/",
    "series": [
        {
            "id": 19191,
            "url": "https://patches.dpdk.org/api/series/19191/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=19191",
            "date": "2021-09-27T12:26:39",
            "name": "NXP DPAAx Bus and PMD changes",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/19191/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/99776/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/99776/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 221E2A0548;\n\tMon, 27 Sep 2021 14:27:12 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A4790410F7;\n\tMon, 27 Sep 2021 14:26:59 +0200 (CEST)",
            "from inva021.nxp.com (inva021.nxp.com [92.121.34.21])\n by mails.dpdk.org (Postfix) with ESMTP id AB4CD40E3C\n for <dev@dpdk.org>; Mon, 27 Sep 2021 14:26:54 +0200 (CEST)",
            "from inva021.nxp.com (localhost [127.0.0.1])\n by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 85F30201462;\n Mon, 27 Sep 2021 14:26:54 +0200 (CEST)",
            "from aprdc01srsp001v.ap-rdc01.nxp.com\n (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16])\n by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 01AE8201425;\n Mon, 27 Sep 2021 14:26:54 +0200 (CEST)",
            "from lsv03274.swis.in-blr01.nxp.com (lsv03274.swis.in-blr01.nxp.com\n [92.120.147.114])\n by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id BED1F183AD07;\n Mon, 27 Sep 2021 20:26:52 +0800 (+08)"
        ],
        "From": "nipun.gupta@nxp.com",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, ferruh.yigit@intel.com, hemant.agrawal@nxp.com,\n sachin.saxena@nxp.com, Youri Querry <youri.querry_1@nxp.com>,\n Roy Pledge <roy.pledge@nxp.com>, Nipun Gupta <nipun.gupta@nxp.com>",
        "Date": "Mon, 27 Sep 2021 17:56:42 +0530",
        "Message-Id": "<20210927122650.30881-4-nipun.gupta@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210927122650.30881-1-nipun.gupta@nxp.com>",
        "References": "<20210927122650.30881-1-nipun.gupta@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH 03/11] bus/fslmc: add qbman debug APIs support",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Hemant Agrawal <hemant.agrawal@nxp.com>\n\nAdd support for debugging qbman FQs\n\nSigned-off-by: Youri Querry <youri.querry_1@nxp.com>\nSigned-off-by: Roy Pledge <roy.pledge@nxp.com>\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\nSigned-off-by: Nipun Gupta <nipun.gupta@nxp.com>\n---\n .../bus/fslmc/qbman/include/fsl_qbman_debug.h | 203 +++++-\n drivers/bus/fslmc/qbman/qbman_debug.c         | 623 ++++++++++++++++++\n drivers/bus/fslmc/qbman/qbman_portal.c        |   6 +\n 3 files changed, 826 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/drivers/bus/fslmc/qbman/include/fsl_qbman_debug.h b/drivers/bus/fslmc/qbman/include/fsl_qbman_debug.h\nindex 54096e8774..fa02bc928e 100644\n--- a/drivers/bus/fslmc/qbman/include/fsl_qbman_debug.h\n+++ b/drivers/bus/fslmc/qbman/include/fsl_qbman_debug.h\n@@ -1,13 +1,118 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  * Copyright (C) 2015 Freescale Semiconductor, Inc.\n- * Copyright 2020 NXP\n+ * Copyright 2018-2020 NXP\n  */\n #ifndef _FSL_QBMAN_DEBUG_H\n #define _FSL_QBMAN_DEBUG_H\n \n-#include <rte_compat.h>\n \n struct qbman_swp;\n+/* Buffer pool query commands */\n+struct qbman_bp_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint8_t reserved[4];\n+\tuint8_t bdi;\n+\tuint8_t state;\n+\tuint32_t fill;\n+\tuint32_t hdptr;\n+\tuint16_t swdet;\n+\tuint16_t swdxt;\n+\tuint16_t hwdet;\n+\tuint16_t hwdxt;\n+\tuint16_t swset;\n+\tuint16_t swsxt;\n+\tuint16_t vbpid;\n+\tuint16_t icid;\n+\tuint64_t bpscn_addr;\n+\tuint64_t bpscn_ctx;\n+\tuint16_t hw_targ;\n+\tuint8_t dbe;\n+\tuint8_t reserved2;\n+\tuint8_t sdcnt;\n+\tuint8_t hdcnt;\n+\tuint8_t sscnt;\n+\tuint8_t reserved3[9];\n+};\n+\n+int qbman_bp_query(struct qbman_swp *s, uint32_t bpid,\n+\t\t   struct qbman_bp_query_rslt *r);\n+int qbman_bp_get_bdi(struct qbman_bp_query_rslt *r);\n+int qbman_bp_get_va(struct qbman_bp_query_rslt *r);\n+int qbman_bp_get_wae(struct qbman_bp_query_rslt *r);\n+uint16_t qbman_bp_get_swdet(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_swdxt(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_hwdet(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_hwdxt(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_swset(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_swsxt(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_vbpid(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_icid(struct qbman_bp_query_rslt  *r);\n+int qbman_bp_get_pl(struct qbman_bp_query_rslt  *r);\n+uint64_t qbman_bp_get_bpscn_addr(struct qbman_bp_query_rslt  *r);\n+uint64_t qbman_bp_get_bpscn_ctx(struct qbman_bp_query_rslt  *r);\n+uint16_t qbman_bp_get_hw_targ(struct qbman_bp_query_rslt  *r);\n+int qbman_bp_has_free_bufs(struct qbman_bp_query_rslt  *r);\n+uint32_t qbman_bp_num_free_bufs(struct qbman_bp_query_rslt  *r);\n+int qbman_bp_is_depleted(struct qbman_bp_query_rslt  *r);\n+int qbman_bp_is_surplus(struct qbman_bp_query_rslt  *r);\n+uint32_t qbman_bp_get_hdptr(struct qbman_bp_query_rslt  *r);\n+uint32_t qbman_bp_get_sdcnt(struct qbman_bp_query_rslt  *r);\n+uint32_t qbman_bp_get_hdcnt(struct qbman_bp_query_rslt  *r);\n+uint32_t qbman_bp_get_sscnt(struct qbman_bp_query_rslt  *r);\n+\n+/* FQ query function for programmable fields */\n+struct qbman_fq_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint8_t reserved[8];\n+\tuint16_t cgid;\n+\tuint16_t dest_wq;\n+\tuint8_t reserved2;\n+\tuint8_t fq_ctrl;\n+\tuint16_t ics_cred;\n+\tuint16_t td_thresh;\n+\tuint16_t oal_oac;\n+\tuint8_t reserved3;\n+\tuint8_t mctl;\n+\tuint64_t fqd_ctx;\n+\tuint16_t icid;\n+\tuint16_t reserved4;\n+\tuint32_t vfqid;\n+\tuint32_t fqid_er;\n+\tuint16_t opridsz;\n+\tuint8_t reserved5[18];\n+};\n+\n+int qbman_fq_query(struct qbman_swp *s, uint32_t fqid,\n+\t\t   struct qbman_fq_query_rslt *r);\n+uint8_t qbman_fq_attr_get_fqctrl(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_cgrid(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_destwq(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_tdthresh(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_oa_ics(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_oa_cgr(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_oal(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_bdi(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_ff(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_va(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_ps(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_pps(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_icid(struct qbman_fq_query_rslt *r);\n+int qbman_fq_attr_get_pl(struct qbman_fq_query_rslt *r);\n+uint32_t qbman_fq_attr_get_vfqid(struct qbman_fq_query_rslt *r);\n+uint32_t qbman_fq_attr_get_erfqid(struct qbman_fq_query_rslt *r);\n+uint16_t qbman_fq_attr_get_opridsz(struct qbman_fq_query_rslt *r);\n+\n+/* FQ query command for non-programmable fields*/\n+enum qbman_fq_schedstate_e {\n+\tqbman_fq_schedstate_oos = 0,\n+\tqbman_fq_schedstate_retired,\n+\tqbman_fq_schedstate_tentatively_scheduled,\n+\tqbman_fq_schedstate_truly_scheduled,\n+\tqbman_fq_schedstate_parked,\n+\tqbman_fq_schedstate_held_active,\n+};\n \n struct qbman_fq_query_np_rslt {\n uint8_t verb;\n@@ -29,13 +134,99 @@ uint8_t verb;\n \tuint8_t reserved2[29];\n };\n \n-__rte_internal\n int qbman_fq_query_state(struct qbman_swp *s, uint32_t fqid,\n \t\t\t struct qbman_fq_query_np_rslt *r);\n-\n-__rte_internal\n+uint8_t qbman_fq_state_schedstate(const struct qbman_fq_query_np_rslt *r);\n+int qbman_fq_state_force_eligible(const struct qbman_fq_query_np_rslt *r);\n+int qbman_fq_state_xoff(const struct qbman_fq_query_np_rslt *r);\n+int qbman_fq_state_retirement_pending(const struct qbman_fq_query_np_rslt *r);\n+int qbman_fq_state_overflow_error(const struct qbman_fq_query_np_rslt *r);\n uint32_t qbman_fq_state_frame_count(const struct qbman_fq_query_np_rslt *r);\n-\n uint32_t qbman_fq_state_byte_count(const struct qbman_fq_query_np_rslt *r);\n \n+/* CGR query */\n+struct qbman_cgr_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint8_t reserved[6];\n+\tuint8_t ctl1;\n+\tuint8_t reserved1;\n+\tuint16_t oal;\n+\tuint16_t reserved2;\n+\tuint8_t mode;\n+\tuint8_t ctl2;\n+\tuint8_t iwc;\n+\tuint8_t tdc;\n+\tuint16_t cs_thres;\n+\tuint16_t cs_thres_x;\n+\tuint16_t td_thres;\n+\tuint16_t cscn_tdcp;\n+\tuint16_t cscn_wqid;\n+\tuint16_t cscn_vcgid;\n+\tuint16_t cg_icid;\n+\tuint64_t cg_wr_addr;\n+\tuint64_t cscn_ctx;\n+\tuint64_t i_cnt;\n+\tuint64_t a_cnt;\n+};\n+\n+int qbman_cgr_query(struct qbman_swp *s, uint32_t cgid,\n+\t\t    struct qbman_cgr_query_rslt *r);\n+int qbman_cgr_get_cscn_wq_en_enter(struct qbman_cgr_query_rslt *r);\n+int qbman_cgr_get_cscn_wq_en_exit(struct qbman_cgr_query_rslt *r);\n+int qbman_cgr_get_cscn_wq_icd(struct qbman_cgr_query_rslt *r);\n+uint8_t qbman_cgr_get_mode(struct qbman_cgr_query_rslt *r);\n+int qbman_cgr_get_rej_cnt_mode(struct qbman_cgr_query_rslt *r);\n+int qbman_cgr_get_cscn_bdi(struct qbman_cgr_query_rslt *r);\n+uint16_t qbman_cgr_attr_get_cs_thres(struct qbman_cgr_query_rslt *r);\n+uint16_t qbman_cgr_attr_get_cs_thres_x(struct qbman_cgr_query_rslt *r);\n+uint16_t qbman_cgr_attr_get_td_thres(struct qbman_cgr_query_rslt *r);\n+\n+/* WRED query */\n+struct qbman_wred_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint8_t reserved[6];\n+\tuint8_t edp[7];\n+\tuint8_t reserved1;\n+\tuint32_t wred_parm_dp[7];\n+\tuint8_t reserved2[20];\n+};\n+\n+int qbman_cgr_wred_query(struct qbman_swp *s, uint32_t cgid,\n+\t\t\t struct qbman_wred_query_rslt *r);\n+int qbman_cgr_attr_wred_get_edp(struct qbman_wred_query_rslt *r, uint32_t idx);\n+void qbman_cgr_attr_wred_dp_decompose(uint32_t dp, uint64_t *minth,\n+\t\t\t\t      uint64_t *maxth, uint8_t *maxp);\n+uint32_t qbman_cgr_attr_wred_get_parm_dp(struct qbman_wred_query_rslt *r,\n+\t\t\t\t\t uint32_t idx);\n+\n+/* CGR/CCGR/CQ statistics query */\n+int qbman_cgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\tuint64_t *frame_cnt, uint64_t *byte_cnt);\n+int qbman_ccgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\t uint64_t *frame_cnt, uint64_t *byte_cnt);\n+int qbman_cq_dequeue_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\tuint64_t *frame_cnt, uint64_t *byte_cnt);\n+\n+/* Query Work Queue Channel */\n+struct qbman_wqchan_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint16_t chid;\n+\tuint8_t reserved;\n+\tuint8_t ctrl;\n+\tuint16_t cdan_wqid;\n+\tuint64_t cdan_ctx;\n+\tuint32_t reserved2[4];\n+\tuint32_t wq_len[8];\n+};\n+\n+int qbman_wqchan_query(struct qbman_swp *s, uint16_t chanid,\n+\t\t       struct qbman_wqchan_query_rslt *r);\n+uint32_t qbman_wqchan_attr_get_wqlen(struct qbman_wqchan_query_rslt *r, int wq);\n+uint64_t qbman_wqchan_attr_get_cdan_ctx(struct qbman_wqchan_query_rslt *r);\n+uint16_t qbman_wqchan_attr_get_cdan_wqid(struct qbman_wqchan_query_rslt *r);\n+uint8_t qbman_wqchan_attr_get_ctrl(struct qbman_wqchan_query_rslt *r);\n+uint16_t qbman_wqchan_attr_get_chanid(struct qbman_wqchan_query_rslt *r);\n #endif /* !_FSL_QBMAN_DEBUG_H */\ndiff --git a/drivers/bus/fslmc/qbman/qbman_debug.c b/drivers/bus/fslmc/qbman/qbman_debug.c\nindex 34374ae4b6..c0d288faa8 100644\n--- a/drivers/bus/fslmc/qbman/qbman_debug.c\n+++ b/drivers/bus/fslmc/qbman/qbman_debug.c\n@@ -1,5 +1,6 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n  * Copyright (C) 2015 Freescale Semiconductor, Inc.\n+ * Copyright 2018-2020 NXP\n  */\n \n #include \"compat.h\"\n@@ -16,6 +17,179 @@\n #define QBMAN_CGR_STAT_QUERY      0x55\n #define QBMAN_CGR_STAT_QUERY_CLR  0x56\n \n+struct qbman_bp_query_desc {\n+\tuint8_t verb;\n+\tuint8_t reserved;\n+\tuint16_t bpid;\n+\tuint8_t reserved2[60];\n+};\n+\n+#define QB_BP_STATE_SHIFT  24\n+#define QB_BP_VA_SHIFT     1\n+#define QB_BP_VA_MASK      0x2\n+#define QB_BP_WAE_SHIFT    2\n+#define QB_BP_WAE_MASK     0x4\n+#define QB_BP_PL_SHIFT     15\n+#define QB_BP_PL_MASK      0x8000\n+#define QB_BP_ICID_MASK    0x7FFF\n+\n+int qbman_bp_query(struct qbman_swp *s, uint32_t bpid,\n+\t\t   struct qbman_bp_query_rslt *r)\n+{\n+\tstruct qbman_bp_query_desc *p;\n+\n+\t/* Start the management command */\n+\tp = (struct qbman_bp_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\t/* Encode the caller-provided attributes */\n+\tp->bpid = bpid;\n+\n+\t/* Complete the management command */\n+\t*r = *(struct qbman_bp_query_rslt *)qbman_swp_mc_complete(s, p,\n+\t\t\t\t\t\t QBMAN_BP_QUERY);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query BPID %d failed, no response\\n\",\n+\t\t\tbpid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_BP_QUERY);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query of BPID 0x%x failed, code=0x%02x\\n\", bpid,\n+\t\t\t\t\t\t\t\tr->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int qbman_bp_get_bdi(struct qbman_bp_query_rslt *r)\n+{\n+\treturn r->bdi & 1;\n+}\n+\n+int qbman_bp_get_va(struct qbman_bp_query_rslt *r)\n+{\n+\treturn (r->bdi & QB_BP_VA_MASK) >> QB_BP_VA_MASK;\n+}\n+\n+int qbman_bp_get_wae(struct qbman_bp_query_rslt *r)\n+{\n+\treturn (r->bdi & QB_BP_WAE_MASK) >> QB_BP_WAE_SHIFT;\n+}\n+\n+static uint16_t qbman_bp_thresh_to_value(uint16_t val)\n+{\n+\treturn (val & 0xff) << ((val & 0xf00) >> 8);\n+}\n+\n+uint16_t qbman_bp_get_swdet(struct qbman_bp_query_rslt  *r)\n+{\n+\n+\treturn qbman_bp_thresh_to_value(r->swdet);\n+}\n+\n+uint16_t qbman_bp_get_swdxt(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn qbman_bp_thresh_to_value(r->swdxt);\n+}\n+\n+uint16_t qbman_bp_get_hwdet(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn qbman_bp_thresh_to_value(r->hwdet);\n+}\n+\n+uint16_t qbman_bp_get_hwdxt(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn qbman_bp_thresh_to_value(r->hwdxt);\n+}\n+\n+uint16_t qbman_bp_get_swset(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn qbman_bp_thresh_to_value(r->swset);\n+}\n+\n+uint16_t qbman_bp_get_swsxt(struct qbman_bp_query_rslt  *r)\n+{\n+\n+\treturn qbman_bp_thresh_to_value(r->swsxt);\n+}\n+\n+uint16_t qbman_bp_get_vbpid(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->vbpid;\n+}\n+\n+uint16_t qbman_bp_get_icid(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->icid & QB_BP_ICID_MASK;\n+}\n+\n+int qbman_bp_get_pl(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn (r->icid & QB_BP_PL_MASK) >> QB_BP_PL_SHIFT;\n+}\n+\n+uint64_t qbman_bp_get_bpscn_addr(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->bpscn_addr;\n+}\n+\n+uint64_t qbman_bp_get_bpscn_ctx(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->bpscn_ctx;\n+}\n+\n+uint16_t qbman_bp_get_hw_targ(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->hw_targ;\n+}\n+\n+int qbman_bp_has_free_bufs(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn !(int)(r->state & 0x1);\n+}\n+\n+int qbman_bp_is_depleted(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn (int)((r->state & 0x2) >> 1);\n+}\n+\n+int qbman_bp_is_surplus(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn (int)((r->state & 0x4) >> 2);\n+}\n+\n+uint32_t qbman_bp_num_free_bufs(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->fill;\n+}\n+\n+uint32_t qbman_bp_get_hdptr(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->hdptr;\n+}\n+\n+uint32_t qbman_bp_get_sdcnt(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->sdcnt;\n+}\n+\n+uint32_t qbman_bp_get_hdcnt(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->hdcnt;\n+}\n+\n+uint32_t qbman_bp_get_sscnt(struct qbman_bp_query_rslt  *r)\n+{\n+\treturn r->sscnt;\n+}\n+\n struct qbman_fq_query_desc {\n \tuint8_t verb;\n \tuint8_t reserved[3];\n@@ -23,6 +197,129 @@ struct qbman_fq_query_desc {\n \tuint8_t reserved2[56];\n };\n \n+/* FQ query function for programmable fields */\n+int qbman_fq_query(struct qbman_swp *s, uint32_t fqid,\n+\t\t   struct qbman_fq_query_rslt *r)\n+{\n+\tstruct qbman_fq_query_desc *p;\n+\n+\tp = (struct qbman_fq_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\tp->fqid = fqid;\n+\t*r = *(struct qbman_fq_query_rslt *)qbman_swp_mc_complete(s, p,\n+\t\t\t\t\t  QBMAN_FQ_QUERY);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query FQID %d failed, no response\\n\",\n+\t\t\tfqid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_FQ_QUERY);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query of FQID 0x%x failed, code=0x%02x\\n\",\n+\t\t       fqid, r->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+uint8_t qbman_fq_attr_get_fqctrl(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->fq_ctrl;\n+}\n+\n+uint16_t qbman_fq_attr_get_cgrid(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->cgid;\n+}\n+\n+uint16_t qbman_fq_attr_get_destwq(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->dest_wq;\n+}\n+\n+static uint16_t qbman_thresh_to_value(uint16_t val)\n+{\n+\treturn ((val & 0x1FE0) >> 5) << (val & 0x1F);\n+}\n+\n+uint16_t qbman_fq_attr_get_tdthresh(struct qbman_fq_query_rslt *r)\n+{\n+\treturn qbman_thresh_to_value(r->td_thresh);\n+}\n+\n+int qbman_fq_attr_get_oa_ics(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (int)(r->oal_oac >> 14) & 0x1;\n+}\n+\n+int qbman_fq_attr_get_oa_cgr(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (int)(r->oal_oac >> 15);\n+}\n+\n+uint16_t qbman_fq_attr_get_oal(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->oal_oac & 0x0FFF);\n+}\n+\n+int qbman_fq_attr_get_bdi(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->mctl & 0x1);\n+}\n+\n+int qbman_fq_attr_get_ff(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->mctl & 0x2) >> 1;\n+}\n+\n+int qbman_fq_attr_get_va(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->mctl & 0x4) >> 2;\n+}\n+\n+int qbman_fq_attr_get_ps(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->mctl & 0x8) >> 3;\n+}\n+\n+int qbman_fq_attr_get_pps(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (r->mctl & 0x30) >> 4;\n+}\n+\n+uint16_t qbman_fq_attr_get_icid(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->icid & 0x7FFF;\n+}\n+\n+int qbman_fq_attr_get_pl(struct qbman_fq_query_rslt *r)\n+{\n+\treturn (int)((r->icid & 0x8000) >> 15);\n+}\n+\n+uint32_t qbman_fq_attr_get_vfqid(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->vfqid & 0x00FFFFFF;\n+}\n+\n+uint32_t qbman_fq_attr_get_erfqid(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->fqid_er & 0x00FFFFFF;\n+}\n+\n+uint16_t qbman_fq_attr_get_opridsz(struct qbman_fq_query_rslt *r)\n+{\n+\treturn r->opridsz;\n+}\n+\n+__rte_internal\n int qbman_fq_query_state(struct qbman_swp *s, uint32_t fqid,\n \t\t\t struct qbman_fq_query_np_rslt *r)\n {\n@@ -55,6 +352,32 @@ int qbman_fq_query_state(struct qbman_swp *s, uint32_t fqid,\n \treturn 0;\n }\n \n+uint8_t qbman_fq_state_schedstate(const struct qbman_fq_query_np_rslt *r)\n+{\n+\treturn r->st1 & 0x7;\n+}\n+\n+int qbman_fq_state_force_eligible(const struct qbman_fq_query_np_rslt *r)\n+{\n+\treturn (int)((r->st1 & 0x8) >> 3);\n+}\n+\n+int qbman_fq_state_xoff(const struct qbman_fq_query_np_rslt *r)\n+{\n+\treturn (int)((r->st1 & 0x10) >> 4);\n+}\n+\n+int qbman_fq_state_retirement_pending(const struct qbman_fq_query_np_rslt *r)\n+{\n+\treturn (int)((r->st1 & 0x20) >> 5);\n+}\n+\n+int qbman_fq_state_overflow_error(const struct qbman_fq_query_np_rslt *r)\n+{\n+\treturn (int)((r->st1 & 0x40) >> 6);\n+}\n+\n+__rte_internal\n uint32_t qbman_fq_state_frame_count(const struct qbman_fq_query_np_rslt *r)\n {\n \treturn (r->frm_cnt & 0x00FFFFFF);\n@@ -64,3 +387,303 @@ uint32_t qbman_fq_state_byte_count(const struct qbman_fq_query_np_rslt *r)\n {\n \treturn r->byte_cnt;\n }\n+\n+/* Query CGR */\n+struct qbman_cgr_query_desc {\n+\tuint8_t verb;\n+\tuint8_t reserved;\n+\tuint16_t cgid;\n+\tuint8_t reserved2[60];\n+};\n+\n+int qbman_cgr_query(struct qbman_swp *s, uint32_t cgid,\n+\t\t    struct qbman_cgr_query_rslt *r)\n+{\n+\tstruct qbman_cgr_query_desc *p;\n+\n+\tp = (struct qbman_cgr_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\tp->cgid = cgid;\n+\t*r = *(struct qbman_cgr_query_rslt *)qbman_swp_mc_complete(s, p,\n+\t\t\t\t\t\t\tQBMAN_CGR_QUERY);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query CGID %d failed, no response\\n\",\n+\t\t\tcgid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_CGR_QUERY);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query CGID 0x%x failed,code=0x%02x\\n\", cgid, r->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int qbman_cgr_get_cscn_wq_en_enter(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn (int)(r->ctl1 & 0x1);\n+}\n+\n+int qbman_cgr_get_cscn_wq_en_exit(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn (int)((r->ctl1 & 0x2) >> 1);\n+}\n+\n+int qbman_cgr_get_cscn_wq_icd(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn (int)((r->ctl1 & 0x4) >> 2);\n+}\n+\n+uint8_t qbman_cgr_get_mode(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn r->mode & 0x3;\n+}\n+\n+int qbman_cgr_get_rej_cnt_mode(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn (int)((r->mode & 0x4) >> 2);\n+}\n+\n+int qbman_cgr_get_cscn_bdi(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn (int)((r->mode & 0x8) >> 3);\n+}\n+\n+uint16_t qbman_cgr_attr_get_cs_thres(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn qbman_thresh_to_value(r->cs_thres);\n+}\n+\n+uint16_t qbman_cgr_attr_get_cs_thres_x(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn qbman_thresh_to_value(r->cs_thres_x);\n+}\n+\n+uint16_t qbman_cgr_attr_get_td_thres(struct qbman_cgr_query_rslt *r)\n+{\n+\treturn qbman_thresh_to_value(r->td_thres);\n+}\n+\n+int qbman_cgr_wred_query(struct qbman_swp *s, uint32_t cgid,\n+\t\t\tstruct qbman_wred_query_rslt *r)\n+{\n+\tstruct qbman_cgr_query_desc *p;\n+\n+\tp = (struct qbman_cgr_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\tp->cgid = cgid;\n+\t*r = *(struct qbman_wred_query_rslt *)qbman_swp_mc_complete(s, p,\n+\t\t\t\t\t\t\tQBMAN_WRED_QUERY);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query CGID WRED %d failed, no response\\n\",\n+\t\t\tcgid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_WRED_QUERY);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query CGID WRED 0x%x failed,code=0x%02x\\n\",\n+\t\t\t\t\t\t\t cgid, r->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int qbman_cgr_attr_wred_get_edp(struct qbman_wred_query_rslt *r, uint32_t idx)\n+{\n+\treturn (int)(r->edp[idx] & 1);\n+}\n+\n+uint32_t qbman_cgr_attr_wred_get_parm_dp(struct qbman_wred_query_rslt *r,\n+\t\t\t\t\t uint32_t idx)\n+{\n+\treturn r->wred_parm_dp[idx];\n+}\n+\n+void qbman_cgr_attr_wred_dp_decompose(uint32_t dp, uint64_t *minth,\n+\t\t\t\t      uint64_t *maxth, uint8_t *maxp)\n+{\n+\tuint8_t ma, mn, step_i, step_s, pn;\n+\n+\tma = (uint8_t)(dp >> 24);\n+\tmn = (uint8_t)(dp >> 19) & 0x1f;\n+\tstep_i = (uint8_t)(dp >> 11);\n+\tstep_s = (uint8_t)(dp >> 6) & 0x1f;\n+\tpn = (uint8_t)dp & 0x3f;\n+\n+\t*maxp = (uint8_t)(((pn<<2) * 100)/256);\n+\n+\tif (mn == 0)\n+\t\t*maxth = ma;\n+\telse\n+\t\t*maxth = ((ma+256) * (1<<(mn-1)));\n+\n+\tif (step_s == 0)\n+\t\t*minth = *maxth - step_i;\n+\telse\n+\t\t*minth = *maxth - (256 + step_i) * (1<<(step_s - 1));\n+}\n+\n+/* Query CGR/CCGR/CQ statistics */\n+struct qbman_cgr_statistics_query_desc {\n+\tuint8_t verb;\n+\tuint8_t reserved;\n+\tuint16_t cgid;\n+\tuint8_t reserved1;\n+\tuint8_t ct;\n+\tuint8_t reserved2[58];\n+};\n+\n+struct qbman_cgr_statistics_query_rslt {\n+\tuint8_t verb;\n+\tuint8_t rslt;\n+\tuint8_t reserved[14];\n+\tuint64_t frm_cnt;\n+\tuint64_t byte_cnt;\n+\tuint32_t reserved2[8];\n+};\n+\n+static int qbman_cgr_statistics_query(struct qbman_swp *s, uint32_t cgid,\n+\t\t\t\t      int clear, uint32_t command_type,\n+\t\t\t\t      uint64_t *frame_cnt, uint64_t *byte_cnt)\n+{\n+\tstruct qbman_cgr_statistics_query_desc *p;\n+\tstruct qbman_cgr_statistics_query_rslt *r;\n+\tuint32_t query_verb;\n+\n+\tp = (struct qbman_cgr_statistics_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\tp->cgid = cgid;\n+\tif (command_type < 2)\n+\t\tp->ct = command_type;\n+\tquery_verb = clear ?\n+\t\t\tQBMAN_CGR_STAT_QUERY_CLR : QBMAN_CGR_STAT_QUERY;\n+\tr = (struct qbman_cgr_statistics_query_rslt *)qbman_swp_mc_complete(s,\n+\t\t\t\t\t\t\tp, query_verb);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query CGID %d statistics failed, no response\\n\",\n+\t\t\tcgid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != query_verb);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query statistics of CGID 0x%x failed, code=0x%02x\\n\",\n+\t\t\t\t\t\tcgid, r->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\tif (*frame_cnt)\n+\t\t*frame_cnt = r->frm_cnt & 0xFFFFFFFFFFllu;\n+\tif (*byte_cnt)\n+\t\t*byte_cnt = r->byte_cnt & 0xFFFFFFFFFFllu;\n+\n+\treturn 0;\n+}\n+\n+int qbman_cgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\tuint64_t *frame_cnt, uint64_t *byte_cnt)\n+{\n+\treturn qbman_cgr_statistics_query(s, cgid, clear, 0xff,\n+\t\t\t\t\t  frame_cnt, byte_cnt);\n+}\n+\n+int qbman_ccgr_reject_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\t uint64_t *frame_cnt, uint64_t *byte_cnt)\n+{\n+\treturn qbman_cgr_statistics_query(s, cgid, clear, 1,\n+\t\t\t\t\t  frame_cnt, byte_cnt);\n+}\n+\n+int qbman_cq_dequeue_statistics(struct qbman_swp *s, uint32_t cgid, int clear,\n+\t\t\t\tuint64_t *frame_cnt, uint64_t *byte_cnt)\n+{\n+\treturn qbman_cgr_statistics_query(s, cgid, clear, 0,\n+\t\t\t\t\t  frame_cnt, byte_cnt);\n+}\n+\n+/* WQ Chan Query */\n+struct qbman_wqchan_query_desc {\n+\tuint8_t verb;\n+\tuint8_t reserved;\n+\tuint16_t chid;\n+\tuint8_t reserved2[60];\n+};\n+\n+int qbman_wqchan_query(struct qbman_swp *s, uint16_t chanid,\n+\t\t       struct qbman_wqchan_query_rslt *r)\n+{\n+\tstruct qbman_wqchan_query_desc *p;\n+\n+\t/* Start the management command */\n+\tp = (struct qbman_wqchan_query_desc *)qbman_swp_mc_start(s);\n+\tif (!p)\n+\t\treturn -EBUSY;\n+\n+\t/* Encode the caller-provided attributes */\n+\tp->chid = chanid;\n+\n+\t/* Complete the management command */\n+\t*r = *(struct qbman_wqchan_query_rslt *)qbman_swp_mc_complete(s, p,\n+\t\t\t\t\t\t\tQBMAN_WQ_QUERY);\n+\tif (!r) {\n+\t\tpr_err(\"qbman: Query WQ Channel %d failed, no response\\n\",\n+\t\t\tchanid);\n+\t\treturn -EIO;\n+\t}\n+\n+\t/* Decode the outcome */\n+\tQBMAN_BUG_ON((r->verb & QBMAN_RESPONSE_VERB_MASK) != QBMAN_WQ_QUERY);\n+\n+\t/* Determine success or failure */\n+\tif (r->rslt != QBMAN_MC_RSLT_OK) {\n+\t\tpr_err(\"Query of WQCHAN 0x%x failed, code=0x%02x\\n\",\n+\t\t       chanid, r->rslt);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+uint32_t qbman_wqchan_attr_get_wqlen(struct qbman_wqchan_query_rslt *r, int wq)\n+{\n+\treturn r->wq_len[wq] & 0x00FFFFFF;\n+}\n+\n+uint64_t qbman_wqchan_attr_get_cdan_ctx(struct qbman_wqchan_query_rslt *r)\n+{\n+\treturn r->cdan_ctx;\n+}\n+\n+uint16_t qbman_wqchan_attr_get_cdan_wqid(struct qbman_wqchan_query_rslt *r)\n+{\n+\treturn r->cdan_wqid;\n+}\n+\n+uint8_t qbman_wqchan_attr_get_ctrl(struct qbman_wqchan_query_rslt *r)\n+{\n+\treturn r->ctrl;\n+}\n+\n+uint16_t qbman_wqchan_attr_get_chanid(struct qbman_wqchan_query_rslt *r)\n+{\n+\treturn r->chid;\n+}\ndiff --git a/drivers/bus/fslmc/qbman/qbman_portal.c b/drivers/bus/fslmc/qbman/qbman_portal.c\nindex aedcad9258..3a7579c8a7 100644\n--- a/drivers/bus/fslmc/qbman/qbman_portal.c\n+++ b/drivers/bus/fslmc/qbman/qbman_portal.c\n@@ -1865,6 +1865,12 @@ void qbman_pull_desc_set_channel(struct qbman_pull_desc *d, uint32_t chid,\n \td->pull.dq_src = chid;\n }\n \n+/**\n+ * qbman_pull_desc_set_rad() - Decide whether reschedule the fq after dequeue\n+ *\n+ * @rad: 1 = Reschedule the FQ after dequeue.\n+ *\t 0 = Allow the FQ to remain active after dequeue.\n+ */\n void qbman_pull_desc_set_rad(struct qbman_pull_desc *d, int rad)\n {\n \tif (d->pull.verb & (1 << QB_VDQCR_VERB_RLS_SHIFT)) {\n",
    "prefixes": [
        "03/11"
    ]
}