forked from microsoft/WSL2-Linux-Kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ptp: Added a brand new class driver for ptp clocks.
This patch adds an infrastructure for hardware clocks that implement IEEE 1588, the Precision Time Protocol (PTP). A class driver offers a registration method to particular hardware clock drivers. Each clock is presented as a standard POSIX clock. The ancillary clock features are exposed in two different ways, via the sysfs and by a character device. Signed-off-by: Richard Cochran <richard.cochran@omicron.at> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: John Stultz <john.stultz@linaro.org>
- Loading branch information
1 parent
caebc16
commit d94ba80
Showing
16 changed files
with
1,695 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
What: /sys/class/ptp/ | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This directory contains files and directories | ||
providing a standardized interface to the ancillary | ||
features of PTP hardware clocks. | ||
|
||
What: /sys/class/ptp/ptpN/ | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This directory contains the attributes of the Nth PTP | ||
hardware clock registered into the PTP class driver | ||
subsystem. | ||
|
||
What: /sys/class/ptp/ptpN/clock_name | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file contains the name of the PTP hardware clock | ||
as a human readable string. | ||
|
||
What: /sys/class/ptp/ptpN/max_adjustment | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file contains the PTP hardware clock's maximum | ||
frequency adjustment value (a positive integer) in | ||
parts per billion. | ||
|
||
What: /sys/class/ptp/ptpN/n_alarms | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file contains the number of periodic or one shot | ||
alarms offer by the PTP hardware clock. | ||
|
||
What: /sys/class/ptp/ptpN/n_external_timestamps | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file contains the number of external timestamp | ||
channels offered by the PTP hardware clock. | ||
|
||
What: /sys/class/ptp/ptpN/n_periodic_outputs | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file contains the number of programmable periodic | ||
output channels offered by the PTP hardware clock. | ||
|
||
What: /sys/class/ptp/ptpN/pps_avaiable | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file indicates whether the PTP hardware clock | ||
supports a Pulse Per Second to the host CPU. Reading | ||
"1" means that the PPS is supported, while "0" means | ||
not supported. | ||
|
||
What: /sys/class/ptp/ptpN/extts_enable | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This write-only file enables or disables external | ||
timestamps. To enable external timestamps, write the | ||
channel index followed by a "1" into the file. | ||
To disable external timestamps, write the channel | ||
index followed by a "0" into the file. | ||
|
||
What: /sys/class/ptp/ptpN/fifo | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This file provides timestamps on external events, in | ||
the form of three integers: channel index, seconds, | ||
and nanoseconds. | ||
|
||
What: /sys/class/ptp/ptpN/period | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This write-only file enables or disables periodic | ||
outputs. To enable a periodic output, write five | ||
integers into the file: channel index, start time | ||
seconds, start time nanoseconds, period seconds, and | ||
period nanoseconds. To disable a periodic output, set | ||
all the seconds and nanoseconds values to zero. | ||
|
||
What: /sys/class/ptp/ptpN/pps_enable | ||
Date: September 2010 | ||
Contact: Richard Cochran <richardcochran@gmail.com> | ||
Description: | ||
This write-only file enables or disables delivery of | ||
PPS events to the Linux PPS subsystem. To enable PPS | ||
events, write a "1" into the file. To disable events, | ||
write a "0" into the file. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
|
||
* PTP hardware clock infrastructure for Linux | ||
|
||
This patch set introduces support for IEEE 1588 PTP clocks in | ||
Linux. Together with the SO_TIMESTAMPING socket options, this | ||
presents a standardized method for developing PTP user space | ||
programs, synchronizing Linux with external clocks, and using the | ||
ancillary features of PTP hardware clocks. | ||
|
||
A new class driver exports a kernel interface for specific clock | ||
drivers and a user space interface. The infrastructure supports a | ||
complete set of PTP hardware clock functionality. | ||
|
||
+ Basic clock operations | ||
- Set time | ||
- Get time | ||
- Shift the clock by a given offset atomically | ||
- Adjust clock frequency | ||
|
||
+ Ancillary clock features | ||
- One short or periodic alarms, with signal delivery to user program | ||
- Time stamp external events | ||
- Period output signals configurable from user space | ||
- Synchronization of the Linux system time via the PPS subsystem | ||
|
||
** PTP hardware clock kernel API | ||
|
||
A PTP clock driver registers itself with the class driver. The | ||
class driver handles all of the dealings with user space. The | ||
author of a clock driver need only implement the details of | ||
programming the clock hardware. The clock driver notifies the class | ||
driver of asynchronous events (alarms and external time stamps) via | ||
a simple message passing interface. | ||
|
||
The class driver supports multiple PTP clock drivers. In normal use | ||
cases, only one PTP clock is needed. However, for testing and | ||
development, it can be useful to have more than one clock in a | ||
single system, in order to allow performance comparisons. | ||
|
||
** PTP hardware clock user space API | ||
|
||
The class driver also creates a character device for each | ||
registered clock. User space can use an open file descriptor from | ||
the character device as a POSIX clock id and may call | ||
clock_gettime, clock_settime, and clock_adjtime. These calls | ||
implement the basic clock operations. | ||
|
||
User space programs may control the clock using standardized | ||
ioctls. A program may query, enable, configure, and disable the | ||
ancillary clock features. User space can receive time stamped | ||
events via blocking read() and poll(). One shot and periodic | ||
signals may be configured via the POSIX timer_settime() system | ||
call. | ||
|
||
** Writing clock drivers | ||
|
||
Clock drivers include include/linux/ptp_clock_kernel.h and register | ||
themselves by presenting a 'struct ptp_clock_info' to the | ||
registration method. Clock drivers must implement all of the | ||
functions in the interface. If a clock does not offer a particular | ||
ancillary feature, then the driver should just return -EOPNOTSUPP | ||
from those functions. | ||
|
||
Drivers must ensure that all of the methods in interface are | ||
reentrant. Since most hardware implementations treat the time value | ||
as a 64 bit integer accessed as two 32 bit registers, drivers | ||
should use spin_lock_irqsave/spin_unlock_irqrestore to protect | ||
against concurrent access. This locking cannot be accomplished in | ||
class driver, since the lock may also be needed by the clock | ||
driver's interrupt service routine. | ||
|
||
** Supported hardware | ||
|
||
+ Freescale eTSEC gianfar | ||
- 2 Time stamp external triggers, programmable polarity (opt. interrupt) | ||
- 2 Alarm registers (optional interrupt) | ||
- 3 Periodic signals (optional interrupt) | ||
|
||
+ National DP83640 | ||
- 6 GPIOs programmable as inputs or outputs | ||
- 6 GPIOs with dedicated functions (LED/JTAG/clock) can also be | ||
used as general inputs or outputs | ||
- GPIO inputs can time stamp external triggers | ||
- GPIO outputs can produce periodic signals | ||
- 1 interrupt pin | ||
|
||
+ Intel IXP465 | ||
- Auxiliary Slave/Master Mode Snapshot (optional interrupt) | ||
- Target Time (optional interrupt) |
Oops, something went wrong.