mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner:
"The timer department delivers this time:
- Support for cross clock domain timestamps in the core code plus a
first user. That allows more precise timestamping for PTP and
later for audio and other peripherals.
The ptp/e1000e patches have been acked by the relevant maintainers
and are carried in the timer tree to avoid merge ordering issues.
- Support for unregistering the current clocksource watchdog. That
lifts a limitation for switching clocksources which has been there
from day 1
- The usual pile of fixes and updates to the core and the drivers.
Nothing outstanding and exciting"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (26 commits)
time/timekeeping: Work around false positive GCC warning
e1000e: Adds hardware supported cross timestamp on e1000e nic
ptp: Add PTP_SYS_OFFSET_PRECISE for driver crosstimestamping
x86/tsc: Always Running Timer (ART) correlated clocksource
hrtimer: Revert CLOCK_MONOTONIC_RAW support
time: Add history to cross timestamp interface supporting slower devices
time: Add driver cross timestamp interface for higher precision time synchronization
time: Remove duplicated code in ktime_get_raw_and_real()
time: Add timekeeping snapshot code capturing system time and counter
time: Add cycles to nanoseconds translation
jiffies: Use CLOCKSOURCE_MASK instead of constant
clocksource: Introduce clocksource_freq2mult()
clockevents/drivers/exynos_mct: Implement ->set_state_oneshot_stopped()
clockevents/drivers/arm_global_timer: Implement ->set_state_oneshot_stopped()
clockevents/drivers/arm_arch_timer: Implement ->set_state_oneshot_stopped()
clocksource/drivers/arm_global_timer: Register delay timer
clocksource/drivers/lpc32xx: Support timer-based ARM delay
clocksource/drivers/lpc32xx: Support periodic mode
clocksource/drivers/lpc32xx: Don't use the prescaler counter for clockevents
clocksource/drivers/rockchip: Add err handle for rk_timer_init
...
This commit is contained in:
commit
8a284c062e
25 changed files with 728 additions and 106 deletions
|
|
@ -83,6 +83,15 @@ config E1000E
|
|||
To compile this driver as a module, choose M here. The module
|
||||
will be called e1000e.
|
||||
|
||||
config E1000E_HWTS
|
||||
bool "Support HW cross-timestamp on PCH devices"
|
||||
default y
|
||||
depends on E1000E && X86
|
||||
---help---
|
||||
Say Y to enable hardware supported cross-timestamping on PCH
|
||||
devices. The cross-timestamp is available through the PTP clock
|
||||
driver precise cross-timestamp ioctl (PTP_SYS_OFFSET_PRECISE).
|
||||
|
||||
config IGB
|
||||
tristate "Intel(R) 82575/82576 PCI-Express Gigabit Ethernet support"
|
||||
depends on PCI
|
||||
|
|
|
|||
|
|
@ -528,6 +528,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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,12 @@
|
|||
|
||||
#include "e1000.h"
|
||||
|
||||
#ifdef CONFIG_E1000E_HWTS
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <asm/tsc.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* e1000e_phc_adjfreq - adjust the frequency of the hardware clock
|
||||
* @ptp: ptp clock structure
|
||||
|
|
@ -98,6 +104,78 @@ static int e1000e_phc_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_E1000E_HWTS
|
||||
#define MAX_HW_WAIT_COUNT (3)
|
||||
|
||||
/**
|
||||
* e1000e_phc_get_syncdevicetime - Callback given to timekeeping code reads system/device registers
|
||||
* @device: current device time
|
||||
* @system: system counter value read synchronously with device time
|
||||
* @ctx: context provided by timekeeping code
|
||||
*
|
||||
* Read device and system (ART) clock simultaneously and return the corrected
|
||||
* clock values in ns.
|
||||
**/
|
||||
static int e1000e_phc_get_syncdevicetime(ktime_t *device,
|
||||
struct system_counterval_t *system,
|
||||
void *ctx)
|
||||
{
|
||||
struct e1000_adapter *adapter = (struct e1000_adapter *)ctx;
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
u32 tsync_ctrl;
|
||||
cycle_t dev_cycles;
|
||||
cycle_t sys_cycles;
|
||||
|
||||
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)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
dev_cycles = er32(SYSSTMPH);
|
||||
dev_cycles <<= 32;
|
||||
dev_cycles |= er32(SYSSTMPL);
|
||||
spin_lock_irqsave(&adapter->systim_lock, flags);
|
||||
*device = ns_to_ktime(timecounter_cyc2time(&adapter->tc, dev_cycles));
|
||||
spin_unlock_irqrestore(&adapter->systim_lock, flags);
|
||||
|
||||
sys_cycles = er32(PLTSTMPH);
|
||||
sys_cycles <<= 32;
|
||||
sys_cycles |= er32(PLTSTMPL);
|
||||
*system = convert_art_to_tsc(sys_cycles);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000e_phc_getsynctime - Reads the current system/device cross timestamp
|
||||
* @ptp: ptp clock structure
|
||||
* @cts: structure containing timestamp
|
||||
*
|
||||
* Read device and system (ART) clock simultaneously and return the scaled
|
||||
* clock values in ns.
|
||||
**/
|
||||
static int e1000e_phc_getcrosststamp(struct ptp_clock_info *ptp,
|
||||
struct system_device_crosststamp *xtstamp)
|
||||
{
|
||||
struct e1000_adapter *adapter = container_of(ptp, struct e1000_adapter,
|
||||
ptp_clock_info);
|
||||
|
||||
return get_device_system_crosststamp(e1000e_phc_get_syncdevicetime,
|
||||
adapter, NULL, xtstamp);
|
||||
}
|
||||
#endif/*CONFIG_E1000E_HWTS*/
|
||||
|
||||
/**
|
||||
* e1000e_phc_gettime - Reads the current time from the hardware clock
|
||||
* @ptp: ptp clock structure
|
||||
|
|
@ -236,6 +314,13 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
|
|||
break;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_E1000E_HWTS
|
||||
/* 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.getcrosststamp =
|
||||
e1000e_phc_getcrosststamp;
|
||||
#endif/*CONFIG_E1000E_HWTS*/
|
||||
|
||||
INIT_DELAYED_WORK(&adapter->systim_overflow_work,
|
||||
e1000e_systim_overflow_work);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue