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.zh...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot