get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 131499,
    "url": "http://patches.dpdk.org/api/patches/131499/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230915091551.1459606-25-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": "<20230915091551.1459606-25-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230915091551.1459606-25-chaoyong.he@corigine.com",
    "date": "2023-09-15T09:15:48",
    "name": "[v3,24/27] net/nfp: refact the cppcore module",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "464e708873e575d6b47ee6fab61359c9d73784d2",
    "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/20230915091551.1459606-25-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29520,
            "url": "http://patches.dpdk.org/api/series/29520/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29520",
            "date": "2023-09-15T09:15:24",
            "name": "refact the nfpcore module",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/29520/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/131499/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/131499/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 BB6D8425A3;\n\tFri, 15 Sep 2023 11:19:28 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id BC7ED42DB6;\n\tFri, 15 Sep 2023 11:17:09 +0200 (CEST)",
            "from NAM12-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam12on2121.outbound.protection.outlook.com [40.107.237.121])\n by mails.dpdk.org (Postfix) with ESMTP id B5A4842D97\n for <dev@dpdk.org>; Fri, 15 Sep 2023 11:17:07 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by CO1PR13MB4773.namprd13.prod.outlook.com (2603:10b6:303:fb::6) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.21; Fri, 15 Sep\n 2023 09:17:06 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::c05c:6915:1628:70c4]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::c05c:6915:1628:70c4%7]) with mapi id 15.20.6768.029; Fri, 15 Sep 2023\n 09:17:06 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=KGV+0ZkaIjU3VIDMCNJdJfLjp6rw4RVaDPQ4kWnbyrqalIv1rKoUlObjuH/Xx0DsFQauw00QLi+BlRc7lXcyCgEj0mcxXnstWrtapMIV4wC8pZd/3g8z8cKn9wKIE4vsmgCPR3anZkWrBtzkwwzBQFv8MKKMkq5izpK7peDQFh+EW9QogbBafXX1MQXtNQOxRml9S7GDWjW8V40l3lxCy0ZWunAUuZipoXgsPCZJ8XH2rYdDvgqlzZ1hqmzvhbtgkecSn1oRWMcVsbKeggHQlWitwlL+Ger+tai15exIauEEBeGrcmZspxF+/p68iYm+TUgSmgOTRZbRtYH+gQQsZQ==",
        "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=4SeL/sNh1CDUKzg/ZBL4DYY8ZkmF0oGPND3swf6fxL8=;\n b=ib2rHr6OXkxqLnluhxUa47F2+LIGRT3r8SAc6LKO6paeqQSmFCO6bCV5LuZm3bHln0Oh8mVnteBWcGGYlies+ZuE8NYxKtjnXg4dJU/nsltZNfQVf+s+eRF67bGw1sj+V2igXtrTABwWrUciV4UZxWu/emqOR9mGqUQ2Z/fLiZskxlUoJRpeisoUNBdQRZOITw9fLL04Jl9EZryVfeq2rYn3URCiXscoGf2Tr7NtjHXj05gdvSqycz0qSPW6fE69hFzoCM5ZkO2XnMN35gsoAaPkaeublOql9MFHcP0EhSECwfWUwjgmYfadjNIJmWkmEtA6dGyyfHESdxF4BY2Kpg==",
        "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=4SeL/sNh1CDUKzg/ZBL4DYY8ZkmF0oGPND3swf6fxL8=;\n b=c/MM6iTR7aPI6hHwSoq3n/Ce2t2ZPwFWoQEmTsW/Y0Va+CVvauhGMAe7U4N4oKEILZ+TEXX53vgCnYOqagz8biq1LbggRUadIWOCzj4ikSTLkWCsB4ZarGceH669aJzBKnBBc2xslT8t9iKMhyUOAEbyB7Vfn21CKswG75y+TmA=",
        "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, Chaoyong He <chaoyong.he@corigine.com>,\n\t=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@corigine.com>",
        "Subject": "[PATCH v3 24/27] net/nfp: refact the cppcore module",
        "Date": "Fri, 15 Sep 2023 17:15:48 +0800",
        "Message-Id": "<20230915091551.1459606-25-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20230915091551.1459606-1-chaoyong.he@corigine.com>",
        "References": "<20230830021457.2064750-1-chaoyong.he@corigine.com>\n <20230915091551.1459606-1-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "PH7PR10CA0017.namprd10.prod.outlook.com\n (2603:10b6:510:23d::10) 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_|CO1PR13MB4773:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "9b5b005a-d0c6-44ae-45d1-08dbb5cc87b5",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n hrY2RMMvk2CX2i769G/GdURYbIwE4OfMq3CfKzzdGY5Xy4vfdNJ0NXQZhLqXllUv4kfxb05hVBcHZ4lyV9LEl3bbQ9p5xso4XGIiHfQAiNb25U8ngRcnZjgethO63+4G1SoWo6mJTxP9Gej33KXvsSUur8sQbJSFMAgwRElN4aQTgQ8zdCjjLGHulSMi/pDFkTMLnwkh3EGT8N8WqOGcyIf0cZsmkrVFCvaHmPWwjXIspQFF1j2vzHhgsEvlfI9ot0N5jiFHlLwldeXvnw5JqOKnwKJe6vpA/xxxkYnNR2w9UNnt80AuyxtuNZkDOjWxCvC/H89yYOle/5Qy00i6E1rUD9UFmLERdMW6KpwVa2JdCNe56OEWwIBD03nl2ZeN41T2rvdmifj7upKXLZ232kD3smlGybyZV6MmMN4AChP14ln33B9vgiS/vhP59SlBiTJwuXaZBCGY/YMDjnFL/u36/p9Ic/3boBTKNHqjjDTzFEZrrMkcYvnoekq2wUdMHylKXJbYoCU1AO4Jjl2oNYflqLTyPVGMgOGfifOnMKIMcfa2jgnw6U0TuwTt2eXDwxMWI2hZvdciadHirsPewCN6CdpRoGYu+1F0bCOgF0u2/Jilx3CdhBKw0hE7uBuc51UUm4tKJN2lEz3+MAIx13kUCs9C+ltx2415v7hec68=",
        "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:(13230031)(39840400004)(346002)(136003)(376002)(396003)(366004)(451199024)(186009)(1800799009)(6512007)(107886003)(1076003)(2616005)(6666004)(52116002)(6506007)(6486002)(66946007)(26005)(316002)(41300700001)(66476007)(66556008)(6916009)(54906003)(5660300002)(4326008)(8676002)(38350700002)(8936002)(38100700002)(478600001)(66574015)(83380400001)(36756003)(44832011)(30864003)(86362001)(2906002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?lVUCXR1wpJQ+pt50oRMAvupFKmNz?=\n\t=?utf-8?q?hFOsxt0LYnNNX0axPH/Dcm1fvyqPQsEhao0JZYIyoSnRkQ/JE9FGcojrgZiTRcioJ?=\n\t=?utf-8?q?ctIITtFp05gXcREdoN6FH8FER9/VLEqNIeLXQZbMwJ52t0f4Be51y99IVkXTcUbVa?=\n\t=?utf-8?q?4FEv0tUm4HX/ms0uxjywmhg3mj8s0c8EAB4HpOBRPCTfE8C2kZwdFqhVKx686n2L0?=\n\t=?utf-8?q?gKujKKa2Vv6C9PT1VM8r7I+AxW0LuQ4XlhLflsH/MNZv3hDAM+K6XfgahtrWFf04q?=\n\t=?utf-8?q?qD2Dqqvr/Ihaio7w3satxdH6Ad494yIvVnaZ1LG+hjI8JU7uRrZ8JTv9B0cbyOe2q?=\n\t=?utf-8?q?hWCcGv1n/4IoUHxDNx8yBoLZui1DGcPDFLbW62vQ5KgQHZHHnD4IqL5h5n+HGnBGn?=\n\t=?utf-8?q?at+hlGaqE/kGJ284ihM0GyuyzG+ecD7GaSjEJoalHMhBUb0JxgISg5DRr6VSvDHKb?=\n\t=?utf-8?q?XvO00Hx3qYnt7cTw5voW8aL9ZazlEPjBbU4jg9FH/6GMnPGCTcjHzYqgfdIuNKtK8?=\n\t=?utf-8?q?NiipJcQd/8raJJBjaWTIbJhcGu/yNXrANMhzGokOLL1bKbNOjFcekYZf7tynmz4lj?=\n\t=?utf-8?q?f70cfxJDCA+tIUUx/HHKvKIjjnjd7m1iCCYkHwj91CfCIeh5rUCfuDOoEtCzk8W4M?=\n\t=?utf-8?q?f7rOlatqGvjmGY30DOZ2AZ9yfsV6LX8NMC+1C04AcLRxuwysLPm5DDSta/y+GAJNN?=\n\t=?utf-8?q?WIvZ4Ty523QVkUx4TgUO+NEdwBOyo7GWaeI5KCrrOzq3k49tqHUVDji4ujTS0Wqek?=\n\t=?utf-8?q?pYlbYh0T76MvpTlG+NAKVeaOJaZeHWG9UDdfZEtRfMgUzl7NJsuZCqNOu3P3Ie3j5?=\n\t=?utf-8?q?lJ8BaNeZMCON66LBu4Kub0flYJiRzU+Sd8A6FgKACdoSAaIJFisS8mXay1wBwo4iu?=\n\t=?utf-8?q?70jBUNwTvR0yCg5RGuL/cgdDwhURp3zon9FqbrkTd6HPkU9X67p2aGjODC5xUBZ7B?=\n\t=?utf-8?q?tE9X0pBsBqMgYgjIz/43FMZY9vNQ7SbeHLh5e/RPbdvzSunM8I+Rcf6Y7ag1IGTvw?=\n\t=?utf-8?q?iKJTEdb0Up/BphH6dVwf5DaTvlwC78gZjIEfURN6sfzjoASucIuxAhdPshUPb03Fo?=\n\t=?utf-8?q?teIK9PLaDRsRBMLlPf5iOuSERJ4YHFuhQgGJfYpZutRcZ6u5I68/CRlJEmwc04AoT?=\n\t=?utf-8?q?VkQJ0MVizP4tVL1PWO/OL2gcUjovMVG2xdhTZBkepNWwmssDk2UGcyGe2GRjRCnMS?=\n\t=?utf-8?q?+FxC2M29APdUpmOQi7CUP36dW+9LC83BFe+Au052KoCs1TNpBqI+1uu90l/Z8ya+y?=\n\t=?utf-8?q?gsPExAm22EzhPbPQCMlW80mx5szUhwydFirrk9nIB+4eWs4JgeNvgopYPDtZJPXgV?=\n\t=?utf-8?q?Br9keDKOkRJ+UnwCpsuelYNLEDk6zt59J+qgr29Y9I2J9vLSAnMAq61EBH2sCSl0m?=\n\t=?utf-8?q?JXb6Ovbsc+UqYY9y5so3fYQgR4obtgfJd7J0qbE2OuZ81/gRCbwlH/qbAap5N+WGn?=\n\t=?utf-8?q?Nlm6KZfbJLgVAwjdAUkghwDrspiZsTvHTUASaA99aX1gn/kPY0/AZJmN2wXiii/mU?=\n\t=?utf-8?q?8d1i12zMSSzTa73W58AKnFJGJBjn2yGzSA=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 9b5b005a-d0c6-44ae-45d1-08dbb5cc87b5",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "15 Sep 2023 09:17:06.0593 (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 En5a6h8akh3hrccPrGVPP6DgefBYm6ixDLXhVDXE4cizgv2GPUCNpyGzylLjvC2U5qt96aaZZbz9ulD2EGpBolYxmppdyzVNvfN/15DJ5D4=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CO1PR13MB4773",
        "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": "Modify the comment and standard the coding style.\nMove the definition of data structure into the implement file to make\nthe API small.\nAlso sync the logic from kernel driver and remove the unneeded header\nfile include statements.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n drivers/net/nfp/nfp_cpp_bridge.c       |   2 +-\n drivers/net/nfp/nfp_ethdev.c           |  14 +-\n drivers/net/nfp/nfpcore/nfp6000_pcie.c |   4 +-\n drivers/net/nfp/nfpcore/nfp_cpp.h      |  40 ++----\n drivers/net/nfp/nfpcore/nfp_cppcore.c  | 186 ++++++++++++++++---------\n 5 files changed, 143 insertions(+), 103 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/nfp_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c\nindex 88cd1aa572..a9998f3c08 100644\n--- a/drivers/net/nfp/nfp_cpp_bridge.c\n+++ b/drivers/net/nfp/nfp_cpp_bridge.c\n@@ -344,7 +344,7 @@ nfp_cpp_bridge_serve_ioctl(int sockfd, struct nfp_cpp *cpp)\n \t\treturn -EIO;\n \t}\n \n-\ttmp = cpp->interface;\n+\ttmp = nfp_cpp_interface(cpp);\n \n \tPMD_CPP_LOG(DEBUG, \"%s: sending NFP interface %08x\\n\", __func__, tmp);\n \ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex c37d8a1449..5d129d0ad3 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -654,15 +654,23 @@ nfp_fw_upload(struct rte_pci_device *dev, struct nfp_nsp *nsp, char *card)\n \tchar fw_name[125];\n \tchar serial[40];\n \tsize_t fsize;\n+\tuint16_t interface;\n+\tuint32_t cpp_serial_len;\n+\tconst uint8_t *cpp_serial;\n+\n+\tcpp_serial_len = nfp_cpp_serial(cpp, &cpp_serial);\n+\tif (cpp_serial_len != NFP_SERIAL_LEN)\n+\t\treturn -ERANGE;\n+\n+\tinterface = nfp_cpp_interface(cpp);\n \n \t/* Looking for firmware file in order of priority */\n \n \t/* First try to find a firmware image specific for this device */\n \tsnprintf(serial, sizeof(serial),\n \t\t\t\"serial-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\",\n-\t\tcpp->serial[0], cpp->serial[1], cpp->serial[2], cpp->serial[3],\n-\t\tcpp->serial[4], cpp->serial[5], cpp->interface >> 8,\n-\t\tcpp->interface & 0xff);\n+\t\tcpp_serial[0], cpp_serial[1], cpp_serial[2], cpp_serial[3],\n+\t\tcpp_serial[4], cpp_serial[5], interface >> 8, interface & 0xff);\n \n \tsnprintf(fw_name, sizeof(fw_name), \"%s/%s.nffw\", DEFAULT_FW_PATH,\n \t\t\tserial);\ndiff --git a/drivers/net/nfp/nfpcore/nfp6000_pcie.c b/drivers/net/nfp/nfpcore/nfp6000_pcie.c\nindex abee584f85..45645e04f8 100644\n--- a/drivers/net/nfp/nfpcore/nfp6000_pcie.c\n+++ b/drivers/net/nfp/nfpcore/nfp6000_pcie.c\n@@ -739,7 +739,7 @@ nfp6000_init(struct nfp_cpp *cpp,\n \tstrlcpy(desc->busdev, dev->device.name, sizeof(desc->busdev));\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY &&\n-\t\t\tcpp->driver_lock_needed) {\n+\t\t\tnfp_cpp_driver_need_lock(cpp)) {\n \t\tret = nfp_acquire_process_lock(desc);\n \t\tif (ret != 0)\n \t\t\tgoto error;\n@@ -778,7 +778,7 @@ nfp6000_free(struct nfp_cpp *cpp)\n \tstruct nfp_pcie_user *desc = nfp_cpp_priv(cpp);\n \n \tnfp_disable_bars(desc);\n-\tif (cpp->driver_lock_needed)\n+\tif (nfp_cpp_driver_need_lock(cpp))\n \t\tclose(desc->lock);\n \tclose(desc->device);\n \tfree(desc);\ndiff --git a/drivers/net/nfp/nfpcore/nfp_cpp.h b/drivers/net/nfp/nfpcore/nfp_cpp.h\nindex 0df97552cb..34ed50ceca 100644\n--- a/drivers/net/nfp/nfpcore/nfp_cpp.h\n+++ b/drivers/net/nfp/nfpcore/nfp_cpp.h\n@@ -9,38 +9,12 @@\n #include <ethdev_pci.h>\n \n /* NFP CPP handle */\n-struct nfp_cpp {\n-\tuint32_t model;\n-\tuint32_t interface;\n-\tuint8_t *serial;\n-\tint serial_len;\n-\tvoid *priv;\n-\n-\t/* Mutex cache */\n-\tstruct nfp_cpp_mutex *mutex_cache;\n-\tconst struct nfp_cpp_operations *op;\n-\n-\t/*\n-\t * NFP-6xxx originating island IMB CPP Address Translation. CPP Target\n-\t * ID is index into array. Values are obtained at runtime from local\n-\t * island XPB CSRs.\n-\t */\n-\tuint32_t imb_cat_table[16];\n-\n-\t/* MU access type bit offset */\n-\tuint32_t mu_locality_lsb;\n-\n-\tint driver_lock_needed;\n-};\n+struct nfp_cpp;\n \n /* NFP CPP device area handle */\n-struct nfp_cpp_area {\n-\tstruct nfp_cpp *cpp;\n-\tchar *name;\n-\tunsigned long long offset;\n-\tunsigned long size;\n-\t/* Here follows the 'priv' part of nfp_cpp_area. */\n-};\n+struct nfp_cpp_area;\n+\n+#define NFP_SERIAL_LEN        6\n \n /*\n  * NFP CPP operations structure\n@@ -230,7 +204,7 @@ void nfp_cpp_model_set(struct nfp_cpp *cpp, uint32_t model);\n \n void nfp_cpp_interface_set(struct nfp_cpp *cpp, uint32_t interface);\n \n-int nfp_cpp_serial_set(struct nfp_cpp *cpp, const uint8_t *serial,\n+void nfp_cpp_serial_set(struct nfp_cpp *cpp, const uint8_t *serial,\n \t\tsize_t serial_len);\n \n void nfp_cpp_priv_set(struct nfp_cpp *cpp, void *priv);\n@@ -349,7 +323,9 @@ uint32_t nfp_cpp_model(struct nfp_cpp *cpp);\n \n uint16_t nfp_cpp_interface(struct nfp_cpp *cpp);\n \n-int nfp_cpp_serial(struct nfp_cpp *cpp, const uint8_t **serial);\n+uint32_t nfp_cpp_serial(struct nfp_cpp *cpp, const uint8_t **serial);\n+\n+bool nfp_cpp_driver_need_lock(const struct nfp_cpp *cpp);\n \n struct nfp_cpp_area *nfp_cpp_area_alloc(struct nfp_cpp *cpp, uint32_t cpp_id,\n \t\tuint64_t address, size_t size);\ndiff --git a/drivers/net/nfp/nfpcore/nfp_cppcore.c b/drivers/net/nfp/nfpcore/nfp_cppcore.c\nindex 965b7a3428..0c1a03b0ab 100644\n--- a/drivers/net/nfp/nfpcore/nfp_cppcore.c\n+++ b/drivers/net/nfp/nfpcore/nfp_cppcore.c\n@@ -3,30 +3,56 @@\n  * All rights reserved.\n  */\n \n-#include <assert.h>\n-#include <stdint.h>\n-#include <stdio.h>\n-#include <string.h>\n-#include <stdlib.h>\n-#include <unistd.h>\n-#include <sys/types.h>\n-\n-#include <rte_byteorder.h>\n-#include <ethdev_pci.h>\n+#include \"nfp_cpp.h\"\n \n #include \"nfp_logs.h\"\n+#include \"nfp_platform.h\"\n #include \"nfp_target.h\"\n #include \"nfp6000/nfp6000.h\"\n #include \"nfp6000/nfp_xpb.h\"\n-#include \"nfp_nffw.h\"\n #include \"nfp6000_pcie.h\"\n \n+#define NFP_PL_DEVICE_PART_NFP6000              0x6200\n #define NFP_PL_DEVICE_ID                        0x00000004\n #define NFP_PL_DEVICE_ID_MASK                   0xff\n #define NFP_PL_DEVICE_PART_MASK                 0xffff0000\n #define NFP_PL_DEVICE_MODEL_MASK               (NFP_PL_DEVICE_PART_MASK | \\\n \t\t\t\t\t\tNFP_PL_DEVICE_ID_MASK)\n \n+/* NFP CPP handle */\n+struct nfp_cpp {\n+\tvoid *priv;  /**< Private data of the low-level implementation */\n+\n+\tuint32_t model;  /**< Chip model */\n+\tuint16_t interface;  /**< Chip interface id */\n+\tuint8_t serial[NFP_SERIAL_LEN];  /**< Chip serial number */\n+\n+\t/** Low-level implementation ops */\n+\tconst struct nfp_cpp_operations *op;\n+\n+\t/*\n+\t * NFP-6xxx originating island IMB CPP Address Translation. CPP Target\n+\t * ID is index into array. Values are obtained at runtime from local\n+\t * island XPB CSRs.\n+\t */\n+\tuint32_t imb_cat_table[16];\n+\n+\t/**< MU access type bit offset */\n+\tuint32_t mu_locality_lsb;\n+\n+\tbool driver_lock_needed;\n+};\n+\n+/* NFP CPP device area handle */\n+struct nfp_cpp_area {\n+\tstruct nfp_cpp *cpp;\n+\tchar *name;\n+\tuint64_t offset;\n+\tuint32_t size;\n+\t/* Here follows the 'priv' part of nfp_cpp_area. */\n+\t/* Here follows the ASCII name, pointed by @name */\n+};\n+\n /**\n  * Set the private data of the nfp_cpp instance\n  *\n@@ -125,12 +151,13 @@ nfp_cpp_interface_set(struct nfp_cpp *cpp,\n  * @return\n  *   Length of NFP serial number\n  */\n-int\n+uint32_t\n nfp_cpp_serial(struct nfp_cpp *cpp,\n \t\tconst uint8_t **serial)\n {\n-\t*serial = cpp->serial;\n-\treturn cpp->serial_len;\n+\t*serial = &cpp->serial[0];\n+\n+\treturn sizeof(cpp->serial);\n }\n \n /**\n@@ -143,22 +170,12 @@ nfp_cpp_serial(struct nfp_cpp *cpp,\n  * @param serial_len\n  *   Length of the serial byte array\n  */\n-int\n+void\n nfp_cpp_serial_set(struct nfp_cpp *cpp,\n \t\tconst uint8_t *serial,\n \t\tsize_t serial_len)\n {\n-\tif (cpp->serial_len)\n-\t\tfree(cpp->serial);\n-\n-\tcpp->serial = malloc(serial_len);\n-\tif (cpp->serial == NULL)\n-\t\treturn -1;\n-\n \tmemcpy(cpp->serial, serial, serial_len);\n-\tcpp->serial_len = serial_len;\n-\n-\treturn 0;\n }\n \n /**\n@@ -179,6 +196,21 @@ nfp_cpp_interface(struct nfp_cpp *cpp)\n \treturn cpp->interface;\n }\n \n+/**\n+ * Retrieve the driver need lock flag\n+ *\n+ * @param cpp\n+ *   NFP CPP handle\n+ *\n+ * @return\n+ *   The driver need lock flag\n+ */\n+bool\n+nfp_cpp_driver_need_lock(const struct nfp_cpp *cpp)\n+{\n+\treturn cpp->driver_lock_needed;\n+}\n+\n /**\n  * Get the privately allocated portion of a NFP CPP area handle\n  *\n@@ -283,39 +315,40 @@ nfp_cpp_area_alloc_with_name(struct nfp_cpp *cpp,\n \t\tuint32_t size)\n {\n \tint err;\n+\tsize_t name_len;\n+\tuint32_t target_id;\n+\tuint64_t target_addr;\n \tstruct nfp_cpp_area *area;\n-\tuint64_t tmp64 = (uint64_t)address;\n \n \tif (cpp == NULL)\n \t\treturn NULL;\n \n \t/* Remap from cpp_island to cpp_target */\n-\terr = nfp_target_cpp(dest, tmp64, &dest, &tmp64, cpp->imb_cat_table);\n+\terr = nfp_target_cpp(dest, address, &target_id, &target_addr,\n+\t\t\tcpp->imb_cat_table);\n \tif (err < 0)\n \t\treturn NULL;\n \n-\taddress = tmp64;\n-\n \tif (name == NULL)\n-\t\tname = \"\";\n+\t\tname = \"(reserved)\";\n \n-\tarea = calloc(1, sizeof(*area) + cpp->op->area_priv_size +\n-\t\t\tstrlen(name) + 1);\n+\tname_len = strlen(name) + 1;\n+\tarea = calloc(1, sizeof(*area) + cpp->op->area_priv_size + name_len);\n \tif (area == NULL)\n \t\treturn NULL;\n \n \tarea->cpp = cpp;\n \tarea->name = ((char *)area) + sizeof(*area) + cpp->op->area_priv_size;\n-\tmemcpy(area->name, name, strlen(name) + 1);\n+\tmemcpy(area->name, name, name_len);\n \n-\terr = cpp->op->area_init(area, dest, address, size);\n+\terr = cpp->op->area_init(area, target_id, target_addr, size);\n \tif (err < 0) {\n \t\tPMD_DRV_LOG(ERR, \"Area init op failed\");\n \t\tfree(area);\n \t\treturn NULL;\n \t}\n \n-\tarea->offset = address;\n+\tarea->offset = target_addr;\n \tarea->size = size;\n \n \treturn area;\n@@ -555,26 +588,28 @@ nfp_xpb_to_cpp(struct nfp_cpp *cpp,\n \t * Ensure that non-local XPB accesses go out through the\n \t * global XPBM bus.\n \t */\n-\tisland = ((*xpb_addr) >> 24) & 0x3f;\n+\tisland = (*xpb_addr >> 24) & 0x3f;\n \n \tif (island == 0)\n \t\treturn xpb;\n \n-\tif (island == 1) {\n-\t\t/*\n-\t\t * Accesses to the ARM Island overlay uses Island 0\n-\t\t * Global Bit\n-\t\t */\n-\t\t(*xpb_addr) &= ~0x7f000000;\n-\t\tif (*xpb_addr < 0x60000)\n-\t\t\t*xpb_addr |= (1 << 30);\n-\t\telse\n-\t\t\t/* And only non-ARM interfaces use island id = 1 */\n-\t\t\tif (NFP_CPP_INTERFACE_TYPE_of(nfp_cpp_interface(cpp)) !=\n-\t\t\t\t\tNFP_CPP_INTERFACE_TYPE_ARM)\n-\t\t\t\t*xpb_addr |= (1 << 24);\n+\tif (island != 1) {\n+\t\t*xpb_addr |= (1 << 30);\n+\t\treturn xpb;\n+\t}\n+\n+\t/*\n+\t * Accesses to the ARM Island overlay uses Island 0\n+\t * Global Bit\n+\t */\n+\t*xpb_addr &= ~0x7f000000;\n+\tif (*xpb_addr < 0x60000) {\n+\t\t*xpb_addr |= (1 << 30);\n \t} else {\n-\t\t(*xpb_addr) |= (1 << 30);\n+\t\t/* And only non-ARM interfaces use island id = 1 */\n+\t\tif (NFP_CPP_INTERFACE_TYPE_of(nfp_cpp_interface(cpp)) !=\n+\t\t\t\tNFP_CPP_INTERFACE_TYPE_ARM)\n+\t\t\t*xpb_addr |= (1 << 24);\n \t}\n \n \treturn xpb;\n@@ -602,9 +637,12 @@ nfp_cpp_area_readl(struct nfp_cpp_area *area,\n \tuint32_t tmp = 0;\n \n \tsz = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));\n+\tif (sz != sizeof(tmp))\n+\t\treturn sz < 0 ? sz : -EIO;\n+\n \t*value = rte_le_to_cpu_32(tmp);\n \n-\treturn (sz == sizeof(*value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -629,7 +667,10 @@ nfp_cpp_area_writel(struct nfp_cpp_area *area,\n \n \tvalue = rte_cpu_to_le_32(value);\n \tsz = nfp_cpp_area_write(area, offset, &value, sizeof(value));\n-\treturn (sz == sizeof(value)) ? 0 : -1;\n+\tif (sz != sizeof(value))\n+\t\treturn sz < 0 ? sz : -EIO;\n+\n+\treturn 0;\n }\n \n /**\n@@ -654,9 +695,12 @@ nfp_cpp_area_readq(struct nfp_cpp_area *area,\n \tuint64_t tmp = 0;\n \n \tsz = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));\n+\tif (sz != sizeof(tmp))\n+\t\treturn sz < 0 ? sz : -EIO;\n+\n \t*value = rte_le_to_cpu_64(tmp);\n \n-\treturn (sz == sizeof(*value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -681,8 +725,10 @@ nfp_cpp_area_writeq(struct nfp_cpp_area *area,\n \n \tvalue = rte_cpu_to_le_64(value);\n \tsz = nfp_cpp_area_write(area, offset, &value, sizeof(value));\n+\tif (sz != sizeof(value))\n+\t\treturn sz < 0 ? sz : -EIO;\n \n-\treturn (sz == sizeof(value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -710,9 +756,12 @@ nfp_cpp_readl(struct nfp_cpp *cpp,\n \tuint32_t tmp;\n \n \tsz = nfp_cpp_read(cpp, cpp_id, address, &tmp, sizeof(tmp));\n+\tif (sz != sizeof(tmp))\n+\t\treturn sz < 0 ? sz : -EIO;\n+\n \t*value = rte_le_to_cpu_32(tmp);\n \n-\treturn (sz == sizeof(*value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -740,8 +789,10 @@ nfp_cpp_writel(struct nfp_cpp *cpp,\n \n \tvalue = rte_cpu_to_le_32(value);\n \tsz = nfp_cpp_write(cpp, cpp_id, address, &value, sizeof(value));\n+\tif (sz != sizeof(value))\n+\t\treturn sz < 0 ? sz : -EIO;\n \n-\treturn (sz == sizeof(value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -770,8 +821,10 @@ nfp_cpp_readq(struct nfp_cpp *cpp,\n \n \tsz = nfp_cpp_read(cpp, cpp_id, address, &tmp, sizeof(tmp));\n \t*value = rte_le_to_cpu_64(tmp);\n+\tif (sz != sizeof(tmp))\n+\t\treturn sz < 0 ? sz : -EIO;\n \n-\treturn (sz == sizeof(*value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -799,8 +852,10 @@ nfp_cpp_writeq(struct nfp_cpp *cpp,\n \n \tvalue = rte_cpu_to_le_64(value);\n \tsz = nfp_cpp_write(cpp, cpp_id, address, &value, sizeof(value));\n+\tif (sz != sizeof(value))\n+\t\treturn sz < 0 ? sz : -EIO;\n \n-\treturn (sz == sizeof(value)) ? 0 : -1;\n+\treturn 0;\n }\n \n /**\n@@ -918,9 +973,6 @@ nfp_cpp_free(struct nfp_cpp *cpp)\n \tif (cpp->op != NULL && cpp->op->free != NULL)\n \t\tcpp->op->free(cpp);\n \n-\tif (cpp->serial_len != 0)\n-\t\tfree(cpp->serial);\n-\n \trte_free(cpp);\n }\n \n@@ -974,7 +1026,7 @@ nfp_cpp_read(struct nfp_cpp *cpp,\n \tarea = nfp_cpp_area_alloc_acquire(cpp, destination, offset, length);\n \tif (area == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Area allocation/acquire failed for read\");\n-\t\treturn -1;\n+\t\treturn -EACCES;\n \t}\n \n \terr = nfp_cpp_area_read(area, 0, address, length);\n@@ -1013,7 +1065,7 @@ nfp_cpp_write(struct nfp_cpp *cpp,\n \tarea = nfp_cpp_area_alloc_acquire(cpp, destination, offset, length);\n \tif (area == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Area allocation/acquire failed for write\");\n-\t\treturn -1;\n+\t\treturn -EACCES;\n \t}\n \n \terr = nfp_cpp_area_write(area, 0, address, length);\n@@ -1039,8 +1091,12 @@ nfp_cpp_model_autodetect(struct nfp_cpp *cpp,\n \t\treturn err;\n \n \t*model = reg & NFP_PL_DEVICE_MODEL_MASK;\n-\tif ((*model & NFP_PL_DEVICE_ID_MASK) != 0)\n-\t\t*model -= 0x10;\n+\t/* Disambiguate the NFP4000/NFP5000/NFP6000 chips */\n+\tif (FIELD_GET(NFP_PL_DEVICE_PART_MASK, reg) ==\n+\t\t\tNFP_PL_DEVICE_PART_NFP6000) {\n+\t\tif ((*model & NFP_PL_DEVICE_ID_MASK) != 0)\n+\t\t\t*model -= 0x10;\n+\t}\n \n \treturn 0;\n }\n",
    "prefixes": [
        "v3",
        "24/27"
    ]
}