mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-20 20:04:46 +00:00
env: Save environment at the end of an MMC partition
Allow the platform to define a partition by name at the end of which the environment data will be located. Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
This commit is contained in:
parent
b12907f279
commit
c9e87ba665
2 changed files with 67 additions and 4 deletions
|
@ -21,6 +21,15 @@ u-boot,efi-partition-entries-offset
|
||||||
|
|
||||||
This setting will override any values configured via Kconfig.
|
This setting will override any values configured via Kconfig.
|
||||||
|
|
||||||
|
u-boot,mmc-env-partition
|
||||||
|
if present, the environment shall be placed at the last
|
||||||
|
CONFIG_ENV_SIZE blocks of the partition on the
|
||||||
|
CONFIG_SYS_MMC_ENV_DEV.
|
||||||
|
|
||||||
|
if u-boot,mmc-env-offset* is present, this setting will take
|
||||||
|
precedence. In that case, only if the partition is not found,
|
||||||
|
mmc-env-offset* will be tried.
|
||||||
|
|
||||||
u-boot,mmc-env-offset
|
u-boot,mmc-env-offset
|
||||||
u-boot,mmc-env-offset-redundant
|
u-boot,mmc-env-offset-redundant
|
||||||
If present, the values of the 'u-boot,mmc-env-offset' and/or
|
If present, the values of the 'u-boot,mmc-env-offset' and/or
|
||||||
|
|
62
env/mmc.c
vendored
62
env/mmc.c
vendored
|
@ -15,9 +15,13 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <memalign.h>
|
#include <memalign.h>
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
|
#include <part.h>
|
||||||
#include <search.h>
|
#include <search.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define __STR(X) #X
|
||||||
|
#define STR(X) __STR(X)
|
||||||
|
|
||||||
#if defined(CONFIG_ENV_SIZE_REDUND) && \
|
#if defined(CONFIG_ENV_SIZE_REDUND) && \
|
||||||
(CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE)
|
(CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE)
|
||||||
#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE
|
#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE
|
||||||
|
@ -30,18 +34,68 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
|
static inline int mmc_offset_try_partition(const char *str, s64 *val)
|
||||||
|
{
|
||||||
|
disk_partition_t info;
|
||||||
|
struct blk_desc *desc;
|
||||||
|
int len, i, ret;
|
||||||
|
|
||||||
|
ret = blk_get_device_by_str("mmc", STR(CONFIG_SYS_MMC_ENV_DEV), &desc);
|
||||||
|
if (ret < 0)
|
||||||
|
return (ret);
|
||||||
|
|
||||||
|
for (i = 1;;i++) {
|
||||||
|
ret = part_get_info(desc, i, &info);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (!strncmp((const char *)info.name, str, sizeof(str)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* round up to info.blksz */
|
||||||
|
len = (CONFIG_ENV_SIZE + info.blksz - 1) & ~(info.blksz - 1);
|
||||||
|
|
||||||
|
/* use the top of the partion for the environment */
|
||||||
|
*val = (info.start + info.size - 1) - len / info.blksz;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline s64 mmc_offset(int copy)
|
static inline s64 mmc_offset(int copy)
|
||||||
{
|
{
|
||||||
const char *propname = "u-boot,mmc-env-offset";
|
const struct {
|
||||||
s64 defvalue = CONFIG_ENV_OFFSET;
|
const char *offset_redund;
|
||||||
|
const char *partition;
|
||||||
|
const char *offset;
|
||||||
|
} dt_prop = {
|
||||||
|
.offset_redund = "u-boot,mmc-env-offset-redundant",
|
||||||
|
.partition = "u-boot,mmc-env-partition",
|
||||||
|
.offset = "u-boot,mmc-env-offset",
|
||||||
|
};
|
||||||
|
s64 val, defvalue;
|
||||||
|
const char *propname;
|
||||||
|
const char *str;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* look for the partition in mmc CONFIG_SYS_MMC_ENV_DEV */
|
||||||
|
str = fdtdec_get_config_string(gd->fdt_blob, dt_prop.partition);
|
||||||
|
if (str) {
|
||||||
|
/* try to place the environment at end of the partition */
|
||||||
|
err = mmc_offset_try_partition(str, &val);
|
||||||
|
if (!err)
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
defvalue = CONFIG_ENV_OFFSET;
|
||||||
|
propname = dt_prop.offset;
|
||||||
|
|
||||||
#if defined(CONFIG_ENV_OFFSET_REDUND)
|
#if defined(CONFIG_ENV_OFFSET_REDUND)
|
||||||
if (copy) {
|
if (copy) {
|
||||||
propname = "u-boot,mmc-env-offset-redundant";
|
|
||||||
defvalue = CONFIG_ENV_OFFSET_REDUND;
|
defvalue = CONFIG_ENV_OFFSET_REDUND;
|
||||||
|
propname = dt_prop.offset_redund;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue);
|
return fdtdec_get_config_int(gd->fdt_blob, propname, defvalue);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Add table
Reference in a new issue