get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 75511,
    "url": "http://patches.dpdk.org/api/patches/75511/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200813180121.19480-3-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": "<20200813180121.19480-3-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200813180121.19480-3-hemant.agrawal@nxp.com",
    "date": "2020-08-13T18:01:16",
    "name": "[v5,3/8] net/dpaa: add support for fmcless mode",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "61df4d19c5442b7be5c7b17dfc825cfe375137f4",
    "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/20200813180121.19480-3-hemant.agrawal@nxp.com/mbox/",
    "series": [
        {
            "id": 11643,
            "url": "http://patches.dpdk.org/api/series/11643/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11643",
            "date": "2020-08-13T18:01:15",
            "name": "[v5,1/8] net/dpaa: add support for fmlib in dpdk",
            "version": 5,
            "mbox": "http://patches.dpdk.org/series/11643/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/75511/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/75511/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E7903A04B0;\n\tThu, 13 Aug 2020 20:07:02 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 8A33F1C0CE;\n\tThu, 13 Aug 2020 20:06:53 +0200 (CEST)",
            "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by dpdk.org (Postfix) with ESMTP id 967D14CBD\n for <dev@dpdk.org>; Thu, 13 Aug 2020 20:06:50 +0200 (CEST)",
            "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 6DEF11A111B;\n Thu, 13 Aug 2020 20:06:50 +0200 (CEST)",
            "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 BD2BF1A0E36;\n Thu, 13 Aug 2020 20:06:48 +0200 (CEST)",
            "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 AF565402EB;\n Thu, 13 Aug 2020 20:06:46 +0200 (CEST)"
        ],
        "From": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com",
        "Date": "Thu, 13 Aug 2020 23:31:16 +0530",
        "Message-Id": "<20200813180121.19480-3-hemant.agrawal@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200813180121.19480-1-hemant.agrawal@nxp.com>",
        "References": "<20200811123001.30045-1-hemant.agrawal@nxp.com>\n <20200813180121.19480-1-hemant.agrawal@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH v5 3/8] net/dpaa: add support for fmcless mode",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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: Sachin Saxena <sachin.saxena@nxp.com>\n\nThis patch uses fmlib to configure the FMAN HW for flow\nand distribution configuration, thus avoiding the need\nfor static FMC tool execution optionally.\n\nSigned-off-by: Sachin Saxena <sachin.saxena@nxp.com>\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n drivers/bus/dpaa/include/fsl_qman.h       |   1 +\n drivers/bus/dpaa/rte_bus_dpaa_version.map |   1 +\n drivers/net/dpaa/Makefile                 |   1 +\n drivers/net/dpaa/dpaa_ethdev.c            | 111 ++-\n drivers/net/dpaa/dpaa_ethdev.h            |   4 +\n drivers/net/dpaa/dpaa_flow.c              | 901 ++++++++++++++++++++++\n drivers/net/dpaa/dpaa_flow.h              |  14 +\n drivers/net/dpaa/meson.build              |   1 +\n 8 files changed, 1012 insertions(+), 22 deletions(-)\n create mode 100644 drivers/net/dpaa/dpaa_flow.c\n create mode 100644 drivers/net/dpaa/dpaa_flow.h",
    "diff": "diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h\nindex 8ba37411af..dd7ca783a2 100644\n--- a/drivers/bus/dpaa/include/fsl_qman.h\n+++ b/drivers/bus/dpaa/include/fsl_qman.h\n@@ -1896,6 +1896,7 @@ int qman_enqueue_orp(struct qman_fq *fq, const struct qm_fd *fd, u32 flags,\n  * FQs than requested (though alignment will be as requested). If @partial is\n  * zero, the return value will either be 'count' or negative.\n  */\n+__rte_internal\n int qman_alloc_fqid_range(u32 *result, u32 count, u32 align, int partial);\n static inline int qman_alloc_fqid(u32 *result)\n {\ndiff --git a/drivers/bus/dpaa/rte_bus_dpaa_version.map b/drivers/bus/dpaa/rte_bus_dpaa_version.map\nindex 77840a5645..f47922c6a0 100644\n--- a/drivers/bus/dpaa/rte_bus_dpaa_version.map\n+++ b/drivers/bus/dpaa/rte_bus_dpaa_version.map\n@@ -49,6 +49,7 @@ INTERNAL {\n \tnetcfg_release;\n \tper_lcore_dpaa_io;\n \tqman_alloc_cgrid_range;\n+\tqman_alloc_fqid_range;\n \tqman_alloc_pool_range;\n \tqman_clear_irq;\n \tqman_create_cgr;\ndiff --git a/drivers/net/dpaa/Makefile b/drivers/net/dpaa/Makefile\nindex 5eaa4abcb5..28493ce9fa 100644\n--- a/drivers/net/dpaa/Makefile\n+++ b/drivers/net/dpaa/Makefile\n@@ -30,6 +30,7 @@ EXPORT_MAP := rte_pmd_dpaa_version.map\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += fmlib/fm_lib.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += fmlib/fm_vsp.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += dpaa_ethdev.c\n+SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += dpaa_flow.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += dpaa_rxtx.c\n \n LDLIBS += -lrte_bus_dpaa\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c\nindex c15e2b5462..c5b9ac1a5b 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.c\n+++ b/drivers/net/dpaa/dpaa_ethdev.c\n@@ -39,6 +39,7 @@\n \n #include <dpaa_ethdev.h>\n #include <dpaa_rxtx.h>\n+#include <dpaa_flow.h>\n #include <rte_pmd_dpaa.h>\n \n #include <fsl_usd.h>\n@@ -76,6 +77,7 @@ static uint64_t dev_tx_offloads_nodis =\n \n /* Keep track of whether QMAN and BMAN have been globally initialized */\n static int is_global_init;\n+static int fmc_q = 1;\t/* Indicates the use of static fmc for distribution */\n static int default_q;\t/* use default queue - FMC is not executed*/\n /* At present we only allow up to 4 push mode queues as default - as each of\n  * this queue need dedicated portal and we are short of portals.\n@@ -1418,16 +1420,15 @@ static int dpaa_rx_queue_init(struct qman_fq *fq, struct qman_cgr *cgr_rx,\n \t\t}\n \t};\n \n-\tif (fqid) {\n+\tif (fmc_q || default_q) {\n \t\tret = qman_reserve_fqid(fqid);\n \t\tif (ret) {\n-\t\t\tDPAA_PMD_ERR(\"reserve rx fqid 0x%x failed with ret: %d\",\n+\t\t\tDPAA_PMD_ERR(\"reserve rx fqid 0x%x failed, ret: %d\",\n \t\t\t\t     fqid, ret);\n \t\t\treturn -EINVAL;\n \t\t}\n-\t} else {\n-\t\tflags |= QMAN_FQ_FLAG_DYNAMIC_FQID;\n \t}\n+\n \tDPAA_PMD_DEBUG(\"creating rx fq %p, fqid 0x%x\", fq, fqid);\n \tret = qman_create_fq(fqid, flags, fq);\n \tif (ret) {\n@@ -1602,7 +1603,7 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\n \tstruct fman_if_bpool *bp, *tmp_bp;\n \tuint32_t cgrid[DPAA_MAX_NUM_PCD_QUEUES];\n \tuint32_t cgrid_tx[MAX_DPAA_CORES];\n-\tchar eth_buf[RTE_ETHER_ADDR_FMT_SIZE];\n+\tuint32_t dev_rx_fqids[DPAA_MAX_NUM_PCD_QUEUES];\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -1619,30 +1620,36 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\n \tdpaa_intf->ifid = dev_id;\n \tdpaa_intf->cfg = cfg;\n \n+\tmemset((char *)dev_rx_fqids, 0,\n+\t\tsizeof(uint32_t) * DPAA_MAX_NUM_PCD_QUEUES);\n+\n \t/* Initialize Rx FQ's */\n \tif (default_q) {\n \t\tnum_rx_fqs = DPAA_DEFAULT_NUM_PCD_QUEUES;\n+\t} else if (fmc_q) {\n+\t\tnum_rx_fqs = 1;\n \t} else {\n-\t\tif (getenv(\"DPAA_NUM_RX_QUEUES\"))\n-\t\t\tnum_rx_fqs = atoi(getenv(\"DPAA_NUM_RX_QUEUES\"));\n-\t\telse\n-\t\t\tnum_rx_fqs = DPAA_DEFAULT_NUM_PCD_QUEUES;\n+\t\t/* FMCLESS mode, load balance to multiple cores.*/\n+\t\tnum_rx_fqs = rte_lcore_count();\n \t}\n \n-\n \t/* Each device can not have more than DPAA_MAX_NUM_PCD_QUEUES RX\n \t * queues.\n \t */\n-\tif (num_rx_fqs <= 0 || num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) {\n+\tif (num_rx_fqs < 0 || num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) {\n \t\tDPAA_PMD_ERR(\"Invalid number of RX queues\\n\");\n \t\treturn -EINVAL;\n \t}\n \n-\tdpaa_intf->rx_queues = rte_zmalloc(NULL,\n-\t\tsizeof(struct qman_fq) * num_rx_fqs, MAX_CACHELINE);\n-\tif (!dpaa_intf->rx_queues) {\n-\t\tDPAA_PMD_ERR(\"Failed to alloc mem for RX queues\\n\");\n-\t\treturn -ENOMEM;\n+\tif (num_rx_fqs > 0) {\n+\t\tdpaa_intf->rx_queues = rte_zmalloc(NULL,\n+\t\t\tsizeof(struct qman_fq) * num_rx_fqs, MAX_CACHELINE);\n+\t\tif (!dpaa_intf->rx_queues) {\n+\t\t\tDPAA_PMD_ERR(\"Failed to alloc mem for RX queues\\n\");\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t} else {\n+\t\tdpaa_intf->rx_queues = NULL;\n \t}\n \n \tmemset(cgrid, 0, sizeof(cgrid));\n@@ -1661,7 +1668,7 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\n \t}\n \n \t/* If congestion control is enabled globally*/\n-\tif (td_threshold) {\n+\tif (num_rx_fqs > 0 && td_threshold) {\n \t\tdpaa_intf->cgr_rx = rte_zmalloc(NULL,\n \t\t\tsizeof(struct qman_cgr) * num_rx_fqs, MAX_CACHELINE);\n \t\tif (!dpaa_intf->cgr_rx) {\n@@ -1680,12 +1687,20 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\n \t\tdpaa_intf->cgr_rx = NULL;\n \t}\n \n+\tif (!fmc_q && !default_q) {\n+\t\tret = qman_alloc_fqid_range(dev_rx_fqids, num_rx_fqs,\n+\t\t\t\t\t    num_rx_fqs, 0);\n+\t\tif (ret < 0) {\n+\t\t\tDPAA_PMD_ERR(\"Failed to alloc rx fqid's\\n\");\n+\t\t\tgoto free_rx;\n+\t\t}\n+\t}\n+\n \tfor (loop = 0; loop < num_rx_fqs; loop++) {\n \t\tif (default_q)\n \t\t\tfqid = cfg->rx_def;\n \t\telse\n-\t\t\tfqid = DPAA_PCD_FQID_START + fman_intf->mac_idx *\n-\t\t\t\tDPAA_PCD_FQID_MULTIPLIER + loop;\n+\t\t\tfqid = dev_rx_fqids[loop];\n \n \t\tif (dpaa_intf->cgr_rx)\n \t\t\tdpaa_intf->cgr_rx[loop].cgrid = cgrid[loop];\n@@ -1782,9 +1797,16 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\n \n \t/* copy the primary mac address */\n \trte_ether_addr_copy(&fman_intf->mac_addr, &eth_dev->data->mac_addrs[0]);\n-\trte_ether_format_addr(eth_buf, sizeof(eth_buf), &fman_intf->mac_addr);\n \n-\tDPAA_PMD_INFO(\"net: dpaa: %s: %s\", dpaa_device->name, eth_buf);\n+\tRTE_LOG(INFO, PMD, \"net: dpaa: %s: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n+\t\tdpaa_device->name,\n+\t\tfman_intf->mac_addr.addr_bytes[0],\n+\t\tfman_intf->mac_addr.addr_bytes[1],\n+\t\tfman_intf->mac_addr.addr_bytes[2],\n+\t\tfman_intf->mac_addr.addr_bytes[3],\n+\t\tfman_intf->mac_addr.addr_bytes[4],\n+\t\tfman_intf->mac_addr.addr_bytes[5]);\n+\n \n \t/* Disable RX mode */\n \tfman_if_discard_rx_errors(fman_intf);\n@@ -1831,6 +1853,12 @@ dpaa_dev_uninit(struct rte_eth_dev *dev)\n \t\treturn -1;\n \t}\n \n+\t/* DPAA FM deconfig */\n+\tif (!(default_q || fmc_q)) {\n+\t\tif (dpaa_fm_deconfig(dpaa_intf, dev->process_private))\n+\t\t\tDPAA_PMD_WARN(\"DPAA FM deconfig failed\\n\");\n+\t}\n+\n \tdpaa_eth_dev_close(dev);\n \n \t/* release configuration memory */\n@@ -1874,7 +1902,7 @@ dpaa_dev_uninit(struct rte_eth_dev *dev)\n }\n \n static int\n-rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv __rte_unused,\n+rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,\n \t       struct rte_dpaa_device *dpaa_dev)\n {\n \tint diag;\n@@ -1920,6 +1948,13 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv __rte_unused,\n \t\t\tdefault_q = 1;\n \t\t}\n \n+\t\tif (!(default_q || fmc_q)) {\n+\t\t\tif (dpaa_fm_init()) {\n+\t\t\t\tDPAA_PMD_ERR(\"FM init failed\\n\");\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\n \t\t/* disabling the default push mode for LS1043 */\n \t\tif (dpaa_svr_family == SVR_LS1043A_FAMILY)\n \t\t\tdpaa_push_mode_max_queue = 0;\n@@ -1993,6 +2028,38 @@ rte_dpaa_remove(struct rte_dpaa_device *dpaa_dev)\n \treturn 0;\n }\n \n+static void __attribute__((destructor(102))) dpaa_finish(void)\n+{\n+\t/* For secondary, primary will do all the cleanup */\n+\tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n+\t\treturn;\n+\n+\tif (!(default_q || fmc_q)) {\n+\t\tunsigned int i;\n+\n+\t\tfor (i = 0; i < RTE_MAX_ETHPORTS; i++) {\n+\t\t\tif (rte_eth_devices[i].dev_ops == &dpaa_devops) {\n+\t\t\t\tstruct rte_eth_dev *dev = &rte_eth_devices[i];\n+\t\t\t\tstruct dpaa_if *dpaa_intf =\n+\t\t\t\t\tdev->data->dev_private;\n+\t\t\t\tstruct fman_if *fif =\n+\t\t\t\t\tdev->process_private;\n+\t\t\t\tif (dpaa_intf->port_handle)\n+\t\t\t\t\tif (dpaa_fm_deconfig(dpaa_intf, fif))\n+\t\t\t\t\t\tDPAA_PMD_WARN(\"DPAA FM \"\n+\t\t\t\t\t\t\t\"deconfig failed\\n\");\n+\t\t\t}\n+\t\t}\n+\t\tif (is_global_init)\n+\t\t\tif (dpaa_fm_term())\n+\t\t\t\tDPAA_PMD_WARN(\"DPAA FM term failed\\n\");\n+\n+\t\tis_global_init = 0;\n+\n+\t\tDPAA_PMD_INFO(\"DPAA fman cleaned up\");\n+\t}\n+}\n+\n static struct rte_dpaa_driver rte_dpaa_pmd = {\n \t.drv_flags = RTE_DPAA_DRV_INTR_LSC,\n \t.drv_type = FSL_DPAA_ETH,\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.h b/drivers/net/dpaa/dpaa_ethdev.h\nindex 4c40ff86a8..b10c4a20ba 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.h\n+++ b/drivers/net/dpaa/dpaa_ethdev.h\n@@ -118,6 +118,10 @@ struct dpaa_if {\n \tuint32_t ifid;\n \tstruct dpaa_bp_info *bp_info;\n \tstruct rte_eth_fc_conf *fc_conf;\n+\tvoid *port_handle;\n+\tvoid *netenv_handle;\n+\tvoid *scheme_handle[2];\n+\tuint32_t scheme_count;\n };\n \n struct dpaa_if_stats {\ndiff --git a/drivers/net/dpaa/dpaa_flow.c b/drivers/net/dpaa/dpaa_flow.c\nnew file mode 100644\nindex 0000000000..a12141efe4\n--- /dev/null\n+++ b/drivers/net/dpaa/dpaa_flow.c\n@@ -0,0 +1,901 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2017-2019 NXP\n+ */\n+\n+/* System headers */\n+#include <stdio.h>\n+#include <inttypes.h>\n+#include <unistd.h>\n+#include <sys/types.h>\n+\n+#include <dpaa_ethdev.h>\n+#include <dpaa_flow.h>\n+#include <rte_dpaa_logs.h>\n+#include <fmlib/fm_port_ext.h>\n+\n+#define DPAA_MAX_NUM_ETH_DEV\t8\n+\n+static inline\n+ioc_fm_pcd_extract_entry_t *\n+SCH_EXT_ARR(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+return &scheme_params->param.key_ext_and_hash.extract_array[hdr_idx];\n+}\n+\n+#define SCH_EXT_HDR(scheme_params, hdr_idx) \\\n+\tSCH_EXT_ARR(scheme_params, hdr_idx)->extract_params.extract_by_hdr\n+\n+#define SCH_EXT_FULL_FLD(scheme_params, hdr_idx) \\\n+\tSCH_EXT_HDR(scheme_params, hdr_idx).extract_by_hdr_type.full_field\n+\n+/* FM global info */\n+struct dpaa_fm_info {\n+\tt_handle fman_handle;\n+\tt_handle pcd_handle;\n+};\n+\n+/*FM model to read and write from file */\n+struct dpaa_fm_model {\n+\tuint32_t dev_count;\n+\tuint8_t device_order[DPAA_MAX_NUM_ETH_DEV];\n+\tt_fm_port_params fm_port_params[DPAA_MAX_NUM_ETH_DEV];\n+\tt_handle netenv_devid[DPAA_MAX_NUM_ETH_DEV];\n+\tt_handle scheme_devid[DPAA_MAX_NUM_ETH_DEV][2];\n+};\n+\n+static struct dpaa_fm_info fm_info;\n+static struct dpaa_fm_model fm_model;\n+static const char *fm_log = \"/tmp/fmdpdk.bin\";\n+\n+static void fm_prev_cleanup(void)\n+{\n+\tuint32_t fman_id = 0, i = 0, devid;\n+\tstruct dpaa_if dpaa_intf = {0};\n+\tt_fm_pcd_params fm_pcd_params = {0};\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tfm_info.fman_handle = fm_open(fman_id);\n+\tif (!fm_info.fman_handle) {\n+\t\tprintf(\"\\n%s- unable to open FMAN\", __func__);\n+\t\treturn;\n+\t}\n+\n+\tfm_pcd_params.h_fm = fm_info.fman_handle;\n+\tfm_pcd_params.prs_support = true;\n+\tfm_pcd_params.kg_support = true;\n+\t/* FM PCD Open */\n+\tfm_info.pcd_handle = fm_pcd_open(&fm_pcd_params);\n+\tif (!fm_info.pcd_handle) {\n+\t\tprintf(\"\\n%s- unable to open PCD\", __func__);\n+\t\treturn;\n+\t}\n+\n+\twhile (i < fm_model.dev_count) {\n+\t\tdevid = fm_model.device_order[i];\n+\t\t/* FM Port Open */\n+\t\tfm_model.fm_port_params[devid].h_fm = fm_info.fman_handle;\n+\t\tdpaa_intf.port_handle =\n+\t\t\t\tfm_port_open(&fm_model.fm_port_params[devid]);\n+\t\tdpaa_intf.scheme_handle[0] = create_device(fm_info.pcd_handle,\n+\t\t\t\t\tfm_model.scheme_devid[devid][0]);\n+\t\tdpaa_intf.scheme_count = 1;\n+\t\tif (fm_model.scheme_devid[devid][1]) {\n+\t\t\tdpaa_intf.scheme_handle[1] =\n+\t\t\t\tcreate_device(fm_info.pcd_handle,\n+\t\t\t\t\tfm_model.scheme_devid[devid][1]);\n+\t\t\tif (dpaa_intf.scheme_handle[1])\n+\t\t\t\tdpaa_intf.scheme_count++;\n+\t\t}\n+\n+\t\tdpaa_intf.netenv_handle = create_device(fm_info.pcd_handle,\n+\t\t\t\t\tfm_model.netenv_devid[devid]);\n+\t\ti++;\n+\t\tif (!dpaa_intf.netenv_handle ||\n+\t\t\t!dpaa_intf.scheme_handle[0] ||\n+\t\t\t!dpaa_intf.port_handle)\n+\t\t\tcontinue;\n+\n+\t\tif (dpaa_fm_deconfig(&dpaa_intf, NULL))\n+\t\t\tprintf(\"\\nDPAA FM deconfig failed\\n\");\n+\t}\n+\n+\tif (dpaa_fm_term())\n+\t\tprintf(\"\\nDPAA FM term failed\\n\");\n+\n+\tmemset(&fm_model, 0, sizeof(struct dpaa_fm_model));\n+}\n+\n+void dpaa_write_fm_config_to_file(void)\n+{\n+\tsize_t bytes_write;\n+\tFILE *fp = fopen(fm_log, \"wb\");\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (!fp) {\n+\t\tDPAA_PMD_ERR(\"File open failed\");\n+\t\treturn;\n+\t}\n+\tbytes_write = fwrite(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);\n+\tif (!bytes_write) {\n+\t\tDPAA_PMD_WARN(\"No bytes write\");\n+\t\tfclose(fp);\n+\t\treturn;\n+\t}\n+\tfclose(fp);\n+}\n+\n+static void dpaa_read_fm_config_from_file(void)\n+{\n+\tsize_t bytes_read;\n+\tFILE *fp = fopen(fm_log, \"rb\");\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (!fp)\n+\t\treturn;\n+\tDPAA_PMD_INFO(\"Previous DPDK-FM config instance present, cleaning up.\");\n+\n+\tbytes_read = fread(&fm_model, sizeof(struct dpaa_fm_model), 1, fp);\n+\tif (!bytes_read) {\n+\t\tDPAA_PMD_WARN(\"No bytes read\");\n+\t\tfclose(fp);\n+\t\treturn;\n+\t}\n+\tfclose(fp);\n+\n+\t/*FM cleanup from previous configured app */\n+\tfm_prev_cleanup();\n+}\n+\n+static inline int\n+set_hash_params_eth(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\tHEADER_TYPE_ETH;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =\n+\t\t\t\t\t\tIOC_NET_HF_ETH_SA;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).eth =\n+\t\t\t\t\t\tIOC_NET_HF_ETH_DA;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+static inline int\n+set_hash_params_ipv4(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\tHEADER_TYPE_IPV4;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =\n+\t\t\t\t\tioc_net_hf_ipv_4_src_ip;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv4 =\n+\t\t\t\t\tioc_net_hf_ipv_4_dst_ip;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+static inline int\n+set_hash_params_ipv6(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\t\tHEADER_TYPE_IPV6;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =\n+\t\t\t\t\tioc_net_hf_ipv_6_src_ip;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).ipv6 =\n+\t\t\t\t\tioc_net_hf_ipv_6_dst_ip;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+static inline int\n+set_hash_params_udp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\tHEADER_TYPE_UDP;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =\n+\t\t\t\t\tIOC_NET_HF_UDP_PORT_SRC;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).udp =\n+\t\t\t\t\tIOC_NET_HF_UDP_PORT_DST;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+static inline int\n+set_hash_params_tcp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\tHEADER_TYPE_TCP;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =\n+\t\t\t\t\tIOC_NET_HF_TCP_PORT_SRC;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).tcp =\n+\t\t\t\t\tIOC_NET_HF_TCP_PORT_DST;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+static inline int\n+set_hash_params_sctp(ioc_fm_pcd_kg_scheme_params_t *scheme_params, int hdr_idx)\n+{\n+\tint k;\n+\n+\tfor (k = 0; k < 2; k++) {\n+\t\tSCH_EXT_ARR(scheme_params, hdr_idx)->type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_BY_HDR;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr =\n+\t\t\t\t\t\tHEADER_TYPE_SCTP;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).hdr_index =\n+\t\t\t\t\t\te_IOC_FM_PCD_HDR_INDEX_NONE;\n+\t\tSCH_EXT_HDR(scheme_params, hdr_idx).type =\n+\t\t\t\t\t\te_IOC_FM_PCD_EXTRACT_FULL_FIELD;\n+\t\tif (k == 0)\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =\n+\t\t\t\t\tIOC_NET_HF_SCTP_PORT_SRC;\n+\t\telse\n+\t\t\tSCH_EXT_FULL_FLD(scheme_params, hdr_idx).sctp =\n+\t\t\t\t\tIOC_NET_HF_SCTP_PORT_DST;\n+\t\thdr_idx++;\n+\t}\n+\treturn hdr_idx;\n+}\n+\n+/* Set scheme params for hash distribution */\n+static int set_scheme_params(ioc_fm_pcd_kg_scheme_params_t *scheme_params,\n+\tioc_fm_pcd_net_env_params_t *dist_units,\n+\tstruct dpaa_if *dpaa_intf,\n+\tstruct fman_if *fif __rte_unused)\n+{\n+\tint dist_idx, hdr_idx = 0;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tscheme_params->param.use_hash = 1;\n+\tscheme_params->param.modify = false;\n+\tscheme_params->param.always_direct = false;\n+\tscheme_params->param.scheme_counter.update = 1;\n+\tscheme_params->param.scheme_counter.value = 0;\n+\tscheme_params->param.next_engine = e_IOC_FM_PCD_DONE;\n+\tscheme_params->param.base_fqid = dpaa_intf->rx_queues[0].fqid;\n+\tscheme_params->param.net_env_params.net_env_id =\n+\t\tdpaa_intf->netenv_handle;\n+\tscheme_params->param.net_env_params.num_of_distinction_units =\n+\t\tdist_units->param.num_of_distinction_units;\n+\n+\tscheme_params->param.key_ext_and_hash.hash_dist_num_of_fqids =\n+\t\t\tdpaa_intf->nb_rx_queues;\n+\tscheme_params->param.key_ext_and_hash.num_of_used_extracts =\n+\t\t\t2 * dist_units->param.num_of_distinction_units;\n+\n+\tfor (dist_idx = 0; dist_idx <\n+\t\tdist_units->param.num_of_distinction_units;\n+\t\tdist_idx++) {\n+\t\tswitch (dist_units->param.units[dist_idx].hdrs[0].hdr) {\n+\t\tcase HEADER_TYPE_ETH:\n+\t\t\thdr_idx = set_hash_params_eth(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tcase HEADER_TYPE_IPV4:\n+\t\t\thdr_idx = set_hash_params_ipv4(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tcase HEADER_TYPE_IPV6:\n+\t\t\thdr_idx = set_hash_params_ipv6(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tcase HEADER_TYPE_UDP:\n+\t\t\thdr_idx = set_hash_params_udp(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tcase HEADER_TYPE_TCP:\n+\t\t\thdr_idx = set_hash_params_tcp(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tcase HEADER_TYPE_SCTP:\n+\t\t\thdr_idx = set_hash_params_sctp(scheme_params, hdr_idx);\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\tDPAA_PMD_ERR(\"Invalid Distinction Unit\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void set_dist_units(ioc_fm_pcd_net_env_params_t *dist_units,\n+\t\t\t   uint64_t req_dist_set)\n+{\n+\tuint32_t loop = 0, dist_idx = 0, dist_field = 0;\n+\tint l2_configured = 0, ipv4_configured = 0, ipv6_configured = 0;\n+\tint udp_configured = 0, tcp_configured = 0, sctp_configured = 0;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (!req_dist_set)\n+\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr =\n+\t\t\tHEADER_TYPE_ETH;\n+\n+\twhile (req_dist_set) {\n+\t\tif (req_dist_set % 2 != 0) {\n+\t\t\tdist_field = 1U << loop;\n+\t\t\tswitch (dist_field) {\n+\t\t\tcase ETH_RSS_L2_PAYLOAD:\n+\n+\t\t\t\tif (l2_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tl2_configured = 1;\n+\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_ETH;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_IPV4:\n+\t\t\tcase ETH_RSS_FRAG_IPV4:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_OTHER:\n+\n+\t\t\t\tif (ipv4_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tipv4_configured = 1;\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_IPV4;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_IPV6:\n+\t\t\tcase ETH_RSS_FRAG_IPV6:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_OTHER:\n+\t\t\tcase ETH_RSS_IPV6_EX:\n+\n+\t\t\t\tif (ipv6_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tipv6_configured = 1;\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_IPV6;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_TCP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_TCP:\n+\t\t\tcase ETH_RSS_IPV6_TCP_EX:\n+\n+\t\t\t\tif (tcp_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\ttcp_configured = 1;\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_TCP;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_UDP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_UDP:\n+\t\t\tcase ETH_RSS_IPV6_UDP_EX:\n+\n+\t\t\t\tif (udp_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tudp_configured = 1;\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_UDP;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_SCTP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_SCTP:\n+\n+\t\t\t\tif (sctp_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tsctp_configured = 1;\n+\n+\t\t\t\tdist_units->param.units[dist_idx++].hdrs[0].hdr\n+\t\t\t\t\t= HEADER_TYPE_SCTP;\n+\t\t\t\tbreak;\n+\n+\t\t\tdefault:\n+\t\t\t\tDPAA_PMD_ERR(\"Bad flow distribution option\");\n+\t\t\t}\n+\t\t}\n+\t\treq_dist_set = req_dist_set >> 1;\n+\t\tloop++;\n+\t}\n+\n+\t/* Dist units is set to dist_idx */\n+\tdist_units->param.num_of_distinction_units = dist_idx;\n+}\n+\n+/* Apply PCD configuration on interface */\n+static inline int set_port_pcd(struct dpaa_if *dpaa_intf)\n+{\n+\tint ret = 0;\n+\tunsigned int idx;\n+\tioc_fm_port_pcd_params_t pcd_param;\n+\tioc_fm_port_pcd_prs_params_t prs_param;\n+\tioc_fm_port_pcd_kg_params_t  kg_param;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* PCD support for hash distribution */\n+\tuint8_t pcd_support = e_FM_PORT_PCD_SUPPORT_PRS_AND_KG;\n+\n+\tmemset(&pcd_param, 0, sizeof(pcd_param));\n+\tmemset(&prs_param, 0, sizeof(prs_param));\n+\tmemset(&kg_param, 0, sizeof(kg_param));\n+\n+\t/* Set parse params */\n+\tprs_param.first_prs_hdr = HEADER_TYPE_ETH;\n+\n+\t/* Set kg params */\n+\tfor (idx = 0; idx < dpaa_intf->scheme_count; idx++)\n+\t\tkg_param.scheme_ids[idx] = dpaa_intf->scheme_handle[idx];\n+\tkg_param.num_schemes = dpaa_intf->scheme_count;\n+\n+\t/* Set pcd params */\n+\tpcd_param.net_env_id = dpaa_intf->netenv_handle;\n+\tpcd_param.pcd_support = pcd_support;\n+\tpcd_param.p_kg_params = &kg_param;\n+\tpcd_param.p_prs_params = &prs_param;\n+\n+\t/* FM PORT Disable */\n+\tret = fm_port_disable(dpaa_intf->port_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_disable: Failed\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* FM PORT SetPCD */\n+\tret = fm_port_set_pcd(dpaa_intf->port_handle, &pcd_param);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_set_pcd: Failed\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* FM PORT Enable */\n+\tret = fm_port_enable(dpaa_intf->port_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_enable: Failed\");\n+\t\tgoto fm_port_delete_pcd;\n+\t}\n+\n+\treturn 0;\n+\n+fm_port_delete_pcd:\n+\t/* FM PORT DeletePCD */\n+\tret = fm_port_delete_pcd(dpaa_intf->port_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_delete_pcd: Failed\\n\");\n+\t\treturn ret;\n+\t}\n+\treturn -1;\n+}\n+\n+/* Unset PCD NerEnv and scheme */\n+static inline void unset_pcd_netenv_scheme(struct dpaa_if *dpaa_intf)\n+{\n+\tint ret;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* reduce scheme count */\n+\tif (dpaa_intf->scheme_count)\n+\t\tdpaa_intf->scheme_count--;\n+\n+\tDPAA_PMD_DEBUG(\"KG SCHEME DEL %d handle =%p\",\n+\t\tdpaa_intf->scheme_count,\n+\t\tdpaa_intf->scheme_handle[dpaa_intf->scheme_count]);\n+\n+\tret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle\n+\t\t\t\t\t[dpaa_intf->scheme_count]);\n+\tif (ret != E_OK)\n+\t\tDPAA_PMD_ERR(\"fm_pcd_kg_scheme_delete: Failed\");\n+\n+\tdpaa_intf->scheme_handle[dpaa_intf->scheme_count] = NULL;\n+}\n+\n+/* Set PCD NetEnv and Scheme and default scheme */\n+static inline int set_default_scheme(struct dpaa_if *dpaa_intf)\n+{\n+\tioc_fm_pcd_kg_scheme_params_t scheme_params;\n+\tint idx = dpaa_intf->scheme_count;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* Set PCD NetEnvCharacteristics */\n+\tmemset(&scheme_params, 0, sizeof(scheme_params));\n+\n+\t/* Adding 10 to default schemes as the number of interface would be\n+\t * lesser than 10 and the relative scheme ids should be unique for\n+\t * every scheme.\n+\t */\n+\tscheme_params.param.scm_id.relative_scheme_id =\n+\t\t10 + dpaa_intf->ifid;\n+\tscheme_params.param.use_hash = 0;\n+\tscheme_params.param.next_engine = e_IOC_FM_PCD_DONE;\n+\tscheme_params.param.net_env_params.num_of_distinction_units = 0;\n+\tscheme_params.param.net_env_params.net_env_id =\n+\t\tdpaa_intf->netenv_handle;\n+\tscheme_params.param.base_fqid = dpaa_intf->rx_queues[0].fqid;\n+\tscheme_params.param.key_ext_and_hash.hash_dist_num_of_fqids = 1;\n+\tscheme_params.param.key_ext_and_hash.num_of_used_extracts = 0;\n+\tscheme_params.param.modify = false;\n+\tscheme_params.param.always_direct = false;\n+\tscheme_params.param.scheme_counter.update = 1;\n+\tscheme_params.param.scheme_counter.value = 0;\n+\n+\t/* FM PCD KgSchemeSet */\n+\tdpaa_intf->scheme_handle[idx] =\n+\t\tfm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);\n+\tDPAA_PMD_DEBUG(\"KG SCHEME SET %d handle =%p\",\n+\t\tidx, dpaa_intf->scheme_handle[idx]);\n+\tif (!dpaa_intf->scheme_handle[idx]) {\n+\t\tDPAA_PMD_ERR(\"fm_pcd_kg_scheme_set: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\tfm_model.scheme_devid[dpaa_intf->ifid][idx] =\n+\t\t\t\tget_device_id(dpaa_intf->scheme_handle[idx]);\n+\tdpaa_intf->scheme_count++;\n+\treturn 0;\n+}\n+\n+\n+/* Set PCD NetEnv and Scheme and default scheme */\n+static inline int set_pcd_netenv_scheme(struct dpaa_if *dpaa_intf,\n+\t\t\t\t\tuint64_t req_dist_set,\n+\t\t\t\t\tstruct fman_if *fif)\n+{\n+\tint ret = -1;\n+\tioc_fm_pcd_net_env_params_t dist_units;\n+\tioc_fm_pcd_kg_scheme_params_t scheme_params;\n+\tint idx = dpaa_intf->scheme_count;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* Set PCD NetEnvCharacteristics */\n+\tmemset(&dist_units, 0, sizeof(dist_units));\n+\tmemset(&scheme_params, 0, sizeof(scheme_params));\n+\n+\t/* Set dist unit header type */\n+\tset_dist_units(&dist_units, req_dist_set);\n+\n+\tscheme_params.param.scm_id.relative_scheme_id = dpaa_intf->ifid;\n+\n+\t/* Set PCD Scheme params */\n+\tret = set_scheme_params(&scheme_params, &dist_units, dpaa_intf, fif);\n+\tif (ret) {\n+\t\tDPAA_PMD_ERR(\"Set scheme params: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\t/* FM PCD KgSchemeSet */\n+\tdpaa_intf->scheme_handle[idx] =\n+\t\tfm_pcd_kg_scheme_set(fm_info.pcd_handle, &scheme_params);\n+\tDPAA_PMD_DEBUG(\"KG SCHEME SET %d handle =%p\",\n+\t\t\tidx, dpaa_intf->scheme_handle[idx]);\n+\tif (!dpaa_intf->scheme_handle[idx]) {\n+\t\tDPAA_PMD_ERR(\"fm_pcd_kg_scheme_set: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\tfm_model.scheme_devid[dpaa_intf->ifid][idx] =\n+\t\t\t\tget_device_id(dpaa_intf->scheme_handle[idx]);\n+\tdpaa_intf->scheme_count++;\n+\treturn 0;\n+}\n+\n+\n+static inline int get_port_type(struct fman_if *fif)\n+{\n+\tif (fif->mac_type == fman_mac_1g)\n+\t\treturn e_FM_PORT_TYPE_RX;\n+\telse if (fif->mac_type == fman_mac_2_5g)\n+\t\treturn e_FM_PORT_TYPE_RX_2_5G;\n+\telse if (fif->mac_type == fman_mac_10g)\n+\t\treturn e_FM_PORT_TYPE_RX_10G;\n+\n+\tDPAA_PMD_ERR(\"MAC type unsupported\");\n+\treturn -1;\n+}\n+\n+static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,\n+\t\t\t\t     uint64_t req_dist_set,\n+\t\t\t\t     struct fman_if *fif)\n+{\n+\tt_fm_port_params\tfm_port_params;\n+\tioc_fm_pcd_net_env_params_t dist_units;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* FMAN mac indexes mappings (0 is unused,\n+\t * first 8 are for 1G, next for 10G ports\n+\t */\n+\tuint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};\n+\n+\t/* Memset FM port params */\n+\tmemset(&fm_port_params, 0, sizeof(fm_port_params));\n+\n+\t/* Set FM port params */\n+\tfm_port_params.h_fm = fm_info.fman_handle;\n+\tfm_port_params.port_type = get_port_type(fif);\n+\tfm_port_params.port_id = mac_idx[fif->mac_idx];\n+\n+\t/* FM PORT Open */\n+\tdpaa_intf->port_handle = fm_port_open(&fm_port_params);\n+\tif (!dpaa_intf->port_handle) {\n+\t\tDPAA_PMD_ERR(\"fm_port_open: Failed\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tfm_model.fm_port_params[dpaa_intf->ifid] = fm_port_params;\n+\n+\t/* Set PCD NetEnvCharacteristics */\n+\tmemset(&dist_units, 0, sizeof(dist_units));\n+\n+\t/* Set dist unit header type */\n+\tset_dist_units(&dist_units, req_dist_set);\n+\n+\t/* FM PCD NetEnvCharacteristicsSet */\n+\tdpaa_intf->netenv_handle =\n+\t\tfm_pcd_net_env_characteristics_set(fm_info.pcd_handle,\n+\t\t\t\t\t\t\t&dist_units);\n+\tif (!dpaa_intf->netenv_handle) {\n+\t\tDPAA_PMD_ERR(\"fm_pcd_net_env_characteristics_set: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\tfm_model.netenv_devid[dpaa_intf->ifid] =\n+\t\t\t\tget_device_id(dpaa_intf->netenv_handle);\n+\n+\treturn 0;\n+}\n+\n+/* De-Configure DPAA FM */\n+int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf,\n+\t\t\tstruct fman_if *fif __rte_unused)\n+{\n+\tint ret;\n+\tunsigned int idx;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\t/* FM PORT Disable */\n+\tret = fm_port_disable(dpaa_intf->port_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_disable: Failed\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* FM PORT DeletePCD */\n+\tret = fm_port_delete_pcd(dpaa_intf->port_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_port_delete_pcd: Failed\");\n+\t\treturn ret;\n+\t}\n+\n+\tfor (idx = 0; idx < dpaa_intf->scheme_count; idx++) {\n+\t\tDPAA_PMD_DEBUG(\"KG SCHEME DEL %d, handle =%p\",\n+\t\t\tidx, dpaa_intf->scheme_handle[idx]);\n+\t\t/* FM PCD KgSchemeDelete */\n+\t\tret = fm_pcd_kg_scheme_delete(dpaa_intf->scheme_handle[idx]);\n+\t\tif (ret != E_OK) {\n+\t\t\tDPAA_PMD_ERR(\"fm_pcd_kg_scheme_delete: Failed\");\n+\t\t\treturn ret;\n+\t\t}\n+\t\tdpaa_intf->scheme_handle[idx] = NULL;\n+\t}\n+\t/* FM PCD NetEnvCharacteristicsDelete */\n+\tret = fm_pcd_net_env_characteristics_delete(dpaa_intf->netenv_handle);\n+\tif (ret != E_OK) {\n+\t\tDPAA_PMD_ERR(\"fm_pcd_net_env_characteristics_delete: Failed\");\n+\t\treturn ret;\n+\t}\n+\tdpaa_intf->netenv_handle = NULL;\n+\n+\t/* FM PORT Close */\n+\tfm_port_close(dpaa_intf->port_handle);\n+\tdpaa_intf->port_handle = NULL;\n+\n+\t/* Set scheme count to 0 */\n+\tdpaa_intf->scheme_count = 0;\n+\n+\treturn 0;\n+}\n+\n+int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set)\n+{\n+\tstruct dpaa_if *dpaa_intf = dev->data->dev_private;\n+\tstruct fman_if *fif = dev->process_private;\n+\tint ret;\n+\tunsigned int i = 0;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (dpaa_intf->port_handle) {\n+\t\tif (dpaa_fm_deconfig(dpaa_intf, fif))\n+\t\t\tDPAA_PMD_ERR(\"DPAA FM deconfig failed\");\n+\t}\n+\n+\tif (!dev->data->nb_rx_queues)\n+\t\treturn 0;\n+\n+\tif (dev->data->nb_rx_queues & (dev->data->nb_rx_queues - 1)) {\n+\t\tDPAA_PMD_ERR(\"No of queues should be power of 2\");\n+\t\treturn -1;\n+\t}\n+\n+\tdpaa_intf->nb_rx_queues = dev->data->nb_rx_queues;\n+\n+\t/* Open FM Port and set it in port info */\n+\tret = set_fm_port_handle(dpaa_intf, req_dist_set, fif);\n+\tif (ret) {\n+\t\tDPAA_PMD_ERR(\"Set FM Port handle: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\t/* Set PCD netenv and scheme */\n+\tif (req_dist_set) {\n+\t\tret = set_pcd_netenv_scheme(dpaa_intf, req_dist_set, fif);\n+\t\tif (ret) {\n+\t\t\tDPAA_PMD_ERR(\"Set PCD NetEnv and Scheme dist: Failed\");\n+\t\t\tgoto unset_fm_port_handle;\n+\t\t}\n+\t}\n+\t/* Set default netenv and scheme */\n+\tret = set_default_scheme(dpaa_intf);\n+\tif (ret) {\n+\t\tDPAA_PMD_ERR(\"Set PCD NetEnv and Scheme: Failed\");\n+\t\tgoto unset_pcd_netenv_scheme1;\n+\t}\n+\n+\t/* Set Port PCD */\n+\tret = set_port_pcd(dpaa_intf);\n+\tif (ret) {\n+\t\tDPAA_PMD_ERR(\"Set Port PCD: Failed\");\n+\t\tgoto unset_pcd_netenv_scheme;\n+\t}\n+\n+\tfor (; i < fm_model.dev_count; i++)\n+\t\tif (fm_model.device_order[i] == dpaa_intf->ifid)\n+\t\t\treturn 0;\n+\n+\tfm_model.device_order[fm_model.dev_count] = dpaa_intf->ifid;\n+\tfm_model.dev_count++;\n+\n+\treturn 0;\n+\n+unset_pcd_netenv_scheme:\n+\tunset_pcd_netenv_scheme(dpaa_intf);\n+\n+unset_pcd_netenv_scheme1:\n+\tunset_pcd_netenv_scheme(dpaa_intf);\n+\n+unset_fm_port_handle:\n+\t/* FM PORT Close */\n+\tfm_port_close(dpaa_intf->port_handle);\n+\tdpaa_intf->port_handle = NULL;\n+\treturn -1;\n+}\n+\n+int dpaa_fm_init(void)\n+{\n+\tt_handle fman_handle;\n+\tt_handle pcd_handle;\n+\tt_fm_pcd_params fm_pcd_params = {0};\n+\t/* Hard-coded : fman id 0 since one fman is present in LS104x */\n+\tint fman_id = 0, ret;\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tdpaa_read_fm_config_from_file();\n+\n+\t/* FM Open */\n+\tfman_handle = fm_open(fman_id);\n+\tif (!fman_handle) {\n+\t\tDPAA_PMD_ERR(\"fm_open: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\t/* FM PCD Open */\n+\tfm_pcd_params.h_fm = fman_handle;\n+\tfm_pcd_params.prs_support = true;\n+\tfm_pcd_params.kg_support = true;\n+\tpcd_handle = fm_pcd_open(&fm_pcd_params);\n+\tif (!pcd_handle) {\n+\t\tfm_close(fman_handle);\n+\t\tDPAA_PMD_ERR(\"fm_pcd_open: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\t/* FM PCD Enable */\n+\tret = fm_pcd_enable(pcd_handle);\n+\tif (ret) {\n+\t\tfm_close(fman_handle);\n+\t\tfm_pcd_close(pcd_handle);\n+\t\tDPAA_PMD_ERR(\"fm_pcd_enable: Failed\");\n+\t\treturn -1;\n+\t}\n+\n+\t/* Set fman and pcd handle in fm info */\n+\tfm_info.fman_handle = fman_handle;\n+\tfm_info.pcd_handle = pcd_handle;\n+\n+\treturn 0;\n+}\n+\n+\n+/* De-initialization of FM */\n+int dpaa_fm_term(void)\n+{\n+\tint ret;\n+\n+\tPMD_INIT_FUNC_TRACE();\n+\n+\tif (fm_info.pcd_handle && fm_info.fman_handle) {\n+\t\t/* FM PCD Disable */\n+\t\tret = fm_pcd_disable(fm_info.pcd_handle);\n+\t\tif (ret) {\n+\t\t\tDPAA_PMD_ERR(\"fm_pcd_disable: Failed\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\t/* FM PCD Close */\n+\t\tfm_pcd_close(fm_info.pcd_handle);\n+\t\tfm_info.pcd_handle = NULL;\n+\t}\n+\n+\tif (fm_info.fman_handle) {\n+\t\t/* FM Close */\n+\t\tfm_close(fm_info.fman_handle);\n+\t\tfm_info.fman_handle = NULL;\n+\t}\n+\n+\tif (access(fm_log, F_OK) != -1) {\n+\t\tret = remove(fm_log);\n+\t\tif (ret)\n+\t\t\tDPAA_PMD_ERR(\"File remove: Failed\");\n+\t}\n+\treturn 0;\n+}\ndiff --git a/drivers/net/dpaa/dpaa_flow.h b/drivers/net/dpaa/dpaa_flow.h\nnew file mode 100644\nindex 0000000000..d16bfec210\n--- /dev/null\n+++ b/drivers/net/dpaa/dpaa_flow.h\n@@ -0,0 +1,14 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2017,2019 NXP\n+ */\n+\n+#ifndef __DPAA_FLOW_H__\n+#define __DPAA_FLOW_H__\n+\n+int dpaa_fm_init(void);\n+int dpaa_fm_term(void);\n+int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set);\n+int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf, struct fman_if *fif);\n+void dpaa_write_fm_config_to_file(void);\n+\n+#endif\ndiff --git a/drivers/net/dpaa/meson.build b/drivers/net/dpaa/meson.build\nindex 94d5095281..1915000010 100644\n--- a/drivers/net/dpaa/meson.build\n+++ b/drivers/net/dpaa/meson.build\n@@ -10,6 +10,7 @@ deps += ['mempool_dpaa']\n sources = files('dpaa_ethdev.c',\n \t\t'fmlib/fm_lib.c',\n \t\t'fmlib/fm_vsp.c',\n+\t\t'dpaa_flow.c',\n \t\t'dpaa_rxtx.c')\n \n if cc.has_argument('-Wno-pointer-arith')\n",
    "prefixes": [
        "v5",
        "3/8"
    ]
}