15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes/*
25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * PTP 1588 clock support - user space interface
35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
4dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes * Copyright (c) 2010 OMICRON electronics GmbH
539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2010-2017 The strace developers.
65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  This program is free software; you can redistribute it and/or modify
85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  it under the terms of the GNU General Public License as published by
95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  the Free Software Foundation; either version 2 of the License, or
105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  (at your option) any later version.
115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  This program is distributed in the hope that it will be useful,
135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  but WITHOUT ANY WARRANTY; without even the implied warranty of
145dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  GNU General Public License for more details.
165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  You should have received a copy of the GNU General Public License
185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  along with this program; if not, write to the Free Software
195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes */
215dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#ifndef _PTP_CLOCK_H_
235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define _PTP_CLOCK_H_
245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <linux/ioctl.h>
265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <linux/types.h>
275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
285dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes/* PTP_xxx bits, for the flags field within the request structures. */
295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_ENABLE_FEATURE (1<<0)
305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_RISING_EDGE    (1<<1)
315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_FALLING_EDGE   (1<<2)
325dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
335dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes/*
345dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * struct ptp_clock_time - represents a time value
355dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
365dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * The sign of the seconds field applies to the whole value. The
375dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * nanoseconds field is always unsigned. The reserved field is
385dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * included for sub-nanosecond resolution, should the demand for
395dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * this ever appear.
405dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes *
415dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes */
425dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_clock_time {
435dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	__s64 sec;  /* seconds */
445dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	__u32 nsec; /* nanoseconds */
455dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	__u32 reserved;
465dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
475dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
485dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_clock_caps {
495dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int max_adj;   /* Maximum frequency adjustment in parts per billon. */
505dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int n_alarm;   /* Number of programmable alarms. */
515dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int n_ext_ts;  /* Number of external time stamp channels. */
525dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int n_per_out; /* Number of programmable periodic signals. */
535dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int pps;       /* Whether the clock supports a PPS callback. */
545dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	int rsv[15];   /* Reserved for future use. */
555dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
565dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
575dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_extts_request {
585dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int index;  /* Which channel to configure. */
595dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int flags;  /* Bit field for PTP_xxx flags. */
605dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int rsv[2]; /* Reserved for future use. */
615dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
625dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
635dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_perout_request {
645dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	struct ptp_clock_time start;  /* Absolute start time. */
655dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	struct ptp_clock_time period; /* Desired period, zero means disable. */
665dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int index;           /* Which channel to configure. */
675dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int flags;           /* Reserved for future use. */
685dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int rsv[4];          /* Reserved for future use. */
695dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
705dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
715dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_MAX_SAMPLES 25 /* Maximum allowed offset measurement samples. */
725dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
735dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_sys_offset {
745dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int n_samples; /* Desired number of measurements. */
755dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int rsv[3];    /* Reserved for future use. */
765dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	/*
775dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	 * Array of interleaved system/phc time stamps. The kernel
785dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	 * will provide 2*n_samples + 1 time stamps, with the last
795dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	 * one as a system time stamp.
805dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	 */
815dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	struct ptp_clock_time ts[2 * PTP_MAX_SAMPLES + 1];
825dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
835dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
845dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_CLK_MAGIC '='
855dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
865dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_CLOCK_GETCAPS  _IOR(PTP_CLK_MAGIC, 1, struct ptp_clock_caps)
875dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_EXTTS_REQUEST  _IOW(PTP_CLK_MAGIC, 2, struct ptp_extts_request)
885dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_PEROUT_REQUEST _IOW(PTP_CLK_MAGIC, 3, struct ptp_perout_request)
895dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_ENABLE_PPS     _IOW(PTP_CLK_MAGIC, 4, int)
905dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#define PTP_SYS_OFFSET     _IOW(PTP_CLK_MAGIC, 5, struct ptp_sys_offset)
915dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
925dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstruct ptp_extts_event {
93dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	struct ptp_clock_time t; /* Time event occurred. */
945dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int index;      /* Which channel produced the event. */
955dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int flags;      /* Reserved for future use. */
965dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	unsigned int rsv[2];     /* Reserved for future use. */
975dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes};
985dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
995dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#endif
100