]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - board/denx/m28evk/mem_init.c
M28: Add memory detection into SPL
[karo-tx-uboot.git] / board / denx / m28evk / mem_init.c
index 066fe0d1a4d70a77d4b4353082b6b7ee01d67e84..17d1f9b6a1644d90ebea21f16919e90c2273fbe5 100644 (file)
@@ -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();
 }