[2/4] ptp: add ptp_gettimex64any() support
Commit Message
add support for TS sandwich of the user preferred timebase. The options
supported are PTP_TS_REAL (CLOCK_REALTIME), PTP_TS_MONO (CLOCK_MONOTONIC),
PTP_TS_RAW (CLOCK_MONOTONIC_RAW), PTP_TS_CYCLES (raw-cycles)
The option PTP_TS_CYCLES will return the cycles in 'struct timespec64'
format so something equivalent of timespec64_to_ns() need to be applied to
covert back into cycles.
Option of PTP_TS_REAL is equivalent of using ptp_gettimex64().
Signed-off-by: Mahesh Bandewar <maheshb@google.com>
CC: Richard Cochran <richardcochran@gmail.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: netdev@vger.kernel.org
---
include/linux/ptp_clock_kernel.h | 57 ++++++++++++++++++++++++++++++++
include/uapi/linux/ptp_clock.h | 8 +++++
2 files changed, 65 insertions(+)
Comments
On Thu, Sep 28, 2023 at 07:37:40PM -0700, Mahesh Bandewar wrote:
> diff --git a/include/uapi/linux/ptp_clock.h b/include/uapi/linux/ptp_clock.h
> index 05cc35fc94ac..1f1e98966cff 100644
> --- a/include/uapi/linux/ptp_clock.h
> +++ b/include/uapi/linux/ptp_clock.h
> @@ -69,6 +69,14 @@
> */
> #define PTP_PEROUT_V1_VALID_FLAGS (0)
>
> +enum ptp_ts_types {
> + PTP_TS_CYCLES = 0,
> + PTP_TS_REAL,
> + PTP_TS_MONO,
> + PTP_TS_RAW,
> + PTP_TS_MAX,
> +};
There is no need for a new set of enumerated values. Why not use the
existing clockid_t ?
Thanks,
Richard
On Sat, Sep 30, 2023 at 2:18 PM Richard Cochran
<richardcochran@gmail.com> wrote:
>
> On Thu, Sep 28, 2023 at 07:37:40PM -0700, Mahesh Bandewar wrote:
>
> > diff --git a/include/uapi/linux/ptp_clock.h b/include/uapi/linux/ptp_clock.h
> > index 05cc35fc94ac..1f1e98966cff 100644
> > --- a/include/uapi/linux/ptp_clock.h
> > +++ b/include/uapi/linux/ptp_clock.h
> > @@ -69,6 +69,14 @@
> > */
> > #define PTP_PEROUT_V1_VALID_FLAGS (0)
> >
> > +enum ptp_ts_types {
> > + PTP_TS_CYCLES = 0,
> > + PTP_TS_REAL,
> > + PTP_TS_MONO,
> > + PTP_TS_RAW,
> > + PTP_TS_MAX,
> > +};
>
> There is no need for a new set of enumerated values. Why not use the
> existing clockid_t ?
>
I'm not sure which one you are referring to. These defs need to be
UAPI and the one defined in time.h are not all relevant in this case
(we just need only a few of those) hence the definition. However, if I
missed something, please point me to it.
> Thanks,
> Richard
On Mon, Oct 02, 2023 at 05:24:43PM -0700, Mahesh Bandewar (महेश बंडेवार) wrote:
> I'm not sure which one you are referring to. These defs need to be
> UAPI and the one defined in time.h are not all relevant in this case
> (we just need only a few of those) hence the definition. However, if I
> missed something, please point me to it.
You are missing this:
> > > + PTP_TS_REAL,
#define CLOCK_REALTIME 0
> > > + PTP_TS_MONO,
#define CLOCK_MONOTONIC 1
> > > + PTP_TS_RAW,
#define CLOCK_MONOTONIC_RAW 4
See?
@@ -102,6 +102,15 @@ struct ptp_system_timestamp {
* reading the lowest bits of the PHC timestamp and the second
* reading immediately follows that.
*
+ * @gettimex64any: Reads the current time from the hardware clock and
+ optionally also any of the MONO, MONO_RAW, or SYS clock.
+ * parameter ts: Holds the PHC timestamp.
+ * parameter sts: If not NULL, it holds a pair of timestamps from
+ * the clock of choice. The first reading is made right before
+ * reading the lowest bits of the PHC timestamp and the second
+ * reading immediately follows that.
+ * parameter type: any one of the TS opt from ptp_timestamp_types.
+ *
* @getcrosststamp: Reads the current time from the hardware clock and
* system clock simultaneously.
* parameter cts: Contains timestamp (device,system) pair,
@@ -180,6 +189,9 @@ struct ptp_clock_info {
int (*gettime64)(struct ptp_clock_info *ptp, struct timespec64 *ts);
int (*gettimex64)(struct ptp_clock_info *ptp, struct timespec64 *ts,
struct ptp_system_timestamp *sts);
+ int (*gettimex64any)(struct ptp_clock_info *ptp, struct timespec64 *ts,
+ struct ptp_system_timestamp *sts,
+ enum ptp_ts_types type);
int (*getcrosststamp)(struct ptp_clock_info *ptp,
struct system_device_crosststamp *cts);
int (*settime64)(struct ptp_clock_info *p, const struct timespec64 *ts);
@@ -464,4 +476,49 @@ static inline void ptp_read_system_postts(struct ptp_system_timestamp *sts)
ktime_get_real_ts64(&sts->post_ts);
}
+static inline void ptp_read_any_prets(struct ptp_system_timestamp *sts,
+ enum ptp_ts_types type)
+{
+ if (sts) {
+ switch (type) {
+ case PTP_TS_CYCLES:
+ ktime_get_cycles64(&sts->pre_ts);
+ break;
+ case PTP_TS_REAL:
+ ktime_get_real_ts64(&sts->pre_ts);
+ break;
+ case PTP_TS_MONO:
+ ktime_get_ts64(&sts->pre_ts);
+ break;
+ case PTP_TS_RAW:
+ ktime_get_raw_ts64(&sts->pre_ts);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static inline void ptp_read_any_postts(struct ptp_system_timestamp *sts,
+ enum ptp_ts_types type)
+{
+ if (sts) {
+ switch (type) {
+ case PTP_TS_CYCLES:
+ ktime_get_cycles64(&sts->post_ts);
+ break;
+ case PTP_TS_REAL:
+ ktime_get_real_ts64(&sts->post_ts);
+ break;
+ case PTP_TS_MONO:
+ ktime_get_ts64(&sts->post_ts);
+ break;
+ case PTP_TS_RAW:
+ ktime_get_raw_ts64(&sts->post_ts);
+ break;
+ default:
+ break;
+ }
+ }
+}
#endif
@@ -69,6 +69,14 @@
*/
#define PTP_PEROUT_V1_VALID_FLAGS (0)
+enum ptp_ts_types {
+ PTP_TS_CYCLES = 0,
+ PTP_TS_REAL,
+ PTP_TS_MONO,
+ PTP_TS_RAW,
+ PTP_TS_MAX,
+};
+
/*
* struct ptp_clock_time - represents a time value
*