Hi Haijun,

On Jan 10, 2014, at 7:52 AM, Haijun Zhang wrote:

> On BSC9131, BSC9132, P1010 : 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 V3:
>        - Define quirk in SOC specific file instead of code in driver
> changes for V2:
>       - Use 0xffffffffu instead of UINT_MAX
> 
> arch/powerpc/include/asm/config_mpc85xx.h |  3 +++
> board/freescale/common/sdhc_boot.c        | 29 +++++++++++++++++++++++++++++
> 2 files changed, 32 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/config_mpc85xx.h 
> b/arch/powerpc/include/asm/config_mpc85xx.h
> index 15affdc..e8bd76a 100644
> --- a/arch/powerpc/include/asm/config_mpc85xx.h
> +++ b/arch/powerpc/include/asm/config_mpc85xx.h
> @@ -152,6 +152,7 @@
> #define CONFIG_SYS_FSL_ERRATUM_A005125
> #define CONFIG_SYS_FSL_ERRATUM_I2C_A004447
> #define CONFIG_SYS_FSL_A004447_SVR_REV        0x10
> +#define CONFIG_ESDHC_HC_BLK_ADDR
> 
> /* P1011 is single core version of P1020 */
> #elif defined(CONFIG_P1011)
> @@ -552,6 +553,7 @@
> #define CONFIG_NAND_FSL_IFC
> #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
> #define CONFIG_SYS_FSL_ERRATUM_A005125
> +#define CONFIG_ESDHC_HC_BLK_ADDR
> 
> #elif defined(CONFIG_BSC9132)
> #define CONFIG_MAX_CPUS                       2
> @@ -575,6 +577,7 @@
> #define CONFIG_SYS_FSL_ERRATUM_A005125
> #define CONFIG_SYS_FSL_ERRATUM_I2C_A004447
> #define CONFIG_SYS_FSL_A004447_SVR_REV        0x11
> +#define CONFIG_ESDHC_HC_BLK_ADDR
> 
> #elif defined(CONFIG_PPC_T4240) || defined(CONFIG_PPC_T4160)
> #define CONFIG_E6500
> diff --git a/board/freescale/common/sdhc_boot.c 
> b/board/freescale/common/sdhc_boot.c
> index f6e2b2b..022f38b 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,33 @@ 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);
> 
> +#ifdef CONFIG_ESDHC_HC_BLK_ADDR
> +     /*
> +      * 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.
> +      */
> +     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;
> +#endif
> +
>       *env_addr = code_offset + code_len;
> 
>       free(tmp_buf);
> -- 
> 1.8.4.1
> 
> 

Acked-by: Pantelis Antoniou <pa...@antoniou-consulting.com>

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to