Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/87869/?format=api
http://patches.dpdk.org/api/patches/87869/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210211141620.12482-15-hemant.agrawal@nxp.com/", "project": { "id": 1, "url": "http://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": "<20210211141620.12482-15-hemant.agrawal@nxp.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20210211141620.12482-15-hemant.agrawal@nxp.com", "date": "2021-02-11T14:16:14", "name": "[v2,14/20] net/dpaa2: optionally enable error queues", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "272f5241515f0954a141d24251f69b1bfecfa7f4", "submitter": { "id": 477, "url": "http://patches.dpdk.org/api/people/477/?format=api", "name": "Hemant Agrawal", "email": "hemant.agrawal@nxp.com" }, "delegate": { "id": 319, "url": "http://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210211141620.12482-15-hemant.agrawal@nxp.com/mbox/", "series": [ { "id": 15239, "url": "http://patches.dpdk.org/api/series/15239/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=15239", "date": "2021-02-11T14:16:00", "name": "NXP DPAAx ethernet PMD changes", "version": 2, "mbox": "http://patches.dpdk.org/series/15239/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/87869/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/87869/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 8125DA054A;\n\tThu, 11 Feb 2021 15:30:00 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 11C4A1CC5A3;\n\tThu, 11 Feb 2021 15:28:19 +0100 (CET)", "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by mails.dpdk.org (Postfix) with ESMTP id AB7F51CC564\n for <dev@dpdk.org>; Thu, 11 Feb 2021 15:28:05 +0100 (CET)", "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 8E0781A0613;\n Thu, 11 Feb 2021 15:28:05 +0100 (CET)", "from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com\n [165.114.16.14])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 231821A05D6;\n Thu, 11 Feb 2021 15:28:04 +0100 (CET)", "from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net\n [10.232.133.63])\n by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 7502F40326;\n Thu, 11 Feb 2021 15:28:02 +0100 (CET)" ], "From": "Hemant Agrawal <hemant.agrawal@nxp.com>", "To": "dev@dpdk.org,\n\tferruh.yigit@intel.com", "Date": "Thu, 11 Feb 2021 19:46:14 +0530", "Message-Id": "<20210211141620.12482-15-hemant.agrawal@nxp.com>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20210211141620.12482-1-hemant.agrawal@nxp.com>", "References": "<20210120142723.14090-1-hemant.agrawal@nxp.com>\n <20210211141620.12482-1-hemant.agrawal@nxp.com>", "X-Virus-Scanned": "ClamAV using ClamSMTP", "Subject": "[dpdk-dev] [PATCH v2 14/20] net/dpaa2: optionally enable error\n queues", "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: Nipun Gupta <nipun.gupta@nxp.com>\n\nIn case error packets are received by the ethernet interface,\nthis patch enables the receival of packets on the error queue,\nprinting the error and the error packet.\n\nto enable, use the dev_arg as : fslmc:dpni.1,drv_error_queue=1\n\nSigned-off-by: Nipun Gupta <nipun.gupta@nxp.com>\nAcked-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n doc/guides/nics/dpaa2.rst | 7 ++\n drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 1 +\n drivers/net/dpaa2/dpaa2_ethdev.c | 67 +++++++++++++++--\n drivers/net/dpaa2/dpaa2_ethdev.h | 5 +-\n drivers/net/dpaa2/dpaa2_rxtx.c | 97 ++++++++++++++++++++++++-\n 5 files changed, 169 insertions(+), 8 deletions(-)", "diff": "diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst\nindex 4eec8fcdd9..1e698bfbd8 100644\n--- a/doc/guides/nics/dpaa2.rst\n+++ b/doc/guides/nics/dpaa2.rst\n@@ -488,6 +488,13 @@ for details.\n In this mode tx conf queues need to be polled to free the buffers.\n e.g. ``fslmc:dpni.1,drv_tx_conf=1``\n \n+* Use dev arg option ``drv_error_queue=1`` to enable Packets in Error queue.\n+ DPAA2 hardware drops the error packet in hardware. This option enables the\n+ hardware to not drop the error packet and let the driver dump the error\n+ packets, so that user can check what is wrong with those packets.\n+ e.g. ``fslmc:dpni.1,drv_error_queue=1``\n+\n+\n Enabling logs\n -------------\n \ndiff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\nindex 0f15750b6c..037c841ef5 100644\n--- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\n+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h\n@@ -314,6 +314,7 @@ enum qbman_fd_format {\n #define DPAA2_GET_FD_FLC(fd) \\\n \t(((uint64_t)((fd)->simple.flc_hi) << 32) + (fd)->simple.flc_lo)\n #define DPAA2_GET_FD_ERR(fd) ((fd)->simple.ctrl & 0x000000FF)\n+#define DPAA2_GET_FD_FA_ERR(fd) ((fd)->simple.ctrl & 0x00000040)\n #define DPAA2_GET_FLE_OFFSET(fle) (((fle)->fin_bpid_offset & 0x0FFF0000) >> 16)\n #define DPAA2_SET_FLE_SG_EXT(fle) ((fle)->fin_bpid_offset |= (uint64_t)1 << 29)\n #define DPAA2_IS_SET_FLE_SG_EXT(fle)\t\\\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex 4b3eb7f5c9..412f970800 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -32,6 +32,7 @@\n #define DRIVER_LOOPBACK_MODE \"drv_loopback\"\n #define DRIVER_NO_PREFETCH_MODE \"drv_no_prefetch\"\n #define DRIVER_TX_CONF \"drv_tx_conf\"\n+#define DRIVER_ERROR_QUEUE \"drv_err_queue\"\n #define CHECK_INTERVAL 100 /* 100ms */\n #define MAX_REPEAT_TIME 90 /* 9s (90 * 100ms) in total */\n \n@@ -71,6 +72,9 @@ bool dpaa2_enable_ts[RTE_MAX_ETHPORTS];\n uint64_t dpaa2_timestamp_rx_dynflag;\n int dpaa2_timestamp_dynfield_offset = -1;\n \n+/* Enable error queue */\n+bool dpaa2_enable_err_queue;\n+\n struct rte_dpaa2_xstats_name_off {\n \tchar name[RTE_ETH_XSTATS_NAME_SIZE];\n \tuint8_t page_id; /* dpni statistics page id */\n@@ -391,6 +395,25 @@ dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)\n \t\t\tgoto fail;\n \t}\n \n+\tif (dpaa2_enable_err_queue) {\n+\t\tpriv->rx_err_vq = rte_zmalloc(\"dpni_rx_err\",\n+\t\t\tsizeof(struct dpaa2_queue), 0);\n+\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tdpaa2_q->q_storage = rte_malloc(\"err_dq_storage\",\n+\t\t\t\t\tsizeof(struct queue_storage_info_t) *\n+\t\t\t\t\tRTE_MAX_LCORE,\n+\t\t\t\t\tRTE_CACHE_LINE_SIZE);\n+\t\tif (!dpaa2_q->q_storage)\n+\t\t\tgoto fail;\n+\n+\t\tmemset(dpaa2_q->q_storage, 0,\n+\t\t sizeof(struct queue_storage_info_t));\n+\t\tfor (i = 0; i < RTE_MAX_LCORE; i++)\n+\t\t\tif (dpaa2_alloc_dq_storage(&dpaa2_q->q_storage[i]))\n+\t\t\t\tgoto fail;\n+\t}\n+\n \tfor (i = 0; i < priv->nb_tx_queues; i++) {\n \t\tmc_q->eth_data = dev->data;\n \t\tmc_q->flow_id = 0xffff;\n@@ -458,6 +481,14 @@ dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)\n \t\trte_free(dpaa2_q->q_storage);\n \t\tpriv->rx_vq[i--] = NULL;\n \t}\n+\n+\tif (dpaa2_enable_err_queue) {\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tif (dpaa2_q->q_storage)\n+\t\t\tdpaa2_free_dq_storage(dpaa2_q->q_storage);\n+\t\trte_free(dpaa2_q->q_storage);\n+\t}\n+\n \trte_free(mc_q);\n \treturn -1;\n }\n@@ -1163,11 +1194,31 @@ dpaa2_dev_start(struct rte_eth_dev *dev)\n \t\tdpaa2_q->fqid = qid.fqid;\n \t}\n \n-\t/*checksum errors, send them to normal path and set it in annotation */\n-\terr_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;\n-\terr_cfg.errors |= DPNI_ERROR_PHE;\n+\tif (dpaa2_enable_err_queue) {\n+\t\tret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,\n+\t\t\t\t DPNI_QUEUE_RX_ERR, 0, 0, &cfg, &qid);\n+\t\tif (ret) {\n+\t\t\tDPAA2_PMD_ERR(\"Error getting rx err flow information: err=%d\",\n+\t\t\t\t\t\tret);\n+\t\t\treturn ret;\n+\t\t}\n+\t\tdpaa2_q = (struct dpaa2_queue *)priv->rx_err_vq;\n+\t\tdpaa2_q->fqid = qid.fqid;\n+\t\tdpaa2_q->eth_data = dev->data;\n \n-\terr_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;\n+\t\terr_cfg.errors = DPNI_ERROR_DISC;\n+\t\terr_cfg.error_action = DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE;\n+\t} else {\n+\t\t/* checksum errors, send them to normal path\n+\t\t * and set it in annotation\n+\t\t */\n+\t\terr_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;\n+\n+\t\t/* if packet with parse error are not to be dropped */\n+\t\terr_cfg.errors |= DPNI_ERROR_PHE;\n+\n+\t\terr_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;\n+\t}\n \terr_cfg.set_frame_annotation = true;\n \n \tret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW,\n@@ -2624,6 +2675,11 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)\n \t\tDPAA2_PMD_INFO(\"TX_CONF Enabled\");\n \t}\n \n+\tif (dpaa2_get_devargs(dev->devargs, DRIVER_ERROR_QUEUE)) {\n+\t\tdpaa2_enable_err_queue = 1;\n+\t\tDPAA2_PMD_INFO(\"Enable error queue\");\n+\t}\n+\n \t/* Allocate memory for hardware structure for queues */\n \tret = dpaa2_alloc_rx_tx_queues(eth_dev);\n \tif (ret) {\n@@ -2863,5 +2919,6 @@ RTE_PMD_REGISTER_DPAA2(net_dpaa2, rte_dpaa2_pmd);\n RTE_PMD_REGISTER_PARAM_STRING(net_dpaa2,\n \t\tDRIVER_LOOPBACK_MODE \"=<int> \"\n \t\tDRIVER_NO_PREFETCH_MODE \"=<int>\"\n-\t\tDRIVER_TX_CONF \"=<int>\");\n+\t\tDRIVER_TX_CONF \"=<int>\"\n+\t\tDRIVER_ERROR_QUEUE \"=<int>\");\n RTE_LOG_REGISTER(dpaa2_logtype_pmd, pmd.net.dpaa2, NOTICE);\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h\nindex becdb50055..28341178e4 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.h\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.h\n@@ -1,7 +1,7 @@\n /* SPDX-License-Identifier: BSD-3-Clause\n *\n * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.\n- * Copyright 2016-2020 NXP\n+ * Copyright 2016-2021 NXP\n *\n */\n \n@@ -117,6 +117,8 @@ extern enum rte_filter_type dpaa2_filter_type;\n \n extern const struct rte_tm_ops dpaa2_tm_ops;\n \n+extern bool dpaa2_enable_err_queue;\n+\n #define IP_ADDRESS_OFFSET_INVALID (-1)\n \n struct dpaa2_key_info {\n@@ -154,6 +156,7 @@ struct dpaa2_dev_priv {\n \tvoid *tx_vq[MAX_TX_QUEUES];\n \tstruct dpaa2_bp_list *bp_list; /**<Attached buffer pool list */\n \tvoid *tx_conf_vq[MAX_TX_QUEUES];\n+\tvoid *rx_err_vq;\n \tuint8_t flags; /*dpaa2 config flags */\n \tuint8_t max_mac_filters;\n \tuint8_t max_vlan_filters;\ndiff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c\nindex 7deba3aed3..f40369e2c3 100644\n--- a/drivers/net/dpaa2/dpaa2_rxtx.c\n+++ b/drivers/net/dpaa2/dpaa2_rxtx.c\n@@ -14,6 +14,7 @@\n #include <rte_memcpy.h>\n #include <rte_string_fns.h>\n #include <rte_dev.h>\n+#include <rte_hexdump.h>\n \n #include <rte_fslmc.h>\n #include <fslmc_vfio.h>\n@@ -550,6 +551,93 @@ eth_copy_mbuf_to_fd(struct rte_mbuf *mbuf,\n return 0;\n }\n \n+static void\n+dump_err_pkts(struct dpaa2_queue *dpaa2_q)\n+{\n+\t/* Function receive frames for a given device and VQ */\n+\tstruct qbman_result *dq_storage;\n+\tuint32_t fqid = dpaa2_q->fqid;\n+\tint ret, num_rx = 0, num_pulled;\n+\tuint8_t pending, status;\n+\tstruct qbman_swp *swp;\n+\tconst struct qbman_fd *fd;\n+\tstruct qbman_pull_desc pulldesc;\n+\tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n+\tuint32_t lcore_id = rte_lcore_id();\n+\tvoid *v_addr, *hw_annot_addr;\n+\tstruct dpaa2_fas *fas;\n+\n+\tif (unlikely(!DPAA2_PER_LCORE_DPIO)) {\n+\t\tret = dpaa2_affine_qbman_swp();\n+\t\tif (ret) {\n+\t\t\tDPAA2_PMD_ERR(\"Failed to allocate IO portal, tid: %d\\n\",\n+\t\t\t\trte_gettid());\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\tswp = DPAA2_PER_LCORE_PORTAL;\n+\n+\tdq_storage = dpaa2_q->q_storage[lcore_id].dq_storage[0];\n+\tqbman_pull_desc_clear(&pulldesc);\n+\tqbman_pull_desc_set_fq(&pulldesc, fqid);\n+\tqbman_pull_desc_set_storage(&pulldesc, dq_storage,\n+\t\t\t(size_t)(DPAA2_VADDR_TO_IOVA(dq_storage)), 1);\n+\tqbman_pull_desc_set_numframes(&pulldesc, dpaa2_dqrr_size);\n+\n+\twhile (1) {\n+\t\tif (qbman_swp_pull(swp, &pulldesc)) {\n+\t\t\tDPAA2_PMD_DP_DEBUG(\"VDQ command is not issued.QBMAN is busy\\n\");\n+\t\t\t/* Portal was busy, try again */\n+\t\t\tcontinue;\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+\t/* Check if the previous issued command is completed. */\n+\twhile (!qbman_check_command_complete(dq_storage))\n+\t\t;\n+\n+\tnum_pulled = 0;\n+\tpending = 1;\n+\tdo {\n+\t\t/* Loop until the dq_storage is updated with\n+\t\t * new token by QBMAN\n+\t\t */\n+\t\twhile (!qbman_check_new_result(dq_storage))\n+\t\t\t;\n+\n+\t\t/* Check whether Last Pull command is Expired and\n+\t\t * setting Condition for Loop termination\n+\t\t */\n+\t\tif (qbman_result_DQ_is_pull_complete(dq_storage)) {\n+\t\t\tpending = 0;\n+\t\t\t/* Check for valid frame. */\n+\t\t\tstatus = qbman_result_DQ_flags(dq_storage);\n+\t\t\tif (unlikely((status &\n+\t\t\t\tQBMAN_DQ_STAT_VALIDFRAME) == 0))\n+\t\t\t\tcontinue;\n+\t\t}\n+\t\tfd = qbman_result_DQ_fd(dq_storage);\n+\t\tv_addr = DPAA2_IOVA_TO_VADDR(DPAA2_GET_FD_ADDR(fd));\n+\t\thw_annot_addr = (void *)((size_t)v_addr + DPAA2_FD_PTA_SIZE);\n+\t\tfas = hw_annot_addr;\n+\n+\t\tDPAA2_PMD_ERR(\"\\n\\n[%d] error packet on port[%d]:\"\n+\t\t\t\" fd_off: %d, fd_err: %x, fas_status: %x\",\n+\t\t\trte_lcore_id(), eth_data->port_id,\n+\t\t\tDPAA2_GET_FD_OFFSET(fd), DPAA2_GET_FD_ERR(fd),\n+\t\t\tfas->status);\n+\t\trte_hexdump(stderr, \"Error packet\", v_addr,\n+\t\t\tDPAA2_GET_FD_OFFSET(fd) + DPAA2_GET_FD_LEN(fd));\n+\n+\t\tdq_storage++;\n+\t\tnum_rx++;\n+\t\tnum_pulled++;\n+\t} while (pending);\n+\n+\tdpaa2_q->err_pkts += num_rx;\n+}\n+\n /* This function assumes that caller will be keep the same value for nb_pkts\n * across calls per queue, if that is not the case, better use non-prefetch\n * version of rx call.\n@@ -570,9 +658,10 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tstruct qbman_pull_desc pulldesc;\n \tstruct queue_storage_info_t *q_storage = dpaa2_q->q_storage;\n \tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n-#if defined(RTE_LIBRTE_IEEE1588)\n \tstruct dpaa2_dev_priv *priv = eth_data->dev_private;\n-#endif\n+\n+\tif (unlikely(dpaa2_enable_err_queue))\n+\t\tdump_err_pkts(priv->rx_err_vq);\n \n \tif (unlikely(!DPAA2_PER_LCORE_ETHRX_DPIO)) {\n \t\tret = dpaa2_affine_qbman_ethrx_swp();\n@@ -807,6 +896,10 @@ dpaa2_dev_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tconst struct qbman_fd *fd;\n \tstruct qbman_pull_desc pulldesc;\n \tstruct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;\n+\tstruct dpaa2_dev_priv *priv = eth_data->dev_private;\n+\n+\tif (unlikely(dpaa2_enable_err_queue))\n+\t\tdump_err_pkts(priv->rx_err_vq);\n \n \tif (unlikely(!DPAA2_PER_LCORE_DPIO)) {\n \t\tret = dpaa2_affine_qbman_swp();\n", "prefixes": [ "v2", "14/20" ] }{ "id": 87869, "url": "