xref: /rk3399_ARM-atf/plat/st/stm32mp1/stm32mp1_private.c (revision 73680c230f8503a8e0f625834bc987b90e065b03)
1c9d75b3cSYann Gautier /*
2c9d75b3cSYann Gautier  * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
3c9d75b3cSYann Gautier  *
4c9d75b3cSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5c9d75b3cSYann Gautier  */
6c9d75b3cSYann Gautier 
78f282daeSYann Gautier #include <assert.h>
88f282daeSYann Gautier 
9c9d75b3cSYann Gautier #include <platform_def.h>
10c9d75b3cSYann Gautier 
11*73680c23SYann Gautier #include <drivers/st/stm32_iwdg.h>
12c9d75b3cSYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h>
13c9d75b3cSYann Gautier 
143f9c9784SYann Gautier #define MAP_SRAM	MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
153f9c9784SYann Gautier 					STM32MP_SYSRAM_SIZE, \
16c9d75b3cSYann Gautier 					MT_MEMORY | \
17c9d75b3cSYann Gautier 					MT_RW | \
18c9d75b3cSYann Gautier 					MT_SECURE | \
19c9d75b3cSYann Gautier 					MT_EXECUTE_NEVER)
20c9d75b3cSYann Gautier 
21c9d75b3cSYann Gautier #define MAP_DEVICE1	MAP_REGION_FLAT(STM32MP1_DEVICE1_BASE, \
22c9d75b3cSYann Gautier 					STM32MP1_DEVICE1_SIZE, \
23c9d75b3cSYann Gautier 					MT_DEVICE | \
24c9d75b3cSYann Gautier 					MT_RW | \
25c9d75b3cSYann Gautier 					MT_SECURE | \
26c9d75b3cSYann Gautier 					MT_EXECUTE_NEVER)
27c9d75b3cSYann Gautier 
28c9d75b3cSYann Gautier #define MAP_DEVICE2	MAP_REGION_FLAT(STM32MP1_DEVICE2_BASE, \
29c9d75b3cSYann Gautier 					STM32MP1_DEVICE2_SIZE, \
30c9d75b3cSYann Gautier 					MT_DEVICE | \
31c9d75b3cSYann Gautier 					MT_RW | \
32c9d75b3cSYann Gautier 					MT_SECURE | \
33c9d75b3cSYann Gautier 					MT_EXECUTE_NEVER)
34c9d75b3cSYann Gautier 
35c9d75b3cSYann Gautier #if defined(IMAGE_BL2)
36c9d75b3cSYann Gautier static const mmap_region_t stm32mp1_mmap[] = {
37c9d75b3cSYann Gautier 	MAP_SRAM,
38c9d75b3cSYann Gautier 	MAP_DEVICE1,
39c9d75b3cSYann Gautier 	MAP_DEVICE2,
40c9d75b3cSYann Gautier 	{0}
41c9d75b3cSYann Gautier };
42c9d75b3cSYann Gautier #endif
43c9d75b3cSYann Gautier #if defined(IMAGE_BL32)
44c9d75b3cSYann Gautier static const mmap_region_t stm32mp1_mmap[] = {
45c9d75b3cSYann Gautier 	MAP_SRAM,
46c9d75b3cSYann Gautier 	MAP_DEVICE1,
47c9d75b3cSYann Gautier 	MAP_DEVICE2,
48c9d75b3cSYann Gautier 	{0}
49c9d75b3cSYann Gautier };
50c9d75b3cSYann Gautier #endif
51c9d75b3cSYann Gautier 
52c9d75b3cSYann Gautier void configure_mmu(void)
53c9d75b3cSYann Gautier {
54c9d75b3cSYann Gautier 	mmap_add(stm32mp1_mmap);
55c9d75b3cSYann Gautier 	init_xlat_tables();
56c9d75b3cSYann Gautier 
57c9d75b3cSYann Gautier 	enable_mmu_svc_mon(0);
58c9d75b3cSYann Gautier }
598f282daeSYann Gautier 
608f282daeSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
618f282daeSYann Gautier {
628f282daeSYann Gautier 	if (bank == GPIO_BANK_Z) {
638f282daeSYann Gautier 		return GPIOZ;
648f282daeSYann Gautier 	}
658f282daeSYann Gautier 
668f282daeSYann Gautier 	assert(GPIO_BANK_A == 0 && bank <= GPIO_BANK_K);
678f282daeSYann Gautier 
688f282daeSYann Gautier 	return GPIOA + (bank - GPIO_BANK_A);
698f282daeSYann Gautier }
70*73680c23SYann Gautier 
71*73680c23SYann Gautier uint32_t stm32_iwdg_get_instance(uintptr_t base)
72*73680c23SYann Gautier {
73*73680c23SYann Gautier 	switch (base) {
74*73680c23SYann Gautier 	case IWDG1_BASE:
75*73680c23SYann Gautier 		return IWDG1_INST;
76*73680c23SYann Gautier 	case IWDG2_BASE:
77*73680c23SYann Gautier 		return IWDG2_INST;
78*73680c23SYann Gautier 	default:
79*73680c23SYann Gautier 		panic();
80*73680c23SYann Gautier 	}
81*73680c23SYann Gautier }
82*73680c23SYann Gautier 
83*73680c23SYann Gautier uint32_t stm32_iwdg_get_otp_config(uint32_t iwdg_inst)
84*73680c23SYann Gautier {
85*73680c23SYann Gautier 	uint32_t iwdg_cfg = 0U;
86*73680c23SYann Gautier 	uint32_t otp_value;
87*73680c23SYann Gautier 
88*73680c23SYann Gautier #if defined(IMAGE_BL2)
89*73680c23SYann Gautier 	if (bsec_shadow_register(HW2_OTP) != BSEC_OK) {
90*73680c23SYann Gautier 		panic();
91*73680c23SYann Gautier 	}
92*73680c23SYann Gautier #endif
93*73680c23SYann Gautier 
94*73680c23SYann Gautier 	if (bsec_read_otp(&otp_value, HW2_OTP) != BSEC_OK) {
95*73680c23SYann Gautier 		panic();
96*73680c23SYann Gautier 	}
97*73680c23SYann Gautier 
98*73680c23SYann Gautier 	if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_HW_POS)) != 0U) {
99*73680c23SYann Gautier 		iwdg_cfg |= IWDG_HW_ENABLED;
100*73680c23SYann Gautier 	}
101*73680c23SYann Gautier 
102*73680c23SYann Gautier 	if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS)) != 0U) {
103*73680c23SYann Gautier 		iwdg_cfg |= IWDG_DISABLE_ON_STOP;
104*73680c23SYann Gautier 	}
105*73680c23SYann Gautier 
106*73680c23SYann Gautier 	if ((otp_value & BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS)) != 0U) {
107*73680c23SYann Gautier 		iwdg_cfg |= IWDG_DISABLE_ON_STANDBY;
108*73680c23SYann Gautier 	}
109*73680c23SYann Gautier 
110*73680c23SYann Gautier 	return iwdg_cfg;
111*73680c23SYann Gautier }
112*73680c23SYann Gautier 
113*73680c23SYann Gautier #if defined(IMAGE_BL2)
114*73680c23SYann Gautier uint32_t stm32_iwdg_shadow_update(uint32_t iwdg_inst, uint32_t flags)
115*73680c23SYann Gautier {
116*73680c23SYann Gautier 	uint32_t otp;
117*73680c23SYann Gautier 	uint32_t result;
118*73680c23SYann Gautier 
119*73680c23SYann Gautier 	if (bsec_shadow_read_otp(&otp, HW2_OTP) != BSEC_OK) {
120*73680c23SYann Gautier 		panic();
121*73680c23SYann Gautier 	}
122*73680c23SYann Gautier 
123*73680c23SYann Gautier 	if ((flags & IWDG_DISABLE_ON_STOP) != 0U) {
124*73680c23SYann Gautier 		otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STOP_POS);
125*73680c23SYann Gautier 	}
126*73680c23SYann Gautier 
127*73680c23SYann Gautier 	if ((flags & IWDG_DISABLE_ON_STANDBY) != 0U) {
128*73680c23SYann Gautier 		otp |= BIT(iwdg_inst + HW2_OTP_IWDG_FZ_STANDBY_POS);
129*73680c23SYann Gautier 	}
130*73680c23SYann Gautier 
131*73680c23SYann Gautier 	result = bsec_write_otp(otp, HW2_OTP);
132*73680c23SYann Gautier 	if (result != BSEC_OK) {
133*73680c23SYann Gautier 		return result;
134*73680c23SYann Gautier 	}
135*73680c23SYann Gautier 
136*73680c23SYann Gautier 	/* Sticky lock OTP_IWDG (read and write) */
137*73680c23SYann Gautier 	if (!bsec_write_sr_lock(HW2_OTP, 1U) ||
138*73680c23SYann Gautier 	    !bsec_write_sw_lock(HW2_OTP, 1U)) {
139*73680c23SYann Gautier 		return BSEC_LOCK_FAIL;
140*73680c23SYann Gautier 	}
141*73680c23SYann Gautier 
142*73680c23SYann Gautier 	return BSEC_OK;
143*73680c23SYann Gautier }
144*73680c23SYann Gautier #endif
145