DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Kumar, Rajesh" <rajesh3.kumar@intel.com>
To: "Mandal, Anurag" <anurag.mandal@intel.com>,
	"dev@dpdk.org" <dev@dpdk.org>
Cc: "Richardson, Bruce" <bruce.richardson@intel.com>,
	"Shetty, Praveen" <praveen.shetty@intel.com>
Subject: Re: [PATCH v2] net/cpfl: add timesync support
Date: Tue, 25 Aug 2026 13:36:48 +0530	[thread overview]
Message-ID: <76d7b0eb-34ae-4d09-b4c5-1523578241f0@intel.com> (raw)
In-Reply-To: <SA1PR11MB67825EC0A3DAC9E8282B44FEE4A72@SA1PR11MB6782.namprd11.prod.outlook.com>

Reviewed-by: Rajesh Kumar <rajesh3.kumar@intel.com>

On 17-08-2026 02:48 pm, Mandal, Anurag wrote:
> Hi All,
>
> Gentle reminder for review & ack.
>
> Thank you.
>
> Regards,
> Anurag M
>> -----Original Message-----
>> From: Mandal, Anurag <anurag.mandal@intel.com>
>> Sent: 03 August 2026 15:00
>> To: dev@dpdk.org
>> Cc: Richardson, Bruce <bruce.richardson@intel.com>; Shetty, Praveen
>> <praveen.shetty@intel.com>; Mandal, Anurag <anurag.mandal@intel.com>
>> Subject: [PATCH v2] net/cpfl: add timesync support
>>
>> The cpfl PMD advertises RTE_ETH_RX_OFFLOAD_TIMESTAMP, so received
>> packets carry a 32-bit hardware timestamp that the common idpf Rx path
>> extends to 64-bit nanoseconds using the device PTP clock (PHC).
>> However, it never initialised the PHC, so the timestamp conversion had no
>> reference time.
>> Applications had no way to enable timestamping or to read the current device
>> clock to correlate the mbuf timestamps.
>>
>> This patch adds PTP support by reusing the idpf common PTP helpers:
>>
>> - timesync_enable: allocate and initialise the adapter PTP state,
>>    query the PTP capabilities, program the base increment value
>>    and set the device clock to the current system time.
>>    The PTP state is shared by all vports of an adapter, so it
>>    is initialised only once.
>>
>> - timesync_read_time: return the current device clock as a timespec.
>>
>> - timesync_disable: release the PTP state.
>>
>> Once timesync is enabled, the common Rx path resolves the cached PHC time,
>> so the mbuf Rx timestamp dynfield reports valid nanosecond values and
>> applications can read the device clock with rte_eth_timesync_read_time().
>>
>> Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
>> ---
>> V2: Removed read_clock support
>>
>>   drivers/net/intel/cpfl/cpfl_ethdev.c | 107 +++++++++++++++++++++++++++
>>   drivers/net/intel/cpfl/cpfl_ethdev.h |   1 +
>>   drivers/net/intel/idpf/idpf_ptp.c    |   5 ++
>>   drivers/net/intel/idpf/idpf_ptp.h    |   4 +
>>   4 files changed, 117 insertions(+)
>>
>> diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.c
>> b/drivers/net/intel/cpfl/cpfl_ethdev.c
>> index 4315adb68c..e4dabd8043 100644
>> --- a/drivers/net/intel/cpfl/cpfl_ethdev.c
>> +++ b/drivers/net/intel/cpfl/cpfl_ethdev.c
>> @@ -1335,6 +1335,110 @@ cpfl_hairpin_unbind(struct rte_eth_dev *dev,
>> uint16_t rx_port)
>>   	return 0;
>>   }
>>
>> +static int
>> +cpfl_timesync_enable(struct rte_eth_dev *dev) {
>> +	struct cpfl_vport *cpfl_vport = dev->data->dev_private;
>> +	struct idpf_vport *vport = &cpfl_vport->base;
>> +	struct idpf_adapter *adapter = vport->adapter;
>> +	struct timespec sys_ts;
>> +	uint64_t ns;
>> +	int ret;
>> +
>> +	if (dev->data->dev_started && !(dev->data-
>>> dev_conf.rxmode.offloads &
>> +	    RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
>> +		PMD_DRV_LOG(ERR, "Rx timestamp offload not configured");
>> +		return -1;
>> +	}
>> +
>> +	/* PTP state is shared by all vports of the adapter. */
>> +	if (adapter->ptp != NULL)
>> +		return 0;
>> +
>> +	adapter->ptp = rte_zmalloc(NULL, sizeof(struct idpf_ptp), 0);
>> +	if (adapter->ptp == NULL) {
>> +		PMD_DRV_LOG(ERR, "Failed to allocate memory for PTP");
>> +		return -ENOMEM;
>> +	}
>> +
>> +	ret = idpf_ptp_get_caps(adapter);
>> +	if (ret) {
>> +		PMD_DRV_LOG(ERR, "Failed to get PTP capabilities, err=%d",
>> ret);
>> +		goto fail_ptp;
>> +	}
>> +
>> +	/*
>> +	 * Write the default increment time value if the clock adjustments
>> +	 * are enabled.
>> +	 */
>> +	if (adapter->ptp->adj_dev_clk_time_access != IDPF_PTP_NONE) {
>> +		ret = idpf_ptp_adj_dev_clk_fine(adapter, adapter->ptp-
>>> base_incval);
>> +		if (ret) {
>> +			PMD_DRV_LOG(ERR, "PTP set incval failed, err=%d",
>> ret);
>> +			goto fail_ptp;
>> +		}
>> +	}
>> +
>> +	/* Do not initialize the PTP if the device clock time cannot be read. */
>> +	if (adapter->ptp->get_dev_clk_time_access == IDPF_PTP_NONE) {
>> +		PMD_DRV_LOG(ERR, "Getting device clock time is not
>> supported");
>> +		ret = -EIO;
>> +		goto fail_ptp;
>> +	}
>> +
>> +	/* Set the device clock time to system time. */
>> +	if (adapter->ptp->set_dev_clk_time_access != IDPF_PTP_NONE) {
>> +		clock_gettime(CLOCK_REALTIME, &sys_ts);
>> +		ns = rte_timespec_to_ns(&sys_ts);
>> +		ret = idpf_ptp_set_dev_clk_time(adapter, ns);
>> +		if (ret) {
>> +			PMD_DRV_LOG(ERR, "PTP set clock time failed,
>> err=%d", ret);
>> +			goto fail_ptp;
>> +		}
>> +	}
>> +
>> +	adapter->ptp->cmd.shtime_enable_mask =
>> PF_GLTSYN_CMD_SYNC_SHTIME_EN_M;
>> +	adapter->ptp->cmd.exec_cmd_mask =
>> PF_GLTSYN_CMD_SYNC_EXEC_CMD_M;
>> +
>> +	return 0;
>> +
>> +fail_ptp:
>> +	rte_free(adapter->ptp);
>> +	adapter->ptp = NULL;
>> +	return ret;
>> +}
>> +
>> +static int
>> +cpfl_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts) {
>> +	struct cpfl_vport *cpfl_vport = dev->data->dev_private;
>> +	struct idpf_adapter *adapter = cpfl_vport->base.adapter;
>> +	uint64_t time;
>> +	int ret;
>> +
>> +	ret = idpf_ptp_read_src_clk_reg(adapter, &time);
>> +	if (ret)
>> +		PMD_DRV_LOG(ERR, "PTP read time failed, err %d", ret);
>> +	else
>> +		*ts = rte_ns_to_timespec(time);
>> +
>> +	return ret;
>> +}
>> +
>> +static int
>> +cpfl_timesync_disable(struct rte_eth_dev *dev) {
>> +	struct cpfl_vport *cpfl_vport = dev->data->dev_private;
>> +	struct idpf_adapter *adapter = cpfl_vport->base.adapter;
>> +
>> +	if (adapter->ptp != NULL) {
>> +		rte_free(adapter->ptp);
>> +		adapter->ptp = NULL;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>>   static const struct eth_dev_ops cpfl_eth_dev_ops = {
>>   	.dev_configure			= cpfl_dev_configure,
>>   	.dev_close			= cpfl_dev_close,
>> @@ -1368,6 +1472,9 @@ static const struct eth_dev_ops cpfl_eth_dev_ops =
>> {
>>   	.hairpin_get_peer_ports         = cpfl_hairpin_get_peer_ports,
>>   	.hairpin_bind                   = cpfl_hairpin_bind,
>>   	.hairpin_unbind                 = cpfl_hairpin_unbind,
>> +	.timesync_enable                = cpfl_timesync_enable,
>> +	.timesync_read_time             = cpfl_timesync_read_time,
>> +	.timesync_disable               = cpfl_timesync_disable,
>>   };
>>
>>   static int
>> diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.h
>> b/drivers/net/intel/cpfl/cpfl_ethdev.h
>> index d41aa93191..a9e532a46c 100644
>> --- a/drivers/net/intel/cpfl/cpfl_ethdev.h
>> +++ b/drivers/net/intel/cpfl/cpfl_ethdev.h
>> @@ -16,6 +16,7 @@
>>
>>   #include <idpf_common_device.h>
>>   #include <idpf_common_virtchnl.h>
>> +#include <idpf_ptp.h>
>>   #include <base/idpf_prototype.h>
>>   #include <base/virtchnl2.h>
>>
>> diff --git a/drivers/net/intel/idpf/idpf_ptp.c
>> b/drivers/net/intel/idpf/idpf_ptp.c
>> index 5c3fcb90e4..47830de239 100644
>> --- a/drivers/net/intel/idpf/idpf_ptp.c
>> +++ b/drivers/net/intel/idpf/idpf_ptp.c
>> @@ -2,6 +2,7 @@
>>    * Copyright(c) 2025 Intel Corporation
>>    */
>>
>> +#include <eal_export.h>
>>   #include "idpf_ptp.h"
>>   #include "idpf_common_virtchnl.h"
>>   #include "base/virtchnl2.h"
>> @@ -38,6 +39,7 @@ idpf_ptp_get_features_access(const struct idpf_adapter
>> *adapter)
>>   		IDPF_PTP_ACCESS(adapter,
>> VIRTCHNL2_CAP_PTP_TX_TSTAMPS);  }
>>
>> +RTE_EXPORT_INTERNAL_SYMBOL(idpf_ptp_get_caps)
>>   int
>>   idpf_ptp_get_caps(struct idpf_adapter *adapter)  { @@ -212,6 +214,7 @@
>> idpf_ptp_get_cross_time(struct idpf_adapter *adapter,
>>   	return err;
>>   }
>>
>> +RTE_EXPORT_INTERNAL_SYMBOL(idpf_ptp_set_dev_clk_time)
>>   int
>>   idpf_ptp_set_dev_clk_time(struct idpf_adapter *adapter, uint64_t time)  {
>> @@ -256,6 +259,7 @@ idpf_ptp_adj_dev_clk_time(struct idpf_adapter
>> *adapter, int64_t delta)
>>   	return err;
>>   }
>>
>> +RTE_EXPORT_INTERNAL_SYMBOL(idpf_ptp_adj_dev_clk_fine)
>>   int
>>   idpf_ptp_adj_dev_clk_fine(struct idpf_adapter *adapter, uint64_t incval)  {
>> @@ -487,6 +491,7 @@ idpf_ptp_read_src_clk_reg_mailbox(struct
>> idpf_adapter *adapter,
>>    *
>>    * Return: 0 on success, -errno otherwise.
>>    */
>> +RTE_EXPORT_INTERNAL_SYMBOL(idpf_ptp_read_src_clk_reg)
>>   int
>>   idpf_ptp_read_src_clk_reg(struct idpf_adapter *adapter, uint64_t *src_clk)  {
>> diff --git a/drivers/net/intel/idpf/idpf_ptp.h
>> b/drivers/net/intel/idpf/idpf_ptp.h
>> index 0c901440fb..851cdad027 100644
>> --- a/drivers/net/intel/idpf/idpf_ptp.h
>> +++ b/drivers/net/intel/idpf/idpf_ptp.h
>> @@ -88,13 +88,17 @@ struct idpf_ptp_dev_timers {
>>   	uint64_t dev_clk_time_ns;
>>   };
>>
>> +__rte_internal
>>   int idpf_ptp_get_caps(struct idpf_adapter *adapter);
>> +__rte_internal
>>   int idpf_ptp_read_src_clk_reg(struct idpf_adapter *adapter, uint64_t
>> *src_clk);  int idpf_ptp_get_dev_clk_time(struct idpf_adapter *adapter,
>>   			     struct idpf_ptp_dev_timers *dev_clk_time);  int
>> idpf_ptp_get_cross_time(struct idpf_adapter *adapter,
>>   			    struct idpf_ptp_dev_timers *cross_time);
>> +__rte_internal
>>   int idpf_ptp_set_dev_clk_time(struct idpf_adapter *adapter, uint64_t time);
>> +__rte_internal
>>   int idpf_ptp_adj_dev_clk_fine(struct idpf_adapter *adapter, uint64_t incval);
>> int idpf_ptp_adj_dev_clk_time(struct idpf_adapter *adapter, int64_t delta);
>> int idpf_ptp_get_vport_tstamps_caps(struct idpf_vport *vport);
>> --
>> 2.34.1

      reply	other threads:[~2026-08-25  8:07 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-28 10:20 [PATCH] net/cpfl: add timesync and clock read support Anurag Mandal
     [not found] ` <20260803093027.870965-1-anurag.mandal@intel.com>
2026-08-17  9:18   ` [PATCH v2] net/cpfl: add timesync support Mandal, Anurag
2026-08-25  8:06     ` Kumar, Rajesh [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=76d7b0eb-34ae-4d09-b4c5-1523578241f0@intel.com \
    --to=rajesh3.kumar@intel.com \
    --cc=anurag.mandal@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=praveen.shetty@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