Thread (14 messages) 14 messages, 2 authors, 2025-06-13

Re: [PATCH net-next v8 06/11] net: ti: prueth: Adds HW timestamping support for PTP using PRU-ICSS IEP module

From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Date: 2025-06-11 10:29:54
Also in: linux-arm-kernel, linux-devicetree, lkml

On 10/06/2025 13:32, Parvathi Pudi wrote:
From: Roger Quadros <redacted>

PRU-ICSS IEP module, which is capable of timestamping RX and
TX packets at HW level, is used for time synchronization by PTP4L.

This change includes interaction between firmware and user space
application (ptp4l) with required packet timestamps. The driver
initializes the PRU firmware with appropriate mode and configuration
flags. Firmware updates local registers with the flags set by driver
and uses for further operation. RX SOF timestamp comes along with
packet and firmware will rise interrupt with TX SOF timestamp after
pushing the packet on to the wire.

IEP driver is available in upstream and we are reusing for hardware
configuration for ICSSM as well. On top of that we have extended it
with the changes for AM57xx SoC.

Extended ethtool for reading HW timestamping capability of the PRU
interfaces.

Currently ordinary clock (OC) configuration has been validated with
Linux ptp4l.

Signed-off-by: Roger Quadros <redacted>
Signed-off-by: Andrew F. Davis <redacted>
Signed-off-by: Basharath Hussain Khaja <redacted>
Signed-off-by: Parvathi Pudi <parvathi@couthit.com>
---
  drivers/net/ethernet/ti/icssg/icss_iep.c      |  42 ++
  drivers/net/ethernet/ti/icssm/icssm_ethtool.c |  23 +
  drivers/net/ethernet/ti/icssm/icssm_prueth.c  | 443 +++++++++++++++++-
  drivers/net/ethernet/ti/icssm/icssm_prueth.h  |  11 +
  .../net/ethernet/ti/icssm/icssm_prueth_ptp.h  |  85 ++++
  5 files changed, 602 insertions(+), 2 deletions(-)
  create mode 100644 drivers/net/ethernet/ti/icssm/icssm_prueth_ptp.h
[...]
quoted hunk ↗ jump to hunk
@@ -732,9 +949,22 @@ int icssm_emac_rx_packet(struct prueth_emac *emac, u16 *bd_rd_ptr,
  		src_addr += actual_pkt_len;
  	}
  
+	if (pkt_info->timestamp) {
+		src_addr = (void *)PTR_ALIGN((uintptr_t)src_addr,
+					   ICSS_BLOCK_SIZE);
+		dst_addr = &ts;
+		memcpy(dst_addr, src_addr, sizeof(ts));
+	}
+
  	if (!pkt_info->sv_frame) {
  		skb_put(skb, actual_pkt_len);
  
+		if (icssm_prueth_ptp_rx_ts_is_enabled(emac) &&
+		    pkt_info->timestamp) {
+			ssh = skb_hwtstamps(skb);
+			memset(ssh, 0, sizeof(*ssh));
+			ssh->hwtstamp = ns_to_ktime(ts);
+		}
  		/* send packet up the stack */
  		skb->protocol = eth_type_trans(skb, ndev);
  		netif_receive_skb(skb);
Could you please explain why do you need to copy timestamp to a
temporary variable if you won't use it in some cases? I believe these
2 blocks should be placed under the last if condition and simplified a
bit, like

+		if (icssm_prueth_ptp_rx_ts_is_enabled(emac) &&
+		    pkt_info->timestamp) {
+			src_addr = (void*)PTR_ALIGN((uintptr_t)src_addr,
+					   ICSS_BLOCK_SIZE);
+			memcpy(&ts, src_addr, sizeof(ts));
+			ssh = skb_hwtstamps(skb);
+			ssh->hwtstamp = ns_to_ktime(ts);
+		}

This will avoid useless copy when the packet will be dropped anyway, WDYT?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help