mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/2] dove: move memory controller remapping before RAM detection
@ 2018-05-28 21:43 Uwe Kleine-König
  2018-05-28 21:44 ` [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register Uwe Kleine-König
  2018-05-31 15:18 ` [PATCH 1/2] dove: move memory controller remapping before RAM detection Sascha Hauer
  0 siblings, 2 replies; 4+ messages in thread
From: Uwe Kleine-König @ 2018-05-28 21:43 UTC (permalink / raw)
  To: barebox

Compared to other mvebu cpus the memory controller registers are in
their own register window that can be moved independently of the mbus
register window.

Since commit f05c6e095cf8 the available RAM configured by the boot ROM
is read out earlier. This happens to be before the memory controller
register window is moved and so dove_memory_find() fails. To fix this
move the memory controller window together with the mbus window.

This change allows to boot barebox first stage again on a Solidrun
Cubox.

Fixes: f05c6e095cf8 ("mvebu: rework how memory is detected")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 arch/arm/mach-mvebu/common.c | 29 +++++++++++++++++++++++++++++
 arch/arm/mach-mvebu/dove.c   | 22 ----------------------
 2 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-mvebu/common.c b/arch/arm/mach-mvebu/common.c
index fa971da11e75..e951bc06276a 100644
--- a/arch/arm/mach-mvebu/common.c
+++ b/arch/arm/mach-mvebu/common.c
@@ -37,6 +37,10 @@
 #define DOVE_SDRAM_MAP_VALID		BIT(0)
 #define DOVE_SDRAM_LENGTH_SHIFT		16
 #define DOVE_SDRAM_LENGTH_MASK		(0x00f << DOVE_SDRAM_LENGTH_SHIFT)
+#define DOVE_SDRAM_REGS_BASE_DECODE	0x10
+
+#define DOVE_CPU_CTRL			(MVEBU_REMAP_INT_REG_BASE + 0xd025c)
+#define DOVE_AXI_CTRL			(MVEBU_REMAP_INT_REG_BASE + 0xd0224)
 
 #define KIRKWOOD_SDRAM_BASE		(IOMEM(MVEBU_REMAP_INT_REG_BASE) + 0x00000)
 #define KIRKWOOD_DDR_BASE_CSn(n)	(0x1500 + ((n) * 0x8))
@@ -192,8 +196,33 @@ static void mvebu_remap_registers(void)
 
 void __naked __noreturn dove_barebox_entry(void *boarddata)
 {
+	uint32_t val;
+	void __iomem *mcbase = mvebu_get_initial_int_reg_base() + 0x800000;
+
 	mvebu_remap_registers();
 
+	/*
+	 * On dove there is an additional register window that is expected to be
+	 * located 0x800000 after the main register window. This contains the
+	 * DDR registers.
+	 */
+	val = readl(mcbase + DOVE_SDRAM_REGS_BASE_DECODE) & 0x0000ffff;
+	val |= (unsigned long)DOVE_SDRAM_BASE & 0xffff0000;
+	writel(val, mcbase + DOVE_SDRAM_REGS_BASE_DECODE);
+
+	/* tell the axi controller about where to find the DDR controller */
+	val = readl(DOVE_AXI_CTRL) & 0x007fffff;
+	val |= (unsigned long)DOVE_SDRAM_BASE & 0xff800000;
+	writel(val, DOVE_AXI_CTRL);
+
+	/*
+	 * The AXI units internal space base starts at the same address as the
+	 * DDR controller.
+	 */
+	val = readl(DOVE_CPU_CTRL) & 0xffff0000;
+	val |= ((unsigned long)DOVE_SDRAM_BASE & 0xffff0000) >> 16;
+	writel(val, DOVE_CPU_CTRL);
+
 	barebox_arm_entry(0, dove_memory_find(), boarddata);
 }
 
diff --git a/arch/arm/mach-mvebu/dove.c b/arch/arm/mach-mvebu/dove.c
index 1cdb7e1b8296..37fde63f18de 100644
--- a/arch/arm/mach-mvebu/dove.c
+++ b/arch/arm/mach-mvebu/dove.c
@@ -22,27 +22,6 @@
 #include <linux/mbus.h>
 #include <mach/dove-regs.h>
 
-static inline void dove_remap_mc_regs(void)
-{
-	void __iomem *mcboot = IOMEM(DOVE_BOOTUP_MC_REGS);
-	uint32_t val;
-
-	/* remap ahb slave base */
-	val  = readl(DOVE_CPU_CTRL) & 0xffff0000;
-	val |= (DOVE_REMAP_MC_REGS & 0xffff0000) >> 16;
-	writel(val, DOVE_CPU_CTRL);
-
-	/* remap axi bridge address */
-	val  = readl(DOVE_AXI_CTRL) & 0x007fffff;
-	val |= DOVE_REMAP_MC_REGS & 0xff800000;
-	writel(val, DOVE_AXI_CTRL);
-
-	/* remap memory controller base address */
-	val = readl(mcboot + SDRAM_REGS_BASE_DECODE) & 0x0000ffff;
-	val |= DOVE_REMAP_MC_REGS & 0xffff0000;
-	writel(val, mcboot + SDRAM_REGS_BASE_DECODE);
-}
-
 static void __noreturn dove_restart_soc(struct restart_handler *rst)
 {
 	/* enable and assert RSTOUTn */
@@ -62,7 +41,6 @@ static int dove_init_soc(void)
 	barebox_set_model("Marvell Dove");
 	barebox_set_hostname("dove");
 
-	dove_remap_mc_regs();
 	mvebu_mbus_init();
 
 	return 0;
-- 
2.17.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register
  2018-05-28 21:43 [PATCH 1/2] dove: move memory controller remapping before RAM detection Uwe Kleine-König
@ 2018-05-28 21:44 ` Uwe Kleine-König
  2018-05-29 12:27   ` Uwe Kleine-König
  2018-05-31 15:18 ` [PATCH 1/2] dove: move memory controller remapping before RAM detection Sascha Hauer
  1 sibling, 1 reply; 4+ messages in thread
From: Uwe Kleine-König @ 2018-05-28 21:44 UTC (permalink / raw)
  To: barebox

While creating the previous patch I checked the cpu's reference manual
to see what the affected registers actually do and noticed that bits
of the DOVE_CPU_CTRL actually used by the code doesn't match the bits
described as AHBSlaveBase in the manual.

I'm not aware of any effect (neither positive nor negative) of this
patch.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 arch/arm/mach-mvebu/common.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-mvebu/common.c b/arch/arm/mach-mvebu/common.c
index e951bc06276a..83aeb41ae225 100644
--- a/arch/arm/mach-mvebu/common.c
+++ b/arch/arm/mach-mvebu/common.c
@@ -219,8 +219,8 @@ void __naked __noreturn dove_barebox_entry(void *boarddata)
 	 * The AXI units internal space base starts at the same address as the
 	 * DDR controller.
 	 */
-	val = readl(DOVE_CPU_CTRL) & 0xffff0000;
-	val |= ((unsigned long)DOVE_SDRAM_BASE & 0xffff0000) >> 16;
+	val = readl(DOVE_CPU_CTRL) & 0xfff007ff;
+	val |= ((unsigned long)DOVE_SDRAM_BASE & 0xff800000) >> 12;
 	writel(val, DOVE_CPU_CTRL);
 
 	barebox_arm_entry(0, dove_memory_find(), boarddata);
-- 
2.17.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register
  2018-05-28 21:44 ` [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register Uwe Kleine-König
@ 2018-05-29 12:27   ` Uwe Kleine-König
  0 siblings, 0 replies; 4+ messages in thread
From: Uwe Kleine-König @ 2018-05-29 12:27 UTC (permalink / raw)
  To: barebox

Hello,

On Mon, May 28, 2018 at 11:44:00PM +0200, Uwe Kleine-König wrote:
> While creating the previous patch I checked the cpu's reference manual
> to see what the affected registers actually do and noticed that bits
> of the DOVE_CPU_CTRL actually used by the code doesn't match the bits
> described as AHBSlaveBase in the manual.
> 
> I'm not aware of any effect (neither positive nor negative) of this
> patch.

Just a little amendment:
I didn't find a usage of this register neither in Linux nor in the
vendor U-Boot for the cubox.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 1/2] dove: move memory controller remapping before RAM detection
  2018-05-28 21:43 [PATCH 1/2] dove: move memory controller remapping before RAM detection Uwe Kleine-König
  2018-05-28 21:44 ` [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register Uwe Kleine-König
@ 2018-05-31 15:18 ` Sascha Hauer
  1 sibling, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2018-05-31 15:18 UTC (permalink / raw)
  To: Uwe Kleine-König; +Cc: barebox

On Mon, May 28, 2018 at 11:43:59PM +0200, Uwe Kleine-König wrote:
> Compared to other mvebu cpus the memory controller registers are in
> their own register window that can be moved independently of the mbus
> register window.
> 
> Since commit f05c6e095cf8 the available RAM configured by the boot ROM
> is read out earlier. This happens to be before the memory controller
> register window is moved and so dove_memory_find() fails. To fix this
> move the memory controller window together with the mbus window.
> 
> This change allows to boot barebox first stage again on a Solidrun
> Cubox.
> 
> Fixes: f05c6e095cf8 ("mvebu: rework how memory is detected")
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---

Applied, thanks

Sascha

>  arch/arm/mach-mvebu/common.c | 29 +++++++++++++++++++++++++++++
>  arch/arm/mach-mvebu/dove.c   | 22 ----------------------
>  2 files changed, 29 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/arm/mach-mvebu/common.c b/arch/arm/mach-mvebu/common.c
> index fa971da11e75..e951bc06276a 100644
> --- a/arch/arm/mach-mvebu/common.c
> +++ b/arch/arm/mach-mvebu/common.c
> @@ -37,6 +37,10 @@
>  #define DOVE_SDRAM_MAP_VALID		BIT(0)
>  #define DOVE_SDRAM_LENGTH_SHIFT		16
>  #define DOVE_SDRAM_LENGTH_MASK		(0x00f << DOVE_SDRAM_LENGTH_SHIFT)
> +#define DOVE_SDRAM_REGS_BASE_DECODE	0x10
> +
> +#define DOVE_CPU_CTRL			(MVEBU_REMAP_INT_REG_BASE + 0xd025c)
> +#define DOVE_AXI_CTRL			(MVEBU_REMAP_INT_REG_BASE + 0xd0224)
>  
>  #define KIRKWOOD_SDRAM_BASE		(IOMEM(MVEBU_REMAP_INT_REG_BASE) + 0x00000)
>  #define KIRKWOOD_DDR_BASE_CSn(n)	(0x1500 + ((n) * 0x8))
> @@ -192,8 +196,33 @@ static void mvebu_remap_registers(void)
>  
>  void __naked __noreturn dove_barebox_entry(void *boarddata)
>  {
> +	uint32_t val;
> +	void __iomem *mcbase = mvebu_get_initial_int_reg_base() + 0x800000;
> +
>  	mvebu_remap_registers();
>  
> +	/*
> +	 * On dove there is an additional register window that is expected to be
> +	 * located 0x800000 after the main register window. This contains the
> +	 * DDR registers.
> +	 */
> +	val = readl(mcbase + DOVE_SDRAM_REGS_BASE_DECODE) & 0x0000ffff;
> +	val |= (unsigned long)DOVE_SDRAM_BASE & 0xffff0000;
> +	writel(val, mcbase + DOVE_SDRAM_REGS_BASE_DECODE);
> +
> +	/* tell the axi controller about where to find the DDR controller */
> +	val = readl(DOVE_AXI_CTRL) & 0x007fffff;
> +	val |= (unsigned long)DOVE_SDRAM_BASE & 0xff800000;
> +	writel(val, DOVE_AXI_CTRL);
> +
> +	/*
> +	 * The AXI units internal space base starts at the same address as the
> +	 * DDR controller.
> +	 */
> +	val = readl(DOVE_CPU_CTRL) & 0xffff0000;
> +	val |= ((unsigned long)DOVE_SDRAM_BASE & 0xffff0000) >> 16;
> +	writel(val, DOVE_CPU_CTRL);
> +
>  	barebox_arm_entry(0, dove_memory_find(), boarddata);
>  }
>  
> diff --git a/arch/arm/mach-mvebu/dove.c b/arch/arm/mach-mvebu/dove.c
> index 1cdb7e1b8296..37fde63f18de 100644
> --- a/arch/arm/mach-mvebu/dove.c
> +++ b/arch/arm/mach-mvebu/dove.c
> @@ -22,27 +22,6 @@
>  #include <linux/mbus.h>
>  #include <mach/dove-regs.h>
>  
> -static inline void dove_remap_mc_regs(void)
> -{
> -	void __iomem *mcboot = IOMEM(DOVE_BOOTUP_MC_REGS);
> -	uint32_t val;
> -
> -	/* remap ahb slave base */
> -	val  = readl(DOVE_CPU_CTRL) & 0xffff0000;
> -	val |= (DOVE_REMAP_MC_REGS & 0xffff0000) >> 16;
> -	writel(val, DOVE_CPU_CTRL);
> -
> -	/* remap axi bridge address */
> -	val  = readl(DOVE_AXI_CTRL) & 0x007fffff;
> -	val |= DOVE_REMAP_MC_REGS & 0xff800000;
> -	writel(val, DOVE_AXI_CTRL);
> -
> -	/* remap memory controller base address */
> -	val = readl(mcboot + SDRAM_REGS_BASE_DECODE) & 0x0000ffff;
> -	val |= DOVE_REMAP_MC_REGS & 0xffff0000;
> -	writel(val, mcboot + SDRAM_REGS_BASE_DECODE);
> -}
> -
>  static void __noreturn dove_restart_soc(struct restart_handler *rst)
>  {
>  	/* enable and assert RSTOUTn */
> @@ -62,7 +41,6 @@ static int dove_init_soc(void)
>  	barebox_set_model("Marvell Dove");
>  	barebox_set_hostname("dove");
>  
> -	dove_remap_mc_regs();
>  	mvebu_mbus_init();
>  
>  	return 0;
> -- 
> 2.17.0
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2018-05-31 15:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-28 21:43 [PATCH 1/2] dove: move memory controller remapping before RAM detection Uwe Kleine-König
2018-05-28 21:44 ` [PATCH 2/2] dove: fix bit layout of DOVE_CPU_CTRL register Uwe Kleine-König
2018-05-29 12:27   ` Uwe Kleine-König
2018-05-31 15:18 ` [PATCH 1/2] dove: move memory controller remapping before RAM detection Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox