summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDipen Dudhat <dipen.dudhat@freescale.com>2009-10-29 22:34:03 +0530
committerScott Sweeny <scott.sweeny@timesys.com>2010-11-10 14:52:24 -0500
commit9a780f26955495de39f1bff510ca5d19101e5e73 (patch)
treeef760e5f9bc5bc5386ffd870f2f0bb733a4d4376
parenta9bb9897a88b1ac1611b6b0415fd36ac1bfb1978 (diff)
Get the Address for env on SD Card for SD Boot on P1 and P2 RDB Platforms
Both the save env and load env operation will call this function to get the address of env on the SDCard, so the user can control where to put the env freely. Signed-off-by: Dipen Dudhat <dipen.dudhat@freescale.com> Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
-rw-r--r--board/freescale/p1_p2_rdb/p1_p2_rdb.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/board/freescale/p1_p2_rdb/p1_p2_rdb.c b/board/freescale/p1_p2_rdb/p1_p2_rdb.c
index d34a6e71b2..2fa30c34de 100644
--- a/board/freescale/p1_p2_rdb/p1_p2_rdb.c
+++ b/board/freescale/p1_p2_rdb/p1_p2_rdb.c
@@ -33,6 +33,8 @@
#include <tsec.h>
#include <vsc7385.h>
#include <netdev.h>
+#include <mmc.h>
+#include <malloc.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -245,3 +247,47 @@ void board_lmb_reserve(struct lmb *lmb)
cpu_mp_lmb_reserve(lmb);
}
#endif
+
+#if defined(CONFIG_MMC)
+/*
+ * The environment variables are written to just after the u-boot image
+ * on SDCard, so we must read the MBR to get the start address and code
+ * length of the u-boot image, then calculate the address of the env.
+ */
+#define ESDHC_BOOT_IMAGE_SIZE 0x48
+#define ESDHC_BOOT_IMAGE_ADDR 0x50
+
+int mmc_get_env_addr(int dev, u32 *env_addr)
+{
+ int ret;
+ u8 *tmp_buf;
+ u32 blklen, code_offset, code_len;
+ struct mmc *mmc = find_mmc_device(dev);
+
+ mmc_init(mmc);
+
+ blklen = mmc->read_bl_len;
+ tmp_buf = malloc(blklen);
+ if (!tmp_buf)
+ return 1;
+
+ /* read out the first block, get the config data information */
+ ret = mmc_read(mmc, 0, tmp_buf, blklen);
+ if (ret) {
+ free(tmp_buf);
+ return 1;
+ }
+
+ /* Get the Source Address, from offset 0x50 */
+ code_offset = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_ADDR);
+
+ /* Get the code size from offset 0x48 */
+ code_len = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_SIZE);
+
+ *env_addr = code_offset + code_len;
+
+ free(tmp_buf);
+
+ return 0;
+}
+#endif