get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 116339,
    "url": "http://patches.dpdk.org/api/patches/116339/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1663238669-12244-5-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": "<1663238669-12244-5-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1663238669-12244-5-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-09-15T10:44:21",
    "name": "[v9,04/12] net/nfp: add initial flower firmware support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9561c9a0b9759c84ebd88ac9283330eb8d0a5cc1",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.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/1663238669-12244-5-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 24678,
            "url": "http://patches.dpdk.org/api/series/24678/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=24678",
            "date": "2022-09-15T10:44:17",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 9,
            "mbox": "http://patches.dpdk.org/series/24678/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/116339/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/116339/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 19E7BA00C5;\n\tThu, 15 Sep 2022 12:45:20 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DC5134281B;\n\tThu, 15 Sep 2022 12:45:01 +0200 (CEST)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2139.outbound.protection.outlook.com [40.107.220.139])\n by mails.dpdk.org (Postfix) with ESMTP id 5C3104281E\n for <dev@dpdk.org>; Thu, 15 Sep 2022 12:45:00 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SA0PR13MB4158.namprd13.prod.outlook.com (2603:10b6:806:9b::9) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.5; Thu, 15 Sep\n 2022 10:44:58 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::819:38c:6513:bf15%4]) with mapi id 15.20.5632.012; Thu, 15 Sep 2022\n 10:44:58 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=IbhlQS2Gt7lEiobhL7UaXABQYsvbScHXv9iNYfnWvKWjtSfcIfZUCyJrEeuR5t6LkjIOXMnZ05g+0fs+osFNItdtZU0TXSXcfndnQekmIIIPV03BmiEQ42oj2ICA+80BOuDbm0dPHYWrY2a57F6jMIWEobSGEzJEPUIig4qnmD75x9i01TH81A+8UhqhkW380rdg6leLEYvgue+HhR7dlGjJ5YYJiK3oB0Ue3KEwCAuQSnv+EweRUN43nGGtluPyDWxJZHiBE9cGwQAzpjoTH8D1j8Qyio5Qa17kdUP1qZ8HluDoJXxfZj9VELIx3gWiHjaPKUCYCjjdiGSG5Aw5+g==",
        "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=bEvwA9VkEl2s15rJh3+YoW47PzX16s0/HEQeWcsq4ME=;\n b=JK/7TE2MYYUtzT02hAQ+Hk5viD68cEIKD+N6jInBI7z5V7Voyw1k5A6b4+0cjKyY16uN6+dqh7yz2O8lcEeQjyQRVg7BSdRgdrpK23lqH/qZ+ua94V/tDJ6tx/3VoVhejQgMA+1j9u28n6lVFj4bYmTGPy1+lmni2Ec1W/yA87jqo2AcQtXg45ohT1UX5k141E4r0zO0Ei1ehxuZTuY4LG5kQk+t6i9ahrkVH/PVyJkAx5UAXc2n2We6Smvu15EK352G8GNe6OYpEb2A6CBNvjIInmGTrhv6xO5g8XlvtsqxlVqLE/if5DCahqc1qEuvKF5EMPbkJI2cC7Jv7GWITQ==",
        "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=bEvwA9VkEl2s15rJh3+YoW47PzX16s0/HEQeWcsq4ME=;\n b=hUeeIJedAaIBSfBs5/x98ngabk1o/4+pEk0ljFL5kvwVhUwxnOrR3/Gj0/rZg6KyCb5JHtBHPt8ftIHbMvPWOR+O+81FJNuAbeSUW+KVYVDwlMIM9lIY15ereIXUMWO3gCgvi1xHVsYeU5R1ZOBmjXqjZGmlKHhQxSAzJ6TAzvI=",
        "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": "oss-drivers@corigine.com, niklas.soderlund@corigine.com,\n Chaoyong He <chaoyong.he@corigine.com>,\n Heinrich Kuhn <heinrich.kuhn@corigine.com>",
        "Subject": "[PATCH v9 04/12] net/nfp: add initial flower firmware support",
        "Date": "Thu, 15 Sep 2022 18:44:21 +0800",
        "Message-Id": "<1663238669-12244-5-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1663238669-12244-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "BYAPR11CA0071.namprd11.prod.outlook.com\n (2603:10b6:a03:80::48) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|SA0PR13MB4158:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "91d277f9-1043-4b76-5bfa-08da97075582",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n qcSCefwD/4mo44zncN8YZkAISBkNz0LOcdL2CY2fDgTyAVyxtHpLgATeU9GYjeywiyrsEud8/3sM37m6LIvpucyH/JgcPtmZWjUGiGcwrFRBFXVuFwDbQ76R0r2poJERp73FVUlhE9U9UKP53Onc/Q24dAQFYM0Nn1Y/nUNZPL0S2D4/BtkZq6qXNynTphUun9mcttwy/FI7m7CZ2C+A+igtlFy850cowCgPXgMhCW1MALr4rZFBLqY1ZPR9JqOOzeut3s+fFS1IK0MyUydXC5q59k/+Jpxr7/PwH/2kG9Fnk3KURka8y9osYi7wkfeX6Cns7hMRz8ue06aKPeUxmaokv2Yct7tZAm7dFStsRhsM4bjG/uHstqODz2gEpKtLPPiTigx31XCNeynLxa2yQ6kdssOh6qqYH8DHl4x+y5gAgu47KJVmc2uzZSl0nxmwLKIMuNHZ/61S8YEk35jqiJBtz7Bx20CMSjf9u33N4TI0CWc8NsJ53DLJqc2/3o6HnX1znliW7MLGUOvIdIaUghXHQQkSLGr9u7uh+l7uSYZ/KBhTDhhcTymu5yGVCzBaz0Uxiwatr5TRa1wjTKlYmhVTlMLuk0ukZQBBiy1W/ZnNUYKl/tKl4qV157k6DJlWzTwz5ZuAxYvwWD74Ku6EDhxryTgj3isiifqVzZRwKbnzlZ/iqFTXDf0VjIR2UqYGeMdaiXLEYYqVKarv+QxgkxHJPkirPRSZYocIAgVlZ8+u6YPZ9NWnQxxodW2lwyjzrrVmQqO+OA2tGZPgjuhnZA==",
        "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:(13230022)(4636009)(396003)(346002)(366004)(376002)(39840400004)(136003)(451199015)(2616005)(66574015)(38350700002)(38100700002)(186003)(86362001)(83380400001)(107886003)(8676002)(66946007)(66476007)(4326008)(66556008)(44832011)(8936002)(41300700001)(2906002)(5660300002)(6506007)(478600001)(6666004)(316002)(30864003)(6512007)(26005)(6486002)(52116002)(54906003)(6916009)(36756003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?m81+l9I6cZp/obexy9Yl3tnaA1rB?=\n\t=?utf-8?q?Syl5AYbVI3/7yJvPbNjx+mgWUmKN2j1kZ6rCYqVhyCOTPMJPFtvgv33C5qon47ZZs?=\n\t=?utf-8?q?FrOfKVx2BYDvF7+33yRs5NdDhfQDKvhVNJSDdo6j8BJe96rqt5Um8AXjTn0gmaTmt?=\n\t=?utf-8?q?LTYvaA3NMPqXfs1s/rI1WD0OeaWs/KZ3xKt32sCOQb9/1mjDPvydIYwIAc8hDSEvu?=\n\t=?utf-8?q?C+FSQ1ZlEMJ4XDjJj4sOXL+80edpXB9g7pHu2/hjBezkOJwP3M3U/B0gvZeXsxVnL?=\n\t=?utf-8?q?q4ftCbYwZLn8YzFDpeV2xjj9/NCoIaw+pDc98oP/TXlz5KEoTzn5vh1PCVKvfLuDT?=\n\t=?utf-8?q?1w35CUk/0aVAn3d26VaHmUAwZ9t6myk3bXxzvKD4I7D8LyQ8BkvPBRoHn1/VjnZuH?=\n\t=?utf-8?q?BFGUluDqMgv55ELQK8IBeJnEA0R8S8jxS37ZsZxGb1qhN5px3LUWwVCS7jxOWLzcT?=\n\t=?utf-8?q?bUOyTNnxGSiDNYGigqwecRfUxxy6jgLXJdzYZSnZI/cpi6KbnKmTck4QKgEJT/oaJ?=\n\t=?utf-8?q?jCpwaB7d4IX5cVIO9nF2jLCao5GWy0SjaxEgFMX+q1b0ANEJuj9arbDohGKKEIEN7?=\n\t=?utf-8?q?JRP0F8JAZfytyKBQt9Jy2bWNA5zIP2Eb5y01zLXir8DlZ/TUP5TKRERO+APJihlrR?=\n\t=?utf-8?q?s1gqqA9jHtQkSm0hEK7mgiUyCYyiotUZwo1YYPONiivHda/nfitXQbA3hmq/QKw82?=\n\t=?utf-8?q?dCo4CgUWRS3K+eSxmeffCl/Pd9cQuHLVhGFt4budd9sJwgGrTWRPPhK9VDYCkFh+R?=\n\t=?utf-8?q?Jx/VvZt/d/giTKGkU6svsvsxmZV5RWhG5lOsWfREtzz9VhQgjHUbFjMaNpZuq44I4?=\n\t=?utf-8?q?ZsfPWc08FeU1SznPNp27KpLKbqIOssCDbY5n8SuNipb81UqAKFxtkAr4elWN3ztuO?=\n\t=?utf-8?q?giEWxl4rp6NTh5yGIMp9WZAKdHctKAF23WQncKaqUMbq4diJXxOgEljofbSn3ZWqy?=\n\t=?utf-8?q?TofP+d4sbGp7yU3h1Y+yEqUx0xyj25kbsWAtCeGU1bwZb3hENrd8TMArQNWcbjzPF?=\n\t=?utf-8?q?H8ddBZbvDRpPIRPV55iW1tZlXSJ+iChuxN4APGwN7FCEIn19IW/2VwqoI5l/JMS80?=\n\t=?utf-8?q?Ne0r2HInJIOwE0nfmAq02PmVKaPj5/NX4A4y0Q1xASAh5Ymy/sfuFkeOyFd6nZxNn?=\n\t=?utf-8?q?FsF0ne8DzNhf/BRuVFkihXz81nFF5uZXIIklE/0dDzY40ZDr6Hw3Q8rr8JCTLmZ3J?=\n\t=?utf-8?q?/d73nT8JB2HjGqucUp/IFEJhqj3y2B3lcvkZlRNKLMgDclXwP7DNdVoj7f5yr27Pp?=\n\t=?utf-8?q?EYogIHPMr1BNeb38W6i9znBDnzkVSztw4WzEiDj6158VbqtZZDj/HE2IvFHZy59d3?=\n\t=?utf-8?q?2S8MPzyXhdLRgFzurqwDzbbRQ4gi839NKGyfXjYzacba7sZ8fKQPwHRIkrDMYdjFB?=\n\t=?utf-8?q?9dQu3mJSabfVtOXZAD25lnHQRgJqOqh+DpjiO4yn5Lqsv47Ru6dcgQHm3XQAwfoED?=\n\t=?utf-8?q?7EyxMzB0f++y9867sKvhkOilC45BQpnz0hBoKlFNz4lSj7B6GktRhtZbgZAzmID74?=\n\t=?utf-8?q?pDHZuH2k+NX3CKyM5qYX1mLYwzknN6lefg=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SA0PR13MB4158",
        "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": "Adds the basic probing infrastructure to support the flower firmware\napplication.\n\nAdds the cpp service, used for some user tools.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nSigned-off-by: Heinrich Kuhn <heinrich.kuhn@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n doc/guides/nics/nfp.rst                | 13 +++++\n doc/guides/rel_notes/release_22_11.rst |  7 +++\n drivers/net/nfp/flower/nfp_flower.c    | 45 +++++++++++++++++\n drivers/net/nfp/flower/nfp_flower.h    | 16 +++++++\n drivers/net/nfp/meson.build            |  1 +\n drivers/net/nfp/nfp_common.h           |  1 +\n drivers/net/nfp/nfp_cpp_bridge.c       | 88 +++++++++++++++++++++++++++++-----\n drivers/net/nfp/nfp_cpp_bridge.h       |  6 ++-\n drivers/net/nfp/nfp_ethdev.c           | 31 +++++++++++-\n 9 files changed, 192 insertions(+), 16 deletions(-)\n create mode 100644 drivers/net/nfp/flower/nfp_flower.c\n create mode 100644 drivers/net/nfp/flower/nfp_flower.h",
    "diff": "diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst\nindex 55539ac..4faab39 100644\n--- a/doc/guides/nics/nfp.rst\n+++ b/doc/guides/nics/nfp.rst\n@@ -181,3 +181,16 @@ System configuration\n    -k option shows the device driver, if any, that devices are bound to.\n    Depending on the modules loaded at this point the new PCI devices may be\n    bound to nfp_netvf driver.\n+\n+\n+Flow offload\n+------------\n+\n+Use the flower firmware application, some type of Netronome's SmartNICs can\n+offload the flow into cards.\n+\n+The flower firmware application requires the PMD running two services:\n+\n+\t* PF vNIC service: handling the feedback traffic.\n+\t* ctrl vNIC service: communicate between PMD and firmware through\n+\t  control message.\ndiff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst\nindex f601617..6a666aa 100644\n--- a/doc/guides/rel_notes/release_22_11.rst\n+++ b/doc/guides/rel_notes/release_22_11.rst\n@@ -55,6 +55,13 @@ New Features\n      Also, make sure to start the actual text at the margin.\n      =======================================================\n \n+* **Updated Netronome nfp driver.**\n+\n+  Add the needed data structures and logics to support the offload of rte_flow:\n+\n+    * Added the support of flower firmware.\n+    * Added the flower service infrastructure.\n+\n \n Removed Items\n -------------\ndiff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nnew file mode 100644\nindex 0000000..87cb922\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -0,0 +1,45 @@\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_driver.h>\n+#include <rte_service_component.h>\n+#include <rte_malloc.h>\n+#include <ethdev_pci.h>\n+#include <ethdev_driver.h>\n+\n+#include \"../nfp_common.h\"\n+#include \"../nfp_logs.h\"\n+#include \"../nfp_ctrl.h\"\n+#include \"../nfp_cpp_bridge.h\"\n+#include \"nfp_flower.h\"\n+\n+int\n+nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev)\n+{\n+\tunsigned int numa_node;\n+\tstruct nfp_app_fw_flower *app_fw_flower;\n+\n+\tnuma_node = rte_socket_id();\n+\n+\t/* Allocate memory for the Flower app */\n+\tapp_fw_flower = rte_zmalloc_socket(\"nfp_app_fw_flower\", sizeof(*app_fw_flower),\n+\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n+\tif (app_fw_flower == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not malloc app fw flower\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tpf_dev->app_fw_priv = app_fw_flower;\n+\n+\treturn 0;\n+}\n+\n+int\n+nfp_secondary_init_app_fw_flower(__rte_unused struct nfp_cpp *cpp)\n+{\n+\tPMD_INIT_LOG(ERR, \"Flower firmware not supported\");\n+\treturn -ENOTSUP;\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nnew file mode 100644\nindex 0000000..8b9ef95\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -0,0 +1,16 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2022 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef _NFP_FLOWER_H_\n+#define _NFP_FLOWER_H_\n+\n+/* The flower application's private structure */\n+struct nfp_app_fw_flower {\n+};\n+\n+int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev);\n+int nfp_secondary_init_app_fw_flower(struct nfp_cpp *cpp);\n+\n+#endif /* _NFP_FLOWER_H_ */\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 810f02a..7ae3115 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -6,6 +6,7 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')\n     reason = 'only supported on 64-bit Linux'\n endif\n sources = files(\n+        'flower/nfp_flower.c',\n         'nfpcore/nfp_cpp_pcie_ops.c',\n         'nfpcore/nfp_nsp.c',\n         'nfpcore/nfp_cppcore.c',\ndiff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h\nindex 6af8481..cefe717 100644\n--- a/drivers/net/nfp/nfp_common.h\n+++ b/drivers/net/nfp/nfp_common.h\n@@ -114,6 +114,7 @@\n /* Firmware application ID's */\n enum nfp_app_fw_id {\n \tNFP_APP_FW_CORE_NIC               = 0x1,\n+\tNFP_APP_FW_FLOWER_NIC             = 0x3,\n };\n \n /* nfp_qcp_ptr - Read or Write Pointer of a queue */\ndiff --git a/drivers/net/nfp/nfp_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c\nindex 0922ea9..155628d 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.c\n+++ b/drivers/net/nfp/nfp_cpp_bridge.c\n@@ -28,22 +28,86 @@\n static int nfp_cpp_bridge_serve_write(int sockfd, struct nfp_cpp *cpp);\n static int nfp_cpp_bridge_serve_read(int sockfd, struct nfp_cpp *cpp);\n static int nfp_cpp_bridge_serve_ioctl(int sockfd, struct nfp_cpp *cpp);\n+static int nfp_cpp_bridge_service_func(void *args);\n \n-void nfp_register_cpp_service(struct nfp_cpp *cpp)\n+int\n+nfp_map_service(uint32_t service_id)\n {\n-\tuint32_t *cpp_service_id = NULL;\n-\tstruct rte_service_spec service;\n+\tint32_t ret;\n+\tuint32_t slcore = 0;\n+\tint32_t slcore_count;\n+\tuint8_t service_count;\n+\tconst char *service_name;\n+\tuint32_t slcore_array[RTE_MAX_LCORE];\n+\tuint8_t min_service_count = UINT8_MAX;\n+\n+\tslcore_count = rte_service_lcore_list(slcore_array, RTE_MAX_LCORE);\n+\tif (slcore_count <= 0) {\n+\t\tPMD_INIT_LOG(DEBUG, \"No service cores found\");\n+\t\treturn -ENOENT;\n+\t}\n+\n+\t/*\n+\t * Find a service core with the least number of services already\n+\t * registered to it\n+\t */\n+\twhile (slcore_count--) {\n+\t\tservice_count = rte_service_lcore_count_services(slcore_array[slcore_count]);\n+\t\tif (service_count < min_service_count) {\n+\t\t\tslcore = slcore_array[slcore_count];\n+\t\t\tmin_service_count = service_count;\n+\t\t}\n+\t}\n+\n+\tservice_name = rte_service_get_name(service_id);\n+\tPMD_INIT_LOG(INFO, \"Mapping service %s to core %u\", service_name, slcore);\n \n-\tmemset(&service, 0, sizeof(struct rte_service_spec));\n-\tsnprintf(service.name, sizeof(service.name), \"nfp_cpp_service\");\n-\tservice.callback = nfp_cpp_bridge_service_func;\n-\tservice.callback_userdata = (void *)cpp;\n+\tret = rte_service_map_lcore_set(service_id, slcore, 1);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(DEBUG, \"Could not map flower service\");\n+\t\treturn -ENOENT;\n+\t}\n \n-\tif (rte_service_component_register(&service,\n-\t\t\t\t\t   cpp_service_id))\n-\t\tRTE_LOG(WARNING, PMD, \"NFP CPP bridge service register() failed\");\n+\trte_service_runstate_set(service_id, 1);\n+\trte_service_component_runstate_set(service_id, 1);\n+\trte_service_lcore_start(slcore);\n+\tif (rte_service_may_be_active(slcore))\n+\t\tPMD_INIT_LOG(INFO, \"The service %s is running\", service_name);\n \telse\n-\t\tRTE_LOG(DEBUG, PMD, \"NFP CPP bridge service registered\");\n+\t\tPMD_INIT_LOG(ERR, \"The service %s is not running\", service_name);\n+\n+\treturn 0;\n+}\n+\n+int\n+nfp_enable_cpp_service(struct nfp_cpp *cpp)\n+{\n+\tint ret;\n+\tuint32_t service_id = 0;\n+\tstruct rte_service_spec cpp_service = {\n+\t\t.name         = \"nfp_cpp_service\",\n+\t\t.callback     = nfp_cpp_bridge_service_func,\n+\t};\n+\n+\tcpp_service.callback_userdata = (void *)cpp;\n+\n+\t/* Register the cpp service */\n+\tret = rte_service_component_register(&cpp_service, &service_id);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(WARNING, \"Could not register nfp cpp service\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tPMD_INIT_LOG(INFO, \"NFP cpp service registered\");\n+\n+\t/* Map it to available service core*/\n+\tret = nfp_map_service(service_id);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(DEBUG, \"Could not map nfp cpp service\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n }\n \n /*\n@@ -307,7 +371,7 @@ void nfp_register_cpp_service(struct nfp_cpp *cpp)\n  * unaware of the CPP bridge performing the NFP kernel char driver for CPP\n  * accesses.\n  */\n-int32_t\n+static int\n nfp_cpp_bridge_service_func(void *args)\n {\n \tstruct sockaddr address;\ndiff --git a/drivers/net/nfp/nfp_cpp_bridge.h b/drivers/net/nfp/nfp_cpp_bridge.h\nindex aea5fdc..7fee3a9 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.h\n+++ b/drivers/net/nfp/nfp_cpp_bridge.h\n@@ -16,6 +16,8 @@\n #ifndef _NFP_CPP_BRIDGE_H_\n #define _NFP_CPP_BRIDGE_H_\n \n+#include \"nfp_common.h\"\n+\n #define NFP_CPP_MEMIO_BOUNDARY\t(1 << 20)\n #define NFP_BRIDGE_OP_READ\t20\n #define NFP_BRIDGE_OP_WRITE\t30\n@@ -24,8 +26,8 @@\n #define NFP_IOCTL 'n'\n #define NFP_IOCTL_CPP_IDENTIFICATION _IOW(NFP_IOCTL, 0x8f, uint32_t)\n \n-void nfp_register_cpp_service(struct nfp_cpp *cpp);\n-int32_t nfp_cpp_bridge_service_func(void *args);\n+int nfp_enable_cpp_service(struct nfp_cpp *cpp);\n+int nfp_map_service(uint32_t service_id);\n \n #endif /* _NFP_CPP_BRIDGE_H_ */\n /*\ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 0d09a69..ddfe495 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -38,6 +38,8 @@\n #include \"nfp_ctrl.h\"\n #include \"nfp_cpp_bridge.h\"\n \n+#include \"flower/nfp_flower.h\"\n+\n static int\n nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic, int port)\n {\n@@ -967,6 +969,14 @@\n \t\t\tgoto hwqueues_cleanup;\n \t\t}\n \t\tbreak;\n+\tcase NFP_APP_FW_FLOWER_NIC:\n+\t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n+\t\tret = nfp_init_app_fw_flower(pf_dev);\n+\t\tif (ret != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not initialize Flower!\");\n+\t\t\tgoto hwqueues_cleanup;\n+\t\t}\n+\t\tbreak;\n \tdefault:\n \t\tPMD_INIT_LOG(ERR, \"Unsupported Firmware loaded\");\n \t\tret = -EINVAL;\n@@ -974,7 +984,12 @@\n \t}\n \n \t/* register the CPP bridge service here for primary use */\n-\tnfp_register_cpp_service(pf_dev->cpp);\n+\tret = nfp_enable_cpp_service(pf_dev->cpp);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Enable cpp service failed.\");\n+\t\tret = -EINVAL;\n+\t\tgoto hwqueues_cleanup;\n+\t}\n \n \treturn 0;\n \n@@ -1098,6 +1113,14 @@\n \t\t\tgoto sym_tbl_cleanup;\n \t\t}\n \t\tbreak;\n+\tcase NFP_APP_FW_FLOWER_NIC:\n+\t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n+\t\tret = nfp_secondary_init_app_fw_flower(cpp);\n+\t\tif (ret != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not initialize Flower!\");\n+\t\t\tgoto sym_tbl_cleanup;\n+\t\t}\n+\t\tbreak;\n \tdefault:\n \t\tPMD_INIT_LOG(ERR, \"Unsupported Firmware loaded\");\n \t\tret = -EINVAL;\n@@ -1105,7 +1128,11 @@\n \t}\n \n \t/* Register the CPP bridge service for the secondary too */\n-\tnfp_register_cpp_service(cpp);\n+\tret = nfp_enable_cpp_service(cpp);\n+\tif (ret != 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Enable cpp service failed.\");\n+\t\tret = -EINVAL;\n+\t}\n \n sym_tbl_cleanup:\n \tfree(sym_tbl);\n",
    "prefixes": [
        "v9",
        "04/12"
    ]
}