|
@@ -874,6 +874,36 @@ time64_t __ktime_get_real_seconds(void)
|
|
return tk->xtime_sec;
|
|
return tk->xtime_sec;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * ktime_get_snapshot - snapshots the realtime/monotonic raw clocks with counter
|
|
|
|
+ * @systime_snapshot: pointer to struct receiving the system time snapshot
|
|
|
|
+ */
|
|
|
|
+void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot)
|
|
|
|
+{
|
|
|
|
+ struct timekeeper *tk = &tk_core.timekeeper;
|
|
|
|
+ unsigned long seq;
|
|
|
|
+ ktime_t base_raw;
|
|
|
|
+ ktime_t base_real;
|
|
|
|
+ s64 nsec_raw;
|
|
|
|
+ s64 nsec_real;
|
|
|
|
+ cycle_t now;
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ seq = read_seqcount_begin(&tk_core.seq);
|
|
|
|
+
|
|
|
|
+ now = tk->tkr_mono.read(tk->tkr_mono.clock);
|
|
|
|
+ base_real = ktime_add(tk->tkr_mono.base,
|
|
|
|
+ tk_core.timekeeper.offs_real);
|
|
|
|
+ base_raw = tk->tkr_raw.base;
|
|
|
|
+ nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, now);
|
|
|
|
+ nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, now);
|
|
|
|
+ } while (read_seqcount_retry(&tk_core.seq, seq));
|
|
|
|
+
|
|
|
|
+ systime_snapshot->cycles = now;
|
|
|
|
+ systime_snapshot->real = ktime_add_ns(base_real, nsec_real);
|
|
|
|
+ systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(ktime_get_snapshot);
|
|
|
|
|
|
#ifdef CONFIG_NTP_PPS
|
|
#ifdef CONFIG_NTP_PPS
|
|
|
|
|