Paul Beesley | f3653a6 | 2019-05-22 11:22:44 +0100 | [diff] [blame] | 1 | STMicroelectronics STM32MP1 |
| 2 | =========================== |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 3 | |
| 4 | STM32MP1 is a microprocessor designed by STMicroelectronics |
| 5 | based on a dual Arm Cortex-A7. |
| 6 | It is an Armv7-A platform, using dedicated code from TF-A. |
Yann Gautier | 969be34 | 2019-02-20 17:34:16 +0100 | [diff] [blame] | 7 | The STM32MP1 chip also embeds a Cortex-M4. |
| 8 | More information can be found on `STM32MP1 Series`_ page. |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 9 | |
| 10 | |
Yann Gautier | 26c1067 | 2020-10-13 11:27:05 +0200 | [diff] [blame] | 11 | STM32MP1 Versions |
| 12 | ----------------- |
| 13 | The STM32MP1 series is available in 3 different lines which are pin-to-pin compatible: |
| 14 | |
| 15 | - STM32MP157: Dual Cortex-A7 cores, Cortex-M4 core @ 209 MHz, 3D GPU, DSI display interface and CAN FD |
| 16 | - STM32MP153: Dual Cortex-A7 cores, Cortex-M4 core @ 209 MHz and CAN FD |
| 17 | - STM32MP151: Single Cortex-A7 core, Cortex-M4 core @ 209 MHz |
| 18 | |
| 19 | Each line comes with a security option (cryptography & secure boot) and a Cortex-A frequency option: |
| 20 | |
| 21 | - A Basic + Cortex-A7 @ 650 MHz |
| 22 | - C Secure Boot + HW Crypto + Cortex-A7 @ 650 MHz |
| 23 | - D Basic + Cortex-A7 @ 800 MHz |
| 24 | - F Secure Boot + HW Crypto + Cortex-A7 @ 800 MHz |
| 25 | |
| 26 | The `STM32MP1 part number codification`_ page gives more information about part numbers. |
| 27 | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 28 | Design |
| 29 | ------ |
| 30 | The STM32MP1 resets in the ROM code of the Cortex-A7. |
| 31 | The primary boot core (core 0) executes the boot sequence while |
| 32 | secondary boot core (core 1) is kept in a holding pen loop. |
| 33 | The ROM code boot sequence loads the TF-A binary image from boot device |
| 34 | to embedded SRAM. |
| 35 | |
| 36 | The TF-A image must be properly formatted with a STM32 header structure |
| 37 | for ROM code is able to load this image. |
| 38 | Tool stm32image can be used to prepend this header to the generated TF-A binary. |
| 39 | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 40 | Boot with FIP |
| 41 | ~~~~~~~~~~~~~ |
| 42 | The use of FIP is now the recommended way to boot STM32MP1 platform. |
| 43 | Only BL2 (with STM32 header) is loaded by ROM code. The other binaries are |
| 44 | inside the FIP binary: BL32 (SP_min or OP-TEE), U-Boot and their respective |
| 45 | device tree blobs. |
| 46 | |
| 47 | STM32IMAGE bootchain |
| 48 | ~~~~~~~~~~~~~~~~~~~~ |
| 49 | Although still supported, this way of booting is not recommended. |
| 50 | Pease use FIP instead. |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 51 | At compilation step, BL2, BL32 and DTB file are linked together in a single |
| 52 | binary. The stm32image tool is also generated and the header is added to TF-A |
| 53 | binary. This binary file with header is named tf-a-stm32mp157c-ev1.stm32. |
| 54 | It can then be copied in the first partition of the boot device. |
| 55 | |
| 56 | |
| 57 | Memory mapping |
| 58 | ~~~~~~~~~~~~~~ |
| 59 | |
| 60 | :: |
| 61 | |
| 62 | 0x00000000 +-----------------+ |
| 63 | | | ROM |
| 64 | 0x00020000 +-----------------+ |
| 65 | | | |
| 66 | | ... | |
| 67 | | | |
| 68 | 0x2FFC0000 +-----------------+ \ |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 69 | | BL32 DTB | | |
| 70 | 0x2FFC5000 +-----------------+ | |
| 71 | | BL32 | | |
| 72 | 0x2FFDF000 +-----------------+ | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 73 | | ... | | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 74 | 0x2FFE3000 +-----------------+ | |
| 75 | | BL2 DTB | | Embedded SRAM |
| 76 | 0x2FFEA000 +-----------------+ | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 77 | | BL2 | | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 78 | 0x2FFFF000 +-----------------+ | |
| 79 | | SCMI mailbox | | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 80 | 0x30000000 +-----------------+ / |
| 81 | | | |
| 82 | | ... | |
| 83 | | | |
| 84 | 0x40000000 +-----------------+ |
| 85 | | | |
| 86 | | | Devices |
| 87 | | | |
| 88 | 0xC0000000 +-----------------+ \ |
| 89 | | | | |
| 90 | 0xC0100000 +-----------------+ | |
| 91 | | BL33 | | Non-secure RAM (DDR) |
| 92 | | ... | | |
| 93 | | | | |
| 94 | 0xFFFFFFFF +-----------------+ / |
| 95 | |
| 96 | |
| 97 | Boot sequence |
| 98 | ~~~~~~~~~~~~~ |
| 99 | |
| 100 | ROM code -> BL2 (compiled with BL2_AT_EL3) -> BL32 (SP_min) -> BL33 (U-Boot) |
| 101 | |
Yann Gautier | b3386f7 | 2019-04-19 09:41:01 +0200 | [diff] [blame] | 102 | or if Op-TEE is used: |
| 103 | |
| 104 | ROM code -> BL2 (compiled with BL2_AT_EL3) -> OP-TEE -> BL33 (U-Boot) |
| 105 | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 106 | |
| 107 | Build Instructions |
| 108 | ------------------ |
Lionel Debieve | 4066c90 | 2019-10-17 15:12:13 +0200 | [diff] [blame] | 109 | Boot media(s) supported by BL2 must be specified in the build command. |
| 110 | Available storage medias are: |
Yann Gautier | 2392913 | 2021-02-15 17:13:23 +0100 | [diff] [blame] | 111 | |
Lionel Debieve | 4066c90 | 2019-10-17 15:12:13 +0200 | [diff] [blame] | 112 | - ``STM32MP_SDMMC`` |
| 113 | - ``STM32MP_EMMC`` |
| 114 | - ``STM32MP_RAW_NAND`` |
| 115 | - ``STM32MP_SPI_NAND`` |
| 116 | - ``STM32MP_SPI_NOR`` |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 117 | |
Yann Gautier | 377fc85 | 2022-03-03 18:22:46 +0100 | [diff] [blame] | 118 | Serial boot devices: |
| 119 | |
| 120 | - ``STM32MP_UART_PROGRAMMER`` |
| 121 | - ``STM32MP_USB_PROGRAMMER`` |
| 122 | |
| 123 | |
| 124 | Other configuration flags: |
| 125 | |
| 126 | - | ``DTB_FILE_NAME``: to precise board device-tree blob to be used. |
| 127 | | Default: stm32mp157c-ev1.dtb |
| 128 | - | ``STM32MP_EARLY_CONSOLE``: to enable early traces before clock driver is setup. |
| 129 | | Default: 0 (disabled) |
Yann Gautier | b02dd49 | 2022-03-02 14:31:55 +0100 | [diff] [blame] | 130 | - | ``STM32MP_UART_BAUDRATE``: to select UART baud rate. |
| 131 | | Default: 115200 |
Yann Gautier | 377fc85 | 2022-03-03 18:22:46 +0100 | [diff] [blame] | 132 | - | ``STM32_TF_VERSION``: to manage BL2 monotonic counter. |
| 133 | | Default: 0 |
| 134 | |
| 135 | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 136 | Boot with FIP |
| 137 | ~~~~~~~~~~~~~ |
| 138 | You need to build BL2, BL32 (SP_min or OP-TEE) and BL33 (U-Boot) before building FIP binary. |
| 139 | |
| 140 | U-Boot |
| 141 | ______ |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 142 | |
| 143 | .. code:: bash |
| 144 | |
Yann Gautier | b4ddd30 | 2018-10-24 10:50:12 +0200 | [diff] [blame] | 145 | cd <u-boot_directory> |
Yann Gautier | b7168ee | 2019-05-20 11:50:18 +0200 | [diff] [blame] | 146 | make stm32mp15_trusted_defconfig |
Yann Gautier | 969be34 | 2019-02-20 17:34:16 +0100 | [diff] [blame] | 147 | make DEVICE_TREE=stm32mp157c-ev1 all |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 148 | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 149 | OP-TEE (optional) |
| 150 | _________________ |
Yann Gautier | 2392913 | 2021-02-15 17:13:23 +0100 | [diff] [blame] | 151 | |
Yann Gautier | b3386f7 | 2019-04-19 09:41:01 +0200 | [diff] [blame] | 152 | .. code:: bash |
| 153 | |
Lionel Debieve | 4066c90 | 2019-10-17 15:12:13 +0200 | [diff] [blame] | 154 | cd <optee_directory> |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 155 | make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm PLATFORM=stm32mp1 \ |
| 156 | CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts |
| 157 | |
| 158 | |
| 159 | TF-A BL32 (SP_min) |
| 160 | __________________ |
| 161 | If you choose not to use OP-TEE, you can use TF-A SP_min. |
| 162 | To build TF-A BL32, and its device tree file: |
| 163 | |
| 164 | .. code:: bash |
| 165 | |
| 166 | make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
| 167 | AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157c-ev1.dtb bl32 dtbs |
| 168 | |
| 169 | TF-A BL2 |
| 170 | ________ |
| 171 | To build TF-A BL2 with its STM32 header for SD-card boot: |
| 172 | |
| 173 | .. code:: bash |
| 174 | |
| 175 | make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
| 176 | DTB_FILE_NAME=stm32mp157c-ev1.dtb STM32MP_SDMMC=1 |
| 177 | |
| 178 | For other boot devices, you have to replace STM32MP_SDMMC in the previous command |
| 179 | with the desired device flag. |
| 180 | |
| 181 | This BL2 is independent of the BL32 used (SP_min or OP-TEE) |
| 182 | |
| 183 | |
| 184 | FIP |
| 185 | ___ |
| 186 | With BL32 SP_min: |
| 187 | |
| 188 | .. code:: bash |
| 189 | |
| 190 | make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
| 191 | AARCH32_SP=sp_min \ |
| 192 | DTB_FILE_NAME=stm32mp157c-ev1.dtb \ |
| 193 | BL33=<u-boot_directory>/u-boot-nodtb.bin \ |
| 194 | BL33_CFG=<u-boot_directory>/u-boot.dtb \ |
| 195 | fip |
| 196 | |
| 197 | With OP-TEE: |
| 198 | |
| 199 | .. code:: bash |
| 200 | |
| 201 | make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
Yann Gautier | 39b8219 | 2021-10-21 14:57:52 +0200 | [diff] [blame] | 202 | AARCH32_SP=optee \ |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 203 | DTB_FILE_NAME=stm32mp157c-ev1.dtb \ |
| 204 | BL33=<u-boot_directory>/u-boot-nodtb.bin \ |
| 205 | BL33_CFG=<u-boot_directory>/u-boot.dtb \ |
| 206 | BL32=<optee_directory>/tee-header_v2.bin \ |
| 207 | BL32_EXTRA1=<optee_directory>/tee-pager_v2.bin |
| 208 | BL32_EXTRA2=<optee_directory>/tee-pageable_v2.bin |
| 209 | fip |
| 210 | |
| 211 | |
| 212 | STM32IMAGE bootchain |
| 213 | ~~~~~~~~~~~~~~~~~~~~ |
| 214 | You need to add the following flag to the make command: |
| 215 | ``STM32MP_USE_STM32IMAGE=1`` |
| 216 | |
| 217 | To build with SP_min and support for SD-card boot: |
| 218 | |
| 219 | .. code:: bash |
| 220 | |
| 221 | make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
| 222 | AARCH32_SP=sp_min STM32MP_SDMMC=1 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ |
| 223 | STM32MP_USE_STM32IMAGE=1 |
| 224 | |
| 225 | cd <u-boot_directory> |
| 226 | make stm32mp15_trusted_defconfig |
| 227 | make DEVICE_TREE=stm32mp157c-ev1 all |
| 228 | |
| 229 | To build TF-A with OP-TEE support for SD-card boot: |
| 230 | |
| 231 | .. code:: bash |
| 232 | |
| 233 | make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ |
| 234 | AARCH32_SP=optee STM32MP_SDMMC=1 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ |
| 235 | STM32MP_USE_STM32IMAGE=1 |
| 236 | |
| 237 | cd <optee_directory> |
| 238 | make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm PLATFORM=stm32mp1 \ |
| 239 | CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts |
| 240 | |
Lionel Debieve | 4066c90 | 2019-10-17 15:12:13 +0200 | [diff] [blame] | 241 | cd <u-boot_directory> |
Jan Kiszka | 30576a4 | 2020-10-02 10:07:00 +0200 | [diff] [blame] | 242 | make stm32mp15_trusted_defconfig |
Lionel Debieve | 4066c90 | 2019-10-17 15:12:13 +0200 | [diff] [blame] | 243 | make DEVICE_TREE=stm32mp157c-ev1 all |
| 244 | |
Yann Gautier | b3386f7 | 2019-04-19 09:41:01 +0200 | [diff] [blame] | 245 | |
Yann Gautier | 7511539 | 2018-07-16 14:49:34 +0200 | [diff] [blame] | 246 | The following build options are supported: |
| 247 | |
| 248 | - ``ENABLE_STACK_PROTECTOR``: To enable the stack protection. |
Yann Gautier | b4ddd30 | 2018-10-24 10:50:12 +0200 | [diff] [blame] | 249 | |
| 250 | |
| 251 | Populate SD-card |
| 252 | ---------------- |
| 253 | |
Yann Gautier | 9730da0 | 2021-02-12 18:04:23 +0100 | [diff] [blame] | 254 | Boot with FIP |
| 255 | ~~~~~~~~~~~~~ |
| 256 | The SD-card has to be formatted with GPT. |
| 257 | It should contain at least those partitions: |
| 258 | |
| 259 | - fsbl: to copy the tf-a-stm32mp157c-ev1.stm32 binary (BL2) |
| 260 | - fip: which contains the FIP binary |
| 261 | |
| 262 | Usually, two copies of fsbl are used (fsbl1 and fsbl2) instead of one partition fsbl. |
| 263 | |
| 264 | STM32IMAGE bootchain |
| 265 | ~~~~~~~~~~~~~~~~~~~~ |
| 266 | The SD-card has to be formatted with GPT. |
Yann Gautier | b4ddd30 | 2018-10-24 10:50:12 +0200 | [diff] [blame] | 267 | It should contain at least those partitions: |
| 268 | |
| 269 | - fsbl: to copy the tf-a-stm32mp157c-ev1.stm32 binary |
| 270 | - ssbl: to copy the u-boot.stm32 binary |
| 271 | |
| 272 | Usually, two copies of fsbl are used (fsbl1 and fsbl2) instead of one partition fsbl. |
Yann Gautier | 969be34 | 2019-02-20 17:34:16 +0100 | [diff] [blame] | 273 | |
Jan Kiszka | 30576a4 | 2020-10-02 10:07:00 +0200 | [diff] [blame] | 274 | OP-TEE artifacts go into separate partitions as follows: |
| 275 | |
| 276 | - teeh: tee-header_v2.stm32 |
| 277 | - teed: tee-pageable_v2.stm32 |
| 278 | - teex: tee-pager_v2.stm32 |
| 279 | |
Yann Gautier | 969be34 | 2019-02-20 17:34:16 +0100 | [diff] [blame] | 280 | |
| 281 | .. _STM32MP1 Series: https://www.st.com/en/microcontrollers-microprocessors/stm32mp1-series.html |
Yann Gautier | 26c1067 | 2020-10-13 11:27:05 +0200 | [diff] [blame] | 282 | .. _STM32MP1 part number codification: https://wiki.st.com/stm32mpu/wiki/STM32MP15_microprocessor#Part_number_codification |