]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/timer-pit.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / timer-pit.cpp
1 INTERFACE[{ia32,amd64}-pit_timer]:
2
3 class Irq_base;
4
5 EXTENSION class Timer
6 {
7   static Irq_base *irq;
8 };
9
10 IMPLEMENTATION[{ia32,amd64}-pit_timer]:
11
12 #include "irq_chip.h"
13 #include "irq_pin.h"
14 #include "pit.h"
15 #include "pic.h"
16
17 #include <cstdio>
18
19 Irq_base *Timer::irq;
20
21 IMPLEMENT inline int Timer::irq_line() { return 0; }
22
23 IMPLEMENT
24 void
25 Timer::init()
26 {
27   Irq_chip *c = Irq_chip::hw_chip;
28   unsigned in = c->legacy_override(0);
29   printf("Using the PIT (i8254) on IRQ %d for scheduling\n", in);
30
31   irq = c->irq(in);
32   if (irq)
33     panic("Could not find IRQ for PIT timer\n");
34
35   c->reserve(in);
36
37   static Irq_base ib;
38   c->setup(&ib, in);
39   irq = &ib;
40
41   // set up timer interrupt (~ 1ms)
42   Pit::init();
43
44   // from now we can save energy in getchar()
45   Config::getchar_does_hlt_works_ok = Config::hlt_works_ok;
46 }
47
48 IMPLEMENT inline NEEDS["irq_pin.h"]
49 void
50 Timer::acknowledge()
51 {
52   irq->pin()->ack();
53 }
54
55 IMPLEMENT inline NEEDS["irq_pin.h"]
56 void
57 Timer::enable()
58 {
59   irq->pin()->unmask();
60 }
61
62 IMPLEMENT inline NEEDS["irq_pin.h"]
63 void
64 Timer::disable()
65 {
66   irq->pin()->mask();
67 }
68
69 IMPLEMENT inline
70 void
71 Timer::update_timer(Unsigned64)
72 {
73   // does nothing in periodic mode
74 }