* [PATCH net v4] net: ti: icssg-prueth: Fix 1 PPS sync
@ 2024-11-06 7:23 Meghana Malladi
2024-11-07 19:15 ` Jakub Kicinski
0 siblings, 1 reply; 3+ messages in thread
From: Meghana Malladi @ 2024-11-06 7:23 UTC (permalink / raw)
To: vigneshr, horms, m-malladi, jan.kiszka, diogo.ivo, pabeni, kuba,
edumazet, davem, andrew+netdev
Cc: linux-kernel, netdev, linux-arm-kernel, srk, Roger Quadros,
danishanwar
The first PPS latch time needs to be calculated by the driver
(in rounded off seconds) and configured as the start time
offset for the cycle. After synchronizing two PTP clocks
running as master/slave, missing this would cause master
and slave to start immediately with some milliseconds
drift which causes the PPS signal to never synchronize with
the PTP master.
Fixes: 186734c15886 ("net: ti: icssg-prueth: add packet timestamping and ptp support")
Signed-off-by: Meghana Malladi <m-malladi@ti.com>
---
This patch is based on net-next tagged next-2024102.
v3:https://lore.kernel.org/all/20241028111051.1546143-1-m-malladi@ti.com
* Changes since v3 (v4-v3):
- Update read function to handle hi/lo race between reads as
suggested by Jakub Kicinski <kuba@kernel.org>
* Changes since v2 (v3-v2):
- Use hi_lo_writeq() and hi_lo_readq() instead of own helpers
(icssg_readq() & iccsg_writeq()) as asked by Andrew Lunn <andrew@lunn.ch>
- Collected Reviewed-by tags from Vadim and Danish
* Changes since v1 (v2-v1):
- Use roundup() instead of open coding as suggested by Vadim Fedorenko
drivers/net/ethernet/ti/icssg/icssg_prueth.c | 13 +++++++++++--
drivers/net/ethernet/ti/icssg/icssg_prueth.h | 12 ++++++++++++
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/ethernet/ti/icssg/icssg_prueth.c
index 0556910938fa..cae8a4f450bb 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c
@@ -16,6 +16,7 @@
#include <linux/if_hsr.h>
#include <linux/if_vlan.h>
#include <linux/interrupt.h>
+#include <linux/io-64-nonatomic-hi-lo.h>
#include <linux/kernel.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h>
@@ -411,6 +412,8 @@ static int prueth_perout_enable(void *clockops_data,
struct prueth_emac *emac = clockops_data;
u32 reduction_factor = 0, offset = 0;
struct timespec64 ts;
+ u64 current_cycle;
+ u64 start_offset;
u64 ns_period;
if (!on)
@@ -449,8 +452,14 @@ static int prueth_perout_enable(void *clockops_data,
writel(reduction_factor, emac->prueth->shram.va +
TIMESYNC_FW_WC_SYNCOUT_REDUCTION_FACTOR_OFFSET);
- writel(0, emac->prueth->shram.va +
- TIMESYNC_FW_WC_SYNCOUT_START_TIME_CYCLECOUNT_OFFSET);
+ current_cycle = icssg_readq(emac->prueth->shram.va +
+ TIMESYNC_FW_WC_CYCLECOUNT_OFFSET);
+
+ /* Rounding of current_cycle count to next second */
+ start_offset = roundup(current_cycle, MSEC_PER_SEC);
+
+ hi_lo_writeq(start_offset, emac->prueth->shram.va +
+ TIMESYNC_FW_WC_SYNCOUT_START_TIME_CYCLECOUNT_OFFSET);
return 0;
}
diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/ethernet/ti/icssg/icssg_prueth.h
index 8722bb4a268a..5c194c6991bf 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h
+++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h
@@ -330,6 +330,18 @@ static inline int prueth_emac_slice(struct prueth_emac *emac)
extern const struct ethtool_ops icssg_ethtool_ops;
extern const struct dev_pm_ops prueth_dev_pm_ops;
+static inline __u64 icssg_readq(const void __iomem *addr)
+{
+ u32 low, high;
+
+ do {
+ high = readl(addr + 4);
+ low = readl(addr);
+ } while (high != readl(addr + 4));
+
+ return low + ((u64)high << 32);
+}
+
/* Classifier helpers */
void icssg_class_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac);
void icssg_class_set_host_mac_addr(struct regmap *miig_rt, const u8 *mac);
base-commit: 73840ca5ef361f143b89edd5368a1aa8c2979241
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH net v4] net: ti: icssg-prueth: Fix 1 PPS sync
2024-11-06 7:23 [PATCH net v4] net: ti: icssg-prueth: Fix 1 PPS sync Meghana Malladi
@ 2024-11-07 19:15 ` Jakub Kicinski
2024-11-11 10:12 ` Meghana Malladi
0 siblings, 1 reply; 3+ messages in thread
From: Jakub Kicinski @ 2024-11-07 19:15 UTC (permalink / raw)
To: Meghana Malladi
Cc: vigneshr, horms, jan.kiszka, diogo.ivo, pabeni, edumazet, davem,
andrew+netdev, linux-kernel, netdev, linux-arm-kernel, srk,
Roger Quadros, danishanwar
On Wed, 6 Nov 2024 12:53:14 +0530 Meghana Malladi wrote:
> +static inline __u64 icssg_readq(const void __iomem *addr)
two nit picks:
- since the function is now fairly special purpose I think a name less
generic than readq would be appropriate. Maybe icssg_read_time() ?
- __u64 is for uAPI, to avoid type name conflicts, in the kernel
please use u64 without the underscores
--
pw-bot: cr
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net v4] net: ti: icssg-prueth: Fix 1 PPS sync
2024-11-07 19:15 ` Jakub Kicinski
@ 2024-11-11 10:12 ` Meghana Malladi
0 siblings, 0 replies; 3+ messages in thread
From: Meghana Malladi @ 2024-11-11 10:12 UTC (permalink / raw)
To: Jakub Kicinski
Cc: vigneshr, horms, jan.kiszka, diogo.ivo, pabeni, edumazet, davem,
andrew+netdev, linux-kernel, netdev, linux-arm-kernel, srk,
Roger Quadros, danishanwar
On 08/11/24 00:45, Jakub Kicinski wrote:
> On Wed, 6 Nov 2024 12:53:14 +0530 Meghana Malladi wrote:
>> +static inline __u64 icssg_readq(const void __iomem *addr)
>
> two nit picks:
> - since the function is now fairly special purpose I think a name less
> generic than readq would be appropriate. Maybe icssg_read_time() ?
> - __u64 is for uAPI, to avoid type name conflicts, in the kernel
> please use u64 without the underscores
Yeah sure, I have updated it.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-11-11 10:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-06 7:23 [PATCH net v4] net: ti: icssg-prueth: Fix 1 PPS sync Meghana Malladi
2024-11-07 19:15 ` Jakub Kicinski
2024-11-11 10:12 ` Meghana Malladi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).