-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARC: Timers/counters/delay management
ARC700 includes 2 in-core 32bit timers TIMER0 and TIMER1. Both have exactly same capabilies. * programmable to count from TIMER<n>_CNT to TIMER<n>_LIMIT * for count 0 and LIMIT ~1, provides a free-running counter by auto-wrapping when limit is reached. * optionally interrupt when LIMIT is reached (oneshot event semantics) * rearming the interrupt provides periodic semantics * run at CPU clk ARC Linux uses TIMER0 for clockevent (periodic/oneshot) and TIMER1 for clocksource (free-running clock). Newer cores provide RTSC insn which gives a 64bit cpu clk snapshot hence is more apt for clocksource when available. SMP poses a bit of challenge for global timekeeping clocksource / sched_clock() backend: -TIMER1 based local clocks are out-of-sync hence can't be used (thus we default to jiffies based cs as well as sched_clock() one/both of which platform can override with it's specific hardware assist) -RTSC is only allowed in SMP if it's cross-core-sync (Kconfig glue ensures that) and thus usable for both requirements. Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Cc: Thomas Gleixner <tglx@linutronix.de>
- Loading branch information
Vineet Gupta
committed
Feb 11, 2013
1 parent
bf90e1e
commit d8005e6
Showing
7 changed files
with
425 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
* Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef _ASM_ARC_CLK_H | ||
#define _ASM_ARC_CLK_H | ||
|
||
/* Although we can't really hide core_freq, the accessor is still better way */ | ||
extern unsigned long core_freq; | ||
|
||
static inline unsigned long arc_get_core_freq(void) | ||
{ | ||
return core_freq; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* Delay routines using pre computed loops_per_jiffy value. | ||
* | ||
* vineetg: Feb 2012 | ||
* -Rewrote in "C" to avoid dealing with availability of H/w MPY | ||
* -Also reduced the num of MPY operations from 3 to 2 | ||
* | ||
* Amit Bhor: Codito Technologies 2004 | ||
*/ | ||
|
||
#ifndef __ASM_ARC_UDELAY_H | ||
#define __ASM_ARC_UDELAY_H | ||
|
||
#include <asm/param.h> /* HZ */ | ||
|
||
static inline void __delay(unsigned long loops) | ||
{ | ||
__asm__ __volatile__( | ||
"1: sub.f %0, %0, 1 \n" | ||
" jpnz 1b \n" | ||
: "+r"(loops) | ||
: | ||
: "cc"); | ||
} | ||
|
||
extern void __bad_udelay(void); | ||
|
||
/* | ||
* Normal Math for computing loops in "N" usecs | ||
* -we have precomputed @loops_per_jiffy | ||
* -1 sec has HZ jiffies | ||
* loops per "N" usecs = ((loops_per_jiffy * HZ / 1000000) * N) | ||
* | ||
* Approximate Division by multiplication: | ||
* -Mathematically if we multiply and divide a number by same value the | ||
* result remains unchanged: In this case, we use 2^32 | ||
* -> (loops_per_N_usec * 2^32 ) / 2^32 | ||
* -> (((loops_per_jiffy * HZ / 1000000) * N) * 2^32) / 2^32 | ||
* -> (loops_per_jiffy * HZ * N * 4295) / 2^32 | ||
* | ||
* -Divide by 2^32 is very simply right shift by 32 | ||
* -We simply need to ensure that the multiply per above eqn happens in | ||
* 64-bit precision (if CPU doesn't support it - gcc can emaulate it) | ||
*/ | ||
|
||
static inline void __udelay(unsigned long usecs) | ||
{ | ||
unsigned long loops; | ||
|
||
/* (long long) cast ensures 64 bit MPY - real or emulated | ||
* HZ * 4295 is pre-evaluated by gcc - hence only 2 mpy ops | ||
*/ | ||
loops = ((long long)(usecs * 4295 * HZ) * | ||
(long long)(loops_per_jiffy)) >> 32; | ||
|
||
__delay(loops); | ||
} | ||
|
||
#define udelay(n) (__builtin_constant_p(n) ? ((n) > 20000 ? __bad_udelay() \ | ||
: __udelay(n)) : __udelay(n)) | ||
|
||
#endif /* __ASM_ARC_UDELAY_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef _ASM_ARC_TIMEX_H | ||
#define _ASM_ARC_TIMEX_H | ||
|
||
#define CLOCK_TICK_RATE 80000000 /* slated to be removed */ | ||
|
||
#include <asm-generic/timex.h> | ||
|
||
/* XXX: get_cycles() to be implemented with RTSC insn */ | ||
|
||
#endif /* _ASM_ARC_TIMEX_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
/* | ||
* Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <asm/clk.h> | ||
|
||
unsigned long core_freq = CONFIG_ARC_PLAT_CLK; |
Oops, something went wrong.