blob: 2eccdcfccd9ca710014ec4a591adf6c549119e6f [file] [log] [blame]
Marek Vasute4a0f542021-03-25 01:20:48 +01001i.MX7D/i.MX8MM SRC_GPR10 PERSIST_SECONDARY_BOOT for bootloader A/B switching
2============================================================================
3
4Introduction
5------------
6Since at least iMX53 until iMX8MM, it is possible to have two copies of
7bootloader in SD/eMMC and switch between them. The switch is triggered
8either by the BootROM in case the bootloader image is faulty OR can be
9enforced by the user.
10
11Operation
12---------
13 #. Upon Power-On Reset (POR)
14
15 - SRC_GPR10 bit PERSIST_SECONDARY_BOOT is set to 0
16 - BootROM attempts to start bootloader A-copy
17
18 - if A-copy valid
19
20 - BootROM starts A-copy
21 - END
22
23 - if A-copy NOT valid
24
25 - BootROM sets SRC_GPR10 bit PERSIST_SECONDARY_BOOT to 1
26 - BootROM triggers WARM reset, GOTO 1)
27 - END
28
29 #. Upon COLD Reset
30
31 - GOTO 1)
32 - END
33
34 #. Upon WARM Reset
35
36 - SRC_GPR10 bit PERSIST_SECONDARY_BOOT is retained
37
38 - if SRC_GPR10 bit PERSIST_SECONDARY_BOOT is 0
39
40 - BootROM attempts to start bootloader A-copy
41
42 - if A-copy valid
43
44 - BootROM starts A-copy
45 - END
46
47 - if A-copy NOT valid
48
49 - BootROM sets SRC_GPR10 bit PERSIST_SECONDARY_BOOT to 1
50 - BootROM triggers WARM reset. GOTO 1.3)
51 - END
52
53 - if SRC_GPR10 bit PERSIST_SECONDARY_BOOT is 1
54
55 - BootROM attempts to start bootloader B-copy
56
57 - if B-copy valid
58
59 - BootROM starts B-copy
60 - END
61
62 - if B-copy NOT valid
63 - System hangs
64 - END
65
66Setup
67-----
68The bootloader A-copy must be placed at predetermined offset in SD/eMMC. The
69bootloader B-copy area offset is determined by an offset stored in Secondary
70Image Table (SIT). The SIT must be placed at predetermined offset in SD/eMMC.
71
72The following table contains offset of SIT, bootloader A-copy and recommended
73bootloader B-copy offset. The offsets are in 512 Byte sector units (that is
74offset 0x1 means 512 Bytes from the start of SD/eMMC card data partition).
75For details on the addition of two numbers in recommended B-copy offset, see
76SIT format below.
77
Marek Vasut1ab64722021-08-10 21:12:50 +020078+----------+-----------------------------+--------------------+-----------------------+-----------------------------+
79| SoC | Boot Device Type | SIT offset (fixed) | A-copy offset (fixed) | B-copy offset (recommended) |
80+----------+-----------------------------+--------------------+-----------------------+-----------------------------+
81| iMX7D | | 0x1 | 0x2 | 0x800+0x2 |
82+----------+-----------------------------+--------------------+-----------------------+-----------------------------+
83| iMX8MM | SD/eSD/MMC/eMMC normal boot | 0x41 | 0x42 | 0x1000+0x42 |
84+----------+-----------------------------+--------------------+-----------------------+-----------------------------+
85| iMX8MM | eMMC Fast boot fuse blown | 0x1 | 0x2 | 0x1000+0x2 |
86+----------+-----------------------------+--------------------+-----------------------+-----------------------------+
Marek Vasute4a0f542021-03-25 01:20:48 +010087
88SIT format
89~~~~~~~~~~
90SIT is a 20 byte long structure containing of 5 32-bit words. Those encode
91bootloader B-copy area offset (called "firstSectorNumber"), magic value
92(called "tag") that is always 0x00112233, and three unused words set to 0.
Heinrich Schuchardt898a30c2021-04-11 17:03:53 +020093SIT is documented in [1]_ and [2]_. Example SIT are below::
Marek Vasute4a0f542021-03-25 01:20:48 +010094
95 $ hexdump -vC sit-mx7d.bin
96 00000000 00 00 00 00
97 00000004 00 00 00 00
98 00000008 33 22 11 00 <--- This is the "tag"
99 0000000c 00 08 00 00 <--- This is the "firstSectorNumber"
100 00000010 00 00 00 00
101
102 $ hexdump -vC sit-mx8mm.bin
103 00000000 00 00 00 00
104 00000004 00 00 00 00
105 00000008 33 22 11 00 <--- This is the "tag"
106 0000000c 00 10 00 00 <--- This is the "firstSectorNumber"
107 00000010 00 00 00 00
108
109B-copy area offset ("firstSectorNumber") is offset, in units of 512 Byte
110sectors, that is added to the start of boot media when switching between
111A-copy and B-copy. For A-copy, this offset is 0x0. For B-copy, this offset
112is determined by SIT (e.g. if firstSectorNumber is 0x1000 as it is above
113in sit-mx8mm.bin, then the B-copy offset is 0x1000 sectors = 2 MiB).
114
115Bootloader A-copy (e.g. u-boot.imx or flash.bin) is placed at fixed offset
116from A-copy area offset (e.g. 0x2 sectors from sector 0x0 for iMX7D, which
117means u-boot.imx A-copy must be written to sector 0x2).
118
119The same applies to bootloader B-copy, which is placed at fixed offset from
120B-copy area offset determined by SIT (e.g. 0x2 sectors from sector 0x800 [see
121sit-mx7d.bin example above, this can be changed in SIT firstSectorNumber] for
122iMX7D, which means u-boot.imx B-copy must be written to sector 0x802)
123
124**WARNING:**
125B-copy area offset ("firstSectorNumber") is NOT equal to bootloader
126(image, which is u-boot.imx or flash.bin) B-copy offset.
127
128To generate SIT, use for example the following bourne shell printf command::
129
130$ printf '\x0\x0\x0\x0\x0\x0\x0\x0\x33\x22\x11\x00\x00\x08\x00\x00\x0\x0\x0\x0' > sit-mx7d.bin
131$ printf '\x0\x0\x0\x0\x0\x0\x0\x0\x33\x22\x11\x00\x00\x10\x00\x00\x0\x0\x0\x0' > sit-mx8mm.bin
132
133Write bootloader A/B copy and SIT to SD/eMMC
134~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
135
136Examples of writing SIT and two copies of bootloader to SD or eMMC:
137
138- iMX8MM, SD card at /dev/sdX, Linux command line
139 ::
140
141 $ dd if=sit-mx8mm.bin of=/dev/sdX bs=512 seek=65
142 $ dd if=flash.bin of=/dev/sdX bs=512 seek=66
143 $ dd if=flash.bin of=/dev/sdX bs=512 seek=4162
144
145- iMX8MM, eMMC 1 data partition, U-Boot command line
146 ::
147
148 => mmc partconf 1 0 0 0
149
150 => dhcp ${loadaddr} sit-mx8mm.bin
151 => mmc dev 1
152 => mmc write ${loadaddr} 0x41 0x1
153
154 => dhcp ${loadaddr} flash.bin
Marek Vasutdc187492021-04-11 18:30:36 +0200155 => setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
Marek Vasute4a0f542021-03-25 01:20:48 +0100156 => mmc dev 1
157 => mmc write ${loadaddr} 0x42 ${blkcnt}
158 => mmc write ${loadaddr} 0x1042 ${blkcnt}
159
160WARM reset into B-copy using WDT
161~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162
163To perform a reboot into B-copy, the PERSIST_SECONDARY_BOOT must be set
Marek Vasut14438cb2021-08-10 21:12:49 +0200164in SRC_GPR10 register. Example on iMX8MM::
Marek Vasute4a0f542021-03-25 01:20:48 +0100165
166 => mw 0x30390098 0x40000000
167
168A WARM reset can be triggered using WDT as follows::
169
170 => mw.w 0x30280000 0x25
171
172References
173----------
174
175.. [1] i.MX 7Dual Applications Processor Reference Manual, Rev. 1, 01/2018 ; section 6.6.5.3.5 Redundant boot support for expansion device
176.. [2] i.MX 8M Mini Applications Processor Reference Manual, Rev. 3, 11/2020 ; section 6.1.5.4.5 Redundant boot support for expansion device