[U-Boot] [PATCH] arm: omap4: Fix SDRAM AUTO DETECTION

Lokesh Vutla lokeshvutla at ti.com
Fri Apr 5 08:06:30 CEST 2013


+ Michael

On Friday 05 April 2013 11:21 AM, Lokesh Vutla wrote:
> Commit "8602114 omap: emif: configure emif only when required"
> breaks SDRAM_AUTO_DETECTION.
> The issue is dmm_init() depends on emif_sizes[](SDRAM Auto detection)
> done in do_sdram_init(). The above commit moves dmm_init() above
> do_sdram_init() because of which dmm_init() uses uninitialized
> emif_sizes[].
> So instead of using global emif_sizes[], get sdram details locally
> and calculate emif sizes.
>
> Reported-by: Michael Cashwell <mboards at prograde.net>
> Signed-off-by: Lokesh Vutla <lokeshvutla at ti.com>
> ---
>   arch/arm/cpu/armv7/omap-common/emif-common.c |   29 ++++++++++++++------------
>   arch/arm/cpu/armv7/omap4/emif.c              |    1 -
>   arch/arm/cpu/armv7/omap5/emif.c              |    1 -
>   arch/arm/include/asm/arch-omap4/omap.h       |    1 -
>   arch/arm/include/asm/arch-omap5/omap.h       |    1 -
>   arch/arm/include/asm/emif.h                  |    1 -
>   6 files changed, 16 insertions(+), 18 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/omap-common/emif-common.c b/arch/arm/cpu/armv7/omap-common/emif-common.c
> index 9eb1279..cdb4439 100644
> --- a/arch/arm/cpu/armv7/omap-common/emif-common.c
> +++ b/arch/arm/cpu/armv7/omap-common/emif-common.c
> @@ -655,20 +655,27 @@ static u32 get_ddr_phy_ctrl_1(u32 freq, u8 RL)
>   	return phy;
>   }
>
> -static u32 get_emif_mem_size(struct emif_device_details *devices)
> +static u32 get_emif_mem_size(u32 base)
>   {
>   	u32 size_mbytes = 0, temp;
> +	struct emif_device_details dev_details;
> +	struct lpddr2_device_details cs0_dev_details, cs1_dev_details;
> +	u32 emif_nr = emif_num(base);
>
> -	if (!devices)
> -		return 0;
> +	emif_reset_phy(base);
> +	dev_details.cs0_device_details = emif_get_device_details(emif_nr, CS0,
> +						&cs0_dev_details);
> +	dev_details.cs1_device_details = emif_get_device_details(emif_nr, CS1,
> +						&cs1_dev_details);
> +	emif_reset_phy(base);
>
> -	if (devices->cs0_device_details) {
> -		temp = devices->cs0_device_details->density;
> +	if (dev_details.cs0_device_details) {
> +		temp = dev_details.cs0_device_details->density;
>   		size_mbytes += lpddr2_density_2_size_in_mbytes[temp];
>   	}
>
> -	if (devices->cs1_device_details) {
> -		temp = devices->cs1_device_details->density;
> +	if (dev_details.cs1_device_details) {
> +		temp = dev_details.cs1_device_details->density;
>   		size_mbytes += lpddr2_density_2_size_in_mbytes[temp];
>   	}
>   	/* convert to bytes */
> @@ -1040,13 +1047,9 @@ static void do_sdram_init(u32 base)
>   	/* Return if no devices on this EMIF */
>   	if (!dev_details.cs0_device_details &&
>   	    !dev_details.cs1_device_details) {
> -		emif_sizes[emif_nr - 1] = 0;
>   		return;
>   	}
>
> -	if (!in_sdram)
> -		emif_sizes[emif_nr - 1] = get_emif_mem_size(&dev_details);
> -
>   	/*
>   	 * Get device timings:
>   	 * - Default timings specified by JESD209-2 if
> @@ -1108,8 +1111,8 @@ void dmm_init(u32 base)
>   	mapped_size = 0;
>   	section_cnt = 3;
>   	sys_addr = CONFIG_SYS_SDRAM_BASE;
> -	emif1_size = emif_sizes[0];
> -	emif2_size = emif_sizes[1];
> +	emif1_size = get_emif_mem_size(EMIF1_BASE);
> +	emif2_size = get_emif_mem_size(EMIF2_BASE);
>   	debug("emif1_size 0x%x emif2_size 0x%x\n", emif1_size, emif2_size);
>
>   	if (!emif1_size && !emif2_size)
> diff --git a/arch/arm/cpu/armv7/omap4/emif.c b/arch/arm/cpu/armv7/omap4/emif.c
> index ca4823d..53f6063 100644
> --- a/arch/arm/cpu/armv7/omap4/emif.c
> +++ b/arch/arm/cpu/armv7/omap4/emif.c
> @@ -33,7 +33,6 @@
>   #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
>   u32 *const T_num = (u32 *)OMAP4_SRAM_SCRATCH_EMIF_T_NUM;
>   u32 *const T_den = (u32 *)OMAP4_SRAM_SCRATCH_EMIF_T_DEN;
> -u32 *const emif_sizes = (u32 *)OMAP4_SRAM_SCRATCH_EMIF_SIZE;
>   #endif
>
>   #ifdef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
> diff --git a/arch/arm/cpu/armv7/omap5/emif.c b/arch/arm/cpu/armv7/omap5/emif.c
> index 90d362c..9f53c90 100644
> --- a/arch/arm/cpu/armv7/omap5/emif.c
> +++ b/arch/arm/cpu/armv7/omap5/emif.c
> @@ -34,7 +34,6 @@
>   #define print_timing_reg(reg) debug(#reg" - 0x%08x\n", (reg))
>   u32 *const T_num = (u32 *)OMAP5_SRAM_SCRATCH_EMIF_T_NUM;
>   u32 *const T_den = (u32 *)OMAP5_SRAM_SCRATCH_EMIF_T_DEN;
> -u32 *const emif_sizes = (u32 *)OMAP5_SRAM_SCRATCH_EMIF_SIZE;
>   #endif
>
>   #ifdef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
> diff --git a/arch/arm/include/asm/arch-omap4/omap.h b/arch/arm/include/asm/arch-omap4/omap.h
> index 5f321fe..ad984da 100644
> --- a/arch/arm/include/asm/arch-omap4/omap.h
> +++ b/arch/arm/include/asm/arch-omap4/omap.h
> @@ -147,7 +147,6 @@ struct s32ktimer {
>   #define SRAM_SCRATCH_SPACE_ADDR		NON_SECURE_SRAM_START
>   /* SRAM scratch space entries */
>   #define OMAP4_SRAM_SCRATCH_OMAP4_REV	SRAM_SCRATCH_SPACE_ADDR
> -#define OMAP4_SRAM_SCRATCH_EMIF_SIZE	(SRAM_SCRATCH_SPACE_ADDR + 0x4)
>   #define OMAP4_SRAM_SCRATCH_EMIF_T_NUM	(SRAM_SCRATCH_SPACE_ADDR + 0xC)
>   #define OMAP4_SRAM_SCRATCH_EMIF_T_DEN	(SRAM_SCRATCH_SPACE_ADDR + 0x10)
>   #define OMAP_SRAM_SCRATCH_PRCM_PTR      (SRAM_SCRATCH_SPACE_ADDR + 0x14)
> diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h
> index b632635..887fcaa 100644
> --- a/arch/arm/include/asm/arch-omap5/omap.h
> +++ b/arch/arm/include/asm/arch-omap5/omap.h
> @@ -196,7 +196,6 @@ struct s32ktimer {
>    * SRAM scratch space entries
>    */
>   #define OMAP5_SRAM_SCRATCH_OMAP5_REV	SRAM_SCRATCH_SPACE_ADDR
> -#define OMAP5_SRAM_SCRATCH_EMIF_SIZE	(SRAM_SCRATCH_SPACE_ADDR + 0x4)
>   #define OMAP5_SRAM_SCRATCH_EMIF_T_NUM	(SRAM_SCRATCH_SPACE_ADDR + 0xC)
>   #define OMAP5_SRAM_SCRATCH_EMIF_T_DEN	(SRAM_SCRATCH_SPACE_ADDR + 0x10)
>   #define OMAP_SRAM_SCRATCH_PRCM_PTR      (SRAM_SCRATCH_SPACE_ADDR + 0x14)
> diff --git a/arch/arm/include/asm/emif.h b/arch/arm/include/asm/emif.h
> index c5d1e6c..5f11d7b 100644
> --- a/arch/arm/include/asm/emif.h
> +++ b/arch/arm/include/asm/emif.h
> @@ -1165,7 +1165,6 @@ void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs);
>   #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
>   extern u32 *const T_num;
>   extern u32 *const T_den;
> -extern u32 *const emif_sizes;
>   #endif
>
>   void config_data_eye_leveling_samples(u32 emif_base);
>



More information about the U-Boot mailing list