Message ID | 1369250471-9851-3-git-send-email-swarren@wwwdotorg.org |
---|---|
State | Superseded |
Headers | show |
>>>>> "S" == Stephen Warren <swarren@wwwdotorg.org> writes:
S> From: Stephen Warren <swarren@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@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.
diff --git a/README b/README index b9936ca..4335730 100644 --- a/README +++ b/README @@ -3627,6 +3627,14 @@ but it can not erase, write this NOR flash by SRIO or PCIE interface. These two #defines specify the offset and size of the environment area within the specified MMC device. + If offset is positive (the usual case), it is treated as relative to + the start of the MMC partition. If offset is negative, it is treated + as relative to the end of the MMC partition. This can be useful if + your board may be fitted with different MMC devices, which have + different sizes for the MMC partitions, and you always want the + environment placed at the very end of the partition, to leave the + maximum possible space before it, to store other data. + These two values must be aligned to an MMC sector boundary. - CONFIG_ENV_OFFSET_REDUND (optional): @@ -3636,6 +3644,9 @@ but it can not erase, write this NOR flash by SRIO or PCIE interface. valid backup copy in case the other copy is corrupted, e.g. due to a power failure during a "saveenv" operation. + This value may also be positive or negative; this is handled in the + same way as CONFIG_ENV_OFFSET. + This value must also be aligned to an MMC sector boundary. - CONFIG_ENV_SIZE_REDUND (optional): diff --git a/common/env_mmc.c b/common/env_mmc.c index 9ca098f..5d3a769 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -53,11 +53,19 @@ DECLARE_GLOBAL_DATA_PTR; __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr) { - *env_addr = CONFIG_ENV_OFFSET; + s64 offset; + + offset = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND if (copy) - *env_addr = CONFIG_ENV_OFFSET_REDUND; + offset = CONFIG_ENV_OFFSET_REDUND; #endif + + if (offset < 0) + offset += mmc->capacity; + + *env_addr = offset; + return 0; }