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