1
0
Fork 0

env_mmc: support overriding mmc dev from board code

This enables boards to choose where to/from the environment should be
saved/loaded. They can then for example support using the same device
(dynamically) from which the bootloader was launched to load and save
env data and do not have to define CONFIG_SYS_MMC_ENV_DEV statically.

In my use case, the environment needs to be on the same device I
booted from. It can be the eMMC or an optional SD card.
I therefore would override mmc_get_env_dev in the board code, read the
CPU registers to determine where we booted from and return the
corresponding device index.

Cc: Tom Rini <trini@konsulko.com>
Cc: Stephen Warren <swarren@nvidia.com>
Cc: Tim Harvey <tharvey@gateworks.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Hans de Goede <hdegoede@redhat.com>

Signed-off-by: Clemens Gruber <clemens.gruber@pqgruber.com>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
utp
Clemens Gruber 2016-01-20 15:43:37 +01:00 committed by Tom Rini
parent 0080931abf
commit e92029c0f4
1 changed files with 12 additions and 7 deletions

View File

@ -54,6 +54,11 @@ __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
return 0; return 0;
} }
__weak int mmc_get_env_dev(void)
{
return CONFIG_SYS_MMC_ENV_DEV;
}
int env_init(void) int env_init(void)
{ {
/* use default */ /* use default */
@ -74,7 +79,7 @@ static unsigned char env_mmc_orig_hwpart;
static int mmc_set_env_part(struct mmc *mmc) static int mmc_set_env_part(struct mmc *mmc)
{ {
uint part = mmc_get_env_part(mmc); uint part = mmc_get_env_part(mmc);
int dev = CONFIG_SYS_MMC_ENV_DEV; int dev = mmc_get_env_dev();
int ret = 0; int ret = 0;
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
@ -109,7 +114,7 @@ static const char *init_mmc_for_env(struct mmc *mmc)
static void fini_mmc_for_env(struct mmc *mmc) static void fini_mmc_for_env(struct mmc *mmc)
{ {
#ifdef CONFIG_SYS_MMC_ENV_PART #ifdef CONFIG_SYS_MMC_ENV_PART
int dev = CONFIG_SYS_MMC_ENV_DEV; int dev = mmc_get_env_dev();
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
dev = 0; dev = 0;
@ -140,7 +145,8 @@ static unsigned char env_flags;
int saveenv(void) int saveenv(void)
{ {
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV); int dev = mmc_get_env_dev();
struct mmc *mmc = find_mmc_device(dev);
u32 offset; u32 offset;
int ret, copy = 0; int ret, copy = 0;
const char *errmsg; const char *errmsg;
@ -167,8 +173,7 @@ int saveenv(void)
goto fini; goto fini;
} }
printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "", printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "", dev);
CONFIG_SYS_MMC_ENV_DEV);
if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) { if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
puts("failed\n"); puts("failed\n");
ret = 1; ret = 1;
@ -212,7 +217,7 @@ void env_relocate_spec(void)
int crc1_ok = 0, crc2_ok = 0; int crc1_ok = 0, crc2_ok = 0;
env_t *ep; env_t *ep;
int ret; int ret;
int dev = CONFIG_SYS_MMC_ENV_DEV; int dev = mmc_get_env_dev();
const char *errmsg = NULL; const char *errmsg = NULL;
ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1); ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1);
@ -298,7 +303,7 @@ void env_relocate_spec(void)
struct mmc *mmc; struct mmc *mmc;
u32 offset; u32 offset;
int ret; int ret;
int dev = CONFIG_SYS_MMC_ENV_DEV; int dev = mmc_get_env_dev();
const char *errmsg; const char *errmsg;
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD