[U-Boot] [PATCH V2 3/4] env_mmc: allow negative CONFIG_ENV_OFFSET
Peter Korsgaard
jacmet at sunsite.dk
Thu May 23 09:52:10 CEST 2013
>>>>> "S" == Stephen Warren <swarren at wwwdotorg.org> writes:
S> From: Stephen Warren <swarren at nvidia.com>
S> A negative value of CONFIG_ENV_OFFSET is treated as a backwards offset
S> from the end of the eMMC device/partition, rather than a forwards offset
S> from the start.
S> This is useful when a single board may be stuffed with different eMMC
S> devices, each of which has a different capacity, and you always want the
S> environment to be stored at the very end of the device (or eMMC boot
S> partition for example).
S> One example of this case is NVIDIA's Ventana reference board.
S> Signed-off-by: Stephen Warren <swarren at nvidia.com>
S> ---
S> v2: Also update README to describe the change.
S> ---
S> README | 11 +++++++++++
S> common/env_mmc.c | 12 ++++++++++--
S> 2 files changed, 21 insertions(+), 2 deletions(-)
S> diff --git a/README b/README
S> index b9936ca..4335730 100644
S> --- a/README
S> +++ b/README
S> @@ -3627,6 +3627,14 @@ but it can not erase, write this NOR flash by SRIO or PCIE interface.
S> These two #defines specify the offset and size of the environment
S> area within the specified MMC device.
S> + If offset is positive (the usual case), it is treated as relative to
S> + the start of the MMC partition. If offset is negative, it is treated
S> + as relative to the end of the MMC partition. This can be useful if
S> + your board may be fitted with different MMC devices, which have
S> + different sizes for the MMC partitions, and you always want the
S> + environment placed at the very end of the partition, to leave the
S> + maximum possible space before it, to store other data.
S> +
S> These two values must be aligned to an MMC sector boundary.
S> - CONFIG_ENV_OFFSET_REDUND (optional):
S> @@ -3636,6 +3644,9 @@ but it can not erase, write this NOR flash by SRIO or PCIE interface.
S> valid backup copy in case the other copy is corrupted, e.g. due
S> to a power failure during a "saveenv" operation.
S> + This value may also be positive or negative; this is handled in the
S> + same way as CONFIG_ENV_OFFSET.
S> +
S> This value must also be aligned to an MMC sector boundary.
S> - CONFIG_ENV_SIZE_REDUND (optional):
S> diff --git a/common/env_mmc.c b/common/env_mmc.c
S> index 9ca098f..5d3a769 100644
S> --- a/common/env_mmc.c
S> +++ b/common/env_mmc.c
S> @@ -53,11 +53,19 @@ DECLARE_GLOBAL_DATA_PTR;
S> __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
S> {
S> - *env_addr = CONFIG_ENV_OFFSET;
S> + s64 offset;
S> +
S> + offset = CONFIG_ENV_OFFSET;
S> #ifdef CONFIG_ENV_OFFSET_REDUND
S> if (copy)
S> - *env_addr = CONFIG_ENV_OFFSET_REDUND;
S> + offset = CONFIG_ENV_OFFSET_REDUND;
S> #endif
S> +
S> + if (offset < 0)
S> + offset += mmc->capacity;
S> +
S> + *env_addr = offset;
S> +
This is quite a mix of data types (u32/s64/u64). Not directly related to
this patch, but it would imho be nicer to let env_mmc work directly with
block numbers instead of bytes, that way stuff would also work with >4GB
MMCs.
--
Bye, Peter Korsgaard
More information about the U-Boot
mailing list