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

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 return 0; }

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

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

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

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

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.
We cannot use generic cfi flash routines, because flash_init() is not run yet.
Signed-off-by: Thomas Chou thomas@wytron.com.tw --- v2 use weak func to reset flash, as Wolfgang suggested. reset the chip where env is located.
board/altera/nios2-generic/nios2-generic.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/board/altera/nios2-generic/nios2-generic.c b/board/altera/nios2-generic/nios2-generic.c index 89848cf..220a4c4 100644 --- a/board/altera/nios2-generic/nios2-generic.c +++ b/board/altera/nios2-generic/nios2-generic.c @@ -24,12 +24,28 @@
#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 */
+#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_ENV_ADDR) +static void __early_flash_cmd_reset(void) +{ + /* reset flash before we read env */ + writeb(AMD_CMD_RESET, CONFIG_ENV_ADDR); + writeb(FLASH_CMD_RESET, CONFIG_ENV_ADDR); +} +void early_flash_cmd_reset(void) + __attribute__((weak,alias("__early_flash_cmd_reset"))); +#endif + int board_early_init_f(void) { text_base_hook(); +#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_ENV_ADDR) + early_flash_cmd_reset(); +#endif return 0; }

Applied to:
git://git.denx.de/u-boot-nios next
Thanks, --Scott
Thomas Chou 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.
We cannot use generic cfi flash routines, because flash_init() is not run yet.
Signed-off-by: Thomas Chou thomas@wytron.com.tw
v2 use weak func to reset flash, as Wolfgang suggested. reset the chip where env is located.
board/altera/nios2-generic/nios2-generic.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/board/altera/nios2-generic/nios2-generic.c b/board/altera/nios2-generic/nios2-generic.c index 89848cf..220a4c4 100644 --- a/board/altera/nios2-generic/nios2-generic.c +++ b/board/altera/nios2-generic/nios2-generic.c @@ -24,12 +24,28 @@
#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 */
+#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_ENV_ADDR) +static void __early_flash_cmd_reset(void) +{
- /* reset flash before we read env */
- writeb(AMD_CMD_RESET, CONFIG_ENV_ADDR);
- writeb(FLASH_CMD_RESET, CONFIG_ENV_ADDR);
+} +void early_flash_cmd_reset(void)
- __attribute__((weak,alias("__early_flash_cmd_reset")));
+#endif
int board_early_init_f(void) { text_base_hook(); +#if defined(CONFIG_ENV_IS_IN_FLASH) && defined(CONFIG_ENV_ADDR)
- early_flash_cmd_reset();
+#endif return 0; }
participants (3)
-
Scott McNutt
-
Thomas Chou
-
Wolfgang Denk