1 INTERFACE [arm && mp && tegra2]:
3 #include "mem_layout.h"
5 EXTENSION class Platform_control
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,
16 static Mword _orig_reset_vector;
19 IMPLEMENTATION [arm && mp && tegra2]:
25 Mword Platform_control::_orig_reset_vector;
28 void Platform_control::reset_orig_reset_vector()
30 Io::write<Mword>(_orig_reset_vector, Kmem::mmio_remap(Reset_vector_addr));
35 Platform_control::boot_ap_cpus(Address phys_reset_vector)
37 // remember original reset vector
38 _orig_reset_vector = Io::read<Mword>(Kmem::mmio_remap(Reset_vector_addr));
40 // set (temporary) new reset vector
41 Io::write<Mword>(phys_reset_vector, Kmem::mmio_remap(Reset_vector_addr));
43 atexit(reset_orig_reset_vector);
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));
52 Io::write<Mword>(0, Kmem::mmio_remap(Unhalt_addr));