[U-Boot] [PATCH 3/3 V2] eSDHC: Calculate envaddr accroding to the address format

Pantelis Antoniou panto at antoniou-consulting.com
Thu Jan 9 11:46:15 CET 2014


Hi Haijun,

On Dec 11, 2013, at 7:35 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>
> ---
> changes for V2:
> 	- Use 0xffffffffu instead of UINT_MAX
> 
> board/freescale/common/sdhc_boot.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
> 
> diff --git a/board/freescale/common/sdhc_boot.c b/board/freescale/common/sdhc_boot.c
> index f6e2b2b..b5ae489 100644
> --- a/board/freescale/common/sdhc_boot.c
> +++ b/board/freescale/common/sdhc_boot.c
> @@ -16,6 +16,8 @@
> #define ESDHC_BOOT_IMAGE_SIZE	0x48
> #define ESDHC_BOOT_IMAGE_ADDR	0x50
> 
> +#define ESDHC_DEFAULT_ENVADDR	0x400
> +
> int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
> {
> 	u8 *tmp_buf;
> @@ -39,6 +41,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 > 0xFFFFFFFFU))
> +			*env_addr = ESDHC_DEFAULT_ENVADDR;
> +		else
> +			*env_addr = tmp;
> +
> +		free(tmp_buf);
> +
> +		return 0;
> +	}
> +

Yet another board quirk.

#define CONFIG_ESDHC_ENVADDR_QUIRK please, and put this block of code in a board/soc specific file.


> 	*env_addr = code_offset + code_len;
> 
> 	free(tmp_buf);
> -- 
> 1.8.4.1
> 
> 

Regards

-- Pantelis



More information about the U-Boot mailing list