On Tue, Apr 30, 2024 at 02:22:23PM +0530, lakshmi.sowjanya.d@xxxxxxxxx wrote: > From: Lakshmi Sowjanya D <lakshmi.sowjanya.d@xxxxxxxxx> > > The Intel Timed IO PPS generator driver outputs a PPS signal using > dedicated hardware that is more accurate than software actuated PPS. > The Timed IO hardware generates output events using the ART timer. > The ART timer period varies based on platform type, but is less than 100 > nanoseconds for all current platforms. Timed IO output accuracy is > within 1 ART period. > > PPS output is enabled by writing '1' the 'enable' sysfs attribute. The > driver uses hrtimers to schedule a wake-up 10 ms before each event > (edge) target time. At wakeup, the driver converts the target time in > terms of CLOCK_REALTIME to ART trigger time and writes this to the Timed > IO hardware. The Timed IO hardware generates an event precisely at the > requested system time without software involvement. ... > +static enum hrtimer_restart hrtimer_callback(struct hrtimer *timer) > +{ > + struct pps_tio *tio = container_of(timer, struct pps_tio, timer); > + ktime_t expires, now; > + u32 event_count; > + > + guard(spinlock)(&tio->lock); > + > + /* Check if any event is missed. If an event is missed, TIO will be disabled*/ > + event_count = pps_tio_read(tio, TIOEC); > + if (tio->prev_count && tio->prev_count == event_count) > + goto err; > + tio->prev_count = event_count; > + expires = hrtimer_get_expires(timer); > + now = ktime_get_real(); > + if (now - expires < SAFE_TIME_NS) { > + if (!pps_generate_next_pulse(tio, expires + SAFE_TIME_NS)) > + return HRTIMER_NORESTART; > + } else { Redundant. > + goto err; > + } if (now - expires >= SAFE_TIME_NS) goto err; if (!pps_generate_next_pulse(tio, expires + SAFE_TIME_NS)) return HRTIMER_NORESTART; > + hrtimer_forward(timer, now, NSEC_PER_SEC / 2); > + return HRTIMER_RESTART; > +err: > + dev_err(tio->dev, "Event missed, Disabling Timed I/O"); > + pps_tio_disable(tio); > + return HRTIMER_NORESTART; > +} -- With Best Regards, Andy Shevchenko