]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/tegra2/platform_control-arm-tegra2.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / tegra2 / platform_control-arm-tegra2.cpp
1 INTERFACE [arm && mp && tegra2]:
2
3 #include "mem_layout.h"
4
5 EXTENSION class Platform_control
6 {
7 private:
8   enum
9   {
10     Reset_vector_addr              = 0x6000f100,
11     Clk_rst_ctrl_clk_cpu_cmplx     = 0x6000604c,
12     Clk_rst_ctrl_rst_cpu_cmplx_clr = 0x60006344,
13     Unhalt_addr                    = 0x60007014,
14   };
15
16   static Mword _orig_reset_vector;
17 };
18
19 IMPLEMENTATION [arm && mp && tegra2]:
20
21 #include "io.h"
22 #include "kmem.h"
23 #include <cstdlib>
24
25 Mword Platform_control::_orig_reset_vector;
26
27 PRIVATE static
28 void Platform_control::reset_orig_reset_vector()
29 {
30   Io::write<Mword>(_orig_reset_vector, Kmem::mmio_remap(Reset_vector_addr));
31 }
32
33 PUBLIC static
34 void
35 Platform_control::boot_ap_cpus(Address phys_reset_vector)
36 {
37   // remember original reset vector
38   _orig_reset_vector = Io::read<Mword>(Kmem::mmio_remap(Reset_vector_addr));
39
40   // set (temporary) new reset vector
41   Io::write<Mword>(phys_reset_vector, Kmem::mmio_remap(Reset_vector_addr));
42
43   atexit(reset_orig_reset_vector);
44
45   // clocks on other cpu
46   Mword r = Io::read<Mword>(Kmem::mmio_remap(Clk_rst_ctrl_clk_cpu_cmplx));
47   Io::write<Mword>(r & ~(1 << 9), Kmem::mmio_remap(Clk_rst_ctrl_clk_cpu_cmplx));
48   Io::write<Mword>((1 << 13) | (1 << 9) | (1 << 5) | (1 << 1),
49                    Kmem::mmio_remap(Clk_rst_ctrl_rst_cpu_cmplx_clr));
50
51   // kick cpu1
52   Io::write<Mword>(0, Kmem::mmio_remap(Unhalt_addr));
53 }
54