Skip to contentSkip to conversation

ARM: introduce arch_early_init_r()

PATCH New Fabio Estevam 7 participants 13 messages Apr 2, 2012 – Jul 7, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

---
 arch/arm/include/asm/u-boot-arm.h |    1 +
 arch/arm/lib/board.c              |    4 ++++
 2 files changed, 5 insertions(+), 0 deletions(-)
arch/arm/include/asm/u-boot-arm.h +1 -0
index 4ca75f9..9f3cae5 100644
@@ -52,6 +52,7 @@ void	cpu_init_cp15(void);
 /* cpu/.../arch/cpu.c */
 int	arch_cpu_init(void);
 int	arch_misc_init(void);
+int	arch_early_init_r(void);
 
 /* board/.../... */
 int	board_init(void);
arch/arm/lib/board.c +4 -0
index 5270c11..025d6ca 100644
@@ -500,6 +500,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	malloc_start = dest_addr - TOTAL_MALLOC_LEN;
 	mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
 
+#ifdef CONFIG_ARCH_EARLY_INIT_R
+	arch_early_init_r();
+#endif
+
 #if !defined(CONFIG_SYS_NO_FLASH)
 	puts("Flash: ");
 
Signature · 1 line
1.7.1
#1 lore raw

PATCH 2/2 mmc: mxsmmc: Fix operation with DMA

Initialize the DMA controller so that the following errors are fixed:

U-Boot 2012.04-rc1-00001-g037cbfd (Apr 02 2012 - 10:57:48)

Freescale i.MX28 family at 454 MHz

DRAM:  128 MiB
MMC:   MXS MMC: 0
MMC0: DMA transfer failed
MMC0: DMA transfer failed
MMC0: DMA transfer failed
MMC0: DMA transfer failed

MMC init failed

Do the DMA initialization inside arch_early_init_r(), so that it can work after relocation.

In order to not break the DMA NAND support, remove mxs_dma_init from the NAND driver now that it is called from arch_early_init_r().

---
 arch/arm/cpu/arm926ejs/mx28/mx28.c |   12 ++++++++++++
 drivers/mtd/nand/mxs_nand.c        |    3 ---
 include/configs/m28evk.h           |    1 +
 include/configs/mx28evk.h          |    1 +
 4 files changed, 14 insertions(+), 3 deletions(-)
arch/arm/cpu/arm926ejs/mx28/mx28.c +12 -0
index cf6d4e9..6c148a8 100644
@@ -34,6 +34,7 @@
 #include <asm/arch/iomux.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/arch/dma.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -297,3 +298,14 @@ U_BOOT_CMD(
 	"display clocks",
 	""
 );
+
+#ifdef CONFIG_ARCH_EARLY_INIT_R
+int arch_early_init_r(void)
+{
+#ifdef	CONFIG_APBH_DMA
+	/* Initialize the DMA controller. */
+	mxs_dma_init();
+#endif
+	return 0;
+}
+#endif
drivers/mtd/nand/mxs_nand.c +0 -3
index 4b1297a..95eac35 100644
@@ -1072,9 +1072,6 @@ int mxs_nand_init(struct mxs_nand_info *info)
 			goto err2;
 	}
 
-	/* Init the DMA controller. */
-	mxs_dma_init();
-
 	/* Reset the GPMI block. */
 	mx28_reset_block(&gpmi_regs->hw_gpmi_ctrl0_reg);
 
include/configs/m28evk.h +1 -0
index 8b83180..b0e6d3b 100644
@@ -42,6 +42,7 @@
 #define	CONFIG_BOARD_EARLY_INIT_F
 #define	CONFIG_ARCH_CPU_INIT
 #define	CONFIG_ARCH_MISC_INIT
+#define	CONFIG_ARCH_EARLY_INIT_R
 
 /*
  * SPL
include/configs/mx28evk.h +1 -0
index 705fdab..350e833 100644
@@ -36,6 +36,7 @@
 #define CONFIG_BOARD_EARLY_INIT_F
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_ARCH_MISC_INIT
+#define CONFIG_ARCH_EARLY_INIT_R
 
 /*
  * SPL
Signature · 1 line
1.7.1
#2 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

In reply to Fabio Estevam
Quoted 4 lines · Fabio Estevam

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Perhaps I just overlooked earlier conversations, but why not just do this in board_init() ?

Signature · 1 line
Tom
#3 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Dear Tom Rini,

Quoted 8 lines · Fabio Estevam
Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Perhaps I just overlooked earlier conversations, but why not just do this in board_init() ?

Because we have multiple boards and they all need it.

Best regards,
Marek Vasut

#4 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Quoted 6 lines · Marek Vasut

Dear Tom Rini,

Quoted 4 lines · Fabio Estevam
Quoted 3 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Quoted 6 lines
Quoted 4 lines
Quoted 1 line

Perhaps I just overlooked earlier conversations, but why not just do this in board_init() ?

Because we have multiple boards and they all need it.

And you aren't architectured with a common board_init() over the family (would there be little to no duplication)? This is what we do in various TI families.

Signature · 1 line
Tom
#5 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Dear Tom Rini,

Quoted 9 lines · Marek Vasut
Quoted 8 lines

Dear Tom Rini,

Quoted 6 lines · Fabio Estevam
Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

Perhaps I just overlooked earlier conversations, but why not just do this in board_init() ?

Because we have multiple boards and they all need it.

And you aren't architectured with a common board_init() over the family (would there be little to no duplication)? This is what we do in various TI families.

Common board_init() ? How would you then do the actual distinct per-board init?

Best regards,
Marek Vasut

#6 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Quoted 14 lines · Marek Vasut

Dear Tom Rini,

Quoted 12 lines · Marek Vasut
Quoted 11 lines

Dear Tom Rini,

Quoted 8 lines · Fabio Estevam
Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Perhaps I just overlooked earlier conversations, but why not just do this in board_init() ?

Quoted 7 lines
Quoted 5 lines
Quoted 1 line

Because we have multiple boards and they all need it.

And you aren't architectured with a common board_init() over the family (would there be little to no duplication)? This is what we do in various TI families.

Common board_init() ? How would you then do the actual distinct per-board init?

Pah, mis-recalled things, sorry. We have a pre-relocation hook that's common per-family (lowlevel_init (generic) -> s_init (TI generic)).

Signature · 1 line
Tom
#7 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

In reply to Fabio Estevam
Quoted 4 lines · Fabio Estevam

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

[snip]

arch/arm/lib/board.c void board_init_r(gd_t *id, ulong dest_addr) · line 505

Quoted 3 lines
arch/arm/lib/board.c +3 -0
+#ifdef CONFIG_ARCH_EARLY_INIT_R
+	arch_early_init_r();
+#endif

We never check return status, make this a void? As Wolfgang has said before, just because the other examples do things wrong doesn't mean we should keep doing it :)

Signature · 1 line
Tom
#8 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Hi Tom,

Quoted 6 lines · Tom Rini
Quoted 4 lines · Fabio Estevam

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Quoted 8 lines

[snip]

arch/arm/lib/board.c void board_init_r(gd_t *id, ulong dest_addr) · line 505

Quoted 3 lines
arch/arm/lib/board.c +3 -0
+#ifdef CONFIG_ARCH_EARLY_INIT_R
+ ? ? arch_early_init_r();
+#endif

We never check return status, make this a void? ?As Wolfgang has said before, just because the other examples do things wrong doesn't mean we should keep doing it :)

The INIT_FUNC patch series will require that the board_init...() functions get flattened to simply processing loops and all of these extra functions that have crept in outside those loops be moved into the init arrays.

Have a look at arch/x86/lib/board.c for reference

Defining these functions as returning int with no parameters will make that work a lot easier

Regards,

Graeme

#9 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

In reply to Fabio Estevam

Dear Fabio Estevam,

Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Are we getting anywhere with this patchset please?

CCing Albert Aribaud.

Best regards,
Marek Vasut

reviewer
#10 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Quoted 8 lines · Marek Vasut

Dear Fabio Estevam,

Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Are we getting anywhere with this patchset please?

Looking forward for it to be applied :-)

Quoted 2 lines

CCing Albert Aribaud.

I added Albert on Cc on my initial patch submission.

Regards,

Fabio Estevam

#11 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

Dear Fabio Estevam,

Quoted 8 lines · Marek Vasut
Quoted 7 lines

Dear Fabio Estevam,

Quoted 4 lines

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

Quoted 7 lines
Quoted 1 line

Are we getting anywhere with this patchset please?

Looking forward for it to be applied :-)

Quoted 1 line

CCing Albert Aribaud.

I added Albert on Cc on my initial patch submission.

Well ... let's prod him a bit more ;)

Quoted 3 lines

Regards,

Fabio Estevam

Best regards,
Marek Vasut

#12 lore raw

PATCH 1/2 ARM: introduce arch_early_init_r()

In reply to Fabio Estevam

Hi Fabio,

Quoted 26 lines · Fabio Estevam

Introduce arch_early_init_r() function, which can be useful for doing early initialization after relocation has happened.

---
 arch/arm/include/asm/u-boot-arm.h |    1 +
 arch/arm/lib/board.c              |    4 ++++
 2 files changed, 5 insertions(+), 0 deletions(-)
(quoted diff) +0 -0

b/arch/arm/include/asm/u-boot-arm.h index 4ca75f9..9f3cae5 100644

arch/arm/include/asm/u-boot-arm.h +1 -0
@@ -52,6 +52,7 @@ void	cpu_init_cp15(void);
 /* cpu/.../arch/cpu.c */
 int	arch_cpu_init(void);
 int	arch_misc_init(void);
+int	arch_early_init_r(void);
 
 /* board/.../... */
 int	board_init(void);
arch/arm/lib/board.c +0 -0
index 5270c11..025d6ca 100644

arch/arm/lib/board.c void board_init_r(gd_t *id, ulong dest_addr) · line 509

Quoted 10 lines
arch/arm/lib/board.c +4 -0
@@ -500,6 +500,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	malloc_start = dest_addr - TOTAL_MALLOC_LEN;
 	mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
 
+#ifdef CONFIG_ARCH_EARLY_INIT_R
+	arch_early_init_r();
+#endif
+
 #if !defined(CONFIG_SYS_NO_FLASH)
 	puts("Flash: ");
 

Applied to u-boot-arm (with an addmittedly very slow sensitivity to prodding), thanks.

Amicalement,

Signature · 1 line
Albert.