[U-Boot] [PATCH v2] Add support for eMMC environment in boot partition
Jaehoon Chung
jh80.chung at samsung.com
Mon Oct 10 07:51:26 CEST 2016
Hi Sergey,
On 10/09/2016 01:49 PM, Sergey Kubushyn wrote:
> This allows to place U-Boot environment into eMMC boot partition thus
> saving space on user partition for the OS (or whatever.) When booting
> off of eMMC many (all?) MCUs can use dedicated boot0/boot1 partitions
> to boot so U-Boot (or SPL) is written to one (or both) such partitions.
> When such boot configuration is used it makes sense to place environment
> in the same partition where the U-Boot itself is so the entire user
> partition is available for the OS.
I didn't read the entire comments of previous version. (Will read)
And this patch should be dead code..there is no case with using patch.
Do you have a plan to add other patch?
i don't know what makes sense for this..
And this concept should be dangerous...If overwrite to wrong location. it can be bricked.
Well, i need to consider it's really useful to locate the environment into boot partition.
So I didn't add the comment about code side.
Best Regards,
Jaehoon Chung
>
> It might be not well polished yet but it is a simple patch that can be
> reworked later.
>
> It uses 4 Kconfig variables right now which probably belong to the board
> Kconfig. Those are:
>
> CONFIG_ENV_IN_EMMC_BOOT -- tells that environment is in eMMC boot
> partition if defined
>
> CONFIG_EMMC_ENV_PART -- tells which boot partition environment should be
> stored in (either 1 or 2)
>
> CONFIG_EMMC_BOOT_PART -- which boot partition will be used by eMMC to
> read U-Boot/SPL binary for boot protocol (either 1 or 2.) That can be
> different from the environment partition
>
> CONFIG_EMMC_BOOT_ACK -- tells that eMMC should provide boot ACKs if
> defined
>
> Here is an excerpt from actual board Kconfig:
>
> === Cut ===
> config ENV_IN_EMMC_BOOT
> bool "Environment is in eMMC boot partition"
> default y
>
> config EMMC_ENV_PART
> hex "eMMC boot partition used for environment (1 or 2)"
> default 1
>
> config EMMC_BOOT_PART
> hex "eMMC boot partition the board boots off of (1 or 2)"
> default 1
>
> config EMMC_BOOT_ACK
> bool "Enable ACKs from eMMC when booting off of boot partition"
> default n
> === Cut ===
>
> Signed-off-by: Sergey Kubushyn <ksi at koi8.net>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Pantelis Antoniou <panto at antoniou-consulting.com>
> ---
> common/env_mmc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/common/env_mmc.c b/common/env_mmc.c
> index 16f6a17..3b2477c 100644
> --- a/common/env_mmc.c
> +++ b/common/env_mmc.c
> @@ -68,6 +68,45 @@ int env_init(void)
> return 0;
> }
>
> +#ifdef CONFIG_ENV_IN_EMMC_BOOT
> +__weak u8 mmc_get_env_part(struct mmc *mmc)
> +{
> + return CONFIG_EMMC_ENV_PART;
> +}
> +
> +__weak u8 mmc_get_boot_part(struct mmc *mmc)
> +{
> + return CONFIG_EMMC_BOOT_PART;
> +}
> +
> +__weak u8 mmc_get_boot_ack(struct mmc *mmc)
> +{
> +#ifdef CONFIG_EMMC_BOOT_ACK
> + return 1;
> +#else
> + return 0;
> +#endif
> +}
> +
> +static int mmc_set_env_part(struct mmc *mmc)
> +{
> + int ret = 0;
> + u8 boot_part = 0;
> + u8 boot_ack = 0;
> + u8 env_part = 0;
> +
> + boot_part = mmc_get_boot_part(mmc);
> + boot_ack = mmc_get_boot_ack(mmc);
> + env_part = mmc_get_env_part(mmc);
> +
> + ret = mmc_set_part_conf(mmc, boot_ack, boot_part, env_part);
> +
> + if (ret)
> + puts("MMC switch to boot partition failed\n");
> +
> + return ret;
> +}
> +#else
> #ifdef CONFIG_SYS_MMC_ENV_PART
> __weak uint mmc_get_env_part(struct mmc *mmc)
> {
> @@ -96,6 +135,7 @@ static int mmc_set_env_part(struct mmc *mmc)
> #else
> static inline int mmc_set_env_part(struct mmc *mmc) {return 0; };
> #endif
> +#endif
>
> static const char *init_mmc_for_env(struct mmc *mmc)
> {
> @@ -113,6 +153,15 @@ static const char *init_mmc_for_env(struct mmc *mmc)
>
> static void fini_mmc_for_env(struct mmc *mmc)
> {
> +#ifdef CONFIG_ENV_IN_EMMC_BOOT
> + u8 boot_part = 0;
> + u8 boot_ack = 0;
> +
> + boot_part = mmc_get_boot_part(mmc);
> + boot_ack = mmc_get_boot_ack(mmc);
> +
> + mmc_set_part_conf(mmc, boot_ack, boot_part, 0);
> +#else
> #ifdef CONFIG_SYS_MMC_ENV_PART
> int dev = mmc_get_env_dev();
>
> @@ -121,6 +170,7 @@ static void fini_mmc_for_env(struct mmc *mmc)
> #endif
> blk_select_hwpart_devnum(IF_TYPE_MMC, dev, env_mmc_orig_hwpart);
> #endif
> +#endif
> }
>
> #ifdef CONFIG_CMD_SAVEENV
>
More information about the U-Boot
mailing list