]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/board_check-arm-realview.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / realview / board_check-arm-realview.cpp
1 INTERFACE [arm && realview]:
2
3 #include "types.h"
4
5 class Board_check
6 {
7 public:
8   static void check_board();
9
10 private:
11   static Mword read_board_id();
12   struct id_pair {
13     unsigned mask, id;
14   };
15   static id_pair ids[];
16 };
17
18 // ------------------------------------------------------------------------
19 IMPLEMENTATION [arm && realview]:
20
21 #include "initcalls.h"
22
23 // ------------------------------------------------------------------------
24 IMPLEMENTATION [arm && realview && realview_eb]:
25
26 Board_check::id_pair Board_check::ids[] FIASCO_INITDATA = {
27   { 0x1ffffe00, 0x01400400 },
28 };
29
30 // ------------------------------------------------------------------------
31 IMPLEMENTATION [arm && realview && realview_pb11mp]:
32
33 Board_check::id_pair Board_check::ids[] FIASCO_INITDATA = {
34   { 0x0fffff00, 0x0159f500 },
35 };
36
37 // ------------------------------------------------------------------------
38 IMPLEMENTATION [arm && realview && realview_pbx]:
39
40 Board_check::id_pair Board_check::ids[] FIASCO_INITDATA = {
41   { 0xffffff00, 0x1182f500 }, // board
42   { 0xffffff00, 0x01780500 }, // qemu
43 };
44
45 // ------------------------------------------------------------------------
46 IMPLEMENTATION [arm && realview && realview_vexpress]:
47
48 Board_check::id_pair Board_check::ids[] FIASCO_INITDATA = {
49   { 0xffffff00, 0x1190f500 },
50 };
51
52 // ------------------------------------------------------------------------
53 IMPLEMENTATION [arm && realview]:
54
55 #include "kmem.h"
56 #include "io.h"
57 #include "static_init.h"
58 #include "processor.h"
59
60 #include <cstdio>
61
62 enum
63 {
64   SYS_ID = Kmem::System_regs_map_base + 0x0,
65 };
66
67 IMPLEMENT static FIASCO_INIT
68 Mword
69 Board_check::read_board_id()
70 { return Io::read<Mword>(SYS_ID); }
71
72 IMPLEMENT static FIASCO_INIT
73 void
74 Board_check::check_board()
75 {
76   Mword id = read_board_id();
77
78   printf("Realview System ID: Rev=%lx HBI=%03lx Build=%lx Arch=%lx FPGA=%02lx\n",
79          id >> 28, (id >> 16) & 0xfff, (id >> 12) & 0xf,
80          (id >> 8) & 0xf, id & 0xff);
81
82   for (unsigned i = 0; i < (sizeof(ids) / sizeof(ids[0])); ++i)
83     if ((id & ids[i].mask) == ids[i].id)
84       return;
85
86   printf("  Invalid System ID for this kernel config\n");
87   for (unsigned i = 0; i < (sizeof(ids) / sizeof(ids[0])); ++i)
88     printf("  Expected (%08lx & %08x) == %08x%s\n",
89            id, ids[i].mask, ids[i].id,
90            i + 1 < (sizeof(ids) / sizeof(ids[0])) ? ", or" : "");
91   printf("  Stopping.\n");
92   while (1)
93     Proc::halt();
94 }
95
96 STATIC_INITIALIZEX_P(Board_check, check_board, GDB_INIT_PRIO);