diff options
author | Ye.Li <B37916@freescale.com> | 2014-06-26 19:25:09 +0800 |
---|---|---|
committer | Ye.Li <B37916@freescale.com> | 2014-06-30 11:36:41 +0800 |
commit | db5a2a8658a2bf9f8aff74b41b2b5d98cf6d226f (patch) | |
tree | f70c5bb35d29dc63b94bdafeee31cd723c516b0e /board/freescale | |
parent | b9bcfccc94d2abe9922ea311825e42888db1a3a7 (diff) | |
download | u-boot-imx-db5a2a8658a2bf9f8aff74b41b2b5d98cf6d226f.zip u-boot-imx-db5a2a8658a2bf9f8aff74b41b2b5d98cf6d226f.tar.gz u-boot-imx-db5a2a8658a2bf9f8aff74b41b2b5d98cf6d226f.tar.bz2 |
ENGR00320125 iMX6: Change to use dynamical mmcroot
The kernel changes to fix the mmcblk index with USDHC controllers
as below:
mmcblk0 ---> USDHC1
mmcblk1 ---> USDHC2
mmcblk2 ---> USDHC3
mmcblk3 ---> USDHC4
So in u-boot, the "mmcroot" must be updated together.
When booting from SD/MMC device, change the "mmcroot" to
dynamically set according to the boot USDHC controller.
It is the same mechanism as "mmcdev" used for kernel image loading.
Therefore, the uboot, kernel image, dtb and rootfs are required
in same SD/MMC card.
To disable the mmc dynamical detection, set the "mmcautodetect" to "no",
then "mmcroot" and "mmcdev" will not be overwritten.
When booting from other devices which needs to load kernel, dtb and
rootfs from SD/MMC card, their "mmcdev" reset vaule is
CONFIG_SYS_MMC_ENV_DEV and "mmcroot" reset value is CONFIG_MMCROOT.
Signed-off-by: Ye.Li <B37916@freescale.com>
(cherry picked from commit 7feb8533f52677f641e3ff88a996cd3f1f722708)
Diffstat (limited to 'board/freescale')
-rw-r--r-- | board/freescale/mx6qarm2/mx6qarm2.c | 33 | ||||
-rw-r--r-- | board/freescale/mx6qsabreauto/mx6qsabreauto.c | 36 | ||||
-rw-r--r-- | board/freescale/mx6sabresd/mx6sabresd.c | 33 | ||||
-rw-r--r-- | board/freescale/mx6slevk/mx6slevk.c | 33 | ||||
-rw-r--r-- | board/freescale/mx6sx_17x17_arm2/mx6sx_17x17_arm2.c | 41 | ||||
-rw-r--r-- | board/freescale/mx6sx_19x19_arm2/mx6sx_19x19_arm2.c | 34 | ||||
-rw-r--r-- | board/freescale/mx6sxsabresd/mx6sxsabresd.c | 36 |
7 files changed, 243 insertions, 3 deletions
diff --git a/board/freescale/mx6qarm2/mx6qarm2.c b/board/freescale/mx6qarm2/mx6qarm2.c index de76c99..9ae8aef 100644 --- a/board/freescale/mx6qarm2/mx6qarm2.c +++ b/board/freescale/mx6qarm2/mx6qarm2.c @@ -108,6 +108,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -121,6 +128,11 @@ int mmc_get_env_devno(void) return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ + return dev_no + 2; +} + int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; @@ -166,13 +178,34 @@ int board_mmc_init(bd_t *bis) return status; } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_env_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6qsabreauto/mx6qsabreauto.c b/board/freescale/mx6qsabreauto/mx6qsabreauto.c index ca2b290..9663013 100644 --- a/board/freescale/mx6qsabreauto/mx6qsabreauto.c +++ b/board/freescale/mx6qsabreauto/mx6qsabreauto.c @@ -341,6 +341,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -354,6 +361,14 @@ int mmc_get_env_devno(void) return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ + if (1 == dev_no) + dev_no = 2; + + return dev_no; +} + int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; @@ -408,13 +423,34 @@ int board_mmc_init(bd_t *bis) return 0; } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_env_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c index 4111e0d..2a4f425 100644 --- a/board/freescale/mx6sabresd/mx6sabresd.c +++ b/board/freescale/mx6sabresd/mx6sabresd.c @@ -457,6 +457,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -470,6 +477,11 @@ int mmc_get_env_devno(void) return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ + return dev_no + 1; +} + #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2) #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0) @@ -537,13 +549,34 @@ int board_mmc_init(bd_t *bis) return status; } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_env_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c index 752dad8..1f24f03 100644 --- a/board/freescale/mx6slevk/mx6slevk.c +++ b/board/freescale/mx6slevk/mx6slevk.c @@ -242,6 +242,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -249,6 +256,11 @@ int mmc_get_env_devno(void) return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ + return dev_no; +} + int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; @@ -313,13 +325,34 @@ int board_mmc_init(bd_t *bis) return 0; } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_env_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6sx_17x17_arm2/mx6sx_17x17_arm2.c b/board/freescale/mx6sx_17x17_arm2/mx6sx_17x17_arm2.c index a793049..8ddaded 100644 --- a/board/freescale/mx6sx_17x17_arm2/mx6sx_17x17_arm2.c +++ b/board/freescale/mx6sx_17x17_arm2/mx6sx_17x17_arm2.c @@ -235,6 +235,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -243,11 +250,24 @@ int mmc_get_env_devno(void) * see the comments in board_mmc_init function */ +#ifdef CONFIG_SYS_USE_SPINOR + dev_no -= 2; +#else dev_no--; +#endif return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ +#ifdef CONFIG_SYS_USE_SPINOR + return dev_no + 2; +#else + return dev_no + 1; +#endif +} + int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; @@ -349,13 +369,34 @@ int board_mmc_init(bd_t *bis) } #endif +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6sx_19x19_arm2/mx6sx_19x19_arm2.c b/board/freescale/mx6sx_19x19_arm2/mx6sx_19x19_arm2.c index 0b29b8c..70fe481 100644 --- a/board/freescale/mx6sx_19x19_arm2/mx6sx_19x19_arm2.c +++ b/board/freescale/mx6sx_19x19_arm2/mx6sx_19x19_arm2.c @@ -361,12 +361,25 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); u32 dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; return dev_no; } + +int mmc_map_to_kernel_blk(int dev_no) +{ + return dev_no; +} + int board_mmc_getcd(struct mmc *mmc) { return 1; /* Assume boot SD always present */ @@ -384,13 +397,34 @@ int board_mmc_init(bd_t *bis) return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } diff --git a/board/freescale/mx6sxsabresd/mx6sxsabresd.c b/board/freescale/mx6sxsabresd/mx6sxsabresd.c index c0f35f3..aecc00b 100644 --- a/board/freescale/mx6sxsabresd/mx6sxsabresd.c +++ b/board/freescale/mx6sxsabresd/mx6sxsabresd.c @@ -289,6 +289,13 @@ int mmc_get_env_devno(void) { u32 soc_sbmr = readl(SRC_BASE_ADDR + 0x4); int dev_no; + u32 bootsel; + + bootsel = (soc_sbmr & 0x000000FF) >> 6 ; + + /* If not boot from sd/mmc, use default value */ + if (bootsel != 1) + return CONFIG_SYS_MMC_ENV_DEV; /* BOOT_CFG2[3] and BOOT_CFG2[4] */ dev_no = (soc_sbmr & 0x00001800) >> 11; @@ -299,12 +306,14 @@ int mmc_get_env_devno(void) dev_no--; - if (dev_no < 0) - dev_no = CONFIG_SYS_MMC_ENV_DEV; - return dev_no; } +int mmc_map_to_kernel_blk(int dev_no) +{ + return dev_no + 1; +} + int board_mmc_getcd(struct mmc *mmc) { struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; @@ -379,13 +388,34 @@ int board_mmc_init(bd_t *bis) return 0; } +int check_mmc_autodetect(void) +{ + char *autodetect_str = getenv("mmcautodetect"); + + if ((autodetect_str != NULL) && + (strcmp(autodetect_str, "yes") == 0)) { + return 1; + } + + return 0; +} + void board_late_mmc_init(void) { char cmd[32]; + char mmcblk[32]; u32 dev_no = mmc_get_env_devno(); + if (!check_mmc_autodetect()) + return; + setenv_ulong("mmcdev", dev_no); + /* Set mmcblk env */ + sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", + mmc_map_to_kernel_blk(dev_no)); + setenv("mmcroot", mmcblk); + sprintf(cmd, "mmc dev %d", dev_no); run_command(cmd, 0); } |