[U-Boot] [PATCH 3/3] eSDHC: Calculate envaddr accroding to the address format
Pantelis Antoniou
pantelis.antoniou at gmail.com
Sun Dec 8 12:48:24 CET 2013
Hi Haijun,
On Dec 2, 2013, at 7:25 AM, Haijun Zhang wrote:
> On BSC9131 and BSC9132: For High Capacity SD Cards (> 2 GBytes), the
> 32-bit source address specifies the memory address in block address
> format. Block length is fixed to 512 bytes as per the SD High Capacity
> specification. So we need to convert the block address format
> to byte address format to calculate the envaddr.
>
> If there is no enough space for environment variables or envaddr
> is larger than 4GiB, we relocate the envaddr to 0x400. The address
> relocated is in the front of the first partition that is assigned
> for sdboot only.
>
> Signed-off-by: Haijun Zhang <Haijun.Zhang at freescale.com>
> ---
> board/freescale/common/sdhc_boot.c | 31 +++++++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/board/freescale/common/sdhc_boot.c b/board/freescale/common/sdhc_boot.c
> index f6e2b2b..9dc9988 100644
> --- a/board/freescale/common/sdhc_boot.c
> +++ b/board/freescale/common/sdhc_boot.c
> @@ -16,6 +16,9 @@
> #define ESDHC_BOOT_IMAGE_SIZE 0x48
> #define ESDHC_BOOT_IMAGE_ADDR 0x50
>
> +#define ESDHC_DEFAULT_ENVADDR 0x400
> +#define UINT_MAX 0xFFFFFFFF
> +
^ Definition of UINT_MAX in a c file?
> int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
> {
> u8 *tmp_buf;
> @@ -39,6 +42,34 @@ int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
> /* Get the code size from offset 0x48 */
> code_len = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_SIZE);
>
> + /*
> + * On soc BSC9131, BSC9132:
> + * In High Capacity SD Cards (> 2 GBytes), the 32-bit source address and
> + * code length of these soc specify the memory address in block address
> + * format. Block length is fixed to 512 bytes as per the SD High
> + * Capacity specification.
> + */
> + if ((SVR_SOC_VER(get_svr()) == SVR_9131) ||
> + (SVR_SOC_VER(get_svr()) == SVR_9132)) {
> + u64 tmp;
> +
> + if (mmc->high_capacity) {
> + tmp = (u64)code_offset * blklen;
> + tmp += code_len * blklen;
> + } else
> + tmp = code_offset + code_len;
> +
> + if (((tmp + CONFIG_ENV_SIZE) > mmc->capacity) ||
> + (tmp > UINT_MAX))
Lose the parentheses and test against 0xffffffffU
> + *env_addr = ESDHC_DEFAULT_ENVADDR;
> + else
> + *env_addr = tmp;
> +
> + free(tmp_buf);
> +
> + return 0;
> + }
> +
> *env_addr = code_offset + code_len;
>
> free(tmp_buf);
> --
> 1.8.4
>
Regards
-- Pantelis
More information about the U-Boot
mailing list