2 * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
11 #include <platform_def.h>
13 #include <drivers/st/stm32_iwdg.h>
14 #include <lib/xlat_tables/xlat_tables_v2.h>
16 /* Internal layout of the 32bit OTP word board_id */
17 #define BOARD_ID_BOARD_NB_MASK GENMASK(31, 16)
18 #define BOARD_ID_BOARD_NB_SHIFT 16
19 #define BOARD_ID_VARIANT_MASK GENMASK(15, 12)
20 #define BOARD_ID_VARIANT_SHIFT 12
21 #define BOARD_ID_REVISION_MASK GENMASK(11, 8)
22 #define BOARD_ID_REVISION_SHIFT 8
23 #define BOARD_ID_BOM_MASK GENMASK(3, 0)
25 #define BOARD_ID2NB(_id) (((_id) & BOARD_ID_BOARD_NB_MASK) >> \
26 BOARD_ID_BOARD_NB_SHIFT)
27 #define BOARD_ID2VAR(_id) (((_id) & BOARD_ID_VARIANT_MASK) >> \
28 BOARD_ID_VARIANT_SHIFT)
29 #define BOARD_ID2REV(_id) (((_id) & BOARD_ID_REVISION_MASK) >> \
30 BOARD_ID_REVISION_SHIFT)
31 #define BOARD_ID2BOM(_id) ((_id) & BOARD_ID_BOM_MASK)
33 #define MAP_SRAM MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
34 STM32MP_SYSRAM_SIZE, \
40 #define MAP_DEVICE1 MAP_REGION_FLAT(STM32MP1_DEVICE1_BASE, \
41 STM32MP1_DEVICE1_SIZE, \
47 #define MAP_DEVICE2 MAP_REGION_FLAT(STM32MP1_DEVICE2_BASE, \
48 STM32MP1_DEVICE2_SIZE, \
54 #if defined(IMAGE_BL2)
55 static const mmap_region_t stm32mp1_mmap
[] = {
62 #if defined(IMAGE_BL32)
63 static const mmap_region_t stm32mp1_mmap
[] = {
71 void configure_mmu(void)
73 mmap_add(stm32mp1_mmap
);
76 enable_mmu_svc_mon(0);
79 unsigned long stm32_get_gpio_bank_clock(unsigned int bank
)
81 if (bank
== GPIO_BANK_Z
) {
85 assert(GPIO_BANK_A
== 0 && bank
<= GPIO_BANK_K
);
87 return GPIOA
+ (bank
- GPIO_BANK_A
);
90 static int get_part_number(uint32_t *part_nb
)
95 if (stm32mp1_dbgmcu_get_chip_dev_id(&dev_id
) < 0) {
99 if (bsec_shadow_read_otp(&part_number
, PART_NUMBER_OTP
) != BSEC_OK
) {
100 ERROR("BSEC: PART_NUMBER_OTP Error\n");
104 part_number
= (part_number
& PART_NUMBER_OTP_PART_MASK
) >>
105 PART_NUMBER_OTP_PART_SHIFT
;
107 *part_nb
= part_number
| (dev_id
<< 16);
112 static int get_cpu_package(uint32_t *cpu_package
)
116 if (bsec_shadow_read_otp(&package
, PACKAGE_OTP
) != BSEC_OK
) {
117 ERROR("BSEC: PACKAGE_OTP Error\n");
121 *cpu_package
= (package
& PACKAGE_OTP_PKG_MASK
) >>
122 PACKAGE_OTP_PKG_SHIFT
;
127 void stm32mp_print_cpuinfo(void)
129 const char *cpu_s
, *cpu_r
, *pkg
;
130 uint32_t part_number
;
131 uint32_t cpu_package
;
132 uint32_t chip_dev_id
;
135 /* MPUs Part Numbers */
136 ret
= get_part_number(&part_number
);
138 WARN("Cannot get part number\n");
142 switch (part_number
) {
143 case STM32MP157C_PART_NB
:
146 case STM32MP157A_PART_NB
:
149 case STM32MP153C_PART_NB
:
152 case STM32MP153A_PART_NB
:
155 case STM32MP151C_PART_NB
:
158 case STM32MP151A_PART_NB
:
167 ret
= get_cpu_package(&cpu_package
);
169 WARN("Cannot get CPU package\n");
173 switch (cpu_package
) {
174 case PKG_AA_LFBGA448
:
177 case PKG_AB_LFBGA354
:
180 case PKG_AC_TFBGA361
:
183 case PKG_AD_TFBGA257
:
192 ret
= stm32mp1_dbgmcu_get_chip_version(&chip_dev_id
);
194 WARN("Cannot get CPU version\n");
198 switch (chip_dev_id
) {
207 NOTICE("CPU: STM32MP%s%s Rev.%s\n", cpu_s
, pkg
, cpu_r
);
210 void stm32mp_print_boardinfo(void)
214 int bsec_node
, bsec_board_id_node
;
216 const fdt32_t
*cuint
;
218 if (fdt_get_address(&fdt
) == 0) {
222 bsec_node
= fdt_node_offset_by_compatible(fdt
, -1, DT_BSEC_COMPAT
);
227 bsec_board_id_node
= fdt_subnode_offset(fdt
, bsec_node
, "board_id");
228 if (bsec_board_id_node
<= 0) {
232 cuint
= fdt_getprop(fdt
, bsec_board_id_node
, "reg", NULL
);
237 board_otp
= fdt32_to_cpu(*cuint
) / sizeof(uint32_t);
239 if (bsec_shadow_read_otp(&board_id
, board_otp
) != BSEC_OK
) {
240 ERROR("BSEC: PART_NUMBER_OTP Error\n");
244 if (board_id
!= 0U) {
247 rev
[0] = BOARD_ID2REV(board_id
) - 1 + 'A';
249 NOTICE("Board: MB%04x Var%d Rev.%s-%02d\n",
250 BOARD_ID2NB(board_id
),
251 BOARD_ID2VAR(board_id
),
253 BOARD_ID2BOM(board_id
));
257 /* Return true when SoC provides a single Cortex-A7 core, and false otherwise */
258 bool stm32mp_is_single_core(void)
260 uint32_t part_number
;
263 if (get_part_number(&part_number
) < 0) {
264 ERROR("Invalid part number, assume single core chip");
268 switch (part_number
) {
269 case STM32MP151A_PART_NB
:
270 case STM32MP151C_PART_NB
:
281 /* Return true when device is in closed state */
282 bool stm32mp_is_closed_device(void)
286 if ((bsec_shadow_register(DATA0_OTP
) != BSEC_OK
) ||
287 (bsec_read_otp(&value
, DATA0_OTP
) != BSEC_OK
)) {
291 return (value
& DATA0_OTP_SECURED
) == DATA0_OTP_SECURED
;
294 uint32_t stm32_iwdg_get_instance(uintptr_t base
)
306 uint32_t stm32_iwdg_get_otp_config(uint32_t iwdg_inst
)
308 uint32_t iwdg_cfg
= 0U;
311 #if defined(IMAGE_BL2)
312 if (bsec_shadow_register(HW2_OTP
) != BSEC_OK
) {
317 if (bsec_read_otp(&otp_value
, HW2_OTP
) != BSEC_OK
) {
321 if ((otp_value
& BIT(iwdg_inst
+ HW2_OTP_IWDG_HW_POS
)) != 0U) {
322 iwdg_cfg
|= IWDG_HW_ENABLED
;
325 if ((otp_value
& BIT(iwdg_inst
+ HW2_OTP_IWDG_FZ_STOP_POS
)) != 0U) {
326 iwdg_cfg
|= IWDG_DISABLE_ON_STOP
;
329 if ((otp_value
& BIT(iwdg_inst
+ HW2_OTP_IWDG_FZ_STANDBY_POS
)) != 0U) {
330 iwdg_cfg
|= IWDG_DISABLE_ON_STANDBY
;
336 #if defined(IMAGE_BL2)
337 uint32_t stm32_iwdg_shadow_update(uint32_t iwdg_inst
, uint32_t flags
)
342 if (bsec_shadow_read_otp(&otp
, HW2_OTP
) != BSEC_OK
) {
346 if ((flags
& IWDG_DISABLE_ON_STOP
) != 0U) {
347 otp
|= BIT(iwdg_inst
+ HW2_OTP_IWDG_FZ_STOP_POS
);
350 if ((flags
& IWDG_DISABLE_ON_STANDBY
) != 0U) {
351 otp
|= BIT(iwdg_inst
+ HW2_OTP_IWDG_FZ_STANDBY_POS
);
354 result
= bsec_write_otp(otp
, HW2_OTP
);
355 if (result
!= BSEC_OK
) {
359 /* Sticky lock OTP_IWDG (read and write) */
360 if (!bsec_write_sr_lock(HW2_OTP
, 1U) ||
361 !bsec_write_sw_lock(HW2_OTP
, 1U)) {
362 return BSEC_LOCK_FAIL
;