spl: MMC U-Boot image load from raw partition

Raw images of U-Boot can be stored inside MMC partitions, so it makes sense to
read the partition table, looking for a partition number instead of using
a fixed sector address.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
Reviewed-by: Tom Rini <trini@ti.com>
[trini: Only add mmc_load_image_raw_partition() when
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION to avoid warning, add missing
conversion in spl_mmc_load_image()]
Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
Paul Kocialkowski 2014-11-08 23:14:56 +01:00 committed by Tom Rini
parent e2ccdf89a0
commit b97300b62f
2 changed files with 30 additions and 4 deletions

4
README
View File

@ -3660,6 +3660,10 @@ FIT uImage format:
Address and partition on the MMC to load U-Boot from Address and partition on the MMC to load U-Boot from
when the MMC is being used in raw mode. when the MMC is being used in raw mode.
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
Partition on the MMC to load U-Boot from when the MMC is being
used in raw mode
CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR
Sector to load kernel uImage from when MMC is being Sector to load kernel uImage from when MMC is being
used in raw mode (for Falcon mode) used in raw mode (for Falcon mode)

View File

@ -15,7 +15,7 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
static int mmc_load_image_raw(struct mmc *mmc, unsigned long sector) static int mmc_load_image_raw_sector(struct mmc *mmc, unsigned long sector)
{ {
unsigned long err; unsigned long err;
u32 image_size_sectors; u32 image_size_sectors;
@ -51,6 +51,22 @@ end:
return (err == 0); return (err == 0);
} }
#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
static int mmc_load_image_raw_partition(struct mmc *mmc, int partition)
{
disk_partition_t info;
if (get_partition_info(&mmc->block_dev, partition, &info)) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
printf("spl: partition error\n");
#endif
return -1;
}
return mmc_load_image_raw_sector(mmc, info.start);
}
#endif
#ifdef CONFIG_SPL_OS_BOOT #ifdef CONFIG_SPL_OS_BOOT
static int mmc_load_image_raw_os(struct mmc *mmc) static int mmc_load_image_raw_os(struct mmc *mmc)
{ {
@ -64,7 +80,8 @@ static int mmc_load_image_raw_os(struct mmc *mmc)
return -1; return -1;
} }
return mmc_load_image_raw(mmc, CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR); return mmc_load_image_raw_sector(mmc,
CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR);
} }
#endif #endif
@ -98,8 +115,13 @@ void spl_mmc_load_image(void)
#ifdef CONFIG_SPL_OS_BOOT #ifdef CONFIG_SPL_OS_BOOT
if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) if (spl_start_uboot() || mmc_load_image_raw_os(mmc))
#endif #endif
err = mmc_load_image_raw(mmc, #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
err = mmc_load_image_raw_partition(mmc,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION);
#else
err = mmc_load_image_raw_sector(mmc,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
#endif
#if defined(CONFIG_SPL_FAT_SUPPORT) || defined(CONFIG_SPL_EXT_SUPPORT) #if defined(CONFIG_SPL_FAT_SUPPORT) || defined(CONFIG_SPL_EXT_SUPPORT)
} else if (boot_mode == MMCSD_MODE_FS) { } else if (boot_mode == MMCSD_MODE_FS) {
debug("boot mode - FS\n"); debug("boot mode - FS\n");
@ -146,7 +168,7 @@ void spl_mmc_load_image(void)
#ifdef CONFIG_SPL_OS_BOOT #ifdef CONFIG_SPL_OS_BOOT
if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) if (spl_start_uboot() || mmc_load_image_raw_os(mmc))
#endif #endif
err = mmc_load_image_raw(mmc, err = mmc_load_image_raw_sector(mmc,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
#endif #endif
} else { } else {