From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 59F32CA9ED2 for ; Tue, 13 Oct 2026 10:43:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:From:References:Cc:To:Subject:MIME-Version:Date: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=H1bQIwnqjwrC4HcKkZz+4mcyH4UcMmj8uAJCMGfidok=; b=0Va7IiPUJgtuNaS6nZU7xIdPQM rNsTXdBbpRBK1mdq2nKZuKZSmDBdqbR+RG6kct59cEDd0wyd4rfYfhoYfYpuARn8GpIKSuzol2MJi 71DxgkBEcxJ+XjdvOch4Sdaez/6FMI47iEknHnMNTAfPiU0wCM9YQ5s21Bzc5m/fMK1NMpMb/bM6J IyDtX9tT/Ii267tm8HFah67NQG4vKEcCEgferNiezOhR20OPJqH3UUmhu7orCplD2DOXeX0YqOlLQ wj+fnvLQGh01iQiDpY2Xx85NSPGBxaQkUeY2oAVwyzkiMxQfeKRfnQSBWjjLP4186GebV9q4/W7SW QkBQzBTw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xGZyf-0000000CcCy-1ihc; Tue, 13 Oct 2026 10:43:25 +0000 Received: from out-19.mta0.migadu.com ([2001:41d0:1004:224b::13] helo=mta0.migadu.com) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1xGZya-0000000CcBc-45KF for linux-arm-kernel@lists.infradead.org; Tue, 13 Oct 2026 10:43:23 +0000 X-Envelope-To: linux-arm-kernel@lists.infradead.org DKIM-Signature: a=rsa-sha256; bh=ByWSXE/7WPxPiNDq+DRGyvhy49vCl/cF9okG2hZGg/w=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1791888196; v=1; x=1792492996; b=Kf6r3GJs5jBx4fJr0BPFL3eF88FyyQi1jChmXGlaEyNgPwMwFh5kycydk3a42uCgBKkSMiY9 /o6R8ccl7NK/Kbyv+o3c4V6LgcxMPeS8J1ev3wL5HOu4BONbINFzh8nF7J9n0X2r8VvKl2BhpWo X77og7vExEk9JPIt4Zcm9eK4= X-Envelope-To: linux-arm-kernel@lists.infradead.org Received: by smtp.migadu.com with ESMTPS id 8e08e36eb5f4ac01; Tue, 13 Oct 2026 10:43:16 +0000 X-Mizu-Trace-ID: 8e08e36eb5f4ac01 X-Migadu-Flow: FLOW_OUT Message-ID: <5c500376-0573-446d-81cf-70bc38ae4aea@linux.dev> Date: Tue, 13 Oct 2026 11:43:11 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next v2] net: stmmac: ptp: switch to gettimex64() interface To: James Clark , Maxime Chevallier , netdev@vger.kernel.org Cc: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Miroslav Lichvar , Nicolai Buchwitz , Maxime Coquelin , Alexandre Torgue , linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20261008103809.1848255-1-jjc@jclark.com> Content-Language: en-US From: Vadim Fedorenko In-Reply-To: <20261008103809.1848255-1-jjc@jclark.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261013_034321_263859_A0E939A6 X-CRM114-Status: GOOD ( 28.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 08/10/2026 11:38, James Clark wrote: > The stmmac PTP support currently implements the gettime64 callback to > retrieve the hardware clock time. Update the implementation to provide > the gettimex64 callback instead, adding support for the > PTP_SYS_OFFSET_EXTENDED ioctl. > > The system clock readings are taken around the read of the nanoseconds > register in get_systime(), so get_systime() gains a ptp_system_timestamp > argument. > > Reviewed-by: Nicolai Buchwitz > Assisted-by: LLM > Signed-off-by: James Clark > --- > Changes in v2: > - Read PTP_STNSR with readl() and drop the two rmb() calls > (Nicolai Buchwitz, Maxime Chevallier) > - Fix the kernel-doc of stmmac_get_timex() and an over-long line > in stmmac_adjust_time() (netdev CI) > - Link to v1: https://lore.kernel.org/netdev/20261006103610.98277-1-jjc@jclark.com/ > > Tested on a Radxa ZERO 3E (RK3566, DWMAC 4/5) running net-next. > Width of the interval between the two system clock readings > bracketing each PHC read (2000 calls of 25 samples each): > > min median > Before patch (PTP_SYS_OFFSET): 875 ns 1167 ns > After patch (PTP_SYS_OFFSET_EXTENDED): 291 ns 583 ns > > On this board the 24 MHz arch timer counter advances in steps of 7 > (~292 ns), so all intervals are multiples of that. > > drivers/net/ethernet/stmicro/stmmac/hwif.h | 5 ++++- > .../ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 7 +++++-- > .../net/ethernet/stmicro/stmmac/stmmac_ptp.c | 21 ++++++++++--------- > .../stmicro/stmmac/stmmac_selftests.c | 4 ++-- > .../net/ethernet/stmicro/stmmac/stmmac_tc.c | 3 ++- > 5 files changed, 24 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ethernet/stmicro/stmmac/hwif.h > index a8a5c8fdd5e..6efbfe50102 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h > +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h > @@ -493,6 +493,8 @@ struct stmmac_ops { > #define stmmac_fpe_map_preemption_class(__priv, __args...) \ > stmmac_do_callback(__priv, mac, fpe_map_preemption_class, __args) > > +struct ptp_system_timestamp; > + > /* PTP and HW Timer helpers */ > struct stmmac_hwtimestamp { > void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data); > @@ -502,7 +504,8 @@ struct stmmac_hwtimestamp { > int (*config_addend) (void __iomem *ioaddr, u32 addend); > int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec, > int add_sub, int gmac4); > - void (*get_systime) (void __iomem *ioaddr, u64 *systime); > + void (*get_systime)(void __iomem *ioaddr, u64 *systime, > + struct ptp_system_timestamp *sts); > void (*get_ptptime)(void __iomem *ioaddr, u64 *ptp_time); > void (*timestamp_interrupt)(struct stmmac_priv *priv); > void (*hwtstamp_correct_latency)(struct stmmac_priv *priv); > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c > index b9a985fa772..870c740b4a5 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c > @@ -183,7 +183,8 @@ static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec, > 10, 100000); > } > > -static void get_systime(void __iomem *ioaddr, u64 *systime) > +static void get_systime(void __iomem *ioaddr, u64 *systime, > + struct ptp_system_timestamp *sts) > { > u64 ns, sec0, sec1; > > @@ -191,8 +192,10 @@ static void get_systime(void __iomem *ioaddr, u64 *systime) > sec1 = readl_relaxed(ioaddr + PTP_STSR); > do { > sec0 = sec1; > + ptp_read_system_prets(sts); > /* Get the TSSS value */ > - ns = readl_relaxed(ioaddr + PTP_STNSR); > + ns = readl(ioaddr + PTP_STNSR); > + ptp_read_system_postts(sts); > /* Get the TSS value */ > sec1 = readl_relaxed(ioaddr + PTP_STSR); > } while (sec0 != sec1); > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c > index 3bfcc9760dc..e54a3c88782 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c > @@ -89,7 +89,8 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta) > u64 cycle_time; > > mutex_lock(&priv->est_lock); > - priv->ptp_clock_ops.gettime64(&priv->ptp_clock_ops, ¤t_time); > + priv->ptp_clock_ops.gettimex64(&priv->ptp_clock_ops, > + ¤t_time, NULL); > current_time_ns = timespec64_to_ktime(current_time); > time.tv_nsec = priv->est->btr_reserve[0]; > time.tv_sec = priv->est->btr_reserve[1]; > @@ -114,15 +115,15 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta) > } > > /** > - * stmmac_get_time > - * > + * stmmac_get_timex - read the PTP clock, with system timestamps if requested > * @ptp: pointer to ptp_clock_info structure > * @ts: pointer to hold time/result > + * @sts: pointer to hold system timestamps around the read, or NULL > * > - * Description: this function will read the current time from the > - * hardware clock and store it in @ts. > + * Return: 0 > */ > -static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts) > +static int stmmac_get_timex(struct ptp_clock_info *ptp, struct timespec64 *ts, > + struct ptp_system_timestamp *sts) > { > struct stmmac_priv *priv = > container_of(ptp, struct stmmac_priv, ptp_clock_ops); > @@ -130,7 +131,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts) > u64 ns = 0; > > read_lock_irqsave(&priv->ptp_lock, flags); > - stmmac_get_systime(priv, priv->ptpaddr, &ns); > + stmmac_get_systime(priv, priv->ptpaddr, &ns, sts); > read_unlock_irqrestore(&priv->ptp_lock, flags); > > *ts = ns_to_timespec64(ns); > @@ -200,7 +201,7 @@ static int stmmac_enable(struct ptp_clock_info *ptp, > > target_ns = cfg->start.tv_nsec + ((u64)cfg->start.tv_sec * NSEC_PER_SEC); > > - stmmac_get_systime(priv, priv->ptpaddr, &ns); > + stmmac_get_systime(priv, priv->ptpaddr, &ns, NULL); > if (ns > TIME64_MAX - PTP_SAFE_TIME_OFFSET_NS) > return -EINVAL; > > @@ -304,7 +305,7 @@ const struct ptp_clock_info stmmac_ptp_clock_ops = { > .pps = 0, > .adjfine = stmmac_adjust_freq, > .adjtime = stmmac_adjust_time, > - .gettime64 = stmmac_get_time, > + .gettimex64 = stmmac_get_timex, > .settime64 = stmmac_set_time, > .enable = stmmac_enable, > }; > @@ -321,7 +322,7 @@ const struct ptp_clock_info dwmac1000_ptp_clock_ops = { > .pps = 0, > .adjfine = stmmac_adjust_freq, > .adjtime = stmmac_adjust_time, > - .gettime64 = stmmac_get_time, > + .gettimex64 = stmmac_get_timex, > .settime64 = stmmac_set_time, > .enable = dwmac1000_ptp_enable, > }; > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c > index 6097f312fce..2ae4f0e760c 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c > @@ -1778,7 +1778,7 @@ static int stmmac_test_tbs(struct stmmac_priv *priv) > return ret; > > read_lock_irqsave(&priv->ptp_lock, flags); > - stmmac_get_systime(priv, priv->ptpaddr, &curr_time); > + stmmac_get_systime(priv, priv->ptpaddr, &curr_time, NULL); > read_unlock_irqrestore(&priv->ptp_lock, flags); > > if (!curr_time) { > @@ -1800,7 +1800,7 @@ static int stmmac_test_tbs(struct stmmac_priv *priv) > > /* Check if expected time has elapsed */ > read_lock_irqsave(&priv->ptp_lock, flags); > - stmmac_get_systime(priv, priv->ptpaddr, &curr_time); > + stmmac_get_systime(priv, priv->ptpaddr, &curr_time, NULL); > read_unlock_irqrestore(&priv->ptp_lock, flags); > > if ((curr_time - start_time) < STMMAC_TBS_LT_OFFSET) > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c > index 42a00446e9b..57ebeb2c19c 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c > @@ -1070,7 +1070,8 @@ static int tc_taprio_configure(struct stmmac_priv *priv, > > mutex_lock(&priv->est_lock); > /* Adjust for real system time */ > - priv->ptp_clock_ops.gettime64(&priv->ptp_clock_ops, ¤t_time); > + priv->ptp_clock_ops.gettimex64(&priv->ptp_clock_ops, ¤t_time, > + NULL); > current_time_ns = timespec64_to_ktime(current_time); > time = stmmac_calc_tas_basetime(qopt->base_time, current_time_ns, > qopt->cycle_time); Reviewed-by: Vadim Fedorenko