blob: d2f86b0a11a71baa571c573b080bf5819d0a275a [file] [log] [blame]
Bryan Brattlof16a30b32022-12-19 14:29:50 -06001.. SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2.. sectionauthor:: Bryan Brattlof <bb@ti.com>
3
4K3 Generation
5=============
6
7Summary
8-------
9
10Texas Instrument's K3 family of SoCs utilize a heterogeneous multicore
11and highly integrated device architecture targeted to maximize
12performance and power efficiency for a wide range of industrial,
13automotive and other broad market segments.
14
15Typically the processing cores and the peripherals for these devices are
16partitioned into three functional domains to provide ultra-low power
17modes as well as accommodating application and industrial safety systems
18on the same SoC. These functional domains are typically called the:
19
20* Wakeup (WKUP) domain
21* Micro-controller (MCU) domain
22* Main domain
23
24For a more detailed view of what peripherals are attached to each
25domain, consult the device specific documentation.
26
27K3 Based SoCs
28-------------
29
30.. toctree::
31 :maxdepth: 1
32
Bryan Brattlof16a30b32022-12-19 14:29:50 -060033 am62x_sk
Marcel Ziswiler7d1a1062023-08-04 12:08:08 +020034 ../toradex/verdin-am62
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +053035 am65x_evm
Nishanth Menon5c86c572023-07-27 13:59:01 -050036 j7200_evm
37 j721e_evm
Bryan Brattlof16a30b32022-12-19 14:29:50 -060038
39Boot Flow Overview
40------------------
41
42For all K3 SoCs the first core started will be inside the Security
43Management Subsystem (SMS) which will secure the device and start a core
44in the wakeup domain to run the ROM code. ROM will then initialize the
45boot media needed to load the binaries packaged inside `tiboot3.bin`,
46including a 32bit U-Boot SPL, (called the wakup SPL) that ROM will jump
47to after it has finished loading everything into internal SRAM.
48
Nishanth Menon6e8fa062023-07-27 13:59:02 -050049.. image:: img/boot_flow_01.svg
Bryan Brattlof16a30b32022-12-19 14:29:50 -060050
51The wakeup SPL, running on a wakeup domain core, will initialize DDR and
52any peripherals needed load the larger binaries inside the `tispl.bin`
53into DDR. Once loaded the wakeup SPL will start one of the 'big'
54application cores inside the main domain to initialize the main domain,
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +053055starting with Trusted Firmware-A (TF-A), before moving on to start
56OP-TEE and the main domain's U-Boot SPL.
Bryan Brattlof16a30b32022-12-19 14:29:50 -060057
Nishanth Menon6e8fa062023-07-27 13:59:02 -050058.. image:: img/boot_flow_02.svg
Bryan Brattlof16a30b32022-12-19 14:29:50 -060059
60The main domain's SPL, running on a 64bit application core, has
61virtually unlimited space (billions of bytes now that DDR is working) to
62initialize even more peripherals needed to load in the `u-boot.img`
63which loads more firmware into the micro-controller & wakeup domains and
64finally prepare the main domain to run Linux.
65
Nishanth Menon6e8fa062023-07-27 13:59:02 -050066.. image:: img/boot_flow_03.svg
Bryan Brattlof16a30b32022-12-19 14:29:50 -060067
68This is the typical boot flow for all K3 based SoCs, however this flow
69offers quite a lot in the terms of flexibility, especially on High
70Security (HS) SoCs.
71
72Boot Flow Variations
73^^^^^^^^^^^^^^^^^^^^
74
75All K3 SoCs will generally use the above boot flow with two main
76differences depending on the capabilities of the boot ROM and the number
77of cores inside the device. These differences split the bootflow into
78essentially 4 unique but very similar flows:
79
80* Split binary with a combined firmware: (eg: AM65)
81* Combined binary with a combined firmware: (eg: AM64)
82* Split binary with a split firmware: (eg: J721E)
83* Combined binary with a split firmware: (eg: AM62)
84
85For devices that utilize the split binary approach, ROM is not capable
86of loading the firmware into the SoC requiring the wakeup domain's
87U-Boot SPL to load the firmware.
88
89Devices with a split firmware will have two firmwares loaded into the
90device at different times during the bootup process. TI's Foundational
91Security (TIFS), needed to operate the Security Management Subsystem,
92will either be loaded by ROM or the WKUP U-Boot SPL, then once the
93wakeup U-Boot SPL has completed, the second Device Management (DM)
94firmware can be loaded on the now free core in the wakeup domain.
95
96For more information on the bootup process of your SoC, consult the
97device specific boot flow documentation.
98
99Software Sources
100----------------
101
102All scripts and code needed to build the `tiboot3.bin`, `tispl.bin` and
103`u-boot.img` for all K3 SoCs can be located at the following places
104online
105
Nishanth Menoncce3e7a2023-07-27 13:58:44 -0500106.. k3_rst_include_start_boot_sources
107
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600108* **Das U-Boot**
109
110 | **source:** https://source.denx.de/u-boot/u-boot.git
111 | **branch:** master
112
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530113* **Trusted Firmware-A (TF-A)**
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600114
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530115 | **source:** https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600116 | **branch:** master
117
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530118* **Open Portable Trusted Execution Environment (OP-TEE)**
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600119
120 | **source:** https://github.com/OP-TEE/optee_os.git
121 | **branch:** master
122
123* **TI Firmware (TIFS, DM, DSMC)**
124
125 | **source:** https://git.ti.com/git/processor-firmware/ti-linux-firmware.git
126 | **branch:** ti-linux-firmware
127
Nishanth Menoncce3e7a2023-07-27 13:58:44 -0500128.. k3_rst_include_end_boot_sources
129
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600130Build Procedure
131---------------
132
133Depending on the specifics of your device, you will need three or more
134binaries to boot your SoC.
135
136* `tiboot3.bin` (bootloader for the wakeup domain)
137* `tispl.bin` (bootloader for the main domain)
138* `u-boot.img`
139
140During the bootup process, both the 32bit wakeup domain and the 64bit
141main domains will be involved. This means everything inside the
142`tiboot3.bin` running in the wakeup domain will need to be compiled for
14332bit cores and most binaries in the `tispl.bin` will need to be
144compiled for 64bit main domain CPU cores.
145
146All of that to say you will need both a 32bit and 64bit cross compiler
147(assuming you're using an x86 desktop)
148
Nishanth Menonc727b812023-07-27 13:58:48 -0500149.. k3_rst_include_start_common_env_vars_desc
150.. list-table:: Generic environment variables
151 :widths: 25 25 50
152 :header-rows: 1
153
154 * - S/w Component
155 - Env Variable
156 - Description
157 * - All Software
158 - CC32
159 - Cross compiler for ARMv7 (ARM 32bit), typically arm-linux-gnueabihf-
160 * - All Software
161 - CC64
162 - Cross compiler for ARMv8 (ARM 64bit), typically aarch64-linux-gnu-
163 * - All Software
164 - LNX_FW_PATH
165 - Path to TI Linux firmware repository
166 * - All Software
167 - TFA_PATH
168 - Path to source of Trusted Firmware-A
169 * - All Software
170 - OPTEE_PATH
171 - Path to source of OP-TEE
172.. k3_rst_include_end_common_env_vars_desc
173
174.. k3_rst_include_start_common_env_vars_defn
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600175.. code-block:: bash
176
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530177 $ export CC32=arm-linux-gnueabihf-
178 $ export CC64=aarch64-linux-gnu-
Nishanth Menonc727b812023-07-27 13:58:48 -0500179 $ export LNX_FW_PATH=path/to/ti-linux-firmware
180 $ export TFA_PATH=path/to/trusted-firmware-a
181 $ export OPTEE_PATH=path/to/optee_os
182.. k3_rst_include_end_common_env_vars_defn
183
184We will also need some common environment variables set up for the various
185other build sources. we shall use the following, in the build descriptions below:
186
187.. k3_rst_include_start_board_env_vars_desc
188.. list-table:: Board specific environment variables
189 :widths: 25 25 50
190 :header-rows: 1
191
192 * - S/w Component
193 - Env Variable
194 - Description
195 * - U-Boot
196 - UBOOT_CFG_CORTEXR
197 - Defconfig for Cortex-R (Boot processor).
198 * - U-Boot
199 - UBOOT_CFG_CORTEXA
200 - Defconfig for Cortex-A (MPU processor).
201 * - Trusted Firmware-A
202 - TFA_BOARD
203 - Platform name used for building TF-A for Cortex-A Processor.
204 * - Trusted Firmware-A
205 - TFA_EXTRA_ARGS
206 - Any extra arguments used for building TF-A.
207 * - OP-TEE
208 - OPTEE_PLATFORM
209 - Platform name used for building OP-TEE for Cortex-A Processor.
210 * - OP-TEE
211 - OPTEE_EXTRA_ARGS
212 - Any extra arguments used for building OP-TEE.
213.. k3_rst_include_end_board_env_vars_desc
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600214
215Building tiboot3.bin
216^^^^^^^^^^^^^^^^^^^^^
217
2181. To generate the U-Boot SPL for the wakeup domain, use the following
219 commands, substituting :code:`{SOC}` for the name of your device (eg:
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530220 am62x) to package the various firmware and the wakeup UBoot SPL into
221 the final `tiboot3.bin` binary. (or the `sysfw.itb` if your device
222 uses the split binary flow)
223
Nishanth Menonc727b812023-07-27 13:58:48 -0500224.. k3_rst_include_start_build_steps_spl_r5
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600225.. code-block:: bash
226
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530227 $ # inside u-boot source
Nishanth Menonc727b812023-07-27 13:58:48 -0500228 $ make $UBOOT_CFG_CORTEXR
229 $ make CROSS_COMPILE=$CC32 BINMAN_INDIRS=$LNX_FW_PATH
230.. k3_rst_include_end_build_steps_spl_r5
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600231
232At this point you should have all the needed binaries to boot the wakeup
233domain of your K3 SoC.
234
235**Combined Binary Boot Flow** (eg: am62x, am64x, ... )
236
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530237 `tiboot3-{SOC}-{gp/hs-fs/hs}.bin`
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600238
239**Split Binary Boot Flow** (eg: j721e, am65x)
240
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530241 | `tiboot3-{SOC}-{gp/hs-fs/hs}.bin`
242 | `sysfw-{SOC}-{gp/hs-fs/hs}-evm.itb`
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600243
244.. note ::
245
246 It's important to rename the generated `tiboot3.bin` and `sysfw.itb`
247 to match exactly `tiboot3.bin` and `sysfw.itb` as ROM and the wakeup
248 UBoot SPL will only look for and load the files with these names.
249
250Building tispl.bin
251^^^^^^^^^^^^^^^^^^^
252
253The `tispl.bin` is a standard fitImage combining the firmware need for
254the main domain to function properly as well as Device Management (DM)
255firmware if your device using a split firmware.
256
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +05302572. We will first need TF-A, as it's the first thing to run on the 'big'
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600258 application cores on the main domain.
259
Nishanth Menonc727b812023-07-27 13:58:48 -0500260.. k3_rst_include_start_build_steps_tfa
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600261.. code-block:: bash
262
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530263 $ # inside trusted-firmware-a source
Nishanth Menonc727b812023-07-27 13:58:48 -0500264 $ make CROSS_COMPILE=$CC64 ARCH=aarch64 PLAT=k3 SPD=opteed $TFA_EXTRA_ARGS \
265 TARGET_BOARD=$TFA_BOARD
266.. k3_rst_include_end_build_steps_tfa
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600267
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530268Typically all `j7*` devices will use `TARGET_BOARD=generic` or `TARGET_BOARD
Nishanth Menonc727b812023-07-27 13:58:48 -0500269=j784s4` (if it is a J784S4 device), while typical Sitara (`am6*`) devices
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530270use the `lite` option.
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600271
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +05302723. The Open Portable Trusted Execution Environment (OP-TEE) is designed
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600273 to run as a companion to a non-secure Linux kernel for Cortex-A cores
274 using the TrustZone technology built into the core.
275
Nishanth Menonc727b812023-07-27 13:58:48 -0500276.. k3_rst_include_start_build_steps_optee
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600277.. code-block:: bash
278
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530279 $ # inside optee_os source
Nishanth Menonc727b812023-07-27 13:58:48 -0500280 $ make CROSS_COMPILE=$CC32 CROSS_COMPILE64=$CC64 CFG_ARM64_core=y $OPTEE_EXTRA_ARGS \
281 PLATFORM=$OPTEE_PLATFORM
282.. k3_rst_include_end_build_steps_optee
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600283
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +05302844. Finally, after TF-A has initialized the main domain and OP-TEE has
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600285 finished, we can jump back into U-Boot again, this time running on a
286 64bit core in the main domain.
287
Nishanth Menonc727b812023-07-27 13:58:48 -0500288.. k3_rst_include_start_build_steps_uboot
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600289.. code-block:: bash
290
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530291 $ # inside u-boot source
Nishanth Menonc727b812023-07-27 13:58:48 -0500292 $ make $UBOOT_CFG_CORTEXA
293 $ make CROSS_COMPILE=$CC64 BINMAN_INDIRS=$LNX_FW_PATH \
294 BL31=$TFA_PATH/build/k3/$TFA_BOARD/release/bl31.bin \
295 TEE=$OPTEE_PATH/out/arm-plat-k3/core/tee-raw.bin
296.. k3_rst_include_end_build_steps_uboot
Bryan Brattlof16a30b32022-12-19 14:29:50 -0600297
298At this point you should have every binary needed initialize both the
299wakeup and main domain and to boot to the U-Boot prompt
300
301**Main Domain Bootloader**
302
Neha Malcom Francis1ee652a2023-07-22 00:14:43 +0530303 | `tispl.bin` for HS devices or `tispl.bin_unsigned` for GP devices
304 | `u-boot.img` for HS devices or `u-boot.img_unsigned` for GP devices
Manorit Chawdhrya5e86782023-07-14 11:22:29 +0530305
306Fit Signature Signing
307---------------------
308
309K3 Platforms have fit signature signing enabled by default on their primary
310platforms. Here we'll take an example for creating fit image for J721e platform
311and the same can be extended to other platforms
312
3131. Describing FIT source
314
315 .. code-block:: bash
316
317 /dts-v1/;
318
319 / {
320 description = "Kernel fitImage for j721e-hs-evm";
321 #address-cells = <1>;
322
323 images {
324 kernel-1 {
325 description = "Linux kernel";
326 data = /incbin/("Image");
327 type = "kernel";
328 arch = "arm64";
329 os = "linux";
330 compression = "none";
331 load = <0x80080000>;
332 entry = <0x80080000>;
333 hash-1 {
334 algo = "sha512";
335 };
336
337 };
338 fdt-ti_k3-j721e-common-proc-board.dtb {
339 description = "Flattened Device Tree blob";
340 data = /incbin/("k3-j721e-common-proc-board.dtb");
341 type = "flat_dt";
342 arch = "arm64";
343 compression = "none";
344 load = <0x83000000>;
345 hash-1 {
346 algo = "sha512";
347 };
348
349 };
350 };
351
352 configurations {
353 default = "conf-ti_k3-j721e-common-proc-board.dtb";
354 conf-ti_k3-j721e-common-proc-board.dtb {
355 description = "Linux kernel, FDT blob";
356 fdt = "fdt-ti_k3-j721e-common-proc-board.dtb";
357 kernel = "kernel-1";
358 signature-1 {
359 algo = "sha512,rsa4096";
360 key-name-hint = "custMpk";
361 sign-images = "kernel", "fdt";
362 };
363 };
364 };
365 };
366
367 You would require to change the '/incbin/' lines to point to the respective
368 files in your local machine and the key-name-hint also needs to be changed
369 if you are using some other key other than the TI dummy key that we are
370 using for this example.
371
3722. Compile U-boot for the respective board
373
Nishanth Menonc727b812023-07-27 13:58:48 -0500374.. include:: k3.rst
375 :start-after: .. k3_rst_include_start_build_steps_uboot
376 :end-before: .. k3_rst_include_end_build_steps_uboot
Manorit Chawdhrya5e86782023-07-14 11:22:29 +0530377
Nishanth Menonc727b812023-07-27 13:58:48 -0500378.. note::
Manorit Chawdhrya5e86782023-07-14 11:22:29 +0530379
380 The changes only affect a72 binaries so the example just builds that
381
3823. Sign the fit image and embed the dtb in uboot
383
384 Now once the build is done, you'll have a dtb for your board that you'll
385 be passing to mkimage for signing the fitImage and embedding the key in
386 the u-boot dtb.
387
388 .. code-block:: bash
389
390 mkimage -r -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K
391 $UBOOT_PATH/build/a72/dts/dt.dtb
392
393 For signing a secondary platform, pass the -K parameter to that DTB
394
395 .. code-block:: bash
396
397 mkimage -f fitImage.its -k $UBOOT_PATH/board/ti/keys -K
398 $UBOOT_PATH/build/a72/arch/arm/dts/k3-j721e-sk.dtb
399
400 .. note::
401
402 If changing `CONFIG_DEFAULT_DEVICE_TREE` to the secondary platform,
403 binman changes would also be required so that correct dtb gets packaged.
404
405 .. code-block:: bash
406
407 diff --git a/arch/arm/dts/k3-j721e-binman.dtsi b/arch/arm/dts/k3-j721e-binman.dtsi
408 index 673be646b1e3..752fa805fe8d 100644
409 --- a/arch/arm/dts/k3-j721e-binman.dtsi
410 +++ b/arch/arm/dts/k3-j721e-binman.dtsi
411 @@ -299,8 +299,8 @@
412 #define SPL_J721E_SK_DTB "spl/dts/k3-j721e-sk.dtb"
413
414 #define UBOOT_NODTB "u-boot-nodtb.bin"
415 -#define J721E_EVM_DTB "u-boot.dtb"
416 -#define J721E_SK_DTB "arch/arm/dts/k3-j721e-sk.dtb"
417 +#define J721E_EVM_DTB "arch/arm/dts/k3-j721e-common-proc-board.dtb"
418 +#define J721E_SK_DTB "u-boot.dtb"
419
4205. Rebuilt u-boot
421
422 This is required so that the modified dtb gets updated in u-boot.img
423
Nishanth Menonc727b812023-07-27 13:58:48 -0500424.. include:: k3.rst
425 :start-after: .. k3_rst_include_start_build_steps_uboot
426 :end-before: .. k3_rst_include_end_build_steps_uboot
Manorit Chawdhrya5e86782023-07-14 11:22:29 +0530427
4286. (Optional) Enabled FIT_SIGNATURE_ENFORCED
429
430 By default u-boot will boot up the fit image without any authentication as
431 such if the public key is not embedded properly, to check if the public key
432 nodes are proper you can enable FIT_SIGNATURE_ENFORCED that would not rely
433 on the dtb for anything else then the signature node for checking the fit
434 image, rest other things will be enforced such as the property of
435 required-keys. This is not an extensive check so do manual checks also
436
437 This is by default enabled for devices with TI_SECURE_DEVICE enabled.
438
439.. note::
440
441 The devices now also have distroboot enabled so if the fit image doesn't
442 work then the fallback to normal distroboot will be there on hs devices,
443 this will need to be explicitly disabled by changing the boot_targets.
444
445Saving environment
446------------------
447
448SAVEENV is disabled by default and for the new flow uses Uenv.txt as the default
449way for saving the environments. This has been done as Uenv.txt is more granular
450then the saveenv command and can be used across various bootmodes too.
451
452**Writing to MMC/EMMC**
453
454.. code-block::
455
456 => env export -t $loadaddr <list of variables>
457 => fatwrite mmc ${mmcdev} ${loadaddr} ${bootenvfile} ${filesize}
458
459**Reading from MMC/EMMC**
460
461By default run envboot will read it from the MMC/EMMC partition ( based on
462mmcdev) and set the environments.
463
464If manually needs to be done then the environment can be read from the
465filesystem and then imported
466
467.. code-block::
468
469 => fatload mmc ${mmcdev} ${loadaddr} ${bootenvfile}
470 => env import -t ${loadaddr} ${filesize}