Skip the shitty e1000s on c89
[akaros.git] / kern / arch / x86 / time.h
1 /* Copyright (c) 2009 The Regents of the University of California
2  * David (Yu) Zhu <yuzhu@cs.berkeley.edu>
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  *
5  * See LICENSE for details. */
6
7 #ifndef ROS_KERN_ARCH_TIME_H
8 #define ROS_KERN_ARCH_TIME_H
9
10 // PIT (Programmable Interval Timer)
11 #define TIMER_REG_CNTR0 0       /* timer counter 0 port */
12 #define TIMER_REG_CNTR1 1       /* timer counter 1 port */
13 #define TIMER_REG_CNTR2 2       /* timer counter 2 port */
14 #define TIMER_REG_MODE  3       /* timer mode port */
15 #define TIMER_SEL0      0x00    /* select counter 0 */
16 #define TIMER_SEL1      0x40    /* select counter 1 */
17 #define TIMER_SEL2      0x80    /* select counter 2 */
18 #define TIMER_INTTC     0x00    /* mode 0, intr on terminal cnt */
19 #define TIMER_ONESHOT   0x02    /* mode 1, one shot */
20 #define TIMER_RATEGEN   0x04    /* mode 2, rate generator */
21 #define TIMER_SQWAVE    0x06    /* mode 3, square wave */
22 #define TIMER_SWSTROBE  0x08    /* mode 4, s/w triggered strobe */
23 #define TIMER_HWSTROBE  0x0a    /* mode 5, h/w triggered strobe */
24 #define TIMER_LATCH     0x00    /* latch counter for reading */
25 #define TIMER_LSB       0x10    /* r/w counter LSB */
26 #define TIMER_MSB       0x20    /* r/w counter MSB */
27 #define TIMER_16BIT     0x30    /* r/w counter 16 bits, LSB first */
28 #define TIMER_BCD       0x01    /* count in BCD */
29
30 #define PIT_FREQ                                        1193182
31
32 #define IO_TIMER1   0x40        /* 8253 Timer #1 */
33 #define TIMER_CNTR0 (IO_TIMER1 + TIMER_REG_CNTR0)
34 #define TIMER_CNTR1 (IO_TIMER1 + TIMER_REG_CNTR1)
35 #define TIMER_CNTR2 (IO_TIMER1 + TIMER_REG_CNTR2)
36 #define TIMER_MODE  (IO_TIMER1 + TIMER_REG_MODE)
37
38 typedef struct system_timing {
39         uint64_t tsc_freq;
40         uint64_t bus_freq;
41         uint64_t timing_overhead;
42         uint16_t pit_divisor;
43         uint8_t pit_mode;
44 } system_timing_t;
45
46 extern system_timing_t system_timing;
47
48 // PIT related
49 void pit_set_timer(uint32_t freq, uint32_t mode);
50 void timer_init(void);
51 void udelay_pit(uint64_t usec);
52 // TODO: right now timer defaults to TSC
53 uint64_t gettimer(void);
54 uint64_t getfreq(void);
55
56 #endif /* ROS_KERN_ARCH_TIME_H */