From: Wei Fang <[email protected]> This patch set adds PTP timestamping support to the NETC switch, so that the switch ports can be used for IEEE 1588 PTP synchronization.
The NETC switch has no time registers of its own and instead shares the PTP time of the NETC Timer, which is a separate PCIe function driven by its own driver. The first 3 patches prepare the Timer driver for this role: tidy up its 64-bit register access, drop an ineffective reset, and export netc_timer_get_current_time() so the switch driver can read the current PTP time across the driver boundary in a race-free way. The switch redirects PTP frames to the CPU through the ingress port filter table (IPFT). A few patches harden and simplify the existing IPFT and host flood handling first, then enable the ingress port filtering lookup by default so PTP filter rules take effect without extra software tracking. On top of that groundwork, the switch driver gains RX timestamping and both flavours of TX timestamping. Timestamps are carried between the hardware and the driver through dedicated switch tags: the ingress and transmit timestamps ride in To_Host tags, and per-frame requests ride in To_Port tags. Two-step TX matches a queued skb clone against the timestamp response echoed back by the hardware. One-step TX defers the Sync frame to a per-port work, where the driver reads a fresh PTP time and writes it into the Sync frame's timestamp field, then programs the single-step register and transmits the frame so the hardware can add the residence time to the correction field on the wire. Together these changes let standard user-space PTP stacks drive hardware timestamping on the NETC switch ports. --- v3: 1. Change the prototype of netc_timer_get_current_time(), and check the pdev driver before accessing the driver data 2. Patch 5 is a new patch 3. Add netc_port_tstamp_timeout_work() 4. Check the return value of ntmp_ipft_delete_entry(), and in netc_port_add_ipft_ptp_entry(), check whether the entry already exists in IPFT before creating a new entry 5. Remove netc_port_purge_onestep_queue() from netc_port_disable() 6. Add netc_port_purge_onestep_queue() to netc_onestep_destroy_work() 7. Add try_module_get() to netc_port_onestep_alloc() and add module_put() to netc_onestep_destroy_work() 8. Use consume_skb() instead of the err_free_skb label calls kfree_skb() for NETC_TAG_TH_SUBTYPE2 frames 9. Add subtype check in netc_flow_dissect() and update the comments 10. Check onestep queue length before enqueue 11. Update commit messages v2 link: https://lore.kernel.org/imx/[email protected]/ v1 link: https://lore.kernel.org/imx/[email protected]/ --- Wei Fang (8): ptp: netc: use ioread64_lo_hi/iowrite64_lo_hi for 64-bit register access ptp: netc: remove unnecessary pcie_flr() call in probe ptp: netc: export netc_timer_get_current_time() for cross-driver use net: dsa: netc: use entry ID instead of pointer to track host flood rule net: dsa: netc: check return value of ntmp_ipft_delete_entry() net: dsa: netc: enable ingress port filtering lookup by default net: dsa: netc: add PTP two-step timestamping support net: dsa: netc: add PTP one-step timestamping support drivers/net/dsa/netc/Kconfig | 2 + drivers/net/dsa/netc/Makefile | 3 +- drivers/net/dsa/netc/netc_main.c | 252 +++++-- drivers/net/dsa/netc/netc_platform.c | 1 + drivers/net/dsa/netc/netc_ptp.c | 904 ++++++++++++++++++++++++++ drivers/net/dsa/netc/netc_switch.h | 93 ++- drivers/net/dsa/netc/netc_switch_hw.h | 5 + drivers/ptp/ptp_netc.c | 125 ++-- include/linux/dsa/tag_netc.h | 43 ++ include/linux/fsl/netc_global.h | 10 + net/dsa/tag_netc.c | 236 ++++++- 11 files changed, 1551 insertions(+), 123 deletions(-) create mode 100644 drivers/net/dsa/netc/netc_ptp.c -- 2.34.1
