|
@@ -277,15 +277,29 @@ uint32_t sunxi_get_boot_device(void)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SPL_BUILD
|
|
|
+static u32 sunxi_get_spl_size(void)
|
|
|
+{
|
|
|
+ if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return readl(SPL_ADDR + 0x10);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* The eGON SPL image can be located at 8KB or at 128KB into an SD card or
|
|
|
* an eMMC device. The boot source has bit 4 set in the latter case.
|
|
|
* By adding 120KB to the normal offset when booting from a "high" location
|
|
|
* we can support both cases.
|
|
|
+ * Also U-Boot proper is located at least 32KB after the SPL, but will
|
|
|
+ * immediately follow the SPL if that is bigger than that.
|
|
|
*/
|
|
|
-unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc)
|
|
|
+unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
|
|
|
+ unsigned long raw_sect)
|
|
|
{
|
|
|
- unsigned long sector = CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR;
|
|
|
+ unsigned long spl_size = sunxi_get_spl_size();
|
|
|
+ unsigned long sector;
|
|
|
+
|
|
|
+ sector = max(raw_sect, spl_size / 512);
|
|
|
|
|
|
switch (sunxi_get_boot_source()) {
|
|
|
case SUNXI_BOOTED_FROM_MMC0_HIGH:
|