linux-headers (unknown)

(root)/
include/
linux/
ptp_clock.h
       1  /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
       2  /*
       3   * PTP 1588 clock support - user space interface
       4   *
       5   * Copyright (C) 2010 OMICRON electronics GmbH
       6   *
       7   *  This program is free software; you can redistribute it and/or modify
       8   *  it under the terms of the GNU General Public License as published by
       9   *  the Free Software Foundation; either version 2 of the License, or
      10   *  (at your option) any later version.
      11   *
      12   *  This program is distributed in the hope that it will be useful,
      13   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      14   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15   *  GNU General Public License for more details.
      16   *
      17   *  You should have received a copy of the GNU General Public License
      18   *  along with this program; if not, write to the Free Software
      19   *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
      20   */
      21  
      22  #ifndef _PTP_CLOCK_H_
      23  #define _PTP_CLOCK_H_
      24  
      25  #include <linux/ioctl.h>
      26  #include <linux/types.h>
      27  
      28  /*
      29   * Bits of the ptp_extts_request.flags field:
      30   */
      31  #define PTP_ENABLE_FEATURE (1<<0)
      32  #define PTP_RISING_EDGE    (1<<1)
      33  #define PTP_FALLING_EDGE   (1<<2)
      34  #define PTP_STRICT_FLAGS   (1<<3)
      35  #define PTP_EXTTS_EDGES    (PTP_RISING_EDGE | PTP_FALLING_EDGE)
      36  
      37  /*
      38   * flag fields valid for the new PTP_EXTTS_REQUEST2 ioctl.
      39   */
      40  #define PTP_EXTTS_VALID_FLAGS	(PTP_ENABLE_FEATURE |	\
      41  				 PTP_RISING_EDGE |	\
      42  				 PTP_FALLING_EDGE |	\
      43  				 PTP_STRICT_FLAGS)
      44  
      45  /*
      46   * flag fields valid for the original PTP_EXTTS_REQUEST ioctl.
      47   * DO NOT ADD NEW FLAGS HERE.
      48   */
      49  #define PTP_EXTTS_V1_VALID_FLAGS	(PTP_ENABLE_FEATURE |	\
      50  					 PTP_RISING_EDGE |	\
      51  					 PTP_FALLING_EDGE)
      52  
      53  /*
      54   * Bits of the ptp_perout_request.flags field:
      55   */
      56  #define PTP_PEROUT_ONE_SHOT		(1<<0)
      57  #define PTP_PEROUT_DUTY_CYCLE		(1<<1)
      58  #define PTP_PEROUT_PHASE		(1<<2)
      59  
      60  /*
      61   * flag fields valid for the new PTP_PEROUT_REQUEST2 ioctl.
      62   */
      63  #define PTP_PEROUT_VALID_FLAGS		(PTP_PEROUT_ONE_SHOT | \
      64  					 PTP_PEROUT_DUTY_CYCLE | \
      65  					 PTP_PEROUT_PHASE)
      66  
      67  /*
      68   * No flags are valid for the original PTP_PEROUT_REQUEST ioctl
      69   */
      70  #define PTP_PEROUT_V1_VALID_FLAGS	(0)
      71  
      72  /*
      73   * struct ptp_clock_time - represents a time value
      74   *
      75   * The sign of the seconds field applies to the whole value. The
      76   * nanoseconds field is always unsigned. The reserved field is
      77   * included for sub-nanosecond resolution, should the demand for
      78   * this ever appear.
      79   *
      80   */
      81  struct ptp_clock_time {
      82  	__s64 sec;  /* seconds */
      83  	__u32 nsec; /* nanoseconds */
      84  	__u32 reserved;
      85  };
      86  
      87  struct ptp_clock_caps {
      88  	int max_adj;   /* Maximum frequency adjustment in parts per billon. */
      89  	int n_alarm;   /* Number of programmable alarms. */
      90  	int n_ext_ts;  /* Number of external time stamp channels. */
      91  	int n_per_out; /* Number of programmable periodic signals. */
      92  	int pps;       /* Whether the clock supports a PPS callback. */
      93  	int n_pins;    /* Number of input/output pins. */
      94  	/* Whether the clock supports precise system-device cross timestamps */
      95  	int cross_timestamping;
      96  	/* Whether the clock supports adjust phase */
      97  	int adjust_phase;
      98  	int rsv[12];   /* Reserved for future use. */
      99  };
     100  
     101  struct ptp_extts_request {
     102  	unsigned int index;  /* Which channel to configure. */
     103  	unsigned int flags;  /* Bit field for PTP_xxx flags. */
     104  	unsigned int rsv[2]; /* Reserved for future use. */
     105  };
     106  
     107  struct ptp_perout_request {
     108  	union {
     109  		/*
     110  		 * Absolute start time.
     111  		 * Valid only if (flags & PTP_PEROUT_PHASE) is unset.
     112  		 */
     113  		struct ptp_clock_time start;
     114  		/*
     115  		 * Phase offset. The signal should start toggling at an
     116  		 * unspecified integer multiple of the period, plus this value.
     117  		 * The start time should be "as soon as possible".
     118  		 * Valid only if (flags & PTP_PEROUT_PHASE) is set.
     119  		 */
     120  		struct ptp_clock_time phase;
     121  	};
     122  	struct ptp_clock_time period; /* Desired period, zero means disable. */
     123  	unsigned int index;           /* Which channel to configure. */
     124  	unsigned int flags;
     125  	union {
     126  		/*
     127  		 * The "on" time of the signal.
     128  		 * Must be lower than the period.
     129  		 * Valid only if (flags & PTP_PEROUT_DUTY_CYCLE) is set.
     130  		 */
     131  		struct ptp_clock_time on;
     132  		/* Reserved for future use. */
     133  		unsigned int rsv[4];
     134  	};
     135  };
     136  
     137  #define PTP_MAX_SAMPLES 25 /* Maximum allowed offset measurement samples. */
     138  
     139  struct ptp_sys_offset {
     140  	unsigned int n_samples; /* Desired number of measurements. */
     141  	unsigned int rsv[3];    /* Reserved for future use. */
     142  	/*
     143  	 * Array of interleaved system/phc time stamps. The kernel
     144  	 * will provide 2*n_samples + 1 time stamps, with the last
     145  	 * one as a system time stamp.
     146  	 */
     147  	struct ptp_clock_time ts[2 * PTP_MAX_SAMPLES + 1];
     148  };
     149  
     150  struct ptp_sys_offset_extended {
     151  	unsigned int n_samples; /* Desired number of measurements. */
     152  	unsigned int rsv[3];    /* Reserved for future use. */
     153  	/*
     154  	 * Array of [system, phc, system] time stamps. The kernel will provide
     155  	 * 3*n_samples time stamps.
     156  	 */
     157  	struct ptp_clock_time ts[PTP_MAX_SAMPLES][3];
     158  };
     159  
     160  struct ptp_sys_offset_precise {
     161  	struct ptp_clock_time device;
     162  	struct ptp_clock_time sys_realtime;
     163  	struct ptp_clock_time sys_monoraw;
     164  	unsigned int rsv[4];    /* Reserved for future use. */
     165  };
     166  
     167  enum ptp_pin_function {
     168  	PTP_PF_NONE,
     169  	PTP_PF_EXTTS,
     170  	PTP_PF_PEROUT,
     171  	PTP_PF_PHYSYNC,
     172  };
     173  
     174  struct ptp_pin_desc {
     175  	/*
     176  	 * Hardware specific human readable pin name. This field is
     177  	 * set by the kernel during the PTP_PIN_GETFUNC ioctl and is
     178  	 * ignored for the PTP_PIN_SETFUNC ioctl.
     179  	 */
     180  	char name[64];
     181  	/*
     182  	 * Pin index in the range of zero to ptp_clock_caps.n_pins - 1.
     183  	 */
     184  	unsigned int index;
     185  	/*
     186  	 * Which of the PTP_PF_xxx functions to use on this pin.
     187  	 */
     188  	unsigned int func;
     189  	/*
     190  	 * The specific channel to use for this function.
     191  	 * This corresponds to the 'index' field of the
     192  	 * PTP_EXTTS_REQUEST and PTP_PEROUT_REQUEST ioctls.
     193  	 */
     194  	unsigned int chan;
     195  	/*
     196  	 * Reserved for future use.
     197  	 */
     198  	unsigned int rsv[5];
     199  };
     200  
     201  #define PTP_CLK_MAGIC '='
     202  
     203  #define PTP_CLOCK_GETCAPS  _IOR(PTP_CLK_MAGIC, 1, struct ptp_clock_caps)
     204  #define PTP_EXTTS_REQUEST  _IOW(PTP_CLK_MAGIC, 2, struct ptp_extts_request)
     205  #define PTP_PEROUT_REQUEST _IOW(PTP_CLK_MAGIC, 3, struct ptp_perout_request)
     206  #define PTP_ENABLE_PPS     _IOW(PTP_CLK_MAGIC, 4, int)
     207  #define PTP_SYS_OFFSET     _IOW(PTP_CLK_MAGIC, 5, struct ptp_sys_offset)
     208  #define PTP_PIN_GETFUNC    _IOWR(PTP_CLK_MAGIC, 6, struct ptp_pin_desc)
     209  #define PTP_PIN_SETFUNC    _IOW(PTP_CLK_MAGIC, 7, struct ptp_pin_desc)
     210  #define PTP_SYS_OFFSET_PRECISE \
     211  	_IOWR(PTP_CLK_MAGIC, 8, struct ptp_sys_offset_precise)
     212  #define PTP_SYS_OFFSET_EXTENDED \
     213  	_IOWR(PTP_CLK_MAGIC, 9, struct ptp_sys_offset_extended)
     214  
     215  #define PTP_CLOCK_GETCAPS2  _IOR(PTP_CLK_MAGIC, 10, struct ptp_clock_caps)
     216  #define PTP_EXTTS_REQUEST2  _IOW(PTP_CLK_MAGIC, 11, struct ptp_extts_request)
     217  #define PTP_PEROUT_REQUEST2 _IOW(PTP_CLK_MAGIC, 12, struct ptp_perout_request)
     218  #define PTP_ENABLE_PPS2     _IOW(PTP_CLK_MAGIC, 13, int)
     219  #define PTP_SYS_OFFSET2     _IOW(PTP_CLK_MAGIC, 14, struct ptp_sys_offset)
     220  #define PTP_PIN_GETFUNC2    _IOWR(PTP_CLK_MAGIC, 15, struct ptp_pin_desc)
     221  #define PTP_PIN_SETFUNC2    _IOW(PTP_CLK_MAGIC, 16, struct ptp_pin_desc)
     222  #define PTP_SYS_OFFSET_PRECISE2 \
     223  	_IOWR(PTP_CLK_MAGIC, 17, struct ptp_sys_offset_precise)
     224  #define PTP_SYS_OFFSET_EXTENDED2 \
     225  	_IOWR(PTP_CLK_MAGIC, 18, struct ptp_sys_offset_extended)
     226  
     227  struct ptp_extts_event {
     228  	struct ptp_clock_time t; /* Time event occured. */
     229  	unsigned int index;      /* Which channel produced the event. */
     230  	unsigned int flags;      /* Reserved for future use. */
     231  	unsigned int rsv[2];     /* Reserved for future use. */
     232  };
     233  
     234  #endif