|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. |
| 2 | + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. |
3 | 3 | *
|
4 | 4 | * SPDX-License-Identifier: BSD-3-Clause
|
5 | 5 | */
|
|
17 | 17 | #include <stm32mp_dt.h>
|
18 | 18 | #include <xlat_tables_v2.h>
|
19 | 19 |
|
| 20 | +/* Internal layout of the 32bit OTP word board_id */ |
| 21 | +#define BOARD_ID_BOARD_NB_MASK GENMASK(31, 16) |
| 22 | +#define BOARD_ID_BOARD_NB_SHIFT 16 |
| 23 | +#define BOARD_ID_VARIANT_MASK GENMASK(15, 12) |
| 24 | +#define BOARD_ID_VARIANT_SHIFT 12 |
| 25 | +#define BOARD_ID_REVISION_MASK GENMASK(11, 8) |
| 26 | +#define BOARD_ID_REVISION_SHIFT 8 |
| 27 | +#define BOARD_ID_BOM_MASK GENMASK(3, 0) |
| 28 | + |
| 29 | +#define BOARD_ID2NB(_id) (((_id) & BOARD_ID_BOARD_NB_MASK) >> \ |
| 30 | + BOARD_ID_BOARD_NB_SHIFT) |
| 31 | +#define BOARD_ID2VAR(_id) (((_id) & BOARD_ID_VARIANT_MASK) >> \ |
| 32 | + BOARD_ID_VARIANT_SHIFT) |
| 33 | +#define BOARD_ID2REV(_id) (((_id) & BOARD_ID_REVISION_MASK) >> \ |
| 34 | + BOARD_ID_REVISION_SHIFT) |
| 35 | +#define BOARD_ID2BOM(_id) ((_id) & BOARD_ID_BOM_MASK) |
| 36 | + |
20 | 37 | #define MAP_ROM MAP_REGION_FLAT(STM32MP_ROM_BASE, \
|
21 | 38 | STM32MP_ROM_SIZE, \
|
22 | 39 | MT_MEMORY | \
|
@@ -237,23 +254,49 @@ void stm32mp_print_cpuinfo(void)
|
237 | 254 |
|
238 | 255 | void stm32mp_print_boardinfo(void)
|
239 | 256 | {
|
240 |
| - uint32_t board; |
241 |
| - int res = 0; |
| 257 | + uint32_t board_id = 0; |
| 258 | + uint32_t board_otp; |
| 259 | + int bsec_node, bsec_board_id_node; |
| 260 | + void *fdt; |
| 261 | + const fdt32_t *cuint; |
| 262 | + |
| 263 | + if (fdt_get_address(&fdt) == 0) { |
| 264 | + panic(); |
| 265 | + } |
| 266 | + |
| 267 | + bsec_node = fdt_node_offset_by_compatible(fdt, -1, DT_BSEC_COMPAT); |
| 268 | + if (bsec_node < 0) { |
| 269 | + return; |
| 270 | + } |
| 271 | + |
| 272 | + bsec_board_id_node = fdt_subnode_offset(fdt, bsec_node, "board_id"); |
| 273 | + if (bsec_board_id_node <= 0) { |
| 274 | + return; |
| 275 | + } |
| 276 | + |
| 277 | + cuint = fdt_getprop(fdt, bsec_board_id_node, "reg", NULL); |
| 278 | + if (cuint == NULL) { |
| 279 | + ERROR("board_id node without reg property\n"); |
| 280 | + panic(); |
| 281 | + } |
| 282 | + |
| 283 | + board_otp = fdt32_to_cpu(*cuint) / sizeof(uint32_t); |
242 | 284 |
|
243 |
| - if (bsec_shadow_read_otp(&board, BOARD_OTP) != BSEC_OK) { |
| 285 | + if (bsec_shadow_read_otp(&board_id, board_otp) != BSEC_OK) { |
244 | 286 | ERROR("BSEC: PART_NUMBER_OTP Error\n");
|
245 |
| - res = -1; |
| 287 | + return; |
246 | 288 | }
|
247 | 289 |
|
248 |
| - if ((res == 0) && (board != 0U)) { |
249 |
| - char rev[1]; |
| 290 | + if (board_id != 0U) { |
| 291 | + char rev[2]; |
250 | 292 |
|
251 |
| - *rev = ((board >> 8) & 0xF) - 1 + 'A'; |
| 293 | + rev[0] = BOARD_ID2REV(board_id) - 1 + 'A'; |
| 294 | + rev[1] = '\0'; |
252 | 295 | NOTICE("Board: MB%04x Var%d Rev.%s-%02d\n",
|
253 |
| - board >> 16, |
254 |
| - (board >> 12) & 0xF, |
| 296 | + BOARD_ID2NB(board_id), |
| 297 | + BOARD_ID2VAR(board_id), |
255 | 298 | rev,
|
256 |
| - board & 0xF); |
| 299 | + BOARD_ID2BOM(board_id)); |
257 | 300 | }
|
258 | 301 | }
|
259 | 302 |
|
|
0 commit comments