On Tue, 22 Nov 2016 13:38:42 +0100 Maxime Ripard <maxime.rip...@free-electrons.com> wrote:
> Introduce a new sunxi-spl-with-ecc.bin image with already the right header, > ECC, randomizer and padding for the BROM to be able to read it. > > It needs to be flashed using a raw access to the NAND so that the > controller doesn't change a thing to it, since we already have all the > right parameters. > > Signed-off-by: Maxime Ripard <maxime.rip...@free-electrons.com> > Acked-by: Boris Brezillon <boris.brezil...@free-electrons.com> > --- > Makefile | 3 ++- > board/sunxi/README.nand | 54 ++++++++++++++++++++++++++++++++++++++++++- > scripts/Makefile.spl | 15 ++++++++++++- > 3 files changed, 72 insertions(+), 0 deletions(-) > create mode 100644 board/sunxi/README.nand > > diff --git a/Makefile b/Makefile > index 37cbcb28f75e..12a248e297b5 100644 > --- a/Makefile > +++ b/Makefile > @@ -1345,6 +1345,9 @@ spl/u-boot-spl: tools prepare \ > spl/sunxi-spl.bin: spl/u-boot-spl > @: > > +spl/sunxi-spl-with-ecc.bin: spl/sunxi-spl.bin > + @: > + > spl/u-boot-spl.sfp: spl/u-boot-spl > @: > > diff --git a/board/sunxi/README.nand b/board/sunxi/README.nand > new file mode 100644 > index 000000000000..a5d4ff0e90a3 > --- /dev/null > +++ b/board/sunxi/README.nand > @@ -0,0 +1,54 @@ > +Allwinner NAND flashing > +======================= > + > +A lot of Allwinner devices, especially the older ones (pre-H3 era), > +comes with a NAND. NANDs storages are a pretty weak choice when it > +comes to the reliability, and it comes with a number of flaws like > +read and write disturbs, data retention issues, bloks becoming > +unusable, etc. > + > +In order to mitigate that, various strategies have been found to be > +able to recover from those issues like ECC, hardware randomization, > +and of course, redundancy for the critical parts. > + > +This is obviously something that we will take into account when > +creating our images. However, the BROM will use a quite weird pattern > +when accessing the NAND, and will access only at most 4kB per page, > +which means that we also have to split that binary accross several > +pages. > + > +In order to accomodate that, we create a tool that will generate an > +SPL image that is ready to be programmed directly embedding the ECCs, > +randomized, and with the necessary bits needed to reduce the number of > +bitflips. The U-Boot build system, when configured for the NAND will > +also generate the image sunxi-spl-with-ecc.bin that will have been > +generated by that tool. > + > +In order to flash your U-Boot image onto a board, assuming that the > +board is in FEL mode, you'll need the sunxi-tools that you can find at > +this repository: https://github.com/linux-sunxi/sunxi-tools > + > +Then, you'll need to first load an SPL to initialise the RAM: > +sunxi-fel spl spl/sunxi-spl.bin > + > +Load the binaries we'll flash into RAM: > +sunxi-fel write 0x4a000000 u-boot-dtb.bin > +sunxi-fel write 0x43000000 spl/sunxi-spl-with-ecc.bin > + > +And execute U-Boot > +sunxi-fel exe 0x4a000000 > + > +On your board, you'll now have all the needed binaries into RAM, so > +you only need to erase the NAND... > + > +nand erase.chip > + > +Then write the SPL and its backup: > + > +nand write.raw.noverify 0x43000000 0 40 > +nand write.raw.noverify 0x43000000 0x400000 40 > + > +And finally write the U-Boot binary: > +nand write 0x4a000000 0x800000 0xc0000 > + > +You can now reboot and enjoy your NAND. > \ No newline at end of file > diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl > index e0b0117dc9b6..6a381f26d21a 100644 > --- a/scripts/Makefile.spl > +++ b/scripts/Makefile.spl > @@ -168,6 +168,10 @@ endif > > ifdef CONFIG_ARCH_SUNXI > ALL-y += $(obj)/sunxi-spl.bin > + > +ifdef CONFIG_NAND_SUNXI > +ALL-y += $(obj)/sunxi-spl-with-ecc.bin > +endif > endif > > ifeq ($(CONFIG_SYS_SOC),"at91") > @@ -276,6 +280,17 @@ cmd_mksunxiboot = $(objtree)/tools/mksunxiboot $< $@ > $(obj)/sunxi-spl.bin: $(obj)/$(SPL_BIN).bin FORCE > $(call if_changed,mksunxiboot) > > +quiet_cmd_sunxi_spl_image_builder = SUNXI_SPL_IMAGE_BUILDER $@ > +cmd_sunxi_spl_image_builder = $(objtree)/tools/sunxi-spl-image-builder \ > + -c > $(CONFIG_NAND_SUNXI_SPL_ECC_STRENGTH)/$(CONFIG_NAND_SUNXI_SPL_ECC_SIZE) \ > + -p $(CONFIG_SYS_NAND_PAGE_SIZE) \ > + -o $(CONFIG_SYS_NAND_OOBSIZE) \ > + -u $(CONFIG_NAND_SUNXI_SPL_USABLE_PAGE_SIZE) \ > + -e $(CONFIG_SYS_NAND_BLOCK_SIZE) \ > + -s -b $< $@ Maybe you should define default values for SYS_NAND_PAGE_SIZE, SYS_NAND_OOBSIZE and SYS_NAND_BLOCK_SIZE in case the SYS_EXTRA_OPTIONS option does not contain these definitions in order to avoid build failures. > +$(obj)/sunxi-spl-with-ecc.bin: $(obj)/sunxi-spl.bin > + $(call if_changed,sunxi_spl_image_builder) > + > # Rule to link u-boot-spl > # May be overridden by arch/$(ARCH)/config.mk > quiet_cmd_u-boot-spl ?= LD $@ _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot