diff mbox

[U-Boot,3/3,V2] ARM: mxs: Fix NAND FCB flashing

Message ID 1377640181-5459-1-git-send-email-marex@denx.de
State Changes Requested
Delegated to: Stefano Babic
Headers show

Commit Message

Marek Vasut Aug. 27, 2013, 9:49 p.m. UTC
Fix the method of flashing FCB blocks into NAND. The new env
writes all four FCB blocks and also does not scrub such a big
part of the NAND. This fixed complains about busted NAND blocks
in Linux.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Stefano Babic <sbabic@denx.de>
---
 include/configs/m28evk.h  |   23 +++++++++++++++++++++--
 include/configs/mx28evk.h |   23 +++++++++++++++++++++--
 2 files changed, 42 insertions(+), 4 deletions(-)

V2: Write the whole stride (64 pages) in the FCB case, not only one page.

Comments

Marek Vasut Aug. 28, 2013, 8:40 a.m. UTC | #1
Dear Marek Vasut,

> Fix the method of flashing FCB blocks into NAND. The new env
> writes all four FCB blocks and also does not scrub such a big
> part of the NAND. This fixed complains about busted NAND blocks
> in Linux.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Fabio Estevam <fabio.estevam@freescale.com>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
>  include/configs/m28evk.h  |   23 +++++++++++++++++++++--
>  include/configs/mx28evk.h |   23 +++++++++++++++++++++--
>  2 files changed, 42 insertions(+), 4 deletions(-)
> 
> V2: Write the whole stride (64 pages) in the FCB case, not only one page.
> 
> diff --git a/include/configs/m28evk.h b/include/configs/m28evk.h
> index eba8759..6e1ecbe 100644
> --- a/include/configs/m28evk.h
> +++ b/include/configs/m28evk.h
> @@ -170,11 +170,30 @@
>  		"nand info ; "						\
>  		"setexpr fcb_sz ${update_nand_stride} * ${update_nand_count};" \
>  		"setexpr update_nand_fcb ${fcb_sz} * ${nand_writesize}\0" \
> +	"update_nand_write_fcb="					\
> +		"setenv i ${update_nand_count} ; "			\
> +		"setenv update_nand_offset 0x0 ; "			\
> +		"setexpr update_nand_step "				\
> +			"${update_nand_stride} * ${nand_writesize} ; "	\
> +		"while test ${i} -gt 0 ; do "				\
> +			"echo ${update_nand_offset} ; "			\
> +			"nand scrub -y ${update_nand_offset} "		\
> +				"${nand_erasesize} ; "			\
> +			"nand write.raw ${loadaddr} "			\
> +				"${update_nand_offset} "		\
> +				"${update_nand_stride} ; "		\


Uh, I think this might need to be update_nand_step instead of update_nand_stride 
here.


[...]

Best regards,
Marek Vasut
Jörg Krause May 21, 2014, 2:08 p.m. UTC | #2
I was wondering about the following warnings while bootings linux 3.15.0-rc5:

[    0.998885] nand: device found, Manufacturer ID: 0x98, Chip ID: 0xd1
[    1.005485] nand: Toshiba NAND 128MiB 3,3V 8-bit
[    1.010165] nand: 128MiB, SLC, page size: 2048, OOB size: 64
[    1.016176] Scanning device for bad blocks
[    1.022444] Bad eraseblock 1 at 0x000000020000
[    1.027444] Bad eraseblock 2 at 0x000000040000
[    1.032612] Bad eraseblock 3 at 0x000000060000

I noticed that these are the FCB pages for the NAND boot. Google found me
this old thread. Nevertheless, I applied the patch on our custom i.MX28
board and the warnings disappeared.

But I still have some questions and remarks:


Marek Vasut-3 wrote
> Fix the method of flashing FCB blocks into NAND. The new env
> writes all four FCB blocks and also does not scrub such a big
> part of the NAND. This fixed complains about busted NAND blocks
> in Linux.
> 
> +	"update_nand_write_fcb="					\
> +		"setenv i ${update_nand_count} ; "			\
> +		"setenv update_nand_offset 0x0 ; "			\
> +		"setexpr update_nand_step "				\
> +			"${update_nand_stride} * ${nand_writesize} ; "	\
> +		"while test ${i} -gt 0 ; do "				\
> +			"echo ${update_nand_offset} ; "			\
> +			"nand scrub -y ${update_nand_offset} "		\
> +				"${nand_erasesize} ; "			\
> +			"nand write.raw ${loadaddr} "			\
> +				"${update_nand_offset} "		\
> +				"${update_nand_stride} ; "		\

Why not just write a page (which contains the FCB) instead of the whole
stride?

There is also a problem about scrubbing of size 128K (which is the erase
size) and writing 128K (which is the size of a search area with 64 pages).
This works for the default settings (fuses not blown) of search stride =
1*64 and search count = 4. But if the fuses is blown and stride = 2*64 and
count = 2 it will scrub 128K and write 256K (size of 128 pages). So the
second half of the search area is not erased before writing.


Marek Vasut-3 wrote
>  	"update_nand_full="		/* Update FCB, DBBT and FW */	\
>  		"if tftp ${update_nand_full_filename} ; then "		\
>  		"run update_nand_get_fcb_size ; "			\
> -		"nand scrub -y 0x0 ${filesize} ; "			\
> -		"nand write.raw ${loadaddr} 0x0 ${fcb_sz} ; "	\
> +		"run update_nand_write_fcb ; "				\
>  		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
>  		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
>  		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \

Running update_nand_write_fcb erases and writes the FCB search area. The
remaining bytes of the u-boot.nand file are writting before erasing the
corresponding NAND flash bytes. I added something like this before:

 		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
 		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
 +		"nand erase ${update_nand_fcb} ${update_sz}; " \
 		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \

Is there any reason why this patch is not applied to the u-boot-imx repo?



--
View this message in context: http://u-boot.10912.n7.nabble.com/PATCH-1-3-tools-mxsboot-Staticize-functions-tp162080p180393.html
Sent from the U-Boot mailing list archive at Nabble.com.
Marek Vasut May 24, 2014, 10:57 a.m. UTC | #3
On Wednesday, May 21, 2014 at 04:08:09 PM, jkrause wrote:
> I was wondering about the following warnings while bootings linux
> 3.15.0-rc5:
> 
> [    0.998885] nand: device found, Manufacturer ID: 0x98, Chip ID: 0xd1
> [    1.005485] nand: Toshiba NAND 128MiB 3,3V 8-bit
> [    1.010165] nand: 128MiB, SLC, page size: 2048, OOB size: 64
> [    1.016176] Scanning device for bad blocks
> [    1.022444] Bad eraseblock 1 at 0x000000020000
> [    1.027444] Bad eraseblock 2 at 0x000000040000
> [    1.032612] Bad eraseblock 3 at 0x000000060000
> 
> I noticed that these are the FCB pages for the NAND boot. Google found me
> this old thread. Nevertheless, I applied the patch on our custom i.MX28
> board and the warnings disappeared.

Yeah, but sometimes this patch made my board unbootable and I didn't have time 
to investigate further. That is why it was never applied, to prevent that.

> But I still have some questions and remarks:
> 
> 
> Marek Vasut-3 wrote
> 
> > Fix the method of flashing FCB blocks into NAND. The new env
> > writes all four FCB blocks and also does not scrub such a big
> > part of the NAND. This fixed complains about busted NAND blocks
> > in Linux.
> > 
> > +	"update_nand_write_fcb="					\
> > +		"setenv i ${update_nand_count} ; "			\
> > +		"setenv update_nand_offset 0x0 ; "			\
> > +		"setexpr update_nand_step "				\
> > +			"${update_nand_stride} * ${nand_writesize} ; "	\
> > +		"while test ${i} -gt 0 ; do "				\
> > +			"echo ${update_nand_offset} ; "			\
> > +			"nand scrub -y ${update_nand_offset} "		\
> > +				"${nand_erasesize} ; "			\
> > +			"nand write.raw ${loadaddr} "			\
> > +				"${update_nand_offset} "		\
> > +				"${update_nand_stride} ; "		\
> 
> Why not just write a page (which contains the FCB) instead of the whole
> stride?

Feel free to roll V3 of the patch.

> There is also a problem about scrubbing of size 128K (which is the erase
> size) and writing 128K (which is the size of a search area with 64 pages).
> This works for the default settings (fuses not blown) of search stride =
> 1*64 and search count = 4. But if the fuses is blown and stride = 2*64 and
> count = 2 it will scrub 128K and write 256K (size of 128 pages). So the
> second half of the search area is not erased before writing.

Yes, we only support the default factory configuration. There are ways to tweak 
the code to use different geometries, but that was to my knowledge never even 
tested.

> Marek Vasut-3 wrote
> 
> >  	"update_nand_full="		/* Update FCB, DBBT and FW */	\
> >  	
> >  		"if tftp ${update_nand_full_filename} ; then "		\
> >  		"run update_nand_get_fcb_size ; "			\
> > 
> > -		"nand scrub -y 0x0 ${filesize} ; "			\
> > -		"nand write.raw ${loadaddr} 0x0 ${fcb_sz} ; "	\
> > +		"run update_nand_write_fcb ; "				\
> > 
> >  		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
> >  		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
> >  		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \
> 
> Running update_nand_write_fcb erases and writes the FCB search area. The
> remaining bytes of the u-boot.nand file are writting before erasing the
> corresponding NAND flash bytes. I added something like this before:
> 
>  		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
>  		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
>  +		"nand erase ${update_nand_fcb} ${update_sz}; " \
>  		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \
> 
> Is there any reason why this patch is not applied to the u-boot-imx repo?

Yes, see above. Feel free to submit V3 with detailed changelog and I can try if 
it still breaks my platforms.
diff mbox

Patch

diff --git a/include/configs/m28evk.h b/include/configs/m28evk.h
index eba8759..6e1ecbe 100644
--- a/include/configs/m28evk.h
+++ b/include/configs/m28evk.h
@@ -170,11 +170,30 @@ 
 		"nand info ; "						\
 		"setexpr fcb_sz ${update_nand_stride} * ${update_nand_count};" \
 		"setexpr update_nand_fcb ${fcb_sz} * ${nand_writesize}\0" \
+	"update_nand_write_fcb="					\
+		"setenv i ${update_nand_count} ; "			\
+		"setenv update_nand_offset 0x0 ; "			\
+		"setexpr update_nand_step "				\
+			"${update_nand_stride} * ${nand_writesize} ; "	\
+		"while test ${i} -gt 0 ; do "				\
+			"echo ${update_nand_offset} ; "			\
+			"nand scrub -y ${update_nand_offset} "		\
+				"${nand_erasesize} ; "			\
+			"nand write.raw ${loadaddr} "			\
+				"${update_nand_offset} "		\
+				"${update_nand_stride} ; "		\
+			"setexpr i ${i} - 1 ; "				\
+			"setexpr update_nand_offset "			\
+				"${update_nand_offset} + "		\
+				"${update_nand_step} ; "		\
+		"done ; "						\
+		"setenv i ; "						\
+		"setenv update_nand_offset ; "				\
+		"setenv update_nand_step\0"				\
 	"update_nand_full="		/* Update FCB, DBBT and FW */	\
 		"if tftp ${update_nand_full_filename} ; then "		\
 		"run update_nand_get_fcb_size ; "			\
-		"nand scrub -y 0x0 ${filesize} ; "			\
-		"nand write.raw ${loadaddr} 0x0 ${fcb_sz} ; "	\
+		"run update_nand_write_fcb ; "				\
 		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
 		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
 		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \
diff --git a/include/configs/mx28evk.h b/include/configs/mx28evk.h
index 07f88ca..e2324d6 100644
--- a/include/configs/mx28evk.h
+++ b/include/configs/mx28evk.h
@@ -172,11 +172,30 @@ 
 		"nand info ; " \
 		"setexpr fcb_sz ${update_nand_stride} * ${update_nand_count};" \
 		"setexpr update_nand_fcb ${fcb_sz} * ${nand_writesize}\0" \
+	"update_nand_write_fcb="					\
+		"setenv i ${update_nand_count} ; "			\
+		"setenv update_nand_offset 0x0 ; "			\
+		"setexpr update_nand_step "				\
+			"${update_nand_stride} * ${nand_writesize} ; "	\
+		"while test ${i} -gt 0 ; do "				\
+			"echo ${update_nand_offset} ; "			\
+			"nand scrub -y ${update_nand_offset} "		\
+				"${nand_erasesize} ; "			\
+			"nand write.raw ${loadaddr} "			\
+				"${update_nand_offset} "		\
+				"${update_nand_stride} ; "		\
+			"setexpr i ${i} - 1 ; "				\
+			"setexpr update_nand_offset "			\
+				"${update_nand_offset} + "		\
+				"${update_nand_step} ; "		\
+		"done ; "						\
+		"setenv i ; "						\
+		"setenv update_nand_offset ; "				\
+		"setenv update_nand_step\0"				\
 	"update_nand_full="		    /* Update FCB, DBBT and FW */ \
 		"if tftp ${update_nand_full_filename} ; then " \
 		"run update_nand_get_fcb_size ; " \
-		"nand scrub -y 0x0 ${filesize} ; " \
-		"nand write.raw ${loadaddr} 0x0 ${fcb_sz} ; " \
+		"run update_nand_write_fcb ; "				\
 		"setexpr update_off ${loadaddr} + ${update_nand_fcb} ; " \
 		"setexpr update_sz ${filesize} - ${update_nand_fcb} ; " \
 		"nand write ${update_off} ${update_nand_fcb} ${update_sz} ; " \