public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stefano Babic <sbabic@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 7/8] imx6: SPL support for iMX6 SabreSD
Date: Sun, 09 Nov 2014 22:16:15 +0100	[thread overview]
Message-ID: <545FD99F.2050801@denx.de> (raw)
In-Reply-To: <1415482079-9531-8-git-send-email-john.tobias.ph@gmail.com>

Hi John,

On 08/11/2014 22:27, John Tobias wrote:
> This patch will enable the support for SPL on iMX6 SabreSD.
> It tested on SD2 and SD3 mmc port.
> ---
>  board/freescale/mx6sabresd/mx6sabresd.c | 211 +++++++++++++++++++++++++++++++-
>  1 file changed, 209 insertions(+), 2 deletions(-)
> 
> diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c
> index 3d81fff..f443337 100644
> --- a/board/freescale/mx6sabresd/mx6sabresd.c
> +++ b/board/freescale/mx6sabresd/mx6sabresd.c
> @@ -55,8 +55,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  
>  int dram_init(void)
>  {
> -	gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> -
> +	gd->ram_size = imx_ddr_size();
>  	return 0;
>  }
>  
> @@ -607,3 +606,211 @@ int checkboard(void)
>  	puts("Board: MX6-SabreSD\n");
>  	return 0;
>  }
> +
> +#ifdef CONFIG_SPL_BUILD
> +#include <spl.h>
> +#include <libfdt.h>
> +
> +#define BOOT_CFG	0x20D8004
> +#define __REG(x)        (*((volatile u32 *)(x)))
> +
> +struct fsl_esdhc_cfg spl_usdhc_cfg;
> +/*
> + * Got it from mx6q_4x_mt41j128.cfg file
> + */
> +void set_mt41j128_ddr(void)
> +{
> +	__REG(0x020e05a8) = 0x00000028;
> +	__REG(0x020e05b0) = 0x00000028;
> +	__REG(0x020e0524) = 0x00000028;
> +	__REG(0x020e051c) = 0x00000028;
> +
> +	__REG(0x020e0518) = 0x00000028;
> +	__REG(0x020e050c) = 0x00000028;
> +	__REG(0x020e05b8) = 0x00000028;
> +	__REG(0x020e05c0) = 0x00000028;
> +
> +	__REG(0x020e05ac) = 0x00000028;
> +	__REG(0x020e05b4) = 0x00000028;
> +	__REG(0x020e0528) = 0x00000028;
> +	__REG(0x020e0520) = 0x00000028;
> +
> +	__REG(0x020e0514) = 0x00000028;
> +	__REG(0x020e0510) = 0x00000028;
> +	__REG(0x020e05bc) = 0x00000028;
> +	__REG(0x020e05c4) = 0x00000028;
> +
> +	__REG(0x020e056c) = 0x00000030;
> +	__REG(0x020e0578) = 0x00000030;
> +	__REG(0x020e0588) = 0x00000030;
> +	__REG(0x020e0594) = 0x00000030;
> +
> +	__REG(0x020e057c) = 0x00000030;
> +	__REG(0x020e0590) = 0x00000030;
> +	__REG(0x020e0598) = 0x00000030;
> +	__REG(0x020e058c) = 0x00000000;
> +
> +	__REG(0x020e059c) = 0x00003030;
> +	__REG(0x020e05a0) = 0x00003030;
> +	__REG(0x020e0784) = 0x00000028;
> +	__REG(0x020e0788) = 0x00000028;
> +
> +	__REG(0x020e0794) = 0x00000028;
> +	__REG(0x020e079c) = 0x00000028;
> +	__REG(0x020e07a0) = 0x00000028;
> +	__REG(0x020e07a4) = 0x00000028;
> +
> +	__REG(0x020e07a8) = 0x00000028;
> +	__REG(0x020e0748) = 0x00000028;
> +	__REG(0x020e074c) = 0x00000030;
> +	__REG(0x020e0750) = 0x00020000;
> +
> +	__REG(0x020e0758) = 0x00000000;
> +	__REG(0x020e0774) = 0x00020000;
> +	__REG(0x020e078c) = 0x00000030;
> +	__REG(0x020e0798) = 0x000C0000;
> +
> +	__REG(0x021b081c) = 0x33333333;
> +	__REG(0x021b0820) = 0x33333333;
> +	__REG(0x021b0824) = 0x33333333;
> +	__REG(0x021b0828) = 0x33333333;
> +
> +	__REG(0x021b481c) = 0x33333333;
> +	__REG(0x021b4820) = 0x33333333;
> +	__REG(0x021b4824) = 0x33333333;
> +	__REG(0x021b4828) = 0x33333333;
> +
> +	__REG(0x021b0018) = 0x00001740;
> +
> +	__REG(0x021b001c) = 0x00008000;
> +	__REG(0x021b000c) = 0x8A8F7975;
> +	__REG(0x021b0010) = 0xFF538E64;
> +	__REG(0x021b0014) = 0x01FF00DB;
> +	__REG(0x021b002c) = 0x000026D2;
> +
> +	__REG(0x021b0030) = 0x008F0E21;
> +	__REG(0x021b0008) = 0x09444040;
> +	__REG(0x021b0004) = 0x00020036;
> +	__REG(0x021b0040) = 0x00000047;
> +	__REG(0x021b0000) = 0x841A0000;
> +
> +	__REG(0x021b001c) = 0x04088032;
> +	__REG(0x021b001c) = 0x00008033;
> +	__REG(0x021b001c) = 0x00428031;
> +	__REG(0x021b001c) = 0x09408030;
> +
> +	__REG(0x021b001c) = 0x04008040;
> +	__REG(0x021b0800) = 0xA1380003;
> +	__REG(0x021b0020) = 0x00005800;
> +	__REG(0x021b0818) = 0x00000007;
> +	__REG(0x021b4818) = 0x00000007;
> +
> +	/* Calibration values based on ARD and 528MHz */
> +	__REG(0x021b083c) = 0x434B0358;
> +	__REG(0x021b0840) = 0x033D033C;
> +	__REG(0x021b483c) = 0x03520362;
> +	__REG(0x021b4840) = 0x03480318;
> +	__REG(0x021b0848) = 0x41383A3C;
> +	__REG(0x021b4848) = 0x3F3C374A;
> +	__REG(0x021b0850) = 0x42434444;
> +	__REG(0x021b4850) = 0x4932473A;
> +
> +	__REG(0x021b080c) = 0x001F001F;
> +	__REG(0x021b0810) = 0x001F001F;
> +
> +	__REG(0x021b480c) = 0x001F001F;
> +	__REG(0x021b4810) = 0x001F001F;
> +
> +	__REG(0x021b08b8) = 0x00000800;
> +	__REG(0x021b48b8) = 0x00000800;
> +
> +	__REG(0x021b0404) = 0x00011006;
> +	__REG(0x021b0004) = 0x00025576;
> +
> +	__REG(0x021b001c) = 0x00000000;
> +
> +	__REG(0x020c4068) = 0x00C03F3F;
> +	__REG(0x020c406c) = 0x0030FC00;
> +	__REG(0x020c4070) = 0x0FFFC000;
> +	__REG(0x020c4074) = 0x3FF00000;
> +	__REG(0x020c4078) = 0x00FFF300;
> +	__REG(0x020c407c) = 0x0F0000C3;
> +	__REG(0x020c4080) = 0x000003FF;
> +}
> +

This cannot be accepted. Firstly, you cannot use fixed offset. The code
you propose here is very difficult to maintain.

Then, please take a look at the i.MX6 boards that are already supporting
SPL (ventana and novena). There is a logical separation between iomux,
calibration, and so on. You have to provide tables, and you should then
call the common functions:

        mx6dq_dram_iocfg();
        mx6_dram_cfg();

Again, please take a look at the boards I mentioned.

> +/*
> + * This section require the differentiation
> + * between iMX6 Sabre Families.
> + * But for now, it will configure only for
> + * SabreSD.
> + */
> +static void spl_dram_init(void)
> +{
> +	set_mt41j128_ddr();
> +}
> +
> +int spl_board_mmc_init(bd_t *bis)
> +{
> +	unsigned reg = readl(BOOT_CFG);
> +	/*
> +	 * Upon reading BOOT_CFG register the following map is done:
> +	 * (U-boot device node)    (Physical Port)
> +	 * 0x840                   SD2
> +	 * 0x1040                  SD3
> +	 * 0x1840                  eMMC
> +	 */

You add a new entry point here (spl_board_mmc_init), but why cannot you
do this in the functions already supplied by SPL ? Why not in board_init_f ?

> +	switch (reg) {
> +	case 0x840:
> +		imx_iomux_v3_setup_multiple_pads(
> +			usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
> +		spl_usdhc_cfg.esdhc_base = USDHC2_BASE_ADDR;
> +		spl_usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
> +		gd->arch.sdhc_clk = spl_usdhc_cfg.sdhc_clk;
> +		break;
> +	case 0x1040:
> +		imx_iomux_v3_setup_multiple_pads(
> +			usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
> +		spl_usdhc_cfg.esdhc_base = USDHC3_BASE_ADDR;
> +		spl_usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
> +		gd->arch.sdhc_clk = spl_usdhc_cfg.sdhc_clk;
> +		break;
> +	case 0x1840:
> +		imx_iomux_v3_setup_multiple_pads(
> +			usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
> +		spl_usdhc_cfg.esdhc_base = USDHC4_BASE_ADDR;
> +		spl_usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
> +		gd->arch.sdhc_clk = spl_usdhc_cfg.sdhc_clk;
> +		break;
> +	}
> +
> +	return fsl_esdhc_initialize(bis, &spl_usdhc_cfg);
> +}
> +
> +void board_init_f(ulong dummy)
> +{
> +	/* setup AIPS and disable watchdog */
> +	arch_cpu_init();
> +
> +	/* iomux and setup of i2c */
> +	board_early_init_f();

??

A "early" function is generally called by common code at a different
point. It makes no sense to call it inside board_init_f()

> +
> +	/* setup GP timer */
> +	timer_init();
> +

Then I am expecting iomux setuup---

> +	/* UART clocks enabled and gd valid - init serial console */
> +	preloader_console_init();
> +
> +	/* DDR initialization */
> +	spl_dram_init();

and here calling the already supplied functions.

> +
> +	/* Clear the BSS. */
> +	memset(__bss_start, 0, __bss_end - __bss_start);
> +
> +	/* load/boot image from boot device */
> +	board_init_r(NULL, 0);
> +}
> +
> +void reset_cpu(ulong addr)
> +{
> +}
> +#endif
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
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
=====================================================================

  reply	other threads:[~2014-11-09 21:16 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-08 21:27 [U-Boot] [PATCH v3 0/8] *** iMX6 SabreSD SPL Support *** John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 1/8] mmc: add spl_board_mmc_init John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 2/8] mmc: imx6: call spl_board_mmc_init John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 3/8] imx6: add spl on include header file John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 4/8] imx6: add some flexibility for defining macros John Tobias
2014-11-09 21:24   ` Stefano Babic
2014-11-09 23:53     ` John Tobias
2014-11-11  8:28       ` Stefano Babic
2014-11-08 21:27 ` [U-Boot] [PATCH v3 5/8] imx6: add spl on board configuration John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 6/8] imx6: add data configuration file for SPL John Tobias
2014-11-09 21:22   ` Stefano Babic
2014-11-09 23:55     ` John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 7/8] imx6: SPL support for iMX6 SabreSD John Tobias
2014-11-09 21:16   ` Stefano Babic [this message]
2014-11-10  0:23     ` John Tobias
2014-11-11  8:44       ` Stefano Babic
2014-11-11 17:15         ` John Tobias
2014-11-12 10:13           ` Stefano Babic
2014-11-12 16:14             ` John Tobias
2014-11-08 21:27 ` [U-Boot] [PATCH v3 8/8] kconfig: imx6: add SUPPORT_SPL John Tobias

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=545FD99F.2050801@denx.de \
    --to=sbabic@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox