xref: /rk3399_ARM-atf/plat/st/stm32mp2/stm32mp2_private.c (revision 03020b6688b459da84bdb2a3fb58c99916bfd7f7)
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 
15*03020b66SYann Gautier #if defined(IMAGE_BL31)
16*03020b66SYann Gautier /* BL31 only uses the first half of the SYSRAM */
17*03020b66SYann Gautier #define MAP_SYSRAM	MAP_REGION_FLAT(STM32MP_SYSRAM_BASE, \
18*03020b66SYann Gautier 					STM32MP_SYSRAM_SIZE / 2U, \
19*03020b66SYann Gautier 					MT_MEMORY | \
20*03020b66SYann Gautier 					MT_RW | \
21*03020b66SYann Gautier 					MT_SECURE | \
22*03020b66SYann Gautier 					MT_EXECUTE_NEVER)
23*03020b66SYann 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)
30*03020b66SYann Gautier #endif
31db77f8bfSYann Gautier 
32db77f8bfSYann Gautier #define MAP_DEVICE	MAP_REGION_FLAT(STM32MP_DEVICE_BASE, \
33db77f8bfSYann Gautier 					STM32MP_DEVICE_SIZE, \
34db77f8bfSYann Gautier 					MT_DEVICE | \
35db77f8bfSYann Gautier 					MT_RW | \
36db77f8bfSYann Gautier 					MT_SECURE | \
37db77f8bfSYann Gautier 					MT_EXECUTE_NEVER)
38db77f8bfSYann Gautier 
39db77f8bfSYann Gautier #if defined(IMAGE_BL2)
40db77f8bfSYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
41db77f8bfSYann Gautier 	MAP_SYSRAM,
42db77f8bfSYann Gautier 	MAP_DEVICE,
43db77f8bfSYann Gautier 	{0}
44db77f8bfSYann Gautier };
45db77f8bfSYann Gautier #endif
46*03020b66SYann Gautier #if defined(IMAGE_BL31)
47*03020b66SYann Gautier static const mmap_region_t stm32mp2_mmap[] = {
48*03020b66SYann Gautier 	MAP_SYSRAM,
49*03020b66SYann Gautier 	MAP_DEVICE,
50*03020b66SYann Gautier 	{0}
51*03020b66SYann Gautier };
52*03020b66SYann Gautier #endif
53db77f8bfSYann Gautier 
54db77f8bfSYann Gautier void configure_mmu(void)
55db77f8bfSYann Gautier {
56db77f8bfSYann Gautier 	mmap_add(stm32mp2_mmap);
57db77f8bfSYann Gautier 	init_xlat_tables();
58db77f8bfSYann Gautier 
59db77f8bfSYann Gautier 	enable_mmu_el3(0);
60db77f8bfSYann Gautier }
61db77f8bfSYann Gautier 
62db77f8bfSYann Gautier uintptr_t stm32_get_gpio_bank_base(unsigned int bank)
63db77f8bfSYann Gautier {
64db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
65db77f8bfSYann Gautier 		return GPIOZ_BASE;
66db77f8bfSYann Gautier 	}
67db77f8bfSYann Gautier 
68db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
69db77f8bfSYann Gautier 
70db77f8bfSYann Gautier 	return GPIOA_BASE + (bank * GPIO_BANK_OFFSET);
71db77f8bfSYann Gautier }
72db77f8bfSYann Gautier 
73db77f8bfSYann Gautier uint32_t stm32_get_gpio_bank_offset(unsigned int bank)
74db77f8bfSYann Gautier {
75db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
76db77f8bfSYann Gautier 		return 0;
77db77f8bfSYann Gautier 	}
78db77f8bfSYann Gautier 
79db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
80db77f8bfSYann Gautier 
81db77f8bfSYann Gautier 	return bank * GPIO_BANK_OFFSET;
82db77f8bfSYann Gautier }
83db77f8bfSYann Gautier 
84db77f8bfSYann Gautier unsigned long stm32_get_gpio_bank_clock(unsigned int bank)
85db77f8bfSYann Gautier {
86db77f8bfSYann Gautier 	if (bank == GPIO_BANK_Z) {
87db77f8bfSYann Gautier 		return CK_BUS_GPIOZ;
88db77f8bfSYann Gautier 	}
89db77f8bfSYann Gautier 
90db77f8bfSYann Gautier 	assert(bank <= GPIO_BANK_K);
91db77f8bfSYann Gautier 
92db77f8bfSYann Gautier 	return CK_BUS_GPIOA + (bank - GPIO_BANK_A);
93db77f8bfSYann Gautier }
94db77f8bfSYann Gautier 
95381b2a6bSYann Gautier uint32_t stm32mp_get_chip_version(void)
96381b2a6bSYann Gautier {
97381b2a6bSYann Gautier 	static uint32_t rev;
98381b2a6bSYann Gautier 
99381b2a6bSYann Gautier 	if (rev != 0U) {
100381b2a6bSYann Gautier 		return rev;
101381b2a6bSYann Gautier 	}
102381b2a6bSYann Gautier 
103381b2a6bSYann Gautier 	if (stm32_get_otp_value(REVISION_OTP, &rev) != 0) {
104381b2a6bSYann Gautier 		panic();
105381b2a6bSYann Gautier 	}
106381b2a6bSYann Gautier 
107381b2a6bSYann Gautier 	return rev;
108381b2a6bSYann Gautier }
109381b2a6bSYann Gautier 
110381b2a6bSYann Gautier uint32_t stm32mp_get_chip_dev_id(void)
111381b2a6bSYann Gautier {
112381b2a6bSYann Gautier 	return stm32mp_syscfg_get_chip_dev_id();
113381b2a6bSYann Gautier }
114381b2a6bSYann Gautier 
115381b2a6bSYann Gautier static uint32_t get_part_number(void)
116381b2a6bSYann Gautier {
117381b2a6bSYann Gautier 	static uint32_t part_number;
118381b2a6bSYann Gautier 
119381b2a6bSYann Gautier 	if (part_number != 0U) {
120381b2a6bSYann Gautier 		return part_number;
121381b2a6bSYann Gautier 	}
122381b2a6bSYann Gautier 
123381b2a6bSYann Gautier 	if (stm32_get_otp_value(PART_NUMBER_OTP, &part_number) != 0) {
124381b2a6bSYann Gautier 		panic();
125381b2a6bSYann Gautier 	}
126381b2a6bSYann Gautier 
127381b2a6bSYann Gautier 	return part_number;
128381b2a6bSYann Gautier }
129381b2a6bSYann Gautier 
130381b2a6bSYann Gautier static uint32_t get_cpu_package(void)
131381b2a6bSYann Gautier {
132381b2a6bSYann Gautier 	static uint32_t package = UINT32_MAX;
133381b2a6bSYann Gautier 
134381b2a6bSYann Gautier 	if (package == UINT32_MAX) {
135381b2a6bSYann Gautier 		if (stm32_get_otp_value(PACKAGE_OTP, &package) != 0) {
136381b2a6bSYann Gautier 			panic();
137381b2a6bSYann Gautier 		}
138381b2a6bSYann Gautier 	}
139381b2a6bSYann Gautier 
140381b2a6bSYann Gautier 	return (package & PACKAGE_OTP_PKG_MASK) >> PACKAGE_OTP_PKG_SHIFT;
141381b2a6bSYann Gautier }
142381b2a6bSYann Gautier 
143381b2a6bSYann Gautier void stm32mp_get_soc_name(char name[STM32_SOC_NAME_SIZE])
144381b2a6bSYann Gautier {
145381b2a6bSYann Gautier 	char *cpu_s, *cpu_r, *pkg;
146381b2a6bSYann Gautier 
147381b2a6bSYann Gautier 	/* MPUs Part Numbers */
148381b2a6bSYann Gautier 	switch (get_part_number()) {
149381b2a6bSYann Gautier 	case STM32MP251A_PART_NB:
150381b2a6bSYann Gautier 		cpu_s = "251A";
151381b2a6bSYann Gautier 		break;
152381b2a6bSYann Gautier 	case STM32MP251C_PART_NB:
153381b2a6bSYann Gautier 		cpu_s = "251C";
154381b2a6bSYann Gautier 		break;
155381b2a6bSYann Gautier 	case STM32MP251D_PART_NB:
156381b2a6bSYann Gautier 		cpu_s = "251D";
157381b2a6bSYann Gautier 		break;
158381b2a6bSYann Gautier 	case STM32MP251F_PART_NB:
159381b2a6bSYann Gautier 		cpu_s = "251F";
160381b2a6bSYann Gautier 		break;
161381b2a6bSYann Gautier 	case STM32MP253A_PART_NB:
162381b2a6bSYann Gautier 		cpu_s = "253A";
163381b2a6bSYann Gautier 		break;
164381b2a6bSYann Gautier 	case STM32MP253C_PART_NB:
165381b2a6bSYann Gautier 		cpu_s = "253C";
166381b2a6bSYann Gautier 		break;
167381b2a6bSYann Gautier 	case STM32MP253D_PART_NB:
168381b2a6bSYann Gautier 		cpu_s = "253D";
169381b2a6bSYann Gautier 		break;
170381b2a6bSYann Gautier 	case STM32MP253F_PART_NB:
171381b2a6bSYann Gautier 		cpu_s = "253F";
172381b2a6bSYann Gautier 		break;
173381b2a6bSYann Gautier 	case STM32MP255A_PART_NB:
174381b2a6bSYann Gautier 		cpu_s = "255A";
175381b2a6bSYann Gautier 		break;
176381b2a6bSYann Gautier 	case STM32MP255C_PART_NB:
177381b2a6bSYann Gautier 		cpu_s = "255C";
178381b2a6bSYann Gautier 		break;
179381b2a6bSYann Gautier 	case STM32MP255D_PART_NB:
180381b2a6bSYann Gautier 		cpu_s = "255D";
181381b2a6bSYann Gautier 		break;
182381b2a6bSYann Gautier 	case STM32MP255F_PART_NB:
183381b2a6bSYann Gautier 		cpu_s = "255F";
184381b2a6bSYann Gautier 		break;
185381b2a6bSYann Gautier 	case STM32MP257A_PART_NB:
186381b2a6bSYann Gautier 		cpu_s = "257A";
187381b2a6bSYann Gautier 		break;
188381b2a6bSYann Gautier 	case STM32MP257C_PART_NB:
189381b2a6bSYann Gautier 		cpu_s = "257C";
190381b2a6bSYann Gautier 		break;
191381b2a6bSYann Gautier 	case STM32MP257D_PART_NB:
192381b2a6bSYann Gautier 		cpu_s = "257D";
193381b2a6bSYann Gautier 		break;
194381b2a6bSYann Gautier 	case STM32MP257F_PART_NB:
195381b2a6bSYann Gautier 		cpu_s = "257F";
196381b2a6bSYann Gautier 		break;
197381b2a6bSYann Gautier 	default:
198381b2a6bSYann Gautier 		cpu_s = "????";
199381b2a6bSYann Gautier 		break;
200381b2a6bSYann Gautier 	}
201381b2a6bSYann Gautier 
202381b2a6bSYann Gautier 	/* Package */
203381b2a6bSYann Gautier 	switch (get_cpu_package()) {
204381b2a6bSYann Gautier 	case STM32MP25_PKG_CUSTOM:
205381b2a6bSYann Gautier 		pkg = "XX";
206381b2a6bSYann Gautier 		break;
207381b2a6bSYann Gautier 	case STM32MP25_PKG_AL_VFBGA361:
208381b2a6bSYann Gautier 		pkg = "AL";
209381b2a6bSYann Gautier 		break;
210381b2a6bSYann Gautier 	case STM32MP25_PKG_AK_VFBGA424:
211381b2a6bSYann Gautier 		pkg = "AK";
212381b2a6bSYann Gautier 		break;
213381b2a6bSYann Gautier 	case STM32MP25_PKG_AI_TFBGA436:
214381b2a6bSYann Gautier 		pkg = "AI";
215381b2a6bSYann Gautier 		break;
216381b2a6bSYann Gautier 	default:
217381b2a6bSYann Gautier 		pkg = "??";
218381b2a6bSYann Gautier 		break;
219381b2a6bSYann Gautier 	}
220381b2a6bSYann Gautier 
221381b2a6bSYann Gautier 	/* REVISION */
222381b2a6bSYann Gautier 	switch (stm32mp_get_chip_version()) {
223381b2a6bSYann Gautier 	case STM32MP2_REV_A:
224381b2a6bSYann Gautier 		cpu_r = "A";
225381b2a6bSYann Gautier 		break;
226381b2a6bSYann Gautier 	case STM32MP2_REV_B:
227381b2a6bSYann Gautier 		cpu_r = "B";
228381b2a6bSYann Gautier 		break;
229381b2a6bSYann Gautier 	case STM32MP2_REV_X:
230381b2a6bSYann Gautier 		cpu_r = "X";
231381b2a6bSYann Gautier 		break;
232381b2a6bSYann Gautier 	case STM32MP2_REV_Y:
233381b2a6bSYann Gautier 		cpu_r = "Y";
234381b2a6bSYann Gautier 		break;
235381b2a6bSYann Gautier 	case STM32MP2_REV_Z:
236381b2a6bSYann Gautier 		cpu_r = "Z";
237381b2a6bSYann Gautier 		break;
238381b2a6bSYann Gautier 	default:
239381b2a6bSYann Gautier 		cpu_r = "?";
240381b2a6bSYann Gautier 		break;
241381b2a6bSYann Gautier 	}
242381b2a6bSYann Gautier 
243381b2a6bSYann Gautier 	snprintf(name, STM32_SOC_NAME_SIZE,
244381b2a6bSYann Gautier 		 "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
245381b2a6bSYann Gautier }
246381b2a6bSYann Gautier 
247381b2a6bSYann Gautier void stm32mp_print_cpuinfo(void)
248381b2a6bSYann Gautier {
249381b2a6bSYann Gautier 	char name[STM32_SOC_NAME_SIZE];
250381b2a6bSYann Gautier 
251381b2a6bSYann Gautier 	stm32mp_get_soc_name(name);
252381b2a6bSYann Gautier 	NOTICE("CPU: %s\n", name);
253381b2a6bSYann Gautier }
254381b2a6bSYann Gautier 
255cdaced36SYann Gautier void stm32mp_print_boardinfo(void)
256cdaced36SYann Gautier {
257cdaced36SYann Gautier 	uint32_t board_id = 0U;
258cdaced36SYann Gautier 
259cdaced36SYann Gautier 	if (stm32_get_otp_value(BOARD_ID_OTP, &board_id) != 0) {
260cdaced36SYann Gautier 		return;
261cdaced36SYann Gautier 	}
262cdaced36SYann Gautier 
263cdaced36SYann Gautier 	if (board_id != 0U) {
264cdaced36SYann Gautier 		stm32_display_board_info(board_id);
265cdaced36SYann Gautier 	}
266cdaced36SYann Gautier }
267cdaced36SYann Gautier 
268db77f8bfSYann Gautier uintptr_t stm32_get_bkpr_boot_mode_addr(void)
269db77f8bfSYann Gautier {
270db77f8bfSYann Gautier 	return tamp_bkpr(BKPR_BOOT_MODE);
271db77f8bfSYann Gautier }
272