aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch')
-rw-r--r--recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch148
1 files changed, 148 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch b/recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch
new file mode 100644
index 0000000..e84bd24
--- /dev/null
+++ b/recipes-bsp/u-boot/u-boot-v2012.04.01/0046-i.MX28-Improve-passing-of-data-from-SPL-to-U-Boot.patch
@@ -0,0 +1,148 @@
+From b4a826714297d304a42bfbe6622e66bbdebe0f61 Mon Sep 17 00:00:00 2001
+From: Marek Vasut <marex@denx.de>
+Date: Tue, 1 May 2012 11:09:44 +0000
+Subject: [PATCH 46/56] i.MX28: Improve passing of data from SPL to U-Boot
+
+Pass memory size from SPL via structure located in SRAM instead of SCRATCH
+registers. This allows passing more data about boot from SPL to U-Boot, like the
+boot mode pads configuration.
+
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: Detlev Zundel <dzu@denx.de>
+Cc: Fabio Estevam <fabio.estevam@freescale.com>
+Cc: Stefano Babic <sbabic@denx.de>
+Cc: Wolfgang Denk <wd@denx.de>
+---
+ arch/arm/cpu/arm926ejs/mx28/mx28.c | 16 +++++-----------
+ arch/arm/cpu/arm926ejs/mx28/mx28_init.h | 1 +
+ arch/arm/cpu/arm926ejs/mx28/spl_boot.c | 7 +++++++
+ arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c | 10 +++-------
+ arch/arm/include/asm/arch-mx28/sys_proto.h | 4 ++++
+ 5 files changed, 20 insertions(+), 18 deletions(-)
+
+diff --git a/arch/arm/cpu/arm926ejs/mx28/mx28.c b/arch/arm/cpu/arm926ejs/mx28/mx28.c
+index dc0338d..54a68e1 100644
+--- a/arch/arm/cpu/arm926ejs/mx28/mx28.c
++++ b/arch/arm/cpu/arm926ejs/mx28/mx28.c
+@@ -279,22 +279,16 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
+
+ int mx28_dram_init(void)
+ {
+- struct mx28_digctl_regs *digctl_regs =
+- (struct mx28_digctl_regs *)MXS_DIGCTL_BASE;
+- uint32_t sz[2];
++ struct mx28_spl_data *data = (struct mx28_spl_data *)
++ ((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf);
+
+- sz[0] = readl(&digctl_regs->hw_digctl_scratch0);
+- sz[1] = readl(&digctl_regs->hw_digctl_scratch1);
+-
+- if (sz[0] != sz[1]) {
++ if (data->mem_dram_size == 0) {
+ printf("MX28:\n"
+- "Error, the RAM size in HW_DIGCTRL_SCRATCH0 and\n"
+- "HW_DIGCTRL_SCRATCH1 is not the same. Please\n"
+- "verify these two registers contain valid RAM size!\n");
++ "Error, the RAM size passed up from SPL is 0!\n");
+ hang();
+ }
+
+- gd->ram_size = sz[0];
++ gd->ram_size = data->mem_dram_size;
+ return 0;
+ }
+
+diff --git a/arch/arm/cpu/arm926ejs/mx28/mx28_init.h b/arch/arm/cpu/arm926ejs/mx28/mx28_init.h
+index 98d3631..8eac958 100644
+--- a/arch/arm/cpu/arm926ejs/mx28/mx28_init.h
++++ b/arch/arm/cpu/arm926ejs/mx28/mx28_init.h
+@@ -37,5 +37,6 @@ static inline void mx28_power_wait_pswitch(void) { }
+ #endif
+
+ void mx28_mem_init(void);
++uint32_t mx28_mem_get_size(void);
+
+ #endif /* __M28_INIT_H__ */
+diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_boot.c b/arch/arm/cpu/arm926ejs/mx28/spl_boot.c
+index dfb8309..37e1eb7 100644
+--- a/arch/arm/cpu/arm926ejs/mx28/spl_boot.c
++++ b/arch/arm/cpu/arm926ejs/mx28/spl_boot.c
+@@ -28,6 +28,7 @@
+ #include <asm/io.h>
+ #include <asm/arch/iomux-mx28.h>
+ #include <asm/arch/imx-regs.h>
++#include <asm/arch/sys_proto.h>
+
+ #include "mx28_init.h"
+
+@@ -49,9 +50,15 @@ void early_delay(int delay)
+ void mx28_common_spl_init(const iomux_cfg_t *iomux_setup,
+ const unsigned int iomux_size)
+ {
++ struct mx28_spl_data *data = (struct mx28_spl_data *)
++ ((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf);
++
+ mxs_iomux_setup_multiple_pads(iomux_setup, iomux_size);
+ mx28_power_init();
++
+ mx28_mem_init();
++ data->mem_dram_size = mx28_mem_get_size();
++
+ mx28_power_wait_pswitch();
+ }
+
+diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c b/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c
+index 69c865e..9fa5d29 100644
+--- a/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c
++++ b/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c
+@@ -175,10 +175,8 @@ void mx28_mem_setup_vddd(void)
+ &power_regs->hw_power_vdddctrl);
+ }
+
+-void mx28_mem_get_size(void)
++uint32_t mx28_mem_get_size(void)
+ {
+- struct mx28_digctl_regs *digctl_regs =
+- (struct mx28_digctl_regs *)MXS_DIGCTL_BASE;
+ uint32_t sz, da;
+ uint32_t *vt = (uint32_t *)0x20;
+ /* The following is "subs pc, r14, #4", used as return from DABT. */
+@@ -189,11 +187,11 @@ void mx28_mem_get_size(void)
+ vt[4] = data_abort_memdetect_handler;
+
+ sz = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
+- writel(sz, &digctl_regs->hw_digctl_scratch0);
+- writel(sz, &digctl_regs->hw_digctl_scratch1);
+
+ /* Restore the old DABT handler. */
+ vt[4] = da;
++
++ return sz;
+ }
+
+ void mx28_mem_init(void)
+@@ -241,6 +239,4 @@ void mx28_mem_init(void)
+ early_delay(10000);
+
+ mx28_mem_setup_cpu_and_hbus();
+-
+- mx28_mem_get_size();
+ }
+diff --git a/arch/arm/include/asm/arch-mx28/sys_proto.h b/arch/arm/include/asm/arch-mx28/sys_proto.h
+index 15d8de3..04f2e4d 100644
+--- a/arch/arm/include/asm/arch-mx28/sys_proto.h
++++ b/arch/arm/include/asm/arch-mx28/sys_proto.h
+@@ -39,6 +39,10 @@ void mx28_common_spl_init(const iomux_cfg_t *iomux_setup,
+ const unsigned int iomux_size);
+ #endif
+
++struct mx28_spl_data {
++ uint32_t mem_dram_size;
++};
++
+ int mx28_dram_init(void);
+
+ #endif /* __MX28_H__ */
+--
+1.7.10
+