diff mbox

[U-Boot] nios2: reset cfi flash before reading env

Message ID 1294211855-18584-1-git-send-email-thomas@wytron.com.tw
State Superseded
Headers show

Commit Message

Thomas Chou Jan. 5, 2011, 7:17 a.m. UTC
Flash might be in unknown state when u-boot is started with jtag.
And got wrong env data. So reset it in board early init.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
---
 board/altera/nios2-generic/nios2-generic.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

Comments

Wolfgang Denk Jan. 5, 2011, 8:15 a.m. UTC | #1
Dear Thomas Chou,

In message <1294211855-18584-1-git-send-email-thomas@wytron.com.tw> you wrote:
> Flash might be in unknown state when u-boot is started with jtag.
> And got wrong env data. So reset it in board early init.
> 
> Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
> ---
>  board/altera/nios2-generic/nios2-generic.c |    6 ++++++
>  1 files changed, 6 insertions(+), 0 deletions(-)
> 
> diff --git a/board/altera/nios2-generic/nios2-generic.c b/board/altera/nios2-generic/nios2-generic.c
> index 89848cf..b76e479 100644
> --- a/board/altera/nios2-generic/nios2-generic.c
> +++ b/board/altera/nios2-generic/nios2-generic.c
> @@ -24,12 +24,18 @@
>  
>  #include <common.h>
>  #include <netdev.h>
> +#include <mtd/cfi_flash.h>
> +#include <asm/io.h>
>  
>  void text_base_hook(void); /* nop hook for text_base.S */
>  
>  int board_early_init_f(void)
>  {
>  	text_base_hook();
> +#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_SYS_FLASH_BASE)
> +	writeb(AMD_CMD_RESET, CONFIG_SYS_FLASH_BASE);
> +	writeb(FLASH_CMD_RESET, CONFIG_SYS_FLASH_BASE);
> +#endif

Instead of making fixed assumptions about flash type and it's
properties here you should use generic routines from the CFI driver to
do the reset.

Best regards,

Wolfgang Denk
Thomas Chou Jan. 6, 2011, 2:36 a.m. UTC | #2
On 01/05/2011 04:15 PM, Wolfgang Denk wrote:
> Instead of making fixed assumptions about flash type and it's
> properties here you should use generic routines from the CFI driver to
> do the reset.
>

Dear Wolfgang,

env_init() goes before flash_init() in board.c. So we don't know the 
flash type and cannot use those generic cfi routines based on flash_info.

I followed this in cfi_flash.c

void __flash_cmd_reset(flash_info_t *info)
{
	/*
	 * We do not yet know what kind of commandset to use, so we issue
	 * the reset command in both Intel and AMD variants, in the hope
	 * that AMD flash roms ignore the Intel command.
	 */
	flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
	flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
}

I am not sure if this thing should be added to generic code, because I 
found powerpc skiped flash_init when board_flash_wp_on in board.c.

Best regards,
Thomas
Wolfgang Denk Jan. 17, 2011, 9:02 p.m. UTC | #3
Dear Thomas Chou,

In message <4D252AAB.6040308@wytron.com.tw> you wrote:
>
> > Instead of making fixed assumptions about flash type and it's
> > properties here you should use generic routines from the CFI driver to
> > do the reset.
...
> env_init() goes before flash_init() in board.c. So we don't know the 
> flash type and cannot use those generic cfi routines based on flash_info.
> 
> I followed this in cfi_flash.c
> 
> void __flash_cmd_reset(flash_info_t *info)

I recommend you have a second, closer look. Notice that
flash_cmd_reset() comes with __attribute__ weak, because it does not
work as a general solution - it may work here, but other code may be
needed on other flash chips.

Your code does not provide such an option.

Best regards,

Wolfgang Denk
Thomas Chou Jan. 18, 2011, 2:05 a.m. UTC | #4
Dear Wolfgang,

On 01/18/2011 05:02 AM, Wolfgang Denk wrote:
>> void __flash_cmd_reset(flash_info_t *info)
>
> I recommend you have a second, closer look. Notice that
> flash_cmd_reset() comes with __attribute__ weak, because it does not
> work as a general solution - it may work here, but other code may be
> needed on other flash chips.
>
> Your code does not provide such an option.

Thanks a lot. I will add a weak attribute.

Best regards,
Thomas
diff mbox

Patch

diff --git a/board/altera/nios2-generic/nios2-generic.c b/board/altera/nios2-generic/nios2-generic.c
index 89848cf..b76e479 100644
--- a/board/altera/nios2-generic/nios2-generic.c
+++ b/board/altera/nios2-generic/nios2-generic.c
@@ -24,12 +24,18 @@ 
 
 #include <common.h>
 #include <netdev.h>
+#include <mtd/cfi_flash.h>
+#include <asm/io.h>
 
 void text_base_hook(void); /* nop hook for text_base.S */
 
 int board_early_init_f(void)
 {
 	text_base_hook();
+#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_SYS_FLASH_BASE)
+	writeb(AMD_CMD_RESET, CONFIG_SYS_FLASH_BASE);
+	writeb(FLASH_CMD_RESET, CONFIG_SYS_FLASH_BASE);
+#endif
 	return 0;
 }