ODROID-C5: board: load 'ODROID-BIOS.BIN' from boot storage

Signed-off-by: Dongjin Kim <tobetter@gmail.com>
Change-Id: If75c893e13e3aea35f8012ef4f25bc9a7bb773e3
diff --git a/board/amlogic/s7d_odroidc5/s7d_odroidc5.c b/board/amlogic/s7d_odroidc5/s7d_odroidc5.c
index e763fc5..6948c18 100644
--- a/board/amlogic/s7d_odroidc5/s7d_odroidc5.c
+++ b/board/amlogic/s7d_odroidc5/s7d_odroidc5.c
@@ -27,6 +27,9 @@
 #include <asm/amlogic/arch/usb.h>
 #include <asm/amlogic/arch/romboot.h>
 #include <asm/amlogic/arch/stick_mem.h>
+#include <fs.h>
+#include <blk.h>
+#include <mmc.h>
 
 #ifdef CONFIG_AML_VPU
 #include <amlogic/media/vpu/vpu.h>
@@ -49,6 +52,8 @@
 DECLARE_GLOBAL_DATA_PTR;
 extern int cc_statue, bc_status;
 
+int mmc_get_env_dev(void);
+
 /*
  * Internal function in 'drivers/amlogic/media/vout/hdmitx/hdmitx21/hdmi_param.c'
  */
@@ -170,6 +175,63 @@
 	return 0;
 }
 
+static int load_from_mmc(unsigned long addr, int devnum, int partnum, char *filename)
+{
+	int ret;
+	char buf[16];
+
+	snprintf(buf, sizeof(buf), "%d:%d", devnum, partnum);
+
+	ret = fs_set_blk_dev("mmc", buf, FS_TYPE_ANY);
+	if (!ret) {
+		loff_t len_read;
+		ret = fs_read(filename, addr, 0, 0, &len_read);
+		if (!ret) {
+			env_set_ulong("filesize", len_read);
+			printf("%llu bytes read\n", len_read);
+			return 0;
+		}
+	}
+
+	return ret;
+}
+
+int load_odroid_bios(void)
+{
+	const char *bootcmd = "cramfsload $loadaddr boot.scr; source $loadaddr";
+	unsigned long addr;
+	int n;
+	int ret;
+	struct blk_desc *dev_desc;
+	struct mmc *mmc = find_mmc_device(mmc_get_env_dev());
+	if (!mmc)
+		return -EIO;
+
+	dev_desc = mmc_get_blk_desc(mmc);
+	if (!dev_desc)
+		return -EIO;
+
+	addr = env_get_hex("cramfsaddr", 0);
+	if (!addr) {
+		addr = 0x38000000;
+		env_set_hex("cramfsaddr", addr);
+	}
+
+	/* Clear memory at $crarmfsaddr */
+	memset((void*)addr, 0, 256);
+
+	for (n = 1; n <= 3; n++) {
+		ret = load_from_mmc(addr, dev_desc->devnum, n, "ODROIDBIOS.BIN");
+		if (!ret) {
+			env_set_hex("devnum", dev_desc->devnum);
+			env_set("bootcmd", bootcmd);
+			return 0;
+		}
+	}
+
+	return -EIO;
+}
+
 int board_late_init(void)
 {
 	unsigned char chipid[16];
@@ -208,6 +270,8 @@
 		printf("buff: %s\n", buff);
 	}
 
+	load_odroid_bios();
+
 	return 0;
 }