All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
@ 2017-03-22 22:07 Adam Ford
  2017-03-22 22:29 ` Fabio Estevam
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Adam Ford @ 2017-03-22 22:07 UTC (permalink / raw)
  To: u-boot

Logic PD has an i.MX6Q system on module (SOM) with a development kit.
This have been verified to boot the i.MX6Q version over either SD
on the development kit or NAND built into the SOM.

Signed-off-by: Adam Ford <aford173@gmail.com>

diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
index 190e5c6..059d905 100644
--- a/arch/arm/cpu/armv7/mx6/Kconfig
+++ b/arch/arm/cpu/armv7/mx6/Kconfig
@@ -367,6 +367,13 @@ config TARGET_ZC5601
 	select DM
 	select DM_THERMAL
 
+config TARGET_MX6LOGICPD
+	bool "mx6logicpd"
+	select BOARD_LATE_INIT
+	select DM
+	select DM_THERMAL
+	select BOARD_EARLY_INIT_F
+
 endchoice
 
 config SYS_SOC
@@ -415,5 +422,6 @@ source "board/udoo/Kconfig"
 source "board/udoo/neo/Kconfig"
 source "board/wandboard/Kconfig"
 source "board/warp/Kconfig"
+source "board/logicpd/imx6/Kconfig"
 
 endif
diff --git a/board/logicpd/imx6/Kconfig b/board/logicpd/imx6/Kconfig
new file mode 100644
index 0000000..f5e2f58
--- /dev/null
+++ b/board/logicpd/imx6/Kconfig
@@ -0,0 +1,12 @@
+if TARGET_MX6LOGICPD
+
+config SYS_BOARD
+       default "imx6"
+
+config SYS_VENDOR
+       default "logicpd"
+
+config SYS_CONFIG_NAME
+       default "imx6_logic"
+
+endif
diff --git a/board/logicpd/imx6/MAINTAINERS b/board/logicpd/imx6/MAINTAINERS
new file mode 100644
index 0000000..5db7d2c
--- /dev/null
+++ b/board/logicpd/imx6/MAINTAINERS
@@ -0,0 +1,6 @@
+MX6LOGICPD BOARD
+M:     Adam Ford <aford173@gmail.com>
+S:     Maintained
+F:     board/logicpd/imx6/
+F:     include/configs/imx6_logic.h
+F:     configs/imx6q_logic_defconfig
diff --git a/board/logicpd/imx6/Makefile b/board/logicpd/imx6/Makefile
new file mode 100644
index 0000000..397bc5e
--- /dev/null
+++ b/board/logicpd/imx6/Makefile
@@ -0,0 +1,11 @@
+#
+# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
+#
+# (C) Copyright 2011 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := imx6logic.o
+obj-$(CONFIG_POWER_PFUZE100)   += ../../freescale/common/pfuze.o
+
diff --git a/board/logicpd/imx6/README b/board/logicpd/imx6/README
new file mode 100644
index 0000000..5814b9d
--- /dev/null
+++ b/board/logicpd/imx6/README
@@ -0,0 +1,103 @@
+How to use and build U-Boot on mx6sabresd:
+----------------------------------
+
+Currently there are three methods for booting mx6sabresd boards:
+
+1. Booting via Normal U-Boot (u-boot.imx)
+
+2. Booting via SPL (SPL and u-boot.img)
+
+3. Booting via Falcon mode (SPL launches the kernel directly)
+
+
+1. Booting via Normal U-Boot
+----------------------------
+
+$ make mx6qsabresd_defconfig (If you want to build for mx6qsabresd)
+
+or
+
+$ make mx6dlsabresd_defconfig (If you want to build for mx6dlsabresd)
+
+$ make
+
+This will generate the image called u-boot.imx.
+
+- Flash the u-boot.imx binary into the SD card:
+
+$ sudo dd if=u-boot.imx of=/dev/sdb bs=1K seek=1 && sync
+
+
+2. Booting via SPL
+------------------
+
+Other method for building U-Boot on mx6qsabresd and mx6qpsabresd is
+through SPL. In order to do so:
+
+$ make mx6sabresd_spl_defconfig
+$ make
+
+This will generate the SPL image called SPL and the u-boot.img.
+
+- Flash the SPL image into the SD card:
+
+$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 && sync
+
+- Flash the u-boot.img image into the SD card:
+
+$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 && sync
+
+
+3. Booting via Falcon mode
+--------------------------
+
+$ make mx6sabresd_spl_defconfig
+$ make
+
+This will generate the SPL image called SPL and the u-boot.img.
+
+- Flash the SPL image into the SD card:
+
+$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 oflag=sync status=none && sync
+
+- Flash the u-boot.img image into the SD card:
+
+$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 oflag=sync status=none && sync
+
+Create a partition for root file system and extract it there:
+
+$ sudo tar xvf rootfs.tar.gz -C /media/root
+
+The SD card must have enough space for raw "args" and "kernel".
+To configure Falcon mode for the first time, on U-Boot do the following commands:
+
+- Setup the IP server:
+
+# setenv serverip <server_ip_address>
+
+- Download dtb file:
+
+# dhcp ${fdt_addr} imx6q-sabresd.dtb
+
+- Download kernel image:
+
+# dhcp ${loadaddr} uImage
+
+- Write kernel at 2MB offset:
+
+# mmc write ${loadaddr} 0x1000 0x4000
+
+- Setup kernel bootargs:
+
+# setenv bootargs "console=ttymxc0,115200 root=/dev/mmcblk1p1 rootfstype=ext4 rootwait quiet rw"
+
+- Prepare args:
+
+# spl export fdt ${loadaddr} - ${fdt_addr}
+
+- Write args 1MB data (0x800 sectors) to 1MB offset (0x800 sectors)
+
+# mmc write 18000000 0x800 0x800
+
+- Press KEY_VOL_UP key, power up the board and then SPL binary will
+launch the kernel directly.
diff --git a/board/logicpd/imx6/imx6logic.c b/board/logicpd/imx6/imx6logic.c
new file mode 100644
index 0000000..18ec9a1
--- /dev/null
+++ b/board/logicpd/imx6/imx6logic.c
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2017 Logic PD, Inc.
+ *
+ * Author: Adam Ford <aford173@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6-pins.h>
+#include <linux/errno.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/mxc_i2c.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/boot_mode.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/pfuze100_pmic.h>
+#include "../../freescale/common/pfuze.h"
+#include <asm/arch/mx6-ddr.h>
+#include <usb.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
+	PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
+	PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
+	PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define NAND_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
+	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
+	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
+	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define I2C_PAD_CTRL   (                       \
+	PAD_CTL_SPEED_LOW |                                 \
+	PAD_CTL_DSE_60ohm | PAD_CTL_HYS |                       \
+	PAD_CTL_ODE | PAD_CTL_SRE_SLOW)
+
+#define EPDC_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_SPEED_MED |    \
+	PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define I2C_PMIC       2
+#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
+
+int dram_init(void)
+{
+	gd->ram_size = imx_ddr_size();
+	return 0;
+}
+
+iomux_v3_cfg_t const uart1_pads[] = {
+	MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const uart2_pads[] = {
+	MX6_PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_SD4_DAT5__UART2_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_SD4_DAT6__UART2_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const uart3_pads[] = {
+	MX6_PAD_EIM_D23__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_EIM_D24__UART3_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_EIM_D25__UART3_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
+	MX6_PAD_EIM_EB3__UART3_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const enet_pads[] = {
+	MX6_PAD_ENET_MDIO__ENET_MDIO      | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_MDC__ENET_MDC        | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_GPIO_16__ENET_REF_CLK	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_RXD0__ENET_RX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_RXD1__ENET_RX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_TXD0__ENET_TX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_TXD1__ENET_TX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_CRS_DV__ENET_RX_EN	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_RX_ER__ENET_RX_ER	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	MX6_PAD_ENET_TX_EN__ENET_TX_EN	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
+	/* LAN8710A PHY Reset */
+	MX6_PAD_KEY_ROW1__GPIO4_IO09      | MUX_PAD_CTRL(EPDC_PAD_CTRL),
+	/* LAN8710A nINT Signal */
+	MX6_PAD_KEY_ROW0__GPIO4_IO07      | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_iomux_enet(void)
+{
+	struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+	imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
+
+	/* Set GPIO_16 as ENET_REF_CLK_OUT */
+	setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
+
+	/* Ensure nINT is input */
+	gpio_direction_input(IMX_GPIO_NR(4, 7));
+
+	/* Reset LAN8710A PHY */
+	gpio_direction_output(IMX_GPIO_NR(4, 9) , 0);
+	udelay(150);
+	gpio_set_value(IMX_GPIO_NR(4, 9), 1);
+	mdelay(50);
+}
+
+iomux_v3_cfg_t const usdhc1_pads[] = {
+	MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_CMD__SD1_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT0__SD1_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT2__SD1_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT3__SD1_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_NANDF_CS3__GPIO6_IO16   | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+iomux_v3_cfg_t const usdhc2_pads[] = {
+	MX6_PAD_SD2_CLK__SD2_CLK        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_CMD__SD2_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT0__SD2_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT1__SD2_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT2__SD2_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD2_DAT3__SD2_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+
+static struct i2c_pads_info i2c_pad_info3 = {
+	.scl = {
+		.i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | MUX_PAD_CTRL(I2C_PAD_CTRL),
+		.gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | MUX_PAD_CTRL(I2C_PAD_CTRL),
+		.gp = IMX_GPIO_NR(3, 17)
+	},
+	.sda = {
+		.i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | MUX_PAD_CTRL(I2C_PAD_CTRL),
+		.gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | MUX_PAD_CTRL(I2C_PAD_CTRL),
+		.gp = IMX_GPIO_NR(3, 18)
+	}
+};
+
+static void setup_iomux_uart(void)
+{
+	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
+	imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
+	imx_iomux_v3_setup_multiple_pads(uart3_pads, ARRAY_SIZE(uart3_pads));
+}
+
+iomux_v3_cfg_t const pmic_pads[] = {
+	MX6_PAD_SD4_DAT0__GPIO2_IO08	| MUX_PAD_CTRL(NO_PAD_CTRL),
+	MX6_PAD_SD4_DAT3__GPIO2_IO11	| MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_pmic_pins(void)
+{
+	imx_iomux_v3_setup_multiple_pads(pmic_pads, ARRAY_SIZE(pmic_pads));
+}
+
+iomux_v3_cfg_t const nand_pads[] = {
+	MX6_PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_ALE__NAND_ALE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_CLE__NAND_CLE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_WP_B__NAND_WP_B  | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_RB0__NAND_READY_B   | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D0__NAND_DATA00    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D1__NAND_DATA01    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D2__NAND_DATA02    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D3__NAND_DATA03    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D4__NAND_DATA04    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D5__NAND_DATA05    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D6__NAND_DATA06    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_NANDF_D7__NAND_DATA07    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_SD4_CLK__NAND_WE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+	MX6_PAD_SD4_CMD__NAND_RE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
+};
+
+static void setup_nand_pins(void)
+{
+	imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads));
+}
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg usdhc_cfg[] = {
+	{USDHC1_BASE_ADDR},
+	{USDHC2_BASE_ADDR},
+};
+
+#define USDHC1_CD_GPIO IMX_GPIO_NR(6, 16)
+#define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
+
+int board_mmc_get_env_dev(int devno)
+{
+	return devno - 1;
+}
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+	int ret = 0;
+
+	switch (cfg->esdhc_base) {
+	case USDHC1_BASE_ADDR:
+		ret = !gpio_get_value(USDHC1_CD_GPIO);
+		break;
+	case USDHC2_BASE_ADDR:
+		ret = !gpio_get_value(USDHC2_CD_GPIO);
+		break;
+	}
+
+	return ret;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+	int ret;
+	int i;
+
+	/*
+	* According to the board_mmc_init() the following map is done:
+	* (U-Boot device node)    (Physical Port)
+	* mmc0                    SOM
+	* mmc1                    Baseboard
+	* mmc2                    eMMC
+	*/
+	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+		switch (i) {
+		case 0:
+			imx_iomux_v3_setup_multiple_pads(
+				   usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
+			gpio_direction_input(USDHC1_CD_GPIO);
+			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+			break;
+		case 1:
+			imx_iomux_v3_setup_multiple_pads(
+				   usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
+			gpio_direction_input(USDHC2_CD_GPIO);
+			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+			break;
+		default:
+			printf("Warning: you configured more USDHC controllers");
+			printf("(%d) then supported by the board (%d)\n",
+			       i + 1, CONFIG_SYS_FSL_USDHC_NUM);
+			return -EINVAL;
+		}
+
+		ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
+		if (ret)
+			return ret;
+	}
+	return 0;
+}
+#endif
+
+int board_phy_config(struct phy_device *phydev)
+{
+	if (phydev->drv->config)
+		phydev->drv->config(phydev);
+
+	return 0;
+}
+
+/*
+ * Do not overwrite the console
+ * Use always serial for U-Boot console
+ */
+int overwrite_console(void)
+{
+	return 1;
+}
+
+int board_eth_init(bd_t *bis)
+{
+	setup_iomux_enet();
+	return cpu_eth_init(bis);
+}
+
+int board_early_init_f(void)
+{
+	setup_iomux_uart();
+	setup_pmic_pins();
+	setup_nand_pins();
+	return 0;
+}
+
+int board_init(void)
+{
+	/* address of boot parameters */
+	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+#ifdef CONFIG_FEC_MXC
+	enable_fec_anatop_clock(0, ENET_50MHZ);
+#endif
+
+	setup_i2c(2, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE, &i2c_pad_info3);
+
+	return 0;
+}
+
+int power_init_board(void)
+{
+	struct pmic *p;
+
+	p = pfuze_common_init(I2C_PMIC);
+	if (!p)
+		return -ENODEV;
+
+	return pfuze_mode_init(p, APS_PFM);
+}
+
+#ifdef CONFIG_CMD_BMODE
+static const struct boot_mode board_boot_modes[] = {
+	/* 4 bit bus width */
+	/* 4 bit bus width */
+	{"sd1",  MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
+	{"sd2",  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
+	{NULL,   0},
+};
+#endif
+
+int board_late_init(void)
+{
+#ifdef CONFIG_CMD_BMODE
+	add_board_boot_modes(board_boot_modes);
+#endif
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+	setenv("board_name", "imx6_logicpd");
+
+	if (is_mx6dqp()) {
+		setenv("board_rev", "MX6QP");
+		setenv("fdt_file", "imx6q-logicpd.dtb");
+	}
+	else if (is_mx6dq()) {
+		setenv("board_rev", "MX6Q");
+		setenv("fdt_file", "imx6q-logicpd.dtb");
+	}
+	else if (is_mx6sdl()) {
+		setenv("board_rev", "MX6DL");
+		setenv("fdt_file", "imx6sdl-logicpd.dtb");
+	}
+	else if (is_mx6solo()) {
+		setenv("board_rev", "MX6SOLO");
+		setenv("fdt_file", "imx6sdl-logicpd.dtb");
+	}
+#endif
+	return 0;
+}
+
+int checkboard(void)
+{
+	puts("Board: Logic PD i.MX6 SOM\n");
+	return 0;
+}
diff --git a/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg b/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg
new file mode 100644
index 0000000..f22db03
--- /dev/null
+++ b/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2017 Logic PD, Inc.
+ * Adam Ford <aford173@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ *
+ * Refer doc/README.imximage for more details about how-to configure
+ * and create imximage boot image
+ *
+ * The syntax is taken as close as possible with the kwbimage
+ */
+
+/* image version */
+IMAGE_VERSION 2
+
+/*
+ * Boot Device : sd or nand
+ * nand:   flash_offset: 0x0400
+ * sd/mmc: flash_offset: 0x0400
+ */
+
+/* the same flash_offset as sd */
+BOOT_FROM      sd
+
+/*
+ * Device Configuration Data (DCD)
+ *
+ * Each entry must have the format:
+ * Addr-type           Address        Value
+ *
+ * where:
+ *      Addr-type register length (1,2 or 4 bytes)
+ *      Address   absolute address of the register
+ *      value     value to be stored in the register
+ */
+
+/* Settings derived from MX6DQSDL DDR3 Script Aid spreadsheet version 0.08 */
+
+//=============================================================================
+//init script for i.Mx6D DDR3
+//=============================================================================
+// Revision History
+// v01
+//=============================================================================
+
+
+//=============================================================================
+// IOMUX
+//=============================================================================
+//DDR IO TYPE:
+DATA 4  0x020e0798 0x000C0000  // IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE
+DATA 4  0x020e0758 0x00000000  // IOMUXC_SW_PAD_CTL_GRP_DDRPKE
+
+//CLOCK:
+DATA 4  0x020e0588 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_0
+DATA 4  0x020e0594 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_1
+
+//ADDRESS:
+DATA 4  0x020e056c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_CAS
+DATA 4  0x020e0578 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_RAS
+DATA 4  0x020e074c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_ADDDS
+
+//Control:
+DATA 4  0x020e057c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_RESET
+DATA 4  0x020e058c 0x00000000  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDBA2 - DSE can be configured using Group Control Register: IOMUXC_SW_PAD_CTL_GRP_CTLDS
+DATA 4  0x020e059c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT0
+DATA 4  0x020e05a0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT1
+DATA 4  0x020e078c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_CTLDS
+
+//Data Strobes:
+DATA 4  0x020e0750 0x00020000  // IOMUXC_SW_PAD_CTL_GRP_DDRMODE_CTL
+DATA 4  0x020e05a8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS0
+DATA 4  0x020e05b0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS1
+DATA 4  0x020e0524 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS2
+DATA 4  0x020e051c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS3
+//DATA 4  0x020e0518 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS4
+//DATA 4  0x020e050c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS5
+//DATA 4  0x020e05b8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS6
+//DATA 4  0x020e05c0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS7
+
+//Data:
+DATA 4  0x020e0774 0x00020000  // IOMUXC_SW_PAD_CTL_GRP_DDRMODE
+DATA 4  0x020e0784 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B0DS
+DATA 4  0x020e0788 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B1DS
+DATA 4  0x020e0794 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B2DS
+DATA 4  0x020e079c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B3DS
+//DATA 4  0x020e07a0 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B4DS
+//DATA 4  0x020e07a4 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B5DS
+//DATA 4  0x020e07a8 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B6DS
+//DATA 4  0x020e0748 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B7DS
+
+DATA 4  0x020e05ac 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM0
+DATA 4  0x020e05b4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1
+DATA 4  0x020e0528 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM2
+DATA 4  0x020e0520 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM3
+//DATA 4  0x020e0514 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM4
+//DATA 4  0x020e0510 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM5
+//DATA 4  0x020e05bc 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM6
+//DATA 4  0x020e05c4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM7
+
+
+//=============================================================================
+// DDR Controller Registers
+//=============================================================================
+// Manufacturer:	Micron
+// Device Part Number:	MT41K512M16HA-125
+// Clock Freq.: 	528MHz
+// Density per CS in Gb: 	16
+// Chip Selects used:	1
+// Number of Banks:	8
+// Row address:    	16
+// Column address: 	10
+// Data bus width	32
+//=============================================================================
+DATA 4  0x021b001c 0x00008000  //MMDC0_MDSCR set the Configuration request bit during MMDC set up
+
+//=============================================================================
+// Calibration setup.
+//=============================================================================
+DATA 4  0x021b0800 0xA1390003  // DDR_PHY_P0_MPZQHWCTRL enable both one-time & periodic HW ZQ calibration.
+
+// For target board may need to run write leveling calibration to fine tune these settings.
+DATA 4  0x021b080c 0x002D003A  // MMDC1_MPWLDECTRL0
+DATA 4  0x021b0810 0x0038002B  // MMDC1_MPWLDECTRL1
+//DATA 4  0x021b480c 0x00000000
+//DATA 4  0x021b4810 0x00000000
+
+////Read DQS Gating calibration
+DATA 4  0x021b083c 0x03340338  // MPDGCTRL0 PHY0
+DATA 4  0x021b0840 0x0334032C  // MPDGCTRL1 PHY0
+//DATA 4  0x021b483c 0x00000000  // MPDGCTRL0 PHY1
+//DATA 4  0x021b4840 0x00000000  // MPDGCTRL1 PHY1
+
+//Read calibration
+DATA 4  0x021b0848 0x4036383C  // MPRDDLCTL PHY0
+//DATA 4  0x021b4848 0x40404040  // MPRDDLCTL PHY1
+
+//Write calibration
+DATA 4  0x021b0850 0x2E384038  // MPWRDLCTL PHY0
+//DATA 4  0x021b4850 0x40404040  // MPWRDLCTL PHY1
+
+//read data bit delay: (3 is the reccommended default value although out of reset value is 0)
+DATA 4  0x021b081c 0x33333333  // DDR_PHY_P0_MPREDQBY0DL3
+DATA 4  0x021b0820 0x33333333  // DDR_PHY_P0_MPREDQBY1DL3
+DATA 4  0x021b0824 0x33333333  // DDR_PHY_P0_MPREDQBY2DL3
+DATA 4  0x021b0828 0x33333333  // DDR_PHY_P0_MPREDQBY3DL3
+//DATA 4  0x021b481c 0x33333333  // DDR_PHY_P1_MPREDQBY0DL3
+//DATA 4  0x021b4820 0x33333333  // DDR_PHY_P1_MPREDQBY1DL3
+//DATA 4  0x021b4824 0x33333333  // DDR_PHY_P1_MPREDQBY2DL3
+//DATA 4  0x021b4828 0x33333333  // DDR_PHY_P1_MPREDQBY3DL3
+
+//For i.mx6qd parts of versions A & B (v1.0 v1.1) uncomment the following lines. For version C (v1.2) keep commented
+//DATA 4  0x021b08c0 0x24911492  // fine tune SDCLK duty cyc to low - seen to improve measured duty cycle of i.mx6
+//DATA 4  0x021b48c0 0x24911492
+
+// Complete calibration by forced measurement:
+DATA 4  0x021b08b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr
+//DATA 4  0x021b48b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr
+//=============================================================================
+// Calibration setup end
+//=============================================================================
+
+//MMDC init:
+DATA 4  0x021b0004 0x00020036  // MMDC0_MDPDC
+DATA 4  0x021b0008 0x09444040  // MMDC0_MDOTC
+DATA 4  0x021b000c 0xB8BE7955  // MMDC0_MDCFG0
+DATA 4  0x021b0010 0xFF328F64  // MMDC0_MDCFG1
+DATA 4  0x021b0014 0x01FF00DB  // MMDC0_MDCFG2
+
+//MDMISC: RALAT kept to the high level of 5.
+//MDMISC: consider reducing RALAT if your 528MHz board design allow that. Lower RALAT benefits:
+//a. better operation at low frequency for LPDDR2 freq < 100MHz change RALAT to 3
+//b. Small performence improvment
+DATA 4  0x021b0018 0x00011740  // MMDC0_MDMISC
+DATA 4  0x021b001c 0x00008000  // MMDC0_MDSCR set the Configuration request bit during MMDC set up
+DATA 4  0x021b002c 0x000026D2  // MMDC0_MDRWD
+DATA 4  0x021b0030 0x00BE1023  // MMDC0_MDOR
+DATA 4  0x021b0040 0x00000047  // Chan0 CS0_END
+DATA 4  0x021b0000 0x85190000  // MMDC0_MDCTL
+
+//Mode register writes
+DATA 4  0x021b001c 0x00888032  // MMDC0_MDSCR MR2 write CS0
+DATA 4  0x021b001c 0x00008033  // MMDC0_MDSCR MR3 write CS0
+DATA 4  0x021b001c 0x00008031  // MMDC0_MDSCR MR1 write CS0
+DATA 4  0x021b001c 0x19408030  // MMDC0_MDSCR MR0write CS0
+DATA 4  0x021b001c 0x04008040  // MMDC0_MDSCR ZQ calibration command sent to device on CS0
+
+//DATA 4  0x021b001c 0x0088803A  // MMDC0_MDSCR MR2 write CS1
+//DATA 4  0x021b001c 0x0000803B  // MMDC0_MDSCR MR3 write CS1
+//DATA 4  0x021b001c 0x00008039  // MMDC0_MDSCR MR1 write CS1
+//DATA 4  0x021b001c 0x19408038  // MMDC0_MDSCR MR0write CS1
+//DATA 4  0x021b001c 0x04008048  // MMDC0_MDSCR ZQ calibration command sent to device on CS1
+
+DATA 4  0x021b0020 0x00007800  // MMDC0_MDREF
+
+DATA 4  0x021b0818 0x00000007  // DDR_PHY_P0_MPODTCTRL
+//DATA 4  0x021b4818 0x00000007  // DDR_PHY_P1_MPODTCTRL
+
+DATA 4  0x021b0004 0x00025576  // MMDC0_MDPDC now SDCTL power down enabled
+
+DATA 4  0x021b0404 0x00011006  // MMDC0_MAPSR ADOPT power down enabled MMDC will enter automatically to self-refresh while the number of idle cycle reached.
+
+DATA 4  0x021b001c 0x00000000  // MMDC0_MDSCR clear this register (especially the configuration bit as initialization is complete)
+/* set the default clock gate to save power */
+DATA 4 0x020c4068 0x00C03F3F
+DATA 4 0x020c406c 0x0030FC03
+DATA 4 0x020c4070 0x0FFFC000
+DATA 4 0x020c4074 0x3FF00000
+DATA 4 0x020c4078 0xFFFFF300
+DATA 4 0x020c407c 0x0F0000F3
+DATA 4 0x020c4080 0x00000FFF
+
+/* enable AXI cache for VDOA/VPU/IPU */
+DATA 4 0x020e0010 0xF00000CF
+/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+DATA 4 0x020e0018 0x007F007F
+DATA 4 0x020e001c 0x007F007F
\ No newline@end of file
diff --git a/configs/imx6q_logic_defconfig b/configs/imx6q_logic_defconfig
new file mode 100644
index 0000000..1526d38
--- /dev/null
+++ b/configs/imx6q_logic_defconfig
@@ -0,0 +1,30 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MX6=y
+CONFIG_TARGET_MX6LOGICPD=y
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg,MX6Q"
+CONFIG_BOOTDELAY=3
+# CONFIG_CONSOLE_MUX is not set
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
+CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="i.MX6 Logic # "
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_NAND=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_NAND_MXS=y
+CONFIG_DISPLAY_CPUINFO=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_OF_LIBFDT=y
diff --git a/include/configs/imx6_logic.h b/include/configs/imx6_logic.h
new file mode 100644
index 0000000..556cad2
--- /dev/null
+++ b/include/configs/imx6_logic.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2017 Logic PD, Inc.
+ *
+ * Configuration settings for the LogicPD i.MX6 SOM.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __IMX6LOGIC_CONFIG_H
+#define __IMX6LOGIC_CONFIG_H
+
+#define CONFIG_MACH_TYPE       3980
+#define CONFIG_MXC_UART_BASE   UART1_BASE
+#define CONSOLE_DEV            "ttymxc0"
+
+#include "mx6_common.h"
+
+#define CONFIG_IMX_THERMAL
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (10 * SZ_1M)
+
+#define CONFIG_MXC_UART
+
+/* MMC Configs */
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+#define CONFIG_MMCROOT         "/dev/mmcblk1p2" /* Dev kit SD card */
+
+/* Ethernet Configs */
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE                   ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE            RMII
+#define CONFIG_ETHPRIME                "FEC"
+#define CONFIG_FEC_MXC_PHYADDR         0
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_SMSC
+
+/* Command definition */
+#define CONFIG_CMD_BMODE
+
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	"script=boot.scr\0" \
+	"image=zImage\0" \
+	"fdt_addr=0x18000000\0" \
+	"ramdisk_addr=0x13000000\0" \
+	"ramdisk_file=rootfs.cpio.uboot\0" \
+	"boot_fdt=try\0" \
+	"ip_dyn=yes\0" \
+	"console=" CONSOLE_DEV "\0" \
+	"fdt_high=0xffffffff\0"   \
+	"initrd_high=0xffffffff\0" \
+	"mmcdev=1\0" \
+	"mmcpart=1\0" \
+	"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+	"nandroot=ubi0:rootfs rootfstype=ubifs\0" \
+	"mmcargs=setenv bootargs console=${console},${baudrate}" \
+	" root=${mmcroot} ${mtdparts}\0" \
+	"nandargs=setenv bootargs console=${console},${baudrate}" \
+	" ubi.mtd=fs root=${nandroot} ${mtdparts}\0" \
+	"ramargs=setenv bootargs console=${console},${baudrate}" \
+	" root=/dev/ram rw ${mtdparts}\0"                    \
+	"loadbootscript=" \
+	"fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+	"bootscript=echo Running bootscript from mmc ...;" \
+	" source\0" \
+	"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+	"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+	"loadramdisk=fatload mmc ${mmcdev}:${mmcpart} ${ramdisk_addr} ${ramdisk_file}\0" \
+	"mmcboot=echo Booting from mmc...; run mmcargs; run loadimage;" \
+	" run loadfdt; bootz ${loadaddr} - ${fdt_addr}\0" \
+	"mmcramboot=run ramargs; run loadimage;" \
+	" run loadfdt; run loadramdisk;" \
+	" bootz ${loadaddr} ${ramdisk_addr} ${fdt_addr}\0" \
+	"nandboot=echo Booting from nand ...; " \
+	" run nandargs;" \
+	" nand read ${loadaddr} kernel;" \
+	" nand read ${fdt_addr} dtb;" \
+	" bootz ${loadaddr} - ${fdt_addr}\0" \
+	"nandramboot=echo Booting RAMdisk from nand ...; " \
+	" nand read ${ramdisk_addr} fs ${ramdisksize};" \
+	" nand read ${loadaddr} kernel;" \
+	" nand read ${fdt_addr} dtb;" \
+	" run ramargs;" \
+	" bootz ${loadaddr} ${ramdisk_addr} ${fdt_addr}\0" \
+	"netargs=setenv bootargs console=${console},${baudrate} " \
+	"root=/dev/nfs" \
+	" ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+	"netboot=echo Booting from net ...; " \
+	"run netargs; " \
+	"if test ${ip_dyn} = yes; then " \
+		"setenv get_cmd dhcp; " \
+	"else " \
+		"setenv get_cmd tftp; " \
+	"fi; " \
+	"${get_cmd} ${image}; " \
+	"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+		"if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+			"bootz ${loadaddr} - ${fdt_addr}; " \
+		"else " \
+			"if test ${boot_fdt} = try; then " \
+				"bootz; " \
+				"else " \
+				"echo WARN: Cannot load the DT; " \
+			"fi; " \
+		"fi; " \
+	"else " \
+	       "bootz; " \
+	"fi;\0" \
+	"autoboot=mmc dev ${mmcdev};" \
+	"if mmc rescan; then " \
+		"if run loadbootscript; then " \
+			"run bootscript; " \
+		"else " \
+		"if run loadimage; then " \
+			"run mmcboot; " \
+		"else run netboot; " \
+		"fi; " \
+	"fi; " \
+	"else run netboot; fi"
+#define CONFIG_BOOTCOMMAND \
+	"run autoboot"
+
+#define CONFIG_ARP_TIMEOUT     200UL
+
+#define CONFIG_SYS_MEMTEST_START       0x10000000
+#define CONFIG_SYS_MEMTEST_END         0x10010000
+#define CONFIG_SYS_MEMTEST_SCRATCH     0x10800000
+
+#define CONFIG_STACKSIZE               (128 * 1024)
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM                     MMDC0_ARB_BASE_ADDR
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* Environment organization */
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET             0x400000
+#define CONFIG_ENV_SECT_SIZE          CONFIG_ENV_SIZE
+
+
+/* I2C Configs */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C1
+#define CONFIG_SYS_I2C_MXC_I2C2
+#define CONFIG_SYS_I2C_MXC_I2C3
+#define CONFIG_SYS_I2C_SPEED	400000
+#define CONFIG_SYS_I2C_SLAVE	0x8
+
+/* NAND flash command */
+
+#define CONFIG_CMD_NAND_TRIMFFS
+
+/* 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_U_BOOT_START	CONFIG_SYS_TEXT_BASE
+#define CONFIG_SYS_NAND_U_BOOT_OFFS	0x200000
+
+/* MTD device */
+# define CONFIG_MTD_DEVICE
+# define CONFIG_CMD_MTDPARTS
+# define CONFIG_MTD_PARTITIONS
+# define MTDIDS_DEFAULT		"nand0=gpmi-nand"
+# define MTDPARTS_DEFAULT	"mtdparts=gpmi-nand:4m(uboot)," \
+					"1m(env),8m(kernel),1m(dtb),-(fs)"
+
+/* DMA stuff, needed for GPMI/MXS NAND support */
+#define CONFIG_APBH_DMA
+#define CONFIG_APBH_DMA_BURST
+#define CONFIG_APBH_DMA_BURST8
+
+/* PMIC */
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_PFUZE100
+#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
+
+#endif                         /* __IMX6LOGIC_CONFIG_H */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
  2017-03-22 22:07 [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM Adam Ford
@ 2017-03-22 22:29 ` Fabio Estevam
  2017-03-23  0:27 ` Tom Rini
  2017-03-24 11:09 ` Stefano Babic
  2 siblings, 0 replies; 6+ messages in thread
From: Fabio Estevam @ 2017-03-22 22:29 UTC (permalink / raw)
  To: u-boot

Hi Adam,

On Wed, Mar 22, 2017 at 7:07 PM, Adam Ford <aford173@gmail.com> wrote:
 config SYS_SOC
> @@ -415,5 +422,6 @@ source "board/udoo/Kconfig"
>  source "board/udoo/neo/Kconfig"
>  source "board/wandboard/Kconfig"
>  source "board/warp/Kconfig"
> +source "board/logicpd/imx6/Kconfig"

Alphabetical order, please.

> --- /dev/null
> +++ b/board/logicpd/imx6/README
> @@ -0,0 +1,103 @@
> +How to use and build U-Boot on mx6sabresd:
> +----------------------------------
> +
> +Currently there are three methods for booting mx6sabresd boards:

Looks like you forgot to change the board name here :-)

> +iomux_v3_cfg_t const nand_pads[] = {

static


> +//Control:
> +DATA 4  0x020e057c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_RESET
> +DATA 4  0x020e058c 0x00000000  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDBA2 - DSE can be configured using Group Control Register: IOMUXC_SW_PAD_CTL_GRP_CTLDS
> +DATA 4  0x020e059c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT0
> +DATA 4  0x020e05a0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT1
> +DATA 4  0x020e078c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_CTLDS
> +
> +//Data Strobes:

Better avoid // notation. You could use /* comment */ instead. Make
sure you run checkpatch.pl.

> +DATA 4  0x020e0750 0x00020000  // IOMUXC_SW_PAD_CTL_GRP_DDRMODE_CTL
> +DATA 4  0x020e05a8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS0
> +DATA 4  0x020e05b0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS1
> +DATA 4  0x020e0524 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS2
> +DATA 4  0x020e051c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS3
> +//DATA 4  0x020e0518 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS4
> +//DATA 4  0x020e050c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS5
> +//DATA 4  0x020e05b8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS6
> +//DATA 4  0x020e05c0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS7

Better to remove unused lines.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
  2017-03-22 22:07 [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM Adam Ford
  2017-03-22 22:29 ` Fabio Estevam
@ 2017-03-23  0:27 ` Tom Rini
  2017-03-24 19:33   ` Adam Ford
  2017-03-24 11:09 ` Stefano Babic
  2 siblings, 1 reply; 6+ messages in thread
From: Tom Rini @ 2017-03-23  0:27 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 22, 2017 at 05:07:02PM -0500, Adam Ford wrote:

> Logic PD has an i.MX6Q system on module (SOM) with a development kit.
> This have been verified to boot the i.MX6Q version over either SD
> on the development kit or NAND built into the SOM.
> 
> Signed-off-by: Adam Ford <aford173@gmail.com>
> 
> diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
> index 190e5c6..059d905 100644
> --- a/arch/arm/cpu/armv7/mx6/Kconfig
> +++ b/arch/arm/cpu/armv7/mx6/Kconfig
> @@ -367,6 +367,13 @@ config TARGET_ZC5601
>  	select DM
>  	select DM_THERMAL
>  
> +config TARGET_MX6LOGICPD
> +	bool "mx6logicpd"
> +	select BOARD_LATE_INIT
> +	select DM
> +	select DM_THERMAL
> +	select BOARD_EARLY_INIT_F

Please sort this as well.

[snip]
> +Currently there are three methods for booting mx6sabresd boards:
> diff --git a/board/logicpd/imx6/imx6logic.c b/board/logicpd/imx6/imx6logic.c
> new file mode 100644
> index 0000000..18ec9a1
> --- /dev/null
> +++ b/board/logicpd/imx6/imx6logic.c
> @@ -0,0 +1,364 @@
> +/*
> + * Copyright (C) 2017 Logic PD, Inc.
> + *
> + * Author: Adam Ford <aford173@gmail.com>

... based on board/.../ since I assume you copied mx6sabresd here as
well :)

[snip]
> +int board_late_init(void)
> +{
> +#ifdef CONFIG_CMD_BMODE
> +	add_board_boot_modes(board_boot_modes);
> +#endif
> +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
> +	setenv("board_name", "imx6_logicpd");
> +
> +	if (is_mx6dqp()) {
> +		setenv("board_rev", "MX6QP");
> +		setenv("fdt_file", "imx6q-logicpd.dtb");
> +	}
> +	else if (is_mx6dq()) {
> +		setenv("board_rev", "MX6Q");
> +		setenv("fdt_file", "imx6q-logicpd.dtb");
> +	}
> +	else if (is_mx6sdl()) {
> +		setenv("board_rev", "MX6DL");
> +		setenv("fdt_file", "imx6sdl-logicpd.dtb");
> +	}
> +	else if (is_mx6solo()) {
> +		setenv("board_rev", "MX6SOLO");
> +		setenv("fdt_file", "imx6sdl-logicpd.dtb");
> +	}
> +#endif

Do all of these variations exist?

> diff --git a/include/configs/imx6_logic.h b/include/configs/imx6_logic.h
> new file mode 100644
> index 0000000..556cad2
> --- /dev/null
> +++ b/include/configs/imx6_logic.h
> @@ -0,0 +1,194 @@
> +/*
> + * Copyright (C) 2017 Logic PD, Inc.
> + *
> + * Configuration settings for the LogicPD i.MX6 SOM.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __IMX6LOGIC_CONFIG_H
> +#define __IMX6LOGIC_CONFIG_H
> +
> +#define CONFIG_MACH_TYPE       3980

New board, we should not need MACH_TYPE and I bet that's not the "real"
one for your brand new board.

> +	"fdt_high=0xffffffff\0"   \
> +	"initrd_high=0xffffffff\0" \

I'm really really not a fan of disabling these relocations, please use
bootm_size to tell U-Boot where to make sure everything resides without
overlap.  Also, distro boot?

[snip]
> +# define MTDPARTS_DEFAULT	"mtdparts=gpmi-nand:4m(uboot)," \
> +					"1m(env),8m(kernel),1m(dtb),-(fs)"

Are you really sure all of these sizes are what you can live with for a
long long time?  That kernel size feels small.

Thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170322/8b61fdea/attachment.sig>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
  2017-03-22 22:07 [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM Adam Ford
  2017-03-22 22:29 ` Fabio Estevam
  2017-03-23  0:27 ` Tom Rini
@ 2017-03-24 11:09 ` Stefano Babic
  2017-03-24 13:28   ` Adam Ford
  2 siblings, 1 reply; 6+ messages in thread
From: Stefano Babic @ 2017-03-24 11:09 UTC (permalink / raw)
  To: u-boot

Hi Adam,

On 22/03/2017 23:07, Adam Ford wrote:
> Logic PD has an i.MX6Q system on module (SOM) with a development kit.
> This have been verified to boot the i.MX6Q version over either SD
> on the development kit or NAND built into the SOM.

A short list of supported peripherals (Ethernet,..) will help. See
commits of other i.MX6 boards.

> 
> Signed-off-by: Adam Ford <aford173@gmail.com>
> 
> diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
> index 190e5c6..059d905 100644
> --- a/arch/arm/cpu/armv7/mx6/Kconfig
> +++ b/arch/arm/cpu/armv7/mx6/Kconfig
> @@ -367,6 +367,13 @@ config TARGET_ZC5601
>  	select DM
>  	select DM_THERMAL
>  
> +config TARGET_MX6LOGICPD
> +	bool "mx6logicpd"
> +	select BOARD_LATE_INIT
> +	select DM
> +	select DM_THERMAL
> +	select BOARD_EARLY_INIT_F
> +
>  endchoice
>  
>  config SYS_SOC
> @@ -415,5 +422,6 @@ source "board/udoo/Kconfig"
>  source "board/udoo/neo/Kconfig"
>  source "board/wandboard/Kconfig"
>  source "board/warp/Kconfig"
> +source "board/logicpd/imx6/Kconfig"
>  
>  endif
> diff --git a/board/logicpd/imx6/Kconfig b/board/logicpd/imx6/Kconfig
> new file mode 100644
> index 0000000..f5e2f58
> --- /dev/null
> +++ b/board/logicpd/imx6/Kconfig
> @@ -0,0 +1,12 @@
> +if TARGET_MX6LOGICPD
> +
> +config SYS_BOARD
> +       default "imx6"
> +
> +config SYS_VENDOR
> +       default "logicpd"
> +
> +config SYS_CONFIG_NAME
> +       default "imx6_logic"
> +
> +endif
> diff --git a/board/logicpd/imx6/MAINTAINERS b/board/logicpd/imx6/MAINTAINERS
> new file mode 100644
> index 0000000..5db7d2c
> --- /dev/null
> +++ b/board/logicpd/imx6/MAINTAINERS
> @@ -0,0 +1,6 @@
> +MX6LOGICPD BOARD
> +M:     Adam Ford <aford173@gmail.com>
> +S:     Maintained
> +F:     board/logicpd/imx6/
> +F:     include/configs/imx6_logic.h
> +F:     configs/imx6q_logic_defconfig
> diff --git a/board/logicpd/imx6/Makefile b/board/logicpd/imx6/Makefile
> new file mode 100644
> index 0000000..397bc5e
> --- /dev/null
> +++ b/board/logicpd/imx6/Makefile
> @@ -0,0 +1,11 @@
> +#
> +# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
> +#
> +# (C) Copyright 2011 Freescale Semiconductor, Inc.
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y  := imx6logic.o
> +obj-$(CONFIG_POWER_PFUZE100)   += ../../freescale/common/pfuze.o
> +
> diff --git a/board/logicpd/imx6/README b/board/logicpd/imx6/README
> new file mode 100644
> index 0000000..5814b9d
> --- /dev/null
> +++ b/board/logicpd/imx6/README
> @@ -0,0 +1,103 @@
> +How to use and build U-Boot on mx6sabresd:
> +----------------------------------
> +
> +Currently there are three methods for booting mx6sabresd boards:
> +

We already know how to boot sabresd - what about your board ?

I do not see support for SPL.

You should also add explanation how to install U-Boot into the NAND.

> +1. Booting via Normal U-Boot (u-boot.imx)
> +
> +2. Booting via SPL (SPL and u-boot.img)
> +
> +3. Booting via Falcon mode (SPL launches the kernel directly)
> +
> +
> +1. Booting via Normal U-Boot
> +----------------------------
> +
> +$ make mx6qsabresd_defconfig (If you want to build for mx6qsabresd)
> +
> +or
> +
> +$ make mx6dlsabresd_defconfig (If you want to build for mx6dlsabresd)
> +
> +$ make
> +
> +This will generate the image called u-boot.imx.
> +
> +- Flash the u-boot.imx binary into the SD card:
> +
> +$ sudo dd if=u-boot.imx of=/dev/sdb bs=1K seek=1 && sync
> +
> +
> +2. Booting via SPL
> +------------------
> +
> +Other method for building U-Boot on mx6qsabresd and mx6qpsabresd is
> +through SPL. In order to do so:
> +
> +$ make mx6sabresd_spl_defconfig
> +$ make
> +
> +This will generate the SPL image called SPL and the u-boot.img.
> +
> +- Flash the SPL image into the SD card:
> +
> +$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 && sync
> +
> +- Flash the u-boot.img image into the SD card:
> +
> +$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 && sync
> +
> +
> +3. Booting via Falcon mode
> +--------------------------
> +
> +$ make mx6sabresd_spl_defconfig
> +$ make
> +
> +This will generate the SPL image called SPL and the u-boot.img.
> +
> +- Flash the SPL image into the SD card:
> +
> +$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 oflag=sync status=none && sync
> +
> +- Flash the u-boot.img image into the SD card:
> +
> +$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 oflag=sync status=none && sync
> +
> +Create a partition for root file system and extract it there:
> +
> +$ sudo tar xvf rootfs.tar.gz -C /media/root
> +
> +The SD card must have enough space for raw "args" and "kernel".
> +To configure Falcon mode for the first time, on U-Boot do the following commands:
> +
> +- Setup the IP server:
> +
> +# setenv serverip <server_ip_address>
> +
> +- Download dtb file:
> +
> +# dhcp ${fdt_addr} imx6q-sabresd.dtb
> +
> +- Download kernel image:
> +
> +# dhcp ${loadaddr} uImage
> +
> +- Write kernel at 2MB offset:
> +
> +# mmc write ${loadaddr} 0x1000 0x4000
> +
> +- Setup kernel bootargs:
> +
> +# setenv bootargs "console=ttymxc0,115200 root=/dev/mmcblk1p1 rootfstype=ext4 rootwait quiet rw"
> +
> +- Prepare args:
> +
> +# spl export fdt ${loadaddr} - ${fdt_addr}
> +
> +- Write args 1MB data (0x800 sectors) to 1MB offset (0x800 sectors)
> +
> +# mmc write 18000000 0x800 0x800
> +
> +- Press KEY_VOL_UP key, power up the board and then SPL binary will
> +launch the kernel directly.
> diff --git a/board/logicpd/imx6/imx6logic.c b/board/logicpd/imx6/imx6logic.c
> new file mode 100644
> index 0000000..18ec9a1
> --- /dev/null
> +++ b/board/logicpd/imx6/imx6logic.c
> @@ -0,0 +1,364 @@
> +/*
> + * Copyright (C) 2017 Logic PD, Inc.
> + *
> + * Author: Adam Ford <aford173@gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <asm/arch/clock.h>
> +#include <asm/arch/imx-regs.h>
> +#include <asm/arch/iomux.h>
> +#include <asm/arch/mx6-pins.h>
> +#include <linux/errno.h>
> +#include <asm/gpio.h>
> +#include <asm/imx-common/mxc_i2c.h>
> +#include <asm/imx-common/iomux-v3.h>
> +#include <asm/imx-common/boot_mode.h>
> +#include <mmc.h>
> +#include <fsl_esdhc.h>
> +#include <miiphy.h>
> +#include <netdev.h>
> +#include <asm/arch/crm_regs.h>
> +#include <asm/io.h>
> +#include <asm/arch/sys_proto.h>
> +#include <i2c.h>
> +#include <power/pmic.h>
> +#include <power/pfuze100_pmic.h>
> +#include "../../freescale/common/pfuze.h"
> +#include <asm/arch/mx6-ddr.h>
> +#include <usb.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
> +	PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
> +
> +#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
> +	PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
> +	PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
> +
> +#define NAND_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
> +
> +#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
> +	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
> +
> +#define I2C_PAD_CTRL   (                       \
> +	PAD_CTL_SPEED_LOW |                                 \
> +	PAD_CTL_DSE_60ohm | PAD_CTL_HYS |                       \
> +	PAD_CTL_ODE | PAD_CTL_SRE_SLOW)
> +
> +#define EPDC_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_SPEED_MED |    \
> +	PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
> +
> +#define I2C_PMIC       2
> +#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
> +
> +int dram_init(void)
> +{
> +	gd->ram_size = imx_ddr_size();
> +	return 0;
> +}
> +
> +iomux_v3_cfg_t const uart1_pads[] = {
> +	MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const uart2_pads[] = {
> +	MX6_PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_SD4_DAT5__UART2_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_SD4_DAT6__UART2_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const uart3_pads[] = {
> +	MX6_PAD_EIM_D23__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_EIM_D24__UART3_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_EIM_D25__UART3_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> +	MX6_PAD_EIM_EB3__UART3_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const enet_pads[] = {
> +	MX6_PAD_ENET_MDIO__ENET_MDIO      | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_MDC__ENET_MDC        | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_GPIO_16__ENET_REF_CLK	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_RXD0__ENET_RX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_RXD1__ENET_RX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_TXD0__ENET_TX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_TXD1__ENET_TX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_CRS_DV__ENET_RX_EN	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_RX_ER__ENET_RX_ER	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	MX6_PAD_ENET_TX_EN__ENET_TX_EN	  | MUX_PAD_CTRL(ENET_PAD_CTRL),
> +	/* LAN8710A PHY Reset */
> +	MX6_PAD_KEY_ROW1__GPIO4_IO09      | MUX_PAD_CTRL(EPDC_PAD_CTRL),
> +	/* LAN8710A nINT Signal */
> +	MX6_PAD_KEY_ROW0__GPIO4_IO07      | MUX_PAD_CTRL(NO_PAD_CTRL),

You have set the complete interface. It is not an issue, but pINT is
never used in U-Boot.

> +};
> +
> +static void setup_iomux_enet(void)
> +{
> +	struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
> +
> +	imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
> +
> +	/* Set GPIO_16 as ENET_REF_CLK_OUT */
> +	setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
> +
> +	/* Ensure nINT is input */
> +	gpio_direction_input(IMX_GPIO_NR(4, 7));
> +
> +	/* Reset LAN8710A PHY */
> +	gpio_direction_output(IMX_GPIO_NR(4, 9) , 0);
> +	udelay(150);
> +	gpio_set_value(IMX_GPIO_NR(4, 9), 1);
> +	mdelay(50);
> +}
> +
> +iomux_v3_cfg_t const usdhc1_pads[] = {
> +	MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_CMD__SD1_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DAT0__SD1_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DAT2__SD1_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD1_DAT3__SD1_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_NANDF_CS3__GPIO6_IO16   | MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +iomux_v3_cfg_t const usdhc2_pads[] = {
> +	MX6_PAD_SD2_CLK__SD2_CLK        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD2_CMD__SD2_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD2_DAT0__SD2_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD2_DAT1__SD2_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD2_DAT2__SD2_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_SD2_DAT3__SD2_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
> +	MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +
> +static struct i2c_pads_info i2c_pad_info3 = {
> +	.scl = {
> +		.i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | MUX_PAD_CTRL(I2C_PAD_CTRL),
> +		.gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | MUX_PAD_CTRL(I2C_PAD_CTRL),
> +		.gp = IMX_GPIO_NR(3, 17)
> +	},
> +	.sda = {
> +		.i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | MUX_PAD_CTRL(I2C_PAD_CTRL),
> +		.gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | MUX_PAD_CTRL(I2C_PAD_CTRL),
> +		.gp = IMX_GPIO_NR(3, 18)
> +	}
> +};
> +
> +static void setup_iomux_uart(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
> +	imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
> +	imx_iomux_v3_setup_multiple_pads(uart3_pads, ARRAY_SIZE(uart3_pads));
> +}
> +
> +iomux_v3_cfg_t const pmic_pads[] = {
> +	MX6_PAD_SD4_DAT0__GPIO2_IO08	| MUX_PAD_CTRL(NO_PAD_CTRL),
> +	MX6_PAD_SD4_DAT3__GPIO2_IO11	| MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +static void setup_pmic_pins(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(pmic_pads, ARRAY_SIZE(pmic_pads));
> +}
> +
> +iomux_v3_cfg_t const nand_pads[] = {
> +	MX6_PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_ALE__NAND_ALE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_CLE__NAND_CLE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_WP_B__NAND_WP_B  | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_RB0__NAND_READY_B   | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D0__NAND_DATA00    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D1__NAND_DATA01    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D2__NAND_DATA02    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D3__NAND_DATA03    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D4__NAND_DATA04    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D5__NAND_DATA05    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D6__NAND_DATA06    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_NANDF_D7__NAND_DATA07    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_SD4_CLK__NAND_WE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +	MX6_PAD_SD4_CMD__NAND_RE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
> +};
> +
> +static void setup_nand_pins(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads));
> +}
> +
> +#ifdef CONFIG_FSL_ESDHC
> +struct fsl_esdhc_cfg usdhc_cfg[] = {
> +	{USDHC1_BASE_ADDR},
> +	{USDHC2_BASE_ADDR},
> +};
> +
> +#define USDHC1_CD_GPIO IMX_GPIO_NR(6, 16)
> +#define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
> +
> +int board_mmc_get_env_dev(int devno)
> +{
> +	return devno - 1;
> +}
> +
> +int board_mmc_getcd(struct mmc *mmc)
> +{
> +	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
> +	int ret = 0;
> +
> +	switch (cfg->esdhc_base) {
> +	case USDHC1_BASE_ADDR:
> +		ret = !gpio_get_value(USDHC1_CD_GPIO);
> +		break;
> +	case USDHC2_BASE_ADDR:
> +		ret = !gpio_get_value(USDHC2_CD_GPIO);
> +		break;
> +	}
> +
> +	return ret;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> +	int ret;
> +	int i;
> +
> +	/*
> +	* According to the board_mmc_init() the following map is done:
> +	* (U-Boot device node)    (Physical Port)
> +	* mmc0                    SOM
> +	* mmc1                    Baseboard
> +	* mmc2                    eMMC
> +	*/
> +	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
> +		switch (i) {
> +		case 0:
> +			imx_iomux_v3_setup_multiple_pads(
> +				   usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
> +			gpio_direction_input(USDHC1_CD_GPIO);
> +			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
> +			break;
> +		case 1:
> +			imx_iomux_v3_setup_multiple_pads(
> +				   usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
> +			gpio_direction_input(USDHC2_CD_GPIO);
> +			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
> +			break;
> +		default:
> +			printf("Warning: you configured more USDHC controllers");
> +			printf("(%d) then supported by the board (%d)\n",
> +			       i + 1, CONFIG_SYS_FSL_USDHC_NUM);
> +			return -EINVAL;
> +		}
> +
> +		ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
> +		if (ret)
> +			return ret;
> +	}
> +	return 0;
> +}
> +#endif
> +
> +int board_phy_config(struct phy_device *phydev)
> +{
> +	if (phydev->drv->config)
> +		phydev->drv->config(phydev);
> +
> +	return 0;
> +}
> +
> +/*
> + * Do not overwrite the console
> + * Use always serial for U-Boot console
> + */
> +int overwrite_console(void)
> +{
> +	return 1;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> +	setup_iomux_enet();
> +	return cpu_eth_init(bis);
> +}
> +
> +int board_early_init_f(void)
> +{
> +	setup_iomux_uart();
> +	setup_pmic_pins();
> +	setup_nand_pins();
> +	return 0;
> +}
> +
> +int board_init(void)
> +{
> +	/* address of boot parameters */
> +	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
> +#ifdef CONFIG_FEC_MXC

I think we should start to get rid of these annoying #ifdef. The board
has always FEC, right ?

> +	enable_fec_anatop_clock(0, ENET_50MHZ);
> +#endif
> +
> +	setup_i2c(2, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE, &i2c_pad_info3);
> +
> +	return 0;
> +}
> +
> +int power_init_board(void)
> +{
> +	struct pmic *p;
> +
> +	p = pfuze_common_init(I2C_PMIC);
> +	if (!p)
> +		return -ENODEV;
> +
> +	return pfuze_mode_init(p, APS_PFM);
> +}
> +
> +#ifdef CONFIG_CMD_BMODE
> +static const struct boot_mode board_boot_modes[] = {
> +	/* 4 bit bus width */
> +	/* 4 bit bus width */
> +	{"sd1",  MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
> +	{"sd2",  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
> +	{NULL,   0},
> +};
> +#endif
> +
> +int board_late_init(void)
> +{
> +#ifdef CONFIG_CMD_BMODE
> +	add_board_boot_modes(board_boot_modes);
> +#endif
> +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
> +	setenv("board_name", "imx6_logicpd");
> +
> +	if (is_mx6dqp()) {
> +		setenv("board_rev", "MX6QP");
> +		setenv("fdt_file", "imx6q-logicpd.dtb");

Do you need the same thing as sabre ? If we check the name, more as
"board_rev" this is a "soc_type". I know that the same is in sabre, I
just ask if this is correct. It is like a misuse.

> +	}
> +	else if (is_mx6dq()) {
> +		setenv("board_rev", "MX6Q");
> +		setenv("fdt_file", "imx6q-logicpd.dtb");
> +	}
> +	else if (is_mx6sdl()) {
> +		setenv("board_rev", "MX6DL");
> +		setenv("fdt_file", "imx6sdl-logicpd.dtb");
> +	}
> +	else if (is_mx6solo()) {
> +		setenv("board_rev", "MX6SOLO");
> +		setenv("fdt_file", "imx6sdl-logicpd.dtb");
> +	}
> +#endif
> +	return 0;
> +}
> +
> +int checkboard(void)
> +{
> +	puts("Board: Logic PD i.MX6 SOM\n");
> +	return 0;
> +}
> diff --git a/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg b/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg
> new file mode 100644
> index 0000000..f22db03
> --- /dev/null
> +++ b/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg
> @@ -0,0 +1,217 @@
> +/*
> + * Copyright (C) 2017 Logic PD, Inc.
> + * Adam Ford <aford173@gmail.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + *
> + * Refer doc/README.imximage for more details about how-to configure
> + * and create imximage boot image
> + *
> + * The syntax is taken as close as possible with the kwbimage
> + */
> +
> +/* image version */
> +IMAGE_VERSION 2
> +
> +/*
> + * Boot Device : sd or nand
> + * nand:   flash_offset: 0x0400
> + * sd/mmc: flash_offset: 0x0400
> + */
> +
> +/* the same flash_offset as sd */
> +BOOT_FROM      sd

...but I have read you boot from NAND, too. Something is not consistent.

> +
> +/*
> + * Device Configuration Data (DCD)
> + *
> + * Each entry must have the format:
> + * Addr-type           Address        Value
> + *
> + * where:
> + *      Addr-type register length (1,2 or 4 bytes)
> + *      Address   absolute address of the register
> + *      value     value to be stored in the register
> + */
> +
> +/* Settings derived from MX6DQSDL DDR3 Script Aid spreadsheet version 0.08 */
> +
> +//=============================================================================
> +//init script for i.Mx6D DDR3

// are not accepted as comment in U-Boot

> +//=============================================================================
> +// Revision History
> +// v01
> +//=============================================================================
> +
> +
> +//=============================================================================
> +// IOMUX
> +//=============================================================================
> +//DDR IO TYPE:
> +DATA 4  0x020e0798 0x000C0000  // IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE
> +DATA 4  0x020e0758 0x00000000  // IOMUXC_SW_PAD_CTL_GRP_DDRPKE
> +
> +//CLOCK:
> +DATA 4  0x020e0588 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_0
> +DATA 4  0x020e0594 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK_1
> +
> +//ADDRESS:
> +DATA 4  0x020e056c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_CAS
> +DATA 4  0x020e0578 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_RAS
> +DATA 4  0x020e074c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_ADDDS
> +
> +//Control:
> +DATA 4  0x020e057c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_RESET
> +DATA 4  0x020e058c 0x00000000  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDBA2 - DSE can be configured using Group Control Register: IOMUXC_SW_PAD_CTL_GRP_CTLDS
> +DATA 4  0x020e059c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT0
> +DATA 4  0x020e05a0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDODT1
> +DATA 4  0x020e078c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_CTLDS
> +
> +//Data Strobes:
> +DATA 4  0x020e0750 0x00020000  // IOMUXC_SW_PAD_CTL_GRP_DDRMODE_CTL
> +DATA 4  0x020e05a8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS0
> +DATA 4  0x020e05b0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS1
> +DATA 4  0x020e0524 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS2
> +DATA 4  0x020e051c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS3
> +//DATA 4  0x020e0518 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS4
> +//DATA 4  0x020e050c 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS5
> +//DATA 4  0x020e05b8 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS6
> +//DATA 4  0x020e05c0 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS7
> +
> +//Data:
> +DATA 4  0x020e0774 0x00020000  // IOMUXC_SW_PAD_CTL_GRP_DDRMODE
> +DATA 4  0x020e0784 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B0DS
> +DATA 4  0x020e0788 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B1DS
> +DATA 4  0x020e0794 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B2DS
> +DATA 4  0x020e079c 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B3DS
> +//DATA 4  0x020e07a0 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B4DS
> +//DATA 4  0x020e07a4 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B5DS
> +//DATA 4  0x020e07a8 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B6DS
> +//DATA 4  0x020e0748 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B7DS

No dead code, please


Anyway, these are default values for DDR controller - why do you need ?

> +
> +DATA 4  0x020e05ac 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM0
> +DATA 4  0x020e05b4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1
> +DATA 4  0x020e0528 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM2
> +DATA 4  0x020e0520 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM3
> +//DATA 4  0x020e0514 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM4
> +//DATA 4  0x020e0510 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM5
> +//DATA 4  0x020e05bc 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM6
> +//DATA 4  0x020e05c4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM7
> +
> +
> +//=============================================================================
> +// DDR Controller Registers
> +//=============================================================================
> +// Manufacturer:	Micron
> +// Device Part Number:	MT41K512M16HA-125
> +// Clock Freq.: 	528MHz
> +// Density per CS in Gb: 	16
> +// Chip Selects used:	1
> +// Number of Banks:	8
> +// Row address:    	16
> +// Column address: 	10
> +// Data bus width	32
> +//=============================================================================
> +DATA 4  0x021b001c 0x00008000  //MMDC0_MDSCR set the Configuration request bit during MMDC set up
> +
> +//=============================================================================
> +// Calibration setup.
> +//=============================================================================
> +DATA 4  0x021b0800 0xA1390003  // DDR_PHY_P0_MPZQHWCTRL enable both one-time & periodic HW ZQ calibration.
> +
> +// For target board may need to run write leveling calibration to fine tune these settings.
> +DATA 4  0x021b080c 0x002D003A  // MMDC1_MPWLDECTRL0
> +DATA 4  0x021b0810 0x0038002B  // MMDC1_MPWLDECTRL1
> +//DATA 4  0x021b480c 0x00000000
> +//DATA 4  0x021b4810 0x00000000
> +
> +////Read DQS Gating calibration
> +DATA 4  0x021b083c 0x03340338  // MPDGCTRL0 PHY0
> +DATA 4  0x021b0840 0x0334032C  // MPDGCTRL1 PHY0
> +//DATA 4  0x021b483c 0x00000000  // MPDGCTRL0 PHY1
> +//DATA 4  0x021b4840 0x00000000  // MPDGCTRL1 PHY1
> +
> +//Read calibration
> +DATA 4  0x021b0848 0x4036383C  // MPRDDLCTL PHY0
> +//DATA 4  0x021b4848 0x40404040  // MPRDDLCTL PHY1
> +
> +//Write calibration
> +DATA 4  0x021b0850 0x2E384038  // MPWRDLCTL PHY0
> +//DATA 4  0x021b4850 0x40404040  // MPWRDLCTL PHY1
> +
> +//read data bit delay: (3 is the reccommended default value although out of reset value is 0)
> +DATA 4  0x021b081c 0x33333333  // DDR_PHY_P0_MPREDQBY0DL3
> +DATA 4  0x021b0820 0x33333333  // DDR_PHY_P0_MPREDQBY1DL3
> +DATA 4  0x021b0824 0x33333333  // DDR_PHY_P0_MPREDQBY2DL3
> +DATA 4  0x021b0828 0x33333333  // DDR_PHY_P0_MPREDQBY3DL3
> +//DATA 4  0x021b481c 0x33333333  // DDR_PHY_P1_MPREDQBY0DL3
> +//DATA 4  0x021b4820 0x33333333  // DDR_PHY_P1_MPREDQBY1DL3
> +//DATA 4  0x021b4824 0x33333333  // DDR_PHY_P1_MPREDQBY2DL3
> +//DATA 4  0x021b4828 0x33333333  // DDR_PHY_P1_MPREDQBY3DL3
> +
> +//For i.mx6qd parts of versions A & B (v1.0 v1.1) uncomment the following lines. For version C (v1.2) keep commented
> +//DATA 4  0x021b08c0 0x24911492  // fine tune SDCLK duty cyc to low - seen to improve measured duty cycle of i.mx6
> +//DATA 4  0x021b48c0 0x24911492

???

If there something that depends on SOC version, it should be done in
code by checking the HW revision and not hard-coding it into DCD.


> +
> +// Complete calibration by forced measurement:
> +DATA 4  0x021b08b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr
> +//DATA 4  0x021b48b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr


> +//=============================================================================
> +// Calibration setup end
> +//=============================================================================
> +
> +//MMDC init:
> +DATA 4  0x021b0004 0x00020036  // MMDC0_MDPDC
> +DATA 4  0x021b0008 0x09444040  // MMDC0_MDOTC
> +DATA 4  0x021b000c 0xB8BE7955  // MMDC0_MDCFG0
> +DATA 4  0x021b0010 0xFF328F64  // MMDC0_MDCFG1
> +DATA 4  0x021b0014 0x01FF00DB  // MMDC0_MDCFG2
> +
> +//MDMISC: RALAT kept to the high level of 5.
> +//MDMISC: consider reducing RALAT if your 528MHz board design allow that. Lower RALAT benefits:
> +//a. better operation at low frequency for LPDDR2 freq < 100MHz change RALAT to 3
> +//b. Small performence improvment
> +DATA 4  0x021b0018 0x00011740  // MMDC0_MDMISC
> +DATA 4  0x021b001c 0x00008000  // MMDC0_MDSCR set the Configuration request bit during MMDC set up
> +DATA 4  0x021b002c 0x000026D2  // MMDC0_MDRWD
> +DATA 4  0x021b0030 0x00BE1023  // MMDC0_MDOR
> +DATA 4  0x021b0040 0x00000047  // Chan0 CS0_END
> +DATA 4  0x021b0000 0x85190000  // MMDC0_MDCTL
> +
> +//Mode register writes
> +DATA 4  0x021b001c 0x00888032  // MMDC0_MDSCR MR2 write CS0
> +DATA 4  0x021b001c 0x00008033  // MMDC0_MDSCR MR3 write CS0
> +DATA 4  0x021b001c 0x00008031  // MMDC0_MDSCR MR1 write CS0
> +DATA 4  0x021b001c 0x19408030  // MMDC0_MDSCR MR0write CS0
> +DATA 4  0x021b001c 0x04008040  // MMDC0_MDSCR ZQ calibration command sent to device on CS0
> +
> +//DATA 4  0x021b001c 0x0088803A  // MMDC0_MDSCR MR2 write CS1
> +//DATA 4  0x021b001c 0x0000803B  // MMDC0_MDSCR MR3 write CS1
> +//DATA 4  0x021b001c 0x00008039  // MMDC0_MDSCR MR1 write CS1
> +//DATA 4  0x021b001c 0x19408038  // MMDC0_MDSCR MR0write CS1
> +//DATA 4  0x021b001c 0x04008048  // MMDC0_MDSCR ZQ calibration command sent to device on CS1
> +
> +DATA 4  0x021b0020 0x00007800  // MMDC0_MDREF
> +
> +DATA 4  0x021b0818 0x00000007  // DDR_PHY_P0_MPODTCTRL
> +//DATA 4  0x021b4818 0x00000007  // DDR_PHY_P1_MPODTCTRL
> +
> +DATA 4  0x021b0004 0x00025576  // MMDC0_MDPDC now SDCTL power down enabled
> +
> +DATA 4  0x021b0404 0x00011006  // MMDC0_MAPSR ADOPT power down enabled MMDC will enter automatically to self-refresh while the number of idle cycle reached.
> +
> +DATA 4  0x021b001c 0x00000000  // MMDC0_MDSCR clear this register (especially the configuration bit as initialization is complete)
> +/* set the default clock gate to save power */
> +DATA 4 0x020c4068 0x00C03F3F
> +DATA 4 0x020c406c 0x0030FC03
> +DATA 4 0x020c4070 0x0FFFC000
> +DATA 4 0x020c4074 0x3FF00000
> +DATA 4 0x020c4078 0xFFFFF300
> +DATA 4 0x020c407c 0x0F0000F3
> +DATA 4 0x020c4080 0x00000FFF
> +

I am still missing why we have to code this into the DCD instead of
using the code provided by U-Boot. There are functions to setup the DDR
controller and even (thanks to Marek !) for dynamic calibration. And
yes, there are much more easy to maintain as these chunk of hexadecimal
values.


> +/* enable AXI cache for VDOA/VPU/IPU */
> +DATA 4 0x020e0010 0xF00000CF
> +/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
> +DATA 4 0x020e0018 0x007F007F
> +DATA 4 0x020e001c 0x007F007F

Same here, it is normally part of common i.MX code.

> \ No newline at end of file
> diff --git a/configs/imx6q_logic_defconfig b/configs/imx6q_logic_defconfig
> new file mode 100644
> index 0000000..1526d38
> --- /dev/null
> +++ b/configs/imx6q_logic_defconfig
> @@ -0,0 +1,30 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_MX6=y
> +CONFIG_TARGET_MX6LOGICPD=y
> +CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg,MX6Q"
> +CONFIG_BOOTDELAY=3
> +# CONFIG_CONSOLE_MUX is not set
> +CONFIG_SYS_CONSOLE_IS_IN_ENV=y
> +CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y
> +CONFIG_HUSH_PARSER=y
> +CONFIG_SYS_PROMPT="i.MX6 Logic # "
> +CONFIG_CMD_BOOTZ=y
> +# CONFIG_CMD_IMLS is not set
> +# CONFIG_CMD_FLASH is not set
> +CONFIG_CMD_MMC=y
> +CONFIG_CMD_NAND=y
> +CONFIG_CMD_I2C=y
> +CONFIG_CMD_GPIO=y
> +CONFIG_CMD_DHCP=y
> +CONFIG_CMD_MII=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_CACHE=y
> +CONFIG_CMD_EXT2=y
> +CONFIG_CMD_EXT4=y
> +CONFIG_CMD_EXT4_WRITE=y
> +CONFIG_CMD_FAT=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_NAND_MXS=y
> +CONFIG_DISPLAY_CPUINFO=y
> +CONFIG_CMD_MEMTEST=y
> +CONFIG_OF_LIBFDT=y
> diff --git a/include/configs/imx6_logic.h b/include/configs/imx6_logic.h
> new file mode 100644
> index 0000000..556cad2
> --- /dev/null
> +++ b/include/configs/imx6_logic.h
> @@ -0,0 +1,194 @@
> +/*
> + * Copyright (C) 2017 Logic PD, Inc.
> + *
> + * Configuration settings for the LogicPD i.MX6 SOM.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef __IMX6LOGIC_CONFIG_H
> +#define __IMX6LOGIC_CONFIG_H
> +
> +#define CONFIG_MACH_TYPE       3980
> +#define CONFIG_MXC_UART_BASE   UART1_BASE
> +#define CONSOLE_DEV            "ttymxc0"
> +
> +#include "mx6_common.h"
> +
> +#define CONFIG_IMX_THERMAL
> +
> +/* Size of malloc() pool */
> +#define CONFIG_SYS_MALLOC_LEN          (10 * SZ_1M)
> +
> +#define CONFIG_MXC_UART
> +
> +/* MMC Configs */
> +#define CONFIG_SYS_FSL_ESDHC_ADDR      0
> +#define CONFIG_SYS_FSL_USDHC_NUM       2
> +#define CONFIG_MMCROOT         "/dev/mmcblk1p2" /* Dev kit SD card */
> +
> +/* Ethernet Configs */
> +#define CONFIG_FEC_MXC
> +#define CONFIG_MII
> +#define IMX_FEC_BASE                   ENET_BASE_ADDR
> +#define CONFIG_FEC_XCV_TYPE            RMII
> +#define CONFIG_ETHPRIME                "FEC"
> +#define CONFIG_FEC_MXC_PHYADDR         0
> +#define CONFIG_PHYLIB
> +#define CONFIG_PHY_SMSC
> +
> +/* Command definition */
> +#define CONFIG_CMD_BMODE
> +
> +#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> +	"script=boot.scr\0" \
> +	"image=zImage\0" \
> +	"fdt_addr=0x18000000\0" \
> +	"ramdisk_addr=0x13000000\0" \
> +	"ramdisk_file=rootfs.cpio.uboot\0" \
> +	"boot_fdt=try\0" \
> +	"ip_dyn=yes\0" \
> +	"console=" CONSOLE_DEV "\0" \
> +	"fdt_high=0xffffffff\0"   \
> +	"initrd_high=0xffffffff\0" \
> +	"mmcdev=1\0" \
> +	"mmcpart=1\0" \
> +	"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
> +	"nandroot=ubi0:rootfs rootfstype=ubifs\0" \
> +	"mmcargs=setenv bootargs console=${console},${baudrate}" \
> +	" root=${mmcroot} ${mtdparts}\0" \
> +	"nandargs=setenv bootargs console=${console},${baudrate}" \
> +	" ubi.mtd=fs root=${nandroot} ${mtdparts}\0" \
> +	"ramargs=setenv bootargs console=${console},${baudrate}" \
> +	" root=/dev/ram rw ${mtdparts}\0"                    \
> +	"loadbootscript=" \
> +	"fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
> +	"bootscript=echo Running bootscript from mmc ...;" \
> +	" source\0" \
> +	"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
> +	"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
> +	"loadramdisk=fatload mmc ${mmcdev}:${mmcpart} ${ramdisk_addr} ${ramdisk_file}\0" \
> +	"mmcboot=echo Booting from mmc...; run mmcargs; run loadimage;" \
> +	" run loadfdt; bootz ${loadaddr} - ${fdt_addr}\0" \
> +	"mmcramboot=run ramargs; run loadimage;" \
> +	" run loadfdt; run loadramdisk;" \
> +	" bootz ${loadaddr} ${ramdisk_addr} ${fdt_addr}\0" \
> +	"nandboot=echo Booting from nand ...; " \
> +	" run nandargs;" \
> +	" nand read ${loadaddr} kernel;" \
> +	" nand read ${fdt_addr} dtb;" \
> +	" bootz ${loadaddr} - ${fdt_addr}\0" \
> +	"nandramboot=echo Booting RAMdisk from nand ...; " \
> +	" nand read ${ramdisk_addr} fs ${ramdisksize};" \
> +	" nand read ${loadaddr} kernel;" \
> +	" nand read ${fdt_addr} dtb;" \
> +	" run ramargs;" \
> +	" bootz ${loadaddr} ${ramdisk_addr} ${fdt_addr}\0" \
> +	"netargs=setenv bootargs console=${console},${baudrate} " \
> +	"root=/dev/nfs" \
> +	" ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
> +	"netboot=echo Booting from net ...; " \
> +	"run netargs; " \
> +	"if test ${ip_dyn} = yes; then " \
> +		"setenv get_cmd dhcp; " \
> +	"else " \
> +		"setenv get_cmd tftp; " \
> +	"fi; " \
> +	"${get_cmd} ${image}; " \
> +	"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
> +		"if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
> +			"bootz ${loadaddr} - ${fdt_addr}; " \
> +		"else " \
> +			"if test ${boot_fdt} = try; then " \
> +				"bootz; " \
> +				"else " \
> +				"echo WARN: Cannot load the DT; " \
> +			"fi; " \
> +		"fi; " \
> +	"else " \
> +	       "bootz; " \
> +	"fi;\0" \
> +	"autoboot=mmc dev ${mmcdev};" \
> +	"if mmc rescan; then " \
> +		"if run loadbootscript; then " \
> +			"run bootscript; " \
> +		"else " \
> +		"if run loadimage; then " \
> +			"run mmcboot; " \
> +		"else run netboot; " \
> +		"fi; " \
> +	"fi; " \
> +	"else run netboot; fi"
> +#define CONFIG_BOOTCOMMAND \
> +	"run autoboot"
> +
> +#define CONFIG_ARP_TIMEOUT     200UL
> +
> +#define CONFIG_SYS_MEMTEST_START       0x10000000
> +#define CONFIG_SYS_MEMTEST_END         0x10010000
> +#define CONFIG_SYS_MEMTEST_SCRATCH     0x10800000
> +
> +#define CONFIG_STACKSIZE               (128 * 1024)
> +
> +/* Physical Memory Map */
> +#define CONFIG_NR_DRAM_BANKS           1
> +#define PHYS_SDRAM                     MMDC0_ARB_BASE_ADDR
> +#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
> +#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
> +#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
> +
> +#define CONFIG_SYS_INIT_SP_OFFSET \
> +	(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
> +#define CONFIG_SYS_INIT_SP_ADDR \
> +	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
> +
> +/* Environment organization */
> +#define CONFIG_ENV_SIZE                        (8 * 1024)
> +#define CONFIG_ENV_IS_IN_NAND
> +#define CONFIG_ENV_OFFSET             0x400000
> +#define CONFIG_ENV_SECT_SIZE          CONFIG_ENV_SIZE
> +
> +
> +/* I2C Configs */
> +#define CONFIG_SYS_I2C
> +#define CONFIG_SYS_I2C_MXC
> +#define CONFIG_SYS_I2C_MXC_I2C1
> +#define CONFIG_SYS_I2C_MXC_I2C2
> +#define CONFIG_SYS_I2C_MXC_I2C3
> +#define CONFIG_SYS_I2C_SPEED	400000
> +#define CONFIG_SYS_I2C_SLAVE	0x8
> +
> +/* NAND flash command */
> +
> +#define CONFIG_CMD_NAND_TRIMFFS
> +
> +/* 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_U_BOOT_START	CONFIG_SYS_TEXT_BASE
> +#define CONFIG_SYS_NAND_U_BOOT_OFFS	0x200000
> +
> +/* MTD device */
> +# define CONFIG_MTD_DEVICE
> +# define CONFIG_CMD_MTDPARTS
> +# define CONFIG_MTD_PARTITIONS
> +# define MTDIDS_DEFAULT		"nand0=gpmi-nand"
> +# define MTDPARTS_DEFAULT	"mtdparts=gpmi-nand:4m(uboot)," \
> +					"1m(env),8m(kernel),1m(dtb),-(fs)"
> +
> +/* DMA stuff, needed for GPMI/MXS NAND support */
> +#define CONFIG_APBH_DMA
> +#define CONFIG_APBH_DMA_BURST
> +#define CONFIG_APBH_DMA_BURST8
> +
> +/* PMIC */
> +#define CONFIG_POWER
> +#define CONFIG_POWER_I2C
> +#define CONFIG_POWER_PFUZE100
> +#define CONFIG_POWER_PFUZE100_I2C_ADDR 0x08
> +
> +#endif                         /* __IMX6LOGIC_CONFIG_H */
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
  2017-03-24 11:09 ` Stefano Babic
@ 2017-03-24 13:28   ` Adam Ford
  0 siblings, 0 replies; 6+ messages in thread
From: Adam Ford @ 2017-03-24 13:28 UTC (permalink / raw)
  To: u-boot

On Fri, Mar 24, 2017 at 6:09 AM, Stefano Babic <sbabic@denx.de> wrote:
> Hi Adam,
>
> On 22/03/2017 23:07, Adam Ford wrote:
>> Logic PD has an i.MX6Q system on module (SOM) with a development kit.
>> This have been verified to boot the i.MX6Q version over either SD
>> on the development kit or NAND built into the SOM.
>
> A short list of supported peripherals (Ethernet,..) will help. See
> commits of other i.MX6 boards.
>
>>
>> Signed-off-by: Adam Ford <aford173@gmail.com>
>>
>> diff --git a/arch/arm/cpu/armv7/mx6/Kconfig b/arch/arm/cpu/armv7/mx6/Kconfig
>> index 190e5c6..059d905 100644
>> --- a/arch/arm/cpu/armv7/mx6/Kconfig
>> +++ b/arch/arm/cpu/armv7/mx6/Kconfig
>> @@ -367,6 +367,13 @@ config TARGET_ZC5601
>>       select DM
>>       select DM_THERMAL
>>
>> +config TARGET_MX6LOGICPD
>> +     bool "mx6logicpd"
>> +     select BOARD_LATE_INIT
>> +     select DM
>> +     select DM_THERMAL
>> +     select BOARD_EARLY_INIT_F
>> +
>>  endchoice
>>
>>  config SYS_SOC
>> @@ -415,5 +422,6 @@ source "board/udoo/Kconfig"
>>  source "board/udoo/neo/Kconfig"
>>  source "board/wandboard/Kconfig"
>>  source "board/warp/Kconfig"
>> +source "board/logicpd/imx6/Kconfig"
>>
>>  endif
>> diff --git a/board/logicpd/imx6/Kconfig b/board/logicpd/imx6/Kconfig
>> new file mode 100644
>> index 0000000..f5e2f58
>> --- /dev/null
>> +++ b/board/logicpd/imx6/Kconfig
>> @@ -0,0 +1,12 @@
>> +if TARGET_MX6LOGICPD
>> +
>> +config SYS_BOARD
>> +       default "imx6"
>> +
>> +config SYS_VENDOR
>> +       default "logicpd"
>> +
>> +config SYS_CONFIG_NAME
>> +       default "imx6_logic"
>> +
>> +endif
>> diff --git a/board/logicpd/imx6/MAINTAINERS b/board/logicpd/imx6/MAINTAINERS
>> new file mode 100644
>> index 0000000..5db7d2c
>> --- /dev/null
>> +++ b/board/logicpd/imx6/MAINTAINERS
>> @@ -0,0 +1,6 @@
>> +MX6LOGICPD BOARD
>> +M:     Adam Ford <aford173@gmail.com>
>> +S:     Maintained
>> +F:     board/logicpd/imx6/
>> +F:     include/configs/imx6_logic.h
>> +F:     configs/imx6q_logic_defconfig
>> diff --git a/board/logicpd/imx6/Makefile b/board/logicpd/imx6/Makefile
>> new file mode 100644
>> index 0000000..397bc5e
>> --- /dev/null
>> +++ b/board/logicpd/imx6/Makefile
>> @@ -0,0 +1,11 @@
>> +#
>> +# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
>> +#
>> +# (C) Copyright 2011 Freescale Semiconductor, Inc.
>> +#
>> +# SPDX-License-Identifier:     GPL-2.0+
>> +#
>> +
>> +obj-y  := imx6logic.o
>> +obj-$(CONFIG_POWER_PFUZE100)   += ../../freescale/common/pfuze.o
>> +
>> diff --git a/board/logicpd/imx6/README b/board/logicpd/imx6/README
>> new file mode 100644
>> index 0000000..5814b9d
>> --- /dev/null
>> +++ b/board/logicpd/imx6/README
>> @@ -0,0 +1,103 @@
>> +How to use and build U-Boot on mx6sabresd:
>> +----------------------------------
>> +
>> +Currently there are three methods for booting mx6sabresd boards:
>> +
>
> We already know how to boot sabresd - what about your board ?
>
> I do not see support for SPL.
>
> You should also add explanation how to install U-Boot into the NAND.
>
>> +1. Booting via Normal U-Boot (u-boot.imx)
>> +
>> +2. Booting via SPL (SPL and u-boot.img)
>> +
>> +3. Booting via Falcon mode (SPL launches the kernel directly)
>> +
>> +
>> +1. Booting via Normal U-Boot
>> +----------------------------
>> +
>> +$ make mx6qsabresd_defconfig (If you want to build for mx6qsabresd)
>> +
>> +or
>> +
>> +$ make mx6dlsabresd_defconfig (If you want to build for mx6dlsabresd)
>> +
>> +$ make
>> +
>> +This will generate the image called u-boot.imx.
>> +
>> +- Flash the u-boot.imx binary into the SD card:
>> +
>> +$ sudo dd if=u-boot.imx of=/dev/sdb bs=1K seek=1 && sync
>> +
>> +
>> +2. Booting via SPL
>> +------------------
>> +
>> +Other method for building U-Boot on mx6qsabresd and mx6qpsabresd is
>> +through SPL. In order to do so:
>> +
>> +$ make mx6sabresd_spl_defconfig
>> +$ make
>> +
>> +This will generate the SPL image called SPL and the u-boot.img.
>> +
>> +- Flash the SPL image into the SD card:
>> +
>> +$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 && sync
>> +
>> +- Flash the u-boot.img image into the SD card:
>> +
>> +$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 && sync
>> +
>> +
>> +3. Booting via Falcon mode
>> +--------------------------
>> +
>> +$ make mx6sabresd_spl_defconfig
>> +$ make
>> +
>> +This will generate the SPL image called SPL and the u-boot.img.
>> +
>> +- Flash the SPL image into the SD card:
>> +
>> +$ sudo dd if=SPL of=/dev/sdb bs=1K seek=1 oflag=sync status=none && sync
>> +
>> +- Flash the u-boot.img image into the SD card:
>> +
>> +$ sudo dd if=u-boot.img of=/dev/sdbbs=1K seek=69 oflag=sync status=none && sync
>> +
>> +Create a partition for root file system and extract it there:
>> +
>> +$ sudo tar xvf rootfs.tar.gz -C /media/root
>> +
>> +The SD card must have enough space for raw "args" and "kernel".
>> +To configure Falcon mode for the first time, on U-Boot do the following commands:
>> +
>> +- Setup the IP server:
>> +
>> +# setenv serverip <server_ip_address>
>> +
>> +- Download dtb file:
>> +
>> +# dhcp ${fdt_addr} imx6q-sabresd.dtb
>> +
>> +- Download kernel image:
>> +
>> +# dhcp ${loadaddr} uImage
>> +
>> +- Write kernel at 2MB offset:
>> +
>> +# mmc write ${loadaddr} 0x1000 0x4000
>> +
>> +- Setup kernel bootargs:
>> +
>> +# setenv bootargs "console=ttymxc0,115200 root=/dev/mmcblk1p1 rootfstype=ext4 rootwait quiet rw"
>> +
>> +- Prepare args:
>> +
>> +# spl export fdt ${loadaddr} - ${fdt_addr}
>> +
>> +- Write args 1MB data (0x800 sectors) to 1MB offset (0x800 sectors)
>> +
>> +# mmc write 18000000 0x800 0x800
>> +
>> +- Press KEY_VOL_UP key, power up the board and then SPL binary will
>> +launch the kernel directly.
>> diff --git a/board/logicpd/imx6/imx6logic.c b/board/logicpd/imx6/imx6logic.c
>> new file mode 100644
>> index 0000000..18ec9a1
>> --- /dev/null
>> +++ b/board/logicpd/imx6/imx6logic.c
>> @@ -0,0 +1,364 @@
>> +/*
>> + * Copyright (C) 2017 Logic PD, Inc.
>> + *
>> + * Author: Adam Ford <aford173@gmail.com>
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +#include <asm/arch/clock.h>
>> +#include <asm/arch/imx-regs.h>
>> +#include <asm/arch/iomux.h>
>> +#include <asm/arch/mx6-pins.h>
>> +#include <linux/errno.h>
>> +#include <asm/gpio.h>
>> +#include <asm/imx-common/mxc_i2c.h>
>> +#include <asm/imx-common/iomux-v3.h>
>> +#include <asm/imx-common/boot_mode.h>
>> +#include <mmc.h>
>> +#include <fsl_esdhc.h>
>> +#include <miiphy.h>
>> +#include <netdev.h>
>> +#include <asm/arch/crm_regs.h>
>> +#include <asm/io.h>
>> +#include <asm/arch/sys_proto.h>
>> +#include <i2c.h>
>> +#include <power/pmic.h>
>> +#include <power/pfuze100_pmic.h>
>> +#include "../../freescale/common/pfuze.h"
>> +#include <asm/arch/mx6-ddr.h>
>> +#include <usb.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +#define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
>> +     PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
>> +     PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
>> +
>> +#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |            \
>> +     PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
>> +     PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
>> +
>> +#define NAND_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |            \
>> +     PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
>> +     PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
>> +
>> +#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
>> +     PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
>> +
>> +#define I2C_PAD_CTRL   (                       \
>> +     PAD_CTL_SPEED_LOW |                                 \
>> +     PAD_CTL_DSE_60ohm | PAD_CTL_HYS |                       \
>> +     PAD_CTL_ODE | PAD_CTL_SRE_SLOW)
>> +
>> +#define EPDC_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_SPEED_MED |    \
>> +     PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
>> +
>> +#define I2C_PMIC       2
>> +#define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
>> +
>> +int dram_init(void)
>> +{
>> +     gd->ram_size = imx_ddr_size();
>> +     return 0;
>> +}
>> +
>> +iomux_v3_cfg_t const uart1_pads[] = {
>> +     MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const uart2_pads[] = {
>> +     MX6_PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_SD4_DAT5__UART2_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_SD4_DAT6__UART2_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const uart3_pads[] = {
>> +     MX6_PAD_EIM_D23__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_EIM_D24__UART3_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_EIM_D25__UART3_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +     MX6_PAD_EIM_EB3__UART3_RTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const enet_pads[] = {
>> +     MX6_PAD_ENET_MDIO__ENET_MDIO      | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_MDC__ENET_MDC        | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_GPIO_16__ENET_REF_CLK     | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_RXD0__ENET_RX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_RXD1__ENET_RX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_TXD0__ENET_TX_DATA0  | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_TXD1__ENET_TX_DATA1  | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_CRS_DV__ENET_RX_EN   | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_RX_ER__ENET_RX_ER    | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     MX6_PAD_ENET_TX_EN__ENET_TX_EN    | MUX_PAD_CTRL(ENET_PAD_CTRL),
>> +     /* LAN8710A PHY Reset */
>> +     MX6_PAD_KEY_ROW1__GPIO4_IO09      | MUX_PAD_CTRL(EPDC_PAD_CTRL),
>> +     /* LAN8710A nINT Signal */
>> +     MX6_PAD_KEY_ROW0__GPIO4_IO07      | MUX_PAD_CTRL(NO_PAD_CTRL),
>
> You have set the complete interface. It is not an issue, but pINT is
> never used in U-Boot.
>
>> +};
>> +
>> +static void setup_iomux_enet(void)
>> +{
>> +     struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
>> +
>> +     imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
>> +
>> +     /* Set GPIO_16 as ENET_REF_CLK_OUT */
>> +     setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
>> +
>> +     /* Ensure nINT is input */
>> +     gpio_direction_input(IMX_GPIO_NR(4, 7));
>> +
>> +     /* Reset LAN8710A PHY */
>> +     gpio_direction_output(IMX_GPIO_NR(4, 9) , 0);
>> +     udelay(150);
>> +     gpio_set_value(IMX_GPIO_NR(4, 9), 1);
>> +     mdelay(50);
>> +}
>> +
>> +iomux_v3_cfg_t const usdhc1_pads[] = {
>> +     MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD1_CMD__SD1_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD1_DAT0__SD1_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD1_DAT1__SD1_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD1_DAT2__SD1_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD1_DAT3__SD1_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_NANDF_CS3__GPIO6_IO16   | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +};
>> +
>> +iomux_v3_cfg_t const usdhc2_pads[] = {
>> +     MX6_PAD_SD2_CLK__SD2_CLK        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD2_CMD__SD2_CMD        | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD2_DAT0__SD2_DATA0     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD2_DAT1__SD2_DATA1     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD2_DAT2__SD2_DATA2     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_SD2_DAT3__SD2_DATA3     | MUX_PAD_CTRL(USDHC_PAD_CTRL),
>> +     MX6_PAD_GPIO_4__GPIO1_IO04      | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +};
>> +
>> +
>> +static struct i2c_pads_info i2c_pad_info3 = {
>> +     .scl = {
>> +             .i2c_mode = MX6_PAD_EIM_D17__I2C3_SCL | MUX_PAD_CTRL(I2C_PAD_CTRL),
>> +             .gpio_mode = MX6_PAD_EIM_D17__GPIO3_IO17 | MUX_PAD_CTRL(I2C_PAD_CTRL),
>> +             .gp = IMX_GPIO_NR(3, 17)
>> +     },
>> +     .sda = {
>> +             .i2c_mode = MX6_PAD_EIM_D18__I2C3_SDA | MUX_PAD_CTRL(I2C_PAD_CTRL),
>> +             .gpio_mode = MX6_PAD_EIM_D18__GPIO3_IO18 | MUX_PAD_CTRL(I2C_PAD_CTRL),
>> +             .gp = IMX_GPIO_NR(3, 18)
>> +     }
>> +};
>> +
>> +static void setup_iomux_uart(void)
>> +{
>> +     imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
>> +     imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
>> +     imx_iomux_v3_setup_multiple_pads(uart3_pads, ARRAY_SIZE(uart3_pads));
>> +}
>> +
>> +iomux_v3_cfg_t const pmic_pads[] = {
>> +     MX6_PAD_SD4_DAT0__GPIO2_IO08    | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +     MX6_PAD_SD4_DAT3__GPIO2_IO11    | MUX_PAD_CTRL(NO_PAD_CTRL),
>> +};
>> +
>> +static void setup_pmic_pins(void)
>> +{
>> +     imx_iomux_v3_setup_multiple_pads(pmic_pads, ARRAY_SIZE(pmic_pads));
>> +}
>> +
>> +iomux_v3_cfg_t const nand_pads[] = {
>> +     MX6_PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_ALE__NAND_ALE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_CLE__NAND_CLE  | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_WP_B__NAND_WP_B  | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_RB0__NAND_READY_B   | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D0__NAND_DATA00    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D1__NAND_DATA01    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D2__NAND_DATA02    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D3__NAND_DATA03    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D4__NAND_DATA04    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D5__NAND_DATA05    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D6__NAND_DATA06    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_NANDF_D7__NAND_DATA07    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_SD4_CLK__NAND_WE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +     MX6_PAD_SD4_CMD__NAND_RE_B    | MUX_PAD_CTRL(NAND_PAD_CTRL),
>> +};
>> +
>> +static void setup_nand_pins(void)
>> +{
>> +     imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads));
>> +}
>> +
>> +#ifdef CONFIG_FSL_ESDHC
>> +struct fsl_esdhc_cfg usdhc_cfg[] = {
>> +     {USDHC1_BASE_ADDR},
>> +     {USDHC2_BASE_ADDR},
>> +};
>> +
>> +#define USDHC1_CD_GPIO IMX_GPIO_NR(6, 16)
>> +#define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
>> +
>> +int board_mmc_get_env_dev(int devno)
>> +{
>> +     return devno - 1;
>> +}
>> +
>> +int board_mmc_getcd(struct mmc *mmc)
>> +{
>> +     struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
>> +     int ret = 0;
>> +
>> +     switch (cfg->esdhc_base) {
>> +     case USDHC1_BASE_ADDR:
>> +             ret = !gpio_get_value(USDHC1_CD_GPIO);
>> +             break;
>> +     case USDHC2_BASE_ADDR:
>> +             ret = !gpio_get_value(USDHC2_CD_GPIO);
>> +             break;
>> +     }
>> +
>> +     return ret;
>> +}
>> +
>> +int board_mmc_init(bd_t *bis)
>> +{
>> +     int ret;
>> +     int i;
>> +
>> +     /*
>> +     * According to the board_mmc_init() the following map is done:
>> +     * (U-Boot device node)    (Physical Port)
>> +     * mmc0                    SOM
>> +     * mmc1                    Baseboard
>> +     * mmc2                    eMMC
>> +     */
>> +     for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
>> +             switch (i) {
>> +             case 0:
>> +                     imx_iomux_v3_setup_multiple_pads(
>> +                                usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
>> +                     gpio_direction_input(USDHC1_CD_GPIO);
>> +                     usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
>> +                     break;
>> +             case 1:
>> +                     imx_iomux_v3_setup_multiple_pads(
>> +                                usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
>> +                     gpio_direction_input(USDHC2_CD_GPIO);
>> +                     usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
>> +                     break;
>> +             default:
>> +                     printf("Warning: you configured more USDHC controllers");
>> +                     printf("(%d) then supported by the board (%d)\n",
>> +                            i + 1, CONFIG_SYS_FSL_USDHC_NUM);
>> +                     return -EINVAL;
>> +             }
>> +
>> +             ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
>> +             if (ret)
>> +                     return ret;
>> +     }
>> +     return 0;
>> +}
>> +#endif
>> +
>> +int board_phy_config(struct phy_device *phydev)
>> +{
>> +     if (phydev->drv->config)
>> +             phydev->drv->config(phydev);
>> +
>> +     return 0;
>> +}
>> +
>> +/*
>> + * Do not overwrite the console
>> + * Use always serial for U-Boot console
>> + */
>> +int overwrite_console(void)
>> +{
>> +     return 1;
>> +}
>> +
>> +int board_eth_init(bd_t *bis)
>> +{
>> +     setup_iomux_enet();
>> +     return cpu_eth_init(bis);
>> +}
>> +
>> +int board_early_init_f(void)
>> +{
>> +     setup_iomux_uart();
>> +     setup_pmic_pins();
>> +     setup_nand_pins();
>> +     return 0;
>> +}
>> +
>> +int board_init(void)
>> +{
>> +     /* address of boot parameters */
>> +     gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
>> +#ifdef CONFIG_FEC_MXC
>


> I think we should start to get rid of these annoying #ifdef. The board
> has always FEC, right ?
>

I find them annoying too, but I was trying to make this file flexible
and able to enable/disable features more easily.  The System is broken
into two parts, the System on Module (SOM) and the baseboard.    I'll
explain that in an updated patch ti give more background, but the
baseboards may have different options enabled and disabled but they
are all based on the same SOM.  I am trying to start with adding
support for one board for now, but eventually, I hope to add more.
The idea here was to try to enable most things, but also make it easy
to remove them if they are not present.

>> +     enable_fec_anatop_clock(0, ENET_50MHZ);
>> +#endif
>> +

[snip]

>
> Do you need the same thing as sabre ? If we check the name, more as
> "board_rev" this is a "soc_type". I know that the same is in sabre, I
> just ask if this is correct. It is like a misuse.

The initial support will support Dual and Quad.  I borrowed this from
sabresd, but I prefer a switch statement, so I'm going to redo that.
Eventually, the next board introduced will support SOLO, so I'll add
those in as a future patch when I get the SOLO stuff completed.

Since the device trees are compatible between Quad and Dual, and
DualLite and Solo, I'll remove the board_rev stuff, but leave the
fdt_file stuff to make booting simpler.
>
>> +     }
>> +     else if (is_mx6dq()) {
>> +             setenv("board_rev", "MX6Q");
>> +             setenv("fdt_file", "imx6q-logicpd.dtb");
>> +     }
>> +     else if (is_mx6sdl()) {
>> +             setenv("board_rev", "MX6DL");
>> +             setenv("fdt_file", "imx6sdl-logicpd.dtb");
>> +     }
>> +     else if (is_mx6solo()) {
>> +             setenv("board_rev", "MX6SOLO");
>> +             setenv("fdt_file", "imx6sdl-logicpd.dtb");
>> +     }
>> +#endif
>> +     return 0;
>> +}
>> +

[snip]

>> --- /dev/null
>> +++ b/board/logicpd/imx6/mx6q_2x_MT41K512M16HA.cfg
>> @@ -0,0 +1,217 @@
>> +/*
>> + * Copyright (C) 2017 Logic PD, Inc.
>> + * Adam Ford <aford173@gmail.com>
>> + *
>> + * SPDX-License-Identifier:  GPL-2.0+
>> + *
>> + * Refer doc/README.imximage for more details about how-to configure
>> + * and create imximage boot image
>> + *
>> + * The syntax is taken as close as possible with the kwbimage
>> + */
>> +
>> +/* image version */
>> +IMAGE_VERSION 2
>> +
>> +/*
>> + * Boot Device : sd or nand
>> + * nand:   flash_offset: 0x0400
>> + * sd/mmc: flash_offset: 0x0400
>> + */
>> +
>> +/* the same flash_offset as sd */
>> +BOOT_FROM      sd
>
> ...but I have read you boot from NAND, too. Something is not consistent.

This whole thing is confusing to me.  I read the the README.imximage
file, but the vast majority of the boards used this context despite
being inconsistent with the readme. I think what I need to do is add:

  #include <asm/imx-common/imximage.cfg>
  BOOT_OFFSET FLASH_OFFSET_STANDARD

Is that correct?

[snip]

>> +//DATA 4  0x020e07a0 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B4DS
>> +//DATA 4  0x020e07a4 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B5DS
>> +//DATA 4  0x020e07a8 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B6DS
>> +//DATA 4  0x020e0748 0x00000030  // IOMUXC_SW_PAD_CTL_GRP_B7DS
>
> No dead code, please
>
Sorry about that.  I took the output of the DDR Stress Test tool, and
did a massive find-replace.  I ran the checkpatch script, but I think
it must ignore the .cfg file endings.

>
> Anyway, these are default values for DDR controller - why do you need ?
>

I am not sure what I need. Looking at bunch of boards, many of them
use similar settings.  The README.imximage didn't explicitly say what
I need and don't need, and I am new to the i.MX6.
>> +
>> +DATA 4  0x020e05ac 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM0
>> +DATA 4  0x020e05b4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1
>> +DATA 4  0x020e0528 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM2
>> +DATA 4  0x020e0520 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM3
>> +//DATA 4  0x020e0514 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM4
>> +//DATA 4  0x020e0510 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM5
>> +//DATA 4  0x020e05bc 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM6
>> +//DATA 4  0x020e05c4 0x00000030  // IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM7
>> +
>> +

[snip]

>> +//For i.mx6qd parts of versions A & B (v1.0 v1.1) uncomment the following lines. For version C (v1.2) keep commented
>> +//DATA 4  0x021b08c0 0x24911492  // fine tune SDCLK duty cyc to low - seen to improve measured duty cycle of i.mx6
>> +//DATA 4  0x021b48c0 0x24911492
>
> ???
>
> If there something that depends on SOC version, it should be done in
> code by checking the HW revision and not hard-coding it into DCD.
>
Again, I just took the output of the stress test tool and used its
output.  I'll remove the dead code.

>
>> +
>> +// Complete calibration by forced measurement:
>> +DATA 4  0x021b08b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr
>> +//DATA 4  0x021b48b8 0x00000800  // DDR_PHY_P0_MPMUR0 frc_msr
>
>
>> +//=============================================================================
>> +// Calibration setup end
>> +//=============================================================================
>> +
>> +//MMDC init:
>> +DATA 4  0x021b0004 0x00020036  // MMDC0_MDPDC
>> +DATA 4  0x021b0008 0x09444040  // MMDC0_MDOTC
>> +DATA 4  0x021b000c 0xB8BE7955  // MMDC0_MDCFG0
>> +DATA 4  0x021b0010 0xFF328F64  // MMDC0_MDCFG1
>> +DATA 4  0x021b0014 0x01FF00DB  // MMDC0_MDCFG2
>> +
>> +//MDMISC: RALAT kept to the high level of 5.
>> +//MDMISC: consider reducing RALAT if your 528MHz board design allow that. Lower RALAT benefits:
>> +//a. better operation at low frequency for LPDDR2 freq < 100MHz change RALAT to 3
>> +//b. Small performence improvment
>> +DATA 4  0x021b0018 0x00011740  // MMDC0_MDMISC
>> +DATA 4  0x021b001c 0x00008000  // MMDC0_MDSCR set the Configuration request bit during MMDC set up
>> +DATA 4  0x021b002c 0x000026D2  // MMDC0_MDRWD
>> +DATA 4  0x021b0030 0x00BE1023  // MMDC0_MDOR
>> +DATA 4  0x021b0040 0x00000047  // Chan0 CS0_END
>> +DATA 4  0x021b0000 0x85190000  // MMDC0_MDCTL
>> +
>> +//Mode register writes
>> +DATA 4  0x021b001c 0x00888032  // MMDC0_MDSCR MR2 write CS0
>> +DATA 4  0x021b001c 0x00008033  // MMDC0_MDSCR MR3 write CS0
>> +DATA 4  0x021b001c 0x00008031  // MMDC0_MDSCR MR1 write CS0
>> +DATA 4  0x021b001c 0x19408030  // MMDC0_MDSCR MR0write CS0
>> +DATA 4  0x021b001c 0x04008040  // MMDC0_MDSCR ZQ calibration command sent to device on CS0
>> +
>> +//DATA 4  0x021b001c 0x0088803A  // MMDC0_MDSCR MR2 write CS1
>> +//DATA 4  0x021b001c 0x0000803B  // MMDC0_MDSCR MR3 write CS1
>> +//DATA 4  0x021b001c 0x00008039  // MMDC0_MDSCR MR1 write CS1
>> +//DATA 4  0x021b001c 0x19408038  // MMDC0_MDSCR MR0write CS1
>> +//DATA 4  0x021b001c 0x04008048  // MMDC0_MDSCR ZQ calibration command sent to device on CS1
>> +
>> +DATA 4  0x021b0020 0x00007800  // MMDC0_MDREF
>> +
>> +DATA 4  0x021b0818 0x00000007  // DDR_PHY_P0_MPODTCTRL
>> +//DATA 4  0x021b4818 0x00000007  // DDR_PHY_P1_MPODTCTRL
>> +
>> +DATA 4  0x021b0004 0x00025576  // MMDC0_MDPDC now SDCTL power down enabled
>> +
>> +DATA 4  0x021b0404 0x00011006  // MMDC0_MAPSR ADOPT power down enabled MMDC will enter automatically to self-refresh while the number of idle cycle reached.
>> +
>> +DATA 4  0x021b001c 0x00000000  // MMDC0_MDSCR clear this register (especially the configuration bit as initialization is complete)
>> +/* set the default clock gate to save power */
>> +DATA 4 0x020c4068 0x00C03F3F
>> +DATA 4 0x020c406c 0x0030FC03
>> +DATA 4 0x020c4070 0x0FFFC000
>> +DATA 4 0x020c4074 0x3FF00000
>> +DATA 4 0x020c4078 0xFFFFF300
>> +DATA 4 0x020c407c 0x0F0000F3
>> +DATA 4 0x020c4080 0x00000FFF
>> +
>
> I am still missing why we have to code this into the DCD instead of
> using the code provided by U-Boot. There are functions to setup the DDR
> controller and even (thanks to Marek !) for dynamic calibration. And
> yes, there are much more easy to maintain as these chunk of hexadecimal
> values.
>

I tried removing the two sections commented by "set the default clock
gate to save power" and
"enable AXI cache for VDOA/VPU/IPU" but U-Boot didn't show anything on
the screen.  Is there some standard library or thing I need to
include?  I see some boards use these sections and others do not, but
it's not clear to me as to why.  I borrowed the concepts from SabreSD
and it uses these.

>
>> +/* enable AXI cache for VDOA/VPU/IPU */
>> +DATA 4 0x020e0010 0xF00000CF
>> +/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
>> +DATA 4 0x020e0018 0x007F007F
>> +DATA 4 0x020e001c 0x007F007F
>
> Same here, it is normally part of common i.MX code.

[snip]

>
> Best regards,
> Stefano Babic

I very much appreciate your review and patience while I learn the
i.MX6.  I'm going to work on the other comments from the others, but
if you have suggestions on how to avoid putting stuff into the DCD,
and the giant table, I'm very excited to try.
>
> --
> =====================================================================
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
> =====================================================================

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM
  2017-03-23  0:27 ` Tom Rini
@ 2017-03-24 19:33   ` Adam Ford
  0 siblings, 0 replies; 6+ messages in thread
From: Adam Ford @ 2017-03-24 19:33 UTC (permalink / raw)
  To: u-boot

On Wed, Mar 22, 2017 at 7:27 PM, Tom Rini <trini@konsulko.com> wrote:
> On Wed, Mar 22, 2017 at 05:07:02PM -0500, Adam Ford wrote:
>
>> Logic PD has an i.MX6Q system on module (SOM) with a development kit.
>> This have been verified to boot the i.MX6Q version over either SD
>> on the development kit or NAND built into the SOM.
>>

[snip]

>
>> +     "fdt_high=0xffffffff\0"   \
>> +     "initrd_high=0xffffffff\0" \
>
> I'm really really not a fan of disabling these relocations, please use
> bootm_size to tell U-Boot where to make sure everything resides without
> overlap.  Also, distro boot?

If I remove "initrd_high" then the booting with a RAM Disk fails even
when I define bootm_size.  I have looked at several i.MX6 boards, and
it seems like the ones with RAM Disk options have this parameter.

I am sure what distro boot is.  Can you elaborate?
>
> [snip]
>> +# define MTDPARTS_DEFAULT    "mtdparts=gpmi-nand:4m(uboot)," \
>> +                                     "1m(env),8m(kernel),1m(dtb),-(fs)"
>
> Are you really sure all of these sizes are what you can live with for a
> long long time?  That kernel size feels small.

I defined the kernel to 8m based on the vast majority of the other
i.MX6 boards, but I can see your point.  I think I will just aim high
and go for 16.  This has plenty of NAND.

>
> Thanks!
>
Thank you for the feedback.

adam
> --
> Tom

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-03-24 19:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-22 22:07 [U-Boot] [PATCH] imx: i.mx6q: add the initial support for LogicPD i.MX6Q SOM Adam Ford
2017-03-22 22:29 ` Fabio Estevam
2017-03-23  0:27 ` Tom Rini
2017-03-24 19:33   ` Adam Ford
2017-03-24 11:09 ` Stefano Babic
2017-03-24 13:28   ` Adam Ford

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.