[U-Boot] [PATCH 3/5] mx6cuboxi: Introduce multi-SoC support

Stefano Babic sbabic at denx.de
Thu Apr 23 08:16:11 CEST 2015


Hi Fabio,

On 23/04/2015 05:57, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam at freescale.com>
> 
> Cubox-i and Hummingboard support several MX6 SoCs: mx6solo, mx6dual-lite,
> mx6dual and mx6quad. Add support for the different SoC/memory sizes 
> combinations.
> 
> Tested on a CuBox-i4Pro, HummingBoard-i2eX and HummingBoard-i1.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
> ---
>  board/solidrun/mx6cuboxi/mx6cuboxi.c | 134 ++++++++++++++++++++++++++++++++---
>  1 file changed, 125 insertions(+), 9 deletions(-)
> 
> diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> index 0377dc4..1f240ae 100644
> --- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
> +++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> @@ -175,7 +175,7 @@ int checkboard(void)
>  
>  #ifdef CONFIG_SPL_BUILD
>  #include <asm/arch/mx6-ddr.h>
> -static const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = {
> +static const struct mx6dq_iomux_ddr_regs mx6q_ddr_ioregs = {
>  	.dram_sdclk_0 =  0x00020030,
>  	.dram_sdclk_1 =  0x00020030,
>  	.dram_cas =  0x00020030,
> @@ -204,7 +204,36 @@ static const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = {
>  	.dram_dqm7 =  0x00020030,
>  };
>  
> -static const struct mx6dq_iomux_grp_regs mx6_grp_ioregs = {
> +static const struct mx6sdl_iomux_ddr_regs mx6dl_ddr_ioregs = {
> +	.dram_sdclk_0 = 0x00000028,
> +	.dram_sdclk_1 = 0x00000028,
> +	.dram_cas =	0x00000028,
> +	.dram_ras =	0x00000028,
> +	.dram_reset =	0x000c0028,
> +	.dram_sdcke0 =	0x00003000,
> +	.dram_sdcke1 =	0x00003000,
> +	.dram_sdba2 =	0x00000000,
> +	.dram_sdodt0 =	0x00003030,
> +	.dram_sdodt1 =	0x00003030,
> +	.dram_sdqs0 =	0x00000028,
> +	.dram_sdqs1 =	0x00000028,
> +	.dram_sdqs2 =	0x00000028,
> +	.dram_sdqs3 =	0x00000028,
> +	.dram_sdqs4 =	0x00000028,
> +	.dram_sdqs5 =	0x00000028,
> +	.dram_sdqs6 =	0x00000028,
> +	.dram_sdqs7 =	0x00000028,
> +	.dram_dqm0 =	0x00000028,
> +	.dram_dqm1 =	0x00000028,
> +	.dram_dqm2 =	0x00000028,
> +	.dram_dqm3 =	0x00000028,
> +	.dram_dqm4 =	0x00000028,
> +	.dram_dqm5 =	0x00000028,
> +	.dram_dqm6 =	0x00000028,
> +	.dram_dqm7 =	0x00000028,
> +};
> +
> +static const struct mx6dq_iomux_grp_regs mx6q_grp_ioregs = {
>  	.grp_ddr_type =  0x000C0000,
>  	.grp_ddrmode_ctl =  0x00020000,
>  	.grp_ddrpke =  0x00000000,
> @@ -221,7 +250,25 @@ static const struct mx6dq_iomux_grp_regs mx6_grp_ioregs = {
>  	.grp_b7ds =  0x00000030,
>  };
>  
> -static const struct mx6_mmdc_calibration mx6_mmcd_calib = {
> +static const struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = {
> +	.grp_ddr_type = 0x000c0000,
> +	.grp_ddrmode_ctl = 0x00020000,
> +	.grp_ddrpke = 0x00000000,
> +	.grp_addds = 0x00000028,
> +	.grp_ctlds = 0x00000028,
> +	.grp_ddrmode = 0x00020000,
> +	.grp_b0ds = 0x00000028,
> +	.grp_b1ds = 0x00000028,
> +	.grp_b2ds = 0x00000028,
> +	.grp_b3ds = 0x00000028,
> +	.grp_b4ds = 0x00000028,
> +	.grp_b5ds = 0x00000028,
> +	.grp_b6ds = 0x00000028,
> +	.grp_b7ds = 0x00000028,
> +};
> +
> +/* microSOM with Dual processor and 1GB memory */
> +static const struct mx6_mmdc_calibration mx6q_1g_mmcd_calib = {
>  	.p0_mpwldectrl0 =  0x00000000,
>  	.p0_mpwldectrl1 =  0x00000000,
>  	.p1_mpwldectrl0 =  0x00000000,
> @@ -236,7 +283,49 @@ static const struct mx6_mmdc_calibration mx6_mmcd_calib = {
>  	.p1_mpwrdlctl =    0x422a423c,
>  };
>  
> -static struct mx6_ddr3_cfg mem_ddr = {
> +/* microSOM with Quad processor and 2GB memory */
> +static const struct mx6_mmdc_calibration mx6q_2g_mmcd_calib = {
> +	.p0_mpwldectrl0 =  0x00000000,
> +	.p0_mpwldectrl1 =  0x00000000,
> +	.p1_mpwldectrl0 =  0x00000000,
> +	.p1_mpwldectrl1 =  0x00000000,
> +	.p0_mpdgctrl0 =    0x0314031c,
> +	.p0_mpdgctrl1 =    0x023e0304,
> +	.p1_mpdgctrl0 =    0x03240330,
> +	.p1_mpdgctrl1 =    0x03180260,
> +	.p0_mprddlctl =    0x3630323c,
> +	.p1_mprddlctl =    0x3436283a,
> +	.p0_mpwrdlctl =    0x36344038,
> +	.p1_mpwrdlctl =    0x422a423c,
> +};
> +
> +/* microSOM with Solo processor and 512MB memory */
> +static const struct mx6_mmdc_calibration mx6dl_512m_mmcd_calib = {
> +	.p0_mpwldectrl0 = 0x0045004D,
> +	.p0_mpwldectrl1 = 0x003A0047,
> +	.p0_mpdgctrl0 =   0x023C0224,
> +	.p0_mpdgctrl1 =   0x02000220,
> +	.p0_mprddlctl =   0x44444846,
> +	.p0_mpwrdlctl =   0x32343032,
> +};
> +
> +/* microSOM with Dual lite processor and 1GB memory */
> +static const struct mx6_mmdc_calibration mx6dl_1g_mmcd_calib = {
> +	.p0_mpwldectrl0 =  0x0045004D,
> +	.p0_mpwldectrl1 =  0x003A0047,
> +	.p1_mpwldectrl0 =  0x001F001F,
> +	.p1_mpwldectrl1 =  0x00210035,
> +	.p0_mpdgctrl0 =    0x023C0224,
> +	.p0_mpdgctrl1 =    0x02000220,
> +	.p1_mpdgctrl0 =    0x02200220,
> +	.p1_mpdgctrl1 =    0x02000220,
> +	.p0_mprddlctl =    0x44444846,
> +	.p1_mprddlctl =    0x4042463C,
> +	.p0_mpwrdlctl =    0x32343032,
> +	.p1_mpwrdlctl =    0x36363430,
> +};
> +
> +static struct mx6_ddr3_cfg mem_ddr_2g = {
>  	.mem_speed = 1600,
>  	.density   = 2,
>  	.width     = 16,
> @@ -250,6 +339,19 @@ static struct mx6_ddr3_cfg mem_ddr = {
>  	.SRT       = 1,
>  };
>  
> +static struct mx6_ddr3_cfg mem_ddr_4g = {
> +	.mem_speed = 1600,
> +	.density = 4,
> +	.width = 16,
> +	.banks = 8,
> +	.rowaddr = 15,
> +	.coladdr = 10,
> +	.pagesz = 2,
> +	.trcd = 1375,
> +	.trcmin = 4875,
> +	.trasmin = 3500,
> +};
> +
>  static void ccgr_init(void)
>  {
>  	struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
> @@ -278,11 +380,11 @@ static void gpr_init(void)
>   * This section requires the differentiation between Solidrun mx6 boards, but
>   * for now, it will configure only for the mx6dual hummingboard version.
>   */
> -static void spl_dram_init(void)
> +static void spl_dram_init(int width)
>  {
>  	struct mx6_ddr_sysinfo sysinfo = {
>  		/* width of data bus: 0=16, 1=32, 2=64 */
> -		.dsize = 2,
> +		.dsize = width / 32,
>  		/* config for full 4GB range so that get_mem_size() works */
>  		.cs_density = 32,	/* 32Gb per CS */
>  		.ncs = 1,		/* single chip select */
> @@ -297,8 +399,19 @@ static void spl_dram_init(void)
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  	};
>  
> -	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
> -	mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
> +	if (is_cpu_type(MXC_CPU_MX6D) || is_cpu_type(MXC_CPU_MX6Q))
> +		mx6dq_dram_iocfg(width, &mx6q_ddr_ioregs, &mx6q_grp_ioregs);
> +	else
> +		mx6sdl_dram_iocfg(width, &mx6dl_ddr_ioregs, &mx6sdl_grp_ioregs);
> +
> +	if (is_cpu_type(MXC_CPU_MX6D))
> +		mx6_dram_cfg(&sysinfo, &mx6q_1g_mmcd_calib, &mem_ddr_2g);
> +	else if (is_cpu_type(MXC_CPU_MX6Q))
> +		mx6_dram_cfg(&sysinfo, &mx6q_2g_mmcd_calib, &mem_ddr_4g);
> +	else if (is_cpu_type(MXC_CPU_MX6DL))
> +		mx6_dram_cfg(&sysinfo, &mx6q_1g_mmcd_calib, &mem_ddr_2g);
> +	else if (is_cpu_type(MXC_CPU_MX6SOLO))
> +		mx6_dram_cfg(&sysinfo, &mx6dl_512m_mmcd_calib, &mem_ddr_2g);
>  }
>  
>  void board_init_f(ulong dummy)
> @@ -319,7 +432,10 @@ void board_init_f(ulong dummy)
>  	preloader_console_init();
>  
>  	/* DDR initialization */
> -	spl_dram_init();
> +	if (is_cpu_type(MXC_CPU_MX6SOLO))
> +		spl_dram_init(32);
> +	else
> +		spl_dram_init(64);
>  
>  	/* Clear the BSS. */
>  	memset(__bss_start, 0, __bss_end - __bss_start);
> 

Reviewed-by: Stefano Babic <sbabic at denx.de>

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
=====================================================================


More information about the U-Boot mailing list