blob: 72c76ee65d7738b57c895ffb13156917c88c9d3e [file] [log] [blame]
Tom Rini8b0c8a12018-05-06 18:27:01 -04001// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
Patrick Delaunay85b53972018-03-12 10:46:10 +01002/*
3 * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
Patrick Delaunay85b53972018-03-12 10:46:10 +01004 */
5#include <common.h>
6#include <clk.h>
Simon Glass1d91ba72019-11-14 12:57:37 -07007#include <cpu_func.h>
Patrick Delaunay82168e82018-05-17 14:50:46 +02008#include <debug_uart.h>
Simon Glass5e6201b2019-08-01 09:46:51 -06009#include <env.h>
Patrick Delaunayf3674a42018-05-17 15:24:07 +020010#include <misc.h>
Simon Glass274e0b02020-05-10 11:39:56 -060011#include <net.h>
Patrick Delaunay85b53972018-03-12 10:46:10 +010012#include <asm/io.h>
13#include <asm/arch/stm32.h>
Patrick Delaunay01e3afe2018-03-19 19:09:21 +010014#include <asm/arch/sys_proto.h>
Patrick Delaunayf3674a42018-05-17 15:24:07 +020015#include <dm/device.h>
Patrick Delaunayc5d15652018-03-20 10:54:53 +010016#include <dm/uclass.h>
Patrick Delaunay85b53972018-03-12 10:46:10 +010017
Patrick Delaunay58e95532018-03-19 19:09:20 +010018/* RCC register */
19#define RCC_TZCR (STM32_RCC_BASE + 0x00)
20#define RCC_DBGCFGR (STM32_RCC_BASE + 0x080C)
21#define RCC_BDCR (STM32_RCC_BASE + 0x0140)
22#define RCC_MP_APB5ENSETR (STM32_RCC_BASE + 0x0208)
Patrick Delaunayd4ca35c2019-02-27 17:01:26 +010023#define RCC_MP_AHB5ENSETR (STM32_RCC_BASE + 0x0210)
Patrick Delaunay58e95532018-03-19 19:09:20 +010024#define RCC_BDCR_VSWRST BIT(31)
25#define RCC_BDCR_RTCSRC GENMASK(17, 16)
26#define RCC_DBGCFGR_DBGCKEN BIT(8)
Patrick Delaunay85b53972018-03-12 10:46:10 +010027
Patrick Delaunay58e95532018-03-19 19:09:20 +010028/* Security register */
Patrick Delaunay85b53972018-03-12 10:46:10 +010029#define ETZPC_TZMA1_SIZE (STM32_ETZPC_BASE + 0x04)
30#define ETZPC_DECPROT0 (STM32_ETZPC_BASE + 0x10)
31
32#define TZC_GATE_KEEPER (STM32_TZC_BASE + 0x008)
33#define TZC_REGION_ATTRIBUTE0 (STM32_TZC_BASE + 0x110)
34#define TZC_REGION_ID_ACCESS0 (STM32_TZC_BASE + 0x114)
35
36#define TAMP_CR1 (STM32_TAMP_BASE + 0x00)
37
38#define PWR_CR1 (STM32_PWR_BASE + 0x00)
Fabien Dessenne9ebbdc92019-10-30 14:38:30 +010039#define PWR_MCUCR (STM32_PWR_BASE + 0x14)
Patrick Delaunay85b53972018-03-12 10:46:10 +010040#define PWR_CR1_DBP BIT(8)
Fabien Dessenne9ebbdc92019-10-30 14:38:30 +010041#define PWR_MCUCR_SBF BIT(6)
Patrick Delaunay85b53972018-03-12 10:46:10 +010042
Patrick Delaunay58e95532018-03-19 19:09:20 +010043/* DBGMCU register */
Patrick Delaunay01e3afe2018-03-19 19:09:21 +010044#define DBGMCU_IDC (STM32_DBGMCU_BASE + 0x00)
Patrick Delaunay58e95532018-03-19 19:09:20 +010045#define DBGMCU_APB4FZ1 (STM32_DBGMCU_BASE + 0x2C)
46#define DBGMCU_APB4FZ1_IWDG2 BIT(2)
Patrick Delaunay01e3afe2018-03-19 19:09:21 +010047#define DBGMCU_IDC_DEV_ID_MASK GENMASK(11, 0)
48#define DBGMCU_IDC_DEV_ID_SHIFT 0
49#define DBGMCU_IDC_REV_ID_MASK GENMASK(31, 16)
50#define DBGMCU_IDC_REV_ID_SHIFT 16
Patrick Delaunay85b53972018-03-12 10:46:10 +010051
Patrick Delaunayd4ca35c2019-02-27 17:01:26 +010052/* GPIOZ registers */
53#define GPIOZ_SECCFGR 0x54004030
54
Patrick Delaunayc5d15652018-03-20 10:54:53 +010055/* boot interface from Bootrom
56 * - boot instance = bit 31:16
57 * - boot device = bit 15:0
58 */
59#define BOOTROM_PARAM_ADDR 0x2FFC0078
60#define BOOTROM_MODE_MASK GENMASK(15, 0)
61#define BOOTROM_MODE_SHIFT 0
62#define BOOTROM_INSTANCE_MASK GENMASK(31, 16)
63#define BOOTROM_INSTANCE_SHIFT 16
64
Patrick Delaunay45c82d22019-02-27 17:01:13 +010065/* Device Part Number (RPN) = OTP_DATA1 lower 8 bits */
66#define RPN_SHIFT 0
67#define RPN_MASK GENMASK(7, 0)
68
69/* Package = bit 27:29 of OTP16
70 * - 100: LBGA448 (FFI) => AA = LFBGA 18x18mm 448 balls p. 0.8mm
71 * - 011: LBGA354 (LCI) => AB = LFBGA 16x16mm 359 balls p. 0.8mm
72 * - 010: TFBGA361 (FFC) => AC = TFBGA 12x12mm 361 balls p. 0.5mm
73 * - 001: TFBGA257 (LCC) => AD = TFBGA 10x10mm 257 balls p. 0.5mm
74 * - others: Reserved
75 */
76#define PKG_SHIFT 27
77#define PKG_MASK GENMASK(2, 0)
78
Patrick Delaunay8e6985b2020-04-30 16:30:20 +020079/*
80 * early TLB into the .data section so that it not get cleared
81 * with 16kB allignment (see TTBR0_BASE_ADDR_MASK)
82 */
83u8 early_tlb[PGTABLE_SIZE] __section(".data") __aligned(0x4000);
84
Patrick Delaunay58e95532018-03-19 19:09:20 +010085#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
Patrick Delaunayf8fe21d2020-04-01 09:07:33 +020086#ifndef CONFIG_TFABOOT
Patrick Delaunay85b53972018-03-12 10:46:10 +010087static void security_init(void)
88{
89 /* Disable the backup domain write protection */
90 /* the protection is enable at each reset by hardware */
91 /* And must be disable by software */
92 setbits_le32(PWR_CR1, PWR_CR1_DBP);
93
94 while (!(readl(PWR_CR1) & PWR_CR1_DBP))
95 ;
96
97 /* If RTC clock isn't enable so this is a cold boot then we need
98 * to reset the backup domain
99 */
100 if (!(readl(RCC_BDCR) & RCC_BDCR_RTCSRC)) {
101 setbits_le32(RCC_BDCR, RCC_BDCR_VSWRST);
102 while (!(readl(RCC_BDCR) & RCC_BDCR_VSWRST))
103 ;
104 clrbits_le32(RCC_BDCR, RCC_BDCR_VSWRST);
105 }
106
107 /* allow non secure access in Write/Read for all peripheral */
108 writel(GENMASK(25, 0), ETZPC_DECPROT0);
109
110 /* Open SYSRAM for no secure access */
111 writel(0x0, ETZPC_TZMA1_SIZE);
112
113 /* enable TZC1 TZC2 clock */
114 writel(BIT(11) | BIT(12), RCC_MP_APB5ENSETR);
115
116 /* Region 0 set to no access by default */
117 /* bit 0 / 16 => nsaid0 read/write Enable
118 * bit 1 / 17 => nsaid1 read/write Enable
119 * ...
120 * bit 15 / 31 => nsaid15 read/write Enable
121 */
122 writel(0xFFFFFFFF, TZC_REGION_ID_ACCESS0);
123 /* bit 30 / 31 => Secure Global Enable : write/read */
124 /* bit 0 / 1 => Region Enable for filter 0/1 */
125 writel(BIT(0) | BIT(1) | BIT(30) | BIT(31), TZC_REGION_ATTRIBUTE0);
126
127 /* Enable Filter 0 and 1 */
128 setbits_le32(TZC_GATE_KEEPER, BIT(0) | BIT(1));
129
130 /* RCC trust zone deactivated */
131 writel(0x0, RCC_TZCR);
132
133 /* TAMP: deactivate the internal tamper
134 * Bit 23 ITAMP8E: monotonic counter overflow
135 * Bit 20 ITAMP5E: RTC calendar overflow
136 * Bit 19 ITAMP4E: HSE monitoring
137 * Bit 18 ITAMP3E: LSE monitoring
138 * Bit 16 ITAMP1E: RTC power domain supply monitoring
139 */
140 writel(0x0, TAMP_CR1);
Patrick Delaunayd4ca35c2019-02-27 17:01:26 +0100141
142 /* GPIOZ: deactivate the security */
143 writel(BIT(0), RCC_MP_AHB5ENSETR);
144 writel(0x0, GPIOZ_SECCFGR);
Patrick Delaunay85b53972018-03-12 10:46:10 +0100145}
Patrick Delaunayf8fe21d2020-04-01 09:07:33 +0200146#endif /* CONFIG_TFABOOT */
Patrick Delaunay85b53972018-03-12 10:46:10 +0100147
Patrick Delaunay58e95532018-03-19 19:09:20 +0100148/*
Patrick Delaunay85b53972018-03-12 10:46:10 +0100149 * Debug init
Patrick Delaunay58e95532018-03-19 19:09:20 +0100150 */
Patrick Delaunay85b53972018-03-12 10:46:10 +0100151static void dbgmcu_init(void)
152{
153 setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
154
155 /* Freeze IWDG2 if Cortex-A7 is in debug mode */
156 setbits_le32(DBGMCU_APB4FZ1, DBGMCU_APB4FZ1_IWDG2);
157}
158#endif /* !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD) */
159
Patrick Delaunayf8fe21d2020-04-01 09:07:33 +0200160#if !defined(CONFIG_TFABOOT) && \
Patrick Delaunay5d061412019-02-12 11:44:39 +0100161 (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
Patrick Delaunay18660a62019-02-27 17:01:12 +0100162/* get bootmode from ROM code boot context: saved in TAMP register */
163static void update_bootmode(void)
164{
165 u32 boot_mode;
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100166 u32 bootrom_itf = readl(BOOTROM_PARAM_ADDR);
167 u32 bootrom_device, bootrom_instance;
168
Patrick Delaunay18660a62019-02-27 17:01:12 +0100169 /* enable TAMP clock = RTCAPBEN */
170 writel(BIT(8), RCC_MP_APB5ENSETR);
171
172 /* read bootrom context */
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100173 bootrom_device =
174 (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT;
175 bootrom_instance =
176 (bootrom_itf & BOOTROM_INSTANCE_MASK) >> BOOTROM_INSTANCE_SHIFT;
177 boot_mode =
178 ((bootrom_device << BOOT_TYPE_SHIFT) & BOOT_TYPE_MASK) |
179 ((bootrom_instance << BOOT_INSTANCE_SHIFT) &
180 BOOT_INSTANCE_MASK);
181
182 /* save the boot mode in TAMP backup register */
183 clrsetbits_le32(TAMP_BOOT_CONTEXT,
184 TAMP_BOOT_MODE_MASK,
185 boot_mode << TAMP_BOOT_MODE_SHIFT);
Patrick Delaunay18660a62019-02-27 17:01:12 +0100186}
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100187#endif
Patrick Delaunay18660a62019-02-27 17:01:12 +0100188
189u32 get_bootmode(void)
190{
191 /* read bootmode from TAMP backup register */
192 return (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_MODE_MASK) >>
193 TAMP_BOOT_MODE_SHIFT;
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100194}
195
196/*
Patrick Delaunay8e6985b2020-04-30 16:30:20 +0200197 * initialize the MMU and activate cache in SPL or in U-Boot pre-reloc stage
198 * MMU/TLB is updated in enable_caches() for U-Boot after relocation
199 * or is deactivated in U-Boot entry function start.S::cpu_init_cp15
200 */
201static void early_enable_caches(void)
202{
203 /* I-cache is already enabled in start.S: cpu_init_cp15 */
204
205 if (CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
206 return;
207
208 gd->arch.tlb_size = PGTABLE_SIZE;
209 gd->arch.tlb_addr = (unsigned long)&early_tlb;
210
211 dcache_enable();
212
213 if (IS_ENABLED(CONFIG_SPL_BUILD))
214 mmu_set_region_dcache_behaviour(STM32_SYSRAM_BASE,
215 STM32_SYSRAM_SIZE,
216 DCACHE_DEFAULT_OPTION);
217 else
218 mmu_set_region_dcache_behaviour(STM32_DDR_BASE, STM32_DDR_SIZE,
219 DCACHE_DEFAULT_OPTION);
220}
221
222/*
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100223 * Early system init
224 */
Patrick Delaunay85b53972018-03-12 10:46:10 +0100225int arch_cpu_init(void)
226{
Patrick Delaunay82168e82018-05-17 14:50:46 +0200227 u32 boot_mode;
228
Patrick Delaunay8e6985b2020-04-30 16:30:20 +0200229 early_enable_caches();
230
Patrick Delaunay85b53972018-03-12 10:46:10 +0100231 /* early armv7 timer init: needed for polling */
232 timer_init();
233
234#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
235 dbgmcu_init();
Patrick Delaunayf8fe21d2020-04-01 09:07:33 +0200236#ifndef CONFIG_TFABOOT
Patrick Delaunay85b53972018-03-12 10:46:10 +0100237 security_init();
Patrick Delaunay18660a62019-02-27 17:01:12 +0100238 update_bootmode();
Patrick Delaunay85b53972018-03-12 10:46:10 +0100239#endif
Fabien Dessenne9ebbdc92019-10-30 14:38:30 +0100240 /* Reset Coprocessor state unless it wakes up from Standby power mode */
241 if (!(readl(PWR_MCUCR) & PWR_MCUCR_SBF)) {
242 writel(TAMP_COPRO_STATE_OFF, TAMP_COPRO_STATE);
243 writel(0, TAMP_COPRO_RSC_TBL_ADDRESS);
244 }
Patrick Delaunay5d061412019-02-12 11:44:39 +0100245#endif
Patrick Delaunay82168e82018-05-17 14:50:46 +0200246
Patrick Delaunay82168e82018-05-17 14:50:46 +0200247 boot_mode = get_bootmode();
248
249 if ((boot_mode & TAMP_BOOT_DEVICE_MASK) == BOOT_SERIAL_UART)
250 gd->flags |= GD_FLG_SILENT | GD_FLG_DISABLE_CONSOLE;
251#if defined(CONFIG_DEBUG_UART) && \
Patrick Delaunayf8fe21d2020-04-01 09:07:33 +0200252 !defined(CONFIG_TFABOOT) && \
Patrick Delaunay82168e82018-05-17 14:50:46 +0200253 (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
254 else
255 debug_uart_init();
256#endif
Patrick Delaunay85b53972018-03-12 10:46:10 +0100257
258 return 0;
259}
260
Patrick Delaunay58e95532018-03-19 19:09:20 +0100261void enable_caches(void)
262{
Patrick Delaunay8e6985b2020-04-30 16:30:20 +0200263 /* I-cache is already enabled in start.S: icache_enable() not needed */
264
265 /* deactivate the data cache, early enabled in arch_cpu_init() */
266 dcache_disable();
267 /*
268 * update MMU after relocation and enable the data cache
269 * warning: the TLB location udpated in board_f.c::reserve_mmu
270 */
Patrick Delaunay58e95532018-03-19 19:09:20 +0100271 dcache_enable();
272}
273
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100274static u32 read_idc(void)
275{
276 setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
277
278 return readl(DBGMCU_IDC);
279}
280
Patrick Delaunay79bc6402020-03-18 09:24:48 +0100281u32 get_cpu_dev(void)
282{
283 return (read_idc() & DBGMCU_IDC_DEV_ID_MASK) >> DBGMCU_IDC_DEV_ID_SHIFT;
284}
285
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100286u32 get_cpu_rev(void)
287{
288 return (read_idc() & DBGMCU_IDC_REV_ID_MASK) >> DBGMCU_IDC_REV_ID_SHIFT;
289}
290
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100291static u32 get_otp(int index, int shift, int mask)
292{
293 int ret;
294 struct udevice *dev;
295 u32 otp = 0;
296
297 ret = uclass_get_device_by_driver(UCLASS_MISC,
298 DM_GET_DRIVER(stm32mp_bsec),
299 &dev);
300
301 if (!ret)
302 ret = misc_read(dev, STM32_BSEC_SHADOW(index),
303 &otp, sizeof(otp));
304
305 return (otp >> shift) & mask;
306}
307
308/* Get Device Part Number (RPN) from OTP */
309static u32 get_cpu_rpn(void)
310{
311 return get_otp(BSEC_OTP_RPN, RPN_SHIFT, RPN_MASK);
312}
313
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100314u32 get_cpu_type(void)
315{
Patrick Delaunay79bc6402020-03-18 09:24:48 +0100316 return (get_cpu_dev() << 16) | get_cpu_rpn();
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100317}
318
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100319/* Get Package options from OTP */
Patrick Delaunayc74d6342019-07-05 17:20:13 +0200320u32 get_cpu_package(void)
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100321{
322 return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
323}
324
Patrick Delaunay3e738f22020-02-12 19:37:43 +0100325void get_soc_name(char name[SOC_NAME_SIZE])
Patrick Delaunay85b53972018-03-12 10:46:10 +0100326{
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100327 char *cpu_s, *cpu_r, *pkg;
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100328
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100329 /* MPUs Part Numbers */
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100330 switch (get_cpu_type()) {
Patrick Delaunaydb33b0e2020-02-26 11:26:43 +0100331 case CPU_STM32MP157Fxx:
332 cpu_s = "157F";
333 break;
334 case CPU_STM32MP157Dxx:
335 cpu_s = "157D";
336 break;
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100337 case CPU_STM32MP157Cxx:
338 cpu_s = "157C";
339 break;
340 case CPU_STM32MP157Axx:
341 cpu_s = "157A";
342 break;
Patrick Delaunaydb33b0e2020-02-26 11:26:43 +0100343 case CPU_STM32MP153Fxx:
344 cpu_s = "153F";
345 break;
346 case CPU_STM32MP153Dxx:
347 cpu_s = "153D";
348 break;
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100349 case CPU_STM32MP153Cxx:
350 cpu_s = "153C";
351 break;
352 case CPU_STM32MP153Axx:
353 cpu_s = "153A";
354 break;
Patrick Delaunaydb33b0e2020-02-26 11:26:43 +0100355 case CPU_STM32MP151Fxx:
356 cpu_s = "151F";
357 break;
358 case CPU_STM32MP151Dxx:
359 cpu_s = "151D";
360 break;
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100361 case CPU_STM32MP151Cxx:
362 cpu_s = "151C";
363 break;
364 case CPU_STM32MP151Axx:
365 cpu_s = "151A";
366 break;
367 default:
368 cpu_s = "????";
369 break;
370 }
371
372 /* Package */
373 switch (get_cpu_package()) {
374 case PKG_AA_LBGA448:
375 pkg = "AA";
376 break;
377 case PKG_AB_LBGA354:
378 pkg = "AB";
379 break;
380 case PKG_AC_TFBGA361:
381 pkg = "AC";
382 break;
383 case PKG_AD_TFBGA257:
384 pkg = "AD";
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100385 break;
386 default:
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100387 pkg = "??";
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100388 break;
389 }
390
Patrick Delaunay45c82d22019-02-27 17:01:13 +0100391 /* REVISION */
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100392 switch (get_cpu_rev()) {
393 case CPU_REVA:
394 cpu_r = "A";
395 break;
396 case CPU_REVB:
397 cpu_r = "B";
398 break;
Patrick Delaunayc8d4afe2020-01-28 10:11:06 +0100399 case CPU_REVZ:
400 cpu_r = "Z";
401 break;
Patrick Delaunay01e3afe2018-03-19 19:09:21 +0100402 default:
403 cpu_r = "?";
404 break;
405 }
406
Patrick Delaunay3e738f22020-02-12 19:37:43 +0100407 snprintf(name, SOC_NAME_SIZE, "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
408}
409
410#if defined(CONFIG_DISPLAY_CPUINFO)
411int print_cpuinfo(void)
412{
413 char name[SOC_NAME_SIZE];
414
415 get_soc_name(name);
416 printf("CPU: %s\n", name);
Patrick Delaunay85b53972018-03-12 10:46:10 +0100417
418 return 0;
419}
420#endif /* CONFIG_DISPLAY_CPUINFO */
421
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100422static void setup_boot_mode(void)
423{
Patrick Delaunay18660a62019-02-27 17:01:12 +0100424 const u32 serial_addr[] = {
425 STM32_USART1_BASE,
426 STM32_USART2_BASE,
427 STM32_USART3_BASE,
428 STM32_UART4_BASE,
429 STM32_UART5_BASE,
430 STM32_USART6_BASE,
431 STM32_UART7_BASE,
432 STM32_UART8_BASE
433 };
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100434 char cmd[60];
435 u32 boot_ctx = readl(TAMP_BOOT_CONTEXT);
436 u32 boot_mode =
437 (boot_ctx & TAMP_BOOT_MODE_MASK) >> TAMP_BOOT_MODE_SHIFT;
Patrick Delaunay1b03eb02019-06-21 15:26:39 +0200438 unsigned int instance = (boot_mode & TAMP_BOOT_INSTANCE_MASK) - 1;
Patrick Delaunay008d3c32019-02-27 17:01:20 +0100439 u32 forced_mode = (boot_ctx & TAMP_BOOT_FORCED_MASK);
Patrick Delaunay18660a62019-02-27 17:01:12 +0100440 struct udevice *dev;
441 int alias;
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100442
Patrick Delaunay008d3c32019-02-27 17:01:20 +0100443 pr_debug("%s: boot_ctx=0x%x => boot_mode=%x, instance=%d forced=%x\n",
444 __func__, boot_ctx, boot_mode, instance, forced_mode);
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100445 switch (boot_mode & TAMP_BOOT_DEVICE_MASK) {
446 case BOOT_SERIAL_UART:
Patrick Delaunay18660a62019-02-27 17:01:12 +0100447 if (instance > ARRAY_SIZE(serial_addr))
448 break;
449 /* serial : search associated alias in devicetree */
450 sprintf(cmd, "serial@%x", serial_addr[instance]);
451 if (uclass_get_device_by_name(UCLASS_SERIAL, cmd, &dev))
452 break;
453 if (fdtdec_get_alias_seq(gd->fdt_blob, "serial",
454 dev_of_offset(dev), &alias))
455 break;
456 sprintf(cmd, "%d", alias);
457 env_set("boot_device", "serial");
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100458 env_set("boot_instance", cmd);
Patrick Delaunay18660a62019-02-27 17:01:12 +0100459
460 /* restore console on uart when not used */
461 if (gd->cur_serial_dev != dev) {
462 gd->flags &= ~(GD_FLG_SILENT |
463 GD_FLG_DISABLE_CONSOLE);
464 printf("serial boot with console enabled!\n");
465 }
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100466 break;
467 case BOOT_SERIAL_USB:
468 env_set("boot_device", "usb");
469 env_set("boot_instance", "0");
470 break;
471 case BOOT_FLASH_SD:
472 case BOOT_FLASH_EMMC:
473 sprintf(cmd, "%d", instance);
474 env_set("boot_device", "mmc");
475 env_set("boot_instance", cmd);
476 break;
477 case BOOT_FLASH_NAND:
478 env_set("boot_device", "nand");
479 env_set("boot_instance", "0");
480 break;
Patrick Delaunayb5a7ca22020-03-18 09:22:52 +0100481 case BOOT_FLASH_SPINAND:
482 env_set("boot_device", "spi-nand");
483 env_set("boot_instance", "0");
484 break;
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100485 case BOOT_FLASH_NOR:
486 env_set("boot_device", "nor");
487 env_set("boot_instance", "0");
488 break;
489 default:
490 pr_debug("unexpected boot mode = %x\n", boot_mode);
491 break;
492 }
Patrick Delaunay008d3c32019-02-27 17:01:20 +0100493
494 switch (forced_mode) {
495 case BOOT_FASTBOOT:
496 printf("Enter fastboot!\n");
497 env_set("preboot", "env set preboot; fastboot 0");
498 break;
499 case BOOT_STM32PROG:
500 env_set("boot_device", "usb");
501 env_set("boot_instance", "0");
502 break;
503 case BOOT_UMS_MMC0:
504 case BOOT_UMS_MMC1:
505 case BOOT_UMS_MMC2:
506 printf("Enter UMS!\n");
507 instance = forced_mode - BOOT_UMS_MMC0;
508 sprintf(cmd, "env set preboot; ums 0 mmc %d", instance);
509 env_set("preboot", cmd);
510 break;
511 case BOOT_RECOVERY:
512 env_set("preboot", "env set preboot; run altbootcmd");
513 break;
514 case BOOT_NORMAL:
515 break;
516 default:
517 pr_debug("unexpected forced boot mode = %x\n", forced_mode);
518 break;
519 }
520
521 /* clear TAMP for next reboot */
522 clrsetbits_le32(TAMP_BOOT_CONTEXT, TAMP_BOOT_FORCED_MASK, BOOT_NORMAL);
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200523}
524
525/*
526 * If there is no MAC address in the environment, then it will be initialized
527 * (silently) from the value in the OTP.
528 */
Marek Vasut187cae22019-12-18 16:52:19 +0100529__weak int setup_mac_address(void)
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200530{
531#if defined(CONFIG_NET)
532 int ret;
533 int i;
534 u32 otp[2];
535 uchar enetaddr[6];
536 struct udevice *dev;
537
538 /* MAC already in environment */
539 if (eth_env_get_enetaddr("ethaddr", enetaddr))
540 return 0;
541
542 ret = uclass_get_device_by_driver(UCLASS_MISC,
543 DM_GET_DRIVER(stm32mp_bsec),
544 &dev);
545 if (ret)
546 return ret;
547
Patrick Delaunay10263a52019-02-27 17:01:29 +0100548 ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_MAC),
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200549 otp, sizeof(otp));
Simon Glass587dc402018-11-06 15:21:39 -0700550 if (ret < 0)
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200551 return ret;
552
553 for (i = 0; i < 6; i++)
554 enetaddr[i] = ((uint8_t *)&otp)[i];
555
556 if (!is_valid_ethaddr(enetaddr)) {
Manivannan Sadhasivame5237722019-05-02 13:26:45 +0530557 pr_err("invalid MAC address in OTP %pM\n", enetaddr);
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200558 return -EINVAL;
559 }
560 pr_debug("OTP MAC address = %pM\n", enetaddr);
561 ret = !eth_env_set_enetaddr("ethaddr", enetaddr);
562 if (!ret)
563 pr_err("Failed to set mac address %pM from OTP: %d\n",
564 enetaddr, ret);
565#endif
566
567 return 0;
568}
569
570static int setup_serial_number(void)
571{
572 char serial_string[25];
573 u32 otp[3] = {0, 0, 0 };
574 struct udevice *dev;
575 int ret;
576
577 if (env_get("serial#"))
578 return 0;
579
580 ret = uclass_get_device_by_driver(UCLASS_MISC,
581 DM_GET_DRIVER(stm32mp_bsec),
582 &dev);
583 if (ret)
584 return ret;
585
Patrick Delaunay10263a52019-02-27 17:01:29 +0100586 ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_SERIAL),
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200587 otp, sizeof(otp));
Simon Glass587dc402018-11-06 15:21:39 -0700588 if (ret < 0)
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200589 return ret;
590
Patrick Delaunayaf5564a2019-02-27 17:01:25 +0100591 sprintf(serial_string, "%08X%08X%08X", otp[0], otp[1], otp[2]);
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200592 env_set("serial#", serial_string);
593
594 return 0;
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100595}
596
597int arch_misc_init(void)
598{
599 setup_boot_mode();
Patrick Delaunayf3674a42018-05-17 15:24:07 +0200600 setup_mac_address();
601 setup_serial_number();
Patrick Delaunayc5d15652018-03-20 10:54:53 +0100602
603 return 0;
604}