mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
![Richard Cochran](/assets/img/avatar_default.png)
This patch adds an ioctl for PTP Hardware Clock (PHC) devices that allows user space to measure the time offset between the PHC and the system clock. Rather than hard coding any kind of estimation algorithm into the kernel, this patch takes the more flexible approach of just delivering an array of raw clock readings. In that way, the user space clock servo may be adapted to new and different hardware clocks. Signed-off-by: Richard Cochran <richardcochran@gmail.com> Acked-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
98 lines
3.4 KiB
C
98 lines
3.4 KiB
C
/*
|
|
* PTP 1588 clock support - user space interface
|
|
*
|
|
* Copyright (C) 2010 OMICRON electronics GmbH
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#ifndef _PTP_CLOCK_H_
|
|
#define _PTP_CLOCK_H_
|
|
|
|
#include <linux/ioctl.h>
|
|
#include <linux/types.h>
|
|
|
|
/* PTP_xxx bits, for the flags field within the request structures. */
|
|
#define PTP_ENABLE_FEATURE (1<<0)
|
|
#define PTP_RISING_EDGE (1<<1)
|
|
#define PTP_FALLING_EDGE (1<<2)
|
|
|
|
/*
|
|
* struct ptp_clock_time - represents a time value
|
|
*
|
|
* The sign of the seconds field applies to the whole value. The
|
|
* nanoseconds field is always unsigned. The reserved field is
|
|
* included for sub-nanosecond resolution, should the demand for
|
|
* this ever appear.
|
|
*
|
|
*/
|
|
struct ptp_clock_time {
|
|
__s64 sec; /* seconds */
|
|
__u32 nsec; /* nanoseconds */
|
|
__u32 reserved;
|
|
};
|
|
|
|
struct ptp_clock_caps {
|
|
int max_adj; /* Maximum frequency adjustment in parts per billon. */
|
|
int n_alarm; /* Number of programmable alarms. */
|
|
int n_ext_ts; /* Number of external time stamp channels. */
|
|
int n_per_out; /* Number of programmable periodic signals. */
|
|
int pps; /* Whether the clock supports a PPS callback. */
|
|
int rsv[15]; /* Reserved for future use. */
|
|
};
|
|
|
|
struct ptp_extts_request {
|
|
unsigned int index; /* Which channel to configure. */
|
|
unsigned int flags; /* Bit field for PTP_xxx flags. */
|
|
unsigned int rsv[2]; /* Reserved for future use. */
|
|
};
|
|
|
|
struct ptp_perout_request {
|
|
struct ptp_clock_time start; /* Absolute start time. */
|
|
struct ptp_clock_time period; /* Desired period, zero means disable. */
|
|
unsigned int index; /* Which channel to configure. */
|
|
unsigned int flags; /* Reserved for future use. */
|
|
unsigned int rsv[4]; /* Reserved for future use. */
|
|
};
|
|
|
|
#define PTP_MAX_SAMPLES 25 /* Maximum allowed offset measurement samples. */
|
|
|
|
struct ptp_sys_offset {
|
|
unsigned int n_samples; /* Desired number of measurements. */
|
|
unsigned int rsv[3]; /* Reserved for future use. */
|
|
/*
|
|
* Array of interleaved system/phc time stamps. The kernel
|
|
* will provide 2*n_samples + 1 time stamps, with the last
|
|
* one as a system time stamp.
|
|
*/
|
|
struct ptp_clock_time ts[2 * PTP_MAX_SAMPLES + 1];
|
|
};
|
|
|
|
#define PTP_CLK_MAGIC '='
|
|
|
|
#define PTP_CLOCK_GETCAPS _IOR(PTP_CLK_MAGIC, 1, struct ptp_clock_caps)
|
|
#define PTP_EXTTS_REQUEST _IOW(PTP_CLK_MAGIC, 2, struct ptp_extts_request)
|
|
#define PTP_PEROUT_REQUEST _IOW(PTP_CLK_MAGIC, 3, struct ptp_perout_request)
|
|
#define PTP_ENABLE_PPS _IOW(PTP_CLK_MAGIC, 4, int)
|
|
#define PTP_SYS_OFFSET _IOW(PTP_CLK_MAGIC, 5, struct ptp_sys_offset)
|
|
|
|
struct ptp_extts_event {
|
|
struct ptp_clock_time t; /* Time event occured. */
|
|
unsigned int index; /* Which channel produced the event. */
|
|
unsigned int flags; /* Reserved for future use. */
|
|
unsigned int rsv[2]; /* Reserved for future use. */
|
|
};
|
|
|
|
#endif
|