]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/timer-arm-mptimer.cpp
e9cb29e4092cb0d2e28f631f329ef33f63616c2f
[l4.git] / kernel / fiasco / src / kern / arm / timer-arm-mptimer.cpp
1 // --------------------------------------------------------------------------
2 INTERFACE [arm && mptimer]:
3
4 #include "irq_chip.h"
5 #include "kmem.h"
6
7 EXTENSION class Timer
8 {
9 public:
10   static unsigned irq() { return 29; }
11
12 private:
13   enum
14   {
15     Timer_load_reg     = Kmem::Mp_scu_map_base + 0x600 + 0x0,
16     Timer_counter_reg  = Kmem::Mp_scu_map_base + 0x600 + 0x4,
17     Timer_control_reg  = Kmem::Mp_scu_map_base + 0x600 + 0x8,
18     Timer_int_stat_reg = Kmem::Mp_scu_map_base + 0x600 + 0xc,
19
20     Prescaler = 0,
21
22     Timer_control_enable    = 1 << 0,
23     Timer_control_reload    = 1 << 1,
24     Timer_control_itenable  = 1 << 2,
25     Timer_control_prescaler = (Prescaler & 0xff) << 8,
26
27     Timer_int_stat_event   = 1,
28   };
29 };
30
31 // --------------------------------------------------------------
32 IMPLEMENTATION [arm && mptimer]:
33
34 #include <cstdio>
35 #include "config.h"
36 #include "io.h"
37 #include "irq_chip.h"
38 #include "kip.h"
39
40 #include "globals.h"
41
42 PRIVATE static
43 Mword
44 Timer::start_as_counter()
45 {
46   Io::write<Mword>(Timer_control_prescaler | Timer_control_reload
47                    | Timer_control_enable,
48                    Timer_control_reg);
49
50   Mword v = ~0UL;
51   Io::write<Mword>(v, Timer_counter_reg);
52   return v;
53 }
54
55 PRIVATE static
56 Mword
57 Timer::stop_counter()
58 {
59   Mword v = Io::read<Mword>(Timer_counter_reg);
60   Io::write<Mword>(0, Timer_control_reg);
61   return v;
62 }
63
64 IMPLEMENT
65 void
66 Timer::init(unsigned)
67 {
68   Mword i = interval();
69
70   Io::write<Mword>(i, Timer_load_reg);
71   Io::write<Mword>(i, Timer_counter_reg);
72   Io::write<Mword>(Timer_control_prescaler | Timer_control_reload
73                    | Timer_control_enable | Timer_control_itenable,
74                    Timer_control_reg);
75 }
76
77 static inline
78 Unsigned64
79 Timer::timer_to_us(Unsigned32 /*cr*/)
80 { return 0; }
81
82 static inline
83 Unsigned64
84 Timer::us_to_timer(Unsigned64 us)
85 { (void)us; return 0; }
86
87 PUBLIC static inline NEEDS["io.h"]
88 void
89 Timer::acknowledge()
90 {
91   Io::write<Mword>(Timer_int_stat_event, Timer_int_stat_reg);
92 }
93
94 IMPLEMENT inline
95 void
96 Timer::update_one_shot(Unsigned64 wakeup)
97 {
98   (void)wakeup;
99 }
100
101 IMPLEMENT inline NEEDS["config.h", "kip.h"]
102 Unsigned64
103 Timer::system_clock()
104 {
105   if (Config::Scheduler_one_shot)
106     return 0;
107   return Kip::k()->clock;
108 }