All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields
@ 2016-08-29 23:37 Fabio Estevam
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Fabio Estevam @ 2016-08-29 23:37 UTC (permalink / raw)
  To: u-boot

From: Fabio Estevam <fabio.estevam@nxp.com>

Currently MX6 SPL DDR initialization hardcodes the REF_SEL and
REFR fields of the MDREF register as 1 and 7, respectively for
DDR3 and 0 and 3 for LPDDR2.

Looking at the MDREF initialization done via DCD we see that
boards do need to initialize these fields differently:

$ git grep 0x021b0020 board/
board/bachmann/ot1200/mx6q_4x_mt41j128.cfg:DATA 4 0x021b0020 0x00005800
board/ccv/xpress/imximage.cfg:DATA 4 0x021b0020 0x00000800 /* MMDC0_MDREF */
board/freescale/mx6qarm2/imximage.cfg:DATA 4 0x021b0020 0x7800
board/freescale/mx6qarm2/imximage.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6qarm2/imximage_mx6dl.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6qarm2/imximage_mx6dl.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6qsabreauto/imximage.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6qsabreauto/mx6dl.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6qsabreauto/mx6qp.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6sabresd/mx6dlsabresd.cfg:DATA 4      0x021b0020 0x00005800
board/freescale/mx6sabresd/mx6q_4x_mt41j128.cfg:DATA 4 0x021b0020 0x00005800
board/freescale/mx6slevk/imximage.cfg:DATA 4 0x021b0020 0x00001800
board/freescale/mx6sxsabreauto/imximage.cfg:DATA 4 0x021b0020 0x00000800
board/freescale/mx6sxsabresd/imximage.cfg:DATA 4 0x021b0020 0x00000800
board/warp/imximage.cfg:DATA 4 0x021b0020 0x00001800

So introduce a mechanism for users to be able to configure
REFSEL and REFR fields as needed.

Keep all the mx6 SPL users in their current REF_SEL and REFR values,
so no functional changes for the existing users.

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
---
Changes since v3:
- Fix the logic for setting refsel/refr registers (Eric)

 arch/arm/cpu/armv7/mx6/ddr.c                      | 6 ++----
 arch/arm/include/asm/arch-mx6/mx6-ddr.h           | 2 ++
 board/bachmann/ot1200/ot1200_spl.c                | 2 ++
 board/barco/platinum/spl_picon.c                  | 2 ++
 board/barco/platinum/spl_titanium.c               | 2 ++
 board/ccv/xpress/spl.c                            | 2 ++
 board/compulab/cm_fx6/spl.c                       | 4 ++++
 board/congatec/cgtqmx6eval/cgtqmx6eval.c          | 2 ++
 board/el/el6x/el6x.c                              | 2 ++
 board/freescale/mx6sabresd/mx6sabresd.c           | 2 ++
 board/freescale/mx6slevk/mx6slevk.c               | 2 ++
 board/freescale/mx6sxsabresd/mx6sxsabresd.c       | 2 ++
 board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 4 ++++
 board/gateworks/gw_ventana/gw_ventana_spl.c       | 2 ++
 board/kosagi/novena/novena_spl.c                  | 2 ++
 board/phytec/pcm058/pcm058.c                      | 2 ++
 board/solidrun/mx6cuboxi/mx6cuboxi.c              | 2 ++
 board/udoo/udoo_spl.c                             | 2 ++
 board/wandboard/spl.c                             | 6 ++++++
 19 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/arch/arm/cpu/armv7/mx6/ddr.c b/arch/arm/cpu/armv7/mx6/ddr.c
index f151eec..7beb7ea 100644
--- a/arch/arm/cpu/armv7/mx6/ddr.c
+++ b/arch/arm/cpu/armv7/mx6/ddr.c
@@ -1166,8 +1166,7 @@ void mx6_lpddr2_cfg(const struct mx6_ddr_sysinfo *sysinfo,
 	mmdc0->mpzqhwctrl = val;
 
 	/* Step 12: Configure and activate periodic refresh */
-	mmdc0->mdref = (0 << 14) | /* REF_SEL: Periodic refresh cycle: 64kHz */
-		       (3 << 11);  /* REFR: Refresh Rate - 4 refreshes */
+	mmdc0->mdref = (sysinfo->refsel << 14) | (sysinfo->refr << 11);
 
 	/* Step 13: Deassert config request - init complete */
 	mmdc0->mdscr = 0x00000000;
@@ -1472,8 +1471,7 @@ void mx6_ddr3_cfg(const struct mx6_ddr_sysinfo *sysinfo,
 		MMDC1(mpzqhwctrl, val);
 
 	/* Step 12: Configure and activate periodic refresh */
-	mmdc0->mdref = (1 << 14) | /* REF_SEL: Periodic refresh cycle: 32kHz */
-		       (7 << 11);  /* REFR: Refresh Rate - 8 refreshes */
+	mmdc0->mdref = (sysinfo->refsel << 14) | (sysinfo->refr << 11);
 
 	/* Step 13: Deassert config request - init complete */
 	mmdc0->mdscr = 0x00000000;
diff --git a/arch/arm/include/asm/arch-mx6/mx6-ddr.h b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
index 12c30d2..9922409 100644
--- a/arch/arm/include/asm/arch-mx6/mx6-ddr.h
+++ b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
@@ -408,6 +408,8 @@ struct mx6_ddr_sysinfo {
 	u8 sde_to_rst;	/* Time from SDE enable until DDR reset# is high */
 	u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
 	u8 ddr_type;	/* DDR type: DDR3(0) or LPDDR2(1) */
+	u8 refsel;	/* REF_SEL field of register MDREF */
+	u8 refr;	/* REFR field of register MDREF */
 };
 
 /*
diff --git a/board/bachmann/ot1200/ot1200_spl.c b/board/bachmann/ot1200/ot1200_spl.c
index f651a40..9d28da4 100644
--- a/board/bachmann/ot1200/ot1200_spl.c
+++ b/board/bachmann/ot1200/ot1200_spl.c
@@ -85,6 +85,8 @@ static struct mx6_ddr_sysinfo ot1200_ddr_sysinfo = {
 	.bi_on      = 1,	/* Bank interleaving enabled */	/* war 1 */
 	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
+	.refsel = 1,		/* Refresh cycles at 32KHz */
+	.refr = 7,		/* 8 refresh commands per refresh cycle */
 };
 
 /* MT41K128M16JT-125 */
diff --git a/board/barco/platinum/spl_picon.c b/board/barco/platinum/spl_picon.c
index 098542f..97a861f 100644
--- a/board/barco/platinum/spl_picon.c
+++ b/board/barco/platinum/spl_picon.c
@@ -138,6 +138,8 @@ static void spl_dram_init(int width)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7, 	/* 8 refresh commands per refresh cycle */
 	};
 
 	mx6sdl_dram_iocfg(width, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs);
diff --git a/board/barco/platinum/spl_titanium.c b/board/barco/platinum/spl_titanium.c
index a3a4255..d1ba85a 100644
--- a/board/barco/platinum/spl_titanium.c
+++ b/board/barco/platinum/spl_titanium.c
@@ -141,6 +141,8 @@ static void spl_dram_init(int width)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,		/* Refresh cycles at 32KHz */
+		.refr = 7,		/* 8 refresh commands per refresh cycle */
 	};
 
 	mx6dq_dram_iocfg(width, &mx6dq_ddr_ioregs, &mx6dq_grp_ioregs);
diff --git a/board/ccv/xpress/spl.c b/board/ccv/xpress/spl.c
index d15b842..bea837d 100644
--- a/board/ccv/xpress/spl.c
+++ b/board/ccv/xpress/spl.c
@@ -60,6 +60,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
 	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 	.ddr_type = DDR_TYPE_DDR3,
+	.refsel = 1,		/* Refresh cycles at 32KHz */
+	.refr = 7,		/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg mem_ddr = {
diff --git a/board/compulab/cm_fx6/spl.c b/board/compulab/cm_fx6/spl.c
index d8328fd..9442d09 100644
--- a/board/compulab/cm_fx6/spl.c
+++ b/board/compulab/cm_fx6/spl.c
@@ -107,6 +107,8 @@ static struct mx6_ddr_sysinfo cm_fx6_sysinfo_s = {
 	.mif3_mode	= 3,
 	.rst_to_cke	= 0x23,
 	.sde_to_rst	= 0x10,
+	.refsel = 1,		/* Refresh cycles at 32KHz */
+	.refr = 7,		/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg cm_fx6_ddr3_cfg_s = {
@@ -174,6 +176,8 @@ static struct mx6_ddr_sysinfo cm_fx6_sysinfo_q = {
 	.mif3_mode	= 3,
 	.rst_to_cke	= 0x23,
 	.sde_to_rst	= 0x10,
+	.refsel = 1,		/* Refresh cycles at 32KHz */
+	.refr = 7,		/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg cm_fx6_ddr3_cfg_q = {
diff --git a/board/congatec/cgtqmx6eval/cgtqmx6eval.c b/board/congatec/cgtqmx6eval/cgtqmx6eval.c
index 3fbd3d2..a4a6029 100644
--- a/board/congatec/cgtqmx6eval/cgtqmx6eval.c
+++ b/board/congatec/cgtqmx6eval/cgtqmx6eval.c
@@ -1037,6 +1037,8 @@ static void spl_dram_init(int width)
 		.bi_on = 1,
 		.sde_to_rst = 0x0d,
 		.rst_to_cke = 0x20,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	if (is_cpu_type(MXC_CPU_MX6Q) && is_2gb()) {
diff --git a/board/el/el6x/el6x.c b/board/el/el6x/el6x.c
index 3b0fb32..7856b84 100644
--- a/board/el/el6x/el6x.c
+++ b/board/el/el6x/el6x.c
@@ -604,6 +604,8 @@ static void spl_dram_init(void)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c
index 0cf6809..f836ecb 100644
--- a/board/freescale/mx6sabresd/mx6sabresd.c
+++ b/board/freescale/mx6sabresd/mx6sabresd.c
@@ -854,6 +854,8 @@ static void spl_dram_init(void)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	if (is_mx6dqp()) {
diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c
index f978e50..96c0e8c 100644
--- a/board/freescale/mx6slevk/mx6slevk.c
+++ b/board/freescale/mx6slevk/mx6slevk.c
@@ -494,6 +494,8 @@ static void spl_dram_init(void)
 		.sde_to_rst = 0,    /* LPDDR2 does not need this field */
 		.rst_to_cke = 0x10, /* JEDEC value for LPDDR2: 200us */
 		.ddr_type = DDR_TYPE_LPDDR2,
+		.refsel = 0,	/* Refresh cycles at 64KHz */
+		.refr = 3,	/* 4 refresh commands per refresh cycle */
 	};
 	mx6sl_dram_iocfg(32, &mx6_ddr_ioregs, &mx6_grp_ioregs);
 	mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
diff --git a/board/freescale/mx6sxsabresd/mx6sxsabresd.c b/board/freescale/mx6sxsabresd/mx6sxsabresd.c
index 8d95c51..965e511 100644
--- a/board/freescale/mx6sxsabresd/mx6sxsabresd.c
+++ b/board/freescale/mx6sxsabresd/mx6sxsabresd.c
@@ -637,6 +637,8 @@ static void spl_dram_init(void)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	mx6sx_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
index c213861..5e39108 100644
--- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
+++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
@@ -766,6 +766,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
 	.sde_to_rst = 0,    /* LPDDR2 does not need this field */
 	.rst_to_cke = 0x10, /* JEDEC value for LPDDR2: 200us */
 	.ddr_type = DDR_TYPE_LPDDR2,
+	.refsel = 0,	/* Refresh cycles at 64KHz */
+	.refr = 3,	/* 4 refresh commands per refresh cycle */
 };
 
 #else
@@ -804,6 +806,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
 	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 	.ddr_type = DDR_TYPE_DDR3,
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg mem_ddr = {
diff --git a/board/gateworks/gw_ventana/gw_ventana_spl.c b/board/gateworks/gw_ventana/gw_ventana_spl.c
index e7f699a..b610e06 100644
--- a/board/gateworks/gw_ventana/gw_ventana_spl.c
+++ b/board/gateworks/gw_ventana/gw_ventana_spl.c
@@ -394,6 +394,8 @@ static void spl_dram_init(int width, int size_mb, int board_model)
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.pd_fast_exit = 1, /* enable precharge power-down fast exit */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	/*
diff --git a/board/kosagi/novena/novena_spl.c b/board/kosagi/novena/novena_spl.c
index f779bb4..92c61ae 100644
--- a/board/kosagi/novena/novena_spl.c
+++ b/board/kosagi/novena/novena_spl.c
@@ -520,6 +520,8 @@ static struct mx6_ddr_sysinfo novena_ddr_info = {
 	.bi_on		= 1,	/* Bank interleaving enabled */
 	.sde_to_rst	= 0x10,	/* 14 cycles, 200us (JEDEC default) */
 	.rst_to_cke	= 0x23,	/* 33 cycles, 500us (JEDEC default) */
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg elpida_4gib_1600 = {
diff --git a/board/phytec/pcm058/pcm058.c b/board/phytec/pcm058/pcm058.c
index 0ba4a2e..4e2122f 100644
--- a/board/phytec/pcm058/pcm058.c
+++ b/board/phytec/pcm058/pcm058.c
@@ -521,6 +521,8 @@ static void spl_dram_init(void)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
index cafa348..3a1ce24 100644
--- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
+++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
@@ -605,6 +605,8 @@ static void spl_dram_init(int width)
 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 		.ddr_type = DDR_TYPE_DDR3,
+		.refsel = 1,	/* Refresh cycles at 32KHz */
+		.refr = 7,	/* 8 refresh commands per refresh cycle */
 	};
 
 	if (is_mx6dq())
diff --git a/board/udoo/udoo_spl.c b/board/udoo/udoo_spl.c
index a1154ed..592e69b 100644
--- a/board/udoo/udoo_spl.c
+++ b/board/udoo/udoo_spl.c
@@ -193,6 +193,8 @@ static struct mx6_ddr_sysinfo mem_qdl = {
 	.mif3_mode = 3,
 	.rst_to_cke = 0x23,
 	.sde_to_rst = 0x10,
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 static void ccgr_init(void)
diff --git a/board/wandboard/spl.c b/board/wandboard/spl.c
index 77afae7..085095c 100644
--- a/board/wandboard/spl.c
+++ b/board/wandboard/spl.c
@@ -187,6 +187,8 @@ static struct mx6_ddr_sysinfo mem_q = {
 	.mif3_mode	= 3,
 	.rst_to_cke	= 0x23,
 	.sde_to_rst	= 0x10,
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 static struct mx6_mmdc_calibration mx6dl_1g_mmdc_calib = {
@@ -228,6 +230,8 @@ static struct mx6_ddr_sysinfo mem_dl = {
 	.mif3_mode	= 3,
 	.rst_to_cke	= 0x23,
 	.sde_to_rst	= 0x10,
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 /* DDR 32bit 512MB */
@@ -245,6 +249,8 @@ static struct mx6_ddr_sysinfo mem_s = {
 	.mif3_mode	= 3,
 	.rst_to_cke	= 0x23,
 	.sde_to_rst	= 0x10,
+	.refsel = 1,	/* Refresh cycles at 32KHz */
+	.refr = 7,	/* 8 refresh commands per refresh cycle */
 };
 
 static void ccgr_init(void)
-- 
1.9.1

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

* [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang
  2016-08-29 23:37 [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Fabio Estevam
@ 2016-08-29 23:37 ` Fabio Estevam
  2016-08-30  0:35   ` Eric Nelson
  2016-09-06  8:36   ` Stefano Babic
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings Fabio Estevam
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 8+ messages in thread
From: Fabio Estevam @ 2016-08-29 23:37 UTC (permalink / raw)
  To: u-boot

From: Fabio Estevam <fabio.estevam@nxp.com>

When running a NXP 4.1 kernel with U-Boot mainline on a mx6ul-evk,
we observe a hang when going into the lowest operational point of cpufreq.

This hang issue does not happen on the NXP U-Boot version.

After comparing the SPL DDR initialization against the DCD table
from NXP U-Boot, the key difference that causes the hang is the
MDREF register setting:

DATA 4 0x021B0020 0x00000800

,which means:

REF_SEL = 0 --> Periodic refresh cycle: 64kHz
REFR = 1 ---> Refresh Rate - 2 refreshes

So adjust the MDREF initialization for mx6ul_evk accordingly
to fix the kernel hang issue at low bus frequency.

Reported-by: Eric Nelson <eric@nelint.com>
Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
---
Changes since v3:
- Just adapt due to previous patch

 board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
index 5e39108..2ca0921 100644
--- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
+++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
@@ -806,8 +806,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
 	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
 	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
 	.ddr_type = DDR_TYPE_DDR3,
-	.refsel = 1,	/* Refresh cycles at 32KHz */
-	.refr = 7,	/* 8 refresh commands per refresh cycle */
+	.refsel = 0,	/* Refresh cycles at 64KHz */
+	.refr = 1,	/* 2 refresh commands per refresh cycle */
 };
 
 static struct mx6_ddr3_cfg mem_ddr = {
-- 
1.9.1

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

* [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings
  2016-08-29 23:37 [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Fabio Estevam
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
@ 2016-08-29 23:37 ` Fabio Estevam
  2016-08-30  0:30   ` Eric Nelson
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 4/4] mx6ul_14x14_ev: Enable the CCGR clocks earlier Fabio Estevam
  2016-08-30  0:34 ` [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Eric Nelson
  3 siblings, 1 reply; 8+ messages in thread
From: Fabio Estevam @ 2016-08-29 23:37 UTC (permalink / raw)
  To: u-boot

From: Fabio Estevam <fabio.estevam@nxp.com>

Adjust DDR3 initialization done in SPL by comparing them against
the NXP DCD table.

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
---
Changes since v3:
- None

 board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
index 2ca0921..9243ec5 100644
--- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
+++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
@@ -779,17 +779,17 @@ static struct mx6ul_iomux_ddr_regs mx6_ddr_ioregs = {
 	.dram_odt0 = 0x00000030,
 	.dram_odt1 = 0x00000030,
 	.dram_sdba2 = 0x00000000,
-	.dram_sdclk_0 = 0x00000008,
-	.dram_sdqs0 = 0x00000038,
+	.dram_sdclk_0 = 0x00000030,
+	.dram_sdqs0 = 0x00000030,
 	.dram_sdqs1 = 0x00000030,
 	.dram_reset = 0x00000030,
 };
 
 static struct mx6_mmdc_calibration mx6_mmcd_calib = {
-	.p0_mpwldectrl0 = 0x00070007,
-	.p0_mpdgctrl0 = 0x41490145,
-	.p0_mprddlctl = 0x40404546,
-	.p0_mpwrdlctl = 0x4040524D,
+	.p0_mpwldectrl0 = 0x00000000,
+	.p0_mpdgctrl0 = 0x41570155,
+	.p0_mprddlctl = 0x4040474A,
+	.p0_mpwrdlctl = 0x40405550,
 };
 
 struct mx6_ddr_sysinfo ddr_sysinfo = {
@@ -799,7 +799,7 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
 	.cs1_mirror = 0,
 	.rtt_wr = 2,
 	.rtt_nom = 1,		/* RTT_Nom = RZQ/2 */
-	.walat = 1,		/* Write additional latency */
+	.walat = 0,		/* Write additional latency */
 	.ralat = 5,		/* Read additional latency */
 	.mif3_mode = 3,		/* Command prediction working mode */
 	.bi_on = 1,		/* Bank interleaving enabled */
-- 
1.9.1

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

* [U-Boot] [PATCH v4 4/4] mx6ul_14x14_ev: Enable the CCGR clocks earlier
  2016-08-29 23:37 [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Fabio Estevam
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings Fabio Estevam
@ 2016-08-29 23:37 ` Fabio Estevam
  2016-08-30  0:34 ` [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Eric Nelson
  3 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2016-08-29 23:37 UTC (permalink / raw)
  To: u-boot

From: Fabio Estevam <fabio.estevam@nxp.com>

To be in the safe side we need to enable the CCGR clocks prior
to calling arch_cpu_init().

Inspired by Tim Harvey's commit d783c2744f9 ("imx: ventana: fix boot to SD").

Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
Reviewed-by: Eric Nelson <eric@nelint.com>
Tested-by: Eric Nelson <eric@nelint.com>
---
Changes since v3:
- None

 board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
index 9243ec5..51876dc 100644
--- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
+++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
@@ -846,11 +846,11 @@ static void spl_dram_init(void)
 
 void board_init_f(ulong dummy)
 {
+	ccgr_init();
+
 	/* setup AIPS and disable watchdog */
 	arch_cpu_init();
 
-	ccgr_init();
-
 	/* iomux and setup of i2c */
 	board_early_init_f();
 
-- 
1.9.1

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

* [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings Fabio Estevam
@ 2016-08-30  0:30   ` Eric Nelson
  0 siblings, 0 replies; 8+ messages in thread
From: Eric Nelson @ 2016-08-30  0:30 UTC (permalink / raw)
  To: u-boot

Hi Fabio,

On 08/29/2016 04:37 PM, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@nxp.com>
> 
> Adjust DDR3 initialization done in SPL by comparing them against
> the NXP DCD table.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> ---
> Changes since v3:
> - None
> 
>  board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> index 2ca0921..9243ec5 100644
> --- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> +++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> @@ -779,17 +779,17 @@ static struct mx6ul_iomux_ddr_regs mx6_ddr_ioregs = {
>  	.dram_odt0 = 0x00000030,
>  	.dram_odt1 = 0x00000030,
>  	.dram_sdba2 = 0x00000000,
> -	.dram_sdclk_0 = 0x00000008,
> -	.dram_sdqs0 = 0x00000038,
> +	.dram_sdclk_0 = 0x00000030,
> +	.dram_sdqs0 = 0x00000030,
>  	.dram_sdqs1 = 0x00000030,
>  	.dram_reset = 0x00000030,
>  };
>  
>  static struct mx6_mmdc_calibration mx6_mmcd_calib = {
> -	.p0_mpwldectrl0 = 0x00070007,
> -	.p0_mpdgctrl0 = 0x41490145,
> -	.p0_mprddlctl = 0x40404546,
> -	.p0_mpwrdlctl = 0x4040524D,

Hmmm. I don't think I've ever seen a value of zero for dectrl0,
but it does match the DCD.

When time permits, I'll try running the DDR stress tool on my
EVK and also see what it takes to get the mx6memcal rig to
run on the 6UL.

> +	.p0_mpwldectrl0 = 0x00000000,
> +	.p0_mpdgctrl0 = 0x41570155,
> +	.p0_mprddlctl = 0x4040474A,
> +	.p0_mpwrdlctl = 0x40405550,
>  };
>  
>  struct mx6_ddr_sysinfo ddr_sysinfo = {
> @@ -799,7 +799,7 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
>  	.cs1_mirror = 0,
>  	.rtt_wr = 2,
>  	.rtt_nom = 1,		/* RTT_Nom = RZQ/2 */
> -	.walat = 1,		/* Write additional latency */
> +	.walat = 0,		/* Write additional latency */
>  	.ralat = 5,		/* Read additional latency */
>  	.mif3_mode = 3,		/* Command prediction working mode */
>  	.bi_on = 1,		/* Bank interleaving enabled */
> 

Reviewed-by: Eric Nelson <eric@nelint.com>

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

* [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields
  2016-08-29 23:37 [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Fabio Estevam
                   ` (2 preceding siblings ...)
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 4/4] mx6ul_14x14_ev: Enable the CCGR clocks earlier Fabio Estevam
@ 2016-08-30  0:34 ` Eric Nelson
  3 siblings, 0 replies; 8+ messages in thread
From: Eric Nelson @ 2016-08-30  0:34 UTC (permalink / raw)
  To: u-boot

Hi Fabio,

On 08/29/2016 04:37 PM, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@nxp.com>
> 
> Currently MX6 SPL DDR initialization hardcodes the REF_SEL and
> REFR fields of the MDREF register as 1 and 7, respectively for
> DDR3 and 0 and 3 for LPDDR2.
> 
> Looking at the MDREF initialization done via DCD we see that
> boards do need to initialize these fields differently:
> 
> $ git grep 0x021b0020 board/
> board/bachmann/ot1200/mx6q_4x_mt41j128.cfg:DATA 4 0x021b0020 0x00005800
> board/ccv/xpress/imximage.cfg:DATA 4 0x021b0020 0x00000800 /* MMDC0_MDREF */
> board/freescale/mx6qarm2/imximage.cfg:DATA 4 0x021b0020 0x7800
> board/freescale/mx6qarm2/imximage.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6qarm2/imximage_mx6dl.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6qarm2/imximage_mx6dl.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6qsabreauto/imximage.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6qsabreauto/mx6dl.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6qsabreauto/mx6qp.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6sabresd/mx6dlsabresd.cfg:DATA 4      0x021b0020 0x00005800
> board/freescale/mx6sabresd/mx6q_4x_mt41j128.cfg:DATA 4 0x021b0020 0x00005800
> board/freescale/mx6slevk/imximage.cfg:DATA 4 0x021b0020 0x00001800
> board/freescale/mx6sxsabreauto/imximage.cfg:DATA 4 0x021b0020 0x00000800
> board/freescale/mx6sxsabresd/imximage.cfg:DATA 4 0x021b0020 0x00000800
> board/warp/imximage.cfg:DATA 4 0x021b0020 0x00001800
> 
> So introduce a mechanism for users to be able to configure
> REFSEL and REFR fields as needed.
> 
> Keep all the mx6 SPL users in their current REF_SEL and REFR values,
> so no functional changes for the existing users.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> ---
> Changes since v3:
> - Fix the logic for setting refsel/refr registers (Eric)
> 
>  arch/arm/cpu/armv7/mx6/ddr.c                      | 6 ++----
>  arch/arm/include/asm/arch-mx6/mx6-ddr.h           | 2 ++
>  board/bachmann/ot1200/ot1200_spl.c                | 2 ++
>  board/barco/platinum/spl_picon.c                  | 2 ++
>  board/barco/platinum/spl_titanium.c               | 2 ++
>  board/ccv/xpress/spl.c                            | 2 ++
>  board/compulab/cm_fx6/spl.c                       | 4 ++++
>  board/congatec/cgtqmx6eval/cgtqmx6eval.c          | 2 ++
>  board/el/el6x/el6x.c                              | 2 ++
>  board/freescale/mx6sabresd/mx6sabresd.c           | 2 ++
>  board/freescale/mx6slevk/mx6slevk.c               | 2 ++
>  board/freescale/mx6sxsabresd/mx6sxsabresd.c       | 2 ++
>  board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 4 ++++
>  board/gateworks/gw_ventana/gw_ventana_spl.c       | 2 ++
>  board/kosagi/novena/novena_spl.c                  | 2 ++
>  board/phytec/pcm058/pcm058.c                      | 2 ++
>  board/solidrun/mx6cuboxi/mx6cuboxi.c              | 2 ++
>  board/udoo/udoo_spl.c                             | 2 ++
>  board/wandboard/spl.c                             | 6 ++++++
>  19 files changed, 46 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv7/mx6/ddr.c b/arch/arm/cpu/armv7/mx6/ddr.c
> index f151eec..7beb7ea 100644
> --- a/arch/arm/cpu/armv7/mx6/ddr.c
> +++ b/arch/arm/cpu/armv7/mx6/ddr.c
> @@ -1166,8 +1166,7 @@ void mx6_lpddr2_cfg(const struct mx6_ddr_sysinfo *sysinfo,
>  	mmdc0->mpzqhwctrl = val;
>  
>  	/* Step 12: Configure and activate periodic refresh */
> -	mmdc0->mdref = (0 << 14) | /* REF_SEL: Periodic refresh cycle: 64kHz */
> -		       (3 << 11);  /* REFR: Refresh Rate - 4 refreshes */
> +	mmdc0->mdref = (sysinfo->refsel << 14) | (sysinfo->refr << 11);
>  
>  	/* Step 13: Deassert config request - init complete */
>  	mmdc0->mdscr = 0x00000000;
> @@ -1472,8 +1471,7 @@ void mx6_ddr3_cfg(const struct mx6_ddr_sysinfo *sysinfo,
>  		MMDC1(mpzqhwctrl, val);
>  
>  	/* Step 12: Configure and activate periodic refresh */
> -	mmdc0->mdref = (1 << 14) | /* REF_SEL: Periodic refresh cycle: 32kHz */
> -		       (7 << 11);  /* REFR: Refresh Rate - 8 refreshes */
> +	mmdc0->mdref = (sysinfo->refsel << 14) | (sysinfo->refr << 11);
>  
>  	/* Step 13: Deassert config request - init complete */
>  	mmdc0->mdscr = 0x00000000;
> diff --git a/arch/arm/include/asm/arch-mx6/mx6-ddr.h b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> index 12c30d2..9922409 100644
> --- a/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> +++ b/arch/arm/include/asm/arch-mx6/mx6-ddr.h
> @@ -408,6 +408,8 @@ struct mx6_ddr_sysinfo {
>  	u8 sde_to_rst;	/* Time from SDE enable until DDR reset# is high */
>  	u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
>  	u8 ddr_type;	/* DDR type: DDR3(0) or LPDDR2(1) */
> +	u8 refsel;	/* REF_SEL field of register MDREF */
> +	u8 refr;	/* REFR field of register MDREF */
>  };
>  
>  /*
> diff --git a/board/bachmann/ot1200/ot1200_spl.c b/board/bachmann/ot1200/ot1200_spl.c
> index f651a40..9d28da4 100644
> --- a/board/bachmann/ot1200/ot1200_spl.c
> +++ b/board/bachmann/ot1200/ot1200_spl.c
> @@ -85,6 +85,8 @@ static struct mx6_ddr_sysinfo ot1200_ddr_sysinfo = {
>  	.bi_on      = 1,	/* Bank interleaving enabled */	/* war 1 */
>  	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
> +	.refsel = 1,		/* Refresh cycles at 32KHz */
> +	.refr = 7,		/* 8 refresh commands per refresh cycle */
>  };
>  
>  /* MT41K128M16JT-125 */
> diff --git a/board/barco/platinum/spl_picon.c b/board/barco/platinum/spl_picon.c
> index 098542f..97a861f 100644
> --- a/board/barco/platinum/spl_picon.c
> +++ b/board/barco/platinum/spl_picon.c
> @@ -138,6 +138,8 @@ static void spl_dram_init(int width)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7, 	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	mx6sdl_dram_iocfg(width, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs);
> diff --git a/board/barco/platinum/spl_titanium.c b/board/barco/platinum/spl_titanium.c
> index a3a4255..d1ba85a 100644
> --- a/board/barco/platinum/spl_titanium.c
> +++ b/board/barco/platinum/spl_titanium.c
> @@ -141,6 +141,8 @@ static void spl_dram_init(int width)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,		/* Refresh cycles at 32KHz */
> +		.refr = 7,		/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	mx6dq_dram_iocfg(width, &mx6dq_ddr_ioregs, &mx6dq_grp_ioregs);
> diff --git a/board/ccv/xpress/spl.c b/board/ccv/xpress/spl.c
> index d15b842..bea837d 100644
> --- a/board/ccv/xpress/spl.c
> +++ b/board/ccv/xpress/spl.c
> @@ -60,6 +60,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
>  	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  	.ddr_type = DDR_TYPE_DDR3,
> +	.refsel = 1,		/* Refresh cycles at 32KHz */
> +	.refr = 7,		/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg mem_ddr = {
> diff --git a/board/compulab/cm_fx6/spl.c b/board/compulab/cm_fx6/spl.c
> index d8328fd..9442d09 100644
> --- a/board/compulab/cm_fx6/spl.c
> +++ b/board/compulab/cm_fx6/spl.c
> @@ -107,6 +107,8 @@ static struct mx6_ddr_sysinfo cm_fx6_sysinfo_s = {
>  	.mif3_mode	= 3,
>  	.rst_to_cke	= 0x23,
>  	.sde_to_rst	= 0x10,
> +	.refsel = 1,		/* Refresh cycles at 32KHz */
> +	.refr = 7,		/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg cm_fx6_ddr3_cfg_s = {
> @@ -174,6 +176,8 @@ static struct mx6_ddr_sysinfo cm_fx6_sysinfo_q = {
>  	.mif3_mode	= 3,
>  	.rst_to_cke	= 0x23,
>  	.sde_to_rst	= 0x10,
> +	.refsel = 1,		/* Refresh cycles at 32KHz */
> +	.refr = 7,		/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg cm_fx6_ddr3_cfg_q = {
> diff --git a/board/congatec/cgtqmx6eval/cgtqmx6eval.c b/board/congatec/cgtqmx6eval/cgtqmx6eval.c
> index 3fbd3d2..a4a6029 100644
> --- a/board/congatec/cgtqmx6eval/cgtqmx6eval.c
> +++ b/board/congatec/cgtqmx6eval/cgtqmx6eval.c
> @@ -1037,6 +1037,8 @@ static void spl_dram_init(int width)
>  		.bi_on = 1,
>  		.sde_to_rst = 0x0d,
>  		.rst_to_cke = 0x20,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	if (is_cpu_type(MXC_CPU_MX6Q) && is_2gb()) {
> diff --git a/board/el/el6x/el6x.c b/board/el/el6x/el6x.c
> index 3b0fb32..7856b84 100644
> --- a/board/el/el6x/el6x.c
> +++ b/board/el/el6x/el6x.c
> @@ -604,6 +604,8 @@ static void spl_dram_init(void)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
> diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c
> index 0cf6809..f836ecb 100644
> --- a/board/freescale/mx6sabresd/mx6sabresd.c
> +++ b/board/freescale/mx6sabresd/mx6sabresd.c
> @@ -854,6 +854,8 @@ static void spl_dram_init(void)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	if (is_mx6dqp()) {
> diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c
> index f978e50..96c0e8c 100644
> --- a/board/freescale/mx6slevk/mx6slevk.c
> +++ b/board/freescale/mx6slevk/mx6slevk.c
> @@ -494,6 +494,8 @@ static void spl_dram_init(void)
>  		.sde_to_rst = 0,    /* LPDDR2 does not need this field */
>  		.rst_to_cke = 0x10, /* JEDEC value for LPDDR2: 200us */
>  		.ddr_type = DDR_TYPE_LPDDR2,
> +		.refsel = 0,	/* Refresh cycles at 64KHz */
> +		.refr = 3,	/* 4 refresh commands per refresh cycle */
>  	};
>  	mx6sl_dram_iocfg(32, &mx6_ddr_ioregs, &mx6_grp_ioregs);
>  	mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
> diff --git a/board/freescale/mx6sxsabresd/mx6sxsabresd.c b/board/freescale/mx6sxsabresd/mx6sxsabresd.c
> index 8d95c51..965e511 100644
> --- a/board/freescale/mx6sxsabresd/mx6sxsabresd.c
> +++ b/board/freescale/mx6sxsabresd/mx6sxsabresd.c
> @@ -637,6 +637,8 @@ static void spl_dram_init(void)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	mx6sx_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
> diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> index c213861..5e39108 100644
> --- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> +++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> @@ -766,6 +766,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
>  	.sde_to_rst = 0,    /* LPDDR2 does not need this field */
>  	.rst_to_cke = 0x10, /* JEDEC value for LPDDR2: 200us */
>  	.ddr_type = DDR_TYPE_LPDDR2,
> +	.refsel = 0,	/* Refresh cycles at 64KHz */
> +	.refr = 3,	/* 4 refresh commands per refresh cycle */
>  };
>  
>  #else
> @@ -804,6 +806,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
>  	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  	.ddr_type = DDR_TYPE_DDR3,
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg mem_ddr = {
> diff --git a/board/gateworks/gw_ventana/gw_ventana_spl.c b/board/gateworks/gw_ventana/gw_ventana_spl.c
> index e7f699a..b610e06 100644
> --- a/board/gateworks/gw_ventana/gw_ventana_spl.c
> +++ b/board/gateworks/gw_ventana/gw_ventana_spl.c
> @@ -394,6 +394,8 @@ static void spl_dram_init(int width, int size_mb, int board_model)
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.pd_fast_exit = 1, /* enable precharge power-down fast exit */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	/*
> diff --git a/board/kosagi/novena/novena_spl.c b/board/kosagi/novena/novena_spl.c
> index f779bb4..92c61ae 100644
> --- a/board/kosagi/novena/novena_spl.c
> +++ b/board/kosagi/novena/novena_spl.c
> @@ -520,6 +520,8 @@ static struct mx6_ddr_sysinfo novena_ddr_info = {
>  	.bi_on		= 1,	/* Bank interleaving enabled */
>  	.sde_to_rst	= 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  	.rst_to_cke	= 0x23,	/* 33 cycles, 500us (JEDEC default) */
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg elpida_4gib_1600 = {
> diff --git a/board/phytec/pcm058/pcm058.c b/board/phytec/pcm058/pcm058.c
> index 0ba4a2e..4e2122f 100644
> --- a/board/phytec/pcm058/pcm058.c
> +++ b/board/phytec/pcm058/pcm058.c
> @@ -521,6 +521,8 @@ static void spl_dram_init(void)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
> diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> index cafa348..3a1ce24 100644
> --- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
> +++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
> @@ -605,6 +605,8 @@ static void spl_dram_init(int width)
>  		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  		.ddr_type = DDR_TYPE_DDR3,
> +		.refsel = 1,	/* Refresh cycles at 32KHz */
> +		.refr = 7,	/* 8 refresh commands per refresh cycle */
>  	};
>  
>  	if (is_mx6dq())
> diff --git a/board/udoo/udoo_spl.c b/board/udoo/udoo_spl.c
> index a1154ed..592e69b 100644
> --- a/board/udoo/udoo_spl.c
> +++ b/board/udoo/udoo_spl.c
> @@ -193,6 +193,8 @@ static struct mx6_ddr_sysinfo mem_qdl = {
>  	.mif3_mode = 3,
>  	.rst_to_cke = 0x23,
>  	.sde_to_rst = 0x10,
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  static void ccgr_init(void)
> diff --git a/board/wandboard/spl.c b/board/wandboard/spl.c
> index 77afae7..085095c 100644
> --- a/board/wandboard/spl.c
> +++ b/board/wandboard/spl.c
> @@ -187,6 +187,8 @@ static struct mx6_ddr_sysinfo mem_q = {
>  	.mif3_mode	= 3,
>  	.rst_to_cke	= 0x23,
>  	.sde_to_rst	= 0x10,
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_mmdc_calibration mx6dl_1g_mmdc_calib = {
> @@ -228,6 +230,8 @@ static struct mx6_ddr_sysinfo mem_dl = {
>  	.mif3_mode	= 3,
>  	.rst_to_cke	= 0x23,
>  	.sde_to_rst	= 0x10,
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  /* DDR 32bit 512MB */
> @@ -245,6 +249,8 @@ static struct mx6_ddr_sysinfo mem_s = {
>  	.mif3_mode	= 3,
>  	.rst_to_cke	= 0x23,
>  	.sde_to_rst	= 0x10,
> +	.refsel = 1,	/* Refresh cycles at 32KHz */
> +	.refr = 7,	/* 8 refresh commands per refresh cycle */
>  };
>  
>  static void ccgr_init(void)
> 

Reviewed-by: Eric Nelson <eric@nelint.com>

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

* [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
@ 2016-08-30  0:35   ` Eric Nelson
  2016-09-06  8:36   ` Stefano Babic
  1 sibling, 0 replies; 8+ messages in thread
From: Eric Nelson @ 2016-08-30  0:35 UTC (permalink / raw)
  To: u-boot

Hi Fabio,

On 08/29/2016 04:37 PM, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@nxp.com>
> 
> When running a NXP 4.1 kernel with U-Boot mainline on a mx6ul-evk,
> we observe a hang when going into the lowest operational point of cpufreq.
> 
> This hang issue does not happen on the NXP U-Boot version.
> 
> After comparing the SPL DDR initialization against the DCD table
> from NXP U-Boot, the key difference that causes the hang is the
> MDREF register setting:
> 
> DATA 4 0x021B0020 0x00000800
> 
> ,which means:
> 
> REF_SEL = 0 --> Periodic refresh cycle: 64kHz
> REFR = 1 ---> Refresh Rate - 2 refreshes
> 
> So adjust the MDREF initialization for mx6ul_evk accordingly
> to fix the kernel hang issue at low bus frequency.
> 
> Reported-by: Eric Nelson <eric@nelint.com>
> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> ---
> Changes since v3:
> - Just adapt due to previous patch
> 
>  board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> index 5e39108..2ca0921 100644
> --- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> +++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c
> @@ -806,8 +806,8 @@ struct mx6_ddr_sysinfo ddr_sysinfo = {
>  	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
>  	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
>  	.ddr_type = DDR_TYPE_DDR3,
> -	.refsel = 1,	/* Refresh cycles at 32KHz */
> -	.refr = 7,	/* 8 refresh commands per refresh cycle */
> +	.refsel = 0,	/* Refresh cycles at 64KHz */
> +	.refr = 1,	/* 2 refresh commands per refresh cycle */
>  };
>  
>  static struct mx6_ddr3_cfg mem_ddr = {
> 

Reviewed-by: Eric Nelson <eric@nelint.com>

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

* [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang
  2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
  2016-08-30  0:35   ` Eric Nelson
@ 2016-09-06  8:36   ` Stefano Babic
  1 sibling, 0 replies; 8+ messages in thread
From: Stefano Babic @ 2016-09-06  8:36 UTC (permalink / raw)
  To: u-boot

On 30/08/2016 01:37, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@nxp.com>
> 
> When running a NXP 4.1 kernel with U-Boot mainline on a mx6ul-evk,
> we observe a hang when going into the lowest operational point of cpufreq.
> 
> This hang issue does not happen on the NXP U-Boot version.
> 
> After comparing the SPL DDR initialization against the DCD table
> from NXP U-Boot, the key difference that causes the hang is the
> MDREF register setting:
> 
> DATA 4 0x021B0020 0x00000800
> 
> ,which means:
> 
> REF_SEL = 0 --> Periodic refresh cycle: 64kHz
> REFR = 1 ---> Refresh Rate - 2 refreshes
> 
> So adjust the MDREF initialization for mx6ul_evk accordingly
> to fix the kernel hang issue at low bus frequency.
> 
> Reported-by: Eric Nelson <eric@nelint.com>
> Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com>
> ---

Applied (all series as fix !) to u-boot-imx, thanks !

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] 8+ messages in thread

end of thread, other threads:[~2016-09-06  8:36 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-29 23:37 [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Fabio Estevam
2016-08-29 23:37 ` [U-Boot] [PATCH v4 2/4] mx6ul_14x14_evk: Pass refsel and refr fields to avoid hang Fabio Estevam
2016-08-30  0:35   ` Eric Nelson
2016-09-06  8:36   ` Stefano Babic
2016-08-29 23:37 ` [U-Boot] [PATCH v4 3/4] mx6ul_14x14_evk: Adjust SPL DDR3 settings Fabio Estevam
2016-08-30  0:30   ` Eric Nelson
2016-08-29 23:37 ` [U-Boot] [PATCH v4 4/4] mx6ul_14x14_ev: Enable the CCGR clocks earlier Fabio Estevam
2016-08-30  0:34 ` [U-Boot] [PATCH v4 1/4] mx6: ddr: Allow changing REFSEL and REFR fields Eric Nelson

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.