summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/boot.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-11-29 12:36:57 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-12-06 13:43:29 +0100
commit77fd727b8907f0a94bbe308fb023d4fb7258306c (patch)
tree600c2c8dd71282a2c48f4a703828a1c8063ca5d6 /arch/arm/mach-imx/boot.c
parent8e9a1d99437cff633e370677faa782604fa39238 (diff)
downloadbarebox-77fd727b8907f0a94bbe308fb023d4fb7258306c.tar.gz
barebox-77fd727b8907f0a94bbe308fb023d4fb7258306c.tar.xz
ARM i.MX6: save boot location
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-imx/boot.c')
-rw-r--r--arch/arm/mach-imx/boot.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c
index ae7c48b2ea..8c7f8eefa3 100644
--- a/arch/arm/mach-imx/boot.c
+++ b/arch/arm/mach-imx/boot.c
@@ -218,3 +218,63 @@ int imx53_boot_save_loc(void __iomem *src_base)
return 0;
}
+
+#define IMX6_SRC_SBMR1 0x04
+#define IMX6_SRC_SBMR2 0x1c
+
+int imx6_boot_save_loc(void __iomem *src_base)
+{
+ enum imx_bootsource src = bootsource_unknown;
+ uint32_t sbmr2 = readl(src_base + IMX6_SRC_SBMR2) >> 24;
+ uint32_t cfg1 = readl(src_base + IMX6_SRC_SBMR1) & 0xff;
+ uint32_t boot_cfg_4_2_0;
+ int boot_mode;
+
+ boot_mode = (sbmr2 >> 24) & 0x3;
+
+ switch (boot_mode) {
+ case 0: /* Fuses, fall through */
+ case 2: /* internal boot */
+ goto internal_boot;
+ case 1: /* Serial Downloader */
+ src = bootsource_serial;
+ break;
+ case 3: /* reserved */
+ break;
+ };
+
+ imx_set_bootsource(src);
+
+ return 0;
+
+internal_boot:
+
+ switch (cfg1 >> 4) {
+ case 2:
+ src = bootsource_hd;
+ break;
+ case 3:
+ boot_cfg_4_2_0 = (cfg1 >> 16) & 0x7;
+
+ if (boot_cfg_4_2_0 > 4)
+ src = bootsource_i2c;
+ else
+ src = bootsource_spi;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ src = bootsource_mmc;
+ break;
+ default:
+ break;
+ }
+
+ if (cfg1 & (1 << 7))
+ src = bootsource_nand;
+
+ imx_set_bootsource(src);
+
+ return 0;
+}