]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/timer-pit.cpp
5e03d5d8cce07e36c5ce9afd3bd92962292e76b5
[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
22 void
23 Timer::init()
24 {
25   Irq_chip *c = Irq_chip::hw_chip;
26   unsigned in = c->legacy_override(0);
27   printf("Using the PIT (i8254) on IRQ %d for scheduling\n", in);
28
29   irq = c->irq(in);
30   if (irq)
31     panic("Could not find IRQ for PIT timer\n");
32
33   c->reserve(in);
34
35   static Irq_base ib;
36   c->setup(&ib, in);
37   irq = &ib;
38
39   // set up timer interrupt (~ 1ms)
40   Pit::init();
41
42   // from now we can save energy in getchar()
43   Config::getchar_does_hlt_works_ok = Config::hlt_works_ok;
44 }
45
46 IMPLEMENT inline NEEDS["irq_pin.h"]
47 void
48 Timer::acknowledge()
49 {
50   irq->pin()->ack();
51 }
52
53 IMPLEMENT inline NEEDS["irq_pin.h"]
54 void
55 Timer::enable()
56 {
57   irq->pin()->unmask();
58 }
59
60 IMPLEMENT inline NEEDS["irq_pin.h"]
61 void
62 Timer::disable()
63 {
64   irq->pin()->mask();
65 }
66
67 IMPLEMENT inline
68 void
69 Timer::update_timer(Unsigned64)
70 {
71   // does nothing in periodic mode
72 }