arm-trusted-firmware/plat/imx/common/include
Igor Opaniuk 9ce232fe98 feat(plat/imx8m): add SiP call for secondary boot
In iMX8MM it is possible to have two copies of bootloader in
SD/eMMC and switch between them. The switch is triggered either
by the BootROM in case the bootloader image is faulty OR can be
enforced by the user. To trigger that switch the
PERSIST_SECONDARY_BOOT bit should be set in GPR10 SRC register.
As the bit is retained after WARM reset, that permits to control
BootROM behavior regarding what boot image it will boot after
reset: primary or secondary.

This is useful for reliable bootloader A/B updates, as it permits
switching between two copies of bootloader at different offsets of
the same storage.

If the PERSIST_SECONDARY_BOOT is 0, the boot ROM uses address
0x8400 for the primary image. If the PERSIST_SECONDARY_BOOT is 1,
the boot ROM reads that secondary image table from address 0x8200
on the boot media and uses the address specified in the table for
the secondary image.

Secondary Image Table contains the sector of secondary bootloader
image, exluding the offset to that image (explained below in the
note). To generate the Secondary Image Table, use e.g.:
$ printf '\x0\x0\x0\x0\x0\x0\x0\x0\x33\x22\x11'
         '\x00\x00\x10\x0\x0\x00\x0\x0\x0'
  > /tmp/sit.bin
$ hexdump  -vC /tmp/sit.bin
  00000000  00 00 00 00
  00000004  00 00 00 00
  00000008  33 22 11 00 <--- This is the "tag"
  0000000c  00 10 00 00 <--- This is the "firstSectorNumber"
  00000010  00 00 00 00

You can also use NXP script from [1][2] imx-mkimage tool for
SIT generation. Note that the firstSectorNumber is NOT the offset
of the IVT, but an offset of the IVT decremented by Image Vector
Table offset (Table 6-25. Image Vector Table Offset and Initial
Load Region Size for iMX8MM/MQ), so for secondary SPL copy at
offset 0x1042 sectors, firstSectorNumber must be 0x1000
(0x42 sectors * 512 = 0x8400 bytes offset).

In order to test redundant boot board should be closed and
SD/MMC manufacture mode disabled, as secondary boot is not
supported in the SD/MMC manufacture mode, which can be disabled
by blowing DISABLE_SDMMC_MFG (example for iMX8MM):
> fuse prog -y 2 1 0x00800000

For additional details check i.MX 8M Mini Apllication Processor
Reference Manual, 6.1.5.4.5 Redundant boot support for
expansion device chapter.

[1] https://source.codeaurora.org/external/imx/imx-mkimage/
[2] scripts/gen_sit.sh
Change-Id: I0a5cea7295a4197f6c89183d74b4011cada52d4c
Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
2021-05-21 15:01:38 +03:00
..
sci imx: Fix multiple definition of ipc_handle 2019-12-04 02:59:03 -06:00
imx8_iomux.h plat: imx: imx8_iomux: fix shift-overflow errors 2020-03-16 22:49:16 +02:00
imx8_lpuart.h imx: Use generic console_t data structure 2020-02-25 09:34:38 +00:00
imx8qm_pads.h Standardise header guards across codebase 2018-11-08 10:20:19 +00:00
imx8qx_pads.h Standardise header guards across codebase 2018-11-08 10:20:19 +00:00
imx_aips.h Standardise header guards across codebase 2018-11-08 10:20:19 +00:00
imx_caam.h imx: Fix missing inclusion of cdefs.h 2019-12-04 02:58:41 -06:00
imx_clock.h plat: imx7: refactor code for reuse 2019-07-17 16:03:20 +08:00
imx_csu.h Standardise header guards across codebase 2018-11-08 10:20:19 +00:00
imx_hab.h Standardise header guards across codebase 2018-11-08 10:20:19 +00:00
imx_io_mux.h plat: imx7: Add PicoPi iMX7D basic support 2019-07-17 16:03:20 +08:00
imx_sip_svc.h feat(plat/imx8m): add SiP call for secondary boot 2021-05-21 15:01:38 +03:00
imx_snvs.h imx: Fix missing inclusion of cdefs.h 2019-12-04 02:58:41 -06:00
imx_uart.h imx: Use generic console_t data structure 2020-02-25 09:34:38 +00:00
imx_wdog.h Sanitise includes across codebase 2019-01-04 10:43:17 +00:00
plat_imx8.h imx: power optimization for i.mx8qm 2019-01-29 09:26:41 +08:00
plat_macros.S Support for NXP's imx SoC common function 2018-06-19 10:24:32 +08:00