xref: /rk3399_ARM-atf/plat/st/stm32mp2/stm32mp2_private.c (revision 27dd11dbf5a7dc3d9894e6bae9630b4e5aa36d59)
1db77f8bfSYann Gautier /*
2db77f8bfSYann Gautier  * Copyright (c) 2023-2024, STMicroelectronics - All Rights Reserved
3db77f8bfSYann Gautier  *
4db77f8bfSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5db77f8bfSYann Gautier  */
6db77f8bfSYann Gautier 
7db77f8bfSYann Gautier #include <assert.h>
8db77f8bfSYann Gautier 
9db77f8bfSYann Gautier #include <lib/xlat_tables/xlat_tables_v2.h>
10db77f8bfSYann Gautier 
11db77f8bfSYann Gautier #include <platform_def.h>
12db77f8bfSYann Gautier 
13db77f8bfSYann Gautier #define BKPR_BOOT_MODE	96U
14db77f8bfSYann Gautier 
1503020b66SYann Gautier #if defined(IMAGE_BL31)
1603020b66SYann Gautier /* BL31 only uses the first half of the SYSRAM */
1703020b66SYann Gautier #define MAP_SYSRAM	MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
1803020b66SYann Gautier 					STM32MP_SYSRAM_SIZE / 2U, \
1903020b66SYann Gautier 					MT_MEMORY | \
2003020b66SYann Gautier 					MT_RW | \
2103020b66SYann Gautier 					MT_SECURE | \
2203020b66SYann Gautier 					MT_EXECUTE_NEVER)
2303020b66SYann Gautier #else
24db77f8bfSYann Gautier #define MAP_SYSRAM	MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
25db77f8bfSYann Gautier 					STM32MP_SYSRAM_SIZE, \
26db77f8bfSYann Gautier 					MT_MEMORY | \
27db77f8bfSYann Gautier 					MT_RW | \
28db77f8bfSYann Gautier 					MT_SECURE | \
29db77f8bfSYann Gautier 					MT_EXECUTE_NEVER)
3003020b66SYann Gautier #endif
31db77f8bfSYann Gautier 
32ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
33ae84525fSMaxime Méré #define MAP_SRAM1	MAP_REGION_FLAT(SRAM1_BASE, \
34ae84525fSMaxime Méré 					SRAM1_SIZE_FOR_TFA, \
35ae84525fSMaxime Méré 					MT_MEMORY | \
36ae84525fSMaxime Méré 					MT_RW | \
37ae84525fSMaxime Méré 					MT_SECURE | \
38ae84525fSMaxime Méré 					MT_EXECUTE_NEVER)
39ae84525fSMaxime Méré #endif
40ae84525fSMaxime Méré 
41db77f8bfSYann Gautier #define MAP_DEVICE	MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \
42db77f8bfSYann Gautier 					STM32MP_DEVICE_SIZE, \
43db77f8bfSYann Gautier 					MT_DEVICE | \
44db77f8bfSYann Gautier 					MT_RW | \
45db77f8bfSYann Gautier 					MT_SECURE | \
46db77f8bfSYann Gautier 					MT_EXECUTE_NEVER)
47db77f8bfSYann Gautier 
48db77f8bfSYann Gautier #if defined(IMAGE_BL2)
49db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
50db77f8bfSYann Gautier 	MAP_SYSRAM,
51ae84525fSMaxime Méré #if STM32MP_DDR_FIP_IO_STORAGE
52ae84525fSMaxime Méré 	MAP_SRAM1,
53ae84525fSMaxime Méré #endif
54db77f8bfSYann Gautier 	MAP_DEVICE,
55db77f8bfSYann Gautier 	{0}
56db77f8bfSYann Gautier };
57db77f8bfSYann Gautier #endif
5803020b66SYann Gautier #if defined(IMAGE_BL31)
5903020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
6003020b66SYann Gautier 	MAP_SYSRAM,
6103020b66SYann Gautier 	MAP_DEVICE,
6203020b66SYann Gautier 	{0}
6303020b66SYann Gautier };
6403020b66SYann Gautier #endif
65db77f8bfSYann Gautier 
66db77f8bfSYann Gautier void configure_mmu(void)
67db77f8bfSYann Gautier {
68db77f8bfSYann Gautier 	mmap_add(stm32mp2_mmap);
69db77f8bfSYann Gautier 	init_xlat_tables();
70db77f8bfSYann Gautier 
71db77f8bfSYann Gautier 	enable_mmu_el3(0);
72db77f8bfSYann Gautier }
73db77f8bfSYann Gautier 
7452f530d3SMaxime Méré int stm32mp_map_retram(void)
7552f530d3SMaxime Méré {
7652f530d3SMaxime Méré 	return  mmap_add_dynamic_region(RETRAM_BASE, RETRAM_BASE,
7752f530d3SMaxime Méré 					RETRAM_SIZE,
7852f530d3SMaxime Méré 					MT_RW | MT_SECURE);
7952f530d3SMaxime Méré }
8052f530d3SMaxime Méré 
8152f530d3SMaxime Méré int stm32mp_unmap_retram(void)
8252f530d3SMaxime Méré {
8352f530d3SMaxime Méré 	return  mmap_remove_dynamic_region(RETRAM_BASE,
8452f530d3SMaxime Méré 					   RETRAM_SIZE);
8552f530d3SMaxime Méré }
8652f530d3SMaxime Méré 
87db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
88db77f8bfSYann Gautier {
89db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
90db77f8bfSYann Gautier 		return GPIOZ_BASE;
91db77f8bfSYann Gautier 	}
92db77f8bfSYann Gautier 
93db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
94db77f8bfSYann Gautier 
95db77f8bfSYann Gautier 	return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
96db77f8bfSYann Gautier }
97db77f8bfSYann Gautier 
98db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
99db77f8bfSYann Gautier {
100db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
101db77f8bfSYann Gautier 		return 0;
102db77f8bfSYann Gautier 	}
103db77f8bfSYann Gautier 
104db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
105db77f8bfSYann Gautier 
106db77f8bfSYann Gautier 	return bank * GPIO_BANK_OFFSET;
107db77f8bfSYann Gautier }
108db77f8bfSYann Gautier 
109db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
110db77f8bfSYann Gautier {
111db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
112db77f8bfSYann Gautier 		return CK_BUS_GPIOZ;
113db77f8bfSYann Gautier 	}
114db77f8bfSYann Gautier 
115db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
116db77f8bfSYann Gautier 
117db77f8bfSYann Gautier 	return CK_BUS_GPIOA + (bank - GPIO_BANK_A);
118db77f8bfSYann Gautier }
119db77f8bfSYann Gautier 
120*27dd11dbSMaxime Méré #if STM32MP_UART_PROGRAMMER || !defined(IMAGE_BL2)
121*27dd11dbSMaxime Méré /*
122*27dd11dbSMaxime Méré  * UART Management
123*27dd11dbSMaxime Méré  */
124*27dd11dbSMaxime Méré static const uintptr_t stm32mp2_uart_addresses[STM32MP_NB_OF_UART] = {
125*27dd11dbSMaxime Méré 	USART1_BASE,
126*27dd11dbSMaxime Méré 	USART2_BASE,
127*27dd11dbSMaxime Méré 	USART3_BASE,
128*27dd11dbSMaxime Méré 	UART4_BASE,
129*27dd11dbSMaxime Méré 	UART5_BASE,
130*27dd11dbSMaxime Méré 	USART6_BASE,
131*27dd11dbSMaxime Méré 	UART7_BASE,
132*27dd11dbSMaxime Méré 	UART8_BASE,
133*27dd11dbSMaxime Méré 	UART9_BASE,
134*27dd11dbSMaxime Méré };
135*27dd11dbSMaxime Méré 
136*27dd11dbSMaxime Méré uintptr_t get_uart_address(uint32_t instance_nb)
137*27dd11dbSMaxime Méré {
138*27dd11dbSMaxime Méré 	if ((instance_nb == 0U) ||
139*27dd11dbSMaxime Méré 	    (instance_nb > STM32MP_NB_OF_UART)) {
140*27dd11dbSMaxime Méré 		return 0U;
141*27dd11dbSMaxime Méré 	}
142*27dd11dbSMaxime Méré 
143*27dd11dbSMaxime Méré 	return stm32mp2_uart_addresses[instance_nb - 1U];
144*27dd11dbSMaxime Méré }
145*27dd11dbSMaxime Méré #endif
146*27dd11dbSMaxime Méré 
147381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void)
148381b2a6bSYann Gautier {
149381b2a6bSYann Gautier 	static uint32_t rev;
150381b2a6bSYann Gautier 
151381b2a6bSYann Gautier 	if (rev != 0U) {
152381b2a6bSYann Gautier 		return rev;
153381b2a6bSYann Gautier 	}
154381b2a6bSYann Gautier 
155381b2a6bSYann Gautier 	if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) {
156381b2a6bSYann Gautier 		panic();
157381b2a6bSYann Gautier 	}
158381b2a6bSYann Gautier 
159381b2a6bSYann Gautier 	return rev;
160381b2a6bSYann Gautier }
161381b2a6bSYann Gautier 
162381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void)
163381b2a6bSYann Gautier {
164381b2a6bSYann Gautier 	return stm32mp_syscfg_get_chip_dev_id();
165381b2a6bSYann Gautier }
166381b2a6bSYann Gautier 
167381b2a6bSYann Gautier static uint32_t get_part_number(void)
168381b2a6bSYann Gautier {
169381b2a6bSYann Gautier 	static uint32_t part_number;
170381b2a6bSYann Gautier 
171381b2a6bSYann Gautier 	if (part_number != 0U) {
172381b2a6bSYann Gautier 		return part_number;
173381b2a6bSYann Gautier 	}
174381b2a6bSYann Gautier 
175381b2a6bSYann Gautier 	if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) {
176381b2a6bSYann Gautier 		panic();
177381b2a6bSYann Gautier 	}
178381b2a6bSYann Gautier 
179381b2a6bSYann Gautier 	return part_number;
180381b2a6bSYann Gautier }
181381b2a6bSYann Gautier 
182381b2a6bSYann Gautier static uint32_t get_cpu_package(void)
183381b2a6bSYann Gautier {
184381b2a6bSYann Gautier 	static uint32_t package = UINT32_MAX;
185381b2a6bSYann Gautier 
186381b2a6bSYann Gautier 	if (package == UINT32_MAX) {
187381b2a6bSYann Gautier 		if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) {
188381b2a6bSYann Gautier 			panic();
189381b2a6bSYann Gautier 		}
190381b2a6bSYann Gautier 	}
191381b2a6bSYann Gautier 
192381b2a6bSYann Gautier 	return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT;
193381b2a6bSYann Gautier }
194381b2a6bSYann Gautier 
195381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])
196381b2a6bSYann Gautier {
197381b2a6bSYann Gautier 	char *cpu_s, *cpu_r, *pkg;
198381b2a6bSYann Gautier 
199381b2a6bSYann Gautier 	/* MPUs Part Numbers */
200381b2a6bSYann Gautier 	switch (get_part_number()) {
201381b2a6bSYann Gautier 	case STM32MP251A_PART_NB:
202381b2a6bSYann Gautier 		cpu_s = "251A";
203381b2a6bSYann Gautier 		break;
204381b2a6bSYann Gautier 	case STM32MP251C_PART_NB:
205381b2a6bSYann Gautier 		cpu_s = "251C";
206381b2a6bSYann Gautier 		break;
207381b2a6bSYann Gautier 	case STM32MP251D_PART_NB:
208381b2a6bSYann Gautier 		cpu_s = "251D";
209381b2a6bSYann Gautier 		break;
210381b2a6bSYann Gautier 	case STM32MP251F_PART_NB:
211381b2a6bSYann Gautier 		cpu_s = "251F";
212381b2a6bSYann Gautier 		break;
213381b2a6bSYann Gautier 	case STM32MP253A_PART_NB:
214381b2a6bSYann Gautier 		cpu_s = "253A";
215381b2a6bSYann Gautier 		break;
216381b2a6bSYann Gautier 	case STM32MP253C_PART_NB:
217381b2a6bSYann Gautier 		cpu_s = "253C";
218381b2a6bSYann Gautier 		break;
219381b2a6bSYann Gautier 	case STM32MP253D_PART_NB:
220381b2a6bSYann Gautier 		cpu_s = "253D";
221381b2a6bSYann Gautier 		break;
222381b2a6bSYann Gautier 	case STM32MP253F_PART_NB:
223381b2a6bSYann Gautier 		cpu_s = "253F";
224381b2a6bSYann Gautier 		break;
225381b2a6bSYann Gautier 	case STM32MP255A_PART_NB:
226381b2a6bSYann Gautier 		cpu_s = "255A";
227381b2a6bSYann Gautier 		break;
228381b2a6bSYann Gautier 	case STM32MP255C_PART_NB:
229381b2a6bSYann Gautier 		cpu_s = "255C";
230381b2a6bSYann Gautier 		break;
231381b2a6bSYann Gautier 	case STM32MP255D_PART_NB:
232381b2a6bSYann Gautier 		cpu_s = "255D";
233381b2a6bSYann Gautier 		break;
234381b2a6bSYann Gautier 	case STM32MP255F_PART_NB:
235381b2a6bSYann Gautier 		cpu_s = "255F";
236381b2a6bSYann Gautier 		break;
237381b2a6bSYann Gautier 	case STM32MP257A_PART_NB:
238381b2a6bSYann Gautier 		cpu_s = "257A";
239381b2a6bSYann Gautier 		break;
240381b2a6bSYann Gautier 	case STM32MP257C_PART_NB:
241381b2a6bSYann Gautier 		cpu_s = "257C";
242381b2a6bSYann Gautier 		break;
243381b2a6bSYann Gautier 	case STM32MP257D_PART_NB:
244381b2a6bSYann Gautier 		cpu_s = "257D";
245381b2a6bSYann Gautier 		break;
246381b2a6bSYann Gautier 	case STM32MP257F_PART_NB:
247381b2a6bSYann Gautier 		cpu_s = "257F";
248381b2a6bSYann Gautier 		break;
249381b2a6bSYann Gautier 	default:
250381b2a6bSYann Gautier 		cpu_s = "????";
251381b2a6bSYann Gautier 		break;
252381b2a6bSYann Gautier 	}
253381b2a6bSYann Gautier 
254381b2a6bSYann Gautier 	/* Package */
255381b2a6bSYann Gautier 	switch (get_cpu_package()) {
256381b2a6bSYann Gautier 	case STM32MP25_PKG_CUSTOM:
257381b2a6bSYann Gautier 		pkg = "XX";
258381b2a6bSYann Gautier 		break;
259381b2a6bSYann Gautier 	case STM32MP25_PKG_AL_VFBGA361:
260381b2a6bSYann Gautier 		pkg = "AL";
261381b2a6bSYann Gautier 		break;
262381b2a6bSYann Gautier 	case STM32MP25_PKG_AK_VFBGA424:
263381b2a6bSYann Gautier 		pkg = "AK";
264381b2a6bSYann Gautier 		break;
265381b2a6bSYann Gautier 	case STM32MP25_PKG_AI_TFBGA436:
266381b2a6bSYann Gautier 		pkg = "AI";
267381b2a6bSYann Gautier 		break;
268381b2a6bSYann Gautier 	default:
269381b2a6bSYann Gautier 		pkg = "??";
270381b2a6bSYann Gautier 		break;
271381b2a6bSYann Gautier 	}
272381b2a6bSYann Gautier 
273381b2a6bSYann Gautier 	/* REVISION */
274381b2a6bSYann Gautier 	switch (stm32mp_get_chip_version()) {
275381b2a6bSYann Gautier 	case STM32MP2_REV_A:
276381b2a6bSYann Gautier 		cpu_r = "A";
277381b2a6bSYann Gautier 		break;
278381b2a6bSYann Gautier 	case STM32MP2_REV_B:
279381b2a6bSYann Gautier 		cpu_r = "B";
280381b2a6bSYann Gautier 		break;
281381b2a6bSYann Gautier 	case STM32MP2_REV_X:
282381b2a6bSYann Gautier 		cpu_r = "X";
283381b2a6bSYann Gautier 		break;
284381b2a6bSYann Gautier 	case STM32MP2_REV_Y:
285381b2a6bSYann Gautier 		cpu_r = "Y";
286381b2a6bSYann Gautier 		break;
287381b2a6bSYann Gautier 	case STM32MP2_REV_Z:
288381b2a6bSYann Gautier 		cpu_r = "Z";
289381b2a6bSYann Gautier 		break;
290381b2a6bSYann Gautier 	default:
291381b2a6bSYann Gautier 		cpu_r = "?";
292381b2a6bSYann Gautier 		break;
293381b2a6bSYann Gautier 	}
294381b2a6bSYann Gautier 
295381b2a6bSYann Gautier 	snprintf(name, STM32_SOC_NAME_SIZE,
296381b2a6bSYann Gautier 		 "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
297381b2a6bSYann Gautier }
298381b2a6bSYann Gautier 
299381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void)
300381b2a6bSYann Gautier {
301381b2a6bSYann Gautier 	char name[STM32_SOC_NAME_SIZE];
302381b2a6bSYann Gautier 
303381b2a6bSYann Gautier 	stm32mp_get_soc_name(name);
304381b2a6bSYann Gautier 	NOTICE("CPU: %s\n", name);
305381b2a6bSYann Gautier }
306381b2a6bSYann Gautier 
307cdaced36SYann Gautier void stm32mp_print_boardinfo(void)
308cdaced36SYann Gautier {
309cdaced36SYann Gautier 	uint32_t board_id = 0U;
310cdaced36SYann Gautier 
311cdaced36SYann Gautier 	if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) {
312cdaced36SYann Gautier 		return;
313cdaced36SYann Gautier 	}
314cdaced36SYann Gautier 
315cdaced36SYann Gautier 	if (board_id != 0U) {
316cdaced36SYann Gautier 		stm32_display_board_info(board_id);
317cdaced36SYann Gautier 	}
318cdaced36SYann Gautier }
319cdaced36SYann Gautier 
32087cd847cSYann Gautier bool stm32mp_is_wakeup_from_standby(void)
32187cd847cSYann Gautier {
32287cd847cSYann Gautier 	/* TODO add source code to determine if platform is waking up from standby mode */
32387cd847cSYann Gautier 	return false;
32487cd847cSYann Gautier }
32587cd847cSYann Gautier 
326db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void)
327db77f8bfSYann Gautier {
328db77f8bfSYann Gautier 	return tamp_bkpr(BKPR_BOOT_MODE);
329db77f8bfSYann Gautier }
3302fd7b230SNicolas Le Bayon 
3312fd7b230SNicolas Le Bayon uintptr_t stm32_ddrdbg_get_base(void)
3322fd7b230SNicolas Le Bayon {
3332fd7b230SNicolas Le Bayon 	return DDRDBG_BASE;
3342fd7b230SNicolas Le Bayon }
335