From: Junfeng Guo <junfeng.guo@intel.com>
To: qi.z.zhang@intel.com, jingjing.wu@intel.com,
ferruh.yigit@amd.com, beilei.xing@intel.com
Cc: dev@dpdk.org, xiaoyun.li@intel.com, helin.zhang@intel.com,
Junfeng Guo <junfeng.guo@intel.com>,
Rushil Gupta <rushilg@google.com>,
Joshua Washington <joshwash@google.com>,
Jordan Kimbrough <jrkim@google.com>,
Jeroen de Borst <jeroendb@google.com>
Subject: [RFC v3 10/10] net/gve: add AdminQ command to verify driver compatibility
Date: Fri, 17 Feb 2023 15:32:28 +0800 [thread overview]
Message-ID: <20230217073228.340815-11-junfeng.guo@intel.com> (raw)
In-Reply-To: <20230217073228.340815-1-junfeng.guo@intel.com>
Check whether the driver is compatible with the device presented.
Change gve_driver_info fields to report DPDK as OS type and DPDK RTE
version as OS version, reserving driver_version fields for GVE driver
version based on features.
Signed-off-by: Rushil Gupta <rushilg@google.com>
Signed-off-by: Joshua Washington <joshwash@google.com>
Signed-off-by: Jordan Kimbrough <jrkim@google.com>
Signed-off-by: Junfeng Guo <junfeng.guo@intel.com>
Signed-off-by: Jeroen de Borst <jeroendb@google.com>
---
drivers/net/gve/base/gve.h | 3 --
drivers/net/gve/base/gve_adminq.c | 19 +++++++++
drivers/net/gve/base/gve_adminq.h | 49 ++++++++++++++++++++++-
drivers/net/gve/base/gve_osdep.h | 34 ++++++++++++++++
drivers/net/gve/gve_ethdev.c | 66 +++++++++++++++++++++++++------
drivers/net/gve/gve_ethdev.h | 1 +
drivers/net/gve/gve_version.c | 14 +++++++
drivers/net/gve/gve_version.h | 25 ++++++++++++
drivers/net/gve/meson.build | 1 +
9 files changed, 197 insertions(+), 15 deletions(-)
create mode 100644 drivers/net/gve/gve_version.c
create mode 100644 drivers/net/gve/gve_version.h
diff --git a/drivers/net/gve/base/gve.h b/drivers/net/gve/base/gve.h
index 22d175910d..52ffc057a2 100644
--- a/drivers/net/gve/base/gve.h
+++ b/drivers/net/gve/base/gve.h
@@ -9,9 +9,6 @@
#include "gve_desc.h"
#include "gve_desc_dqo.h"
-#define GVE_VERSION "1.3.0"
-#define GVE_VERSION_PREFIX "GVE-"
-
#ifndef GOOGLE_VENDOR_ID
#define GOOGLE_VENDOR_ID 0x1ae0
#endif
diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c
index 650d520e3d..380bccf18a 100644
--- a/drivers/net/gve/base/gve_adminq.c
+++ b/drivers/net/gve/base/gve_adminq.c
@@ -401,6 +401,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
case GVE_ADMINQ_GET_PTYPE_MAP:
priv->adminq_get_ptype_map_cnt++;
break;
+ case GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY:
+ priv->adminq_verify_driver_compatibility_cnt++;
+ break;
default:
PMD_DRV_LOG(ERR, "unknown AQ command opcode %d", opcode);
}
@@ -859,6 +862,22 @@ int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
return gve_adminq_execute_cmd(priv, &cmd);
}
+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,
+ u64 driver_info_len,
+ dma_addr_t driver_info_addr)
+{
+ union gve_adminq_command cmd;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.opcode = cpu_to_be32(GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY);
+ cmd.verify_driver_compatibility = (struct gve_adminq_verify_driver_compatibility) {
+ .driver_info_len = cpu_to_be64(driver_info_len),
+ .driver_info_addr = cpu_to_be64(driver_info_addr),
+ };
+
+ return gve_adminq_execute_cmd(priv, &cmd);
+}
+
int gve_adminq_report_link_speed(struct gve_priv *priv)
{
struct gve_dma_mem link_speed_region_dma_mem;
diff --git a/drivers/net/gve/base/gve_adminq.h b/drivers/net/gve/base/gve_adminq.h
index 05550119de..89722eef7a 100644
--- a/drivers/net/gve/base/gve_adminq.h
+++ b/drivers/net/gve/base/gve_adminq.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT
* Google Virtual Ethernet (gve) driver
- * Copyright (C) 2015-2022 Google, Inc.
+ * Copyright (C) 2015-2023 Google, Inc.
*/
#ifndef _GVE_ADMINQ_H
@@ -23,6 +23,7 @@ enum gve_adminq_opcodes {
GVE_ADMINQ_REPORT_STATS = 0xC,
GVE_ADMINQ_REPORT_LINK_SPEED = 0xD,
GVE_ADMINQ_GET_PTYPE_MAP = 0xE,
+ GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY = 0xF,
};
/* Admin queue status codes */
@@ -146,6 +147,47 @@ enum gve_sup_feature_mask {
#define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0
+enum gve_driver_capbility {
+ gve_driver_capability_gqi_qpl = 0,
+ gve_driver_capability_gqi_rda = 1,
+ gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
+ gve_driver_capability_dqo_rda = 3,
+};
+
+#define GVE_CAP1(a) BIT((int)a)
+#define GVE_CAP2(a) BIT(((int)a) - 64)
+#define GVE_CAP3(a) BIT(((int)a) - 128)
+#define GVE_CAP4(a) BIT(((int)a) - 192)
+
+#define GVE_DRIVER_CAPABILITY_FLAGS1 \
+ (GVE_CAP1(gve_driver_capability_gqi_qpl) | \
+ GVE_CAP1(gve_driver_capability_gqi_rda) | \
+ GVE_CAP1(gve_driver_capability_dqo_rda))
+
+#define GVE_DRIVER_CAPABILITY_FLAGS2 0x0
+#define GVE_DRIVER_CAPABILITY_FLAGS3 0x0
+#define GVE_DRIVER_CAPABILITY_FLAGS4 0x0
+
+struct gve_driver_info {
+ u8 os_type; /* 0x05 = DPDK */
+ u8 driver_major;
+ u8 driver_minor;
+ u8 driver_sub;
+ __be32 os_version_major;
+ __be32 os_version_minor;
+ __be32 os_version_sub;
+ __be64 driver_capability_flags[4];
+ u8 os_version_str1[OS_VERSION_STRLEN];
+ u8 os_version_str2[OS_VERSION_STRLEN];
+};
+
+struct gve_adminq_verify_driver_compatibility {
+ __be64 driver_info_len;
+ __be64 driver_info_addr;
+};
+
+GVE_CHECK_STRUCT_LEN(16, gve_adminq_verify_driver_compatibility);
+
struct gve_adminq_configure_device_resources {
__be64 counter_array;
__be64 irq_db_addr;
@@ -345,6 +387,8 @@ union gve_adminq_command {
struct gve_adminq_report_stats report_stats;
struct gve_adminq_report_link_speed report_link_speed;
struct gve_adminq_get_ptype_map get_ptype_map;
+ struct gve_adminq_verify_driver_compatibility
+ verify_driver_compatibility;
};
};
u8 reserved[64];
@@ -377,5 +421,8 @@ int gve_adminq_report_link_speed(struct gve_priv *priv);
struct gve_ptype_lut;
int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv,
struct gve_ptype_lut *ptype_lut);
+int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,
+ u64 driver_info_len,
+ dma_addr_t driver_info_addr);
#endif /* _GVE_ADMINQ_H */
diff --git a/drivers/net/gve/base/gve_osdep.h b/drivers/net/gve/base/gve_osdep.h
index 71759d254f..e642c9557e 100644
--- a/drivers/net/gve/base/gve_osdep.h
+++ b/drivers/net/gve/base/gve_osdep.h
@@ -21,9 +21,14 @@
#include <rte_malloc.h>
#include <rte_memcpy.h>
#include <rte_memzone.h>
+#include <rte_version.h>
#include "../gve_logs.h"
+#ifdef __linux__
+#include <sys/utsname.h>
+#endif
+
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
@@ -73,6 +78,12 @@ typedef rte_iova_t dma_addr_t;
#define msleep(ms) rte_delay_ms(ms)
+#define OS_VERSION_STRLEN 128
+struct os_version_string {
+ char os_version_str1[OS_VERSION_STRLEN];
+ char os_version_str2[OS_VERSION_STRLEN];
+};
+
/* These macros are used to generate compilation errors if a struct/union
* is not exactly the correct length. It gives a divide by zero error if
* the struct/union is not of the correct size, otherwise it creates an
@@ -82,6 +93,11 @@ typedef rte_iova_t dma_addr_t;
{ gve_static_assert_##X = (n) / ((sizeof(struct X) == (n)) ? 1 : 0) }
#define GVE_CHECK_UNION_LEN(n, X) enum gve_static_asset_enum_##X \
{ gve_static_assert_##X = (n) / ((sizeof(union X) == (n)) ? 1 : 0) }
+#ifndef LINUX_VERSION_MAJOR
+#define LINUX_VERSION_MAJOR (((LINUX_VERSION_CODE) >> 16) & 0xff)
+#define LINUX_VERSION_SUBLEVEL (((LINUX_VERSION_CODE) >> 8) & 0xff)
+#define LINUX_VERSION_PATCHLEVEL ((LINUX_VERSION_CODE) & 0xff)
+#endif
static __rte_always_inline u8
readb(volatile void *addr)
@@ -160,4 +176,22 @@ gve_free_dma_mem(struct gve_dma_mem *mem)
mem->pa = 0;
}
+
+static inline void
+populate_driver_version_strings(struct os_version_string *os_version_str)
+{
+#ifdef __linux__
+ struct utsname uts;
+ if (uname(&uts) >= 0) {
+ /* OS version */
+ rte_strscpy(os_version_str->os_version_str1, uts.release,
+ sizeof(os_version_str->os_version_str1));
+ /* DPDK version */
+ rte_strscpy(os_version_str->os_version_str2, uts.version,
+ sizeof(os_version_str->os_version_str2));
+ }
+#endif
+}
+
+
#endif /* _GVE_OSDEP_H_ */
diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c
index 2541738da1..0fed32fbe0 100644
--- a/drivers/net/gve/gve_ethdev.c
+++ b/drivers/net/gve/gve_ethdev.c
@@ -5,21 +5,13 @@
#include "gve_ethdev.h"
#include "base/gve_adminq.h"
#include "base/gve_register.h"
-
-const char gve_version_str[] = GVE_VERSION;
-static const char gve_version_prefix[] = GVE_VERSION_PREFIX;
+#include "base/gve_osdep.h"
+#include "gve_version.h"
static void
gve_write_version(uint8_t *driver_version_register)
{
- const char *c = gve_version_prefix;
-
- while (*c) {
- writeb(*c, driver_version_register);
- c++;
- }
-
- c = gve_version_str;
+ const char *c = gve_version_string();
while (*c) {
writeb(*c, driver_version_register);
c++;
@@ -314,6 +306,52 @@ gve_dev_close(struct rte_eth_dev *dev)
return err;
}
+static int
+gve_verify_driver_compatibility(struct gve_priv *priv)
+{
+ const struct rte_memzone *driver_info_bus;
+ struct gve_driver_info *driver_info;
+ int err;
+
+ driver_info_bus = rte_memzone_reserve_aligned("verify_driver_compatibility",
+ sizeof(struct gve_driver_info),
+ rte_socket_id(),
+ RTE_MEMZONE_IOVA_CONTIG, PAGE_SIZE);
+ if (driver_info_bus == NULL) {
+ PMD_DRV_LOG(ERR,
+ "Could not alloc memzone for driver compatibility");
+ return -ENOMEM;
+ }
+ driver_info = (struct gve_driver_info *)driver_info_bus->addr;
+ *driver_info = (struct gve_driver_info) {
+ .os_type = 5, /* DPDK */
+ .driver_major = GVE_VERSION_MAJOR,
+ .driver_minor = GVE_VERSION_MINOR,
+ .driver_sub = GVE_VERSION_SUB,
+ .os_version_major = cpu_to_be32(DPDK_VERSION_MAJOR),
+ .os_version_minor = cpu_to_be32(DPDK_VERSION_MINOR),
+ .os_version_sub = cpu_to_be32(DPDK_VERSION_SUB),
+ .driver_capability_flags = {
+ cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS1),
+ cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS2),
+ cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS3),
+ cpu_to_be64(GVE_DRIVER_CAPABILITY_FLAGS4),
+ },
+ };
+
+ populate_driver_version_strings((struct os_version_string *)&driver_info->os_version_str1);
+
+ err = gve_adminq_verify_driver_compatibility(priv,
+ sizeof(struct gve_driver_info), (dma_addr_t)driver_info_bus);
+
+ /* It's ok if the device doesn't support this */
+ if (err == -EOPNOTSUPP)
+ err = 0;
+
+ rte_memzone_free(driver_info_bus);
+ return err;
+}
+
static int
gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
{
@@ -631,6 +669,12 @@ gve_init_priv(struct gve_priv *priv, bool skip_describe_device)
return err;
}
+ err = gve_verify_driver_compatibility(priv);
+ if (err) {
+ PMD_DRV_LOG(ERR, "Could not verify driver compatibility: err=%d", err);
+ goto free_adminq;
+ }
+
if (skip_describe_device)
goto setup_device;
diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h
index 02b997312c..9e220cf4dc 100644
--- a/drivers/net/gve/gve_ethdev.h
+++ b/drivers/net/gve/gve_ethdev.h
@@ -254,6 +254,7 @@ struct gve_priv {
uint32_t adminq_report_stats_cnt;
uint32_t adminq_report_link_speed_cnt;
uint32_t adminq_get_ptype_map_cnt;
+ uint32_t adminq_verify_driver_compatibility_cnt;
volatile uint32_t state_flags;
diff --git a/drivers/net/gve/gve_version.c b/drivers/net/gve/gve_version.c
new file mode 100644
index 0000000000..7eaa689d90
--- /dev/null
+++ b/drivers/net/gve/gve_version.c
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: MIT
+ * Google Virtual Ethernet (gve) driver
+ * Copyright (C) 2015-2023 Google, Inc.
+ */
+#include "gve_version.h"
+
+const char *gve_version_string(void)
+{
+ static char gve_version[10];
+ snprintf(gve_version, sizeof(gve_version), "%s%d.%d.%d",
+ GVE_VERSION_PREFIX, GVE_VERSION_MAJOR, GVE_VERSION_MINOR,
+ GVE_VERSION_SUB);
+ return gve_version;
+}
diff --git a/drivers/net/gve/gve_version.h b/drivers/net/gve/gve_version.h
new file mode 100644
index 0000000000..b1f626f95e
--- /dev/null
+++ b/drivers/net/gve/gve_version.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: MIT
+ * Google Virtual Ethernet (gve) driver
+ * Copyright (C) 2015-2023 Google, Inc.
+ */
+
+#ifndef _GVE_VERSION_H_
+#define _GVE_VERSION_H_
+
+#include <rte_version.h>
+
+#define GVE_VERSION_PREFIX "GVE-"
+#define GVE_VERSION_MAJOR 0
+#define GVE_VERSION_MINOR 9
+#define GVE_VERSION_SUB 0
+
+#define DPDK_VERSION_MAJOR (100 * RTE_VER_YEAR + RTE_VER_MONTH)
+#define DPDK_VERSION_MINOR RTE_VER_MINOR
+#define DPDK_VERSION_SUB RTE_VER_RELEASE
+
+
+const char *
+gve_version_string(void);
+
+
+#endif /* GVE_VERSION_H */
diff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build
index 8caee3714b..9f10e98bf6 100644
--- a/drivers/net/gve/meson.build
+++ b/drivers/net/gve/meson.build
@@ -14,5 +14,6 @@ sources = files(
'gve_rx_dqo.c',
'gve_tx_dqo.c',
'gve_ethdev.c',
+ 'gve_version.c',
)
includes += include_directories('base')
--
2.34.1
prev parent reply other threads:[~2023-02-17 7:40 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 2:53 [RFC 0/8] gve PMD enhancement Junfeng Guo
2023-01-18 2:53 ` [RFC 1/8] net/gve: add Rx queue setup for DQO Junfeng Guo
2023-01-18 2:53 ` [RFC 2/8] net/gve: support device start and close " Junfeng Guo
2023-01-18 2:53 ` [RFC 3/8] net/gve: support queue release and stop " Junfeng Guo
2023-01-18 2:53 ` [RFC 4/8] net/gve: support basic Tx data path " Junfeng Guo
2023-01-18 2:53 ` [RFC 5/8] net/gve: support basic Rx " Junfeng Guo
2023-01-18 2:53 ` [RFC 6/8] net/gve: support basic stats " Junfeng Guo
2023-01-18 2:53 ` [RFC 7/8] net/gve: support jumbo frame for GQI Junfeng Guo
2023-01-18 2:53 ` [RFC 8/8] net/gve: add AdminQ command to verify driver compatibility Junfeng Guo
2023-01-25 13:37 ` [RFC 0/8] gve PMD enhancement Li, Xiaoyun
2023-01-30 6:26 ` [RFC v2 0/9] " Junfeng Guo
2023-01-30 6:26 ` [RFC v2 1/9] net/gve: add Tx queue setup for DQO Junfeng Guo
2023-01-30 6:26 ` [RFC v2 2/9] net/gve: add Rx " Junfeng Guo
2023-01-30 6:26 ` [RFC v2 3/9] net/gve: support device start and close " Junfeng Guo
2023-01-30 6:26 ` [RFC v2 4/9] net/gve: support queue release and stop " Junfeng Guo
2023-01-30 6:26 ` [RFC v2 5/9] net/gve: support basic Tx data path " Junfeng Guo
2023-01-30 6:26 ` [RFC v2 6/9] net/gve: support basic Rx " Junfeng Guo
2023-01-30 18:32 ` Honnappa Nagarahalli
2023-01-30 6:26 ` [RFC v2 7/9] net/gve: support basic stats " Junfeng Guo
2023-01-30 18:27 ` Honnappa Nagarahalli
2023-01-30 6:26 ` [RFC v2 8/9] net/gve: support jumbo frame for GQI Junfeng Guo
2023-01-30 6:26 ` [RFC v2 9/9] net/gve: add AdminQ command to verify driver compatibility Junfeng Guo
2023-02-17 7:32 ` [RFC v3 00/10] gve PMD enhancement Junfeng Guo
2023-02-17 7:32 ` [RFC v3 01/10] net/gve: add Tx queue setup for DQO Junfeng Guo
2023-02-17 7:32 ` [RFC v3 02/10] net/gve: add Rx " Junfeng Guo
2023-02-17 7:32 ` [RFC v3 03/10] net/gve: support device start and close " Junfeng Guo
2023-02-17 7:32 ` [RFC v3 04/10] net/gve: support queue release and stop " Junfeng Guo
2023-02-17 7:32 ` [RFC v3 05/10] net/gve: support basic Tx data path " Junfeng Guo
2023-02-17 7:32 ` [RFC v3 06/10] net/gve: support basic Rx " Junfeng Guo
2023-02-17 15:17 ` Honnappa Nagarahalli
2023-02-23 5:32 ` Guo, Junfeng
2023-02-17 7:32 ` [RFC v3 07/10] net/gve: support basic stats " Junfeng Guo
2023-02-17 15:28 ` Honnappa Nagarahalli
2023-02-17 7:32 ` [RFC v3 08/10] net/gve: enable Tx checksum offload " Junfeng Guo
2023-02-17 7:32 ` [RFC v3 09/10] net/gve: support jumbo frame for GQI Junfeng Guo
2023-02-17 7:32 ` Junfeng Guo [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230217073228.340815-11-junfeng.guo@intel.com \
--to=junfeng.guo@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
--cc=helin.zhang@intel.com \
--cc=jeroendb@google.com \
--cc=jingjing.wu@intel.com \
--cc=joshwash@google.com \
--cc=jrkim@google.com \
--cc=qi.z.zhang@intel.com \
--cc=rushilg@google.com \
--cc=xiaoyun.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).