colibri_imx7_emmc: add Colibri iMX7D 1GB (eMMC) module support
authorStefan Agner <stefan.agner@toradex.com>
Mon, 6 Aug 2018 07:19:19 +0000 (09:19 +0200)
committerStefano Babic <sbabic@denx.de>
Tue, 4 Sep 2018 06:47:23 +0000 (08:47 +0200)
This commit adds support for the Toradex Colibri iMX7D 1GB Computer
on Module. The module is very similar to the Colibri iMX7D 512MB
but uses eMMC instead of raw NAND. This patch introduces a new
board specific Kconfig symbol to select between the two flash
options.

Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
board/toradex/colibri_imx7/Kconfig
board/toradex/colibri_imx7/MAINTAINERS
board/toradex/colibri_imx7/colibri_imx7.c
include/configs/colibri_imx7.h

index 414a600eefbaffe007c9c4df020054274099166a..d33ec635238e6465c7715f539d24be54771758c5 100644 (file)
@@ -1,5 +1,24 @@
 if TARGET_COLIBRI_IMX7
 
+choice
+       prompt "Colibri iMX7S/D variant"
+
+config TARGET_COLIBRI_IMX7_NAND
+       bool "Support Colibri iMX7 Solo 256MB/Dual 512MB (raw NAND) modules"
+       imply NAND_MXS
+       help
+         Choose this option if you build for a Toradex Colibri iMX7S
+         256MB or Colibri iMX7D 512MB module which do have raw NAND
+         on-module.
+
+config TARGET_COLIBRI_IMX7_EMMC
+       bool "Support Colibri iMX7 Dual 1GB (eMMC) modules"
+       help
+         Choose this option if you build for a Toradex Colibri iMX7D
+         1GB module which does have eMMC on-module.
+
+endchoice
+
 config SYS_BOARD
        default "colibri_imx7"
 
@@ -19,6 +38,11 @@ config COLIBRI_IMX7_EXT_PHYCLK
 config TDX_CFG_BLOCK
        default y
 
+config TDX_CFG_BLOCK_2ND_ETHADDR
+       default y
+
+if TARGET_COLIBRI_IMX7_NAND
+
 config TDX_HAVE_NAND
        default y
 
@@ -28,9 +52,25 @@ config TDX_CFG_BLOCK_OFFSET
 config TDX_CFG_BLOCK_OFFSET2
        default "133120"
 
-config TDX_CFG_BLOCK_2ND_ETHADDR
+endif
+
+if TARGET_COLIBRI_IMX7_EMMC
+
+config TDX_HAVE_MMC
        default y
 
+config TDX_CFG_BLOCK_DEV
+       default "0"
+
+config TDX_CFG_BLOCK_PART
+       default "1"
+
+# Toradex config block in eMMC, at the end of 1st "boot sector"
+config TDX_CFG_BLOCK_OFFSET
+       default "-512"
+
+endif
+
 source "board/toradex/common/Kconfig"
 
 endif
index 5ffb2417aab8e3c1b9fa980f44679eb4e5deb3e5..9c1d42aa8cb2e5f9afe100e4a5046b29c3f818c5 100644 (file)
@@ -1,6 +1,10 @@
 Colibri iMX7
 M:     Stefan Agner <stefan.agner@toradex.com>
+M:     Toradex ARM Support <support.arm@toradex.com>
+W:     http://developer.toradex.com/software/linux/linux-software
+W:     https://www.toradex.com/community
 S:     Maintained
 F:     board/toradex/colibri_imx7/
 F:     include/configs/colibri_imx7.h
 F:     configs/colibri_imx7_defconfig
+F:     configs/colibri_imx7_emmc_defconfig
index 2210095d7a5c20aecce71413e1367d9128fac74e..2b7591eb001796cb7b30ec3dc6a26e495086604f 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Copyright (C) 2016 Toradex AG
+ * Copyright (C) 2016-2018 Toradex AG
  */
 
 #include <asm/arch/clock.h>
@@ -81,7 +81,7 @@ static iomux_v3_cfg_t const usb_cdet_pads[] = {
 };
 #endif
 
-#ifdef CONFIG_NAND_MXS
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
 static iomux_v3_cfg_t const gpmi_pads[] = {
        MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
        MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL),
@@ -109,6 +109,24 @@ static void setup_gpmi_nand(void)
 }
 #endif
 
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
+static iomux_v3_cfg_t const usdhc3_emmc_pads[] = {
+       MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       MX7D_PAD_SD3_STROBE__SD3_STROBE  | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+
+       MX7D_PAD_SD3_RESET_B__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+};
+#endif
+
 #ifdef CONFIG_VIDEO_MXS
 static iomux_v3_cfg_t const lcd_pads[] = {
        MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
@@ -198,6 +216,9 @@ static void setup_iomux_uart(void)
 #define USDHC1_CD_GPIO IMX_GPIO_NR(1, 0)
 
 static struct fsl_esdhc_cfg usdhc_cfg[] = {
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
+       {USDHC3_BASE_ADDR},
+#endif
        {USDHC1_BASE_ADDR, 0, 4},
 };
 
@@ -210,6 +231,11 @@ int board_mmc_getcd(struct mmc *mmc)
        case USDHC1_BASE_ADDR:
                ret = !gpio_get_value(USDHC1_CD_GPIO);
                break;
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
+       case USDHC3_BASE_ADDR:
+               ret = 1;
+               break;
+#endif
        }
 
        return ret;
@@ -218,7 +244,7 @@ int board_mmc_getcd(struct mmc *mmc)
 int board_mmc_init(bd_t *bis)
 {
        int i, ret;
-       /* USDHC1 is mmc0 */
+       /* USDHC1 is mmc0, USDHC3 is mmc1 */
        for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
                switch (i) {
                case 0:
@@ -228,6 +254,13 @@ int board_mmc_init(bd_t *bis)
                        gpio_direction_input(USDHC1_CD_GPIO);
                        usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
                        break;
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
+               case 1:
+                       imx_iomux_v3_setup_multiple_pads(usdhc3_emmc_pads,
+                               ARRAY_SIZE(usdhc3_emmc_pads));
+                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+                       break;
+#endif
                default:
                        printf("Warning: you configured more USDHC controllers"
                                "(%d) than supported by the board\n", i + 1);
@@ -305,7 +338,7 @@ int board_init(void)
        setup_fec();
 #endif
 
-#ifdef CONFIG_NAND_MXS
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
        setup_gpmi_nand();
 #endif
 
index e7da8b72c0d39879e93bd3a81eed7068d013a90e..ff6bd678cfadf14fbdbbac4c25865f73b566f11c 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 /*
- * Copyright 2016 Toradex AG
+ * Copyright 2016-2018 Toradex AG
  *
  * Configuration settings for the Colibri iMX7 module.
  *
@@ -14,7 +14,7 @@
 #include "mx7_common.h"
 
 /*#define CONFIG_DBG_MONITOR*/
-#define PHYS_SDRAM_SIZE                        SZ_512M
+#define PHYS_SDRAM_SIZE                        SZ_1G
 
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (32 * SZ_1M)
 
 /* MMC Config*/
 #define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
 #define CONFIG_SYS_FSL_USDHC_NUM       1
+#elif CONFIG_TARGET_COLIBRI_IMX7_EMMC
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+
+#define CONFIG_SUPPORT_EMMC_BOOT
+#endif
 
 #undef CONFIG_BOOTM_PLAN9
 #undef CONFIG_BOOTM_RTEMS
 #define CONFIG_NETMASK                 255.255.255.0
 #define CONFIG_SERVERIP                        192.168.10.1
 
+#define EMMC_BOOTCMD \
+       "emmcargs=ip=off root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait\0" \
+       "emmcboot=run setup; " \
+               "setenv bootargs ${defargs} ${emmcargs} ${setupargs} " \
+               "${vidargs}; echo Booting from internal eMMC chip...; " \
+               "run m4boot && " \
+               "load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-emmc-${fdt_board}.dtb && " \
+               "load mmc 0:1 ${kernel_addr_r} ${boot_file} && " \
+               "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
+
 #define MEM_LAYOUT_ENV_SETTINGS \
        "bootm_size=0x10000000\0" \
        "fdt_addr_r=0x82000000\0" \
        "kernel_addr_r=0x81000000\0" \
        "ramdisk_addr_r=0x82100000\0"
 
+#if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
 #define SD_BOOTCMD \
-       "sdargs=root=/dev/mmcblk0p2 rw rootwait\0"      \
+       "sdargs=root=/dev/mmcblk0p2 ro rootwait\0" \
        "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} " \
        "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
        "run m4boot && " \
        "load mmc 0:1 ${kernel_addr_r} ${kernel_file} && " \
        "load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
-       "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+       "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
+#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
+#define SD_BOOTCMD \
+       "sdargs=root=/dev/mmcblk1p2 ro rootwait\0" \
+       "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} " \
+       "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
+       "run m4boot && " \
+       "load mmc 1:1 ${kernel_addr_r} ${kernel_file} && " \
+       "load mmc 1:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
+       "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
+#endif
+
 
 #define NFS_BOOTCMD \
-       "nfsargs=ip=:::::eth0: root=/dev/nfs\0" \
+       "nfsargs=ip=:::::eth0: root=/dev/nfs\0" \
        "nfsboot=run setup; " \
                "setenv bootargs ${defargs} ${nfsargs} " \
                "${setupargs} ${vidargs}; echo Booting from NFS...;" \
-               "dhcp ${kernel_addr_r} && "     \
-               "tftp ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
+               "dhcp ${kernel_addr_r} && " \
+               "tftp ${fdt_addr_r} ${soc}-colibri${variant}-${fdt_board}.dtb && " \
                "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
 
 #define UBI_BOOTCMD    \
                "ubi read ${fdt_addr_r} dtb && " \
                "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
 
-#define CONFIG_BOOTCOMMAND "run ubiboot; run sdboot; run nfsboot"
+#if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
+#define CONFIG_BOOTCOMMAND "run emmcboot ; echo ; echo emmcboot failed ; " \
+       "setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd;"
+#define MODULE_EXTRA_ENV_SETTINGS \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
+       UBI_BOOTCMD
+#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
+#define CONFIG_BOOTCOMMAND "run ubiboot ; echo ; echo ubiboot failed ; " \
+       "setenv fdtfile ${soc}-colibri-emmc-${fdt_board}.dtb && run distro_bootcmd;"
+#define MODULE_EXTRA_ENV_SETTINGS \
+       "variant=-emmc\0" \
+       EMMC_BOOTCMD
+#endif
+
+#if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(MMC, mmc, 1) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#endif
+#include <config_distro_bootcmd.h>
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
+       BOOTENV \
        MEM_LAYOUT_ENV_SETTINGS \
        NFS_BOOTCMD \
        SD_BOOTCMD \
-       UBI_BOOTCMD \
+       MODULE_EXTRA_ENV_SETTINGS \
        "console=ttymxc0\0" \
        "defargs=\0" \
        "fdt_board=eval-v3\0" \
        "m4boot=;\0" \
        "ip_dyn=yes\0" \
        "kernel_file=zImage\0" \
-       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
        "setethupdate=if env exists ethaddr; then; else setenv ethaddr " \
                "00:14:2d:00:00:00; fi; tftpboot ${loadaddr} " \
                "${board}/flash_eth.img && source ${loadaddr}\0" \
 /* environment organization */
 
 #if defined(CONFIG_ENV_IS_IN_MMC)
-#define CONFIG_SYS_MMC_ENV_DEV         0   /* USDHC1 */
-#define CONFIG_SYS_MMC_ENV_PART                0       /* user area */
-#define CONFIG_MMCROOT                 "/dev/mmcblk0p2"  /* USDHC1 */
-#define CONFIG_ENV_OFFSET              (8 * SZ_64K)
+/* Environment in eMMC, before config block at the end of 1st "boot sector" */
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_OFFSET              (-CONFIG_ENV_SIZE + \
+                                        CONFIG_TDX_CFG_BLOCK_OFFSET)
+#define CONFIG_SYS_MMC_ENV_DEV         0
+#define CONFIG_SYS_MMC_ENV_PART                1
 #elif defined(CONFIG_ENV_IS_IN_NAND)
 #define CONFIG_ENV_SECT_SIZE           (128 * 1024)
 #define CONFIG_ENV_OFFSET              (28 * CONFIG_ENV_SECT_SIZE)
 #define CONFIG_ENV_SIZE                        CONFIG_ENV_SECT_SIZE
 #endif
 
+#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
 /* NAND stuff */
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
 #define CONFIG_SYS_NAND_BASE           0x40000000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_ONFI_DETECTION
 #define CONFIG_SYS_NAND_MX7_GPMI_62_ECC_BYTES
-
-/* Dynamic MTD partition support */
-
-/* DMA stuff, needed for GPMI/MXS NAND support */
+#endif
 
 /* USB Configs */
 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET