]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/board_check-arm-realview.cpp
829f30a8ec20d94ed78cc78bc7560eb53d201797
[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]:
47
48 #include "kmem.h"
49 #include "io.h"
50 #include "static_init.h"
51 #include "processor.h"
52
53 #include <cstdio>
54
55 enum
56 {
57   SYS_ID = Kmem::System_regs_map_base + 0x0,
58 };
59
60 IMPLEMENT static FIASCO_INIT
61 Mword
62 Board_check::read_board_id()
63 { return Io::read<Mword>(SYS_ID); }
64
65 IMPLEMENT static FIASCO_INIT
66 void
67 Board_check::check_board()
68 {
69   Mword id = read_board_id();
70
71   printf("Realview System ID: Rev=%lx HBI=%03lx Build=%lx Arch=%lx FPGA=%02lx\n",
72          id >> 28, (id >> 16) & 0xfff, (id >> 12) & 0xf,
73          (id >> 8) & 0xf, id & 0xff);
74
75   for (unsigned i = 0; i < (sizeof(ids) / sizeof(ids[0])); ++i)
76     if ((id & ids[i].mask) == ids[i].id)
77       return;
78
79   printf("  Invalid System ID for this kernel config\n");
80   for (unsigned i = 0; i < (sizeof(ids) / sizeof(ids[0])); ++i)
81     printf("  Expected (%08lx & %08x) == %08x%s\n",
82            id, ids[i].mask, ids[i].id,
83            i + 1 < (sizeof(ids) / sizeof(ids[0])) ? ", or" : "");
84   printf("  Stopping.\n");
85   while (1)
86     Proc::halt();
87 }
88
89 STATIC_INITIALIZEX_P(Board_check, check_board, GDB_INIT_PRIO);