cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ptp_clock_kernel.h (14324B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * PTP 1588 clock support
      4 *
      5 * Copyright (C) 2010 OMICRON electronics GmbH
      6 */
      7
      8#ifndef _PTP_CLOCK_KERNEL_H_
      9#define _PTP_CLOCK_KERNEL_H_
     10
     11#include <linux/device.h>
     12#include <linux/pps_kernel.h>
     13#include <linux/ptp_clock.h>
     14#include <linux/timecounter.h>
     15#include <linux/skbuff.h>
     16
     17#define PTP_CLOCK_NAME_LEN	32
     18/**
     19 * struct ptp_clock_request - request PTP clock event
     20 *
     21 * @type:   The type of the request.
     22 *	    EXTTS:  Configure external trigger timestamping
     23 *	    PEROUT: Configure periodic output signal (e.g. PPS)
     24 *	    PPS:    trigger internal PPS event for input
     25 *	            into kernel PPS subsystem
     26 * @extts:  describes configuration for external trigger timestamping.
     27 *          This is only valid when event == PTP_CLK_REQ_EXTTS.
     28 * @perout: describes configuration for periodic output.
     29 *	    This is only valid when event == PTP_CLK_REQ_PEROUT.
     30 */
     31
     32struct ptp_clock_request {
     33	enum {
     34		PTP_CLK_REQ_EXTTS,
     35		PTP_CLK_REQ_PEROUT,
     36		PTP_CLK_REQ_PPS,
     37	} type;
     38	union {
     39		struct ptp_extts_request extts;
     40		struct ptp_perout_request perout;
     41	};
     42};
     43
     44struct system_device_crosststamp;
     45
     46/**
     47 * struct ptp_system_timestamp - system time corresponding to a PHC timestamp
     48 */
     49struct ptp_system_timestamp {
     50	struct timespec64 pre_ts;
     51	struct timespec64 post_ts;
     52};
     53
     54/**
     55 * struct ptp_clock_info - describes a PTP hardware clock
     56 *
     57 * @owner:     The clock driver should set to THIS_MODULE.
     58 * @name:      A short "friendly name" to identify the clock and to
     59 *             help distinguish PHY based devices from MAC based ones.
     60 *             The string is not meant to be a unique id.
     61 * @max_adj:   The maximum possible frequency adjustment, in parts per billon.
     62 * @n_alarm:   The number of programmable alarms.
     63 * @n_ext_ts:  The number of external time stamp channels.
     64 * @n_per_out: The number of programmable periodic signals.
     65 * @n_pins:    The number of programmable pins.
     66 * @pps:       Indicates whether the clock supports a PPS callback.
     67 * @pin_config: Array of length 'n_pins'. If the number of
     68 *              programmable pins is nonzero, then drivers must
     69 *              allocate and initialize this array.
     70 *
     71 * clock operations
     72 *
     73 * @adjfine:  Adjusts the frequency of the hardware clock.
     74 *            parameter scaled_ppm: Desired frequency offset from
     75 *            nominal frequency in parts per million, but with a
     76 *            16 bit binary fractional field.
     77 *
     78 * @adjfreq:  Adjusts the frequency of the hardware clock.
     79 *            This method is deprecated.  New drivers should implement
     80 *            the @adjfine method instead.
     81 *            parameter delta: Desired frequency offset from nominal frequency
     82 *            in parts per billion
     83 *
     84 * @adjphase:  Adjusts the phase offset of the hardware clock.
     85 *             parameter delta: Desired change in nanoseconds.
     86 *
     87 * @adjtime:  Shifts the time of the hardware clock.
     88 *            parameter delta: Desired change in nanoseconds.
     89 *
     90 * @gettime64:  Reads the current time from the hardware clock.
     91 *              This method is deprecated.  New drivers should implement
     92 *              the @gettimex64 method instead.
     93 *              parameter ts: Holds the result.
     94 *
     95 * @gettimex64:  Reads the current time from the hardware clock and optionally
     96 *               also the system clock.
     97 *               parameter ts: Holds the PHC timestamp.
     98 *               parameter sts: If not NULL, it holds a pair of timestamps from
     99 *               the system clock. The first reading is made right before
    100 *               reading the lowest bits of the PHC timestamp and the second
    101 *               reading immediately follows that.
    102 *
    103 * @getcrosststamp:  Reads the current time from the hardware clock and
    104 *                   system clock simultaneously.
    105 *                   parameter cts: Contains timestamp (device,system) pair,
    106 *                   where system time is realtime and monotonic.
    107 *
    108 * @settime64:  Set the current time on the hardware clock.
    109 *              parameter ts: Time value to set.
    110 *
    111 * @getcycles64:  Reads the current free running cycle counter from the hardware
    112 *                clock.
    113 *                If @getcycles64 and @getcyclesx64 are not supported, then
    114 *                @gettime64 or @gettimex64 will be used as default
    115 *                implementation.
    116 *                parameter ts: Holds the result.
    117 *
    118 * @getcyclesx64:  Reads the current free running cycle counter from the
    119 *                 hardware clock and optionally also the system clock.
    120 *                 If @getcycles64 and @getcyclesx64 are not supported, then
    121 *                 @gettimex64 will be used as default implementation if
    122 *                 available.
    123 *                 parameter ts: Holds the PHC timestamp.
    124 *                 parameter sts: If not NULL, it holds a pair of timestamps
    125 *                 from the system clock. The first reading is made right before
    126 *                 reading the lowest bits of the PHC timestamp and the second
    127 *                 reading immediately follows that.
    128 *
    129 * @getcrosscycles:  Reads the current free running cycle counter from the
    130 *                   hardware clock and system clock simultaneously.
    131 *                   If @getcycles64 and @getcyclesx64 are not supported, then
    132 *                   @getcrosststamp will be used as default implementation if
    133 *                   available.
    134 *                   parameter cts: Contains timestamp (device,system) pair,
    135 *                   where system time is realtime and monotonic.
    136 *
    137 * @enable:   Request driver to enable or disable an ancillary feature.
    138 *            parameter request: Desired resource to enable or disable.
    139 *            parameter on: Caller passes one to enable or zero to disable.
    140 *
    141 * @verify:   Confirm that a pin can perform a given function. The PTP
    142 *            Hardware Clock subsystem maintains the 'pin_config'
    143 *            array on behalf of the drivers, but the PHC subsystem
    144 *            assumes that every pin can perform every function. This
    145 *            hook gives drivers a way of telling the core about
    146 *            limitations on specific pins. This function must return
    147 *            zero if the function can be assigned to this pin, and
    148 *            nonzero otherwise.
    149 *            parameter pin: index of the pin in question.
    150 *            parameter func: the desired function to use.
    151 *            parameter chan: the function channel index to use.
    152 *
    153 * @do_aux_work:  Request driver to perform auxiliary (periodic) operations
    154 *                Driver should return delay of the next auxiliary work
    155 *                scheduling time (>=0) or negative value in case further
    156 *                scheduling is not required.
    157 *
    158 * Drivers should embed their ptp_clock_info within a private
    159 * structure, obtaining a reference to it using container_of().
    160 *
    161 * The callbacks must all return zero on success, non-zero otherwise.
    162 */
    163
    164struct ptp_clock_info {
    165	struct module *owner;
    166	char name[PTP_CLOCK_NAME_LEN];
    167	s32 max_adj;
    168	int n_alarm;
    169	int n_ext_ts;
    170	int n_per_out;
    171	int n_pins;
    172	int pps;
    173	struct ptp_pin_desc *pin_config;
    174	int (*adjfine)(struct ptp_clock_info *ptp, long scaled_ppm);
    175	int (*adjfreq)(struct ptp_clock_info *ptp, s32 delta);
    176	int (*adjphase)(struct ptp_clock_info *ptp, s32 phase);
    177	int (*adjtime)(struct ptp_clock_info *ptp, s64 delta);
    178	int (*gettime64)(struct ptp_clock_info *ptp, struct timespec64 *ts);
    179	int (*gettimex64)(struct ptp_clock_info *ptp, struct timespec64 *ts,
    180			  struct ptp_system_timestamp *sts);
    181	int (*getcrosststamp)(struct ptp_clock_info *ptp,
    182			      struct system_device_crosststamp *cts);
    183	int (*settime64)(struct ptp_clock_info *p, const struct timespec64 *ts);
    184	int (*getcycles64)(struct ptp_clock_info *ptp, struct timespec64 *ts);
    185	int (*getcyclesx64)(struct ptp_clock_info *ptp, struct timespec64 *ts,
    186			    struct ptp_system_timestamp *sts);
    187	int (*getcrosscycles)(struct ptp_clock_info *ptp,
    188			      struct system_device_crosststamp *cts);
    189	int (*enable)(struct ptp_clock_info *ptp,
    190		      struct ptp_clock_request *request, int on);
    191	int (*verify)(struct ptp_clock_info *ptp, unsigned int pin,
    192		      enum ptp_pin_function func, unsigned int chan);
    193	long (*do_aux_work)(struct ptp_clock_info *ptp);
    194};
    195
    196struct ptp_clock;
    197
    198enum ptp_clock_events {
    199	PTP_CLOCK_ALARM,
    200	PTP_CLOCK_EXTTS,
    201	PTP_CLOCK_PPS,
    202	PTP_CLOCK_PPSUSR,
    203};
    204
    205/**
    206 * struct ptp_clock_event - decribes a PTP hardware clock event
    207 *
    208 * @type:  One of the ptp_clock_events enumeration values.
    209 * @index: Identifies the source of the event.
    210 * @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only).
    211 * @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only).
    212 */
    213
    214struct ptp_clock_event {
    215	int type;
    216	int index;
    217	union {
    218		u64 timestamp;
    219		struct pps_event_time pps_times;
    220	};
    221};
    222
    223/**
    224 * scaled_ppm_to_ppb() - convert scaled ppm to ppb
    225 *
    226 * @ppm:    Parts per million, but with a 16 bit binary fractional field
    227 */
    228static inline long scaled_ppm_to_ppb(long ppm)
    229{
    230	/*
    231	 * The 'freq' field in the 'struct timex' is in parts per
    232	 * million, but with a 16 bit binary fractional field.
    233	 *
    234	 * We want to calculate
    235	 *
    236	 *    ppb = scaled_ppm * 1000 / 2^16
    237	 *
    238	 * which simplifies to
    239	 *
    240	 *    ppb = scaled_ppm * 125 / 2^13
    241	 */
    242	s64 ppb = 1 + ppm;
    243
    244	ppb *= 125;
    245	ppb >>= 13;
    246	return (long)ppb;
    247}
    248
    249#if IS_ENABLED(CONFIG_PTP_1588_CLOCK)
    250
    251/**
    252 * ptp_clock_register() - register a PTP hardware clock driver
    253 *
    254 * @info:   Structure describing the new clock.
    255 * @parent: Pointer to the parent device of the new clock.
    256 *
    257 * Returns a valid pointer on success or PTR_ERR on failure.  If PHC
    258 * support is missing at the configuration level, this function
    259 * returns NULL, and drivers are expected to gracefully handle that
    260 * case separately.
    261 */
    262
    263extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
    264					    struct device *parent);
    265
    266/**
    267 * ptp_clock_unregister() - unregister a PTP hardware clock driver
    268 *
    269 * @ptp:  The clock to remove from service.
    270 */
    271
    272extern int ptp_clock_unregister(struct ptp_clock *ptp);
    273
    274/**
    275 * ptp_clock_event() - notify the PTP layer about an event
    276 *
    277 * @ptp:    The clock obtained from ptp_clock_register().
    278 * @event:  Message structure describing the event.
    279 */
    280
    281extern void ptp_clock_event(struct ptp_clock *ptp,
    282			    struct ptp_clock_event *event);
    283
    284/**
    285 * ptp_clock_index() - obtain the device index of a PTP clock
    286 *
    287 * @ptp:    The clock obtained from ptp_clock_register().
    288 */
    289
    290extern int ptp_clock_index(struct ptp_clock *ptp);
    291
    292/**
    293 * ptp_find_pin() - obtain the pin index of a given auxiliary function
    294 *
    295 * The caller must hold ptp_clock::pincfg_mux.  Drivers do not have
    296 * access to that mutex as ptp_clock is an opaque type.  However, the
    297 * core code acquires the mutex before invoking the driver's
    298 * ptp_clock_info::enable() callback, and so drivers may call this
    299 * function from that context.
    300 *
    301 * @ptp:    The clock obtained from ptp_clock_register().
    302 * @func:   One of the ptp_pin_function enumerated values.
    303 * @chan:   The particular functional channel to find.
    304 * Return:  Pin index in the range of zero to ptp_clock_caps.n_pins - 1,
    305 *          or -1 if the auxiliary function cannot be found.
    306 */
    307
    308int ptp_find_pin(struct ptp_clock *ptp,
    309		 enum ptp_pin_function func, unsigned int chan);
    310
    311/**
    312 * ptp_find_pin_unlocked() - wrapper for ptp_find_pin()
    313 *
    314 * This function acquires the ptp_clock::pincfg_mux mutex before
    315 * invoking ptp_find_pin().  Instead of using this function, drivers
    316 * should most likely call ptp_find_pin() directly from their
    317 * ptp_clock_info::enable() method.
    318 *
    319 */
    320
    321int ptp_find_pin_unlocked(struct ptp_clock *ptp,
    322			  enum ptp_pin_function func, unsigned int chan);
    323
    324/**
    325 * ptp_schedule_worker() - schedule ptp auxiliary work
    326 *
    327 * @ptp:    The clock obtained from ptp_clock_register().
    328 * @delay:  number of jiffies to wait before queuing
    329 *          See kthread_queue_delayed_work() for more info.
    330 */
    331
    332int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay);
    333
    334/**
    335 * ptp_cancel_worker_sync() - cancel ptp auxiliary clock
    336 *
    337 * @ptp:     The clock obtained from ptp_clock_register().
    338 */
    339void ptp_cancel_worker_sync(struct ptp_clock *ptp);
    340
    341#else
    342static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
    343						   struct device *parent)
    344{ return NULL; }
    345static inline int ptp_clock_unregister(struct ptp_clock *ptp)
    346{ return 0; }
    347static inline void ptp_clock_event(struct ptp_clock *ptp,
    348				   struct ptp_clock_event *event)
    349{ }
    350static inline int ptp_clock_index(struct ptp_clock *ptp)
    351{ return -1; }
    352static inline int ptp_find_pin(struct ptp_clock *ptp,
    353			       enum ptp_pin_function func, unsigned int chan)
    354{ return -1; }
    355static inline int ptp_find_pin_unlocked(struct ptp_clock *ptp,
    356					enum ptp_pin_function func,
    357					unsigned int chan)
    358{ return -1; }
    359static inline int ptp_schedule_worker(struct ptp_clock *ptp,
    360				      unsigned long delay)
    361{ return -EOPNOTSUPP; }
    362static inline void ptp_cancel_worker_sync(struct ptp_clock *ptp)
    363{ }
    364#endif
    365
    366#if IS_BUILTIN(CONFIG_PTP_1588_CLOCK)
    367/*
    368 * These are called by the network core, and don't work if PTP is in
    369 * a loadable module.
    370 */
    371
    372/**
    373 * ptp_get_vclocks_index() - get all vclocks index on pclock, and
    374 *                           caller is responsible to free memory
    375 *                           of vclock_index
    376 *
    377 * @pclock_index: phc index of ptp pclock.
    378 * @vclock_index: pointer to pointer of vclock index.
    379 *
    380 * return number of vclocks.
    381 */
    382int ptp_get_vclocks_index(int pclock_index, int **vclock_index);
    383
    384/**
    385 * ptp_convert_timestamp() - convert timestamp to a ptp vclock time
    386 *
    387 * @hwtstamp:     timestamp
    388 * @vclock_index: phc index of ptp vclock.
    389 *
    390 * Returns converted timestamp, or 0 on error.
    391 */
    392ktime_t ptp_convert_timestamp(const ktime_t *hwtstamp, int vclock_index);
    393#else
    394static inline int ptp_get_vclocks_index(int pclock_index, int **vclock_index)
    395{ return 0; }
    396static inline ktime_t ptp_convert_timestamp(const ktime_t *hwtstamp,
    397					    int vclock_index)
    398{ return 0; }
    399
    400#endif
    401
    402static inline void ptp_read_system_prets(struct ptp_system_timestamp *sts)
    403{
    404	if (sts)
    405		ktime_get_real_ts64(&sts->pre_ts);
    406}
    407
    408static inline void ptp_read_system_postts(struct ptp_system_timestamp *sts)
    409{
    410	if (sts)
    411		ktime_get_real_ts64(&sts->post_ts);
    412}
    413
    414#endif