]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/exynos/timer_mct.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / exynos / timer_mct.cpp
1 INTERFACE [arm && exynos]: // ------------------
2
3 #include "mmio_register_block.h"
4 #include "config.h"
5 #include "types.h"
6
7 class Mct_timer : public Mmio_register_block
8 {
9 public:
10   explicit Mct_timer(Address virt) : Mmio_register_block(virt) {}
11
12   struct Reg { enum
13   {
14     Cfg   = 0x0,
15     Cnt_l = 0x100,
16     Cnt_u = 0x104,
17     Tcon  = 0x240,
18   }; };
19 };
20
21 class Mct_core_timer : public Mmio_register_block
22 {
23 public:
24   explicit Mct_core_timer(Address virt) : Mmio_register_block(virt) {}
25   struct Reg { enum
26   {
27     L0          = 0x300,
28     L1          = 0x400,
29
30     L_TCNTB     = 0x00,
31     L_TCNTO     = 0x04,
32     L_ICNTB     = 0x08,
33     L_ICNTO     = 0x0c,
34     L_FRCNTB    = 0x10,
35     L_FRCNTO    = 0x14,
36     L_TCON      = 0x20,
37     L_INT_CSTAT = 0x30,
38     L_INT_ENB   = 0x34,
39     L_WSTAT     = 0x40,
40   }; };
41
42   enum
43   {
44     Mct_freq = 24000000,
45     Interval = Mct_freq / (1000000 / Config::Scheduler_granularity) / 2,
46     Maxinterval_mct = (1U << 31) - 1,
47     Maxinterval_us  = Maxinterval_mct / (Mct_freq / 1000000),
48   };
49
50 };
51
52
53 IMPLEMENTATION [arm && exynos]: // ------------------
54
55 PRIVATE inline
56 void
57 Mct_core_timer::wstat_poll(unsigned val)
58 {
59   while ((read<Mword>(Reg::L_WSTAT) & val) == 0)
60     ;
61   write<Mword>(val, Reg::L_WSTAT);
62 }
63
64 PUBLIC inline NEEDS[Mct_core_timer::wstat_poll]
65 void
66 Mct_core_timer::set_interval(Mword interval)
67 {
68   write<Mword>((1 << 31) | interval, Reg::L_ICNTB);
69   wstat_poll(2);
70 }
71
72 PUBLIC
73 void
74 Mct_core_timer::configure()
75 {
76   write<Mword>(1, Reg::L_TCNTB);
77   wstat_poll(1);
78   set_interval(Interval);
79
80   // run timer
81   write<Mword>(1, Reg::L_TCON);
82   wstat_poll(8);
83
84   // enable interrupt
85   write<Mword>(1, Reg::L_INT_ENB);
86   write<Mword>(7, Reg::L_TCON);
87   wstat_poll(8);
88 }
89
90 PUBLIC inline
91 void
92 Mct_core_timer::acknowledge() const
93 {
94   write<Mword>(1, Reg::L_INT_CSTAT);
95 }