summaryrefslogtreecommitdiff
path: root/board/denx/m28evk/mem_init.c
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2011-11-08 23:18:24 (GMT)
committerStefano Babic <sbabic@denx.de>2011-11-11 10:36:58 (GMT)
commit3a4ce8335b89af37647d26f44d6eb476ce995fbb (patch)
tree6e6196b27e8b0e39a913a1d0e1be10104437c116 /board/denx/m28evk/mem_init.c
parent22fe68fbdc6baf4d55782fd9803e6133c49b533d (diff)
downloadu-boot-fsl-qoriq-3a4ce8335b89af37647d26f44d6eb476ce995fbb.tar.xz
M28: Add memory detection into SPL
This code allows the DDR DRAM size to be detected at runtime. The RAM size is stored into two scratch registers, from which it is then fetched in U-Boot. Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Cc: Stefano Babic <sbabic@denx.de> Cc: Wolfgang Denk <wd@denx.de> Cc: Detlev Zundel <dzu@denx.de>
Diffstat (limited to 'board/denx/m28evk/mem_init.c')
-rw-r--r--board/denx/m28evk/mem_init.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/board/denx/m28evk/mem_init.c b/board/denx/m28evk/mem_init.c
index 066fe0d..17d1f9b 100644
--- a/board/denx/m28evk/mem_init.c
+++ b/board/denx/m28evk/mem_init.c
@@ -165,6 +165,31 @@ void mx28_mem_setup_vddd(void)
&power_regs->hw_power_vdddctrl);
}
+#define HW_DIGCTRL_SCRATCH0 0x8001c280
+#define HW_DIGCTRL_SCRATCH1 0x8001c290
+void data_abort_memdetect_handler(void) __attribute__((naked));
+void data_abort_memdetect_handler(void)
+{
+ asm volatile("subs pc, r14, #4");
+}
+
+void mx28_mem_get_size(void)
+{
+ uint32_t sz, da;
+ uint32_t *vt = (uint32_t *)0x20;
+
+ /* Replace the DABT handler. */
+ da = vt[4];
+ vt[4] = (uint32_t)&data_abort_memdetect_handler;
+
+ sz = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
+ writel(sz, HW_DIGCTRL_SCRATCH0);
+ writel(sz, HW_DIGCTRL_SCRATCH1);
+
+ /* Restore the old DABT handler. */
+ vt[4] = da;
+}
+
void mx28_mem_init(void)
{
struct mx28_clkctrl_regs *clkctrl_regs =
@@ -210,4 +235,6 @@ void mx28_mem_init(void)
early_delay(10000);
mx28_mem_setup_cpu_and_hbus();
+
+ mx28_mem_get_size();
}