[U-Boot] [PATCH 0/2] Update Falcon Mode docs

Hey all,
The following 2 patches update docs for falcon mode, and am335x_evm. The first adds a quick general note about how failure is decided in falcon mode and we drop back to U-Boot. The second adds a README for am335x_evm which provides examples for eMMC or raw SD cards, FAT SD cards and NAND for setting up falcon mode. This also updates the DFU info to be able to write these areas and corrects a small bug in the NAND configuration for falcon mode. I did this in part because while I found doc/README.falcon helpful we still want to provide board-specific examples when possible I believe.
And, as has been pointed out to me on IRC, this isn't a huge boot time win (and may be a loss) until we have dcache configured correctly. This is on my TODO list, but a separate patch.

Signed-off-by: Tom Rini trini@ti.com --- doc/README.falcon | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/doc/README.falcon b/doc/README.falcon index 93e855d..6357b1e 100644 --- a/doc/README.falcon +++ b/doc/README.falcon @@ -41,6 +41,8 @@ file (CONFIG_CMD_SPL_NAND_OFS for NAND).
3. Boot the board into Falcon Mode. SPL will load the kernel and copy the parameters which are saved in the persistent area to the required address. +If a valid uImage is not found at the defined location, U-Boot will be +booted instead.
It is required to implement a custom mechanism to select if SPL loads U-Boot or another image.

"Tom" == Tom Rini trini@ti.com writes:
Tom> Signed-off-by: Tom Rini trini@ti.com
Reviewed-by: Peter Korsgaard jacmet@sunsite.dk
Tom> --- Tom> doc/README.falcon | 2 ++ Tom> 1 file changed, 2 insertions(+)
Tom> diff --git a/doc/README.falcon b/doc/README.falcon Tom> index 93e855d..6357b1e 100644 Tom> --- a/doc/README.falcon Tom> +++ b/doc/README.falcon Tom> @@ -41,6 +41,8 @@ file (CONFIG_CMD_SPL_NAND_OFS for NAND).
Tom> 3. Boot the board into Falcon Mode. SPL will load the kernel and copy Tom> the parameters which are saved in the persistent area to the required address. Tom> +If a valid uImage is not found at the defined location, U-Boot will be Tom> +booted instead.
Tom> It is required to implement a custom mechanism to select if SPL loads U-Boot Tom> or another image. Tom> -- Tom> 1.7.9.5
Tom> _______________________________________________ Tom> U-Boot mailing list Tom> U-Boot@lists.denx.de Tom> http://lists.denx.de/mailman/listinfo/u-boot

- Update Falcon Mode support so that the offsets used in eMMC (or a raw SD card) would allow for enough room for a device tree to be used rather than an ATAGS blob as well as environment to be saved in eMMC. - Add board/ti/am335x/README which covers a few basic items, and provides an example of Falcon Mode for eMMC, FAT SD card and NAND. - Round up the size of u-boot.img.raw to match these use-cases, and add the entries for Falcon Mode to DFU for eMMC, FAT SD cards and NAND - Correct CONFIG_CMD_SPL_WRITE_SIZE size (eraseblocks are 128KiB)
Signed-off-by: Tom Rini trini@ti.com --- board/ti/am335x/README | 123 ++++++++++++++++++++++++++++++++++++++++++ include/configs/am335x_evm.h | 19 ++++--- 2 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 board/ti/am335x/README
diff --git a/board/ti/am335x/README b/board/ti/am335x/README new file mode 100644 index 0000000..565f18c --- /dev/null +++ b/board/ti/am335x/README @@ -0,0 +1,123 @@ +Summary +======= + +This document covers various features of the 'am335x_evm' build, and some of +the related build targets (am335x_evm_uartN, etc). + +Hardware +======== + +The binary produced by this board supports, based on parsing of the EEPROM +doumentd in TI's reference designs: +- AM335x GP EVM +- AM335x EVM SK +- Beaglebone White +- Beaglebone Black + +Falcon Mode +=========== + +The default build includes "Falcon Mode" (see doc/README.falcon) via NAND, +eMMC (or raw SD cards) and FAT SD cards. Our default behavior currently is +to read a 'c' on the console while in SPL at any point prior to loading the +OS payload (so as soon as possible) to opt to booting full U-Boot. Also +note that while one can program Falcon Mode "in place" great care needs to +be taken by the user to not 'brick' their setup. As these are all eval +boards with multiple boot methods, recovery should not be an issue in this +worst-case however. + +Falcon Mode: eMMC +================= + +The recommended layout in this case is: + +MMC BLOCKS |--------------------------------| LOCATION IN BYTES +0x0000 - 0x007F : MBR or GPT table : 0x000000 - 0x020000 +0x0080 - 0x00FF : ARGS or FDT file : 0x010000 - 0x020000 +0x0100 - 0x01FF : SPL.backup1 (first copy used) : 0x020000 - 0x040000 +0x0200 - 0x02FF : SPL.backup2 (second copy used) : 0x040000 - 0x060000 +0x0300 - 0x06FF : U-Boot : 0x060000 - 0x0e0000 +0x0700 - 0x08FF : U-Boot Env + Redundant : 0x0e0000 - 0x120000 +0x0900 - 0x28FF : Kernel : 0x120000 - 0x520000 + +Note that when we run 'spl export' it will prepare to boot the kernel. +This includes relocation of the uImage from where we loaded it to the entry +point defined in the head. As these locations overlap by default, it would +leave us with an image that if written to MMC will not boot, so instead of +using the loadaddr variable we use 0x81000000 in the following example. In +this example we are loading from the network, for simplicity, and assume a +valid partition table already exists and 'mmc dev' has already been run to +select the correct device. Also note that if you previously had a FAT +partition (such as on a Beaglebone Black) it is not enough to write garbage +into the area, you must delete it from the partition table first. + +A further word of warning about using eMMC and partition tables. When +working with SD cards we can get away with erasing small areas at a time, +however on eMMC we must keep erases aligned to eraseblocks and thus the +first erase we issue will erase the partition table. If you have an +existing table you wish to re-use you must use 'mmc read' to save it. If +you wish to create a new table, U-Boot supports (but this build does not +enable) creating GPT-style tables. For more information about that see +doc/README.gpt + +# Ensure are able to talk with this mmc device, erase most previous contents +U-Boot # mmc rescan +U-Boot # mmc erase 80 680 +U-Boot # tftp 81000000 am335x/MLO +# Write to two of the backup locations ROM uses +U-Boot # mmc write 81000000 100 100 +U-Boot # mmc write 81000000 200 100 +# Write U-Boot to the location set in the config +U-Boot # tftp 81000000 am335x/u-boot.img +U-Boot # mmc write 81000000 300 400 +# Load kernel and device tree into memory, perform export +U-Boot # tftp 81000000 am335x/uImage +U-Boot # run findfdt +U-Boot # tftp ${fdtaddr} am335x/${fdtfile} +U-Boot # run mmcargs +U-Boot # spl export fdt 81000000 - ${fdtaddr} +# Write the updated device tree to MMC +U-Boot # mmc write ${fdtaddr} 80 80 +U-Boot # mmc erase 900 2000 +# Write the uImage to MMC +U-Boot # mmc write 81000000 900 2000 + +Falcon Mode: FAT SD cards +========================= + +In this case the additional file is written to the filesystem. In this +example we assume that the uImage and device tree to be used are already on +the FAT filesystem (only the uImage MUST be for this to function +afterwards) along with a Falcon Mode aware MLO and the FAT partition has +already been created and marked bootable: + +U-Boot # mmc rescan +# Load kernel and device tree into memory, perform export +U-Boot # load mmc 0:1 ${loadaddr} uImage +U-Boot # run findfdt +U-Boot # load mmc 0:1 ${fdtaddr} ${fdtfile} +U-Boot # run mmcargs +U-Boot # spl export fdt ${loadaddr} - ${fdtaddr} + +This will print a number of lines and then end with something like: + Using Device Tree in place at 80f80000, end 80f85928 + Using Device Tree in place at 80f80000, end 80f88928 +So then you: + +U-Boot # fatwrite mmc 0:1 0x80f80000 args 8928 + +Falcon Mode: NAND +================= + +In this case the additional data is written to another partition of the +NAND. In this example we assume that the uImage and device tree to be are +already located on the NAND somewhere (such as fileystem or mtd partition) +along with a Falcon Mode aware MLO written to the correct locations for +booting and mtdparts have been configured correctly for the board: + +U-Boot # nand read ${loadaddr} kernel +U-Boot # load nand rootfs ${fdtaddr} /boot/am335x-evm.dtb +U-Boot # run nandargs +U-Boot # spl export fdt ${loadaddr} - ${fdtaddr} +U-Boot # nand erase.part u-boot-spl-os +U-Boot # nand write ${fdtaddr} u-boot-spl-os diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h index c5a6d4b..0f12c75 100644 --- a/include/configs/am335x_evm.h +++ b/include/configs/am335x_evm.h @@ -238,7 +238,11 @@ "rootfs part 0 2;" \ "MLO fat 0 1;" \ "MLO.raw mmc 100 100;" \ - "u-boot.img.raw mmc 300 3C0;" \ + "u-boot.img.raw mmc 300 400;" \ + "spl-os-args.raw mmc 80 80;" \ + "spl-os-image.raw mmc 900 2000;" \ + "spl-os-args fat 0 1;" \ + "spl-os-image fat 0 1;" \ "u-boot.img fat 0 1;" \ "uEnv.txt fat 0 1" #define DFU_ALT_INFO_NAND \ @@ -247,8 +251,9 @@ "SPL.backup2 part 0 3;" \ "SPL.backup3 part 0 4;" \ "u-boot part 0 5;" \ - "kernel part 0 7;" \ - "rootfs part 0 8" + "u-boot-spl-os part 0 6;" \ + "kernel part 0 8;" \ + "rootfs part 0 9"
/* Physical Memory Map */ #define CONFIG_NR_DRAM_BANKS 1 /* 1 bank of DRAM */ @@ -332,14 +337,14 @@ #define CONFIG_SYS_SPL_ARGS_ADDR (PHYS_DRAM_1 + 0x100)
/* raw mmc */ -#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR 0x500 /* address 0xa0000 */ -#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 0x8 /* address 0x1000 */ -#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 8 /* 4KB */ +#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR 0x900 /* address 0x120000 */ +#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 0x80 /* address 0x10000 */ +#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 0x80 /* 64KiB */
/* nand */ #define CONFIG_CMD_SPL_NAND_OFS 0x240000 /* end of u-boot */ #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x280000 -#define CONFIG_CMD_SPL_WRITE_SIZE 0x1000 +#define CONFIG_CMD_SPL_WRITE_SIZE 0x2000
/* spl export command */ #define CONFIG_CMD_SPL

"Tom" == Tom Rini trini@ti.com writes:
Tom> - Update Falcon Mode support so that the offsets used in eMMC (or a raw Tom> SD card) would allow for enough room for a device tree to be used Tom> rather than an ATAGS blob as well as environment to be saved in eMMC. Tom> - Add board/ti/am335x/README which covers a few basic items, and Tom> provides an example of Falcon Mode for eMMC, FAT SD card and NAND. Tom> - Round up the size of u-boot.img.raw to match these use-cases, and add Tom> the entries for Falcon Mode to DFU for eMMC, FAT SD cards and NAND Tom> - Correct CONFIG_CMD_SPL_WRITE_SIZE size (eraseblocks are 128KiB)
It looks to me like this should be 4 (or 3) seperate commits then?
Tom> Signed-off-by: Tom Rini trini@ti.com Tom> --- Tom> board/ti/am335x/README | 123 ++++++++++++++++++++++++++++++++++++++++++ Tom> include/configs/am335x_evm.h | 19 ++++--- Tom> 2 files changed, 135 insertions(+), 7 deletions(-) Tom> create mode 100644 board/ti/am335x/README
Tom> diff --git a/board/ti/am335x/README b/board/ti/am335x/README Tom> new file mode 100644 Tom> index 0000000..565f18c Tom> --- /dev/null Tom> +++ b/board/ti/am335x/README Tom> @@ -0,0 +1,123 @@ Tom> +Summary Tom> +======= Tom> + Tom> +This document covers various features of the 'am335x_evm' build, and some of Tom> +the related build targets (am335x_evm_uartN, etc). Tom> + Tom> +Hardware Tom> +======== Tom> + Tom> +The binary produced by this board supports, based on parsing of the EEPROM Tom> +doumentd in TI's reference designs:
documented
Tom> +Note that when we run 'spl export' it will prepare to boot the kernel. Tom> +This includes relocation of the uImage from where we loaded it to the entry Tom> +point defined in the head. As these locations overlap by default, it would
header
Tom> +A further word of warning about using eMMC and partition tables. When Tom> +working with SD cards we can get away with erasing small areas at a time, Tom> +however on eMMC we must keep erases aligned to eraseblocks and thus the Tom> +first erase we issue will erase the partition table.
Really? I thought eMMC behaved just like SD cards?
Tom> +# Ensure are able to talk with this mmc device, erase most previous contents
Ensure we are

On Wed, Jul 03, 2013 at 11:28:36PM +0200, Peter Korsgaard wrote:
"Tom" == Tom Rini trini@ti.com writes:
Tom> - Update Falcon Mode support so that the offsets used in eMMC (or a raw Tom> SD card) would allow for enough room for a device tree to be used Tom> rather than an ATAGS blob as well as environment to be saved in eMMC. Tom> - Add board/ti/am335x/README which covers a few basic items, and Tom> provides an example of Falcon Mode for eMMC, FAT SD card and NAND. Tom> - Round up the size of u-boot.img.raw to match these use-cases, and add Tom> the entries for Falcon Mode to DFU for eMMC, FAT SD cards and NAND Tom> - Correct CONFIG_CMD_SPL_WRITE_SIZE size (eraseblocks are 128KiB)
It looks to me like this should be 4 (or 3) seperate commits then?
I suppose we can go that way, I'll split things up Monday.
Tom> Signed-off-by: Tom Rini trini@ti.com Tom> --- Tom> board/ti/am335x/README | 123 ++++++++++++++++++++++++++++++++++++++++++ Tom> include/configs/am335x_evm.h | 19 ++++--- Tom> 2 files changed, 135 insertions(+), 7 deletions(-) Tom> create mode 100644 board/ti/am335x/README
Tom> diff --git a/board/ti/am335x/README b/board/ti/am335x/README Tom> new file mode 100644 Tom> index 0000000..565f18c Tom> --- /dev/null Tom> +++ b/board/ti/am335x/README Tom> @@ -0,0 +1,123 @@ Tom> +Summary Tom> +======= Tom> + Tom> +This document covers various features of the 'am335x_evm' build, and some of Tom> +the related build targets (am335x_evm_uartN, etc). Tom> + Tom> +Hardware Tom> +======== Tom> + Tom> +The binary produced by this board supports, based on parsing of the EEPROM Tom> +doumentd in TI's reference designs:
documented
Tom> +Note that when we run 'spl export' it will prepare to boot the kernel. Tom> +This includes relocation of the uImage from where we loaded it to the entry Tom> +point defined in the head. As these locations overlap by default, it would
header
Whoops.
Tom> +A further word of warning about using eMMC and partition tables. When Tom> +working with SD cards we can get away with erasing small areas at a time, Tom> +however on eMMC we must keep erases aligned to eraseblocks and thus the Tom> +first erase we issue will erase the partition table.
Really? I thought eMMC behaved just like SD cards?
Yes, really. We know what the erase block size is, and round our commands, probably because we really have to. SD cards take care of things for us, for better or worse.
Tom> +# Ensure are able to talk with this mmc device, erase most previous contents
Ensure we are
Also fixed.

Tom> +A further word of warning about using eMMC and partition tables. When Tom> +working with SD cards we can get away with erasing small areas at a time, Tom> +however on eMMC we must keep erases aligned to eraseblocks and thus the Tom> +first erase we issue will erase the partition table.
Peter> Really? I thought eMMC behaved just like SD cards?
Tom> Yes, really. We know what the erase block size is, and round our Tom> commands, probably because we really have to. SD cards take care of Tom> things for us, for better or worse.
But why do we bother with erasing the eMMC in the first place? The erase commands are wholly optional, and only make sense as a TRIM mechanism, which is not our case as we will fill the memory as soon as it has been erased.
There is no problem in writing directly in the memory, even if it has not been erased previously. Or is it a measure to detect interrupted writes ?
Best regards,

On Thu, Jul 04, 2013 at 07:39:48AM +0000, Romain Izard wrote:
Tom> +A further word of warning about using eMMC and partition tables. When Tom> +working with SD cards we can get away with erasing small areas at a time, Tom> +however on eMMC we must keep erases aligned to eraseblocks and thus the Tom> +first erase we issue will erase the partition table.
Peter> Really? I thought eMMC behaved just like SD cards?
Tom> Yes, really. We know what the erase block size is, and round our Tom> commands, probably because we really have to. SD cards take care of Tom> things for us, for better or worse.
But why do we bother with erasing the eMMC in the first place? The erase commands are wholly optional, and only make sense as a TRIM mechanism, which is not our case as we will fill the memory as soon as it has been erased.
There is no problem in writing directly in the memory, even if it has not been erased previously. Or is it a measure to detect interrupted writes ?
I hadn't thought of it like that, I had been thinking of it like NAND for some reason. I'll update the instructions (and write a bunch of garbage first) and re-confirm things. Thanks!
participants (3)
-
Peter Korsgaard
-
Romain Izard
-
Tom Rini