diff mbox

[U-Boot,v1,3/3] ARM: omap: merge GPMC initialization code for all platform

Message ID 1399565627-27770-4-git-send-email-pekon@ti.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

pekon gupta May 8, 2014, 4:13 p.m. UTC
GPMC controller on TI's OMAP SoC is general purpose controller to interface
with different types of external devices like;
 - parallel NOR flash
 - parallel NAND flash
 - OneNand flash
 - SDR RAM
 - Ethernet Devices like LAN9220

Though GPMC configurations may be different for each platform depending on
clock-frequency and external device interfacing with controller. But
initialization sequence remains common across all platfoms.

Thus this patch merges gpmc_init() scattered in different arch-xx/mem.c
files into single omap-common/mem-common.c

However, actual platforms specific register config values are still sourced
from corresponding platform specific headers like;
 AM33xx: arch/arm/include/asm/arch-am33xx/mem.h
 OMAP3:  arch/arm/include/asm/arch-omap3/mem.h
 OMAP4:  arch/arm/include/asm/arch-omap4/mem.h
 OMAP4:  arch/arm/include/asm/arch-omap5/mem.h

Also, CONFIG_xx passed by board-profile decide config for which set of macros
need to be used for initialization
 CONFIG_NAND:    initialize GPMC for NAND device
 CONFIG_NOR:     initialize GPMC for NOR device
 CONFIG_ONENAND: initialize GPMC for ONENAND device

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 arch/arm/cpu/armv7/am33xx/Makefile                 |   1 -
 arch/arm/cpu/armv7/omap-common/Makefile            |   4 -
 .../{am33xx/mem.c => omap-common/mem-common.c}     |  39 ++++++
 arch/arm/cpu/armv7/omap3/Makefile                  |   1 -
 arch/arm/cpu/armv7/omap3/mem.c                     | 139 ---------------------
 5 files changed, 39 insertions(+), 145 deletions(-)
 rename arch/arm/cpu/armv7/{am33xx/mem.c => omap-common/mem-common.c} (68%)
 delete mode 100644 arch/arm/cpu/armv7/omap3/mem.c

diff --git a/arch/arm/cpu/armv7/omap3/mem.c b/arch/arm/cpu/armv7/omap3/mem.c
deleted file mode 100644
index 1832aff..0000000

Comments

Tom Rini May 23, 2014, 11:52 p.m. UTC | #1
On Thu, May 08, 2014 at 09:43:47PM +0530, pekon gupta wrote:

> GPMC controller on TI's OMAP SoC is general purpose controller to interface
> with different types of external devices like;
>  - parallel NOR flash
>  - parallel NAND flash
>  - OneNand flash
>  - SDR RAM
>  - Ethernet Devices like LAN9220
> 
> Though GPMC configurations may be different for each platform depending on
> clock-frequency and external device interfacing with controller. But
> initialization sequence remains common across all platfoms.
> 
> Thus this patch merges gpmc_init() scattered in different arch-xx/mem.c
> files into single omap-common/mem-common.c
> 
> However, actual platforms specific register config values are still sourced
> from corresponding platform specific headers like;
>  AM33xx: arch/arm/include/asm/arch-am33xx/mem.h
>  OMAP3:  arch/arm/include/asm/arch-omap3/mem.h
>  OMAP4:  arch/arm/include/asm/arch-omap4/mem.h
>  OMAP4:  arch/arm/include/asm/arch-omap5/mem.h
> 
> Also, CONFIG_xx passed by board-profile decide config for which set of macros
> need to be used for initialization
>  CONFIG_NAND:    initialize GPMC for NAND device
>  CONFIG_NOR:     initialize GPMC for NOR device
>  CONFIG_ONENAND: initialize GPMC for ONENAND device
> 
> Signed-off-by: Pekon Gupta <pekon@ti.com>

After adding GPMC_SIZE_256M to omap3/mem.h, applied to u-boot-ti/master,
thanks!

And note that git detect renames got a bit too agressive here so I had
to apply it kinda by hand, but I think I did everything right.
pekon gupta May 27, 2014, 4:47 a.m. UTC | #2
>From: Tom Rini [mailto:tom.rini@gmail.com] On Behalf Of Rini, Tom
>On Thu, May 08, 2014 at 09:43:47PM +0530, pekon gupta wrote:
>
>> GPMC controller on TI's OMAP SoC is general purpose controller to interface
>> with different types of external devices like;
>>  - parallel NOR flash
>>  - parallel NAND flash
>>  - OneNand flash
>>  - SDR RAM
>>  - Ethernet Devices like LAN9220
>>
>> Though GPMC configurations may be different for each platform depending on
>> clock-frequency and external device interfacing with controller. But
>> initialization sequence remains common across all platfoms.
>>
>> Thus this patch merges gpmc_init() scattered in different arch-xx/mem.c
>> files into single omap-common/mem-common.c
>>
>> However, actual platforms specific register config values are still sourced
>> from corresponding platform specific headers like;
>>  AM33xx: arch/arm/include/asm/arch-am33xx/mem.h
>>  OMAP3:  arch/arm/include/asm/arch-omap3/mem.h
>>  OMAP4:  arch/arm/include/asm/arch-omap4/mem.h
>>  OMAP4:  arch/arm/include/asm/arch-omap5/mem.h
>>
>> Also, CONFIG_xx passed by board-profile decide config for which set of macros
>> need to be used for initialization
>>  CONFIG_NAND:    initialize GPMC for NAND device
>>  CONFIG_NOR:     initialize GPMC for NOR device
>>  CONFIG_ONENAND: initialize GPMC for ONENAND device
>>
>> Signed-off-by: Pekon Gupta <pekon@ti.com>
>
>After adding GPMC_SIZE_256M to omap3/mem.h, applied to u-boot-ti/master,
>thanks!
>
>And note that git detect renames got a bit too agressive here so I had
>to apply it kinda by hand, but I think I did everything right.
>
Thanks much .. I'll review the changes.

with regards, pekon
Ash Charles May 30, 2014, 9:59 p.m. UTC | #3
Hi,

I'm actually seeing some breakage from this commit
(a0a37183bd75e74608bc78c8d0e2a34454f95a91).  When booting the DuoVero
board (no NAND/NOR/ONENAND but a network card on GPMC), it hangs as it
enters the kernel.

These lines in gpmc_init() in arch/arm/cpu/armv7/omap-common/mem-common.c
...
        writel(0, &gpmc_cfg->cs[0].config7);
        sdelay(1000);
        /* enable chip-select specific configurations */
        enable_gpmc_cs_config(gpmc_regs, &gpmc_cfg->cs[0], base, size);
...
seem to be the source of the issue.  Even though we have nothing
connected on CS0, the last line of enable_gpmc_cs_config() enables the
interface despite it being disabled right before in writel(0,
&gpmc_cfg->cs[0].config7);

--Ash

On Mon, May 26, 2014 at 9:47 PM, Gupta, Pekon <pekon@ti.com> wrote:
>>From: Tom Rini [mailto:tom.rini@gmail.com] On Behalf Of Rini, Tom
>>On Thu, May 08, 2014 at 09:43:47PM +0530, pekon gupta wrote:
>>
>>> GPMC controller on TI's OMAP SoC is general purpose controller to interface
>>> with different types of external devices like;
>>>  - parallel NOR flash
>>>  - parallel NAND flash
>>>  - OneNand flash
>>>  - SDR RAM
>>>  - Ethernet Devices like LAN9220
>>>
>>> Though GPMC configurations may be different for each platform depending on
>>> clock-frequency and external device interfacing with controller. But
>>> initialization sequence remains common across all platfoms.
>>>
>>> Thus this patch merges gpmc_init() scattered in different arch-xx/mem.c
>>> files into single omap-common/mem-common.c
>>>
>>> However, actual platforms specific register config values are still sourced
>>> from corresponding platform specific headers like;
>>>  AM33xx: arch/arm/include/asm/arch-am33xx/mem.h
>>>  OMAP3:  arch/arm/include/asm/arch-omap3/mem.h
>>>  OMAP4:  arch/arm/include/asm/arch-omap4/mem.h
>>>  OMAP4:  arch/arm/include/asm/arch-omap5/mem.h
>>>
>>> Also, CONFIG_xx passed by board-profile decide config for which set of macros
>>> need to be used for initialization
>>>  CONFIG_NAND:    initialize GPMC for NAND device
>>>  CONFIG_NOR:     initialize GPMC for NOR device
>>>  CONFIG_ONENAND: initialize GPMC for ONENAND device
>>>
>>> Signed-off-by: Pekon Gupta <pekon@ti.com>
>>
>>After adding GPMC_SIZE_256M to omap3/mem.h, applied to u-boot-ti/master,
>>thanks!
>>
>>And note that git detect renames got a bit too agressive here so I had
>>to apply it kinda by hand, but I think I did everything right.
>>
> Thanks much .. I'll review the changes.
>
> with regards, pekon
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
pekon gupta July 8, 2014, 6:19 a.m. UTC | #4
Hi Ash,

>From: ashcharles@gmail.com
>Hi,
>
>I'm actually seeing some breakage from this commit
>(a0a37183bd75e74608bc78c8d0e2a34454f95a91).  When booting the DuoVero
>board (no NAND/NOR/ONENAND but a network card on GPMC), it hangs as it
>enters the kernel.
>
>These lines in gpmc_init() in arch/arm/cpu/armv7/omap-common/mem-common.c
>...
>        writel(0, &gpmc_cfg->cs[0].config7);
>        sdelay(1000);
>        /* enable chip-select specific configurations */
>        enable_gpmc_cs_config(gpmc_regs, &gpmc_cfg->cs[0], base, size);
>...
>seem to be the source of the issue.  Even though we have nothing
>connected on CS0, the last line of enable_gpmc_cs_config() enables the
>interface despite it being disabled right before in writel(0,
>&gpmc_cfg->cs[0].config7);
>
Sorry seeing this bit late. Were you able to root cause the issue ?
All Ethernet related GPMC configurations are defined by following macros
File: $U-BOOT/arch/arm/include/asm/arch-omap3/mem.h
#define NET_GPMC_CONFIG1	0x00001000
#define NET_GPMC_CONFIG2	0x001e1e01
#define NET_GPMC_CONFIG3	0x00080300
#define NET_GPMC_CONFIG4	0x1c091c09
#define NET_GPMC_CONFIG5	0x04181f1f
#define NET_GPMC_CONFIG6	0x00000FCF
#define NET_GPMC_CONFIG7	0x00000f6c
OR
/* GPMC CS configuration for an SMSC LAN9221 ethernet controller */
#define NET_LAN9221_GPMC_CONFIG1    0x00001000
#define NET_LAN9221_GPMC_CONFIG2    0x00060700
#define NET_LAN9221_GPMC_CONFIG3    0x00020201
#define NET_LAN9221_GPMC_CONFIG4    0x06000700
#define NET_LAN9221_GPMC_CONFIG5    0x0006090A
#define NET_LAN9221_GPMC_CONFIG6    0x87030000
#define NET_LAN9221_GPMC_CONFIG7    0x00000f6c

I havn't touched these values, except for moving some of them
from one header-file to other.

Also, the change in u-boot, should not affect the kernel.
That means kernel's GPMC driver was depending on some pre-configured
value, which is wrong. 
There were couple of fixes for SMSC controller pushed in 3.16 kernel,
Are following in your tree ?
fb677ef  tony@atomide.com  ARM: OMAP2+: Fix GPMC remap for devices using an offset
efe8072  tony@atomide.com  ARM: OMAP2+: Fix oops for GPMC free


with regards, pekon
Ash Charles July 8, 2014, 11:49 p.m. UTC | #5
Hi Pekon,
On Mon, Jul 7, 2014 at 11:19 PM, Gupta, Pekon <pekon@ti.com> wrote:
> Sorry seeing this bit late. Were you able to root cause the issue ?
Did you see http://patchwork.ozlabs.org/patch/356984/ ?
This resolves the issue for me but I'd welcome any feedback you have
on this fix.
...

> Also, the change in u-boot, should not affect the kernel.
> That means kernel's GPMC driver was depending on some pre-configured
> value, which is wrong.
> There were couple of fixes for SMSC controller pushed in 3.16 kernel,
> Are following in your tree ?
> fb677ef  tony@atomide.com  ARM: OMAP2+: Fix GPMC remap for devices using an offset
> efe8072  tony@atomide.com  ARM: OMAP2+: Fix oops for GPMC free
Okay---I'd seen the breakage on both the standard 3.5 kernel for my
board (overo) as well as on the then-mainline version 3.15+ which is
why I dived into u-boot to find a fix.  I was likely missing these two
commits though!

Thanks,
Ash
pekon gupta July 9, 2014, 6:16 p.m. UTC | #6
>From: ashcharles@gmail.com 
>>On Mon, Jul 7, 2014 at 11:19 PM, Gupta, Pekon <pekon@ti.com> wrote:
>> Sorry seeing this bit late. Were you able to root cause the issue ?
>Did you see http://patchwork.ozlabs.org/patch/356984/ ?
>This resolves the issue for me but I'd welcome any feedback you have
>on this fix.

Thanks for the fix.
Though I don't know why GPMC initialization without any device connected
should cause a hang, that too on kernel side.

with regards, pekon
diff mbox

Patch

diff --git a/arch/arm/cpu/armv7/am33xx/Makefile b/arch/arm/cpu/armv7/am33xx/Makefile
index 5566310..aae3f09 100644
--- a/arch/arm/cpu/armv7/am33xx/Makefile
+++ b/arch/arm/cpu/armv7/am33xx/Makefile
@@ -14,7 +14,6 @@  endif
 
 obj-$(CONFIG_TI816X)	+= clock_ti816x.o
 obj-y	+= sys_info.o
-obj-y	+= mem.o
 obj-y	+= ddr.o
 obj-y	+= emif4.o
 obj-y	+= board.o
diff --git a/arch/arm/cpu/armv7/omap-common/Makefile b/arch/arm/cpu/armv7/omap-common/Makefile
index 59f5352..5f5132f 100644
--- a/arch/arm/cpu/armv7/omap-common/Makefile
+++ b/arch/arm/cpu/armv7/omap-common/Makefile
@@ -27,8 +27,4 @@  obj-y	+= boot-common.o
 obj-y	+= lowlevel_init.o
 endif
 
-ifndef CONFIG_SPL_BUILD
-ifneq ($(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
 obj-y	+= mem-common.o
-endif
-endif
diff --git a/arch/arm/cpu/armv7/am33xx/mem.c b/arch/arm/cpu/armv7/omap-common/mem-common.c
similarity index 68%
rename from arch/arm/cpu/armv7/am33xx/mem.c
rename to arch/arm/cpu/armv7/omap-common/mem-common.c
index 56c9e7d..944ef84 100644
--- a/arch/arm/cpu/armv7/am33xx/mem.c
+++ b/arch/arm/cpu/armv7/omap-common/mem-common.c
@@ -19,9 +19,36 @@ 
 #include <asm/arch/mem.h>
 #include <asm/arch/sys_proto.h>
 #include <command.h>
+#include <linux/mtd/omap_gpmc.h>
 
 struct gpmc *gpmc_cfg;
 
+#if defined(CONFIG_OMAP34XX)
+/********************************************************
+ *  mem_ok() - test used to see if timings are correct
+ *             for a part. Helps in guessing which part
+ *             we are currently using.
+ *******************************************************/
+u32 mem_ok(u32 cs)
+{
+	u32 val1, val2, addr;
+	u32 pattern = 0x12345678;
+
+	addr = OMAP34XX_SDRC_CS0 + get_sdr_cs_offset(cs);
+
+	writel(0x0, addr + 0x400);	/* clear pos A */
+	writel(pattern, addr);		/* pattern to pos B */
+	writel(0x0, addr + 4);		/* remove pattern off the bus */
+	val1 = readl(addr + 0x400);	/* get pos A value */
+	val2 = readl(addr);		/* get val2 */
+	writel(0x0, addr + 0x400);	/* clear pos A */
+
+	if ((val1 != 0) || (val2 != pattern))	/* see if pos A val changed */
+		return 0;
+	else
+		return 1;
+}
+#endif
 
 void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,
 			u32 size)
@@ -74,6 +101,17 @@  void gpmc_init(void)
 						};
 	u32 size = GPMC_SIZE_256M;
 	u32 base = CONFIG_SYS_NAND_BASE;
+#elif defined(CONFIG_CMD_ONENAND)
+	const u32 gpmc_regs[GPMC_MAX_REG] = {	ONENAND_GPMC_CONFIG1,
+						ONENAND_GPMC_CONFIG2,
+						ONENAND_GPMC_CONFIG3,
+						ONENAND_GPMC_CONFIG4,
+						ONENAND_GPMC_CONFIG5,
+						ONENAND_GPMC_CONFIG6,
+						0
+						};
+	u32 base = PISMO1_ONEN_BASE;
+	u32 size = PISMO1_ONEN_SIZE;
 #else
 	const u32 gpmc_regs[GPMC_MAX_REG] = { 0, 0, 0, 0, 0, 0, 0 };
 	u32 size = 0;
@@ -83,6 +121,7 @@  void gpmc_init(void)
 	writel(0x00000008, &gpmc_cfg->sysconfig);
 	writel(0x00000000, &gpmc_cfg->irqstatus);
 	writel(0x00000000, &gpmc_cfg->irqenable);
+	writel(0x00000000, &gpmc_cfg->timeout_control);
 #ifdef CONFIG_NOR
 	writel(0x00000200, &gpmc_cfg->config);
 #else
diff --git a/arch/arm/cpu/armv7/omap3/Makefile b/arch/arm/cpu/armv7/omap3/Makefile
index 39ff257..cf86046 100644
--- a/arch/arm/cpu/armv7/omap3/Makefile
+++ b/arch/arm/cpu/armv7/omap3/Makefile
@@ -9,7 +9,6 @@  obj-y	:= lowlevel_init.o
 
 obj-y	+= board.o
 obj-y	+= clock.o
-obj-y	+= mem.o
 obj-y	+= sys_info.o
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_OMAP3_ID_NAND)	+= spl_id_nand.o