|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright 2006,2009 Freescale Semiconductor, Inc.
|
|
|
+ * Copyright 2006,2009-2010 Freescale Semiconductor, Inc.
|
|
|
* Jeff Brown
|
|
|
* Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
|
|
|
*
|
|
@@ -197,3 +197,37 @@ void mpc86xx_reginfo(void)
|
|
|
printf("\tBR7\t0x%08X\tOR7\t0x%08X \n", in_be32(&lbc->br7), in_be32(&lbc->or7));
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Set the DDR BATs to reflect the actual size of DDR.
|
|
|
+ *
|
|
|
+ * dram_size is the actual size of DDR, in bytes
|
|
|
+ *
|
|
|
+ * Note: we assume that CONFIG_MAX_MEM_MAPPED is 2G or smaller as we only
|
|
|
+ * are using a single BAT to cover DDR.
|
|
|
+ *
|
|
|
+ * If this is not true, (e.g. CONFIG_MAX_MEM_MAPPED is 2GB but HID0_XBSEN
|
|
|
+ * is not defined) then we might have a situation where U-Boot will attempt
|
|
|
+ * to relocated itself outside of the region mapped by DBAT0.
|
|
|
+ * This will cause a machine check.
|
|
|
+ *
|
|
|
+ * Currently we are limited to power of two sized DDR since we only use a
|
|
|
+ * single bat. If a non-power of two size is used that is less than
|
|
|
+ * CONFIG_MAX_MEM_MAPPED u-boot will crash.
|
|
|
+ *
|
|
|
+ */
|
|
|
+void setup_ddr_bat(phys_addr_t dram_size)
|
|
|
+{
|
|
|
+ unsigned long batu, bl;
|
|
|
+
|
|
|
+ bl = TO_BATU_BL(min(dram_size, CONFIG_MAX_MEM_MAPPED));
|
|
|
+
|
|
|
+ if (BATU_SIZE(bl) != dram_size) {
|
|
|
+ u64 sz = (u64)dram_size - BATU_SIZE(bl);
|
|
|
+ print_size(sz, " left unmapped\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ batu = bl | BATU_VS | BATU_VP;
|
|
|
+ write_bat(DBAT0, batu, CONFIG_SYS_DBAT0L);
|
|
|
+ write_bat(IBAT0, batu, CONFIG_SYS_IBAT0L);
|
|
|
+}
|