Introduce the necessary definitions and functions for the
GVE_ADMINQ_REPORT_NIC_TIMESTAMP AdminQ command.

Signed-off-by: Mark Blasko <[email protected]>
Reviewed-by: Joshua Washington <[email protected]>
Reviewed-by: Jasper Tran O'Leary <[email protected]>
---
 drivers/net/gve/base/gve_adminq.c | 18 ++++++++++++++++++
 drivers/net/gve/base/gve_adminq.h | 20 ++++++++++++++++++++
 drivers/net/gve/gve_ethdev.h      |  1 +
 3 files changed, 39 insertions(+)

diff --git a/drivers/net/gve/base/gve_adminq.c 
b/drivers/net/gve/base/gve_adminq.c
index c9095fd165..e700262d7f 100644
--- a/drivers/net/gve/base/gve_adminq.c
+++ b/drivers/net/gve/base/gve_adminq.c
@@ -523,6 +523,10 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
        case GVE_ADMINQ_CONFIGURE_FLOW_RULE:
                priv->adminq_cfg_flow_rule_cnt++;
                break;
+       case GVE_ADMINQ_REPORT_NIC_TIMESTAMP:
+               priv->adminq_report_nic_timestamp_cnt++;
+               break;
+
        default:
                PMD_DRV_LOG(ERR, "unknown AQ command opcode %d", opcode);
        }
@@ -637,6 +641,20 @@ int gve_adminq_reset_flow_rules(struct gve_priv *priv)
        return gve_adminq_configure_flow_rule(priv, &flow_rule_cmd);
 }
 
+int gve_adminq_report_nic_timestamp(struct gve_priv *priv, dma_addr_t 
nic_ts_report_addr)
+{
+       union gve_adminq_command cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.opcode = cpu_to_be32(GVE_ADMINQ_REPORT_NIC_TIMESTAMP);
+       cmd.report_nic_timestamp = (struct gve_adminq_report_nic_timestamp) {
+               .nic_ts_report_len = cpu_to_be64(sizeof(struct 
gve_nic_ts_report)),
+               .nic_timestamp_addr = cpu_to_be64(nic_ts_report_addr),
+       };
+
+       return gve_adminq_execute_cmd(priv, &cmd);
+}
+
 /* The device specifies that the management vector can either be the first irq
  * or the last irq. ntfy_blk_msix_base_idx indicates the first irq assigned to
  * the ntfy blks. It if is 0 then the management vector is last, if it is 1 
then
diff --git a/drivers/net/gve/base/gve_adminq.h 
b/drivers/net/gve/base/gve_adminq.h
index eaee5649f2..954be39fbf 100644
--- a/drivers/net/gve/base/gve_adminq.h
+++ b/drivers/net/gve/base/gve_adminq.h
@@ -26,6 +26,7 @@ enum gve_adminq_opcodes {
        GVE_ADMINQ_REPORT_LINK_SPEED            = 0xD,
        GVE_ADMINQ_GET_PTYPE_MAP                = 0xE,
        GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY  = 0xF,
+       GVE_ADMINQ_REPORT_NIC_TIMESTAMP         = 0x11,
        /* For commands that are larger than 56 bytes */
        GVE_ADMINQ_EXTENDED_COMMAND             = 0xFF,
 };
@@ -373,6 +374,23 @@ struct gve_stats_report {
 
 GVE_CHECK_STRUCT_LEN(8, gve_stats_report);
 
+struct gve_adminq_report_nic_timestamp {
+       __be64 nic_ts_report_len;
+       __be64 nic_timestamp_addr;
+};
+
+GVE_CHECK_STRUCT_LEN(16, gve_adminq_report_nic_timestamp);
+
+struct gve_nic_ts_report {
+       __be64 nic_timestamp; /* NIC clock in nanoseconds */
+       __be64 pre_cycles; /* System cycle counter before NIC clock read */
+       __be64 post_cycles; /* System cycle counter after NIC clock read */
+       __be64 reserved3;
+       __be64 reserved4;
+};
+
+GVE_CHECK_STRUCT_LEN(40, gve_nic_ts_report);
+
 /* Numbers of gve tx/rx stats in stats report. */
 #define GVE_TX_STATS_REPORT_NUM        6
 #define GVE_RX_STATS_REPORT_NUM        2
@@ -490,6 +508,7 @@ union gve_adminq_command {
                        struct gve_adminq_verify_driver_compatibility
                                verify_driver_compatibility;
                        struct gve_adminq_extended_command extended_command;
+                       struct gve_adminq_report_nic_timestamp 
report_nic_timestamp;
                };
        };
        u8 reserved[64];
@@ -537,5 +556,6 @@ int gve_adminq_add_flow_rule(struct gve_priv *priv,
                             struct gve_flow_rule_params *rule, u32 loc);
 int gve_adminq_del_flow_rule(struct gve_priv *priv, u32 loc);
 int gve_adminq_reset_flow_rules(struct gve_priv *priv);
+int gve_adminq_report_nic_timestamp(struct gve_priv *priv, dma_addr_t 
nic_ts_report_addr);
 
 #endif /* _GVE_ADMINQ_H */
diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h
index b9b4688367..b67f82c263 100644
--- a/drivers/net/gve/gve_ethdev.h
+++ b/drivers/net/gve/gve_ethdev.h
@@ -328,6 +328,7 @@ struct gve_priv {
        uint32_t adminq_get_ptype_map_cnt;
        uint32_t adminq_verify_driver_compatibility_cnt;
        uint32_t adminq_cfg_flow_rule_cnt;
+       uint32_t adminq_report_nic_timestamp_cnt;
        volatile uint32_t state_flags;
 
        /* Gvnic device link speed from hypervisor. */
-- 
2.54.0.563.g4f69b47b94-goog

Reply via email to