Patchwork [U-Boot,V8,3/9] omap-common: add nand spl support

login
register
mail settings
Submitter Simon Schwarz
Date Aug. 2, 2011, 3:59 p.m.
Message ID <1312300757-9039-4-git-send-email-simonschwarzcor@gmail.com>
Download mbox | patch
Permalink /patch/107966/
State Superseded
Headers show

Comments

Simon Schwarz - Aug. 2, 2011, 3:59 p.m.
Add NAND support for the new SPL structure.

Signed-off-by: Simon Schwarz <simonschwarzcor@gmail.com>
---
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.

V3 changes:
ADD Comment why setup_clocks_for_console() isn't called for OMAP3
CHG cosmetic (deleted empty line)
CHG rename of NAND_MODE_HW to NAND_MODE_HW_ECC
DEL NAND_MODE_SW. Not used.

V4 changes:
CHG cosmetic - style problems

V5 changes:
CHG renamed nand_copy_image to nand_spl_load_image
CHG offs paramter of nand_spl_load_image is of type loff_t now

V6 changes:
ADD call to nand_deselect after loading the images
ADD nand_deselect to nand.h

V7 changes:
DEL some CONFIG_SPL_* relying on garbage collection now
ADD mmc_load_image and nand_load_image now have __attribute__((unused)) to
	prevent warnings when the lib is not added to SPL
DEL do_reset() isn't used anymore
CHG header based loading in SPL

V8 changes:
DEL nand_spl_read_page is replaced by nand_spl_load_image with size=page size

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
---
 arch/arm/cpu/armv7/omap-common/spl.c |   46 +++++++++++++++++++++++++++++++++-
 arch/arm/include/asm/omap_common.h   |    1 +
 include/nand.h                       |    3 ++
 3 files changed, 49 insertions(+), 1 deletions(-)
Aneesh V - Aug. 5, 2011, 7:30 a.m.
Hi Simon,

Sorry if my response is late. I was not in office for couple of days.

On Tuesday 02 August 2011 09:29 PM, Simon Schwarz wrote:
> Add NAND support for the new SPL structure.
>
> Signed-off-by: Simon Schwarz<simonschwarzcor@gmail.com>
> ---
> 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.
>
> V3 changes:
> ADD Comment why setup_clocks_for_console() isn't called for OMAP3
> CHG cosmetic (deleted empty line)
> CHG rename of NAND_MODE_HW to NAND_MODE_HW_ECC
> DEL NAND_MODE_SW. Not used.
>
> V4 changes:
> CHG cosmetic - style problems
>
> V5 changes:
> CHG renamed nand_copy_image to nand_spl_load_image
> CHG offs paramter of nand_spl_load_image is of type loff_t now
>
> V6 changes:
> ADD call to nand_deselect after loading the images
> ADD nand_deselect to nand.h
>
> V7 changes:
> DEL some CONFIG_SPL_* relying on garbage collection now
> ADD mmc_load_image and nand_load_image now have __attribute__((unused)) to
> 	prevent warnings when the lib is not added to SPL
> DEL do_reset() isn't used anymore
> CHG header based loading in SPL
>
> V8 changes:
> DEL nand_spl_read_page is replaced by nand_spl_load_image with size=page size
>
> 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
> ---
>   arch/arm/cpu/armv7/omap-common/spl.c |   46 +++++++++++++++++++++++++++++++++-
>   arch/arm/include/asm/omap_common.h   |    1 +
>   include/nand.h                       |    3 ++
>   3 files changed, 49 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
> index 1d301f4..53d10bf 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>
> @@ -173,7 +174,7 @@ end:
>   		hang();
>   	}
>   }
> -
> +static void mmc_load_image(void) __attribute__((unused));
>   static void mmc_load_image(void)
>   {
>   	struct mmc *mmc;
> @@ -207,12 +208,48 @@ static void mmc_load_image(void)
>   	}
>   }
>
> +#ifdef CONFIG_SPL_NAND_SUPPORT
> +static void nand_load_image(void) __attribute__ ((unused));
> +static void nand_load_image(void)
> +{
> +	struct image_header *header;
> +
> +	gpmc_init();
> +	nand_init();
> +
> +	/*use CONFIG_SYS_TEXT_BASE as temporary storage area */
> +	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
> +
> +#ifdef CONFIG_NAND_ENV_DST
> +	nand_spl_load_image(CONFIG_ENV_OFFSET,
> +		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
> +	parse_image_header(header);
> +	nand_spl_load_image(CONFIG_ENV_OFFSET, image_size,
> +		(void *)image_load_addr);
> +#ifdef CONFIG_ENV_OFFSET_REDUND
> +	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
> +		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
> +	parse_image_header(header);
> +	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, image_size,
> +		(void *)image_load_addr);
> +#endif
> +#endif

Can you please explain the logic here. What are you loading here?

br,
Aneesh
Simon Schwarz - Aug. 8, 2011, 7:50 a.m.
Hi Aneesh,

On 08/05/2011 09:30 AM, Aneesh V wrote:
> Hi Simon,
>
> Sorry if my response is late. I was not in office for couple of days.

First day in office since vacation - so no you are not late ;)

>
> On Tuesday 02 August 2011 09:29 PM, Simon Schwarz wrote:
>> Add NAND support for the new SPL structure.
>>
>> Signed-off-by: Simon Schwarz<simonschwarzcor@gmail.com>
>> ---
>> 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.
>>
>> V3 changes:
>> ADD Comment why setup_clocks_for_console() isn't called for OMAP3
>> CHG cosmetic (deleted empty line)
>> CHG rename of NAND_MODE_HW to NAND_MODE_HW_ECC
>> DEL NAND_MODE_SW. Not used.
>>
>> V4 changes:
>> CHG cosmetic - style problems
>>
>> V5 changes:
>> CHG renamed nand_copy_image to nand_spl_load_image
>> CHG offs paramter of nand_spl_load_image is of type loff_t now
>>
>> V6 changes:
>> ADD call to nand_deselect after loading the images
>> ADD nand_deselect to nand.h
>>
>> V7 changes:
>> DEL some CONFIG_SPL_* relying on garbage collection now
>> ADD mmc_load_image and nand_load_image now have
>> __attribute__((unused)) to
>> prevent warnings when the lib is not added to SPL
>> DEL do_reset() isn't used anymore
>> CHG header based loading in SPL
>>
>> V8 changes:
>> DEL nand_spl_read_page is replaced by nand_spl_load_image with
>> size=page size
>>
>> 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
>> ---
>> arch/arm/cpu/armv7/omap-common/spl.c | 46
>> +++++++++++++++++++++++++++++++++-
>> arch/arm/include/asm/omap_common.h | 1 +
>> include/nand.h | 3 ++
>> 3 files changed, 49 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c
>> b/arch/arm/cpu/armv7/omap-common/spl.c
>> index 1d301f4..53d10bf 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>
>> @@ -173,7 +174,7 @@ end:
>> hang();
>> }
>> }
>> -
>> +static void mmc_load_image(void) __attribute__((unused));
>> static void mmc_load_image(void)
>> {
>> struct mmc *mmc;
>> @@ -207,12 +208,48 @@ static void mmc_load_image(void)
>> }
>> }
>>
>> +#ifdef CONFIG_SPL_NAND_SUPPORT
>> +static void nand_load_image(void) __attribute__ ((unused));
>> +static void nand_load_image(void)
>> +{
>> + struct image_header *header;
>> +
>> + gpmc_init();
>> + nand_init();
>> +
>> + /*use CONFIG_SYS_TEXT_BASE as temporary storage area */
>> + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
>> +
>> +#ifdef CONFIG_NAND_ENV_DST
>> + nand_spl_load_image(CONFIG_ENV_OFFSET,
>> + CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
>> + parse_image_header(header);
>> + nand_spl_load_image(CONFIG_ENV_OFFSET, image_size,
>> + (void *)image_load_addr);
>> +#ifdef CONFIG_ENV_OFFSET_REDUND
>> + nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
>> + CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
>> + parse_image_header(header);
>> + nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, image_size,
>> + (void *)image_load_addr);
>> +#endif
>> +#endif
>
> Can you please explain the logic here. What are you loading here?

This is from the old nand_spl.c. AFAIK this is to load the environment 
from NAND to RAM. I kept this to not break boards using it - although 
there has to be some other mechanism for this because it is only used in 
smdk6400.h.

The REDUND part does the same for a redundant copy. (docs say: to have a 
working copy if power fails while doing saveenv).

>
> br,
> Aneesh

Regards
Simon
Aneesh V - Aug. 8, 2011, 9:04 a.m.
Hi Simon,

On Monday 08 August 2011 01:20 PM, Simon Schwarz wrote:
> Hi Aneesh,
>
> On 08/05/2011 09:30 AM, Aneesh V wrote:
>> Hi Simon,
>>
>> Sorry if my response is late. I was not in office for couple of days.
>
> First day in office since vacation - so no you are not late ;)
>
>>
>> On Tuesday 02 August 2011 09:29 PM, Simon Schwarz wrote:
>>> Add NAND support for the new SPL structure.
>>>
>>> Signed-off-by: Simon Schwarz<simonschwarzcor@gmail.com>
>>> ---
>>> 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.
>>>
>>> V3 changes:
>>> ADD Comment why setup_clocks_for_console() isn't called for OMAP3
>>> CHG cosmetic (deleted empty line)
>>> CHG rename of NAND_MODE_HW to NAND_MODE_HW_ECC
>>> DEL NAND_MODE_SW. Not used.
>>>
>>> V4 changes:
>>> CHG cosmetic - style problems
>>>
>>> V5 changes:
>>> CHG renamed nand_copy_image to nand_spl_load_image
>>> CHG offs paramter of nand_spl_load_image is of type loff_t now
>>>
>>> V6 changes:
>>> ADD call to nand_deselect after loading the images
>>> ADD nand_deselect to nand.h
>>>
>>> V7 changes:
>>> DEL some CONFIG_SPL_* relying on garbage collection now
>>> ADD mmc_load_image and nand_load_image now have
>>> __attribute__((unused)) to
>>> prevent warnings when the lib is not added to SPL
>>> DEL do_reset() isn't used anymore
>>> CHG header based loading in SPL
>>>
>>> V8 changes:
>>> DEL nand_spl_read_page is replaced by nand_spl_load_image with
>>> size=page size
>>>
>>> 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
>>> ---
>>> arch/arm/cpu/armv7/omap-common/spl.c | 46
>>> +++++++++++++++++++++++++++++++++-
>>> arch/arm/include/asm/omap_common.h | 1 +
>>> include/nand.h | 3 ++
>>> 3 files changed, 49 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/arch/arm/cpu/armv7/omap-common/spl.c
>>> b/arch/arm/cpu/armv7/omap-common/spl.c
>>> index 1d301f4..53d10bf 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>
>>> @@ -173,7 +174,7 @@ end:
>>> hang();
>>> }
>>> }
>>> -
>>> +static void mmc_load_image(void) __attribute__((unused));
>>> static void mmc_load_image(void)
>>> {
>>> struct mmc *mmc;
>>> @@ -207,12 +208,48 @@ static void mmc_load_image(void)
>>> }
>>> }
>>>
>>> +#ifdef CONFIG_SPL_NAND_SUPPORT
>>> +static void nand_load_image(void) __attribute__ ((unused));
>>> +static void nand_load_image(void)
>>> +{
>>> + struct image_header *header;
>>> +
>>> + gpmc_init();
>>> + nand_init();
>>> +
>>> + /*use CONFIG_SYS_TEXT_BASE as temporary storage area */
>>> + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
>>> +
>>> +#ifdef CONFIG_NAND_ENV_DST
>>> + nand_spl_load_image(CONFIG_ENV_OFFSET,
>>> + CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
>>> + parse_image_header(header);
>>> + nand_spl_load_image(CONFIG_ENV_OFFSET, image_size,
>>> + (void *)image_load_addr);
>>> +#ifdef CONFIG_ENV_OFFSET_REDUND
>>> + nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
>>> + CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
>>> + parse_image_header(header);
>>> + nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, image_size,
>>> + (void *)image_load_addr);
>>> +#endif
>>> +#endif
>>
>> Can you please explain the logic here. What are you loading here?
>
> This is from the old nand_spl.c. AFAIK this is to load the environment
> from NAND to RAM. I kept this to not break boards using it - although
> there has to be some other mechanism for this because it is only used in
> smdk6400.h.
>
> The REDUND part does the same for a redundant copy. (docs say: to have a
> working copy if power fails while doing saveenv).

Hmm. Looks like this was a support added by the commit b74ab737. So, we
are pre-loading the ENV for u-boot here.

best regards,
Aneesh

Patch

diff --git a/arch/arm/cpu/armv7/omap-common/spl.c b/arch/arm/cpu/armv7/omap-common/spl.c
index 1d301f4..53d10bf 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>
@@ -173,7 +174,7 @@  end:
 		hang();
 	}
 }
-
+static void mmc_load_image(void) __attribute__((unused));
 static void mmc_load_image(void)
 {
 	struct mmc *mmc;
@@ -207,12 +208,48 @@  static void mmc_load_image(void)
 	}
 }
 
+#ifdef CONFIG_SPL_NAND_SUPPORT
+static void nand_load_image(void) __attribute__ ((unused));
+static void nand_load_image(void)
+{
+	struct image_header *header;
+
+	gpmc_init();
+	nand_init();
+
+	/*use CONFIG_SYS_TEXT_BASE as temporary storage area */
+	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
+
+#ifdef CONFIG_NAND_ENV_DST
+	nand_spl_load_image(CONFIG_ENV_OFFSET,
+		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
+	parse_image_header(header);
+	nand_spl_load_image(CONFIG_ENV_OFFSET, image_size,
+		(void *)image_load_addr);
+#ifdef CONFIG_ENV_OFFSET_REDUND
+	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
+		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
+	parse_image_header(header);
+	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, image_size,
+		(void *)image_load_addr);
+#endif
+#endif
+	/* Load u-boot */
+	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
+	parse_image_header(header);
+	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+		image_size, (void *)image_load_addr);
+	nand_deselect();
+}
+#endif /* CONFIG_SPL_NAND_SUPPORT */
 void jump_to_image_no_args(void)
 {
 	typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
 	image_entry_noargs_t image_entry =
 			(image_entry_noargs_t) image_entry_point;
 
+	debug("image entry point: 0x%X\n", image_entry_point);
 	image_entry();
 }
 
@@ -228,10 +265,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();
diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h
index d3cb857..13f6884 100644
--- a/arch/arm/include/asm/omap_common.h
+++ b/arch/arm/include/asm/omap_common.h
@@ -49,6 +49,7 @@  void preloader_console_init(void);
 #define	MMCSD_MODE_UNDEFINED	0
 #define MMCSD_MODE_RAW		1
 #define MMCSD_MODE_FAT		2
+#define NAND_MODE_HW_ECC	3
 
 u32 omap_boot_device(void);
 u32 omap_boot_mode(void);
diff --git a/include/nand.h b/include/nand.h
index 8d94b5c..3c5ef4e 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -132,6 +132,9 @@  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_spl_load_image(loff_t offs, unsigned int size, uchar *dst);
+void nand_deselect(void);
+
 #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
 void board_nand_select_device(struct nand_chip *nand, int chip);
 #endif