get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 126061,
    "url": "http://patches.dpdk.org/api/patches/126061/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230414051454.1245936-1-rushilg@google.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": "<20230414051454.1245936-1-rushilg@google.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230414051454.1245936-1-rushilg@google.com",
    "date": "2023-04-14T05:14:54",
    "name": "net/gve: Check whether the driver is compatible with the device presented.",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b9d796047be9d1d6688d646771c765b76383ab78",
    "submitter": {
        "id": 2890,
        "url": "http://patches.dpdk.org/api/people/2890/?format=api",
        "name": "Rushil Gupta",
        "email": "rushilg@google.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/20230414051454.1245936-1-rushilg@google.com/mbox/",
    "series": [
        {
            "id": 27703,
            "url": "http://patches.dpdk.org/api/series/27703/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=27703",
            "date": "2023-04-14T05:14:54",
            "name": "net/gve: Check whether the driver is compatible with the device presented.",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/27703/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/126061/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/126061/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 893C94293B;\n\tFri, 14 Apr 2023 07:15:16 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 42E03410F6;\n\tFri, 14 Apr 2023 07:15:16 +0200 (CEST)",
            "from mail-pg1-f202.google.com (mail-pg1-f202.google.com\n [209.85.215.202])\n by mails.dpdk.org (Postfix) with ESMTP id ABF33400D5\n for <dev@dpdk.org>; Fri, 14 Apr 2023 07:15:14 +0200 (CEST)",
            "by mail-pg1-f202.google.com with SMTP id\n u184-20020a6385c1000000b005039e28b68cso7245224pgd.13\n for <dev@dpdk.org>; Thu, 13 Apr 2023 22:15:14 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=google.com; s=20221208; t=1681449314; x=1684041314;\n h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject\n :date:message-id:reply-to;\n bh=a3zgBjbFyzJLxx4oq0+WUGw9g2uZ4Q6lAiBox/0O59k=;\n b=RXkbpzlxoYW3Ibe7QfwPMROvC0VzQLMiqfgTAqVuF/l79o8Y8q5yV2gZWpVKL9az7t\n UbV++HVApVpKFR1BY9rkXJWBsj1XwEdGWbo71RmBCKRAKrmEo92TukhQNVI3zQgr05DW\n cmjfJH1kVTyE9YmKKfIkFBiphPUhmZimsYIcDaimdXacvCBLXuUL4tn9bT5tlxbK/JiJ\n nK0bh6zwwJRDjamDZbZxvGthDGxqP4JHGoX5BOps4mS3AtbFI0FJpsUMXLZEwt9e0Iyp\n JtowuNWQUXMC4p4iF6mae5HVJ1auRrhz8bqAIMWD9LFbCS3qw9gnh4Riz/IVNXf5KO3z\n SlcQ==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20221208; t=1681449314; x=1684041314;\n h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state\n :from:to:cc:subject:date:message-id:reply-to;\n bh=a3zgBjbFyzJLxx4oq0+WUGw9g2uZ4Q6lAiBox/0O59k=;\n b=J8KJ+7+aMiyMkXWP5mQZ3x5pbisjU9uPa8tMlwSVnEhV1IBOwSa+NnpJiu3KYg51UG\n DLN6niXw9JcBr55X5xmne53HuIbPbVwXXjJ+oEklPjlbhwd2ALLfnC2ngFFEDynLsifC\n UjcLZMiW9T30gmLR3caegNezPshZZ+2dCw6N/mU3wqZAHDCGxU4XByJVdQA9M3hNIeI8\n qqNUfH7wkQ5axnneNBiI6ejTMaN90vCTEy7F648FIlO4w8EQ23AFrj/SWo0rBvFMrLlB\n omA8GvlxU05QLq7ZobfkjW5dPdBSDFkBz1FFN+JC0gC29Irgz3ReqwfgizEZodSGyS75\n AsFQ==",
        "X-Gm-Message-State": "AAQBX9dkikL+AOixwNhw0dh9eEV0OMWMgl4vlLx2ryjE9lY0VHLaprmv\n rOOtoUZG/3B6Hxn2cUk/iPZjqXdbea5O",
        "X-Google-Smtp-Source": "\n AKy350ZZkhNlJq9WbRZbAMDdAsC+ZSknAd2ob7HTrnyy5J5QwFiTygQvKxXRdHHmu7qhn+xzht9zviDd9wpK",
        "X-Received": "from rushilg.sea.corp.google.com\n ([2620:15c:100:202:dd0f:b269:cd2e:254])\n (user=rushilg job=sendgmr) by 2002:a63:a402:0:b0:513:df3d:d714 with SMTP id\n c2-20020a63a402000000b00513df3dd714mr408719pgf.4.1681449313840; Thu, 13 Apr\n 2023 22:15:13 -0700 (PDT)",
        "Date": "Thu, 13 Apr 2023 22:14:54 -0700",
        "Mime-Version": "1.0",
        "X-Mailer": "git-send-email 2.40.0.634.g4ca3ef3211-goog",
        "Message-ID": "<20230414051454.1245936-1-rushilg@google.com>",
        "Subject": "[PATCH] net/gve: Check whether the driver is compatible with the\n device presented.",
        "From": "Rushil Gupta <rushilg@google.com>",
        "To": "ferruh.yigit@amd.com, qi.z.zhang@intel.com, jingjing.wu@intel.com",
        "Cc": "junfeng.guo@intel.com, joshwash@google.com, dev@dpdk.org,\n Rushil Gupta <rushilg@google.com>, Jeroen de Borst <jeroendb@google.com>",
        "Content-Type": "text/plain; charset=\"UTF-8\"",
        "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": "Change gve_driver_info fields to report DPDK as OS type and DPDK RTE\nversion as OS version, reserving driver_version fields for GVE driver\nversion based on features.\n\nThis patch is dependent on  https://patchwork.dpdk.org/project/dpdk/list/?series=27687&state=*\n\nSigned-off-by: Rushil Gupta <rushilg@google.com>\nSigned-off-by: Joshua Washington <joshwash@google.com>\nSigned-off-by: Junfeng Guo <junfeng.guo@intel.com>\nSigned-off-by: Jeroen de Borst <jeroendb@google.com>\n---\n drivers/net/gve/base/gve.h        |  3 --\n drivers/net/gve/base/gve_adminq.c | 19 +++++++++\n drivers/net/gve/base/gve_adminq.h | 49 ++++++++++++++++++++++-\n drivers/net/gve/base/gve_osdep.h  | 36 +++++++++++++++++\n drivers/net/gve/gve_ethdev.c      | 65 +++++++++++++++++++++++++------\n drivers/net/gve/gve_ethdev.h      |  2 +-\n drivers/net/gve/gve_version.c     | 14 +++++++\n drivers/net/gve/gve_version.h     | 25 ++++++++++++\n drivers/net/gve/meson.build       |  1 +\n 9 files changed, 198 insertions(+), 16 deletions(-)\n create mode 100644 drivers/net/gve/gve_version.c\n create mode 100644 drivers/net/gve/gve_version.h",
    "diff": "diff --git a/drivers/net/gve/base/gve.h b/drivers/net/gve/base/gve.h\nindex 2dc4507acb..89f9654a72 100644\n--- a/drivers/net/gve/base/gve.h\n+++ b/drivers/net/gve/base/gve.h\n@@ -8,9 +8,6 @@\n \n #include \"gve_desc.h\"\n \n-#define GVE_VERSION\t\t\"1.3.0\"\n-#define GVE_VERSION_PREFIX\t\"GVE-\"\n-\n #ifndef GOOGLE_VENDOR_ID\n #define GOOGLE_VENDOR_ID\t0x1ae0\n #endif\ndiff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c\nindex e745b709b2..2e5099a5b0 100644\n--- a/drivers/net/gve/base/gve_adminq.c\n+++ b/drivers/net/gve/base/gve_adminq.c\n@@ -401,6 +401,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,\n \tcase GVE_ADMINQ_GET_PTYPE_MAP:\n \t\tpriv->adminq_get_ptype_map_cnt++;\n \t\tbreak;\n+\tcase GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY:\n+\t\tpriv->adminq_verify_driver_compatibility_cnt++;\n+\t\tbreak;\n \tdefault:\n \t\tPMD_DRV_LOG(ERR, \"unknown AQ command opcode %d\", opcode);\n \t}\n@@ -465,6 +468,22 @@ int gve_adminq_configure_device_resources(struct gve_priv *priv,\n \treturn gve_adminq_execute_cmd(priv, &cmd);\n }\n \n+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,\n+\t\t\t\t\t   u64 driver_info_len,\n+\t\t\t\t\t   dma_addr_t driver_info_addr)\n+{\n+\tunion gve_adminq_command cmd;\n+\n+\tmemset(&cmd, 0, sizeof(cmd));\n+\tcmd.opcode = cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY);\n+\tcmd.verify_driver_compatibility = (struct gve_adminq_verify_driver_compatibility) {\n+\t\t.driver_info_len = cpu_to_be64(driver_info_len),\n+\t\t.driver_info_addr = cpu_to_be64(driver_info_addr),\n+\t};\n+\n+\treturn gve_adminq_execute_cmd(priv, &cmd);\n+}\n+\n int gve_adminq_deconfigure_device_resources(struct gve_priv *priv)\n {\n \tunion gve_adminq_command cmd;\ndiff --git a/drivers/net/gve/base/gve_adminq.h b/drivers/net/gve/base/gve_adminq.h\nindex 05550119de..edac32f031 100644\n--- a/drivers/net/gve/base/gve_adminq.h\n+++ b/drivers/net/gve/base/gve_adminq.h\n@@ -1,6 +1,6 @@\n /* SPDX-License-Identifier: MIT\n  * Google Virtual Ethernet (gve) driver\n- * Copyright (C) 2015-2022 Google, Inc.\n+ * Copyright (C) 2015-2023 Google, Inc.\n  */\n \n #ifndef _GVE_ADMINQ_H\n@@ -23,6 +23,7 @@ enum gve_adminq_opcodes {\n \tGVE_ADMINQ_REPORT_STATS\t\t\t= 0xC,\n \tGVE_ADMINQ_REPORT_LINK_SPEED\t\t= 0xD,\n \tGVE_ADMINQ_GET_PTYPE_MAP\t\t= 0xE,\n+\tGVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY\t= 0xF,\n };\n \n /* Admin queue status codes */\n@@ -145,6 +146,47 @@ enum gve_sup_feature_mask {\n };\n \n #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0\n+enum gve_driver_capbility {\n+\tgve_driver_capability_gqi_qpl = 0,\n+\tgve_driver_capability_gqi_rda = 1,\n+\tgve_driver_capability_dqo_qpl = 2, /* reserved for future use */\n+\tgve_driver_capability_dqo_rda = 3,\n+};\n+\n+#define GVE_CAP1(a) BIT((int)a)\n+#define GVE_CAP2(a) BIT(((int)a) - 64)\n+#define GVE_CAP3(a) BIT(((int)a) - 128)\n+#define GVE_CAP4(a) BIT(((int)a) - 192)\n+\n+#define GVE_DRIVER_CAPABILITY_FLAGS1 \\\n+\t(GVE_CAP1(gve_driver_capability_gqi_qpl) | \\\n+\t GVE_CAP1(gve_driver_capability_gqi_rda) | \\\n+\t GVE_CAP1(gve_driver_capability_dqo_rda))\n+\n+#define GVE_DRIVER_CAPABILITY_FLAGS2 0x0\n+#define GVE_DRIVER_CAPABILITY_FLAGS3 0x0\n+#define GVE_DRIVER_CAPABILITY_FLAGS4 0x0\n+\n+struct gve_driver_info {\n+\tu8 os_type;\t/* 0x05 = DPDK */\n+\tu8 driver_major;\n+\tu8 driver_minor;\n+\tu8 driver_sub;\n+\t__be32 os_version_major;\n+\t__be32 os_version_minor;\n+\t__be32 os_version_sub;\n+\t__be64 driver_capability_flags[4];\n+\tu8 os_version_str1[OS_VERSION_STRLEN];\n+\tu8 os_version_str2[OS_VERSION_STRLEN];\n+};\n+\n+struct gve_adminq_verify_driver_compatibility {\n+\t__be64 driver_info_len;\n+\t__be64 driver_info_addr;\n+};\n+\n+GVE_CHECK_STRUCT_LEN(16,  gve_adminq_verify_driver_compatibility);\n+\n \n struct gve_adminq_configure_device_resources {\n \t__be64 counter_array;\n@@ -345,6 +387,8 @@ union gve_adminq_command {\n \t\t\tstruct gve_adminq_report_stats report_stats;\n \t\t\tstruct gve_adminq_report_link_speed report_link_speed;\n \t\t\tstruct gve_adminq_get_ptype_map get_ptype_map;\n+\t\t\tstruct gve_adminq_verify_driver_compatibility\n+\t\t\t\tverify_driver_compatibility;\n \t\t};\n \t};\n \tu8 reserved[64];\n@@ -378,4 +422,7 @@ struct gve_ptype_lut;\n int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv,\n \t\t\t\t struct gve_ptype_lut *ptype_lut);\n \n+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,\n+\t\t\t\t\t   u64 driver_info_len,\n+\t\t\t\t\t   dma_addr_t driver_info_addr);\n #endif /* _GVE_ADMINQ_H */\ndiff --git a/drivers/net/gve/base/gve_osdep.h b/drivers/net/gve/base/gve_osdep.h\nindex 7cb73002f4..a5efa8543e 100644\n--- a/drivers/net/gve/base/gve_osdep.h\n+++ b/drivers/net/gve/base/gve_osdep.h\n@@ -21,9 +21,14 @@\n #include <rte_malloc.h>\n #include <rte_memcpy.h>\n #include <rte_memzone.h>\n+#include <rte_version.h>\n \n #include \"../gve_logs.h\"\n \n+#ifdef __linux__\n+#include <sys/utsname.h>\n+#endif\n+\n typedef uint8_t u8;\n typedef uint16_t u16;\n typedef uint32_t u32;\n@@ -69,6 +74,12 @@ typedef rte_iova_t dma_addr_t;\n \n #define msleep(ms)\t\trte_delay_ms(ms)\n \n+#define OS_VERSION_STRLEN 128\n+struct os_version_string {\n+\tchar os_version_str1[OS_VERSION_STRLEN];\n+\tchar os_version_str2[OS_VERSION_STRLEN];\n+};\n+\n /* These macros are used to generate compilation errors if a struct/union\n  * is not exactly the correct length. It gives a divide by zero error if\n  * the struct/union is not of the correct size, otherwise it creates an\n@@ -79,6 +90,12 @@ typedef rte_iova_t dma_addr_t;\n #define GVE_CHECK_UNION_LEN(n, X) enum gve_static_asset_enum_##X \\\n \t{ gve_static_assert_##X = (n) / ((sizeof(union X) == (n)) ? 1 : 0) }\n \n+#ifndef LINUX_VERSION_MAJOR\n+#define LINUX_VERSION_MAJOR (((LINUX_VERSION_CODE) >> 16) & 0xff)\n+#define LINUX_VERSION_SUBLEVEL (((LINUX_VERSION_CODE) >> 8) & 0xff)\n+#define LINUX_VERSION_PATCHLEVEL ((LINUX_VERSION_CODE) & 0xff)\n+#endif\n+\n static __rte_always_inline u8\n readb(volatile void *addr)\n {\n@@ -156,4 +173,23 @@ gve_free_dma_mem(struct gve_dma_mem *mem)\n \tmem->pa = 0;\n }\n \n+static inline void\n+populate_driver_version_strings(struct os_version_string *os_version_str)\n+{\n+#ifdef __linux__\n+\tstruct utsname uts;\n+\tif (uname(&uts) >= 0) {\n+\t\t/* release */\n+\t\trte_strscpy(os_version_str->os_version_str1, uts.release,\n+\t\t\tsizeof(os_version_str->os_version_str1));\n+\t\t/* version */\n+\t\trte_strscpy(os_version_str->os_version_str2, uts.version,\n+\t\t\tsizeof(os_version_str->os_version_str2));\n+\t}\n+#else\n+\t/* gVNIC is currently not supported on OS like FreeBSD */\n+\tRTE_SET_USED(os_version_str);\n+#endif\n+}\n+\n #endif /* _GVE_OSDEP_H_ */\ndiff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c\nindex cf28a4a3b7..1d6e134fff 100644\n--- a/drivers/net/gve/gve_ethdev.c\n+++ b/drivers/net/gve/gve_ethdev.c\n@@ -5,21 +5,13 @@\n #include \"gve_ethdev.h\"\n #include \"base/gve_adminq.h\"\n #include \"base/gve_register.h\"\n-\n-const char gve_version_str[] = GVE_VERSION;\n-static const char gve_version_prefix[] = GVE_VERSION_PREFIX;\n+#include \"base/gve_osdep.h\"\n+#include \"gve_version.h\"\n \n static void\n gve_write_version(uint8_t *driver_version_register)\n {\n-\tconst char *c = gve_version_prefix;\n-\n-\twhile (*c) {\n-\t\twriteb(*c, driver_version_register);\n-\t\tc++;\n-\t}\n-\n-\tc = gve_version_str;\n+\tconst char *c = gve_version_string();\n \twhile (*c) {\n \t\twriteb(*c, driver_version_register);\n \t\tc++;\n@@ -265,6 +257,52 @@ gve_dev_close(struct rte_eth_dev *dev)\n \treturn err;\n }\n \n+static int\n+gve_verify_driver_compatibility(struct gve_priv *priv)\n+{\n+\tconst struct rte_memzone *driver_info_bus;\n+\tstruct gve_driver_info *driver_info;\n+\tint err;\n+\n+\tdriver_info_bus = rte_memzone_reserve_aligned(\"verify_driver_compatibility\",\n+\t\t\t\t\t\t      sizeof(struct gve_driver_info),\n+\t\t\t\t\t\t      rte_socket_id(),\n+\t\t\t\t\t\t      RTE_MEMZONE_IOVA_CONTIG, PAGE_SIZE);\n+\tif (driver_info_bus == NULL) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Could not alloc memzone for driver compatibility\");\n+\t\treturn -ENOMEM;\n+\t}\n+\tdriver_info = (struct gve_driver_info *)driver_info_bus->addr;\n+\t*driver_info = (struct gve_driver_info) {\n+\t\t.os_type = 5, /* DPDK */\n+\t\t.driver_major = GVE_VERSION_MAJOR,\n+\t\t.driver_minor = GVE_VERSION_MINOR,\n+\t\t.driver_sub = GVE_VERSION_SUB,\n+\t\t.os_version_major = cpu_to_be32(DPDK_VERSION_MAJOR),\n+\t\t.os_version_minor = cpu_to_be32(DPDK_VERSION_MINOR),\n+\t\t.os_version_sub = cpu_to_be32(DPDK_VERSION_SUB),\n+\t\t.driver_capability_flags = {\n+\t\t\tcpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS1),\n+\t\t\tcpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS2),\n+\t\t\tcpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS3),\n+\t\t\tcpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS4),\n+\t\t},\n+\t};\n+\n+\tpopulate_driver_version_strings((struct os_version_string *)&driver_info->os_version_str1);\n+\n+\terr = gve_adminq_verify_driver_compatibility(priv,\n+\t\tsizeof(struct gve_driver_info), (dma_addr_t)driver_info_bus);\n+\n+\t/* It's ok if the device doesn't support this */\n+\tif (err == -EOPNOTSUPP)\n+\t\terr = 0;\n+\n+\trte_memzone_free(driver_info_bus);\n+\treturn err;\n+}\n+\n static int\n gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n {\n@@ -672,6 +710,11 @@ gve_init_priv(struct gve_priv *priv, bool skip_describe_device)\n \t\tPMD_DRV_LOG(ERR, \"Failed to alloc admin queue: err=%d\", err);\n \t\treturn err;\n \t}\n+\terr = gve_verify_driver_compatibility(priv);\n+\tif (err) {\n+\t\tPMD_DRV_LOG(ERR, \"Could not verify driver compatibility: err=%d\", err);\n+\t\tgoto free_adminq;\n+\t}\n \n \tif (skip_describe_device)\n \t\tgoto setup_device;\ndiff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h\nindex 42a02cf5d4..23ccff37d3 100644\n--- a/drivers/net/gve/gve_ethdev.h\n+++ b/drivers/net/gve/gve_ethdev.h\n@@ -222,7 +222,7 @@ struct gve_priv {\n \tuint32_t adminq_report_stats_cnt;\n \tuint32_t adminq_report_link_speed_cnt;\n \tuint32_t adminq_get_ptype_map_cnt;\n-\n+\tuint32_t adminq_verify_driver_compatibility_cnt;\n \tvolatile uint32_t state_flags;\n \n \t/* Gvnic device link speed from hypervisor. */\ndiff --git a/drivers/net/gve/gve_version.c b/drivers/net/gve/gve_version.c\nnew file mode 100644\nindex 0000000000..7eaa689d90\n--- /dev/null\n+++ b/drivers/net/gve/gve_version.c\n@@ -0,0 +1,14 @@\n+/* SPDX-License-Identifier: MIT\n+ * Google Virtual Ethernet (gve) driver\n+ * Copyright (C) 2015-2023 Google, Inc.\n+ */\n+#include \"gve_version.h\"\n+\n+const char *gve_version_string(void)\n+{\n+\tstatic char gve_version[10];\n+\tsnprintf(gve_version, sizeof(gve_version), \"%s%d.%d.%d\",\n+\t\tGVE_VERSION_PREFIX, GVE_VERSION_MAJOR, GVE_VERSION_MINOR,\n+\t\tGVE_VERSION_SUB);\n+\treturn gve_version;\n+}\ndiff --git a/drivers/net/gve/gve_version.h b/drivers/net/gve/gve_version.h\nnew file mode 100644\nindex 0000000000..9af6a00568\n--- /dev/null\n+++ b/drivers/net/gve/gve_version.h\n@@ -0,0 +1,25 @@\n+/* SPDX-License-Identifier: MIT\n+ * Google Virtual Ethernet (gve) driver\n+ * Copyright (C) 2015-2023 Google, Inc.\n+ */\n+\n+#ifndef _GVE_VERSION_H_\n+#define _GVE_VERSION_H_\n+\n+#include <rte_version.h>\n+\n+#define GVE_VERSION_PREFIX \"DPDK-\"\n+#define GVE_VERSION_MAJOR 1\n+#define GVE_VERSION_MINOR 0\n+#define GVE_VERSION_SUB 0\n+\n+#define DPDK_VERSION_MAJOR (100 * RTE_VER_YEAR + RTE_VER_MONTH)\n+#define DPDK_VERSION_MINOR RTE_VER_MINOR\n+#define DPDK_VERSION_SUB RTE_VER_RELEASE\n+\n+\n+const char *\n+gve_version_string(void);\n+\n+\n+#endif /* GVE_VERSION_H */\ndiff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build\nindex af0010c01c..a37c4bafa2 100644\n--- a/drivers/net/gve/meson.build\n+++ b/drivers/net/gve/meson.build\n@@ -12,5 +12,6 @@ sources = files(\n         'gve_rx.c',\n         'gve_tx.c',\n         'gve_ethdev.c',\n+        'gve_version.c',\n )\n includes += include_directories('base')\n",
    "prefixes": []
}