[U-Boot] [PATCH 2/2] NAND or OneNAND flash autodection changes for OMAP3 specific files
Manikandan Pillai
mani.pillai at ti.com
Mon Mar 23 12:14:20 CET 2009
Signed-off-by: Manikandan Pillai <mani.pillai at ti.com>
---
cpu/arm_cortexa8/omap3/board.c | 13 ++++
cpu/arm_cortexa8/omap3/mem.c | 139 +++++++++++++++++++++++++++++++++++-
cpu/arm_cortexa8/omap3/sys_info.c | 27 +++++++-
include/configs/omap3_evm.h | 3 +-
4 files changed, 174 insertions(+), 8 deletions(-)
diff --git a/cpu/arm_cortexa8/omap3/board.c b/cpu/arm_cortexa8/omap3/board.c
index 7bb3e28..ba0eec6 100644
--- a/cpu/arm_cortexa8/omap3/board.c
+++ b/cpu/arm_cortexa8/omap3/board.c
@@ -313,6 +313,19 @@ void abort(void)
{
}
+/******************************************************************************
+ * Routine: print_board_info
+ * Description: Displays cpu and memory information for the board
+ *****************************************************************************/
+void print_board_info(void)
+{
+ u32 btype;
+
+ btype = get_board_type();
+
+ display_board_info(btype);
+}
+
#ifdef CONFIG_NAND_OMAP_GPMC
/******************************************************************************
* OMAP3 specific command to switch between NAND HW and SW ecc
diff --git a/cpu/arm_cortexa8/omap3/mem.c b/cpu/arm_cortexa8/omap3/mem.c
index 3cc22c4..6808eea 100644
--- a/cpu/arm_cortexa8/omap3/mem.c
+++ b/cpu/arm_cortexa8/omap3/mem.c
@@ -26,10 +26,12 @@
*/
#include <common.h>
+#include <environment.h>
#include <asm/io.h>
#include <asm/arch/mem.h>
#include <asm/arch/sys_proto.h>
#include <command.h>
+#include <nand.h>
/*
* Only One NAND allowed on board at a time.
@@ -41,7 +43,21 @@ unsigned int boot_flash_sec;
unsigned int boot_flash_type;
volatile unsigned int boot_flash_env_addr;
+#if defined(CONFIG_ENV_IS_RUNTIME_SEL)
+extern env_t *env_ptr;
+extern char *nand_env_name_spec;
+extern char *onenand_env_name_spec;
+extern env_t *nand_env_ptr;
+extern env_t *onenand_env_ptr;
+
+extern void onenand_init(void);
+extern int nand_scan_ident(struct mtd_info *mtd, int maxchips);
+#endif
+
#if defined(CONFIG_CMD_NAND)
+u32 is_nand;
+extern nand_info_t nand_info[2];
+
static u32 gpmc_m_nand[GPMC_MAX_REG] = {
M_NAND_GPMC_CONFIG1,
M_NAND_GPMC_CONFIG2,
@@ -63,6 +79,8 @@ gpmc_t *gpmc_cfg_base;
#endif
#if defined(CONFIG_CMD_ONENAND)
+u32 is_onenand;
+extern struct mtd_info onenand_mtd;
static u32 gpmc_onenand[GPMC_MAX_REG] = {
ONENAND_GPMC_CONFIG1,
ONENAND_GPMC_CONFIG2,
@@ -84,6 +102,24 @@ gpmc_csx_t *onenand_cs_base;
static sdrc_t *sdrc_base = (sdrc_t *)OMAP34XX_SDRC_BASE;
+#if defined(CONFIG_ENV_IS_RUNTIME_SEL)
+char *env_name_spec;
+env_get_char_spec_p env_get_char_spec;
+env_init_p env_init;
+saveenv_p saveenv;
+env_relocate_spec_p env_relocate_spec;
+
+extern uchar nand_env_get_char_spec(int index);
+extern int nand_env_init(void);
+extern int nand_saveenv(void);
+extern void nand_env_relocate_spec(void);
+
+extern uchar onenand_env_get_char_spec(int index);
+extern int onenand_env_init(void);
+extern int onenand_saveenv(void);
+extern void onenand_env_relocate_spec(void);
+#endif /* CONFIG_ENV_IS_RUNTIME_SEL */
+
/**************************************************************************
* make_cs1_contiguous() - for es2 and above remap cs1 behind cs0 to allow
* command line mem=xyz use all memory with out discontinuous support
@@ -245,15 +281,15 @@ void gpmc_init(void)
writel(0, &gpmc_cs_base->config7);
sdelay(1000);
-#if defined(CONFIG_CMD_NAND) /* CS 0 */
+#if defined(CONFIG_CMD_NAND) && !defined(CONFIG_ENV_IS_RUNTIME_SEL)
gpmc_config = gpmc_m_nand;
gpmc_cfg_base = gpmc_base;
nand_cs_base = (gpmc_csx_t *)(GPMC_CONFIG_CS0_BASE +
(GPMC_CS * GPMC_CONFIG_WIDTH));
base = PISMO1_NAND_BASE;
size = PISMO1_NAND_SIZE;
- enable_gpmc_config(gpmc_config, nand_cs_base, base, size);
#if defined(CONFIG_ENV_IS_IN_NAND)
+ enable_gpmc_config(gpmc_config, nand_cs_base, base, size);
f_off = SMNAND_ENV_OFFSET;
f_sec = SZ_128K;
/* env setup */
@@ -264,14 +300,14 @@ void gpmc_init(void)
#endif
#endif
-#if defined(CONFIG_CMD_ONENAND)
+#if defined(CONFIG_CMD_ONENAND) && !defined(CONFIG_ENV_IS_RUNTIME_SEL)
gpmc_config = gpmc_onenand;
onenand_cs_base = (gpmc_csx_t *)(GPMC_CONFIG_CS0_BASE +
(GPMC_CS * GPMC_CONFIG_WIDTH));
base = PISMO1_ONEN_BASE;
size = PISMO1_ONEN_SIZE;
- enable_gpmc_config(gpmc_config, onenand_cs_base, base, size);
#if defined(CONFIG_ENV_IS_IN_ONENAND)
+ enable_gpmc_config(gpmc_config, onenand_cs_base, base, size);
f_off = ONENAND_ENV_OFFSET;
f_sec = SZ_128K;
/* env setup */
@@ -281,4 +317,99 @@ void gpmc_init(void)
boot_flash_env_addr = f_off;
#endif
#endif
+
}
+
+/*****************************************************
+ * gpmc_init_late(): init gpmc bus late during initilize
+ * Init GPMC for x16, MuxMode (SDRAM in x32).
+ * This code can only be executed from SRAM or SDRAM.
+ *****************************************************/
+void gpmc_init_late(void)
+{
+ /* putting a blanket check on GPMC based on ZeBu for now */
+ u32 *gpmc_config = NULL;
+ gpmc_t *gpmc_base = (gpmc_t *)GPMC_BASE;
+ gpmc_csx_t *gpmc_cs_base = (gpmc_csx_t *)GPMC_CONFIG_CS0_BASE;
+ u32 base = 0;
+ u32 size = 0;
+ u32 f_off = CONFIG_SYS_MONITOR_LEN;
+ u32 f_sec = 0;
+ u32 config = 0;
+ u32 gpmc_index = 0;
+
+ /* global settings */
+ writel(0, &gpmc_base->irqenable); /* isr's sources masked */
+ writel(0, &gpmc_base->timeout_control);/* timeout disable */
+
+ config = readl(&gpmc_base->config);
+ config &= (~0xf00);
+ writel(config, &gpmc_base->config);
+
+ /*
+ * Disable the GPMC0 config set by ROM code
+ * It conflicts with our MPDB (both at 0x08000000)
+ */
+ writel(0, &gpmc_cs_base->config7);
+ sdelay(1000);
+
+#if defined(CONFIG_CMD_NAND) && defined(CONFIG_ENV_IS_RUNTIME_SEL)
+ gpmc_config = gpmc_m_nand;
+ nand_cs_base = (gpmc_csx_t *)(GPMC_CONFIG_CS0_BASE +
+ (gpmc_index * GPMC_CONFIG_WIDTH));
+ base = PISMO1_NAND_BASE;
+ size = PISMO1_NAND_SIZE;
+ enable_gpmc_config(gpmc_config, nand_cs_base, base, size);
+ /* NAND and/or ONENAND is to be scanned */
+ is_nand = 0;
+ nand_init();
+ if (nand_info[0].size) {
+ is_nand = 1;
+ f_off = SMNAND_ENV_OFFSET;
+ f_sec = SZ_128K;
+ /* env setup */
+ boot_flash_base = base;
+ boot_flash_off = f_off;
+ boot_flash_sec = f_sec;
+ boot_flash_env_addr = f_off;
+
+ env_name_spec = nand_env_name_spec;
+ env_ptr = nand_env_ptr;
+ env_get_char_spec = nand_env_get_char_spec;
+ env_init = nand_env_init;
+ saveenv = nand_saveenv;
+ env_relocate_spec = nand_env_relocate_spec;
+ gpmc_index++;
+ }
+#endif
+
+#if defined(CONFIG_CMD_ONENAND) && defined(CONFIG_ENV_IS_RUNTIME_SEL)
+ gpmc_config = gpmc_onenand;
+ onenand_cs_base = (gpmc_csx_t *)(GPMC_CONFIG_CS0_BASE +
+ (gpmc_index * GPMC_CONFIG_WIDTH));
+ base = PISMO1_ONEN_BASE;
+ size = PISMO1_ONEN_SIZE;
+ enable_gpmc_config(gpmc_config, onenand_cs_base, base, size);
+ /* NAND and/or ONENAND is to be scanned */
+ is_onenand = 0;
+ onenand_init();
+ if (onenand_mtd.size) {
+ is_onenand = 1;
+ f_off = ONENAND_ENV_OFFSET;
+ f_sec = SZ_128K;
+ /* env setup */
+ boot_flash_base = base;
+ boot_flash_off = f_off;
+ boot_flash_sec = f_sec;
+ boot_flash_env_addr = f_off;
+ env_name_spec = onenand_env_name_spec;
+ env_ptr = onenand_env_ptr;
+ env_get_char_spec = onenand_env_get_char_spec;
+ env_init = onenand_env_init;
+ saveenv = onenand_saveenv;
+ env_relocate_spec = onenand_env_relocate_spec;
+ gpmc_index++;
+ }
+#endif
+}
+
diff --git a/cpu/arm_cortexa8/omap3/sys_info.c b/cpu/arm_cortexa8/omap3/sys_info.c
index 28a1020..86cc95f 100644
--- a/cpu/arm_cortexa8/omap3/sys_info.c
+++ b/cpu/arm_cortexa8/omap3/sys_info.c
@@ -36,6 +36,14 @@ static gpmc_csx_t *gpmc_cs_base = (gpmc_csx_t *)GPMC_CONFIG_CS0_BASE;
static sdrc_t *sdrc_base = (sdrc_t *)OMAP34XX_SDRC_BASE;
static ctrl_t *ctrl_base = (ctrl_t *)OMAP34XX_CTRL_BASE;
+#if defined(CONFIG_CMD_NAND)
+extern u8 is_nand;
+#endif
+
+#if defined(CONFIG_CMD_ONENAND)
+extern u8 is_onenand;
+#endif
+
/******************************************
* get_cpu_type(void) - extract cpu info
******************************************/
@@ -208,9 +216,22 @@ void display_board_info(u32 btype)
printf("OMAP%s-%s rev %d, CPU-OPP2 L3-165MHz\n", cpu_s,
- sec_s, get_cpu_rev());
- printf("%s + %s/%s\n", sysinfo.board_string,
- mem_s, sysinfo.nand_string);
+ sec_s, get_cpu_rev());
+#if defined(CONFIG_ENV_IS_RUNTIME_SEL)
+ printf("%s + %s/", sysinfo.board_string,
+ mem_s);
+#if defined(CONFIG_CMD_NAND)
+ if (is_nand)
+ printf("%s\n", "NAND");
+#endif
+#if defined(CONFIG_CMD_ONENAND)
+ if (is_onenand)
+ printf("%s\n", "ONENAND");
+#endif
+#else
+ printf("%s + %s/%s\n", sysinfo.board_string,
+ mem_s, sysinfo.nand_string);
+#endif
}
diff --git a/include/configs/omap3_evm.h b/include/configs/omap3_evm.h
index f484f14..37e7ad3 100644
--- a/include/configs/omap3_evm.h
+++ b/include/configs/omap3_evm.h
@@ -106,6 +106,7 @@
#define CONFIG_CMD_I2C /* I2C serial bus support */
#define CONFIG_CMD_MMC /* MMC support */
+#define CONFIG_CMD_ONENAND /* ONENAND support */
#define CONFIG_CMD_NAND /* NAND support */
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_PING
@@ -271,7 +272,7 @@
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
#define CONFIG_SYS_ONENAND_BASE ONENAND_MAP
-#define CONFIG_ENV_IS_IN_NAND 1
+#define CONFIG_ENV_IS_RUNTIME_SEL 1
#define ONENAND_ENV_OFFSET 0x260000 /* environment starts here */
#define SMNAND_ENV_OFFSET 0x260000 /* environment starts here */
--
1.5.6
More information about the U-Boot
mailing list