get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 113592,
    "url": "http://patches.dpdk.org/api/patches/113592/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1656642017-8992-11-git-send-email-chaoyong.he@corigine.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": "<1656642017-8992-11-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1656642017-8992-11-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-07-01T02:20:15",
    "name": "[v4,10/12] net/nfp: add flower representor framework",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "24f0f3925563369c3e78bd1b62653a5248cfd9a5",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 3961,
        "url": "http://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1656642017-8992-11-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 23850,
            "url": "http://patches.dpdk.org/api/series/23850/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=23850",
            "date": "2022-07-01T02:20:05",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/23850/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/113592/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/113592/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 83C92A0093;\n\tFri,  1 Jul 2022 04:22:17 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1217842B8D;\n\tFri,  1 Jul 2022 04:21:28 +0200 (CEST)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2102.outbound.protection.outlook.com [40.107.220.102])\n by mails.dpdk.org (Postfix) with ESMTP id 48DE84069D\n for <dev@dpdk.org>; Fri,  1 Jul 2022 04:21:25 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by BL3PR13MB5107.namprd13.prod.outlook.com (2603:10b6:208:352::20)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.8; Fri, 1 Jul\n 2022 02:21:23 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::5d9e:9ce5:51d1:2021]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::5d9e:9ce5:51d1:2021%9]) with mapi id 15.20.5395.014; Fri, 1 Jul 2022\n 02:21:23 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=QB0T3x/tC9DvQ/UBD51aLWn1TVaS/vfwVeaPnWmuPWILM8mQbj7X5GrPsOFdmgQnKjEyG5Y7E06DmiYPTrS3BvuUO763o3l6nxjrpoHaAgYP0uElR/MZ5mq/w1NZ4b8YhrTDdxbERZw7toEyHD8IAW8hhLL4enQ4Lwif9l3q2Yg7f6i52ClfDbR3riP+IZ8r1JuuGx9uoko5RAyeUhl4PnRFa5oqrXf+SMwqKnb9JXaJrbKO9BJ2AdnS0ahXhh9/wF/bkwU6XguQ9IbdVRjOm+Fdw62O6KrR4O5I7YYbfodXM/oBBA72KroHtbhB5P0ryVXoJfkBnygBmfvdta0dgQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=zN3MNcY7+XnTPwn4eJo4hP12ArpeMhi1H7rMCbbM7E4=;\n b=ClUKXOEplNcPgzmjLhuWHW49pGRb4TAw1WMjEnssQgmgigG8Z7nZDysZC2WUTdFwDhMiaX3R8dLIi61yMwxdO7voBh776ZRtmfAjanIXEMHTLRqcJmNw7x5p/WSxZTO7aScJff6MnXwd2E80020FlNom0bU+vKEQ+vF68u4YahaZAmr/V3zHHlooCJ4DAalXs7R1NTLF1h5eHBxIQZ+mSDpFCqIwi5/Az4g81K7eX1g7yF0njKTQrWVEKkgkpgyaukKFMgtxiZD++t8V9FVwOR3/sCB2sg+9HWOVvhaNATFDurik5/wOHeucdIbhW8/nPtvuZYOx+NucC3K1ZPC2rA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=zN3MNcY7+XnTPwn4eJo4hP12ArpeMhi1H7rMCbbM7E4=;\n b=Cz8ny4ikSgke+5cSSPtE/diih64lg9cOffgNPaWzMlHZpDCGTJkld7kEtnR3PRIyxw/4hJbb4iHUnsjKrr1nwOpErBHrU2slr8eWrWXqXkFFFT0C38afjje3QnEUqwYgjJw/5V80HfJU+1/tHO9tuis7ZcCOd/DqA1PIey5+stU=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "niklas.soderlund@corigine.com,\n\tChaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v4 10/12] net/nfp: add flower representor framework",
        "Date": "Fri,  1 Jul 2022 10:20:15 +0800",
        "Message-Id": "<1656642017-8992-11-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1656642017-8992-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1656642017-8992-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "SG2PR02CA0079.apcprd02.prod.outlook.com\n (2603:1096:4:90::19) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "907f86be-9bec-423f-0351-08da5b0864a7",
        "X-MS-TrafficTypeDiagnostic": "BL3PR13MB5107:EE_",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n ojGATjEKcT71sxqz5gCgCiGUTxPFeQb3Uy7ODIZjhrlsfgy1SEy6d2y7Kb3NXfpAgbyft92WRpK7JjrWNRjGT7l2qmixufmnpVqbGrkBzY0Rg/AATWmK/MTyx02noh33e3xAeK+BpMrSiPUjbsEM1L3kaeOkp2oCn1CQSmcnS17lOW1prB6OsuckjlET9cSNbTMy5fATpn3sXcfOrgFnCQEADfiChvDufzksV8LaWSQa3FQ/56156yEMzdL5Z2hSqmKaVk14/zUx8jRd5CseLIvDkadiATlAuqM95HKLzpBS6nytC8VAoHu/rR9kIJooISKt5xDOPDM0huyF4R0VPEvtQNJgVDZwQxtlKi72amxYQRkmwIKH4rxJmK22VsPtSki6S2C7rnLn4MScjcVf2y4q4I+K3yMcvPbcTc1ZWR/vvMpGBnSddhMrTeXoN02ANk3L2WGvc8Egb/D5vwZQCkpVnXyfOp12IUnxV3DZWe++58QWvzVb2m9wgYi8sYpsH0ufnnWvGrtTXRMh3+K3WSEhqlEFdvUGgfwktqY/ASPzGXynUUUXr+T1ZKKW0ATgf5u/uBs/eSgeK9zSITSIs4BRD2QoIMgaFu+7m/brQiruhVUrWZYTCwTMmygmPHblHCVZoNGfds5OuRnN3KF0fN2U8U1CBJCYQNwxOdEOOCIyxF5F4bDryK7akqYJEmXJVHq10qiWZrbqsuEnR1gikJd9sjNLyoCuvrGwDh9+y5085XCLF2gHrMZOiF35SU6wgAG5aiFvZTWheBEEjol/galhOLGNRRvV5DQ7hwWgJ1igQnTaNe7e8audrWkeelQa",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230016)(4636009)(396003)(366004)(136003)(346002)(376002)(39840400004)(38100700002)(6512007)(38350700002)(6916009)(83380400001)(6486002)(186003)(66574015)(36756003)(26005)(316002)(66556008)(66946007)(4326008)(2906002)(8676002)(41300700001)(30864003)(8936002)(6666004)(2616005)(44832011)(6506007)(478600001)(5660300002)(86362001)(52116002)(66476007)(107886003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?2JXaXqsmMf8K4LjpEda2OlUrR6Hy?=\n\t=?utf-8?q?FEu1/2TsGpC+rG9BsPGktLzo83vqf6Y359s6/lEfuC8yKywEX1MeyK2+i4tJ9zVcc?=\n\t=?utf-8?q?s19H7Fxz+JpyQfVLynguxYDZ55FgfzTzsI2EaKai1Z5xhRg/NbZVgj11q+E1UGuLU?=\n\t=?utf-8?q?FNzSKyGTpwsewfp9UKcXjgf68LUqieMSm4i7cYr8dGNUSsXtaDSgomJw83/OkwGBG?=\n\t=?utf-8?q?7pZ95oSoh7fGTJHIcWOfzqRtWdTChXqkZJw+yEcDS4OQpyMSQuliwsh5uErbMRT9M?=\n\t=?utf-8?q?UdkmeETy9yNN39QcYEevKsiunTDG6SCR8zcx9i0Jp9FXkllL/2z4/V9SzFtpq81jw?=\n\t=?utf-8?q?Cj881oy9QXmVKWGdJVbAWutwW/OHG5k8eDCJ1FYkTUEip63GfkBQnepwbRDPZkQ32?=\n\t=?utf-8?q?uWnogfB6dpdbjCJ0OFeBAjiQNX39SarmD0MceQaRGbFP4C8eNFuVjfFFN89nEtH4C?=\n\t=?utf-8?q?/hQvoJcJOBZaoL8FAVMuUt0Dn60GHx/XHxY7ASrTh02pYr9PAf1C/hixFf7iG04qq?=\n\t=?utf-8?q?DfCQ5R3OyjAI+zf9vBcJJefyEfhZmSdJy+20r3hb+bbA5Tb8saUSTwOnsYsELL8z5?=\n\t=?utf-8?q?Qyu8QGsrPG3fE0TJazC7Lje9g9kNtmQAGrMctmxSFZJEToP/BQ62AGKM1g4simh+p?=\n\t=?utf-8?q?+F7Y5oRiHQBxFVGALO3lv/OaxpYYm73InG9dMWdOZbTDxgjNbyJ8q8ZbVfiQz1QC7?=\n\t=?utf-8?q?owDDQVYJ2w8v0k/m2LfW4ZcISEBeThvSwkdqozlLmvCEbEr0yZjBaEJQwQalNfd+a?=\n\t=?utf-8?q?UZH9NbILcJ5MH/3Jq4rsB/VuUib6cXZgU2NgniLH3oeJrzNHxRL8YyY2xoO4vMauD?=\n\t=?utf-8?q?1jgsQtBlkS4Db0YoDmzXsv0EXdKbirdu2tjviDlSbMgp+blRIflzxHFm9asJN7Kwz?=\n\t=?utf-8?q?KXxe4YNvJlRg46/Kag1p/z36PVD8HtxHbJV8f8HaOdX4vTeG7Ly8x9de3YU7m/PGo?=\n\t=?utf-8?q?A5t3zGFxx2/zWLlmFdCccGb1CUmpFtPgOKG5z5TzkObHwDpkuMCEW0Bb4IUqdz7/X?=\n\t=?utf-8?q?aK0jtUo7pWAJrbrM1qWsYRx8tOpQMCjOkxRH/Q18LnhsbNvqNInK0HeQJGvSC4gix?=\n\t=?utf-8?q?y80Z+8mt9lJ+cobcHNTGJg9QlNgEH/UFL4cOl9K+M/zJ6gSvCEsucSWyhkl7ukvOq?=\n\t=?utf-8?q?NARjD7ClJYc7ZjhUmmSh3rdFVqIx3M6nMFFzWfCQ5ys7obwMDr75F/+1f3y1DSL91?=\n\t=?utf-8?q?3MAtkqZohujHEgsc85ClDNQDmRI1OT7HMzqOmV32sLpMHrZLHz1J7MD39SSfSbaHT?=\n\t=?utf-8?q?UnatPUOmB7T0FP5iZ+ZaQTwg6jrRejkAnK4gOOXd2GsIX66PW1TJdA7K2p/Xo3S4O?=\n\t=?utf-8?q?ia9XbAuR9LHyYw41pnxTL8ykxtvCpk8PRub9TVn0AuZcpt+xliAPZ8VqaEisc6hMM?=\n\t=?utf-8?q?V+sWXjO/KxdXc+RAVznRKTxomVnJswbyDLRHdkEA/7p89AbYIx2AHiXPRBa8fdr6o?=\n\t=?utf-8?q?f9mhW5A9hjW9nhXpaBju3vwLz7N/EnCZGl3fCu/knMcVMyBtA51tK6ABwl66ZMKvb?=\n\t=?utf-8?q?9FHylxkF2UGdw2NUYqgP/YQXZpw+5hQ1JQ=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 907f86be-9bec-423f-0351-08da5b0864a7",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Jul 2022 02:21:23.3972 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n sHVF8FMSGHo+ZErG4tYgwfLAPPaV8MyKoxAPyUyY1pT58IFkR0zMSGOQSpeN18O8EUqSjycm8VPjtNyjYFp20dt1nXrQ8B8u8JJ1k2jAcI8=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BL3PR13MB5107",
        "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"
    },
    "content": "This commit adds the framework to support flower representors.\nThe number of VF representors are parsed from the command line. For\nphysical port representors the current logic aims to create a\nrepresentor for each physical port present on the hardware.\n\nA eth_dev is created for each phyport and VF, and flower firmware\nrequires a MAC repr cmsg to be transmitted to firmware with\ninfo about the number of physical ports configured.\n\nReify messages are sent to hardware for each phyport representor.\nA rte_ring is also created per representor so that traffic can be\npushed and pulled to this interface.\n\nTo up and down the real device represented by a flower representor port\na port mod message is used to convey that info to the firmware. This\nmessage will be used in the dev_ops callbacks of flower representors.\n\nEach cmsg generated by the driver is prepended with a cmsg header.\nThis commit also adds the logic to fill in the header of cmsgs.\n\nThis commit also adds the Rx and Tx path for flower representors. For\nRx packets are dequeued from the representor ring and passed to the\neth_dev. For Tx the first queue of the PF vNIC is used. Metadata about\nthe representor is added before the packet is sent down to firmware.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c             |  59 +++\n drivers/net/nfp/flower/nfp_flower.h             |  18 +\n drivers/net/nfp/flower/nfp_flower_cmsg.c        | 165 ++++++++\n drivers/net/nfp/flower/nfp_flower_cmsg.h        | 173 ++++++++\n drivers/net/nfp/flower/nfp_flower_representor.c | 508 ++++++++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower_representor.h |  39 ++\n drivers/net/nfp/meson.build                     |   2 +\n drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c      |  31 +-\n 8 files changed, 983 insertions(+), 12 deletions(-)\n create mode 100644 drivers/net/nfp/flower/nfp_flower_cmsg.c\n create mode 100644 drivers/net/nfp/flower/nfp_flower_cmsg.h\n create mode 100644 drivers/net/nfp/flower/nfp_flower_representor.c\n create mode 100644 drivers/net/nfp/flower/nfp_flower_representor.h",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex cdaa89a..7034d45 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -22,6 +22,7 @@\n #include \"nfp_flower.h\"\n #include \"nfp_flower_ovs_compat.h\"\n #include \"nfp_flower_ctrl.h\"\n+#include \"nfp_flower_representor.h\"\n \n #define MAX_PKT_BURST 32\n #define MEMPOOL_CACHE_SIZE 512\n@@ -939,8 +940,13 @@\n \tunsigned int numa_node;\n \tstruct nfp_net_hw *pf_hw;\n \tstruct nfp_net_hw *ctrl_hw;\n+\tstruct rte_pci_device *pci_dev;\n \tstruct nfp_app_flower *app_flower;\n+\tstruct rte_eth_devargs eth_da = {\n+\t\t.nb_representor_ports = 0\n+\t};\n \n+\tpci_dev = pf_dev->pci_dev;\n \tnuma_node = rte_socket_id();\n \n \t/* Allocate memory for the Flower app */\n@@ -1033,6 +1039,59 @@\n \t\tgoto ctrl_vnic_cleanup;\n \t}\n \n+\t/* Allocate a switch domain for the flower app */\n+\tif (app_flower->switch_domain_id == RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID &&\n+\t\t\trte_eth_switch_domain_alloc(&app_flower->switch_domain_id)) {\n+\t\tPMD_INIT_LOG(WARNING,\n+\t\t\t\t\"failed to allocate switch domain for device\");\n+\t}\n+\n+\t/* Now parse PCI device args passed for representor info */\n+\tif (pci_dev->device.devargs) {\n+\t\tret = rte_eth_devargs_parse(pci_dev->device.devargs->args,\n+\t\t\t\t&eth_da);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"devarg parse failed\");\n+\t\t\tgoto ctrl_vnic_cleanup;\n+\t\t}\n+\t}\n+\n+\tif (eth_da.nb_representor_ports == 0) {\n+\t\tPMD_INIT_LOG(DEBUG, \"No representor port need to create.\");\n+\t\tret = 0;\n+\t\tgoto done;\n+\t}\n+\n+\t/* There always exist phy repr */\n+\tif (eth_da.nb_representor_ports < app_flower->nfp_eth_table->count) {\n+\t\tPMD_INIT_LOG(DEBUG, \"Should also create phy representor port.\");\n+\t\tret = -ERANGE;\n+\t\tgoto ctrl_vnic_cleanup;\n+\t}\n+\n+\t/* Only support VF representor creation via the command line */\n+\tif (eth_da.type != RTE_ETH_REPRESENTOR_VF) {\n+\t\tPMD_DRV_LOG(ERR, \"unsupported representor type: %s\\n\",\n+\t\t\t\tpci_dev->device.devargs->args);\n+\t\tret = -ENOTSUP;\n+\t\tgoto ctrl_vnic_cleanup;\n+\t}\n+\n+\t/* Fill in flower app with repr counts */\n+\tapp_flower->num_phyport_reprs = (uint8_t)app_flower->nfp_eth_table->count;\n+\tapp_flower->num_vf_reprs = eth_da.nb_representor_ports -\n+\t\t\tapp_flower->nfp_eth_table->count;\n+\n+\tPMD_INIT_LOG(INFO, \"%d number of VF reprs\", app_flower->num_vf_reprs);\n+\tPMD_INIT_LOG(INFO, \"%d number of phyport reprs\", app_flower->num_phyport_reprs);\n+\n+\tret = nfp_flower_repr_alloc(app_flower);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR,\n+\t\t\t\"representors allocation for NFP_REPR_TYPE_VF error\");\n+\t\tgoto ctrl_vnic_cleanup;\n+\t}\n+\n \treturn 0;\n \n ctrl_vnic_cleanup:\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex bdc64e3..24fced3 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -19,8 +19,20 @@ enum nfp_flower_service {\n  */\n #define FLOWER_PKT_DATA_OFFSET 8\n \n+#define MAX_FLOWER_PHYPORTS 8\n+#define MAX_FLOWER_VFS 64\n+\n /* The flower application's private structure */\n struct nfp_app_flower {\n+\t/* switch domain for this app */\n+\tuint16_t switch_domain_id;\n+\n+\t/* Number of VF representors */\n+\tuint8_t num_vf_reprs;\n+\n+\t/* Number of phyport representors */\n+\tuint8_t num_phyport_reprs;\n+\n \t/* List of rte_service ID's for the flower app */\n \tuint32_t flower_services_ids[NFP_FLOWER_SERVICE_MAX];\n \n@@ -44,6 +56,12 @@ struct nfp_app_flower {\n \n \t/* Ctrl vNIC Tx counter */\n \tuint64_t ctrl_vnic_tx_count;\n+\n+\t/* Array of phyport representors */\n+\tstruct nfp_flower_representor *phy_reprs[MAX_FLOWER_PHYPORTS];\n+\n+\t/* Array of VF representors */\n+\tstruct nfp_flower_representor *vf_reprs[MAX_FLOWER_VFS];\n };\n \n int nfp_init_app_flower(struct nfp_pf_dev *pf_dev);\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c\nnew file mode 100644\nindex 0000000..3e30d6a\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c\n@@ -0,0 +1,165 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"../nfpcore/nfp_nsp.h\"\n+#include \"../nfp_logs.h\"\n+#include \"../nfp_common.h\"\n+#include \"nfp_flower.h\"\n+#include \"nfp_flower_cmsg.h\"\n+#include \"nfp_flower_ctrl.h\"\n+#include \"nfp_flower_representor.h\"\n+\n+static void *\n+nfp_flower_cmsg_init(__rte_unused struct rte_mbuf *m,\n+\t\t__rte_unused enum nfp_flower_cmsg_type type,\n+\t\t__rte_unused uint32_t size)\n+{\n+\tchar *pkt;\n+\tuint32_t data;\n+\tuint32_t new_size = size;\n+\tstruct nfp_flower_cmsg_hdr *hdr;\n+\n+\tpkt = rte_pktmbuf_mtod(m, char *);\n+\tPMD_DRV_LOG(DEBUG, \"flower_cmsg_init using pkt at %p\", pkt);\n+\n+\tdata = rte_cpu_to_be_32(NFP_NET_META_PORTID);\n+\trte_memcpy(pkt, &data, 4);\n+\tpkt += 4;\n+\tnew_size += 4;\n+\n+\t/* First the metadata as flower requires it */\n+\tdata = rte_cpu_to_be_32(NFP_META_PORT_ID_CTRL);\n+\trte_memcpy(pkt, &data, 4);\n+\tpkt += 4;\n+\tnew_size += 4;\n+\n+\t/* Now the ctrl header */\n+\thdr = (struct nfp_flower_cmsg_hdr *)pkt;\n+\thdr->pad     = 0;\n+\thdr->type    = type;\n+\thdr->version = NFP_FLOWER_CMSG_VER1;\n+\n+\tpkt = (char *)hdr + NFP_FLOWER_CMSG_HLEN;\n+\tnew_size += NFP_FLOWER_CMSG_HLEN;\n+\n+\tm->pkt_len = new_size;\n+\tm->data_len = m->pkt_len;\n+\n+\treturn pkt;\n+}\n+\n+static void\n+nfp_flower_cmsg_mac_repr_init(struct rte_mbuf *m, int num_ports)\n+{\n+\tuint32_t size;\n+\tstruct nfp_flower_cmsg_mac_repr *msg;\n+\tenum nfp_flower_cmsg_type type = NFP_FLOWER_CMSG_TYPE_MAC_REPR;\n+\n+\tsize = sizeof(*msg) + (num_ports * sizeof(msg->ports[0]));\n+\tPMD_INIT_LOG(DEBUG, \"mac repr cmsg init with size: %u\", size);\n+\tmsg = (struct nfp_flower_cmsg_mac_repr *)nfp_flower_cmsg_init(m,\n+\t\t\ttype, size);\n+\n+\tmemset(msg->reserved, 0, sizeof(msg->reserved));\n+\tmsg->num_ports = num_ports;\n+}\n+\n+static void\n+nfp_flower_cmsg_mac_repr_fill(struct rte_mbuf *m,\n+\t\tunsigned int idx,\n+\t\tunsigned int nbi,\n+\t\tunsigned int nbi_port,\n+\t\tunsigned int phys_port)\n+{\n+\tstruct nfp_flower_cmsg_mac_repr *msg;\n+\n+\tmsg = (struct nfp_flower_cmsg_mac_repr *)nfp_flower_cmsg_get_data(m);\n+\tmsg->ports[idx].idx       = idx;\n+\tmsg->ports[idx].info      = nbi & NFP_FLOWER_CMSG_MAC_REPR_NBI;\n+\tmsg->ports[idx].nbi_port  = nbi_port;\n+\tmsg->ports[idx].phys_port = phys_port;\n+}\n+\n+int\n+nfp_flower_cmsg_mac_repr(struct nfp_app_flower *app_flower)\n+{\n+\tint i;\n+\tunsigned int nbi;\n+\tunsigned int nbi_port;\n+\tunsigned int phys_port;\n+\tstruct rte_mbuf *mac_repr_cmsg;\n+\tstruct nfp_eth_table *nfp_eth_table;\n+\n+\tnfp_eth_table = app_flower->nfp_eth_table;\n+\n+\tmac_repr_cmsg = rte_pktmbuf_alloc(app_flower->ctrl_pktmbuf_pool);\n+\tif (mac_repr_cmsg == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not allocate mac repr cmsg\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tnfp_flower_cmsg_mac_repr_init(mac_repr_cmsg,\n+\t\t\tapp_flower->num_phyport_reprs);\n+\n+\t/* Fill in the mac repr cmsg */\n+\tfor (i = 0; i < app_flower->num_phyport_reprs; i++) {\n+\t\tnbi = nfp_eth_table->ports[i].nbi;\n+\t\tnbi_port = nfp_eth_table->ports[i].base;\n+\t\tphys_port = nfp_eth_table->ports[i].index;\n+\n+\t\tnfp_flower_cmsg_mac_repr_fill(mac_repr_cmsg, i, nbi, nbi_port,\n+\t\t\t\tphys_port);\n+\t}\n+\n+\t/* Send the cmsg via the ctrl vNIC */\n+\treturn nfp_flower_ctrl_vnic_xmit(app_flower, mac_repr_cmsg);\n+}\n+\n+int\n+nfp_flower_cmsg_repr_reify(struct nfp_app_flower *app_flower,\n+\t\tstruct nfp_flower_representor *repr)\n+{\n+\tstruct rte_mbuf *mbuf;\n+\tstruct nfp_flower_cmsg_port_reify *msg;\n+\n+\tmbuf = rte_pktmbuf_alloc(app_flower->ctrl_pktmbuf_pool);\n+\tif (mbuf == NULL) {\n+\t\tPMD_INIT_LOG(DEBUG, \"alloc mbuf for repr reify failed\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmsg = (struct nfp_flower_cmsg_port_reify *)nfp_flower_cmsg_init(mbuf,\n+\t\t\tNFP_FLOWER_CMSG_TYPE_PORT_REIFY, sizeof(*msg));\n+\n+\tmsg->portnum  = rte_cpu_to_be_32(repr->port_id);\n+\tmsg->reserved = 0;\n+\tmsg->info     = rte_cpu_to_be_16(1);\n+\n+\treturn nfp_flower_ctrl_vnic_xmit(app_flower, mbuf);\n+}\n+\n+int\n+nfp_flower_cmsg_port_mod(struct nfp_app_flower *app_flower,\n+\t\tuint32_t port_id, bool carrier_ok)\n+{\n+\tstruct nfp_flower_cmsg_port_mod *msg;\n+\tstruct rte_mbuf *mbuf;\n+\n+\tmbuf = rte_pktmbuf_alloc(app_flower->ctrl_pktmbuf_pool);\n+\tif (mbuf == NULL) {\n+\t\tPMD_INIT_LOG(DEBUG, \"alloc mbuf for repr portmod failed\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmsg = (struct nfp_flower_cmsg_port_mod *)nfp_flower_cmsg_init(mbuf,\n+\t\t\tNFP_FLOWER_CMSG_TYPE_PORT_MOD, sizeof(*msg));\n+\n+\tmsg->portnum  = rte_cpu_to_be_32(port_id);\n+\tmsg->reserved = 0;\n+\tmsg->info     = carrier_ok;\n+\tmsg->mtu      = 9000;\n+\n+\treturn nfp_flower_ctrl_vnic_xmit(app_flower, mbuf);\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h\nnew file mode 100644\nindex 0000000..9f137d4\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h\n@@ -0,0 +1,173 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef _NFP_CMSG_H_\n+#define _NFP_CMSG_H_\n+\n+#include <rte_byteorder.h>\n+#include <rte_ether.h>\n+\n+struct nfp_flower_cmsg_hdr {\n+\trte_be16_t pad;\n+\tuint8_t type;\n+\tuint8_t version;\n+};\n+\n+/* Types defined for control messages */\n+enum nfp_flower_cmsg_type {\n+\tNFP_FLOWER_CMSG_TYPE_FLOW_ADD       = 0,\n+\tNFP_FLOWER_CMSG_TYPE_FLOW_MOD       = 1,\n+\tNFP_FLOWER_CMSG_TYPE_FLOW_DEL       = 2,\n+\tNFP_FLOWER_CMSG_TYPE_LAG_CONFIG     = 4,\n+\tNFP_FLOWER_CMSG_TYPE_PORT_REIFY     = 6,\n+\tNFP_FLOWER_CMSG_TYPE_MAC_REPR       = 7,\n+\tNFP_FLOWER_CMSG_TYPE_PORT_MOD       = 8,\n+\tNFP_FLOWER_CMSG_TYPE_MERGE_HINT     = 9,\n+\tNFP_FLOWER_CMSG_TYPE_NO_NEIGH       = 10,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_MAC        = 11,\n+\tNFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS    = 12,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_NEIGH      = 13,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_IPS        = 14,\n+\tNFP_FLOWER_CMSG_TYPE_FLOW_STATS     = 15,\n+\tNFP_FLOWER_CMSG_TYPE_PORT_ECHO      = 16,\n+\tNFP_FLOWER_CMSG_TYPE_QOS_MOD        = 18,\n+\tNFP_FLOWER_CMSG_TYPE_QOS_DEL        = 19,\n+\tNFP_FLOWER_CMSG_TYPE_QOS_STATS      = 20,\n+\tNFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE   = 21,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_IPS_V6     = 22,\n+\tNFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6    = 23,\n+\tNFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6   = 24,\n+\tNFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 = 25,\n+\tNFP_FLOWER_CMSG_TYPE_MAX            = 32,\n+};\n+\n+/*\n+ * NFP_FLOWER_CMSG_TYPE_MAC_REPR\n+ *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n+ *    -----\\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n+ *     Word +---------------+-----------+---+---------------+---------------+\n+ *       0  |                  spare                        |Number of ports|\n+ *          +---------------+-----------+---+---------------+---------------+\n+ *       1  |    Index      |   spare   |NBI|  Port on NBI  | Chip-wide port|\n+ *          +---------------+-----------+---+---------------+---------------+\n+ *                                        ....\n+ *          +---------------+-----------+---+---------------+---------------+\n+ *     N-1  |    Index      |   spare   |NBI|  Port on NBI  | Chip-wide port|\n+ *          +---------------+-----------+---+---------------+---------------+\n+ *     N    |    Index      |   spare   |NBI|  Port on NBI  | Chip-wide port|\n+ *          +---------------+-----------+---+---------------+---------------+\n+ *\n+ *          Index: index into the eth table\n+ *          NBI (bits 17-16): NBI number (0-3)\n+ *          Port on NBI (bits 15-8): “base” in the driver\n+ *            this forms NBIX.PortY notation as the NSP eth table.\n+ *          \"Chip-wide\" port (bits 7-0):\n+ */\n+struct nfp_flower_cmsg_mac_repr {\n+\tuint8_t reserved[3];\n+\tuint8_t num_ports;\n+\tstruct {\n+\t\tuint8_t idx;\n+\t\tuint8_t info;\n+\t\tuint8_t nbi_port;\n+\t\tuint8_t phys_port;\n+\t} ports[0];\n+};\n+\n+/*\n+ * NFP_FLOWER_CMSG_TYPE_PORT_REIFY\n+ *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n+ *    -----\\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n+ *    Word  +-------+-------+---+---+-------+---+---+-----------+-----------+\n+ *       0  |Port Ty|Sys ID |NIC|Rsv| Spare |PCI|typ|    vNIC   |  queue    |\n+ *          +-------+-----+-+---+---+-------+---+---+-----------+---------+-+\n+ *       1  |                             Spare                           |E|\n+ *          +-------------------------------------------------------------+-+\n+ *          E: 1 = Representor exists, 0 = Representor does not exist\n+ */\n+struct nfp_flower_cmsg_port_reify {\n+\trte_be32_t portnum;\n+\trte_be16_t reserved;\n+\trte_be16_t info;\n+};\n+\n+/*\n+ * NFP_FLOWER_CMSG_TYPE_PORT_MOD\n+ *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n+ *    -----\\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n+ *    Word  +-------+-------+---+---+-------+---+---+-------+---+-----------+\n+ *       0  |Port Ty|Sys ID |NIC|Rsv|       Reserved        |    Port       |\n+ *          +-------+-------+---+---+-----+-+---+---+-------+---+-----------+\n+ *       1  |            Spare            |L|              MTU              |\n+ *          +-----------------------------+-+-------------------------------+\n+ *        L: Link or Admin state bit. When message is generated by host, this\n+ *           bit indicates the admin state (0=down, 1=up). When generated by\n+ *           NFP, it indicates the link state (0=down, 1=up)\n+ *\n+ *        Port Type (word 1, bits 31 to 28) = 1 (Physical Network)\n+ *        Port: “Chip-wide number” as assigned by BSP\n+ *\n+ *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n+ *    -----\\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n+ *    Word  +-------+-------+---+---+-------+---+---+-------+---+-----------+\n+ *       0  |Port Ty|Sys ID |NIC|Rsv| Spare |PCI|typ|    vNIC   |  queue    |\n+ *          +-------+-----+-+---+---+---+-+-+---+---+-------+---+-----------+\n+ *       1  |            Spare            |L|              MTU              |\n+ *          +-----------------------------+-+-------------------------------+\n+ *        L: Link or Admin state bit. When message is generated by host, this\n+ *           bit indicates the admin state (0=down, 1=up). When generated by\n+ *           NFP, it indicates the link state (0=down, 1=up)\n+ *\n+ *        Port Type (word 1, bits 31 to 28) = 2 (PCIE)\n+ */\n+struct nfp_flower_cmsg_port_mod {\n+\trte_be32_t portnum;\n+\tuint8_t reserved;\n+\tuint8_t info;\n+\trte_be16_t mtu;\n+};\n+\n+enum nfp_flower_cmsg_port_type {\n+\tNFP_FLOWER_CMSG_PORT_TYPE_UNSPEC     = 0x0,\n+\tNFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT  = 0x1,\n+\tNFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT  = 0x2,\n+\tNFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT = 0x3,\n+};\n+\n+enum nfp_flower_cmsg_port_vnic_type {\n+\tNFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF   = 0x0,\n+\tNFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF   = 0x1,\n+\tNFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL = 0x2,\n+};\n+\n+#define NFP_FLOWER_CMSG_MAC_REPR_NBI            (0x3)\n+\n+#define NFP_FLOWER_CMSG_HLEN            sizeof(struct nfp_flower_cmsg_hdr)\n+#define NFP_FLOWER_CMSG_VER1            1\n+#define NFP_NET_META_PORTID             5\n+#define NFP_META_PORT_ID_CTRL           ~0U\n+\n+#define NFP_FLOWER_CMSG_PORT_TYPE(x)            (((x) >> 28) & 0xf)  /* [31,28] */\n+#define NFP_FLOWER_CMSG_PORT_SYS_ID(x)          (((x) >> 24) & 0xf)  /* [24,27] */\n+#define NFP_FLOWER_CMSG_PORT_NFP_ID(x)          (((x) >> 22) & 0x3)  /* [22,23] */\n+#define NFP_FLOWER_CMSG_PORT_PCI(x)             (((x) >> 14) & 0x3)  /* [14,15] */\n+#define NFP_FLOWER_CMSG_PORT_VNIC_TYPE(x)       (((x) >> 12) & 0x3)  /* [12,13] */\n+#define NFP_FLOWER_CMSG_PORT_VNIC(x)            (((x) >> 6) & 0x3f)  /* [6,11] */\n+#define NFP_FLOWER_CMSG_PORT_PCIE_Q(x)          ((x) & 0x3f)         /* [0,5] */\n+#define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(x)   ((x) & 0xff)         /* [0,7] */\n+\n+static inline char*\n+nfp_flower_cmsg_get_data(struct rte_mbuf *m)\n+{\n+\treturn rte_pktmbuf_mtod(m, char *) + 4 + 4 + NFP_FLOWER_CMSG_HLEN;\n+}\n+\n+int nfp_flower_cmsg_mac_repr(struct nfp_app_flower *app_flower);\n+int nfp_flower_cmsg_repr_reify(struct nfp_app_flower *app_flower,\n+\t\tstruct nfp_flower_representor *repr);\n+int nfp_flower_cmsg_port_mod(struct nfp_app_flower *app_flower,\n+\t\tuint32_t port_id, bool carrier_ok);\n+\n+#endif /* _NFP_CMSG_H_ */\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nnew file mode 100644\nindex 0000000..9f23a23\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -0,0 +1,508 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include <rte_common.h>\n+#include <ethdev_pci.h>\n+\n+#include \"../nfp_common.h\"\n+#include \"../nfp_logs.h\"\n+#include \"../nfp_ctrl.h\"\n+#include \"../nfp_rxtx.h\"\n+#include \"../nfpcore/nfp_mip.h\"\n+#include \"../nfpcore/nfp_rtsym.h\"\n+#include \"../nfpcore/nfp_nsp.h\"\n+#include \"nfp_flower.h\"\n+#include \"nfp_flower_representor.h\"\n+#include \"nfp_flower_ctrl.h\"\n+#include \"nfp_flower_cmsg.h\"\n+\n+static int\n+nfp_flower_repr_link_update(__rte_unused struct rte_eth_dev *ethdev,\n+\t\t__rte_unused int wait_to_complete)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_dev_infos_get(__rte_unused struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_dev_info *dev_info)\n+{\n+\t/* Hardcoded pktlen and queues for now */\n+\tdev_info->max_rx_queues = 1;\n+\tdev_info->max_tx_queues = 1;\n+\tdev_info->min_rx_bufsize = RTE_ETHER_MIN_MTU;\n+\tdev_info->max_rx_pktlen = 9000;\n+\n+\tdev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;\n+\tdev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |\n+\t\t\tRTE_ETH_RX_OFFLOAD_UDP_CKSUM |\n+\t\t\tRTE_ETH_RX_OFFLOAD_TCP_CKSUM;\n+\n+\tdev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_VLAN_INSERT;\n+\tdev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |\n+\t\t\tRTE_ETH_TX_OFFLOAD_UDP_CKSUM |\n+\t\t\tRTE_ETH_TX_OFFLOAD_TCP_CKSUM;\n+\tdev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_TSO;\n+\tdev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;\n+\n+\tdev_info->max_mac_addrs = 1;\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_dev_configure(__rte_unused struct rte_eth_dev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_dev_start(struct rte_eth_dev *dev)\n+{\n+\tstruct nfp_app_flower *app_flower;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = (struct nfp_flower_representor *)dev->data->dev_private;\n+\tapp_flower = repr->app_flower;\n+\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\tnfp_eth_set_configured(app_flower->pf_hw->pf_dev->cpp,\n+\t\t\t\trepr->nfp_idx, 1);\n+\n+\tnfp_flower_cmsg_port_mod(app_flower, repr->port_id, true);\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_dev_stop(struct rte_eth_dev *dev)\n+{\n+\tstruct nfp_app_flower *app_flower;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = (struct nfp_flower_representor *)dev->data->dev_private;\n+\tapp_flower = repr->app_flower;\n+\n+\tnfp_flower_cmsg_port_mod(app_flower, repr->port_id, false);\n+\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\tnfp_eth_set_configured(app_flower->pf_hw->pf_dev->cpp,\n+\t\t\t\trepr->nfp_idx, 0);\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_rx_queue_setup(struct rte_eth_dev *dev,\n+\t\tuint16_t rx_queue_id,\n+\t\t__rte_unused uint16_t nb_rx_desc,\n+\t\tunsigned int socket_id,\n+\t\t__rte_unused const struct rte_eth_rxconf *rx_conf,\n+\t\t__rte_unused struct rte_mempool *mb_pool)\n+{\n+\tstruct nfp_net_rxq *rxq;\n+\tstruct nfp_net_hw *pf_hw;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = (struct nfp_flower_representor *)dev->data->dev_private;\n+\tpf_hw = repr->app_flower->pf_hw;\n+\n+\t/* Allocating rx queue data structure */\n+\trxq = rte_zmalloc_socket(\"ethdev RX queue\", sizeof(struct nfp_net_rxq),\n+\t\t\tRTE_CACHE_LINE_SIZE, socket_id);\n+\tif (rxq == NULL)\n+\t\treturn -ENOMEM;\n+\n+\trxq->hw = pf_hw;\n+\trxq->qidx = rx_queue_id;\n+\trxq->port_id = dev->data->port_id;\n+\tdev->data->rx_queues[rx_queue_id] = rxq;\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_tx_queue_setup(struct rte_eth_dev *dev,\n+\t\tuint16_t tx_queue_id,\n+\t\t__rte_unused uint16_t nb_tx_desc,\n+\t\tunsigned int socket_id,\n+\t\t__rte_unused const struct rte_eth_txconf *tx_conf)\n+{\n+\tstruct nfp_net_txq *txq;\n+\tstruct nfp_net_hw *pf_hw;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = (struct nfp_flower_representor *)dev->data->dev_private;\n+\tpf_hw = repr->app_flower->pf_hw;\n+\n+\t/* Allocating tx queue data structure */\n+\ttxq = rte_zmalloc_socket(\"ethdev TX queue\", sizeof(struct nfp_net_txq),\n+\t\t\tRTE_CACHE_LINE_SIZE, socket_id);\n+\tif (txq == NULL)\n+\t\treturn -ENOMEM;\n+\n+\ttxq->hw = pf_hw;\n+\ttxq->qidx = tx_queue_id;\n+\ttxq->port_id = dev->data->port_id;\n+\tdev->data->tx_queues[tx_queue_id] = txq;\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_stats_get(struct rte_eth_dev *ethdev,\n+\t\tstruct rte_eth_stats *stats)\n+{\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = (struct nfp_flower_representor *)ethdev->data->dev_private;\n+\trte_memcpy(stats, &repr->repr_stats, sizeof(struct rte_eth_stats));\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_stats_reset(__rte_unused struct rte_eth_dev *ethdev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_promiscuous_enable(__rte_unused struct rte_eth_dev *ethdev)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+nfp_flower_repr_promiscuous_disable(__rte_unused struct rte_eth_dev *ethdev)\n+{\n+\treturn 0;\n+}\n+\n+static void\n+nfp_flower_repr_mac_addr_remove(__rte_unused struct rte_eth_dev *ethdev,\n+\t\t__rte_unused uint32_t index)\n+{\n+}\n+\n+static int\n+nfp_flower_repr_mac_addr_set(__rte_unused struct rte_eth_dev *ethdev,\n+\t\t__rte_unused struct rte_ether_addr *mac_addr)\n+{\n+\treturn 0;\n+}\n+\n+static uint16_t\n+nfp_flower_repr_rx_burst(void *rx_queue,\n+\t\tstruct rte_mbuf **rx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\tunsigned int available = 0;\n+\tunsigned int total_dequeue;\n+\tstruct nfp_net_rxq *rxq;\n+\tstruct rte_eth_dev *dev;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trxq = rx_queue;\n+\tif (unlikely(rxq == NULL)) {\n+\t\tPMD_RX_LOG(ERR, \"RX Bad queue\");\n+\t\treturn 0;\n+\t}\n+\n+\tdev = &rte_eth_devices[rxq->port_id];\n+\trepr = dev->data->dev_private;\n+\tif (unlikely(repr->ring == NULL)) {\n+\t\tPMD_RX_LOG(ERR, \"representor %s has no ring configured!\",\n+\t\t\t\trepr->name);\n+\t\treturn 0;\n+\t}\n+\n+\ttotal_dequeue = rte_ring_dequeue_burst(repr->ring, (void *)rx_pkts,\n+\t\t\tnb_pkts, &available);\n+\tif (total_dequeue) {\n+\t\tPMD_RX_LOG(DEBUG, \"Representor Rx burst for %s, port_id: 0x%x, \"\n+\t\t\t\t\"received: %u, available: %u\", repr->name,\n+\t\t\t\trepr->port_id, total_dequeue, available);\n+\n+\t\trepr->repr_stats.ipackets += total_dequeue;\n+\t}\n+\n+\treturn total_dequeue;\n+}\n+\n+static uint16_t\n+nfp_flower_repr_tx_burst(void *tx_queue,\n+\t\tstruct rte_mbuf **tx_pkts,\n+\t\tuint16_t nb_pkts)\n+{\n+\tuint16_t i;\n+\tuint16_t sent;\n+\tchar *meta_offset;\n+\tstruct nfp_net_txq *txq;\n+\tstruct nfp_net_hw *pf_hw;\n+\tstruct rte_eth_dev *dev;\n+\tstruct rte_eth_dev *repr_dev;\n+\tstruct nfp_flower_representor *repr;\n+\n+\ttxq = tx_queue;\n+\tif (unlikely(txq == NULL)) {\n+\t\tPMD_RX_LOG(ERR, \"TX Bad queue\");\n+\t\treturn 0;\n+\t}\n+\n+\t/* This points to the PF vNIC that owns this representor */\n+\tpf_hw = txq->hw;\n+\tdev = pf_hw->eth_dev;\n+\n+\t/* Grab a handle to the representor struct */\n+\trepr_dev = &rte_eth_devices[txq->port_id];\n+\trepr = repr_dev->data->dev_private;\n+\n+\tfor (i = 0; i < nb_pkts; i++) {\n+\t\tmeta_offset = rte_pktmbuf_prepend(tx_pkts[i], FLOWER_PKT_DATA_OFFSET);\n+\t\t*(uint32_t *)meta_offset = rte_cpu_to_be_32(NFP_NET_META_PORTID);\n+\t\tmeta_offset += 4;\n+\t\t*(uint32_t *)meta_offset = rte_cpu_to_be_32(repr->port_id);\n+\t}\n+\n+\t/* Only using Tx queue 0 for now. */\n+\tsent = rte_eth_tx_burst(dev->data->port_id, 0, tx_pkts, nb_pkts);\n+\tif (sent) {\n+\t\tPMD_TX_LOG(DEBUG, \"Representor Tx burst for %s, port_id: 0x%x \"\n+\t\t\t\"transmitted: %u\\n\", repr->name, repr->port_id, sent);\n+\t\trepr->repr_stats.opackets += sent;\n+\t}\n+\n+\treturn sent;\n+}\n+\n+static const struct eth_dev_ops nfp_flower_repr_dev_ops = {\n+\t.dev_infos_get        = nfp_flower_repr_dev_infos_get,\n+\n+\t.dev_start            = nfp_flower_repr_dev_start,\n+\t.dev_configure        = nfp_flower_repr_dev_configure,\n+\t.dev_stop             = nfp_flower_repr_dev_stop,\n+\n+\t.rx_queue_setup       = nfp_flower_repr_rx_queue_setup,\n+\t.tx_queue_setup       = nfp_flower_repr_tx_queue_setup,\n+\n+\t.link_update          = nfp_flower_repr_link_update,\n+\n+\t.stats_get            = nfp_flower_repr_stats_get,\n+\t.stats_reset          = nfp_flower_repr_stats_reset,\n+\n+\t.promiscuous_enable   = nfp_flower_repr_promiscuous_enable,\n+\t.promiscuous_disable  = nfp_flower_repr_promiscuous_disable,\n+\n+\t.mac_addr_remove      = nfp_flower_repr_mac_addr_remove,\n+\t.mac_addr_set         = nfp_flower_repr_mac_addr_set,\n+};\n+\n+static uint32_t\n+nfp_flower_get_phys_port_id(uint8_t port)\n+{\n+\treturn (NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT << 28) | port;\n+}\n+\n+static uint32_t\n+nfp_get_pcie_port_id(struct nfp_cpp *cpp,\n+\t\tint type,\n+\t\tuint8_t vnic,\n+\t\tuint8_t queue)\n+{\n+\tuint8_t nfp_pcie;\n+\tuint32_t port_id;\n+\n+\tnfp_pcie = NFP_CPP_INTERFACE_UNIT_of(nfp_cpp_interface(cpp));\n+\tport_id = ((nfp_pcie & 0x3) << 14) |\n+\t\t  ((type & 0x3) << 12) |\n+\t\t  ((vnic & 0x3f) << 6) |\n+\t\t  (queue & 0x3f) |\n+\t\t  ((NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT & 0xf) << 28);\n+\n+\treturn port_id;\n+}\n+\n+static int\n+nfp_flower_repr_init(struct rte_eth_dev *eth_dev,\n+\t\tvoid *init_params)\n+{\n+\tint ret;\n+\tunsigned int numa_node;\n+\tchar ring_name[RTE_ETH_NAME_MAX_LEN];\n+\tstruct nfp_app_flower *app_flower;\n+\tstruct nfp_flower_representor *repr;\n+\tstruct nfp_flower_representor *init_repr_data;\n+\n+\t/* Cast the input representor data to the correct struct here */\n+\tinit_repr_data = (struct nfp_flower_representor *)init_params;\n+\n+\tapp_flower = init_repr_data->app_flower;\n+\n+\t/* Memory has been allocated in the eth_dev_create() function */\n+\trepr = eth_dev->data->dev_private;\n+\n+\t/*\n+\t * We need multiproduce rings as we can have multiple PF ports.\n+\t * On the other hand, we need single consumer rings, as just one\n+\t * representor PMD will try to read from the ring.\n+\t */\n+\tsnprintf(ring_name, sizeof(ring_name), \"%s_%s\",\n+\t\tinit_repr_data->name, \"ring\");\n+\tnuma_node = rte_socket_id();\n+\trepr->ring = rte_ring_create(ring_name, 256, numa_node, RING_F_SC_DEQ);\n+\tif (repr->ring == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"rte_ring_create failed for %s\\n\", ring_name);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\t/* Copy data here from the input representor template*/\n+\trepr->vf_id            = init_repr_data->vf_id;\n+\trepr->switch_domain_id = init_repr_data->switch_domain_id;\n+\trepr->port_id          = init_repr_data->port_id;\n+\trepr->nfp_idx          = init_repr_data->nfp_idx;\n+\trepr->repr_type        = init_repr_data->repr_type;\n+\trepr->app_flower       = init_repr_data->app_flower;\n+\n+\tsnprintf(repr->name, sizeof(repr->name), \"%s\", init_repr_data->name);\n+\n+\teth_dev->dev_ops = &nfp_flower_repr_dev_ops;\n+\n+\teth_dev->rx_pkt_burst = nfp_flower_repr_rx_burst;\n+\teth_dev->tx_pkt_burst = nfp_flower_repr_tx_burst;\n+\n+\teth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;\n+\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\teth_dev->data->representor_id = repr->vf_id;\n+\telse\n+\t\teth_dev->data->representor_id = repr->vf_id +\n+\t\t\t\tapp_flower->num_phyport_reprs;\n+\n+\t/* This backer port is that of the eth_device created for the PF vNIC */\n+\teth_dev->data->backer_port_id = app_flower->pf_hw->eth_dev->data->port_id;\n+\n+\t/* Only single queues for representor devices */\n+\teth_dev->data->nb_rx_queues = 1;\n+\teth_dev->data->nb_tx_queues = 1;\n+\n+\t/* Allocating memory for mac addr */\n+\teth_dev->data->mac_addrs = rte_zmalloc(\"mac_addr\",\n+\t\tRTE_ETHER_ADDR_LEN, 0);\n+\tif (eth_dev->data->mac_addrs == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Failed to allocate memory for repr MAC\");\n+\t\tret = -ENOMEM;\n+\t\tgoto ring_cleanup;\n+\t}\n+\n+\trte_ether_addr_copy(&init_repr_data->mac_addr, &repr->mac_addr);\n+\trte_ether_addr_copy(&init_repr_data->mac_addr, eth_dev->data->mac_addrs);\n+\n+\t/* Send reify message to hardware to inform it about the new repr */\n+\tret = nfp_flower_cmsg_repr_reify(app_flower, repr);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(WARNING, \"Failed to send repr reify message\");\n+\t\tgoto mac_cleanup;\n+\t}\n+\n+\t/* Add repr to correct array */\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\tapp_flower->phy_reprs[repr->nfp_idx] = repr;\n+\telse\n+\t\tapp_flower->vf_reprs[repr->vf_id] = repr;\n+\n+\treturn 0;\n+\n+mac_cleanup:\n+\trte_free(eth_dev->data->mac_addrs);\n+ring_cleanup:\n+\trte_ring_free(repr->ring);\n+\n+\treturn ret;\n+}\n+\n+int\n+nfp_flower_repr_alloc(struct nfp_app_flower *app_flower)\n+{\n+\tint i;\n+\tint ret;\n+\tstruct rte_eth_dev *eth_dev;\n+\tstruct nfp_eth_table *nfp_eth_table;\n+\tstruct nfp_eth_table_port *eth_port;\n+\tstruct nfp_flower_representor flower_repr = {\n+\t\t.switch_domain_id = app_flower->switch_domain_id,\n+\t\t.app_flower       = app_flower,\n+\t};\n+\n+\tnfp_eth_table = app_flower->nfp_eth_table;\n+\teth_dev = app_flower->pf_hw->eth_dev;\n+\n+\t/* Send a NFP_FLOWER_CMSG_TYPE_MAC_REPR cmsg to hardware*/\n+\tret = nfp_flower_cmsg_mac_repr(app_flower);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(ERR, \"Cloud not send mac repr cmsgs\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* Create a rte_eth_dev for every phyport representor */\n+\tfor (i = 0; i < app_flower->num_phyport_reprs; i++) {\n+\t\teth_port = &nfp_eth_table->ports[i];\n+\t\tflower_repr.repr_type = NFP_REPR_TYPE_PHYS_PORT;\n+\t\tflower_repr.port_id = nfp_flower_get_phys_port_id(eth_port->index);\n+\t\tflower_repr.nfp_idx = eth_port->eth_index;\n+\t\tflower_repr.vf_id = i;\n+\n+\t\t/* Copy the real mac of the interface to the representor struct */\n+\t\trte_ether_addr_copy((struct rte_ether_addr *)eth_port->mac_addr,\n+\t\t\t\t&flower_repr.mac_addr);\n+\t\tsprintf(flower_repr.name, \"flower_repr_p%d\", i);\n+\n+\t\t/*\n+\t\t * Create a eth_dev for this representor\n+\t\t * This will also allocate private memory for the device\n+\t\t */\n+\t\tret = rte_eth_dev_create(eth_dev->device, flower_repr.name,\n+\t\t\t\tsizeof(struct nfp_flower_representor),\n+\t\t\t\tNULL, NULL, nfp_flower_repr_init, &flower_repr);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Cloud not create eth_dev for repr\");\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (i < app_flower->num_phyport_reprs)\n+\t\treturn ret;\n+\n+\t/*\n+\t * Now allocate eth_dev's for VF representors.\n+\t * Also send reify messages\n+\t */\n+\tfor (i = 0; i < app_flower->num_vf_reprs; i++) {\n+\t\tflower_repr.repr_type = NFP_REPR_TYPE_VF;\n+\t\tflower_repr.port_id = nfp_get_pcie_port_id(app_flower->pf_hw->cpp,\n+\t\t\t\tNFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF, i, 0);\n+\t\tflower_repr.nfp_idx = 0;\n+\t\tflower_repr.vf_id = i;\n+\n+\t\t/* VF reprs get a random MAC address */\n+\t\trte_eth_random_addr(flower_repr.mac_addr.addr_bytes);\n+\n+\t\tsprintf(flower_repr.name, \"flower_repr_vf%d\", i);\n+\n+\t\t /* This will also allocate private memory for the device*/\n+\t\tret = rte_eth_dev_create(eth_dev->device, flower_repr.name,\n+\t\t\t\tsizeof(struct nfp_flower_representor),\n+\t\t\t\tNULL, NULL, nfp_flower_repr_init, &flower_repr);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Cloud not create eth_dev for repr\");\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (i < app_flower->num_vf_reprs)\n+\t\treturn ret;\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h\nnew file mode 100644\nindex 0000000..6ee54f1\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.h\n@@ -0,0 +1,39 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef _NFP_FLOWER_REPRESENTOR_H_\n+#define _NFP_FLOWER_REPRESENTOR_H_\n+\n+/*\n+ * enum nfp_repr_type - type of representor\n+ * @NFP_REPR_TYPE_PHYS_PORT:   external NIC port\n+ * @NFP_REPR_TYPE_PF:          physical function\n+ * @NFP_REPR_TYPE_VF:          virtual function\n+ * @NFP_REPR_TYPE_MAX:         number of representor types\n+ */\n+enum nfp_repr_type {\n+\tNFP_REPR_TYPE_PHYS_PORT = 0,\n+\tNFP_REPR_TYPE_PF,\n+\tNFP_REPR_TYPE_VF,\n+\tNFP_REPR_TYPE_MAX,\n+};\n+\n+struct nfp_flower_representor {\n+\tuint16_t vf_id;\n+\tuint16_t switch_domain_id;\n+\tuint32_t repr_type;\n+\tuint32_t port_id;\n+\tuint32_t nfp_idx;    /* only valid for the repr of physical port */\n+\tchar name[RTE_ETH_NAME_MAX_LEN];\n+\tstruct rte_ether_addr mac_addr;\n+\tstruct nfp_app_flower *app_flower;\n+\tstruct rte_ring *ring;\n+\tstruct rte_eth_link *link;\n+\tstruct rte_eth_stats repr_stats;\n+};\n+\n+int nfp_flower_repr_alloc(struct nfp_app_flower *app_flower);\n+\n+#endif /* _NFP_FLOWER_REPRESENTOR_H_ */\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 8710213..8a63979 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -7,7 +7,9 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')\n endif\n sources = files(\n         'flower/nfp_flower.c',\n+        'flower/nfp_flower_cmsg.c',\n         'flower/nfp_flower_ctrl.c',\n+        'flower/nfp_flower_representor.c',\n         'nfpcore/nfp_cpp_pcie_ops.c',\n         'nfpcore/nfp_nsp.c',\n         'nfpcore/nfp_cppcore.c',\ndiff --git a/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c b/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c\nindex 08bc4e8..22c8bc4 100644\n--- a/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c\n+++ b/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c\n@@ -91,7 +91,10 @@\n  * @refcnt:\tnumber of current users\n  * @iomem:\tmapped IO memory\n  */\n+#define NFP_BAR_MIN 1\n+#define NFP_BAR_MID 5\n #define NFP_BAR_MAX 7\n+\n struct nfp_bar {\n \tstruct nfp_pcie_user *nfp;\n \tuint32_t barcfg;\n@@ -292,6 +295,7 @@ struct nfp_pcie_user {\n  * BAR0.0: Reserved for General Mapping (for MSI-X access to PCIe SRAM)\n  *\n  *         Halving PCItoCPPBars for primary and secondary processes.\n+ *         For CoreNIC firmware:\n  *         NFP PMD just requires two fixed slots, one for configuration BAR,\n  *         and another for accessing the hw queues. Another slot is needed\n  *         for setting the link up or down. Secondary processes do not need\n@@ -301,6 +305,9 @@ struct nfp_pcie_user {\n  *         supported. Due to this requirement and future extensions requiring\n  *         new slots per process, only one secondary process is supported by\n  *         now.\n+ *         For Flower firmware:\n+ *         NFP PMD need another fixed slots, used as the configureation BAR\n+ *         for ctrl vNIC.\n  */\n static int\n nfp_enable_bars(struct nfp_pcie_user *nfp)\n@@ -309,11 +316,11 @@ struct nfp_pcie_user {\n \tint x, start, end;\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n-\t\tstart = 4;\n-\t\tend = 1;\n+\t\tstart = NFP_BAR_MID;\n+\t\tend = NFP_BAR_MIN;\n \t} else {\n-\t\tstart = 7;\n-\t\tend = 4;\n+\t\tstart = NFP_BAR_MAX;\n+\t\tend = NFP_BAR_MID;\n \t}\n \tfor (x = start; x > end; x--) {\n \t\tbar = &nfp->bar[x - 1];\n@@ -341,11 +348,11 @@ struct nfp_pcie_user {\n \tint x, start, end;\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n-\t\tstart = 4;\n-\t\tend = 1;\n+\t\tstart = NFP_BAR_MID;\n+\t\tend = NFP_BAR_MIN;\n \t} else {\n-\t\tstart = 7;\n-\t\tend = 4;\n+\t\tstart = NFP_BAR_MAX;\n+\t\tend = NFP_BAR_MID;\n \t}\n \tfor (x = start; x > end; x--) {\n \t\tbar = &nfp->bar[x - 1];\n@@ -364,11 +371,11 @@ struct nfp_pcie_user {\n \tint x, start, end;\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n-\t\tstart = 4;\n-\t\tend = 1;\n+\t\tstart = NFP_BAR_MID;\n+\t\tend = NFP_BAR_MIN;\n \t} else {\n-\t\tstart = 7;\n-\t\tend = 4;\n+\t\tstart = NFP_BAR_MAX;\n+\t\tend = NFP_BAR_MID;\n \t}\n \n \tfor (x = start; x > end; x--) {\n",
    "prefixes": [
        "v4",
        "10/12"
    ]
}