Check whether the driver is compatible with the device presented.
Subsystems (2)
PATCH 1/1 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.
This patch is dependent on https://patchwork.dpdk.org/project/dpdk/list/?series=27687&state=*
Signed-off-by Rushil Gupta <[email protected]>
Signed-off-by Joshua Washington <[email protected]>
Signed-off-by Junfeng Guo <[email protected]>
Signed-off-by Jeroen de Borst <[email protected]>
--- 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 | 36 +++++++++++++++++ drivers/net/gve/gve_ethdev.c | 65 +++++++++++++++++++++++++------ drivers/net/gve/gve_ethdev.h | 2 +- drivers/net/gve/gve_version.c | 14 +++++++ drivers/net/gve/gve_version.h | 25 ++++++++++++ drivers/net/gve/meson.build | 1 + 9 files changed, 198 insertions(+), 16 deletions(-) create mode 100644 drivers/net/gve/gve_version.c create mode 100644 drivers/net/gve/gve_version.h
drivers/net/gve/base/gve.h +0 -3
@@ -8,9 +8,6 @@#include "gve_desc.h" -#define GVE_VERSION "1.3.0" -#define GVE_VERSION_PREFIX "GVE-" -#ifndef GOOGLE_VENDOR_ID #define GOOGLE_VENDOR_ID 0x1ae0#endif
drivers/net/gve/base/gve_adminq.c +19 -0
@@ -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); }
@@ -465,6 +468,22 @@ int gve_adminq_configure_device_resources(struct gve_priv *priv,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_deconfigure_device_resources (struct gve_priv *priv) {union gve_adminq_command cmd;
drivers/net/gve/base/gve_adminq.h +48 -1
76 lines not on this page · raw message
drivers/net/gve/base/gve_osdep.h +36 -0
@@ -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 ;
@@ -69,6 +74,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
@@ -79,6 +90,12 @@ typedef rte_iova_t dma_addr_t;#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 u8readb (volatile void *addr) {
@@ -156,4 +173,23 @@ 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 ) { +/* release */ +rte_strscpy (os_version_str->os_version_str1, uts.release, +sizeof (os_version_str->os_version_str1)); +/* version */ +rte_strscpy (os_version_str->os_version_str2, uts.version, +sizeof (os_version_str->os_version_str2)); + } +#else +/* gVNIC is currently not supported on OS like FreeBSD */ +RTE_SET_USED (os_version_str); +#endif +} +#endif /* _GVE_OSDEP_H_ */
drivers/net/gve/gve_ethdev.c +54 -11
87 lines not on this page · raw message
drivers/net/gve/gve_ethdev.h +1 -1
@@ -222,7 +222,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;/* Gvnic device link speed from hypervisor. */
drivers/net/gve/gve_version.c new file +14 -0
@@ -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; +}
drivers/net/gve/gve_version.h new file +25 -0
@@ -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 "DPDK-" +#define GVE_VERSION_MAJOR 1 +#define GVE_VERSION_MINOR 0 +#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 */
drivers/net/gve/meson.build +1 -0
@@ -12,5 +12,6 @@ sources = files( 'gve_rx.c', 'gve_tx.c', 'gve_ethdev.c', + 'gve_version.c', ) includes += include_directories('base')
Signature · 1 line
2.40.0.634.g4ca3ef3211-goog