All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frank Li <Frank.li@nxp.com>
To: Wei Fang <wei.fang@nxp.com>
Cc: robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org,
	richardcochran@gmail.com, claudiu.manoil@nxp.com,
	vladimir.oltean@nxp.com, xiaoning.wang@nxp.com,
	andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, vadim.fedorenko@linux.dev,
	shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com,
	fushi.peng@nxp.com, devicetree@vger.kernel.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	imx@lists.linux.dev, kernel@pengutronix.de
Subject: Re: [PATCH v2 net-next 06/14] ptp: netc: add external trigger stamp support
Date: Wed, 16 Jul 2025 16:30:25 -0400	[thread overview]
Message-ID: <aHgL4dM2TIeNSCCr@lizhi-Precision-Tower-5810> (raw)
In-Reply-To: <20250716073111.367382-7-wei.fang@nxp.com>

On Wed, Jul 16, 2025 at 03:31:03PM +0800, Wei Fang wrote:
> From: "F.S. Peng" <fushi.peng@nxp.com>
>
> The NETC Timer is capable of recording the timestamp on receipt of an
> external pulse on a GPIO pin. It supports two such external triggers.
> The recorded value is saved in a 16 entry FIFO accessed by
> TMR_ETTSa_H/L. An interrupt can be generated when the trigger occurs,
> when the FIFO reaches a threshold, and if the FIFO overflows.
>
> Signed-off-by: F.S. Peng <fushi.peng@nxp.com>
> Signed-off-by: Wei Fang <wei.fang@nxp.com>

Reviewed-by: Frank Li <Frank.Li@nxp.com>

> ---
>  drivers/ptp/ptp_netc.c | 118 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 118 insertions(+)
>
> diff --git a/drivers/ptp/ptp_netc.c b/drivers/ptp/ptp_netc.c
> index 289cdd50ae3d..c2fc6351db5b 100644
> --- a/drivers/ptp/ptp_netc.c
> +++ b/drivers/ptp/ptp_netc.c
> @@ -18,6 +18,8 @@
>  #define NETC_TMR_CTRL			0x0080
>  #define  TMR_CTRL_CK_SEL		GENMASK(1, 0)
>  #define  TMR_CTRL_TE			BIT(2)
> +#define  TMR_ETEP1			BIT(8)
> +#define  TMR_ETEP2			BIT(9)
>  #define  TMR_COMP_MODE			BIT(15)
>  #define  TMR_CTRL_TCLK_PERIOD		GENMASK(25, 16)
>  #define  TMR_CTRL_FS			BIT(28)
> @@ -28,12 +30,26 @@
>  #define  TMR_TEVENT_PPEN_ALL		GENMASK(7, 5)
>  #define  TMR_TEVENT_ALM1EN		BIT(16)
>  #define  TMR_TEVENT_ALM2EN		BIT(17)
> +#define  TMR_TEVENT_ETS1_THREN		BIT(20)
> +#define  TMR_TEVENT_ETS2_THREN		BIT(21)
> +#define  TMR_TEVENT_ETS1EN		BIT(24)
> +#define  TMR_TEVENT_ETS2EN		BIT(25)
> +#define  TMR_TEVENT_ETS1_OVEN		BIT(28)
> +#define  TMR_TEVENT_ETS2_OVEN		BIT(29)
> +#define  TMR_TEVENT_ETS1		(TMR_TEVENT_ETS1_THREN | \
> +					 TMR_TEVENT_ETS1EN | TMR_TEVENT_ETS1_OVEN)
> +#define  TMR_TEVENT_ETS2		(TMR_TEVENT_ETS2_THREN | \
> +					 TMR_TEVENT_ETS2EN | TMR_TEVENT_ETS2_OVEN)
>
>  #define NETC_TMR_TEMASK			0x0088
> +#define NETC_TMR_STAT			0x0094
> +#define  TMR_STAT_ETS1_VLD		BIT(24)
> +#define  TMR_STAT_ETS2_VLD		BIT(25)
>  #define NETC_TMR_CNT_L			0x0098
>  #define NETC_TMR_CNT_H			0x009c
>  #define NETC_TMR_ADD			0x00a0
>  #define NETC_TMR_PRSC			0x00a8
> +#define NETC_TMR_ECTRL			0x00ac
>  #define NETC_TMR_OFF_L			0x00b0
>  #define NETC_TMR_OFF_H			0x00b4
>
> @@ -51,6 +67,10 @@
>  #define  FIPER_CTRL_PW(i)		(GENMASK(4, 0) << (i) * 8)
>  #define  FIPER_CTRL_SET_PW(i, v)	(((v) & GENMASK(4, 0)) << 8 * (i))
>
> +#define NETC_TMR_ETTS1_L		0x00e0
> +#define NETC_TMR_ETTS1_H		0x00e4
> +#define NETC_TMR_ETTS2_L		0x00e8
> +#define NETC_TMR_ETTS2_H		0x00ec
>  #define NETC_TMR_CUR_TIME_L		0x00f0
>  #define NETC_TMR_CUR_TIME_H		0x00f4
>
> @@ -67,6 +87,7 @@
>  #define NETC_TMR_DEFAULT_FIPER		GENMASK(31, 0)
>  #define NETC_TMR_FIPER_MAX_PW		GENMASK(4, 0)
>  #define NETC_TMR_ALARM_NUM		2
> +#define NETC_TMR_DEFAULT_ETTF_THR	7
>
>  /* 1588 timer reference clock source select */
>  #define NETC_TMR_CCM_TIMER1		0 /* enet_timer1_clk_root, from CCM */
> @@ -450,6 +471,91 @@ static int net_timer_enable_perout(struct netc_timer *priv,
>  	return err;
>  }
>
> +static void netc_timer_handle_etts_event(struct netc_timer *priv, int index,
> +					 bool update_event)
> +{
> +	u32 regoff_l, regoff_h, etts_l, etts_h, ets_vld;
> +	struct ptp_clock_event event;
> +
> +	switch (index) {
> +	case 0:
> +		ets_vld = TMR_STAT_ETS1_VLD;
> +		regoff_l = NETC_TMR_ETTS1_L;
> +		regoff_h = NETC_TMR_ETTS1_H;
> +		break;
> +	case 1:
> +		ets_vld = TMR_STAT_ETS2_VLD;
> +		regoff_l = NETC_TMR_ETTS2_L;
> +		regoff_h = NETC_TMR_ETTS2_H;
> +		break;
> +	default:
> +		return;
> +	}
> +
> +	if (!(netc_timer_rd(priv, NETC_TMR_STAT) & ets_vld))
> +		return;
> +
> +	do {
> +		etts_l = netc_timer_rd(priv, regoff_l);
> +		etts_h = netc_timer_rd(priv, regoff_h);
> +	} while (netc_timer_rd(priv, NETC_TMR_STAT) & ets_vld);
> +
> +	if (update_event) {
> +		event.type = PTP_CLOCK_EXTTS;
> +		event.index = index;
> +		event.timestamp = (u64)etts_h << 32;
> +		event.timestamp |= etts_l;
> +		ptp_clock_event(priv->clock, &event);
> +	}
> +}
> +
> +static int netc_timer_enable_extts(struct netc_timer *priv,
> +				   struct ptp_clock_request *rq, int on)
> +{
> +	u32 ets_emask, tmr_emask, tmr_ctrl, ettp_bit;
> +	unsigned long flags;
> +
> +	/* Reject requests to enable time stamping on both edges */
> +	if ((rq->extts.flags & PTP_EXTTS_EDGES) == PTP_EXTTS_EDGES)
> +		return -EOPNOTSUPP;
> +
> +	switch (rq->extts.index) {
> +	case 0:
> +		ettp_bit = TMR_ETEP1;
> +		ets_emask = TMR_TEVENT_ETS1;
> +		break;
> +	case 1:
> +		ettp_bit = TMR_ETEP2;
> +		ets_emask = TMR_TEVENT_ETS2;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	spin_lock_irqsave(&priv->lock, flags);
> +
> +	netc_timer_handle_etts_event(priv, rq->extts.index, false);
> +	tmr_emask = netc_timer_rd(priv, NETC_TMR_TEMASK);
> +	if (on) {
> +		tmr_ctrl = netc_timer_rd(priv, NETC_TMR_CTRL);
> +		if (rq->extts.flags & PTP_FALLING_EDGE)
> +			tmr_ctrl |= ettp_bit;
> +		else
> +			tmr_ctrl &= ~ettp_bit;
> +
> +		netc_timer_wr(priv, NETC_TMR_CTRL, tmr_ctrl);
> +		tmr_emask |= ets_emask;
> +	} else {
> +		tmr_emask &= ~ets_emask;
> +	}
> +
> +	netc_timer_wr(priv, NETC_TMR_TEMASK, tmr_emask);
> +
> +	spin_unlock_irqrestore(&priv->lock, flags);
> +
> +	return 0;
> +}
> +
>  static void netc_timer_disable_fiper(struct netc_timer *priv)
>  {
>  	u32 fiper_ctrl = netc_timer_rd(priv, NETC_TMR_FIPER_CTRL);
> @@ -505,6 +611,8 @@ static int netc_timer_enable(struct ptp_clock_info *ptp,
>  		return netc_timer_enable_pps(priv, rq, on);
>  	case PTP_CLK_REQ_PEROUT:
>  		return net_timer_enable_perout(priv, rq, on);
> +	case PTP_CLK_REQ_EXTTS:
> +		return netc_timer_enable_extts(priv, rq, on);
>  	default:
>  		return -EOPNOTSUPP;
>  	}
> @@ -638,6 +746,9 @@ static const struct ptp_clock_info netc_timer_ptp_caps = {
>  	.n_pins		= 0,
>  	.pps		= 1,
>  	.n_per_out	= 3,
> +	.n_ext_ts	= 2,
> +	.supported_extts_flags = PTP_RISING_EDGE | PTP_FALLING_EDGE |
> +				 PTP_STRICT_FLAGS,
>  	.adjfine	= netc_timer_adjfine,
>  	.adjtime	= netc_timer_adjtime,
>  	.gettimex64	= netc_timer_gettimex64,
> @@ -670,6 +781,7 @@ static void netc_timer_init(struct netc_timer *priv)
>  		fiper_ctrl &= ~FIPER_CTRL_PG(i);
>  	}
>  	netc_timer_wr(priv, NETC_TMR_FIPER_CTRL, fiper_ctrl);
> +	netc_timer_wr(priv, NETC_TMR_ECTRL, NETC_TMR_DEFAULT_ETTF_THR);
>
>  	ktime_get_real_ts64(&now);
>  	ns = timespec64_to_ns(&now);
> @@ -822,6 +934,12 @@ static irqreturn_t netc_timer_isr(int irq, void *data)
>  		ptp_clock_event(priv->clock, &event);
>  	}
>
> +	if (tmr_event & TMR_TEVENT_ETS1)
> +		netc_timer_handle_etts_event(priv, 0, true);
> +
> +	if (tmr_event & TMR_TEVENT_ETS2)
> +		netc_timer_handle_etts_event(priv, 1, true);
> +
>  	/* Clear interrupts status */
>  	netc_timer_wr(priv, NETC_TMR_TEVENT, tmr_event);
>
> --
> 2.34.1
>

  reply	other threads:[~2025-07-16 20:30 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-16  7:30 [PATCH v2 net-next 00/14] Add NETC Timer PTP driver and add PTP support for i.MX95 Wei Fang
2025-07-16  7:30 ` [PATCH v2 net-next 01/14] dt-bindings: ptp: add NETC Timer PTP clock Wei Fang
2025-07-16 19:19   ` Frank Li
2025-07-17  7:40   ` Krzysztof Kozlowski
2025-07-17  8:30     ` Wei Fang
2025-07-17  9:05       ` Vladimir Oltean
2025-07-17  9:55         ` Wei Fang
2025-07-17 12:42           ` Vladimir Oltean
2025-07-17 15:06             ` Frank Li
2025-07-22 14:36               ` Vladimir Oltean
2025-07-22 18:25                 ` Frank Li
2025-07-17 10:04       ` Krzysztof Kozlowski
2025-07-17 10:28         ` Wei Fang
2025-07-16  7:30 ` [PATCH v2 net-next 02/14] dt-bindings: net: add nxp,netc-timer property Wei Fang
2025-07-16 19:28   ` Frank Li
2025-07-17  3:23     ` Wei Fang
2025-07-17  7:42   ` Krzysztof Kozlowski
2025-07-17  8:32     ` Wei Fang
2025-07-17  9:12       ` Krzysztof Kozlowski
2025-07-17  9:49         ` Wei Fang
2025-07-17 10:06           ` Krzysztof Kozlowski
2025-07-17 10:26             ` Wei Fang
2025-07-18  7:46               ` Krzysztof Kozlowski
2025-07-18  7:50                 ` Krzysztof Kozlowski
2025-07-18 12:01                 ` Vladimir Oltean
2025-07-21  6:00                   ` Wei Fang
2025-07-21 12:23                   ` Krzysztof Kozlowski
2025-07-16  7:31 ` [PATCH v2 net-next 03/14] ptp: netc: add NETC Timer PTP driver support Wei Fang
2025-07-16 19:58   ` Frank Li
2025-07-17  8:42     ` Wei Fang
2025-07-23 16:09   ` Vladimir Oltean
2025-07-24  2:36     ` Wei Fang
2025-07-16  7:31 ` [PATCH v2 net-next 04/14] ptp: netc: add PTP_CLK_REQ_PPS support Wei Fang
2025-07-16 20:05   ` Frank Li
2025-07-17 11:59     ` Wei Fang
2025-07-17 15:15       ` Frank Li
2025-07-18  2:08         ` Wei Fang
2025-07-16  7:31 ` [PATCH v2 net-next 05/14] ptp: netc: add periodic pulse output support Wei Fang
2025-07-16 20:26   ` Frank Li
2025-07-17 12:11     ` Wei Fang
2025-07-16  7:31 ` [PATCH v2 net-next 06/14] ptp: netc: add external trigger stamp support Wei Fang
2025-07-16 20:30   ` Frank Li [this message]
2025-07-16  7:31 ` [PATCH v2 net-next 07/14] ptp: netc: add debugfs support to loop back pulse signal Wei Fang
2025-07-16 20:32   ` Frank Li
2025-07-16  7:31 ` [PATCH v2 net-next 08/14] MAINTAINERS: add NETC Timer PTP clock driver section Wei Fang
2025-07-16 20:33   ` Frank Li
2025-07-16  7:31 ` [PATCH v2 net-next 09/14] net: enetc: save the parsed information of PTP packet to skb->cb Wei Fang
2025-07-16 20:46   ` Frank Li
2025-07-17 12:20     ` Wei Fang
2025-07-16  7:31 ` [PATCH v2 net-next 10/14] net: enetc: Add enetc_update_ptp_sync_msg() to process PTP sync packet Wei Fang
2025-07-16 20:49   ` Frank Li
2025-07-16  7:31 ` [PATCH v2 net-next 11/14] net: enetc: remove unnecessary CONFIG_FSL_ENETC_PTP_CLOCK check Wei Fang
2025-07-16 20:50   ` Frank Li
2025-07-16  7:31 ` [PATCH v2 net-next 12/14] net: enetc: add PTP synchronization support for ENETC v4 Wei Fang
2025-07-16 21:01   ` Frank Li
2025-07-17 12:35     ` Wei Fang
2025-07-17 22:07       ` Frank Li
2025-07-18  2:08         ` Wei Fang
2025-07-22 12:57           ` Vladimir Oltean
2025-07-22 13:41             ` Wei Fang
2025-07-16  7:31 ` [PATCH v2 net-next 13/14] net: enetc: don't update sync packet checksum if checksum offload is used Wei Fang
2025-07-16 21:03   ` Frank Li
2025-07-16  7:31 ` [PATCH v2 14/14] arm64: dts: imx95: Add NETC Timer support Wei Fang
2025-07-16 21:04   ` Frank Li

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=aHgL4dM2TIeNSCCr@lizhi-Precision-Tower-5810 \
    --to=frank.li@nxp.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=claudiu.manoil@nxp.com \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=festevam@gmail.com \
    --cc=fushi.peng@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=kernel@pengutronix.de \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=richardcochran@gmail.com \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=vadim.fedorenko@linux.dev \
    --cc=vladimir.oltean@nxp.com \
    --cc=wei.fang@nxp.com \
    --cc=xiaoning.wang@nxp.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.