13 #ifndef __POWERPC_TIME_H
14 #define __POWERPC_TIME_H
17 #include <linux/types.h>
20 #include <asm/processor.h>
34 extern void set_dec_cpu6(
unsigned int val);
38 #define DEFAULT_PROC_FREQ (DEFAULT_TB_FREQ * 8)
40 #define DEFAULT_TB_FREQ 125000000UL
50 #define __USE_RTC() (!cpu_has_feature(CPU_FTR_USE_TB))
58 #define get_tbl get_tb
62 static inline unsigned long get_tbl(
void)
64 #if defined(CONFIG_403GCX)
66 asm volatile(
"mfspr %0, 0x3dd" :
"=r" (tbl));
73 static inline unsigned int get_tbu(
void)
77 asm volatile(
"mfspr %0, 0x3dc" :
"=r" (tbu));
85 static inline unsigned int get_rtcl(
void)
89 asm volatile(
"mfrtcl %0" :
"=r" (rtcl));
93 static inline u64 get_rtc(
void)
95 unsigned int hi,
lo, hi2;
98 asm volatile(
"mfrtcu %0; mfrtcl %1; mfrtcu %2"
99 :
"=r" (hi),
"=r" (lo),
"=r" (hi2));
101 return (
u64)hi * 1000000000 + lo;
105 static inline u64 get_tb(
void)
110 static inline u64 get_tb(
void)
112 unsigned int tbhi, tblo, tbhi2;
118 }
while (tbhi != tbhi2);
120 return ((
u64)tbhi << 32) | tblo;
124 static inline u64 get_tb_or_rtc(
void)
126 return __USE_RTC() ? get_rtc() : get_tb();
129 static inline void set_tb(
unsigned int upper,
unsigned int lower)
132 mtspr(SPRN_TBWU, upper);
133 mtspr(SPRN_TBWL, lower);
142 static inline unsigned int get_dec(
void)
144 #if defined(CONFIG_40x)
145 return (
mfspr(SPRN_PIT));
147 return (
mfspr(SPRN_DEC));
156 static inline void set_dec(
int val)
158 #if defined(CONFIG_40x)
159 mtspr(SPRN_PIT, val);
160 #elif defined(CONFIG_8xx_CPU6)
161 set_dec_cpu6(val - 1);
166 mtspr(SPRN_DEC, val);
170 static inline unsigned long tb_ticks_since(
unsigned long tstamp)
173 int delta = get_rtcl() - (
unsigned int) tstamp;
174 return delta < 0 ? delta + 1000000000 :
delta;
176 return get_tbl() -
tstamp;
179 #define mulhwu(x,y) \
180 ({unsigned z; asm ("mulhwu %0,%1,%2" : "=r" (z) : "r" (x), "r" (y)); z;})
183 #define mulhdu(x,y) \
184 ({unsigned long z; asm ("mulhdu %0,%1,%2" : "=r" (z) : "r" (x), "r" (y)); z;})
190 unsigned divisor,
struct div_result *dr);