From: Christopher S. Hall <christopher.s.hall@intel.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH v4 4/4] Adds hardware supported cross timestamp
Date: Mon, 12 Oct 2015 11:45:22 -0700 [thread overview]
Message-ID: <1444675522-4198-5-git-send-email-christopher.s.hall@intel.com> (raw)
In-Reply-To: <1444675522-4198-1-git-send-email-christopher.s.hall@intel.com>
Modern Intel systems supports cross timestamping of the network device
clock and Always Running Timer (ART) in hardware. This allows the device
time and system time to be precisely correlated. The timestamp pair is
exposed through the *_get_ts callback used by get_correlated_timestamp().
The hardware cross-timestamp result is made available to applications
through the PTP_SYS_OFFSET_PRECISE ioctl.
Signed-off-by: Christopher S. Hall <christopher.s.hall@intel.com>
---
drivers/net/ethernet/intel/e1000e/defines.h | 5 ++
drivers/net/ethernet/intel/e1000e/ptp.c | 77 +++++++++++++++++++++++++++++
drivers/net/ethernet/intel/e1000e/regs.h | 4 ++
3 files changed, 86 insertions(+)
diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h
index 133d407..13cff75 100644
--- a/drivers/net/ethernet/intel/e1000e/defines.h
+++ b/drivers/net/ethernet/intel/e1000e/defines.h
@@ -527,6 +527,11 @@
#define E1000_RXCW_C 0x20000000 /* Receive config */
#define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */
+/* HH Time Sync */
+#define E1000_TSYNCTXCTL_MAX_ALLOWED_DLY_MASK 0x0000F000 /* max delay */
+#define E1000_TSYNCTXCTL_SYNC_COMP 0x40000000 /* sync complete */
+#define E1000_TSYNCTXCTL_START_SYNC 0x80000000 /* initiate sync */
+
#define E1000_TSYNCTXCTL_VALID 0x00000001 /* Tx timestamp valid */
#define E1000_TSYNCTXCTL_ENABLED 0x00000010 /* enable Tx timestamping */
diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c
index 25a0ad5..25e2641 100644
--- a/drivers/net/ethernet/intel/e1000e/ptp.c
+++ b/drivers/net/ethernet/intel/e1000e/ptp.c
@@ -25,6 +25,8 @@
*/
#include "e1000.h"
+#include <asm/tsc.h>
+#include <linux/timekeeping.h>
/**
* e1000e_phc_adjfreq - adjust the frequency of the hardware clock
@@ -98,6 +100,77 @@ static int e1000e_phc_adjtime(struct ptp_clock_info *ptp, s64 delta)
return 0;
}
+#define MAX_HW_WAIT_COUNT (3)
+
+static int e1000e_phc_get_ts(struct correlated_ts *cts)
+{
+ struct e1000_adapter *adapter = (struct e1000_adapter *)cts->private;
+ struct e1000_hw *hw = &adapter->hw;
+ int i;
+ u32 tsync_ctrl;
+ int ret;
+
+ tsync_ctrl = er32(TSYNCTXCTL);
+ tsync_ctrl |= E1000_TSYNCTXCTL_START_SYNC |
+ E1000_TSYNCTXCTL_MAX_ALLOWED_DLY_MASK;
+ ew32(TSYNCTXCTL, tsync_ctrl);
+ for (i = 0; i < MAX_HW_WAIT_COUNT; ++i) {
+ udelay(1);
+ tsync_ctrl = er32(TSYNCTXCTL);
+ if (tsync_ctrl & E1000_TSYNCTXCTL_SYNC_COMP)
+ break;
+ }
+
+ if (i == MAX_HW_WAIT_COUNT) {
+ ret = -ETIMEDOUT;
+ } else {
+ ret = 0;
+ cts->system_ts = er32(PLTSTMPH);
+ cts->system_ts <<= 32;
+ cts->system_ts |= er32(PLTSTMPL);
+ cts->device_ts = er32(SYSSTMPH);
+ cts->device_ts <<= 32;
+ cts->device_ts |= er32(SYSSTMPL);
+ }
+
+ return ret;
+}
+
+/**
+ * e1000e_phc_getsynctime - Reads the current time from the hardware clock and
+ * correlated system time
+ * @ptp: ptp clock structure
+ * @devts: timespec structure to hold the current device time value
+ * @systs: timespec structure to hold the current system time value
+ *
+ * Read device and system (ART) clock simultaneously and return the correct
+ * clock values in ns after converting into a struct timespec.
+ **/
+static int e1000e_phc_getsynctime(struct ptp_clock_info *ptp, u64 *dev,
+ u64 *sys )
+{
+ struct e1000_adapter *adapter = container_of(ptp, struct e1000_adapter,
+ ptp_clock_info);
+ unsigned long flags;
+ struct correlated_ts art_correlated_ts;
+ int ret;
+
+ art_correlated_ts.get_ts = e1000e_phc_get_ts;
+ art_correlated_ts.private = adapter;
+ ret = get_correlated_timestamp(&art_correlated_ts,
+ &art_timestamper);
+ if (ret != 0)
+ return ret;
+
+ *sys = art_correlated_ts.system_real.tv64;
+
+ spin_lock_irqsave(&adapter->systim_lock, flags);
+ *dev = timecounter_cyc2time(&adapter->tc, art_correlated_ts.device_ts);
+ spin_unlock_irqrestore(&adapter->systim_lock, flags);
+
+ return 0;
+}
+
/**
* e1000e_phc_gettime - Reads the current time from the hardware clock
* @ptp: ptp clock structure
@@ -236,6 +309,10 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
break;
}
+ /* CPU must have ART and GBe must be from Sunrise Point or greater */
+ if (hw->mac.type >= e1000_pch_spt && boot_cpu_has(X86_FEATURE_ART))
+ adapter->ptp_clock_info.getsynctime = e1000e_phc_getsynctime;
+
INIT_DELAYED_WORK(&adapter->systim_overflow_work,
e1000e_systim_overflow_work);
diff --git a/drivers/net/ethernet/intel/e1000e/regs.h b/drivers/net/ethernet/intel/e1000e/regs.h
index 1d5e0b7..0cb4d36 100644
--- a/drivers/net/ethernet/intel/e1000e/regs.h
+++ b/drivers/net/ethernet/intel/e1000e/regs.h
@@ -245,6 +245,10 @@
#define E1000_SYSTIML 0x0B600 /* System time register Low - RO */
#define E1000_SYSTIMH 0x0B604 /* System time register High - RO */
#define E1000_TIMINCA 0x0B608 /* Increment attributes register - RW */
+#define E1000_SYSSTMPL 0x0B648 /* HH Timesync system stamp low register */
+#define E1000_SYSSTMPH 0x0B64C /* HH Timesync system stamp hi register */
+#define E1000_PLTSTMPL 0x0B640 /* HH Timesync platform stamp low register */
+#define E1000_PLTSTMPH 0x0B644 /* HH Timesync platform stamp hi register */
#define E1000_RXMTRL 0x0B634 /* Time sync Rx EtherType and Msg Type - RW */
#define E1000_RXUDP 0x0B638 /* Time Sync Rx UDP Port - RW */
--
2.1.4
next prev parent reply other threads:[~2015-10-12 18:45 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-12 18:45 [Intel-wired-lan] [PATCH v4 0/4] Patchset enabling hardware based cross-timestamps for next gen Intel platforms Christopher S. Hall
2015-10-12 18:45 ` [Intel-wired-lan] [PATCH v4 1/4] Produce system time from correlated clocksource Christopher S. Hall
2015-10-13 4:58 ` Richard Cochran
2015-10-13 7:51 ` Thomas Gleixner
2015-10-13 8:31 ` Richard Cochran
2015-10-13 19:15 ` Thomas Gleixner
2015-10-13 21:12 ` Richard Cochran
2015-10-14 7:21 ` Thomas Gleixner
2015-10-14 9:29 ` Richard Cochran
2015-10-14 14:22 ` Thomas Gleixner
2015-10-14 16:18 ` Richard Cochran
2015-10-15 2:34 ` Christopher Hall
2015-10-15 5:41 ` Richard Cochran
2015-10-15 8:13 ` Thomas Gleixner
2015-10-13 5:26 ` Richard Cochran
2015-10-13 13:50 ` Richard Cochran
2015-10-13 19:42 ` Thomas Gleixner
2015-10-15 1:57 ` Christopher Hall
2015-10-15 5:57 ` Richard Cochran
2015-10-15 8:15 ` Thomas Gleixner
2015-10-20 0:18 ` Christopher Hall
2015-10-20 0:36 ` John Stultz
2015-10-20 8:54 ` Richard Cochran
2015-10-20 10:48 ` Thomas Gleixner
2015-10-20 11:51 ` Richard Cochran
2015-10-20 14:55 ` Richard Cochran
2015-10-20 19:11 ` Thomas Gleixner
2015-10-20 19:36 ` Richard Cochran
2015-10-20 20:16 ` John Stultz
2015-10-21 7:44 ` Thomas Gleixner
2015-11-03 19:18 ` Stanton, Kevin B
2015-11-09 21:17 ` John Stultz
2015-10-12 18:45 ` [Intel-wired-lan] [PATCH v4 2/4] Always running timer " Christopher S. Hall
2015-10-13 2:03 ` kbuild test robot
2015-11-18 23:53 ` Jacob Pan
2015-10-12 18:45 ` [Intel-wired-lan] [PATCH v4 3/4] Add PTP_SYS_OFFSET_PRECISE for driver crosstimestamping Christopher S. Hall
2015-10-13 13:59 ` Richard Cochran
2015-10-15 2:47 ` Christopher Hall
2015-11-07 2:15 ` Christopher Hall
2015-10-12 18:45 ` Christopher S. Hall [this message]
2015-10-13 2:10 ` [Intel-wired-lan] [PATCH v4 4/4] Adds hardware supported cross timestamp kbuild test robot
2015-10-13 2:11 ` kbuild test robot
2015-10-13 2:31 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1444675522-4198-5-git-send-email-christopher.s.hall@intel.com \
--to=christopher.s.hall@intel.com \
--cc=intel-wired-lan@osuosl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox