1 .. SPDX-License-Identifier: GPL-2.0 2 3 =========================================== 4 PTP hardware clock infrastructure for Linux 5 =========================================== 6 7 This patch set introduces support for IEEE 1588 PTP clocks in 8 Linux. Together with the SO_TIMESTAMPING socket options, this 9 presents a standardized method for developing PTP user space 10 programs, synchronizing Linux with external clocks, and using the 11 ancillary features of PTP hardware clocks. 12 13 A new class driver exports a kernel interface for specific clock 14 drivers and a user space interface. The infrastructure supports a 15 complete set of PTP hardware clock functionality. 16 17 + Basic clock operations 18 - Set time 19 - Get time 20 - Shift the clock by a given offset atomically 21 - Adjust clock frequency 22 23 + Ancillary clock features 24 - Time stamp external events 25 - Period output signals configurable from user space 26 - Low Pass Filter (LPF) access from user space 27 - Synchronization of the Linux system time via the PPS subsystem 28 29 PTP hardware clock kernel API 30 ============================= 31 32 A PTP clock driver registers itself with the class driver. The 33 class driver handles all of the dealings with user space. The 34 author of a clock driver need only implement the details of 35 programming the clock hardware. The clock driver notifies the class 36 driver of asynchronous events (alarms and external time stamps) via 37 a simple message passing interface. 38 39 The class driver supports multiple PTP clock drivers. In normal use 40 cases, only one PTP clock is needed. However, for testing and 41 development, it can be useful to have more than one clock in a 42 single system, in order to allow performance comparisons. 43 44 PTP hardware clock user space API 45 ================================= 46 47 The class driver also creates a character device for each 48 registered clock. User space can use an open file descriptor from 49 the character device as a POSIX clock id and may call 50 clock_gettime, clock_settime, and clock_adjtime. These calls 51 implement the basic clock operations. 52 53 User space programs may control the clock using standardized 54 ioctls. A program may query, enable, configure, and disable the 55 ancillary clock features. User space can receive time stamped 56 events via blocking read() and poll(). 57 58 Writing clock drivers 59 ===================== 60 61 Clock drivers include include/linux/ptp_clock_kernel.h and register 62 themselves by presenting a 'struct ptp_clock_info' to the 63 registration method. Clock drivers must implement all of the 64 functions in the interface. If a clock does not offer a particular 65 ancillary feature, then the driver should just return -EOPNOTSUPP 66 from those functions. 67 68 Drivers must ensure that all of the methods in interface are 69 reentrant. Since most hardware implementations treat the time value 70 as a 64 bit integer accessed as two 32 bit registers, drivers 71 should use spin_lock_irqsave/spin_unlock_irqrestore to protect 72 against concurrent access. This locking cannot be accomplished in 73 class driver, since the lock may also be needed by the clock 74 driver's interrupt service routine. 75 76 PTP hardware clock requirements for '.adjphase' 77 ----------------------------------------------- 78 79 The 'struct ptp_clock_info' interface has a '.adjphase' function. 80 This function has a set of requirements from the PHC in order to be 81 implemented. 82 83 * The PHC implements a servo algorithm internally that is used to 84 correct the offset passed in the '.adjphase' call. 85 * When other PTP adjustment functions are called, the PHC servo 86 algorithm is disabled. 87 88 **NOTE:** '.adjphase' is not a simple time adjustment functionality 89 that 'jumps' the PHC clock time based on the provided offset. It 90 should correct the offset provided using an internal algorithm. 91 92 Supported hardware 93 ================== 94 95 * Freescale eTSEC gianfar 96 97 - 2 Time stamp external triggers, programmable polarity (opt. interrupt) 98 - 2 Alarm registers (optional interrupt) 99 - 3 Periodic signals (optional interrupt) 100 101 * National DP83640 102 103 - 6 GPIOs programmable as inputs or outputs 104 - 6 GPIOs with dedicated functions (LED/JTAG/clock) can also be 105 used as general inputs or outputs 106 - GPIO inputs can time stamp external triggers 107 - GPIO outputs can produce periodic signals 108 - 1 interrupt pin 109 110 * Intel IXP465 111 112 - Auxiliary Slave/Master Mode Snapshot (optional interrupt) 113 - Target Time (optional interrupt) 114 115 * Renesas (IDT) ClockMatrix™ 116 117 - Up to 4 independent PHC channels 118 - Integrated low pass filter (LPF), access via .adjPhase (compliant to ITU-T G.8273.2) 119 - Programmable output periodic signals 120 - Programmable inputs can time stamp external triggers 121 - Driver and/or hardware configuration through firmware (idtcm.bin) 122 - LPF settings (bandwidth, phase limiting, automatic holdover, physical layer assist (per ITU-T G.8273.2)) 123 - Programmable output PTP clocks, any frequency up to 1GHz (to other PHY/MAC time stampers, refclk to ASSPs/SoCs/FPGAs) 124 - Lock to GNSS input, automatic switching between GNSS and user-space PHC control (optional) 125 126 * NVIDIA Mellanox 127 128 - GPIO 129 - Certain variants of ConnectX-6 Dx and later products support one 130 GPIO which can time stamp external triggers and one GPIO to produce 131 periodic signals. 132 - Certain variants of ConnectX-5 and older products support one GPIO, 133 configured to either time stamp external triggers or produce 134 periodic signals. 135 - PHC instances 136 - All ConnectX devices have a free-running counter 137 - ConnectX-6 Dx and later devices have a UTC format counter
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.