From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lokesh Vutla Date: Fri, 5 Apr 2013 11:36:30 +0530 Subject: [U-Boot] [PATCH] arm: omap4: Fix SDRAM AUTO DETECTION In-Reply-To: <1365141074-21364-1-git-send-email-lokeshvutla@ti.com> References: <1365141074-21364-1-git-send-email-lokeshvutla@ti.com> Message-ID: <515E69E6.5040401@ti.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de + 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 > Signed-off-by: Lokesh Vutla > --- > 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); >