get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133757,
    "url": "http://patches.dpdk.org/api/patches/133757/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231102022321.2254224-11-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": "<20231102022321.2254224-11-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231102022321.2254224-11-chaoyong.he@corigine.com",
    "date": "2023-11-02T02:23:20",
    "name": "[10/11] net/nfp: introduce keepalive mechanism for multiple PF",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "9e01d28d6cc5b8d1341f1e3bc60433220d428fa5",
    "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/20231102022321.2254224-11-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 30106,
            "url": "http://patches.dpdk.org/api/series/30106/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30106",
            "date": "2023-11-02T02:23:10",
            "name": "Add the support of multiple PF",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/30106/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/133757/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/133757/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 4A99043267;\n\tThu,  2 Nov 2023 03:25:09 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0E64542E90;\n\tThu,  2 Nov 2023 03:24:07 +0100 (CET)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2134.outbound.protection.outlook.com [40.107.220.134])\n by mails.dpdk.org (Postfix) with ESMTP id 968F842E80\n for <dev@dpdk.org>; Thu,  2 Nov 2023 03:24:04 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MN2PR13MB3709.namprd13.prod.outlook.com (2603:10b6:208:1e1::12)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.19; Thu, 2 Nov\n 2023 02:24:02 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6933.027; Thu, 2 Nov 2023\n 02:24:02 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=keJNo11GgXucn3fjI9Q+ijJCeo1W1nOguFHdlnEnaMZvRUWv6Cb1sY9eAU0O6pF7W1EdhPB8MBJRZQ7Ds0aoppyZY19OitFJFf+iKpcFne09u65KK7xML6PkE7w4drf8PiLCUMtL/O9MMwo3HG71IHY7GEMsAevjoLcXIoOBOcOR5JZ8jfqC5LHWpxiO9Ft1KtFRSwQRgJzqo86TVTOv0NRkHbCx/q+0S6FvAG5nNGyGyZiZtkrBjBANRyYaGLs/X9aRpXwFQQI5LT9bUkGQ9XkbbwsIfJx/GDu7VKpWZQSDIlqSiCizOD0D1l0v4NpGnEdQIA/bkQrcGlCSOUCYig==",
        "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=VzQZ4OilXKglucq38wwvqpuoEyuGYuLzQ3T6ZF39X7E=;\n b=Ed4YCjy1ofDdkT3eddFgdGTQNic6r9REzd1aNIMoa4kDKqUw7AAkM/Tw77yhDQRwQXpHnUS/RS17GdZ4/a32AysRQ1EO6t0V67ceetH1bk3LmCfRzS4n1zVFPI9Sfb7dD354Chs2ki9jbhIIXJK2UicNJ3TDLUntEuGQOSS5jIso0hJkuPz4kuhb3CYX+qa7WrFpIRI9O22J/4dc2+ecVCWXPeer5kECpt0hVih+sHNXeejDEZwolVmHpCKqk0rQxxnqgaQcv+zWh6tpH+qixX6/Bo7zHpMwqVVR0NfqJz/bsVYKZuvmcwb86OxdNdQmjc4VXSVzbEItVULuBO/qyQ==",
        "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=VzQZ4OilXKglucq38wwvqpuoEyuGYuLzQ3T6ZF39X7E=;\n b=gz2KeBYK62KlKCOl2kqlkVarGtOMoKxWAZoYmu9Kf/u3QWXfh3MnTJUSvLOI7jifOH6T62yMOBJHl17GCmgEu4SVkBjFyIIK7lvX7Lm67gnJfJOBuTCMLikSzCSjMANZAtgoOz18uD3/s5a72Fnc9zYX3MW6E25XmeewdfgzOfI=",
        "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, Peng Zhang <peng.zhang@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>, Long Wu <long.wu@corigine.com>",
        "Subject": "[PATCH 10/11] net/nfp: introduce keepalive mechanism for multiple PF",
        "Date": "Thu,  2 Nov 2023 10:23:20 +0800",
        "Message-Id": "<20231102022321.2254224-11-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231102022321.2254224-1-chaoyong.he@corigine.com>",
        "References": "<20231102022321.2254224-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BY5PR20CA0030.namprd20.prod.outlook.com\n (2603:10b6:a03:1f4::43) 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_|MN2PR13MB3709:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "e9065ef6-b94e-4681-88dc-08dbdb4ac772",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 2xTEvfzpYFSZQNm/+G+MJqSFIcqdMfWApCDTdj+L8CxMxUB8N/1EqJD06UPD2J93WwRuAGqd+bEXFD2rPLRJ1xznSYgpUG34HQrSPSBC1ZSLoPMScF79waQFmQE3FNizzRKs+6pPAZ6eLBUN9xMyQXbbekE1tnuVI0zPKD6CY/35h+XFy9ru3mQQ73y5Qvuivf0V/mWbiCkKI1HrEdCN6Nt5jnHqSgykRnMnbzDANoAJzPl+75kxIswtaJLGHZuksl4HudFCr0kUVWPzh/QBMNmia9v+gA/AiKBTW02hDGXBXFpqbAHkqePfrLgKBdLsPuNv6a/RHPv9MuDwvev2xcgRhYPHSkejsDom1AwIUl3soS2D+w6dPYYBjSp/zrjL4mQieNTexyHH93J5UXuR5GRuAs24ztPDujZZUIxBNQzsntQC9GVk6BW4PeOnlMZ2fI/o9wptwBwG0RSLHHvXwMws/bjoMI7Cn6nQ1uG/lq2R2XyzieAvx6340kdsiMuMsO6JAHaWOUXeSf2rRlSsPHTx9fuBZMSu7u5f2KIzHBu57rf+UEMXVIKNfUFwa7WpqYuknxvTcOt8zmdkhUGr2lJkP4PeIUUMfmUp5/w/ZkDeJwtTZaE6MhhA+aegX8ssSafLvP2iJxKTexAAkLogszLrxk+SUEE4hjpnIRmpaKU=",
        "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)(346002)(136003)(376002)(366004)(39840400004)(396003)(230922051799003)(186009)(1800799009)(64100799003)(451199024)(38350700005)(478600001)(52116002)(36756003)(6486002)(6506007)(107886003)(38100700002)(83380400001)(41300700001)(6666004)(4326008)(8676002)(8936002)(2616005)(44832011)(2906002)(316002)(1076003)(6916009)(86362001)(26005)(66946007)(54906003)(6512007)(66556008)(66476007)(5660300002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n GMeJisCMahy3R20fceqyTWCtCtlNKbSN7cP5CX59h9zgGcCxaP0EaM/5cr1GuI35JpMB/8qhDcmkb+Vf2ZR6YAK5XGm0EGWWMlhVedekXAA0p+9S9p0xgy58xJY+TYbqhk/lGLWKnWpcS8AzXjz4VHUbn1m7CqmJfXYCdyPSLd6M/uGf0YXSfxiQfq2r/RFHejTN3WHdLaV7lGEhTAPPRac5EVV1SzKoRmUvqrtfh4vjkYFKQhmmuq7GkkicTJHp4BakFjpi63eNwEOtpA/7m4BnUFbRdteDMLlWi2K15BYvOHo6FUiVtEtTV5mTjOknAeErm7v0wMr600pb2WeNZT5oNbtfLk/QQC1d5uS3RWbQb41y/R68xqk984Ca0fhoKyIJjRRF+D3sAXO5zPBPhboZoajfE/F/IH77mXO9rP+Om9k0f026pSTwYYsAGPFHdLgc6hl9MBNxrBuF8BcG+y5QaDa5h0ROxaLlvf0CNXFPpjhj5u9pWyFJHwRjnYEY0tN2DY3pcsZQamZUIlpLS7dO/bk77HH/wNbRer3VlhRy8UHfgm+we7RjB6FIBCkLGp7bl67INVB9geHvXT/kFDXjlnNkCmNMavi83iggUD5B3vhFWOjc4fQ6FOE38mPjSjZd1l3G4hxbOE922HQUoqQBO/yxQ09vB1SwAAhPhL8yh6TbC9SFNWkkFWOYWGPjYAyKKUKLEavnFOtW1bdU4v0JpA+1u3Z1txSmT2ylVRfWlVusYlo1tvwZmjhysvvU/krJDnD2eZQkyBn2ppZ9UzxrPb3tCWRWNSCfuWa7OeRnDrfIADWR1d0B2WeRg6CRR5raZGQnOb3z1UxD1suFNouDHNWDB6MOLA2GEHQ/QM1awJ7wVeqtQCT86D7iNn9+fZoUKlv5f5CD52Yd2P7lBpCUtVNG0KfY+0audrnSM+JtL3a5YeB8zT8KHkpZA9r/lWmmmy7i6T5+rz/Nv3CPikvtze0EuM+qZOPrDqjHyTwhQYKmXYAFmV9qKGnIpZHDLLG5nV+eNbrWj35KxC1JWRS5Qci7CyiczOApsqEH+lJqNy9T0vgQLRnbIZdZqLyU9oLT7zAoQT9gA2N1g1/MP+KkoyTSo+v11Tx6AdjrC1O1vD8uMH0jdzTesUHIqLppnQFX4BIONeeII2OHvSJf0hCjYhedJ6s7SPFAnOqbDLPv0Z6hk1sCY0MPRBJeSoVcpdm4bqFdxG2g6k2U2nfrLamivGxMnVW6ou+9FVQbls52UDU2Q+Q4Q2SEFZX1Fk9aGRtkLtG04lNLnLhY9sFsXSgJKYcN9dKZeRi90iNGt1teXT4GwL8Oz1tvjNMm85La3qjn7Irrk+AKA9J7U610TSAbCxEV7WIoOvSze1MOfE09TIB7CEt5VuVPPaXbY5uZ1FVVgY4BiPHOAmrWXvMcCf6bBNqobPKg//dd51oAHRjot0PudNViSQbhZTAOBjRRi8qhVtNDkzEcnEDpve7xaH1QaymQLzqpBz0qt34HRDh9FE6temlkfypZDp9nQ0bZoMQV3ScU0Bp2slbBAFDHI5UUYPHa8S2fcbijzE3ghPAhqpe4+VIjbhUqvI3iUvYo3vMep3D/ol5qSySjENyEmA==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n e9065ef6-b94e-4681-88dc-08dbdb4ac772",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "02 Nov 2023 02:24:02.6307 (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 pBDdOtXgtojc2Gg+hshir3yvwm3CvIaAY/XNFKLQ7B1twgpcN7Q/hL54uXYhdbVe6CQQVZH7lHvcAp9DMUHn+2PqP9AxTp9EcjDeonyilQA=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR13MB3709",
        "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": "From: Peng Zhang <peng.zhang@corigine.com>\n\nIn multiple PF scenario, management firmware is in charge of\napplication firmware unloading instead of driver by keepalive\nmechanism.\n\nA new NSP resource area is allocated for keepalive use with name\n\"nfp.beat\". Driver sets periodically updates the PFs' corresponding\nword in \"nfp.beat\". Management firmware checks these PF's words to\nlearn whether and which PF are alive, and will unload the application\nfirmware if no PF is running.\n\nSigned-off-by: Peng Zhang <peng.zhang@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\n---\n drivers/net/nfp/nfp_ethdev.c           | 173 ++++++++++++++++++++++++-\n drivers/net/nfp/nfp_net_common.h       |  17 +++\n drivers/net/nfp/nfpcore/nfp_resource.h |   3 +\n 3 files changed, 189 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 96f0ae3fe3..bbc0109f5f 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -5,6 +5,8 @@\n  * Small portions derived from code Copyright(c) 2010-2015 Intel Corporation.\n  */\n \n+#include <unistd.h>\n+\n #include <eal_firmware.h>\n #include <rte_alarm.h>\n \n@@ -16,6 +18,7 @@\n #include \"nfpcore/nfp_rtsym.h\"\n #include \"nfpcore/nfp_nsp.h\"\n #include \"nfpcore/nfp6000_pcie.h\"\n+#include \"nfpcore/nfp_resource.h\"\n \n #include \"nfp_cpp_bridge.h\"\n #include \"nfp_ipsec.h\"\n@@ -234,6 +237,79 @@ nfp_function_id_get(const struct nfp_pf_dev *pf_dev,\n \treturn phy_port;\n }\n \n+static void\n+nfp_net_beat_timer(void *arg)\n+{\n+\tuint64_t cur_sec;\n+\tstruct nfp_multi_pf *multi_pf = arg;\n+\n+\tcur_sec = rte_rdtsc();\n+\tnn_writeq(cur_sec, multi_pf->beat_addr + NFP_BEAT_OFFSET(multi_pf->function_id));\n+\n+\t/* Beat once per second. */\n+\tif (rte_eal_alarm_set(1000 * 1000, nfp_net_beat_timer,\n+\t\t\t(void *)multi_pf) < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Error setting alarm\");\n+\t}\n+}\n+\n+static int\n+nfp_net_keepalive_init(struct nfp_cpp *cpp,\n+\t\tstruct nfp_multi_pf *multi_pf)\n+{\n+\tuint8_t *base;\n+\tuint64_t addr;\n+\tuint32_t size;\n+\tuint32_t cpp_id;\n+\tstruct nfp_resource *res;\n+\n+\tres = nfp_resource_acquire(cpp, NFP_RESOURCE_KEEPALIVE);\n+\tif (res == NULL)\n+\t\treturn -EIO;\n+\n+\tcpp_id = nfp_resource_cpp_id(res);\n+\taddr = nfp_resource_address(res);\n+\tsize = nfp_resource_size(res);\n+\n+\tnfp_resource_release(res);\n+\n+\t/* Allocate a fixed area for keepalive. */\n+\tbase = nfp_cpp_map_area(cpp, cpp_id, addr, size, &multi_pf->beat_area);\n+\tif (base == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Failed to map area for keepalive.\");\n+\t\treturn -EIO;\n+\t}\n+\n+\tmulti_pf->beat_addr = base;\n+\n+\treturn 0;\n+}\n+\n+static void\n+nfp_net_keepalive_uninit(struct nfp_multi_pf *multi_pf)\n+{\n+\tnfp_cpp_area_release_free(multi_pf->beat_area);\n+}\n+\n+static int\n+nfp_net_keepalive_start(struct nfp_multi_pf *multi_pf)\n+{\n+\tif (rte_eal_alarm_set(1000 * 1000, nfp_net_beat_timer,\n+\t\t\t(void *)multi_pf) < 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Error setting alarm\");\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+nfp_net_keepalive_stop(struct nfp_multi_pf *multi_pf)\n+{\n+\t/* Cancel keepalive for multiple PF setup */\n+\trte_eal_alarm_cancel(nfp_net_beat_timer, (void *)multi_pf);\n+}\n+\n /* Reset and stop device. The device can not be restarted. */\n static int\n nfp_net_close(struct rte_eth_dev *dev)\n@@ -284,6 +360,10 @@ nfp_net_close(struct rte_eth_dev *dev)\n \n \t/* Now it is safe to free all PF resources */\n \tPMD_INIT_LOG(INFO, \"Freeing PF resources\");\n+\tif (pf_dev->multi_pf.enabled) {\n+\t\tnfp_net_keepalive_stop(&pf_dev->multi_pf);\n+\t\tnfp_net_keepalive_uninit(&pf_dev->multi_pf);\n+\t}\n \tnfp_cpp_area_free(pf_dev->ctrl_area);\n \tnfp_cpp_area_free(pf_dev->qc_area);\n \tfree(pf_dev->hwinfo);\n@@ -693,11 +773,92 @@ nfp_fw_unload(struct nfp_cpp *cpp)\n \tnfp_nsp_close(nsp);\n }\n \n+static int\n+nfp_fw_reload(struct rte_pci_device *dev,\n+\t\tstruct nfp_nsp *nsp,\n+\t\tchar *card_desc)\n+{\n+\tint err;\n+\n+\tnfp_nsp_device_soft_reset(nsp);\n+\terr = nfp_fw_upload(dev, nsp, card_desc);\n+\tif (err != 0)\n+\t\tPMD_DRV_LOG(ERR, \"NFP firmware load failed\");\n+\n+\treturn err;\n+}\n+\n+static int\n+nfp_fw_loaded_check_alive(struct rte_pci_device *dev,\n+\t\tstruct nfp_nsp *nsp,\n+\t\tchar *card_desc,\n+\t\tconst struct nfp_dev_info *dev_info,\n+\t\tstruct nfp_multi_pf *multi_pf)\n+{\n+\tint offset;\n+\tuint32_t i;\n+\tuint64_t beat;\n+\tuint32_t port_num;\n+\n+\t/*\n+\t * If the beats of any other port changed in 3s,\n+\t * we should not reload the firmware.\n+\t */\n+\tfor (port_num = 0; port_num < dev_info->pf_num_per_unit; port_num++) {\n+\t\tif (port_num == multi_pf->function_id)\n+\t\t\tcontinue;\n+\n+\t\toffset = NFP_BEAT_OFFSET(port_num);\n+\t\tbeat = nn_readq(multi_pf->beat_addr + offset);\n+\t\tfor (i = 0; i < 3; i++) {\n+\t\t\tsleep(1);\n+\t\t\tif (nn_readq(multi_pf->beat_addr + offset) != beat)\n+\t\t\t\treturn 0;\n+\t\t}\n+\t}\n+\n+\treturn nfp_fw_reload(dev, nsp, card_desc);\n+}\n+\n+static int\n+nfp_fw_reload_for_multipf(struct rte_pci_device *dev,\n+\t\tstruct nfp_nsp *nsp,\n+\t\tchar *card_desc,\n+\t\tstruct nfp_cpp *cpp,\n+\t\tconst struct nfp_dev_info *dev_info,\n+\t\tstruct nfp_multi_pf *multi_pf)\n+{\n+\tint err;\n+\n+\terr = nfp_net_keepalive_init(cpp, multi_pf);\n+\tif (err != 0)\n+\t\tPMD_DRV_LOG(ERR, \"NFP write beat failed\");\n+\n+\tif (nfp_nsp_fw_loaded(nsp))\n+\t\terr = nfp_fw_loaded_check_alive(dev, nsp, card_desc, dev_info, multi_pf);\n+\telse\n+\t\terr = nfp_fw_reload(dev, nsp, card_desc);\n+\tif (err != 0) {\n+\t\tnfp_net_keepalive_uninit(multi_pf);\n+\t\treturn err;\n+\t}\n+\n+\terr = nfp_net_keepalive_start(multi_pf);\n+\tif (err != 0) {\n+\t\tnfp_net_keepalive_uninit(multi_pf);\n+\t\tPMD_DRV_LOG(ERR, \"NFP write beat failed\");\n+\t}\n+\n+\treturn err;\n+}\n+\n static int\n nfp_fw_setup(struct rte_pci_device *dev,\n \t\tstruct nfp_cpp *cpp,\n \t\tstruct nfp_eth_table *nfp_eth_table,\n-\t\tstruct nfp_hwinfo *hwinfo)\n+\t\tstruct nfp_hwinfo *hwinfo,\n+\t\tconst struct nfp_dev_info *dev_info,\n+\t\tstruct nfp_multi_pf *multi_pf)\n {\n \tint err;\n \tchar card_desc[100];\n@@ -736,8 +897,10 @@ nfp_fw_setup(struct rte_pci_device *dev,\n \t\treturn -EIO;\n \t}\n \n-\tnfp_nsp_device_soft_reset(nsp);\n-\terr = nfp_fw_upload(dev, nsp, card_desc);\n+\tif (multi_pf->enabled)\n+\t\terr = nfp_fw_reload_for_multipf(dev, nsp, card_desc, cpp, dev_info, multi_pf);\n+\telse\n+\t\terr = nfp_fw_reload(dev, nsp, card_desc);\n \n \tnfp_nsp_close(nsp);\n \treturn err;\n@@ -1007,7 +1170,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t\tnfp_eth_set_configured(cpp, index, 0);\n \t}\n \n-\tif (nfp_fw_setup(pci_dev, cpp, nfp_eth_table, hwinfo) != 0) {\n+\tif (nfp_fw_setup(pci_dev, cpp, nfp_eth_table, hwinfo,\n+\t\t\tdev_info, &pf_dev->multi_pf) != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Error when uploading firmware\");\n \t\tret = -EIO;\n \t\tgoto eth_table_cleanup;\n@@ -1092,6 +1256,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \tfree(sym_tbl);\n fw_cleanup:\n \tnfp_fw_unload(cpp);\n+\tnfp_net_keepalive_stop(&pf_dev->multi_pf);\n eth_table_cleanup:\n \tfree(nfp_eth_table);\n hwinfo_cleanup:\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex a40ddfd985..db2e5842ca 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -36,6 +36,19 @@\n /* Number of supported physical ports */\n #define NFP_MAX_PHYPORTS        12\n \n+#define NFP_BEAT_LENGTH         8\n+\n+/*\n+ * Each PF has corresponding word to beat:\n+ * Offset | Usage\n+ *   0    | magic number\n+ *   8    | beat of Pf0\n+ *   16   | beat of Pf1\n+ *   24   | beat of Pf2\n+ *   32   | beat of Pf3\n+ */\n+#define NFP_BEAT_OFFSET(_x)     (((_x) + 1) * NFP_BEAT_LENGTH)\n+\n /* Firmware application ID's */\n enum nfp_app_fw_id {\n \tNFP_APP_FW_CORE_NIC               = 0x1,\n@@ -59,6 +72,10 @@ struct nfp_multi_pf {\n \tbool enabled;\n \t/** Function index */\n \tuint8_t function_id;\n+\t/** Pointer to CPP area for beat to keepalive */\n+\tstruct nfp_cpp_area *beat_area;\n+\t/** Pointer to mapped beat address used for keepalive */\n+\tuint8_t *beat_addr;\n };\n \n struct nfp_pf_dev {\ndiff --git a/drivers/net/nfp/nfpcore/nfp_resource.h b/drivers/net/nfp/nfpcore/nfp_resource.h\nindex f49c99e462..7ce4727b37 100644\n--- a/drivers/net/nfp/nfpcore/nfp_resource.h\n+++ b/drivers/net/nfp/nfpcore/nfp_resource.h\n@@ -17,6 +17,9 @@\n /* Service Processor */\n #define NFP_RESOURCE_NSP                \"nfp.sp\"\n \n+/* Keepalive */\n+#define NFP_RESOURCE_KEEPALIVE          \"nfp.beat\"\n+\n /* Opaque handle to a NFP Resource */\n struct nfp_resource;\n \n",
    "prefixes": [
        "10/11"
    ]
}