]> bbs.cooldavid.org Git - net-next-2.6.git/blame - arch/x86/lib/delay_64.c
read_current_timer() cleanups
[net-next-2.6.git] / arch / x86 / lib / delay_64.c
CommitLineData
1da177e4
LT
1/*
2 * Precise Delay Loops for x86-64
3 *
4 * Copyright (C) 1993 Linus Torvalds
5 * Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
6 *
7 * The __delay function must _NOT_ be inlined as its execution time
8 * depends wildly on alignment on many x86 processors.
9 */
10
2ee60e17 11#include <linux/module.h>
1da177e4 12#include <linux/sched.h>
941e492b 13#include <linux/timex.h>
35d5d08a 14#include <linux/preempt.h>
1da177e4 15#include <linux/delay.h>
941e492b 16#include <linux/init.h>
35d5d08a 17
1da177e4 18#include <asm/delay.h>
8a9e1b0f 19#include <asm/msr.h>
1da177e4
LT
20
21#ifdef CONFIG_SMP
22#include <asm/smp.h>
23#endif
24
941e492b 25int __devinit read_current_timer(unsigned long *timer_value)
8a9e1b0f
VP
26{
27 rdtscll(*timer_value);
28 return 0;
29}
30
1da177e4
LT
31void __delay(unsigned long loops)
32{
33 unsigned bclock, now;
35d5d08a
AM
34
35 preempt_disable(); /* TSC's are pre-cpu */
1da177e4 36 rdtscl(bclock);
35d5d08a 37 do {
1da177e4
LT
38 rep_nop();
39 rdtscl(now);
40 }
35d5d08a
AM
41 while ((now-bclock) < loops);
42 preempt_enable();
1da177e4 43}
2ee60e17 44EXPORT_SYMBOL(__delay);
1da177e4
LT
45
46inline void __const_udelay(unsigned long xloops)
47{
92cb7612
MT
48 __delay(((xloops * HZ *
49 cpu_data(raw_smp_processor_id()).loops_per_jiffy) >> 32) + 1);
1da177e4 50}
2ee60e17 51EXPORT_SYMBOL(__const_udelay);
1da177e4
LT
52
53void __udelay(unsigned long usecs)
54{
b9a8d94a 55 __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */
1da177e4 56}
2ee60e17 57EXPORT_SYMBOL(__udelay);
1da177e4
LT
58
59void __ndelay(unsigned long nsecs)
60{
61 __const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */
62}
2ee60e17 63EXPORT_SYMBOL(__ndelay);