get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 113140,
    "url": "http://patches.dpdk.org/api/patches/113140/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1655798919-38659-2-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": "<1655798919-38659-2-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1655798919-38659-2-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-06-21T08:08:28",
    "name": "[01/12] net/nfp: move app specific attributes to own struct",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "3f7b06e27e8d20e984b8e35ca4576b9523dc7e3e",
    "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/1655798919-38659-2-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 23648,
            "url": "http://patches.dpdk.org/api/series/23648/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=23648",
            "date": "2022-06-21T08:08:27",
            "name": "preparation for the rte_flow offload of nfp PMD",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/23648/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/113140/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/113140/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 16750A0543;\n\tTue, 21 Jun 2022 10:09:18 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3776440E25;\n\tTue, 21 Jun 2022 10:09:16 +0200 (CEST)",
            "from NAM10-DM6-obe.outbound.protection.outlook.com\n (mail-dm6nam10on2090.outbound.protection.outlook.com [40.107.93.90])\n by mails.dpdk.org (Postfix) with ESMTP id 066B24069C\n for <dev@dpdk.org>; Tue, 21 Jun 2022 10:09:15 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by DM6PR13MB2730.namprd13.prod.outlook.com (2603:10b6:5:13e::12) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5373.13; Tue, 21 Jun\n 2022 08:09:13 +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%7]) with mapi id 15.20.5373.015; Tue, 21 Jun 2022\n 08:09:13 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=ABOFkSGx3YTK+DwiPI0h8GnTsMFc41pL3UdMHtSTSuRbR1N57ayOK9gMKxDaOLF5XCjVQkgX3TsKKyXFpM+HQud2sYz9jAaSnuKqCrfe0THkP9f9X1NIBXmZNjxmOXe6TdHUjp1nph/v/JlIGZfEW3fZWpqrAkEM90Pug4S/RNNYS0BfHnfSdxh/uc9zFByGRuFD7NNbvmDej4tyJ+27zKbOZ1rWuewAnFQRtdmzzmsMS3/nmzxYZyQztynjnXQY0CetacnCuF9CZGVYXiuSYLP+4Mfn7jc9J1YfszEkm37zDLNiPAPyovtixImthNxw9tI28qMDYRTpIpNc+w0myw==",
        "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=IZpEocxG8MSfXwbJVoMiggWrgELxSCOi4Qp5T//d1yY=;\n b=cqGyh9oYkl2P8cS5QEKwWU9OPZmBDhu0TMBqBCXr10pGhtjslApeb8G+FQ7usu8sFg2d3k7MnBOX4JsrHiO3YvrMuhYJF+uLEVMPHcrf2m8fTV57TC+f6vz+R6T0hG1j4nUMgyG2z9gXXymK2SXXeg6PZb3GW0vqQRFIDf0qEX0BBaxkEgdq/rLtcBAhqUsz8ikeemNkR1Jyq87iOYmdnX47Ry5QQpisxf9flBGXE33380a7PFVo/mppEksLafo8+0jfAmDrHgP2RiJIDp23qPdvRfZ+dzlwqrHlNGf2jK9de5KLnHMa3ahLg5vbrOVHqSsCReSjK4AZjfRxQ2IoCQ==",
        "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=IZpEocxG8MSfXwbJVoMiggWrgELxSCOi4Qp5T//d1yY=;\n b=mF1stIXeg5MvscsG0PXbensIsY1sOBJXIrG3OwtSEmj2FYWOJwlL4AuYjkFki+Vwv89Be03PffGptuXlg9tJijABXniDTokQumU0UINwrTVQKIY2hf2Zrt6uchOL8zDL2tkthpbi28aOT/gsqyulIpu9SUAb6q2PHVFY743Unr4=",
        "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 01/12] net/nfp: move app specific attributes to own struct",
        "Date": "Tue, 21 Jun 2022 16:08:28 +0800",
        "Message-Id": "<1655798919-38659-2-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1655798919-38659-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1655798919-38659-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "OS0P286CA0009.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:604:9c::14) 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": "194765ff-aa1a-47e6-eb0b-08da535d5406",
        "X-MS-TrafficTypeDiagnostic": "DM6PR13MB2730:EE_",
        "X-Microsoft-Antispam-PRVS": "\n <DM6PR13MB27305B0CE9926DB587CFDF709EB39@DM6PR13MB2730.namprd13.prod.outlook.com>",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 7w4hRorKhE2vf8TEE6jHdIZgsnisro4o/SjoU2jJvIAjhBpukQz2v7nw4+htBVHPFo82KKd/wYzAEuFfQKs3C2vts8VhEDnYgfpOc7WxwrcRdeRS/ofEm4d8T1raQAd3gUcbikLrD0zgXiFjs4B0ccT+P5/LGvW8gASMZQxS6zCpwir/tmjOb1WeDPVicEJYyQY0DlFl9aynZR3hlFZ3AQrP++Tt1O/7PWUuuPRzqUKuf0Ud6JkK/pNEMruOMOuInVeKsfhep4C2h6oZIK2exh3VbfZtY8BMlqLiaC/rTwyvZhwTTbxCPqpVYPNZ1hLQBxslhSIFUKIyjqgZoLcK7Uy9SEP0ViL97I5nf/04mLJ2C4CfQoikY/4sYocIy+Kf5qtX9hYByArRJwFOgRYQzUL0AxpCwwHSuMwb7L/Zmxy5Nc2XkJu7B5lBWtD2+QEc6i7p0VDYwVQxkQaoOVrnZ/6mupOEsG3nXX+vJ+PVExNJBj/DSwQ5IIZJ3dIwQaJQ8KJb9cRe+SUbU/ZcJkx7v4u+QePERifAhO6WW9rgPBajkWFeIpgHnpx6OJ/wSO+MNMYMScM5CMyn6FwQgxOtYjWj4+G1jnCQNJmAGstLjB8pyEGfYqN9RgGSATmaCKmzN/ZVP8gQA/1WsjhHzeVmEu7a6B+2tB86tu+Scobi102KE8jkDqqeRl1eC+wPRR3M0pDH2krPi1eKbYvAc5I2DA==",
        "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)(39830400003)(376002)(366004)(136003)(346002)(396003)(38100700002)(30864003)(2616005)(38350700002)(86362001)(83380400001)(66946007)(66476007)(41300700001)(186003)(8936002)(8676002)(66556008)(5660300002)(107886003)(44832011)(2906002)(316002)(4326008)(66574015)(6506007)(26005)(6512007)(6916009)(54906003)(478600001)(52116002)(6666004)(36756003)(6486002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?xiXmeIPkYzEhGHt8KG02nppZ5iR0?=\n\t=?utf-8?q?qvHYErsmgNg1rvxECeVlTleykf3YIrOBizWYirrdTXhcNY4k4rbsOnBoshCAkTW9c?=\n\t=?utf-8?q?SJmBdjDGm0OQzA2Qv9jRQOIln5qBAmVda54FyJBNxILZ/o59DhCGc59PxHQppa0p1?=\n\t=?utf-8?q?6WwcbDRoN8IIYpOOMzFDuzYRpPw35UdFRFtj2srqqn30b5+L9m7nc66lC5Hm9F/aG?=\n\t=?utf-8?q?LRoNKJeHhyp+moZV+9XZUjkyqD/ssJwMopLwZhoIEziY1TFMpHMCvQxGfuh94hQou?=\n\t=?utf-8?q?Ggxm+jh2VQyycWE7Z/YGikwkTn3zJPnnVfGf3nWOQXooH215xl66Y5vDQ20XWuX9/?=\n\t=?utf-8?q?Ej91x5nHRBb1m9v9vyFP7oSBR1X15ydvV3cvEm1eNSFTnyxiV/oW2n/fw7BwnMYDo?=\n\t=?utf-8?q?E9e5HrKvVlKctr/GvOGzPgy0+9XmhJnjKgXwAJMLwtNIHrVlKWzVbMfH3xVApBlDj?=\n\t=?utf-8?q?A231hDq8UDRWQNIalEmBAGdKB3QzKqHhuReGZ58x5SwYQvzxSlDml9X8n51f0NDQo?=\n\t=?utf-8?q?vm+hzLcHfAJmWDuvSzeC3+RYMrC58NLRxUwDFZ8zsYKzjwMOmV0wl1a2heeQRRtiA?=\n\t=?utf-8?q?YdOiDlOSVinfW/XwUqYCEKMGg/V6/U9p8SZnGpR8c0OUXvU7wPPzgFkuJaN548EzK?=\n\t=?utf-8?q?EnElehnnbmXlrABjvS2KfzNvMTRXi7xSI60n9hHhfjKBawWQr2MSrgMO/+MLf/nWv?=\n\t=?utf-8?q?bhYqohNJhdBbTg8EzQ924lSV87u66oMQTq4DpG+fkZVpM2bvTl1VHvwg7IQ/RVz6y?=\n\t=?utf-8?q?JAHGUCM5cL+kMHvNhjt6TpVWgF64yQhlIG8GNK4WMpefu3uGr4f3PR9D+T8aQ5+ap?=\n\t=?utf-8?q?Q1uei2GrcQTvOqlrYYcizm92GXI7cOLAKWqfLh1Liw6z2lys33t/h5UkD9Fc78FCY?=\n\t=?utf-8?q?rzKSXhrbPaze/hAWf1kLNa17dVdx4GXFd3srTmMEWq1SQFpbhglnUMUfTlBChCm6G?=\n\t=?utf-8?q?wTPIjFdALmz6S+jzQNlkq3rf2szJBZfBg0OR2TB4kEOrPeJQP+Wf4RYONFv/MQ2jE?=\n\t=?utf-8?q?THwLvmrpYXIjLMtEFFil1hIECz03/hCYXRaOSzrSHCZjtQzEt6JUHjk0LPbtvrW+7?=\n\t=?utf-8?q?rFg7+R/EQ2Y1lKIm6pEbhEQZMXC0cPx69jWeY+UWDUnBpdQwcRYx/Ay3Z56WtZ5i5?=\n\t=?utf-8?q?5emczzrXvswg3pb5pghDnKW612c6/ZVDTn4jJcqK1vySD76CJOImCsvE1E/An1nDb?=\n\t=?utf-8?q?1TrvZZODHzvziKTwng3h0Lz6Zz743mDGng0BVefvqjL9SBm3bvMIicRtpzq+ee6M3?=\n\t=?utf-8?q?IUoOUVXeKSn5eMlIELO+5cIrO9x/hEBYajcMYvZ06iH8/5ljqpqV06BneFfV5SF+0?=\n\t=?utf-8?q?8ivKF36O3KZXH/YPEVE6jUK2/uPW9uwp72eK/X5jchk2cXA71Sx0DyJRXxGWhIQj7?=\n\t=?utf-8?q?giz0jQPIXS1+fFAuXGIYjTUOYlXrrKR8mvaNBWQE5eqerQegeX0dwN86SEEdL7wOW?=\n\t=?utf-8?q?gygqg7kf88cDjLNB/AGGfvOiyrraoPZ15xvILTNz+z/D+MbxpSG/aAdJwn66pfF3S?=\n\t=?utf-8?q?BkuuiPgcfQX/DAW/YQv2Md+nhMP4aonCoKJZ+pp4YbNTz9AtiZzVTUdmX1qt9dNHI?=\n\t=?utf-8?q?VUdT5vwMEvmHZrUIQ0rGUAG0A3KRF+cnsx1lkN41wQKc4DgxJ0JdWwP3Q6aF5tmjE?=\n\t=?utf-8?q?/vzExGTybKMnons9BpMzIX/D/Wyvds0cpuFUf1D8CikAAntZhf4SQ=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 194765ff-aa1a-47e6-eb0b-08da535d5406",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "21 Jun 2022 08:09:13.4243 (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 yxdivlqGMI/ytaJ7B07ZOIipCWf62oCjCVEVjS/0o3lS8BMLnX4I2WHeVIfgClBQ8OiKVxMwPXxTcJbPNt2pwhs3Nw91fQ10USv0GLQCUxA=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM6PR13MB2730",
        "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": "The NFP Card can load different firmware applications. Currently\nonly the CoreNIC application is supported. This commit makes\nneeded infrastructure changes in order to support other firmware\napplications too.\n\nClearer separation is made between the PF device and any application\nspecific concepts. The PF struct is now generic regardless of the\napplication loaded. A new struct is also made for the CoreNIC\napplication. Future additions to support other applications should\nalso add an applications specific struct.\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/nfp_common.h |  33 +++++++-\n drivers/net/nfp/nfp_ethdev.c | 196 +++++++++++++++++++++++++++----------------\n 2 files changed, 154 insertions(+), 75 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h\nindex 6d917e4..2aaf1d6 100644\n--- a/drivers/net/nfp/nfp_common.h\n+++ b/drivers/net/nfp/nfp_common.h\n@@ -111,6 +111,14 @@\n #include <linux/types.h>\n #include <rte_io.h>\n \n+/* Firmware application ID's */\n+enum nfp_app_id {\n+\tNFP_APP_CORE_NIC               = 0x1,\n+\tNFP_APP_BPF_NIC                = 0x2,\n+\tNFP_APP_FLOWER_NIC             = 0x3,\n+\tNFP_APP_ACTIVE_BUFFER_MGMT_NIC = 0x4,\n+};\n+\n /* nfp_qcp_ptr - Read or Write Pointer of a queue */\n enum nfp_qcp_ptr {\n \tNFP_QCP_READ_PTR = 0,\n@@ -121,8 +129,10 @@ struct nfp_pf_dev {\n \t/* Backpointer to associated pci device */\n \tstruct rte_pci_device *pci_dev;\n \n-\t/* Array of physical ports belonging to this PF */\n-\tstruct nfp_net_hw *ports[NFP_MAX_PHYPORTS];\n+\tenum nfp_app_id app_id;\n+\n+\t/* Pointer to the app running on the PF */\n+\tvoid *app_priv;\n \n \t/* Current values for control */\n \tuint32_t ctrl;\n@@ -151,8 +161,6 @@ struct nfp_pf_dev {\n \tstruct nfp_cpp_area *msix_area;\n \n \tuint8_t *hw_queues;\n-\tuint8_t total_phyports;\n-\tbool\tmultiport;\n \n \tunion eth_table_entry *eth_table;\n \n@@ -161,6 +169,20 @@ struct nfp_pf_dev {\n \tuint32_t nfp_cpp_service_id;\n };\n \n+struct nfp_app_nic {\n+\t/* Backpointer to the PF device */\n+\tstruct nfp_pf_dev *pf_dev;\n+\n+\t/*\n+\t * Array of physical ports belonging to the this CoreNIC app\n+\t * This is really a list of vNIC's. One for each physical port\n+\t */\n+\tstruct nfp_net_hw *ports[NFP_MAX_PHYPORTS];\n+\n+\tbool multiport;\n+\tuint8_t total_phyports;\n+};\n+\n struct nfp_net_hw {\n \t/* Backpointer to the PF this port belongs to */\n \tstruct nfp_pf_dev *pf_dev;\n@@ -424,6 +446,9 @@ int nfp_net_rss_hash_conf_get(struct rte_eth_dev *dev,\n #define NFP_NET_DEV_PRIVATE_TO_PF(dev_priv)\\\n \t(((struct nfp_net_hw *)dev_priv)->pf_dev)\n \n+#define NFP_APP_PRIV_TO_APP_NIC(app_priv)\\\n+\t((struct nfp_app_nic *)app_priv)\n+\n #endif /* _NFP_COMMON_H_ */\n /*\n  * Local variables:\ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 5cdd34e..3c4b0ac 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -39,15 +39,15 @@\n #include \"nfp_cpp_bridge.h\"\n \n static int\n-nfp_net_pf_read_mac(struct nfp_pf_dev *pf_dev, int port)\n+nfp_net_pf_read_mac(struct nfp_app_nic *app_nic, int port)\n {\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_net_hw *hw = NULL;\n \n \t/* Grab a pointer to the correct physical port */\n-\thw = pf_dev->ports[port];\n+\thw = app_nic->ports[port];\n \n-\tnfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);\n+\tnfp_eth_table = nfp_eth_read_ports(app_nic->pf_dev->cpp);\n \n \tnfp_eth_copy_mac((uint8_t *)&hw->mac_addr,\n \t\t\t (uint8_t *)&nfp_eth_table->ports[port].mac_addr);\n@@ -64,6 +64,7 @@\n \tuint32_t new_ctrl, update = 0;\n \tstruct nfp_net_hw *hw;\n \tstruct nfp_pf_dev *pf_dev;\n+\tstruct nfp_app_nic *app_nic;\n \tstruct rte_eth_conf *dev_conf;\n \tstruct rte_eth_rxmode *rxmode;\n \tuint32_t intr_vector;\n@@ -71,6 +72,7 @@\n \n \thw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tpf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n+\tapp_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);\n \n \tPMD_INIT_LOG(DEBUG, \"Start\");\n \n@@ -82,7 +84,7 @@\n \n \t/* check and configure queue intr-vector mapping */\n \tif (dev->data->dev_conf.intr_conf.rxq != 0) {\n-\t\tif (pf_dev->multiport) {\n+\t\tif (app_nic->multiport) {\n \t\t\tPMD_INIT_LOG(ERR, \"PMD rx interrupt is not supported \"\n \t\t\t\t\t  \"with NFP multiport PF\");\n \t\t\t\treturn -EINVAL;\n@@ -250,6 +252,7 @@\n \tstruct nfp_net_hw *hw;\n \tstruct rte_pci_device *pci_dev;\n \tstruct nfp_pf_dev *pf_dev;\n+\tstruct nfp_app_nic *app_nic;\n \tint i;\n \n \tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n@@ -260,6 +263,7 @@\n \tpf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private);\n \thw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);\n \tpci_dev = RTE_ETH_DEV_TO_PCI(dev);\n+\tapp_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);\n \n \t/*\n \t * We assume that the DPDK application is stopping all the\n@@ -280,12 +284,12 @@\n \t/* Only free PF resources after all physical ports have been closed */\n \t/* Mark this port as unused and free device priv resources*/\n \tnn_cfg_writeb(hw, NFP_NET_CFG_LSC, 0xff);\n-\tpf_dev->ports[hw->idx] = NULL;\n+\tapp_nic->ports[hw->idx] = NULL;\n \trte_eth_dev_release_port(dev);\n \n-\tfor (i = 0; i < pf_dev->total_phyports; i++) {\n+\tfor (i = 0; i < app_nic->total_phyports; i++) {\n \t\t/* Check to see if ports are still in use */\n-\t\tif (pf_dev->ports[i])\n+\t\tif (app_nic->ports[i])\n \t\t\treturn 0;\n \t}\n \n@@ -296,6 +300,7 @@\n \tfree(pf_dev->hwinfo);\n \tfree(pf_dev->sym_tbl);\n \tnfp_cpp_free(pf_dev->cpp);\n+\trte_free(app_nic);\n \trte_free(pf_dev);\n \n \trte_intr_disable(pci_dev->intr_handle);\n@@ -404,6 +409,7 @@\n {\n \tstruct rte_pci_device *pci_dev;\n \tstruct nfp_pf_dev *pf_dev;\n+\tstruct nfp_app_nic *app_nic;\n \tstruct nfp_net_hw *hw;\n \tstruct rte_ether_addr *tmp_ether_addr;\n \tuint64_t rx_bar_off = 0;\n@@ -420,6 +426,9 @@\n \t/* Use backpointer here to the PF of this eth_dev */\n \tpf_dev = NFP_NET_DEV_PRIVATE_TO_PF(eth_dev->data->dev_private);\n \n+\t/* Use backpointer to the CoreNIC app struct */\n+\tapp_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);\n+\n \t/* NFP can not handle DMA addresses requiring more than 40 bits */\n \tif (rte_mem_check_dma_mask(40)) {\n \t\tRTE_LOG(ERR, PMD,\n@@ -438,7 +447,7 @@\n \t * Use PF array of physical ports to get pointer to\n \t * this specific port\n \t */\n-\thw = pf_dev->ports[port];\n+\thw = app_nic->ports[port];\n \n \tPMD_INIT_LOG(DEBUG, \"Working with physical port number: %d, \"\n \t\t\t\"NFP internal port number: %d\", port, hw->nfp_idx);\n@@ -568,7 +577,7 @@\n \t\tgoto dev_err_queues_map;\n \t}\n \n-\tnfp_net_pf_read_mac(pf_dev, port);\n+\tnfp_net_pf_read_mac(app_nic, port);\n \tnfp_net_write_mac(hw, (uint8_t *)&hw->mac_addr);\n \n \ttmp_ether_addr = (struct rte_ether_addr *)&hw->mac_addr;\n@@ -718,25 +727,67 @@\n }\n \n static int\n-nfp_init_phyports(struct nfp_pf_dev *pf_dev)\n+nfp_init_app_nic(struct nfp_pf_dev *pf_dev,\n+\t\tstruct nfp_eth_table *nfp_eth_table)\n {\n \tint i;\n-\tint ret = 0;\n+\tint ret;\n+\tint err = 0;\n+\tint total_vnics;\n \tstruct nfp_net_hw *hw;\n+\tunsigned int numa_node;\n \tstruct rte_eth_dev *eth_dev;\n-\tstruct nfp_eth_table *nfp_eth_table;\n+\tstruct nfp_app_nic *app_nic;\n+\tchar port_name[RTE_ETH_NAME_MAX_LEN];\n \n-\tnfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);\n-\tif (nfp_eth_table == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"Error reading NFP ethernet table\");\n-\t\treturn -EIO;\n+\tPMD_INIT_LOG(INFO, \"Total physical ports: %d\", nfp_eth_table->count);\n+\n+\t/* Allocate memory for the CoreNIC app */\n+\tapp_nic = rte_zmalloc(\"nfp_app_nic\", sizeof(*app_nic), 0);\n+\tif (app_nic == NULL)\n+\t\treturn -ENOMEM;\n+\n+\t/* Point the app_priv pointer in the PF to the coreNIC app */\n+\tpf_dev->app_priv = app_nic;\n+\n+\t/* Read the number of vNIC's created for the PF */\n+\ttotal_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, \"nfd_cfg_pf0_num_ports\", &err);\n+\tif (err || total_vnics <= 0 || total_vnics > 8) {\n+\t\tPMD_INIT_LOG(ERR, \"nfd_cfg_pf0_num_ports symbol with wrong value\");\n+\t\tret = -ENODEV;\n+\t\tgoto app_cleanup;\n \t}\n \n-\t/* Loop through all physical ports on PF */\n-\tfor (i = 0; i < pf_dev->total_phyports; i++) {\n-\t\tconst unsigned int numa_node = rte_socket_id();\n-\t\tchar port_name[RTE_ETH_NAME_MAX_LEN];\n+\t/*\n+\t * For coreNIC the number of vNICs exposed should be the same as the\n+\t * number of physical ports\n+\t */\n+\tif (total_vnics != (int)nfp_eth_table->count) {\n+\t\tPMD_INIT_LOG(ERR, \"Total physical ports do not match number of vNICs\");\n+\t\tret = -ENODEV;\n+\t\tgoto app_cleanup;\n+\t}\n \n+\t/* Populate coreNIC app properties*/\n+\tapp_nic->total_phyports = total_vnics;\n+\tapp_nic->pf_dev = pf_dev;\n+\tif (total_vnics > 1)\n+\t\tapp_nic->multiport = true;\n+\n+\t/* Map the symbol table */\n+\tpf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, \"_pf0_net_bar0\",\n+\t\t\tapp_nic->total_phyports * 32768, &pf_dev->ctrl_area);\n+\tif (pf_dev->ctrl_bar == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for _pf0_net_ctrl_bar\");\n+\t\tret = -EIO;\n+\t\tgoto app_cleanup;\n+\t}\n+\n+\tPMD_INIT_LOG(DEBUG, \"ctrl bar: %p\", pf_dev->ctrl_bar);\n+\n+\t/* Loop through all physical ports on PF */\n+\tnuma_node = rte_socket_id();\n+\tfor (i = 0; i < app_nic->total_phyports; i++) {\n \t\tsnprintf(port_name, sizeof(port_name), \"%s_port%d\",\n \t\t\t pf_dev->pci_dev->device.name, i);\n \n@@ -760,7 +811,7 @@\n \t\thw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n \n \t\t/* Add this device to the PF's array of physical ports */\n-\t\tpf_dev->ports[i] = hw;\n+\t\tapp_nic->ports[i] = hw;\n \n \t\thw->pf_dev = pf_dev;\n \t\thw->cpp = pf_dev->cpp;\n@@ -783,20 +834,21 @@\n \t\trte_eth_dev_probing_finish(eth_dev);\n \n \t} /* End loop, all ports on this PF */\n-\tret = 0;\n-\tgoto eth_table_cleanup;\n+\n+\treturn 0;\n \n port_cleanup:\n-\tfor (i = 0; i < pf_dev->total_phyports; i++) {\n-\t\tif (pf_dev->ports[i] && pf_dev->ports[i]->eth_dev) {\n+\tfor (i = 0; i < app_nic->total_phyports; i++) {\n+\t\tif (app_nic->ports[i] && app_nic->ports[i]->eth_dev) {\n \t\t\tstruct rte_eth_dev *tmp_dev;\n-\t\t\ttmp_dev = pf_dev->ports[i]->eth_dev;\n+\t\t\ttmp_dev = app_nic->ports[i]->eth_dev;\n \t\t\trte_eth_dev_release_port(tmp_dev);\n-\t\t\tpf_dev->ports[i] = NULL;\n+\t\t\tapp_nic->ports[i] = NULL;\n \t\t}\n \t}\n-eth_table_cleanup:\n-\tfree(nfp_eth_table);\n+\tnfp_cpp_area_free(pf_dev->ctrl_area);\n+app_cleanup:\n+\trte_free(app_nic);\n \n \treturn ret;\n }\n@@ -804,11 +856,11 @@\n static int\n nfp_pf_init(struct rte_pci_device *pci_dev)\n {\n-\tint err;\n-\tint ret = 0;\n+\tint ret;\n+\tint err = 0;\n \tuint64_t addr;\n-\tint total_ports;\n \tstruct nfp_cpp *cpp;\n+\tenum nfp_app_id app_id;\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct nfp_hwinfo *hwinfo;\n \tchar name[RTE_ETH_NAME_MAX_LEN];\n@@ -840,9 +892,10 @@\n \tif (hwinfo == NULL) {\n \t\tPMD_INIT_LOG(ERR, \"Error reading hwinfo table\");\n \t\tret = -EIO;\n-\t\tgoto error;\n+\t\tgoto cpp_cleanup;\n \t}\n \n+\t/* Read the number of physical ports from hardware */\n \tnfp_eth_table = nfp_eth_read_ports(cpp);\n \tif (nfp_eth_table == NULL) {\n \t\tPMD_INIT_LOG(ERR, \"Error reading NFP ethernet table\");\n@@ -865,20 +918,14 @@\n \t\tgoto eth_table_cleanup;\n \t}\n \n-\ttotal_ports = nfp_rtsym_read_le(sym_tbl, \"nfd_cfg_pf0_num_ports\", &err);\n-\tif (total_ports != (int)nfp_eth_table->count) {\n-\t\tPMD_DRV_LOG(ERR, \"Inconsistent number of ports\");\n+\t/* Read the app ID of the firmware loaded */\n+\tapp_id = nfp_rtsym_read_le(sym_tbl, \"_pf0_net_app_id\", &err);\n+\tif (err) {\n+\t\tPMD_INIT_LOG(ERR, \"Couldn't read app_id from fw\");\n \t\tret = -EIO;\n \t\tgoto sym_tbl_cleanup;\n \t}\n \n-\tPMD_INIT_LOG(INFO, \"Total physical ports: %d\", total_ports);\n-\n-\tif (total_ports <= 0 || total_ports > 8) {\n-\t\tPMD_INIT_LOG(ERR, \"nfd_cfg_pf0_num_ports symbol with wrong value\");\n-\t\tret = -ENODEV;\n-\t\tgoto sym_tbl_cleanup;\n-\t}\n \t/* Allocate memory for the PF \"device\" */\n \tsnprintf(name, sizeof(name), \"nfp_pf%d\", 0);\n \tpf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);\n@@ -888,27 +935,12 @@\n \t}\n \n \t/* Populate the newly created PF device */\n+\tpf_dev->app_id = app_id;\n \tpf_dev->cpp = cpp;\n \tpf_dev->hwinfo = hwinfo;\n \tpf_dev->sym_tbl = sym_tbl;\n-\tpf_dev->total_phyports = total_ports;\n-\n-\tif (total_ports > 1)\n-\t\tpf_dev->multiport = true;\n-\n \tpf_dev->pci_dev = pci_dev;\n \n-\t/* Map the symbol table */\n-\tpf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, \"_pf0_net_bar0\",\n-\t\t\tpf_dev->total_phyports * 32768, &pf_dev->ctrl_area);\n-\tif (pf_dev->ctrl_bar == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for _pf0_net_ctrl_bar\");\n-\t\tret = -EIO;\n-\t\tgoto pf_cleanup;\n-\t}\n-\n-\tPMD_INIT_LOG(DEBUG, \"ctrl bar: %p\", pf_dev->ctrl_bar);\n-\n \t/* configure access to tx/rx vNIC BARs */\n \tswitch (pci_dev->id.device_id) {\n \tcase PCI_DEVICE_ID_NFP3800_PF_NIC:\n@@ -923,7 +955,7 @@\n \tdefault:\n \t\tPMD_INIT_LOG(ERR, \"nfp_net: no device ID matching\");\n \t\terr = -ENODEV;\n-\t\tgoto ctrl_area_cleanup;\n+\t\tgoto pf_cleanup;\n \t}\n \n \tpf_dev->hw_queues = nfp_cpp_map_area(pf_dev->cpp, 0, 0,\n@@ -932,18 +964,27 @@\n \tif (pf_dev->hw_queues == NULL) {\n \t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for net.qc\");\n \t\tret = -EIO;\n-\t\tgoto ctrl_area_cleanup;\n+\t\tgoto pf_cleanup;\n \t}\n \n \tPMD_INIT_LOG(DEBUG, \"tx/rx bar address: 0x%p\", pf_dev->hw_queues);\n \n \t/*\n-\t * Initialize and prep physical ports now\n-\t * This will loop through all physical ports\n+\t * PF initialization has been done at this point. Call app specific\n+\t * init code now\n \t */\n-\tret = nfp_init_phyports(pf_dev);\n-\tif (ret) {\n-\t\tPMD_INIT_LOG(ERR, \"Could not create physical ports\");\n+\tswitch (pf_dev->app_id) {\n+\tcase NFP_APP_CORE_NIC:\n+\t\tPMD_INIT_LOG(INFO, \"Initializing coreNIC\");\n+\t\tret = nfp_init_app_nic(pf_dev, nfp_eth_table);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Could not initialize coreNIC!\");\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 \t\tgoto hwqueues_cleanup;\n \t}\n \n@@ -954,8 +995,6 @@\n \n hwqueues_cleanup:\n \tnfp_cpp_area_free(pf_dev->hwqueues_area);\n-ctrl_area_cleanup:\n-\tnfp_cpp_area_free(pf_dev->ctrl_area);\n pf_cleanup:\n \trte_free(pf_dev);\n sym_tbl_cleanup:\n@@ -964,6 +1003,8 @@\n \tfree(nfp_eth_table);\n hwinfo_cleanup:\n \tfree(hwinfo);\n+cpp_cleanup:\n+\tnfp_cpp_free(cpp);\n error:\n \treturn ret;\n }\n@@ -977,7 +1018,8 @@\n nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n {\n \tint i;\n-\tint err;\n+\tint err = 0;\n+\tint ret = 0;\n \tint total_ports;\n \tstruct nfp_cpp *cpp;\n \tstruct nfp_net_hw *hw;\n@@ -1015,6 +1057,11 @@\n \t}\n \n \ttotal_ports = nfp_rtsym_read_le(sym_tbl, \"nfd_cfg_pf0_num_ports\", &err);\n+\tif (err || total_ports <= 0 || total_ports > 8) {\n+\t\tPMD_INIT_LOG(ERR, \"nfd_cfg_pf0_num_ports symbol with wrong value\");\n+\t\tret = -ENODEV;\n+\t\tgoto sym_tbl_cleanup;\n+\t}\n \n \tfor (i = 0; i < total_ports; i++) {\n \t\tstruct rte_eth_dev *eth_dev;\n@@ -1028,7 +1075,8 @@\n \t\tif (eth_dev == NULL) {\n \t\t\tRTE_LOG(ERR, EAL,\n \t\t\t\t\"secondary process attach failed, ethdev doesn't exist\");\n-\t\t\treturn -ENODEV;\n+\t\t\tret = -ENODEV;\n+\t\t\tbreak;\n \t\t}\n \n \t\thw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);\n@@ -1041,10 +1089,16 @@\n \t\trte_eth_dev_probing_finish(eth_dev);\n \t}\n \n+\tif (ret)\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 \n-\treturn 0;\n+sym_tbl_cleanup:\n+\tfree(sym_tbl);\n+\n+\treturn ret;\n }\n \n static int\n",
    "prefixes": [
        "01/12"
    ]
}