Merge with /home/wd/git/u-boot/custodian/u-boot-mpc86xx
authorWolfgang Denk <wd@denx.de>
Wed, 6 Jun 2007 14:21:11 +0000 (16:21 +0200)
committerWolfgang Denk <wd@denx.de>
Wed, 6 Jun 2007 14:21:11 +0000 (16:21 +0200)
136 files changed:
CHANGELOG
MAKEALL
Makefile
README
board/amcc/acadia/Makefile
board/amcc/acadia/acadia.c
board/amcc/acadia/cmd_acadia.c [new file with mode: 0644]
board/amcc/acadia/config.mk
board/amcc/acadia/memory.c
board/amcc/acadia/u-boot-nand.lds [new file with mode: 0644]
board/amcc/bamboo/Makefile
board/amcc/bamboo/bamboo.c
board/amcc/bamboo/config.mk
board/amcc/bamboo/flash.c
board/amcc/bamboo/init.S
board/amcc/bamboo/u-boot-nand.lds [new file with mode: 0644]
board/amcc/sequoia/sdram.c
board/amcc/sequoia/sequoia.c
board/lpc2292sodimm/Makefile
board/lpc2292sodimm/flash.c
board/motionpro/motionpro.c
board/mpc8313erdb/Makefile [new file with mode: 0644]
board/mpc8313erdb/config.mk [new file with mode: 0644]
board/mpc8313erdb/mpc8313erdb.c [new file with mode: 0644]
board/mpc8313erdb/sdram.c [new file with mode: 0644]
board/mpc8313erdb/u-boot.lds [new file with mode: 0644]
board/mpc8349itx/mpc8349itx.c
board/siemens/SMN42/Makefile [new file with mode: 0644]
board/siemens/SMN42/config.mk [new file with mode: 0644]
board/siemens/SMN42/flash.c [new file with mode: 0755]
board/siemens/SMN42/lowlevel_init.S [new file with mode: 0644]
board/siemens/SMN42/smn42.c [new file with mode: 0644]
board/siemens/SMN42/u-boot.lds [moved from cpu/microblaze/disable_int.S with 54% similarity]
board/stxssa/config.mk
board/xilinx/ml401/config.mk
board/xilinx/ml401/ml401.c
board/xilinx/ml401/xparameters.h [changed mode: 0644->0755]
common/Makefile
common/cmd_mfsl.c [new file with mode: 0644]
common/main.c
common/soft_i2c.c
cpu/arm720t/lpc2292/Makefile [new file with mode: 0644]
cpu/arm720t/lpc2292/flash.c [new file with mode: 0644]
cpu/arm720t/lpc2292/iap_entry.S [moved from board/lpc2292sodimm/iap_entry.S with 100% similarity]
cpu/arm720t/lpc2292/mmc.c [moved from board/lpc2292sodimm/mmc.c with 97% similarity]
cpu/arm720t/lpc2292/mmc_hw.c [moved from board/lpc2292sodimm/mmc_hw.c with 99% similarity]
cpu/arm720t/lpc2292/mmc_hw.h [moved from board/lpc2292sodimm/mmc_hw.h with 100% similarity]
cpu/arm720t/lpc2292/spi.c [moved from board/lpc2292sodimm/spi.c with 97% similarity]
cpu/microblaze/Makefile
cpu/microblaze/cache.c [changed mode: 0644->0755]
cpu/microblaze/dcache.S [deleted file]
cpu/microblaze/exception.c
cpu/microblaze/icache.S [deleted file]
cpu/microblaze/interrupts.c [changed mode: 0644->0755]
cpu/microblaze/irq.S [changed mode: 0644->0755]
cpu/microblaze/start.S
cpu/microblaze/timer.c
cpu/mpc5xxx/cpu_init.c
cpu/mpc5xxx/fec.c
cpu/mpc83xx/Makefile
cpu/mpc83xx/cpu.c
cpu/mpc83xx/pci.c [new file with mode: 0644]
cpu/mpc83xx/spd_sdram.c
cpu/mpc83xx/speed.c
cpu/ppc4xx/44x_spd_ddr.c
cpu/ppc4xx/44x_spd_ddr2.c
cpu/ppc4xx/cpu.c
cpu/ppc4xx/ndfc.c
cpu/ppc4xx/start.S
disk/part.c [changed mode: 0644->0755]
doc/README.mpc8313erdb [new file with mode: 0644]
drivers/Makefile
drivers/enc28j60.c [moved from board/lpc2292sodimm/eth.c with 80% similarity, mode: 0755]
drivers/nand/nand_ecc.c
drivers/systemace.c
fs/fat/fat.c [changed mode: 0644->0755]
fs/jffs2/compr_zlib.c
include/asm-arm/arch-arm720t/hardware.h
include/asm-arm/arch-lpc2292/hardware.h [moved from cpu/microblaze/enable_int.S with 63% similarity]
include/asm-arm/arch-lpc2292/lpc2292_registers.h [moved from include/asm-arm/arch-arm720t/lpc2292_registers.h with 100% similarity]
include/asm-arm/arch-lpc2292/mmc.h [moved from include/asm-arm/arch-arm720t/mmc.h with 100% similarity]
include/asm-arm/arch-lpc2292/spi.h [moved from board/lpc2292sodimm/spi.h with 100% similarity]
include/asm-microblaze/asm.h [new file with mode: 0755]
include/asm-microblaze/microblaze_intc.h
include/asm-ppc/e300.h
include/asm-ppc/global_data.h
include/asm-ppc/immap_83xx.h
include/asm-ppc/io.h
include/cmd_confdefs.h
include/common.h
include/configs/BC3450.h
include/configs/IceCube.h
include/configs/MPC8313ERDB.h [new file with mode: 0644]
include/configs/MPC8349ITX.h
include/configs/PM520.h
include/configs/SMN42.h [new file with mode: 0755]
include/configs/TB5200.h
include/configs/TOP5200.h
include/configs/TQM5200.h
include/configs/Total5200.h
include/configs/acadia.h
include/configs/aev.h
include/configs/bamboo.h
include/configs/canmb.h
include/configs/cpci5200.h
include/configs/hmi1001.h
include/configs/inka4x0.h
include/configs/lpc2292sodimm.h [changed mode: 0644->0755]
include/configs/luan.h
include/configs/mcc200.h
include/configs/ml401.h
include/configs/motionpro.h
include/configs/o2dnt.h
include/configs/pf5200.h
include/configs/sequoia.h
include/configs/smmaco4.h
include/configs/spieval.h
include/configs/stxssa.h
include/configs/uc101.h
include/configs/v38b.h
include/configs/xupv2p.h
include/linux/stat.h
include/mpc83xx.h
include/ppc405.h
include/ppc440.h
include/status_led.h
lib_ppc/board.c
nand_spl/board/amcc/acadia/Makefile [new file with mode: 0644]
nand_spl/board/amcc/acadia/config.mk [new file with mode: 0644]
nand_spl/board/amcc/acadia/u-boot.lds [new file with mode: 0644]
nand_spl/board/amcc/bamboo/Makefile [new file with mode: 0644]
nand_spl/board/amcc/bamboo/config.mk [new file with mode: 0644]
nand_spl/board/amcc/bamboo/sdram.c [new file with mode: 0644]
nand_spl/board/amcc/bamboo/u-boot.lds [new file with mode: 0644]
nand_spl/board/amcc/sequoia/Makefile
nand_spl/nand_boot.c

index 184e941..24d805e 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,237 @@
+commit d62f64cc23a940eafe712c776b3249e4160753d1
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed May 16 00:13:33 2007 +0200
+
+    Coding Style Cleanup, new CHANGELOG
+
+commit 7d98ba770a7eaefa29ce927f31a0956df85bf650
+Author: Piotr Kruszynski <ppk@semihalf.com>
+Date:  Thu May 10 16:55:52 2007 +0200
+
+    [Motion-PRO] Add MTD and JFFS2 support, also add default partition
+    definition.
+
+commit e69f66c6ebe82bbbd1da766bc4eda40ec7ee5af1
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 15:57:43 2007 +0200
+
+    add: reading special purpose registers
+
+commit 1a50f164beb065f360fbddb76029607d6b099698
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 14:52:52 2007 +0200
+
+    add: Microblaze V5 exception handling
+
+commit ab874d5047e5d30dbc1e517ff26083efffa98ecb
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 14:39:11 2007 +0200
+
+    add: FSL control read and write
+
+commit de1de02a7cbf05e6b63e0d8ffc624f12493f6ba3
+Author: Piotr Kruszynski <ppk@semihalf.com>
+Date:  Tue May 8 13:05:44 2007 +0200
+
+    [Motion-PRO] Add support for I2C, EEPROM and RTC.
+
+commit fa5c2ba123b1bf88455bfc21db5e786ca045029d
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 10:23:56 2007 +0200
+
+    [Motion-PRO] Add ATA support. Add CF-booting commands to the default
+    environment.
+
+commit 06241d50a3ab1b20a0b08baeeaffcaa23ae4b839
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 09:39:12 2007 +0200
+
+    [Motion-PRO] Change IPB clock frequency from 50MHz to 100MHz. This
+    eliminates networking problems in Linux (timeouts).
+
+commit 1f1369c34b629be94702684d41d3fddf0f6193e7
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 09:21:57 2007 +0200
+
+    [Motion-PRO] Enable Flat Device Tree support and modify default environment
+    to allow booting of FDT-expecting kernels.
+
+commit fb05f6da35ea1c15c553abe6f23f656bf18dc5db
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 23:58:31 2007 +0200
+
+    new: USE_MSR_INTR support
+
+commit 008861a2f3ef2c062744d733787c7e530a1b8761
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Mon May 7 22:36:15 2007 +0200
+
+    [MPC5xxx] There are networking problems on the Motion-PRO board with
+    current PHY initalization code (tftp timeouts all the time). This commit
+    temporarily disables PHY initalization sequence to make the networking
+    operational, until a fix is found.
+
+commit abca901869c3760b6c5fecb825db6c1d91a78a93
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Mon May 7 22:10:36 2007 +0200
+
+    Get rid of duplicated file (see include/configs/sbc8560.h instead)
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 207b7b2c9d9752e0f6478c30c29b7087f6e6cbb6
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Mon May 7 22:07:08 2007 +0200
+
+    Get rid of duplicated file (see doc/README.SBC8560 instead)
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit a7bac7e9b57ba948051beb19ec5be3a75ce75383
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:43:10 2007 +0200
+
+    fix: read and write MSR - repair number of parameters
+
+commit 19bf1fbad7f19d5a120be9b1daf136e052fcab39
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:33:51 2007 +0200
+
+    new: fsl interrupt support
+    FSL_Has_data is connected to INTC.
+
+commit 792032baa7d625e34c981ab6df521911bd8dc861
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:30:12 2007 +0200
+
+    fix: interrupt handler
+    remove asm code
+
+commit f3f001a341ef185d0f13841be5b5dc3395aacc31
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:25:08 2007 +0200
+
+    fix: remove asm code
+
+commit fb7c2dbef02c9f6f8d7b04ec4c2bfb91418b9c01
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:12:43 2007 +0200
+
+    fix: clean interrupt
+
+commit 42efed6130c8fcf7da881385b5427065d2801757
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 17:22:25 2007 +0200
+
+    fix: interrupt handler for multiple sources
+
+commit 48fbd3a4cdabbebc1debd7eed73c00c2caf914f6
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 17:11:09 2007 +0200
+
+    new: add writing to msr register
+
+commit ac4cd59d59c9bf3f89cb7a344abf8184d678f562
+Author: Timur Tabi <timur@freescale.com>
+Date:  Sat May 5 08:12:30 2007 +0200
+
+    5xxx: write MAC address to mac-address and local-mac-address
+
+    Some device trees have a mac-address property, some have local-mac-address,
+    and some have both.  To support all of these device trees, ftp_cpu_setup()
+    should write the MAC address to mac-address and local-mac-address, if they
+    exist.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+    Acked-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit a9d87e2707dcb249f6bb7f7ff7e00acd8cda9fd2
+Author: Grzegorz Wianecki <grzegorz.wianecki@gmail.com>
+Date:  Sun Apr 29 14:01:54 2007 +0200
+
+    [PATCH] Use PVR to distinguish MPC5200B from MPC5200 in boot message
+
+    MPC5200B systems are incorrectly reported as MPC5200 in U-Boot start-up
+    message. Use PVR to distinguish between the two variants, and print proper CPU
+    information.
+
+    Signed-off-by: Grzegorz Wianecki <grzegorz.wianecki@gmail.com>
+    Signed-off-by: Bartlomiej Sieka <tur@semihalf.com>
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 4ec5bd55ed1ffa91a774af298769621f4fbb18c1
+Author: Ladislav Michl <ladis@linux-mips.org>
+Date:  Wed Apr 25 16:01:26 2007 +0200
+
+    [PATCH] simplify silent console
+
+    Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit b7598a43f2b421a713d8135e98a42c37d9eb9df0
+Author: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+Date:  Mon Apr 23 15:30:39 2007 +0200
+
+    [PATCH] Avoid assigning PCI resources from zero address
+
+    If a PCI IDE card happens to get a zero address assigned to it, the Linux IDE
+    core complains and IDE drivers fails to work.  Also, assigning zero to a BAR
+    was illegal according to PCI 2.1 (the later revisions seem to have excluded the
+    sentence about "0" being considered an invalid address) -- so, use a reasonable
+    starting value of 0x1000 (that's what the most Linux archs are using).
+
+    Alternatively, one might have fixed the calls to pci_set_region() individually
+    (some code even seems to have taken care of this issue) but that would have
+    been a lot more work. :-)
+
+    Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit 9ffd451afeb08e5be7ddae680487ec962b2bca25
+Author: Jeffrey Mann <mannj@embeddedplanet.com>
+Date:  Mon Apr 23 14:00:11 2007 +0200
+
+    [patch] setenv(...) can delete environmentalvariables
+
+    update setenv() function so that entering a NULL value for the
+    variable's value will delete the environmental variable
+
+    Signed-off-by: Jeffrey Mann <mannj@embeddedplanet.com>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit ebd0a0ae05a44769c4e27458ad4e9f3438250443
+Author: Mike Frysinger <vapier@gentoo.org>
+Date:  Mon Apr 23 13:54:24 2007 +0200
+
+    [patch] use unsigned char in smc91111 driver for mac
+
+    the v_mac variable in the smc91111 driver is declared as a signed char ...
+    this causes problems when one of the bytes in the MAC is "signed" like 0xE0
+    because when it gets printed out, you get a display like:
+    0xFFFFFFE0 and that's no good
+
+    Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+commit ffc50f9bb194343c6303517a517708457a5eb6b8
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat May 5 18:54:42 2007 +0200
+
+    new: FSL and MSR support #2
+
+commit f7e2e0eb0668136305f78bb9c21be79b48a34247
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat May 5 18:27:16 2007 +0200
+
+    new: FSL and MSR support
+
+commit 2f15278c2eb911c668b4fe562130b78cf554d139
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Sat May 5 18:23:11 2007 +0200
+
+    Coding stylke cleanup; update CHANGELOG.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
 commit 885ec89b648a899a2f32393fd3ffd9f7234c4402
 Author: Wolfgang Denk <wd@denx.de>
 Date:  Sat May 5 18:05:02 2007 +0200
@@ -67,6 +301,14 @@ Date:       Fri May 4 10:02:33 2007 +0200
 
     Signed-off-by: Wolfgang Denk <wd@denx.de>
 
+commit 068aab660bc3912b930be5540e6b3f3fd6ad3c96
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Thu May 3 19:43:52 2007 -0500
+
+    mpc83xx: fix trivial error in MAKEALL
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
 commit c64a89d6ce8584b9fc64f4e85da9ecac3cfc2c2a
 Author: Wolfgang Denk <wd@denx.de>
 Date:  Thu May 3 16:34:41 2007 +0200
@@ -148,6 +390,33 @@ Date:      Wed Feb 7 15:28:04 2007 -0600
     Signed-off-by: James Yang <James.Yang@freescale.com>
     Signed-off-by: Jon Loeliger <jdl@freescale.com>
 
+commit f64702b7fc8f8df39d31add770df6e372f9e9ce3
+Author: Timur Tabi <timur@freescale.com>
+Date:  Mon Apr 30 13:59:50 2007 -0500
+
+    Fix memory initialization on MPC8349E-mITX
+
+    Define CFG_DDR_SDRAM_CLK_CNTL for the MPC8349E-mITX and MPC8349E-mITX-GP.
+    This allows ddr->sdram_clk_cntl to be properly initialized.  This is necessary
+    on some ITX boards, notably those with a revision 3.1 CPU.
+
+    Also change spd_sdram() in cpu/mpc83xx/spd_sdram.c to not write anything into
+    ddr->sdram_clk_cntl if CFG_DDR_SDRAM_CLK_CNTL is not defined.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+    Acked-by: Michael Benedict <MBenedict@twacs.com>
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
+commit 54b2d434ae9d01787936f34fe1759cf3d7624ae3
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Mon Apr 30 15:26:21 2007 -0500
+
+    mpc83xx: replace elaborate boottime verbosity with 'clocks' command
+
+    and fix CPU: to align with Board: display text.
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
 commit c1ab82669d9525998c34e802a12cad662723f22a
 Author: James Yang <James.Yang@freescale.com>
 Date:  Fri Mar 16 13:02:53 2007 -0500
@@ -167,6 +436,18 @@ Date:      Sun Apr 29 14:13:01 2007 +0200
 
     Signed-off-by: Stefan Roese <sr@denx.de>
 
+commit 5c5d3242935cf3543af01142627494434834cf98
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Wed Apr 25 12:34:38 2007 -0500
+
+    mpc83xx: minor fixups for 8313rdb introduction
+
+commit 144876a380f5756f57412caf74c1d6dc201dd796
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue Apr 24 23:01:02 2007 +0200
+
+    [PATCH] MTD partition support, JFFS2 support
+
 commit 37ed6cdd4159195bfad68d8a237f6adda8f482cb
 Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
 Date:  Tue Apr 24 14:03:45 2007 +0200
@@ -392,6 +673,71 @@ Date:      Thu Dec 14 14:14:55 2006 +0800
     board.
     Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
 
+commit 96b8a05432f346f36493535c85320b70ec9c7c1b
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:54:15 2007 -0500
+
+    mpc83xx: Add MPC8313ERDB support.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 49ea3b6eafe606285ae4d5c378026153dde53200
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:21 2007 -0500
+
+    mpc83xx: Add generic PCI setup code.
+
+    Board code can now request the generic setup code rather than having to
+    copy-and-paste it for themselves.  Boards should be converted to use this
+    once they're tested with it.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 7c98e5193e93df6b9b651851d54b638a61ebb0ea
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:19 2007 -0500
+
+    mpc83xx: Add 831x support to speed.c.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 0f253283a32d91e06844d7f87f9b33f4f4fbce8f
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:18 2007 -0500
+
+    mpc83xx: Add 831x support to global_data.h
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 95e7ef897e54591e615fc1b458b74c286fe1fb06
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:16 2007 -0500
+
+    mpc83xx: Change PVR_83xx to PVR_E300C1-3, and update checkcpu().
+
+    Rather than misleadingly define PVR_83xx as the specific type of 83xx
+    being built for, the PVR of each core revision is defined. checkcpu() now
+    prints the core that it detects, rather than aborting if it doesn't find
+    what it thinks it wants.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit a35b0c4950d84cf9e3a9e32b916135956d1ac636
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:15 2007 -0500
+
+    mpc83xx: Recognize SPR values for MPC8311 and MPC8313.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit d87c57b201b4572d16f1b642998faa00c9912b16
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:31:55 2007 -0500
+
+    mpc83xx: Add register definitions for MPC831x.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
 commit 323bfa8f436dc3bc57187c9b1488bc3146ff1522
 Author: Stefan Roese <sr@denx.de>
 Date:  Mon Apr 23 12:00:22 2007 +0200
@@ -400,6 +746,24 @@ Date:      Mon Apr 23 12:00:22 2007 +0200
 
     Signed-off-by: Stefan Roese <sr@denx.de>
 
+commit 32556443840f127170e4baa8bdd5b567039f6c36
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 21:07:22 2007 +0200
+
+    [PATCH] SystemACE support for Microblaze
+
+commit 0643631aa1036cd746bf5d15f5a34bc7bc01ea4f
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 21:02:40 2007 +0200
+
+    16bit read/write little endian
+
+commit 9d1d6a34d26c5933bc097ce73c9348f95573cdd4
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 20:53:31 2007 +0200
+
+    Change ML401 parameters - Xilinx BSP
+
 commit 2e343b9a57f32e1bd08c35c9976910333fb4e13d
 Author: Ed Swarthout <Ed.Swarthout@freescale.com>
 Date:  Wed Feb 28 05:37:29 2007 -0600
@@ -882,6 +1246,18 @@ Date:     Fri Apr 13 08:02:24 2007 +0200
     Signed-of-by: Greg Lopp <lopp@pobox.com>
     Acked-by: Grant Likely <grant.likely@secretlab.ca>
 
+commit 6fbf261f8df294e589cfadebebe5468e3c0f29e9
+Author: Xie Xiaobo <r63061@freescale.com>
+Date:  Fri Mar 9 19:08:25 2007 +0800
+
+    Fix two bugs for MPC83xx DDR2 controller SPD Init
+
+    There are a few bugs in the cpu/mpc83xx/spd_sdram.c
+    the first bug is that the picos_to_clk routine introduces a huge
+    rounding error in 83xx.
+    the second bug is that the mode register write recovery field is
+    tWR-1, not tWR >> 1.
+
 commit 2ad3aba01d37b72e7c957b07e102fccd64fe6d13
 Author: Jeffrey Mann <mannj@embeddedplanet.com>
 Date:  Thu Apr 12 14:15:59 2007 +0200
diff --git a/MAKEALL b/MAKEALL
index d7cd8d7..0e4e744 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -75,22 +75,23 @@ LIST_8xx="  \
 #########################################################################
 
 LIST_4xx="     \
-       acadia          ADCIOP          alpr            AP1000          \
-       AR405           ASH405          bamboo          bubinga         \
-       CANBT           CMS700          CPCI2DP         CPCI405         \
-       CPCI4052        CPCI405AB       CPCI405DT       CPCI440         \
-       CPCIISER4       CRAYL1          csb272          csb472          \
-       DASA_SIM        DP405           DU405           ebony           \
-       ERIC            EXBITGEN        G2000           HH405           \
-       HUB405          JSE             KAREF           katmai          \
-       luan            METROBOX        MIP405          MIP405T         \
-       ML2             ml300           ocotea          OCRTC           \
-       ORSG            p3p440          PCI405          pcs440ep        \
-       PIP405          PLU405          PMC405          PPChameleonEVB  \
-       sbc405          sc3             sequoia         sequoia_nand    \
-       taishan         VOH405          VOM405          W7OLMC          \
-       W7OLMG          walnut          WUH405          XPEDITE1K       \
-       yellowstone     yosemite        yucca                           \
+       acadia          acadia_nand     ADCIOP          alpr            \
+       AP1000          AR405           ASH405          bamboo          \
+       bamboo_nand     bubinga         CANBT           CMS700          \
+       CPCI2DP         CPCI405         CPCI4052        CPCI405AB       \
+       CPCI405DT       CPCI440         CPCIISER4       CRAYL1          \
+       csb272          csb472          DASA_SIM        DP405           \
+       DU405           ebony           ERIC            EXBITGEN        \
+       G2000           HH405           HUB405          JSE             \
+       KAREF           katmai          luan            METROBOX        \
+       MIP405          MIP405T         ML2             ml300           \
+       ocotea          OCRTC           ORSG            p3p440          \
+       PCI405          pcs440ep        PIP405          PLU405          \
+       PMC405          PPChameleonEVB  sbc405          sc3             \
+       sequoia         sequoia_nand    taishan         VOH405          \
+       VOM405          W7OLMC          W7OLMG          walnut          \
+       WUH405          XPEDITE1K       yellowstone     yosemite        \
+       yucca                                                           \
 "
 
 #########################################################################
@@ -132,8 +133,8 @@ LIST_8260=" \
 #########################################################################
 
 LIST_83xx="    \
-       MPC832XEMDS     MPC8349EMDS     MPC8349ITX      MPC8349ITXGP    \
-       MPC8360EMDS     sbc8349         TQM834x                         \
+       MPC8313ERDB     MPC832XEMDS     MPC8349EMDS     MPC8349ITX      \
+       MPC8349ITXGP    MPC8360EMDS     sbc8349         TQM834x         \
 "
 
 
@@ -185,7 +186,7 @@ LIST_SA="assabet dnp1110 gcplus lart shannon"
 LIST_ARM7="    \
        armadillo       B2              ep7312          evb4510         \
        impa7           integratorap    ap7             ap720t          \
-       lpc2292sodimm   modnet50                                        \
+       lpc2292sodimm   modnet50        SMN42                           \
 "
 
 #########################################################################
index 3969e07..d5e220a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1014,6 +1014,15 @@ xtract_4xx = $(subst _25,,$(subst _33,,$(subst _BA,,$(subst _ME,,$(subst _HI,,$(
 acadia_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx acadia amcc
 
+acadia_nand_config:    unconfig
+       @mkdir -p $(obj)include
+       @mkdir -p $(obj)nand_spl
+       @mkdir -p $(obj)board/amcc/acadia
+       @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
+       @$(MKCONFIG) -n $@ -a acadia ppc ppc4xx acadia amcc
+       @echo "TEXT_BASE = 0x01000000" > $(obj)board/amcc/acadia/config.tmp
+       @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
+
 ADCIOP_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx adciop esd
 
@@ -1035,6 +1044,15 @@ ASH405_config:   unconfig
 bamboo_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx bamboo amcc
 
+bamboo_nand_config:    unconfig
+       @mkdir -p $(obj)include
+       @mkdir -p $(obj)nand_spl
+       @mkdir -p $(obj)board/amcc/bamboo
+       @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
+       @$(MKCONFIG) -n $@ -a bamboo ppc ppc4xx bamboo amcc
+       @echo "TEXT_BASE = 0x01000000" > $(obj)board/amcc/bamboo/config.tmp
+       @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
+
 bubinga_config:        unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx bubinga amcc
 
@@ -1623,6 +1641,19 @@ r5200_config :           unconfig
 ## MPC83xx Systems
 #########################################################################
 
+MPC8313ERDB_33_config \
+MPC8313ERDB_66_config: unconfig
+       @echo "" >include/config.h ; \
+       if [ "$(findstring _33_,$@)" ] ; then \
+               echo -n "...33M ..." ; \
+               echo "#define CFG_33MHZ" >>include/config.h ; \
+       fi ; \
+       if [ "$(findstring _66_,$@)" ] ; then \
+               echo -n "...66M..." ; \
+               echo "#define CFG_66MHZ" >>include/config.h ; \
+       fi ;
+       @$(MKCONFIG) -a MPC8313ERDB ppc mpc83xx mpc8313erdb
+
 MPC832XEMDS_config \
 MPC832XEMDS_HOST_33_config \
 MPC832XEMDS_HOST_66_config \
@@ -1776,8 +1807,16 @@ sbc8560_66_config:      unconfig
 stxgp3_config:         unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx stxgp3
 
-stxssa_config:         unconfig
-       @$(MKCONFIG) $(@:_config=) ppc mpc85xx stxssa
+stxssa_config          \
+stxssa_4M_config:      unconfig
+       @mkdir -p $(obj)include
+       @if [ "$(findstring _4M_,$@)" ] ; then \
+               echo "#define CONFIG_STXSSA_4M" >>$(obj)include/config.h ; \
+               echo "... with 4 MiB flash memory" ; \
+       else \
+               >$(obj)include/config.h ; \
+       fi
+       @$(MKCONFIG) -a stxssa ppc mpc85xx stxssa
 
 TQM8540_config         \
 TQM8541_config         \
@@ -2097,7 +2136,10 @@ evb4510_config : unconfig
        @$(MKCONFIG) $(@:_config=) arm arm720t evb4510
 
 lpc2292sodimm_config:  unconfig
-       @$(MKCONFIG) $(@:_config=) arm arm720t lpc2292sodimm
+       @$(MKCONFIG) $(@:_config=) arm arm720t lpc2292sodimm NULL lpc2292
+
+SMN42_config   :       unconfig
+       @$(MKCONFIG) $(@:_config=) arm arm720t SMN42 siemens lpc2292
 
 #########################################################################
 ## XScale Systems
diff --git a/README b/README
index 90ef2c2..bb5b46e 100644 (file)
--- a/README
+++ b/README
@@ -718,6 +718,7 @@ The following options need to be configured:
                CFG_CMD_VFD     * VFD support (TRAB)
                CFG_CMD_BSP     * Board SPecific functions
                CFG_CMD_CDP     * Cisco Discover Protocol support
+               CFG_CMD_FSL     * Microblaze FSL support
                -----------------------------------------------
                CFG_CMD_ALL     all
 
index abcbf3e..ddbcb80 100644 (file)
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  = $(BOARD).o cpr.o memory.o
+COBJS  = $(BOARD).o cmd_acadia.o cpr.o memory.o
 SOBJS  =
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index baf598c..46d63e6 100644 (file)
@@ -62,6 +62,16 @@ int board_early_init_f(void)
 
        acadia_gpio_init();
 
+       /* Configure 405EZ for NAND usage */
+       mtsdr(sdrnand0, SDR_NAND0_NDEN | SDR_NAND0_NDAREN | SDR_NAND0_NDRBEN);
+       mfsdr(sdrultra0, reg);
+       reg &= ~SDR_ULTRA0_CSN_MASK;
+       reg |= (SDR_ULTRA0_CSNSEL0 >> CFG_NAND_CS) |
+               SDR_ULTRA0_NDGPIOBP |
+               SDR_ULTRA0_EBCRDYEN |
+               SDR_ULTRA0_NFSRSTEN;
+       mtsdr(sdrultra0, reg);
+
        /* USB Host core needs this bit set */
        mfsdr(sdrultra1, reg);
        mtsdr(sdrultra1, reg | SDR_ULTRA1_LEDNENABLE);
@@ -91,8 +101,11 @@ int misc_init_f(void)
 int checkboard(void)
 {
        char *s = getenv("serial#");
+       u8 rev;
+
+       rev = in8(CFG_CPLD_BASE + 0);
+       printf("Board: Acadia - AMCC PPC405EZ Evaluation Board, Rev. %X", rev);
 
-       printf("Board: Acadia - AMCC PPC405EZ Evaluation Board");
        if (s != NULL) {
                puts(", serial# ");
                puts(s);
diff --git a/board/amcc/acadia/cmd_acadia.c b/board/amcc/acadia/cmd_acadia.c
new file mode 100644 (file)
index 0000000..fb7ea35
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@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 <common.h>
+#include <command.h>
+#include <i2c.h>
+
+static u8 boot_267_nor[] = {
+       0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x00,
+       0x14, 0xc0, 0x36, 0xcc, 0x00, 0x0c, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00
+};
+
+static u8 boot_267_nand[] = {
+       0xd0, 0x38, 0xc3, 0x50, 0x13, 0x88, 0x8e, 0x00,
+       0x14, 0xc0, 0x36, 0xcc, 0x00, 0x0c, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00
+};
+
+static int do_bootstrap(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       u8 chip;
+       u8 *buf;
+       int cpu_freq;
+
+       if (argc < 3) {
+               printf("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       cpu_freq = simple_strtol(argv[1], NULL, 10);
+       if (cpu_freq != 267) {
+               printf("Unsupported cpu-frequency - only 267 supported\n");
+               return 1;
+       }
+
+       /* use 0x50 as I2C EEPROM address for now */
+       chip = 0x50;
+
+       if ((strcmp(argv[2], "nor") != 0) &&
+           (strcmp(argv[2], "nand") != 0)) {
+               printf("Unsupported boot-device - only nor|nand support\n");
+               return 1;
+       }
+
+       if (strcmp(argv[2], "nand") == 0) {
+               switch (cpu_freq) {
+               case 267:
+                       buf = boot_267_nand;
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               switch (cpu_freq) {
+               case 267:
+                       buf = boot_267_nor;
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       if (i2c_write(chip, 0, 1, buf, 16) != 0)
+               printf("Error writing to EEPROM at address 0x%x\n", chip);
+       udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
+       if (i2c_write(chip, 0x10, 1, buf+16, 4) != 0)
+               printf("Error2 writing to EEPROM at address 0x%x\n", chip);
+
+       printf("Done\n");
+       printf("Please power-cycle the board for the changes to take effect\n");
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       bootstrap,      3,      0,      do_bootstrap,
+       "bootstrap - program the I2C bootstrap EEPROM\n",
+       "<cpu-freq> <nor|nand> - program the I2C bootstrap EEPROM\n"
+       );
index c8566ec..af5a46c 100644 (file)
 # MA 02111-1307 USA
 #
 
+#
+# AMCC 405EZ Reference Platform (Acadia) board
+#
+
+sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
+
 ifndef TEXT_BASE
 TEXT_BASE = 0xFFFC0000
 endif
index 5375d36..25904d3 100644 (file)
@@ -39,6 +39,7 @@ void sdram_init(void)
        return;
 }
 
+#if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
 static void cram_bcr_write(u32 wr_val)
 {
        wr_val <<= 2;
@@ -62,9 +63,12 @@ static void cram_bcr_write(u32 wr_val)
 
        return;
 }
+#endif
 
 long int initdram(int board_type)
 {
+#if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
+       int i;
        u32 val;
 
        /* 1. EBC need to program READY, CLK, ADV for ASync mode */
@@ -92,7 +96,12 @@ long int initdram(int board_type)
 
        /* Config EBC to use RDY */
        mfsdr(sdrultra0, val);
-       mtsdr(sdrultra0, val | 0x04000000);
+       mtsdr(sdrultra0, val | SDR_ULTRA0_EBCRDYEN);
+
+       /* Wait a short while, since for NAND booting this is too fast */
+       for (i=0; i<200000; i++)
+               ;
+#endif
 
        return (CFG_MBYTES_RAM << 20);
 }
diff --git a/board/amcc/acadia/u-boot-nand.lds b/board/amcc/acadia/u-boot-nand.lds
new file mode 100644 (file)
index 0000000..a5dae0e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2007
+ * 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
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+SECTIONS
+{
+  /* 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      :
+  {
+    /* WARNING - the following is hand-optimized to fit within */
+    /* the sector layout of our flash chips!   XXX FIXME XXX   */
+
+    cpu/ppc4xx/start.o (.text)
+
+    /* Align to next NAND block */
+    . = ALIGN(0x4000);
+    common/environment.o  (.ppcenv)
+    /* Keep some space here for redundant env and potential bad env blocks */
+    . = ALIGN(0x10000);
+
+    *(.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 5da96e9..d01cc49 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2002-2006
+# (C) Copyright 2002-2007
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -33,7 +33,7 @@ OBJS  := $(addprefix $(obj),$(COBJS))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
 $(LIB):        $(OBJS) $(SOBJS)
-       $(AR) $(ARFLAGS) $@ $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
 
 clean:
        rm -f $(SOBJS) $(OBJS)
index 6260b01..2e651df 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2005
+ * (C) Copyright 2005-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
@@ -291,6 +291,7 @@ int checkboard(void)
        return (0);
 }
 
+#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
 /*************************************************************************
  *
  * init_spd_array -- Bamboo has one bank onboard sdram (plus DIMM)
@@ -345,10 +346,12 @@ static void init_spd_array(void)
        cfg_simulate_spd_eeprom[25]    = 0x00;    /* SDRAM Cycle Time (cas latency 1.5) = N.A */
        cfg_simulate_spd_eeprom[12]    = 0x82;    /* refresh Rate Type: Normal (15.625us) + Self refresh */
 }
+#endif
 
 long int initdram (int board_type)
 {
-       long dram_size = 0;
+#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
+       long dram_size;
 
        /*
         * First write simulated values in eeprom array for onboard bank 0
@@ -358,6 +361,9 @@ long int initdram (int board_type)
        dram_size = spd_sdram();
 
        return dram_size;
+#else
+       return CFG_MBYTES_SDRAM << 20;
+#endif
 }
 
 #if defined(CFG_DRAM_TEST)
@@ -881,11 +887,11 @@ void ext_bus_cntlr_init(void)
                /*------------------------------------------------------------------------- */
        case BOOT_FROM_NAND_FLASH0:
                /*------------------------------------------------------------------------- */
-               ebc0_cs0_bnap_value = 0;
-               ebc0_cs0_bncr_value = 0;
+               ebc0_cs0_bnap_value = EBC0_BNAP_NAND_FLASH;
+               ebc0_cs0_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
 
-               ebc0_cs1_bnap_value = EBC0_BNAP_NAND_FLASH;
-               ebc0_cs1_bncr_value = EBC0_BNCR_NAND_FLASH_CS1;
+               ebc0_cs1_bnap_value = 0;
+               ebc0_cs1_bncr_value = 0;
                ebc0_cs2_bnap_value = 0;
                ebc0_cs2_bncr_value = 0;
                ebc0_cs3_bnap_value = 0;
@@ -1409,10 +1415,10 @@ void update_ndfc_ios(void)
        gpio_tab[GPIO0][6].in_out = GPIO_OUT;       /* EBC_CS_N(1) */
        gpio_tab[GPIO0][6].alt_nb = GPIO_ALT1;
 
-#if 0
        gpio_tab[GPIO0][7].in_out = GPIO_OUT;       /* EBC_CS_N(2) */
        gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
 
+#if 0
        gpio_tab[GPIO0][7].in_out = GPIO_OUT;       /* EBC_CS_N(3) */
        gpio_tab[GPIO0][7].alt_nb = GPIO_ALT1;
 #endif
@@ -1900,12 +1906,21 @@ void configure_ppc440ep_pins(void)
        {
                update_ndfc_ios();
 
+#if !(defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL))
                mtsdr(sdr_cust0, SDR0_CUST0_MUX_NDFC_SEL   |
                      SDR0_CUST0_NDFC_ENABLE    |
                      SDR0_CUST0_NDFC_BW_8_BIT  |
                      SDR0_CUST0_NDFC_ARE_MASK  |
                      SDR0_CUST0_CHIPSELGAT_EN1 |
                      SDR0_CUST0_CHIPSELGAT_EN2);
+#else
+               mtsdr(sdr_cust0, SDR0_CUST0_MUX_NDFC_SEL   |
+                     SDR0_CUST0_NDFC_ENABLE    |
+                     SDR0_CUST0_NDFC_BW_8_BIT  |
+                     SDR0_CUST0_NDFC_ARE_MASK  |
+                     SDR0_CUST0_CHIPSELGAT_EN0 |
+                     SDR0_CUST0_CHIPSELGAT_EN2);
+#endif
 
                ndfc_selection_in_fpga();
        }
index 9d7f4c3..b46527d 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2002-2006
+# (C) Copyright 2002-2007
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
 # MA 02111-1307 USA
 #
 
+sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
+
+ifndef TEXT_BASE
 TEXT_BASE = 0xFFFA0000
+endif
 
 PLATFORM_CPPFLAGS += -DCONFIG_440=1
 
index a30ab7a..8a2e832 100644 (file)
@@ -53,7 +53,7 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips        */
 static unsigned long flash_addr_table[][CFG_MAX_FLASH_BANKS] = {
        {0x87800001, 0xFFF00000, 0xFFF80000}, /* 0:boot from small flash */
        {0x00000000, 0x00000000, 0x00000000}, /* 1:boot from pci 66      */
-       {0x00000000, 0x00000000, 0x00000000}, /* 2:boot from nand flash  */
+       {0x87800001, 0x00000000, 0x00000000}, /* 0:boot from nand flash  */
        {0x87F00000, 0x87F80000, 0xFFC00001}, /* 3:boot from big flash 33*/
        {0x87F00000, 0x87F80000, 0xFFC00001}, /* 4:boot from big flash 66*/
        {0x00000000, 0x00000000, 0x00000000}, /* 5:boot from             */
@@ -134,10 +134,10 @@ unsigned long flash_init(void)
                flash_info[i].size = 0;
 
                /* check whether the address is 0 */
-               if (flash_addr_table[index][i] == 0) {
+               if (flash_addr_table[index][i] == 0)
                        continue;
-               }
 
+               DEBUGF("Detection bank %d...\n", i);
                /* call flash_get_size() to initialize sector address */
                size_b[i] = flash_get_size((vu_long *) flash_addr_table[index][i],
                                   &flash_info[i]);
index 7820107..1459eec 100644 (file)
@@ -1,74 +1,31 @@
 /*
-*
-* 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
-*/
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
+ *
+ *  Copyright (C) 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
+ */
 
 #include <ppc_asm.tmpl>
 #include <config.h>
-
-/* General */
-#define TLB_VALID   0x00000200
-
-/* Supported page sizes */
-
-#define SZ_1K      0x00000000
-#define SZ_4K      0x00000010
-#define SZ_16K     0x00000020
-#define SZ_64K     0x00000030
-#define SZ_256K            0x00000040
-#define SZ_1M      0x00000050
-#define SZ_8M       0x00000060
-#define SZ_16M     0x00000070
-#define SZ_256M            0x00000090
-
-/* Storage attributes */
-#define SA_W       0x00000800      /* Write-through */
-#define SA_I       0x00000400      /* Caching inhibited */
-#define SA_M       0x00000200      /* Memory coherence */
-#define SA_G       0x00000100      /* Guarded */
-#define SA_E       0x00000080      /* Endian */
-
-/* Access control */
-#define AC_X       0x00000024      /* Execute */
-#define AC_W       0x00000012      /* Write */
-#define AC_R       0x00000009      /* Read */
-
-/* Some handy macros */
-
-#define EPN(e)         ((e) & 0xfffffc00)
-#define TLB0(epn,sz)   ( (EPN((epn)) | (sz) | TLB_VALID ) )
-#define TLB1(rpn,erpn) ( ((rpn)&0xfffffc00) | (erpn) )
-#define TLB2(a)                ( (a)&0x00000fbf )
-
-#define tlbtab_start\
-       mflr    r1  ;\
-       bl 0f       ;
-
-#define tlbtab_end\
-       .long 0, 0, 0   ;   \
-0:     mflr    r0      ;   \
-       mtlr    r1      ;   \
-       blr             ;
-
-#define tlbentry(epn,sz,rpn,erpn,attr)\
-       .long TLB0(epn,sz),TLB1(rpn,erpn),TLB2(attr)
-
+#include <asm-ppc/mmu.h>
 
 /**************************************************************************
  * TLB TABLE
  *  Pointer to the table is returned in r1
  *
  *************************************************************************/
-
-    .section .bootpg,"ax"
-    .globl tlbtab
+       .section .bootpg,"ax"
+       .globl tlbtab
 
 tlbtab:
-    tlbtab_start
-
-    /*
-     * BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the
-     * speed up boot process. It is patched after relocation to enable SA_I
-     */
-    tlbentry( CFG_BOOT_BASE_ADDR, SZ_256M, CFG_BOOT_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_G/*|SA_I*/)
-
-    /* TLB-entry for init-ram in dcache (SA_I must be turned off!) */
-    tlbentry( CFG_INIT_RAM_ADDR, SZ_64K, CFG_INIT_RAM_ADDR, 0, AC_R|AC_W|AC_X|SA_G )
-
-    tlbentry( CFG_SDRAM_BASE, SZ_256M, CFG_SDRAM_BASE, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_PCI_BASE, SZ_256M, CFG_PCI_BASE, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_NVRAM_BASE_ADDR, SZ_256M, CFG_NVRAM_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_W|SA_I )
-    tlbentry( CFG_NAND_ADDR, SZ_256M, CFG_NAND_ADDR, 0, AC_R|AC_W|AC_X|SA_W|SA_I )
-
-    /* PCI */
-    tlbentry( CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE3, SZ_256M, CFG_PCI_MEMBASE3, 0, AC_R|AC_W|SA_G|SA_I )
-
-    /* USB 2.0 Device */
-    tlbentry( CFG_USB_DEVICE, SZ_1K, CFG_USB_DEVICE, 0, AC_R|AC_W|SA_G|SA_I )
-
-    tlbtab_end
+       tlbtab_start
+
+       /*
+        * BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the
+        * speed up boot process. It is patched after relocation to enable SA_I
+        */
+#ifndef CONFIG_NAND_SPL
+       tlbentry(CFG_BOOT_BASE_ADDR, SZ_256M, CFG_BOOT_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_G)
+#else
+       tlbentry(CFG_NAND_BOOT_SPL_SRC, SZ_4K, CFG_NAND_BOOT_SPL_SRC, 0, AC_R|AC_W|AC_X|SA_G)
+#endif
+
+       /* TLB-entry for init-ram in dcache (SA_I must be turned off!) */
+       tlbentry(CFG_INIT_RAM_ADDR, SZ_4K, CFG_INIT_RAM_ADDR, 0, AC_R|AC_W|AC_X|SA_G)
+
+       tlbentry(CFG_SDRAM_BASE, SZ_256M, CFG_SDRAM_BASE, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
+
+       /* PCI base & peripherals */
+       tlbentry(CFG_PCI_BASE, SZ_256M, CFG_PCI_BASE, 0, AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_NVRAM_BASE_ADDR, SZ_256M, CFG_NVRAM_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_W|SA_I)
+       tlbentry(CFG_NAND_ADDR, SZ_4K, CFG_NAND_ADDR, 0, AC_R|AC_W|AC_X|SA_W|SA_I)
+
+       /* PCI */
+       tlbentry(CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 0, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 0, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 0, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE3, SZ_256M, CFG_PCI_MEMBASE3, 0, AC_R|AC_W|SA_G|SA_I)
+
+       /* USB 2.0 Device */
+       tlbentry(CFG_USB_DEVICE, SZ_1K, CFG_USB_DEVICE, 0, AC_R|AC_W|SA_G|SA_I)
+
+       tlbtab_end
+
+#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+       /*
+        * For NAND booting the first TLB has to be reconfigured to full size
+        * and with caching disabled after running from RAM!
+        */
+#define TLB00  TLB0(CFG_BOOT_BASE_ADDR, SZ_256M)
+#define TLB01  TLB1(CFG_BOOT_BASE_ADDR, 0)
+#define TLB02  TLB2(AC_R|AC_W|AC_X|SA_G|SA_I)
+
+       .globl  reconfig_tlb0
+reconfig_tlb0:
+       sync
+       isync
+       addi    r4,r0,0x0000            /* TLB entry #0 */
+       lis     r5,TLB00@h
+       ori     r5,r5,TLB00@l
+       tlbwe   r5,r4,0x0000            /* Save it out */
+       lis     r5,TLB01@h
+       ori     r5,r5,TLB01@l
+       tlbwe   r5,r4,0x0001            /* Save it out */
+       lis     r5,TLB02@h
+       ori     r5,r5,TLB02@l
+       tlbwe   r5,r4,0x0002            /* Save it out */
+       sync
+       isync
+       blr
+#endif
diff --git a/board/amcc/bamboo/u-boot-nand.lds b/board/amcc/bamboo/u-boot-nand.lds
new file mode 100644 (file)
index 0000000..a5dae0e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2007
+ * 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
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+SECTIONS
+{
+  /* 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      :
+  {
+    /* WARNING - the following is hand-optimized to fit within */
+    /* the sector layout of our flash chips!   XXX FIXME XXX   */
+
+    cpu/ppc4xx/start.o (.text)
+
+    /* Align to next NAND block */
+    . = ALIGN(0x4000);
+    common/environment.o  (.ppcenv)
+    /* Keep some space here for redundant env and potential bad env blocks */
+    . = ALIGN(0x10000);
+
+    *(.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 d045df1..78e2cb4 100644 (file)
@@ -387,7 +387,11 @@ void denali_core_search_data_eye(unsigned long memory_size)
 long int initdram (int board_type)
 {
 #if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
+#if !defined(CONFIG_NAND_SPL)
        ulong speed = get_bus_freq(0);
+#else
+       ulong speed = 133333333;        /* 133MHz is on the safe side   */
+#endif
 
        mtsdram(DDR0_02, 0x00000000);
 
index 930fa71..ba365ae 100644 (file)
@@ -363,8 +363,8 @@ int checkboard(void)
        printf("Board: Rainier - AMCC PPC440GRx Evaluation Board");
 #endif
 
-       rev = *(u8 *)(CFG_BCSR_BASE + 0);
-       val = *(u8 *)(CFG_BCSR_BASE + 5) & 0x01;
+       rev = in8(CFG_BCSR_BASE + 0);
+       val = in8(CFG_BCSR_BASE + 5) & 0x01;
        printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
 
        if (s != NULL) {
index 5a30198..18a95d7 100644 (file)
@@ -1,7 +1,6 @@
 #
-# (C) Copyright 2002
-# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
-# Marius Groeger <mgroeger@sysgo.de>
+# (C) Copyright 2007
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
 # project.
 
 include $(TOPDIR)/config.mk
 
-LIB    = lib$(BOARD).a
+LIB    = $(obj)lib$(BOARD).a
 
-OBJS   := lpc2292sodimm.o flash.o mmc.o spi.o mmc_hw.o eth.o
-SOBJS  := lowlevel_init.o iap_entry.o
+COBJS  := flash.o lpc2292sodimm.o
+SOBJTS := lowlevel_init.o
 
-$(LIB):        $(OBJS) $(SOBJS)
-       $(AR) crv $@ $(OBJS) $(SOBJS)
+SRCS   := $(SOBJTS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJTS))
 
-# this MUST be compiled as thumb code!
-iap_entry.o:
-       arm-linux-gcc  -D__ASSEMBLY__ -g  -Os   -fno-strict-aliasing  \
-       -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ \
-       -DTEXT_BASE=0x81500000  -I/home/garyj/proj/LPC/u-boot/include \
-       -fno-builtin -ffreestanding -nostdinc -isystem \
-       /opt/eldk/arm/usr/bin/../lib/gcc/arm-linux/4.0.0/include -pipe  \
-       -DCONFIG_ARM -D__ARM__ -march=armv4t -mtune=arm7tdmi -mabi=apcs-gnu \
-       -c -o iap_entry.o iap_entry.S
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) crv $@ $(OBJS) $(SOBJS)
 
 clean:
        rm -f $(SOBJS) $(OBJS)
 
 distclean:     clean
-       rm -f $(LIB) core *.bak .depend
+       rm -f $(LIB) core *.bak $(obj).depend
 
 #########################################################################
 
-.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
-               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
 
--include .depend
+sinclude $(obj).depend
 
 #########################################################################
index 55aaabf..0fb0843 100644 (file)
@@ -1,6 +1,9 @@
 /*
  * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
  *
+ * Modified to use the routines in cpu/arm720t/lpc2292/flash.c by
+ * Gary Jennejohn <garyj@denx,de>
+ *
  * 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
 #include <common.h>
 #include <asm/arch/hardware.h>
 
-/* IAP commands use 32 bytes at the top of CPU internal sram, we
-   use 512 bytes below that */
-#define COPY_BUFFER_LOCATION 0x40003de0
-
-#define IAP_LOCATION 0x7ffffff1
-#define IAP_CMD_PREPARE 50
-#define IAP_CMD_COPY 51
-#define IAP_CMD_ERASE 52
-#define IAP_CMD_CHECK 53
-#define IAP_CMD_ID 54
-#define IAP_CMD_VERSION 55
-#define IAP_CMD_COMPARE 56
-
-#define IAP_RET_CMD_SUCCESS 0
-
 #define SST_BASEADDR 0x80000000
 #define SST_ADDR1 ((volatile ushort*)(SST_BASEADDR + (0x5555 << 1)))
 #define SST_ADDR2 ((volatile ushort*)(SST_BASEADDR + (0x2AAA << 1)))
 
 
-static unsigned long command[5];
-static unsigned long result[2];
-
 flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
 
-extern void iap_entry(unsigned long * command, unsigned long * result);
-
-/*-----------------------------------------------------------------------
- *
- */
-int get_flash_sector(flash_info_t * info, ulong flash_addr)
-{
-       int i;
-
-       for(i=1; i < (info->sector_count); i++) {
-               if (flash_addr < (info->start[i]))
-                       break;
-       }
-
-       return (i-1);
-}
-
-/*-----------------------------------------------------------------------
- * This function assumes that flash_addr is aligned on 512 bytes boundary
- * in flash. This function also assumes that prepare have been called
- * for the sector in question.
- */
-int copy_buffer_to_flash(flash_info_t * info, ulong flash_addr)
-{
-       int first_sector;
-       int last_sector;
-
-       first_sector = get_flash_sector(info, flash_addr);
-       last_sector = get_flash_sector(info, flash_addr + 512 - 1);
-
-       /* prepare sectors for write */
-       command[0] = IAP_CMD_PREPARE;
-       command[1] = first_sector;
-       command[2] = last_sector;
-       iap_entry(command, result);
-       if (result[0] != IAP_RET_CMD_SUCCESS) {
-               printf("IAP prepare failed\n");
-               return ERR_PROG_ERROR;
-       }
-
-       command[0] = IAP_CMD_COPY;
-       command[1] = flash_addr;
-       command[2] = COPY_BUFFER_LOCATION;
-       command[3] = 512;
-       command[4] = CFG_SYS_CLK_FREQ >> 10;
-       iap_entry(command, result);
-       if (result[0] != IAP_RET_CMD_SUCCESS) {
-               printf("IAP copy failed\n");
-               return 1;
-       }
-
-       return 0;
-}
+extern int lpc2292_copy_buffer_to_flash(flash_info_t *, ulong);
+extern int lpc2292_flash_erase(flash_info_t *, int, int);
+extern int lpc2292_write_buff (flash_info_t *, uchar *, ulong, ulong);
 
 /*-----------------------------------------------------------------------
  *
@@ -220,56 +155,6 @@ void flash_print_info (flash_info_t * info)
        printf ("\n");
 }
 
-/*-----------------------------------------------------------------------
- */
-
-int flash_erase_philips (flash_info_t * info, int s_first, int s_last)
-{
-       int flag;
-       int prot;
-       int sect;
-
-       prot = 0;
-       for (sect = s_first; sect <= s_last; ++sect) {
-               if (info->protect[sect]) {
-                       prot++;
-               }
-       }
-       if (prot)
-               return ERR_PROTECTED;
-
-
-       flag = disable_interrupts();
-
-       printf ("Erasing %d sectors starting at sector %2d.\n"
-       "This make take some time ... ",
-       s_last - s_first + 1, s_first);
-
-       command[0] = IAP_CMD_PREPARE;
-       command[1] = s_first;
-       command[2] = s_last;
-       iap_entry(command, result);
-       if (result[0] != IAP_RET_CMD_SUCCESS) {
-               printf("IAP prepare failed\n");
-               return ERR_PROTECTED;
-       }
-
-       command[0] = IAP_CMD_ERASE;
-       command[1] = s_first;
-       command[2] = s_last;
-       command[3] = CFG_SYS_CLK_FREQ >> 10;
-       iap_entry(command, result);
-       if (result[0] != IAP_RET_CMD_SUCCESS) {
-               printf("IAP erase failed\n");
-               return ERR_PROTECTED;
-       }
-
-       if (flag)
-               enable_interrupts();
-
-       return ERR_OK;
-}
-
 int flash_erase_sst (flash_info_t * info, int s_first, int s_last)
 {
        int i;
@@ -294,7 +179,7 @@ int flash_erase (flash_info_t * info, int s_first, int s_last)
                case (SST_MANUFACT & FLASH_VENDMASK):
                        return flash_erase_sst(info, s_first, s_last);
                case (PHILIPS_LPC2292 & FLASH_VENDMASK):
-                       return flash_erase_philips(info, s_first, s_last);
+                       return lpc2292_flash_erase(info, s_first, s_last);
                default:
                        return ERR_PROTECTED;
        }
@@ -353,122 +238,13 @@ int write_buff_sst (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
        return ret;
 }
 
-int write_buff_philips (flash_info_t * info,
-                       uchar * src,
-                       ulong addr,
-                       ulong cnt)
-{
-       int first_copy_size;
-       int last_copy_size;
-       int first_block;
-       int last_block;
-       int nbr_mid_blocks;
-       uchar memmap_value;
-       ulong i;
-       uchar* src_org;
-       uchar* dst_org;
-       int ret = ERR_OK;
-
-       src_org = src;
-       dst_org = (uchar*)addr;
-
-       first_block = addr / 512;
-       last_block = (addr + cnt) / 512;
-       nbr_mid_blocks = last_block - first_block - 1;
-
-       first_copy_size = 512 - (addr % 512);
-       last_copy_size = (addr + cnt) % 512;
-
-#if 0
-       printf("\ncopy first block: (1) %lX -> %lX 0x200 bytes, "
-               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX 0x200 bytes\n",
-       (ulong)(first_block * 512),
-       (ulong)COPY_BUFFER_LOCATION,
-       (ulong)src,
-       (ulong)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
-       first_copy_size,
-       (ulong)COPY_BUFFER_LOCATION,
-       (ulong)(first_block * 512));
-#endif
-
-       /* copy first block */
-       memcpy((void*)COPY_BUFFER_LOCATION,
-               (void*)(first_block * 512), 512);
-       memcpy((void*)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
-               src, first_copy_size);
-       copy_buffer_to_flash(info, first_block * 512);
-       src += first_copy_size;
-       addr += first_copy_size;
-
-       /* copy middle blocks */
-       for (i = 0; i < nbr_mid_blocks; i++) {
-#if 0
-               printf("copy middle block: %lX -> %lX 512 bytes, "
-               "%lX -> %lX 512 bytes\n",
-               (ulong)src,
-               (ulong)COPY_BUFFER_LOCATION,
-               (ulong)COPY_BUFFER_LOCATION,
-               (ulong)addr);
-#endif
-               memcpy((void*)COPY_BUFFER_LOCATION, src, 512);
-               copy_buffer_to_flash(info, addr);
-               src += 512;
-               addr += 512;
-       }
-
-
-       if (last_copy_size > 0) {
-#if 0
-               printf("copy last block: (1) %lX -> %lX 0x200 bytes, "
-               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX x200 bytes\n",
-               (ulong)(last_block * 512),
-               (ulong)COPY_BUFFER_LOCATION,
-               (ulong)src,
-               (ulong)(COPY_BUFFER_LOCATION),
-               last_copy_size,
-               (ulong)COPY_BUFFER_LOCATION,
-               (ulong)addr);
-#endif
-               /* copy last block */
-               memcpy((void*)COPY_BUFFER_LOCATION,
-                       (void*)(last_block * 512), 512);
-               memcpy((void*)COPY_BUFFER_LOCATION,
-                       src, last_copy_size);
-               copy_buffer_to_flash(info, addr);
-       }
-
-       /* verify write */
-       memmap_value = GET8(MEMMAP);
-
-       disable_interrupts();
-
-       PUT8(MEMMAP, 01);               /* we must make sure that initial 64
-                                                          bytes are taken from flash when we
-                                                          do the compare */
-
-       for (i = 0; i < cnt; i++) {
-               if (*dst_org != *src_org){
-                       printf("Write failed. Byte %lX differs\n", i);
-                       ret = ERR_PROG_ERROR;
-                       break;
-               }
-               dst_org++;
-               src_org++;
-       }
-
-       PUT8(MEMMAP, memmap_value);
-       enable_interrupts();
-
-       return ret;
-}
-
 int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
 {
        switch (info->flash_id & FLASH_VENDMASK) {
                case (SST_MANUFACT & FLASH_VENDMASK):
                        return write_buff_sst(info, src, addr, cnt);
                case (PHILIPS_LPC2292 & FLASH_VENDMASK):
-                       return write_buff_philips(info, src, addr, cnt);
+                       return lpc2292_write_buff(info, src, addr, cnt);
                default:
                        return ERR_PROG_ERROR;
        }
index d60d233..6eb5fe9 100644 (file)
 
 #include <common.h>
 #include <mpc5xxx.h>
+#include <miiphy.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
 
+#if defined(CONFIG_STATUS_LED)
+#include <status_led.h>
+#endif /* CONFIG_STATUS_LED */
 
 /* Kollmorgen DPR initialization data */
 struct init_elem {
@@ -75,11 +82,27 @@ int board_early_init_r(void)
 }
 
 
+/*
+ * Additional PHY intialization. After being reset in mpc5xxx_fec_init_phy(),
+ * PHY goes into FX mode.  To take it out of the FX mode and switch into
+ * desired TX operation, one needs to clear the FX_SEL bit of Mode Control
+ * Register.
+ */
+void reset_phy(void)
+{
+       unsigned short mode_control;
+
+       miiphy_read("FEC ETHERNET", CONFIG_PHY_ADDR, 0x15, &mode_control);
+       miiphy_write("FEC ETHERNET", CONFIG_PHY_ADDR, 0x15,
+                       mode_control & 0xfffe);
+       return;
+}
+
 #ifndef CFG_RAMBOOT
 /*
  * Helper function to initialize SDRAM controller.
  */
-static void sdram_start (int hi_addr)
+static void sdram_start(int hi_addr)
 {
        long hi_addr_bit = hi_addr ? 0x01000000 : 0;
 
@@ -111,7 +134,7 @@ static void sdram_start (int hi_addr)
 /*
  * Initalize SDRAM - configure SDRAM controller, detect memory size.
  */
-long int initdram (int board_type)
+long int initdram(int board_type)
 {
        ulong dramsize = 0;
 #ifndef CFG_RAMBOOT
@@ -165,8 +188,43 @@ long int initdram (int board_type)
 }
 
 
-int checkboard (void)
+int checkboard(void)
 {
-       puts("Board: Promess Motion-PRO board\n");
+       uchar rev = *(vu_char *)CPLD_REV_REGISTER;
+       printf("Board: Promess Motion-PRO board (CPLD rev. 0x%02x)\n", rev);
        return 0;
 }
+
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       ft_cpu_setup(blob, bd);
+}
+#endif /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
+
+
+#if defined(CONFIG_STATUS_LED)
+void __led_init(led_id_t regaddr, int state)
+{
+       *((vu_long *) regaddr) |= ENABLE_GPIO_OUT;
+
+       if (state == STATUS_LED_ON)
+               *((vu_long *) regaddr) |= LED_ON;
+       else
+               *((vu_long *) regaddr) &= ~LED_ON;
+}
+
+void __led_set(led_id_t regaddr, int state)
+{
+       if (state == STATUS_LED_ON)
+               *((vu_long *) regaddr) |= LED_ON;
+       else
+               *((vu_long *) regaddr) &= ~LED_ON;
+}
+
+void __led_toggle(led_id_t regaddr)
+{
+       *((vu_long *) regaddr) ^= LED_ON;
+}
+#endif /* CONFIG_STATUS_LED */
diff --git a/board/mpc8313erdb/Makefile b/board/mpc8313erdb/Makefile
new file mode 100644 (file)
index 0000000..a987e51
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2006
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o sdram.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/mpc8313erdb/config.mk b/board/mpc8313erdb/config.mk
new file mode 100644 (file)
index 0000000..f768264
--- /dev/null
@@ -0,0 +1 @@
+TEXT_BASE = 0xFE000000
diff --git a/board/mpc8313erdb/mpc8313erdb.c b/board/mpc8313erdb/mpc8313erdb.c
new file mode 100644 (file)
index 0000000..999fe9e
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
+ *
+ * Author: Scott Wood <scottwood@freescale.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 <common.h>
+#include <ft_build.h>
+#include <pci.h>
+#include <mpc83xx.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       volatile immap_t *im = (immap_t *)CFG_IMMR;
+
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               gd->flags |= GD_FLG_SILENT;
+#endif
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: Freescale MPC8313ERDB\n");
+       return 0;
+}
+
+static struct pci_region pci_regions[] = {
+       {
+               bus_start: CFG_PCI1_MEM_BASE,
+               phys_start: CFG_PCI1_MEM_PHYS,
+               size: CFG_PCI1_MEM_SIZE,
+               flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
+       },
+       {
+               bus_start: CFG_PCI1_MMIO_BASE,
+               phys_start: CFG_PCI1_MMIO_PHYS,
+               size: CFG_PCI1_MMIO_SIZE,
+               flags: PCI_REGION_MEM
+       },
+       {
+               bus_start: CFG_PCI1_IO_BASE,
+               phys_start: CFG_PCI1_IO_PHYS,
+               size: CFG_PCI1_IO_SIZE,
+               flags: PCI_REGION_IO
+       }
+};
+
+void pci_init_board(void)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
+       volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
+       struct pci_region *reg[] = { pci_regions };
+       int warmboot;
+
+       /* Enable all 3 PCI_CLK_OUTPUTs. */
+       clk->occr |= 0xe0000000;
+
+       /*
+        * Configure PCI Local Access Windows
+        */
+       pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB;
+
+       pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB;
+
+       warmboot = gd->bd->bi_bootflags & BOOTFLAG_WARM;
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       warmboot |= immr->pmc.pmccr1 & PMCCR1_POWER_OFF;
+#endif
+
+       mpc83xx_pci_init(1, reg, warmboot);
+}
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
+#endif
+       ft_cpu_setup(blob, bd);
+
+       p = ft_get_prop(blob, "/memory/reg", &len);
+       if (p) {
+               *p++ = cpu_to_be32(bd->bi_memstart);
+               *p = cpu_to_be32(bd->bi_memsize);
+       }
+}
+#endif
diff --git a/board/mpc8313erdb/sdram.c b/board/mpc8313erdb/sdram.c
new file mode 100644 (file)
index 0000000..4b67788
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
+ *
+ * Authors: Nick.Spence@freescale.com
+ *          Wilson.Lo@freescale.com
+ *          scottwood@freescale.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 <common.h>
+#include <mpc83xx.h>
+#include <spd_sdram.h>
+
+#include <asm/bitops.h>
+#include <asm/io.h>
+
+#include <asm/processor.h>
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+static void resume_from_sleep(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       u32 magic = *(u32 *)0;
+
+       typedef void (*func_t)(void);
+       func_t resume = *(func_t *)4;
+
+       if (magic == 0xf5153ae5)
+               resume();
+
+       gd->flags &= ~GD_FLG_SILENT;
+       puts("\nResume from sleep failed: bad magic word\n");
+}
+#endif
+
+/* Fixed sdram init -- doesn't use serial presence detect.
+ *
+ * This is useful for faster booting in configs where the RAM is unlikely
+ * to be changed, or for things like NAND booting where space is tight.
+ */
+static long fixed_sdram(void)
+{
+       volatile immap_t *im = (volatile immap_t *)CFG_IMMR;
+       u32 msize = CFG_DDR_SIZE * 1024 * 1024;
+       u32 msize_log2 = __ilog2(msize);
+
+       im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12;
+       im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1);
+       im->sysconf.ddrcdr = CFG_DDRCDR_VALUE;
+
+       /*
+        * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg],
+        * or the DDR2 controller may fail to initialize correctly.
+        */
+       udelay(50000);
+
+       im->ddr.csbnds[0].csbnds = (msize - 1) >> 24;
+       im->ddr.cs_config[0] = CFG_DDR_CONFIG;
+
+       /* Currently we use only one CS, so disable the other bank. */
+       im->ddr.cs_config[1] = 0;
+
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               im->ddr.sdram_cfg = CFG_SDRAM_CFG | SDRAM_CFG_BI;
+       else
+#endif
+               im->ddr.sdram_cfg = CFG_SDRAM_CFG;
+
+       im->ddr.sdram_cfg2 = CFG_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE_2;
+
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       sync();
+
+       /* enable DDR controller */
+       im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
+
+       return msize;
+}
+
+long int initdram(int board_type)
+{
+       volatile immap_t *im = (volatile immap_t *)CFG_IMMR;
+       volatile lbus83xx_t *lbc = &im->lbus;
+       u32 msize;
+
+       if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
+               return -1;
+
+       puts("Initializing\n");
+
+       /* DDR SDRAM - Main SODIMM */
+       msize = fixed_sdram();
+
+       /* Local Bus setup lbcr and mrtpr */
+       lbc->lbcr = CFG_LBC_LBCR;
+       lbc->mrtpr = CFG_LBC_MRTPR;
+       sync();
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               resume_from_sleep();
+#endif
+
+       puts("   DDR RAM: ");
+       /* return total bus SDRAM size(bytes)  -- DDR */
+       return msize;
+}
diff --git a/board/mpc8313erdb/u-boot.lds b/board/mpc8313erdb/u-boot.lds
new file mode 100644 (file)
index 0000000..937c87a
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * (C) Copyright 2006
+ * 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
+ */
+
+OUTPUT_ARCH(powerpc)
+SECTIONS
+{
+  /* 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/mpc83xx/start.o        (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+    . = ALIGN(16);
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.eh_frame)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x0FFF) & 0xFFFFF000;
+  _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(4096);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(4096);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
+ENTRY(_start)
index 2b3ded1..178b1d3 100644 (file)
@@ -80,8 +80,7 @@ int fixed_sdram(void)
        im->ddr.sdram_interval =
            (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 <<
                                                       SDRAM_INTERVAL_BSTOPRE_SHIFT);
-       im->ddr.sdram_clk_cntl =
-           DDR_SDRAM_CLK_CNTL_SS_EN | DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05;
+       im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL;
 
        udelay(200);
 
diff --git a/board/siemens/SMN42/Makefile b/board/siemens/SMN42/Makefile
new file mode 100644 (file)
index 0000000..2c7b54b
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# (C) Copyright 2007
+# 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    = $(obj)lib$(BOARD).a
+
+COBJS  := flash.o smn42.o
+SOBJTS := lowlevel_init.o
+
+SRCS   := $(SOBJTS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJTS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) crv $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak $(obj).depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/siemens/SMN42/config.mk b/board/siemens/SMN42/config.mk
new file mode 100644 (file)
index 0000000..b28f418
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# (C) Copyright 2000
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.de>
+#
+# (C) Copyright 2000
+# 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
+#
+
+#address where u-boot will be relocated
+#TEXT_BASE = 0x0
+TEXT_BASE = 0x81500000
diff --git a/board/siemens/SMN42/flash.c b/board/siemens/SMN42/flash.c
new file mode 100755 (executable)
index 0000000..e80df0b
--- /dev/null
@@ -0,0 +1,476 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * (C) Copyright 2007 Gary Jennejohn garyj@denx.de
+ * Modified to use the routines in cpu/arm720t/lpc2292/flash.c.
+ * Heavily modified to support the SMN42 board from Siemens
+ *
+ * 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>
+#include <asm/byteorder.h>
+#include <asm/arch/hardware.h>
+
+static unsigned long flash_addr_table[CFG_MAX_FLASH_BANKS] 
+                                               = CFG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+extern int lpc2292_copy_buffer_to_flash(flash_info_t *, ulong);
+extern int lpc2292_flash_erase(flash_info_t *, int, int);
+extern int lpc2292_write_buff (flash_info_t *, uchar *, ulong, ulong);
+static unsigned long ext_flash_init(void);
+static int ext_flash_erase(flash_info_t *, int, int);
+static int ext_write_buff(flash_info_t *, uchar *, ulong, ulong);
+
+/*-----------------------------------------------------------------------
+ */
+
+ulong flash_init (void)
+{
+       int j, k;
+       ulong size = 0;
+       ulong flashbase = 0;
+
+       flash_info[0].flash_id = PHILIPS_LPC2292;
+       flash_info[0].size = 0x003E000; /* 256 - 8 KB */
+       flash_info[0].sector_count = 17;
+       memset (flash_info[0].protect, 0, 17);
+       flashbase = 0x00000000;
+       for (j = 0, k = 0; j < 8; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00002000;
+       }
+       for (j = 0; j < 2; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00010000;
+       }
+       for (j = 0; j < 7; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00002000;
+       }
+       size += flash_info[0].size;
+
+       /* Protect monitor and environment sectors */
+       flash_protect (FLAG_PROTECT_SET,
+                0x0,
+                0x0 + monitor_flash_len - 1,
+                &flash_info[0]);
+
+       flash_protect (FLAG_PROTECT_SET,
+                CFG_ENV_ADDR,
+                CFG_ENV_ADDR + CFG_ENV_SIZE - 1,
+                &flash_info[0]);
+
+       size += ext_flash_init();
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+       int erased = 0;
+       unsigned long j;
+       unsigned long count;
+       unsigned char *p;
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case (PHILIPS_LPC2292 & FLASH_VENDMASK):
+               printf("Philips: ");
+               break;
+       case FLASH_MAN_AMD:
+               printf("AMD: ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case (PHILIPS_LPC2292 & FLASH_TYPEMASK):
+               printf("LPC2292 internal flash\n");
+               break;
+       case FLASH_S29GL128N:
+               printf ("S29GL128N (128 Mbit, uniform sector size)\n");
+               break;
+       default:
+               printf("Unknown Chip Type\n");
+               return;
+       }
+
+       printf ("  Size: %ld KB in %d Sectors\n",
+         info->size >> 10, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; i++) {
+               if ((i % 5) == 0) {
+                       printf ("\n   ");
+               }
+               if (i < (info->sector_count - 1)) {
+                       count = info->start[i+1] - info->start[i];
+               }
+               else {
+                       count = info->start[0] + info->size - info->start[i];
+               }
+               p = (unsigned char*)(info->start[i]);
+               erased = 1;
+               for (j = 0; j < count; j++) {
+                       if (*p != 0xFF) {
+                               erased = 0;
+                               break;
+                       }
+                       p++;
+               }
+               printf (" %08lX%s%s", info->start[i], info->protect[i] ? " RO" : "   ",
+                       erased ? " E" : "  ");
+       }
+       printf ("\n");
+}
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       switch (info->flash_id & FLASH_TYPEMASK) {
+               case (PHILIPS_LPC2292 & FLASH_TYPEMASK):
+                       return lpc2292_flash_erase(info, s_first, s_last);
+               case FLASH_S29GL128N:
+                       return ext_flash_erase(info, s_first, s_last);
+               default:
+                       return ERR_PROTECTED;
+       }
+       return ERR_PROTECTED;
+}
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       switch (info->flash_id & FLASH_TYPEMASK) {
+               case (PHILIPS_LPC2292 & FLASH_TYPEMASK):
+                       return lpc2292_write_buff(info, src, addr, cnt);
+               case FLASH_S29GL128N:
+                       return ext_write_buff(info, src, addr, cnt);
+               default:
+                       return ERR_PROG_ERROR;
+       }
+       return ERR_PROG_ERROR;
+}
+
+/*--------------------------------------------------------------------------
+ * From here on is code for the external S29GL128N taken from cam5200_flash.c
+ */
+
+#define CFG_FLASH_WORD_SIZE unsigned short
+
+static int wait_for_DQ7_32(flash_info_t * info, int sect)
+{
+       ulong start, now, last;
+       volatile CFG_FLASH_WORD_SIZE *addr =
+               (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
+
+       start = get_timer(0);
+       last = start;
+       while ((addr[0] & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
+                       (CFG_FLASH_WORD_SIZE) 0x00800080) {
+               if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
+                       printf("Timeout\n");
+                       return -1;
+               }
+               /* show that we're waiting */
+               if ((now - last) > 1000) {      /* every second */
+                       putc('.');
+                       last = now;
+               }
+       }
+       return 0;
+}
+
+int ext_flash_erase(flash_info_t * info, int s_first, int s_last)
+{
+       volatile CFG_FLASH_WORD_SIZE *addr = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
+       volatile CFG_FLASH_WORD_SIZE *addr2;
+       int flag, prot, sect, l_sect, ret;
+
+       ret = 0;
+       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_UNKNOWN) {
+               printf("Can't erase unknown flash type - aborted\n");
+               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!", prot);
+
+       printf("\n");
+
+       l_sect = -1;
+
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts();
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last; sect++) {
+               if (info->protect[sect] == 0) { /* not protected */
+                       addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[sect]);
+
+                       addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
+                       addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
+                       addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00800080;
+                       addr[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
+                       addr[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
+                       addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00300030;    /* sector erase */
+
+                       l_sect = sect;
+                       /*
+                        * Wait for each sector to complete, it's more
+                        * reliable.  According to AMD Spec, you must
+                        * issue all erase commands within a specified
+                        * timeout.  This has been seen to fail, especially
+                        * if printf()s are included (for debug)!!
+                        */
+                       ret = wait_for_DQ7_32(info, sect);
+                       if (ret) {
+                               ret = ERR_PROTECTED;
+                               break;
+                       }
+               }
+       }
+
+       /* re-enable interrupts if necessary */
+       if (flag)
+               enable_interrupts();
+
+       /* wait at least 80us - let's wait 1 ms */
+       udelay(1000);
+
+       /* reset to read mode */
+       addr = (CFG_FLASH_WORD_SIZE *) info->start[0];
+       addr[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0;     /* reset bank */
+
+       if (ret)
+               printf(" error\n");
+       else
+               printf(" done\n");
+       return ret;
+}
+
+static ulong flash_get_size(vu_long * addr, flash_info_t * info)
+{
+       short i;
+       CFG_FLASH_WORD_SIZE value;
+       ulong base = (ulong) addr;
+       volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) addr;
+
+       /* Write auto select command: read Manufacturer ID */
+       addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
+       addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
+       addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00900090;
+       udelay(1000);
+
+       value = addr2[0];
+
+       switch (value) {
+               case (CFG_FLASH_WORD_SIZE) AMD_MANUFACT:
+                       info->flash_id = FLASH_MAN_AMD;
+                       break;
+               default:
+                       info->flash_id = FLASH_UNKNOWN;
+                       info->sector_count = 0;
+                       info->size = 0;
+                       return (0);     /* no or unknown flash  */
+       }
+
+       value = addr2[1];       /* device ID            */
+
+       switch (value) {
+               case (CFG_FLASH_WORD_SIZE)AMD_ID_MIRROR:
+                       value = addr2[14];
+                       switch(value) {
+                               case (CFG_FLASH_WORD_SIZE)AMD_ID_GL128N_2:
+                                       value = addr2[15];
+                                       if (value != (CFG_FLASH_WORD_SIZE)AMD_ID_GL128N_3) {
+                                               info->flash_id = FLASH_UNKNOWN;
+                                       } else {
+                                               info->flash_id += FLASH_S29GL128N;
+                                               info->sector_count = 128;
+                                               info->size = 0x01000000;
+                                       }
+                                       break;
+                               default:
+                                       info->flash_id = FLASH_UNKNOWN;
+                                       return(0);
+                       }
+                       break;
+
+               default:
+                       info->flash_id = FLASH_UNKNOWN;
+                       return (0);     /* => no or unknown flash */
+       }
+
+       /* set up sector start address table */
+       for (i = 0; i < info->sector_count; i++)
+               info->start[i] = base + (i * 0x00020000);
+
+       /* check for protected sectors */
+       for (i = 0; i < info->sector_count; i++) {
+               /* read sector protection at sector address, (A7 .. A0) = 0x02 */
+               /* D0 = 1 if protected */
+               addr2 = (volatile CFG_FLASH_WORD_SIZE *)(info->start[i]);
+
+               info->protect[i] = addr2[2] & 1;
+       }
+
+       /* issue bank reset to return to read mode */
+       addr2[0] = (CFG_FLASH_WORD_SIZE) 0x00F000F0;
+
+       return (info->size);
+}
+
+static unsigned long ext_flash_init(void)
+{
+       unsigned long total_b = 0;
+       unsigned long size_b[CFG_MAX_FLASH_BANKS];
+       int i;
+
+       /* Init: no FLASHes known */
+       for (i = 1; i < CFG_MAX_FLASH_BANKS; ++i) {
+               flash_info[i].flash_id = FLASH_UNKNOWN;
+               flash_info[i].sector_count = -1;
+               flash_info[i].size = 0;
+
+               /* call flash_get_size() to initialize sector address */
+               size_b[i] = flash_get_size((vu_long *) flash_addr_table[i],
+                               &flash_info[i]);
+
+               flash_info[i].size = size_b[i];
+
+               if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+                       printf("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+                                       i+1, size_b[i], size_b[i] << 20);
+                       flash_info[i].sector_count = -1;
+                       flash_info[i].size = 0;
+               }
+
+               total_b += flash_info[i].size;
+       }
+
+       return total_b;
+}
+
+static int write_word(flash_info_t * info, ulong dest, ushort data)
+{
+       volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *) (info->start[0]);
+       volatile CFG_FLASH_WORD_SIZE *dest2 = (CFG_FLASH_WORD_SIZE *) dest;
+       volatile CFG_FLASH_WORD_SIZE *data2 = (CFG_FLASH_WORD_SIZE *) &data;
+       ulong start;
+       int flag;
+
+       /* Check if Flash is (sufficiently) erased */
+       if ((*dest2 & *data2) != *data2) {
+               return (2);
+       }
+
+       /* Disable interrupts which might cause a timeout here */
+       flag = disable_interrupts();
+
+       addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00AA00AA;
+       addr2[CFG_FLASH_ADDR1] = (CFG_FLASH_WORD_SIZE) 0x00550055;
+       addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE) 0x00A000A0;
+       *dest2 = *data2;
+
+       /* re-enable interrupts if necessary */
+       if (flag)
+               enable_interrupts();
+
+       /* data polling for D7 */
+       start = get_timer(0);
+       while ((*dest2 & (CFG_FLASH_WORD_SIZE) 0x00800080) !=
+                       (*data2 & (CFG_FLASH_WORD_SIZE) 0x00800080)) {
+
+               if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
+                       printf("WRITE_TOUT\n");
+                       return (1);
+               }
+       }
+       return (0);
+}
+
+/*-----------------------------------------------------------------------
+ * This is taken from the original flash.c for the LPC2292 SODIMM board
+ * and modified to suit.
+ */
+
+int ext_write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ushort tmp;
+       ulong i;
+       uchar* src_org;
+       uchar* dst_org;
+       ulong cnt_org = cnt;
+       int ret = ERR_OK;
+
+       src_org = src;
+       dst_org = (uchar*)addr;
+
+       if (addr & 1) {         /* if odd address */
+               tmp = *((uchar*)(addr - 1)); /* little endian */
+               tmp |= (*src << 8);
+               if (write_word(info, addr - 1, tmp))
+                       return ERR_PROG_ERROR;
+               addr += 1;
+               cnt -= 1;
+               src++;
+       }
+       while (cnt > 1) {
+               tmp = ((*(src+1)) << 8) + (*src); /* little endian */
+               if (write_word(info, addr, tmp))
+                       return ERR_PROG_ERROR;
+               addr += 2;
+               src += 2;
+               cnt -= 2;
+       }
+       if (cnt > 0) {
+               tmp = (*((uchar*)(addr + 1))) << 8;
+               tmp |= *src;
+               if (write_word(info, addr, tmp))
+                       return ERR_PROG_ERROR;
+       }
+
+       for (i = 0; i < cnt_org; i++) {
+               if (*dst_org != *src_org) {
+                       printf("Write failed. Byte %lX differs\n", i);
+                       ret = ERR_PROG_ERROR;
+                       break;
+               }
+               dst_org++;
+               src_org++;
+       }
+
+       return ret;
+}
diff --git a/board/siemens/SMN42/lowlevel_init.S b/board/siemens/SMN42/lowlevel_init.S
new file mode 100644 (file)
index 0000000..11abb63
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * Slight modifications made to support the SMN42 board from Siemens.
+ * 2007 Gary Jennejohn garyj@denx.de
+ *
+ * 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 <config.h>
+#include <version.h>
+#include <asm/arch/hardware.h>
+
+/* some parameters for the board */
+/* setting up the CPU-internal memory */
+#define        SRAM_START      0x40000000
+#define        SRAM_SIZE       0x00004000
+#define   BCFG0_VALUE 0x1000ffef
+#define   BCFG1_VALUE 0x10005D2F
+#define   BCFG2_VALUE 0x10005D2F
+/*
+ * For P0.18 to set ZZ to the SRAMs to 1. Also set P0.2 (SCL) and P0.3 (SDA)
+ * for the bit-banger I2C driver correctly.
+ */
+#define   IO0_VALUE   0x4000C
+
+_TEXT_BASE:
+       .word   TEXT_BASE
+MEMMAP_ADR:
+       .word   MEMMAP
+BCFG0_ADR:
+       .word BCFG0
+_BCFG0_VALUE:
+       .word BCFG0_VALUE
+BCFG1_ADR:
+       .word   BCFG1
+_BCFG1_VALUE:
+       .word   BCFG1_VALUE
+BCFG2_ADR:
+       .word   BCFG2
+_BCFG2_VALUE:
+       .word   BCFG2_VALUE
+IO0DIR_ADR:
+       .word   IO0DIR
+_IO0DIR_VALUE:
+       .word   IO0_VALUE
+IO0SET_ADR:
+       .word   IO0SET
+_IO0SET_VALUE:
+       .word   IO0_VALUE
+PINSEL2_ADR:
+       .word   PINSEL2
+PINSEL2_MASK:
+       .word   0x00000000
+PINSEL2_VALUE:
+       .word   0x0F804914
+
+.extern _start
+
+.globl lowlevel_init
+lowlevel_init:
+       /* set up memory control register for bank 0 */
+       ldr r0, _BCFG0_VALUE
+       ldr r1, BCFG0_ADR
+       str r0, [r1]
+
+       /* set up memory control register for bank 1 */
+       ldr     r0, _BCFG1_VALUE
+       ldr     r1, BCFG1_ADR
+       str     r0, [r1]
+
+       /* set up memory control register for bank 2 */
+       ldr     r0, _BCFG2_VALUE
+       ldr     r1, BCFG2_ADR
+       str     r0, [r1]
+
+       /* set IO0DIR to make P0.2, P0.3  and P0.18 outputs */
+       ldr     r0, _IO0DIR_VALUE
+       ldr     r1, IO0DIR_ADR
+       str     r0, [r1]
+
+       /* set P0.18 to 1 */
+       ldr     r0, _IO0SET_VALUE
+       ldr     r1, IO0SET_ADR
+       str     r0, [r1]
+
+       /* set up PINSEL2 for bus-pins */
+       ldr     r0, PINSEL2_ADR
+       ldr     r1, [r0]
+       ldr     r2, PINSEL2_MASK
+       ldr     r3, PINSEL2_VALUE
+       and     r1, r1, r2
+       orr     r1, r1, r3
+       str     r1, [r0]
+
+       /* move vectors to beginning of SRAM */
+       mov     r2, #SRAM_START
+       mov     r0, #0 /*_start*/
+       ldmneia r0!, {r3-r10}
+       stmneia r2!, {r3-r10}
+       ldmneia r0, {r3-r9}
+       stmneia r2, {r3-r9}
+
+       /* Set-up MEMMAP register, so vectors are taken from SRAM */
+       ldr     r0, MEMMAP_ADR
+       mov     r1, #0x02       /* vectors re-mapped to static RAM */
+       str     r1, [r0]
+
+       /* everything is fine now */
+       mov     pc, lr
diff --git a/board/siemens/SMN42/smn42.c b/board/siemens/SMN42/smn42.c
new file mode 100644 (file)
index 0000000..cbfc76c
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2005 Rowel Atienza <rowel@diwalabs.com>
+ * Armadillo board HT1070
+ *
+ * (C) Copyright 2007 Gary Jennejohn <garyj@denx.de>
+ * Siemens board SMN42
+ *
+ * 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>
+#include <clps7111.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /* arch number MACH_TYPE_ARMADILLO - not official*/
+       gd->bd->bi_arch_number = 83;
+
+       /* location of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x00000100;
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+       return (0);
+}
similarity index 54%
rename from cpu/microblaze/disable_int.S
rename to board/siemens/SMN42/u-boot.lds
index aecd795..64d946c 100644 (file)
@@ -1,7 +1,6 @@
 /*
- * (C) Copyright 2007 Michal Simek
- *
- * Michal  SIMEK <monstr@monstr.eu>
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -13,7 +12,7 @@
  *
  * 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
+ * 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
  * MA 02111-1307 USA
  */
 
-       .text
-       .globl  microblaze_disable_interrupts
-       .ent    microblaze_disable_interrupts
-       .align  2
-microblaze_disable_interrupts:
-       #Make space on stack for a temporary
-       addi    r1, r1, -4
-       #Save register r12
-       swi     r12, r1, 0
-       #Read the MSR register
-       mfs     r12, rmsr
-       #Clear the interrupt enable bit
-       andi    r12, r12, ~2
-       #Save the MSR register
-       mts     rmsr, r12
-       #Load register r12
-       lwi     r12, r1, 0
-       #Return
-       rtsd    r15, 8
-       #Update stack in the delay slot
-       addi    r1, r1, 4
-       .end    microblaze_disable_interrupts
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         cpu/arm720t/start.o   (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss : { *(.bss) }
+       _end = .;
+}
index 30f42c5..5f4fc74 100644 (file)
 # MA 02111-1307 USA
 #
 
-#
 # default CCARBAR is at 0xff700000
 # assume U-Boot is less than 0.5MB
 # U-Boot is less than 256K, so push
 # it further up into the flash
 #
-TEXT_BASE = 0xfffC0000
+TEXT_BASE = 0xFFFC0000
 
 PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1
 PLATFORM_CPPFLAGS += -DCONFIG_E500=1
index 807f169..c75daaf 100644 (file)
@@ -25,7 +25,7 @@
 # Version: Xilinx EDK 6.3 EDK_Gmm.12.3
 #
 
-TEXT_BASE = 0x12000000
+TEXT_BASE = 0x29000000
 
 PLATFORM_CPPFLAGS += -mno-xl-soft-mul
 PLATFORM_CPPFLAGS += -mno-xl-soft-div
index b48103f..955936d 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <common.h>
 #include <config.h>
+#include <asm/microblaze_intc.h>
+#include <asm/asm.h>
 
 void do_reset (void)
 {
@@ -43,7 +45,25 @@ void do_reset (void)
 int gpio_init (void)
 {
 #ifdef CFG_GPIO_0
-       *((unsigned long *)(CFG_GPIO_0_ADDR)) = 0x0;
+       *((unsigned long *)(CFG_GPIO_0_ADDR)) = 0xFFFFFFFF;
 #endif
        return 0;
 }
+
+#ifdef CFG_FSL_2
+void fsl_isr2 (void *arg) {
+       volatile int num;
+       *((unsigned int *)(CFG_GPIO_0_ADDR + 0x4)) =
+           ++(*((unsigned int *)(CFG_GPIO_0_ADDR + 0x4)));
+       GET (num, 2);
+       NGET (num, 2);
+       puts("*");
+}
+
+void fsl_init2 (void) {
+       puts("fsl_init2\n");
+       install_interrupt_handler (FSL_INTR_2,\
+ fsl_isr2,\
+ NULL);
+}
+#endif
old mode 100644 (file)
new mode 100755 (executable)
index 18d24f9..1a116ea
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  *
- *
  * CAUTION: This file is automatically generated by libgen.
- * Version: Xilinx EDK 6.3 EDK_Gmm.12.3
+ * Version: Xilinx EDK 8.2.02 EDK_Im_Sp2.4
  */
 
 /* System Clock Frequency */
-#define XILINX_CLOCK_FREQ      66666667
+#define XILINX_CLOCK_FREQ      100000000
+
+/* Microblaze is microblaze_0 */
+#define XILINX_USE_MSR_INSTR   1
+#define XILINX_FSL_NUMBER      3
 
-/* Interrupt controller is intc_0 */
-#define XILINX_INTC_BASEADDR   0xd1000fc0
-#define XILINX_INTC_NUM_INTR_INPUTS    12
+/* Interrupt controller is opb_intc_0 */
+#define XILINX_INTC_BASEADDR   0x41200000
+#define XILINX_INTC_NUM_INTR_INPUTS    6
 
-/* Timer pheriphery is opb_timer_0 */
-#define XILINX_TIMER_BASEADDR  0xa2000000
+/* Timer pheriphery is opb_timer_1 */
+#define XILINX_TIMER_BASEADDR  0x41c00000
 #define XILINX_TIMER_IRQ       0
 
-/* Uart pheriphery is console_uart */
-#define XILINX_UART_BASEADDR   0xa0000000
+/* Uart pheriphery is RS232_Uart */
+#define XILINX_UART_BASEADDR   0x40600000
 #define XILINX_UART_BAUDRATE   115200
 
-/* GPIO is opb_gpio_0*/
-#define XILINX_GPIO_BASEADDR   0x90000000
+/* IIC pheriphery is IIC_EEPROM */
+#define XILINX_IIC_0_BASEADDR  0x40800000
+#define XILINX_IIC_0_FREQ      100000
+#define XILINX_IIC_0_BIT       0
+
+/* GPIO is LEDs_4Bit*/
+#define XILINX_GPIO_BASEADDR   0x40000000
 
-/* Flash Memory is opb_emc_0 */
-#define XILINX_FLASH_START     0x28000000
+/* Flash Memory is FLASH_2Mx32 */
+#define XILINX_FLASH_START     0x2c000000
 #define XILINX_FLASH_SIZE      0x00800000
 
-/* Main Memory is plb_ddr_0 */
-#define XILINX_RAM_START       0x10000000
-#define XILINX_RAM_SIZE        0x10000000
+/* Main Memory is DDR_SDRAM_64Mx32 */
+#define XILINX_RAM_START       0x28000000
+#define XILINX_RAM_SIZE        0x04000000
 
-/* Sysace Controller is opb_sysace_0 */
-#define XILINX_SYSACE_BASEADDR 0xCF000000
-#define XILINX_SYSACE_HIGHADDR 0xCF0001FF
+/* Sysace Controller is SysACE_CompactFlash */
+#define XILINX_SYSACE_BASEADDR 0x41800000
+#define XILINX_SYSACE_HIGHADDR 0x4180ffff
 #define XILINX_SYSACE_MEM_WIDTH        16
 
-/* Ethernet controller is opb_ethernet_0 */
+/* Ethernet controller is Ethernet_MAC */
 #define XPAR_XEMAC_NUM_INSTANCES       1
 #define XPAR_OPB_ETHERNET_0_DEVICE_ID  0
-#define XPAR_OPB_ETHERNET_0_BASEADDR   0x60000000
-#define XPAR_OPB_ETHERNET_0_HIGHADDR   0x60003FFF
+#define XPAR_OPB_ETHERNET_0_BASEADDR   0x40c00000
+#define XPAR_OPB_ETHERNET_0_HIGHADDR   0x40c0ffff
 #define XPAR_OPB_ETHERNET_0_DMA_PRESENT        1
 #define XPAR_OPB_ETHERNET_0_ERR_COUNT_EXIST    1
 #define XPAR_OPB_ETHERNET_0_MII_EXIST  1
index 5dfd3a8..bc1f714 100644 (file)
@@ -50,7 +50,7 @@ COBJS = main.o ACEX1K.o altera.o bedbug.o circbuf.o cmd_autoscript.o \
          memsize.o miiphybb.o miiphyutil.o \
          s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o spartan3.o \
          usb.o usb_kbd.o usb_storage.o \
-         virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o
+         virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o cmd_mfsl.o
 
 SRCS   := $(AOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(AOBJS) $(COBJS))
diff --git a/common/cmd_mfsl.c b/common/cmd_mfsl.c
new file mode 100644 (file)
index 0000000..ffa2666
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * 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
+ */
+
+/*
+ * Microblaze FSL support
+ */
+
+#include <common.h>
+#include <config.h>
+#include <command.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_MFSL)
+#include <asm/asm.h>
+
+int do_frd (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int fslnum;
+       unsigned int num;
+       unsigned int blocking;
+
+       if (argc < 2) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       blocking = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
+               puts ("Bad number of FSL\n");
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       switch (fslnum) {
+#if (XILINX_FSL_NUMBER > 0)
+       case 0:
+               switch (blocking) {
+               case 0: NGET (num, 0);
+                       break;
+               case 1: NCGET (num, 0);
+                       break;
+               case 2: GET (num, 0);
+                       break;
+               case 3: CGET (num, 0);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 1)
+       case 1:
+               switch (blocking) {
+               case 0: NGET (num, 1);
+                       break;
+               case 1: NCGET (num, 1);
+                       break;
+               case 2: GET (num, 1);
+                       break;
+               case 3: CGET (num, 1);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 2)
+       case 2:
+               switch (blocking) {
+               case 0: NGET (num, 2);
+                       break;
+               case 1: NCGET (num, 2);
+                       break;
+               case 2: GET (num, 2);
+                       break;
+               case 3: CGET (num, 2);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 3)
+       case 3:
+               switch (blocking) {
+               case 0: NGET (num, 3);
+                       break;
+               case 1: NCGET (num, 3);
+                       break;
+               case 2: GET (num, 3);
+                       break;
+               case 3: CGET (num, 3);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 4)
+       case 4:
+               switch (blocking) {
+               case 0: NGET (num, 4);
+                       break;
+               case 1: NCGET (num, 4);
+                       break;
+               case 2: GET (num, 4);
+                       break;
+               case 3: CGET (num, 4);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 5)
+       case 5:
+               switch (blocking) {
+               case 0: NGET (num, 5);
+                       break;
+               case 1: NCGET (num, 5);
+                       break;
+               case 2: GET (num, 5);
+                       break;
+               case 3: CGET (num, 5);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 6)
+       case 6:
+               switch (blocking) {
+               case 0: NGET (num, 6);
+                       break;
+               case 1: NCGET (num, 6);
+                       break;
+               case 2: GET (num, 6);
+                       break;
+               case 3: CGET (num, 6);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 7)
+       case 7:
+               switch (blocking) {
+               case 0: NGET (num, 7);
+                       break;
+               case 1: NCGET (num, 7);
+                       break;
+               case 2: GET (num, 7);
+                       break;
+               case 3: CGET (num, 7);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+       default:
+               return 1;
+       }
+
+       printf ("%01x: 0x%08lx - %s %s read\n", fslnum, num,
+               blocking < 2  ? "non blocking" : "blocking",
+               ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
+       return 0;
+}
+
+int do_fwr (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int fslnum;
+       unsigned int num;
+       unsigned int blocking;
+
+       if (argc < 3) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       num = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       blocking = (unsigned int)simple_strtoul (argv[3], NULL, 16);
+       if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
+               printf ("Bad number of FSL\nUsage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       switch (fslnum) {
+#if (XILINX_FSL_NUMBER > 0)
+       case 0:
+               switch (blocking) {
+               case 0: NPUT (num, 0);
+                       break;
+               case 1: NCPUT (num, 0);
+                       break;
+               case 2: PUT (num, 0);
+                       break;
+               case 3: CPUT (num, 0);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 1)
+       case 1:
+               switch (blocking) {
+               case 0: NPUT (num, 1);
+                       break;
+               case 1: NCPUT (num, 1);
+                       break;
+               case 2: PUT (num, 1);
+                       break;
+               case 3: CPUT (num, 1);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 2)
+       case 2:
+               switch (blocking) {
+               case 0: NPUT (num, 2);
+                       break;
+               case 1: NCPUT (num, 2);
+                       break;
+               case 2: PUT (num, 2);
+                       break;
+               case 3: CPUT (num, 2);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 3)
+       case 3:
+               switch (blocking) {
+               case 0: NPUT (num, 3);
+                       break;
+               case 1: NCPUT (num, 3);
+                       break;
+               case 2: PUT (num, 3);
+                       break;
+               case 3: CPUT (num, 3);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 4)
+       case 4:
+               switch (blocking) {
+               case 0: NPUT (num, 4);
+                       break;
+               case 1: NCPUT (num, 4);
+                       break;
+               case 2: PUT (num, 4);
+                       break;
+               case 3: CPUT (num, 4);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 5)
+       case 5:
+               switch (blocking) {
+               case 0: NPUT (num, 5);
+                       break;
+               case 1: NCPUT (num, 5);
+                       break;
+               case 2: PUT (num, 5);
+                       break;
+               case 3: CPUT (num, 5);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 6)
+       case 6:
+               switch (blocking) {
+               case 0: NPUT (num, 6);
+                       break;
+               case 1: NCPUT (num, 6);
+                       break;
+               case 2: PUT (num, 6);
+                       break;
+               case 3: CPUT (num, 6);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 7)
+       case 7:
+               switch (blocking) {
+               case 0: NPUT (num, 7);
+                       break;
+               case 1: NCPUT (num, 7);
+                       break;
+               case 2: PUT (num, 7);
+                       break;
+               case 3: CPUT (num, 7);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+       default:
+               return 1;
+       }
+
+       printf ("%01x: 0x%08lx - %s %s write\n", fslnum, num,
+               blocking < 2  ? "non blocking" : "blocking",
+               ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
+       return 0;
+
+}
+
+int do_rspr (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int reg = 0;
+       unsigned int val = 0;
+
+       reg = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       val = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       if (argc < 1) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+       switch (reg) {
+       case 0x1:
+               if (argc > 2) {
+                       MTS (val, rmsr);
+                       NOP;
+                       MFS (val, rmsr);
+
+               } else {
+                       MFS (val, rmsr);
+               }
+               puts ("MSR");
+               break;
+       case 0x3:
+               MFS (val, rear);
+               puts ("EAR");
+               break;
+       case 0x5:
+               MFS (val, resr);
+               puts ("ESR");
+               break;
+       default:
+               return 1;
+       }
+       printf (": 0x%08lx\n", val);
+       return 0;
+}
+
+/***************************************************/
+
+U_BOOT_CMD (frd, 3, 1, do_frd,
+               "frd     - read data from FSL\n",
+               "- [fslnum [0|1|2|3]]\n"
+               " 0 - non blocking data read\n"
+               " 1 - non blocking control read\n"
+               " 2 - blocking data read\n"
+               " 3 - blocking control read\n");
+
+
+U_BOOT_CMD (fwr, 4, 1, do_fwr,
+               "fwr     - write data to FSL\n",
+               "- [fslnum [0|1|2|3]]\n"
+               " 0 - non blocking data write\n"
+               " 1 - non blocking control write\n"
+               " 2 - blocking data write\n"
+               " 3 - blocking control write\n");
+
+U_BOOT_CMD (rspr, 3, 1, do_rspr,
+               "rmsr    - read/write special purpose register\n",
+               "- reg_num [write value] read/write special purpose register\n"
+               " 0 - MSR - Machine status register\n"
+               " 1 - EAR - Exception address register\n"
+               " 2 - ESR - Exception status register\n");
+
+#endif                         /* CONFIG_MICROBLAZE & CFG_CMD_MFSL */
index d8c0054..09ee64b 100644 (file)
@@ -1191,6 +1191,8 @@ static void process_macros (const char *input, char *output)
 
        if (outputcnt)
                *output = 0;
+       else
+               *(output - 1) = 0;
 
 #ifdef DEBUG_PARSER
        printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",
index edad51b..0f6e3a9 100644 (file)
@@ -36,6 +36,9 @@
 #ifdef CONFIG_IXP425                   /* only valid for IXP425 */
 #include <asm/arch/ixp425.h>
 #endif
+#ifdef CONFIG_LPC2292
+#include <asm/arch/hardware.h>
+#endif
 #include <i2c.h>
 
 #if defined(CONFIG_SOFT_I2C)
diff --git a/cpu/arm720t/lpc2292/Makefile b/cpu/arm720t/lpc2292/Makefile
new file mode 100644 (file)
index 0000000..240f1e3
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2000-2007
+# 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    = $(obj)lib$(SOC).a
+
+COBJS  = flash.o mmc.o mmc_hw.o spi.o
+SOBJS  = $(obj)iap_entry.o
+
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+all:   $(obj).depend $(LIB)
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+# this MUST be compiled as thumb code!
+$(SOBJS):
+       $(CC) $(AFLAGS) -march=armv4t -c -o $(SOBJS) iap_entry.S
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/arm720t/lpc2292/flash.c b/cpu/arm720t/lpc2292/flash.c
new file mode 100644 (file)
index 0000000..e5c8697
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * Modified to remove all but the IAP-command related code by
+ * Gary Jennejohn <garyj@denx.de>
+ *
+ * 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>
+#include <asm/arch/hardware.h>
+
+/* IAP commands use 32 bytes at the top of CPU internal sram, we
+   use 512 bytes below that */
+#define COPY_BUFFER_LOCATION 0x40003de0
+
+#define IAP_LOCATION 0x7ffffff1
+#define IAP_CMD_PREPARE 50
+#define IAP_CMD_COPY 51
+#define IAP_CMD_ERASE 52
+#define IAP_CMD_CHECK 53
+#define IAP_CMD_ID 54
+#define IAP_CMD_VERSION 55
+#define IAP_CMD_COMPARE 56
+
+#define IAP_RET_CMD_SUCCESS 0
+
+static unsigned long command[5];
+static unsigned long result[2];
+
+extern void iap_entry(unsigned long * command, unsigned long * result);
+
+/*-----------------------------------------------------------------------
+ *
+ */
+static int get_flash_sector(flash_info_t * info, ulong flash_addr)
+{
+       int i;
+
+       for(i = 1; i < (info->sector_count); i++) {
+               if (flash_addr < (info->start[i]))
+                       break;
+       }
+
+       return (i-1);
+}
+
+/*-----------------------------------------------------------------------
+ * This function assumes that flash_addr is aligned on 512 bytes boundary
+ * in flash. This function also assumes that prepare have been called
+ * for the sector in question.
+ */
+int lpc2292_copy_buffer_to_flash(flash_info_t * info, ulong flash_addr)
+{
+       int first_sector;
+       int last_sector;
+
+       first_sector = get_flash_sector(info, flash_addr);
+       last_sector = get_flash_sector(info, flash_addr + 512 - 1);
+
+       /* prepare sectors for write */
+       command[0] = IAP_CMD_PREPARE;
+       command[1] = first_sector;
+       command[2] = last_sector;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP prepare failed\n");
+               return ERR_PROG_ERROR;
+       }
+
+       command[0] = IAP_CMD_COPY;
+       command[1] = flash_addr;
+       command[2] = COPY_BUFFER_LOCATION;
+       command[3] = 512;
+       command[4] = CFG_SYS_CLK_FREQ >> 10;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP copy failed\n");
+               return 1;
+       }
+
+       return 0;
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+int lpc2292_flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       int flag;
+       int prot;
+       int sect;
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+       if (prot)
+               return ERR_PROTECTED;
+
+
+       flag = disable_interrupts();
+
+       printf ("Erasing %d sectors starting at sector %2d.\n"
+       "This make take some time ... ",
+       s_last - s_first + 1, s_first);
+
+       command[0] = IAP_CMD_PREPARE;
+       command[1] = s_first;
+       command[2] = s_last;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP prepare failed\n");
+               return ERR_PROTECTED;
+       }
+
+       command[0] = IAP_CMD_ERASE;
+       command[1] = s_first;
+       command[2] = s_last;
+       command[3] = CFG_SYS_CLK_FREQ >> 10;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP erase failed\n");
+               return ERR_PROTECTED;
+       }
+
+       if (flag)
+               enable_interrupts();
+
+       return ERR_OK;
+}
+
+int lpc2292_write_buff (flash_info_t * info, uchar * src, ulong addr,
+                       ulong cnt)
+{
+       int first_copy_size;
+       int last_copy_size;
+       int first_block;
+       int last_block;
+       int nbr_mid_blocks;
+       uchar memmap_value;
+       ulong i;
+       uchar* src_org;
+       uchar* dst_org;
+       int ret = ERR_OK;
+
+       src_org = src;
+       dst_org = (uchar*)addr;
+
+       first_block = addr / 512;
+       last_block = (addr + cnt) / 512;
+       nbr_mid_blocks = last_block - first_block - 1;
+
+       first_copy_size = 512 - (addr % 512);
+       last_copy_size = (addr + cnt) % 512;
+
+       debug("\ncopy first block: (1) %lX -> %lX 0x200 bytes, "
+               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX 0x200 bytes\n",
+       (ulong)(first_block * 512),
+       (ulong)COPY_BUFFER_LOCATION,
+       (ulong)src,
+       (ulong)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
+       first_copy_size,
+       (ulong)COPY_BUFFER_LOCATION,
+       (ulong)(first_block * 512));
+
+       /* copy first block */
+       memcpy((void*)COPY_BUFFER_LOCATION,
+               (void*)(first_block * 512), 512);
+       memcpy((void*)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
+               src, first_copy_size);
+       lpc2292_copy_buffer_to_flash(info, first_block * 512);
+       src += first_copy_size;
+       addr += first_copy_size;
+
+       /* copy middle blocks */
+       for (i = 0; i < nbr_mid_blocks; i++) {
+               debug("copy middle block: %lX -> %lX 512 bytes, "
+               "%lX -> %lX 512 bytes\n",
+               (ulong)src,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)addr);
+
+               memcpy((void*)COPY_BUFFER_LOCATION, src, 512);
+               lpc2292_copy_buffer_to_flash(info, addr);
+               src += 512;
+               addr += 512;
+       }
+
+
+       if (last_copy_size > 0) {
+               debug("copy last block: (1) %lX -> %lX 0x200 bytes, "
+               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX x200 bytes\n",
+               (ulong)(last_block * 512),
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)src,
+               (ulong)(COPY_BUFFER_LOCATION),
+               last_copy_size,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)addr);
+
+               /* copy last block */
+               memcpy((void*)COPY_BUFFER_LOCATION,
+                       (void*)(last_block * 512), 512);
+               memcpy((void*)COPY_BUFFER_LOCATION,
+                       src, last_copy_size);
+               lpc2292_copy_buffer_to_flash(info, addr);
+       }
+
+       /* verify write */
+       memmap_value = GET8(MEMMAP);
+
+       disable_interrupts();
+
+       PUT8(MEMMAP, 01);               /* we must make sure that initial 64
+                                                          bytes are taken from flash when we
+                                                          do the compare */
+
+       for (i = 0; i < cnt; i++) {
+               if (*dst_org != *src_org){
+                       printf("Write failed. Byte %lX differs\n", i);
+                       ret = ERR_PROG_ERROR;
+                       break;
+               }
+               dst_org++;
+               src_org++;
+       }
+
+       PUT8(MEMMAP, memmap_value);
+       enable_interrupts();
+
+       return ret;
+}
similarity index 97%
rename from board/lpc2292sodimm/mmc.c
rename to cpu/arm720t/lpc2292/mmc.c
index 1c0922f..fd7f149 100644 (file)
@@ -23,7 +23,7 @@
 #include <part.h>
 #include <fat.h>
 #include "mmc_hw.h"
-#include "spi.h"
+#include <asm/arch/spi.h>
 
 #ifdef CONFIG_MMC
 
@@ -44,7 +44,7 @@ block_dev_desc_t * mmc_get_dev(int dev)
 unsigned long mmc_block_read(int dev,
                             unsigned long start,
                             lbaint_t blkcnt,
-                            unsigned long *buffer)
+                            void *buffer)
 {
        unsigned long rc = 0;
        unsigned char *p = (unsigned char *)buffer;
@@ -101,6 +101,9 @@ int mmc_init(int verbose)
                printf("mmc_init\n");
 
        spi_init();
+       /* this meeds to be done twice */
+       mmc_hw_init();
+       udelay(1000);
        mmc_hw_init();
 
        mmc_hw_get_parameters();
similarity index 99%
rename from board/lpc2292sodimm/mmc_hw.c
rename to cpu/arm720t/lpc2292/mmc_hw.c
index 31f2a79..b4dc4a6 100644 (file)
@@ -20,7 +20,7 @@
 #include <config.h>
 #include <common.h>
 #include <asm/arch/hardware.h>
-#include "spi.h"
+#include <asm/arch/spi.h>
 
 #define MMC_Enable() PUT32(IO1CLR, 1l << 22)
 #define MMC_Disable() PUT32(IO1SET, 1l << 22)
similarity index 97%
rename from board/lpc2292sodimm/spi.c
rename to cpu/arm720t/lpc2292/spi.c
index 4ba1468..d296bda 100644 (file)
@@ -21,7 +21,7 @@
 #include <common.h>
 #include <asm/errno.h>
 #include <asm/arch/hardware.h>
-#include "spi.h"
+#include <asm/arch/spi.h>
 
 unsigned long spi_flags;
 unsigned char spi_idle = 0x00;
index db1afa5..9d54201 100644 (file)
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(CPU).a
 
 START  = start.o
-SOBJS  = dcache.o icache.o irq.o disable_int.o enable_int.o
+SOBJS  = irq.o
 COBJS  = cpu.o interrupts.o cache.o exception.o timer.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
old mode 100644 (file)
new mode 100755 (executable)
index fc388eb..4f36a84
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <asm/asm.h>
 
 #if (CONFIG_COMMANDS & CFG_CMD_CACHE)
 
@@ -45,4 +46,20 @@ int icache_status (void)
        __asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");
        return i;
 }
+
+void   icache_enable (void) {
+       MSRSET(0x20);
+}
+
+void   icache_disable(void) {
+       MSRCLR(0x20);
+}
+
+void   dcache_enable (void) {
+       MSRSET(0x80);
+}
+
+void   dcache_disable(void) {
+       MSRCLR(0x80);
+}
 #endif
diff --git a/cpu/microblaze/dcache.S b/cpu/microblaze/dcache.S
deleted file mode 100644 (file)
index eaf9671..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * (C) Copyright 2007 Michal Simek
- *
- * Michal  SIMEK <monstr@monstr.eu>
- *
- * 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
- */
-       .text
-       .globl  dcache_enable
-       .ent    dcache_enable
-       .align  2
-dcache_enable:
-       /* Make space on stack for a temporary */
-       addi    r1, r1, -4
-       /* Save register r12 */
-       swi     r12, r1, 0
-       /* Read the MSR register */
-       mfs     r12, rmsr
-       /* Set the instruction enable bit */
-       ori     r12, r12, 0x80
-       /* Save the MSR register */
-       mts     rmsr, r12
-       /* Load register r12 */
-       lwi     r12, r1, 0
-       /* Return */
-       rtsd    r15, 8
-       /* Update stack in the delay slot */
-       addi    r1, r1, 4
-       .end    dcache_enable
-
-       .text
-       .globl  dcache_disable
-       .ent    dcache_disable
-       .align  2
-dcache_disable:
-       /* Make space on stack for a temporary */
-       addi    r1, r1, -4
-       /* Save register r12 */
-       swi     r12, r1, 0
-       /* Read the MSR register */
-       mfs     r12, rmsr
-       /* Clear the data cache enable bit */
-       andi    r12, r12, ~0x80
-       /* Save the MSR register */
-       mts     rmsr, r12
-       /* Load register r12 */
-       lwi     r12, r1, 0
-       /* Return */
-       rtsd    r15, 8
-       /* Update stack in the delay slot */
-       addi    r1, r1, 4
-       .end    dcache_disable
index b135acb..d76b05a 100644 (file)
  */
 
 #include <common.h>
+#include <asm/asm.h>
 
 void _hw_exception_handler (void)
 {
        int address = 0;
        int state = 0;
        /* loading address of exception EAR */
-       __asm__ __volatile ("mfs %0,rear"::"r" (address):"memory");
+       MFS (address, rear);
        /* loading excetpion state register ESR */
-       __asm__ __volatile ("mfs %0,resr"::"r" (state):"memory");
+       MFS (state, resr);
        printf ("Hardware exception at 0x%x address\n", address);
        switch (state & 0x1f) { /* mask on exception cause */
        case 0x1:
@@ -49,6 +50,11 @@ void _hw_exception_handler (void)
        case 0x5:
                puts ("Divide by zero exception\n");
                break;
+#ifdef MICROBLAZE_V5
+       case 0x1000:
+               puts ("Exception in delay slot\n");
+               break;
+#endif
        default:
                puts ("Undefined cause\n");
                break;
diff --git a/cpu/microblaze/icache.S b/cpu/microblaze/icache.S
deleted file mode 100644 (file)
index 25940d1..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * (C) Copyright 2007 Michal Simek
- *
- * Michal  SIMEK <monstr@monstr.eu>
- *
- * 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
- */
-
-       .text
-       .globl  icache_enable
-       .ent    icache_enable
-       .align  2
-icache_enable:
-       /* Make space on stack for a temporary */
-       addi    r1, r1, -4
-       /* Save register r12 */
-       swi     r12, r1, 0
-       /* Read the MSR register */
-       mfs     r12, rmsr
-       /* Set the instruction enable bit */
-       ori     r12, r12, 0x20
-       /* Save the MSR register */
-       mts     rmsr, r12
-       /* Load register r12 */
-       lwi     r12, r1, 0
-       /* Return */
-       rtsd    r15, 8
-       /* Update stack in the delay slot */
-       addi    r1, r1, 4
-       .end    icache_enable
-
-       .text
-       .globl  icache_disable
-       .ent    icache_disable
-       .align  2
-icache_disable:
-       /* Make space on stack for a temporary */
-       addi    r1, r1, -4
-       /* Save register r12 */
-       swi     r12, r1, 0
-       /* Read the MSR register */
-       mfs     r12, rmsr
-       /* Clear the instruction enable bit */
-       andi    r12, r12, ~0x20
-       /* Save the MSR register */
-       mts     rmsr, r12
-       /* Load register r12 */
-       lwi     r12, r1, 0
-       /* Return */
-       rtsd    r15, 8
-       /* Update stack in the delay slot */
-       addi    r1, r1, 4
-       .end    icache_disable
old mode 100644 (file)
new mode 100755 (executable)
index 2db847c..b61153f
@@ -27,6 +27,7 @@
 #include <common.h>
 #include <command.h>
 #include <asm/microblaze_intc.h>
+#include <asm/asm.h>
 
 #undef DEBUG_INT
 
@@ -35,12 +36,12 @@ extern void microblaze_enable_interrupts (void);
 
 void enable_interrupts (void)
 {
-       microblaze_enable_interrupts ();
+       MSRSET(0x2);
 }
 
 int disable_interrupts (void)
 {
-       microblaze_disable_interrupts ();
+       MSRCLR(0x2);
        return 0;
 }
 
@@ -48,6 +49,10 @@ int disable_interrupts (void)
 #ifdef CFG_TIMER_0
 extern void timer_init (void);
 #endif
+#ifdef CFG_FSL_2
+extern void fsl_init2 (void);
+#endif
+
 
 static struct irq_action vecs[CFG_INTC_0_NUM];
 
@@ -106,7 +111,6 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)
                act->count = 0;
                enable_one_interrupt (irq);
        } else {                /* disable */
-
                act->handler = (interrupt_handler_t *) def_hdlr;
                act->arg = (void *)irq;
                disable_one_interrupt (irq);
@@ -141,18 +145,22 @@ int interrupts_init (void)
 #ifdef CFG_TIMER_0
        timer_init ();
 #endif
+#ifdef CFG_FSL_2
+       fsl_init2 ();
+#endif
        enable_interrupts ();
        return 0;
 }
 
 void interrupt_handler (void)
 {
-       int irqs;
-       irqs = (intc->isr & intc->ier); /* find active interrupt */
-
+       int irqs = (intc->isr & intc->ier);     /* find active interrupt */
+       int i = 1;
 #ifdef DEBUG_INT
+       int value;
        printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
                intc->iar, intc->mer);
+       R14(value);
        printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
 #endif
        struct irq_action *act = vecs;
@@ -165,15 +173,19 @@ void interrupt_handler (void)
 #endif
                        act->handler (act->arg);
                        act->count++;
+                       intc->iar = i;
+                       return;
                }
                irqs >>= 1;
                act++;
+               i <<= 1;
        }
-       intc->iar = 0xFFFFFFFF; /* erase all events */
-#ifdef DEBUG
+
+#ifdef DEBUG_INT
        printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,
                intc->ier, intc->iar, intc->mer);
-       printf ("Interrupt handler on %x line, r14\n", irqs);
+       R14(value);
+       printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
 #endif
 }
 #endif
old mode 100644 (file)
new mode 100755 (executable)
index a4e3fbf..e1fc190
@@ -23,6 +23,7 @@
  */
 
 #include <config.h>
+#include <asm/asm.h>
        .text
        .global _interrupt_handler
 _interrupt_handler:
@@ -151,6 +152,11 @@ _interrupt_handler:
        addi    r1, r1, 4
 
        /* enable_interrupt */
+#ifdef XILINX_USE_MSR_INSTR
+       msrset  r0, 2
+#else
+       /* FIXME unstable in stressed mode - two irqs */
+       nop
        addi    r1, r1, -4
        swi     r12, r1, 0
        mfs     r12, rmsr
@@ -159,6 +165,7 @@ _interrupt_handler:
        lwi     r12, r1, 0
        addi    r1, r1, 4
        nop
+#endif
        bra     r14
        nop
        nop
index ca3befc..3c027ff 100644 (file)
@@ -117,3 +117,36 @@ clear_bss:
 3:     /* jumping to board_init */
        brai    board_init
 1:     bri     1b
+
+/*
+ * Read 16bit little endian
+ */
+       .text
+       .global in16
+       .ent    in16
+       .align  2
+in16:  lhu     r3, r0, r5
+       bslli   r4, r3, 8
+       bsrli   r3, r3, 8
+       andi    r4, r4, 0xffff
+       or      r3, r3, r4
+       rtsd    r15, 8
+       sext16  r3, r3
+       .end    in16
+
+/*
+ * Write 16bit little endian
+ * first parameter(r5) - address, second(r6) - short value
+ */
+       .text
+       .global out16
+       .ent    out16
+       .align  2
+out16: bslli   r3, r6, 8
+       bsrli   r6, r6, 8
+       andi    r3, r3, 0xffff
+       or      r3, r3, r6
+       sh      r3, r0, r5
+       rtsd    r15, 8
+       or      r0, r0, r0
+       .end    out16
index be4fd57..ab1cb12 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <common.h>
 #include <asm/microblaze_timer.h>
+#include <asm/microblaze_intc.h>
 
 volatile int timestamp = 0;
 
@@ -44,9 +45,6 @@ void set_timer (ulong t)
 
 #ifdef CFG_INTC_0
 #ifdef CFG_TIMER_0
-extern void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
-                                      void *arg);
-
 microblaze_timer_t *tmr = (microblaze_timer_t *) (CFG_TIMER_0_ADDR);
 
 void timer_isr (void *arg)
index 7e65821..d744030 100644 (file)
@@ -156,21 +156,21 @@ void cpu_init_f (void)
        *(vu_long *)(MPC5XXX_XLBARB + 0x40) |= (1 << 15);
        *(vu_long *)(MPC5XXX_XLBARB + 0x70) = CFG_SDRAM_BASE | 0x1d;
 
-# if defined(CFG_IPBSPEED_133)
+# if defined(CFG_IPBCLK_EQUALS_XLBCLK)
        /* Motorola reports IPB should better run at 133 MHz. */
        *(vu_long *)MPC5XXX_ADDECR |= 1;
        /* pci_clk_sel = 0x02, ipb_clk_sel = 0x00; */
        addecr = *(vu_long *)MPC5XXX_CDM_CFG;
        addecr &= ~0x103;
-#  if defined(CFG_PCISPEED_66)
+#  if defined(CFG_PCICLK_EQUALS_IPBCLK_DIV2)
        /* pci_clk_sel = 0x01 -> IPB_CLK/2 */
        addecr |= 0x01;
 #  else
        /* pci_clk_sel = 0x02 -> XLB_CLK/4 = IPB_CLK/4 */
        addecr |= 0x02;
-#  endif /* CFG_PCISPEED_66 */
+#  endif /* CFG_PCICLK_EQUALS_IPBCLK_DIV2 */
        *(vu_long *)MPC5XXX_CDM_CFG = addecr;
-# endif        /* CFG_IPBSPEED_133 */
+# endif        /* CFG_IPBCLK_EQUALS_XLBCLK */
        /* Configure the XLB Arbiter */
        *(vu_long *)MPC5XXX_XLBARB_MPRIEN = 0xff;
        *(vu_long *)MPC5XXX_XLBARB_MPRIVAL = 0x11111111;
index e59bd85..8136366 100644 (file)
@@ -428,6 +428,13 @@ static int mpc5xxx_fec_init_phy(struct eth_device *dev, bd_t * bis)
         */
        fec->eth->imask = 0x00000000;
 
+/*
+ * In original Promess-provided code PHY initialization is disabled with the
+ * following comment: "Phy initialization is DISABLED for now.  There was a
+ * problem with running 100 Mbps on PRO board". Thus we temporarily disable
+ * PHY initialization for the Motion-PRO board, until a proper fix is found.
+ */
+
        if (fec->xcv_type != SEVENWIRE) {
                /*
                 * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
index 4b9dcc8..bb96f77 100644 (file)
@@ -29,7 +29,7 @@ LIB   = $(obj)lib$(CPU).a
 
 START  = start.o
 COBJS  = traps.o cpu.o cpu_init.o speed.o interrupts.o \
-         spd_sdram.o qe_io.o
+         spd_sdram.o qe_io.o pci.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
index e934ba6..e078f27 100644 (file)
@@ -52,13 +52,26 @@ int checkcpu(void)
 
        immr = (immap_t *)CFG_IMMR;
 
-       if ((pvr & 0xFFFF0000) != PVR_83xx) {
-               puts("Not MPC83xx Family!!!\n");
-               return -1;
+       puts("CPU:   ");
+
+       switch (pvr & 0xffff0000) {
+               case PVR_E300C1:
+                       printf("e300c1, ");
+                       break;
+
+               case PVR_E300C2:
+                       printf("e300c2, ");
+                       break;
+
+               case PVR_E300C3:
+                       printf("e300c3, ");
+                       break;
+
+               default:
+                       printf("Unknown core, ");
        }
 
        spridr = immr->sysconf.spridr;
-       puts("CPU: ");
        switch(spridr) {
        case SPR_8349E_REV10:
        case SPR_8349E_REV11:
@@ -124,6 +137,18 @@ int checkcpu(void)
        case SPR_8321_REV11:
                puts("MPC8321, ");
                break;
+       case SPR_8311_REV10:
+               puts("MPC8311, ");
+               break;
+       case SPR_8311E_REV10:
+               puts("MPC8311E, ");
+               break;
+       case SPR_8313_REV10:
+               puts("MPC8313, ");
+               break;
+       case SPR_8313E_REV10:
+               puts("MPC8313E, ");
+               break;
        default:
                puts("Rev: Unknown revision number.\nWarning: Unsupported cpu revision!\n");
                return 0;
@@ -133,10 +158,12 @@ int checkcpu(void)
        /* Multiple revisons of 834x processors may have the same SPRIDR value.
         * So use PVR to identify the revision number.
         */
-       printf("Rev: %02x at %s MHz\n", PVR_MAJ(pvr)<<4 | PVR_MIN(pvr), strmhz(buf, clock));
+       printf("Rev: %02x at %s MHz", PVR_MAJ(pvr)<<4 | PVR_MIN(pvr), strmhz(buf, clock));
 #else
-       printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock));
+       printf("Rev: %02x at %s MHz", spridr & 0x0000FFFF, strmhz(buf, clock));
 #endif
+       printf(", CSB: %4d MHz\n", gd->csb_clk / 1000000);
+
        return 0;
 }
 
diff --git a/cpu/mpc83xx/pci.c b/cpu/mpc83xx/pci.c
new file mode 100644 (file)
index 0000000..785d612
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2007
+ *
+ * Author: Scott Wood <scottwood@freescale.com>,
+ * with some bits from older board-specific PCI initialization.
+ *
+ * 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>
+#include <pci.h>
+#include <ft_build.h>
+#include <asm/mpc8349_pci.h>
+
+#ifdef CONFIG_83XX_GENERIC_PCI
+#define MAX_BUSES 2
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct pci_controller pci_hose[MAX_BUSES];
+static int pci_num_buses;
+
+static void pci_init_bus(int bus, struct pci_region *reg)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       volatile pot83xx_t *pot = immr->ios.pot;
+       volatile pcictrl83xx_t *pci_ctrl = &immr->pci_ctrl[bus];
+       struct pci_controller *hose = &pci_hose[bus];
+       u32 dev;
+       u16 reg16;
+       int i;
+
+       if (bus == 1)
+               pot += 3;
+
+       /* Setup outbound translation windows */
+       for (i = 0; i < 3; i++, reg++, pot++) {
+               if (reg->size == 0)
+                       break;
+
+               hose->regions[i] = *reg;
+               hose->region_count++;
+
+               pot->potar = reg->bus_start >> 12;
+               pot->pobar = reg->phys_start >> 12;
+               pot->pocmr = ~(reg->size - 1) >> 12;
+
+               if (reg->flags & PCI_REGION_IO)
+                       pot->pocmr |= POCMR_IO;
+#ifdef CONFIG_83XX_PCI_STREAMING
+               else if (reg->flags & PCI_REGION_PREFETCH)
+                       pot->pocmr |= POCMR_SE;
+#endif
+
+               if (bus == 1)
+                       pot->pocmr |= POCMR_DST;
+
+               pot->pocmr |= POCMR_EN;
+       }
+
+       /* Point inbound translation at RAM */
+       pci_ctrl->pitar1 = 0;
+       pci_ctrl->pibar1 = 0;
+       pci_ctrl->piebar1 = 0;
+       pci_ctrl->piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP |
+                          PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       i = hose->region_count++;
+       hose->regions[i].bus_start = 0;
+       hose->regions[i].phys_start = 0;
+       hose->regions[i].size = gd->ram_size;
+       hose->regions[i].flags = PCI_REGION_MEM | PCI_REGION_MEMORY;
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       pci_setup_indirect(hose, CFG_IMMR + 0x8300 + bus * 0x80,
+                                CFG_IMMR + 0x8304 + bus * 0x80);
+
+       pci_register_hose(hose);
+
+       /*
+        * Write to Command register
+        */
+       reg16 = 0xff;
+       dev = PCI_BDF(hose->first_busno, 0, 0);
+       pci_hose_read_config_word(hose, dev, PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
+       pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
+
+#ifdef CONFIG_PCI_SCAN_SHOW
+       printf("PCI:   Bus Dev VenId DevId Class Int\n");
+#endif
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+}
+
+/*
+ * The caller must have already set OCCR, and the PCI_LAW BARs
+ * must have been set to cover all of the requested regions.
+ *
+ * If fewer than three regions are requested, then the region
+ * list is terminated with a region of size 0.
+ */
+void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       int i;
+
+       if (num_buses > MAX_BUSES) {
+               printf("%d PCI buses requsted, %d supported\n",
+                      num_buses, MAX_BUSES);
+
+               num_buses = MAX_BUSES;
+       }
+
+       pci_num_buses = num_buses;
+
+       /*
+        * Release PCI RST Output signal.
+        * Power on to RST high must be at least 100 ms as per PCI spec.
+        * On warm boots only 1 ms is required.
+        */
+       udelay(warmboot ? 1000 : 100000);
+
+       for (i = 0; i < num_buses; i++)
+               immr->pci_ctrl[i].gcr = 1;
+
+       /*
+        * RST high to first config access must be at least 2^25 cycles
+        * as per PCI spec.  This could be cut in half if we know we're
+        * running at 66MHz.  This could be insufficiently long if we're
+        * running the PCI bus at significantly less than 33MHz.
+        */
+       udelay(1020000);
+
+       for (i = 0; i < num_buses; i++)
+               pci_init_bus(i, reg[i]);
+}
+
+#ifdef CONFIG_OF_FLAT_TREE
+void ft_pci_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+       if (pci_num_buses < 1)
+               return;
+
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
+       if (p) {
+               p[0] = pci_hose[0].first_busno;
+               p[1] = pci_hose[0].last_busno;
+       }
+
+       if (pci_num_buses < 2)
+               return;
+
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len);
+       if (p) {
+               p[0] = pci_hose[1].first_busno;
+               p[1] = pci_hose[1].last_busno;
+       }
+}
+#endif /* CONFIG_OF_FLAT_TREE */
+
+#endif /* CONFIG_83XX_GENERIC_PCI */
index d9b8753..647813f 100644 (file)
@@ -58,8 +58,8 @@ picos_to_clk(int picos)
        int clks;
 
        ddr_bus_clk = gd->ddr_clk >> 1;
-       clks = picos / ((1000000000 / ddr_bus_clk) * 1000);
-       if (picos % ((1000000000 / ddr_bus_clk) * 1000) != 0)
+       clks = picos / (1000000000 / (ddr_bus_clk / 1000));
+       if (picos % (1000000000 / (ddr_bus_clk / 1000)) != 0)
                clks++;
 
        return clks;
@@ -624,7 +624,7 @@ long int spd_sdram()
                         | (1 << (16 + 10))             /* DQS Differential disable */
                         | (add_lat << (16 + 3))        /* Additive Latency in EMRS1 */
                         | (mode_odt_enable << 16)      /* ODT Enable in EMRS1 */
-                        | ((twr_clk >> 1) << 9)        /* Write Recovery Autopre */
+                        | ((twr_clk - 1) << 9)         /* Write Recovery Autopre */
                         | (caslat << 4)                /* caslat */
                         | (burstlen << 0)              /* Burst length */
                        );
@@ -693,11 +693,6 @@ long int spd_sdram()
 
 #ifdef CFG_DDR_SDRAM_CLK_CNTL  /* Optional platform specific value */
        ddr->sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL;
-#else
-       /* SS_EN = 0, source synchronous disable
-        * CLK_ADJST = 0, MCK/MCK# is launched aligned with addr/cmd
-        */
-       ddr->sdram_clk_cntl = 0x00000000;
 #endif
        debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl);
 
index c759930..bf30616 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <common.h>
 #include <mpc83xx.h>
+#include <command.h>
 #include <asm/processor.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -99,12 +100,14 @@ int get_clocks(void)
        u32 lcrr;
 
        u32 csb_clk;
-#if defined(CONFIG_MPC834X)
+#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        u32 tsec1_clk;
        u32 tsec2_clk;
-       u32 usbmph_clk;
        u32 usbdr_clk;
 #endif
+#ifdef CONFIG_MPC834X
+       u32 usbmph_clk;
+#endif
        u32 core_clk;
        u32 i2c1_clk;
 #if !defined(CONFIG_MPC832X)
@@ -148,7 +151,7 @@ int get_clocks(void)
 
        sccr = im->clk.sccr;
 
-#if defined(CONFIG_MPC834X)
+#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {
        case 0:
                tsec1_clk = 0;
@@ -167,6 +170,26 @@ int get_clocks(void)
                return -4;
        }
 
+       switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) {
+       case 0:
+               usbdr_clk = 0;
+               break;
+       case 1:
+               usbdr_clk = csb_clk;
+               break;
+       case 2:
+               usbdr_clk = csb_clk / 2;
+               break;
+       case 3:
+               usbdr_clk = csb_clk / 3;
+               break;
+       default:
+               /* unkown SCCR_USBDRCM value */
+               return -8;
+       }
+#endif
+
+#if defined(CONFIG_MPC834X)
        switch ((sccr & SCCR_TSEC2CM) >> SCCR_TSEC2CM_SHIFT) {
        case 0:
                tsec2_clk = 0;
@@ -205,24 +228,6 @@ int get_clocks(void)
                return -7;
        }
 
-       switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) {
-       case 0:
-               usbdr_clk = 0;
-               break;
-       case 1:
-               usbdr_clk = csb_clk;
-               break;
-       case 2:
-               usbdr_clk = csb_clk / 2;
-               break;
-       case 3:
-               usbdr_clk = csb_clk / 3;
-               break;
-       default:
-               /* unkown SCCR_USBDRCM value */
-               return -8;
-       }
-
        if (usbmph_clk != 0 && usbdr_clk != 0 && usbmph_clk != usbdr_clk) {
                /* if USB MPH clock is not disabled and
                 * USB DR clock is not disabled then
@@ -230,8 +235,16 @@ int get_clocks(void)
                 */
                return -9;
        }
+#elif defined(CONFIG_MPC831X)
+       tsec2_clk = tsec1_clk;
+
+       if (!(sccr & SCCR_TSEC1ON))
+               tsec1_clk = 0;
+       if (!(sccr & SCCR_TSEC2ON))
+               tsec2_clk = 0;
 #endif
-#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
+
+#if !defined(CONFIG_MPC834X)
        i2c1_clk = csb_clk;
 #endif
 #if !defined(CONFIG_MPC832X)
@@ -314,12 +327,14 @@ int get_clocks(void)
 #endif
 
        gd->csb_clk = csb_clk;
-#if defined(CONFIG_MPC834X)
+#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        gd->tsec1_clk = tsec1_clk;
        gd->tsec2_clk = tsec2_clk;
-       gd->usbmph_clk = usbmph_clk;
        gd->usbdr_clk = usbdr_clk;
 #endif
+#if defined(CONFIG_MPC834X)
+       gd->usbmph_clk = usbmph_clk;
+#endif
        gd->core_clk = core_clk;
        gd->i2c1_clk = i2c1_clk;
 #if !defined(CONFIG_MPC832X)
@@ -351,11 +366,11 @@ ulong get_bus_freq(ulong dummy)
        return gd->csb_clk;
 }
 
-int print_clock_conf(void)
+int do_clocks (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
        printf("Clock configuration:\n");
-       printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);
        printf("  Core:                %4d MHz\n", gd->core_clk / 1000000);
+       printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);
 #if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
        printf("  QE:                  %4d MHz\n", gd->qe_clk / 1000000);
        printf("  BRG:                 %4d MHz\n", gd->brg_clk / 1000000);
@@ -371,11 +386,18 @@ int print_clock_conf(void)
 #if !defined(CONFIG_MPC832X)
        printf("  I2C2:                %4d MHz\n", gd->i2c2_clk / 1000000);
 #endif
-#if defined(CONFIG_MPC834X)
+#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        printf("  TSEC1:               %4d MHz\n", gd->tsec1_clk / 1000000);
        printf("  TSEC2:               %4d MHz\n", gd->tsec2_clk / 1000000);
-       printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000);
        printf("  USB DR:              %4d MHz\n", gd->usbdr_clk / 1000000);
 #endif
+#if defined(CONFIG_MPC834X)
+       printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000);
+#endif
        return 0;
 }
+
+U_BOOT_CMD(clocks, 1, 0, do_clocks,
+       "clocks  - print clock configuration\n",
+       "    clocks\n"
+);
index 10b4c18..c500d3f 100644 (file)
@@ -20,7 +20,7 @@
  * Jun Gu, Artesyn Technology, jung@artesyncp.com
  * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
  *
- * (C) Copyright 2005
+ * (C) Copyright 2005-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
  * MA 02111-1307 USA
  */
 
+/* define DEBUG for debugging output (obviously ;-)) */
+#if 0
+#define DEBUG
+#endif
+
 #include <common.h>
 #include <asm/processor.h>
 #include <i2c.h>
 #define MY_TLB_WORD2_I_ENABLE  TLB_WORD2_I_ENABLE      /* disable caching on SDRAM */
 #endif
 
-const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
-       {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
-        0xFFFFFFFF, 0xFFFFFFFF},
-       {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
-        0x00000000, 0x00000000},
-       {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
-        0x55555555, 0x55555555},
-       {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
-        0xAAAAAAAA, 0xAAAAAAAA},
-       {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
-        0x5A5A5A5A, 0x5A5A5A5A},
-       {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
-        0xA5A5A5A5, 0xA5A5A5A5},
-       {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
-        0x55AA55AA, 0x55AA55AA},
-       {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
-        0xAA55AA55, 0xAA55AA55}
-};
-
 /* bank_parms is used to sort the bank sizes by descending order */
 struct bank_param {
        unsigned long cr;
@@ -278,46 +264,37 @@ extern unsigned char cfg_simulate_spd_eeprom[128];
 #endif
 void program_tlb(u32 start, u32 size, u32 tlb_word2_i_value);
 
-unsigned char spd_read(uchar chip, uint addr);
-
-void get_spd_info(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void check_mem_type
-(unsigned long* dimm_populated,
- unsigned char* iic0_dimm_addr,
- unsigned long num_dimm_banks);
-
-void check_volt_type
-(unsigned long* dimm_populated,
- unsigned char* iic0_dimm_addr,
- unsigned long num_dimm_banks);
-
-void program_cfg0(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_cfg1(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_rtr (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_tr0 (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_tr1 (void);
-
-void program_ecc (unsigned long         num_bytes);
+static unsigned char spd_read(uchar chip, uint addr);
+static void get_spd_info(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void check_mem_type(unsigned long *dimm_populated,
+                          unsigned char *iic0_dimm_addr,
+                          unsigned long num_dimm_banks);
+static void check_volt_type(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks);
+static void program_cfg0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long  num_dimm_banks);
+static void program_cfg1(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void program_rtr(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks);
+static void program_tr0(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks);
+static void program_tr1(void);
+
+#ifdef CONFIG_DDR_ECC
+static void program_ecc(unsigned long num_bytes);
+#endif
 
-unsigned
-long  program_bxcr(unsigned long* dimm_populated,
-                  unsigned char* iic0_dimm_addr,
-                  unsigned long  num_dimm_banks);
+static unsigned long program_bxcr(unsigned long *dimm_populated,
+                                 unsigned char *iic0_dimm_addr,
+                                 unsigned long num_dimm_banks);
 
 /*
  * This function is reading data from the DIMM module EEPROM over the SPD bus
@@ -328,7 +305,6 @@ long  program_bxcr(unsigned long* dimm_populated,
  * BUG: Don't handle ECC memory
  * BUG: A few values in the TR register is currently hardcoded
  */
-
 long int spd_sdram(void) {
        unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;
        unsigned long dimm_populated[sizeof(iic0_dimm_addr)];
@@ -421,9 +397,8 @@ long int spd_sdram(void) {
         */
        while (1) {
                mfsdram(mem_mcsts, mcsts);
-               if ((mcsts & SDRAM_MCSTS_MRSC) != 0) {
+               if ((mcsts & SDRAM_MCSTS_MRSC) != 0)
                        break;
-               }
        }
 
        /*
@@ -431,14 +406,17 @@ long int spd_sdram(void) {
         */
        program_tr1();
 
+#ifdef CONFIG_DDR_ECC
        /*
-        * if ECC is enabled, initialize parity bits
+        * If ecc is enabled, initialize the parity bits.
         */
+       program_ecc(total_size);
+#endif
 
        return total_size;
 }
 
-unsigned char spd_read(uchar chip, uint addr)
+static unsigned char spd_read(uchar chip, uint addr)
 {
        unsigned char data[2];
 
@@ -460,9 +438,9 @@ unsigned char spd_read(uchar chip, uint addr)
        return 0;
 }
 
-void get_spd_info(unsigned long*   dimm_populated,
-                 unsigned char*   iic0_dimm_addr,
-                 unsigned long    num_dimm_banks)
+static void get_spd_info(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long dimm_found;
@@ -480,14 +458,10 @@ void get_spd_info(unsigned long*   dimm_populated,
                if ((num_of_bytes != 0) && (total_size != 0)) {
                        dimm_populated[dimm_num] = TRUE;
                        dimm_found = TRUE;
-#if 0
-                       printf("DIMM slot %lu: populated\n", dimm_num);
-#endif
+                       debug("DIMM slot %lu: populated\n", dimm_num);
                } else {
                        dimm_populated[dimm_num] = FALSE;
-#if 0
-                       printf("DIMM slot %lu: Not populated\n", dimm_num);
-#endif
+                       debug("DIMM slot %lu: Not populated\n", dimm_num);
                }
        }
 
@@ -497,9 +471,9 @@ void get_spd_info(unsigned long*   dimm_populated,
        }
 }
 
-void check_mem_type(unsigned long*   dimm_populated,
-                   unsigned char*   iic0_dimm_addr,
-                   unsigned long    num_dimm_banks)
+static void check_mem_type(unsigned long *dimm_populated,
+                          unsigned char *iic0_dimm_addr,
+                          unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned char dimm_type;
@@ -509,9 +483,7 @@ void check_mem_type(unsigned long*   dimm_populated,
                        dimm_type = spd_read(iic0_dimm_addr[dimm_num], 2);
                        switch (dimm_type) {
                        case 7:
-#if 0
-                               printf("DIMM slot %lu: DDR SDRAM detected\n", dimm_num);
-#endif
+                               debug("DIMM slot %lu: DDR SDRAM detected\n", dimm_num);
                                break;
                        default:
                                printf("ERROR: Unsupported DIMM detected in slot %lu.\n",
@@ -525,10 +497,9 @@ void check_mem_type(unsigned long*   dimm_populated,
        }
 }
 
-
-void check_volt_type(unsigned long*   dimm_populated,
-                    unsigned char*   iic0_dimm_addr,
-                    unsigned long    num_dimm_banks)
+static void check_volt_type(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long voltage_type;
@@ -541,18 +512,16 @@ void check_volt_type(unsigned long*   dimm_populated,
                                       dimm_num);
                                hang();
                        } else {
-#if 0
-                               printf("DIMM %lu voltage level supported.\n", dimm_num);
-#endif
+                               debug("DIMM %lu voltage level supported.\n", dimm_num);
                        }
                        break;
                }
        }
 }
 
-void program_cfg0(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_cfg0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long cfg0;
@@ -640,9 +609,9 @@ void program_cfg0(unsigned long* dimm_populated,
        mtsdram(mem_cfg0, cfg0);
 }
 
-void program_cfg1(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_cfg1(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long cfg1;
        mfsdram(mem_cfg1, cfg1);
@@ -658,9 +627,9 @@ void program_cfg1(unsigned long* dimm_populated,
        mtsdram(mem_cfg1, cfg1);
 }
 
-void program_rtr (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_rtr(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long bus_period_x_10;
@@ -676,7 +645,6 @@ void program_rtr (unsigned long* dimm_populated,
        get_sys_info(&sys_info);
        bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
 
-
        for (dimm_num = 0;  dimm_num < num_dimm_banks; dimm_num++) {
                if (dimm_populated[dimm_num] == TRUE) {
                        refresh_rate_type = 0x7F & spd_read(iic0_dimm_addr[dimm_num], 12);
@@ -719,9 +687,9 @@ void program_rtr (unsigned long* dimm_populated,
        mtsdram(mem_rtr, sdram_rtr);
 }
 
-void program_tr0 (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_tr0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long tr0;
@@ -1001,13 +969,73 @@ void program_tr0 (unsigned long* dimm_populated,
                break;
        }
 
-#if 0
-       printf("tr0: %x\n", tr0);
-#endif
+       debug("tr0: %x\n", tr0);
        mtsdram(mem_tr0, tr0);
 }
 
-void program_tr1 (void)
+static int short_mem_test(void)
+{
+       unsigned long i, j;
+       unsigned long bxcr_num;
+       unsigned long *membase;
+       const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
+               {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+                0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
+               {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+                0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
+               {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+                0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
+               {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+                0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
+               {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+                0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
+               {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+                0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
+               {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+                0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
+               {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
+                0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55}};
+
+       for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
+               mtdcr(memcfga, mem_b0cr + (bxcr_num << 2));
+               if ((mfdcr(memcfgd) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
+                       /* Bank is enabled */
+                       membase = (unsigned long*)
+                               (mfdcr(memcfgd) & SDRAM_BXCR_SDBA_MASK);
+
+                       /*
+                        * Run the short memory test
+                        */
+                       for (i = 0; i < NUMMEMTESTS; i++) {
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       membase[j] = test[i][j];
+                                       ppcDcbf((unsigned long)&(membase[j]));
+                               }
+
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       if (membase[j] != test[i][j]) {
+                                               ppcDcbf((unsigned long)&(membase[j]));
+                                               return 0;
+                                       }
+                                       ppcDcbf((unsigned long)&(membase[j]));
+                               }
+
+                               if (j < NUMMEMWORDS)
+                                       return 0;
+                       }
+
+                       /*
+                        * see if the rdclt value passed
+                        */
+                       if (i < NUMMEMTESTS)
+                               return 0;
+               }
+       }
+
+       return 1;
+}
+
+static void program_tr1(void)
 {
        unsigned long tr0;
        unsigned long tr1;
@@ -1015,8 +1043,7 @@ void program_tr1 (void)
        unsigned long ecc_temp;
        unsigned long dlycal;
        unsigned long dly_val;
-       unsigned long i, j, k;
-       unsigned long bxcr_num;
+       unsigned long k;
        unsigned long max_pass_length;
        unsigned long current_pass_length;
        unsigned long current_fail_length;
@@ -1029,7 +1056,6 @@ void program_tr1 (void)
        unsigned char window_found;
        unsigned char fail_found;
        unsigned char pass_found;
-       unsigned long * membase;
        PPC440_SYS_INFO sys_info;
 
        /*
@@ -1079,55 +1105,16 @@ void program_tr1 (void)
        window_found = FALSE;
        fail_found = FALSE;
        pass_found = FALSE;
-#ifdef DEBUG
-       printf("Starting memory test ");
-#endif
+       debug("Starting memory test ");
+
        for (k = 0; k < NUMHALFCYCLES; k++) {
-               for (rdclt = 0; rdclt < dly_val; rdclt++)  {
+               for (rdclt = 0; rdclt < dly_val; rdclt++) {
                        /*
                         * Set the timing reg for the test.
                         */
                        mtsdram(mem_tr1, (tr1 | SDRAM_TR1_RDCT_ENCODE(rdclt)));
 
-                       for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
-                               mtdcr(memcfga, mem_b0cr + (bxcr_num<<2));
-                               if ((mfdcr(memcfgd) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
-                                       /* Bank is enabled */
-                                       membase = (unsigned long*)
-                                               (mfdcr(memcfgd) & SDRAM_BXCR_SDBA_MASK);
-
-                                       /*
-                                        * Run the short memory test
-                                        */
-                                       for (i = 0; i < NUMMEMTESTS; i++) {
-                                               for (j = 0; j < NUMMEMWORDS; j++) {
-                                                       membase[j] = test[i][j];
-                                                       ppcDcbf((unsigned long)&(membase[j]));
-                                               }
-
-                                               for (j = 0; j < NUMMEMWORDS; j++) {
-                                                       if (membase[j] != test[i][j]) {
-                                                               ppcDcbf((unsigned long)&(membase[j]));
-                                                               break;
-                                                       }
-                                                       ppcDcbf((unsigned long)&(membase[j]));
-                                               }
-
-                                               if (j < NUMMEMWORDS) {
-                                                       break;
-                                               }
-                                       }
-
-                                       /*
-                                        * see if the rdclt value passed
-                                        */
-                                       if (i < NUMMEMTESTS) {
-                                               break;
-                                       }
-                               }
-                       }
-
-                       if (bxcr_num == MAXBXCR) {
+                       if (short_mem_test()) {
                                if (fail_found == TRUE) {
                                        pass_found = TRUE;
                                        if (current_pass_length == 0) {
@@ -1157,9 +1144,8 @@ void program_tr1 (void)
                                }
                        }
                }
-#ifdef DEBUG
-               printf(".");
-#endif
+               debug(".");
+
                if (window_found == TRUE) {
                        break;
                }
@@ -1167,9 +1153,7 @@ void program_tr1 (void)
                tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
                rdclt_offset += dly_val;
        }
-#ifdef DEBUG
-       printf("\n");
-#endif
+       debug("\n");
 
        /*
         * make sure we find the window
@@ -1218,18 +1202,17 @@ void program_tr1 (void)
        }
        tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
 
-#if 0
-       printf("tr1: %x\n", tr1);
-#endif
+       debug("tr1: %x\n", tr1);
+
        /*
         * program SDRAM Timing Register 1 TR1
         */
        mtsdram(mem_tr1, tr1);
 }
 
-unsigned long program_bxcr(unsigned long* dimm_populated,
-                          unsigned char* iic0_dimm_addr,
-                          unsigned long  num_dimm_banks)
+static unsigned long program_bxcr(unsigned long *dimm_populated,
+                                 unsigned char *iic0_dimm_addr,
+                                 unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long bank_base_addr;
@@ -1262,8 +1245,8 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
 #ifdef CONFIG_BAMBOO
        /*
         * This next section is hardware dependent and must be programmed
-        * to match the hardware.  For bammboo, the following holds...
-        * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0
+        * to match the hardware.  For bamboo, the following holds...
+        * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0 (soldered onboard)
         * 2. SDRAM0_B1CR: Bank 0 of dimm 1 ctrl_bank_num : 1
         * 3. SDRAM0_B2CR: Bank 1 of dimm 1 ctrl_bank_num : 1
         * 4. SDRAM0_B3CR: Bank 0 of dimm 2 ctrl_bank_num : 3
@@ -1273,10 +1256,12 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
        ctrl_bank_num[1] = 1;
        ctrl_bank_num[2] = 3;
 #else
+       /*
+        * Ocotea, Ebony and the other IBM/AMCC eval boards have
+        * 2 DIMM slots with each max 2 banks
+        */
        ctrl_bank_num[0] = 0;
-       ctrl_bank_num[1] = 1;
-       ctrl_bank_num[2] = 2;
-       ctrl_bank_num[3] = 3;
+       ctrl_bank_num[1] = 2;
 #endif
 
        /*
@@ -1290,6 +1275,8 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                        num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
                        num_banks    = spd_read(iic0_dimm_addr[dimm_num], 5);
                        bank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
+                       debug("DIMM%d: row=%d col=%d banks=%d\n", dimm_num,
+                             num_row_addr, num_col_addr, num_banks);
 
                        /*
                         * Set the SDRAM0_BxCR regs
@@ -1354,9 +1341,12 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                        cr |= SDRAM_BXCR_SDBE;
 
                        for (i = 0; i < num_banks; i++) {
-                               bank_parms[ctrl_bank_num[dimm_num]+i+dimm_num].bank_size_bytes =
-                                       (4 * 1024 * 1024) * bank_size_id;
-                               bank_parms[ctrl_bank_num[dimm_num]+i+dimm_num].cr = cr;
+                               bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
+                                       (4 << 20) * bank_size_id;
+                               bank_parms[ctrl_bank_num[dimm_num]+i].cr = cr;
+                               debug("DIMM%d-bank %d (SDRAM0_B%dCR): bank_size_bytes=%d\n",
+                                     dimm_num, i, ctrl_bank_num[dimm_num]+i,
+                                     bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes);
                        }
                }
        }
@@ -1400,13 +1390,15 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                                bank_parms[sorted_bank_num[bx_cr_num]].cr;
                        mtdcr(memcfgd, temp);
                        bank_base_addr += bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes;
+                       debug("SDRAM0_B%dCR=0x%08lx\n", sorted_bank_num[bx_cr_num], temp);
                }
        }
 
        return(bank_base_addr);
 }
 
-void program_ecc (unsigned long         num_bytes)
+#ifdef CONFIG_DDR_ECC
+static void program_ecc(unsigned long num_bytes)
 {
        unsigned long bank_base_addr;
        unsigned long current_address;
@@ -1425,14 +1417,12 @@ void program_ecc (unsigned long  num_bytes)
        bank_base_addr = CFG_SDRAM_BASE;
 
        if ((cfg0 & SDRAM_CFG0_MCHK_MASK) != SDRAM_CFG0_MCHK_NON) {
-               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) |
-                       SDRAM_CFG0_MCHK_GEN);
+               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | SDRAM_CFG0_MCHK_GEN);
 
-               if ((cfg0 & SDRAM_CFG0_DMWD_MASK) == SDRAM_CFG0_DMWD_32) {
+               if ((cfg0 & SDRAM_CFG0_DMWD_MASK) == SDRAM_CFG0_DMWD_32)
                        address_increment = 4;
-               } else {
+               else
                        address_increment = 8;
-               }
 
                current_address = (unsigned long)(bank_base_addr);
                end_address = (unsigned long)(bank_base_addr) + num_bytes;
@@ -1446,4 +1436,5 @@ void program_ecc (unsigned long    num_bytes)
                        SDRAM_CFG0_MCHK_CHK);
        }
 }
+#endif /* CONFIG_DDR_ECC */
 #endif /* CONFIG_SPD_EEPROM */
index 2ecd3e4..48b9ee2 100644 (file)
@@ -465,7 +465,11 @@ long int initdram(int board_type)
         * Set the SDRAM Clock Timing Register
         *-----------------------------------------------------------------*/
        mfsdram(SDRAM_CLKTR, val);
+#ifdef CFG_44x_DDR2_CKTR_180
+       mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_180_DEG_ADV);
+#else
        mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_0_DEG);
+#endif
 
        /*------------------------------------------------------------------
         * Program the BxCF registers.
@@ -1117,7 +1121,8 @@ static void program_codt(unsigned long *dimm_populated,
                                modt3 = 0x00000000;
                        }
                        if (total_rank == 4) {
-                               codt |= CALC_ODT_R(0) | CALC_ODT_R(1) | CALC_ODT_R(2) | CALC_ODT_R(3);
+                               codt |= CALC_ODT_R(0) | CALC_ODT_R(1) |
+                                       CALC_ODT_R(2) | CALC_ODT_R(3);
                                modt0 = CALC_ODT_RW(2);
                                modt1 = 0x00000000;
                                modt2 = CALC_ODT_RW(0);
index 8e6bc84..c07bc0c 100644 (file)
@@ -139,6 +139,7 @@ static char *bootstrap_str[] = {
        "Reserved",
        "I2C (Addr 0x50)",
 };
+static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
 #endif
 
 #if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
@@ -149,6 +150,7 @@ static char *bootstrap_str[] = {
        "I2C (Addr 0x54)",
        "I2C (Addr 0x50)",
 };
+static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
 #endif
 
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR)
@@ -163,6 +165,7 @@ static char *bootstrap_str[] = {
        "PCI",
        "I2C (Addr 0x52)",
 };
+static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
 #endif
 
 #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
@@ -177,6 +180,7 @@ static char *bootstrap_str[] = {
        "PCI",
        "I2C (Addr 0x52)",
 };
+static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
 #endif
 
 #if defined(CONFIG_405EZ)
@@ -199,6 +203,8 @@ static char *bootstrap_str[] = {
        "SPI (slow)",
        "I2C (Addr 0x50)",
 };
+static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
+                                'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
 #endif
 
 #if defined(SDR0_PINSTP_SHIFT)
@@ -427,7 +433,7 @@ int checkcpu (void)
        printf ("       I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
 #endif /* I2C_BOOTROM */
 #if defined(SDR0_PINSTP_SHIFT)
-       printf ("       Bootstrap Option %c - ", (char)bootstrap_option() + 'A');
+       printf ("       Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
        printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
 #endif /* SDR0_PINSTP_SHIFT */
 
index b198ff4..f63fc79 100644 (file)
@@ -3,7 +3,7 @@
  *   Platform independend driver for NDFC (NanD Flash Controller)
  *   integrated into EP440 cores
  *
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * Based on original work by
 
 #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY) && \
        (defined(CONFIG_440EP) || defined(CONFIG_440GR) ||           \
-        defined(CONFIG_440EPX) || defined(CONFIG_440GRX))
+        defined(CONFIG_440EPX) || defined(CONFIG_440GRX) ||         \
+        defined(CONFIG_405EZ))
 
 #include <nand.h>
 #include <linux/mtd/ndfc.h>
+#include <linux/mtd/nand_ecc.h>
 #include <asm/processor.h>
-#include <ppc440.h>
+#include <asm/io.h>
+#include <ppc4xx.h>
 
 static u8 hwctl = 0;
 
@@ -69,11 +72,11 @@ static void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte)
        ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
 
        if (hwctl & 0x1)
-               out8(base + NDFC_CMD, byte);
+               out_8((u8 *)(base + NDFC_CMD), byte);
        else if (hwctl & 0x2)
-               out8(base + NDFC_ALE, byte);
+               out_8((u8 *)(base + NDFC_ALE), byte);
        else
-               out8(base + NDFC_DATA, byte);
+               out_8((u8 *)(base + NDFC_DATA), byte);
 }
 
 static u_char ndfc_read_byte(struct mtd_info *mtdinfo)
@@ -81,7 +84,7 @@ static u_char ndfc_read_byte(struct mtd_info *mtdinfo)
        struct nand_chip *this = mtdinfo->priv;
        ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
 
-       return (in8(base + NDFC_DATA));
+       return (in_8((u8 *)(base + NDFC_DATA)));
 }
 
 static int ndfc_dev_ready(struct mtd_info *mtdinfo)
@@ -89,17 +92,41 @@ static int ndfc_dev_ready(struct mtd_info *mtdinfo)
        struct nand_chip *this = mtdinfo->priv;
        ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
 
-       while (!(in32(base + NDFC_STAT) & NDFC_STAT_IS_READY))
+       while (!(in_be32((u32 *)(base + NDFC_STAT)) & NDFC_STAT_IS_READY))
                ;
 
        return 1;
 }
 
-#ifndef CONFIG_NAND_SPL
-/*
- * Don't use these speedup functions in NAND boot image, since the image
- * has to fit into 4kByte.
- */
+static void ndfc_enable_hwecc(struct mtd_info *mtdinfo, int mode)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
+       u32 ccr;
+
+       ccr = in_be32((u32 *)(base + NDFC_CCR));
+       ccr |= NDFC_CCR_RESET_ECC;
+       out_be32((u32 *)(base + NDFC_CCR), ccr);
+}
+
+static int ndfc_calculate_ecc(struct mtd_info *mtdinfo,
+                             const u_char *dat, u_char *ecc_code)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       ulong base = (ulong) this->IO_ADDR_W & 0xfffffffc;
+       u32 ecc;
+       u8 *p = (u8 *)&ecc;
+
+       ecc = in_be32((u32 *)(base + NDFC_ECC));
+
+       /* The NDFC uses Smart Media (SMC) bytes order
+        */
+       ecc_code[0] = p[2];
+       ecc_code[1] = p[1];
+       ecc_code[2] = p[3];
+
+       return 0;
+}
 
 /*
  * Speedups for buffer read/write/verify
@@ -115,9 +142,14 @@ static void ndfc_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
        uint32_t *p = (uint32_t *) buf;
 
        for (;len > 0; len -= 4)
-               *p++ = in32(base + NDFC_DATA);
+               *p++ = in_be32((u32 *)(base + NDFC_DATA));
 }
 
+#ifndef CONFIG_NAND_SPL
+/*
+ * Don't use these speedup functions in NAND boot image, since the image
+ * has to fit into 4kByte.
+ */
 static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
 {
        struct nand_chip *this = mtdinfo->priv;
@@ -125,7 +157,7 @@ static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
        uint32_t *p = (uint32_t *) buf;
 
        for (; len > 0; len -= 4)
-               out32(base + NDFC_DATA, *p++);
+               out_be32((u32 *)(base + NDFC_DATA), *p++);
 }
 
 static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
@@ -135,7 +167,7 @@ static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
        uint32_t *p = (uint32_t *) buf;
 
        for (; len > 0; len -= 4)
-               if (*p++ != in32(base + NDFC_DATA))
+               if (*p++ != in_be32((u32 *)(base + NDFC_DATA)))
                        return -1;
 
        return 0;
@@ -152,8 +184,8 @@ void board_nand_select_device(struct nand_chip *nand, int chip)
        ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
 
        /* Set NandFlash Core Configuration Register */
-       /* 1col x 2 rows */
-       out32(base + NDFC_CCR, 0x00000000 | (cs << 24));
+       /* 1 col x 2 rows */
+       out_be32((u32 *)(base + NDFC_CCR), 0x00000000 | (cs << 24));
 }
 
 int board_nand_init(struct nand_chip *nand)
@@ -161,23 +193,25 @@ int board_nand_init(struct nand_chip *nand)
        int cs = (ulong)nand->IO_ADDR_W & 0x00000003;
        ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
 
-       nand->eccmode = NAND_ECC_SOFT;
-
        nand->hwcontrol  = ndfc_hwcontrol;
        nand->read_byte  = ndfc_read_byte;
+       nand->read_buf   = ndfc_read_buf;
        nand->write_byte = ndfc_write_byte;
        nand->dev_ready  = ndfc_dev_ready;
 
+       nand->eccmode = NAND_ECC_HW3_256;
+       nand->enable_hwecc = ndfc_enable_hwecc;
+       nand->calculate_ecc = ndfc_calculate_ecc;
+       nand->correct_data = nand_correct_data;
+
 #ifndef CONFIG_NAND_SPL
        nand->write_buf  = ndfc_write_buf;
-       nand->read_buf   = ndfc_read_buf;
        nand->verify_buf = ndfc_verify_buf;
 #else
        /*
         * Setup EBC (CS0 only right now)
         */
-       mtdcr(ebccfga, xbcfg);
-       mtdcr(ebccfgd, 0xb8400000);
+       mtebc(EBC0_CFG, 0xb8400000);
 
        mtebc(pb0cr, CFG_EBC_PB0CR);
        mtebc(pb0ap, CFG_EBC_PB0AP);
@@ -187,7 +221,7 @@ int board_nand_init(struct nand_chip *nand)
         * Select required NAND chip in NDFC
         */
        board_nand_select_device(nand, cs);
-       out32(base + NDFC_BCFG0 + (cs << 2), 0x80002222);
+       out_be32((u32 *)(base + NDFC_BCFG0 + (cs << 2)), 0x80002222);
        return 0;
 }
 
index a96083c..78d0042 100644 (file)
 # endif
 #endif /* CFG_INIT_DCACHE_CS */
 
+#define function_prolog(func_name)      .text; \
+                                       .align 2; \
+                                       .globl func_name; \
+                                       func_name:
+#define function_epilog(func_name)      .type func_name,@function; \
+                                       .size func_name,.-func_name
+
 /* We don't want the  MMU yet.
 */
 #undef MSR_KERNEL
         * NAND U-Boot image is started from offset 0
         */
        .text
+#if defined(CONFIG_440)
        bl      reconfig_tlb0
+#endif
        GET_GOT
        bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
        bl      board_init_f
@@ -388,8 +397,9 @@ rsttlb:     tlbwe   r0,r1,0x0000    /* Invalidate all entries (V=0)*/
 2:
 
 #if defined(CONFIG_NAND_SPL)
+#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
        /*
-        * Enable internal SRAM
+        * Enable internal SRAM (only on 440EPx/GRx, 440EP/GR have no OCM)
         */
        lis     r2,0x7fff
        ori     r2,r2,0xffff
@@ -399,6 +409,45 @@ rsttlb:    tlbwe   r0,r1,0x0000    /* Invalidate all entries (V=0)*/
        mfdcr   r1,isram0_pmeg
        and     r1,r1,r2                /* Disable pwr mgmt */
        mtdcr   isram0_pmeg,r1
+#endif
+#if defined(CONFIG_440EP)
+       /*
+        * On 440EP with no internal SRAM, we setup SDRAM very early
+        * and copy the NAND_SPL to SDRAM and jump to it
+        */
+       /* Clear Dcache to use as RAM */
+       addis   r3,r0,CFG_INIT_RAM_ADDR@h
+       ori     r3,r3,CFG_INIT_RAM_ADDR@l
+       addis   r4,r0,CFG_INIT_RAM_END@h
+       ori     r4,r4,CFG_INIT_RAM_END@l
+       rlwinm. r5,r4,0,27,31
+       rlwinm  r5,r4,27,5,31
+       beq     ..d_ran3
+       addi    r5,r5,0x0001
+..d_ran3:
+       mtctr   r5
+..d_ag3:
+       dcbz    r0,r3
+       addi    r3,r3,32
+       bdnz    ..d_ag3
+       /*----------------------------------------------------------------*/
+       /* Setup the stack in internal SRAM */
+       /*----------------------------------------------------------------*/
+       lis     r1,CFG_INIT_RAM_ADDR@h
+       ori     r1,r1,CFG_INIT_SP_OFFSET@l
+       li      r0,0
+       stwu    r0,-4(r1)
+       stwu    r0,-4(r1)               /* Terminate call chain */
+
+       stwu    r1,-8(r1)               /* Save back chain and move SP */
+       lis     r0,RESET_VECTOR@h       /* Address of reset vector */
+       ori     r0,r0, RESET_VECTOR@l
+       stwu    r1,-8(r1)               /* Save back chain and move SP */
+       stw     r0,+12(r1)              /* Save return addr (underflow vect) */
+       sync
+       bl      early_sdram_init
+       sync
+#endif /* CONFIG_440EP */
 
        /*
         * Copy SPL from cache into internal SRAM
@@ -429,7 +478,7 @@ spl_loop:
 start_ram:
        sync
        isync
-#endif
+#endif /* CONFIG_NAND_SPL */
 
        bl      3f
        b       _start
@@ -783,7 +832,7 @@ _start:
        mtdcr   ocmdscr2, r3            /* Set Data Side */
        mtdcr   ocmiscr2, r3            /* Set Instruction Side */
        addis   r3,0,0x0800             /* OCM Data Parity Disable - 1 Wait State */
-       mtdcr   ocmdsisdpc,r4
+       mtdcr   ocmdsisdpc,r3
 
        isync
 #else /* CONFIG_405EZ */
@@ -810,6 +859,38 @@ _start:
 #endif /* CONFIG_405EZ */
 #endif
 
+#ifdef CONFIG_NAND_SPL
+       /*
+        * Copy SPL from cache into internal SRAM
+        */
+       li      r4,(CFG_NAND_BOOT_SPL_SIZE >> 2) - 1
+       mtctr   r4
+       lis     r2,CFG_NAND_BOOT_SPL_SRC@h
+       ori     r2,r2,CFG_NAND_BOOT_SPL_SRC@l
+       lis     r3,CFG_NAND_BOOT_SPL_DST@h
+       ori     r3,r3,CFG_NAND_BOOT_SPL_DST@l
+spl_loop:
+       lwzu    r4,4(r2)
+       stwu    r4,4(r3)
+       bdnz    spl_loop
+
+       /*
+        * Jump to code in RAM
+        */
+       bl      00f
+00:    mflr    r10
+       lis     r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@h
+       ori     r3,r3,(CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)@l
+       sub     r10,r10,r3
+       addi    r10,r10,28
+       mtlr    r10
+       blr
+
+start_ram:
+       sync
+       isync
+#endif /* CONFIG_NAND_SPL */
+
        /*----------------------------------------------------------------------- */
        /* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */
        /*----------------------------------------------------------------------- */
@@ -920,12 +1001,16 @@ _start:
        stw     r0, +12(r1)             /* Save return addr (underflow vect) */
 #endif /* !(CFG_INIT_DCACHE_CS || !CFG_TEM_STACK_OCM) */
 
+#ifdef CONFIG_NAND_SPL
+       bl      nand_boot               /* will not return */
+#else
        GET_GOT                 /* initialize GOT access                        */
 
        bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
 
        /* NEVER RETURNS! */
        bl      board_init_f    /* run first part of init code (from Flash)     */
+#endif /* CONFIG_NAND_SPL */
 
 #endif /* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */
        /*----------------------------------------------------------------------- */
@@ -1137,27 +1222,9 @@ crit_return:
        lwz     r1,GPR1(r1)
        SYNC
        rfci
-#endif /* CONFIG_NAND_SPL */
 
 /* Cache functions.
 */
-invalidate_icache:
-       iccci   r0,r0                   /* for 405, iccci invalidates the */
-       blr                             /*   entire I cache */
-
-invalidate_dcache:
-       addi    r6,0,0x0000             /* clear GPR 6 */
-       /* Do loop for # of dcache congruence classes. */
-       lis     r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS for large sized cache */
-       ori     r7, r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
-                                       /* NOTE: dccci invalidates both */
-       mtctr   r7                      /* ways in the D cache */
-..dcloop:
-       dccci   0,r6                    /* invalidate line */
-       addi    r6,r6, CFG_CACHELINE_SIZE /* bump to next line */
-       bdnz    ..dcloop
-       blr
-
 flush_dcache:
        addis   r9,r0,0x0002            /* set mask for EE and CE msr bits */
        ori     r9,r9,0x8000
@@ -1255,24 +1322,6 @@ wr_tcr:
        blr
 
 /*------------------------------------------------------------------------------- */
-/* Function:    in8 */
-/* Description:         Input 8 bits */
-/*------------------------------------------------------------------------------- */
-       .globl  in8
-in8:
-       lbz     r3,0x0000(r3)
-       blr
-
-/*------------------------------------------------------------------------------- */
-/* Function:    out8 */
-/* Description:         Output 8 bits */
-/*------------------------------------------------------------------------------- */
-       .globl  out8
-out8:
-       stb     r4,0x0000(r3)
-       blr
-
-/*------------------------------------------------------------------------------- */
 /* Function:    out16 */
 /* Description:         Output 16 bits */
 /*------------------------------------------------------------------------------- */
@@ -1291,15 +1340,6 @@ out16r:
        blr
 
 /*------------------------------------------------------------------------------- */
-/* Function:    out32 */
-/* Description:         Output 32 bits */
-/*------------------------------------------------------------------------------- */
-       .globl  out32
-out32:
-       stw     r4,0x0000(r3)
-       blr
-
-/*------------------------------------------------------------------------------- */
 /* Function:    out32r */
 /* Description:         Byte reverse and output 32 bits */
 /*------------------------------------------------------------------------------- */
@@ -1327,15 +1367,6 @@ in16r:
        blr
 
 /*------------------------------------------------------------------------------- */
-/* Function:    in32 */
-/* Description:         Input 32 bits */
-/*------------------------------------------------------------------------------- */
-       .globl  in32
-in32:
-       lwz     3,0x0000(3)
-       blr
-
-/*------------------------------------------------------------------------------- */
 /* Function:    in32r */
 /* Description:         Input 32 bits and byte reverse */
 /*------------------------------------------------------------------------------- */
@@ -1377,9 +1408,6 @@ ppcSync:
        sync
        blr
 
-/*------------------------------------------------------------------------------*/
-
-#ifndef CONFIG_NAND_SPL
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
  *
@@ -1644,8 +1672,105 @@ trap_reloc:
        stw     r0, 4(r7)
 
        blr
+
+#if defined(CONFIG_440)
+/*----------------------------------------------------------------------------+
+| dcbz_area.
++----------------------------------------------------------------------------*/
+       function_prolog(dcbz_area)
+       rlwinm. r5,r4,0,27,31
+       rlwinm  r5,r4,27,5,31
+       beq     ..d_ra2
+       addi    r5,r5,0x0001
+..d_ra2:mtctr   r5
+..d_ag2:dcbz    r0,r3
+       addi    r3,r3,32
+       bdnz    ..d_ag2
+       sync
+       blr
+       function_epilog(dcbz_area)
+
+/*----------------------------------------------------------------------------+
+| dflush.  Assume 32K at vector address is cachable.
++----------------------------------------------------------------------------*/
+       function_prolog(dflush)
+       mfmsr   r9
+       rlwinm  r8,r9,0,15,13
+       rlwinm  r8,r8,0,17,15
+       mtmsr   r8
+       addi    r3,r0,0x0000
+       mtspr   dvlim,r3
+       mfspr   r3,ivpr
+       addi    r4,r0,1024
+       mtctr   r4
+..dflush_loop:
+       lwz     r6,0x0(r3)
+       addi    r3,r3,32
+       bdnz    ..dflush_loop
+       addi    r3,r3,-32
+       mtctr   r4
+..ag:   dcbf    r0,r3
+       addi    r3,r3,-32
+       bdnz    ..ag
+       sync
+       mtmsr   r9
+       blr
+       function_epilog(dflush)
+#endif /* CONFIG_440 */
 #endif /* CONFIG_NAND_SPL */
 
+/*------------------------------------------------------------------------------- */
+/* Function:    in8 */
+/* Description:         Input 8 bits */
+/*------------------------------------------------------------------------------- */
+       .globl  in8
+in8:
+       lbz     r3,0x0000(r3)
+       blr
+
+/*------------------------------------------------------------------------------- */
+/* Function:    out8 */
+/* Description:         Output 8 bits */
+/*------------------------------------------------------------------------------- */
+       .globl  out8
+out8:
+       stb     r4,0x0000(r3)
+       blr
+
+/*------------------------------------------------------------------------------- */
+/* Function:    out32 */
+/* Description:         Output 32 bits */
+/*------------------------------------------------------------------------------- */
+       .globl  out32
+out32:
+       stw     r4,0x0000(r3)
+       blr
+
+/*------------------------------------------------------------------------------- */
+/* Function:    in32 */
+/* Description:         Input 32 bits */
+/*------------------------------------------------------------------------------- */
+       .globl  in32
+in32:
+       lwz     3,0x0000(3)
+       blr
+
+invalidate_icache:
+       iccci   r0,r0                   /* for 405, iccci invalidates the */
+       blr                             /*   entire I cache */
+
+invalidate_dcache:
+       addi    r6,0,0x0000             /* clear GPR 6 */
+       /* Do loop for # of dcache congruence classes. */
+       lis     r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@ha       /* TBS for large sized cache */
+       ori     r7, r7, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)@l
+                                       /* NOTE: dccci invalidates both */
+       mtctr   r7                      /* ways in the D cache */
+..dcloop:
+       dccci   0,r6                    /* invalidate line */
+       addi    r6,r6, CFG_CACHELINE_SIZE /* bump to next line */
+       bdnz    ..dcloop
+       blr
 
 /**************************************************************************/
 /* PPC405EP specific stuff                                               */
@@ -1892,13 +2017,6 @@ pll_wait:
 #endif /* CONFIG_405EP */
 
 #if defined(CONFIG_440)
-#define function_prolog(func_name)     .text; \
-                                       .align 2; \
-                                       .globl func_name; \
-                                       func_name:
-#define function_epilog(func_name)     .type func_name,@function; \
-                                       .size func_name,.-func_name
-
 /*----------------------------------------------------------------------------+
 | mttlb3.
 +----------------------------------------------------------------------------*/
@@ -1946,47 +2064,4 @@ pll_wait:
        TLBRE(3,3,0)
        blr
        function_epilog(mftlb1)
-
-/*----------------------------------------------------------------------------+
-| dcbz_area.
-+----------------------------------------------------------------------------*/
-       function_prolog(dcbz_area)
-       rlwinm. r5,r4,0,27,31
-       rlwinm  r5,r4,27,5,31
-       beq     ..d_ra2
-       addi    r5,r5,0x0001
-..d_ra2:mtctr  r5
-..d_ag2:dcbz   r0,r3
-       addi    r3,r3,32
-       bdnz    ..d_ag2
-       sync
-       blr
-       function_epilog(dcbz_area)
-
-/*----------------------------------------------------------------------------+
-| dflush.  Assume 32K at vector address is cachable.
-+----------------------------------------------------------------------------*/
-       function_prolog(dflush)
-       mfmsr   r9
-       rlwinm  r8,r9,0,15,13
-       rlwinm  r8,r8,0,17,15
-       mtmsr   r8
-       addi    r3,r0,0x0000
-       mtspr   dvlim,r3
-       mfspr   r3,ivpr
-       addi    r4,r0,1024
-       mtctr   r4
-..dflush_loop:
-       lwz     r6,0x0(r3)
-       addi    r3,r3,32
-       bdnz    ..dflush_loop
-       addi    r3,r3,-32
-       mtctr   r4
-..ag:  dcbf    r0,r3
-       addi    r3,r3,-32
-       bdnz    ..ag
-       sync
-       mtmsr   r9
-       blr
-       function_epilog(dflush)
 #endif /* CONFIG_440 */
old mode 100644 (file)
new mode 100755 (executable)
index acc1a74..61e6579
@@ -180,6 +180,7 @@ void dev_print (block_dev_desc_t *dev_desc)
      (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
      (CONFIG_COMMANDS & CFG_CMD_USB)   || \
      defined(CONFIG_MMC)               || \
+     (defined(CONFIG_MMC) && defined(CONFIG_LPC2292)) || \
      defined(CONFIG_SYSTEMACE)          )
 
 #if defined(CONFIG_MAC_PARTITION) || \
@@ -219,7 +220,8 @@ void init_part (block_dev_desc_t * dev_desc)
 }
 
 
-int get_partition_info (block_dev_desc_t *dev_desc, int part, disk_partition_t *info)
+int get_partition_info (block_dev_desc_t *dev_desc, int part
+                                       , disk_partition_t *info)
 {
                switch (dev_desc->part_type) {
 #ifdef CONFIG_MAC_PARTITION
@@ -325,7 +327,8 @@ void print_part (block_dev_desc_t * dev_desc)
 
 
 #else  /* neither MAC nor DOS nor ISO partition configured */
-# error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION nor CONFIG_ISO_PARTITION configured!
+# error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION 
+# error nor CONFIG_ISO_PARTITION configured!
 #endif
 
 #endif /* (CONFIG_COMMANDS & CFG_CMD_IDE) || CONFIG_COMMANDS & CFG_CMD_SCSI) */
diff --git a/doc/README.mpc8313erdb b/doc/README.mpc8313erdb
new file mode 100644 (file)
index 0000000..7ad4cc7
--- /dev/null
@@ -0,0 +1,83 @@
+Freescale MPC8313ERDB Board
+-----------------------------------------
+
+1.     Board Switches and Jumpers
+
+       SW3 is used to set CFG_RESET_SOURCE.
+
+       To boot the image at 0xFE000000 in NOR flash, use these DIP
+       switche settings for SW3 SW4:
+
+       +------+        +------+
+       |      |        | **** |
+       | **** |        |      |
+       +------+ ON     +------+ ON
+         4321            4321
+       (where the '*' indicates the position of the tab of the switch.)
+
+2.     Memory Map
+       The memory map looks like this:
+
+       0x0000_0000     0x07ff_ffff     DDR              128M
+       0x8000_0000     0x8fff_ffff     PCI MEM          256M
+       0x9000_0000     0x9fff_ffff     PCI_MMIO         256M
+       0xe000_0000     0xe00f_ffff     IMMR             1M
+       0xe200_0000     0xe20f_ffff     PCI IO           16M
+       0xe280_0000     0xe280_7fff     NAND FLASH (CS1) 32K
+       0xf000_0000     0xf001_ffff     VSC7385 (CS2)    128K
+       0xfa00_0000     0xfa00_7fff     Board Status/    32K
+                                       LED Control (CS3)
+       0xfe00_0000     0xfe7f_ffff     NOR FLASH (CS0)  8M
+
+3.     Definitions
+
+3.1    Explanation of NEW definitions in:
+
+       include/configs/MPC8313ERDB.h
+
+       CONFIG_MPC83xx          MPC83xx family
+       CONFIG_MPC831x          MPC831x specific
+       CONFIG_MPC8313ERDB      MPC8313ERDB board specific
+
+4.     Compilation
+
+       Assuming you're using BASH (or similar) as your shell:
+
+       export CROSS_COMPILE=your-cross-compiler-prefix-
+       make distclean
+       make MPC8313ERDB_33_config
+       (or make MPC8313ERDB_66_config, depending on the speed of
+        the oscillator on your board)
+       make
+
+5.     Downloading and Flashing Images
+
+5.1    Reflash U-boot Image using U-boot
+
+       =>run tftpflash
+
+       You may want to try
+       =>tftpboot $loadaddr $uboot
+       first, to make sure that the TFTP load will succeed before it
+       goes ahead and wipes out your current firmware.  And of course,
+       have an alternate means of programming the flash available
+       if the new u-boot doesn't boot.
+
+5.2    Downloading and Booting Linux Kernel
+
+       Ensure that all networking-related environment variables are set
+       properly (including ipaddr, serverip, gatewayip (if needed),
+       netmask, ethaddr, eth1addr, rootpath (if using NFS root),
+       fdtfile, and bootfile).
+
+       Then, do one of the following, depending on whether you
+       want an NFS root or a ramdisk root:
+
+       =>run nfsboot
+       or
+       =>run ramboot
+
+6      Notes
+
+       Booting from NAND flash is not yet supported.
+       The console baudrate for MPC8313ERDB is 115200bps.
index d68cba6..c7fcc3f 100644 (file)
@@ -30,7 +30,7 @@ LIB   = $(obj)libdrivers.a
 COBJS  = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          bcm570x.o bcm570x_autoneg.o cfb_console.o cfi_flash.o \
          cs8900.o ct69000.o dataflash.o dc2114x.o dm9000x.o \
-         e1000.o eepro100.o \
+         e1000.o eepro100.o enc28j60.o \
          i8042.o inca-ip_sw.o keyboard.o \
          lan91c96.o macb.o \
          natsemi.o ne2000.o netarm_eth.o netconsole.o \
old mode 100644 (file)
new mode 100755 (executable)
similarity index 80%
rename from board/lpc2292sodimm/eth.c
rename to drivers/enc28j60.c
index 249ab04..36b084c
 
 #include <config.h>
 #include <common.h>
+#ifdef CONFIG_ENC28J60
 #include <net.h>
 #include <asm/arch/hardware.h>
-#include "spi.h"
+#include <asm/arch/spi.h>
 
 /*
  * Control Registers in Bank 0
@@ -36,7 +37,7 @@
 #define CTL_REG_ERXSTL  0x08
 #define CTL_REG_ERXSTH  0x09
 #define CTL_REG_ERXNDL  0x0A
-#define CTL_REG_ERXNDA  0x0B
+#define CTL_REG_ERXNDH  0x0B
 #define CTL_REG_ERXRDPTL 0x0C
 #define CTL_REG_ERXRDPTH 0x0D
 #define CTL_REG_ERXWRPTL 0x0E
 
 #define PHY_REG_PHID1 0x02
 #define PHY_REG_PHID2 0x03
-
+/* taken from the Linux driver */
+#define PHY_REG_PHCON1 0x00
+#define PHY_REG_PHCON2 0x10
+#define PHY_REG_PHLCON 0x14
 
 /*
  * Receive Filter Register (ERXFCON) bits
 /* Use the lower memory for receiver buffer. See errata pt. 5 */
 #define ENC_RX_BUF_START 0x0000
 #define ENC_TX_BUF_START 0x1800
+/* taken from the Linux driver */
+#define ENC_RX_BUF_END   0x17ff
+#define ENC_TX_BUF_END   0x1fff
 
 /* maximum frame length */
 #define ENC_MAX_FRM_LEN 1518
@@ -293,6 +300,7 @@ static void encBitClr (unsigned char regNo, unsigned char data);
 static void encReset (void);
 static void encInit (unsigned char *pEthAddr);
 static unsigned short phyRead (unsigned char addr);
+static void phyWrite(unsigned char, unsigned short);
 static void encPoll (void);
 static void encRx (void);
 
@@ -318,10 +326,12 @@ static int rxResetCounter = 0;
 #define RX_RESET_COUNTER 1000;
 
 /*-----------------------------------------------------------------------------
- * Returns 0 when failes otherwize 1
+ * Always returns 0
  */
 int eth_init (bd_t * bis)
 {
+       unsigned char estatVal;
+
        /* configure GPIO */
        (*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS;
        (*((volatile unsigned long *) IO1DIR)) |= ENC_RESET;
@@ -332,6 +342,14 @@ int eth_init (bd_t * bis)
 
        spi_init ();
 
+       /* taken from the Linux driver - dangerous stuff here! */
+       /* Wait for CLKRDY to become set (i.e., check that we can communicate with
+          the ENC) */
+       do
+       {
+               estatVal = m_nic_read(CTL_REG_ESTAT);
+       } while ((estatVal & 0x08) || (~estatVal & ENC_ESTAT_CLKRDY));
+
        /* initialize controller */
        encReset ();
        encInit (bis->bi_enetaddr);
@@ -353,6 +371,10 @@ int eth_send (volatile void *packet, int length)
        m_nic_write (CTL_REG_EWRPTL, (ENC_TX_BUF_START & 0xff));
        m_nic_write (CTL_REG_EWRPTH, (ENC_TX_BUF_START >> 8));
 
+       /* set ETXND */
+       m_nic_write (CTL_REG_ETXNDL, (length + ENC_TX_BUF_START) & 0xFF);
+       m_nic_write (CTL_REG_ETXNDH, (length + ENC_TX_BUF_START) >> 8);
+
        /* set ETXST */
        m_nic_write (CTL_REG_ETXSTL, ENC_TX_BUF_START & 0xFF);
        m_nic_write (CTL_REG_ETXSTH, ENC_TX_BUF_START >> 8);
@@ -360,9 +382,15 @@ int eth_send (volatile void *packet, int length)
        /* write packet */
        m_nic_write_data (length, (unsigned char *) packet);
 
-       /* set ETXND */
-       m_nic_write (CTL_REG_ETXNDL, (length + ENC_TX_BUF_START) & 0xFF);
-       m_nic_write (CTL_REG_ETXNDH, (length + ENC_TX_BUF_START) >> 8);
+       /* taken from the Linux driver */
+       /* Verify that the internal transmit logic has not been altered by excessive
+          collisions.  See Errata B4 12 and 14.
+        */
+       if (m_nic_read(CTL_REG_EIR) & ENC_EIR_TXERIF) {
+               m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_TXRST);
+               m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_TXRST);
+       }
+       m_nic_bfc(CTL_REG_EIR, (ENC_EIR_TXERIF | ENC_EIR_TXIF));
 
        /* set ECON1.TXRTS */
        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_TXRTS);
@@ -423,8 +451,10 @@ static void encPoll (void)
        volatile unsigned char estat_reg;
        unsigned char pkt_cnt;
 
+#ifdef CONFIG_USE_IRQ
        /* clear global interrupt enable bit in enc28j60 */
        m_nic_bfc (CTL_REG_EIE, ENC_EIE_INTIE);
+#endif
        estat_reg = m_nic_read (CTL_REG_ESTAT);
 
        eir_reg = m_nic_read (CTL_REG_EIR);
@@ -462,8 +492,10 @@ static void encPoll (void)
                m_nic_bfc (CTL_REG_EIR, ENC_EIR_TXERIF);
        }
 
+#ifdef CONFIG_USE_IRQ
        /* set global interrupt enable bit in enc28j60 */
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
+#endif
 }
 
 static void encRx (void)
@@ -473,6 +505,7 @@ static void encRx (void)
        unsigned short status;
        unsigned char eir_reg;
        unsigned char pkt_cnt = 0;
+       unsigned short rxbuf_rdpt;
 
        /* switch to bank 0 */
        m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
@@ -489,18 +522,19 @@ static void encRx (void)
                status = buffer[4];
                status |= (unsigned short) buffer[5] << 8;
 
-               if (pkt_len <= ENC_MAX_FRM_LEN) {
+               if (pkt_len <= ENC_MAX_FRM_LEN)
                        copy_len = pkt_len;
-               } else {
+               else
                        copy_len = 0;
-                       /*      p_priv->stats.rx_dropped++; */
-                       /* we will drop this packet */
-               }
 
-               if ((status & (1L << 7)) == 0) {        /* check Received Ok bit */
+               if ((status & (1L << 7)) == 0) /* check Received Ok bit */
+                       copy_len = 0;
+
+               /* taken from the Linux driver */
+               /* check if next pointer is resonable */
+               if ((((unsigned int)next_pointer_msb << 8) |
+                       (unsigned int)next_pointer_lsb) >= ENC_TX_BUF_START)
                        copy_len = 0;
-                       /*      p_priv->stats.rx_errors++; */
-               }
 
                if (copy_len > 0) {
                        m_nic_read_data (copy_len, buffer);
@@ -513,6 +547,22 @@ static void encRx (void)
                /* decrease packet counter */
                m_nic_bfs (CTL_REG_ECON2, ENC_ECON2_PKTDEC);
 
+               /* taken from the Linux driver */
+               /* Only odd values should be written to ERXRDPTL, 
+                * see errata B4 pt.13 
+                */
+               rxbuf_rdpt = (next_pointer_msb << 8 | next_pointer_lsb) - 1;
+               if ((rxbuf_rdpt < (m_nic_read(CTL_REG_ERXSTH) << 8 |
+                               m_nic_read(CTL_REG_ERXSTL))) || (rxbuf_rdpt >
+                               (m_nic_read(CTL_REG_ERXNDH) << 8 |
+                               m_nic_read(CTL_REG_ERXNDL)))) {
+                       m_nic_write(CTL_REG_ERXRDPTL, m_nic_read(CTL_REG_ERXNDL));
+                       m_nic_write(CTL_REG_ERXRDPTH, m_nic_read(CTL_REG_ERXNDH));
+               } else {
+                       m_nic_write(CTL_REG_ERXRDPTL, rxbuf_rdpt & 0xFF);
+                       m_nic_write(CTL_REG_ERXRDPTH, rxbuf_rdpt >> 8);
+               }
+
                /* move to bank 1 */
                m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
                m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
@@ -535,8 +585,6 @@ static void encRx (void)
 
                eir_reg = m_nic_read (CTL_REG_EIR);
        } while (pkt_cnt);      /* Use EPKTCNT not EIR.PKTIF flag, see errata pt. 6 */
-       m_nic_write (CTL_REG_ERXRDPTL, next_pointer_lsb);
-       m_nic_write (CTL_REG_ERXRDPTH, next_pointer_msb);
 }
 
 static void encWriteReg (unsigned char regNo, unsigned char data)
@@ -700,12 +748,6 @@ static void encReset (void)
 
        /* sleep 1 ms. See errata pt. 2 */
        udelay (1000);
-
-#if 0
-       (*((volatile unsigned long *) IO1CLR)) &= ENC_RESET;
-       mdelay (5);
-       (*((volatile unsigned long *) IO1SET)) &= ENC_RESET;
-#endif
 }
 
 static void encInit (unsigned char *pEthAddr)
@@ -720,44 +762,21 @@ static void encInit (unsigned char *pEthAddr)
         * Setup the buffer space. The reset values are valid for the
         * other pointers.
         */
-#if 0
        /* We shall not write to ERXST, see errata pt. 5. Instead we
           have to make sure that ENC_RX_BUS_START is 0. */
        m_nic_write_retry (CTL_REG_ERXSTL, (ENC_RX_BUF_START & 0xFF), 1);
        m_nic_write_retry (CTL_REG_ERXSTH, (ENC_RX_BUF_START >> 8), 1);
-#endif
+
+       /* taken from the Linux driver */
+       m_nic_write_retry (CTL_REG_ERXNDL, (ENC_RX_BUF_END & 0xFF), 1);
+       m_nic_write_retry (CTL_REG_ERXNDH, (ENC_RX_BUF_END >> 8), 1);
+
        m_nic_write_retry (CTL_REG_ERDPTL, (ENC_RX_BUF_START & 0xFF), 1);
        m_nic_write_retry (CTL_REG_ERDPTH, (ENC_RX_BUF_START >> 8), 1);
 
        next_pointer_lsb = (ENC_RX_BUF_START & 0xFF);
        next_pointer_msb = (ENC_RX_BUF_START >> 8);
 
-       /*
-        * For tracking purposes, the ERXRDPT registers should be programmed with
-        * the same value. This is the read pointer.
-        */
-       m_nic_write (CTL_REG_ERXRDPTL, (ENC_RX_BUF_START & 0xFF));
-       m_nic_write_retry (CTL_REG_ERXRDPTH, (ENC_RX_BUF_START >> 8), 1);
-
-       /* Setup receive filters. */
-
-       /* move to bank 1 */
-       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
-       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
-
-       /* OR-filtering, Unicast, CRC-check and broadcast */
-       m_nic_write_retry (CTL_REG_ERXFCON,
-                          (ENC_RFR_UCEN | ENC_RFR_CRCEN | ENC_RFR_BCEN), 1);
-
-       /* Wait for Oscillator Start-up Timer (OST). */
-       while ((m_nic_read (CTL_REG_ESTAT) & ENC_ESTAT_CLKRDY) == 0) {
-               static int cnt = 0;
-
-               if (cnt++ >= 1000) {
-                       cnt = 0;
-               }
-       }
-
        /* verify identification */
        phid1 = phyRead (PHY_REG_PHID1);
        phid2 = phyRead (PHY_REG_PHID2);
@@ -780,16 +799,34 @@ static void encInit (unsigned char *pEthAddr)
        /* switch to bank 2 */
        m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL0);
        m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL1);
-       /* clear MAC reset bits */
-       m_nic_write_retry (CTL_REG_MACON2, 0, 1);
 
        /* enable MAC to receive frames */
-       m_nic_write_retry (CTL_REG_MACON1, ENC_MACON1_MARXEN, 10);
+       /* added some bits from the Linux driver */
+       m_nic_write_retry (CTL_REG_MACON1
+               ,(ENC_MACON1_MARXEN | ENC_MACON1_TXPAUS | ENC_MACON1_RXPAUS)
+               ,10);
 
        /* configure pad, tx-crc and duplex */
-       /* TODO maybe enable FRMLNEN */
-       m_nic_write_retry (CTL_REG_MACON3,
-                          (ENC_MACON3_PADCFG0 | ENC_MACON3_TXCRCEN), 10);
+       /* added a bit from the Linux driver */
+       m_nic_write_retry (CTL_REG_MACON3
+               ,(ENC_MACON3_PADCFG0 | ENC_MACON3_TXCRCEN | ENC_MACON3_FRMLNEN)
+               ,10);
+
+       /* added 4 new lines from the Linux driver */
+       /* Allow infinite deferals if the medium is continously busy */
+       m_nic_write_retry(CTL_REG_MACON4, (1<<6) /*ENC_MACON4_DEFER*/, 10);
+
+       /* Late collisions occur beyond 63 bytes */
+       m_nic_write_retry(CTL_REG_MACLCON2, 63, 10);
+
+       /* Set (low byte) Non-Back-to_Back Inter-Packet Gap. Recommended 0x12 */
+       m_nic_write_retry(CTL_REG_MAIPGL, 0x12, 10);
+
+       /*
+       * Set (high byte) Non-Back-to_Back Inter-Packet Gap. Recommended
+       * 0x0c for half-duplex. Nothing for full-duplex
+       */
+       m_nic_write_retry(CTL_REG_MAIPGH, 0x0C, 10);
 
        /* set maximum frame length */
        m_nic_write_retry (CTL_REG_MAMXFLL, (ENC_MAX_FRM_LEN & 0xff), 10);
@@ -801,15 +838,6 @@ static void encInit (unsigned char *pEthAddr)
         */
        m_nic_write_retry (CTL_REG_MABBIPG, 0x12, 10);
 
-       /* Set (low byte) Non-Back-to_Back Inter-Packet Gap. Recommended 0x12 */
-       m_nic_write_retry (CTL_REG_MAIPGL, 0x12, 10);
-
-       /*
-        * Set (high byte) Non-Back-to_Back Inter-Packet Gap. Recommended
-        * 0x0c for half-duplex. Nothing for full-duplex
-        */
-       m_nic_write_retry (CTL_REG_MAIPGH, 0x0C, 10);
-
        /* set MAC address */
 
        /* switch to bank 3 */
@@ -823,18 +851,35 @@ static void encInit (unsigned char *pEthAddr)
        m_nic_write_retry (CTL_REG_MAADR5, pEthAddr[0], 1);
 
        /*
-        * Receive settings
+       * PHY Initialization taken from the Linux driver
         */
 
-       /* auto-increment RX-pointer when reading a received packet */
-       m_nic_bfs (CTL_REG_ECON2, ENC_ECON2_AUTOINC);
+       /* Prevent automatic loopback of data beeing transmitted by setting
+          ENC_PHCON2_HDLDIS */
+       phyWrite(PHY_REG_PHCON2, (1<<8));
+
+       /* LEDs configuration
+        * LEDA: LACFG = 0100 -> display link status
+        * LEDB: LBCFG = 0111 -> display TX & RX activity
+        * STRCH = 1 -> LED pulses
+        */
+       phyWrite(PHY_REG_PHLCON, 0x0472);
 
+       /* Reset PDPXMD-bit => half duplex */
+       phyWrite(PHY_REG_PHCON1, 0);
+
+       /*
+        * Receive settings
+        */
+
+#ifdef CONFIG_USE_IRQ
        /* enable interrupts */
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_PKTIE);
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXIE);
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_RXERIE);
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXERIE);
        m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
+#endif
 }
 
 /*****************************************************************************
@@ -864,6 +909,11 @@ static unsigned short phyRead (unsigned char addr)
        /* set MICMD.MIIRD */
        m_nic_write (CTL_REG_MICMD, ENC_MICMD_MIIRD);
 
+       /* taken from the Linux driver */
+       /* move to bank 3 */
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
+
        /* poll MISTAT.BUSY bit until operation is complete */
        while ((m_nic_read (CTL_REG_MISTAT) & ENC_MISTAT_BUSY) != 0) {
                static int cnt = 0;
@@ -875,6 +925,11 @@ static unsigned short phyRead (unsigned char addr)
                }
        }
 
+       /* taken from the Linux driver */
+       /* move to bank 2 */
+       m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
+
        /* clear MICMD.MIIRD */
        m_nic_write (CTL_REG_MICMD, 0);
 
@@ -883,3 +938,46 @@ static unsigned short phyRead (unsigned char addr)
 
        return ret;
 }
+
+/*****************************************************************************
+ *
+ * Taken from the Linux driver.
+ * Description:
+ * Write PHY registers.
+ *
+ * NOTE! This function will change to Bank 3.
+ *
+ * Params:
+ * [in] addr address of the register to write to
+ * [in] data to be written
+ *
+ * Returns:
+ *    None
+ */
+static void phyWrite(unsigned char addr, unsigned short data)
+{
+       /* move to bank 2 */
+       m_nic_bfc(CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
+
+       /* write address to MIREGADR */
+       m_nic_write(CTL_REG_MIREGADR, addr);
+
+       m_nic_write(CTL_REG_MIWRL, data & 0xff);
+       m_nic_write(CTL_REG_MIWRH, data >> 8);
+
+       /* move to bank 3 */
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs(CTL_REG_ECON1, ENC_ECON1_BSEL1);
+
+       /* poll MISTAT.BUSY bit until operation is complete */
+       while((m_nic_read(CTL_REG_MISTAT) & ENC_MISTAT_BUSY) != 0) {
+               static int cnt = 0;
+
+               if(cnt++ >= 1000) {
+                       cnt = 0;
+               }
+       }
+}
+
+#endif /* CONFIG_ENC28J60 */
index f33be96..90274e6 100644 (file)
 #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY)
 
 #include<linux/mtd/mtd.h>
+
+/*
+ * NAND-SPL has no sofware ECC for now, so don't include nand_calculate_ecc(),
+ * only nand_correct_data() is needed
+ */
+
+#ifndef CONFIG_NAND_SPL
 /*
  * Pre-calculated 256-way 1 byte column parity
  */
@@ -62,90 +69,75 @@ static const u_char nand_ecc_precalc_table[] = {
        0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00
 };
 
-
-/**
- * nand_trans_result - [GENERIC] create non-inverted ECC
- * @reg2:      line parity reg 2
- * @reg3:      line parity reg 3
- * @ecc_code:  ecc
- *
- * Creates non-inverted ECC code from line parity
- */
-static void nand_trans_result(u_char reg2, u_char reg3,
-       u_char *ecc_code)
-{
-       u_char a, b, i, tmp1, tmp2;
-
-       /* Initialize variables */
-       a = b = 0x80;
-       tmp1 = tmp2 = 0;
-
-       /* Calculate first ECC byte */
-       for (i = 0; i < 4; i++) {
-               if (reg3 & a)           /* LP15,13,11,9 --> ecc_code[0] */
-                       tmp1 |= b;
-               b >>= 1;
-               if (reg2 & a)           /* LP14,12,10,8 --> ecc_code[0] */
-                       tmp1 |= b;
-               b >>= 1;
-               a >>= 1;
-       }
-
-       /* Calculate second ECC byte */
-       b = 0x80;
-       for (i = 0; i < 4; i++) {
-               if (reg3 & a)           /* LP7,5,3,1 --> ecc_code[1] */
-                       tmp2 |= b;
-               b >>= 1;
-               if (reg2 & a)           /* LP6,4,2,0 --> ecc_code[1] */
-                       tmp2 |= b;
-               b >>= 1;
-               a >>= 1;
-       }
-
-       /* Store two of the ECC bytes */
-       ecc_code[0] = tmp1;
-       ecc_code[1] = tmp2;
-}
-
 /**
- * nand_calculate_ecc - [NAND Interface] Calculate 3 byte ECC code for 256 byte block
+ * nand_calculate_ecc - [NAND Interface] Calculate 3-byte ECC for 256-byte block
  * @mtd:       MTD block structure
  * @dat:       raw data
  * @ecc_code:  buffer for ECC
  */
-int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code)
+int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
+                      u_char *ecc_code)
 {
-       u_char idx, reg1, reg2, reg3;
-       int j;
+       uint8_t idx, reg1, reg2, reg3, tmp1, tmp2;
+       int i;
 
        /* Initialize variables */
        reg1 = reg2 = reg3 = 0;
-       ecc_code[0] = ecc_code[1] = ecc_code[2] = 0;
 
        /* Build up column parity */
-       for(j = 0; j < 256; j++) {
-
+       for(i = 0; i < 256; i++) {
                /* Get CP0 - CP5 from table */
-               idx = nand_ecc_precalc_table[dat[j]];
+               idx = nand_ecc_precalc_table[*dat++];
                reg1 ^= (idx & 0x3f);
 
                /* All bit XOR = 1 ? */
                if (idx & 0x40) {
-                       reg3 ^= (u_char) j;
-                       reg2 ^= ~((u_char) j);
+                       reg3 ^= (uint8_t) i;
+                       reg2 ^= ~((uint8_t) i);
                }
        }
 
        /* Create non-inverted ECC code from line parity */
-       nand_trans_result(reg2, reg3, ecc_code);
+       tmp1  = (reg3 & 0x80) >> 0; /* B7 -> B7 */
+       tmp1 |= (reg2 & 0x80) >> 1; /* B7 -> B6 */
+       tmp1 |= (reg3 & 0x40) >> 1; /* B6 -> B5 */
+       tmp1 |= (reg2 & 0x40) >> 2; /* B6 -> B4 */
+       tmp1 |= (reg3 & 0x20) >> 2; /* B5 -> B3 */
+       tmp1 |= (reg2 & 0x20) >> 3; /* B5 -> B2 */
+       tmp1 |= (reg3 & 0x10) >> 3; /* B4 -> B1 */
+       tmp1 |= (reg2 & 0x10) >> 4; /* B4 -> B0 */
+
+       tmp2  = (reg3 & 0x08) << 4; /* B3 -> B7 */
+       tmp2 |= (reg2 & 0x08) << 3; /* B3 -> B6 */
+       tmp2 |= (reg3 & 0x04) << 3; /* B2 -> B5 */
+       tmp2 |= (reg2 & 0x04) << 2; /* B2 -> B4 */
+       tmp2 |= (reg3 & 0x02) << 2; /* B1 -> B3 */
+       tmp2 |= (reg2 & 0x02) << 1; /* B1 -> B2 */
+       tmp2 |= (reg3 & 0x01) << 1; /* B0 -> B1 */
+       tmp2 |= (reg2 & 0x01) << 0; /* B7 -> B0 */
 
        /* Calculate final ECC code */
-       ecc_code[0] = ~ecc_code[0];
-       ecc_code[1] = ~ecc_code[1];
+#ifdef CONFIG_MTD_NAND_ECC_SMC
+       ecc_code[0] = ~tmp2;
+       ecc_code[1] = ~tmp1;
+#else
+       ecc_code[0] = ~tmp1;
+       ecc_code[1] = ~tmp2;
+#endif
        ecc_code[2] = ((~reg1) << 2) | 0x03;
+
        return 0;
 }
+#endif /* CONFIG_NAND_SPL */
+
+static inline int countbits(uint32_t byte)
+{
+       int res = 0;
+
+       for (;byte; byte >>= 1)
+               res += byte & 0x01;
+       return res;
+}
 
 /**
  * nand_correct_data - [NAND Interface] Detect and correct bit error(s)
@@ -156,88 +148,52 @@ int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code
  *
  * Detect and correct a 1 bit error for 256 byte block
  */
-int nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc)
+int nand_correct_data(struct mtd_info *mtd, u_char *dat,
+                     u_char *read_ecc, u_char *calc_ecc)
 {
-       u_char a, b, c, d1, d2, d3, add, bit, i;
+       uint8_t s0, s1, s2;
+
+#ifdef CONFIG_MTD_NAND_ECC_SMC
+       s0 = calc_ecc[0] ^ read_ecc[0];
+       s1 = calc_ecc[1] ^ read_ecc[1];
+       s2 = calc_ecc[2] ^ read_ecc[2];
+#else
+       s1 = calc_ecc[0] ^ read_ecc[0];
+       s0 = calc_ecc[1] ^ read_ecc[1];
+       s2 = calc_ecc[2] ^ read_ecc[2];
+#endif
+       if ((s0 | s1 | s2) == 0)
+               return 0;
 
-       /* Do error detection */
-       d1 = calc_ecc[0] ^ read_ecc[0];
-       d2 = calc_ecc[1] ^ read_ecc[1];
-       d3 = calc_ecc[2] ^ read_ecc[2];
+       /* Check for a single bit error */
+       if( ((s0 ^ (s0 >> 1)) & 0x55) == 0x55 &&
+           ((s1 ^ (s1 >> 1)) & 0x55) == 0x55 &&
+           ((s2 ^ (s2 >> 1)) & 0x54) == 0x54) {
 
-       if ((d1 | d2 | d3) == 0) {
-               /* No errors */
-               return 0;
-       }
-       else {
-               a = (d1 ^ (d1 >> 1)) & 0x55;
-               b = (d2 ^ (d2 >> 1)) & 0x55;
-               c = (d3 ^ (d3 >> 1)) & 0x54;
-
-               /* Found and will correct single bit error in the data */
-               if ((a == 0x55) && (b == 0x55) && (c == 0x54)) {
-                       c = 0x80;
-                       add = 0;
-                       a = 0x80;
-                       for (i=0; i<4; i++) {
-                               if (d1 & c)
-                                       add |= a;
-                               c >>= 2;
-                               a >>= 1;
-                       }
-                       c = 0x80;
-                       for (i=0; i<4; i++) {
-                               if (d2 & c)
-                                       add |= a;
-                               c >>= 2;
-                               a >>= 1;
-                       }
-                       bit = 0;
-                       b = 0x04;
-                       c = 0x80;
-                       for (i=0; i<3; i++) {
-                               if (d3 & c)
-                                       bit |= b;
-                               c >>= 2;
-                               b >>= 1;
-                       }
-                       b = 0x01;
-                       a = dat[add];
-                       a ^= (b << bit);
-                       dat[add] = a;
-                       return 1;
-               } else {
-                       i = 0;
-                       while (d1) {
-                               if (d1 & 0x01)
-                                       ++i;
-                               d1 >>= 1;
-                       }
-                       while (d2) {
-                               if (d2 & 0x01)
-                                       ++i;
-                               d2 >>= 1;
-                       }
-                       while (d3) {
-                               if (d3 & 0x01)
-                                       ++i;
-                               d3 >>= 1;
-                       }
-                       if (i == 1) {
-                               /* ECC Code Error Correction */
-                               read_ecc[0] = calc_ecc[0];
-                               read_ecc[1] = calc_ecc[1];
-                               read_ecc[2] = calc_ecc[2];
-                               return 2;
-                       }
-                       else {
-                               /* Uncorrectable Error */
-                               return -1;
-                       }
-               }
+               uint32_t byteoffs, bitnum;
+
+               byteoffs = (s1 << 0) & 0x80;
+               byteoffs |= (s1 << 1) & 0x40;
+               byteoffs |= (s1 << 2) & 0x20;
+               byteoffs |= (s1 << 3) & 0x10;
+
+               byteoffs |= (s0 >> 4) & 0x08;
+               byteoffs |= (s0 >> 3) & 0x04;
+               byteoffs |= (s0 >> 2) & 0x02;
+               byteoffs |= (s0 >> 1) & 0x01;
+
+               bitnum = (s2 >> 5) & 0x04;
+               bitnum |= (s2 >> 4) & 0x02;
+               bitnum |= (s2 >> 3) & 0x01;
+
+               dat[byteoffs] ^= (1 << bitnum);
+
+               return 1;
        }
 
-       /* Should never happen */
+       if(countbits(s0 | ((uint32_t)s1 << 8) | ((uint32_t)s2 <<16)) == 1)
+               return 1;
+
        return -1;
 }
 
index 3848d9c..7d82c27 100644 (file)
@@ -211,10 +211,16 @@ static unsigned long systemace_read(int dev, unsigned long start,
                /* Write sector count | ReadMemCardData. */
                ace_writew((trans & 0xff) | 0x0300, 0x14);
 
+/*
+ * For FPGA configuration via SystemACE is reset unacceptable
+ * CFGDONE bit in STATUSREG is not set to 1.
+ */
+#ifndef SYSTEMACE_CONFIG_FPGA
                /* Reset the configruation controller */
                val = ace_readw(0x18);
                val |= 0x0080;
                ace_writew(val, 0x18);
+#endif
 
                retry = trans * 16;
                while (retry > 0) {
old mode 100644 (file)
new mode 100755 (executable)
index a823b5a..3007608
@@ -59,7 +59,8 @@ int disk_read (__u32 startblock, __u32 getsize, __u8 * bufptr)
        if (cur_dev == NULL)
                return -1;
        if (cur_dev->block_read) {
-               return cur_dev->block_read (cur_dev->dev, startblock, getsize, (unsigned long *)bufptr);
+               return cur_dev->block_read (cur_dev->dev
+                       , startblock, getsize, (unsigned long *)bufptr);
        }
        return -1;
 }
@@ -89,8 +90,11 @@ fat_register_device(block_dev_desc_t *dev_desc, int part_no)
                part_offset=0;
        }
        else {
-#if (CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI) || \
-    (CONFIG_COMMANDS & CFG_CMD_USB) || defined(CONFIG_SYSTEMACE)
+#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
+     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
+     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+     (defined(CONFIG_MMC) && defined(CONFIG_LPC2292)) || \
+     defined(CONFIG_SYSTEMACE)          )
                disk_partition_t info;
                if(!get_partition_info(dev_desc, part_no, &info)) {
                        part_offset = info.start;
@@ -993,7 +997,8 @@ file_fat_detectfs(void)
        memcpy (vol_label, volinfo.volume_label, 11);
        vol_label[11] = '\0';
        volinfo.fs_type[5]='\0';
-       printf("Partition %d: Filesystem: %s \"%s\"\n",cur_part,volinfo.fs_type,vol_label);
+       printf("Partition %d: Filesystem: %s \"%s\"\n"
+                       ,cur_part,volinfo.fs_type,vol_label);
        return 0;
 }
 
index 1b35585..d88d0f8 100644 (file)
@@ -45,7 +45,7 @@
 long zlib_decompress(unsigned char *data_in, unsigned char *cpage_out,
                      __u32 srclen, __u32 destlen)
 {
-    return (decompress_block(cpage_out, data_in + 2, ldr_memcpy));
+    return (decompress_block(cpage_out, data_in + 2, (void *) ldr_memcpy));
 
 }
 
index 1e9cd41..3056ca7 100644 (file)
@@ -36,8 +36,6 @@
 /* include armadillo specific hardware file if there was one */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
 /* include IntegratorCP/CM720T specific hardware file if there was one */
-#elif defined(CONFIG_LPC2292)
-#include <asm-arm/arch-arm720t/lpc2292_registers.h>
 #else
 #error No hardware file defined for this configuration
 #endif
similarity index 63%
rename from cpu/microblaze/enable_int.S
rename to include/asm-arm/arch-lpc2292/hardware.h
index c096c6c..fd2b464 100644 (file)
@@ -1,7 +1,9 @@
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
 /*
- * (C) Copyright 2007 Michal Simek
- *
- * Michal  SIMEK <monstrmonstr.eu>
+ * Copyright (c) 2004  Cucy Systems (http://www.cucy.com)
+ * Curt Brune <curt@cucy.com>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -13,7 +15,7 @@
  *
  * 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
+ * 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
  * MA 02111-1307 USA
  */
 
-       .text
-       .globl  microblaze_enable_interrupts
-       .ent    microblaze_enable_interrupts
-       .align  2
-microblaze_enable_interrupts:
-       addi    r1, r1, -4
-       swi     r12, r1, 0
-       mfs     r12, rmsr
-       ori     r12, r12, 2
-       mts     rmsr, r12
-       lwi     r12, r1, 0
-       rtsd    r15, 8
-       addi    r1, r1, 4
-       .end    microblaze_enable_interrupts
+#if defined(CONFIG_LPC2292)
+#include <asm-arm/arch-lpc2292/lpc2292_registers.h>
+#else
+#error No hardware file defined for this configuration
+#endif
+
+#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/include/asm-microblaze/asm.h b/include/asm-microblaze/asm.h
new file mode 100755 (executable)
index 0000000..f10f89c
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * 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
+ */
+
+/* FSL macros */
+#define NGET(val, fslnum) \
+       __asm__ __volatile__ ("nget %0, rfsl" #fslnum :"=r" (val));
+
+#define GET(val, fslnum) \
+       __asm__ __volatile__ ("get %0, rfsl" #fslnum :"=r" (val));
+
+#define NCGET(val, fslnum) \
+       __asm__ __volatile__ ("ncget %0, rfsl" #fslnum :"=r" (val));
+
+#define CGET(val, fslnum) \
+       __asm__ __volatile__ ("cget %0, rfsl" #fslnum :"=r" (val));
+
+#define NPUT(val, fslnum) \
+       __asm__ __volatile__ ("nput %0, rfsl" #fslnum ::"r" (val));
+
+#define PUT(val, fslnum) \
+       __asm__ __volatile__ ("put %0, rfsl" #fslnum ::"r" (val));
+
+#define NCPUT(val, fslnum) \
+       __asm__ __volatile__ ("ncput %0, rfsl" #fslnum ::"r" (val));
+
+#define CPUT(val, fslnum) \
+       __asm__ __volatile__ ("cput %0, rfsl" #fslnum ::"r" (val));
+
+/* CPU dependent */
+/* machine status register */
+#define MFS(val, reg) \
+       __asm__ __volatile__ ("mfs %0," #reg :"=r" (val));
+
+#define MTS(val, reg) \
+       __asm__ __volatile__ ("mts " #reg ", %0"::"r" (val));
+
+/* get return address from interrupt */
+#define R14(val) \
+       __asm__ __volatile__ ("addi %0, r14, 0":"=r" (val));
+
+#define NOP    __asm__ __volatile__ ("nop");
+
+/* use machine status registe USE_MSR_REG */
+#ifdef XILINX_USE_MSR_INSTR
+#define MSRSET(val) \
+       __asm__ __volatile__ ("msrset r0," #val );
+
+#define MSRCLR(val) \
+       __asm__ __volatile__ ("msrclr r0," #val );
+
+#else
+#define MSRSET(val)                                            \
+{                                                              \
+       register unsigned tmp;                                  \
+       __asm__ __volatile__ ("                                 \
+                       mfs     %0, rmsr;                       \
+                       ori     %0, %0, "#val";                 \
+                       mts     rmsr, %0;                       \
+                       nop;"                                   \
+                       : "=r" (tmp)                            \
+                       : "d" (val)                             \
+                       : "memory");                            \
+}
+
+#define MSRCLR(val)                                            \
+{                                                              \
+       register unsigned tmp;                                  \
+       __asm__ __volatile__ ("                                 \
+                       mfs     %0, rmsr;                       \
+                       andi    %0, %0, ~"#val";                \
+                       mts     rmsr, %0;                       \
+                       nop;"                                   \
+                       : "=r" (tmp)                            \
+                       : "d" (val)                             \
+                       : "memory");                            \
+}
+#endif
index 6635aea..4c385aa 100644 (file)
@@ -38,3 +38,6 @@ struct irq_action {
        void *arg;
        int count; /* number of interrupt */
 };
+
+void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
+                                      void *arg);
index ff9512f..d1bb159 100644 (file)
@@ -6,19 +6,9 @@
 #ifndef        __E300_H__
 #define __E300_H__
 
-/*
- * e300 Processor Version & Revision Numbers
- */
-#define PVR_83xx 0x80830000
-#define PVR_8349_REV10 (PVR_83xx | 0x0010)
-#define PVR_8349_REV11 (PVR_83xx | 0x0011)
-#define PVR_8360_REV10 (PVR_83xx | 0x0020)
-#define PVR_8360_REV11 (PVR_83xx | 0x0020)
-
-#if defined(CONFIG_MPC832X)
-#undef PVR_83xx
-#define PVR_83xx 0x80840000
-#endif
+#define PVR_E300C1     0x80830000
+#define PVR_E300C2     0x80840000
+#define PVR_E300C3     0x80850000
 
 /*
  * Hardware Implementation-Dependent Register 0 (HID0)
index 26bc875..cd24636 100644 (file)
@@ -55,11 +55,13 @@ typedef     struct  global_data {
 #if defined(CONFIG_MPC83XX)
        /* There are other clocks in the MPC83XX */
        u32 csb_clk;
-#if defined (CONFIG_MPC834X)
+#if defined (CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        u32 tsec1_clk;
        u32 tsec2_clk;
-       u32 usbmph_clk;
        u32 usbdr_clk;
+#endif
+#if defined (CONFIG_MPC834X)
+       u32 usbmph_clk;
 #endif /* CONFIG_MPC834X */
        u32 core_clk;
        u32 i2c1_clk;
index 5e088d6..0de9338 100644 (file)
@@ -206,7 +206,9 @@ typedef struct pmc83xx {
        u32 pmccr;              /* PMC Configuration Register */
        u32 pmcer;              /* PMC Event Register */
        u32 pmcmr;              /* PMC Mask Register */
-       u8 res0[0xF4];
+       u32 pmccr1;             /* PMC Configuration Register 1 */
+       u32 pmccr2;             /* PMC Configuration Register 2 */
+       u8 res0[0xEC];
 } pmc83xx_t;
 
 /*
@@ -355,7 +357,8 @@ typedef struct lbus83xx {
        u8 res2[0x8];
        u32 mrtpr;              /* Memory Refresh Timer Prescaler Register */
        u32 mdr;                /* UPM Data Register */
-       u8 res3[0x8];
+       u8 res3[0x4];
+       u32 lsor;               /* Special Operation Initiation Register */
        u32 lsdmr;              /* SDRAM Mode Register */
        u8 res4[0x8];
        u32 lurt;               /* UPM Refresh Timer */
@@ -369,8 +372,14 @@ typedef struct lbus83xx {
        u8 res6[0xC];
        u32 lbcr;               /* Configuration Register */
        u32 lcrr;               /* Clock Ratio Register */
-       u8 res7[0x28];
-       u8 res8[0xF00];
+       u8 res7[0x8];
+       u32 fmr;                /* Flash Mode Register */
+       u32 fir;                /* Flash Instruction Register */
+       u32 fcr;                /* Flash Command Register */
+       u32 fbar;               /* Flash Block Addr Register */
+       u32 fpar;               /* Flash Page Addr Register */
+       u32 fbcr;               /* Flash Byte Count Register */
+       u8 res8[0xF08];
 } lbus83xx_t;
 
 /*
@@ -527,7 +536,7 @@ typedef struct pcictrl83xx {
  * USB
  */
 typedef struct usb83xx {
-       u8 fixme[0x2000];
+       u8 fixme[0x1000];
 } usb83xx_t;
 
 /*
@@ -574,7 +583,42 @@ typedef struct immap {
        ios83xx_t               ios;            /* Sequencer */
        pcictrl83xx_t           pci_ctrl[2];    /* PCI Controller Control and Status Registers */
        u8                      res5[0x19900];
-       usb83xx_t               usb;
+       usb83xx_t               usb[2];
+       tsec83xx_t              tsec[2];
+       u8                      res6[0xA000];
+       security83xx_t          security;
+       u8                      res7[0xC0000];
+} immap_t;
+
+#elif defined(CONFIG_MPC831X)
+typedef struct immap {
+       sysconf83xx_t           sysconf;        /* System configuration */
+       wdt83xx_t               wdt;            /* Watch Dog Timer (WDT) Registers */
+       rtclk83xx_t             rtc;            /* Real Time Clock Module Registers */
+       rtclk83xx_t             pit;            /* Periodic Interval Timer */
+       gtm83xx_t               gtm[2];         /* Global Timers Module */
+       ipic83xx_t              ipic;           /* Integrated Programmable Interrupt Controller */
+       arbiter83xx_t           arbiter;        /* System Arbiter Registers */
+       reset83xx_t             reset;          /* Reset Module */
+       clk83xx_t               clk;            /* System Clock Module */
+       pmc83xx_t               pmc;            /* Power Management Control Module */
+       gpio83xx_t              gpio[1];        /* General purpose I/O module */
+       u8                      res0[0x1300];
+       ddr83xx_t               ddr;            /* DDR Memory Controller Memory */
+       fsl_i2c_t               i2c[2];         /* I2C Controllers */
+       u8                      res1[0x1300];
+       duart83xx_t             duart[2];       /* DUART */
+       u8                      res2[0x900];
+       lbus83xx_t              lbus;           /* Local Bus Controller Registers */
+       u8                      res3[0x1000];
+       spi83xx_t               spi;            /* Serial Peripheral Interface */
+       dma83xx_t               dma;            /* DMA */
+       pciconf83xx_t           pci_conf[1];    /* PCI Software Configuration Registers */
+       u8                      res4[0x80];
+       ios83xx_t               ios;            /* Sequencer */
+       pcictrl83xx_t           pci_ctrl[1];    /* PCI Controller Control and Status Registers */
+       u8                      res5[0x1aa00];
+       usb83xx_t               usb[1];
        tsec83xx_t              tsec[2];
        u8                      res6[0xA000];
        security83xx_t          security;
index bbc9ba0..03289bc 100644 (file)
@@ -105,6 +105,11 @@ static inline void sync(void)
        __asm__ __volatile__ ("sync" : : : "memory");
 }
 
+static inline void isync(void)
+{
+       __asm__ __volatile__ ("isync" : : : "memory");
+}
+
 /* Enforce in-order execution of data I/O.
  * No distinction between read/write on PPC; use eieio for all three.
  */
@@ -114,74 +119,90 @@ static inline void sync(void)
 
 /*
  * 8, 16 and 32 bit, big and little endian I/O operations, with barrier.
+ *
+ * Read operations have additional twi & isync to make sure the read
+ * is actually performed (i.e. the data has come back) before we start
+ * executing any following instructions.
  */
-extern inline int in_8(volatile u8 *addr)
+#define __iomem
+extern inline int in_8(const volatile unsigned char __iomem *addr)
 {
-    int ret;
+       int ret;
 
-    __asm__ __volatile__("lbz%U1%X1 %0,%1; eieio" : "=r" (ret) : "m" (*addr));
-    return ret;
+       __asm__ __volatile__(
+               "sync; lbz%U1%X1 %0,%1;\n"
+               "twi 0,%0,0;\n"
+               "isync" : "=r" (ret) : "m" (*addr));
+       return ret;
 }
 
-extern inline void out_8(volatile u8 *addr, int val)
+extern inline void out_8(volatile unsigned char __iomem *addr, int val)
 {
-    __asm__ __volatile__("stb%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
+       __asm__ __volatile__("stb%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
 }
 
-extern inline int in_le16(volatile u16 *addr)
+extern inline int in_le16(const volatile unsigned short __iomem *addr)
 {
-    int ret;
+       int ret;
 
-    __asm__ __volatile__("lhbrx %0,0,%1; eieio" : "=r" (ret) :
-                 "r" (addr), "m" (*addr));
-    return ret;
+       __asm__ __volatile__("sync; lhbrx %0,0,%1;\n"
+                            "twi 0,%0,0;\n"
+                            "isync" : "=r" (ret) :
+                             "r" (addr), "m" (*addr));
+       return ret;
 }
 
-extern inline int in_be16(volatile u16 *addr)
+extern inline int in_be16(const volatile unsigned short __iomem *addr)
 {
-    int ret;
+       int ret;
 
-    __asm__ __volatile__("lhz%U1%X1 %0,%1; eieio" : "=r" (ret) : "m" (*addr));
-    return ret;
+       __asm__ __volatile__("sync; lhz%U1%X1 %0,%1;\n"
+                            "twi 0,%0,0;\n"
+                            "isync" : "=r" (ret) : "m" (*addr));
+       return ret;
 }
 
-extern inline void out_le16(volatile u16 *addr, int val)
+extern inline void out_le16(volatile unsigned short __iomem *addr, int val)
 {
-    __asm__ __volatile__("sthbrx %1,0,%2; eieio" : "=m" (*addr) :
-                 "r" (val), "r" (addr));
+       __asm__ __volatile__("sync; sthbrx %1,0,%2" : "=m" (*addr) :
+                             "r" (val), "r" (addr));
 }
 
-extern inline void out_be16(volatile u16 *addr, int val)
+extern inline void out_be16(volatile unsigned short __iomem *addr, int val)
 {
-    __asm__ __volatile__("sth%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
+       __asm__ __volatile__("sync; sth%U0%X0 %1,%0" : "=m" (*addr) : "r" (val));
 }
 
-extern inline unsigned in_le32(volatile u32 *addr)
+extern inline unsigned in_le32(const volatile unsigned __iomem *addr)
 {
-    unsigned ret;
+       unsigned ret;
 
-    __asm__ __volatile__("lwbrx %0,0,%1; eieio" : "=r" (ret) :
-                "r" (addr), "m" (*addr));
-    return ret;
+       __asm__ __volatile__("sync; lwbrx %0,0,%1;\n"
+                            "twi 0,%0,0;\n"
+                            "isync" : "=r" (ret) :
+                            "r" (addr), "m" (*addr));
+       return ret;
 }
 
-extern inline unsigned in_be32(volatile u32 *addr)
+extern inline unsigned in_be32(const volatile unsigned __iomem *addr)
 {
-    unsigned ret;
+       unsigned ret;
 
-    __asm__ __volatile__("lwz%U1%X1 %0,%1; eieio" : "=r" (ret) : "m" (*addr));
-    return ret;
+       __asm__ __volatile__("sync; lwz%U1%X1 %0,%1;\n"
+                            "twi 0,%0,0;\n"
+                            "isync" : "=r" (ret) : "m" (*addr));
+       return ret;
 }
 
-extern inline void out_le32(volatile unsigned *addr, int val)
+extern inline void out_le32(volatile unsigned __iomem *addr, int val)
 {
-    __asm__ __volatile__("stwbrx %1,0,%2; eieio" : "=m" (*addr) :
-                "r" (val), "r" (addr));
+       __asm__ __volatile__("sync; stwbrx %1,0,%2" : "=m" (*addr) :
+                            "r" (val), "r" (addr));
 }
 
-extern inline void out_be32(volatile unsigned *addr, int val)
+extern inline void out_be32(volatile unsigned __iomem *addr, int val)
 {
-    __asm__ __volatile__("stw%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val));
+       __asm__ __volatile__("sync; stw%U0%X0 %1,%0" : "=m" (*addr) : "r" (val));
 }
 
 #endif
index cf36583..b3ccdce 100644 (file)
@@ -94,6 +94,7 @@
 #define CFG_CMD_EXT2   0x1000000000000000ULL   /* EXT2 Support                 */
 #define CFG_CMD_SNTP   0x2000000000000000ULL   /* SNTP support                 */
 #define CFG_CMD_DISPLAY        0x4000000000000000ULL   /* Display support              */
+#define CFG_CMD_MFSL   0x8000000000000000ULL   /* FSL support for Microblaze   */
 
 #define CFG_CMD_ALL    0xFFFFFFFFFFFFFFFFULL   /* ALL commands                 */
 
                        CFG_CMD_IRQ     | \
                        CFG_CMD_JFFS2   | \
                        CFG_CMD_KGDB    | \
+                       CFG_CMD_MFSL    | \
                        CFG_CMD_MII     | \
                        CFG_CMD_MMC     | \
                        CFG_CMD_NAND    | \
index b162dbd..3c4b37b 100644 (file)
@@ -402,6 +402,10 @@ void               ppcDcbi(unsigned long value);
 void           ppcSync(void);
 void           ppcDcbz(unsigned long value);
 #endif
+#if defined (CONFIG_MICROBLAZE)
+unsigned short in16(unsigned int);
+void           out16(unsigned int, unsigned short value);
+#endif
 
 #if defined (CONFIG_MPC83XX)
 void           ppcDWload(unsigned int *addr, unsigned int *ret);
@@ -440,8 +444,6 @@ int sdram_adjust_866 (void);
 int    adjust_sdram_tbs_8xx (void);
 #if defined(CONFIG_8260)
 int    prt_8260_clks (void);
-#elif defined(CONFIG_MPC83XX)
-int print_clock_conf(void);
 #elif defined(CONFIG_MPC5xxx)
 int    prt_mpc5xxx_clks (void);
 #endif
index 5b54f30..bc30977 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet
- * hasn't been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock
+ *  of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#if defined(CFG_IPBSPEED_133)
-# define CFG_PCISPEED_66                       /* define for 66MHz speed */
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
+# define CFG_PCICLK_EQUALS_IPBCLK_DIV2 /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 # define CFG_BOOTCS_CFG                0x0008DF30      /* for pci_clk  = 66 MHz */
 #else
 # define CFG_BOOTCS_CFG                0x0004DF30      /* for pci_clk = 33 MHz  */
index 5988112..73be069 100644 (file)
  * IPB Bus clocking configuration.
  */
 #if defined(CONFIG_LITE5200B)
-#define CFG_IPBSPEED_133       /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK       /* define for 133MHz speed */
 #else
-#undef CFG_IPBSPEED_133        /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK        /* define for 133MHz speed */
 #endif
 #endif /* CONFIG_MPC5200 */
 
diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h
new file mode 100644 (file)
index 0000000..6976313
--- /dev/null
@@ -0,0 +1,561 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006.
+ *
+ * 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
+ */
+/*
+ * mpc8313epb board configuration file
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_E300            1
+#define CONFIG_MPC83XX         1
+#define CONFIG_MPC831X         1
+#define CONFIG_MPC8313         1
+#define CONFIG_MPC8313ERDB     1
+
+#define CONFIG_PCI
+#define CONFIG_83XX_GENERIC_PCI
+
+#ifdef CFG_66MHZ
+#define CONFIG_83XX_CLKIN      66666667        /* in Hz */
+#elif defined(CFG_33MHZ)
+#define CONFIG_83XX_CLKIN      33333333        /* in Hz */
+#else
+#error Unknown oscillator frequency.
+#endif
+
+#define CONFIG_SYS_CLK_FREQ    CONFIG_83XX_CLKIN
+
+#define CONFIG_BOARD_EARLY_INIT_F              /* call board_pre_init */
+
+#define CFG_IMMR               0xE0000000
+
+#define CFG_MEMTEST_START      0x00001000
+#define CFG_MEMTEST_END                0x07f00000
+
+/* Early revs of this board will lock up hard when attempting
+ * to access the PMC registers, unless a JTAG debugger is
+ * connected, or some resistor modifications are made.
+ */
+#define CFG_8313ERDB_BROKEN_PMC 1
+
+#define CFG_ACR_PIPE_DEP       3       /* Arbiter pipeline depth (0-3) */
+#define CFG_ACR_RPTCNT         3       /* Arbiter repeat count (0-7) */
+
+/*
+ * DDR Setup
+ */
+#define CFG_DDR_BASE           0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE         CFG_DDR_BASE
+#define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
+
+/*
+ * Manually set up DDR parameters, as this board does not
+ * seem to have the SPD connected to I2C.
+ */
+#define CFG_DDR_SIZE           128             /* MB */
+#define CFG_DDR_CONFIG         ( CSCONFIG_EN | CSCONFIG_AP \
+                               | 0x00040000 /* TODO */ \
+                               | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10 )
+                               /* 0x80840102 */
+
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_TIMING_0       ( ( 0 << TIMING_CFG0_RWT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_WRT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_RRT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_WWT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_ACT_PD_EXIT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_PRE_PD_EXIT_SHIFT ) \
+                               | ( 8 << TIMING_CFG0_ODT_PD_EXIT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_MRS_CYC_SHIFT ) )
+                               /* 0x00220802 */
+#define CFG_DDR_TIMING_1       ( ( 3 << TIMING_CFG1_PRETOACT_SHIFT ) \
+                               | ( 9 << TIMING_CFG1_ACTTOPRE_SHIFT ) \
+                               | ( 3 << TIMING_CFG1_ACTTORW_SHIFT ) \
+                               | ( 5 << TIMING_CFG1_CASLAT_SHIFT ) \
+                               | (13 << TIMING_CFG1_REFREC_SHIFT ) \
+                               | ( 3 << TIMING_CFG1_WRREC_SHIFT ) \
+                               | ( 2 << TIMING_CFG1_ACTTOACT_SHIFT ) \
+                               | ( 2 << TIMING_CFG1_WRTORD_SHIFT ) )
+                               /* 0x3935d322 */
+#define CFG_DDR_TIMING_2       ( ( 0 << TIMING_CFG2_ADD_LAT_SHIFT ) \
+                               | (31 << TIMING_CFG2_CPO_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_WR_LAT_DELAY_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_RD_TO_PRE_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT ) \
+                               | ( 3 << TIMING_CFG2_CKE_PLS_SHIFT ) \
+                               | (10 << TIMING_CFG2_FOUR_ACT_SHIFT) )
+                               /* 0x0f9048ca */ /* P9-45,may need tuning */
+#define CFG_DDR_INTERVAL       ( ( 800 << SDRAM_INTERVAL_REFINT_SHIFT ) \
+                               | ( 100 << SDRAM_INTERVAL_BSTOPRE_SHIFT ) )
+                               /* 0x03200064 */
+#if defined(CONFIG_DDR_2T_TIMING)
+#define CFG_SDRAM_CFG          ( SDRAM_CFG_SREN \
+                               | 3 << SDRAM_CFG_SDRAM_TYPE_SHIFT \
+                               | SDRAM_CFG_2T_EN \
+                               | SDRAM_CFG_DBW_32 )
+#else
+#define CFG_SDRAM_CFG          ( SDRAM_CFG_SREN \
+                               | 3 << SDRAM_CFG_SDRAM_TYPE_SHIFT \
+                               | SDRAM_CFG_32_BE )
+                               /* 0x43080000 */
+#endif
+#define CFG_SDRAM_CFG2         0x00401000;
+/* set burst length to 8 for 32-bit data path */
+#define CFG_DDR_MODE           ( ( 0x4440 << SDRAM_MODE_ESD_SHIFT ) \
+                               | ( 0x0232 << SDRAM_MODE_SD_SHIFT ) )
+                               /* 0x44400232 */
+#define CFG_DDR_MODE_2         0x8000C000;
+
+#define CFG_DDR_CLK_CNTL       DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05
+                               /*0x02000000*/
+#define CFG_DDRCDR_VALUE       ( DDRCDR_EN \
+                               | DDRCDR_PZ_NOMZ \
+                               | DDRCDR_NZ_NOMZ \
+                               | DDRCDR_M_ODR )
+
+/*
+ * FLASH on the Local Bus
+ */
+#define CFG_FLASH_CFI                          /* use the Common Flash Interface */
+#define CFG_FLASH_CFI_DRIVER                   /* use the CFI driver */
+#define CFG_FLASH_BASE         0xFE000000      /* start of FLASH   */
+#define CFG_FLASH_SIZE         8               /* flash size in MB */
+#define CFG_FLASH_EMPTY_INFO                   /* display empty sectors */
+#define CFG_FLASH_USE_BUFFER_WRITE             /* buffer up multiple bytes */
+
+#define CFG_BR0_PRELIM         (CFG_FLASH_BASE |       /* flash Base address */ \
+                               (2 << BR_PS_SHIFT) |    /* 16 bit port size */ \
+                               BR_V)                   /* valid */
+#define CFG_OR0_PRELIM         ( 0xFF000000            /* 16 MByte */ \
+                               | OR_GPCM_XACS \
+                               | OR_GPCM_SCY_9 \
+                               | OR_GPCM_EHTR \
+                               | OR_GPCM_EAD )
+                               /* 0xFF006FF7   TODO SLOW 16 MB flash size */
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* window base at flash base */
+#define CFG_LBLAWAR0_PRELIM    0x80000017      /* 16 MB window size */
+
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks */
+#define CFG_MAX_FLASH_SECT     135             /* sectors per device */
+
+#define CFG_FLASH_ERASE_TOUT   60000   /* Flash Erase Timeout (ms) */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (ms) */
+
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#endif
+
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR      0xFD000000      /* Initial RAM address */
+#define CFG_INIT_RAM_END       0x1000          /* End of used area in RAM*/
+
+#define CFG_GBL_DATA_SIZE      0x100           /* 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         (512 * 1024)    /* Reserved for malloc */
+
+/*
+ * Local Bus LCRR and LBCR regs
+ */
+#define CFG_LCRR       LCRR_EADC_1 | LCRR_CLKDIV_2     /* 0x00010002 */
+#define CFG_LBC_LBCR   ( 0x00040000 /* TODO */ \
+                       | (0xFF << LBCR_BMT_SHIFT) \
+                       | 0xF ) /* 0x0004ff0f */
+
+#define CFG_LBC_MRTPR  0x20000000  /*TODO */   /* LB refresh timer prescal, 266MHz/32 */
+
+/* drivers/nand/nand.c */
+#define CFG_NAND_BASE          0xE2800000      /* 0xF0000000 */
+#define CFG_MAX_NAND_DEVICE    1
+#define NAND_MAX_CHIPS         1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+
+#define CFG_BR1_PRELIM         ( CFG_NAND_BASE \
+                               | (2<<BR_DECC_SHIFT)    /* Use HW ECC */ \
+                               | BR_PS_8               /* Port Size = 8 bit */ \
+                               | BR_MS_FCM             /* MSEL = FCM */ \
+                               | BR_V )                /* valid */
+#define CFG_OR1_PRELIM         ( 0xFFFF8000            /* length 32K */ \
+                               | OR_FCM_CSCT \
+                               | OR_FCM_CST \
+                               | OR_FCM_CHT \
+                               | OR_FCM_SCY_1 \
+                               | OR_FCM_TRLX \
+                               | OR_FCM_EHTR )
+                               /* 0xFFFF8396 */
+#define CFG_LBLAWBAR1_PRELIM   CFG_NAND_BASE
+#define CFG_LBLAWAR1_PRELIM    0x8000000E      /* 32KB  */
+
+#define CFG_VSC7385_BASE       0xF0000000
+
+#define CONFIG_VSC7385_ENET                    /* VSC7385 ethernet support */
+#define CFG_BR2_PRELIM         0xf0000801      /* VSC7385 Base address */
+#define CFG_OR2_PRELIM         0xfffe09ff      /* VSC7385, 128K bytes*/
+#define CFG_LBLAWBAR2_PRELIM   CFG_VSC7385_BASE/* Access window base at VSC7385 base */
+#define CFG_LBLAWAR2_PRELIM    0x80000010      /* Access window size 128K */
+
+/* local bus read write buffer mapping */
+#define CFG_BR3_PRELIM         0xFA000801      /* map at 0xFA000000 */
+#define CFG_OR3_PRELIM         0xFFFF8FF7      /* 32kB */
+#define CFG_LBLAWBAR3_PRELIM   0xFA000000
+#define CFG_LBLAWAR3_PRELIM    0x8000000E      /* 32KB  */
+
+/* pass open firmware flat tree */
+#define CONFIG_OF_FLAT_TREE    1
+#define CONFIG_OF_BOARD_SETUP  1
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+
+#define OF_CPU                 "PowerPC,8313@0"
+#define OF_SOC                 "soc8313@e0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc8313@e0000000/serial@4500"
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX      1
+#define CFG_NS16550
+#define CFG_NS16550_SERIAL
+#define CFG_NS16550_REG_SIZE   1
+#define CFG_NS16550_CLK                get_bus_freq(0)
+
+#define CFG_BAUDRATE_TABLE     \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 115200}
+
+#define CFG_NS16550_COM1       (CFG_IMMR+0x4500)
+#define CFG_NS16550_COM2       (CFG_IMMR+0x4600)
+
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+
+/* I2C */
+#define CONFIG_HARD_I2C                        /* I2C with hardware support*/
+#define CONFIG_FSL_I2C
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_CMD_TREE
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address */
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_NOPROBES       {0x69}  /* Don't probe these addrs */
+#define CFG_I2C_OFFSET         0x3000
+#define CFG_I2C2_OFFSET                0x3100
+
+/* TSEC */
+#define CFG_TSEC1_OFFSET       0x24000
+#define CFG_TSEC1              (CFG_IMMR+CFG_TSEC1_OFFSET)
+#define CFG_TSEC2_OFFSET       0x25000
+#define CFG_TSEC2              (CFG_IMMR+CFG_TSEC2_OFFSET)
+#define CONFIG_NET_MULTI
+
+/*
+ * General PCI
+ * Addresses are mapped 1-1.
+ */
+#define CFG_PCI1_MEM_BASE      0x80000000
+#define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
+#define CFG_PCI1_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI1_MMIO_BASE     0x90000000
+#define CFG_PCI1_MMIO_PHYS     CFG_PCI1_MMIO_BASE
+#define CFG_PCI1_MMIO_SIZE     0x10000000      /* 256M */
+#define CFG_PCI1_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xE2000000
+#define CFG_PCI1_IO_SIZE       0x00100000      /* 1M */
+
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+#define CFG_PCI_SUBSYS_VENDORID 0x1057 /* Motorola */
+
+/*
+ * TSEC configuration
+ */
+#define CONFIG_TSEC_ENET               /* TSEC ethernet support */
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI               1
+#endif
+
+#define CONFIG_GMII                    1       /* MII PHY management */
+#define CONFIG_MPC83XX_TSEC1           1
+
+#define CONFIG_MPC83XX_TSEC1_NAME      "TSEC0"
+#define CONFIG_MPC83XX_TSEC2           1
+#define CONFIG_MPC83XX_TSEC2_NAME      "TSEC1"
+#define TSEC1_PHY_ADDR                 0x1c
+#define TSEC2_PHY_ADDR                 4
+#define TSEC1_PHYIDX                   0
+#define TSEC2_PHYIDX                   0
+
+/* Options are: TSEC[0-1] */
+#define CONFIG_ETHPRIME                        "TSEC1"
+
+/*
+ * Configure on-board RTC
+ */
+#define CONFIG_RTC_DS1337
+#define CFG_I2C_RTC_ADDR               0x68
+
+/*
+ * Environment
+ */
+#ifndef CFG_RAMBOOT
+       #define CFG_ENV_IS_IN_FLASH     1
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE + 0x40000)
+       #define CFG_ENV_SECT_SIZE       0x10000 /* 64K(one sector) for env */
+       #define CFG_ENV_SIZE            0x2000
+
+/* Address and size of Redundant Environment Sector */
+#else
+       #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_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#define CFG_BASE_COMMANDS      ( CONFIG_CMD_DFL        \
+                               | CFG_CMD_PING          \
+                               | CFG_CMD_DHCP          \
+                               | CFG_CMD_I2C           \
+                               | CFG_CMD_MII           \
+                               | CFG_CMD_DATE          \
+                               | CFG_CMD_PCI)
+
+#define CONFIG_CMDLINE_EDITING 1
+
+#define CFG_RAMBOOT_COMMANDS   (CFG_BASE_COMMANDS & \
+                                ~(CFG_CMD_ENV | CFG_CMD_LOADS))
+
+#if defined(CFG_RAMBOOT)
+#define CONFIG_COMMANDS CFG_RAMBOOT_COMMANDS
+#else
+#define CONFIG_COMMANDS CFG_BASE_COMMANDS
+#endif
+
+#include <cmd_confdefs.h>
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory */
+#define CFG_LOAD_ADDR  0x2000000       /* default load address */
+#define CFG_PROMPT     "=> "           /* Monitor Command Prompt */
+#define CFG_CBSIZE     1024            /* Console I/O Buffer Size */
+
+#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_HZ         1000            /* decrementer freq: 1ms 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                16384
+#define CFG_CACHELINE_SIZE     32
+#define CFG_CACHELINE_SHIFT    5       /*log base 2 of the above value*/
+
+#define CFG_RCWH_PCIHOST 0x80000000    /* PCIHOST  */
+
+#ifdef CFG_66MHZ
+
+/* 66MHz IN, 133MHz CSB, 266 DDR, 266 CORE */
+/* 0x62040000 */
+#define CFG_HRCW_LOW (\
+       0x20000000 /* reserved, must be set */ |\
+       HRCWL_DDRCM |\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_CSB_TO_CLKIN_2X1 |\
+       HRCWL_CORE_TO_CSB_2X1)
+
+#elif defined(CFG_33MHZ)
+
+/* 33MHz IN, 165MHz CSB, 330 DDR, 330 CORE */
+/* 0x65040000 */
+#define CFG_HRCW_LOW (\
+       0x20000000 /* reserved, must be set */ |\
+       HRCWL_DDRCM |\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_CSB_TO_CLKIN_5X1 |\
+       HRCWL_CORE_TO_CSB_2X1)
+
+#endif
+
+/* 0xa0606c00 */
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_HOST |\
+       HRCWH_PCI1_ARBITER_ENABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0X00000100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_RL_EXT_LEGACY |\
+       HRCWH_TSEC1M_IN_RGMII |\
+       HRCWH_TSEC2M_IN_RGMII |\
+       HRCWH_BIG_ENDIAN |\
+       HRCWH_LALE_NORMAL)
+
+/* System IO Config */
+#define CFG_SICRH      (SICRH_TSOBI1 | SICRH_TSOBI2)   /* RGMII */
+#define CFG_SICRL      SICRL_USBDR                     /* Enable Internal USB Phy  */
+
+#define CFG_HID0_INIT  0x000000000
+#define CFG_HID0_FINAL (HID0_ENABLE_MACHINE_CHECK | \
+                        HID0_ENABLE_DYNAMIC_POWER_MANAGMENT)
+
+#define CFG_HID2 HID2_HBE
+
+/* DDR @ 0x00000000 */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* PCI @ 0x80000000 */
+#define CFG_IBAT1L     (CFG_PCI1_MEM_BASE | BATL_PP_10)
+#define CFG_IBAT1U     (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT2L     (CFG_PCI1_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT2U     (CFG_PCI1_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* PCI2 not supported on 8313 */
+#define CFG_IBAT3L     (0)
+#define CFG_IBAT3U     (0)
+#define CFG_IBAT4L     (0)
+#define CFG_IBAT4U     (0)
+
+/* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 & BCSR @ 0xE2400000 */
+#define CFG_IBAT5L     (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT5U     (CFG_IMMR | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* SDRAM @ 0xF0000000, stack in DCACHE 0xFDF00000 & FLASH @ 0xFE000000 */
+#define CFG_IBAT6L     (0xF0000000 | BATL_PP_10)
+#define CFG_IBAT6U     (0xF0000000 | BATU_BL_256M | BATU_VS | BATU_VP)
+
+#define CFG_IBAT7L     (0)
+#define CFG_IBAT7U     (0)
+
+#define CFG_DBAT0L     CFG_IBAT0L
+#define CFG_DBAT0U     CFG_IBAT0U
+#define CFG_DBAT1L     CFG_IBAT1L
+#define CFG_DBAT1U     CFG_IBAT1U
+#define CFG_DBAT2L     CFG_IBAT2L
+#define CFG_DBAT2U     CFG_IBAT2U
+#define CFG_DBAT3L     CFG_IBAT3L
+#define CFG_DBAT3U     CFG_IBAT3U
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01    /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02    /* Software reboot */
+
+/*
+ * Environment Configuration
+ */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_ETHADDR         00:E0:0C:00:95:01
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR                00:E0:0C:00:95:02
+
+#define CONFIG_IPADDR          10.0.0.2
+#define CONFIG_SERVERIP                10.0.0.1
+#define CONFIG_GATEWAYIP       10.0.0.1
+#define CONFIG_NETMASK         255.0.0.0
+#define CONFIG_NETDEV          eth1
+
+#define CONFIG_HOSTNAME                mpc8313erdb
+#define CONFIG_ROOTPATH                /nfs/root/path
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_UBOOTPATH       u-boot.bin      /* U-Boot image on TFTP server */
+#define CONFIG_FDTFILE         mpc8313erdb.dtb
+
+#define CONFIG_LOADADDR                200000  /* default location for tftp and bootm */
+#define CONFIG_BOOTDELAY       -1      /* -1 disables auto-boot */
+#define CONFIG_BAUDRATE                115200
+
+#define XMK_STR(x)     #x
+#define MK_STR(x)      XMK_STR(x)
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "netdev=" MK_STR(CONFIG_NETDEV) "\0"                            \
+       "ethprime=TSEC1\0"                                              \
+       "uboot=" MK_STR(CONFIG_UBOOTPATH) "\0"                          \
+       "tftpflash=tftpboot $loadaddr $uboot; "                         \
+               "protect off " MK_STR(TEXT_BASE) " +$filesize; "        \
+               "erase " MK_STR(TEXT_BASE) " +$filesize; "              \
+               "cp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize; "      \
+               "protect on " MK_STR(TEXT_BASE) " +$filesize; "         \
+               "cmp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize\0"     \
+       "fdtaddr=400000\0"                                              \
+       "fdtfile=" MK_STR(CONFIG_FDTFILE) "\0"                          \
+       "console=ttyS0\0"                                               \
+       "setbootargs=setenv bootargs "                                  \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0" \
+       "setipargs=setenv bootargs nfsroot=$serverip:$rootpath " \
+               "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0"
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+       "setenv rootdev /dev/nfs;"                                      \
+       "run setbootargs;"                                                      \
+       "run setipargs;"                                                        \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND                                          \
+       "setenv rootdev /dev/ram;"                                      \
+       "run setbootargs;"                                              \
+       "tftp $ramdiskaddr $ramdiskfile;"                               \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+#undef MK_STR
+#undef XMK_STR
+
+#endif /* __CONFIG_H */
index 37bbfb3..906339e 100644 (file)
 #define CFG_MEMTEST_START      0x1000          /* memtest region */
 #define CFG_MEMTEST_END                0x2000
 
+#define CFG_DDR_SDRAM_CLK_CNTL (DDR_SDRAM_CLK_CNTL_SS_EN | \
+                               DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05)
+
 #ifdef CONFIG_HARD_I2C
 #define CONFIG_SPD_EEPROM              /* use SPD EEPROM for DDR setup*/
 #endif
index 9c241e6..7d91a01 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 #endif
 /*
  * I2C configuration
diff --git a/include/configs/SMN42.h b/include/configs/SMN42.h
new file mode 100755 (executable)
index 0000000..1d2f28d
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * (C) Copyright 2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * Configuation settings for the SMN42 board from Siemens.
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * If we are developing, we might want to start u-boot from ram
+ * so we MUST NOT initialize critical regs like mem-timing ...
+ */
+#undef CONFIG_INIT_CRITICAL            /* undef for developing */
+
+#undef CONFIG_SKIP_LOWLEVEL_INIT
+#undef CONFIG_SKIP_RELOCATE_UBOOT
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM7            1       /* This is a ARM7 CPU   */
+#define CONFIG_ARM_THUMB       1       /* this is an ARM720TDMI */
+#define CONFIG_LPC2292
+#undef  CONFIG_ARM7_REVD               /* disable ARM720 REV.D Workarounds */
+
+#undef CONFIG_USE_IRQ                  /* don't need them anymore */
+
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN         (CFG_ENV_SIZE + 128*1024)
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes reserved for initial data */
+
+/*
+ * Hardware drivers
+ */
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_SERIAL1         1       /* we use Serial line 1 */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE                115200
+
+#define CONFIG_BOOTP_MASK       (CONFIG_BOOTP_DEFAULT|CONFIG_BOOTP_BOOTFILESIZE)
+
+/* enable I2C and select the hardware/software driver */
+#undef  CONFIG_HARD_I2C                        /* I2C with hardware support    */
+#define CONFIG_SOFT_I2C                1       /* I2C bit-banged               */
+/* this would be 0xAE if E0, E1 and E2 were pulled high */
+#define CFG_I2C_SLAVE          0xA0
+#define CFG_I2C_EEPROM_ADDR    (0xA0 >> 1)
+#define CFG_I2C_EEPROM_ADDR_LEN 2 /* 16 bit address */
+#define CFG_EEPROM_PAGE_WRITE_BITS 6 /* 64 bytes per write */
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 20
+/* not used but required by devices.c */
+#define CFG_I2C_SPEED 10000
+
+#ifdef CONFIG_SOFT_I2C
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define SCL            0x00000004              /* P0.2 */
+#define SDA            0x00000008              /* P0.3 */
+
+#define        I2C_READ        ((GET32(IO0PIN) & SDA) ? 1 : 0)
+#define        I2C_SDA(x)      { if (x) PUT32(IO0SET, SDA); else PUT32(IO0CLR, SDA); }
+#define        I2C_SCL(x)      { if (x) PUT32(IO0SET, SCL); else PUT32(IO0CLR, SCL); }
+#define        I2C_DELAY       { udelay(100); }
+#define        I2C_ACTIVE      { unsigned int i2ctmp; \
+                                         i2ctmp = GET32(IO0DIR); \
+                                         i2ctmp |= SDA; \
+                                         PUT32(IO0DIR, i2ctmp); }
+#define        I2C_TRISTATE    { unsigned int i2ctmp; \
+                                             i2ctmp = GET32(IO0DIR); \
+                                             i2ctmp &= ~SDA; \
+                                                 PUT32(IO0DIR, i2ctmp); }
+#endif /* CONFIG_SOFT_I2C */
+
+/*
+ * Supported commands
+ */
+#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
+                               CFG_CMD_DHCP    | \
+                               CFG_CMD_FAT             | \
+                               CFG_CMD_MMC             | \
+                               CFG_CMD_NET             | \
+                               CFG_CMD_EEPROM  | \
+                               CFG_CMD_PING)
+
+#define CONFIG_DOS_PARTITION
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY       5
+
+/*
+ * Miscellaneous configurable options
+ */
+#define        CFG_LONGHELP                            /* undef to save memory         */
+#define        CFG_PROMPT              "SMN42 # " /* Monitor Command Prompt    */
+#define        CFG_CBSIZE              256             /* Console I/O Buffer Size      */
+#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_MEMTEST_START      0x81800000      /* memtest works on     */
+#define CFG_MEMTEST_END                0x83000000      /* 24 MB in SRAM        */
+
+#undef  CFG_CLKS_IN_HZ         /* everything, incl board info, in Hz */
+
+#define        CFG_LOAD_ADDR           0x81000000      /* default load address 
+                                                 * for uClinux img is here*/
+
+#define CFG_SYS_CLK_FREQ        58982400        /* Hz */
+#define        CFG_HZ                  2048            /* decrementer freq in Hz */
+
+                                               /* valid baudrates */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ   (4*1024)        /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ   (4*1024)        /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS   1          /* we have 1 bank of SRAM */
+#define PHYS_SDRAM_1           0x81000000 /* SRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE      0x02000000 /* 32 MB SRAM */
+
+/* This is the external flash */
+#define PHYS_FLASH_1           0x80000000 /* Flash Bank #1 */
+#define PHYS_FLASH_SIZE                0x01000000 /* 16 MB */
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+
+/*
+ * The first entry in CFG_FLASH_BANKS_LIST is a dummy, but it must be present.
+ */
+#define CFG_FLASH_BANKS_LIST   { 0, PHYS_FLASH_1 }
+#define CFG_FLASH_ADDR0                        0x555
+#define CFG_FLASH_ADDR1                        0x2AA
+#define CFG_FLASH_ERASE_TOUT   16384   /* Timeout for Flash Erase (in ms) */
+#define CFG_FLASH_WRITE_TOUT   5       /* Timeout for Flash Write (in ms) */
+
+#define CFG_MAX_FLASH_SECT     128  /* max number of sectors on one chip    */
+
+#define CFG_MAX_FLASH_BANKS    2       /* max number of memory banks           */
+
+#define        CFG_ENV_IS_IN_FLASH     1
+/* The Environment Sector is in the CPU-internal flash */
+#define CFG_FLASH_BASE         0
+#define CFG_ENV_OFFSET         0x3C000
+#define CFG_ENV_ADDR           (CFG_FLASH_BASE + CFG_ENV_OFFSET)
+#define CFG_ENV_SIZE           0x2000 /* Total Size of Environment Sector      */
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_MMC                     1
+/* we use this ethernet chip */
+#define CONFIG_ENC28J60
+
+#endif /* __CONFIG_H */
index 8a6e5a6..b42cfb6 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock 
+ * of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2          /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 #define CFG_BOOTCS_CFG         0x0008DF30 /* for pci_clk  = 66 MHz */
 #else
 #define CFG_BOOTCS_CFG         0x0004DF30 /* for pci_clk = 33 MHz */
index f41dbd0..1cc9ce9 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 
 /*
  * I2C configuration
index 7069b35..7935593 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133) && !defined(CONFIG_CAM5200)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK) && !defined(CONFIG_CAM5200)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock of
+ * 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2  /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 #define CFG_BOOTCS_CFG         0x0008DF30 /* for pci_clk  = 66 MHz */
 #else
 #define CFG_BOOTCS_CFG         0x0004DF30 /* for pci_clk = 33 MHz */
index 8175703..d8686dd 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 #endif
 
 /*
index 35b6a51..0f447b0 100644 (file)
@@ -34,7 +34,9 @@
 #define CONFIG_ACADIA          1               /* Board is Acadia      */
 #define CONFIG_4xx             1               /* ... PPC4xx family    */
 #define CONFIG_405EZ           1               /* Specifc 405EZ support*/
-#define CONFIG_SYS_CLK_FREQ    66666666        /* external freq to pll */
+/* Detect Acadia PLL input clock automatically via CPLD bit            */
+#define CONFIG_SYS_CLK_FREQ    ((in8(CFG_CPLD_BASE + 0) == 0x0c) ? \
+                               66666666 : 33333000)
 
 #define CONFIG_BOARD_EARLY_INIT_F 1            /* Call board_early_init_f */
 #define CONFIG_MISC_INIT_F     1               /* Call misc_init_f     */
 /*-----------------------------------------------------------------------
  * FLASH related
  *----------------------------------------------------------------------*/
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
 #define CFG_FLASH_CFI                  /* The flash is CFI compatible  */
 #define CFG_FLASH_CFI_DRIVER           /* Use common CFI driver        */
 
 #define CFG_FLASH_USE_BUFFER_WRITE 1   /* use buffered writes (20x faster)     */
 #define CFG_FLASH_EMPTY_INFO           /* print 'E' for empty sector on flinfo */
 
+#define        _CFG_CMD_INCLUDE        (CFG_CMD_ALL)
+#else
+#define        CFG_NO_FLASH            1       /* No NOR on Acadia when NAND-booting   */
+#define        _CFG_CMD_INCLUDE        ((CFG_CMD_ALL) & ~(CFG_CMD_FLASH | CFG_CMD_IMLS))
+#endif
+
 #ifdef CFG_ENV_IS_IN_FLASH
 #define CFG_ENV_SECT_SIZE      0x40000 /* size of one complete sector  */
 #define CFG_ENV_ADDR           (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE)
 #define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
 #endif
 
+/*
+ * IPL (Initial Program Loader, integrated inside CPU)
+ * Will load first 4k from NAND (SPL) into cache and execute it from there.
+ *
+ * SPL (Secondary Program Loader)
+ * Will load special U-Boot version (NUB) from NAND and execute it. This SPL
+ * has to fit into 4kByte. It sets up the CPU and configures the SDRAM
+ * controller and the NAND controller so that the special U-Boot image can be
+ * loaded from NAND to SDRAM.
+ *
+ * NUB (NAND U-Boot)
+ * This NAND U-Boot (NUB) is a special U-Boot version which can be started
+ * from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
+ *
+ * On 440EPx the SPL is copied to SDRAM before the NAND controller is
+ * set up. While still running from cache, I experienced problems accessing
+ * the NAND controller.        sr - 2006-08-25
+ */
+#define CFG_NAND_BOOT_SPL_SRC  0xfffff000      /* SPL location                 */
+#define CFG_NAND_BOOT_SPL_SIZE (4 << 10)       /* SPL size                     */
+#define CFG_NAND_BOOT_SPL_DST  (CFG_OCM_DATA_ADDR + (12 << 10)) /* Copy SPL here*/
+#define CFG_NAND_U_BOOT_DST    0x01000000      /* Load NUB to this addr        */
+#define CFG_NAND_U_BOOT_START  CFG_NAND_U_BOOT_DST /* Start NUB from this addr */
+#define CFG_NAND_BOOT_SPL_DELTA        (CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)
+
+/*
+ * Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
+ */
+#define CFG_NAND_U_BOOT_OFFS   (16 << 10)      /* Offset to RAM U-Boot image   */
+#define CFG_NAND_U_BOOT_SIZE   (384 << 10)     /* Size of RAM U-Boot image     */
+
+/*
+ * Now the NAND chip has to be defined (no autodetection used!)
+ */
+#define CFG_NAND_PAGE_SIZE     512             /* NAND chip page size          */
+#define CFG_NAND_BLOCK_SIZE    (16 << 10)      /* NAND chip block size         */
+#define CFG_NAND_PAGE_COUNT    32              /* NAND chip page count         */
+#define CFG_NAND_BAD_BLOCK_POS 5               /* Location of bad block marker */
+#undef CFG_NAND_4_ADDR_CYCLE                   /* No fourth addr used (<=32MB) */
+
+#define CFG_NAND_ECCSIZE       256
+#define CFG_NAND_ECCBYTES      3
+#define CFG_NAND_ECCSTEPS      (CFG_NAND_PAGE_SIZE / CFG_NAND_ECCSIZE)
+#define CFG_NAND_OOBSIZE       16
+#define CFG_NAND_ECCTOTAL      (CFG_NAND_ECCBYTES * CFG_NAND_ECCSTEPS)
+#define CFG_NAND_ECCPOS                {0, 1, 2, 3, 6, 7}
+
+#ifdef CFG_ENV_IS_IN_NAND
+/*
+ * For NAND booting the environment is embedded in the U-Boot image. Please take
+ * look at the file board/amcc/sequoia/u-boot-nand.lds for details.
+ */
+#define CFG_ENV_SIZE           CFG_NAND_BLOCK_SIZE
+#define CFG_ENV_OFFSET         (CFG_NAND_U_BOOT_OFFS + CFG_ENV_SIZE)
+#define CFG_ENV_OFFSET_REDUND  (CFG_ENV_OFFSET + CFG_ENV_SIZE)
+#endif
+
 /*-----------------------------------------------------------------------
  * RAM (CRAM)
  *----------------------------------------------------------------------*/
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b ${fileaddr} fffc0000 ${filesize};"                \
                "setenv filesize;saveenv\0"                             \
-       "upd=run load;run update\0"                                     \
+       "upd=run load update\0"                                         \
+       "nload=tftp 200000 acadia/u-boot-nand.bin\0"                    \
+       "nupdate=nand erase 0 60000;nand write 200000 0 60000;"         \
+               "setenv filesize;saveenv\0"                             \
+       "nupd=run nload nupdate\0"                                      \
        "kozio=bootm ffc60000\0"                                        \
        ""
 #define CONFIG_BOOTCOMMAND     "run flash_self"
 #define CONFIG_USB_OHCI
 #define CONFIG_USB_STORAGE
 
-#if 0 /* test-only */
-#define TEST_ONLY_NAND
-#endif
-
-#ifdef TEST_ONLY_NAND
-#define CMD_NAND               CFG_CMD_NAND
-#else
-#define CMD_NAND               0
-#endif
-
 /* Partitions */
 #define CONFIG_MAC_PARTITION
 #define CONFIG_DOS_PARTITION
 
 #define CONFIG_SUPPORT_VFAT
 
-#define CONFIG_COMMANDS       (CONFIG_CMD_DFL  |       \
-                              CFG_CMD_ASKENV   |       \
-                              CFG_CMD_DHCP     |       \
-                              CFG_CMD_DTT      |       \
-                              CFG_CMD_DIAG     |       \
-                              CFG_CMD_EEPROM   |       \
-                              CFG_CMD_ELF      |       \
-                              CFG_CMD_FAT      |       \
-                              CFG_CMD_I2C      |       \
-                              CFG_CMD_IRQ      |       \
-                              CFG_CMD_MII      |       \
-                              CMD_NAND         |       \
-                              CFG_CMD_NET      |       \
-                              CFG_CMD_NFS      |       \
-                              CFG_CMD_PCI      |       \
-                              CFG_CMD_PING     |       \
-                              CFG_CMD_REGINFO  |       \
-                              CFG_CMD_USB)
+#define CONFIG_COMMANDS        ((CONFIG_CMD_DFL & _CFG_CMD_INCLUDE)    |       \
+                        CFG_CMD_ASKENV |                               \
+                        CFG_CMD_DHCP   |                               \
+                        CFG_CMD_DTT    |                               \
+                        CFG_CMD_DIAG   |                               \
+                        CFG_CMD_EEPROM |                               \
+                        CFG_CMD_ELF    |                               \
+                        CFG_CMD_FAT    |                               \
+                        CFG_CMD_I2C    |                               \
+                        CFG_CMD_IRQ    |                               \
+                        CFG_CMD_MII    |                               \
+                        CFG_CMD_NAND   |                               \
+                        CFG_CMD_NET    |                               \
+                        CFG_CMD_NFS    |                               \
+                        CFG_CMD_PCI    |                               \
+                        CFG_CMD_PING   |                               \
+                        CFG_CMD_REGINFO |                              \
+                        CFG_CMD_USB)
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
  */
 #define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
 
-#ifdef TEST_ONLY_NAND
 /*-----------------------------------------------------------------------
  * NAND FLASH
  *----------------------------------------------------------------------*/
 #define NAND_MAX_CHIPS         1
 #define CFG_NAND_BASE          (CFG_NAND_ADDR + CFG_NAND_CS)
 #define CFG_NAND_SELECT_DEVICE  1      /* nand driver supports mutipl. chips   */
-#endif
 
 /*-----------------------------------------------------------------------
  * Cache Configuration
 /*-----------------------------------------------------------------------
  * External Bus Controller (EBC) Setup
  *----------------------------------------------------------------------*/
-#define CFG_NAND_CS            0               /* NAND chip connected to CSx   */
-
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+#define CFG_NAND_CS            3
 /* Memory Bank 0 (Flash) initialization                                                */
 #define CFG_EBC_PB0AP          0x03337200
 #define CFG_EBC_PB0CR          0xfe0bc000
 
+/* Memory Bank 3 (NAND-FLASH) initialization                                   */
+#define CFG_EBC_PB3AP          0x018003c0
+#define CFG_EBC_PB3CR          (CFG_NAND_ADDR | 0x1c000)
+
 /* Just initial configuration for CRAM. Will be changed in memory.c to sync mode*/
 /* Memory Bank 1 (CRAM) initialization                                         */
 #define CFG_EBC_PB1AP          0x030400c0
 /* Memory Bank 2 (CRAM) initialization                                         */
 #define CFG_EBC_PB2AP          0x030400c0
 #define CFG_EBC_PB2CR          0x020bc000
+#else
+#define CFG_NAND_CS            0               /* NAND chip connected to CSx   */
+/* Memory Bank 0 (NAND-FLASH) initialization                                   */
+#define CFG_EBC_PB0AP          0x018003c0
+#define CFG_EBC_PB0CR          (CFG_NAND_ADDR | 0x1c000)
 
-/* Memory Bank 3 (NAND-FLASH) initialization                                   */
-#define CFG_EBC_PB3AP          0x018003c0
-#define CFG_EBC_PB3CR          (CFG_NAND_ADDR | 0x1c000)
+/*
+ * When NAND-booting the CRAM EBC setup must be done in sync mode, since the
+ * NAND-SPL already initialized the CRAM and EBC to sync mode.
+ */
+/* Memory Bank 1 (CRAM) initialization                                         */
+#define CFG_EBC_PB1AP          0x9C0201C0
+#define CFG_EBC_PB1CR          0x000bc000
+
+/* Memory Bank 2 (CRAM) initialization                                         */
+#define CFG_EBC_PB2AP          0x9C0201C0
+#define CFG_EBC_PB2CR          0x020bc000
+#endif
 
 /* Memory Bank 4 (CPLD) initialization                                         */
 #define CFG_EBC_PB4AP          0x04006000
  * GPIO Setup
  *----------------------------------------------------------------------*/
 #define CFG_GPIO_CRAM_CLK      8
-#define CFG_GPIO_CRAM_WAIT     9
+#define CFG_GPIO_CRAM_WAIT     9               /* GPIO-In              */
 #define CFG_GPIO_CRAM_ADV      10
-#define CFG_GPIO_CRAM_CRE      (32 + 21)
+#define CFG_GPIO_CRAM_CRE      (32 + 21)       /* GPIO-Out             */
 
 /*-----------------------------------------------------------------------
  * Definitions for GPIO_0 setup (PPC405EZ specific)
  *
- * GPIO0[0-3]  - External Bus Controller CS_4 - CS_7 Outputs
+ * GPIO0[0-2]  - External Bus Controller CS_4 - CS_6 Outputs
+ * GPIO0[3]    - NAND FLASH Controller CE3 (NFCE3) Output
  * GPIO0[4]    - External Bus Controller Hold Input
  * GPIO0[5]    - External Bus Controller Priority Input
  * GPIO0[6]    - External Bus Controller HLDA Output
  * GPIO0[28-30]        - Trace Outputs / PWM Inputs
  * GPIO0[31]   - PWM_8 I/O
  */
-#define CFG_GPIO0_TCR          0xC0000000
-#define CFG_GPIO0_OSRL         0x50000000
-#define CFG_GPIO0_OSRH         0x00000055
-#define CFG_GPIO0_ISR1L                0x00000000
+#define CFG_GPIO0_TCR          0xC0A00000
+#define CFG_GPIO0_OSRL         0x50004400
+#define CFG_GPIO0_OSRH         0x02000055
+#define CFG_GPIO0_ISR1L                0x00001000
 #define CFG_GPIO0_ISR1H                0x00000055
-#define CFG_GPIO0_TSRL         0x00000000
+#define CFG_GPIO0_TSRL         0x02000000
 #define CFG_GPIO0_TSRH         0x00000055
 
 /*-----------------------------------------------------------------------
  * GPIO1[16]   - SPI_SS_1_N Output
  * GPIO1[17-20]        - Trace Output/External Interrupts IRQ0 - IRQ3 inputs
  */
-#define CFG_GPIO1_OSRH         0x55455555
+#define CFG_GPIO1_TCR          0xFFFF8414
 #define CFG_GPIO1_OSRL         0x40000110
-#define CFG_GPIO1_ISR1H                0x00000000
+#define CFG_GPIO1_OSRH         0x55455555
 #define CFG_GPIO1_ISR1L                0x15555445
-#define CFG_GPIO1_TSRH         0x00000000
+#define CFG_GPIO1_ISR1H                0x00000000
 #define CFG_GPIO1_TSRL         0x00000000
-#define CFG_GPIO1_TCR          0xFFFF8014
+#define CFG_GPIO1_TSRH         0x00000000
 
 /*
  * Internal Definitions
index 8d9f0a1..6c2a360 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock 
+ * of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2  /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 #define CFG_BOOTCS_CFG         0x0008DF30 /* for pci_clk  = 66 MHz */
 #else
 #define CFG_BOOTCS_CFG         0x0004DF30 /* for pci_clk = 33 MHz */
index db58a9f..763d1c7 100644 (file)
@@ -50,7 +50,7 @@
  *----------------------------------------------------------------------*/
 #define CFG_MONITOR_LEN                (384 * 1024)    /* Reserve 384 kB for Monitor   */
 #define CFG_MALLOC_LEN         (256 * 1024)    /* Reserve 256 kB for malloc()  */
-#define CFG_MONITOR_BASE       (-CFG_MONITOR_LEN)
+#define CFG_MONITOR_BASE       TEXT_BASE
 #define CFG_SDRAM_BASE         0x00000000          /* _must_ be 0      */
 #define CFG_FLASH_BASE         0xfff00000          /* start of FLASH   */
 #define CFG_PCI_MEMBASE                0xa0000000          /* mapped pci memory*/
 /*-----------------------------------------------------------------------
  * Environment
  *----------------------------------------------------------------------*/
-/*
- * Define here the location of the environment variables (FLASH or EEPROM).
- * Note: DENX encourages to use redundant environment in FLASH.
- */
-#if 1
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
 #define CFG_ENV_IS_IN_FLASH     1      /* use FLASH for environment vars       */
 #else
-#define CFG_ENV_IS_IN_EEPROM   1       /* use EEPROM for environment vars      */
+#define CFG_ENV_IS_IN_NAND     1       /* use NAND for environment vars        */
+#define CFG_ENV_IS_EMBEDDED    1       /* use embedded environment */
 #endif
 
 /*-----------------------------------------------------------------------
 
 #ifdef CFG_ENV_IS_IN_FLASH
 #define CFG_ENV_SECT_SIZE      0x10000         /* size of one complete sector  */
-#define CFG_ENV_ADDR           (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE)
+#define CFG_ENV_ADDR           ((-CFG_MONITOR_LEN)-CFG_ENV_SECT_SIZE)
 #define        CFG_ENV_SIZE            0x2000  /* Total Size of Environment Sector     */
 
 /* Address and size of Redundant Environment Sector    */
 #define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
 #endif /* CFG_ENV_IS_IN_FLASH */
 
+/*
+ * IPL (Initial Program Loader, integrated inside CPU)
+ * Will load first 4k from NAND (SPL) into cache and execute it from there.
+ *
+ * SPL (Secondary Program Loader)
+ * Will load special U-Boot version (NUB) from NAND and execute it. This SPL
+ * has to fit into 4kByte. It sets up the CPU and configures the SDRAM
+ * controller and the NAND controller so that the special U-Boot image can be
+ * loaded from NAND to SDRAM.
+ *
+ * NUB (NAND U-Boot)
+ * This NAND U-Boot (NUB) is a special U-Boot version which can be started
+ * from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
+ *
+ * On 440EPx the SPL is copied to SDRAM before the NAND controller is
+ * set up. While still running from cache, I experienced problems accessing
+ * the NAND controller.        sr - 2006-08-25
+ */
+#define CFG_NAND_BOOT_SPL_SRC  0xfffff000      /* SPL location                 */
+#define CFG_NAND_BOOT_SPL_SIZE (4 << 10)       /* SPL size                     */
+#define CFG_NAND_BOOT_SPL_DST  0x00800000      /* Copy SPL here                */
+#define CFG_NAND_U_BOOT_DST    0x01000000      /* Load NUB to this addr        */
+#define CFG_NAND_U_BOOT_START  CFG_NAND_U_BOOT_DST /* Start NUB from this addr */
+#define CFG_NAND_BOOT_SPL_DELTA        (CFG_NAND_BOOT_SPL_SRC - CFG_NAND_BOOT_SPL_DST)
+
+/*
+ * Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
+ */
+#define CFG_NAND_U_BOOT_OFFS   (16 << 10)      /* Offset to RAM U-Boot image   */
+#define CFG_NAND_U_BOOT_SIZE   (384 << 10)     /* Size of RAM U-Boot image     */
+
+/*
+ * Now the NAND chip has to be defined (no autodetection used!)
+ */
+#define CFG_NAND_PAGE_SIZE     512             /* NAND chip page size          */
+#define CFG_NAND_BLOCK_SIZE    (16 << 10)      /* NAND chip block size         */
+#define CFG_NAND_PAGE_COUNT    32              /* NAND chip page count         */
+#define CFG_NAND_BAD_BLOCK_POS 5               /* Location of bad block marker */
+#define CFG_NAND_4_ADDR_CYCLE  1               /* Fourth addr used (>32MB)     */
+
+#define CFG_NAND_ECCSIZE       256
+#define CFG_NAND_ECCBYTES      3
+#define CFG_NAND_ECCSTEPS      (CFG_NAND_PAGE_SIZE / CFG_NAND_ECCSIZE)
+#define CFG_NAND_OOBSIZE       16
+#define CFG_NAND_ECCTOTAL      (CFG_NAND_ECCBYTES * CFG_NAND_ECCSTEPS)
+#define CFG_NAND_ECCPOS                {0, 1, 2, 3, 6, 7}
+
+#ifdef CFG_ENV_IS_IN_NAND
+/*
+ * For NAND booting the environment is embedded in the U-Boot image. Please take
+ * look at the file board/amcc/sequoia/u-boot-nand.lds for details.
+ */
+#define CFG_ENV_SIZE           CFG_NAND_BLOCK_SIZE
+#define CFG_ENV_OFFSET         (CFG_NAND_U_BOOT_OFFS + CFG_ENV_SIZE)
+#define CFG_ENV_OFFSET_REDUND  (CFG_ENV_OFFSET + CFG_ENV_SIZE)
+#endif
+
 /*-----------------------------------------------------------------------
  * NAND FLASH
  *----------------------------------------------------------------------*/
-#define CFG_MAX_NAND_DEVICE    1
-#define NAND_MAX_CHIPS         1
-#define CFG_NAND_CS            1
+#define CFG_MAX_NAND_DEVICE    2
+#define NAND_MAX_CHIPS         CFG_MAX_NAND_DEVICE
 #define CFG_NAND_BASE          (CFG_NAND_ADDR + CFG_NAND_CS)
+#define CFG_NAND_BASE_LIST     { CFG_NAND_BASE, CFG_NAND_ADDR + 2 }
 #define CFG_NAND_SELECT_DEVICE  1      /* nand driver supports mutipl. chips   */
 
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+#define CFG_NAND_CS            1
+#else
+#define CFG_NAND_CS            0               /* NAND chip connected to CSx   */
+/* Memory Bank 0 (NAND-FLASH) initialization                                   */
+#define CFG_EBC_PB0AP          0x018003c0
+#define CFG_EBC_PB0CR          (CFG_NAND_ADDR | 0x1c000)
+#endif
+
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------------- */
 #define CONFIG_SPD_EEPROM               /* Use SPD EEPROM for setup             */
 #undef CONFIG_DDR_ECC                  /* don't use ECC                        */
 #define CFG_SIMULATE_SPD_EEPROM        0xff    /* simulate spd eeprom on this address  */
-#define SPD_EEPROM_ADDRESS      {CFG_SIMULATE_SPD_EEPROM, 0x50, 0x51}
+#define SPD_EEPROM_ADDRESS     {CFG_SIMULATE_SPD_EEPROM, 0x50, 0x51}
+#define CFG_MBYTES_SDRAM       (64)    /* 64MB fixed size for early-sdram-init */
 
 /*-----------------------------------------------------------------------
  * I2C
index 2c160a4..ec6d57e 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 
 /*
  * Flash configuration, expect one 16 Megabyte Bank at most
index f9586fb..f5efcd9 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 #endif
 /*
  * I2C configuration
index 095b5f6..4d813d8 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 
 /*
  * I2C configuration
index 773d5d2..ad3cf06 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
 /*
  * Flash configuration
old mode 100644 (file)
new mode 100755 (executable)
index 7e51523..30e0b10
@@ -1,12 +1,8 @@
 /*
- * (C) Copyright 2000
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger@sysgo.de>
+ * (C) Copyright 2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
- * Configuation settings for the EP7312 board.
- *
- * Modified to work on Armadillo HT1070 ARM720T board
- * (C) Copyright 2005 Rowel Atienza rowel@diwalabs.com
+ * Configuation settings for the LPC2292SODIMM board from Embedded Artists.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -31,7 +27,7 @@
 #define __CONFIG_H
 
 /*
- * If we are developing, we might want to start armboot from ram
+ * If we are developing, we might want to start u-boot from ram
  * so we MUST NOT initialize critical regs like mem-timing ...
  */
 #undef CONFIG_INIT_CRITICAL            /* undef for developing */
 
 #undef  CFG_CLKS_IN_HZ         /* everything, incl board info, in Hz */
 
-#define        CFG_LOAD_ADDR           0x00040000      /* default load address for armadillo: kernel img is here*/
+#define        CFG_LOAD_ADDR           0x00040000      /* default load address for 
+                                                 * armadillo: kernel img is here
+                                                */
 
 #define CFG_SYS_CLK_FREQ        58982400        /* Hz */
 #define        CFG_HZ                  2048            /* decrementer freq in Hz */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
 #define CONFIG_MMC 1
+/* we use this ethernet chip */
+#define CONFIG_ENC28J60
 
 #endif /* __CONFIG_H */
index 9c8769b..045a144 100644 (file)
  *----------------------------------------------------------------------*/
 #define CONFIG_SPD_EEPROM      1       /* Use SPD EEPROM for setup     */
 #define SPD_EEPROM_ADDRESS     {0x53, 0x52}    /* SPD i2c spd addresses*/
-#undef CONFIG_DDR_ECC                  /* no ECC support for now       */
+#define CONFIG_DDR_ECC         1       /* with ECC support             */
+#define CFG_44x_DDR2_CKTR_180  1       /* use 180 deg advance          */
 
 /*-----------------------------------------------------------------------
  * I2C
index 621a81c..c2324a0 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
 /*
  * I2C configuration
index cb159e7..3db2877 100644 (file)
@@ -28,6 +28,7 @@
 #include "../board/xilinx/ml401/xparameters.h"
 
 #define        CONFIG_MICROBLAZE       1       /* MicroBlaze CPU */
+#define        MICROBLAZE_V5           1
 #define        CONFIG_ML401            1       /* ML401 Board */
 
 /* uart */
 #define        CFG_BAUDRATE_TABLE      { CONFIG_BAUDRATE }
 
 /* setting reset address */
-#define        CFG_RESET_ADDRESS       TEXT_BASE
+/*#define      CFG_RESET_ADDRESS       TEXT_BASE*/
 
 /* ethernet */
 #define CONFIG_EMACLITE                1
-#define XPAR_EMAC_0_DEVICE_ID  XPAR_XEMAC_NUM_INSTANCES
+#define XPAR_EMAC_0_DEVICE_ID  XPAR_OPB_ETHERNET_0_DEVICE_ID
 
 /* gpio */
 #define        CFG_GPIO_0              1
 #define        FREQUENCE               XILINX_CLOCK_FREQ
 #define        CFG_TIMER_0_PRELOAD     ( FREQUENCE/1000 )
 
+/* FSL */
+#define        CFG_FSL_2
+#define        FSL_INTR_2      1
+
 /*
  * memory layout - Example
  * TEXT_BASE = 0x1200_0000;
@@ -93,7 +98,8 @@
 
 /* global pointer */
 #define        CFG_GBL_DATA_SIZE       0x1000  /* size of global data */
-#define        CFG_GBL_DATA_OFFSET     (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - CFG_GBL_DATA_SIZE) /* start of global data */
+/* start of global data */
+#define        CFG_GBL_DATA_OFFSET     (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - CFG_GBL_DATA_SIZE)
 
 /* monitor code */
 #define        SIZE                    0x40000
        #define CFG_FLASH_EMPTY_INFO    1       /* ?empty sector */
        #define CFG_MAX_FLASH_BANKS     1       /* max number of memory banks */
        #define CFG_MAX_FLASH_SECT      128     /* max number of sectors on one chip */
+       #define CFG_FLASH_PROTECTION            /* hardware flash protection */
 
        #ifdef  RAMENV
                #define CFG_ENV_IS_NOWHERE      1
        #define CFG_ENV_IS_NOWHERE      1
        #define CFG_ENV_SIZE            0x1000
        #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SIZE)
+       #define CFG_FLASH_PROTECTION            /* hardware flash protection */
 #endif /* !FLASH */
 
 #ifdef FLASH
                                CFG_CMD_IMI |\
                                CFG_CMD_NET |\
                                CFG_CMD_CACHE |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
+                               CFG_CMD_JFFS2 |\
+                               CFG_CMD_ECHO |\
                                CFG_CMD_IMLS |\
                                CFG_CMD_FLASH |\
+                               CFG_CMD_MFSL |\
                                CFG_CMD_PING \
                                )
        #else   /* !RAMENV */
                                CFG_CMD_FLASH |\
                                CFG_CMD_PING |\
                                CFG_CMD_ENV |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
+                               CFG_CMD_JFFS2 |\
+                               CFG_CMD_ECHO |\
+                               CFG_CMD_MFSL |\
                                CFG_CMD_SAVES \
                                )
 
                                CFG_CMD_BDI |\
                                CFG_CMD_RUN |\
                                CFG_CMD_LOADS |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
                                CFG_CMD_LOADB |\
                                CFG_CMD_IMI |\
                                CFG_CMD_NET |\
                                CFG_CMD_CACHE |\
+                               CFG_CMD_MFSL |\
                                CFG_CMD_PING \
                                )
 #endif /* !FLASH */
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
 
+#if (CONFIG_COMMANDS & CFG_CMD_JFFS2)
+/* JFFS2 partitions */
+#define CONFIG_JFFS2_CMDLINE   /* mtdparts command line support */
+#define MTDIDS_DEFAULT         "nor0=ml401-0"
+
+/* default mtd partition table */
+#define MTDPARTS_DEFAULT       "mtdparts=ml401-0:256k(u-boot),"\
+                               "256k(env),3m(kernel),1m(romfs),"\
+                               "1m(cramfs),-(jffs2)"
+#endif
+
 /* Miscellaneous configurable options */
 #define        CFG_PROMPT      "U-Boot-mONStR> "
 #define        CFG_CBSIZE      512     /* size of console buffer */
 #define        CFG_LONGHELP
 #define        CFG_LOAD_ADDR   0x12000000 /* default load address */
 
-#define        CONFIG_BOOTDELAY        30
+#define        CONFIG_BOOTDELAY        30
 #define        CONFIG_BOOTARGS         "root=romfs"
 #define        CONFIG_HOSTNAME         "ml401"
 #define        CONFIG_BOOTCOMMAND      "base 0;tftp 11000000 image.img;bootm"
 #define CFG_HZ 1000
 
 /* system ace */
-/*#define CONFIG_SYSTEMACE
-#define DEBUG_SYSTEMACE
-#define CFG_SYSTEMACE_BASE     XILINX_SYSACE_BASEADDR
-#define CFG_SYSTEMACE_WIDTH    XILINX_SYSACE_MEM_WIDTH
-#define CONFIG_DOS_PARTITION
-*/
+#define        CONFIG_SYSTEMACE
+/* #define DEBUG_SYSTEMACE */
+#define        SYSTEMACE_CONFIG_FPGA
+#define        CFG_SYSTEMACE_BASE      XILINX_SYSACE_BASEADDR
+#define        CFG_SYSTEMACE_WIDTH     XILINX_SYSACE_MEM_WIDTH
+#define        CONFIG_DOS_PARTITION
+
+#define        CONFIG_PREBOOT          "echo U-BOOT for ML401;setenv preboot;echo"
+
+#define        CONFIG_EXTRA_ENV_SETTINGS       "unlock=yes\0" /* hardware flash protection */\
+                                       "nor0=ml401-0\0"\
+                                       "mtdparts=mtdparts=ml401-0:"\
+                                       "256k(u-boot),256k(env),3m(kernel),"\
+                                       "1m(romfs),1m(cramfs),-(jffs2)\0"
+
 #endif /* __CONFIG_H */
index 5328e8d..e3899a5 100644 (file)
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-
 /*
  * High Level Configuration Options
  */
 
-
 /* CPU and board */
 #define CONFIG_MPC5xxx         1       /* This is an MPC5xxx CPU */
 #define CONFIG_MPC5200         1       /* More exactly a MPC5200 */
                                CFG_CMD_MII     | \
                                CFG_CMD_BEDBUG  | \
                                CFG_CMD_NET     | \
-                               CFG_CMD_PING)
+                               CFG_CMD_PING    | \
+                               CFG_CMD_IDE     | \
+                               CFG_CMD_FAT     | \
+                               CFG_CMD_JFFS2   | \
+                               CFG_CMD_I2C     | \
+                               CFG_CMD_DATE    | \
+                               CFG_CMD_EEPROM  | \
+                               CFG_CMD_DTT)
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
@@ -71,7 +76,7 @@
 #define CONFIG_MPC5xxx_FEC     1
 #define CONFIG_PHY_ADDR                0x2
 #define CONFIG_PHY_TYPE                0x79c874
-
+#define CONFIG_RESET_PHY_R     1
 
 /*
  * Autobooting
  * Default environment settings
  */
 #define CONFIG_EXTRA_ENV_SETTINGS                                      \
-       "sdram_test=0\0"                                                \
        "netdev=eth0\0"                                                 \
        "hostname=motionpro\0"                                          \
        "netmask=255.255.0.0\0"                                         \
        "ipaddr=192.168.160.22\0"                                       \
        "serverip=192.168.1.1\0"                                        \
        "gatewayip=192.168.1.1\0"                                       \
-       "kernel_addr=200000\0"                                          \
+       "console=ttyPSC0,115200\0"                                      \
        "u-boot_addr=100000\0"                                          \
-       "kernel_sector=20\0"                                            \
-       "kernel_size=1000\0"                                            \
-       "console=ttyS0,115200\0"                                        \
+       "kernel_addr=200000\0"                                          \
+       "fdt_addr=400000\0"                                             \
+       "ramdisk_addr=500000\0"                                         \
+       "multi_image_addr=800000\0"                                     \
        "rootpath=/opt/eldk-4.1/ppc_6xx\0"                              \
-       "bootfile=/tftpboot/motionpro/uImage\0"                         \
        "u-boot=/tftpboot/motionpro/u-boot.bin\0"                       \
-       "load=tftp $(u-boot_addr) $(u-boot)\0"                          \
+       "bootfile=/tftpboot/motionpro/uImage\0"                         \
+       "fdt_file=/tftpboot/motionpro/motionpro.dtb\0"                  \
+       "ramdisk_file=/tftpboot/motionpro/uRamdisk\0"                   \
+       "multi_image_file=kernel+initrd+dtb.img\0"                      \
+       "load=tftp ${u-boot_addr} ${u-boot}\0"                          \
        "update=prot off fff00000 fff3ffff; era fff00000 fff3ffff; "    \
-               "cp.b $(u-boot_addr) fff00000 $(filesize);"             \
+               "cp.b ${u-boot_addr} fff00000 ${filesize};"             \
                "prot on fff00000 fff3ffff\0"                           \
        "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
-       "addip=setenv bootargs $(bootargs) console=$(console) "         \
-               "ip=$(ipaddr):$(serverip):$(gatewayip):"                \
-               "$(netmask):$(hostname):$(netdev):off panic=1\0"        \
-       "flash_nfs=run nfsargs addip;bootm $(kernel_addr)\0"            \
-       "flash_self=run ramargs addip;bootm $(kernel_addr) "            \
-               "$(ramdisk_addr)\0"                                     \
-       "net_nfs=tftp $(kernel_addr) $(bootfile); run nfsargs addip; "  \
-               "bootm $(kernel_addr)\0"                                \
        "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
-               "nfsroot=$(serverip):$(rootpath)\0"                     \
-       "fstype=ext3\0"                                                 \
-       "fatargs=setenv bootargs init=/linuxrc rw\0"                    \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "fat_args=setenv bootargs rw\0"                                 \
+       "addmtd=setenv bootargs ${bootargs} ${mtdparts}\0"              \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:"                \
+               "${netmask}:${hostname}:${netdev}:off panic=1 "         \
+               "console=${console}\0"                                  \
+       "net_nfs=tftp ${kernel_addr} ${bootfile}; "                     \
+               "tftp ${fdt_addr} ${fdt_file}; run nfsargs addip; "     \
+               "bootm ${kernel_addr} - ${fdt_addr}\0"                  \
+       "net_self=tftp ${kernel_addr} ${bootfile}; "                    \
+               "tftp ${fdt_addr} ${fdt_file}; "                        \
+               "tftp ${ramdisk_addr} ${ramdisk_file}; "                \
+               "run ramargs addip; "                                   \
+               "bootm ${kernel_addr} ${ramdisk_addr} ${fdt_addr}\0"    \
+       "fat_multi=run fat_args addip; fatload ide 0:1 "                \
+               "${multi_image_addr} ${multi_image_file}; "             \
+               "bootm ${multi_image_addr}\0"                           \
        ""
 #define CONFIG_BOOTCOMMAND     "run net_nfs"
 
-
 /*
  * do board-specific init
  */
 
 
 /*
+ * Set IPB speed to 100MHz
+ */
+#define CFG_IPBCLK_EQUALS_XLBCLK
+
+
+/*
  * Memory map
  */
 /*
 #define CFG_MAX_FLASH_SECT     256     /* max num of sects on one chip */
 #define CONFIG_FLASH_16BIT             /* Flash is 16-bit */
 
+/*
+ * MTD configuration
+ */
+#define CONFIG_JFFS2_CMDLINE
+#define MTDIDS_DEFAULT         "nor0=motionpro-0"
+#define MTDPARTS_DEFAULT       "mtdparts=motionpro-0:"                   \
+                                       "13m(fs),2m(kernel),256k(uboot)," \
+                                       "64k(env),64k(redund_env),64k(dtb)," \
+                                       "-(user_data)"
+
+/*
+ * IDE/ATA configuration
+ */
+#define CFG_ATA_BASE_ADDR      MPC5XXX_ATA
+#define CFG_IDE_MAXBUS         1
+#define CFG_IDE_MAXDEVICE      1
+#define CONFIG_IDE_PREINIT
+
+#define CFG_ATA_DATA_OFFSET    0x0060
+#define CFG_ATA_REG_OFFSET     CFG_ATA_DATA_OFFSET
+#define CFG_ATA_STRIDE         4
+#define CONFIG_DOS_PARTITION
+
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C                1       /* I2C with hardware support */
+#define CFG_I2C_MODULE         2       /* select I2C module #2 */
+#define CFG_I2C_SPEED          100000  /* 100 kHz */
+#define CFG_I2C_SLAVE          0x7F
+
+
+/*
+ * EEPROM configuration
+ */
+#define CFG_I2C_EEPROM_ADDR_LEN                1
+#define CFG_EEPROM_PAGE_WRITE_ENABLE   1       /* DTT driver needs this */
+#define CFG_EEPROM_PAGE_WRITE_BITS     1       /* 2 bytes per write cycle */
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 5       /* 2ms/cycle + 3ms extra */
+#define CFG_I2C_MULTI_EEPROMS          1       /* 2 EEPROMs (addr:50,52) */
+
+
+/*
+ * RTC configuration
+ */
+#define CONFIG_RTC_DS1337      1
+#define CFG_I2C_RTC_ADDR       0x68
+
+
+/*
+ * Status LED configuration
+ */
+#define CONFIG_STATUS_LED              /* Status LED enabled */
+#define CONFIG_BOARD_SPECIFIC_LED
+
+#define ENABLE_GPIO_OUT                0x00000024
+#define LED_ON                 0x00000010
+
+#ifndef __ASSEMBLY__
+/*
+ * In case of Motion-PRO, a LED is identified by its corresponding
+ * GPT Enable and Mode Select Register.
+ */
+typedef volatile unsigned long * led_id_t;
+
+extern void __led_init(led_id_t id, int state);
+extern void __led_toggle(led_id_t id);
+extern void __led_set(led_id_t id, int state);
+#endif /* __ASSEMBLY__ */
+
+
+/*
+ * Temperature sensor
+ */
+#define CONFIG_DTT_LM75                1
+#define CONFIG_DTT_SENSORS     { 0x49 }
+
 
 /*
  * Environment settings
 #define CFG_ENV_SIZE           0x1000
 #define CFG_ENV_SECT_SIZE      0x10000
 
+/* Configuration of redundant environment */
+#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
 
 /*
  * Pin multiplexing configuration
 
 
 /*
+ * Motion-PRO's CPLD revision control register
+ */
+#define CPLD_REV_REGISTER      (CFG_CS2_START + 0x06)
+
+
+/*
  * Miscellaneous configurable options
  */
 #define CFG_LONGHELP                   /* undef to save memory    */
 #define CFG_PROMPT             "=> "   /* Monitor Command Prompt   */
-#define CFG_CBSIZE             256     /* Console I/O Buffer Size  */
+#define CFG_CBSIZE             1024    /* Console I/O Buffer Size */
 #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 */
 /* Not needed for MPC 5xxx U-Boot, but used by tools/updater */
 #define CFG_RESET_ADDRESS      0xfff00100
 
+/* pass open firmware flat tree */
+#define CONFIG_OF_FLAT_TREE    1
+#define CONFIG_OF_BOARD_SETUP  1
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+#define OF_CPU                 "PowerPC,5200@0"
+#define OF_SOC                 "soc5200@f0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc5200@f0000000/serial@2000"
+
 #endif /* __CONFIG_H */
index 5c05a74..63d0da7 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock
+ *  of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2  /* define for 66MHz speed */
 #endif
 #endif
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
 
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 /*
  * For 66 MHz PCI clock additional Wait State is needed for CS0 (flash).
  */
index fefdb3c..7151a9e 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                /* define for 133MHz speed */
 #endif
 /*
  * I2C configuration
index b7f79c2..23243a4 100644 (file)
@@ -40,7 +40,7 @@
 #define CONFIG_4xx             1               /* ... PPC4xx family    */
 /* Detect Sequoia PLL input clock automatically via CPLD bit           */
 #define CONFIG_SYS_CLK_FREQ    ((in8(CFG_BCSR_BASE + 3) & 0x80) ? \
-                               3333333 : 33000000)
+                               33333333 : 33000000)
 
 #define CONFIG_BOARD_EARLY_INIT_F 1            /* Call board_early_init_f */
 #define CONFIG_MISC_INIT_R     1               /* Call misc_init_r     */
 /*
  * Now the NAND chip has to be defined (no autodetection used!)
  */
-#define CFG_NAND_PAGE_SIZE     (512)           /* NAND chip page size          */
+#define CFG_NAND_PAGE_SIZE     512             /* NAND chip page size          */
 #define CFG_NAND_BLOCK_SIZE    (16 << 10)      /* NAND chip block size         */
-#define CFG_NAND_PAGE_COUNT    (32)            /* NAND chip page count         */
-#define CFG_NAND_BAD_BLOCK_POS (5)             /* Location of bad block marker */
+#define CFG_NAND_PAGE_COUNT    32              /* NAND chip page count         */
+#define CFG_NAND_BAD_BLOCK_POS 5               /* Location of bad block marker */
 #undef CFG_NAND_4_ADDR_CYCLE                   /* No fourth addr used (<=32MB) */
 
+#define CFG_NAND_ECCSIZE       256
+#define CFG_NAND_ECCBYTES      3
+#define CFG_NAND_ECCSTEPS      (CFG_NAND_PAGE_SIZE / CFG_NAND_ECCSIZE)
+#define CFG_NAND_OOBSIZE       16
+#define CFG_NAND_ECCTOTAL      (CFG_NAND_ECCBYTES * CFG_NAND_ECCSTEPS)
+#define CFG_NAND_ECCPOS                {0, 1, 2, 3, 6, 7}
+
 #ifdef CFG_ENV_IS_IN_NAND
 /*
  * For NAND booting the environment is embedded in the U-Boot image. Please take
index e106b3b..185c2d4 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock
+ * of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2  /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 #define CFG_BOOTCS_CFG         0x0008DF30 /* for pci_clk  = 66 MHz */
 #else
 #define CFG_BOOTCS_CFG         0x0004DF30 /* for pci_clk = 33 MHz */
index f40dde2..fd138a5 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
-#if defined(CFG_IPBSPEED_133)
+#if defined(CFG_IPBCLK_EQUALS_XLBCLK)
 /*
  * PCI Bus clocking configuration
  *
  * Actually a PCI Clock of 66 MHz is only set (in cpu_init.c) if
- * CFG_IPBSPEED_133 is defined. This is because a PCI Clock of 66 MHz yet hasn't
- * been tested with a IPB Bus Clock of 66 MHz.
+ * CFG_IPBCLK_EQUALS_XLBCLK is defined. This is because a PCI Clock 
+ * of 66 MHz yet hasn't been tested with a IPB Bus Clock of 66 MHz.
  */
-#define CFG_PCISPEED_66                        /* define for 66MHz speed */
+#define CFG_PCICLK_EQUALS_IPBCLK_DIV2  /* define for 66MHz speed */
 #endif
 
 /*
 
 #define CFG_BOOTCS_START       CFG_FLASH_BASE
 #define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
-#ifdef CFG_PCISPEED_66
+#ifdef CFG_PCICLK_EQUALS_IPBCLK_DIV2
 #define CFG_BOOTCS_CFG         0x0008DF30 /* for pci_clk  = 66 MHz */
 #else
 #define CFG_BOOTCS_CFG         0x0004DF30 /* for pci_clk = 33 MHz */
index 8624f4b..1978a32 100644 (file)
  * This address, however, is used to configure a 256M local bus
  * window that includes the Config latch below.
  */
-#define CFG_LBC_OPTION_BASE    0xf0000000      /* Localbus Extension */
+#define CFG_LBC_OPTION_BASE    0xF0000000      /* Localbus Extension */
 #define CFG_LBC_OPTION_SIZE    256             /* 256MB */
 
 /* There are various flash options used, we configure for the largest,
  * which is 64Mbytes.  The CFI works fine and will discover the proper
  * sizes.
  */
-#define CFG_FLASH_BASE         0xFC000000      /* start of FLASH 64M    */
-#define CFG_BR0_PRELIM         0xFC001801      /* port size 32bit      */
-#define CFG_OR0_PRELIM         0xFC000FF7      /* 64 MB Flash           */
+#ifdef CONFIG_STXSSA_4M
+#define CFG_FLASH_BASE         0xFFC00000      /* start of  4 MiB flash */
+#else
+#define CFG_FLASH_BASE         0xFC000000      /* start of 64 MiB flash */
+#endif
+#define CFG_BR0_PRELIM (CFG_FLASH_BASE | 0x1801) /* port size 32bit     */
+#define CFG_OR0_PRELIM (CFG_FLASH_BASE | 0x0FF7)
 
 #define CFG_FLASH_CFI          1
 #define CFG_FLASH_CFI_DRIVER   1
 /* The configuration latch is Chip Select 1.
  * It's an 8-bit latch in the lower 8 bits of the word.
  */
-#define CFG_LBC_CFGLATCH_BASE  0xfb000000      /* Base of config latch */
-#define CFG_BR1_PRELIM         0xfb001801      /* 32-bit port */
-#define CFG_OR1_PRELIM         0xffff0ff7      /* 64K is enough */
+#define CFG_LBC_CFGLATCH_BASE  0xFB000000      /* Base of config latch */
+#define CFG_BR1_PRELIM         0xFB001801      /* 32-bit port */
+#define CFG_OR1_PRELIM         0xFFFF0FF7      /* 64K is enough */
 
 #define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor     */
 
 
 /* Environment - default config is in flash, see below */
 #if 0  /* in EEPROM */
-#define CFG_ENV_IS_IN_EEPROM   1
-#define CFG_ENV_OFFSET         0
-#define CFG_ENV_SIZE           2048
+# define CFG_ENV_IS_IN_EEPROM  1
+# define CFG_ENV_OFFSET                0
+# define CFG_ENV_SIZE          2048
 #else  /* in flash */
-#define        CFG_ENV_IS_IN_FLASH     1
-#define CFG_ENV_SECT_SIZE      0x40000
-
-#define        CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SECT_SIZE)
-#define        CFG_ENV_SIZE            0x4000
-#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR - CFG_ENV_SECT_SIZE)
-#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
+# define CFG_ENV_IS_IN_FLASH   1
+# ifdef CONFIG_STXSSA_4M
+#  define CFG_ENV_SECT_SIZE    0x20000
+# else /* default configuration - 64 MiB flash */
+#  define CFG_ENV_SECT_SIZE    0x40000
+# endif
+# define CFG_ENV_ADDR          (CFG_MONITOR_BASE - CFG_ENV_SECT_SIZE)
+# define CFG_ENV_SIZE          0x4000
+# define CFG_ENV_ADDR_REDUND   (CFG_ENV_ADDR - CFG_ENV_SECT_SIZE)
+# define CFG_ENV_SIZE_REDUND   (CFG_ENV_SIZE)
 #endif
 
 #define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
index 8cd8e9b..ff061ee 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#define CFG_IPBSPEED_133               /* define for 133MHz speed */
+#define CFG_IPBCLK_EQUALS_XLBCLK               /* define for 133MHz speed */
 
 /*
  * I2C configuration
index e19591d..0b7b19e 100644 (file)
 /*
  * IPB Bus clocking configuration.
  */
-#undef CFG_IPBSPEED_133                        /* define for 133MHz speed */
+#undef CFG_IPBCLK_EQUALS_XLBCLK                        /* define for 133MHz speed */
 #endif
 
 /*
index a2f4810..b4c720d 100644 (file)
                        CFG_CMD_LOADS |\
                        CFG_CMD_LOADB |\
                        CFG_CMD_MISC |\
+                       CFG_CMD_FAT |\
+                       CFG_CMD_EXT2 |\
                        CFG_CMD_PING \
                        )
 
        "base 0;" \
        "echo"
 
-
 /* system ace */
-/*#define      CONFIG_SYSTEMACE
-#define        DEBUG_SYSTEMACE
-#define        CFG_SYSTEMACE_BASE      0xCF000000
-#define        CFG_SYSTEMACE_WIDTH     16
-#define        CONFIG_DOS_PARTITION*/
+#define        CONFIG_SYSTEMACE
+/* #define DEBUG_SYSTEMACE */
+#define        SYSTEMACE_CONFIG_FPGA
+#define        CFG_SYSTEMACE_BASE      XILINX_SYSACE_BASEADDR
+#define        CFG_SYSTEMACE_WIDTH     XILINX_SYSACE_MEM_WIDTH
+#define        CONFIG_DOS_PARTITION
 
 #endif /* __CONFIG_H */
index 43fd53f..37f2924 100644 (file)
@@ -67,7 +67,8 @@ struct stat {
 
 #endif /* __PPC__ */
 
-#if defined (__ARM__) || defined (__I386__) || defined (__M68K__) || defined (__bfin__)
+#if defined (__ARM__) || defined (__I386__) || defined (__M68K__) || defined (__bfin__) ||\
+       defined (__microblaze__)
 
 struct stat {
        unsigned short st_dev;
index c2a4ff5..60fc214 100644 (file)
 #define SPR_8321E_REV11                        0x80660011
 #define SPR_8321_REV11                 0x80670011
 
+#define SPR_8311_REV10                 0x80B30010
+#define SPR_8311E_REV10                        0x80B20010
+#define SPR_8313_REV10                 0x80B10010
+#define SPR_8313E_REV10                        0x80B00010
+
 /* SPCR - System Priority Configuration Register
  */
 #define SPCR_PCIHPE                    0x10000000      /* PCI Highest Priority Enable */
 #define SPCR_TSEC2BDP_SHIFT            (31-29)
 #define SPCR_TSEC2EP                   0x00000003      /* TSEC2 emergency priority */
 #define SPCR_TSEC2EP_SHIFT             (31-31)
+
+#elif defined(CONFIG_MPC831X)
+/* SPCR bits - MPC831x specific */
+#define SPCR_TSECDP                    0x00003000      /* TSEC data priority */
+#define SPCR_TSECDP_SHIFT              (31-19)
+#define SPCR_TSECEP                    0x00000C00      /* TSEC emergency priority */
+#define SPCR_TSECEP_SHIFT              (31-21)
+#define SPCR_TSECBDP                   0x00000300      /* TSEC buffer descriptor priority */
+#define SPCR_TSECBDP_SHIFT             (31-23)
 #endif
 
 /* SICRL/H - System I/O Configuration Register Low/High
 #define SICRL_PCI_MSRC                 0x10000000
 #define SICRL_URT_CTPR                 0x06000000
 #define SICRL_IRQ_CTPR                 0x00C00000
+
+#elif defined(CONFIG_MPC831X)
+/* SICRL bits - MPC831x specific */
+#define SICRL_LBC                      0x30000000
+#define SICRL_UART                     0x0C000000
+#define SICRL_SPI_A                    0x03000000
+#define SICRL_SPI_B                    0x00C00000
+#define SICRL_SPI_C                    0x00300000
+#define SICRL_SPI_D                    0x000C0000
+#define SICRL_USBDR                    0x00000C00
+#define SICRL_ETSEC1_A                 0x0000000C
+#define SICRL_ETSEC2_A                 0x00000003
+
+/* SICRH bits - MPC831x specific */
+#define SICRH_INTR_A                   0x02000000
+#define SICRH_INTR_B                   0x00C00000
+#define SICRH_IIC                      0x00300000
+#define SICRH_ETSEC2_B                 0x000C0000
+#define SICRH_ETSEC2_C                 0x00030000
+#define SICRH_ETSEC2_D                 0x0000C000
+#define SICRH_ETSEC2_E                 0x00003000
+#define SICRH_ETSEC2_F                 0x00000C00
+#define SICRH_ETSEC2_G                 0x00000300
+#define SICRH_ETSEC1_B                 0x00000080
+#define SICRH_ETSEC1_C                 0x00000060
+#define SICRH_GTX1_DLY                 0x00000008
+#define SICRH_GTX2_DLY                 0x00000004
+#define SICRH_TSOBI1                   0x00000002
+#define SICRH_TSOBI2                   0x00000001
+
 #endif
 
 /* SWCRR - System Watchdog Control Register
 #define HRCWH_ROM_LOC_LOCAL_16BIT      0x00600000
 #define HRCWH_ROM_LOC_LOCAL_32BIT      0x00700000
 
+#if defined(CONFIG_MPC831X)
+#define HRCWH_ROM_LOC_NAND_SP_8BIT     0x00100000
+#define HRCWH_ROM_LOC_NAND_SP_16BIT    0x00200000
+#define HRCWH_ROM_LOC_NAND_LP_8BIT     0x00500000
+#define HRCWH_ROM_LOC_NAND_LP_16BIT    0x00600000
+
+#define HRCWH_RL_EXT_LEGACY            0x00000000
+#define HRCWH_RL_EXT_NAND              0x00040000
+
+#define HRCWH_TSEC1M_IN_MII            0x00000000
+#define HRCWH_TSEC1M_IN_RMII           0x00002000
+#define HRCWH_TSEC1M_IN_RGMII          0x00006000
+#define HRCWH_TSEC1M_IN_RTBI           0x0000A000
+#define HRCWH_TSEC1M_IN_SGMII          0x0000C000
+
+#define HRCWH_TSEC2M_IN_MII            0x00000000
+#define HRCWH_TSEC2M_IN_RMII           0x00000400
+#define HRCWH_TSEC2M_IN_RGMII          0x00000C00
+#define HRCWH_TSEC2M_IN_RTBI           0x00001400
+#define HRCWH_TSEC2M_IN_SGMII          0x00001800
+#endif
+
 #if defined(CONFIG_MPC834X)
 #define HRCWH_TSEC1M_IN_RGMII          0x00000000
 #define HRCWH_TSEC1M_IN_RTBI           0x00004000
 #define SCCR_TSEC2CM_1                 0x10000000
 #define SCCR_TSEC2CM_2                 0x20000000
 #define SCCR_TSEC2CM_3                 0x30000000
+
+#elif defined(CONFIG_MPC831X)
+/* TSEC1 bits are for TSEC2 as well */
+#define SCCR_TSEC1CM                   0xc0000000
+#define SCCR_TSEC1CM_SHIFT             30
+#define SCCR_TSEC1CM_1                 0x40000000
+#define SCCR_TSEC1CM_2                 0x80000000
+#define SCCR_TSEC1CM_3                 0xC0000000
+
+#define SCCR_TSEC1ON                   0x20000000
+#define SCCR_TSEC2ON                   0x10000000
+
 #endif
 
 #define SCCR_USBMPHCM                  0x00c00000
 #define CSCONFIG_COL_BIT_10            0x00000002
 #define CSCONFIG_COL_BIT_11            0x00000003
 
+/* TIMING_CFG_0 - DDR SDRAM Timing Configuration 0
+ */
+#define TIMING_CFG0_RWT                        0xC0000000
+#define TIMING_CFG0_RWT_SHIFT          30
+#define TIMING_CFG0_WRT                        0x30000000
+#define TIMING_CFG0_WRT_SHIFT          28
+#define TIMING_CFG0_RRT                        0x0C000000
+#define TIMING_CFG0_RRT_SHIFT          26
+#define TIMING_CFG0_WWT                        0x03000000
+#define TIMING_CFG0_WWT_SHIFT          24
+#define TIMING_CFG0_ACT_PD_EXIT                0x00700000
+#define TIMING_CFG0_ACT_PD_EXIT_SHIFT  20
+#define TIMING_CFG0_PRE_PD_EXIT                0x00070000
+#define TIMING_CFG0_PRE_PD_EXIT_SHIFT  16
+#define TIMING_CFG0_ODT_PD_EXIT                0x00000F00
+#define TIMING_CFG0_ODT_PD_EXIT_SHIFT  8
+#define TIMING_CFG0_MRS_CYC            0x00000F00
+#define TIMING_CFG0_MRS_CYC_SHIFT      0
+
 /* TIMING_CFG_1 - DDR SDRAM Timing Configuration 1
  */
 #define TIMING_CFG1_PRETOACT           0x70000000
 #define TIMING_CFG2_WR_DATA_DELAY_SHIFT        10
 #define TIMING_CFG2_CPO_DEF            0x00000000      /* default (= CASLAT + 1) */
 
+#define TIMING_CFG2_ADD_LAT            0x70000000
+#define TIMING_CFG2_ADD_LAT_SHIFT      28
+#define TIMING_CFG2_WR_LAT_DELAY       0x00380000
+#define TIMING_CFG2_WR_LAT_DELAY_SHIFT 19
+#define TIMING_CFG2_RD_TO_PRE          0x0000E000
+#define TIMING_CFG2_RD_TO_PRE_SHIFT    13
+#define TIMING_CFG2_CKE_PLS            0x000001C0
+#define TIMING_CFG2_CKE_PLS_SHIFT      6
+#define TIMING_CFG2_FOUR_ACT           0x0000003F
+#define TIMING_CFG2_FOUR_ACT_SHIFT     0
+
 /* DDR_SDRAM_CFG - DDR SDRAM Control Configuration
  */
 #define SDRAM_CFG_MEM_EN               0x80000000
 #define SDRAM_CFG_ECC_EN               0x20000000
 #define SDRAM_CFG_RD_EN                        0x10000000
 #define SDRAM_CFG_SDRAM_TYPE           0x03000000
+#define SDRAM_CFG_SDRAM_TYPE_DDR       0x02000000
 #define SDRAM_CFG_SDRAM_TYPE_SHIFT     24
 #define SDRAM_CFG_DYN_PWR              0x00200000
 #define SDRAM_CFG_32_BE                        0x00080000
 #define SDRAM_CFG_8_BE                 0x00040000
 #define SDRAM_CFG_NCAP                 0x00020000
 #define SDRAM_CFG_2T_EN                        0x00008000
-#define SDRAM_CFG_SDRAM_TYPE_DDR       0x02000000
+#define SDRAM_CFG_BI                   0x00000001
 
 /* DDR_SDRAM_MODE - DDR SDRAM Mode Register
  */
 #define BR_PS_32                       0x00001800      /* Port Size 32 bit */
 #define BR_DECC                                0x00000600
 #define BR_DECC_SHIFT                  9
+#define BR_DECC_OFF                    0x00000000
+#define BR_DECC_CHK                    0x00000200
+#define BR_DECC_CHK_GEN                        0x00000400
 #define BR_WP                          0x00000100
 #define BR_WP_SHIFT                    8
 #define BR_MSEL                                0x000000E0
 #define BR_MSEL_SHIFT                  5
 #define BR_MS_GPCM                     0x00000000      /* GPCM */
+#define BR_MS_FCM                      0x00000020      /* FCM */
 #define BR_MS_SDRAM                    0x00000060      /* SDRAM */
 #define BR_MS_UPMA                     0x00000080      /* UPMA */
 #define BR_MS_UPMB                     0x000000A0      /* UPMB */
 #define OR_GPCM_EAD                    0x00000001
 #define OR_GPCM_EAD_SHIFT              0
 
+#define OR_FCM_AM                      0xFFFF8000
+#define OR_FCM_AM_SHIFT                                15
+#define OR_FCM_BCTLD                   0x00001000
+#define OR_FCM_BCTLD_SHIFT                     12
+#define OR_FCM_PGS                     0x00000400
+#define OR_FCM_PGS_SHIFT                       10
+#define OR_FCM_CSCT                    0x00000200
+#define OR_FCM_CSCT_SHIFT                       9
+#define OR_FCM_CST                     0x00000100
+#define OR_FCM_CST_SHIFT                        8
+#define OR_FCM_CHT                     0x00000080
+#define OR_FCM_CHT_SHIFT                        7
+#define OR_FCM_SCY                     0x00000070
+#define OR_FCM_SCY_SHIFT                        4
+#define OR_FCM_SCY_1                   0x00000010
+#define OR_FCM_SCY_2                   0x00000020
+#define OR_FCM_SCY_3                   0x00000030
+#define OR_FCM_SCY_4                   0x00000040
+#define OR_FCM_SCY_5                   0x00000050
+#define OR_FCM_SCY_6                   0x00000060
+#define OR_FCM_SCY_7                   0x00000070
+#define OR_FCM_RST                     0x00000008
+#define OR_FCM_RST_SHIFT                        3
+#define OR_FCM_TRLX                    0x00000004
+#define OR_FCM_TRLX_SHIFT                       2
+#define OR_FCM_EHTR                    0x00000002
+#define OR_FCM_EHTR_SHIFT                       1
+
 #define OR_UPM_AM                      0xFFFF8000
 #define OR_UPM_AM_SHIFT                        15
 #define OR_UPM_XAM                     0x00006000
 #define PIWAR_IWS_1G                   0x0000001D
 #define PIWAR_IWS_2G                   0x0000001E
 
+/* PMCCR1 - PCI Configuration Register 1
+ */
+#define PMCCR1_POWER_OFF               0x00000020
+
+/* FMR - Flash Mode Register
+ */
+#define FMR_CWTO               0x0000F000
+#define FMR_CWTO_SHIFT         12
+#define FMR_BOOT               0x00000800
+#define FMR_ECCM               0x00000100
+#define FMR_AL                 0x00000030
+#define FMR_AL_SHIFT           4
+#define FMR_OP                 0x00000003
+#define FMR_OP_SHIFT           0
+
+/* FIR - Flash Instruction Register
+ */
+#define FIR_OP0                        0xF0000000
+#define FIR_OP0_SHIFT          28
+#define FIR_OP1                        0x0F000000
+#define FIR_OP1_SHIFT          24
+#define FIR_OP2                        0x00F00000
+#define FIR_OP2_SHIFT          20
+#define FIR_OP3                        0x000F0000
+#define FIR_OP3_SHIFT          16
+#define FIR_OP4                        0x0000F000
+#define FIR_OP4_SHIFT          12
+#define FIR_OP5                        0x00000F00
+#define FIR_OP5_SHIFT          8
+#define FIR_OP6                        0x000000F0
+#define FIR_OP6_SHIFT          4
+#define FIR_OP7                        0x0000000F
+#define FIR_OP7_SHIFT          0
+#define FIR_OP_NOP             0x0 /* No operation and end of sequence */
+#define FIR_OP_CA              0x1 /* Issue current column address */
+#define FIR_OP_PA              0x2 /* Issue current block+page address */
+#define FIR_OP_UA              0x3 /* Issue user defined address */
+#define FIR_OP_CM0             0x4 /* Issue command from FCR[CMD0] */
+#define FIR_OP_CM1             0x5 /* Issue command from FCR[CMD1] */
+#define FIR_OP_CM2             0x6 /* Issue command from FCR[CMD2] */
+#define FIR_OP_CM3             0x7 /* Issue command from FCR[CMD3] */
+#define FIR_OP_WB              0x8 /* Write FBCR bytes from FCM buffer */
+#define FIR_OP_WS              0x9 /* Write 1 or 2 bytes from MDR[AS] */
+#define FIR_OP_RB              0xA /* Read FBCR bytes to FCM buffer */
+#define FIR_OP_RS              0xB /* Read 1 or 2 bytes to MDR[AS] */
+#define FIR_OP_CW0             0xC /* Wait then issue FCR[CMD0] */
+#define FIR_OP_CW1             0xD /* Wait then issue FCR[CMD1] */
+#define FIR_OP_RBW             0xE /* Wait then read FBCR bytes */
+#define FIR_OP_RSW             0xF /* Wait then read 1 or 2 bytes */
+
+/* FCR - Flash Command Register
+ */
+#define FCR_CMD0               0xFF000000
+#define FCR_CMD0_SHIFT         24
+#define FCR_CMD1               0x00FF0000
+#define FCR_CMD1_SHIFT         16
+#define FCR_CMD2               0x0000FF00
+#define FCR_CMD2_SHIFT         8
+#define FCR_CMD3               0x000000FF
+#define FCR_CMD3_SHIFT         0
+
+/* FBAR - Flash Block Address Register
+ */
+#define FBAR_BLK               0x00FFFFFF
+
+/* FPAR - Flash Page Address Register
+ */
+#define FPAR_SP_PI             0x00007C00
+#define FPAR_SP_PI_SHIFT       10
+#define FPAR_SP_MS             0x00000200
+#define FPAR_SP_CI             0x000001FF
+#define FPAR_SP_CI_SHIFT       0
+#define FPAR_LP_PI             0x0003F000
+#define FPAR_LP_PI_SHIFT       12
+#define FPAR_LP_MS             0x00000800
+#define FPAR_LP_CI             0x000007FF
+#define FPAR_LP_CI_SHIFT       0
+
+/* LTESR - Transfer Error Status Register
+ */
+#define LTESR_BM               0x80000000
+#define LTESR_FCT              0x40000000
+#define LTESR_PAR              0x20000000
+#define LTESR_WP               0x04000000
+#define LTESR_ATMW             0x00800000
+#define LTESR_ATMR             0x00400000
+#define LTESR_CS               0x00080000
+#define LTESR_CC               0x00000001
+
+/* DDR Control Driver Register
+ */
+#define DDRCDR_EN              0x40000000
+#define DDRCDR_PZ              0x3C000000
+#define DDRCDR_PZ_MAXZ         0x00000000
+#define DDRCDR_PZ_HIZ          0x20000000
+#define DDRCDR_PZ_NOMZ         0x30000000
+#define DDRCDR_PZ_LOZ          0x38000000
+#define DDRCDR_PZ_MINZ         0x3C000000
+#define DDRCDR_NZ              0x3C000000
+#define DDRCDR_NZ_MAXZ         0x00000000
+#define DDRCDR_NZ_HIZ          0x02000000
+#define DDRCDR_NZ_NOMZ         0x03000000
+#define DDRCDR_NZ_LOZ          0x03800000
+#define DDRCDR_NZ_MINZ         0x03C00000
+#define DDRCDR_ODT             0x00080000
+#define DDRCDR_DDR_CFG         0x00040000
+#define DDRCDR_M_ODR           0x00000002
+#define DDRCDR_Q_DRN           0x00000001
+
+#ifndef __ASSEMBLY__
+struct pci_region;
+void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot);
+#endif
+
 #endif /* __MPC83XX_H__ */
index a2503a9..71ad12e 100644 (file)
 #define sdrcfga (SDR_DCR_BASE+0x0)     /* ADDR */
 #define sdrcfgd (SDR_DCR_BASE+0x1)     /* Data */
 
-#define mtsdr(reg, data) mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data)
-#define mfsdr(reg, data) mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd)
+#define mtsdr(reg, data)       do { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); } while (0)
+#define mfsdr(reg, data)       do { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); } while (0)
 
 #define sdrnand0       0x4000
 #define sdrultra0      0x4040
 #define sdricintstat   0x4510
 
 #define SDR_NAND0_NDEN         0x80000000
+#define SDR_NAND0_NDBTEN       0x40000000
+#define SDR_NAND0_NDBADR_MASK  0x30000000
+#define SDR_NAND0_NDBPG_MASK   0x0f000000
+#define SDR_NAND0_NDAREN       0x00800000
+#define SDR_NAND0_NDRBEN       0x00400000
 
 #define SDR_ULTRA0_NDGPIOBP    0x80000000
 #define SDR_ULTRA0_CSN_MASK    0x78000000
 #define SDR_ULTRA0_CSNSEL1     0x20000000
 #define SDR_ULTRA0_CSNSEL2     0x10000000
 #define SDR_ULTRA0_CSNSEL3     0x08000000
+#define SDR_ULTRA0_EBCRDYEN    0x04000000
+#define SDR_ULTRA0_SPISSINEN   0x02000000
+#define SDR_ULTRA0_NFSRSTEN    0x01000000
 
 #define SDR_ULTRA1_LEDNENABLE  0x40000000
 
 /*
  * Macro for accessing the indirect CPR register
  */
-#define mtcpr(reg, data)  mtdcr(cprcfga,reg);mtdcr(cprcfgd,data)
-#define mfcpr(reg, data)  mtdcr(cprcfga,reg);data = mfdcr(cprcfgd)
+#define mtcpr(reg, data)       do { mtdcr(cprcfga,reg);mtdcr(cprcfgd,data); } while (0)
+#define mfcpr(reg, data)       do { mtdcr(cprcfga,reg);data = mfdcr(cprcfgd); } while (0)
 
 #define CPR_CLKUPD_ENPLLCH_EN  0x40000000     /* Enable CPR PLL Changes */
 #define CPR_CLKUPD_ENDVCH_EN   0x20000000     /* Enable CPR Sys. Div. Changes */
index bc1d7aa..07f75de 100644 (file)
 /*----------------------------------------------------------------------------+
 | Clock / Power-on-reset DCR's.
 +----------------------------------------------------------------------------*/
-#define CPR0_CFGADDR                   0x00C
-#define CPR0_CFGDATA                   0x00D
-
 #define CPR0_CLKUPD                    0x20
 #define CPR0_CLKUPD_BSY_MASK           0x80000000
 #define CPR0_CLKUPD_BSY_COMPLETED      0x00000000
 #define mtsdr(reg, data)       do { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); } while (0)
 #define mfsdr(reg, data)       do { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); } while (0)
 
+/*
+ * All 44x except 440GP have CPR registers (indirect DCR)
+ */
+#if !defined(CONFIG_440GP)
+#define CPR0_CFGADDR           0x00C
+#define CPR0_CFGDATA           0x00D
+
+#define mtcpr(reg, data)       do { \
+               mtdcr(CPR0_CFGADDR, reg); \
+               mtdcr(CPR0_CFGDATA, data); \
+       } while (0)
+
+#define mfcpr(reg, data)       do { \
+               mtdcr(CPR0_CFGADDR, reg); \
+               data = mfdcr(CPR0_CFGDATA); \
+       } while (0)
+#endif
 
 #ifndef __ASSEMBLY__
 
index db4c60f..71a202f 100644 (file)
@@ -355,6 +355,18 @@ void status_led_set  (int led, int state);
 # define STATUS_LED_ACTIVE     0               /* LED on for bit == 0 */
 # define STATUS_LED_BOOT       0               /* LED 0 used for boot status */
 
+#elif defined(CONFIG_MOTIONPRO)
+
+#define STATUS_LED_BIT         ((vu_long *) MPC5XXX_GPT6_ENABLE)
+#define STATUS_LED_PERIOD      (CFG_HZ / 10)
+#define STATUS_LED_STATE       STATUS_LED_BLINKING
+
+#define STATUS_LED_BIT1                ((vu_long *) MPC5XXX_GPT7_ENABLE)
+#define STATUS_LED_PERIOD1     (CFG_HZ / 10)
+#define STATUS_LED_STATE1      STATUS_LED_OFF
+
+#define STATUS_LED_BOOT                0       /* LED 0 used for boot status */
+
 #else
 # error Status LED configuration missing
 #endif
index 24e8e97..9e85cdd 100644 (file)
@@ -310,10 +310,6 @@ init_fnc_t *init_sequence[] = {
        prt_8260_clks,
 #endif /* CONFIG_8260 */
 
-#if defined(CONFIG_MPC83XX)
-       print_clock_conf,
-#endif
-
        checkcpu,
 #if defined(CONFIG_MPC5xxx)
        prt_mpc5xxx_clks,
@@ -568,7 +564,9 @@ void board_init_f (ulong bootflag)
 
        bd->bi_procfreq = gd->cpu_clk;  /* Processor Speed, In Hz */
        bd->bi_plb_busfreq = gd->bus_clk;
-#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
+#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
+    defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
        bd->bi_pci_busfreq = get_PCI_freq ();
        bd->bi_opbfreq = get_OPB_freq ();
 #elif defined(CONFIG_XILINX_ML300)
diff --git a/nand_spl/board/amcc/acadia/Makefile b/nand_spl/board/amcc/acadia/Makefile
new file mode 100644 (file)
index 0000000..0d6828a
--- /dev/null
@@ -0,0 +1,104 @@
+#
+# (C) Copyright 2007
+# Stefan Roese, DENX Software Engineering, sr@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
+include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
+
+LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
+LDFLAGS        = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
+AFLAGS += -DCONFIG_NAND_SPL
+CFLAGS += -DCONFIG_NAND_SPL
+
+SOBJS  = start.o resetvec.o
+COBJS  = gpio.o nand_boot.o nand_ecc.o memory.o ndfc.o
+
+SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS := $(SOBJS) $(COBJS)
+LNDIR  := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
+
+nandobj        := $(OBJTREE)/nand_spl/
+
+ALL    = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
+
+all:   $(obj).depend $(ALL)
+
+$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary $< $@
+
+$(nandobj)u-boot-spl.bin:      $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(nandobj)u-boot-spl:  $(OBJS)
+       cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
+               -Map $(nandobj)u-boot-spl.map \
+               -o $(nandobj)u-boot-spl
+
+# create symbolic links for common files
+
+# from cpu directory
+$(obj)gpio.c:
+       @rm -f $(obj)gpio.c
+       ln -s $(SRCTREE)/cpu/ppc4xx/gpio.c $(obj)gpio.c
+
+$(obj)ndfc.c:
+       @rm -f $(obj)ndfc.c
+       ln -s $(SRCTREE)/cpu/ppc4xx/ndfc.c $(obj)ndfc.c
+
+$(obj)resetvec.S:
+       @rm -f $(obj)resetvec.S
+       ln -s $(SRCTREE)/cpu/ppc4xx/resetvec.S $(obj)resetvec.S
+
+$(obj)start.S:
+       @rm -f $(obj)start.S
+       ln -s $(SRCTREE)/cpu/ppc4xx/start.S $(obj)start.S
+
+# from board directory
+$(obj)memory.c:
+       @rm -f $(obj)memory.c
+       ln -s $(SRCTREE)/board/amcc/acadia/memory.c $(obj)memory.c
+
+# from nand_spl directory
+$(obj)nand_boot.c:
+       @rm -f $(obj)nand_boot.c
+       ln -s $(SRCTREE)/nand_spl/nand_boot.c $(obj)nand_boot.c
+
+# from drivers/nand directory
+$(obj)nand_ecc.c:
+       @rm -f $(obj)nand_ecc.c
+       ln -s $(SRCTREE)/drivers/nand/nand_ecc.c $(obj)nand_ecc.c
+
+#########################################################################
+
+$(obj)%.o:     $(obj)%.S
+       $(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o:     $(obj)%.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/nand_spl/board/amcc/acadia/config.mk b/nand_spl/board/amcc/acadia/config.mk
new file mode 100644 (file)
index 0000000..55069b4
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2007
+# Stefan Roese, DENX Software Engineering, sr@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
+#
+#
+# AMCC 405EZ Reference Platform (Acadia) board
+#
+
+#
+# TEXT_BASE for SPL:
+#
+# On 4xx platforms the SPL is located at 0xfffff000...0xffffffff,
+# in the last 4kBytes of memory space in cache.
+# We will copy this SPL into internal SRAM in start.S. So we set
+# TEXT_BASE to starting address in internal SRAM here.
+#
+TEXT_BASE = 0xF8003000
+
+# PAD_TO used to generate a 16kByte binary needed for the combined image
+# -> PAD_TO = TEXT_BASE + 0x4000
+PAD_TO = 0xF8007000
+
+ifeq ($(debug),1)
+PLATFORM_CPPFLAGS += -DDEBUG
+endif
+
+ifeq ($(dbcr),1)
+PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000
+endif
diff --git a/nand_spl/board/amcc/acadia/u-boot.lds b/nand_spl/board/amcc/acadia/u-boot.lds
new file mode 100644 (file)
index 0000000..018def1
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@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
+ */
+
+OUTPUT_ARCH(powerpc:common)
+SECTIONS
+{
+  .resetvec 0xF8003FFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .text      :
+  {
+    start.o    (.text)
+    nand_boot.o        (.text)
+    ndfc.o     (.text)
+
+    *(.text)
+    *(.fixup)
+  }
+  _etext = .;
+
+  .data    :
+  {
+    *(.rodata*)
+    *(.data*)
+    *(.sdata*)
+    __got2_start = .;
+    *(.got2)
+    __got2_end = .;
+  }
+
+  _edata  =  .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss)
+   *(.bss)
+  }
+
+  _end = . ;
+}
diff --git a/nand_spl/board/amcc/bamboo/Makefile b/nand_spl/board/amcc/bamboo/Makefile
new file mode 100644 (file)
index 0000000..0df86f9
--- /dev/null
@@ -0,0 +1,100 @@
+#
+# (C) Copyright 2007
+# Stefan Roese, DENX Software Engineering, sr@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
+include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
+
+LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
+LDFLAGS        = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
+AFLAGS += -DCONFIG_NAND_SPL
+CFLAGS += -DCONFIG_NAND_SPL
+
+SOBJS  = start.o init.o resetvec.o
+COBJS  = nand_boot.o nand_ecc.o ndfc.o sdram.o
+
+SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS := $(SOBJS) $(COBJS)
+LNDIR  := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
+
+nandobj        := $(OBJTREE)/nand_spl/
+
+ALL    = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
+
+all:   $(obj).depend $(ALL)
+
+$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary $< $@
+
+$(nandobj)u-boot-spl.bin:      $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(nandobj)u-boot-spl:  $(OBJS)
+       cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
+               -Map $(nandobj)u-boot-spl.map \
+               -o $(nandobj)u-boot-spl
+
+# create symbolic links for common files
+
+# from cpu directory
+$(obj)ndfc.c:
+       @rm -f $(obj)ndfc.c
+       ln -s $(SRCTREE)/cpu/ppc4xx/ndfc.c $(obj)ndfc.c
+
+$(obj)resetvec.S:
+       @rm -f $(obj)resetvec.S
+       ln -s $(SRCTREE)/cpu/ppc4xx/resetvec.S $(obj)resetvec.S
+
+$(obj)start.S:
+       @rm -f $(obj)start.S
+       ln -s $(SRCTREE)/cpu/ppc4xx/start.S $(obj)start.S
+
+# from board directory
+$(obj)init.S:
+       @rm -f $(obj)init.S
+       ln -s $(SRCTREE)/board/amcc/bamboo/init.S $(obj)init.S
+
+# from nand_spl directory
+$(obj)nand_boot.c:
+       @rm -f $(obj)nand_boot.c
+       ln -s $(SRCTREE)/nand_spl/nand_boot.c $(obj)nand_boot.c
+
+# from drivers/nand directory
+$(obj)nand_ecc.c:
+       @rm -f $(obj)nand_ecc.c
+       ln -s $(SRCTREE)/drivers/nand/nand_ecc.c $(obj)nand_ecc.c
+
+#########################################################################
+
+$(obj)%.o:     $(obj)%.S
+       $(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o:     $(obj)%.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/nand_spl/board/amcc/bamboo/config.mk b/nand_spl/board/amcc/bamboo/config.mk
new file mode 100644 (file)
index 0000000..f7ec751
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# (C) Copyright 2007
+# Stefan Roese, DENX Software Engineering, sr@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
+#
+#
+# AMCC 440EP Reference Platform (Bamboo) board
+#
+
+#
+# TEXT_BASE for SPL:
+#
+# On 440EP(x) platforms the SPL is located at 0xfffff000...0xffffffff,
+# in the last 4kBytes of memory space in cache.
+# We will copy this SPL into instruction-cache in start.S. So we set
+# TEXT_BASE to starting address in i-cache here.
+#
+TEXT_BASE = 0x00800000
+
+# PAD_TO used to generate a 16kByte binary needed for the combined image
+# -> PAD_TO = TEXT_BASE + 0x4000
+PAD_TO = 0x00804000
+
+PLATFORM_CPPFLAGS += -DCONFIG_440=1
+
+ifeq ($(debug),1)
+PLATFORM_CPPFLAGS += -DDEBUG
+endif
+
+ifeq ($(dbcr),1)
+PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000
+endif
diff --git a/nand_spl/board/amcc/bamboo/sdram.c b/nand_spl/board/amcc/bamboo/sdram.c
new file mode 100644 (file)
index 0000000..4f09072
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@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 <common.h>
+#include <ppc4xx.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+
+static void wait_init_complete(void)
+{
+       u32 val;
+
+       do {
+               mfsdram(mem_mcsts, val);
+       } while (!(val & 0x80000000));
+}
+
+/*
+ * early_sdram_init()
+ *
+ * As the name already indicates, this function is called very early
+ * from start.S and configures the SDRAM with fixed values. This is needed,
+ * since the 440EP has no internal SRAM and the 4kB NAND_SPL loader has
+ * not enough free space to implement the complete I2C SPD DDR autodetection
+ * routines. Therefore the Bamboo only supports the onboard 64MBytes of SDRAM
+ * when booting from NAND flash.
+ */
+void early_sdram_init(void)
+{
+       /*
+        * Soft-reset SDRAM controller.
+        */
+       mtsdr(sdr_srst, SDR0_SRST_DMC);
+       mtsdr(sdr_srst, 0x00000000);
+
+       /*
+        * Disable memory controller.
+        */
+       mtsdram(mem_cfg0, 0x00000000);
+
+       /*
+        * Setup some default
+        */
+       mtsdram(mem_uabba, 0x00000000); /* ubba=0 (default)             */
+       mtsdram(mem_slio, 0x00000000);  /* rdre=0 wrre=0 rarw=0         */
+       mtsdram(mem_devopt, 0x00000000); /* dll=0 ds=0 (normal)         */
+       mtsdram(mem_wddctr, 0x00000000); /* wrcp=0 dcd=0                */
+       mtsdram(mem_clktr, 0x40000000); /* clkp=1 (90 deg wr) dcdt=0    */
+
+       /*
+        * Following for CAS Latency = 2.5 @ 133 MHz PLB
+        */
+       mtsdram(mem_b0cr, 0x00082001);
+       mtsdram(mem_tr0, 0x41094012);
+       mtsdram(mem_tr1, 0x8080083d);   /* SS=T2 SL=STAGE 3 CD=1 CT=0x00*/
+       mtsdram(mem_rtr, 0x04100000);   /* Interval 7.8µs @ 133MHz PLB  */
+       mtsdram(mem_cfg1, 0x00000000);  /* Self-refresh exit, disable PM*/
+
+       /*
+        * Enable the controller, then wait for DCEN to complete
+        */
+       mtsdram(mem_cfg0, 0x80000000); /* DCEN=1, PMUD=0*/
+       wait_init_complete();
+}
+
+long int initdram(int board_type)
+{
+       /*
+        * Nothing to do here, just return size of fixed SDRAM setup
+        */
+       return CFG_MBYTES_SDRAM << 20;
+}
diff --git a/nand_spl/board/amcc/bamboo/u-boot.lds b/nand_spl/board/amcc/bamboo/u-boot.lds
new file mode 100644 (file)
index 0000000..28228f8
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@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
+ */
+
+OUTPUT_ARCH(powerpc:common)
+SECTIONS
+{
+  .resetvec 0x00800FFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .text      :
+  {
+    start.o    (.text)
+    init.o     (.text)
+    nand_boot.o        (.text)
+    sdram.o    (.text)
+    ndfc.o     (.text)
+
+    *(.text)
+    *(.fixup)
+  }
+  _etext = .;
+
+  .data    :
+  {
+    *(.rodata*)
+    *(.data*)
+    *(.sdata*)
+    __got2_start = .;
+    *(.got2)
+    __got2_end = .;
+  }
+
+  _edata  =  .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss)
+   *(.bss)
+  }
+
+  _end = . ;
+}
index b42da8c..ec1be5a 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2006
+# (C) Copyright 2006-2007
 # Stefan Roese, DENX Software Engineering, sr@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -30,7 +30,7 @@ AFLAGS        += -DCONFIG_NAND_SPL
 CFLAGS += -DCONFIG_NAND_SPL
 
 SOBJS  = start.o init.o resetvec.o
-COBJS  = nand_boot.o ndfc.o sdram.o
+COBJS  = nand_boot.o nand_ecc.o ndfc.o sdram.o
 
 SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
@@ -85,6 +85,11 @@ $(obj)nand_boot.c:
        @rm -f $(obj)nand_boot.c
        ln -s $(SRCTREE)/nand_spl/nand_boot.c $(obj)nand_boot.c
 
+# from drivers/nand directory
+$(obj)nand_ecc.c:
+       @rm -f $(obj)nand_ecc.c
+       ln -s $(SRCTREE)/drivers/nand/nand_ecc.c $(obj)nand_ecc.c
+
 #########################################################################
 
 $(obj)%.o:     $(obj)%.S
index a136fb7..840a596 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * This program is free software; you can redistribute it and/or
 #define CFG_NAND_READ_DELAY \
        { volatile int dummy; int i; for (i=0; i<10000; i++) dummy = i; }
 
+static int nand_ecc_pos[] = CFG_NAND_ECCPOS;
+
 extern void board_nand_init(struct nand_chip *nand);
-extern void ndfc_hwcontrol(struct mtd_info *mtdinfo, int cmd);
-extern void ndfc_write_byte(struct mtd_info *mtdinfo, u_char byte);
-extern u_char ndfc_read_byte(struct mtd_info *mtdinfo);
-extern int ndfc_dev_ready(struct mtd_info *mtdinfo);
-extern int jump_to_ram(ulong delta);
-extern int jump_to_uboot(ulong addr);
 
-static int nand_is_bad_block(struct mtd_info *mtd, int block)
+static int nand_command(struct mtd_info *mtd, int block, int page, int offs, u8 cmd)
 {
        struct nand_chip *this = mtd->priv;
-       int page_addr = block * CFG_NAND_PAGE_COUNT;
+       int page_addr = page + block * CFG_NAND_PAGE_COUNT;
+
+       if (this->dev_ready)
+               this->dev_ready(mtd);
+       else
+               CFG_NAND_READ_DELAY;
 
        /* Begin command latch cycle */
        this->hwcontrol(mtd, NAND_CTL_SETCLE);
-       this->write_byte(mtd, NAND_CMD_READOOB);
+       this->write_byte(mtd, cmd);
        /* Set ALE and clear CLE to start address cycle */
        this->hwcontrol(mtd, NAND_CTL_CLRCLE);
        this->hwcontrol(mtd, NAND_CTL_SETALE);
        /* Column address */
-       this->write_byte(mtd, CFG_NAND_BAD_BLOCK_POS);                  /* A[7:0] */
+       this->write_byte(mtd, offs);                                    /* A[7:0] */
        this->write_byte(mtd, (uchar)(page_addr & 0xff));               /* A[16:9] */
        this->write_byte(mtd, (uchar)((page_addr >> 8) & 0xff));        /* A[24:17] */
 #ifdef CFG_NAND_4_ADDR_CYCLE
@@ -62,6 +63,15 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)
        else
                CFG_NAND_READ_DELAY;
 
+       return 0;
+}
+
+static int nand_is_bad_block(struct mtd_info *mtd, int block)
+{
+       struct nand_chip *this = mtd->priv;
+
+       nand_command(mtd, block, 0, CFG_NAND_BAD_BLOCK_POS, NAND_CMD_READOOB);
+
        /*
         * Read on byte
         */
@@ -74,39 +84,46 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)
 static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)
 {
        struct nand_chip *this = mtd->priv;
-       int page_addr = page + block * CFG_NAND_PAGE_COUNT;
+       u_char *ecc_calc;
+       u_char *ecc_code;
+       u_char *oob_data;
        int i;
+       int eccsize = CFG_NAND_ECCSIZE;
+       int eccbytes = CFG_NAND_ECCBYTES;
+       int eccsteps = CFG_NAND_ECCSTEPS;
+       uint8_t *p = dst;
+       int stat;
 
-       /* Begin command latch cycle */
-       this->hwcontrol(mtd, NAND_CTL_SETCLE);
-       this->write_byte(mtd, NAND_CMD_READ0);
-       /* Set ALE and clear CLE to start address cycle */
-       this->hwcontrol(mtd, NAND_CTL_CLRCLE);
-       this->hwcontrol(mtd, NAND_CTL_SETALE);
-       /* Column address */
-       this->write_byte(mtd, 0);                                       /* A[7:0] */
-       this->write_byte(mtd, (uchar)(page_addr & 0xff));               /* A[16:9] */
-       this->write_byte(mtd, (uchar)((page_addr >> 8) & 0xff));        /* A[24:17] */
-#ifdef CFG_NAND_4_ADDR_CYCLE
-       /* One more address cycle for devices > 32MiB */
-       this->write_byte(mtd, (uchar)((page_addr >> 16) & 0x0f));       /* A[xx:25] */
-#endif
-       /* Latch in address */
-       this->hwcontrol(mtd, NAND_CTL_CLRALE);
+       nand_command(mtd, block, page, 0, NAND_CMD_READ0);
 
-       /*
-        * Wait a while for the data to be ready
+       /* No malloc available for now, just use some temporary locations
+        * in SDRAM
         */
-       if (this->dev_ready)
-               this->dev_ready(mtd);
-       else
-               CFG_NAND_READ_DELAY;
+       ecc_calc = (u_char *)(CFG_SDRAM_BASE + 0x10000);
+       ecc_code = ecc_calc + 0x100;
+       oob_data = ecc_calc + 0x200;
+
+       for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
+               this->enable_hwecc(mtd, NAND_ECC_READ);
+               this->read_buf(mtd, p, eccsize);
+               this->calculate_ecc(mtd, p, &ecc_calc[i]);
+       }
+       this->read_buf(mtd, oob_data, CFG_NAND_OOBSIZE);
 
-       /*
-        * Read page into buffer
-        */
-       for (i=0; i<CFG_NAND_PAGE_SIZE; i++)
-               *dst++ = this->read_byte(mtd);
+       /* Pick the ECC bytes out of the oob data */
+       for (i = 0; i < CFG_NAND_ECCTOTAL; i++)
+               ecc_code[i] = oob_data[nand_ecc_pos[i]];
+
+       eccsteps = CFG_NAND_ECCSTEPS;
+       p = dst;
+
+       for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
+               /* No chance to do something with the possible error message
+                * from correct_data(). We just hope that all possible errors
+                * are corrected by this routine.
+                */
+               stat = this->correct_data(mtd, p, &ecc_code[i], &ecc_calc[i]);
+       }
 
        return 0;
 }