get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 113586,
    "url": "http://patches.dpdk.org/api/patches/113586/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1656642017-8992-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": "<1656642017-8992-5-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1656642017-8992-5-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-07-01T02:20:09",
    "name": "[v4,04/12] net/nfp: add initial flower firmware support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "cba800c321f971cb0cb627b4dbdcdd94c3c69d89",
    "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-5-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/113586/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/113586/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 66B06A0093;\n\tFri,  1 Jul 2022 04:21:30 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 672D942B6E;\n\tFri,  1 Jul 2022 04:21:16 +0200 (CEST)",
            "from NAM11-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam11on2040.outbound.protection.outlook.com [40.107.236.40])\n by mails.dpdk.org (Postfix) with ESMTP id 5389D40A7D\n for <dev@dpdk.org>; Fri,  1 Jul 2022 04:21:14 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by CH2PR13MB4459.namprd13.prod.outlook.com (2603:10b6:610:35::16)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.11; Fri, 1 Jul\n 2022 02:21:12 +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:12 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=SxCI798K0a4xER87cxvHnJdgbLj1xvK4xbMdBbBjKQGBr/+k1rzBiOayiFR5LFFdwnZuNNAsxNbSjC+Q6M2mmVlDMlfjKB+uToPJIhZJbL0xZoPKa/Mmik/3rcjYlIYcQomXO/4Wq5XMbUU2xOTQceMLlCO7h6GEkcMhSvvdxaUkJKXc/DPscoWjjKst4Vk6mcQY7zt8UP6tMje7yzZadbu6kLoDrf6LjrX3J3652XS3DPosC9XJFKex1Q5SvDhkR7/bE+4rT2532gwK4Oz4DXEq8xOPQ6wq3moBXVSBD83ytdilwAFqkH/H+1XfF3xeiWKE7L4lBFI3Hmq59O/xqw==",
        "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=+gFAeXSqyCvA8i4bIcWcEmq+6H7ogEjD5fJkhM9PLsQ=;\n b=YbnCHl3wtVGUCaaCIcQJQcLgVcyqxlLOdB6CSJJ6BOffHBKhqHlH/Lu1jS3o+u2h5+Fnswjqlt6TujJiwoIetIz3J7Oj04G5WkWdCUeqU3UuI9EW+ss6y0D2Z/8Aupo8aA2G0iOsYxlbKnZ4+CZUM+T2+yQ5wOwtaWgRED0k0kqu4igD51jmJmmkkd5tcEvPahjubS0hsEwABEl9fISHTjEcagNE4/TPHQ2ABMCygkq8oJJTrDnugHst7JbdF6gyLBnCJBwIikTNzi0sK9LaZ6CvIAvIkTFgLXy1uZmOpYlOh+O4mjquywRZIOcNSYO2qMSWU2Tv2nyoLbMQgXl78w==",
        "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=+gFAeXSqyCvA8i4bIcWcEmq+6H7ogEjD5fJkhM9PLsQ=;\n b=UPwoDZUDR7iSfgI7kTiSXKhD4tcTSKDK6LJ45SYJkNZS5UVLvUkKQr0LTIUfDpujeCjj1Vd5RuJVBtopr6EyZYnq//T4y/S/SXlc+qq1qBQcjkH0MiI5JtcKBTh8FRPySZeRbbD5g3T260ArqDMpyNy/k3FGC3r0cgy6+bM6U1c=",
        "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, Chaoyong He <chaoyong.he@corigine.com>,\n Heinrich Kuhn <heinrich.kuhn@corigine.com>",
        "Subject": "[PATCH v4 04/12] net/nfp: add initial flower firmware support",
        "Date": "Fri,  1 Jul 2022 10:20:09 +0800",
        "Message-Id": "<1656642017-8992-5-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": "4947d460-8ba3-4d93-d0c4-08da5b085e49",
        "X-MS-TrafficTypeDiagnostic": "CH2PR13MB4459:EE_",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 5EAuYKoPB8M0epm3NTgV04dElvQwFpVfZf6ylHk1cdLL2zmhiVKqVfo8GJ091zUllF5I6dioi+dhxybZpEbYEu+gonlMm/n5CI/Mt260L0UkDatlR4xlHae+jed2YuOspWYR8dUhR7l78sbVMfrauysugu5IOyB/yVbkKrkUDhk5Y29vo9rjDevr43gmeV77rRAphFJZ0NDPrf4OKWTVUJHy9UYogFHd+dJSXnRcH4dK8zIFjjGcKWkXlZD00rYCsjK3Cd9v+6ibw9usIAaLUC98FCXxgwDrZpzWzcNvQqL4rcPz5BqMHkBtjfV8g/84MKTleJNKQVO48qfj3FmEeFmycwqS9Cb1d70iicHEPvVGRrVN0YrzZahtTlbUUoCw5aOXqFpPOLxyWcN2TyVpTSTu1j2BrKrdvaD6YuGB3P45t8+FUeBLhXIgTXsbrF50ajepuwEbWt++UJr1ZgPSgLJWE8PH5Qemxe/nhXz6c+w+t5AEkvm+TEVLiBiGa7Jh9rZ64epRGSjCgAmkm9coC+/XYWuJGjEhoSpOIRu18I8mIkLd11DxDO5Wzg3pO1rd/IBgeNQea0MtiWhpAl7YKsCGNCL93Zbunya+Jg5/2ymNGosET5sYji/IO4YlymtmERukjujVRyDP28KbBomSYBhhjsWl+ZGEsHg9n8RENb++Z6ugzjWcAN6pcFcsl34wL0lTLc8uNwF8UpVuk8QqrWjrAou6wSgqXVhxss+amjopFT9V96qTS5gR5VFcIA4HrN2u+R5A2UVlUJtGl4n5p+NJ5/r//JWBMTO2Cf3+Uft1L+MINCSlbls9VXdvGbyA1w5pYui3CTi7JTQaALirsbg2kBEf0gfxA5LJEFkL7tQ=",
        "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)(39840400004)(346002)(376002)(366004)(396003)(136003)(6486002)(4326008)(186003)(36756003)(26005)(66476007)(66556008)(2616005)(8676002)(83380400001)(6512007)(107886003)(6666004)(38350700002)(5660300002)(66946007)(8936002)(38100700002)(2906002)(54906003)(478600001)(30864003)(44832011)(6916009)(6506007)(316002)(52116002)(41300700001)(66574015)(86362001);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?XkAXzR/8470ewqMqpTHZkMmFnnzQ?=\n\t=?utf-8?q?LaMUWmutFNLpCBTgT6niTo59MQs7FZ5oF6oiRp5uZAn5o/7OIuwqYdN9AIgcRwRfI?=\n\t=?utf-8?q?xthgGFPStCp82+ceyLgbRWp9LU9WO2B8rsuZYwpckt99v8u1RFSKTjMNPzkj7k9+F?=\n\t=?utf-8?q?1L5pPbRlyQL9mCmAvFeoRHB0vGv5mb3XXJcYwgKASvQiB9J8UnySnRYoIt9F2olgN?=\n\t=?utf-8?q?UCaKzeb0sg4RC4eb9CE58CHCFURHpTe0gsKf1A2ojgmLV43OghyXOszt0IJ3MjQo0?=\n\t=?utf-8?q?o2Feb2yZu6oi+JCcJxVnYcPDUzCxrVYHQotz9PeTbKTyHNTBCx+M5E62HX7/ZujnK?=\n\t=?utf-8?q?kwt6yEzhHh9TxYYeO5IbvcHrOVedyTJ2o7H9ngXorJo8Tuk4bQ10qHWTLCSslkLnT?=\n\t=?utf-8?q?oXDOF+A6YKn9Qqh6Z9clsF4Z866untumf+YJqfKNMV3MuKjE5eSWu6nq7eXY/iXBu?=\n\t=?utf-8?q?TvBhKXlUBk8E8mDkSmCrc7fjlSKB2/fcLh/N1BNMI9CQ8dEWHcYjHv2ogzQ2oKFRU?=\n\t=?utf-8?q?pZayIKplMFGiB4KcPe5V8vKjhQsHwChR5fjrdvdsrWSKO4QHkpoi2TVkpSJaxfA7B?=\n\t=?utf-8?q?UIodOEE7D/4WbcFHOCWTWT065QLTHf2eweRDtmdNU9RVXkds6IDZAgLSPYqr6jLqF?=\n\t=?utf-8?q?q83G3fm5QV6ly5X0CeD1EynNH9Ogtz6/wnmtJm7YOBsMUL/x/Z2c7Lj2JmtkElyyV?=\n\t=?utf-8?q?FpRadRS917k8jWv/hdw9pbJiVNXiE48n97FSZaQl/WgDoBWHINJ+mwQ9+oiEglwK6?=\n\t=?utf-8?q?rsOTqEPwn6cJjtbcpqGBrISfwrL04e4pvkL5EKK8wdEkTkYbAmd/QAV/ARKJCp+ne?=\n\t=?utf-8?q?jRBWDqQmbHq57RcIPwyaHYB62R4N6J8QQNcHC9EvPgz1a0+BPTxFPT+JROd2MIiE4?=\n\t=?utf-8?q?aQn27rueBRnkiYY9I63AKeT2nmVdDQLqBtTMsmEzRl41H0bPSsm7aRWSP8QN/aYhP?=\n\t=?utf-8?q?4nbbLx2rnvqMBxGoLXlYk28gmLi0Ymgb6+x3Cz8eSgsBfMzyHXMJkgjgxyV5epabc?=\n\t=?utf-8?q?txXL/8pg3Dv4u2oIvusX4Ld8hHZISA4W4DVjrjw9nRShHiS8wlrvEUarIGBATfyjH?=\n\t=?utf-8?q?krt5l9XSqu1LsuF8uNVWmuo4ZBWvtu6cUvZJnu3lk9zMTWV1e+Sys4ZLLfHxiQKEi?=\n\t=?utf-8?q?ZoSQKQqOuIQo3r/qtX/ieEJ60ESiMuSwwpdWGobaELFcHFI/SdZiKpAaxOlpimhGZ?=\n\t=?utf-8?q?ziGMptLOqPwaqbfg5vnJs/mwVWBalw1bhiH4lrVNnU6LsyLoDug3w+WdPku9ay6mL?=\n\t=?utf-8?q?nkoAL5aWNHMLlVJeTawjO1LzCwW+mut6f+13b7BHBs1AUXgv4dd2kYZwyBKf6Q/18?=\n\t=?utf-8?q?WqLgbOAG8l00szF14+0KjSk2zozpkLmzvp1rfluPIk2bc8ufDCe35nB3IsGvuM0Cu?=\n\t=?utf-8?q?RMgKdmsk2LJeTh/r3LuGDj9HT/SriSaJtn3WXajuGukqZVetaMQMkJylOQz0OaFQ4?=\n\t=?utf-8?q?f7gMct6+OB7WQx7/y+vWhU0WF0/kEJvgQPowp+0nzFRh91mqd5upDKx/isFpookLz?=\n\t=?utf-8?q?S9clUTs4KC2EUycDU78HG/QyZMhorxmS8A=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 4947d460-8ba3-4d93-d0c4-08da5b085e49",
        "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:12.7514 (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 s/AP3FCQqEoh4+SoD0ufpdfz9UhKjbJle6dtrRygd6f/8IzKHdECxfUVCYNGGKoqD7dojBo+8CIf9YJde8i4+mPiLeDbedFBZZLt4PEwdt8=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CH2PR13MB4459",
        "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 commits adds the basic probing infrastructure to support the flower\nfirmware. This firmware is geared towards offloading OVS and can\ngenerally be found in /lib/firmware/netronome/flower. It is also used by\nthe NFP kernel driver when OVS offload with TC is desired.\n\nThis commit also adds the basic infrastructure needed by the flower\nfirmware to operate. The firmware requires threads to service both the\nPF vNIC and the ctrl vNIC. The PF is responsible for handling any\nfallback traffic and the ctrl vNIC is used to communicate OVS flows\nand flow statistics to and from the smartNIC. rte_services are used to\nfacilitate this logic.\n\nThis commit also adds 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 drivers/net/nfp/flower/nfp_flower.c | 101 ++++++++++++++++++++++++++++++++++++\n drivers/net/nfp/flower/nfp_flower.h |  22 ++++++++\n drivers/net/nfp/meson.build         |   1 +\n drivers/net/nfp/nfp_cpp_bridge.c    |  87 ++++++++++++++++++++++++++-----\n drivers/net/nfp/nfp_cpp_bridge.h    |   4 +-\n drivers/net/nfp/nfp_ethdev.c        |  40 ++++++++++++--\n 6 files changed, 236 insertions(+), 19 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/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nnew file mode 100644\nindex 0000000..1dddced\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -0,0 +1,101 @@\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+static struct rte_service_spec flower_services[NFP_FLOWER_SERVICE_MAX] = {\n+};\n+\n+static int\n+nfp_flower_enable_services(struct nfp_app_flower *app_flower)\n+{\n+\tint i;\n+\tint ret = 0;\n+\n+\tfor (i = 0; i < NFP_FLOWER_SERVICE_MAX; i++) {\n+\t\t/* Pass a pointer to the flower app to the service */\n+\t\tflower_services[i].callback_userdata = (void *)app_flower;\n+\n+\t\t/* Register the flower services */\n+\t\tret = rte_service_component_register(&flower_services[i],\n+\t\t\t\t&app_flower->flower_services_ids[i]);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(WARNING,\n+\t\t\t\t\"Could not register Flower PF vNIC service\");\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tPMD_INIT_LOG(INFO, \"Flower PF vNIC service registered\");\n+\n+\t\t/* Map them to available service cores*/\n+\t\tret = nfp_map_service(app_flower->flower_services_ids[i]);\n+\t\tif (ret)\n+\t\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+int\n+nfp_init_app_flower(struct nfp_pf_dev *pf_dev)\n+{\n+\tint ret;\n+\tunsigned int numa_node;\n+\tstruct nfp_net_hw *pf_hw;\n+\tstruct nfp_app_flower *app_flower;\n+\n+\tnuma_node = rte_socket_id();\n+\n+\t/* Allocate memory for the Flower app */\n+\tapp_flower = rte_zmalloc_socket(\"nfp_app_flower\", sizeof(*app_flower),\n+\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n+\tif (app_flower == NULL) {\n+\t\tret = -ENOMEM;\n+\t\tgoto done;\n+\t}\n+\n+\tpf_dev->app_priv = app_flower;\n+\n+\t/* Allocate memory for the PF AND ctrl vNIC here (hence the * 2) */\n+\tpf_hw = rte_zmalloc_socket(\"nfp_pf_vnic\", 2 * sizeof(struct nfp_net_adapter),\n+\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n+\tif (pf_hw == NULL) {\n+\t\tret = -ENOMEM;\n+\t\tgoto app_cleanup;\n+\t}\n+\n+\t/* Start up flower services */\n+\tif (nfp_flower_enable_services(app_flower)) {\n+\t\tret = -ESRCH;\n+\t\tgoto vnic_cleanup;\n+\t}\n+\n+\treturn 0;\n+\n+vnic_cleanup:\n+\trte_free(pf_hw);\n+app_cleanup:\n+\trte_free(app_flower);\n+done:\n+\treturn ret;\n+}\n+\n+int\n+nfp_secondary_init_app_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..4a9b302\n--- /dev/null\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -0,0 +1,22 @@\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+enum nfp_flower_service {\n+\tNFP_FLOWER_SERVICE_MAX\n+};\n+\n+/* The flower application's private structure */\n+struct nfp_app_flower {\n+\t/* List of rte_service ID's for the flower app */\n+\tuint32_t flower_services_ids[NFP_FLOWER_SERVICE_MAX];\n+};\n+\n+int nfp_init_app_flower(struct nfp_pf_dev *pf_dev);\n+int nfp_secondary_init_app_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_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c\nindex 0922ea9..9da231e 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.c\n+++ b/drivers/net/nfp/nfp_cpp_bridge.c\n@@ -28,22 +28,85 @@\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+static struct rte_service_spec cpp_service = {\n+\t.name         = \"nfp_cpp_service\",\n+\t.callback     = nfp_cpp_bridge_service_func,\n+};\n+\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(WARNING, \"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-\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+\tservice_name = rte_service_get_name(service_id);\n+\tPMD_INIT_LOG(INFO, \"Mapping service %s to core %u\", service_name, slcore);\n+\tret = rte_service_map_lcore_set(service_id, slcore, 1);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(WARNING, \"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\tRTE_LOG(INFO, PMD, \"The service %s is running\", service_name);\n \telse\n-\t\tRTE_LOG(DEBUG, PMD, \"NFP CPP bridge service registered\");\n+\t\tRTE_LOG(INFO, PMD, \"The service %s is not running\", service_name);\n+\n+\treturn 0;\n+}\n+\n+int nfp_enable_cpp_service(struct nfp_cpp *cpp)\n+{\n+\tint ret = 0;\n+\tuint32_t id = 0;\n+\n+\tcpp_service.callback_userdata = (void *)cpp;\n+\n+\t/* Register the cpp service */\n+\tret = rte_service_component_register(&cpp_service, &id);\n+\tif (ret) {\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(id);\n+\tif (ret) {\n+\t\tPMD_INIT_LOG(WARNING, \"Could not map nfp cpp service\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n }\n \n /*\n@@ -307,7 +370,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..70f7b16 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.h\n+++ b/drivers/net/nfp/nfp_cpp_bridge.h\n@@ -24,8 +24,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_map_service(uint32_t service_id);\n+int nfp_enable_cpp_service(struct nfp_cpp *cpp);\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 90dd01e..4ab89db 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_nic *app_nic, int port)\n {\n@@ -837,7 +839,8 @@\n }\n \n static int\n-nfp_pf_init(struct rte_pci_device *pci_dev)\n+nfp_pf_init(struct rte_pci_device *pci_dev,\n+\t\tstruct rte_pci_driver *pci_drv)\n {\n \tint ret;\n \tint err = 0;\n@@ -964,6 +967,16 @@\n \t\t\tgoto hwqueues_cleanup;\n \t\t}\n \t\tbreak;\n+\tcase NFP_APP_FLOWER_NIC:\n+\t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n+\t\tpci_dev->device.driver = &pci_drv->driver;\n+\t\tret = nfp_init_app_flower(pf_dev);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not initialize Flower!\");\n+\t\t\tpci_dev->device.driver = NULL;\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@@ -971,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) {\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@@ -1096,6 +1114,14 @@\n \t\t\tgoto sym_tbl_cleanup;\n \t\t}\n \t\tbreak;\n+\tcase NFP_APP_FLOWER_NIC:\n+\t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n+\t\tret = nfp_secondary_init_app_flower(cpp);\n+\t\tif (ret) {\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@@ -1106,7 +1132,11 @@\n \t\tgoto sym_tbl_cleanup;\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) {\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@@ -1115,11 +1145,11 @@\n }\n \n static int\n-nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n+nfp_pf_pci_probe(struct rte_pci_driver *pci_drv,\n \t\tstruct rte_pci_device *dev)\n {\n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n-\t\treturn nfp_pf_init(dev);\n+\t\treturn nfp_pf_init(dev, pci_drv);\n \telse\n \t\treturn nfp_pf_secondary_init(dev);\n }\n",
    "prefixes": [
        "v4",
        "04/12"
    ]
}