sunxi: Allow booting from 128KB SD/eMMC offset
authorAndre Przywara <andre.przywara@arm.com>
Sun, 16 Dec 2018 02:04:58 +0000 (02:04 +0000)
committerJagan Teki <jagan@amarulasolutions.com>
Wed, 10 Apr 2019 10:04:32 +0000 (15:34 +0530)
On modern Allwinner SoCs (tested: H2+, A64, H5, H6) the BootROM can
actually load the SPL also from sector 256 (128KB) of an SD card or eMMC
chip. For more details, see [1].
In this case the boot source indicator (written at offset 0x28 of SRAM A1)
has bit 4 set, so it's 0x10 for SD card and 0x12 for eMMC.

Add those new values to the existing boot source check to allow booting
the SPL from those "high" disk offsets as well. For this to work, the
value of CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR needs to be adjusted,
for instance to 0x140 (right after the high SPL). Doing this dynamically
sounds desirable, but looks nasty to implement.

[1] https://groups.google.com/forum/#!topic/linux-sunxi/MaiijyaAFjk

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
arch/arm/include/asm/arch-sunxi/spl.h
arch/arm/mach-sunxi/board.c

index 4baba38b0045c4e327355c2a7d59f70fda748e50..8c916e8c752994199ea84397c072c8bb8117d685 100644 (file)
@@ -28,6 +28,8 @@
 #define SUNXI_BOOTED_FROM_NAND 1
 #define SUNXI_BOOTED_FROM_MMC2 2
 #define SUNXI_BOOTED_FROM_SPI  3
+#define SUNXI_BOOTED_FROM_MMC0_HIGH    0x10
+#define SUNXI_BOOTED_FROM_MMC2_HIGH    0x12
 
 /* boot head definition from sun4i boot code */
 struct boot_file_head {
index b74eaf2a0e474836ae776869dd1a3265a0a664ee..c6dd7b8e54b05c74c04394064cdb7d6139ec7a03 100644 (file)
@@ -240,10 +240,12 @@ uint32_t sunxi_get_boot_device(void)
        boot_source = readb(SPL_ADDR + 0x28);
        switch (boot_source) {
        case SUNXI_BOOTED_FROM_MMC0:
+       case SUNXI_BOOTED_FROM_MMC0_HIGH:
                return BOOT_DEVICE_MMC1;
        case SUNXI_BOOTED_FROM_NAND:
                return BOOT_DEVICE_NAND;
        case SUNXI_BOOTED_FROM_MMC2:
+       case SUNXI_BOOTED_FROM_MMC2_HIGH:
                return BOOT_DEVICE_MMC2;
        case SUNXI_BOOTED_FROM_SPI:
                return BOOT_DEVICE_SPI;