Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / minix / board.h @ 13

History | View | Annotate | Download (6.8 KB)

1 13 up20180614
#ifndef __BOARD_H__
2
#define __BOARD_H__
3
#include <string.h>
4
/*
5
  Utility functions to access/parse the board_id defined in the machine
6
  struct in include/minix/type.h.
7

8
   Identifier for the board
9
     [31:28] Architecture.  (MINIX_BOARD_ARCH)
10
     [27:24] Architecture variant (MINIX_BOARD_ARCH_VARIANT) VERSION e.g. ARMV7
11
     [23:16] Vendor/Soc (EG TI )  (MINIX_BOARD_VENDOR)
12
     [15:8]  Board      (EG Beagle bone , beagle board ) (MINIX_BOARD)
13
     [7:0]   Board variant (EG BealgeBone white v.s. BeagleBone black ) (MINIX_BOARD_VARIANT)
14
*/
15
16
#define MINIX_BOARD_ARCH_SHIFT         (28)
17
#define MINIX_BOARD_ARCH_VARIANT_SHIFT (24)
18
#define MINIX_BOARD_VENDOR_SHIFT       (16)
19
#define MINIX_BOARD_SHIFT              (8)
20
#define MINIX_BOARD_VARIANT_SHIFT      (0)
21
22
/* 4 bits */
23
#define MINIX_BOARD_ARCH_MASK \
24
        (0XF << MINIX_BOARD_ARCH_SHIFT)
25
/* 4 bits */
26
#define MINIX_BOARD_ARCH_VARIANT_MASK \
27
        (0XF << MINIX_BOARD_ARCH_VARIANT_SHIFT)
28
/* 8 bits */
29
#define MINIX_BOARD_VENDOR_MASK \
30
        (0XFF << MINIX_BOARD_VENDOR_SHIFT)
31
/* 8 bits */
32
#define MINIX_BOARD_MASK \
33
        (0XFF << MINIX_BOARD_SHIFT)
34
/* 8 bits */
35
#define MINIX_BOARD_VARIANT_MASK \
36
        (0XFF << MINIX_BOARD_VARIANT_SHIFT)
37
38
#define MINIX_MK_BOARD_ARCH(v) \
39
        ((v << MINIX_BOARD_ARCH_SHIFT ) & MINIX_BOARD_ARCH_MASK)
40
#define MINIX_MK_BOARD_ARCH_VARIANT(v) \
41
        (( v << MINIX_BOARD_ARCH_VARIANT_SHIFT) & MINIX_BOARD_ARCH_VARIANT_MASK )
42
#define MINIX_MK_BOARD_VENDOR(v) \
43
        (( v << MINIX_BOARD_VENDOR_SHIFT) & MINIX_BOARD_VENDOR_MASK )
44
#define MINIX_MK_BOARD(v) \
45
        (( v << MINIX_BOARD_SHIFT) & MINIX_BOARD_MASK )
46
#define MINIX_MK_BOARD_VARIANT(v) \
47
        (( v << MINIX_BOARD_VARIANT_SHIFT) & MINIX_BOARD_VARIANT_MASK )
48
49
#define MINIX_BOARD_ARCH(v) \
50
        ((v & MINIX_BOARD_ARCH_MASK) >> MINIX_BOARD_ARCH_SHIFT )
51
#define MINIX_BOARD_ARCH_VARIANT(v) \
52
        (( v & MINIX_BOARD_ARCH_VARIANT_MASK) >> MINIX_BOARD_ARCH_VARIANT_SHIFT)
53
#define MINIX_BOARD_VENDOR(v) \
54
        (( v & MINIX_BOARD_VENDOR_MASK) >> MINIX_BOARD_VENDOR_SHIFT)
55
#define MINIX_BOARD(v) \
56
        (( v & MINIX_BOARD_MASK) >> MINIX_BOARD_SHIFT)
57
#define MINIX_BOARD_VARIANT(v) \
58
        (( v & MINIX_BOARD_VARIANT_MASK) >> MINIX_BOARD_VARIANT_SHIFT)
59
60
/* We want to make it possible to use masks and therefore only try to use bits */
61
#define MINIX_BOARD_ARCH_X86 MINIX_MK_BOARD_ARCH(1 << 0)
62
#define MINIX_BOARD_ARCH_ARM MINIX_MK_BOARD_ARCH(1 << 1)
63
64
#define MINIX_BOARD_ARCH_VARIANT_X86_GENERIC MINIX_MK_BOARD_ARCH_VARIANT(1<<0)
65
#define MINIX_BOARD_ARCH_VARIANT_ARM_ARMV6 MINIX_MK_BOARD_ARCH_VARIANT(1<<1)
66
#define MINIX_BOARD_ARCH_VARIANT_ARM_ARMV7 MINIX_MK_BOARD_ARCH_VARIANT(1<<2)
67
68
#define MINIX_BOARD_VENDOR_INTEL MINIX_MK_BOARD_VENDOR(1<<0)
69
#define MINIX_BOARD_VENDOR_TI MINIX_MK_BOARD_VENDOR(1<<1)
70
71
#define MINIX_BOARD_GENERIC MINIX_MK_BOARD(1<<0)
72
/* BeagleBoard XM */
73
#define MINIX_BOARD_BBXM MINIX_MK_BOARD(1<<1)
74
/* BeagleBone (Black and* white) */
75
#define MINIX_BOARD_BB MINIX_MK_BOARD(1<<2)
76
77
/* Only  one  of a kind */
78
#define MINIX_BOARD_VARIANT_GENERIC MINIX_MK_BOARD_VARIANT(1<<0)
79
/* BeagleBone White */
80
#define MINIX_BOARD_VARIANT_BBW MINIX_MK_BOARD_VARIANT(1<<1)
81
/* BeagleBone Black */
82
#define MINIX_BOARD_VARIANT_BBB MINIX_MK_BOARD_VARIANT(1<<2)
83
84
#define BOARD_ID_INTEL \
85
        ( MINIX_BOARD_ARCH_X86 \
86
        | MINIX_BOARD_ARCH_VARIANT_X86_GENERIC \
87
        | MINIX_BOARD_VENDOR_INTEL \
88
        | MINIX_BOARD_GENERIC \
89
        | MINIX_BOARD_VARIANT_GENERIC\
90
        )
91
92
#define BOARD_ID_BBXM \
93
        ( MINIX_BOARD_ARCH_ARM \
94
        | MINIX_BOARD_ARCH_VARIANT_ARM_ARMV7 \
95
        | MINIX_BOARD_VENDOR_TI \
96
        | MINIX_BOARD_BBXM \
97
        | MINIX_BOARD_VARIANT_GENERIC\
98
        )
99
100
#define BOARD_ID_BBW \
101
        ( MINIX_BOARD_ARCH_ARM \
102
        | MINIX_BOARD_ARCH_VARIANT_ARM_ARMV7 \
103
        | MINIX_BOARD_VENDOR_TI \
104
        | MINIX_BOARD_BB \
105
        | MINIX_BOARD_VARIANT_BBW\
106
        )
107
108
#define BOARD_ID_BBB \
109
        ( MINIX_BOARD_ARCH_ARM \
110
        | MINIX_BOARD_ARCH_VARIANT_ARM_ARMV7 \
111
        | MINIX_BOARD_VENDOR_TI \
112
        | MINIX_BOARD_BB \
113
        | MINIX_BOARD_VARIANT_BBB\
114
        )
115
116
#define BOARD_IS_BBXM(v) \
117
                ( (BOARD_ID_BBXM & ~MINIX_BOARD_VARIANT_MASK) == (v & ~MINIX_BOARD_VARIANT_MASK))
118
/* Either one of the known BeagleBones */
119
#define BOARD_IS_BB(v)   \
120
                ( (BOARD_ID_BBW & ~MINIX_BOARD_VARIANT_MASK) == (v & ~MINIX_BOARD_VARIANT_MASK))
121
#define BOARD_IS_BBW(v)  ( v == BOARD_ID_BBW)
122
#define BOARD_IS_BBB(v)  ( v == BOARD_ID_BBB)
123
124
#define BOARD_FILTER_BBXM_VALUE (BOARD_ID_BBXM)
125
#define BOARD_FILTER_BBXM_MASK  \
126
                (MINIX_BOARD_ARCH_MASK \
127
                | MINIX_BOARD_ARCH_VARIANT_MASK \
128
                | MINIX_BOARD_VENDOR_MASK \
129
                | MINIX_BOARD_MASK \
130
                | MINIX_BOARD_VARIANT_MASK)
131
132
#define BOARD_FILTER_BB_VALUE   (BOARD_ID_BBW & ~MINIX_BOARD_VARIANT_MASK)
133
#define BOARD_FILTER_BB_MASK    \
134
                (MINIX_BOARD_ARCH_MASK \
135
                | MINIX_BOARD_ARCH_VARIANT_MASK \
136
                | MINIX_BOARD_VENDOR_MASK \
137
                | MINIX_BOARD_MASK )
138
139
struct shortname2id
140
{
141
        const char name[15];
142
        unsigned int id;
143
};
144
145
146
/* mapping from fields given by the bootloader to board id's */
147
static struct shortname2id shortname2id[] = {
148
        {.name = "BBXM",.id = BOARD_ID_BBXM},
149
        {.name = "A335BONE",.id = BOARD_ID_BBW},
150
        {.name = "A335BNLT",.id = BOARD_ID_BBB},
151
};
152
153
struct board_id2name
154
{
155
        unsigned int id;
156
        const char name[40];
157
};
158
159
/* how to convert a BOARD id to a board name */
160
static struct board_id2name board_id2name[] = {
161
        {.id = BOARD_ID_INTEL,.name = "X86-I586-GENERIC-GENERIC-GENERIC"},
162
        {.id = BOARD_ID_BBXM,.name = "ARM-ARMV7-TI-BBXM-GENERIC"},
163
        {.id = BOARD_ID_BBW,.name = "ARM-ARMV7-TI-BB-WHITE"},
164
        {.id = BOARD_ID_BBB,.name = "ARM-ARMV7-TI-BB-BLACK"},
165
};
166
167
struct board_arch2arch
168
{
169
        unsigned int board_arch;
170
        const char arch[40];
171
};
172
/* Mapping from board_arch to arch */
173
static struct board_arch2arch board_arch2arch[] = {
174
        {.board_arch = MINIX_BOARD_ARCH_ARM ,.arch = "earm"},
175
        {.board_arch = MINIX_BOARD_ARCH_X86 ,.arch = "i386"},
176
};
177
178
/* returns 0 if no board was found that match that id */
179
static int
180
get_board_id_by_short_name(const char *name)
181
{
182
        int x;
183
        for (x = 0; x < sizeof(shortname2id) / sizeof(shortname2id[0]); x++) {
184
                if (strncmp(name, shortname2id[x].name, 15) == 0) {
185
                        return shortname2id[x].id;
186
                }
187
        }
188
        return 0;
189
}
190
191
/* returns 0 if no board was found that match that id */
192
static int
193
get_board_id_by_name(const char *name)
194
{
195
        int x;
196
        for (x = 0; x < sizeof(board_id2name) / sizeof(board_id2name[0]); x++) {
197
                if (strncmp(name, board_id2name[x].name, 40) == 0) {
198
                        return board_id2name[x].id;
199
                }
200
        }
201
        return 0;
202
}
203
204
/* convert a board id to a board name to use later
205
   returns NULL if no board was found that match that id */
206
static const char *
207
get_board_name(unsigned int id)
208
{
209
        int x;
210
        for (x = 0; x < sizeof(board_id2name) / sizeof(board_id2name[0]); x++) {
211
                if (board_id2name[x].id == id) {
212
                        return board_id2name[x].name;
213
                }
214
        }
215
        return NULL;
216
}
217
218
/* convert a board id to a board name to use later
219
   returns NULL if no board was found that match that id */
220
static const char *
221
get_board_arch_name(unsigned int id)
222
{
223
        int x;
224
        for (x = 0; x < sizeof(board_arch2arch) / sizeof(board_arch2arch[0]); x++) {
225
                if (board_arch2arch[x].board_arch == (id & MINIX_BOARD_ARCH_MASK) ) {
226
                        return board_arch2arch[x].arch;
227
                }
228
        }
229
        return NULL;
230
}
231
232
#endif