diff mbox

[U-Boot,v3,1/8] SPL: Add CONFIG_SUPPORT_EMMC_BOOT support to CONFIG_SPL_FRAMEWORK

Message ID 1391613865-13192-1-git-send-email-trini@ti.com
State Accepted
Delegated to: Pantelis Antoniou
Headers show

Commit Message

Tom Rini Feb. 5, 2014, 3:24 p.m. UTC
We use the switch CONFIG_SUPPORT_EMMC_BOOT today to enable some
additional features of the eMMC boot partitions.  Add support for being
told that we have booted from one of these partitions to the spl
framework and implement this on TI OMAP/related.

Cc: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Tom Rini <trini@ti.com>
---
Changes in v3:
- Rework eMMC boot detect logic for TI platforms, in the eMMC boot case
  we rely on non-FAT/RAW values being in bootmode.
---
 arch/arm/cpu/armv7/omap-common/boot-common.c |   13 ++++++++++++-
 common/spl/spl_mmc.c                         |   24 ++++++++++++++++++++++++
 include/spl.h                                |    1 +
 3 files changed, 37 insertions(+), 1 deletion(-)

Comments

Pantelis Antoniou Feb. 7, 2014, 3:59 p.m. UTC | #1
Hi Tom,

On Feb 5, 2014, at 5:24 PM, Tom Rini wrote:

> We use the switch CONFIG_SUPPORT_EMMC_BOOT today to enable some
> additional features of the eMMC boot partitions.  Add support for being
> told that we have booted from one of these partitions to the spl
> framework and implement this on TI OMAP/related.
> 
> Cc: Pantelis Antoniou <panto@antoniou-consulting.com>
> Signed-off-by: Tom Rini <trini@ti.com>
> ---
> Changes in v3:
> - Rework eMMC boot detect logic for TI platforms, in the eMMC boot case
>  we rely on non-FAT/RAW values being in bootmode.
> ---
> arch/arm/cpu/armv7/omap-common/boot-common.c |   13 ++++++++++++-
> common/spl/spl_mmc.c                         |   24 ++++++++++++++++++++++++
> include/spl.h                                |    1 +
> 3 files changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/boot-common.c b/arch/arm/cpu/armv7/omap-common/boot-common.c
> index 69fff32..52e0f4a 100644
> --- a/arch/arm/cpu/armv7/omap-common/boot-common.c
> +++ b/arch/arm/cpu/armv7/omap-common/boot-common.c
> @@ -66,7 +66,18 @@ u32 spl_boot_device(void)
> 
> u32 spl_boot_mode(void)
> {
> -	return gd->arch.omap_boot_params.omap_bootmode;
> +	u32 val = gd->arch.omap_boot_params.omap_bootmode;
> +
> +	if (val == MMCSD_MODE_RAW)
> +		return MMCSD_MODE_RAW;
> +	else if (val == MMCSD_MODE_FAT)
> +		return MMCSD_MODE_FAT;
> +	else
> +#ifdef CONFIG_SUPPORT_EMMC_BOOT
> +		return MMCSD_MODE_EMMCBOOT;
> +#else
> +		return MMCSD_MODE_UNDEFINED;
> +#endif
> }
> 
> void spl_board_init(void)
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index 13fbff0..fa6f891 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -111,6 +111,30 @@ void spl_mmc_load_image(void)
> 					CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION,
> 					CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME);
> #endif
> +#ifdef CONFIG_SUPPORT_EMMC_BOOT
> +	} else if (boot_mode == MMCSD_MODE_EMMCBOOT) {
> +		/*
> +		 * We need to check what the partition is configured to.
> +		 * 1 and 2 match up to boot0 / boot1 and 7 is user data
> +		 * which is the first physical partition (0).
> +		 */
> +		int part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
> +
> +		if (part == 7)
> +			part = 0;
> +
> +		if (mmc_switch_part(0, part)) {
> +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
> +			puts("MMC partition switch failed\n");
> +#endif
> +			hang();
> +		}
> +#ifdef CONFIG_SPL_OS_BOOT
> +		if (spl_start_uboot() || mmc_load_image_raw_os(mmc))
> +#endif
> +		err = mmc_load_image_raw(mmc,
> +			CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
> +#endif
> 	} else {
> #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
> 		puts("spl: wrong MMC boot mode\n");
> diff --git a/include/spl.h b/include/spl.h
> index 5e24856..dad00c0 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -16,6 +16,7 @@
> #define MMCSD_MODE_UNDEFINED	0
> #define MMCSD_MODE_RAW		1
> #define MMCSD_MODE_FAT		2
> +#define MMCSD_MODE_EMMCBOOT	3
> 
> struct spl_image_info {
> 	const char *name;
> -- 
> 1.7.9.5

Applied. Thanks.

Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
diff mbox

Patch

diff --git a/arch/arm/cpu/armv7/omap-common/boot-common.c b/arch/arm/cpu/armv7/omap-common/boot-common.c
index 69fff32..52e0f4a 100644
--- a/arch/arm/cpu/armv7/omap-common/boot-common.c
+++ b/arch/arm/cpu/armv7/omap-common/boot-common.c
@@ -66,7 +66,18 @@  u32 spl_boot_device(void)
 
 u32 spl_boot_mode(void)
 {
-	return gd->arch.omap_boot_params.omap_bootmode;
+	u32 val = gd->arch.omap_boot_params.omap_bootmode;
+
+	if (val == MMCSD_MODE_RAW)
+		return MMCSD_MODE_RAW;
+	else if (val == MMCSD_MODE_FAT)
+		return MMCSD_MODE_FAT;
+	else
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+		return MMCSD_MODE_EMMCBOOT;
+#else
+		return MMCSD_MODE_UNDEFINED;
+#endif
 }
 
 void spl_board_init(void)
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 13fbff0..fa6f891 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -111,6 +111,30 @@  void spl_mmc_load_image(void)
 					CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION,
 					CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME);
 #endif
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+	} else if (boot_mode == MMCSD_MODE_EMMCBOOT) {
+		/*
+		 * We need to check what the partition is configured to.
+		 * 1 and 2 match up to boot0 / boot1 and 7 is user data
+		 * which is the first physical partition (0).
+		 */
+		int part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
+
+		if (part == 7)
+			part = 0;
+
+		if (mmc_switch_part(0, part)) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+			puts("MMC partition switch failed\n");
+#endif
+			hang();
+		}
+#ifdef CONFIG_SPL_OS_BOOT
+		if (spl_start_uboot() || mmc_load_image_raw_os(mmc))
+#endif
+		err = mmc_load_image_raw(mmc,
+			CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
+#endif
 	} else {
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 		puts("spl: wrong MMC boot mode\n");
diff --git a/include/spl.h b/include/spl.h
index 5e24856..dad00c0 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -16,6 +16,7 @@ 
 #define MMCSD_MODE_UNDEFINED	0
 #define MMCSD_MODE_RAW		1
 #define MMCSD_MODE_FAT		2
+#define MMCSD_MODE_EMMCBOOT	3
 
 struct spl_image_info {
 	const char *name;