]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/exynos/smc.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / exynos / smc.cpp
1 INTERFACE [exynos]:
2
3 #include "l4_types.h"
4
5 class Exynos_smc
6 {
7 public:
8   static void cpuboot(Mword, unsigned);
9   static void l2cache_setup(unsigned, unsigned, unsigned, Mword, Mword, Mword);
10 };
11
12 // ------------------------------------------------------------------------
13 INTERFACE [exynos && arm_em_ns && arm_smif_mc]:
14
15 #include "types.h"
16
17 EXTENSION class Exynos_smc
18 {
19 private:
20   enum Command : Smword
21   {
22     Init       = -1,
23     Info       = -2,
24     Sleep      = -3,
25     Cpu1boot   = -4,
26     Cpu0aftr   = -5,
27     C15resume  = -11,
28     L2x0ctrl   = -21,
29     L2x0setup1 = -22,
30     L2x0setup2 = -23,
31     L2x0invall = -24,
32     L2x0debug  = -25,
33     Reg        = -101,
34   };
35
36   static int call(Command cmd, Mword a1 = 0, Mword a2 = 0, Mword a3 = 0)
37   {
38     register Mword _cmd asm("r0") = cmd;
39     register Mword _a1  asm("r1") = a1;
40     register Mword _a2  asm("r2") = a2;
41     register Mword _a3  asm("r3") = a3;
42
43     asm volatile("dmb   \t\n" // Errata 766421
44                  "smc 0 \t\n"
45                  "dmb   \t\n" // Errata 766421
46                  : "=r" (_cmd)
47                  : "r" (_cmd), "r" (_a1), "r" (_a2), "r" (_a3)
48                  : "memory", "cc");
49     return _cmd;
50   }
51 };
52
53 // ------------------------------------------------------------------------
54 IMPLEMENTATION [exynos && arm_em_ns && arm_smif_mc]:
55
56 #include "mem_space.h"
57 #include "mem_unit.h"
58 #include <cstdio>
59
60 IMPLEMENT
61 void
62 Exynos_smc::cpuboot(Mword, unsigned cpu)
63 {
64   call(Cpu1boot, cpu);
65 }
66
67 IMPLEMENT
68 void
69 Exynos_smc::l2cache_setup(unsigned tag_lat, unsigned data_lat,
70                           unsigned prefctrl, Mword setup2val,
71                           Mword aux_val, Mword aux_mask)
72 {
73   call(L2x0setup1, tag_lat, data_lat, prefctrl);
74   call(L2x0setup2, setup2val, aux_val, aux_mask);
75   call(L2x0invall);
76   call(L2x0ctrl, 1);
77 }
78
79 // ------------------------------------------------------------------------
80 IMPLEMENTATION [exynos && !arm_em_ns]:
81
82 IMPLEMENT inline
83 void
84 Exynos_smc::cpuboot(Mword, unsigned)
85 {}
86
87 IMPLEMENT inline
88 void
89 Exynos_smc::l2cache_setup(unsigned, unsigned, unsigned, Mword, Mword, Mword)
90 {}