From: Stefano Babic <sbabic@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/5] common: env_mmc: support loading env from different cards
Date: Tue, 15 Dec 2015 15:58:47 +0100 [thread overview]
Message-ID: <56702AA7.3090906@denx.de> (raw)
In-Reply-To: <1450167975-13265-1-git-send-email-Peng.Fan@freescale.com>
Hi Peng,
On 15/12/2015 09:26, Peng Fan wrote:
> Some boards support booting from different SD card slots.
> For example, mx6dpsabresd board supports booting from SD2,
> SD3, EMMC4, using different boot switch. And the index
> numbers are SD2(0), SD3(1), EMMC4(2).
> But CONFIG_SYS_MMC_ENV_DEV is hardcoded to 1(for SD3), so when
> booting from SD2(using 0), uboot complains "MMC: no card present",
> since there is no card in SD3 slot.
>
> This patch introduces a weak function which still returns
> CONFIG_SYS_MMC_ENV_DEV to avoid break other boards. Then
> different boards can implement mmc_get_env_devno to read
> env from the correct sd/emmc.
>
> Signed-off-by: Peng Fan <Peng.Fan@freescale.com>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Tim Harvey <tharvey@gateworks.com>
> Cc: Hans de Goede <hdegoede@redhat.com>
> ---
> common/env_mmc.c | 22 ++++++++++++++--------
> 1 file changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/common/env_mmc.c b/common/env_mmc.c
> index 9639822..d2e2a40 100644
> --- a/common/env_mmc.c
> +++ b/common/env_mmc.c
> @@ -63,6 +63,11 @@ int env_init(void)
> return 0;
> }
>
> +__weak uint mmc_get_env_devno(void)
> +{
> + return CONFIG_SYS_MMC_ENV_DEV;
> +}
> +
> #ifdef CONFIG_SYS_MMC_ENV_PART
> __weak uint mmc_get_env_part(struct mmc *mmc)
> {
> @@ -72,7 +77,7 @@ __weak uint mmc_get_env_part(struct mmc *mmc)
> static int mmc_set_env_part(struct mmc *mmc)
> {
> uint part = mmc_get_env_part(mmc);
> - int dev = CONFIG_SYS_MMC_ENV_DEV;
> + int dev = mmc_get_env_devno();
> int ret = 0;
mmc_get_env_devno() is moved inside the board file. Anyway, for i.MX6
this means to check in the SRC register to get which is the boot device.
Your board functions differ just for the number they return, depending
how many controllers are initialized.
The check routine can be factorized and moved to imx-common. The devnum
could then be extracted from a table (maybe usdhc_cfg present in all
boards).
>
> #ifdef CONFIG_SPL_BUILD
> @@ -108,7 +113,7 @@ static const char *init_mmc_for_env(struct mmc *mmc)
> static void fini_mmc_for_env(struct mmc *mmc)
> {
> #ifdef CONFIG_SYS_MMC_ENV_PART
> - int dev = CONFIG_SYS_MMC_ENV_DEV;
> + int dev = mmc_get_env_devno();
>
> #ifdef CONFIG_SPL_BUILD
> dev = 0;
> @@ -127,7 +132,7 @@ static inline int write_env(struct mmc *mmc, unsigned long size,
> blk_start = ALIGN(offset, mmc->write_bl_len) / mmc->write_bl_len;
> blk_cnt = ALIGN(size, mmc->write_bl_len) / mmc->write_bl_len;
>
> - n = mmc->block_dev.block_write(CONFIG_SYS_MMC_ENV_DEV, blk_start,
> + n = mmc->block_dev.block_write(mmc_get_env_devno(), blk_start,
> blk_cnt, (u_char *)buffer);
>
> return (n == blk_cnt) ? 0 : -1;
> @@ -140,7 +145,8 @@ static unsigned char env_flags;
> int saveenv(void)
> {
> ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
> - struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
> + int mmc_env_devno = mmc_get_env_devno();
> + struct mmc *mmc = find_mmc_device(mmc_env_devno);
> u32 offset;
> int ret, copy = 0;
> const char *errmsg;
> @@ -168,7 +174,7 @@ int saveenv(void)
> }
>
> printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "",
> - CONFIG_SYS_MMC_ENV_DEV);
> + mmc_env_devno);
> if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
> puts("failed\n");
> ret = 1;
> @@ -192,7 +198,7 @@ static inline int read_env(struct mmc *mmc, unsigned long size,
> unsigned long offset, const void *buffer)
> {
> uint blk_start, blk_cnt, n;
> - int dev = CONFIG_SYS_MMC_ENV_DEV;
> + int dev = mmc_get_env_devno();
>
> #ifdef CONFIG_SPL_BUILD
> dev = 0;
> @@ -216,7 +222,7 @@ void env_relocate_spec(void)
> int crc1_ok = 0, crc2_ok = 0;
> env_t *ep;
> int ret;
> - int dev = CONFIG_SYS_MMC_ENV_DEV;
> + int dev = mmc_get_env_devno();
> const char *errmsg = NULL;
>
> ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1);
> @@ -302,7 +308,7 @@ void env_relocate_spec(void)
> struct mmc *mmc;
> u32 offset;
> int ret;
> - int dev = CONFIG_SYS_MMC_ENV_DEV;
> + int dev = mmc_get_env_devno();
> const char *errmsg;
>
> #ifdef CONFIG_SPL_BUILD
>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
next prev parent reply other threads:[~2015-12-15 14:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-15 8:26 [U-Boot] [PATCH 1/5] common: env_mmc: support loading env from different cards Peng Fan
2015-12-15 8:26 ` [U-Boot] [PATCH 2/5] imx: mx6sabresd: implement mmc_get_env_devno Peng Fan
2015-12-15 8:26 ` [U-Boot] [PATCH 3/5] imx: mx6qarm2: " Peng Fan
2015-12-15 8:26 ` [U-Boot] [PATCH 4/5] imx: mx6slevk: " Peng Fan
2015-12-15 8:26 ` [U-Boot] [PATCH 5/5] imx: mx6sxsabresd: " Peng Fan
2015-12-15 14:58 ` Stefano Babic [this message]
2015-12-16 2:04 ` [U-Boot] [PATCH 1/5] common: env_mmc: support loading env from different cards Peng Fan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56702AA7.3090906@denx.de \
--to=sbabic@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox