blob: c807e0842eb8e4c36418b6a480f761f4e6f551df [file] [log] [blame]
Tom Rini4549e782018-05-06 18:27:01 -04001SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
Patrick Delaunayf8598d92018-03-12 10:46:18 +01002#
3# Copyright (C) 2018 STMicroelectronics - All Rights Reserved
4#
Patrick Delaunayf8598d92018-03-12 10:46:18 +01005
6U-Boot on STMicroelectronics STM32MP1
7======================================
8
91. Summary
10==========
11This is a quick instruction for setup stm32mp1 boards.
12
132. Supported devices
14====================
15U-Boot supports one STMP32MP1 SoCs: STM32MP157
16
17The STM32MP157 is a Cortex-A MPU aimed at various applications.
18It features:
19- Dual core Cortex-A7 application core
20- 2D/3D image composition with GPU
21- Standard memories interface support
22- Standard connectivity, widely inherited from the STM32 MCU family
23- Comprehensive security support
24
25Everything is supported in Linux but U-Boot is limited to:
261. UART
272. SDCard/MMC controller (SDMMC)
Patrick Delaunay526558c2019-07-05 17:20:18 +0200283. NAND controller (FMC)
294. NOR controller (QSPI)
305. USB controller (OTG DWC2)
316. Ethernet controller
Patrick Delaunayf8598d92018-03-12 10:46:18 +010032
33And the necessary drivers
341. I2C
Patrick Delaunay42f01aa2019-02-04 11:26:17 +0100352. STPMIC1 (PMIC and regulator)
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200363. Clock, Reset, Sysreset
374. Fuse
Patrick Delaunayf8598d92018-03-12 10:46:18 +010038
39Currently the following boards are supported:
Patrick Delaunay5f16f652018-07-09 15:17:22 +020040+ stm32mp157c-ev1
Patrick Delaunayf8598d92018-03-12 10:46:18 +010041+ stm32mp157c-ed1
Patrice Chotard39110482019-02-12 16:50:39 +010042+ stm32mp157a-dk1
43+ stm32mp157c-dk2
Manivannan Sadhasivam93ffa2b2019-05-02 13:26:44 +053044+ stm32mp157a-avenger96
Patrick Delaunayf8598d92018-03-12 10:46:18 +010045
463. Boot Sequences
47=================
48
49BootRom => FSBL in SYSRAM => SSBL in DDR => OS (Linux Kernel)
50
51with FSBL = First Stage Bootloader
52 SSBL = Second Stage Bootloader
53
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200543 boot configurations are supported:
Patrick Delaunayf8598d92018-03-12 10:46:18 +010055
Patrick Delaunayabf26782019-02-12 11:44:39 +0100561) The "Trusted" boot chain (defconfig_file : stm32mp15_trusted_defconfig)
57 BootRom => FSBL = Trusted Firmware-A (TF-A) => SSBL = U-Boot
58 TF-A performs a full initialization of Secure peripherals and installs a
59 secure monitor.
60 U-Boot is running in normal world and uses TF-A monitor
Patrick Delaunay526558c2019-07-05 17:20:18 +020061 to access to secure resources.
Patrick Delaunayabf26782019-02-12 11:44:39 +010062
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200632) The "Trusted" boot chain with OP-TEE
64 (defconfig_file : stm32mp15_optee_defconfig)
65 BootRom => FSBL = Trusted Firmware-A (TF-A) => SSBL = U-Boot
66 TF-A performs a full initialization of Secure peripherals and installs OP-TEE
67 from specific partitions (teeh, teed, teex).
68 U-Boot is running in normal world and uses OP-TEE monitor to access
69 to secure resources.
70
713) The "Basic" boot chain (defconfig_file : stm32mp15_basic_defconfig)
Patrick Delaunayf8598d92018-03-12 10:46:18 +010072 BootRom => FSBL = U-Boot SPL => SSBL = U-Boot
73 SPL has limited security initialisation
74 U-Boot is running in secure mode and provide a secure monitor to the kernel
Patrick Delaunay526558c2019-07-05 17:20:18 +020075 with only PSCI support (Power State Coordination Interface defined by ARM).
Patrick Delaunayf8598d92018-03-12 10:46:18 +010076
Patrick Delaunayabf26782019-02-12 11:44:39 +010077All the STM32MP1 boards supported by U-Boot use the same generic board
Patrick Delaunayf8598d92018-03-12 10:46:18 +010078stm32mp1 which support all the bootable devices.
79
80Each board is configurated only with the associated device tree.
81
824. Device Tree Selection
83========================
84
85You need to select the appropriate device tree for your board,
86the supported device trees for stm32mp157 are:
87
Patrick Delaunay42f01aa2019-02-04 11:26:17 +010088+ ev1: eval board with pmic stpmic1 (ev1 = mother board + daughter ed1)
Patrick Delaunay5f16f652018-07-09 15:17:22 +020089 dts: stm32mp157c-ev1
90
Patrick Delaunay42f01aa2019-02-04 11:26:17 +010091+ ed1: daughter board with pmic stpmic1
Patrick Delaunayf8598d92018-03-12 10:46:18 +010092 dts: stm32mp157c-ed1
93
Patrice Chotard39110482019-02-12 16:50:39 +010094+ dk1: Discovery board
95 dts: stm32mp157a-dk1
96
97+ dk2: Discovery board = dk1 with a BT/WiFI combo and a DSI panel
98 dts: stm32mp157c-dk2
99
Manivannan Sadhasivam93ffa2b2019-05-02 13:26:44 +0530100+ avenger96: Avenger96 board from Arrow Electronics
101 dts: stm32mp157a-avenger96
102
Patrick Delaunayf8598d92018-03-12 10:46:18 +01001035. Build Procedure
104==================
105
1061. Install required tools for U-Boot
107
108 + install package needed in U-Boot makefile
109 (libssl-dev, swig, libpython-dev...)
110 + install ARMv7 toolchain for 32bit Cortex-A (from Linaro,
111 from SDK for STM32MP1, or any crosstoolchains from your distribution)
112
1132. Set the cross compiler:
114
115 # export CROSS_COMPILE=/path/to/toolchain/arm-linux-gnueabi-
116 (you can use any gcc cross compiler compatible with U-Boot)
117
1183. Select the output directory (optional)
119
120 # export KBUILD_OUTPUT=/path/to/output
121
122 for example: use one output directory for each configuration
Patrick Delaunayabf26782019-02-12 11:44:39 +0100123 # export KBUILD_OUTPUT=stm32mp15_trusted
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200124 # export KBUILD_OUTPUT=stm32mp15_optee
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100125 # export KBUILD_OUTPUT=stm32mp15_basic
126
Patrick Delaunay526558c2019-07-05 17:20:18 +0200127 you can build outside of code directory:
128 # export KBUILD_OUTPUT=../build/stm32mp15_trusted
129
Patrick Delaunayabf26782019-02-12 11:44:39 +01001304. Configure U-Boot:
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100131
132 # make <defconfig_file>
133
Patrick Delaunayabf26782019-02-12 11:44:39 +0100134 - For trusted boot mode : "stm32mp15_trusted_defconfig"
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200135 - For trusted with OP-TEE boot mode : "stm32mp15_optee_defconfig"
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100136 - For basic boot mode: "stm32mp15_basic_defconfig"
137
1385. Configure the device-tree and build the U-Boot image:
139
140 # make DEVICE_TREE=<name> all
141
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100142 example:
Patrick Delaunayabf26782019-02-12 11:44:39 +0100143 a) trusted boot on ev1
144 # export KBUILD_OUTPUT=stm32mp15_trusted
145 # make stm32mp15_trusted_defconfig
146 # make DEVICE_TREE=stm32mp157c-ev1 all
147
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200148 b) trusted with OP-TEE boot on dk2
149 # export KBUILD_OUTPUT=stm32mp15_optee
150 # make stm32mp15_optee_defconfig
151 # make DEVICE_TREE=stm32mp157c-dk2 all
152
153 c) basic boot on ev1
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200154 # export KBUILD_OUTPUT=stm32mp15_basic
155 # make stm32mp15_basic_defconfig
156 # make DEVICE_TREE=stm32mp157c-ev1 all
157
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200158 d) basic boot on ed1
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100159 # export KBUILD_OUTPUT=stm32mp15_basic
160 # make stm32mp15_basic_defconfig
161 # make DEVICE_TREE=stm32mp157c-ed1 all
162
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200163 e) basic boot on dk1
Patrice Chotard39110482019-02-12 16:50:39 +0100164 # export KBUILD_OUTPUT=stm32mp15_basic
165 # make stm32mp15_basic_defconfig
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200166 # make DEVICE_TREE=stm32mp157a-dk1 all
Patrice Chotard39110482019-02-12 16:50:39 +0100167
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200168 f) basic boot on avenger96
Manivannan Sadhasivam93ffa2b2019-05-02 13:26:44 +0530169 # export KBUILD_OUTPUT=stm32mp15_basic
170 # make stm32mp15_basic_defconfig
171 # make DEVICE_TREE=stm32mp157a-avenger96 all
172
Patrick Delaunayf8598d92018-03-12 10:46:18 +01001736. Output files
174
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200175 BootRom and TF-A expect binaries with STM32 image header
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100176 SPL expects file with U-Boot uImage header
177
178 So in the output directory (selected by KBUILD_OUTPUT),
179 you can found the needed files:
180
Patrick Delaunay152c84b2019-07-02 13:26:06 +0200181 a) For Trusted boot (with or without OP-TEE)
Patrick Delaunayabf26782019-02-12 11:44:39 +0100182 + FSBL = tf-a.stm32 (provided by TF-A compilation)
183 + SSBL = u-boot.stm32
184
185 b) For Basic boot
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100186 + FSBL = spl/u-boot-spl.stm32
187 + SSBL = u-boot.img
188
Patrick Delaunay0ed232b2018-03-20 10:54:52 +01001896. Switch Setting for Boot Mode
190===============================
191
Patrick Delaunay06d1dd22019-08-02 15:07:22 +0200192You can select the boot mode, on the board with one switch :
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100193
Patrick Delaunay526558c2019-07-05 17:20:18 +0200194- on the daugther board ed1 with the switch SW1 : BOOT0, BOOT1, BOOT2
195
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100196 -----------------------------------
197 Boot Mode BOOT2 BOOT1 BOOT0
198 -----------------------------------
199 Reserved 0 0 0
200 NOR 0 0 1
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100201 SD-Card 1 0 1
202 eMMC 0 1 0
203 NAND 0 1 1
204 Recovery 1 1 0
205 Recovery 0 0 0
206
Patrice Chotard39110482019-02-12 16:50:39 +0100207- on board DK1/DK2 with the switch SW1 : BOOT0, BOOT2
208 (BOOT1 forced to 0, NOR not supported)
209
210 --------------------------
211 Boot Mode BOOT2 BOOT0
212 --------------------------
213 Reserved 1 0
214 SD-Card 1 1
215 Recovery 0 0
216
Manivannan Sadhasivam93ffa2b2019-05-02 13:26:44 +0530217- Boot mode of Avenger96 can be selected using switch S3
218
219 -----------------------------------
220 Boot Mode BOOT2 BOOT1 BOOT0
221 -----------------------------------
222 Recovery 0 0 0
223 NOR 0 0 1
224 SD-Card 1 0 1
225 eMMC 0 1 0
226 NAND 0 1 1
227 Reserved 1 0 0
228 Recovery 1 1 0
229 SD-Card 1 1 1
230
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100231Recovery is a boot from serial link (UART/USB) and it is used with
232STM32CubeProgrammer tool to load executable in RAM and to update the flash
233devices available on the board (NOR/NAND/eMMC/SDCARD).
234The communication between HOST and board is based on
235- for UARTs : the uart protocol used with all MCU STM32
236- for USB : based on USB DFU 1.1 (without the ST extensions used on MCU STM32)
237
2387. Prepare an SDCard
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100239===================
240
241The minimal requirements for STMP32MP1 boot up to U-Boot are:
242- GPT partitioning (with gdisk or with sgdisk)
243- 2 fsbl partitions, named fsbl1 and fsbl2, size at least 256KiB
244- one ssbl partition for U-Boot
245
246Then the minimal GPT partition is:
Patrick Delaunayabf26782019-02-12 11:44:39 +0100247 ----- ------- --------- --------------
248 | Num | Name | Size | Content |
249 ----- ------- -------- ---------------
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200250 | 1 | fsbl1 | 256 KiB | TF-A or SPL |
251 | 2 | fsbl2 | 256 KiB | TF-A or SPL |
Patrick Delaunayabf26782019-02-12 11:44:39 +0100252 | 3 | ssbl | enought | U-Boot |
253 | * | - | - | Boot/Rootfs |
254 ----- ------- --------- --------------
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100255
256(*) add bootable partition for extlinux.conf
257 following Generic Distribution
258 (doc/README.distro for use)
259
260 according the used card reader select the block device
261 (/dev/sdx or /dev/mmcblk0)
262 in the next example I use /dev/mmcblk0
263
264for example: with gpt table with 128 entries
265
266 a) remove previous formatting
267 # sgdisk -o /dev/<SDCard dev>
268
269 b) create minimal image
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100270 # sgdisk --resize-table=128 -a 1 \
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100271 -n 1:34:545 -c 1:fsbl1 \
272 -n 2:546:1057 -c 2:fsbl2 \
273 -n 3:1058:5153 -c 3:ssbl \
274 -p /dev/<SDCard dev>
275
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200276 you can add other partitions for kernel
277 one partition rootfs for example:
Patrick Delaunayabf26782019-02-12 11:44:39 +0100278 -n 4:5154: -c 4:rootfs \
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100279
280 c) copy the FSBL (2 times) and SSBL file on the correct partition.
281 in this example in partition 1 to 3
282
283 for basic boot mode : <SDCard dev> = /dev/mmcblk0
284 # dd if=u-boot-spl.stm32 of=/dev/mmcblk0p1
285 # dd if=u-boot-spl.stm32 of=/dev/mmcblk0p2
286 # dd if=u-boot.img of=/dev/mmcblk0p3
287
Patrick Delaunayabf26782019-02-12 11:44:39 +0100288 for trusted boot mode :
289 # dd if=tf-a.stm32 of=/dev/mmcblk0p1
290 # dd if=tf-a.stm32 of=/dev/mmcblk0p2
291 # dd if=u-boot.stm32 of=/dev/mmcblk0p3
292
Patrick Delaunay526558c2019-07-05 17:20:18 +0200293To boot from SDCard, select BootPinMode = 1 0 1 and reset.
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100294
Patrick Delaunay0ed232b2018-03-20 10:54:52 +01002958. Prepare eMMC
296===============
297You can use U-Boot to copy binary in eMMC.
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100298
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100299In the next example, you need to boot from SDCARD and the images (u-boot-spl.stm32, u-boot.img)
300are presents on SDCARD (mmc 0) in ext4 partition 4 (bootfs).
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100301
Patrick Delaunayabf26782019-02-12 11:44:39 +0100302To boot from SDCard, select BootPinMode = 1 0 1 and reset.
Patrick Delaunayf8598d92018-03-12 10:46:18 +0100303
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100304Then you update the eMMC with the next U-Boot command :
305
306a) prepare GPT on eMMC,
307 example with 2 partitions, bootfs and roots:
308
309 # setenv emmc_part "name=ssbl,size=2MiB;name=bootfs,type=linux,bootable,size=64MiB;name=rootfs,type=linux,size=512"
310 # gpt write mmc 1 ${emmc_part}
311
312b) copy SPL on eMMC on firts boot partition
313 (SPL max size is 256kB, with LBA 512, 0x200)
314
315 # ext4load mmc 0:4 0xC0000000 u-boot-spl.stm32
316 # mmc dev 1
317 # mmc partconf 1 1 1 1
318 # mmc write ${fileaddr} 0 200
319 # mmc partconf 1 1 1 0
320
Patrick Delaunayabf26782019-02-12 11:44:39 +0100321c) copy U-Boot in first GPT partition of eMMC
Patrick Delaunay0ed232b2018-03-20 10:54:52 +0100322
323 # ext4load mmc 0:4 0xC0000000 u-boot.img
324 # mmc dev 1
325 # part start mmc 1 1 partstart
326 # part size mmc 1 1 partsize
327 # mmc write ${fileaddr} ${partstart} ${partsize}
328
329To boot from eMMC, select BootPinMode = 0 1 0 and reset.
Patrick Delaunay5f16f652018-07-09 15:17:22 +0200330
3319. MAC Address
332==============
333
334Please read doc/README.enetaddr for the implementation guidelines for mac id
335usage. Basically, environment has precedence over board specific storage.
336
337Mac id storage and retrieval in stm32mp otp :
338- OTP_57[31:0] = MAC_ADDR[31:0]
339- OTP_58[15:0] = MAC_ADDR[47:32]
340
341To program a MAC address on virgin OTP words above, you can use the fuse command
342on bank 0 to access to internal OTP:
343
344 example to set mac address "12:34:56:78:9a:bc"
345
346 1- Write OTP
347 STM32MP> fuse prog -y 0 57 0x78563412 0x0000bc9a
348
349 2- Read OTP
350 STM32MP> fuse sense 0 57 2
351 Sensing bank 0:
352 Word 0x00000039: 78563412 0000bc9a
353
354 3- next REBOOT :
355 ### Setting environment from OTP MAC address = "12:34:56:78:9a:bc"
356
357 4 check env update
358 STM32MP> print ethaddr
359 ethaddr=12:34:56:78:9a:bc
Patrick Delaunay06d1dd22019-08-02 15:07:22 +0200360
36110. Coprocessor firmware
362========================
363
364U-Boot can boot the coprocessor before the kernel (coprocessor early boot).
365
366A/ Manuallly by using rproc commands (update the bootcmd)
367 Configurations
368 # env set name_copro "rproc-m4-fw.elf"
369 # env set dev_copro 0
370 # env set loadaddr_copro 0xC1000000
371
372 Load binary from bootfs partition (number 4) on SDCard (mmc 0)
373 # ext4load mmc 0:4 ${loadaddr_copro} ${name_copro}
374 => ${filesize} updated with the size of the loaded file
375
376 Start M4 firmware with remote proc command
377 # rproc init
378 # rproc load ${dev_copro} ${loadaddr_copro} ${filesize}
379 # rproc start ${dev_copro}
380
381B/ Automatically by using FIT feature and generic DISTRO bootcmd
382
383 see examples in this directory :
384
385 Generate FIT including kernel + device tree + M4 firmware
386 with cfg with M4 boot
387 $> mkimage -f fit_copro_kernel_dtb.its fit_copro_kernel_dtb.itb
388
389 Then using DISTRO configuration file: see extlinux.conf to select
390 the correct configuration
391 => stm32mp157c-ev1-m4
392 => stm32mp157c-dk2-m4