Patchwork [U-Boot,V2,2/5] omap-common: add nand spl support

login
register
mail settings
Submitter Simon Schwarz
Date July 25, 2011, 6:05 p.m.
Message ID <1311617138-17041-3-git-send-email-simonschwarzcor@gmail.com>
Download mbox | patch
Permalink /patch/106729/
State Superseded
Headers show

Comments

Simon Schwarz - July 25, 2011, 6:05 p.m.
Add NAND support for the new SPL structure.

---
This patch didn't exist before V2!

V2 changes:
ADD Some define-barriers for OMAP3 to only use NAND
ADD nand_load_image() - inits the OMAP gpmc, loads the images - parses the
	header
CHG cosmetic
ADD do_reset() implementation for omap-common spl
ADD nand_copy_image to nand.h
ADD CPP barriers for mmc and nand support. The parts depending on library
	support are only compiled if the respective library is included.

Transition from V1 to V2 also includes that this patch is now based on
	- the new SPL layout by Aneesh V and Daniel Schwierzeck
  	- the OMAP4 SPL patches by Aneesh V

Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com>
---
 arch/arm/cpu/armv7/omap-common/spl.c |   43 ++++++++++++++++++++++++++++++++++
 arch/arm/include/asm/omap_common.h   |    2 +
 include/nand.h                       |    3 ++
 3 files changed, 48 insertions(+), 0 deletions(-)
Andreas Bießmann - July 26, 2011, 6:07 a.m.
Dear Simon,

Am 25.07.2011 um 20:05 schrieb Simon Schwarz:

> Add NAND support for the new SPL structure.
> 
> ---
> This patch didn't exist before V2!
> 
> V2 changes:
> ADD Some define-barriers for OMAP3 to only use NAND
> ADD nand_load_image() - inits the OMAP gpmc, loads the images - parses the
> 	header
> CHG cosmetic
> ADD do_reset() implementation for omap-common spl
> ADD nand_copy_image to nand.h
> ADD CPP barriers for mmc and nand support. The parts depending on library
> 	support are only compiled if the respective library is included.
> 
> Transition from V1 to V2 also includes that this patch is now based on
> 	- the new SPL layout by Aneesh V and Daniel Schwierzeck
>  	- the OMAP4 SPL patches by Aneesh V
> 
> Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com>
> ---
> arch/arm/cpu/armv7/omap-common/spl.c |   43 ++++++++++++++++++++++++++++++++++
> arch/arm/include/asm/omap_common.h   |    2 +
> include/nand.h                       |    3 ++
> 3 files changed, 48 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
> index d177652..3a0093d 100644
> --- a/arch/arm/cpu/armv7/omap-common/spl.c
> +++ b/arch/arm/cpu/armv7/omap-common/spl.c
> @@ -26,6 +26,7 @@
> #include <asm/u-boot.h>
> #include <asm/utils.h>
> #include <asm/arch/sys_proto.h>
> +#include <nand.h>
> #include <mmc.h>
> #include <fat.h>
> #include <timestamp_autogenerated.h>
> @@ -107,6 +108,7 @@ static void parse_image_header(const struct image_header *header)
> 	}
> }
> 
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> static void mmc_load_image_raw(struct mmc *mmc)
> {
> 	u32 image_size_sectors, err;
> @@ -140,7 +142,9 @@ end:
> 		hang();
> 	}
> }
> +#endif /* CONFIG_SPL_MMC_SUPPORT */
> 
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> static void mmc_load_image_fat(struct mmc *mmc)
> {
> 	s32 err;
> @@ -173,7 +177,9 @@ end:
> 		hang();
> 	}
> }
> +#endif /* CONFIG_SPL_MMC_SUPPORT */
> 
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> static void mmc_load_image(void)
> {
> 	struct mmc *mmc;
> @@ -206,6 +212,26 @@ static void mmc_load_image(void)
> 		hang();
> 	}
> }
> +#endif /* CONFIG_SPL_MMC_SUPPORT */
> +
> +#ifdef CONFIG_SPL_NAND_SUPPORT
> +static void nand_load_image(void)
> +{
> +	gpmc_init();
> +	nand_init();
> +	nand_copy_image(CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
> +		(uchar *)CONFIG_SYS_NAND_U_BOOT_DST);
> +#ifdef CONFIG_NAND_ENV_DST
> +	nand_copy_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
> +		(uchar *)CONFIG_NAND_ENV_DST);
> +#ifdef CONFIG_ENV_OFFSET_REDUND
> +	nand_copy_image(CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE,
> +		(uchar *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE);
> +#endif
> +#endif
> +	parse_image_header((struct image_header *)CONFIG_SYS_NAND_U_BOOT_DST);
> +}
> +#endif /* CONFIG_SPL_NAND_SUPPORT */
> 
> void jump_to_image_no_args(void)
> {
> @@ -228,10 +254,17 @@ void board_init_r(gd_t *id, ulong dummy)
> 	boot_device = omap_boot_device();
> 	debug("boot device - %d\n", boot_device);
> 	switch (boot_device) {
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> 	case BOOT_DEVICE_MMC1:
> 	case BOOT_DEVICE_MMC2:
> 		mmc_load_image();
> 		break;
> +#endif
> +#ifdef CONFIG_SPL_NAND_SUPPORT
> +	case BOOT_DEVICE_NAND:
> +		nand_load_image();
> +		break;
> +#endif
> 	default:
> 		printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
> 		hang();
> @@ -259,7 +292,9 @@ void preloader_console_init(void)
> 	gd->flags |= GD_FLG_RELOC;
> 	gd->baudrate = CONFIG_BAUDRATE;
> 
> +#ifndef CONFIG_OMAP34XX

Well .. that was discussed with Aneesh in another mail. I prefer Aneesh decides how the interface should be:
 a) OMAP3 provides setup_clocks_for_console() and remove the UART stuff from per_clocks_enable()
 b) remove setup_clocks_for_console() here and require preloader_console_init() to have the clocks enabled before

> 	setup_clocks_for_console();
> +#endif
> 	serial_init();		/* serial communications setup */
> 
> 	/* Avoid a second "U-Boot" coming from this string */
> @@ -270,3 +305,11 @@ void preloader_console_init(void)
> 	omap_rev_string(rev_string_buffer);
> 	printf("Texas Instruments %s\n", rev_string_buffer);
> }

Some comment would be useful why this is here .. 

> +
> +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +	debug("resetting cpu...");
> +	reset_cpu(0);
> +
> +	return 0;
> +}
> diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h
> index d3cb857..ee45a33 100644
> --- a/arch/arm/include/asm/omap_common.h
> +++ b/arch/arm/include/asm/omap_common.h
> @@ -49,6 +49,8 @@ void preloader_console_init(void);
> #define	MMCSD_MODE_UNDEFINED	0
> #define MMCSD_MODE_RAW		1
> #define MMCSD_MODE_FAT		2
> +#define NAND_MODE_HW		3
> +#define NAND_MODE_SW		4

Shouldn't that name NAND_ECC_MODE_(HW|SW) or something?

> u32 omap_boot_device(void);
> u32 omap_boot_mode(void);
> diff --git a/include/nand.h b/include/nand.h
> index 8d94b5c..084c017 100644
> --- a/include/nand.h
> +++ b/include/nand.h
> @@ -132,6 +132,8 @@ int nand_lock( nand_info_t *meminfo, int tight );
> int nand_unlock( nand_info_t *meminfo, ulong start, ulong length );
> int nand_get_lock_status(nand_info_t *meminfo, loff_t offset);
> 
> +void nand_copy_image(unsigned int offs, unsigned int size, uchar *dst);
> +
> #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
> void board_nand_select_device(struct nand_chip *nand, int chip);
> #endif
> @@ -148,3 +150,4 @@ __attribute__((noreturn)) void nand_boot(void);
> #define ENV_OFFSET_SIZE 8
> int get_nand_env_oob(nand_info_t *nand, unsigned long *result);
> #endif
> +

This single line is useless.

> -- 
> 1.7.4.1

regards

Andreas Bießmann
Simon Schwarz - July 26, 2011, 8:42 a.m.
Dear Andreas,

On 07/26/2011 08:07 AM, Andreas Bießmann wrote:
> Dear Simon,
>
> Am 25.07.2011 um 20:05 schrieb Simon Schwarz:
>
>> Add NAND support for the new SPL structure.
>>
>> ---
>> This patch didn't exist before V2!
>>
>> V2 changes:
>> ADD Some define-barriers for OMAP3 to only use NAND
>> ADD nand_load_image() - inits the OMAP gpmc, loads the images - parses the
>> 	header
>> CHG cosmetic
>> ADD do_reset() implementation for omap-common spl
>> ADD nand_copy_image to nand.h
>> ADD CPP barriers for mmc and nand support. The parts depending on library
>> 	support are only compiled if the respective library is included.
>>
>> Transition from V1 to V2 also includes that this patch is now based on
>> 	- the new SPL layout by Aneesh V and Daniel Schwierzeck
>>   	- the OMAP4 SPL patches by Aneesh V
>>
>> Signed-off-by: Simon Schwarz<simonschwarzcor@gmail.com>
>> ---
>> arch/arm/cpu/armv7/omap-common/spl.c |   43 ++++++++++++++++++++++++++++++++++
>> arch/arm/include/asm/omap_common.h   |    2 +
>> include/nand.h                       |    3 ++
>> 3 files changed, 48 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
>> index d177652..3a0093d 100644
>> --- a/arch/arm/cpu/armv7/omap-common/spl.c
>> +++ b/arch/arm/cpu/armv7/omap-common/spl.c
>> @@ -26,6 +26,7 @@
>> #include<asm/u-boot.h>
>> #include<asm/utils.h>
>> #include<asm/arch/sys_proto.h>
>> +#include<nand.h>
>> #include<mmc.h>
>> #include<fat.h>
>> #include<timestamp_autogenerated.h>
>> @@ -107,6 +108,7 @@ static void parse_image_header(const struct image_header *header)
>> 	}
>> }
>>
>> +#ifdef CONFIG_SPL_MMC_SUPPORT
>> static void mmc_load_image_raw(struct mmc *mmc)
>> {
>> 	u32 image_size_sectors, err;
>> @@ -140,7 +142,9 @@ end:
>> 		hang();
>> 	}
>> }
>> +#endif /* CONFIG_SPL_MMC_SUPPORT */
>>
>> +#ifdef CONFIG_SPL_MMC_SUPPORT
>> static void mmc_load_image_fat(struct mmc *mmc)
>> {
>> 	s32 err;
>> @@ -173,7 +177,9 @@ end:
>> 		hang();
>> 	}
>> }
>> +#endif /* CONFIG_SPL_MMC_SUPPORT */
>>
>> +#ifdef CONFIG_SPL_MMC_SUPPORT
>> static void mmc_load_image(void)
>> {
>> 	struct mmc *mmc;
>> @@ -206,6 +212,26 @@ static void mmc_load_image(void)
>> 		hang();
>> 	}
>> }
>> +#endif /* CONFIG_SPL_MMC_SUPPORT */
>> +
>> +#ifdef CONFIG_SPL_NAND_SUPPORT
>> +static void nand_load_image(void)
>> +{
>> +	gpmc_init();
>> +	nand_init();
>> +	nand_copy_image(CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
>> +		(uchar *)CONFIG_SYS_NAND_U_BOOT_DST);
>> +#ifdef CONFIG_NAND_ENV_DST
>> +	nand_copy_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
>> +		(uchar *)CONFIG_NAND_ENV_DST);
>> +#ifdef CONFIG_ENV_OFFSET_REDUND
>> +	nand_copy_image(CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE,
>> +		(uchar *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE);
>> +#endif
>> +#endif
>> +	parse_image_header((struct image_header *)CONFIG_SYS_NAND_U_BOOT_DST);
>> +}
>> +#endif /* CONFIG_SPL_NAND_SUPPORT */
>>
>> void jump_to_image_no_args(void)
>> {
>> @@ -228,10 +254,17 @@ void board_init_r(gd_t *id, ulong dummy)
>> 	boot_device = omap_boot_device();
>> 	debug("boot device - %d\n", boot_device);
>> 	switch (boot_device) {
>> +#ifdef CONFIG_SPL_MMC_SUPPORT
>> 	case BOOT_DEVICE_MMC1:
>> 	case BOOT_DEVICE_MMC2:
>> 		mmc_load_image();
>> 		break;
>> +#endif
>> +#ifdef CONFIG_SPL_NAND_SUPPORT
>> +	case BOOT_DEVICE_NAND:
>> +		nand_load_image();
>> +		break;
>> +#endif
>> 	default:
>> 		printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
>> 		hang();
>> @@ -259,7 +292,9 @@ void preloader_console_init(void)
>> 	gd->flags |= GD_FLG_RELOC;
>> 	gd->baudrate = CONFIG_BAUDRATE;
>>
>> +#ifndef CONFIG_OMAP34XX
>
> Well .. that was discussed with Aneesh in another mail. I prefer Aneesh decides how the interface should be:
>   a) OMAP3 provides setup_clocks_for_console() and remove the UART stuff from per_clocks_enable()
>   b) remove setup_clocks_for_console() here and require preloader_console_init() to have the clocks enabled before
>
Totally agree. I just wait for a reply by Aneesh and will change it.

>> 	setup_clocks_for_console();
>> +#endif
>> 	serial_init();		/* serial communications setup */
>>
>> 	/* Avoid a second "U-Boot" coming from this string */
>> @@ -270,3 +305,11 @@ void preloader_console_init(void)
>> 	omap_rev_string(rev_string_buffer);
>> 	printf("Texas Instruments %s\n", rev_string_buffer);
>> }
>
> Some comment would be useful why this is here ..
will add this

>
>> +
>> +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>> +{
>> +	debug("resetting cpu...");
>> +	reset_cpu(0);
>> +
>> +	return 0;
>> +}
>> diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h
>> index d3cb857..ee45a33 100644
>> --- a/arch/arm/include/asm/omap_common.h
>> +++ b/arch/arm/include/asm/omap_common.h
>> @@ -49,6 +49,8 @@ void preloader_console_init(void);
>> #define	MMCSD_MODE_UNDEFINED	0
>> #define MMCSD_MODE_RAW		1
>> #define MMCSD_MODE_FAT		2
>> +#define NAND_MODE_HW		3
>> +#define NAND_MODE_SW		4
>
> Shouldn't that name NAND_ECC_MODE_(HW|SW) or something?
Will change
>
>> u32 omap_boot_device(void);
>> u32 omap_boot_mode(void);
>> diff --git a/include/nand.h b/include/nand.h
>> index 8d94b5c..084c017 100644
>> --- a/include/nand.h
>> +++ b/include/nand.h
>> @@ -132,6 +132,8 @@ int nand_lock( nand_info_t *meminfo, int tight );
>> int nand_unlock( nand_info_t *meminfo, ulong start, ulong length );
>> int nand_get_lock_status(nand_info_t *meminfo, loff_t offset);
>>
>> +void nand_copy_image(unsigned int offs, unsigned int size, uchar *dst);
>> +
>> #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
>> void board_nand_select_device(struct nand_chip *nand, int chip);
>> #endif
>> @@ -148,3 +150,4 @@ __attribute__((noreturn)) void nand_boot(void);
>> #define ENV_OFFSET_SIZE 8
>> int get_nand_env_oob(nand_info_t *nand, unsigned long *result);
>> #endif
>> +
>
> This single line is useless.

Done.

>> --
>> 1.7.4.1
>
> regards
>
> Andreas Bießmann
>

Patch

diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
index d177652..3a0093d 100644
--- a/arch/arm/cpu/armv7/omap-common/spl.c
+++ b/arch/arm/cpu/armv7/omap-common/spl.c
@@ -26,6 +26,7 @@ 
 #include <asm/u-boot.h>
 #include <asm/utils.h>
 #include <asm/arch/sys_proto.h>
+#include <nand.h>
 #include <mmc.h>
 #include <fat.h>
 #include <timestamp_autogenerated.h>
@@ -107,6 +108,7 @@  static void parse_image_header(const struct image_header *header)
 	}
 }
 
+#ifdef CONFIG_SPL_MMC_SUPPORT
 static void mmc_load_image_raw(struct mmc *mmc)
 {
 	u32 image_size_sectors, err;
@@ -140,7 +142,9 @@  end:
 		hang();
 	}
 }
+#endif /* CONFIG_SPL_MMC_SUPPORT */
 
+#ifdef CONFIG_SPL_MMC_SUPPORT
 static void mmc_load_image_fat(struct mmc *mmc)
 {
 	s32 err;
@@ -173,7 +177,9 @@  end:
 		hang();
 	}
 }
+#endif /* CONFIG_SPL_MMC_SUPPORT */
 
+#ifdef CONFIG_SPL_MMC_SUPPORT
 static void mmc_load_image(void)
 {
 	struct mmc *mmc;
@@ -206,6 +212,26 @@  static void mmc_load_image(void)
 		hang();
 	}
 }
+#endif /* CONFIG_SPL_MMC_SUPPORT */
+
+#ifdef CONFIG_SPL_NAND_SUPPORT
+static void nand_load_image(void)
+{
+	gpmc_init();
+	nand_init();
+	nand_copy_image(CONFIG_SYS_NAND_U_BOOT_OFFS, CONFIG_SYS_NAND_U_BOOT_SIZE,
+		(uchar *)CONFIG_SYS_NAND_U_BOOT_DST);
+#ifdef CONFIG_NAND_ENV_DST
+	nand_copy_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
+		(uchar *)CONFIG_NAND_ENV_DST);
+#ifdef CONFIG_ENV_OFFSET_REDUND
+	nand_copy_image(CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE,
+		(uchar *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE);
+#endif
+#endif
+	parse_image_header((struct image_header *)CONFIG_SYS_NAND_U_BOOT_DST);
+}
+#endif /* CONFIG_SPL_NAND_SUPPORT */
 
 void jump_to_image_no_args(void)
 {
@@ -228,10 +254,17 @@  void board_init_r(gd_t *id, ulong dummy)
 	boot_device = omap_boot_device();
 	debug("boot device - %d\n", boot_device);
 	switch (boot_device) {
+#ifdef CONFIG_SPL_MMC_SUPPORT
 	case BOOT_DEVICE_MMC1:
 	case BOOT_DEVICE_MMC2:
 		mmc_load_image();
 		break;
+#endif
+#ifdef CONFIG_SPL_NAND_SUPPORT
+	case BOOT_DEVICE_NAND:
+		nand_load_image();
+		break;
+#endif
 	default:
 		printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
 		hang();
@@ -259,7 +292,9 @@  void preloader_console_init(void)
 	gd->flags |= GD_FLG_RELOC;
 	gd->baudrate = CONFIG_BAUDRATE;
 
+#ifndef CONFIG_OMAP34XX
 	setup_clocks_for_console();
+#endif
 	serial_init();		/* serial communications setup */
 
 	/* Avoid a second "U-Boot" coming from this string */
@@ -270,3 +305,11 @@  void preloader_console_init(void)
 	omap_rev_string(rev_string_buffer);
 	printf("Texas Instruments %s\n", rev_string_buffer);
 }
+
+int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	debug("resetting cpu...");
+	reset_cpu(0);
+
+	return 0;
+}
diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h
index d3cb857..ee45a33 100644
--- a/arch/arm/include/asm/omap_common.h
+++ b/arch/arm/include/asm/omap_common.h
@@ -49,6 +49,8 @@  void preloader_console_init(void);
 #define	MMCSD_MODE_UNDEFINED	0
 #define MMCSD_MODE_RAW		1
 #define MMCSD_MODE_FAT		2
+#define NAND_MODE_HW		3
+#define NAND_MODE_SW		4
 
 u32 omap_boot_device(void);
 u32 omap_boot_mode(void);
diff --git a/include/nand.h b/include/nand.h
index 8d94b5c..084c017 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -132,6 +132,8 @@  int nand_lock( nand_info_t *meminfo, int tight );
 int nand_unlock( nand_info_t *meminfo, ulong start, ulong length );
 int nand_get_lock_status(nand_info_t *meminfo, loff_t offset);
 
+void nand_copy_image(unsigned int offs, unsigned int size, uchar *dst);
+
 #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
 void board_nand_select_device(struct nand_chip *nand, int chip);
 #endif
@@ -148,3 +150,4 @@  __attribute__((noreturn)) void nand_boot(void);
 #define ENV_OFFSET_SIZE 8
 int get_nand_env_oob(nand_info_t *nand, unsigned long *result);
 #endif
+