DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] net/iavf: add clock read support
@ 2026-07-27 10:24 Anurag Mandal
  2026-07-27 13:10 ` [PATCH v2] " Anurag Mandal
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Anurag Mandal @ 2026-07-27 10:24 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal

Implemented read_clock ethdev operation by adding
iavf_dev_read_clock() feature to get current time
in nanoseconds for scheduling packets based on
transmit time.

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
---
 drivers/net/intel/iavf/iavf.h        |  3 ++-
 drivers/net/intel/iavf/iavf_ethdev.c | 24 ++++++++++++++++++++++++
 drivers/net/intel/iavf/iavf_vchnl.c  | 13 ++++++++++---
 3 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
index 293adaf6c9..cf2b6596d5 100644
--- a/drivers/net/intel/iavf/iavf.h
+++ b/drivers/net/intel/iavf/iavf.h
@@ -533,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset);
 void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change);
 bool is_iavf_supported(struct rte_eth_dev *dev);
 void iavf_hash_uninit(struct iavf_adapter *ad);
-#endif /* _IAVF_ETHDEV_H_ */
+int iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time);
+#endif /* _IAVF_ETHDEV_H_ u*/
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index e475b64971..1a36885107 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -165,6 +165,7 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
 static int iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg);
+static int iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock);
 
 static const struct rte_pci_id pci_id_iavf_map[] = {
 	{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },
@@ -264,6 +265,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 	.get_monitor_addr           = iavf_get_monitor_addr,
 	.tm_ops_get                 = iavf_tm_ops_get,
+	.read_clock                 = iavf_dev_read_clock,
 };
 
 static int
@@ -3662,6 +3664,28 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
 	return !strcmp(dev->device->driver->name, rte_iavf_pmd.driver.name);
 }
 
+static int
+iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock)
+{
+	struct iavf_adapter *adapter =
+		IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+	int ret;
+
+	if (adapter->closed)
+		return -EIO;
+
+	if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_PTP) ||
+	    !(vf->ptp_caps & VIRTCHNL_1588_PTP_CAP_READ_PHC))
+		return -ENOTSUP;
+
+	ret = iavf_phc_get_time(adapter, clock);
+	if (ret != 0)
+		return -EIO;
+
+	return 0;
+}
+
 RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index f346837bf1..a63639549c 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -2521,9 +2521,8 @@ iavf_get_ptp_cap(struct iavf_adapter *adapter)
 }
 
 int
-iavf_get_phc_time(struct ci_rx_queue *rxq)
+iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time)
 {
-	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
 	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
 	struct virtchnl_phc_time phc_time;
@@ -2543,9 +2542,17 @@ iavf_get_phc_time(struct ci_rx_queue *rxq)
 			    "Failed to execute command of VIRTCHNL_OP_1588_PTP_GET_TIME");
 		goto out;
 	}
-	rxq->phc_time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
+	*time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
 
 out:
 	rte_spinlock_unlock(&vf->phc_time_aq_lock);
 	return err;
 }
+
+int
+iavf_get_phc_time(struct ci_rx_queue *rxq)
+{
+	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
+
+	return iavf_phc_get_time(adapter, &rxq->phc_time);
+}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2] net/iavf: add clock read support
  2026-07-27 10:24 [PATCH] net/iavf: add clock read support Anurag Mandal
@ 2026-07-27 13:10 ` Anurag Mandal
  2026-08-17  9:18   ` Mandal, Anurag
  2026-07-28  0:22 ` [PATCH] " Mandal, Anurag
  2026-09-02  5:54 ` [PATCH v3] net/iavf: add PTP " Anurag Mandal
  2 siblings, 1 reply; 5+ messages in thread
From: Anurag Mandal @ 2026-07-27 13:10 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal

Implemented read_clock ethdev operation by adding
iavf_dev_read_clock() feature to get current time
in nanoseconds for scheduling packets based on
transmit time.

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
---
V2: Addressed minor typo

 drivers/net/intel/iavf/iavf.h        |  1 +
 drivers/net/intel/iavf/iavf_ethdev.c | 24 ++++++++++++++++++++++++
 drivers/net/intel/iavf/iavf_vchnl.c  | 13 ++++++++++---
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
index 293adaf6c9..416625d9fb 100644
--- a/drivers/net/intel/iavf/iavf.h
+++ b/drivers/net/intel/iavf/iavf.h
@@ -533,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset);
 void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change);
 bool is_iavf_supported(struct rte_eth_dev *dev);
 void iavf_hash_uninit(struct iavf_adapter *ad);
+int iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time);
 #endif /* _IAVF_ETHDEV_H_ */
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index e475b64971..1a36885107 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -165,6 +165,7 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
 static int iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg);
+static int iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock);
 
 static const struct rte_pci_id pci_id_iavf_map[] = {
 	{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },
@@ -264,6 +265,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 	.get_monitor_addr           = iavf_get_monitor_addr,
 	.tm_ops_get                 = iavf_tm_ops_get,
+	.read_clock                 = iavf_dev_read_clock,
 };
 
 static int
@@ -3662,6 +3664,28 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
 	return !strcmp(dev->device->driver->name, rte_iavf_pmd.driver.name);
 }
 
+static int
+iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock)
+{
+	struct iavf_adapter *adapter =
+		IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+	int ret;
+
+	if (adapter->closed)
+		return -EIO;
+
+	if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_PTP) ||
+	    !(vf->ptp_caps & VIRTCHNL_1588_PTP_CAP_READ_PHC))
+		return -ENOTSUP;
+
+	ret = iavf_phc_get_time(adapter, clock);
+	if (ret != 0)
+		return -EIO;
+
+	return 0;
+}
+
 RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index f346837bf1..a63639549c 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -2521,9 +2521,8 @@ iavf_get_ptp_cap(struct iavf_adapter *adapter)
 }
 
 int
-iavf_get_phc_time(struct ci_rx_queue *rxq)
+iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time)
 {
-	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
 	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
 	struct virtchnl_phc_time phc_time;
@@ -2543,9 +2542,17 @@ iavf_get_phc_time(struct ci_rx_queue *rxq)
 			    "Failed to execute command of VIRTCHNL_OP_1588_PTP_GET_TIME");
 		goto out;
 	}
-	rxq->phc_time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
+	*time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
 
 out:
 	rte_spinlock_unlock(&vf->phc_time_aq_lock);
 	return err;
 }
+
+int
+iavf_get_phc_time(struct ci_rx_queue *rxq)
+{
+	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
+
+	return iavf_phc_get_time(adapter, &rxq->phc_time);
+}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* RE: [PATCH] net/iavf: add clock read support
  2026-07-27 10:24 [PATCH] net/iavf: add clock read support Anurag Mandal
  2026-07-27 13:10 ` [PATCH v2] " Anurag Mandal
@ 2026-07-28  0:22 ` Mandal, Anurag
  2026-09-02  5:54 ` [PATCH v3] net/iavf: add PTP " Anurag Mandal
  2 siblings, 0 replies; 5+ messages in thread
From: Mandal, Anurag @ 2026-07-28  0:22 UTC (permalink / raw)
  To: dev@dpdk.org

Recheck-request: rebase=next-net-intel, iol-unit-arm64-testing intel-Functional

Thank you.

Regards,
Anurag M

> -----Original Message-----
> From: Mandal, Anurag <anurag.mandal@intel.com>
> Sent: 27 July 2026 15:55
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Medvedkin, Vladimir
> <vladimir.medvedkin@intel.com>; Mandal, Anurag
> <anurag.mandal@intel.com>
> Subject: [PATCH] net/iavf: add clock read support
> 
> Implemented read_clock ethdev operation by adding
> iavf_dev_read_clock() feature to get current time in nanoseconds for
> scheduling packets based on transmit time.
> 
> Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
> ---
>  drivers/net/intel/iavf/iavf.h        |  3 ++-
>  drivers/net/intel/iavf/iavf_ethdev.c | 24 ++++++++++++++++++++++++
> drivers/net/intel/iavf/iavf_vchnl.c  | 13 ++++++++++---
>  3 files changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h index
> 293adaf6c9..cf2b6596d5 100644
> --- a/drivers/net/intel/iavf/iavf.h
> +++ b/drivers/net/intel/iavf/iavf.h
> @@ -533,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev,
> bool vf_initiated_reset);  void iavf_set_no_poll(struct iavf_adapter *adapter,
> bool link_change);  bool is_iavf_supported(struct rte_eth_dev *dev);  void
> iavf_hash_uninit(struct iavf_adapter *ad); -#endif /* _IAVF_ETHDEV_H_ */
> +int iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time);
> +#endif /* _IAVF_ETHDEV_H_ u*/
> diff --git a/drivers/net/intel/iavf/iavf_ethdev.c
> b/drivers/net/intel/iavf/iavf_ethdev.c
> index e475b64971..1a36885107 100644
> --- a/drivers/net/intel/iavf/iavf_ethdev.c
> +++ b/drivers/net/intel/iavf/iavf_ethdev.c
> @@ -165,6 +165,7 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev
> *dev,
>  			struct rte_ether_addr *mc_addrs,
>  			uint32_t mc_addrs_num);
>  static int iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg);
> +static int iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t
> +*clock);
> 
>  static const struct rte_pci_id pci_id_iavf_map[] = {
>  	{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID,
> IAVF_DEV_ID_ADAPTIVE_VF) }, @@ -264,6 +265,7 @@ static const struct
> eth_dev_ops iavf_eth_dev_ops = {
>  	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
>  	.get_monitor_addr           = iavf_get_monitor_addr,
>  	.tm_ops_get                 = iavf_tm_ops_get,
> +	.read_clock                 = iavf_dev_read_clock,
>  };
> 
>  static int
> @@ -3662,6 +3664,28 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
>  	return !strcmp(dev->device->driver->name,
> rte_iavf_pmd.driver.name);  }
> 
> +static int
> +iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock) {
> +	struct iavf_adapter *adapter =
> +		IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
> +	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
> +	int ret;
> +
> +	if (adapter->closed)
> +		return -EIO;
> +
> +	if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_PTP) ||
> +	    !(vf->ptp_caps & VIRTCHNL_1588_PTP_CAP_READ_PHC))
> +		return -ENOTSUP;
> +
> +	ret = iavf_phc_get_time(adapter, clock);
> +	if (ret != 0)
> +		return -EIO;
> +
> +	return 0;
> +}
> +
>  RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
> RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
> RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci"); diff --git
> a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
> index f346837bf1..a63639549c 100644
> --- a/drivers/net/intel/iavf/iavf_vchnl.c
> +++ b/drivers/net/intel/iavf/iavf_vchnl.c
> @@ -2521,9 +2521,8 @@ iavf_get_ptp_cap(struct iavf_adapter *adapter)  }
> 
>  int
> -iavf_get_phc_time(struct ci_rx_queue *rxq)
> +iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time)
>  {
> -	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
>  	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
>  	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
>  	struct virtchnl_phc_time phc_time;
> @@ -2543,9 +2542,17 @@ iavf_get_phc_time(struct ci_rx_queue *rxq)
>  			    "Failed to execute command of
> VIRTCHNL_OP_1588_PTP_GET_TIME");
>  		goto out;
>  	}
> -	rxq->phc_time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
> +	*time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
> 
>  out:
>  	rte_spinlock_unlock(&vf->phc_time_aq_lock);
>  	return err;
>  }
> +
> +int
> +iavf_get_phc_time(struct ci_rx_queue *rxq) {
> +	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
> +
> +	return iavf_phc_get_time(adapter, &rxq->phc_time); }
> --
> 2.34.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH v2] net/iavf: add clock read support
  2026-07-27 13:10 ` [PATCH v2] " Anurag Mandal
@ 2026-08-17  9:18   ` Mandal, Anurag
  0 siblings, 0 replies; 5+ messages in thread
From: Mandal, Anurag @ 2026-08-17  9:18 UTC (permalink / raw)
  To: dev@dpdk.org; +Cc: Richardson, Bruce, Medvedkin, Vladimir

Hi All,

Gentle reminder for review & ack.

Thank you.

Regards,
Anurag M

> -----Original Message-----
> From: Mandal, Anurag <anurag.mandal@intel.com>
> Sent: 27 July 2026 18:40
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Medvedkin, Vladimir
> <vladimir.medvedkin@intel.com>; Mandal, Anurag
> <anurag.mandal@intel.com>
> Subject: [PATCH v2] net/iavf: add clock read support
> 
> Implemented read_clock ethdev operation by adding
> iavf_dev_read_clock() feature to get current time in nanoseconds for
> scheduling packets based on transmit time.
> 
> Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
> ---
> V2: Addressed minor typo
> 
>  drivers/net/intel/iavf/iavf.h        |  1 +
>  drivers/net/intel/iavf/iavf_ethdev.c | 24 ++++++++++++++++++++++++
> drivers/net/intel/iavf/iavf_vchnl.c  | 13 ++++++++++---
>  3 files changed, 35 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h index
> 293adaf6c9..416625d9fb 100644
> --- a/drivers/net/intel/iavf/iavf.h
> +++ b/drivers/net/intel/iavf/iavf.h
> @@ -533,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev,
> bool vf_initiated_reset);  void iavf_set_no_poll(struct iavf_adapter *adapter,
> bool link_change);  bool is_iavf_supported(struct rte_eth_dev *dev);  void
> iavf_hash_uninit(struct iavf_adapter *ad);
> +int iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time);
>  #endif /* _IAVF_ETHDEV_H_ */
> diff --git a/drivers/net/intel/iavf/iavf_ethdev.c
> b/drivers/net/intel/iavf/iavf_ethdev.c
> index e475b64971..1a36885107 100644
> --- a/drivers/net/intel/iavf/iavf_ethdev.c
> +++ b/drivers/net/intel/iavf/iavf_ethdev.c
> @@ -165,6 +165,7 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev
> *dev,
>  			struct rte_ether_addr *mc_addrs,
>  			uint32_t mc_addrs_num);
>  static int iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void
> *arg);
> +static int iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t
> +*clock);
> 
>  static const struct rte_pci_id pci_id_iavf_map[] = {
>  	{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID,
> IAVF_DEV_ID_ADAPTIVE_VF) }, @@ -264,6 +265,7 @@ static const struct
> eth_dev_ops iavf_eth_dev_ops = {
>  	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
>  	.get_monitor_addr           = iavf_get_monitor_addr,
>  	.tm_ops_get                 = iavf_tm_ops_get,
> +	.read_clock                 = iavf_dev_read_clock,
>  };
> 
>  static int
> @@ -3662,6 +3664,28 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
>  	return !strcmp(dev->device->driver->name,
> rte_iavf_pmd.driver.name);  }
> 
> +static int
> +iavf_dev_read_clock(struct rte_eth_dev *dev, uint64_t *clock) {
> +	struct iavf_adapter *adapter =
> +		IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
> +	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
> +	int ret;
> +
> +	if (adapter->closed)
> +		return -EIO;
> +
> +	if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_PTP) ||
> +	    !(vf->ptp_caps & VIRTCHNL_1588_PTP_CAP_READ_PHC))
> +		return -ENOTSUP;
> +
> +	ret = iavf_phc_get_time(adapter, clock);
> +	if (ret != 0)
> +		return -EIO;
> +
> +	return 0;
> +}
> +
>  RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
> RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
> RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci"); diff --git
> a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
> index f346837bf1..a63639549c 100644
> --- a/drivers/net/intel/iavf/iavf_vchnl.c
> +++ b/drivers/net/intel/iavf/iavf_vchnl.c
> @@ -2521,9 +2521,8 @@ iavf_get_ptp_cap(struct iavf_adapter *adapter)  }
> 
>  int
> -iavf_get_phc_time(struct ci_rx_queue *rxq)
> +iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time)
>  {
> -	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
>  	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
>  	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
>  	struct virtchnl_phc_time phc_time;
> @@ -2543,9 +2542,17 @@ iavf_get_phc_time(struct ci_rx_queue *rxq)
>  			    "Failed to execute command of
> VIRTCHNL_OP_1588_PTP_GET_TIME");
>  		goto out;
>  	}
> -	rxq->phc_time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
> +	*time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
> 
>  out:
>  	rte_spinlock_unlock(&vf->phc_time_aq_lock);
>  	return err;
>  }
> +
> +int
> +iavf_get_phc_time(struct ci_rx_queue *rxq) {
> +	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
> +
> +	return iavf_phc_get_time(adapter, &rxq->phc_time); }
> --
> 2.34.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3] net/iavf: add PTP clock read support
  2026-07-27 10:24 [PATCH] net/iavf: add clock read support Anurag Mandal
  2026-07-27 13:10 ` [PATCH v2] " Anurag Mandal
  2026-07-28  0:22 ` [PATCH] " Mandal, Anurag
@ 2026-09-02  5:54 ` Anurag Mandal
  2 siblings, 0 replies; 5+ messages in thread
From: Anurag Mandal @ 2026-09-02  5:54 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal

Added iavf support for the
timesync_read_time ethdev API to read
the device PTP Hardware Clock (PHC).
A VF has no direct access to the PHC,
so the time is fetched from the PF
over virtchnl, and the API is only
advertised when the PF grants the
PTP read capability.

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
---
V3: Changed read_clock to timesync_read_time
V2: Addressed minor typo

 drivers/net/intel/iavf/iavf.h        |  1 +
 drivers/net/intel/iavf/iavf_ethdev.c | 28 ++++++++++++++++++++++++++++
 drivers/net/intel/iavf/iavf_vchnl.c  | 13 ++++++++++---
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/drivers/net/intel/iavf/iavf.h b/drivers/net/intel/iavf/iavf.h
index 293adaf6c9..416625d9fb 100644
--- a/drivers/net/intel/iavf/iavf.h
+++ b/drivers/net/intel/iavf/iavf.h
@@ -533,4 +533,5 @@ void iavf_handle_hw_reset(struct rte_eth_dev *dev, bool vf_initiated_reset);
 void iavf_set_no_poll(struct iavf_adapter *adapter, bool link_change);
 bool is_iavf_supported(struct rte_eth_dev *dev);
 void iavf_hash_uninit(struct iavf_adapter *ad);
+int iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time);
 #endif /* _IAVF_ETHDEV_H_ */
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index e475b64971..b855be5cfc 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -24,6 +24,7 @@
 #include <rte_cycles.h>
 #include <rte_eal.h>
 #include <rte_ether.h>
+#include <rte_time.h>
 #include <ethdev_driver.h>
 #include <ethdev_pci.h>
 #include <rte_malloc.h>
@@ -165,6 +166,7 @@ static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
 static int iavf_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg);
+static int iavf_timesync_read_time(struct rte_eth_dev *dev, struct timespec *timestamp);
 
 static const struct rte_pci_id pci_id_iavf_map[] = {
 	{ RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },
@@ -264,6 +266,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 	.get_monitor_addr           = iavf_get_monitor_addr,
 	.tm_ops_get                 = iavf_tm_ops_get,
+	.timesync_read_time         = iavf_timesync_read_time,
 };
 
 static int
@@ -3662,6 +3665,31 @@ bool is_iavf_supported(struct rte_eth_dev *dev)
 	return !strcmp(dev->device->driver->name, rte_iavf_pmd.driver.name);
 }
 
+static int
+iavf_timesync_read_time(struct rte_eth_dev *dev, struct timespec *timestamp)
+{
+	struct iavf_adapter *adapter =
+		IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
+	uint64_t time;
+	int ret;
+
+	if (adapter->closed)
+		return -EIO;
+
+	if (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_PTP) ||
+	    !(vf->ptp_caps & VIRTCHNL_1588_PTP_CAP_READ_PHC))
+		return -ENOTSUP;
+
+	ret = iavf_phc_get_time(adapter, &time);
+	if (ret != 0)
+		return -EIO;
+
+	*timestamp = rte_ns_to_timespec(time);
+
+	return 0;
+}
+
 RTE_PMD_REGISTER_PCI(net_iavf, rte_iavf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_iavf, pci_id_iavf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_iavf, "* igb_uio | vfio-pci");
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index f346837bf1..a63639549c 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -2521,9 +2521,8 @@ iavf_get_ptp_cap(struct iavf_adapter *adapter)
 }
 
 int
-iavf_get_phc_time(struct ci_rx_queue *rxq)
+iavf_phc_get_time(struct iavf_adapter *adapter, uint64_t *time)
 {
-	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
 	struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);
 	uint8_t msg_buf[IAVF_AQ_BUF_SZ] = {0};
 	struct virtchnl_phc_time phc_time;
@@ -2543,9 +2542,17 @@ iavf_get_phc_time(struct ci_rx_queue *rxq)
 			    "Failed to execute command of VIRTCHNL_OP_1588_PTP_GET_TIME");
 		goto out;
 	}
-	rxq->phc_time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
+	*time = ((struct virtchnl_phc_time *)args.out_buffer)->time;
 
 out:
 	rte_spinlock_unlock(&vf->phc_time_aq_lock);
 	return err;
 }
+
+int
+iavf_get_phc_time(struct ci_rx_queue *rxq)
+{
+	struct iavf_adapter *adapter = rxq->iavf_vsi->adapter;
+
+	return iavf_phc_get_time(adapter, &rxq->phc_time);
+}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-09-02  5:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-27 10:24 [PATCH] net/iavf: add clock read support Anurag Mandal
2026-07-27 13:10 ` [PATCH v2] " Anurag Mandal
2026-08-17  9:18   ` Mandal, Anurag
2026-07-28  0:22 ` [PATCH] " Mandal, Anurag
2026-09-02  5:54 ` [PATCH v3] net/iavf: add PTP " Anurag Mandal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox