linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] x86/tsc: Convert ART in nanoseconds to TSC.
@ 2018-03-06 16:47 Rajvi Jingar
  2018-03-08 14:25 ` Thomas Gleixner
  0 siblings, 1 reply; 3+ messages in thread
From: Rajvi Jingar @ 2018-03-06 16:47 UTC (permalink / raw)
  To: rajvi.jingar, tglx, mingo, hpa, x86, peterz, linux-kernel,
	christopher.s.hall

Device drivers use get_device_system_crosststamp() to produce precise
system/device cross-timestamps. The PHC clock and ALSA interfaces,
for example, make the cross-timestamps available to user applications.
On Intel platforms, get_device_system_crosststamp() requires a TSC
value derived from ART (Always Running Timer) to compute the monotonic
 raw and realtime system timestamps.

Starting with Intel Goldmont platforms, the PCIe root complex supports
the PTM time sync protocol. PTM requires all timestamps to be in units
of nanoseconds. The Intel root complex hardware propagates system time –
derived from ART - in units of nanoseconds performing the conversion
as follows:

ART_NS = ART * 1e9 / <crystal frequency>

When user software requests a cross-timestamp, the system timestamps
(generally read from device registers) must be converted to TSC by
the driver software as follows:

TSC = ART_NS * TSC_KHZ / 1e6

This is valid when CPU feature flag X86_FEATURE_TSC_KNOWN_FREQ is set
indicating the tsc_khz is derived from CPUID[15H]. Drivers should
check that this flag is set before conversion to TSC is attempted.

Changes from v1:

* use existing frequency hardcode for platforms where CPUID[15H].ECX == 0
(v1 added redundant hardcode just for the ART.ns conversion)

* use tsc_khz for TSC conversion, also requires driver to check
X86_FEATURE_TSC_KNOWN_FREQ (v1 used CPUID[15H].ECX value directly)

Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
Suggested-by: Christopher S. Hall <christopher.s.hall@intel.com>
---
 arch/x86/include/asm/tsc.h |  1 +
 arch/x86/kernel/tsc.c      | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h
index cf5d53c..2701d22 100644
--- a/arch/x86/include/asm/tsc.h
+++ b/arch/x86/include/asm/tsc.h
@@ -31,6 +31,7 @@ static inline cycles_t get_cycles(void)
 }
 
 extern struct system_counterval_t convert_art_to_tsc(u64 art);
+extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns);
 
 extern void tsc_early_delay_calibrate(void);
 extern void tsc_init(void);
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index fb43027..f07f3bd 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -1179,6 +1179,24 @@ struct system_counterval_t convert_art_to_tsc(u64 art)
 }
 EXPORT_SYMBOL(convert_art_to_tsc);
 
+struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns)
+{
+	u64 tmp, res, rem;
+
+	rem = do_div(art_ns, USEC_PER_SEC);
+
+	res = art_ns * tsc_khz;
+	tmp = rem * tsc_khz;
+
+	do_div(tmp, USEC_PER_SEC);
+	res += tmp;
+
+	return (struct system_counterval_t) {.cs = art_related_clocksource,
+			.cycles = res};
+}
+EXPORT_SYMBOL(convert_art_ns_to_tsc);
+
+
 static void tsc_refine_calibration_work(struct work_struct *work);
 static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work);
 /**
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] x86/tsc: Convert ART in nanoseconds to TSC.
  2018-03-06 16:47 [PATCH v2] x86/tsc: Convert ART in nanoseconds to TSC Rajvi Jingar
@ 2018-03-08 14:25 ` Thomas Gleixner
  2018-03-09  1:24   ` Rajvi Jingar
  0 siblings, 1 reply; 3+ messages in thread
From: Thomas Gleixner @ 2018-03-08 14:25 UTC (permalink / raw)
  To: Rajvi Jingar; +Cc: mingo, hpa, x86, peterz, linux-kernel, christopher.s.hall

[-- Attachment #1: Type: text/plain, Size: 2278 bytes --]

On Tue, 6 Mar 2018, Rajvi Jingar wrote:
> Device drivers use get_device_system_crosststamp() to produce precise
> system/device cross-timestamps. The PHC clock and ALSA interfaces,
> for example, make the cross-timestamps available to user applications.
> On Intel platforms, get_device_system_crosststamp() requires a TSC
> value derived from ART (Always Running Timer) to compute the monotonic
>  raw and realtime system timestamps.
> 
> Starting with Intel Goldmont platforms, the PCIe root complex supports
> the PTM time sync protocol. PTM requires all timestamps to be in units
> of nanoseconds. The Intel root complex hardware propagates system time –
> derived from ART - in units of nanoseconds performing the conversion
> as follows:
> 
> ART_NS = ART * 1e9 / <crystal frequency>
> 
> When user software requests a cross-timestamp, the system timestamps
> (generally read from device registers) must be converted to TSC by
> the driver software as follows:
> 
> TSC = ART_NS * TSC_KHZ / 1e6
> 
> This is valid when CPU feature flag X86_FEATURE_TSC_KNOWN_FREQ is set
> indicating the tsc_khz is derived from CPUID[15H]. Drivers should
> check that this flag is set before conversion to TSC is attempted.

Clear and coherent changelog. Well done!

> Changes from v1:
> 
> * use existing frequency hardcode for platforms where CPUID[15H].ECX == 0
> (v1 added redundant hardcode just for the ART.ns conversion)
> 
> * use tsc_khz for TSC conversion, also requires driver to check
> X86_FEATURE_TSC_KNOWN_FREQ (v1 used CPUID[15H].ECX value directly)

Maintainer lazyness request: Can you please put the changes paragraph below
the --- seperator so it is discarded when the patch is extracted from
mail. It's not part of the changelog which goes into git.

> +struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns)

Can you please add kernel doc format function documentation which explains
the calling conventions?

> +{
> +	u64 tmp, res, rem;
> +
> +	rem = do_div(art_ns, USEC_PER_SEC);
> +
> +	res = art_ns * tsc_khz;
> +	tmp = rem * tsc_khz;
> +
> +	do_div(tmp, USEC_PER_SEC);
> +	res += tmp;
> +
> +	return (struct system_counterval_t) {.cs = art_related_clocksource,
> +			.cycles = res};

Definitely way better than the previous one. Good job!

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] x86/tsc: Convert ART in nanoseconds to TSC.
  2018-03-08 14:25 ` Thomas Gleixner
@ 2018-03-09  1:24   ` Rajvi Jingar
  0 siblings, 0 replies; 3+ messages in thread
From: Rajvi Jingar @ 2018-03-09  1:24 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: mingo, hpa, x86, peterz, linux-kernel, christopher.s.hall

Hi Thomas,

Thank you for your comments.

On Thu, 2018-03-08 at 15:25 +0100, Thomas Gleixner wrote:
> On Tue, 6 Mar 2018, Rajvi Jingar wrote:
> > Device drivers use get_device_system_crosststamp() to produce
> > precise
> > system/device cross-timestamps. The PHC clock and ALSA interfaces,
> > for example, make the cross-timestamps available to user
> > applications.
> > On Intel platforms, get_device_system_crosststamp() requires a TSC
> > value derived from ART (Always Running Timer) to compute the
> > monotonic
> >  raw and realtime system timestamps.
> > 
> > Starting with Intel Goldmont platforms, the PCIe root complex
> > supports
> > the PTM time sync protocol. PTM requires all timestamps to be in
> > units
> > of nanoseconds. The Intel root complex hardware propagates system
> > time –
> > derived from ART - in units of nanoseconds performing the
> > conversion
> > as follows:
> > 
> > ART_NS = ART * 1e9 / <crystal frequency>
> > 
> > When user software requests a cross-timestamp, the system
> > timestamps
> > (generally read from device registers) must be converted to TSC by
> > the driver software as follows:
> > 
> > TSC = ART_NS * TSC_KHZ / 1e6
> > 
> > This is valid when CPU feature flag X86_FEATURE_TSC_KNOWN_FREQ is
> > set
> > indicating the tsc_khz is derived from CPUID[15H]. Drivers should
> > check that this flag is set before conversion to TSC is attempted.
> 
> Clear and coherent changelog. Well done!
> 
> > Changes from v1:
> > 
> > * use existing frequency hardcode for platforms where
> > CPUID[15H].ECX == 0
> > (v1 added redundant hardcode just for the ART.ns conversion)
> > 
> > * use tsc_khz for TSC conversion, also requires driver to check
> > X86_FEATURE_TSC_KNOWN_FREQ (v1 used CPUID[15H].ECX value directly)
> 
> Maintainer lazyness request: Can you please put the changes paragraph
> below
> the --- seperator so it is discarded when the patch is extracted from
> mail. It's not part of the changelog which goes into git.
> 

Sure. It has been changed in v3.

> > +struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns)
> 
> Can you please add kernel doc format function documentation which
> explains
> the calling conventions?
> 

kernel-do format documentation is added to v3.

> > +{
> > +	u64 tmp, res, rem;
> > +
> > +	rem = do_div(art_ns, USEC_PER_SEC);
> > +
> > +	res = art_ns * tsc_khz;
> > +	tmp = rem * tsc_khz;
> > +
> > +	do_div(tmp, USEC_PER_SEC);
> > +	res += tmp;
> > +
> > +	return (struct system_counterval_t) {.cs =
> > art_related_clocksource,
> > +			.cycles = res};
> 
> Definitely way better than the previous one. Good job!
> 
> Thanks,
> 
> 	tglx

Thank you,
Rajvi

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-03-09  0:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-06 16:47 [PATCH v2] x86/tsc: Convert ART in nanoseconds to TSC Rajvi Jingar
2018-03-08 14:25 ` Thomas Gleixner
2018-03-09  1:24   ` Rajvi Jingar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).