get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 70627,
    "url": "http://patches.dpdk.org/api/patches/70627/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200527132326.1382-22-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": "<20200527132326.1382-22-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200527132326.1382-22-hemant.agrawal@nxp.com",
    "date": "2020-05-27T13:23:10",
    "name": "[21/37] net/dpaa: add fmc parser support for VSP",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "404574f9c2f1a32537bc229f8aa5fc89124ba18b",
    "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/20200527132326.1382-22-hemant.agrawal@nxp.com/mbox/",
    "series": [
        {
            "id": 10248,
            "url": "http://patches.dpdk.org/api/series/10248/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10248",
            "date": "2020-05-27T13:22:49",
            "name": "NXP DPAAx enhancements",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/10248/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/70627/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/70627/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 EB719A034E;\n\tWed, 27 May 2020 15:30:50 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 93EC81DAB0;\n\tWed, 27 May 2020 15:27:08 +0200 (CEST)",
            "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by dpdk.org (Postfix) with ESMTP id 9E8FD1DA1E\n for <dev@dpdk.org>; Wed, 27 May 2020 15:26:41 +0200 (CEST)",
            "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 208CC1A07D2;\n Wed, 27 May 2020 15:26:41 +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 179741A07D7;\n Wed, 27 May 2020 15:26:39 +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 9F7CE4031F;\n Wed, 27 May 2020 21:26:33 +0800 (SGT)"
        ],
        "From": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "dev@dpdk.org,\n\tferruh.yigit@intel.com",
        "Cc": "Jun Yang <jun.yang@nxp.com>",
        "Date": "Wed, 27 May 2020 18:53:10 +0530",
        "Message-Id": "<20200527132326.1382-22-hemant.agrawal@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200527132326.1382-1-hemant.agrawal@nxp.com>",
        "References": "<20200527132326.1382-1-hemant.agrawal@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH 21/37] net/dpaa: add fmc parser support for VSP",
        "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: Jun Yang <jun.yang@nxp.com>\n\nParse the fmc.bin generated by fmc to setup\nRXQs for each port on fmc mode.\nThe parser gets the fqids and vspids from fmc.bin.\n\nSigned-off-by: Jun Yang <jun.yang@nxp.com>\n---\n drivers/net/dpaa/Makefile      |   1 +\n drivers/net/dpaa/dpaa_ethdev.c |  26 +-\n drivers/net/dpaa/dpaa_ethdev.h |  10 +-\n drivers/net/dpaa/dpaa_fmc.c    | 488 +++++++++++++++++++++++++++++++++\n drivers/net/dpaa/meson.build   |   3 +-\n 5 files changed, 521 insertions(+), 7 deletions(-)\n create mode 100644 drivers/net/dpaa/dpaa_fmc.c",
    "diff": "diff --git a/drivers/net/dpaa/Makefile b/drivers/net/dpaa/Makefile\nindex d334b82a0..f4a1c0ec5 100644\n--- a/drivers/net/dpaa/Makefile\n+++ b/drivers/net/dpaa/Makefile\n@@ -32,6 +32,7 @@ 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+SRCS-$(CONFIG_RTE_LIBRTE_DPAA_PMD) += dpaa_fmc.c\n \n LDLIBS += -lrte_bus_dpaa\n LDLIBS += -lrte_mempool_dpaa\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c\nindex 9cb3d213c..a508b10c3 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.c\n+++ b/drivers/net/dpaa/dpaa_ethdev.c\n@@ -261,6 +261,16 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)\n \t\tdev->data->scattered_rx = 1;\n \t}\n \n+\tif (!(default_q || fmc_q)) {\n+\t\tif (dpaa_fm_config(dev,\n+\t\t\teth_conf->rx_adv_conf.rss_conf.rss_hf)) {\n+\t\t\tdpaa_write_fm_config_to_file();\n+\t\t\tDPAA_PMD_ERR(\"FM port configuration: Failed\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t\tdpaa_write_fm_config_to_file();\n+\t}\n+\n \t/* if the interrupts were configured on this devices*/\n \tif (intr_handle && intr_handle->fd) {\n \t\tif (dev->data->dev_conf.intr_conf.lsc != 0)\n@@ -336,6 +346,9 @@ static int dpaa_eth_dev_start(struct rte_eth_dev *dev)\n \n \tPMD_INIT_FUNC_TRACE();\n \n+\tif (!(default_q || fmc_q))\n+\t\tdpaa_write_fm_config_to_file();\n+\n \t/* Change tx callback to the real one */\n \tif (dpaa_intf->cgr_tx)\n \t\tdev->tx_pkt_burst = dpaa_eth_queue_tx_slow;\n@@ -1577,7 +1590,18 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)\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\tnum_rx_fqs = dpaa_port_fmc_init(fman_intf, dev_rx_fqids,\n+\t\t\t\t\t\tdev_vspids,\n+\t\t\t\t\t\tDPAA_MAX_NUM_PCD_QUEUES);\n+\t\tif (num_rx_fqs < 0) {\n+\t\t\tDPAA_PMD_ERR(\"%s FMC initializes failed!\",\n+\t\t\t\tdpaa_intf->name);\n+\t\t\tgoto free_rx;\n+\t\t}\n+\t\tif (!num_rx_fqs) {\n+\t\t\tDPAA_PMD_WARN(\"%s is not configured by FMC.\",\n+\t\t\t\tdpaa_intf->name);\n+\t\t}\n \t} else {\n \t\t/* FMCLESS mode, load balance to multiple cores.*/\n \t\tnum_rx_fqs = rte_lcore_count();\ndiff --git a/drivers/net/dpaa/dpaa_ethdev.h b/drivers/net/dpaa/dpaa_ethdev.h\nindex dd182c4d5..1b8e120e8 100644\n--- a/drivers/net/dpaa/dpaa_ethdev.h\n+++ b/drivers/net/dpaa/dpaa_ethdev.h\n@@ -59,10 +59,10 @@\n #endif\n \n /* PCD frame queues */\n-#define DPAA_PCD_FQID_START\t\t0x400\n-#define DPAA_PCD_FQID_MULTIPLIER\t0x100\n #define DPAA_DEFAULT_NUM_PCD_QUEUES\t1\n-#define DPAA_MAX_NUM_PCD_QUEUES\t\t4\n+#define DPAA_VSP_PROFILE_MAX_NUM\t8\n+#define DPAA_MAX_NUM_PCD_QUEUES\tDPAA_VSP_PROFILE_MAX_NUM\n+/*Same as VSP profile number*/\n \n #define DPAA_IF_TX_PRIORITY\t\t3\n #define DPAA_IF_RX_PRIORITY\t\t0\n@@ -103,10 +103,10 @@\n #define DPAA_FD_CMD_CFQ\t\t\t0x00ffffff\n /**< Confirmation Frame Queue */\n \n-#define DPAA_VSP_PROFILE_MAX_NUM\t8\n-\n #define DPAA_DEFAULT_RXQ_VSP_ID\t\t1\n \n+#define FMC_FILE \"/tmp/fmc.bin\"\n+\n /* Each network interface is represented by one of these */\n struct dpaa_if {\n \tint valid;\ndiff --git a/drivers/net/dpaa/dpaa_fmc.c b/drivers/net/dpaa/dpaa_fmc.c\nnew file mode 100644\nindex 000000000..b3b9a7e43\n--- /dev/null\n+++ b/drivers/net/dpaa/dpaa_fmc.c\n@@ -0,0 +1,488 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2017-2020 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+#include <fmlib/fm_vsp_ext.h>\n+\n+#define FMC_OUTPUT_FORMAT_VER 0x106\n+\n+#define FMC_NAME_LEN             64\n+#define FMC_FMAN_NUM              2\n+#define FMC_PORTS_PER_FMAN       16\n+#define FMC_SCHEMES_NUM          32\n+#define FMC_SCHEME_PROTOCOLS_NUM 16\n+#define FMC_CC_NODES_NUM        512\n+#define FMC_REPLICATORS_NUM      16\n+#define FMC_PLC_NUM              64\n+#define MAX_SP_CODE_SIZE      0x7C0\n+#define FMC_MANIP_MAX            64\n+#define FMC_HMANIP_MAX          512\n+#define FMC_INSERT_MAX           56\n+#define FM_PCD_MAX_NUM_OF_REPS   64\n+\n+typedef struct fmc_port_t {\n+\te_FmPortType type;\n+\tunsigned int number;\n+\tstruct fm_pcd_net_env_params_t distinctionUnits;\n+\tstruct ioc_fm_port_pcd_params_t pcdParam;\n+\tstruct ioc_fm_port_pcd_prs_params_t prsParam;\n+\tstruct ioc_fm_port_pcd_kg_params_t kgParam;\n+\tstruct ioc_fm_port_pcd_cc_params_t ccParam;\n+\tchar name[FMC_NAME_LEN];\n+\tchar cctree_name[FMC_NAME_LEN];\n+\tt_Handle handle;\n+\tt_Handle env_id_handle;\n+\tt_Handle env_id_devId;\n+\tt_Handle cctree_handle;\n+\tt_Handle cctree_devId;\n+\n+\tunsigned int schemes_count;\n+\tunsigned int schemes[FMC_SCHEMES_NUM];\n+\tunsigned int ccnodes_count;\n+\tunsigned int ccnodes[FMC_CC_NODES_NUM];\n+\tunsigned int htnodes_count;\n+\tunsigned int htnodes[FMC_CC_NODES_NUM];\n+\n+\tunsigned int replicators_count;\n+\tunsigned int replicators[FMC_REPLICATORS_NUM];\n+\tioc_fm_port_vsp_alloc_params_t vspParam;\n+\n+\tunsigned int ccroot_count;\n+\tunsigned int ccroot[FMC_CC_NODES_NUM];\n+\tenum ioc_fm_pcd_engine ccroot_type[FMC_CC_NODES_NUM];\n+\tunsigned int ccroot_manip[FMC_CC_NODES_NUM];\n+\n+\tunsigned int reasm_index;\n+} fmc_port;\n+\n+typedef struct fmc_fman_t {\n+\tunsigned int number;\n+\tunsigned int port_count;\n+\tunsigned int ports[FMC_PORTS_PER_FMAN];\n+\tchar name[FMC_NAME_LEN];\n+\tt_Handle handle;\n+\tchar pcd_name[FMC_NAME_LEN];\n+\tt_Handle pcd_handle;\n+\tunsigned int kg_payload_offset;\n+\n+\tunsigned int offload_support;\n+\n+\tunsigned int reasm_count;\n+\tstruct fm_pcd_manip_params_t reasm[FMC_MANIP_MAX];\n+\tchar reasm_name[FMC_MANIP_MAX][FMC_NAME_LEN];\n+\tt_Handle reasm_handle[FMC_MANIP_MAX];\n+\tt_Handle reasm_devId[FMC_MANIP_MAX];\n+\n+\tunsigned int frag_count;\n+\tstruct fm_pcd_manip_params_t frag[FMC_MANIP_MAX];\n+\tchar frag_name[FMC_MANIP_MAX][FMC_NAME_LEN];\n+\tt_Handle frag_handle[FMC_MANIP_MAX];\n+\tt_Handle frag_devId[FMC_MANIP_MAX];\n+\n+\tunsigned int hdr_count;\n+\tstruct fm_pcd_manip_params_t hdr[FMC_HMANIP_MAX];\n+\tuint8_t insertData[FMC_HMANIP_MAX][FMC_INSERT_MAX];\n+\tchar hdr_name[FMC_HMANIP_MAX][FMC_NAME_LEN];\n+\tt_Handle hdr_handle[FMC_HMANIP_MAX];\n+\tt_Handle hdr_devId[FMC_HMANIP_MAX];\n+\tunsigned int hdr_hasNext[FMC_HMANIP_MAX];\n+\tunsigned int hdr_next[FMC_HMANIP_MAX];\n+} fmc_fman;\n+\n+typedef enum fmc_apply_order_e {\n+\tFMCEngineStart,\n+\tFMCEngineEnd,\n+\tFMCPortStart,\n+\tFMCPortEnd,\n+\tFMCScheme,\n+\tFMCCCNode,\n+\tFMCHTNode,\n+\tFMCCCTree,\n+\tFMCPolicer,\n+\tFMCReplicator,\n+\tFMCManipulation\n+} fmc_apply_order_e;\n+\n+typedef struct fmc_apply_order_t {\n+\tfmc_apply_order_e type;\n+\tunsigned int index;\n+} fmc_apply_order;\n+\n+struct fmc_model_t {\n+\tunsigned int format_version;\n+\tunsigned int sp_enable;\n+\tt_FmPcdPrsSwParams sp;\n+\tuint8_t spcode[MAX_SP_CODE_SIZE];\n+\n+\tunsigned int fman_count;\n+\tfmc_fman fman[FMC_FMAN_NUM];\n+\n+\tunsigned int port_count;\n+\tfmc_port port[FMC_FMAN_NUM * FMC_PORTS_PER_FMAN];\n+\n+\tunsigned int scheme_count;\n+\tchar scheme_name[FMC_SCHEMES_NUM][FMC_NAME_LEN];\n+\tt_Handle scheme_handle[FMC_SCHEMES_NUM];\n+\tt_Handle scheme_devId[FMC_SCHEMES_NUM];\n+\tstruct fm_pcd_kg_scheme_params_t scheme[FMC_SCHEMES_NUM];\n+\n+\tunsigned int ccnode_count;\n+\tchar ccnode_name[FMC_CC_NODES_NUM][FMC_NAME_LEN];\n+\tt_Handle ccnode_handle[FMC_CC_NODES_NUM];\n+\tt_Handle ccnode_devId[FMC_CC_NODES_NUM];\n+\tstruct fm_pcd_cc_node_params_t ccnode[FMC_CC_NODES_NUM];\n+\tuint8_t cckeydata[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS]\n+\t\t\t\t\t[FM_PCD_MAX_SIZE_OF_KEY];\n+\tunsigned char ccmask[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS]\n+\t\t\t\t\t\t[FM_PCD_MAX_SIZE_OF_KEY];\n+\tunsigned int\n+\t\tccentry_action_index[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tenum ioc_fm_pcd_engine\n+\t\tccentry_action_type[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tunsigned char ccentry_frag[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tunsigned int ccentry_manip[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tunsigned int ccmiss_action_index[FMC_CC_NODES_NUM];\n+\tenum ioc_fm_pcd_engine ccmiss_action_type[FMC_CC_NODES_NUM];\n+\tunsigned char ccmiss_frag[FMC_CC_NODES_NUM];\n+\tunsigned int ccmiss_manip[FMC_CC_NODES_NUM];\n+\n+\tunsigned int htnode_count;\n+\tchar htnode_name[FMC_CC_NODES_NUM][FMC_NAME_LEN];\n+\tt_Handle htnode_handle[FMC_CC_NODES_NUM];\n+\tt_Handle htnode_devId[FMC_CC_NODES_NUM];\n+\tstruct fm_pcd_hash_table_params_t htnode[FMC_CC_NODES_NUM];\n+\n+\tunsigned int htentry_count[FMC_CC_NODES_NUM];\n+\tstruct ioc_fm_pcd_cc_key_params_t\n+\t\thtentry[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tuint8_t htkeydata[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS]\n+\t\t\t\t\t[FM_PCD_MAX_SIZE_OF_KEY];\n+\tunsigned int\n+\t\thtentry_action_index[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tenum ioc_fm_pcd_engine\n+\t\thtentry_action_type[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tunsigned char htentry_frag[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\tunsigned int htentry_manip[FMC_CC_NODES_NUM][FM_PCD_MAX_NUM_OF_KEYS];\n+\n+\tunsigned int htmiss_action_index[FMC_CC_NODES_NUM];\n+\tenum ioc_fm_pcd_engine htmiss_action_type[FMC_CC_NODES_NUM];\n+\tunsigned char htmiss_frag[FMC_CC_NODES_NUM];\n+\tunsigned int htmiss_manip[FMC_CC_NODES_NUM];\n+\n+\tunsigned int replicator_count;\n+\tchar replicator_name[FMC_REPLICATORS_NUM][FMC_NAME_LEN];\n+\tt_Handle replicator_handle[FMC_REPLICATORS_NUM];\n+\tt_Handle replicator_devId[FMC_REPLICATORS_NUM];\n+\tstruct fm_pcd_frm_replic_group_params_t replicator[FMC_REPLICATORS_NUM];\n+\tunsigned int\n+\t repentry_action_index[FMC_REPLICATORS_NUM][FM_PCD_MAX_NUM_OF_REPS];\n+\tunsigned char repentry_frag[FMC_REPLICATORS_NUM][FM_PCD_MAX_NUM_OF_REPS];\n+\tunsigned int repentry_manip[FMC_REPLICATORS_NUM][FM_PCD_MAX_NUM_OF_REPS];\n+\n+\tunsigned int policer_count;\n+\tchar policer_name[FMC_PLC_NUM][FMC_NAME_LEN];\n+\tstruct fm_pcd_plcr_profile_params_t policer[FMC_PLC_NUM];\n+\tt_Handle policer_handle[FMC_PLC_NUM];\n+\tt_Handle policer_devId[FMC_PLC_NUM];\n+\tunsigned int policer_action_index[FMC_PLC_NUM][3];\n+\n+\tunsigned int apply_order_count;\n+\tfmc_apply_order apply_order[FMC_FMAN_NUM *\n+\t\tFMC_PORTS_PER_FMAN *\n+\t\t(FMC_SCHEMES_NUM + FMC_CC_NODES_NUM)];\n+};\n+\n+struct fmc_model_t *g_fmc_model;\n+\n+static int dpaa_port_fmc_port_parse(\n+\tstruct fman_if *fif,\n+\tconst struct fmc_model_t *fmc_model,\n+\tint apply_idx)\n+{\n+\tint current_port = fmc_model->apply_order[apply_idx].index;\n+\tconst fmc_port *pport = &fmc_model->port[current_port];\n+\tconst uint8_t mac_idx[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1};\n+\tconst uint8_t mac_type[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};\n+\n+\tif (mac_idx[fif->mac_idx] != pport->number ||\n+\t\tmac_type[fif->mac_idx] != pport->type)\n+\t\treturn -1;\n+\n+\treturn current_port;\n+}\n+\n+static int dpaa_port_fmc_scheme_parse(\n+\tstruct fman_if *fif,\n+\tconst struct fmc_model_t *fmc_model,\n+\tint apply_idx,\n+\tuint16_t *rxq_idx, int max_nb_rxq,\n+\tuint32_t *fqids, int8_t *vspids)\n+{\n+\tint scheme_idx = fmc_model->apply_order[apply_idx].index;\n+\tuint32_t i;\n+\n+\tif (!fmc_model->scheme[scheme_idx].override_storage_profile &&\n+\t\tfif->is_shared_mac) {\n+\t\tDPAA_PMD_WARN(\"No VSP is assigned to sheme %d for sharemac %d!\",\n+\t\t\tscheme_idx, fif->mac_idx);\n+\t\tDPAA_PMD_WARN(\"Risk to receive pkts from skb pool to CRASH!\");\n+\t}\n+\n+\tif (e_IOC_FM_PCD_DONE ==\n+\t\tfmc_model->scheme[scheme_idx].next_engine) {\n+\t\tfor (i = 0; i < fmc_model->scheme[scheme_idx]\n+\t\t\t.key_extract_and_hash_params.hash_distribution_num_of_fqids; i++) {\n+\t\t\tuint32_t fqid = fmc_model->scheme[scheme_idx].base_fqid + i;\n+\t\t\tint k, found = 0;\n+\n+\t\t\tif (fqid == fif->fqid_rx_def) {\n+\t\t\t\tif (fif->is_shared_mac &&\n+\t\t\t\tfmc_model->scheme[scheme_idx].override_storage_profile &&\n+\t\t\t\tfmc_model->scheme[scheme_idx].storage_profile.direct &&\n+\t\t\t\tfmc_model->scheme[scheme_idx].storage_profile\n+\t\t\t\t.profile_select.direct_relative_profileId !=\n+\t\t\t\tfif->base_profile_id) {\n+\t\t\t\t\tDPAA_PMD_ERR(\n+\t\t\t\t\t\"Default RXQ must be associated\"\n+\t\t\t\t\t\" with default VSP on sharemac!\");\n+\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\tif (fif->is_shared_mac &&\n+\t\t\t!fmc_model->scheme[scheme_idx].override_storage_profile) {\n+\t\t\t\tDPAA_PMD_ERR(\n+\t\t\t\t\t\"RXQ to DPDK must be associated\"\n+\t\t\t\t\t\" with VSP on sharemac!\");\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\n+\t\t\tif (fif->is_shared_mac &&\n+\t\t\tfmc_model->scheme[scheme_idx].override_storage_profile &&\n+\t\t\tfmc_model->scheme[scheme_idx].storage_profile.direct &&\n+\t\t\tfmc_model->scheme[scheme_idx].storage_profile\n+\t\t\t.profile_select.direct_relative_profileId ==\n+\t\t\tfif->base_profile_id) {\n+\t\t\t\tDPAA_PMD_ERR(\n+\t\t\t\t\t\"RXQ can't be associated\"\n+\t\t\t\t\t\" with default VSP on sharemac!\");\n+\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\n+\t\t\tif ((*rxq_idx) >= max_nb_rxq) {\n+\t\t\t\tDPAA_PMD_DEBUG(\n+\t\t\t\t\t\"Too many queues in FMC policy\"\n+\t\t\t\t\t\"%d overflow %d\",\n+\t\t\t\t\t(*rxq_idx), max_nb_rxq);\n+\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\tfor (k = 0; k < (*rxq_idx); k++) {\n+\t\t\t\tif (fqids[k] == fqid) {\n+\t\t\t\t\tfound = 1;\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif (found)\n+\t\t\t\tcontinue;\n+\t\t\tfqids[(*rxq_idx)] = fqid;\n+\t\t\tif (fmc_model->scheme[scheme_idx].override_storage_profile) {\n+\t\t\t\tif (fmc_model->scheme[scheme_idx].storage_profile.direct) {\n+\t\t\t\t\tvspids[(*rxq_idx)] =\n+\t\t\t\t\t\tfmc_model->scheme[scheme_idx].storage_profile\n+\t\t\t\t\t\t\t.profile_select.direct_relative_profileId;\n+\t\t\t\t} else {\n+\t\t\t\t\tvspids[(*rxq_idx)] = -1;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\tvspids[(*rxq_idx)] = -1;\n+\t\t\t}\n+\t\t\t(*rxq_idx)++;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int dpaa_port_fmc_ccnode_parse(\n+\tstruct fman_if *fif,\n+\tconst struct fmc_model_t *fmc_model,\n+\tint apply_idx,\n+\tuint16_t *rxq_idx, int max_nb_rxq,\n+\tuint32_t *fqids, int8_t *vspids)\n+{\n+\tuint16_t j, k, found = 0;\n+\tconst struct ioc_keys_params_t *keys_params;\n+\tuint32_t fqid, cc_idx = fmc_model->apply_order[apply_idx].index;\n+\n+\tkeys_params = &fmc_model->ccnode[cc_idx].keys_params;\n+\n+\tif ((*rxq_idx) >= max_nb_rxq) {\n+\t\tDPAA_PMD_WARN(\n+\t\t\t\"Too many queues in FMC policy\"\n+\t\t\t\"%d overflow %d\",\n+\t\t\t(*rxq_idx), max_nb_rxq);\n+\n+\t\treturn 0;\n+\t}\n+\n+\tfor (j = 0; j < keys_params->num_of_keys; ++j) {\n+\t\tfound = 0;\n+\t\tfqid = keys_params->key_params[j].cc_next_engine_params\n+\t\t\t.params.enqueue_params.new_fqid;\n+\n+\t\tif (keys_params->key_params[j].cc_next_engine_params\n+\t\t\t.next_engine != e_IOC_FM_PCD_DONE) {\n+\t\t\tDPAA_PMD_WARN(\"FMC CC next engine not support\");\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (keys_params->key_params[j].cc_next_engine_params\n+\t\t\t.params.enqueue_params.action !=\n+\t\t\te_IOC_FM_PCD_ENQ_FRAME)\n+\t\t\tcontinue;\n+\t\tfor (k = 0; k < (*rxq_idx); k++) {\n+\t\t\tif (fqids[k] == fqid) {\n+\t\t\t\tfound = 1;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t\tif (found)\n+\t\t\tcontinue;\n+\n+\t\tif ((*rxq_idx) >= max_nb_rxq) {\n+\t\t\tDPAA_PMD_WARN(\n+\t\t\t\t\"Too many queues in FMC policy\"\n+\t\t\t\t\"%d overflow %d\",\n+\t\t\t\t(*rxq_idx), max_nb_rxq);\n+\n+\t\t\treturn 0;\n+\t\t}\n+\n+\t\tfqids[(*rxq_idx)] = fqid;\n+\t\tvspids[(*rxq_idx)] =\n+\t\t\tkeys_params->key_params[j].cc_next_engine_params\n+\t\t\t\t.params.enqueue_params\n+\t\t\t\t.new_relative_storage_profile_id;\n+\n+\t\tif (vspids[(*rxq_idx)] == fif->base_profile_id &&\n+\t\t    fif->is_shared_mac) {\n+\t\t\tDPAA_PMD_ERR(\n+\t\t\t\t\"VSP %d can NOT be used on DPDK.\",\n+\t\t\t\tvspids[(*rxq_idx)]);\n+\t\t\tDPAA_PMD_ERR(\n+\t\t\t\"It is associated to skb pool of shared interface.\");\n+\n+\t\t\t\treturn -1;\n+\t\t}\n+\t\t(*rxq_idx)++;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int dpaa_port_fmc_init(struct fman_if *fif,\n+\t\t       uint32_t *fqids, int8_t *vspids, int max_nb_rxq)\n+{\n+\tint current_port = -1, ret;\n+\tuint16_t rxq_idx = 0;\n+\tconst struct fmc_model_t *fmc_model;\n+\tuint32_t i;\n+\n+\tif (!g_fmc_model) {\n+\t\tsize_t bytes_read;\n+\t\tFILE *fp = fopen(FMC_FILE, \"rb\");\n+\n+\t\tif (!fp) {\n+\t\t\tDPAA_PMD_ERR(\"%s not exists\", FMC_FILE);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tg_fmc_model = rte_malloc(NULL, sizeof(struct fmc_model_t), 64);\n+\t\tif (!g_fmc_model) {\n+\t\t\tDPAA_PMD_ERR(\"FMC memory alloc failed\");\n+\t\t\tfclose(fp);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tbytes_read = fread(g_fmc_model,\n+\t\t\t\t\tsizeof(struct fmc_model_t), 1, fp);\n+\t\tif (!bytes_read) {\n+\t\t\tDPAA_PMD_ERR(\"No bytes read\");\n+\t\t\tfclose(fp);\n+\t\t\trte_free(g_fmc_model);\n+\t\t\tg_fmc_model = NULL;\n+\t\t\treturn -1;\n+\t\t}\n+\t\tfclose(fp);\n+\t}\n+\n+\tfmc_model = g_fmc_model;\n+\n+\tif (fmc_model->format_version != FMC_OUTPUT_FORMAT_VER)\n+\t\treturn -1;\n+\n+\tfor (i = 0; i < fmc_model->apply_order_count; i++) {\n+\t\tswitch (fmc_model->apply_order[i].type) {\n+\t\tcase FMCEngineStart:\n+\t\t\tbreak;\n+\t\tcase FMCEngineEnd:\n+\t\t\tbreak;\n+\t\tcase FMCPortStart:\n+\t\t\tcurrent_port = dpaa_port_fmc_port_parse(\n+\t\t\t\tfif, fmc_model, i);\n+\t\t\tbreak;\n+\t\tcase FMCPortEnd:\n+\t\t\tbreak;\n+\t\tcase FMCScheme:\n+\t\t\tif (current_port < 0)\n+\t\t\t\tbreak;\n+\n+\t\t\tret = dpaa_port_fmc_scheme_parse(\n+\t\t\t\tfif, fmc_model,\n+\t\t\t\ti, &rxq_idx, max_nb_rxq, fqids, vspids);\n+\t\t\tif (ret)\n+\t\t\t\treturn ret;\n+\n+\t\t\tbreak;\n+\t\tcase FMCCCNode:\n+\t\t\tif (current_port < 0)\n+\t\t\t\tbreak;\n+\n+\t\t\tret = dpaa_port_fmc_ccnode_parse(fif, fmc_model,\n+\t\t\t\ti, &rxq_idx, max_nb_rxq, fqids, vspids);\n+\t\t\tif (ret)\n+\t\t\t\treturn ret;\n+\n+\t\t\tbreak;\n+\t\tcase FMCHTNode:\n+\t\t\tbreak;\n+\t\tcase FMCReplicator:\n+\t\t\tbreak;\n+\t\tcase FMCCCTree:\n+\t\t\tbreak;\n+\t\tcase FMCPolicer:\n+\t\t\tbreak;\n+\t\tcase FMCManipulation:\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\treturn rxq_idx;\n+}\ndiff --git a/drivers/net/dpaa/meson.build b/drivers/net/dpaa/meson.build\nindex 191500001..451c68823 100644\n--- a/drivers/net/dpaa/meson.build\n+++ b/drivers/net/dpaa/meson.build\n@@ -11,7 +11,8 @@ 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+\t\t'dpaa_rxtx.c',\n+\t\t'dpaa_fmc.c')\n \n if cc.has_argument('-Wno-pointer-arith')\n \tcflags += '-Wno-pointer-arith'\n",
    "prefixes": [
        "21/37"
    ]
}