* Patch by Dan Malek, 07 Apr 2004:
authorwdenk <wdenk>
Sun, 18 Apr 2004 21:45:42 +0000 (21:45 +0000)
committerwdenk <wdenk>
Sun, 18 Apr 2004 21:45:42 +0000 (21:45 +0000)
  - Add support for RPC/STx GP3, Motorola 8560 board
  - Update 85xx TSEC driver so it searches MII for first available PHY
    and uses that one.
  - Add functions to support console MII commands.

* Patch by Tolunay Orkun, 07 Apr 2004:
  Move  initialization of bi_iic_fast[]
  from board_init_f() to board_init_r()

* Patch by Yasushi Shoji, 07 Apr 2004:
  Cleanup microblaze port

* Patch by Sangmoon Kim, 07 Apr 2004:
  Add auto SDRAM module detection for Debris board

20 files changed:
CHANGELOG
MAINTAINERS
MAKEALL
Makefile
README
board/AtmarkTechno/suzaku/suzaku.c
board/etin/debris/debris.c
board/stxgp3/Makefile [new file with mode: 0644]
board/stxgp3/config.mk [new file with mode: 0644]
board/stxgp3/flash.c [new file with mode: 0644]
board/stxgp3/init.S [new file with mode: 0644]
board/stxgp3/stxgp3.c [new file with mode: 0644]
board/stxgp3/u-boot.lds [new file with mode: 0644]
cpu/mpc85xx/tsec.c
cpu/mpc85xx/tsec.h
include/asm-ppc/immap_8260.h
include/configs/debris.h
include/configs/stxgp3.h [new file with mode: 0644]
lib_microblaze/board.c
lib_ppc/board.c

index c2acd37b85bb5f468d73fae670f8664c8901bedf..45e5b3d27bb67eb43bac8ed14dd1148bbd9c2900 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,22 @@
 Changes for U-Boot 1.1.1:
 ======================================================================
 
+* Patch by Dan Malek, 07 Apr 2004:
+  - Add support for RPC/STx GP3, Motorola 8560 board
+  - Update 85xx TSEC driver so it searches MII for first available PHY
+    and uses that one.
+  - Add functions to support console MII commands.
+
+* Patch by Tolunay Orkun, 07 Apr 2004:
+  Move  initialization of bi_iic_fast[]
+  from board_init_f() to board_init_r()
+
+* Patch by Yasushi Shoji, 07 Apr 2004:
+  Cleanup microblaze port
+
+* Patch by Sangmoon Kim, 07 Apr 2004:
+  Add auto SDRAM module detection for Debris board
+
 * Patch by Rune Torgersen, 06 Apr 2004:
   - Fix some PCI problems on the MPC8266ADS board
   - Fix the location of some PCI entries in the immap structure
index 1ad91ea7d79f3b0fb0b0628a07af73452ddfdcc1..7e4415b9d51c2896255f2cb7acc15a614b576b5c 100644 (file)
@@ -264,6 +264,10 @@ Xianghua Xiao <x.xiao@motorola.com>
        MPC8540ADS              MPC8540
        MPC8560ADS              MPC8560
 
+Dan Malek <dan@embeddededge.com>
+
+       STxGP3                  MPC85xx
+
 -------------------------------------------------------------------------
 
 Unknown / orphaned boards:
diff --git a/MAKEALL b/MAKEALL
index 4667032256e68533283a530674795d206da1e809..b241057c9cbdcdccaaf07aaf36a3b831f69a3860 100644 (file)
--- a/MAKEALL
+++ b/MAKEALL
@@ -97,7 +97,7 @@ LIST_8260="   \
 #########################################################################
 
 LIST_85xx="    \
-       MPC8540ADS      MPC8560ADS                                      \
+       MPC8540ADS      MPC8560ADS      stxgp3                          \
 "
 
 #########################################################################
index fbcdeb7f5f722bd92b542e6512b54751c67c6981..0287765c79f74830222368696d87022678b3f228 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -722,6 +722,9 @@ CPC45_ROMBOOT_config:       unconfig
 CU824_config: unconfig
        @./mkconfig $(@:_config=) ppc mpc824x cu824
 
+debris_config: unconfig
+       @./mkconfig $(@:_config=) ppc mpc824x debris etin
+
 eXalion_config: unconfig
        @./mkconfig $(@:_config=) ppc mpc824x eXalion
 
@@ -947,6 +950,9 @@ MPC8540ADS_config:      unconfig
 MPC8560ADS_config:      unconfig
        @./mkconfig $(@:_config=) ppc mpc85xx mpc8560ads
 
+stxgp3_config:      unconfig
+       @./mkconfig $(@:_config=) ppc mpc85xx stxgp3
+
 #########################################################################
 ## 74xx/7xx Systems
 #########################################################################
@@ -963,9 +969,6 @@ DB64360_config:  unconfig
 DB64460_config:  unconfig
        @./mkconfig DB64460 ppc 74xx_7xx db64460 Marvell
 
-debris_config: unconfig
-       @./mkconfig $(@:_config=) ppc mpc824x debris etin
-
 ELPPC_config: unconfig
        @./mkconfig $(@:_config=) ppc 74xx_7xx elppc eltec
 
diff --git a/README b/README
index 91b523f8b50c28b2ed1acefaa6d593462cd84632..df2c29531e6033e914b151fcc6a967de1227156c 100644 (file)
--- a/README
+++ b/README
@@ -281,11 +281,11 @@ The following options need to be configured:
                CONFIG_RPXlite,         CONFIG_RPXsuper,        CONFIG_rsdproto,
                CONFIG_sacsng,          CONFIG_Sandpoint8240,   CONFIG_Sandpoint8245,
                CONFIG_sbc8260,         CONFIG_SM850,           CONFIG_SPD823TS,
-               CONFIG_SXNI855T,        CONFIG_TQM823L,         CONFIG_TQM8260,
-               CONFIG_TQM850L,         CONFIG_TQM855L,         CONFIG_TQM860L,
-               CONFIG_TTTech,          CONFIG_UTX8245,         CONFIG_V37,
-               CONFIG_W7OLMC,          CONFIG_W7OLMG,          CONFIG_WALNUT405,
-               CONFIG_ZPC1900,         CONFIG_ZUMA,
+               CONFIG_STXGP3,          CONFIG_SXNI855T,        CONFIG_TQM823L,
+               CONFIG_TQM8260,         CONFIG_TQM850L,         CONFIG_TQM855L,
+               CONFIG_TQM860L,         CONFIG_TTTech,          CONFIG_UTX8245,
+               CONFIG_V37,             CONFIG_W7OLMC,          CONFIG_W7OLMG,
+               CONFIG_WALNUT405,       CONFIG_ZPC1900,         CONFIG_ZUMA,
 
                ARM based boards:
                -----------------
@@ -2017,9 +2017,9 @@ configurations; the following names are supported:
        QS850_config            QS860T_config           RPXlite_config
        RPXsuper_config         rsdproto_config         Sandpoint8240_config
        sbc8260_config          SM850_config            SPD823TS_config
-       SXNI855T_config         TQM823L_config          TQM850L_config
-       TQM855L_config          TQM860L_config          WALNUT405_config
-       ZPC1900_config
+       stxgp3_config           SXNI855T_config         TQM823L_config
+       TQM850L_config          TQM855L_config          TQM860L_config
+       WALNUT405_config        ZPC1900_config
 
        Note: for some board special configuration names may exist; check  if
              additional  information is available from the board vendor; for
index 6a202488c69ac5c811f3324a4de6dda487c92323..3a47aa5a1108ed20d3d179805f34f7a707a5c23f 100644 (file)
 
 #include <common.h>
 
-void board_init(void)
-{
-       serial_init();
-
-       main_loop();
-}
-
 void do_reset(void)
 {
 }
index f7851b3c2bf506101a16e08f6dcd08f24ddccebc..93c502c9de8fac2de5011d40ac0cd5a678daf540 100644 (file)
@@ -24,6 +24,7 @@
 #include <common.h>
 #include <mpc824x.h>
 #include <pci.h>
+#include <i2c.h>
 
 int checkboard (void)
 {
@@ -52,28 +53,70 @@ int checkflash (void)
 
 long int initdram (int board_type)
 {
-       long size;
-#if 0
-       long new_bank0_end;
-       long mear1;
-       long emear1;
-#endif
-
-       size = get_ram_size(CFG_SDRAM_BASE, CFG_MAX_RAM_SIZE);
-
-#if 0
-       new_bank0_end = size - 1;
-       mear1 = mpc824x_mpc107_getreg(MEAR1);
-       emear1 = mpc824x_mpc107_getreg(EMEAR1);
-       mear1 = (mear1  & 0xFFFFFF00) |
-               ((new_bank0_end & MICR_ADDR_MASK) >> MICR_ADDR_SHIFT);
-       emear1 = (emear1 & 0xFFFFFF00) |
-               ((new_bank0_end & MICR_ADDR_MASK) >> MICR_EADDR_SHIFT);
-       mpc824x_mpc107_setreg(MEAR1, mear1);
-       mpc824x_mpc107_setreg(EMEAR1, emear1);
-#endif
+       int m, row, col, bank, i;
+       unsigned long start, end;
+       uint32_t mccr1;
+       uint32_t mear1 = 0, emear1 = 0, msar1 = 0, emsar1 = 0;
+       uint32_t mear2 = 0, emear2 = 0, msar2 = 0, emsar2 = 0;
+       uint8_t mber = 0;
+
+       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+
+       if (i2c_reg_read (0x50, 2) != 0x04) return 0;   /* Memory type */
+       m = i2c_reg_read (0x50, 5);     /* # of physical banks */
+       row = i2c_reg_read (0x50, 3);   /* # of rows */
+       col = i2c_reg_read (0x50, 4);   /* # of columns */
+       bank = i2c_reg_read (0x50, 17); /* # of logical banks */
+
+       CONFIG_READ_WORD(MCCR1, mccr1);
+       mccr1 &= 0xffff0000;
+
+       start = CFG_SDRAM_BASE;
+       end = start + (1 << (col + row + 3) ) * bank - 1;
+
+       for (i = 0; i < m; i++) {
+               mccr1 |= ((row == 13)? 2 : (bank == 4)? 0 : 3) << i * 2;
+               if (i < 4) {
+                       msar1  |= ((start >> 20) & 0xff) << i * 8;
+                       emsar1 |= ((start >> 28) & 0xff) << i * 8;
+                       mear1  |= ((end >> 20) & 0xff) << i * 8;
+                       emear1 |= ((end >> 28) & 0xff) << i * 8;
+               } else {
+                       msar2  |= ((start >> 20) & 0xff) << (i-4) * 8;
+                       emsar2 |= ((start >> 28) & 0xff) << (i-4) * 8;
+                       mear2  |= ((end >> 20) & 0xff) << (i-4) * 8;
+                       emear2 |= ((end >> 28) & 0xff) << (i-4) * 8;
+               }
+               mber |= 1 << i;
+               start += (1 << (col + row + 3) ) * bank;
+               end += (1 << (col + row + 3) ) * bank;
+       }
+       for (; i < 8; i++) {
+               if (i < 4) {
+                       msar1  |= 0xff << i * 8;
+                       emsar1 |= 0x30 << i * 8;
+                       mear1  |= 0xff << i * 8;
+                       emear1 |= 0x30 << i * 8;
+               } else {
+                       msar2  |= 0xff << (i-4) * 8;
+                       emsar2 |= 0x30 << (i-4) * 8;
+                       mear2  |= 0xff << (i-4) * 8;
+                       emear2 |= 0x30 << (i-4) * 8;
+               }
+       }
 
-       return (size);
+       CONFIG_WRITE_WORD(MCCR1, mccr1);
+       CONFIG_WRITE_WORD(MSAR1, msar1);
+       CONFIG_WRITE_WORD(EMSAR1, emsar1);
+       CONFIG_WRITE_WORD(MEAR1, mear1);
+       CONFIG_WRITE_WORD(EMEAR1, emear1);
+       CONFIG_WRITE_WORD(MSAR2, msar2);
+       CONFIG_WRITE_WORD(EMSAR2, emsar2);
+       CONFIG_WRITE_WORD(MEAR2, mear2);
+       CONFIG_WRITE_WORD(EMEAR2, emear2);
+       CONFIG_WRITE_BYTE(MBER, mber);
+
+       return (1 << (col + row + 3) ) * bank * m;
 }
 
 /*
diff --git a/board/stxgp3/Makefile b/board/stxgp3/Makefile
new file mode 100644 (file)
index 0000000..d150df8
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   := $(BOARD).o flash.o
+SOBJS  := init.o
+#SOBJS :=
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) crv $@ $(OBJS)
+
+clean:
+       rm -f $(OBJS) $(SOBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+-include .depend
+
+#########################################################################
diff --git a/board/stxgp3/config.mk b/board/stxgp3/config.mk
new file mode 100644 (file)
index 0000000..14c1f01
--- /dev/null
@@ -0,0 +1,33 @@
+# Modified by Xianghua Xiao, X.Xiao@motorola.com
+# (C) Copyright 2002,2003 Motorola Inc.
+#
+# Copied from ADS85xx for STx GP3 - Dan Malek
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+#
+# default CCARBAR is at 0xff700000
+# assume U-Boot is less than 0.5MB
+#
+TEXT_BASE = 0xfff80000
+
+PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1
+PLATFORM_CPPFLAGS += -DCONFIG_MPC8560=1
+PLATFORM_CPPFLAGS += -DCONFIG_E500=1
diff --git a/board/stxgp3/flash.c b/board/stxgp3/flash.c
new file mode 100644 (file)
index 0000000..e273973
--- /dev/null
@@ -0,0 +1,517 @@
+/*
+ * (C) Copyright 2003, Dan Malek, Embedded Edge, LLC.  <dan@embeddededge.com>
+ * Copied from ADS85xx.
+ * Updated to support the Silicon Tx GP3 8560.  We should only find
+ * two Intel 28F640 parts in 16-bit mode (i.e. 32-bit wide flash),
+ * but I left other code here in case people order custom boards.
+ *
+ * (C) Copyright 2003 Motorola Inc.
+ *  Xianghua Xiao,(X.Xiao@motorola.com)
+ *
+ * (C) Copyright 2000, 2001
+ *  Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2001, Stuart Hughes, Lineo Inc, stuarth@lineo.com
+ * Add support the Sharp chips on the mpc8260ads.
+ * I started with board/ip860/flash.c and made changes I found in
+ * the MTD project by David Schleef.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+
+#if !defined(CFG_NO_FLASH)
+
+flash_info_t   flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips        */
+
+#if defined(CFG_ENV_IS_IN_FLASH)
+# ifndef  CFG_ENV_ADDR
+#  define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_ENV_OFFSET)
+# endif
+# ifndef  CFG_ENV_SIZE
+#  define CFG_ENV_SIZE CFG_ENV_SECT_SIZE
+# endif
+# ifndef  CFG_ENV_SECT_SIZE
+#  define CFG_ENV_SECT_SIZE  CFG_ENV_SIZE
+# endif
+#endif
+
+#undef DEBUG
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+static ulong flash_get_size (vu_long *addr, flash_info_t *info);
+static int write_word (flash_info_t *info, ulong dest, ulong data);
+static int clear_block_lock_bit(vu_long * addr);
+/*-----------------------------------------------------------------------
+ */
+
+unsigned long flash_init (void)
+{
+       unsigned long size;
+       int i;
+
+       /* Init: enable write,
+        * or we cannot even write flash commands
+        */
+       for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
+               flash_info[i].flash_id = FLASH_UNKNOWN;
+
+               /* set the default sector offset */
+       }
+
+       /* Static FLASH Bank configuration here - FIXME XXX */
+
+       size = flash_get_size((vu_long *)CFG_FLASH_BASE, &flash_info[0]);
+
+       if (flash_info[0].flash_id == FLASH_UNKNOWN) {
+               printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
+                       size, size<<20);
+       }
+
+       /* Re-do sizing to get full correct info */
+       size = flash_get_size((vu_long *)CFG_FLASH_BASE, &flash_info[0]);
+
+       flash_info[0].size = size;
+
+#if !defined(CONFIG_RAM_AS_FLASH)
+#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
+       /* monitor protection ON by default */
+       flash_protect(FLAG_PROTECT_SET,
+                     CFG_MONITOR_BASE,
+                     CFG_MONITOR_BASE+monitor_flash_len-1,
+                     &flash_info[0]);
+#endif
+
+#ifdef CFG_ENV_IS_IN_FLASH
+       /* ENV protection ON by default */
+       flash_protect(FLAG_PROTECT_SET,
+                     CFG_ENV_ADDR,
+                     CFG_ENV_ADDR+CFG_ENV_SECT_SIZE-1,
+                     &flash_info[0]);
+#endif
+#endif
+       return (size);
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info  (flash_info_t *info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf ("missing or unknown FLASH type\n");
+               return;
+       }
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case FLASH_MAN_INTEL:   printf ("Intel ");              break;
+       case FLASH_MAN_SHARP:   printf ("Sharp ");              break;
+       default:                printf ("Unknown Vendor ");     break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case FLASH_28F640C3T:   printf ("28F640C3T (64 Mbit x 2, 128 x 128k)\n");
+                               break;
+       default:                printf ("Unknown Chip Type\n");
+                               break;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+               info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i=0; i<info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf ("\n   ");
+               printf (" %08lX%s",
+                       info->start[i],
+                       info->protect[i] ? " (RO)" : "     "
+               );
+       }
+       printf ("\n");
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ */
+
+static ulong flash_get_size (vu_long *addr, flash_info_t *info)
+{
+       short i;
+       ulong value;
+       ulong base = (ulong)addr;
+       ulong sector_offset;
+
+#ifdef DEBUG
+       printf("Check flash at 0x%08x\n",(uint)addr);
+#endif
+       /* Write "Intelligent Identifier" command: read Manufacturer ID */
+       *addr = 0x90909090;
+       udelay(20);
+       asm("sync");
+
+       value = addr[0] & 0x00FF00FF;
+
+#ifdef DEBUG
+       printf("manufacturer=0x%x\n",(uint)value);
+#endif
+       switch (value) {
+       case MT_MANUFACT:       /* SHARP, MT or => Intel */
+       case INTEL_ALT_MANU:
+               info->flash_id = FLASH_MAN_INTEL;
+               break;
+       default:
+               printf("unknown manufacturer: %x\n", (unsigned int)value);
+               info->flash_id = FLASH_UNKNOWN;
+               info->sector_count = 0;
+               info->size = 0;
+               return (0);                     /* no or unknown flash  */
+       }
+
+       value = addr[1];             /* device ID            */
+
+#ifdef DEBUG
+       printf("deviceID=0x%x\n",(uint)value);
+#endif
+       switch (value) {
+
+       case (INTEL_ID_28F640C3T):
+               info->flash_id += FLASH_28F640C3T;
+               info->sector_count = 135;
+               info->size = 0x01000000;
+               sector_offset = 0x20000;
+               break;                          /* => 2x8 MB            */
+
+       default:
+               info->flash_id = FLASH_UNKNOWN;
+               return (0);                     /* => no or unknown flash */
+
+       }
+
+       /* set up sector start address table
+        * The first 127 blocks are large, the last 8 are small.
+        */
+       for (i = 0; i < 127; i++) {
+               info->start[i] = base;
+               base += sector_offset;
+               /* Sectors are locked upon reset */
+               info->protect[i] = 0;
+       }
+       for (i = 127; i < 135; i++) {
+               info->start[i] = base;
+               base += 0x4000;
+               /* Sectors are locked upon reset */
+               info->protect[i] = 0;
+       }
+
+
+       /*
+        * Prevent writes to uninitialized FLASH.
+        */
+       if (info->flash_id != FLASH_UNKNOWN) {
+               addr = (vu_long *)info->start[0];
+               *addr = 0xFFFFFF;       /* reset bank to read array mode */
+               asm("sync");
+       }
+
+       return (info->size);
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+
+int    flash_erase (flash_info_t *info, int s_first, int s_last)
+{
+       int flag, prot, sect;
+       ulong start, now, last;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               if (info->flash_id == FLASH_UNKNOWN) {
+                       printf ("- missing\n");
+               } else {
+                       printf ("- no sectors to erase\n");
+               }
+               return 1;
+       }
+
+       if (    ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_INTEL)
+            && ((info->flash_id & FLASH_VENDMASK) != FLASH_MAN_SHARP) ) {
+               printf ("Can't erase unknown flash type %08lx - aborted\n",
+                       info->flash_id);
+               return 1;
+       }
+
+       prot = 0;
+       for (sect=s_first; sect<=s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+
+       if (prot) {
+               printf ("- Warning: %d protected sectors will not be erased!\n",
+                       prot);
+       } else {
+               printf ("\n");
+       }
+
+#ifdef DEBUG
+       printf("\nFlash Erase:\n");
+#endif
+       /* Make Sure Block Lock Bit is not set. */
+       if(clear_block_lock_bit((vu_long *)(info->start[s_first]))){
+               return 1;
+       }
+
+       /* Start erase on unprotected sectors */
+#if defined(DEBUG)
+       printf("Begin to erase now,s_first=0x%x s_last=0x%x...\n",s_first,s_last);
+#endif
+       for (sect = s_first; sect<=s_last; sect++) {
+               if (info->protect[sect] == 0) { /* not protected */
+                       vu_long *addr = (vu_long *)(info->start[sect]);
+                       asm("sync");
+
+                       last = start = get_timer (0);
+
+                       /* Disable interrupts which might cause a timeout here */
+                       flag = disable_interrupts();
+
+                       /* Reset Array */
+                       *addr = 0xffffffff;
+                       asm("sync");
+                       /* Clear Status Register */
+                       *addr = 0x50505050;
+                       asm("sync");
+                       /* Single Block Erase Command */
+                       *addr = 0x20202020;
+                       asm("sync");
+                       /* Confirm */
+                       *addr = 0xD0D0D0D0;
+                       asm("sync");
+
+                       if((info->flash_id & FLASH_TYPEMASK) != FLASH_LH28F016SCT) {
+                           /* Resume Command, as per errata update */
+                           *addr = 0xD0D0D0D0;
+                           asm("sync");
+                       }
+
+                       /* re-enable interrupts if necessary */
+                       if (flag)
+                               enable_interrupts();
+
+                       /* wait at least 80us - let's wait 1 ms */
+                       udelay (1000);
+                       while ((*addr & 0x00800080) != 0x00800080) {
+                               if(*addr & 0x00200020){
+                                       printf("Error in Block Erase - Lock Bit may be set!\n");
+                                       printf("Status Register = 0x%X\n", (uint)*addr);
+                                       *addr = 0xFFFFFFFF;     /* reset bank */
+                                       asm("sync");
+                                       return 1;
+                               }
+                               if ((now=get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+                                       printf ("Timeout\n");
+                                       *addr = 0xFFFFFFFF;     /* reset bank */
+                                       asm("sync");
+                                       return 1;
+                               }
+                               /* show that we're waiting */
+                               if ((now - last) > 1000) {      /* every second */
+                                       putc ('.');
+                                       last = now;
+                               }
+                       }
+
+                       /* reset to read mode */
+                       *addr = 0xFFFFFFFF;
+                       asm("sync");
+               }
+       }
+
+       printf ("flash erase done\n");
+       return 0;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+
+int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+{
+       ulong cp, wp, data;
+       int i, l, rc;
+
+       wp = (addr & ~3);       /* get lower word aligned address */
+
+       /*
+        * handle unaligned start bytes
+        */
+       if ((l = addr - wp) != 0) {
+               data = 0;
+               for (i=0, cp=wp; i<l; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *)cp);
+               }
+               for (; i<4 && cnt>0; ++i) {
+                       data = (data << 8) | *src++;
+                       --cnt;
+                       ++cp;
+               }
+               for (; cnt==0 && i<4; ++i, ++cp) {
+                       data = (data << 8) | (*(uchar *)cp);
+               }
+
+               if ((rc = write_word(info, wp, data)) != 0) {
+                       return (rc);
+               }
+               wp += 4;
+       }
+
+       /*
+        * handle word aligned part
+        */
+       while (cnt >= 4) {
+               data = 0;
+               for (i=0; i<4; ++i) {
+                       data = (data << 8) | *src++;
+               }
+               if ((rc = write_word(info, wp, data)) != 0) {
+                       return (rc);
+               }
+               wp  += 4;
+               cnt -= 4;
+       }
+
+       if (cnt == 0) {
+               return (0);
+       }
+
+       /*
+        * handle unaligned tail bytes
+        */
+       data = 0;
+       for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
+               data = (data << 8) | *src++;
+               --cnt;
+       }
+       for (; i<4; ++i, ++cp) {
+               data = (data << 8) | (*(uchar *)cp);
+       }
+
+       return (write_word(info, wp, data));
+}
+
+/*-----------------------------------------------------------------------
+ * Write a word to Flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+static int write_word (flash_info_t *info, ulong dest, ulong data)
+{
+       vu_long *addr = (vu_long *)dest;
+       ulong start, csr;
+       int flag;
+
+       /* Check if Flash is (sufficiently) erased */
+       if ((*addr & data) != data) {
+               return (2);
+       }
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts();
+
+       /* Write Command */
+       *addr = 0x10101010;
+       asm("sync");
+
+       /* Write Data */
+       *addr = data;
+
+       /* re-enable interrupts if necessary */
+       if (flag)
+               enable_interrupts();
+
+       /* data polling for D7 */
+       start = get_timer (0);
+       flag  = 0;
+
+       while (((csr = *addr) & 0x00800080) != 0x00800080) {
+               if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+                       flag = 1;
+                       break;
+               }
+       }
+       if (csr & 0x40404040) {
+               printf ("CSR indicates write error (%08lx) at %08lx\n", csr, (ulong)addr);
+               flag = 1;
+       }
+
+       /* Clear Status Registers Command */
+       *addr = 0x50505050;
+       asm("sync");
+       /* Reset to read array mode */
+       *addr = 0xFFFFFFFF;
+       asm("sync");
+
+       return (flag);
+}
+
+/*-----------------------------------------------------------------------
+ * Clear Block Lock Bit, returns:
+ * 0 - OK
+ * 1 - Timeout
+ */
+
+static int clear_block_lock_bit(vu_long  * addr)
+{
+       ulong start, now;
+
+       /* Reset Array */
+       *addr = 0xffffffff;
+       asm("sync");
+       /* Clear Status Register */
+       *addr = 0x50505050;
+       asm("sync");
+
+       *addr = 0x60606060;
+       asm("sync");
+       *addr = 0xd0d0d0d0;
+       asm("sync");
+
+       start = get_timer (0);
+       while((*addr & 0x00800080) != 0x00800080){
+               if ((now=get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+                       printf ("Timeout on clearing Block Lock Bit\n");
+                       *addr = 0xFFFFFFFF;     /* reset bank */
+                       asm("sync");
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+#endif /* !CFG_NO_FLASH */
diff --git a/board/stxgp3/init.S b/board/stxgp3/init.S
new file mode 100644 (file)
index 0000000..4953c0b
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2003 Embedded Edge, LLC
+ * Dan Malek <dan@embeddededge.com>
+ * Copied from ADS85xx.
+ * Updates for Silicon Tx GP3 8560.  We only support 32-bit flash
+ * and DDR with SPD EEPROM configuration.
+ *
+ * Copyright (C) 2002,2003, Motorola Inc.
+ * Xianghua Xiao <X.Xiao@motorola.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <config.h>
+#include <mpc85xx.h>
+
+#define        entry_start \
+       mflr    r1      ;       \
+       bl      0f      ;
+
+#define        entry_end \
+0:     mflr    r0      ;       \
+       mtlr    r1      ;       \
+       blr             ;
+
+/* TLB1 entries configuration: */
+
+       .section        .bootpg, "ax"
+       .globl  tlb1_entry
+tlb1_entry:
+       entry_start
+
+               /* If RAMBOOT, we are testing and the BDI has set up
+                * much of the MMU already.
+                * TLB 4,5 SDRAM
+                * TLB 15 is default CCSRBAR.
+                */
+       .long 0x09      /* the following data table uses a few of 16 TLB entries */
+
+       .long TLB1_MAS0(1,1,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(((CFG_CCSRBAR>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(((CFG_CCSRBAR>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,2,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_16M)
+       .long TLB1_MAS2(((CFG_FLASH_BASE>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(((CFG_FLASH_BASE>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,3,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(((CFG_LBC_LCLDEVS_BASE>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(((CFG_LBC_LCLDEVS_BASE>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+       .long TLB1_MAS0(1,4,0)
+       .long TLB1_MAS1(0,0,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(0,0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(0,0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,5,0)
+       .long TLB1_MAS1(0,0,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(0,0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(0,0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,6,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_64M)
+#if defined(CONFIG_RAM_AS_FLASH)
+       .long TLB1_MAS2(((CFG_LBC_SDRAM_BASE>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+#else
+       .long TLB1_MAS2(((CFG_LBC_SDRAM_BASE>>12) & 0xfffff),0,0,0,0,0,0,0,0)
+#endif
+       .long TLB1_MAS3(((CFG_LBC_SDRAM_BASE>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,7,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_16K)
+#ifdef CONFIG_L2_INIT_RAM
+       .long TLB1_MAS2(((CFG_INIT_RAM_ADDR>>12) & 0xfffff),0,0,0,1,0,0,0,0)
+#else
+       .long TLB1_MAS2(((CFG_INIT_RAM_ADDR>>12) & 0xfffff),0,0,0,0,0,0,0,0)
+#endif
+       .long TLB1_MAS3(((CFG_INIT_RAM_ADDR>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(1,8,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(((CFG_PCI_MEM_BASE>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(((CFG_PCI_MEM_BASE>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+
+#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
+       .long TLB1_MAS0(1,15,0)
+       .long TLB1_MAS1(1,1,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(((CFG_CCSRBAR_DEFAULT>>12) & 0xfffff),0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(((CFG_CCSRBAR_DEFAULT>>12) & 0xfffff),0,0,0,0,0,1,0,1,0,1)
+#else
+       .long TLB1_MAS0(1,15,0)
+       .long TLB1_MAS1(0,0,0,0,BOOKE_PAGESZ_1M)
+       .long TLB1_MAS2(0,0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(0,0,0,0,0,0,1,0,1,0,1)
+#endif
+       entry_end
+
+/* LAW(Local Access Window) configuration:
+ * 0000_0000-8000_0000: Up to 2G DDR
+ * f000_0000-f3ff_ffff: PCI(256M)
+ * f400_0000-f7ff_ffff: RapidIO(128M)
+ * f800_0000-ffff_ffff: localbus(128M)
+ *   f800_0000-fbff_ffff: LBC SDRAM(64M)
+ *   fc00_0000-fcff_ffff: LBC BCSR (1M, Chip select 1)
+ *   fdf0_0000-fdff_ffff: CCSRBAR(1M)
+ *   ff00_0000-ffff_ffff: Flash(16M)
+ * We don't need a local window for CCSRBAR and flash because they
+ * reside in their default mapped spaces.
+ */
+
+#define LAWBAR0 0
+#define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_2G)) & ~LAWAR_EN)
+
+#define LAWBAR1 ((CFG_PCI_MEM_BASE>>12) & 0xfffff)
+#define LAWAR1  (LAWAR_EN | LAWAR_TRGT_IF_PCIX | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+#if !defined(CONFIG_RAM_AS_FLASH)
+#define LAWBAR2 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff)
+#define LAWAR2  (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_128M))
+#else
+#define LAWBAR2 0
+#define LAWAR2 ((LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN)
+#endif
+
+       .section .bootpg, "ax"
+       .globl  law_entry
+law_entry:
+       entry_start
+       .long 0x03
+       .long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2
+       entry_end
diff --git a/board/stxgp3/stxgp3.c b/board/stxgp3/stxgp3.c
new file mode 100644 (file)
index 0000000..df48e77
--- /dev/null
@@ -0,0 +1,424 @@
+/*
+ * (C) Copyright 2003, Embedded Edge, LLC
+ * Dan Malek, <dan@embeddededge.com>
+ * Copied from ADS85xx.
+ * Updates for Silicon Tx GP3 8560
+ *
+ * (C) Copyright 2003,Motorola Inc.
+ * Xianghua Xiao, (X.Xiao@motorola.com)
+ *
+ * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+
+extern long int spd_sdram (void);
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/immap_85xx.h>
+#include <ioports.h>
+#include <asm/io.h>
+#include <spd.h>
+#include <miiphy.h>
+
+long int fixed_sdram (void);
+
+/*
+ * I/O Port configuration table
+ *
+ * if conf is 1, then that port pin will be configured at boot time
+ * according to the five values podr/pdir/ppar/psor/pdat for that entry
+ */
+
+const iop_conf_t iop_conf_tab[4][32] = {
+
+    /* Port A configuration */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PA31 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxENB */
+       /* PA30 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 TxClav   */
+       /* PA29 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxSOC  */
+       /* PA28 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 RxENB */
+       /* PA27 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxSOC */
+       /* PA26 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxClav */
+       /* PA25 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */
+       /* PA24 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */
+       /* PA23 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */
+       /* PA22 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */
+       /* PA21 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */
+       /* PA20 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */
+       /* PA19 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */
+       /* PA18 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */
+       /* PA17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[7] */
+       /* PA16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[6] */
+       /* PA15 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[5] */
+       /* PA14 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[4] */
+       /* PA13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[3] */
+       /* PA12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[2] */
+       /* PA11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[1] */
+       /* PA10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[0] */
+       /* PA9  */ {   0,   1,   1,   1,   0,   0   }, /* FCC1 L1TXD */
+       /* PA8  */ {   0,   1,   1,   0,   0,   0   }, /* FCC1 L1RXD */
+       /* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */
+       /* PA6  */ {   0,   1,   1,   1,   0,   0   }, /* TDM A1 L1RSYNC */
+       /* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */
+       /* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */
+       /* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */
+       /* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */
+       /* PA1  */ {   1,   0,   0,   0,   0,   0   }, /* FREERUN */
+       /* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */
+    },
+
+    /* Port B configuration */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */
+       /* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */
+       /* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */
+       /* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */
+       /* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */
+       /* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */
+       /* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */
+       /* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */
+       /* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */
+       /* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */
+       /* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */
+       /* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */
+       /* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */
+       /* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */
+       /* PB17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_DIV */
+       /* PB16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_ERR */
+       /* PB15 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_ERR */
+       /* PB14 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_EN */
+       /* PB13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:COL */
+       /* PB12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:CRS */
+       /* PB11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB9  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB8  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB7  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB6  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB5  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB4  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    },
+
+    /* Port C */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */
+       /* PC30 */ {   0,   0,   0,   1,   0,   0   }, /* PC30 */
+       /* PC29 */ {   0,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */
+       /* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */
+       /* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* UART Clock in */
+       /* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */
+       /* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */
+       /* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */
+       /* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */
+       /* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */
+       /* PC21 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */
+       /* PC20 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */
+       /* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK CLK13 */
+       /* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK14) */
+       /* PC17 */ {   0,   0,   0,   1,   0,   0   }, /* PC17 */
+       /* PC16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK16) */
+       /* PC15 */ {   0,   1,   0,   0,   0,   0   }, /* PC15 */
+       /* PC14 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */
+       /* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */
+       /* PC12 */ {   0,   1,   0,   1,   0,   0   }, /* PC12 */
+       /* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* LXT971 transmit control */
+       /* PC10 */ {   0,   0,   0,   1,   0,   0   }, /* FETHMDC */
+       /* PC9  */ {   0,   0,   0,   0,   0,   0   }, /* FETHMDIO */
+       /* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */
+       /* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */
+       /* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */
+       /* PC5  */ {   0,   0,   0,   1,   0,   0   }, /* PC5 */
+       /* PC4  */ {   0,   0,   0,   1,   0,   0   }, /* PC4 */
+       /* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */
+       /* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */
+       /* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */
+       /* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */
+    },
+
+    /* Port D */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PD31 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */
+       /* PD30 */ {   0,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */
+       /* PD29 */ {   0,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */
+       /* PD28 */ {   1,   1,   0,   0,   0,   0   }, /* SCC2 RxD */
+       /* PD27 */ {   1,   1,   0,   1,   0,   0   }, /* SCC2 TxD */
+       /* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */
+       /* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */
+       /* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */
+       /* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */
+       /* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */
+       /* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */
+       /* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */
+       /* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
+       /* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */
+       /* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */
+       /* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */
+       /* PD15 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SDA */
+       /* PD14 */ {   1,   1,   1,   0,   0,   0   }, /* I2C CLK */
+       /* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */
+       /* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */
+       /* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */
+       /* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */
+       /* PD9  */ {   0,   1,   0,   1,   0,   0   }, /* SMC1 TXD */
+       /* PD8  */ {   0,   1,   0,   0,   0,   0   }, /* SMC1 RXD */
+       /* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */
+       /* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */
+       /* PD5  */ {   0,   0,   0,   1,   0,   1   }, /* PD5 */
+       /* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */
+       /* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    }
+};
+
+static uint64_t        blinky_increment;
+static uint64_t        next_led_update;
+static uint            led_bit;
+
+int board_pre_init (void)
+{
+#if defined(CONFIG_PCI)
+    volatile immap_t *immr = (immap_t *)CFG_IMMR;
+    volatile ccsr_pcix_t *pci = &immr->im_pcix;
+
+    pci->peer &= 0xfffffffdf; /* disable master abort */
+#endif
+       return 0;
+}
+
+void reset_phy (void)
+{
+       volatile uint *blatch;
+
+       blatch = (volatile uint *)CFG_LBC_LCLDEVS_BASE;
+
+       /* reset Giga bit Ethernet port if needed here */
+
+       *blatch &= ~0x000000c0;
+       udelay(100);
+       *blatch = 0x000000c1;   /* Light one led, too */
+       udelay(1000);
+
+#if 0  /* This is the port we really want to use for debugging. */
+       /* reset the CPM FEC port */
+#if (CONFIG_ETHER_INDEX == 2)
+       bcsr->bcsr2 &= ~FETH2_RST;
+       udelay(2);
+       bcsr->bcsr2 |=  FETH2_RST;
+       udelay(1000);
+#elif (CONFIG_ETHER_INDEX == 3)
+       bcsr->bcsr3 &= ~FETH3_RST;
+       udelay(2);
+       bcsr->bcsr3 |=  FETH3_RST;
+       udelay(1000);
+#endif
+#if defined(CONFIG_MII) && defined(CONFIG_ETHER_ON_FCC)
+       miiphy_reset(0x0);      /* reset PHY */
+       miiphy_write(0, PHY_MIPSCR, 0xf028); /* change PHY address to 0x02 */
+       miiphy_write(0x02, PHY_BMCR, PHY_BMCR_AUTON | PHY_BMCR_RST_NEG);
+#endif /* CONFIG_MII */
+#endif
+}
+
+int checkboard (void)
+{
+       sys_info_t sysinfo;
+
+       get_sys_info (&sysinfo);
+
+       printf ("Board: Silicon Tx GPPP 8560 Board\n");
+       printf ("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
+       printf ("\tCCB: %lu MHz\n", sysinfo.freqSystemBus / 1000000);
+       printf ("\tDDR: %lu MHz\n", sysinfo.freqSystemBus / 2000000);
+       if((CFG_LBC_LCRR & 0x0f) == 2 || (CFG_LBC_LCRR & 0x0f) == 4 \
+               || (CFG_LBC_LCRR & 0x0f) == 8) {
+               printf ("\tLBC: %lu MHz\n", sysinfo.freqSystemBus / 1000000 /(CFG_LBC_LCRR & 0x0f));
+       } else {
+               printf("\tLBC: unknown\n");
+       }
+       printf("\tCPM: %lu Mhz\n", sysinfo.freqSystemBus / 1000000);
+       printf("L1 D-cache 32KB, L1 I-cache 32KB enabled.\n");
+
+       return (0);
+}
+
+/* Blinkin' LEDS for Robert.
+*/
+void
+show_activity(int flag)
+{
+       volatile uint *blatch;
+
+       if (next_led_update > get_ticks())
+               return;
+
+       blatch = (volatile uint *)CFG_LBC_LCLDEVS_BASE;
+
+       led_bit >>= 1;
+       if (led_bit == 0)
+               led_bit = 0x08;
+       *blatch = (0xc0 | led_bit);
+       eieio();
+       next_led_update += (get_tbclk() / 4);
+}
+
+long int initdram (int board_type)
+{
+       long dram_size = 0;
+       extern long spd_sdram (void);
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+
+#if defined(CONFIG_DDR_DLL)
+       volatile ccsr_gur_t *gur= &immap->im_gur;
+       uint temp_ddrdll = 0;
+
+       /* Work around to stabilize DDR DLL */
+       temp_ddrdll = gur->ddrdllcr;
+       gur->ddrdllcr = ((temp_ddrdll & 0xff) << 16) | 0x80000000;
+       asm("sync;isync;msync");
+#endif
+
+       dram_size = spd_sdram ();
+
+#if defined(CONFIG_DDR_ECC)
+       {
+               /* Initialize all of memory for ECC, then
+                * enable errors */
+               uint *p = 0;
+               uint i = 0;
+               volatile immap_t *immap = (immap_t *)CFG_IMMR;
+               volatile ccsr_ddr_t *ddr= &immap->im_ddr;
+               dma_init();
+               for (*p = 0; p < (uint *)(8 * 1024); p++) {
+                       if (((unsigned int)p & 0x1f) == 0) { dcbz(p); }
+                       *p = (unsigned int)0xdeadbeef;
+                       if (((unsigned int)p & 0x1c) == 0x1c) { dcbf(p); }
+               }
+
+               /* 8K */
+               dma_xfer((uint *)0x2000,0x2000,(uint *)0);
+               /* 16K */
+               dma_xfer((uint *)0x4000,0x4000,(uint *)0);
+               /* 32K */
+               dma_xfer((uint *)0x8000,0x8000,(uint *)0);
+               /* 64K */
+               dma_xfer((uint *)0x10000,0x10000,(uint *)0);
+               /* 128k */
+               dma_xfer((uint *)0x20000,0x20000,(uint *)0);
+               /* 256k */
+               dma_xfer((uint *)0x40000,0x40000,(uint *)0);
+               /* 512k */
+               dma_xfer((uint *)0x80000,0x80000,(uint *)0);
+               /* 1M */
+               dma_xfer((uint *)0x100000,0x100000,(uint *)0);
+               /* 2M */
+               dma_xfer((uint *)0x200000,0x200000,(uint *)0);
+               /* 4M */
+               dma_xfer((uint *)0x400000,0x400000,(uint *)0);
+
+               for (i = 1; i < dram_size / 0x800000; i++) {
+                       dma_xfer((uint *)(0x800000*i),0x800000,(uint *)0);
+               }
+
+               /* Enable errors for ECC */
+               ddr->err_disable = 0x00000000;
+               asm("sync;isync;msync");
+       }
+#endif
+
+       return dram_size;
+}
+
+
+#if defined(CFG_DRAM_TEST)
+int testdram (void)
+{
+       uint *pstart = (uint *) CFG_MEMTEST_START;
+       uint *pend = (uint *) CFG_MEMTEST_END;
+       uint *p;
+
+       printf("SDRAM test phase 1:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0xaaaaaaaa;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0xaaaaaaaa) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("SDRAM test phase 2:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0x55555555;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0x55555555) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("SDRAM test passed.\n");
+       return 0;
+}
+#endif
+
+#if !defined(CONFIG_SPD_EEPROM)
+/*************************************************************************
+ *  fixed sdram init -- doesn't use serial presence detect.
+ ************************************************************************/
+long int fixed_sdram (void)
+{
+  #ifndef CFG_RAMBOOT
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile ccsr_ddr_t *ddr= &immap->im_ddr;
+
+       ddr->cs0_bnds = CFG_DDR_CS0_BNDS;
+       ddr->cs0_config = CFG_DDR_CS0_CONFIG;
+       ddr->timing_cfg_1 = CFG_DDR_TIMING_1;
+       ddr->timing_cfg_2 = CFG_DDR_TIMING_2;
+       ddr->sdram_mode = CFG_DDR_MODE;
+       ddr->sdram_interval = CFG_DDR_INTERVAL;
+    #if defined (CONFIG_DDR_ECC)
+       ddr->err_disable = 0x0000000D;
+       ddr->err_sbe = 0x00ff0000;
+    #endif
+       asm("sync;isync;msync");
+       udelay(500);
+    #if defined (CONFIG_DDR_ECC)
+       /* Enable ECC checking */
+       ddr->sdram_cfg = (CFG_DDR_CONTROL | 0x20000000);
+    #else
+       ddr->sdram_cfg = CFG_DDR_CONTROL;
+    #endif
+       asm("sync; isync; msync");
+       udelay(500);
+  #endif
+       return ( CFG_SDRAM_SIZE * 1024 * 1024);
+}
+#endif /* !defined(CONFIG_SPD_EEPROM) */
diff --git a/board/stxgp3/u-boot.lds b/board/stxgp3/u-boot.lds
new file mode 100644 (file)
index 0000000..5879946
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * (C) Copyright 2003 Embedded Edge, LLC
+ * Dan Malek, <dan@embeddededge.com>
+ * Copied from ADS85xx.
+ * Updates for Silicon Tx GP3 8560.
+ *
+ * (C) Copyright 2002,2003,Motorola,Inc.
+ * Xianghua Xiao, X.Xiao@motorola.com.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+SECTIONS
+{
+  .resetvec 0xFFFFFFFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .bootpg 0xFFFFF000 :
+  {
+    cpu/mpc85xx/start.o        (.bootpg)
+    board/stxgp3/init.o (.bootpg)
+  } = 0xffff
+
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc85xx/start.o        (.text)
+    board/stxgp3/init.o (.text)
+    cpu/mpc85xx/commproc.o (.text)
+    cpu/mpc85xx/traps.o (.text)
+    cpu/mpc85xx/interrupts.o (.text)
+    cpu/mpc85xx/serial_scc.o (.text)
+    cpu/mpc85xx/ether_fcc.o (.text)
+    cpu/mpc85xx/cpu_init.o (.text)
+    cpu/mpc85xx/cpu.o (.text)
+    cpu/mpc85xx/tsec.o (.text)
+    cpu/mpc85xx/speed.o (.text)
+    cpu/mpc85xx/i2c.o (.text)
+    cpu/mpc85xx/spd_sdram.o (.text)
+    common/dlmalloc.o (.text)
+    lib_generic/crc32.o (.text)
+    lib_ppc/extable.o (.text)
+    lib_generic/zlib.o (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+   }
+    _etext = .;
+    PROVIDE (etext = .);
+    .rodata    :
+   {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x00FF) & 0xFFFFFF00;
+  _erotext = .;
+  PROVIDE (erotext = .);
+  .reloc   :
+  {
+    *(.got)
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+  __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  __u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  __u_boot_cmd_end = .;
+
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(256);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(256);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
index e9ca34019ddd3c65376023b2dbaab7e5fc2885a7..2d0517af2158a81535fe5dbb7bcd6fbdae2abd41 100644 (file)
@@ -49,9 +49,12 @@ static int tsec_send(struct eth_device* dev, volatile void *packet, int length);
 static int tsec_recv(struct eth_device* dev);
 static int tsec_init(struct eth_device* dev, bd_t * bd);
 static void tsec_halt(struct eth_device* dev);
-static void init_registers(volatile tsec_t *regs);
-static void startup_tsec(volatile tsec_t *regs);
-static void init_phy(volatile tsec_t *regs);
+static void init_registers(tsec_t *regs);
+static void startup_tsec(tsec_t *regs);
+static void init_phy(tsec_t *regs);
+uint read_phy_reg(tsec_t *regbase, uint phyid, uint offset);
+
+static int     phy_id = -1;
 
 /* Initialize device structure.  returns 0 on failure, 1 on
  * success */
@@ -59,6 +62,7 @@ int tsec_initialize(bd_t *bis)
 {
        struct eth_device* dev;
        int i;
+       tsec_t *regs = (tsec_t *)(TSEC_BASE_ADDR);
 
        dev = (struct eth_device*) malloc(sizeof *dev);
 
@@ -67,7 +71,7 @@ int tsec_initialize(bd_t *bis)
 
        memset(dev, 0, sizeof *dev);
 
-       sprintf(dev->name, "MOTOROLA ETHERNET");
+       sprintf(dev->name, "MOTO ETHERNET");
        dev->iobase = 0;
        dev->priv   = 0;
        dev->init   = tsec_init;
@@ -81,6 +85,45 @@ int tsec_initialize(bd_t *bis)
 
        eth_register(dev);
 
+       /* Reconfigure the PHY to advertise everything here
+        * so that it works with both gigabit and 10/100 */
+#ifdef CONFIG_PHY_M88E1011
+       /* Assign a Physical address to the TBI */
+       regs->tbipa=TBIPA_VALUE;
+
+       /* reset the management interface */
+       regs->miimcfg=MIIMCFG_RESET;
+
+       regs->miimcfg=MIIMCFG_INIT_VALUE;
+
+       /* Wait until the bus is free */
+       while(regs->miimind & MIIMIND_BUSY);
+
+       /* Locate PHYs.  Skip TBIPA, which we know is 31.
+       */
+       for (i=0; i<31; i++) {
+               if (read_phy_reg(regs, i, 2) == 0x141) {
+                       if (phy_id == -1)
+                               phy_id = i;
+#ifdef TSEC_DEBUG
+                       printf("Found Marvell PHY at 0x%02x\n", i);
+#endif
+               }
+       }
+#ifdef TSEC_DEBUG
+       printf("Using PHY ID 0x%02x\n", phy_id);
+#endif
+       write_phy_reg(regs, phy_id, MIIM_CONTROL, MIIM_CONTROL_RESET);
+
+       RESET_ERRATA(regs, phy_id);
+
+       /* Configure the PHY to advertise gbit and 10/100 */
+       write_phy_reg(regs, phy_id, MIIM_GBIT_CONTROL, MIIM_GBIT_CONTROL_INIT);
+       write_phy_reg(regs, phy_id, MIIM_ANAR, MIIM_ANAR_INIT);
+
+       /* Reset the PHY so the new settings take effect */
+       write_phy_reg(regs, phy_id, MIIM_CONTROL, MIIM_CONTROL_RESET);
+#endif
        return 1;
 }
 
@@ -89,12 +132,12 @@ int tsec_initialize(bd_t *bis)
  * and brings the interface up */
 int tsec_init(struct eth_device* dev, bd_t * bd)
 {
-       volatile tsec_t *regs;
+       tsec_t *regs;
        uint tempval;
        char tmpbuf[MAC_ADDR_LEN];
        int i;
 
-       regs = (volatile tsec_t *)(TSEC_BASE_ADDR);
+       regs = (tsec_t *)(TSEC_BASE_ADDR);
 
        /* Make sure the controller is stopped */
        tsec_halt(dev);
@@ -146,7 +189,7 @@ int tsec_init(struct eth_device* dev, bd_t * bd)
 /* and then passes those bits on to the variable specified in */
 /* value */
 /* Before it does the read, it needs to clear the command field */
-uint read_phy_reg(volatile tsec_t *regbase, uint phyid, uint offset)
+uint read_phy_reg(tsec_t *regbase, uint phyid, uint offset)
 {
        uint value;
 
@@ -173,7 +216,7 @@ uint read_phy_reg(volatile tsec_t *regbase, uint phyid, uint offset)
 }
 
 /* Setup the PHY */
-static void init_phy(volatile tsec_t *regs)
+static void init_phy(tsec_t *regs)
 {
        uint testval;
        unsigned int timeout = TSEC_TIMEOUT;
@@ -198,17 +241,17 @@ static void init_phy(volatile tsec_t *regs)
 #endif
 
        /* Set the PHY to gigabit, full duplex, Auto-negotiate */
-       write_phy_reg(regs, 0, MIIM_CONTROL, MIIM_CONTROL_INIT);
+       write_phy_reg(regs, phy_id, MIIM_CONTROL, MIIM_CONTROL_INIT);
 
-       /* Wait until TBI_STATUS indicates AN is done */
+       /* Wait until STATUS indicates Auto-Negotiation is done */
        DBGPRINT("Waiting for Auto-negotiation to complete\n");
-       testval=read_phy_reg(regs, 0, MIIM_TBI_STATUS);
+       testval=read_phy_reg(regs, phy_id, MIIM_STATUS);
 
-       while((!(testval & MIIM_TBI_STATUS_AN_DONE))&& timeout--) {
-               testval=read_phy_reg(regs, 0, MIIM_TBI_STATUS);
+       while((!(testval & MIIM_STATUS_AN_DONE))&& timeout--) {
+               testval=read_phy_reg(regs, phy_id, MIIM_STATUS);
        }
 
-       if(testval & MIIM_TBI_STATUS_AN_DONE)
+       if(testval & MIIM_STATUS_AN_DONE)
                DBGPRINT("Auto-negotiation done\n");
        else
                DBGPRINT("Auto-negotiation timed-out.\n");
@@ -216,7 +259,7 @@ static void init_phy(volatile tsec_t *regs)
 #ifdef CONFIG_PHY_CIS8201
        /* Find out what duplexity (duplicity?) we have */
        /* Read it twice to make sure */
-       testval=read_phy_reg(regs, 0, MIIM_AUX_CONSTAT);
+       testval=read_phy_reg(regs, phy_id, MIIM_AUX_CONSTAT);
 
        if(testval & MIIM_AUXCONSTAT_DUPLEX) {
                DBGPRINT("Enet starting in full duplex\n");
@@ -246,17 +289,17 @@ static void init_phy(volatile tsec_t *regs)
 
 #ifdef CONFIG_PHY_M88E1011
        /* Read the PHY to see what speed and duplex we are */
-       testval=read_phy_reg(regs, 0, MIIM_PHY_STATUS);
+       testval=read_phy_reg(regs, phy_id, MIIM_PHY_STATUS);
 
        timeout = TSEC_TIMEOUT;
        while((!(testval & MIIM_PHYSTAT_SPDDONE)) && timeout--) {
-               testval = read_phy_reg(regs,0,MIIM_PHY_STATUS);
+               testval = read_phy_reg(regs,phy_id,MIIM_PHY_STATUS);
        }
 
        if(!(testval & MIIM_PHYSTAT_SPDDONE))
                DBGPRINT("Enet: Speed not resolved\n");
 
-       testval=read_phy_reg(regs, 0, MIIM_PHY_STATUS);
+       testval=read_phy_reg(regs, phy_id, MIIM_PHY_STATUS);
        if(testval & MIIM_PHYSTAT_DUPLEX) {
                DBGPRINT("Enet starting in Full Duplex\n");
                regs->maccfg2 |= MACCFG2_FULL_DUPLEX;
@@ -280,7 +323,7 @@ static void init_phy(volatile tsec_t *regs)
 }
 
 
-static void init_registers(volatile tsec_t *regs)
+static void init_registers(tsec_t *regs)
 {
        /* Clear IEVENT */
        regs->ievent = IEVENT_INIT_CLEAR;
@@ -322,7 +365,7 @@ static void init_registers(volatile tsec_t *regs)
 
 }
 
-static void startup_tsec(volatile tsec_t *regs)
+static void startup_tsec(tsec_t *regs)
 {
        int i;
 
@@ -363,7 +406,7 @@ static int tsec_send(struct eth_device* dev, volatile void *packet, int length)
 {
        int i;
        int result = 0;
-       volatile tsec_t * regs = (volatile tsec_t *)(TSEC_BASE_ADDR);
+       tsec_t * regs = (tsec_t *)(TSEC_BASE_ADDR);
 
        /* Find an empty buffer descriptor */
        for(i=0; rtx.txbd[txIdx].status & TXBD_READY; i++) {
@@ -397,7 +440,7 @@ static int tsec_send(struct eth_device* dev, volatile void *packet, int length)
 static int tsec_recv(struct eth_device* dev)
 {
        int length;
-       volatile tsec_t *regs = (volatile tsec_t *)(TSEC_BASE_ADDR);
+       tsec_t *regs = (tsec_t *)(TSEC_BASE_ADDR);
 
        while(!(rtx.rxbd[rxIdx].status & RXBD_EMPTY)) {
 
@@ -428,7 +471,7 @@ static int tsec_recv(struct eth_device* dev)
 
 static void tsec_halt(struct eth_device* dev)
 {
-       volatile tsec_t *regs = (volatile tsec_t *)(TSEC_BASE_ADDR);
+       tsec_t *regs = (tsec_t *)(TSEC_BASE_ADDR);
 
        regs->dmactrl &= ~(DMACTRL_GRS | DMACTRL_GTS);
        regs->dmactrl |= (DMACTRL_GRS | DMACTRL_GTS);
@@ -438,4 +481,44 @@ static void tsec_halt(struct eth_device* dev)
        regs->maccfg1 &= ~(MACCFG1_TX_EN | MACCFG1_RX_EN);
 
 }
+
+#ifndef CONFIG_BITBANGMII
+/*
+ * Read a MII PHY register.
+ *
+ * Returns:
+ *   0 on success
+ */
+int miiphy_read(unsigned char  addr,
+               unsigned char  reg,
+               unsigned short *value)
+{
+       tsec_t *regs;
+       unsigned short rv;
+
+       regs = (tsec_t *)(TSEC_BASE_ADDR);
+       rv = (unsigned short)read_phy_reg(regs, addr, reg);
+       *value = rv;
+
+       return 0;
+}
+
+/*
+ * Write a MII PHY register.
+ *
+ * Returns:
+ *   0 on success
+ */
+int miiphy_write(unsigned char  addr,
+                unsigned char  reg,
+                unsigned short value)
+{
+       tsec_t *regs;
+
+       regs = (tsec_t *)(TSEC_BASE_ADDR);
+       write_phy_reg(regs, addr, reg, value);
+
+       return 0;
+}
+#endif /* CONFIG_BITBANGMII */
 #endif /* CONFIG_TSEC_ENET */
index cfcfd393b5661673bcf08372419fcd1a0a036f7d..db4169ca4368293fb22bb48fde85d9d46e37d616 100644 (file)
@@ -19,6 +19,9 @@
 #include <net.h>
 #include <mpc85xx.h>
 
+/* TSEC1 is offset 0x24000, TSEC2 is offset 0x25000
+#define TSEC_BASE_ADDR (CFG_IMMR + 0x25000)
+*/
 #define TSEC_BASE_ADDR (CFG_IMMR + 0x24000)
 #define TSEC_MEM_SIZE  0x01000
 
 #define MIIMIND_BUSY            0x00000001
 #define MIIMIND_NOTVALID        0x00000004
 
-#define MIIM_TBICON            0x11
-#define MIIM_TBICON_GMII       0x00000010
-#define MIIM_TBICON_AN         0x00000100
-
 #define MIIM_CONTROL            0x00
 #define MIIM_CONTROL_INIT       0x00001140
 #define MIIM_ANEN               0x00001000
+#define MIIM_CONTROL_RESET     0x00009140
+
+#define MIIM_STATUS            0x1
+#define MIIM_STATUS_AN_DONE    0x00000020
 
-#define MIIM_TBI_STATUS                0x1
-#define MIIM_TBI_STATUS_AN_DONE 0x00000020
+#define MIIM_GBIT_CONTROL      0x9
+#define MIIM_GBIT_CONTROL_INIT 0xe00
 
 #define MIIM_TBI_ANEX          0x6
 #define MIIM_TBI_ANEX_NP       0x00000004
 #endif
 
 #ifdef CONFIG_PHY_M88E1011
-#define MIIM_ANAR              0x04
-#define MIIM_ANAR_ADVERTISEMENT        0x01e1
+#define MIIM_ANAR              0x4
+#define MIIM_ANAR_INIT         0x1e1
 
 #define MIIM_GBIT_CON          0x09
-#define MIIM_GBIT_CON_ADVERT   0x1e00
+#define MIIM_GBIT_CON_ADVERT   0x0e00
 
 #define MIIM_PHY_STATUS         0x11
 #define MIIM_PHYSTAT_SPEED      0xc000
 } while(0)
 
 
+/* This works around errata in reseting the PHY */
+#define RESET_ERRATA(regs, ID) do { \
+       write_phy_reg(regs, (ID), 0x1d, 0x1f); \
+       write_phy_reg(regs, (ID), 0x1e, 0x200c); \
+       write_phy_reg(regs, (ID), 0x1d, 0x5); \
+       write_phy_reg(regs, (ID), 0x1e, 0x0); \
+       write_phy_reg(regs, (ID), 0x1e, 0x100); \
+} while(0)
+
 #define IEVENT_INIT_CLEAR      0xffffffff
 #define IEVENT_BABR            0x80000000
 #define IEVENT_RXC             0x40000000
index 1272e99428d9ad805dbbc6c729546ed9d08183ef..1d50ce02cd05b6742253a06056e8451106b3288f 100644 (file)
@@ -147,7 +147,7 @@ typedef struct pci_config {
        uint    pci_oftpr;
        char    res8[4];
        uint    pci_ophpr;
-       char    res8_2[4];      
+       char    res8_2[4];
        uint    pci_optpr;
        char    res9[8];
        uint    pci_mucr;
index 587798ce75410b17f5f7bf8ef7508b732373ea7c..0fc54e532fabae9ab229451669536256c59ab5bd 100644 (file)
  */
 #define CFG_SDRAM_BASE         0x00000000
 #define CFG_MAX_RAM_SIZE       0x10000000
+#define CONFIG_VERY_BIG_RAM
 
 #define CFG_RESET_ADDRESS      0xFFF00100
 
diff --git a/include/configs/stxgp3.h b/include/configs/stxgp3.h
new file mode 100644 (file)
index 0000000..8460944
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * (C) Copyright 2003 Embedded Edge, LLC
+ * Dan Malek <dan@embeddededge.com>
+ * Copied from ADS85xx.
+ * Updates for Silicon Tx GP3 8560 board.
+ *
+ * (C) Copyright 2002,2003 Motorola,Inc.
+ * Xianghua Xiao <X.Xiao@motorola.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* mpc8560ads board configuration file */
+/* please refer to doc/README.mpc85xx for more info */
+/* make sure you change the MAC address and other network params first,
+ * search for CONFIG_ETHADDR,CONFIG_SERVERIP,etc in this file
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* High Level Configuration Options */
+#define CONFIG_BOOKE           1       /* BOOKE                */
+#define CONFIG_E500            1       /* BOOKE e500 family    */
+#define CONFIG_MPC85xx         1       /* MPC8540/MPC8560      */
+#define CONFIG_MPC85xx_REV1    1       /* MPC85xx Rev 1.0 chip */
+#define CONFIG_MPC8560         1       /* MPC8560 specific     */
+#define CONFIG_STXGP3          1       /* Silicon Tx GPPP board specific*/
+
+#undef  CONFIG_PCI                     /* pci ethernet support */
+#define CONFIG_TSEC_ENET               /* tsec ethernet support*/
+#undef  CONFIG_ETHER_ON_FCC             /* cpm FCC ethernet support */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SPD_EEPROM               /* Use SPD EEPROM for DDR setup */
+#undef  CONFIG_DDR_ECC                 /* only for ECC DDR module */
+
+#if defined(CONFIG_MPC85xx_REV1)
+#define CONFIG_DDR_DLL                  /* possible DLL fix needed */
+#endif
+
+/* Using Localbus SDRAM to emulate flash before we can program the flash,
+ * normally you need a flash-boot image(u-boot.bin), if so undef this.
+ */
+#undef CONFIG_RAM_AS_FLASH
+
+#define CONFIG_SYS_CLK_FREQ     33333333 /* most pci cards are 33Mhz */
+
+/* Blinkin' LEDs for Robert :-)
+*/
+#define CONFIG_SHOW_ACTIVITY 1
+
+#if !defined(CONFIG_SPD_EEPROM)                /* manually set up DDR parameters */
+#define CONFIG_DDR_SETTING
+#endif
+
+/* below can be toggled for performance analysis. otherwise use default */
+#define CONFIG_L2_CACHE                     /* toggle L2 cache         */
+#undef  CONFIG_BTB                          /* toggle branch predition */
+#undef  CONFIG_ADDR_STREAMING               /* toggle addr streaming   */
+
+#define CONFIG_BOARD_PRE_INIT   1           /* Call board_pre_init      */
+
+#undef  CFG_DRAM_TEST                       /* memory test, takes time  */
+#define CFG_MEMTEST_START       0x00200000  /* memtest region */
+#define CFG_MEMTEST_END         0x00400000
+
+#if (defined(CONFIG_PCI) && defined(CONFIG_TSEC_ENET) || \
+     defined(CONFIG_PCI) && defined(CONFIG_ETHER_ON_FCC) || \
+     defined(CONFIG_TSEC_ENET) && defined(CONFIG_ETHER_ON_FCC))
+#error "You can only use ONE of PCI Ethernet Card or TSEC Ethernet or CPM FCC."
+#endif
+
+/*
+ * Base addresses -- Note these are effective addresses where the
+ * actual resources get mapped (not physical addresses)
+ */
+#define CFG_DDR_SDRAM_BASE     0x00000000      /* DDR is system memory  */
+#define CFG_SDRAM_BASE         CFG_DDR_SDRAM_BASE
+
+/* GPPP supports up to 2G of DRAM.  Allocate up to 1G until we get
+ * a chance to try it out.  Actual size is always read from sdram eeprom.
+ */
+#define CFG_SDRAM_SIZE         1024            /* DDR is 1GB   */
+
+/* Localbus SDRAM is an option, not all boards have it.
+*/
+#if defined(CONFIG_RAM_AS_FLASH)
+#define CFG_LBC_SDRAM_BASE      0xfc000000      /* Localbus SDRAM */
+#else
+#define CFG_LBC_SDRAM_BASE      0xf8000000      /* Localbus SDRAM */
+#endif
+#define CFG_LBC_SDRAM_SIZE     64              /* LBC SDRAM is 64MB    */
+
+#if defined(CONFIG_RAM_AS_FLASH)
+#define CFG_FLASH_BASE        0xf8000000      /* start of FLASH  16M  */
+#define CFG_BR0_PRELIM        0xf8001801      /* port size 32bit */
+#else /* Boot from real Flash */
+#define CFG_FLASH_BASE        0xff000000      /* start of FLASH 16M    */
+#define CFG_BR0_PRELIM        0xff001801      /* port size 32bit      */
+#endif
+
+#define CFG_OR0_PRELIM          0xff000ff7      /* 16 MB Flash           */
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks      */
+#define CFG_MAX_FLASH_SECT     136             /* sectors per device   */
+#undef CFG_FLASH_CHECKSUM
+#define CFG_FLASH_ERASE_TOUT   60000   /* Timeout for Flash Erase (in ms)      */
+#define CFG_FLASH_WRITE_TOUT   500     /* Timeout for Flash Write (in ms)      */
+
+/* The configuration latch is Chip Select 1.
+ * It's an 8-bit latch in the upper 8 bits of the word.
+ */
+#define CFG_BR1_PRELIM         0xfc001801      /* 32-bit port */
+#define CFG_OR1_PRELIM         0xffff0ff7      /* 64K is enough */
+#define CFG_LBC_LCLDEVS_BASE   0xfc000000      /* Base of localbus devices */
+
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor     */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#else
+#undef  CFG_RAMBOOT
+#endif
+
+#ifdef CFG_RAMBOOT
+#define CFG_CCSRBAR_DEFAULT    0x40000000      /* CCSRBAR by BDI cfg   */
+#else
+#define CFG_CCSRBAR_DEFAULT    0xff700000      /* CCSRBAR Default      */
+#endif
+#define CFG_CCSRBAR             0xfdf00000      /* relocated CCSRBAR    */
+#define CFG_IMMR               CFG_CCSRBAR     /* PQII uses CFG_IMMR   */
+
+
+#define SPD_EEPROM_ADDRESS     0x54            /*  DDR DIMM */
+
+#if defined(CONFIG_DDR_SETTING)
+#define        CFG_DDR_CS0_BNDS        0x00000007      /* 0-128MB */
+#define CFG_DDR_CS0_CONFIG     0x80000002
+#define CFG_DDR_TIMING_1       0x37344321
+#define CFG_DDR_TIMING_2       0x00000800      /* P9-45,may need tuning*/
+#define CFG_DDR_CONTROL                0xc2000000      /* unbuffered,no DYN_PWR*/
+#define CFG_DDR_MODE           0x00000062      /* DLL,normal,seq,4/2.5 */
+#define CFG_DDR_INTERVAL       0x05200100      /* autocharge,no open page*/
+#endif
+
+#undef CONFIG_CLOCKS_IN_MHZ
+
+/* local bus definitions */
+#define CFG_BR2_PRELIM         0xf8001861      /* 64MB localbus SDRAM  */
+#define CFG_OR2_PRELIM         0xfc006901
+#define CFG_LBC_LCRR           0x00030004      /* local bus freq       */
+#define CFG_LBC_LBCR           0x00000000
+#define CFG_LBC_LSRT           0x20000000
+#define CFG_LBC_MRTPR          0x20000000
+#define CFG_LBC_LSDMR_1                0x2861b723
+#define CFG_LBC_LSDMR_2                0x0861b723
+#define CFG_LBC_LSDMR_3                0x0861b723
+#define CFG_LBC_LSDMR_4                0x1861b723
+#define CFG_LBC_LSDMR_5                0x4061b723
+
+#define CONFIG_L1_INIT_RAM
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR       0x60000000      /* Initial RAM address  */
+#define CFG_INIT_RAM_END       0x4000          /* End of used area in RAM */
+
+#define CFG_GBL_DATA_SIZE      128             /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
+
+/* Serial Port */
+#define CONFIG_CONS_ON_SCC                     /* define if console on SCC */
+#undef  CONFIG_CONS_NONE                       /* define if console on something else */
+#define CONFIG_CONS_INDEX       2              /* which serial channel for console */
+
+#define CONFIG_BAUDRATE                38400
+
+#define CFG_BAUDRATE_TABLE  \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 115200}
+
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#ifdef  CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+#endif
+
+/* I2C */
+#define  CONFIG_HARD_I2C               /* I2C with hardware support*/
+#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+#if 0
+#define CFG_I2C_NOPROBES        {0x00}  /* Don't probe these addrs */
+#else
+/* I did the 'if 0' so we could keep the syntax above if ever needed. */
+#undef CFG_I2C_NOPROBES
+#endif
+
+#define CFG_PCI_MEM_BASE       0xe0000000
+#define CFG_PCI_MEM_PHYS       0xe0000000
+#define CFG_PCI_MEM_SIZE       0x10000000
+
+#if defined(CONFIG_PCI)                /* PCI Ethernet card */
+#define CONFIG_NET_MULTI
+#define CONFIG_EEPRO100
+#undef CONFIG_TULIP
+#define CONFIG_PCI_PNP                 /* do pci plug-and-play */
+  #if !defined(CONFIG_PCI_PNP)
+  #define PCI_ENET0_IOADDR     0xe0000000
+  #define PCI_ENET0_MEMADDR     0xe0000000
+  #define PCI_IDSEL_NUMBER      0x0c   /* slot0->3(IDSEL)=12->15 */
+  #endif
+#define CONFIG_PCI_SCAN_SHOW    1       /* show pci devices on startup  */
+#define CFG_PCI_SUBSYS_VENDORID 0x1057  /* Motorola */
+#if defined(CONFIG_MPC85xx_REV1)       /* Errata PCI 7 */
+  #define CFG_PCI_SUBSYS_DEVICEID 0x0003
+#else
+  #define CFG_PCI_SUBSYS_DEVICEID 0x0009
+#endif
+#elif defined(CONFIG_TSEC_ENET)        /* TSEC Ethernet port */
+#define CONFIG_NET_MULTI       1
+#define CONFIG_PHY_M88E1011      1       /* GigaBit Ether PHY        */
+#define CONFIG_MII             1       /* MII PHY management           */
+#define CONFIG_PHY_ADDR                8       /* PHY address                  */
+#elif defined(CONFIG_ETHER_ON_FCC)     /* CPM FCC Ethernet */
+#define CONFIG_ETHER_ON_FCC2             /* define if ether on FCC   */
+#undef  CONFIG_ETHER_NONE               /* define if ether on something else */
+#define CONFIG_ETHER_INDEX      2       /* which channel for ether  */
+  #if (CONFIG_ETHER_INDEX == 2)
+  /*
+   * - Rx-CLK is CLK13
+   * - Tx-CLK is CLK14
+   * - Select bus for bd/buffers
+   * - Full duplex
+   */
+  #define CFG_CMXFCR_MASK       (CMXFCR_FC2 | CMXFCR_RF2CS_MSK | CMXFCR_TF2CS_MSK)
+  #define CFG_CMXFCR_VALUE      (CMXFCR_RF2CS_CLK13 | CMXFCR_TF2CS_CLK14)
+  #define CFG_CPMFCR_RAMTYPE    0
+#if 0
+  #define CFG_FCC_PSMR          (FCC_PSMR_FDE)
+#else
+  #define CFG_FCC_PSMR          0
+#endif
+  #define FETH2_RST            0x01
+  #elif (CONFIG_ETHER_INDEX == 3)
+  /* need more definitions here for FE3 */
+  #define FETH3_RST            0x80
+  #endif                               /* CONFIG_ETHER_INDEX */
+#define CONFIG_MII                     /* MII PHY management */
+#undef CONFIG_BITBANGMII               /* bit-bang MII PHY management  */
+/*
+ * GPIO pins used for bit-banged MII communications
+ */
+#define MDIO_PORT      2               /* Port C */
+#define MDIO_ACTIVE    (iop->pdir |=  0x00400000)
+#define MDIO_TRISTATE  (iop->pdir &= ~0x00400000)
+#define MDIO_READ      ((iop->pdat &  0x00400000) != 0)
+
+#define MDIO(bit)      if(bit) iop->pdat |=  0x00400000; \
+                       else    iop->pdat &= ~0x00400000
+
+#define MDC(bit)       if(bit) iop->pdat |=  0x00200000; \
+                       else    iop->pdat &= ~0x00200000
+
+#define MIIDELAY       udelay(1)
+#endif
+
+/* Environment */
+/* We use the top boot sector flash, so we have some 16K sectors for env
+ * But....functions don't seem smart enough yet.
+ */
+#ifndef CFG_RAMBOOT
+  #if defined(CONFIG_RAM_AS_FLASH)
+  #define CFG_ENV_IS_NOWHERE
+  #define CFG_ENV_ADDR         (CFG_FLASH_BASE + 0x100000)
+  #define CFG_ENV_SIZE         0x2000
+  #else
+  #define CFG_ENV_IS_IN_FLASH  1
+  #define CFG_ENV_ADDR         (CFG_MONITOR_BASE + 0x60000)
+  #define CFG_ENV_SECT_SIZE    0x4000  /* 16K (one top sector) for env */
+  #endif
+  #define CFG_ENV_SIZE         0x2000
+#else
+#define CFG_NO_FLASH           1       /* Flash is not usable now      */
+#define CFG_ENV_IS_NOWHERE     1       /* Store ENV in memory only     */
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE - 0x1000)
+#define CFG_ENV_SIZE           0x2000
+#endif
+
+#define CONFIG_BOOTARGS "root=/dev/nfs rw ip=any console=ttyS1,38400"
+#define CONFIG_BOOTCOMMAND     "bootm 0xff800000 0xff900000"
+#define CONFIG_BOOTDELAY       3       /* -1 disable autoboot */
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
+
+#if defined(CFG_RAMBOOT) || defined(CONFIG_RAM_AS_FLASH)
+  #if defined(CONFIG_PCI)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_PCI | \
+                               CFG_CMD_PING | CFG_CMD_I2C) & \
+                                ~(CFG_CMD_ENV | \
+                                 CFG_CMD_LOADS ))
+  #elif defined(CONFIG_TSEC_ENET)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_PING | \
+                               CFG_CMD_MII | CFG_CMD_I2C ) & \
+                               ~(CFG_CMD_ENV))
+  #elif defined(CONFIG_ETHER_ON_FCC)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_MII | \
+                               CFG_CMD_PING | CFG_CMD_I2C) & \
+                               ~(CFG_CMD_ENV))
+  #endif
+#else
+  #if defined(CONFIG_PCI)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_PCI | \
+                               CFG_CMD_PING | CFG_CMD_I2C)
+  #elif defined(CONFIG_TSEC_ENET)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_PING | \
+                               CFG_CMD_MII | CFG_CMD_I2C)
+  #elif defined(CONFIG_ETHER_ON_FCC)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_MII | \
+                               CFG_CMD_PING | CFG_CMD_I2C)
+  #endif
+#endif
+#include <cmd_confdefs.h>
+
+#undef CONFIG_WATCHDOG                 /* watchdog disabled            */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory         */
+#define CFG_PROMPT     "GPPP=> "       /* Monitor Command Prompt       */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CBSIZE     1024            /* Console I/O Buffer Size      */
+#else
+#define CFG_CBSIZE     256             /* Console I/O Buffer Size      */
+#endif
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args   */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
+#define CFG_LOAD_ADDR  0x1000000       /* default load address */
+#define CFG_HZ         1000            /* decrementer freq: 1 ms ticks */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CFG_BOOTMAPSZ          (8 << 20) /* Initial Memory map for Linux */
+
+/* Cache Configuration */
+#define CFG_DCACHE_SIZE                32768
+#define CFG_CACHELINE_SIZE     32
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /* log base 2 of the above value */
+#endif
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01            /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02            /* Software reboot              */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   230400  /* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  2       /* which serial port to use */
+#endif
+
+/*Note: change below for your network setting!!! */
+#if defined(CONFIG_TSEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
+#define CONFIG_ETHADDR  00:01:af:07:9b:8a
+#define CONFIG_ETH1ADDR  00:01:af:07:9b:8b
+#define CONFIG_ETH2ADDR  00:01:af:07:9b:8c
+#endif
+
+#define CONFIG_SERVERIP        192.168.85.1
+#define CONFIG_IPADDR                  192.168.85.60
+#define CONFIG_GATEWAYIP       192.168.85.1
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_HOSTNAME        STX_GP3
+#define CONFIG_ROOTPATH        /gppproot
+#define CONFIG_BOOTFILE        uImage
+
+#endif /* __CONFIG_H */
index 3e3fb3762ca94f2b83f506c623b932b2c4865f4a..b720e82039ab1e633d8c21bce974f3e855929e85 100644 (file)
@@ -26,6 +26,7 @@
 #include <command.h>
 #include <malloc.h>
 #include <version.h>
+#include <watchdog.h>
 
 const char version_string[] =
        U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")";
@@ -69,6 +70,24 @@ init_fnc_t *init_sequence[] = {
        NULL,
 };
 
+void board_init(void)
+{
+       init_fnc_t **init_fnc_ptr;
+
+       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
+               WATCHDOG_RESET ();
+               if ((*init_fnc_ptr) () != 0) {
+                       hang ();
+               }
+       }
+
+       /* main_loop */
+       for (;;) {
+               WATCHDOG_RESET ();
+               main_loop ();
+       }
+}
+
 void hang (void)
 {
        puts ("### ERROR ### Please RESET the board ###\n");
index 998c25cc9ff30d89c27fe12a3833bf4458398ea2..0dbf163a20b36264dc69d5e112df362ddc126671 100644 (file)
@@ -510,27 +510,6 @@ void board_init_f (ulong bootflag)
 #if defined(CONFIG_405GP) || defined(CONFIG_405EP)
        bd->bi_pci_busfreq = get_PCI_freq ();
        bd->bi_opbfreq = get_OPB_freq ();
-
-#if defined(CONFIG_I2CFAST)
-       /*
-        * set bi_iic_fast for linux taking environment variable
-        * "i2cfast" into account
-        */
-       {
-               char *s = getenv ("i2cfast");
-               if (s && ((*s == 'y') || (*s == 'Y'))) {
-                       bd->bi_iic_fast[0] = 1;
-                       bd->bi_iic_fast[1] = 1;
-               } else {
-                       bd->bi_iic_fast[0] = 0;
-                       bd->bi_iic_fast[1] = 0;
-               }
-       }
-#else
-       bd->bi_iic_fast[0] = 0;
-       bd->bi_iic_fast[1] = 0;
-#endif
-
 #elif defined(CONFIG_XILINX_ML300)
        bd->bi_pci_busfreq = get_PCI_freq ();
 #endif
@@ -743,6 +722,31 @@ void board_init_r (gd_t *id, ulong dest_addr)
         * where had to use getenv_r(), which can be pretty slow when
         * the environment is in EEPROM.
         */
+
+#if defined(CFG_EXTBDINFO)
+#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
+#if defined(CONFIG_I2CFAST)
+       /*
+        * set bi_iic_fast for linux taking environment variable
+        * "i2cfast" into account
+        */
+       {
+               char *s = getenv ("i2cfast");
+               if (s && ((*s == 'y') || (*s == 'Y'))) {
+                       bd->bi_iic_fast[0] = 1;
+                       bd->bi_iic_fast[1] = 1;
+               } else {
+                       bd->bi_iic_fast[0] = 0;
+                       bd->bi_iic_fast[1] = 0;
+               }
+       }
+#else
+       bd->bi_iic_fast[0] = 0;
+       bd->bi_iic_fast[1] = 0;
+#endif /* CONFIG_I2CFAST */
+#endif /* CONFIG_405GP, CONFIG_405EP */
+#endif /* CFG_EXTBDINFO */
+
        s = getenv ("ethaddr");
 #if defined (CONFIG_MBX) || defined (CONFIG_RPXCLASSIC) || defined(CONFIG_IAD210)
        if (s == NULL)
@@ -867,6 +871,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
     defined(CONFIG_MPC8560ADS) || \
     defined(CONFIG_PCU_E)      || \
     defined(CONFIG_RPXSUPER)   || \
+    defined(CONFIG_STXGP3)     || \
     defined(CONFIG_SPD823TS)   )
 
        WATCHDOG_RESET ();