Skip to contentSkip to conversation

Overo NET_GPMC_CONFIG definitions

U-Boot Scott Ellis 1 participant 1 message Jan 4, 2010

lore
Share & tools
lore
#0 lore raw

Hello,

I am working with the Gumxtix Overo OMAP3 based systems.

The Overo expansion boards use an SMSC LAN9221 ethernet controller. The NET_GPMC_CONFIG timing registers in include/asm-arm/arch-omap3/mem.h shared by the overo, ti/evm and tim11/devkit8000 are not optimal for the LAN9221. It looks like they might be correct for the ti/evm board's LAN9220 chip.

In particular, the minimum read/write cycle times required by the LAN9221 controller are only 45ns as opposed to 165ns required by the LAN9220.

Adjusting the read/write cycle times in the GPMC registers to make them specific to the overo/LAN9221 connection, roughly doubles the read/write network speeds as measured with iperf and greatly reduces rx dropped packets, usually to zero except under high network loads. With the old values, rx drops are common.

Here are the results of some one way tests with iperf running for 5 minutes, >3GBytes transferred with the new values.

Old values
Read 46 Mbits/sec
Write 44 Mbits/sec

New values
Read 88 Mbits/sec
Write 94 Mbits/sec

The iperf tests were with the linux 2.6.31 and 2.6.32 and the smsc911x driver. I also tested the u-boot smc911x driver doing tftp loads of the kernel and the performance was noticeably faster though I did not time it.

From the source, it looks like the devkit8000 uses a Davicom DM9000 ethernet controller. It might be of interest to check that board also. I only have access to Overos.

A proposed patch below defines new values for the gpmc registers in overo.h and uses those in overo.c instead of the shared values defined in include/asm-arm/arch-omap3/mem.h.

There should be no impact to other boards.

 board/overo/overo.c |   14 +++++++-------
 board/overo/overo.h |    9 +++++++++
 2 files changed, 16 insertions(+), 7 deletions(-)
board/overo/overo.c +7 -7
index d42dc13..5e94a36 100644
@@ -100,13 +100,13 @@ static void setup_net_chip(void)
        struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
 
        /* Configure GPMC registers */
-       writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1);
-       writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2);
-       writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3);
-       writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4);
-       writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5);
-       writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6);
-       writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7);
+       writel(NET_LAN9221_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1);
+       writel(NET_LAN9221_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2);
+       writel(NET_LAN9221_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3);
+       writel(NET_LAN9221_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4);
+       writel(NET_LAN9221_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5);
+       writel(NET_LAN9221_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6);
+       writel(NET_LAN9221_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7);
 
        /* Enable off mode for NWE in PADCONF_GPMC_NWE register */
        writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00,

&ctrl_base->gpmc_nwe);

board/overo/overo.h +9 -0
index 4c7ac27..1873523 100644
@@ -33,6 +33,15 @@ const omap3_sysinfo sysinfo = {
 #endif
 };
 
+/* GPMC CS 5 connected to an SMSC LAN9221 ethernet controller */
+#define NET_LAN9221_GPMC_CONFIG1    0x00001000
+#define NET_LAN9221_GPMC_CONFIG2    0x00080701
+#define NET_LAN9221_GPMC_CONFIG3    0x00020201
+#define NET_LAN9221_GPMC_CONFIG4    0x08030703
+#define NET_LAN9221_GPMC_CONFIG5    0x00060908
+#define NET_LAN9221_GPMC_CONFIG6    0x87030000
+#define NET_LAN9221_GPMC_CONFIG7    0x00000f6c
+
 /*
  * IEN  - Input Enable
  * IDIS - Input Disable

Peace,
Scott Ellis