Merge with /home/hs/jupiter/u-boot
authorWolfgang Denk <wd@pollux.denx.de>
Tue, 13 Mar 2007 10:33:35 +0000 (11:33 +0100)
committerWolfgang Denk <wd@denx.de>
Tue, 13 Mar 2007 10:33:35 +0000 (11:33 +0100)
195 files changed:
CHANGELOG
CREDITS
MAINTAINERS
MAKEALL
Makefile
README
board/amcc/katmai/Makefile [new file with mode: 0644]
board/amcc/katmai/cmd_katmai.c [new file with mode: 0644]
board/amcc/katmai/config.mk [new file with mode: 0644]
board/amcc/katmai/init.S [new file with mode: 0644]
board/amcc/katmai/katmai.c [new file with mode: 0644]
board/amcc/katmai/u-boot.lds [new file with mode: 0644]
board/amcc/luan/init.S
board/amcc/luan/luan.c
board/amcc/luan/u-boot.lds
board/amcc/ocotea/init.S
board/amcc/sequoia/sdram.c
board/amcc/sequoia/sequoia.c
board/amcc/yucca/init.S
board/amcc/yucca/yucca.c
board/cray/L1/L1.c
board/esd/common/auto_update.c
board/esd/cpci750/cpci750.c
board/esd/du405/du405.c
board/esd/plu405/plu405.c
board/hmi1001/hmi1001.c
board/lpc2292sodimm/lpc2292sodimm.c
board/mcc200/auto_update.c
board/mcc200/lcd.c
board/motionpro/Makefile [new file with mode: 0644]
board/motionpro/config.mk [new file with mode: 0644]
board/motionpro/motionpro.c [new file with mode: 0644]
board/motionpro/u-boot.lds [new file with mode: 0644]
board/mpc832xemds/Makefile [new file with mode: 0644]
board/mpc832xemds/config.mk [new file with mode: 0644]
board/mpc832xemds/mpc832xemds.c [new file with mode: 0644]
board/mpc832xemds/pci.c [new file with mode: 0644]
board/mpc832xemds/u-boot.lds [new file with mode: 0644]
board/mpc8349emds/mpc8349emds.c
board/mpc8349itx/config.mk
board/mpc8349itx/mpc8349itx.c
board/mpc8360emds/mpc8360emds.c
board/mpc8360emds/pci.c
board/mpl/common/memtst.c
board/mpl/mip405/mip405.c
board/prodrive/p3mx/p3mx.h [new file with mode: 0644]
board/sandburst/common/ppc440gx_i2c.c
board/sandburst/common/ppc440gx_i2c.h
board/sbc8349/Makefile [new file with mode: 0644]
board/sbc8349/config.mk [new file with mode: 0644]
board/sbc8349/pci.c [new file with mode: 0644]
board/sbc8349/sbc8349.c [new file with mode: 0644]
board/sbc8349/u-boot.lds [new file with mode: 0644]
board/tqm834x/tqm834x.c
board/trab/auto_update.c
board/uc101/uc101.c
board/xilinx/ml300/Makefile
board/xilinx/ml300/ml300.c
board/xilinx/ml300/serial.c
board/xilinx/xilinx_enet/emac_adapter.c
board/xilinx/xilinx_enet/xemac.h
board/xilinx/xilinx_enet/xemac_g.c
board/xilinx/xilinx_iic/iic_adapter.c
common/Makefile
common/cmd_ace.c [deleted file]
common/cmd_date.c
common/cmd_dtt.c
common/cmd_ext2.c
common/cmd_fat.c
common/cmd_i2c.c
common/cmd_ide.c
common/cmd_mem.c
common/cmd_reiser.c
common/cmd_scsi.c
common/cmd_usb.c
common/ft_build.c
common/usb_storage.c
cpu/mpc5xxx/fec.c
cpu/mpc83xx/cpu.c
cpu/mpc83xx/cpu_init.c
cpu/mpc83xx/qe_io.c
cpu/mpc83xx/spd_sdram.c
cpu/mpc83xx/speed.c
cpu/mpc83xx/start.S
cpu/ppc4xx/40x_spd_sdram.c [new file with mode: 0644]
cpu/ppc4xx/44x_spd_ddr.c [new file with mode: 0644]
cpu/ppc4xx/44x_spd_ddr2.c [new file with mode: 0644]
cpu/ppc4xx/Makefile
cpu/ppc4xx/cpu_init.c
cpu/ppc4xx/i2c.c
cpu/ppc4xx/spd_sdram.c [deleted file]
cpu/ppc4xx/speed.c
cpu/ppc4xx/start.S
cpu/ppc4xx/tlb.c [new file with mode: 0644]
cpu/pxa/mmc.c
disk/part.c
doc/README.mpc832xemds [new file with mode: 0644]
doc/README.mpc8349itx [new file with mode: 0644]
doc/README.sbc8349 [new file with mode: 0644]
drivers/Makefile
drivers/cfi_flash.c
drivers/fsl_i2c.c
drivers/qe/qe.h
drivers/qe/uec.c
drivers/systemace.c [new file with mode: 0644]
drivers/tsec.c
drivers/tsec.h
dtt/adm1021.c
include/405gp_i2c.h [deleted file]
include/440_i2c.h [deleted file]
include/4xx_i2c.h [new file with mode: 0644]
include/asm-arm/io.h
include/asm-avr32/io.h
include/asm-blackfin/io.h
include/asm-i386/io.h
include/asm-m68k/io.h
include/asm-microblaze/io.h
include/asm-mips/io.h
include/asm-nios/io.h
include/asm-nios2/io.h
include/asm-ppc/e300.h
include/asm-ppc/global_data.h
include/asm-ppc/immap_83xx.h
include/asm-ppc/immap_qe.h
include/asm-ppc/io.h
include/asm-ppc/mmu.h
include/common.h
include/configs/MPC832XEMDS.h [new file with mode: 0644]
include/configs/MPC8349EMDS.h
include/configs/MPC8349ITX.h
include/configs/MPC8360EMDS.h
include/configs/PLU405.h
include/configs/TQM834x.h
include/configs/hmi1001.h
include/configs/jupiter.h
include/configs/katmai.h [new file with mode: 0644]
include/configs/luan.h
include/configs/mcc200.h
include/configs/mecp5200.h
include/configs/motionpro.h [new file with mode: 0644]
include/configs/ocotea.h
include/configs/sbc8349.h [new file with mode: 0644]
include/configs/sc3.h
include/configs/sequoia.h
include/configs/yucca.h
include/i2c.h
include/ide.h
include/mpc83xx.h
include/part.h
include/ppc405.h
include/ppc440.h
lib_generic/display_options.c
nand_spl/board/amcc/sequoia/Makefile
post/Makefile
post/board/lwmon/Makefile [new file with mode: 0644]
post/board/lwmon/sysmon.c [new file with mode: 0644]
post/board/netta/Makefile [new file with mode: 0644]
post/board/netta/codec.c [new file with mode: 0644]
post/board/netta/dsp.c [new file with mode: 0644]
post/cpu/mpc8xx/Makefile [new file with mode: 0644]
post/cpu/mpc8xx/cache_8xx.S [new file with mode: 0644]
post/cpu/mpc8xx/ether.c [new file with mode: 0644]
post/cpu/mpc8xx/spr.c [new file with mode: 0644]
post/cpu/mpc8xx/uart.c [new file with mode: 0644]
post/cpu/mpc8xx/usb.c [new file with mode: 0644]
post/cpu/mpc8xx/watchdog.c [new file with mode: 0644]
post/drivers/Makefile [new file with mode: 0644]
post/drivers/cache.c [new file with mode: 0644]
post/drivers/i2c.c [new file with mode: 0644]
post/drivers/memory.c [new file with mode: 0644]
post/drivers/rtc.c [new file with mode: 0644]
post/lib_ppc/Makefile [new file with mode: 0644]
post/lib_ppc/andi.c [new file with mode: 0644]
post/lib_ppc/asm.S [new file with mode: 0644]
post/lib_ppc/b.c [new file with mode: 0644]
post/lib_ppc/cmp.c [new file with mode: 0644]
post/lib_ppc/cmpi.c [new file with mode: 0644]
post/lib_ppc/complex.c [new file with mode: 0644]
post/lib_ppc/cpu.c [new file with mode: 0644]
post/lib_ppc/cpu_asm.h [new file with mode: 0644]
post/lib_ppc/cr.c [new file with mode: 0644]
post/lib_ppc/load.c [new file with mode: 0644]
post/lib_ppc/multi.c [new file with mode: 0644]
post/lib_ppc/rlwimi.c [new file with mode: 0644]
post/lib_ppc/rlwinm.c [new file with mode: 0644]
post/lib_ppc/rlwnm.c [new file with mode: 0644]
post/lib_ppc/srawi.c [new file with mode: 0644]
post/lib_ppc/store.c [new file with mode: 0644]
post/lib_ppc/string.c [new file with mode: 0644]
post/lib_ppc/three.c [new file with mode: 0644]
post/lib_ppc/threei.c [new file with mode: 0644]
post/lib_ppc/threex.c [new file with mode: 0644]
post/lib_ppc/two.c [new file with mode: 0644]
post/lib_ppc/twox.c [new file with mode: 0644]
post/post.c

index ff386c9c3a09921b1542d25f7ea9b2d739044be5..02b3664db134e0d9c057e7126a3578f27dd71b5c 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,620 @@
+commit 00cdb4ce5e1b42248e7e6522ad0da3421b988afa
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 8 10:13:16 2007 +0100
+
+    [PATCH] Update AMCC Luan 440SP eval board support
+
+    The AMCC Luan now uses the common 440SP(e) DDR SPD code for DDR
+    inititializition. This includes DDR auto calibration and support
+    for different DIMM modules, instead of the fixed setup used in
+    the earlier version.
+
+    This patch also enables the cache in FLASH for the startup
+    phase of U-Boot (while running from FLASH). After relocating to
+    SDRAM the cache is disabled again. This will speed up the boot
+    process, especially the SDRAM setup, since there are some loops
+    for memory testing (auto calibration).
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2f5df47351910a2936c7741cf111855829200943
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 8 10:10:18 2007 +0100
+
+    [PATCH] Update AMCC Yucca 440SPe eval board support
+
+    The AMCC Yucca now uses the common 440SP(e) DDR SPD code for DDR
+    inititializition. This includes DDR auto calibration and support
+    for different DIMM modules, instead of the fixed setup used in
+    the earlier version.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2721a68a9ea91f1e494649ce68b2577261f578e2
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 8 10:07:18 2007 +0100
+
+    ppc4xx: Small AMCC Katmai 440SPe update
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit df294497479b1dca6dd86318b2a912f72fede0df
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 8 10:06:09 2007 +0100
+
+    ppc4xx: Update 440SP/440SPe DDR SPD setup code to support 440SP
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit fa1aef15bcd47736687be1af544506e90fba545d
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 7 16:43:00 2007 +0100
+
+    [PATCH] Use dynamic SDRAM TLB setup on AMCC Ocotea eval board
+
+    Define CONFIG_PROG_SDRAM_TLB so that the TLB entries for the
+    DDR memory are dynamically programmed matching the total size
+    of the equipped memory (DIMM modules).
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit e2ebe696818939e2b974628be9c921ea3fe9de13
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 7 16:39:36 2007 +0100
+
+    [PATCH] Fix AMCC 44x SPD SDRAM init code to support 2 DIMM's
+
+    This patch fixes a problem that occurs when 2 DIMM's are
+    used. This problem was first spotted and fixed by Gerald Jackson
+    <gerald.jackson@reaonixsecurity.com> but this patch fixes the
+    problem in a little more clever way.
+
+    This patch also adds the nice functionality to dynamically
+    create the TLB entries for the SDRAM (tlb.c). So we should
+    never run into such problems with wrong (too short) TLB
+    initialization again on these platforms.
+
+    As this feature is new to the "old" 44x SPD DDR driver, it
+    has to be enabled via the CONFIG_PROG_SDRAM_TLB define.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 39218433983417b9df087976a79e3f80dd5e83d6
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Mar 7 16:33:44 2007 +0100
+
+    UC101: fix compiler warnings
+
+commit 8d7e2732221bc2d64df14f700c64c23e0a4c3dce
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Wed Mar 7 16:19:46 2007 +0100
+
+    HMI1001: fix build error, cleanup compiler warnings.
+
+commit ad5bb451ade552c44bef9119d907929ebc2c126f
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Tue Mar 6 18:08:43 2007 +0100
+
+    Restructure POST directory to support of other CPUs, boards, etc.
+
+commit a5284efd125967675b2e9c6ef7b95832268ad360
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Tue Mar 6 18:01:47 2007 +0100
+
+    Fix HOSTARCH handling.
+    Patch by Mike Frysinger, Mar 05 2007
+
+commit 07b7b0037aac5102939917d7cbe561b5c0d5aa44
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Mar 6 07:47:04 2007 +0100
+
+    [PATCH] Speed optimization of AMCC Sequoia/Rainier DDR2 setup
+
+    As provided by the AMCC applications team, this patch optimizes the
+    DDR2 setup for 166MHz bus speed. The values provided are also save
+    to use on a "normal" 133MHz PLB bus system. Only the refresh counter
+    setup has to be adjusted as done in this patch.
+
+    For this the NAND booting version had to include the "speed.c" file
+    from the cpu/ppc4xx directory. With this addition the NAND SPL image
+    will just fit into the 4kbytes of program space. gcc version 4.x as
+    provided with ELDK 4.x is needed to generate this optimized code.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit ba58e4c9a9a917ce795dd16d4ec8d515f9f7aa35
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 1 21:11:36 2007 +0100
+
+    [PATCH] Update AMCC Katmai 440SPe eval board support
+
+    This patch updates the recently added Katmai board support. The biggest
+    change is the support of ECC DIMM modules in the 440SP(e) SPD DDR2
+    driver.
+
+    Please note, that still some problems are left with some memory
+    configurations. See the driver for more details.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 8c12045a3b06c5b6675d3fe02fbc9f545988129a
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 1 07:03:25 2007 +0100
+
+    [PATCH] I2C: Add missing default CFG_RTC_BUS_NUM & CFG_DTT_BUS_NUM
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit ccbc7036648e465697ca298ba51e0e76dda352a0
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Wed Feb 28 01:28:53 2007 +0100
+
+    SC3: fix typo in default environment
+
+commit e344568b1b46af85ec32d815586f91bc115d6223
+Author: Sergei Poselenov <sposelenov@emcraft.com>
+Date:  Tue Feb 27 20:15:30 2007 +0300
+
+    MCC200: Fixes for update procedure
+
+    - fix logic error in image type handling
+    - make sure file system images (cramfs etc.) get stored in flash
+      with image header stripped so they can be mounted through MTD
+
+commit 743571145b37182757d4e688a77860b36ee77573
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Tue Feb 27 14:26:04 2007 +0100
+
+    Minor code cleanup.
+
+commit 638dd1458bbdc2a55d4b9e25c5c4e1f838a5dc72
+Author: Sergei Poselenov <sposelenov@emcraft.com>
+Date:  Tue Feb 27 12:40:16 2007 +0300
+
+    MCC200 update - add LCD Progress Indicator
+
+commit 6c7cac8c4fce0ea2bf8e15ed8658d87974155b44
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Feb 22 07:43:34 2007 +0100
+
+    [PATCH] get_dev() now unconditionally uses manual relocation
+
+    Since the relocation fix is not included yet and we're not sure how
+    it will be added, this patch removes code that required relocation
+    to be fixed for now.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 8274ec0bd01d2feb2c7f095eba78d42ea009798b
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Feb 22 07:40:23 2007 +0100
+
+    [PATCH] Change systemace driver to select 8 & 16bit mode
+
+    As suggested by Grant Likely this patch enables the Xilinx SystemACE
+    driver to select 8 or 16bit mode upon startup.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 3a197b2fe49d6fa03978e60af2394efe9c70b527
+Author: Haiying Wang <Haiying.Wang@freescale.com>
+Date:  Wed Feb 21 16:52:31 2007 +0100
+
+    [PATCH v3] Add sync to ensure flash_write_cmd is fully finished
+
+    Some CPUs like PPC, BLACKFIN need sync() to ensure cfi flash write command
+    is fully finished. The sync() is defined in each CPU's io.h file. For
+    those CPUs which do not need sync for now, a dummy sync() is defined in
+    their io.h as well.
+
+    Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>
+
+commit da04995c7dc6772013a9a0dc5c767f190c402478
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Feb 21 13:44:34 2007 +0100
+
+    [PATCH] Fix problem in systemace driver (ace_writew instead of ace_write)
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 751bb57107d78978ae08e697c3deba816f5be091
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 13:21:57 2007 +0100
+
+    [PATCH] Fix relocation problem with "new" get_dev() function
+
+    This patch enables the "new" get_dev() function for block devices
+    introduced by Grant Likely to be used on systems that still suffer
+    from the relocation problems (manual relocation neede because of
+    problems with linker script).
+
+    Hopefully we can resolve this relocation issue soon for all platform
+    so we don't need this additional code anymore.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit d93e2212f962668b3dce091ff5edc33f2347fe37
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 13:17:42 2007 +0100
+
+    [PATCH] Update SystemACE driver for 16bit access
+
+    This patch removes some problems when the Xilinx SystemACE driver
+    is used with 16bit access on an big endian platform (like the
+    AMCC Katmai).
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 874bb7b88fe9b4648e1288a387af2e31014a72f3
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 13:15:40 2007 +0100
+
+    [PATCH] Clean up Katmai (440SPe) linker script
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 4745acaa1a603b67f6b9b7970365ebadd7d6586f
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 10:57:08 2007 +0100
+
+    [PATCH] Add support for the AMCC Katmai (440SPe) eval board
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 0dc018ece13effc689e47479ea9ebf1c98a507f5
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 10:51:26 2007 +0100
+
+    [PATCH] I2C: Add support for multiple I2C busses for RTC & DTT
+
+    This patch switches to the desired I2C bus when the date/dtt
+    commands are called. This can be configured using the
+    CFG_RTC_BUS_NUM and/or CFG_DTT_BUS_NUM defines.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 4037ed3b63923cfcec27f784a89057c3cbabcedb
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 10:43:34 2007 +0100
+
+    [PATCH] PPC4xx: Add 440SP(e) DDR2 SPD DIMM support
+
+    This patch adds support for the DDR2 controller used on the
+    440SP and 440SPe. It is tested on the Katmai (440SPe) eval
+    board and works fine with the following DIMM modules:
+
+    - Corsair CM2X512-5400C4 (512MByte per DIMM)
+    - Kingston ValueRAM KVR667D2N5/512 (512MByte per DIMM)
+    - Kingston ValueRAM KVR667D2N5K2/2G (1GByte per DIMM)
+
+    This patch also adds the nice functionality to dynamically
+    create the TLB entries for the SDRAM (tlb.c). So we should
+    never run into such problems with wrong (too short) TLB
+    initialization again on these platforms.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 36d830c9830379045f5daa9f542ac1c990c70068
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 10:35:42 2007 +0100
+
+    [PATCH] PPC4xx: Split 4xx SPD SDRAM init routines into 2 files
+
+    Since the existing 4xx SPD SDRAM initialization routines for the
+    405 SDRAM controller and the 440 DDR controller don't have much in
+    common this patch splits both drivers into different files.
+
+    This is in preparation for the 440 DDR2 controller support (440SP/e).
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 79b2d0bb2eae09602448f7a7cb56530d2f31e6c6
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Feb 20 10:27:08 2007 +0100
+
+    [PATCH] PPC4xx: Add support for multiple I2C busses
+
+    This patch adds support for multiple I2C busses on the PPC4xx
+    platforms. Define CONFIG_I2C_MULTI_BUS in the board config file
+    to make use of this feature.
+
+    It also merges the 405 and 440 i2c header files into one common
+    file 4xx_i2c.h.
+
+    Also the 4xx i2c reset procedure is reworked since I experienced
+    some problems with the first access on the 440SPe Katmai board.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit eb867a76238fb38e952c37871b16d0d7fd61c95f
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:45 2007 +0100
+
+    [PATCH 9_9] Use "void *" not "unsigned long *" for block dev read_write buffer pointers
+
+    Block device read/write is anonymous data; there is no need to use a
+    typed pointer.  void * is fine.  Also add a hook for block_read functions
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 53758fa20e935cc87eeb0519ed365df753a6f289
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:38 2007 +0100
+
+    [PATCH 8_9] Add block_write hook to block_dev_desc_t
+
+    Preparation for future patches which support block device writing
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit f4852ebe6ca946a509667eb68be42026f837be76
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:31 2007 +0100
+
+    [PATCH 7_9] Replace ace_readw_ace_writeb functions with macros
+
+    Register read/write does not need to be wrapped in a full function.  The
+    patch replaces them with macros.
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 3a8ce9af6fcb5744a7851b4440c07688acc40844
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:23 2007 +0100
+
+    [PATCH 6_9] Move common_cmd_ace.c to drivers_systemace.c
+
+    The code in this file is not a command; it is a device driver.  Put it in
+    the correct place. There are zero functional changes in this patch, it
+    only moves the file.
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 984618f3e7794c783ec8d1511e74c6ee2d69bfe4
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:16 2007 +0100
+
+    [PATCH 5_9] Whitespace fixup on common_cmd_ace.c (using Lindent)
+
+    This patch is in preparation of additional changes to the sysace driver.
+    May as well take this opportunity to fixup the inconsistent whitespace since
+    this file is about to undergo major changes anyway.
+
+    There are zero functional changes in this patch.  It only cleans up the
+    the whitespace.
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 80ba981d940471fe7e539e64fa3d2bd80002beda
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:07 2007 +0100
+
+    [PATCH 4_4] Remove local implementation of isprint() in ft_build.c
+
+    isprint is already defined in ctype.c
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit c95c4280d751ca078c2ff58228d2f2b44ccf0600
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:05:00 2007 +0100
+
+    [PATCH 3_9] Move buffer print code from md command to common function
+
+    Printing a buffer is a darn useful thing.  Move the buffer print code
+    into print_buffer() in lib_generic/
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 99b0f0fd3fbf2572ae1a7723dd90cffc8e85130a
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:04:52 2007 +0100
+
+    [PATCH 2_4] Use config.h, not xparameters.h, for xilinx targets
+
+    Change the xilinx device drivers and board code to include config.h
+    instead of xparameters.h directly. config.h always includes the
+    correct xparameters file.  This change reduces the posibility of
+    including the wrong file when adding a new xilinx board port
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 735dd97b1b20e777d059c7b389fe9d70cd3f80c7
+Author: Grant Likely <grant.likely@secretlab.ca>
+Date:  Tue Feb 20 09:04:34 2007 +0100
+
+    [PATCH 1_4] Merge common get_dev() routines for block devices
+
+    Each of the filesystem drivers duplicate the get_dev routine.  This change
+    merges them into a single function in part.c
+
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit f5fcc3c20b65554e98a165542c36ee0c610a2d81
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Mon Feb 19 23:09:51 2007 +0100
+
+    MCC200: Software Updater: allow both "ramdisk" and "filesystem" types
+    as root file system images.
+
+commit 489c696ae7211218961d159e43e722d74c36fcbc
+Author: Sergei Poselenov <sposelenov@emcraft.com>
+Date:  Wed Feb 14 14:30:28 2007 +0300
+
+    MCC200: Extensions to Software Update Mechanism
+
+    Update / extend Software Update Mechanism for MCC200 board:
+
+    - Add support for rootfs image added. The environment variables
+      "rootfs_st" and "rootfs_nd" can be used to override the default
+      values of the image start and end.
+    - Remove excessive key check code.
+    - Code cleanup.
+
+commit 4be23a12f23f1372634edc3215137b09768b7949
+Author: Stefan Roese <sr@denx.de>
+Date:  Mon Feb 19 08:23:15 2007 +0100
+
+    [PATCH] Update Sequoia EBC configuration (NOR FLASH)
+
+    As spotted by Matthias Fuchs, the READY input should not be
+    enabled for the NOR FLASH on the Sequoia board.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2605e90bf676d48123afe5719a846d2b52b24aac
+Author: Heiko Schocher <hs@pollux.denx.de>
+Date:  Fri Feb 16 07:57:42 2007 +0100
+
+    [PATCH] Added support for the jupiter board.
+
+    Signed-off-by: Heiko Schocher <hs@denx.de>
+
+commit 497d012e5be0194e1084073d0081eb1a844796b2
+Author: Gary Jennejohn <garyj@pollux.denx.de>
+Date:  Mon Feb 12 13:11:50 2007 +0100
+
+    LPC2292: patch from Siemens.
+
+commit b0b1a920aebead0d44146e73676ae9d80fffc8e2
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Feb 10 08:49:31 2007 +0100
+
+    [PATCH] Add missing p3mx.h file to repository (ups)
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 53d4a4983fb9b3ae5f7b2f10c599aca2b1b4034a
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Fri Feb 9 10:45:42 2007 +0100
+
+    [Motion-PRO] Preliminary support for the Motion-PRO board.
+
+commit 5a753f98c6a01bd1c61a9a3f95e8329a35f62994
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Feb 7 16:51:08 2007 +0100
+
+    [PATCH] Update some AMCC 4xx board config files (set initrd_high)
+
+    Some boards that can have more than 768MBytes of SDRAM need to
+    set "initrd_high", so that the initrd can be accessed by the
+    Linux kernel.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 7372ca68227930d03cffa548310524cad5b96733
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Feb 2 12:44:22 2007 +0100
+
+    [PATCH] Correctly display PCI arbiter en-/disabled on some 4xx boards
+
+    Previously the strapping DCR/SDR was read to determine if the internal PCI
+    arbiter is enabled or not. This strapping bit can be overridden, so now
+    the current status is read from the correct DCR/SDR register.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2aa54f651a42d198673318f07a20c89a43e4d197
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Feb 2 12:42:08 2007 +0100
+
+    [PATCH] Change configuration output of Sycamore, Yellowstone & Rainier
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 23744d6b5bf17592eb6a0ef4f318f6089f55993b
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Feb 1 13:22:41 2007 +0100
+
+    [PATCH] Remove PCI-PNP configuration from Sequoia/Rainier config file
+
+    When PCI PNP is enabled the pci pnp configuration routine is called
+    which sets the PCI_CACHE_SIZE_LINE to 8. This seems to generate some
+    problems with some PCI cards. For now disable the PCI PNP configuration.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2902fadade3be7659467e8d074048c6b7068f5c0
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Jan 31 16:56:10 2007 +0100
+
+    [PATCH] Update 440EPx/440GRx cpu detection
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit d5ea287b02a6945c3977410e364a879dd1a555c8
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Jan 31 16:38:04 2007 +0100
+
+    [PATCH] Update esd cpci5200 files
+
+    Signed-off-by: Reinhard Arlt <reinhard.arlt@esd-electronics.com>
+
+commit 8b7d1f0ab7d7c4fe3160bbf74a7e9690d9f3a3ab
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Jan 31 16:37:34 2007 +0100
+
+    [PATCH] Add support for esd mecp5200 board
+
+    Signed-off-by: Reinhard Arlt <reinhard.arlt@esd-electronics.com>
+
+commit 71a4e5fda8b60044ab9f46069fa1cfa26bdd07ff
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Jan 31 12:38:50 2007 +0100
+
+    [PATCH] Remove unneccessary yellowstone board config file
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit e802594b6fa1b166308820c276b96dc0d7cc731c
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Jan 30 17:06:10 2007 +0100
+
+    [PATCH] Update Sequoia (440EPx) config file
+
+    The config file now handles the 2nd target, the Rainier (440GRx)
+    evaluation board better. Additionally the PPC input clock was
+    adjusted to match the correct value of 33.0 MHz.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 700200c67e73b83751418abe7815840dca8fd6cb
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Jan 30 17:04:19 2007 +0100
+
+    [PATCH] Merge Yosemite & Yellowstone board ports
+
+    Now the AMCC eval boards Yosemite (440EP) and Yellowstone (440GR)
+    share one config file and all board specific files. This way we
+    don't have to maintain two different sets of files for nearly
+    identical boards.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 1bbf5eae322f5f1f6427ecc3ac13a0cb7dba8ad6
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Jan 30 15:01:49 2007 +0100
+
+    [PATCH] Update Prodrive SCPU (PDNB3 variant) board
+
+    SCPU doesn't use redundant environment in flash.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 6304430ed642ea8fa15c9e5af965ac2e033eec45
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Jan 30 12:51:07 2007 +0100
+
+    [PATCH] alpr: Update alpr board config file
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit f8db84f132b1e335f20f96138a1f09ed97b08664
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Tue Jan 30 00:50:40 2007 +0100
+
+    LPC2292 SODIMM port coding style cleanup.
+
 commit 6bd2447ee47ee23c18d2b3c7ccd5a20f7626f5b3
 Author: Gary Jennejohn <garyj@pollux.denx.de>
 Date:  Wed Jan 24 12:16:56 2007 +0100
diff --git a/CREDITS b/CREDITS
index 802158879f2463ebf17caec93c6af3dd058ff72f..0099bd46c266003444d0e656a5bfd45ad2d607d7 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -160,6 +160,10 @@ N: Thomas Frieden
 E: ThomasF@hyperion-entertainment.com
 D: Support for AmigaOne
 
+N: Paul Gortmaker
+E: paul.gortmaker@windriver.com
+D: Support for WRS SBC8347/8349 boards
+
 N: Frank Gottschling
 E: fgottschling@eltec.de
 D: Support for ELTEC MHPC/BAB7xx/ELPPC boards, cfb-console, i8042, SMI LynxEM
index f90c5a65ff2a244f93682a79f55b635d7ce22b25..183fb10d96363a976572987c48bc1ddc9b78363a 100644 (file)
@@ -288,6 +288,7 @@ Stefan Roese <sr@denx.de>
        bamboo                  PPC440EP
        bunbinga                PPC405EP
        ebony                   PPC440GP
+       katmai                  PPC440SPe
        ocotea                  PPC440GX
        p3p440                  PPC440GP
        pcs440ep                PPC440EP
@@ -349,6 +350,7 @@ John Zhan <zhanz@sinovee.com>
 Timur Tabi <timur@freescale.com>
 
        MPC8349E-mITX           MPC8349
+       MPC8349E-mITX-GP        MPC8349
 
 Kim Phillips <kim.phillips@freescale.com>
 
diff --git a/MAKEALL b/MAKEALL
index d943cee45f219656f4c3651199a964f34081f0dd..04108bedf3f31022579f17346c9149aa262b18e8 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -37,9 +37,10 @@ LIST_5xx="   \
 LIST_5xxx="    \
        BC3450          cpci5200        EVAL5200        fo300           \
        icecube_5100    icecube_5200    lite5200b       mcc200          \
-       mecp5200        o2dnt           pf5200          PM520           \
-       TB5200          Total5100       Total5200       Total5200_Rev2  \
-       TQM5200         TQM5200_B       TQM5200S        v38b            \
+       mecp5200        motionpro       o2dnt           pf5200          \
+       PM520           TB5200          Total5100       Total5200       \
+       Total5200_Rev2  TQM5200         TQM5200_B       TQM5200S        \
+       v38b                                                            \
 "
 
 #########################################################################
@@ -81,15 +82,15 @@ LIST_4xx="  \
        CRAYL1          csb272          csb472          DASA_SIM        \
        DP405           DU405           ebony           ERIC            \
        EXBITGEN        G2000           HH405           HUB405          \
-       JSE             KAREF           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                                                           \
+       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                                           \
 "
 
 #########################################################################
@@ -131,7 +132,8 @@ LIST_8260=" \
 #########################################################################
 
 LIST_83xx="    \
-       TQM834x         MPC8349EMDS     MPC8349ITX      MPC8360EMDS     \
+       MPC832XEMDS     MPC8349EMDS     MPC8349ITX      MPC8349ITXGP    \
+       MPC8360EMDS     sbc8349         TQM834x                         \
 "
 
 
index f337ab0888e4e598736c58e4e05113f40cdb1849..29180f3ea1520db386a579f06b1811154e5fd58f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -118,7 +118,7 @@ include $(OBJTREE)/include/config.mk
 export ARCH CPU BOARD VENDOR SOC
 
 ifndef CROSS_COMPILE
-ifeq ($(HOSTARCH),ppc)
+ifeq ($(HOSTARCH),$(ARCH))
 CROSS_COMPILE =
 else
 ifeq ($(ARCH),ppc)
@@ -128,12 +128,8 @@ ifeq ($(ARCH),arm)
 CROSS_COMPILE = arm-linux-
 endif
 ifeq ($(ARCH),i386)
-ifeq ($(HOSTARCH),i386)
-CROSS_COMPILE =
-else
 CROSS_COMPILE = i386-linux-
 endif
-endif
 ifeq ($(ARCH),mips)
 CROSS_COMPILE = mips_4KC-
 endif
@@ -207,7 +203,13 @@ ifeq ($(CPU),mpc83xx)
 LIBS += drivers/qe/qe.a
 endif
 LIBS += drivers/sk98lin/libsk98lin.a
-LIBS += post/libpost.a post/cpu/libcpu.a
+LIBS += post/libpost.a post/drivers/libpostdrivers.a
+LIBS += $(shell if [ -d post/lib_$(ARCH) ]; then echo \
+       "post/lib_$(ARCH)/libpost$(ARCH).a"; fi)
+LIBS += $(shell if [ -d post/cpu/$(CPU) ]; then echo \
+       "post/cpu/$(CPU)/libpost$(CPU).a"; fi)
+LIBS += $(shell if [ -d post/board/$(BOARDDIR) ]; then echo \
+       "post/board/$(BOARDDIR)/libpost$(BOARD).a"; fi)
 LIBS += common/libcommon.a
 LIBS += $(BOARDLIBS)
 
@@ -220,9 +222,8 @@ PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -
 # The "tools" are needed early, so put this first
 # Don't include stuff already done in $(LIBS)
 SUBDIRS        = tools \
-         examples \
-         post \
-         post/cpu
+         examples
+
 .PHONY : $(SUBDIRS)
 
 ifeq ($(CONFIG_NAND_U_BOOT),y)
@@ -610,6 +611,9 @@ TQM5200_STK100_config:      unconfig
        @$(MKCONFIG) -n $@ -a TQM5200 ppc mpc5xxx tqm5200
 uc101_config:         unconfig
        @$(MKCONFIG) uc101 ppc mpc5xxx uc101
+motionpro_config:         unconfig
+       @$(MKCONFIG) motionpro ppc mpc5xxx motionpro
+
 
 #########################################################################
 ## MPC8xx Systems
@@ -1095,6 +1099,9 @@ JSE_config:       unconfig
 KAREF_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx karef sandburst
 
+katmai_config: unconfig
+       @$(MKCONFIG) $(@:_config=) ppc ppc4xx katmai amcc
+
 luan_config:   unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx luan amcc
 
@@ -1612,12 +1619,47 @@ r5200_config :          unconfig
 ## MPC83xx Systems
 #########################################################################
 
-TQM834x_config:        unconfig
-       @$(MKCONFIG) $(@:_config=) ppc mpc83xx tqm834x
+MPC832XEMDS_config \
+MPC832XEMDS_HOST_33_config \
+MPC832XEMDS_HOST_66_config \
+MPC832XEMDS_SLAVE_config:      unconfig
+       @echo "" >include/config.h ; \
+       if [ "$(findstring _HOST_,$@)" ] ; then \
+               echo -n "... PCI HOST " ; \
+               echo "#define CONFIG_PCI" >>include/config.h ; \
+       fi ; \
+       if [ "$(findstring _SLAVE_,$@)" ] ; then \
+               echo "...PCI SLAVE 66M"  ; \
+               echo "#define CONFIG_PCI" >>include/config.h ; \
+               echo "#define CONFIG_PCISLAVE" >>include/config.h ; \
+       fi ; \
+       if [ "$(findstring _33_,$@)" ] ; then \
+               echo -n "...33M ..." ; \
+               echo "#define PCI_33M" >>include/config.h ; \
+       fi ; \
+       if [ "$(findstring _66_,$@)" ] ; then \
+               echo -n "...66M..." ; \
+               echo "#define PCI_66M" >>include/config.h ; \
+       fi ;
+       @$(MKCONFIG) -a MPC832XEMDS ppc mpc83xx mpc832xemds
 
 MPC8349EMDS_config:    unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349emds
 
+MPC8349ITX_config \
+MPC8349ITX_LOWBOOT_config \
+MPC8349ITXGP_config:   unconfig
+       @mkdir -p $(obj)include
+       @mkdir -p $(obj)board/mpc8349itx
+       @echo "#define CONFIG_$(subst _LOWBOOT,,$(@:_config=))" >> $(obj)include/config.h
+       @if [ "$(findstring GP,$@)" ] ; then \
+               echo "TEXT_BASE = 0xFE000000" >$(obj)board/mpc8349itx/config.tmp ; \
+       fi
+       @if [ "$(findstring LOWBOOT,$@)" ] ; then \
+               echo "TEXT_BASE = 0xFE000000" >$(obj)board/mpc8349itx/config.tmp ; \
+       fi
+       @$(MKCONFIG) -a -n $(@:_config=) MPC8349ITX ppc mpc83xx mpc8349itx
+
 MPC8360EMDS_config \
 MPC8360EMDS_HOST_33_config \
 MPC8360EMDS_HOST_66_config \
@@ -1642,8 +1684,12 @@ MPC8360EMDS_SLAVE_config:        unconfig
        fi ;
        @$(MKCONFIG) -a MPC8360EMDS ppc mpc83xx mpc8360emds
 
-MPC8349ITX_config:     unconfig
-       @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349itx
+sbc8349_config:                unconfig
+       @$(MKCONFIG) $(@:_config=) ppc mpc83xx sbc8349
+
+TQM834x_config:        unconfig
+       @$(MKCONFIG) $(@:_config=) ppc mpc83xx tqm834x
+
 
 #########################################################################
 ## MPC85xx Systems
diff --git a/README b/README
index ecfd1f82f0987a708f58ccadaaeee5ebb94377f4..15428643edef7ea77710113f8908002b50328577 100644 (file)
--- a/README
+++ b/README
@@ -1347,6 +1347,16 @@ The following options need to be configured:
                If defined, then this indicates the I2C bus number for DDR SPD.
                If not defined, then U-Boot assumes that SPD is on I2C bus 0.
 
+               CFG_RTC_BUS_NUM
+
+               If defined, then this indicates the I2C bus number for the RTC.
+               If not defined, then U-Boot assumes that RTC is on I2C bus 0.
+
+               CFG_DTT_BUS_NUM
+
+               If defined, then this indicates the I2C bus number for the DTT.
+               If not defined, then U-Boot assumes that DTT is on I2C bus 0.
+
                CONFIG_FSL_I2C
 
                Define this option if you want to use Freescale's I2C driver in
diff --git a/board/amcc/katmai/Makefile b/board/amcc/katmai/Makefile
new file mode 100644 (file)
index 0000000..d06a402
--- /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  = $(BOARD).o cmd_katmai.o
+SOBJS  = init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(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/amcc/katmai/cmd_katmai.c b/board/amcc/katmai/cmd_katmai.c
new file mode 100644 (file)
index 0000000..684f6a5
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * (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>
+#include <asm/byteorder.h>
+
+static int do_bootstrap(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       uchar   chip;
+       ulong   data;
+       int     nbytes;
+       extern char console_buffer[];
+
+       char sysClock[4];
+       char cpuClock[4];
+       char plbClock[4];
+       char pcixClock[4];
+
+       if (argc < 3) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       if (strcmp(argv[2], "prom0") == 0)
+               chip = IIC0_BOOTPROM_ADDR;
+       else
+               chip = IIC0_ALT_BOOTPROM_ADDR;
+
+       do {
+               printf("enter sys clock frequency 33 or 66 Mhz or quit to abort\n");
+               nbytes = readline (" ? ");
+
+               if (strcmp(console_buffer, "quit") == 0)
+                       return 0;
+
+               if ((strcmp(console_buffer, "33") != 0) &
+                   (strcmp(console_buffer, "66") != 0))
+                       nbytes=0;
+
+               strcpy(sysClock, console_buffer);
+
+       } while (nbytes == 0);
+
+       do {
+               if (strcmp(sysClock, "66") == 0) {
+                       printf("enter cpu clock frequency 400, 533 Mhz or quit to abort\n");
+               } else {
+#ifdef CONFIG_STRESS
+                       printf("enter cpu clock frequency 400, 500, 533, 667 Mhz or quit to abort\n");
+#else
+                       printf("enter cpu clock frequency 400, 500, 533 Mhz or quit to abort\n");
+#endif
+               }
+               nbytes = readline (" ? ");
+
+               if (strcmp(console_buffer, "quit") == 0)
+                       return 0;
+
+               if (strcmp(sysClock, "66") == 0) {
+                       if ((strcmp(console_buffer, "400") != 0) &
+                           (strcmp(console_buffer, "533") != 0)
+#ifdef CONFIG_STRESS
+                           & (strcmp(console_buffer, "667") != 0)
+#endif
+                               ) {
+                               nbytes = 0;
+                       }
+               } else {
+                       if ((strcmp(console_buffer, "400") != 0) &
+                           (strcmp(console_buffer, "500") != 0) &
+                           (strcmp(console_buffer, "533") != 0)
+#ifdef CONFIG_STRESS
+                           & (strcmp(console_buffer, "667") != 0)
+#endif
+                               ) {
+                               nbytes = 0;
+                       }
+               }
+
+               strcpy(cpuClock, console_buffer);
+
+       } while (nbytes == 0);
+
+       if (strcmp(cpuClock, "500") == 0)
+               strcpy(plbClock, "166");
+       else if (strcmp(cpuClock, "533") == 0)
+               strcpy(plbClock, "133");
+       else {
+               do {
+                       if (strcmp(cpuClock, "400") == 0)
+                               printf("enter plb clock frequency 100, 133 Mhz or quit to abort\n");
+
+#ifdef CONFIG_STRESS
+                       if (strcmp(cpuClock, "667") == 0)
+                               printf("enter plb clock frequency 133, 166 Mhz or quit to abort\n");
+
+#endif
+                       nbytes = readline (" ? ");
+
+                       if (strcmp(console_buffer, "quit") == 0)
+                               return 0;
+
+                       if (strcmp(cpuClock, "400") == 0) {
+                               if ((strcmp(console_buffer, "100") != 0) &
+                                   (strcmp(console_buffer, "133") != 0))
+                                       nbytes = 0;
+                       }
+#ifdef CONFIG_STRESS
+                       if (strcmp(cpuClock, "667") == 0) {
+                               if ((strcmp(console_buffer, "133") != 0) &
+                                   (strcmp(console_buffer, "166") != 0))
+                                       nbytes = 0;
+                       }
+#endif
+                       strcpy(plbClock, console_buffer);
+
+               } while (nbytes == 0);
+       }
+
+       do {
+               printf("enter Pci-X clock frequency 33, 66, 100 or 133 Mhz or quit to abort\n");
+               nbytes = readline (" ? ");
+
+               if (strcmp(console_buffer, "quit") == 0)
+                       return 0;
+
+               if ((strcmp(console_buffer, "33") != 0) &
+                   (strcmp(console_buffer, "66") != 0) &
+                   (strcmp(console_buffer, "100") != 0) &
+                   (strcmp(console_buffer, "133") != 0)) {
+                       nbytes = 0;
+               }
+               strcpy(pcixClock, console_buffer);
+
+       } while (nbytes == 0);
+
+       printf("\nsys clk   = %sMhz\n", sysClock);
+       printf("cpu clk   = %sMhz\n", cpuClock);
+       printf("plb clk   = %sMhz\n", plbClock);
+       printf("Pci-X clk = %sMhz\n", pcixClock);
+
+       do {
+               printf("\npress [y] to write I2C bootstrap \n");
+               printf("or [n] to abort.  \n");
+               printf("Don't forget to set board switches \n");
+               printf("according to your choice before re-starting \n");
+               printf("(refer to 440spe_uboot_kit_um_1_01.pdf) \n");
+
+               nbytes = readline (" ? ");
+               if (strcmp(console_buffer, "n") == 0)
+                       return 0;
+
+       } while (nbytes == 0);
+
+       if (strcmp(sysClock, "33") == 0) {
+               if ((strcmp(cpuClock, "400") == 0) &
+                   (strcmp(plbClock, "100") == 0))
+                       data = 0x8678c206;
+
+               if ((strcmp(cpuClock, "400") == 0) &
+                   (strcmp(plbClock, "133") == 0))
+                       data = 0x8678c2c6;
+
+               if ((strcmp(cpuClock, "500") == 0))
+                       data = 0x8778f2c6;
+
+               if ((strcmp(cpuClock, "533") == 0))
+                       data = 0x87790252;
+
+#ifdef CONFIG_STRESS
+               if ((strcmp(cpuClock, "667") == 0) &
+                   (strcmp(plbClock, "133") == 0))
+                       data = 0x87794256;
+
+               if ((strcmp(cpuClock, "667") == 0) &
+                   (strcmp(plbClock, "166") == 0))
+                       data = 0x87794206;
+
+#endif
+       }
+       if (strcmp(sysClock, "66") == 0) {
+               if ((strcmp(cpuClock, "400") == 0) &
+                   (strcmp(plbClock, "100") == 0))
+                       data = 0x84706206;
+
+               if ((strcmp(cpuClock, "400") == 0) &
+                   (strcmp(plbClock, "133") == 0))
+                       data = 0x847062c6;
+
+               if ((strcmp(cpuClock, "533") == 0))
+                       data = 0x85708206;
+
+#ifdef CONFIG_STRESS
+               if ((strcmp(cpuClock, "667") == 0) &
+                   (strcmp(plbClock, "133") == 0))
+                       data = 0x8570a256;
+
+               if ((strcmp(cpuClock, "667") == 0) &
+                   (strcmp(plbClock, "166") == 0))
+                       data = 0x8570a206;
+
+#endif
+       }
+
+#ifdef DEBUG
+       printf(" pin strap0 to write in i2c  = %x\n", data);
+#endif /* DEBUG */
+
+       if (i2c_write(chip, 0, 1, (uchar *)&data, 4) != 0)
+               printf("Error writing strap0 in %s\n", argv[2]);
+
+       if (strcmp(pcixClock, "33") == 0)
+               data = 0x00000701;
+
+       if (strcmp(pcixClock, "66") == 0)
+               data = 0x00000601;
+
+       if (strcmp(pcixClock, "100") == 0)
+               data = 0x00000501;
+
+       if (strcmp(pcixClock, "133") == 0)
+               data = 0x00000401;
+
+       if (strcmp(plbClock, "166") == 0)
+               data |= 0x05950000;
+       else
+               data |= 0x05A50000;
+
+#ifdef DEBUG
+       printf(" pin strap1 to write in i2c  = %x\n", data);
+#endif /* DEBUG */
+
+       udelay(1000);
+       if (i2c_write(chip, 4, 1, (uchar *)&data, 4) != 0)
+               printf("Error writing strap1 in %s\n", argv[2]);
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       bootstrap,      3,      1,      do_bootstrap,
+       "bootstrap - program the serial device strap\n",
+       "wrclk [prom0|prom1] - program the serial device strap\n"
+       );
diff --git a/board/amcc/katmai/config.mk b/board/amcc/katmai/config.mk
new file mode 100644 (file)
index 0000000..115c1ae
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# (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
+#
+
+#
+# AMCC 440SPe Evaluation (Katmai) board
+#
+
+TEXT_BASE = 0xfffc0000
+
+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/board/amcc/katmai/init.S b/board/amcc/katmai/init.S
new file mode 100644 (file)
index 0000000..6b024ee
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * (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>
+#include <asm-ppc/mmu.h>
+
+/**************************************************************************
+ * TLB TABLE
+ *
+ * This table is used by the cpu boot code to setup the initial tlb
+ * entries. Rather than make broad assumptions in the cpu source tree,
+ * this table lets each board set things up however they like.
+ *
+ *  Pointer to the table is returned in r1
+ *
+ *************************************************************************/
+
+       .section .bootpg,"ax"
+
+/**************************************************************************
+ * TLB table for revA
+ *************************************************************************/
+       .globl tlbtabA
+tlbtabA:
+       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(0xff000000, SZ_16M, 0xff000000, 4, AC_R|AC_W|AC_X|SA_G)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
+
+       tlbentry(CFG_ISRAM_BASE, SZ_256K, 0x00000000, 4, AC_R|AC_W|AC_X|SA_I)
+       tlbentry(CFG_PERIPHERAL_BASE, SZ_4K, 0xF0000000, 4, AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_PCI_BASE, SZ_256M, 0x00000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE, SZ_256M, 0x10000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE_MEMBASE, SZ_256M, 0xB0000000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE_BASE, SZ_16K, 0x20000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_PCIE0_CFGBASE, SZ_1K, 0x40000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE1_CFGBASE, SZ_1K, 0x80000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE2_CFGBASE, SZ_1K, 0xC0000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE0_XCFGBASE, SZ_1K, 0x50000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE1_XCFGBASE, SZ_1K, 0x90000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE2_XCFGBASE, SZ_1K, 0xD0000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbtab_end
+
+/**************************************************************************
+ * TLB table for revB
+ *
+ * Notice: revB of the 440SPe chip is very strict about PLB real addresses
+ * and ranges to be mapped for config space: it seems to only work with
+ * d_nnnn_nnnn range (hangs the core upon config transaction attempts when
+ * set otherwise) while revA uses c_nnnn_nnnn.
+ *************************************************************************/
+       .globl tlbtabB
+tlbtabB:
+       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(0xff000000, SZ_16M, 0xff000000, 4, AC_R|AC_W|AC_X|SA_G)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
+
+       tlbentry(CFG_ISRAM_BASE, SZ_256K, 0x00000000, 4, AC_R|AC_W|AC_X|SA_I)
+
+       tlbentry(CFG_PERIPHERAL_BASE, SZ_4K, 0xF0000000, 4, AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_ACE_BASE, SZ_1K, 0xE0000000, 4,AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_PCI_BASE, SZ_256M, 0x00000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE, SZ_256M, 0x10000000, 0xC, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE_MEMBASE, SZ_256M, 0xB0000000, 0xD, AC_R|AC_W|SA_G|SA_I)
+
+       tlbentry(CFG_PCIE0_CFGBASE, SZ_1K, 0x00100000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE1_CFGBASE, SZ_1K, 0x20100000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE2_CFGBASE, SZ_1K, 0x40100000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE0_XCFGBASE, SZ_1K, 0x10000000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE1_XCFGBASE, SZ_1K, 0x30000000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCIE2_XCFGBASE, SZ_1K, 0x50000000, 0xD, AC_R|AC_W|SA_G|SA_I)
+       tlbtab_end
diff --git a/board/amcc/katmai/katmai.c b/board/amcc/katmai/katmai.c
new file mode 100644 (file)
index 0000000..fbf1a98
--- /dev/null
@@ -0,0 +1,529 @@
+/*
+ * (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 <i2c.h>
+#include <asm-ppc/io.h>
+
+#include "../cpu/ppc4xx/440spe_pcie.h"
+
+#undef PCIE_ENDPOINT
+/* #define PCIE_ENDPOINT 1 */
+
+int ppc440spe_init_pcie_rootport(int port);
+void ppc440spe_setup_pcie(struct pci_controller *hose, int port);
+
+int board_early_init_f (void)
+{
+       unsigned long mfr;
+
+       /*----------------------------------------------------------------------+
+        * Interrupt controller setup for the Katmai 440SPe Evaluation board.
+        *-----------------------------------------------------------------------+
+        *-----------------------------------------------------------------------+
+        * Interrupt | Source                            | Pol.  | Sensi.| Crit. |
+        *-----------+-----------------------------------+-------+-------+-------+
+        * IRQ 00    | UART0                             | High  | Level | Non   |
+        * IRQ 01    | UART1                             | High  | Level | Non   |
+        * IRQ 02    | IIC0                              | High  | Level | Non   |
+        * IRQ 03    | IIC1                              | High  | Level | Non   |
+        * IRQ 04    | PCI0X0 MSG IN                     | High  | Level | Non   |
+        * IRQ 05    | PCI0X0 CMD Write                  | High  | Level | Non   |
+        * IRQ 06    | PCI0X0 Power Mgt                  | High  | Level | Non   |
+        * IRQ 07    | PCI0X0 VPD Access                 | Rising| Edge  | Non   |
+        * IRQ 08    | PCI0X0 MSI level 0                | High  | Lvl/ed| Non   |
+        * IRQ 09    | External IRQ 15 - (PCI-Express)   | pgm H | Pgm   | Non   |
+        * IRQ 10    | UIC2 Non-critical Int.            | NA    | NA    | Non   |
+        * IRQ 11    | UIC2 Critical Interrupt           | NA    | NA    | Crit  |
+        * IRQ 12    | PCI Express MSI Level 0           | Rising| Edge  | Non   |
+        * IRQ 13    | PCI Express MSI Level 1           | Rising| Edge  | Non   |
+        * IRQ 14    | PCI Express MSI Level 2           | Rising| Edge  | Non   |
+        * IRQ 15    | PCI Express MSI Level 3           | Rising| Edge  | Non   |
+        * IRQ 16    | UIC3 Non-critical Int.            | NA    | NA    | Non   |
+        * IRQ 17    | UIC3 Critical Interrupt           | NA    | NA    | Crit  |
+        * IRQ 18    | External IRQ 14 - (PCI-Express)   | Pgm   | Pgm   | Non   |
+        * IRQ 19    | DMA Channel 0 FIFO Full           | High  | Level | Non   |
+        * IRQ 20    | DMA Channel 0 Stat FIFO           | High  | Level | Non   |
+        * IRQ 21    | DMA Channel 1 FIFO Full           | High  | Level | Non   |
+        * IRQ 22    | DMA Channel 1 Stat FIFO           | High  | Level | Non   |
+        * IRQ 23    | I2O Inbound Doorbell              | High  | Level | Non   |
+        * IRQ 24    | Inbound Post List FIFO Not Empt   | High  | Level | Non   |
+        * IRQ 25    | I2O Region 0 LL PLB Write         | High  | Level | Non   |
+        * IRQ 26    | I2O Region 1 LL PLB Write         | High  | Level | Non   |
+        * IRQ 27    | I2O Region 0 HB PLB Write         | High  | Level | Non   |
+        * IRQ 28    | I2O Region 1 HB PLB Write         | High  | Level | Non   |
+        * IRQ 29    | GPT Down Count Timer              | Rising| Edge  | Non   |
+        * IRQ 30    | UIC1 Non-critical Int.            | NA    | NA    | Non   |
+        * IRQ 31    | UIC1 Critical Interrupt           | NA    | NA    | Crit. |
+        *------------------------------------------------------------------------
+        * IRQ 32    | Ext. IRQ 13 - (PCI-Express)       |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 33    | MAL Serr                          | High  | Level | Non   |
+        * IRQ 34    | MAL Txde                          | High  | Level | Non   |
+        * IRQ 35    | MAL Rxde                          | High  | Level | Non   |
+        * IRQ 36    | DMC CE or DMC UE                  | High  | Level | Non   |
+        * IRQ 37    | EBC or UART2                      | High  |Lvl Edg| Non   |
+        * IRQ 38    | MAL TX EOB                        | High  | Level | Non   |
+        * IRQ 39    | MAL RX EOB                        | High  | Level | Non   |
+        * IRQ 40    | PCIX0 MSI Level 1                 | High  |Lvl Edg| Non   |
+        * IRQ 41    | PCIX0 MSI level 2                 | High  |Lvl Edg| Non   |
+        * IRQ 42    | PCIX0 MSI level 3                 | High  |Lvl Edg| Non   |
+        * IRQ 43    | L2 Cache                          | Risin | Edge  | Non   |
+        * IRQ 44    | GPT Compare Timer 0               | Risin | Edge  | Non   |
+        * IRQ 45    | GPT Compare Timer 1               | Risin | Edge  | Non   |
+        * IRQ 46    | GPT Compare Timer 2               | Risin | Edge  | Non   |
+        * IRQ 47    | GPT Compare Timer 3               | Risin | Edge  | Non   |
+        * IRQ 48    | GPT Compare Timer 4               | Risin | Edge  | Non   |
+        * IRQ 49    | Ext. IRQ 12 - PCI-X               |pgm/Fal|pgm/Lvl| Non   |
+        * IRQ 50    | Ext. IRQ 11 -                     |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 51    | Ext. IRQ 10 -                     |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 52    | Ext. IRQ 9                        |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 53    | Ext. IRQ 8                        |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 54    | DMA Error                         | High  | Level | Non   |
+        * IRQ 55    | DMA I2O Error                     | High  | Level | Non   |
+        * IRQ 56    | Serial ROM                        | High  | Level | Non   |
+        * IRQ 57    | PCIX0 Error                       | High  | Edge  | Non   |
+        * IRQ 58    | Ext. IRQ 7-                       |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 59    | Ext. IRQ 6-                       |pgm (H)|pgm/Lvl| Non   |
+        * IRQ 60    | EMAC0 Interrupt                   | High  | Level | Non   |
+        * IRQ 61    | EMAC0 Wake-up                     | High  | Level | Non   |
+        * IRQ 62    | Reserved                          | High  | Level | Non   |
+        * IRQ 63    | XOR                               | High  | Level | Non   |
+        *-----------------------------------------------------------------------
+        * IRQ 64    | PE0 AL                            | High  | Level | Non   |
+        * IRQ 65    | PE0 VPD Access                    | Risin | Edge  | Non   |
+        * IRQ 66    | PE0 Hot Reset Request             | Risin | Edge  | Non   |
+        * IRQ 67    | PE0 Hot Reset Request             | Falli | Edge  | Non   |
+        * IRQ 68    | PE0 TCR                           | High  | Level | Non   |
+        * IRQ 69    | PE0 BusMaster VCO                 | Falli | Edge  | Non   |
+        * IRQ 70    | PE0 DCR Error                     | High  | Level | Non   |
+        * IRQ 71    | Reserved                          | N/A   | N/A   | Non   |
+        * IRQ 72    | PE1 AL                            | High  | Level | Non   |
+        * IRQ 73    | PE1 VPD Access                    | Risin | Edge  | Non   |
+        * IRQ 74    | PE1 Hot Reset Request             | Risin | Edge  | Non   |
+        * IRQ 75    | PE1 Hot Reset Request             | Falli | Edge  | Non   |
+        * IRQ 76    | PE1 TCR                           | High  | Level | Non   |
+        * IRQ 77    | PE1 BusMaster VCO                 | Falli | Edge  | Non   |
+        * IRQ 78    | PE1 DCR Error                     | High  | Level | Non   |
+        * IRQ 79    | Reserved                          | N/A   | N/A   | Non   |
+        * IRQ 80    | PE2 AL                            | High  | Level | Non   |
+        * IRQ 81    | PE2 VPD Access                    | Risin | Edge  | Non   |
+        * IRQ 82    | PE2 Hot Reset Request             | Risin | Edge  | Non   |
+        * IRQ 83    | PE2 Hot Reset Request             | Falli | Edge  | Non   |
+        * IRQ 84    | PE2 TCR                           | High  | Level | Non   |
+        * IRQ 85    | PE2 BusMaster VCO                 | Falli | Edge  | Non   |
+        * IRQ 86    | PE2 DCR Error                     | High  | Level | Non   |
+        * IRQ 87    | Reserved                          | N/A   | N/A   | Non   |
+        * IRQ 88    | External IRQ(5)                   | Progr | Progr | Non   |
+        * IRQ 89    | External IRQ 4 - Ethernet         | Progr | Progr | Non   |
+        * IRQ 90    | External IRQ 3 - PCI-X            | Progr | Progr | Non   |
+        * IRQ 91    | External IRQ 2 - PCI-X            | Progr | Progr | Non   |
+        * IRQ 92    | External IRQ 1 - PCI-X            | Progr | Progr | Non   |
+        * IRQ 93    | External IRQ 0 - PCI-X            | Progr | Progr | Non   |
+        * IRQ 94    | Reserved                          | N/A   | N/A   | Non   |
+        * IRQ 95    | Reserved                          | N/A   | N/A   | Non   |
+        *-----------------------------------------------------------------------
+        * IRQ 96    | PE0 INTA                          | High  | Level | Non   |
+        * IRQ 97    | PE0 INTB                          | High  | Level | Non   |
+        * IRQ 98    | PE0 INTC                          | High  | Level | Non   |
+        * IRQ 99    | PE0 INTD                          | High  | Level | Non   |
+        * IRQ 100   | PE1 INTA                          | High  | Level | Non   |
+        * IRQ 101   | PE1 INTB                          | High  | Level | Non   |
+        * IRQ 102   | PE1 INTC                          | High  | Level | Non   |
+        * IRQ 103   | PE1 INTD                          | High  | Level | Non   |
+        * IRQ 104   | PE2 INTA                          | High  | Level | Non   |
+        * IRQ 105   | PE2 INTB                          | High  | Level | Non   |
+        * IRQ 106   | PE2 INTC                          | High  | Level | Non   |
+        * IRQ 107   | PE2 INTD                          | Risin | Edge  | Non   |
+        * IRQ 108   | PCI Express MSI Level 4           | Risin | Edge  | Non   |
+        * IRQ 109   | PCI Express MSI Level 5           | Risin | Edge  | Non   |
+        * IRQ 110   | PCI Express MSI Level 6           | Risin | Edge  | Non   |
+        * IRQ 111   | PCI Express MSI Level 7           | Risin | Edge  | Non   |
+        * IRQ 116   | PCI Express MSI Level 12          | Risin | Edge  | Non   |
+        * IRQ 112   | PCI Express MSI Level 8           | Risin | Edge  | Non   |
+        * IRQ 113   | PCI Express MSI Level 9           | Risin | Edge  | Non   |
+        * IRQ 114   | PCI Express MSI Level 10          | Risin | Edge  | Non   |
+        * IRQ 115   | PCI Express MSI Level 11          | Risin | Edge  | Non   |
+        * IRQ 117   | PCI Express MSI Level 13          | Risin | Edge  | Non   |
+        * IRQ 118   | PCI Express MSI Level 14          | Risin | Edge  | Non   |
+        * IRQ 119   | PCI Express MSI Level 15          | Risin | Edge  | Non   |
+        * IRQ 120   | PCI Express MSI Level 16          | Risin | Edge  | Non   |
+        * IRQ 121   | PCI Express MSI Level 17          | Risin | Edge  | Non   |
+        * IRQ 122   | PCI Express MSI Level 18          | Risin | Edge  | Non   |
+        * IRQ 123   | PCI Express MSI Level 19          | Risin | Edge  | Non   |
+        * IRQ 124   | PCI Express MSI Level 20          | Risin | Edge  | Non   |
+        * IRQ 125   | PCI Express MSI Level 21          | Risin | Edge  | Non   |
+        * IRQ 126   | PCI Express MSI Level 22          | Risin | Edge  | Non   |
+        * IRQ 127   | PCI Express MSI Level 23          | Risin | Edge  | Non   |
+        *-----------+-----------------------------------+-------+-------+-------+ */
+       /*-------------------------------------------------------------------------+
+        * Put UICs in PowerPC440SPemode.
+        * Initialise UIC registers.  Clear all interrupts.  Disable all interrupts.
+        * Set critical interrupt values.  Set interrupt polarities.  Set interrupt
+        * trigger levels.  Make bit 0 High  priority.  Clear all interrupts again.
+        *------------------------------------------------------------------------*/
+       mtdcr (uic3sr, 0xffffffff);     /* Clear all interrupts */
+       mtdcr (uic3er, 0x00000000);     /* disable all interrupts */
+       mtdcr (uic3cr, 0x00000000);     /* Set Critical / Non Critical interrupts: */
+       mtdcr (uic3pr, 0xffffffff);     /* Set Interrupt Polarities*/
+       mtdcr (uic3tr, 0x001fffff);     /* Set Interrupt Trigger Levels */
+       mtdcr (uic3vr, 0x00000001);     /* Set Vect base=0,INT31 Highest priority */
+       mtdcr (uic3sr, 0x00000000);     /* clear all  interrupts*/
+       mtdcr (uic3sr, 0xffffffff);     /* clear all  interrupts*/
+
+
+       mtdcr (uic2sr, 0xffffffff);     /* Clear all interrupts */
+       mtdcr (uic2er, 0x00000000);     /* disable all interrupts*/
+       mtdcr (uic2cr, 0x00000000);     /* Set Critical / Non Critical interrupts*/
+       mtdcr (uic2pr, 0xebebebff);     /* Set Interrupt Polarities*/
+       mtdcr (uic2tr, 0x74747400);     /* Set Interrupt Trigger Levels */
+       mtdcr (uic2vr, 0x00000001);     /* Set Vect base=0,INT31 Highest priority */
+       mtdcr (uic2sr, 0x00000000);     /* clear all interrupts */
+       mtdcr (uic2sr, 0xffffffff);     /* clear all interrupts */
+
+       mtdcr (uic1sr, 0xffffffff);     /* Clear all interrupts*/
+       mtdcr (uic1er, 0x00000000);     /* disable all interrupts*/
+       mtdcr (uic1cr, 0x00000000);     /* Set Critical / Non Critical interrupts*/
+       mtdcr (uic1pr, 0xffffffff);     /* Set Interrupt Polarities */
+       mtdcr (uic1tr, 0x001f8040);     /* Set Interrupt Trigger Levels*/
+       mtdcr (uic1vr, 0x00000001);     /* Set Vect base=0,INT31 Highest priority */
+       mtdcr (uic1sr, 0x00000000);     /* clear all interrupts*/
+       mtdcr (uic1sr, 0xffffffff);     /* clear all interrupts*/
+
+       mtdcr (uic0sr, 0xffffffff);     /* Clear all interrupts */
+       mtdcr (uic0er, 0x00000000);     /* disable all interrupts excepted cascade    to be checked */
+       mtdcr (uic0cr, 0x00104001);     /* Set Critical / Non Critical interrupts*/
+       mtdcr (uic0pr, 0xffffffff);     /* Set Interrupt Polarities*/
+       mtdcr (uic0tr, 0x010f0004);     /* Set Interrupt Trigger Levels */
+       mtdcr (uic0vr, 0x00000001);     /* Set Vect base=0,INT31 Highest priority */
+       mtdcr (uic0sr, 0x00000000);     /* clear all interrupts*/
+       mtdcr (uic0sr, 0xffffffff);     /* clear all interrupts*/
+
+/* SDR0_MFR should be part of Ethernet init */
+       mfsdr (sdr_mfr, mfr);
+       mfr &= ~SDR0_MFR_ECS_MASK;
+/*     mtsdr(sdr_mfr, mfr); */
+
+       mtsdr(SDR0_PFC0, CFG_PFC0);
+
+       out32(GPIO0_OR, CFG_GPIO_OR);
+       out32(GPIO0_ODR, CFG_GPIO_ODR);
+       out32(GPIO0_TCR, CFG_GPIO_TCR);
+
+       return 0;
+}
+
+int checkboard (void)
+{
+       char *s = getenv("serial#");
+
+       printf("Board: Katmai - AMCC 440SPe Evaluation Board");
+       if (s != NULL) {
+               puts(", serial# ");
+               puts(s);
+       }
+       putc('\n');
+
+       return 0;
+}
+
+#if defined(CFG_DRAM_TEST)
+int testdram (void)
+{
+       uint *pstart = (uint *) 0x00000000;
+       uint *pend = (uint *) 0x08000000;
+       uint *p;
+
+       for (p = pstart; p < pend; p++)
+               *p = 0xaaaaaaaa;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0xaaaaaaaa) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       for (p = pstart; p < pend; p++)
+               *p = 0x55555555;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0x55555555) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+       return 0;
+}
+#endif
+
+/*************************************************************************
+ *  pci_pre_init
+ *
+ *  This routine is called just prior to registering the hose and gives
+ *  the board the opportunity to check things. Returning a value of zero
+ *  indicates that things are bad & PCI initialization should be aborted.
+ *
+ *     Different boards may wish to customize the pci controller structure
+ *     (add regions, override default access routines, etc) or perform
+ *     certain pre-initialization actions.
+ *
+ ************************************************************************/
+#if defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT)
+int pci_pre_init(struct pci_controller * hose )
+{
+       unsigned long strap;
+
+       /*-------------------------------------------------------------------+
+        *      The katmai board is always configured as the host & requires the
+        *      PCI arbiter to be enabled.
+        *-------------------------------------------------------------------*/
+       mfsdr(sdr_sdstp1, strap);
+       if( (strap & SDR0_SDSTP1_PAE_MASK) == 0 ) {
+               printf("PCI: SDR0_STRP1[%08lX] - PCI Arbiter disabled.\n",strap);
+               return 0;
+       }
+
+       return 1;
+}
+#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) */
+
+/*************************************************************************
+ *  pci_target_init
+ *
+ *     The bootstrap configuration provides default settings for the pci
+ *     inbound map (PIM). But the bootstrap config choices are limited and
+ *     may not be sufficient for a given board.
+ *
+ ************************************************************************/
+#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT)
+void pci_target_init(struct pci_controller * hose )
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /*-------------------------------------------------------------------+
+        * Disable everything
+        *-------------------------------------------------------------------*/
+       out32r( PCIX0_PIM0SA, 0 ); /* disable */
+       out32r( PCIX0_PIM1SA, 0 ); /* disable */
+       out32r( PCIX0_PIM2SA, 0 ); /* disable */
+       out32r( PCIX0_EROMBA, 0 ); /* disable expansion rom */
+
+       /*-------------------------------------------------------------------+
+        * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440
+        * strapping options to not support sizes such as 128/256 MB.
+        *-------------------------------------------------------------------*/
+       out32r( PCIX0_PIM0LAL, CFG_SDRAM_BASE );
+       out32r( PCIX0_PIM0LAH, 0 );
+       out32r( PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1 );
+       out32r( PCIX0_BAR0, 0 );
+
+       /*-------------------------------------------------------------------+
+        * Program the board's subsystem id/vendor id
+        *-------------------------------------------------------------------*/
+       out16r( PCIX0_SBSYSVID, CFG_PCI_SUBSYS_VENDORID );
+       out16r( PCIX0_SBSYSID, CFG_PCI_SUBSYS_DEVICEID );
+
+       out16r( PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY );
+}
+#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */
+
+#if defined(CONFIG_PCI)
+/*************************************************************************
+ *  is_pci_host
+ *
+ *     This routine is called to determine if a pci scan should be
+ *     performed. With various hardware environments (especially cPCI and
+ *     PPMC) it's insufficient to depend on the state of the arbiter enable
+ *     bit in the strap register, or generic host/adapter assumptions.
+ *
+ *     Rather than hard-code a bad assumption in the general 440 code, the
+ *     440 pci code requires the board to decide at runtime.
+ *
+ *     Return 0 for adapter mode, non-zero for host (monarch) mode.
+ *
+ *
+ ************************************************************************/
+int is_pci_host(struct pci_controller *hose)
+{
+       /* The katmai board is always configured as host. */
+       return 1;
+}
+
+int katmai_pcie_card_present(int port)
+{
+       u32 val;
+
+       val = in32(GPIO0_IR);
+       switch (port) {
+       case 0:
+               return !(val & GPIO_VAL(CFG_GPIO_PCIE_PRESENT0));
+       case 1:
+               return !(val & GPIO_VAL(CFG_GPIO_PCIE_PRESENT1));
+       case 2:
+               return !(val & GPIO_VAL(CFG_GPIO_PCIE_PRESENT2));
+       default:
+               return 0;
+       }
+}
+
+static struct pci_controller pcie_hose[3] = {{0},{0},{0}};
+
+void pcie_setup_hoses(void)
+{
+       struct pci_controller *hose;
+       int i, bus;
+
+       /*
+        * assume we're called after the PCIX hose is initialized, which takes
+        * bus ID 0 and therefore start numbering PCIe's from 1.
+        */
+       bus = 1;
+       for (i = 0; i <= 2; i++) {
+               /* Check for katmai card presence */
+               if (!katmai_pcie_card_present(i))
+                       continue;
+
+#ifdef PCIE_ENDPOINT
+               if (ppc440spe_init_pcie_endport(i)) {
+#else
+               if (ppc440spe_init_pcie_rootport(i)) {
+#endif
+                       printf("PCIE%d: initialization failed\n", i);
+                       continue;
+               }
+
+               hose = &pcie_hose[i];
+               hose->first_busno = bus;
+               hose->last_busno  = bus;
+               bus++;
+
+               /* setup mem resource */
+               pci_set_region(hose->regions + 0,
+                              CFG_PCIE_MEMBASE + i * CFG_PCIE_MEMSIZE,
+                              CFG_PCIE_MEMBASE + i * CFG_PCIE_MEMSIZE,
+                              CFG_PCIE_MEMSIZE,
+                              PCI_REGION_MEM
+                       );
+               hose->region_count = 1;
+               pci_register_hose(hose);
+
+#ifdef PCIE_ENDPOINT
+               ppc440spe_setup_pcie_endpoint(hose, i);
+               /*
+                * Reson for no scanning is endpoint can not generate
+                * upstream configuration accesses.
+                */
+#else
+               ppc440spe_setup_pcie_rootpoint(hose, i);
+               /*
+                * Config access can only go down stream
+                */
+               hose->last_busno = pci_hose_scan(hose);
+#endif
+       }
+}
+#endif /* defined(CONFIG_PCI) */
+
+int misc_init_f (void)
+{
+       uint reg;
+#if defined(CONFIG_STRESS)
+       uint i ;
+       uint disp;
+#endif
+
+       /* minimal init for PCIe */
+#if 0 /* test-only: test endpoint at some time, for now rootpoint only */
+       /* pci express 0 Endpoint Mode */
+       mfsdr(SDR0_PE0DLPSET, reg);
+       reg &= (~0x00400000);
+       mtsdr(SDR0_PE0DLPSET, reg);
+#else
+       /* pci express 0 Rootpoint  Mode */
+       mfsdr(SDR0_PE0DLPSET, reg);
+       reg |= 0x00400000;
+       mtsdr(SDR0_PE0DLPSET, reg);
+#endif
+       /* pci express 1 Rootpoint  Mode */
+       mfsdr(SDR0_PE1DLPSET, reg);
+       reg |= 0x00400000;
+       mtsdr(SDR0_PE1DLPSET, reg);
+       /* pci express 2 Rootpoint  Mode */
+       mfsdr(SDR0_PE2DLPSET, reg);
+       reg |= 0x00400000;
+       mtsdr(SDR0_PE2DLPSET, reg);
+
+#if defined(CONFIG_STRESS)
+       /*
+        * All this setting done by linux only needed by stress an charac. test
+        * procedure
+        * PCIe 1 Rootpoint PCIe2 Endpoint
+        * PCIe 0 FIR Pre-emphasis Filter Coefficients & Transmit Driver Power Level
+        */
+       for (i=0,disp=0; i<8; i++,disp+=3) {
+               mfsdr(SDR0_PE0HSSSET1L0+disp, reg);
+               reg |= 0x33000000;
+               mtsdr(SDR0_PE0HSSSET1L0+disp, reg);
+       }
+
+       /*PCIe 1 FIR Pre-emphasis Filter Coefficients & Transmit Driver Power Level */
+       for (i=0,disp=0; i<4; i++,disp+=3) {
+               mfsdr(SDR0_PE1HSSSET1L0+disp, reg);
+               reg |= 0x33000000;
+               mtsdr(SDR0_PE1HSSSET1L0+disp, reg);
+       }
+
+       /*PCIE 2 FIR Pre-emphasis Filter Coefficients & Transmit Driver Power Level */
+       for (i=0,disp=0; i<4; i++,disp+=3) {
+               mfsdr(SDR0_PE2HSSSET1L0+disp, reg);
+               reg |= 0x33000000;
+               mtsdr(SDR0_PE2HSSSET1L0+disp, reg);
+       }
+
+       reg = 0x21242222;
+       mtsdr(SDR0_PE2UTLSET1, reg);
+       reg = 0x11000000;
+       mtsdr(SDR0_PE2UTLSET2, reg);
+       /* pci express 1 Endpoint  Mode */
+       reg = 0x00004000;
+       mtsdr(SDR0_PE2DLPSET, reg);
+
+       mtsdr(SDR0_UART1, 0x2080005a);  /* patch for TG */
+#endif
+
+       return 0;
+}
+
+#ifdef CONFIG_POST
+/*
+ * Returns 1 if keys pressed to start the power-on long-running tests
+ * Called from board_init_f().
+ */
+int post_hotkeys_pressed(void)
+{
+       return (ctrlc());
+}
+#endif
diff --git a/board/amcc/katmai/u-boot.lds b/board/amcc/katmai/u-boot.lds
new file mode 100644 (file)
index 0000000..bf8fc5d
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * (C) Copyright 2004
+ * 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);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+SECTIONS
+{
+  .resetvec 0xFFFFFFFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .bootpg 0xFFFFF000 :
+  {
+    cpu/ppc4xx/start.o (.bootpg)
+  } = 0xffff
+
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)      }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)      }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)       }
+  .rela.got      : { *(.rela.got)      }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)       }
+  .rela.bss      : { *(.rela.bss)      }
+  .rel.plt       : { *(.rel.plt)       }
+  .rela.plt      : { *(.rela.plt)      }
+  .init          : { *(.init)          }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/ppc4xx/start.o         (.text)
+    board/amcc/katmai/init.o   (.text)
+
+    *(.text)
+    *(.fixup)
+    *(.got1)
+  }
+  _etext = .;
+  PROVIDE (etext = .);
+  .rodata    :
+  {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.eh_frame)
+  }
+  .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 7830ebdfa6db365ddeaf19c2fc19e2bbbd6a270c..d5ee117dfaca2a6e713b0f01223ab1e8eab24924 100644 (file)
@@ -1,73 +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_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
  *
  *************************************************************************/
 
-    .section .bootpg,"ax"
-    .globl tlbtab
+       .section .bootpg,"ax"
+       .globl tlbtab
 
 tlbtab:
-    tlbtab_start
-
-#if (CFG_LARGE_FLASH == 0xffc00000)    /* if booting from large flash */
-    /* large flash */
-    tlbentry( 0xffc00000,         SZ_1M, 0xffc00000,          1, AC_R|AC_W|AC_X|SA_G|SA_I|SA_W )
-    tlbentry( 0xffd00000,         SZ_1M, 0xffd00000,          1, AC_R|AC_W|AC_X|SA_G|SA_I|SA_W )
-    tlbentry( 0xffe00000,         SZ_1M, 0xffe00000,          1, AC_R|AC_W|AC_X|SA_G|SA_I|SA_W )
-    tlbentry( 0xfff00000,         SZ_1M, 0xfff00000,          1, AC_R|AC_W|AC_X|SA_G|SA_I|SA_W )
-
-    tlbentry( 0xff800000,         SZ_1M, 0xff800000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-    tlbentry( 0xff900000,         SZ_1M, 0xff900000,          1, AC_R|AC_W|AC_X|SA_G|SA_I|SA_W )
-#else                                  /* else booting from small flash */
-    tlbentry( 0xffe00000,         SZ_1M, 0xffe00000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-    tlbentry( 0xfff00000,         SZ_1M, 0xfff00000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-
-    tlbentry( 0xff800000,         SZ_1M, 0xff800000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-    tlbentry( 0xff900000,         SZ_1M, 0xff900000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-    tlbentry( 0xffa00000,         SZ_1M, 0xffa00000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-    tlbentry( 0xffb00000,         SZ_1M, 0xffb00000,          1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-#endif
-
-    tlbentry( CFG_EPLD_BASE,    SZ_256K, 0xff000000,          1, AC_R|AC_W|SA_G|SA_I )
-
-#if (CFG_SRAM_BASE != 0)               /* if SRAM up high and SDRAM at zero */
-    tlbentry( 0x00000000, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( 0x10000000, SZ_256M, 0x10000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-#elif (CFG_SMALL_FLASH == 0xff900000)  /* else SRAM at 0 */
-    tlbentry( 0x00000000,   SZ_1M, 0xff800000, 1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-#elif (CFG_SMALL_FLASH == 0xfff00000)
-    tlbentry( 0x00000000,   SZ_1M, 0xffe00000, 1, AC_R|AC_W|AC_X|SA_G/*|SA_I*/ )
-#else
-    #error DONT KNOW SRAM LOCATION
-#endif
-
-    /* internal ram (l2 cache) */
-    tlbentry( CFG_ISRAM_BASE,    SZ_256K, 0x80000000,      0, AC_R|AC_W|AC_X|SA_I )
-
-    /* peripherals at f0000000 */
-    tlbentry( CFG_PERIPHERAL_BASE, SZ_4K, CFG_PERIPHERAL_BASE, 1, AC_R|AC_W|SA_G|SA_I )
-
-    /* PCI */
-#if (CONFIG_COMMANDS & CFG_CMD_PCI)
-    tlbentry( CFG_PCI_BASE,    SZ_256M, 0x00000000, 9, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE, SZ_256M, 0x10000000, 9, AC_R|AC_W|SA_G|SA_I )
-#endif
-    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
+        */
+       tlbentry(0xfff00000, SZ_1M, 0xfff00000, 1, AC_R|AC_W|AC_X|SA_G)
+
+       tlbentry(0xffc00000, SZ_1M, 0xffc00000, 1, AC_R|AC_W|AC_X|SA_G|SA_I)
+       tlbentry(0xffd00000, SZ_1M, 0xffd00000, 1, AC_R|AC_W|AC_X|SA_G|SA_I)
+       tlbentry(0xffe00000, SZ_1M, 0xffe00000, 1, AC_R|AC_W|AC_X|SA_G|SA_I)
+       tlbentry(0xff900000, SZ_1M, 0xff900000, 1, AC_R|AC_W|AC_X|SA_G|SA_I)
+       tlbentry(CFG_EPLD_BASE, SZ_256K, 0xff000000, 1, AC_R|AC_W|SA_G|SA_I)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
+
+       /* internal ram (l2 cache) */
+       tlbentry(CFG_ISRAM_BASE, SZ_256K, 0x80000000, 0, AC_R|AC_W|AC_X|SA_I)
+
+       /* peripherals at f0000000 */
+       tlbentry(CFG_PERIPHERAL_BASE, SZ_4K, CFG_PERIPHERAL_BASE, 1, AC_R|AC_W|SA_G|SA_I)
+
+       /* PCI */
+       tlbentry(CFG_PCI_BASE, SZ_256M, 0x00000000, 9, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE, SZ_256M, 0x10000000, 9, AC_R|AC_W|SA_G|SA_I)
+       tlbtab_end
index 06a57f6c4aac3c8b2df8282b764d50b9901b5a5b..778aafc76607780cdcf7e00a5ab584febc6f3ab7 100644 (file)
@@ -105,105 +105,6 @@ int checkboard(void)
 }
 
 
-/*************************************************************************
- *  long int fixed_sdram()
- *
- ************************************************************************/
-static long int fixed_sdram(void)
-{                                      /* DDR2 init from BDI2000 script */
-       mtdcr( 0x10, 0x00000021 );      /* MCIF0_MCOPT2 - zero DCEN bit */
-       mtdcr( 0x11, 0x84000000 );
-       mtdcr( 0x10, 0x00000020 );      /* MCIF0_MCOPT1 - no ECC, 64 bits, 4 banks, DDR2 */
-       mtdcr( 0x11, 0x2D122000 );
-       mtdcr( 0x10, 0x00000026 );      /* MCIF0_CODT  - die termination on */
-       mtdcr( 0x11, 0x00800026 );
-       mtdcr( 0x10, 0x00000081 );      /* MCIF0_WRDTR - Write DQS Adv 90 + Fractional DQS Delay */
-       mtdcr( 0x11, 0x82000800 );
-       mtdcr( 0x10, 0x00000080 );      /* MCIF0_CLKTR - advance addr clock by 180 deg */
-       mtdcr( 0x11, 0x80000000 );
-       mtdcr( 0x10, 0x00000040 );      /* MCIF0_MB0CF - turn on CS0, N x 10 coll */
-       mtdcr( 0x11, 0x00000201 );
-       mtdcr( 0x10, 0x00000044 );      /* MCIF0_MB1CF - turn on CS0, N x 10 coll */
-       mtdcr( 0x11, 0x00000201 );
-       mtdcr( 0x10, 0x00000030 );      /* MCIF0_RTR   - refresh every 7.8125uS */
-       mtdcr( 0x11, 0x08200000 );
-       mtdcr( 0x10, 0x00000085 );      /* MCIF0_SDTR1 - timing register 1 */
-       mtdcr( 0x11, 0x80201000 );
-       mtdcr( 0x10, 0x00000086 );      /* MCIF0_SDTR2 - timing register 2 */
-       mtdcr( 0x11, 0x42103242 );
-       mtdcr( 0x10, 0x00000087 );      /* MCIF0_SDTR3 - timing register 3 */
-       mtdcr( 0x11, 0x0C100D14 );
-       mtdcr( 0x10, 0x00000088 );      /* MCIF0_MMODE - CAS is 4 cycles */
-       mtdcr( 0x11, 0x00000642 );
-       mtdcr( 0x10, 0x00000089 );      /* MCIF0_MEMODE - diff DQS disabled */
-       mtdcr( 0x11, 0x00000400 );      /*                ODT term disabled */
-
-       mtdcr( 0x10, 0x00000050 );      /* MCIF0_INITPLR0 - NOP */
-       mtdcr( 0x11, 0x81b80000 );
-       mtdcr( 0x10, 0x00000051 );      /* MCIF0_INITPLR1 - PRE */
-       mtdcr( 0x11, 0x82100400 );
-       mtdcr( 0x10, 0x00000052 );      /* MCIF0_INITPLR2 - EMR2 */
-       mtdcr( 0x11, 0x80820000 );
-       mtdcr( 0x10, 0x00000053 );      /* MCIF0_INITPLR3 - EMR3 */
-       mtdcr( 0x11, 0x80830000 );
-       mtdcr( 0x10, 0x00000054 );      /* MCIF0_INITPLR4 - EMR DLL ENABLE */
-       mtdcr( 0x11, 0x80810000 );
-       mtdcr( 0x10, 0x00000055 );      /* MCIF0_INITPLR5 - MR DLL RESET */
-       mtdcr( 0x11, 0x80800542 );
-       mtdcr( 0x10, 0x00000056 );      /* MCIF0_INITPLR6 - PRE */
-       mtdcr( 0x11, 0x82100400 );
-       mtdcr( 0x10, 0x00000057 );      /* MCIF0_INITPLR7 - refresh */
-       mtdcr( 0x11, 0x99080000 );
-       mtdcr( 0x10, 0x00000058 );      /* MCIF0_INITPLR8 */
-       mtdcr( 0x11, 0x99080000 );
-       mtdcr( 0x10, 0x00000059 );      /* MCIF0_INITPLR9 */
-       mtdcr( 0x11, 0x99080000 );
-       mtdcr( 0x10, 0x0000005A );      /* MCIF0_INITPLR10 */
-       mtdcr( 0x11, 0x99080000 );
-       mtdcr( 0x10, 0x0000005B );      /* MCIF0_INITPLR11 - MR */
-       mtdcr( 0x11, 0x80800442 );
-       mtdcr( 0x10, 0x0000005C );      /* MCIF0_INITPLR12 - EMR OCD Default */
-       mtdcr( 0x11, 0x80810380 );
-       mtdcr( 0x10, 0x0000005D );      /* MCIF0_INITPLR13 - EMR OCD exit */
-       mtdcr( 0x11, 0x80810000 );
-       udelay( 10*1000 );
-
-       mtdcr( 0x10, 0x00000021 );      /* MCIF0_MCOPT2 - execute preloaded init */
-       mtdcr( 0x11, 0x28000000 );      /*                set DC_EN */
-       udelay( 100*1000 );
-
-       mtdcr( 0x40, 0x0000F800 );      /* MQ0_B0BAS: base addr 00000000 / 256MB */
-       mtdcr( 0x41, 0x1000F800 );      /* MQ0_B1BAS: base addr 10000000 / 256MB */
-
-       mtdcr( 0x10, 0x00000078 );      /* MCIF0_RDCC - auto set read stage */
-       mtdcr( 0x11, 0x00000000 );
-       mtdcr( 0x10, 0x00000070 );      /* MCIF0_RQDC - read DQS delay control */
-       mtdcr( 0x11, 0x8000003A );      /*              enabled, frac DQS delay */
-       mtdcr( 0x10, 0x00000074 );      /* MCIF0_RFDC - two clock feedback delay */
-       mtdcr( 0x11, 0x00000200 );
-
-       return  512 << 20;
-}
-
-
-/*************************************************************************
- *  long int initdram
- *
- ************************************************************************/
-long int initdram( int board_type )
-{
-       long dram_size = 0;
-
-#if defined(CONFIG_SPD_EEPROM)
-       dram_size = spd_sdram (0);
-#else
-       dram_size = fixed_sdram ();
-#endif
-
-       return  dram_size;
-}
-
-
 /*************************************************************************
  *  int testdram()
  *
index d122f499f1b34686a15aec785e5caaeb576b2533..72ce6855d75fc38b04c190a554af5cce9a7a6797 100644 (file)
@@ -68,19 +68,6 @@ SECTIONS
 
     cpu/ppc4xx/start.o (.text)
     board/amcc/luan/init.o     (.text)
-    cpu/ppc4xx/kgdb.o  (.text)
-    cpu/ppc4xx/traps.o (.text)
-    cpu/ppc4xx/interrupts.o    (.text)
-    cpu/ppc4xx/serial.o        (.text)
-    cpu/ppc4xx/cpu_init.o      (.text)
-    cpu/ppc4xx/speed.o (.text)
-    common/dlmalloc.o  (.text)
-    lib_generic/crc32.o                (.text)
-    lib_ppc/extable.o  (.text)
-    lib_generic/zlib.o         (.text)
-
-/*    . = env_offset;*/
-/*    common/environment.o(.text)*/
 
     *(.text)
     *(.fixup)
index 7e0b13249293c2f1c3ef3e18b4324fb396643092..d211c710b2320ff99c7bf8e2dbb4c9b1b1480022 100644 (file)
 
 #include <ppc_asm.tmpl>
 #include <config.h>
-
-/* General */
-#define TLB_VALID   0x00000200
-#define _256M       0x10000000
-
-/* 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
  *
  *************************************************************************/
 
-    .section .bootpg,"ax"
-    .globl tlbtab
+       .section .bootpg,"ax"
+       .globl tlbtab
 
 tlbtab:
-    tlbtab_start
-    tlbentry( 0xf0000000, SZ_256M, 0xf0000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_PERIPHERAL_BASE, SZ_256M, 0x40000000, 1, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_ISRAM_BASE, SZ_4K, 0x80000000, 0, AC_R|AC_W|AC_X )
-    tlbentry( CFG_ISRAM_BASE + 0x1000, SZ_4K, 0x80001000, 0, AC_R|AC_W|AC_X )
-    tlbentry( CFG_SDRAM_BASE, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_SDRAM_BASE + 0x10000000, SZ_256M, 0x10000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_SDRAM_BASE + 0x20000000, SZ_256M, 0x20000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_SDRAM_BASE + 0x30000000, SZ_256M, 0x30000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_PCI_BASE, SZ_256M, 0x00000000, 2, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE, SZ_256M, 0x00000000, 3, AC_R|AC_W|SA_G|SA_I )
-    tlbtab_end
+       tlbtab_start
+
+       tlbentry(0xf0000000, SZ_256M, 0xf0000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
+
+       tlbentry(CFG_PERIPHERAL_BASE, SZ_256M, 0x40000000, 1, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_ISRAM_BASE, SZ_4K, 0x80000000, 0, AC_R|AC_W|AC_X)
+       tlbentry(CFG_ISRAM_BASE + 0x1000, SZ_4K, 0x80001000, 0, AC_R|AC_W|AC_X)
+       tlbentry(CFG_PCI_BASE, SZ_256M, 0x00000000, 2, AC_R|AC_W|SA_G|SA_I)
+       tlbentry(CFG_PCI_MEMBASE, SZ_256M, 0x00000000, 3, AC_R|AC_W|SA_G|SA_I)
+       tlbtab_end
index 77f1438448099eaa58447bed0c45e08d7b4b15fb..f8b837ed286385c8445a9aec6b9b7430d9d4c6a6 100644 (file)
@@ -6,7 +6,7 @@
  * Alain Saurel,            AMCC/IBM, alain.saurel@fr.ibm.com
  * Robert Snyder,           AMCC/IBM, rob.snyder@fr.ibm.com
  *
- * (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
@@ -379,16 +379,18 @@ 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)
+       ulong speed = get_bus_freq(0);
+
        mtsdram(DDR0_02, 0x00000000);
 
        mtsdram(DDR0_00, 0x0000190A);
        mtsdram(DDR0_01, 0x01000000);
        mtsdram(DDR0_03, 0x02030602);
-       mtsdram(DDR0_04, 0x13030300);
-       mtsdram(DDR0_05, 0x0202050E);
-       mtsdram(DDR0_06, 0x0104C823);
+       mtsdram(DDR0_04, 0x0A020200);
+       mtsdram(DDR0_05, 0x02020308);
+       mtsdram(DDR0_06, 0x0102C812);
        mtsdram(DDR0_07, 0x000D0100);
-       mtsdram(DDR0_08, 0x02360001);
+       mtsdram(DDR0_08, 0x02430001);
        mtsdram(DDR0_09, 0x00011D5F);
        mtsdram(DDR0_10, 0x00000300);
        mtsdram(DDR0_11, 0x0027C800);
@@ -402,13 +404,16 @@ long int initdram (int board_type)
        mtsdram(DDR0_22, 0x00267F0B);
        mtsdram(DDR0_23, 0x00000000);
        mtsdram(DDR0_24, 0x01010002);
-       mtsdram(DDR0_26, 0x5B260181);
+       if (speed > 133333333)
+               mtsdram(DDR0_26, 0x5B26050C);
+       else
+               mtsdram(DDR0_26, 0x5B260408);
        mtsdram(DDR0_27, 0x0000682B);
        mtsdram(DDR0_28, 0x00000000);
        mtsdram(DDR0_31, 0x00000000);
        mtsdram(DDR0_42, 0x01000006);
-       mtsdram(DDR0_43, 0x050A0200);
-       mtsdram(DDR0_44, 0x00000005);
+       mtsdram(DDR0_43, 0x030A0200);
+       mtsdram(DDR0_44, 0x00000003);
        mtsdram(DDR0_02, 0x00000001);
 
        wait_for_dlllock();
index b2b82c75954839bd90c36c02583e4bc0fac8e47b..daaffe06d35c174ede7b56ce65a0a3b2a97336d9 100644 (file)
@@ -336,6 +336,10 @@ int misc_init_r(void)
        }
 #endif /* CONFIG_440EPX */
 
+       mfsdr(SDR0_SRST1, reg);         /* enable security/kasumi engines */
+       reg &= ~(SDR0_SRST1_CRYP0 | SDR0_SRST1_KASU0);
+       mtsdr(SDR0_SRST1, reg);
+
        /*
         * Clear PLB4A0_ACR[WRP]
         * This fix will make the MAL burst disabling patch for the Linux
index c9eca686b253300b87b9ef88d0244194ff41c738..c92dcf7a514a9a54a46537812390569a4393dfcf 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * (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
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-/* port to AMCC 440SPE evaluatioon board - SG April 12,2005  */
 
 #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_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
        .globl tlbtabA
 tlbtabA:
        tlbtab_start
-       tlbentry(0xfff00000, SZ_16M, 0xfff00000, 4, AC_R|AC_W|AC_X|SA_G)
 
-       tlbentry(CFG_SDRAM_BASE, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x10000000, SZ_256M, 0x10000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x20000000, SZ_256M, 0x20000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x30000000, SZ_256M, 0x30000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
+       /*
+        * 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(0xff000000, SZ_16M, 0xff000000, 4, AC_R|AC_W|AC_X|SA_G)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
 
        tlbentry(CFG_ISRAM_BASE, SZ_256K, 0x00000000, 4, AC_R|AC_W|AC_X|SA_I)
        tlbentry(CFG_FPGA_BASE, SZ_1K, 0xE2000000, 4,AC_R|AC_W|SA_I)
@@ -126,12 +89,18 @@ tlbtabA:
        .globl tlbtabB
 tlbtabB:
        tlbtab_start
-       tlbentry(0xfff00000, SZ_16M, 0xfff00000, 4, AC_R|AC_W|AC_X|SA_G)
 
-       tlbentry(CFG_SDRAM_BASE, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x10000000, SZ_256M, 0x10000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x20000000, SZ_256M, 0x20000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
-       tlbentry(CFG_SDRAM_BASE + 0x30000000, SZ_256M, 0x30000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I)
+       /*
+        * 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(0xff000000, SZ_16M, 0xff000000, 4, AC_R|AC_W|AC_X|SA_G)
+
+       /*
+        * TLB entries for SDRAM are not needed on this platform.
+        * They are dynamically generated in the SPD DDR(2) detection
+        * routine.
+        */
 
        tlbentry(CFG_ISRAM_BASE, SZ_256K, 0x00000000, 4, AC_R|AC_W|AC_X|SA_I)
        tlbentry(CFG_FPGA_BASE, SZ_1K, 0xE2000000, 4,AC_R|AC_W|SA_I)
index e9b34dd249a9c9333c7cccf2138a978319fc0d81..90eaab1c80befc58c2ffa5ee782df9095a4640c4 100644 (file)
@@ -44,8 +44,6 @@ int compare_to_true(char *str );
 char *remove_l_w_space(char *in_str );
 char *remove_t_w_space(char *in_str );
 int get_console_port(void);
-unsigned long ppcMfcpr(unsigned long cpr_reg);
-unsigned long ppcMfsdr(unsigned long sdr_reg);
 
 int ppc440spe_init_pcie_rootport(int port);
 void ppc440spe_setup_pcie(struct pci_controller *hose, int port);
@@ -221,7 +219,7 @@ int board_early_init_f (void)
         |
         +-------------------------------------------------------------------*/
        /* Read Pin Strap Register in PPC440SP */
-       sdr0_pinstp = ppcMfsdr(SDR0_PINSTP);
+       mfsdr(SDR0_PINSTP, sdr0_pinstp);
        bootstrap_settings = sdr0_pinstp & SDR0_PINSTP_BOOTSTRAP_MASK;
 
        switch (bootstrap_settings) {
@@ -246,7 +244,7 @@ int board_early_init_f (void)
                         * Boot Settings in IIC EEprom address 0x50 or 0x54
                         * Read Serial Device Strap Register1 in PPC440SPe
                         */
-                       sdr0_sdstp1 = ppcMfsdr(SDR0_SDSTP1);
+                       mfsdr(SDR0_SDSTP1, sdr0_sdstp1);
                        boot_selection = sdr0_sdstp1 & SDR0_SDSTP1_ERPN_MASK;
                        ebc_data_width = sdr0_sdstp1 & SDR0_SDSTP1_EBCW_MASK;
 
@@ -564,277 +562,6 @@ int checkboard (void)
        return 0;
 }
 
-static long int yucca_probe_for_dimms(void)
-{
-       int     dimm_installed[MAXDIMMS];
-       int     dimm_num, result;
-       int     dimms_found = 0;
-       uchar   dimm_addr = IIC0_DIMM0_ADDR;
-       uchar   dimm_spd_data[MAX_SPD_BYTES];
-
-       for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
-               /* check if there is a chip at the dimm address */
-               switch (dimm_num) {
-                       case 0:
-                               dimm_addr = IIC0_DIMM0_ADDR;
-                               break;
-                       case 1:
-                               dimm_addr = IIC0_DIMM1_ADDR;
-                               break;
-               }
-
-               result = i2c_probe(dimm_addr);
-
-               memset(dimm_spd_data, 0, MAX_SPD_BYTES * sizeof(char));
-               if (result == 0) {
-                       /* read first byte of SPD data, if there is any data */
-                       result = i2c_read(dimm_addr, 0, 1, dimm_spd_data, 1);
-
-                       if (result == 0) {
-                               result = dimm_spd_data[0];
-                               result = result > MAX_SPD_BYTES ?
-                                               MAX_SPD_BYTES : result;
-                               result = i2c_read(dimm_addr, 0, 1,
-                                                       dimm_spd_data, result);
-                       }
-               }
-
-               if ((result == 0) &&
-                   (dimm_spd_data[64] == MICRON_SPD_JEDEC_ID)) {
-                       dimm_installed[dimm_num] = TRUE;
-                       dimms_found++;
-                       debug("DIMM slot %d: DDR2 SDRAM detected\n", dimm_num);
-               } else {
-                       dimm_installed[dimm_num] = FALSE;
-                       debug("DIMM slot %d: Not populated or cannot sucessfully probe the DIMM\n", dimm_num);
-               }
-       }
-
-       if (dimms_found == 0) {
-               printf("ERROR - No memory installed.  Install a DDR-SDRAM DIMM.\n\n");
-               hang();
-       }
-
-       if (dimm_installed[0] != TRUE) {
-               printf("\nERROR - DIMM slot 0 must be populated before DIMM slot 1.\n");
-               printf("        Unsupported configuration. Move DIMM module from DIMM slot 1 to slot 0.\n\n");
-               hang();
-       }
-
-       return dimms_found;
-}
-
-/*************************************************************************
- * init SDRAM controller with fixed value
- * the initialization values are for 2x MICRON DDR2
- * PN: MT18HTF6472DY-53EB2
- * 512MB, DDR2, 533, CL4, ECC, REG
- ************************************************************************/
-static long int fixed_sdram(void)
-{
-       long int yucca_dimms = 0;
-
-       yucca_dimms = yucca_probe_for_dimms();
-
-       /* SDRAM0_MCOPT2 (0X21) Clear DCEN BIT  */
-       mtdcr( 0x10, 0x00000021 );
-       mtdcr( 0x11, 0x84000000 );
-
-       /* SDRAM0_MCOPT1 (0X20) ECC OFF / 64 bits / 4 banks / DDR2      */
-       mtdcr( 0x10, 0x00000020 );
-       mtdcr( 0x11, 0x2D122000 );
-
-       /* SET MCIF0_CODT   Die Termination On  */
-       mtdcr( 0x10, 0x00000026 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x2A800021 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x02800021 );
-
-       /* On-Die Termination for Bank 0        */
-       mtdcr( 0x10, 0x00000022 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x18000000 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x06000000 );
-
-       /*      On-Die Termination for Bank 1   */
-       mtdcr( 0x10, 0x00000023 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x18000000 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x01800000 );
-
-       /*      On-Die Termination for Bank 2   */
-       mtdcr( 0x10, 0x00000024 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x01800000 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x00000000 );
-
-       /*      On-Die Termination for Bank 3   */
-       mtdcr( 0x10, 0x00000025 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x01800000 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x00000000 );
-
-       /* Refresh Time register (0x30) Refresh every 7.8125uS  */
-       mtdcr( 0x10, 0x00000030 );
-       mtdcr( 0x11, 0x08200000 );
-
-       /* SET MCIF0_MMODE       CL 4   */
-       mtdcr( 0x10, 0x00000088 );
-       mtdcr( 0x11, 0x00000642 );
-
-       /* MCIF0_MEMODE */
-       mtdcr( 0x10, 0x00000089 );
-       mtdcr( 0x11, 0x00000004 );
-
-       /*SET MCIF0_MB0CF       */
-       mtdcr( 0x10, 0x00000040 );
-       mtdcr( 0x11, 0x00000201 );
-
-       /* SET MCIF0_MB1CF      */
-       mtdcr( 0x10, 0x00000044 );
-       mtdcr( 0x11, 0x00000201 );
-
-       /* SET MCIF0_MB2CF      */
-       mtdcr( 0x10, 0x00000048 );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x00000201 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x00000000 );
-
-       /* SET MCIF0_MB3CF      */
-       mtdcr( 0x10, 0x0000004c );
-       if (yucca_dimms == 2)
-               mtdcr( 0x11, 0x00000201 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x11, 0x00000000 );
-
-       /* SET MCIF0_INITPLR0  # NOP            */
-       mtdcr( 0x10, 0x00000050 );
-       mtdcr( 0x11, 0xB5380000 );
-
-       /* SET MCIF0_INITPLR1  # PRE            */
-       mtdcr( 0x10, 0x00000051 );
-       mtdcr( 0x11, 0x82100400 );
-
-       /* SET MCIF0_INITPLR2  # EMR2           */
-       mtdcr( 0x10, 0x00000052 );
-       mtdcr( 0x11, 0x80820000 );
-
-       /* SET MCIF0_INITPLR3  # EMR3           */
-       mtdcr( 0x10, 0x00000053 );
-       mtdcr( 0x11, 0x80830000 );
-
-       /* SET MCIF0_INITPLR4  # EMR DLL ENABLE */
-       mtdcr( 0x10, 0x00000054 );
-       mtdcr( 0x11, 0x80810000 );
-
-       /* SET MCIF0_INITPLR5  # MR DLL RESET   */
-       mtdcr( 0x10, 0x00000055 );
-       mtdcr( 0x11, 0x80800542 );
-
-       /* SET MCIF0_INITPLR6  # PRE            */
-       mtdcr( 0x10, 0x00000056 );
-       mtdcr( 0x11, 0x82100400 );
-
-       /* SET MCIF0_INITPLR7  # Refresh        */
-       mtdcr( 0x10, 0x00000057 );
-       mtdcr( 0x11, 0x8A080000 );
-
-       /* SET MCIF0_INITPLR8  # Refresh        */
-       mtdcr( 0x10, 0x00000058 );
-       mtdcr( 0x11, 0x8A080000 );
-
-       /* SET MCIF0_INITPLR9  # Refresh        */
-       mtdcr( 0x10, 0x00000059 );
-       mtdcr( 0x11, 0x8A080000 );
-
-       /* SET MCIF0_INITPLR10 # Refresh        */
-       mtdcr( 0x10, 0x0000005A );
-       mtdcr( 0x11, 0x8A080000 );
-
-       /* SET MCIF0_INITPLR11 # MR             */
-       mtdcr( 0x10, 0x0000005B );
-       mtdcr( 0x11, 0x80800442 );
-
-       /* SET MCIF0_INITPLR12 # EMR OCD Default*/
-       mtdcr( 0x10, 0x0000005C );
-       mtdcr( 0x11, 0x80810380 );
-
-       /* SET MCIF0_INITPLR13 # EMR OCD Exit   */
-       mtdcr( 0x10, 0x0000005D );
-       mtdcr( 0x11, 0x80810000 );
-
-       /* 0x80: Adv Addr clock by 180 deg      */
-       mtdcr( 0x10, 0x00000080 );
-       mtdcr( 0x11, 0x80000000 );
-
-       /* 0x21: Exit self refresh, set DC_EN   */
-       mtdcr( 0x10, 0x00000021 );
-       mtdcr( 0x11, 0x28000000 );
-
-       /* 0x81: Write DQS Adv 90 + Fractional DQS Delay        */
-       mtdcr( 0x10, 0x00000081 );
-       mtdcr( 0x11, 0x80000800 );
-
-       /* MCIF0_SDTR1  */
-       mtdcr( 0x10, 0x00000085 );
-       mtdcr( 0x11, 0x80201000 );
-
-       /* MCIF0_SDTR2  */
-       mtdcr( 0x10, 0x00000086 );
-       mtdcr( 0x11, 0x42103242 );
-
-       /* MCIF0_SDTR3  */
-       mtdcr( 0x10, 0x00000087 );
-       mtdcr( 0x11, 0x0C100D14 );
-
-       /* SET MQ0_B0BAS  base addr 00000000 / 256MB    */
-       mtdcr( 0x40, 0x0000F800 );
-
-       /* SET MQ0_B1BAS  base addr 10000000 / 256MB    */
-       mtdcr( 0x41, 0x0400F800 );
-
-       /* SET MQ0_B2BAS  base addr 20000000 / 256MB    */
-       if (yucca_dimms == 2)
-               mtdcr( 0x42, 0x0800F800 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x42, 0x00000000 );
-
-       /* SET MQ0_B3BAS  base addr 30000000 / 256MB    */
-       if (yucca_dimms == 2)
-               mtdcr( 0x43, 0x0C00F800 );
-       else if (yucca_dimms == 1)
-               mtdcr( 0x43, 0x00000000 );
-
-       /* SDRAM_RQDC   */
-       mtdcr( 0x10, 0x00000070 );
-       mtdcr( 0x11, 0x8000003F );
-
-       /* SDRAM_RDCC   */
-       mtdcr( 0x10, 0x00000078 );
-       mtdcr( 0x11, 0x80000000 );
-
-       /* SDRAM_RFDC   */
-       mtdcr( 0x10, 0x00000074 );
-       mtdcr( 0x11, 0x00000220 );
-
-       return (yucca_dimms * 512) << 20;
-}
-
-long int initdram (int board_type)
-{
-       long dram_size = 0;
-
-       dram_size = fixed_sdram();
-
-       return dram_size;
-}
-
 #if defined(CFG_DRAM_TEST)
 int testdram (void)
 {
@@ -1267,42 +994,3 @@ int onboard_pci_arbiter_selected(int core_pci)
 #endif
        return (BOARD_OPTION_NOT_SELECTED);
 }
-
-/*---------------------------------------------------------------------------+
- | ppcMfcpr.
- +---------------------------------------------------------------------------*/
-unsigned long ppcMfcpr(unsigned long cpr_reg)
-{
-       unsigned long msr;
-       unsigned long cpr_cfgaddr_temp;
-       unsigned long cpr_value;
-
-       msr = (mfmsr () & ~(MSR_EE));
-       cpr_cfgaddr_temp =  mfdcr(CPR0_CFGADDR);
-       mtdcr(CPR0_CFGADDR, cpr_reg);
-       cpr_value =  mfdcr(CPR0_CFGDATA);
-       mtdcr(CPR0_CFGADDR, cpr_cfgaddr_temp);
-       mtmsr(msr);
-
-       return (cpr_value);
-}
-
-/*----------------------------------------------------------------------------+
-| Indirect Access of the System DCR's (SDR)
-| ppcMfsdr
-+----------------------------------------------------------------------------*/
-unsigned long ppcMfsdr(unsigned long sdr_reg)
-{
-       unsigned long msr;
-       unsigned long sdr_cfgaddr_temp;
-       unsigned long sdr_value;
-
-       msr = (mfmsr () & ~(MSR_EE));
-       sdr_cfgaddr_temp =  mfdcr(SDR0_CFGADDR);
-       mtdcr(SDR0_CFGADDR, sdr_reg);
-       sdr_value =  mfdcr(SDR0_CFGDATA);
-       mtdcr(SDR0_CFGADDR, sdr_cfgaddr_temp);
-       mtmsr(msr);
-
-       return (sdr_value);
-}
index a7114eb074ece8394a0c26c608f674b3904a8294..a0fac7fe5ab4863f6e2e20164f498d81f296556e 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <common.h>
 #include <asm/processor.h>
-#include <405gp_i2c.h>
+#include <4xx_i2c.h>
 #include <command.h>
 #include <rtc.h>
 #include <post.h>
index 5cd342332f51fd3bdb6a3ab9e1c239e1f4430cc7..001fd68da42e0bbea25e6b5930067b5283eb1991 100644 (file)
@@ -33,6 +33,7 @@
 #include <asm/byteorder.h>
 #include <linux/mtd/nand_legacy.h>
 #include <fat.h>
+#include <part.h>
 
 #include "auto_update.h"
 
@@ -71,8 +72,6 @@ extern int transfer_pic(unsigned char, unsigned char *, int, int);
 extern int flash_sect_erase(ulong, ulong);
 extern int flash_sect_protect (int, ulong, ulong);
 extern int flash_write (char *, ulong, ulong);
-/* change char* to void* to shutup the compiler */
-extern block_dev_desc_t *get_dev (char*, int);
 
 #if (CONFIG_COMMANDS & CFG_CMD_NAND) && defined(CFG_NAND_LEGACY)
 /* references to names in cmd_nand.c */
index 36bb7ce2c7465b052cb48df588c9445ef4f4499b..17e3568941006dfa6b539e196477dee5ec0b569a 100644 (file)
@@ -366,12 +366,12 @@ int misc_init_r ()
        dcache_lock ();
 #endif
        if (flash_info[3].size < CFG_FLASH_INCREMENT) {
-               unsigned int flash_offset;
+               unsigned int flash_offset;
                unsigned int l;
 
                flash_offset =  CFG_FLASH_INCREMENT - flash_info[3].size;
                for (l = 0; l < CFG_MAX_FLASH_SECT; l++) {
-                       if (flash_info[3].start[l] != 0) {
+                       if (flash_info[3].start[l] != 0) {
                              flash_info[3].start[l] += flash_offset;
                        }
                }
@@ -503,7 +503,7 @@ static void move64 (unsigned long long *src, unsigned long long *dest)
 {
        asm ("lfd  0, 0(3)\n\t" /* fpr0   =  *scr       */
             "stfd 0, 0(4)"     /* *dest  =  fpr0       */
-      : : : "fr0");            /* Clobbers fr0         */
+      : : : "fr0");            /* Clobbers fr0         */
        return;
 }
 
@@ -581,9 +581,9 @@ int mem_test_data (void)
                move64 (&(pattern[i]), pmem);
                move64 (pmem, &temp64);
 
-               /* hi = (temp64>>32) & 0xffffffff;          */
-               /* lo = temp64 & 0xffffffff;                */
-               /* printf("\ntemp64 = 0x%08x%08x", hi, lo); */
+               /* hi = (temp64>>32) & 0xffffffff;              */
+               /* lo = temp64 & 0xffffffff;                    */
+               /* printf("\ntemp64 = 0x%08x%08x", hi, lo);     */
 
                hi = (pattern[i] >> 32) & 0xffffffff;
                lo = pattern[i] & 0xffffffff;
@@ -856,11 +856,11 @@ int testdram (void)
 }
 #endif /* CFG_DRAM_TEST */
 
-/* ronen - the below functions are used by the bootm function           */
+/* ronen - the below functions are used by the bootm function          */
 /*  - we map the base register to fbe00000 (same mapping as in the LSP) */
 /*  - we turn off the RX gig dmas - to prevent the dma from overunning  */
-/*    the kernel data areas.                                            */
-/*  - we diable and invalidate the icache and dcache.                   */
+/*    the kernel data areas.                                           */
+/*  - we diable and invalidate the icache and dcache.                  */
 void my_remap_gt_regs_bootm (u32 cur_loc, u32 new_loc)
 {
        u32 temp;
@@ -911,13 +911,11 @@ int do_show_cfg(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
        GT_REG_READ(0x3d4, &reset_sample_high);
        printf("Reset configuration 0x%08x 0x%08x\n", reset_sample_low, reset_sample_high);
 
-        return(0);
+       return(0);
 }
 
-
 U_BOOT_CMD(
        show_cfg,       1,      1,      do_show_cfg,
        "show_cfg- Show Marvell strapping register\n",
        "Show Marvell strapping register (ResetSampleLow ResetSampleHigh)\n"
        );
-
index a019ce4215093b4b160259723d0850e86917e4b1..69432138d3152f75e059cd459ce574bc6bbff4f8 100644 (file)
@@ -25,7 +25,7 @@
 #include "du405.h"
 #include <asm/processor.h>
 #include <ppc4xx.h>
-#include <405gp_i2c.h>
+#include <4xx_i2c.h>
 #include <command.h>
 
 DECLARE_GLOBAL_DATA_PTR;
index 37b92fb65a8dd482a433e0a592c9e5ba33a4ed6a..59171f8f4c5cfbaf0fda5dcdb864ccbb5f320306 100644 (file)
@@ -215,12 +215,6 @@ int checkboard (void)
        }
 
        putc ('\n');
-
-       /*
-        * Disable sleep mode in LXT971
-        */
-       lxt971_no_sleep();
-
        return 0;
 }
 
@@ -292,3 +286,14 @@ void board_auto_update_show(int au_active)
        }
 }
 #endif
+
+void reset_phy(void)
+{
+#ifdef CONFIG_LXT971_NO_SLEEP
+
+       /*
+        * Disable sleep mode in LXT971
+        */
+       lxt971_no_sleep();
+#endif
+}
index 237e8631657d51f9c320f5e3db23d23a55482831..9fa0e747b929ee9e4930496c8807d53527aa74e3 100644 (file)
@@ -103,9 +103,9 @@ long int initdram (int board_type)
 
        /* find RAM size using SDRAM CS0 only */
        sdram_start(0);
-       test1 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x20000000);
+       test1 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
        sdram_start(1);
-       test2 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x20000000);
+       test2 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
        if (test1 > test2) {
                sdram_start(0);
                dramsize = test1;
@@ -179,7 +179,7 @@ struct kbd_data_t* get_keys (struct kbd_data_t *kbd_data)
        return kbd_data;
 }
 
-static int compare_magic (const struct kbd_data_t *kbd_data, uchar *str)
+static int compare_magic (const struct kbd_data_t *kbd_data, char *str)
 {
        char s1 = str[0];
        char s2;
@@ -222,11 +222,11 @@ static int compare_magic (const struct kbd_data_t *kbd_data, uchar *str)
        return 0;
 }
 
-static uchar *key_match (const struct kbd_data_t *kbd_data)
+static char *key_match (const struct kbd_data_t *kbd_data)
 {
-       uchar magic[sizeof (kbd_magic_prefix) + 1];
-       uchar *suffix;
-       uchar *kbd_magic_keys;
+       char magic[sizeof (kbd_magic_prefix) + 1];
+       char *suffix;
+       char *kbd_magic_keys;
 
        /*
         * The following string defines the characters that can be appended
@@ -247,7 +247,7 @@ static uchar *key_match (const struct kbd_data_t *kbd_data)
                sprintf (magic, "%s%c", kbd_magic_prefix, *suffix);
 
                if (compare_magic(kbd_data, getenv(magic)) == 0) {
-                       uchar cmd_name[sizeof (kbd_command_prefix) + 1];
+                       char cmd_name[sizeof (kbd_command_prefix) + 1];
                        char *cmd;
 
                        sprintf (cmd_name, "%s%c", kbd_command_prefix, *suffix);
@@ -267,7 +267,7 @@ int misc_init_r (void)
 #ifdef CONFIG_PREBOOT
        struct kbd_data_t kbd_data;
        /* Decode keys */
-       uchar *str = strdup (key_match (get_keys (&kbd_data)));
+       char *str = strdup (key_match (get_keys (&kbd_data)));
        /* Set or delete definition */
        setenv ("preboot", str);
        free (str);
index de04c66385462bdfb6e9066df5000765a4d1b936..d212c63328bbf1aa63cec01d3954f66714fac91e 100644 (file)
@@ -46,7 +46,7 @@ int board_init (void)
        gd->bd->bi_arch_number = 83;
 
        /* location of boot parameters */
-       gd->bd->bi_boot_params = 0xc0000100;
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
        return 0;
 }
index f1bb72128480d1fc4c91d5030ee83f1ca473e433..90d03ec47a85c1e38df0cbafd790ee75d0094b26 100644 (file)
@@ -23,6 +23,7 @@
 #include <image.h>
 #include <asm/byteorder.h>
 #include <usb.h>
+#include <part.h>
 
 #ifdef CFG_HUSH_PARSER
 #include <hush.h>
 #error "must define CFG_CMD_FAT"
 #endif
 
-/*
- * Check whether a USB memory stick is plugged in.
- * If one is found:
- *     1) if prepare.img ist found load it into memory. If it is
- *             valid then run it.
- *     2) if preinst.img is found load it into memory. If it is
- *             valid then run it. Update the EEPROM.
- *     3) if firmw_01.img is found load it into memory. If it is valid,
- *             burn it into FLASH and update the EEPROM.
- *     4) if kernl_01.img is found load it into memory. If it is valid,
- *             burn it into FLASH and update the EEPROM.
- *     5) if app.img is found load it into memory. If it is valid,
- *             burn it into FLASH and update the EEPROM.
- *     6) if disk.img is found load it into memory. If it is valid,
- *             burn it into FLASH and update the EEPROM.
- *     7) if postinst.img is found load it into memory. If it is
- *             valid then run it. Update the EEPROM.
- */
-
 #undef AU_DEBUG
 
 #undef debug
@@ -78,6 +60,7 @@
 /* possible names of files on the USB stick. */
 #define AU_FIRMWARE    "u-boot.img"
 #define AU_KERNEL      "kernel.img"
+#define AU_ROOTFS      "rootfs.img"
 
 struct flash_layout {
        long start;
@@ -89,33 +72,47 @@ struct flash_layout {
 #define AU_FL_FIRMWARE_ND      0xfC03FFFF
 #define AU_FL_KERNEL_ST                0xfC0C0000
 #define AU_FL_KERNEL_ND                0xfC1BFFFF
+#define AU_FL_ROOTFS_ST                0xFC1C0000
+#define AU_FL_ROOTFS_ND                0xFCFBFFFF
 
 static int au_usb_stor_curr_dev; /* current device */
 
 /* index of each file in the following arrays */
 #define IDX_FIRMWARE   0
 #define IDX_KERNEL     1
+#define IDX_ROOTFS     2
 
 /* max. number of files which could interest us */
-#define AU_MAXFILES 2
+#define AU_MAXFILES 3
 
 /* pointers to file names */
-char *aufile[AU_MAXFILES];
+char *aufile[AU_MAXFILES] = {
+       AU_FIRMWARE,
+       AU_KERNEL,
+       AU_ROOTFS
+};
 
 /* sizes of flash areas for each file */
-long ausize[AU_MAXFILES];
+long ausize[AU_MAXFILES] = {
+       (AU_FL_FIRMWARE_ND + 1) - AU_FL_FIRMWARE_ST,
+       (AU_FL_KERNEL_ND   + 1) - AU_FL_KERNEL_ST,
+       (AU_FL_ROOTFS_ND   + 1) - AU_FL_ROOTFS_ST,
+};
 
 /* array of flash areas start and end addresses */
-struct flash_layout aufl_layout[AU_MAXFILES] = { \
-       {AU_FL_FIRMWARE_ST, AU_FL_FIRMWARE_ND,}, \
-       {AU_FL_KERNEL_ST, AU_FL_KERNEL_ND,}, \
+struct flash_layout aufl_layout[AU_MAXFILES] = {
+       { AU_FL_FIRMWARE_ST,    AU_FL_FIRMWARE_ND, },
+       { AU_FL_KERNEL_ST,      AU_FL_KERNEL_ND,   },
+       { AU_FL_ROOTFS_ST,      AU_FL_ROOTFS_ND,   },
 };
 
+ulong totsize;
+
 /* where to load files into memory */
 #define LOAD_ADDR ((unsigned char *)0x00200000)
 
-/* the app is the largest image */
-#define MAX_LOADSZ ausize[IDX_KERNEL]
+/* the root file system is the largest image */
+#define MAX_LOADSZ ausize[IDX_ROOTFS]
 
 /*i2c address of the keypad status*/
 #define I2C_PSOC_KEYPAD_ADDR   0x53
@@ -134,9 +131,12 @@ extern int i2c_read (unsigned char, unsigned int, int , unsigned char* , int);
 extern int flash_sect_erase(ulong, ulong);
 extern int flash_sect_protect (int, ulong, ulong);
 extern int flash_write (char *, ulong, ulong);
-/* change char* to void* to shutup the compiler */
-extern block_dev_desc_t *get_dev (char*, int);
 extern int u_boot_hush_start(void);
+#ifdef CONFIG_PROGRESSBAR
+extern void show_progress(int, int);
+extern void lcd_puts (char *);
+extern void lcd_enable(void);
+#endif
 
 int au_check_cksum_valid(int idx, long nbytes)
 {
@@ -162,8 +162,7 @@ int au_check_cksum_valid(int idx, long nbytes)
 int au_check_header_valid(int idx, long nbytes)
 {
        image_header_t *hdr;
-       unsigned long checksum;
-       unsigned char buf[4];
+       unsigned long checksum, fsize;
 
        hdr = (image_header_t *)LOAD_ADDR;
        /* check the easy ones first */
@@ -176,10 +175,12 @@ int au_check_header_valid(int idx, long nbytes)
 #endif
        if (nbytes < sizeof(*hdr)) {
                printf ("Image %s bad header SIZE\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
        if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_PPC) {
                printf ("Image %s bad MAGIC or ARCH\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
        /* check the hdr CRC */
@@ -188,30 +189,46 @@ int au_check_header_valid(int idx, long nbytes)
 
        if (crc32 (0, (uchar *)hdr, sizeof(*hdr)) != checksum) {
                printf ("Image %s bad header checksum\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
        hdr->ih_hcrc = htonl(checksum);
        /* check the type - could do this all in one gigantic if() */
        if ((idx == IDX_FIRMWARE) && (hdr->ih_type != IH_TYPE_FIRMWARE)) {
                printf ("Image %s wrong type\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
        if ((idx == IDX_KERNEL) && (hdr->ih_type != IH_TYPE_KERNEL)) {
                printf ("Image %s wrong type\n", aufile[idx]);
+               ausize[idx] = 0;
+               return -1;
+       }
+       if ((idx == IDX_ROOTFS) &&
+               ( (hdr->ih_type != IH_TYPE_RAMDISK) && (hdr->ih_type != IH_TYPE_FILESYSTEM) )
+          ) {
+               printf ("Image %s wrong type\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
        /* recycle checksum */
        checksum = ntohl(hdr->ih_size);
-       /* for kernel and app the image header must also fit into flash */
-       if (idx != IDX_FIRMWARE)
+
+       fsize = checksum + sizeof(*hdr);
+       /* for kernel and ramdisk the image header must also fit into flash */
+       if (idx == IDX_KERNEL || hdr->ih_type == IH_TYPE_RAMDISK)
                checksum += sizeof(*hdr);
+
        /* check the size does not exceed space in flash. HUSH scripts */
-       /* all have ausize[] set to 0 */
        if ((ausize[idx] != 0) && (ausize[idx] < checksum)) {
                printf ("Image %s is bigger than FLASH\n", aufile[idx]);
+               ausize[idx] = 0;
                return -1;
        }
-       return 0;
+       /* Update with the real filesize */
+       ausize[idx] = fsize;
+
+       return checksum; /* return size to be written to flash */
 }
 
 int au_do_update(int idx, long sz)
@@ -256,8 +273,12 @@ int au_do_update(int idx, long sz)
        debug ("flash_sect_erase(%lx, %lx);\n", start, end);
        flash_sect_erase(start, end);
        wait_ms(100);
+#ifdef CONFIG_PROGRESSBAR
+       show_progress(end - start, totsize);
+#endif
+
        /* strip the header - except for the kernel and ramdisk */
-       if (hdr->ih_type == IH_TYPE_KERNEL) {
+       if (hdr->ih_type == IH_TYPE_KERNEL || hdr->ih_type == IH_TYPE_RAMDISK) {
                addr = (char *)hdr;
                off = sizeof(*hdr);
                nbytes = sizeof(*hdr) + ntohl(hdr->ih_size);
@@ -280,9 +301,13 @@ int au_do_update(int idx, long sz)
                return -1;
        }
 
-       /* check the dcrc of the copy */
+#ifdef CONFIG_PROGRESSBAR
+       show_progress(nbytes, totsize);
+#endif
+
+       /* check the data CRC of the copy */
        if (crc32 (0, (uchar *)(start + off), ntohl(hdr->ih_size)) != ntohl(hdr->ih_dcrc)) {
-               printf ("Image %s Bad Data Checksum After COPY\n", aufile[idx]);
+               printf ("Image %s Bad Data Checksum after COPY\n", aufile[idx]);
                return -1;
        }
 
@@ -302,10 +327,10 @@ int do_auto_update(void)
 {
        block_dev_desc_t *stor_dev;
        long sz;
-       int i, res, bitmap_first, cnt, old_ctrlc, got_ctrlc;
+       int i, res = 0, bitmap_first, cnt, old_ctrlc, got_ctrlc;
        char *env;
        long start, end;
-       char keypad_status1[2] = {0,0}, keypad_status2[2] = {0,0};
+       uchar keypad_status1[2] = {0,0}, keypad_status2[2] = {0,0};
 
        /*
         * Read keypad status
@@ -317,14 +342,11 @@ int do_auto_update(void)
        /*
         * Check keypad
         */
-       if ( !(keypad_status1[0] & KEYPAD_MASK_HI) ||
-             (keypad_status1[0] != keypad_status2[0])) {
-               return 0;
-       }
        if ( !(keypad_status1[1] & KEYPAD_MASK_LO) ||
              (keypad_status1[1] != keypad_status2[1])) {
                return 0;
        }
+
        au_usb_stor_curr_dev = -1;
        /* start USB */
        if (usb_stop() < 0) {
@@ -359,14 +381,6 @@ int do_auto_update(void)
                debug ("file_fat_detectfs failed\n");
        }
 
-       /* initialize the array of file names */
-       memset(aufile, 0, sizeof(aufile));
-       aufile[IDX_FIRMWARE] = AU_FIRMWARE;
-       aufile[IDX_KERNEL] = AU_KERNEL;
-       /* initialize the array of flash sizes */
-       memset(ausize, 0, sizeof(ausize));
-       ausize[IDX_FIRMWARE] = (AU_FL_FIRMWARE_ND + 1) - AU_FL_FIRMWARE_ST;
-       ausize[IDX_KERNEL] = (AU_FL_KERNEL_ND + 1) - AU_FL_KERNEL_ST;
        /*
         * now check whether start and end are defined using environment
         * variables.
@@ -381,8 +395,8 @@ int do_auto_update(void)
                end = simple_strtoul(env, NULL, 16);
        if (start >= 0 && end && end > start) {
                ausize[IDX_FIRMWARE] = (end + 1) - start;
-               aufl_layout[0].start = start;
-               aufl_layout[0].end = end;
+               aufl_layout[IDX_FIRMWARE].start = start;
+               aufl_layout[IDX_FIRMWARE].end = end;
        }
        start = -1;
        end = 0;
@@ -394,32 +408,73 @@ int do_auto_update(void)
                end = simple_strtoul(env, NULL, 16);
        if (start >= 0 && end && end > start) {
                ausize[IDX_KERNEL] = (end + 1) - start;
-               aufl_layout[1].start = start;
-               aufl_layout[1].end = end;
+               aufl_layout[IDX_KERNEL].start = start;
+               aufl_layout[IDX_KERNEL].end = end;
        }
+       start = -1;
+       end = 0;
+       env = getenv("rootfs_st");
+       if (env != NULL)
+               start = simple_strtoul(env, NULL, 16);
+       env = getenv("rootfs_nd");
+       if (env != NULL)
+               end = simple_strtoul(env, NULL, 16);
+       if (start >= 0 && end && end > start) {
+               ausize[IDX_ROOTFS] = (end + 1) - start;
+               aufl_layout[IDX_ROOTFS].start = start;
+               aufl_layout[IDX_ROOTFS].end = end;
+       }
+
        /* make certain that HUSH is runnable */
        u_boot_hush_start();
        /* make sure that we see CTRL-C and save the old state */
        old_ctrlc = disable_ctrlc(0);
 
        bitmap_first = 0;
-       /* just loop thru all the possible files */
+
+       /* validate the images first */
        for (i = 0; i < AU_MAXFILES; i++) {
+               ulong imsize;
                /* just read the header */
                sz = file_fat_read(aufile[i], LOAD_ADDR, sizeof(image_header_t));
                debug ("read %s sz %ld hdr %d\n",
                        aufile[i], sz, sizeof(image_header_t));
                if (sz <= 0 || sz < sizeof(image_header_t)) {
                        debug ("%s not found\n", aufile[i]);
+                       ausize[i] = 0;
                        continue;
                }
-               if (au_check_header_valid(i, sz) < 0) {
+               /* au_check_header_valid() updates ausize[] */
+               if ((imsize = au_check_header_valid(i, sz)) < 0) {
                        debug ("%s header not valid\n", aufile[i]);
                        continue;
                }
-               sz = file_fat_read(aufile[i], LOAD_ADDR, MAX_LOADSZ);
+               /* totsize accounts for image size and flash erase size */
+               totsize += (imsize + (aufl_layout[i].end - aufl_layout[i].start));
+       }
+
+#ifdef CONFIG_PROGRESSBAR
+       if (totsize) {
+               lcd_puts(" Update in progress\n");
+               lcd_enable();
+       }
+#endif
+
+       /* just loop thru all the possible files */
+       for (i = 0; i < AU_MAXFILES && totsize; i++) {
+               if (!ausize[i]) {
+                       continue;
+               }
+               sz = file_fat_read(aufile[i], LOAD_ADDR, ausize[i]);
+
                debug ("read %s sz %ld hdr %d\n",
                        aufile[i], sz, sizeof(image_header_t));
+
+               if (sz != ausize[i]) {
+                       printf ("%s: size %d read %d?\n", aufile[i], ausize[i], sz);
+                       continue;
+               }
+
                if (sz <= 0 || sz <= sizeof(image_header_t)) {
                        debug ("%s not found\n", aufile[i]);
                        continue;
@@ -443,8 +498,8 @@ int do_auto_update(void)
                        }
                        cnt++;
 #ifdef AU_TEST_ONLY
-               } while (res < 0 && cnt < 3);
-               if (cnt < 3)
+               } while (res < 0 && cnt < (AU_MAXFILES + 1));
+               if (cnt < (AU_MAXFILES + 1))
 #else
                } while (res < 0);
 #endif
@@ -452,6 +507,16 @@ int do_auto_update(void)
        usb_stop();
        /* restore the old state */
        disable_ctrlc(old_ctrlc);
+#ifdef CONFIG_PROGRESSBAR
+       if (totsize) {
+               if (!res) {
+                       lcd_puts("\n  Update completed\n");
+               } else {
+                       lcd_puts("\n   Update error\n");
+               }
+               lcd_enable();
+       }
+#endif
        return 0;
 }
 #endif /* CONFIG_AUTO_UPDATE */
index b2625160a5eeb1f36d199d213b8d30648b45ee2c..98b86d1834f6e3b8dea06febf124ae207a8ac757 100644 (file)
 
 #ifdef CONFIG_LCD
 
-#define SWAPPED_LCD
+#undef SWAPPED_LCD /* For the previous h/w version */
 /*
  *  The name of the device used for communication
  * with the PSoC.
  */
 #define PSOC_PSC       MPC5XXX_PSC2
-#define PSOC_BAUD      500000UL
+#define PSOC_BAUD      230400UL
 
 #define RTS_ASSERT     1
 #define RTS_NEGATE     0
@@ -181,10 +181,35 @@ void lcd_enable (void)
                udelay (PSOC_WAIT_TIME);
        }
        if (!retries) {
-               printf ("%s Error: PSoC doesn't respond on "
+               printf ("%s Warning: PSoC doesn't respond on "
                        "RTS NEGATE\n", __FUNCTION__);
        }
 
        return;
 }
+#ifdef CONFIG_PROGRESSBAR
+
+#define FONT_WIDTH      8 /* the same as VIDEO_FONT_WIDTH in video_font.h */
+void show_progress (int size, int tot)
+{
+       int cnt;
+       int i;
+       static int rc = 0;
+
+       rc += size;
+
+       cnt = ((LCD_WIDTH/FONT_WIDTH) * rc) / tot;
+
+       rc -= (cnt * tot) / (LCD_WIDTH/FONT_WIDTH);
+
+       for (i = 0; i < cnt; i++) {
+               lcd_putc(0xdc);
+       }
+
+       if (cnt) {
+               lcd_enable(); /* MCC200-specific - send the framebuffer to PSoC */
+       }
+}
+
+#endif
 #endif /* CONFIG_LCD */
diff --git a/board/motionpro/Makefile b/board/motionpro/Makefile
new file mode 100644 (file)
index 0000000..698ead1
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2003-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  := $(BOARD).o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(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/motionpro/config.mk b/board/motionpro/config.mk
new file mode 100644 (file)
index 0000000..e7934d2
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# (C) Copyright 2006-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
+#
+
+#
+# Promess Motion-PRO
+#
+
+TEXT_BASE = 0xfff00000
+
+PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)/board
diff --git a/board/motionpro/motionpro.c b/board/motionpro/motionpro.c
new file mode 100644 (file)
index 0000000..d60d233
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * (C) Copyright 2003-2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * modified for Promess PRO - by Andy Joseph, andy@promessdev.com
+ * modified for Promess PRO-Motion - by Robert McCullough, rob@promessdev.com
+ * modified by Chris M. Tumas 6/20/06 Change CAS latency to 2 from 3
+ * Also changed the refresh for 100Mhz operation
+ *
+ * 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 <mpc5xxx.h>
+
+
+/* Kollmorgen DPR initialization data */
+struct init_elem {
+       unsigned long addr;
+       unsigned len;
+       char *data;
+       } init_seq[] = {
+               {0x500003F2, 2, "\x86\x00"},            /* HW parameter */
+               {0x500003F0, 2, "\x00\x00"},
+               {0x500003EC, 4, "\x00\x80\xc1\x52"},    /* Magic word */
+       };
+
+/*
+ * Initialize Kollmorgen DPR
+ */
+static void kollmorgen_init(void)
+{
+       unsigned i, j;
+       vu_char *p;
+
+       for (i = 0; i < sizeof(init_seq) / sizeof(struct init_elem); ++i) {
+               p = (vu_char *)init_seq[i].addr;
+               for (j = 0; j < init_seq[i].len; ++j)
+                       *(p + j) = *(init_seq[i].data + j);
+       }
+
+       printf("DPR:   Kollmorgen DPR initialized\n");
+}
+
+
+/*
+ * Early board initalization.
+ */
+int board_early_init_r(void)
+{
+       /* Now, when we are in RAM, disable Boot Chipselect and enable CS0 */
+       *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 25);
+       *(vu_long *)MPC5XXX_ADDECR |= (1 << 16);
+
+       /* Initialize Kollmorgen DPR */
+       kollmorgen_init();
+
+       return 0;
+}
+
+
+#ifndef CFG_RAMBOOT
+/*
+ * Helper function to initialize SDRAM controller.
+ */
+static void sdram_start (int hi_addr)
+{
+       long hi_addr_bit = hi_addr ? 0x01000000 : 0;
+
+       /* unlock mode register */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000000 |
+                                               hi_addr_bit;
+
+       /* precharge all banks */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 |
+                                               hi_addr_bit;
+
+       /* auto refresh */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 |
+                                               hi_addr_bit;
+
+       /* auto refresh, second time */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 |
+                                               hi_addr_bit;
+
+       /* set mode register */
+       *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE;
+
+       /* normal operation */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
+}
+#endif /* !CFG_RAMBOOT */
+
+
+/*
+ * Initalize SDRAM - configure SDRAM controller, detect memory size.
+ */
+long int initdram (int board_type)
+{
+       ulong dramsize = 0;
+#ifndef CFG_RAMBOOT
+       ulong test1, test2;
+
+       /* configure SDRAM start/end for detection */
+       *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001e; /* 2G at 0x0 */
+       *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x80000000; /* disabled */
+
+       /* setup config registers */
+       *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
+       *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
+
+       sdram_start(0);
+       test1 = get_ram_size((long *)CFG_SDRAM_BASE, 0x80000000);
+       sdram_start(1);
+       test2 = get_ram_size((long *)CFG_SDRAM_BASE, 0x80000000);
+       if (test1 > test2) {
+               sdram_start(0);
+               dramsize = test1;
+       } else {
+               dramsize = test2;
+       }
+
+       /* memory smaller than 1MB is impossible */
+       if (dramsize < (1 << 20))
+               dramsize = 0;
+
+       /* set SDRAM CS0 size according to the amount of RAM found */
+       if (dramsize > 0) {
+               *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x13 +
+                       __builtin_ffs(dramsize >> 20) - 1;
+       } else {
+               *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
+       }
+
+       /* let SDRAM CS1 start right after CS0 and disable it */
+       *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize;
+
+#else /* !CFG_RAMBOOT */
+       /* retrieve size of memory connected to SDRAM CS0 */
+       dramsize = *(vu_long *)MPC5XXX_SDRAM_CS0CFG & 0xFF;
+       if (dramsize >= 0x13)
+               dramsize = (1 << (dramsize - 0x13)) << 20;
+       else
+               dramsize = 0;
+#endif /* CFG_RAMBOOT */
+
+       /* return total ram size */
+       return dramsize;
+}
+
+
+int checkboard (void)
+{
+       puts("Board: Promess Motion-PRO board\n");
+       return 0;
+}
diff --git a/board/motionpro/u-boot.lds b/board/motionpro/u-boot.lds
new file mode 100644 (file)
index 0000000..8fa9c0f
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * (C) Copyright 2003-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      :
+  {
+    cpu/mpc5xxx/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 = .);
+}
diff --git a/board/mpc832xemds/Makefile b/board/mpc832xemds/Makefile
new file mode 100644 (file)
index 0000000..5ec7a87
--- /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 pci.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(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/mpc832xemds/config.mk b/board/mpc832xemds/config.mk
new file mode 100644 (file)
index 0000000..6c3eca7
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (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
+#
+
+#
+# MPC832XEMDS
+#
+
+TEXT_BASE = 0xFE000000
diff --git a/board/mpc832xemds/mpc832xemds.c b/board/mpc832xemds/mpc832xemds.c
new file mode 100644 (file)
index 0000000..772da67
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@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.
+ */
+
+#include <common.h>
+#include <ioports.h>
+#include <mpc83xx.h>
+#include <i2c.h>
+#include <spd.h>
+#include <miiphy.h>
+#include <command.h>
+#if defined(CONFIG_PCI)
+#include <pci.h>
+#endif
+#if defined(CONFIG_SPD_EEPROM)
+#include <spd_sdram.h>
+#else
+#include <asm/mmu.h>
+#endif
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
+const qe_iop_conf_t qe_iop_conf_tab[] = {
+       /* ETH3 */
+       {1,  0, 1, 0, 1}, /* TxD0 */
+       {1,  1, 1, 0, 1}, /* TxD1 */
+       {1,  2, 1, 0, 1}, /* TxD2 */
+       {1,  3, 1, 0, 1}, /* TxD3 */
+       {1,  9, 1, 0, 1}, /* TxER */
+       {1, 12, 1, 0, 1}, /* TxEN */
+       {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */
+
+       {1,  4, 2, 0, 1}, /* RxD0 */
+       {1,  5, 2, 0, 1}, /* RxD1 */
+       {1,  6, 2, 0, 1}, /* RxD2 */
+       {1,  7, 2, 0, 1}, /* RxD3 */
+       {1,  8, 2, 0, 1}, /* RxER */
+       {1, 10, 2, 0, 1}, /* RxDV */
+       {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */
+       {1, 11, 2, 0, 1}, /* COL */
+       {1, 13, 2, 0, 1}, /* CRS */
+
+       /* ETH4 */
+       {1, 18, 1, 0, 1}, /* TxD0 */
+       {1, 19, 1, 0, 1}, /* TxD1 */
+       {1, 20, 1, 0, 1}, /* TxD2 */
+       {1, 21, 1, 0, 1}, /* TxD3 */
+       {1, 27, 1, 0, 1}, /* TxER */
+       {1, 30, 1, 0, 1}, /* TxEN */
+       {3,  6, 2, 0, 1}, /* TxCLK->CLK8 */
+
+       {1, 22, 2, 0, 1}, /* RxD0 */
+       {1, 23, 2, 0, 1}, /* RxD1 */
+       {1, 24, 2, 0, 1}, /* RxD2 */
+       {1, 25, 2, 0, 1}, /* RxD3 */
+       {1, 26, 1, 0, 1}, /* RxER */
+       {1, 28, 2, 0, 1}, /* Rx_DV */
+       {3, 31, 2, 0, 1}, /* RxCLK->CLK7 */
+       {1, 29, 2, 0, 1}, /* COL */
+       {1, 31, 2, 0, 1}, /* CRS */
+
+       {3,  4, 3, 0, 2}, /* MDIO */
+       {3,  5, 1, 0, 2}, /* MDC */
+
+       {0,  0, 0, 0, QE_IOP_TAB_END}, /* END of table */
+};
+
+int board_early_init_f(void)
+{
+       volatile u8 *bcsr = (volatile u8 *)CFG_BCSR;
+
+       /* Enable flash write */
+       bcsr[9] &= ~0x08;
+
+       return 0;
+}
+
+int fixed_sdram(void);
+
+long int initdram(int board_type)
+{
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       u32 msize = 0;
+
+       if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
+               return -1;
+
+       /* DDR SDRAM - Main SODIMM */
+       im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR;
+
+       msize = fixed_sdram();
+
+       puts("\n   DDR RAM: ");
+
+       /* return total bus SDRAM size(bytes)  -- DDR */
+       return (msize * 1024 * 1024);
+}
+
+/*************************************************************************
+ *  fixed sdram init -- doesn't use serial presence detect.
+ ************************************************************************/
+int fixed_sdram(void)
+{
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       u32 msize = 0;
+       u32 ddr_size;
+       u32 ddr_size_log2;
+
+       msize = CFG_DDR_SIZE;
+       for (ddr_size = msize << 20, ddr_size_log2 = 0;
+            (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) {
+               if (ddr_size & 1) {
+                       return -1;
+               }
+       }
+       im->sysconf.ddrlaw[0].ar =
+           LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
+#if (CFG_DDR_SIZE != 128)
+#warning Currenly any ddr size other than 128 is not supported
+#endif
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+       im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS;
+       im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG;
+       im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE2;
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       __asm__ __volatile__ ("sync");
+       udelay(200);
+
+       im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
+       __asm__ __volatile__ ("sync");
+       return msize;
+}
+
+int checkboard(void)
+{
+       puts("Board: Freescale MPC832XEMDS\n");
+       return 0;
+}
+
+#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 != NULL) {
+               *p++ = cpu_to_be32(bd->bi_memstart);
+               *p = cpu_to_be32(bd->bi_memsize);
+       }
+}
+#endif
diff --git a/board/mpc832xemds/pci.c b/board/mpc832xemds/pci.c
new file mode 100644 (file)
index 0000000..d0a407a
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ */
+
+/*
+ * PCI Configuration space access support for MPC83xx PCI Bridge
+ */
+#include <asm/mmu.h>
+#include <asm/io.h>
+#include <common.h>
+#include <pci.h>
+#include <i2c.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
+#include <asm/fsl_i2c.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_PCI)
+#define PCI_FUNCTION_CONFIG   0x44
+#define PCI_FUNCTION_CFG_LOCK 0x20
+
+/*
+ * Initialize PCI Devices, report devices found
+ */
+#ifndef CONFIG_PCI_PNP
+static struct pci_config_table pci_mpc83xxemds_config_table[] = {
+       {
+               PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+               pci_cfgfunc_config_device,
+               {PCI_ENET0_IOADDR,
+               PCI_ENET0_MEMADDR,
+               PCI_COMMON_MEMORY | PCI_COMMAND_MASTER}
+       },
+       {}
+}
+#endif
+static struct pci_controller hose[] = {
+       {
+#ifndef CONFIG_PCI_PNP
+               config_table:pci_mpc83xxemds_config_table,
+#endif
+       },
+};
+
+/**********************************************************************
+ * pci_init_board()
+ *********************************************************************/
+void pci_init_board(void)
+#ifdef CONFIG_PCISLAVE
+{
+       u16 reg16;
+       volatile immap_t *immr;
+       volatile law83xx_t *pci_law;
+       volatile pot83xx_t *pci_pot;
+       volatile pcictrl83xx_t *pci_ctrl;
+       volatile pciconf83xx_t *pci_conf;
+
+       immr = (immap_t *) CFG_IMMR;
+       pci_law = immr->sysconf.pcilaw;
+       pci_pot = immr->ios.pot;
+       pci_ctrl = immr->pci_ctrl;
+       pci_conf = immr->pci_conf;
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+       pci_ctrl[0].pitar0 = 0x0;
+       pci_ctrl[0].pibar0 = 0x0;
+       pci_ctrl[0].piwar0 = PIWAR_EN | PIWAR_RTT_SNOOP |
+           PIWAR_WTT_SNOOP | PIWAR_IWS_4K;
+
+       pci_ctrl[0].pitar1 = 0x0;
+       pci_ctrl[0].pibar1 = 0x0;
+       pci_ctrl[0].piebar1 = 0x0;
+       pci_ctrl[0].piwar1 &= ~PIWAR_EN;
+
+       pci_ctrl[0].pitar2 = 0x0;
+       pci_ctrl[0].pibar2 = 0x0;
+       pci_ctrl[0].piebar2 = 0x0;
+       pci_ctrl[0].piwar2 &= ~PIWAR_EN;
+
+       hose[0].first_busno = 0;
+       hose[0].last_busno = 0xff;
+       pci_setup_indirect(&hose[0],
+                          (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304));
+       reg16 = 0xff;
+
+       pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0),
+                                 PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0),
+                                  PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0),
+                                  PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(&hose[0], PCI_BDF(0, 0, 0),
+                                  PCI_LATENCY_TIMER, 0x80);
+
+       /*
+        * Unlock configuration lock in PCI function configuration register.
+        */
+       pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0),
+                                 PCI_FUNCTION_CONFIG, &reg16);
+       reg16 &= ~(PCI_FUNCTION_CFG_LOCK);
+       pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0),
+                                  PCI_FUNCTION_CONFIG, reg16);
+
+       printf("Enabled PCI 32bit Agent Mode\n");
+}
+#else
+{
+       volatile immap_t *immr;
+       volatile clk83xx_t *clk;
+       volatile law83xx_t *pci_law;
+       volatile pot83xx_t *pci_pot;
+       volatile pcictrl83xx_t *pci_ctrl;
+       volatile pciconf83xx_t *pci_conf;
+
+       u8 val8, orig_i2c_bus;
+       u16 reg16;
+       u32 val32;
+       u32 dev;
+
+       immr = (immap_t *) CFG_IMMR;
+       clk = (clk83xx_t *) & immr->clk;
+       pci_law = immr->sysconf.pcilaw;
+       pci_pot = immr->ios.pot;
+       pci_ctrl = immr->pci_ctrl;
+       pci_conf = immr->pci_conf;
+       /*
+        * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode
+        */
+       val32 = clk->occr;
+       udelay(2000);
+#if defined(PCI_66M)
+       clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2;
+       printf("PCI clock is 66MHz\n");
+#elif defined(PCI_33M)
+       clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2 |
+           OCCR_PCICD0 | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICR;
+       printf("PCI clock is 33MHz\n");
+#else
+       clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2;
+       printf("PCI clock is 66MHz\n");
+#endif
+       udelay(2000);
+
+       /*
+        * Configure PCI Local Access Windows
+        */
+       pci_law[0].bar = CFG_PCI_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_512M;
+
+       pci_law[1].bar = CFG_PCI_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_1M;
+
+       /*
+        * Configure PCI Outbound Translation Windows
+        */
+
+       /* PCI mem space - prefetch */
+       pci_pot[0].potar = (CFG_PCI_MEM_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[0].pobar = (CFG_PCI_MEM_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[0].pocmr =
+           POCMR_EN | POCMR_SE | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI mmio - non-prefetch mem space */
+       pci_pot[1].potar = (CFG_PCI_MMIO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[1].pobar = (CFG_PCI_MMIO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[1].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI IO space */
+       pci_pot[2].potar = (CFG_PCI_IO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[2].pobar = (CFG_PCI_IO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[2].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK);
+
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+       pci_ctrl[0].pitar1 = (CFG_PCI_SLV_MEM_LOCAL >> 12) & PITAR_TA_MASK;
+       pci_ctrl[0].pibar1 = (CFG_PCI_SLV_MEM_BUS >> 12) & PIBAR_MASK;
+       pci_ctrl[0].piebar1 = 0x0;
+       pci_ctrl[0].piwar1 =
+           PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP |
+           PIWAR_IWS_2G;
+
+       /*
+        * Assign PIB PMC slot to desired PCI bus
+        */
+
+       /* Switch temporarily to I2C bus #2 */
+       orig_i2c_bus = i2c_get_bus_num();
+       i2c_set_bus_num(1);
+
+       val8 = 0;
+       i2c_write(0x23, 0x6, 1, &val8, 1);
+       i2c_write(0x23, 0x7, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x23, 0x2, 1, &val8, 1);
+       i2c_write(0x23, 0x3, 1, &val8, 1);
+
+       val8 = 0;
+       i2c_write(0x26, 0x6, 1, &val8, 1);
+       val8 = 0x34;
+       i2c_write(0x26, 0x7, 1, &val8, 1);
+
+       val8 = 0xf9;            /* PMC2, PMC3 slot to PCI bus */
+       i2c_write(0x26, 0x2, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x26, 0x3, 1, &val8, 1);
+
+       val8 = 0;
+       i2c_write(0x27, 0x6, 1, &val8, 1);
+       i2c_write(0x27, 0x7, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x27, 0x2, 1, &val8, 1);
+       val8 = 0xef;
+       i2c_write(0x27, 0x3, 1, &val8, 1);
+       asm("eieio");
+
+       /* Reset to original I2C bus */
+       i2c_set_bus_num(orig_i2c_bus);
+
+       /*
+        * Release PCI RST Output signal
+        */
+       udelay(2000);
+       pci_ctrl[0].gcr = 1;
+       udelay(2000);
+
+       hose[0].first_busno = 0;
+       hose[0].last_busno = 0xff;
+
+       /* PCI memory prefetch space */
+       pci_set_region(hose[0].regions + 0,
+                      CFG_PCI_MEM_BASE,
+                      CFG_PCI_MEM_PHYS,
+                      CFG_PCI_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH);
+
+       /* PCI memory space */
+       pci_set_region(hose[0].regions + 1,
+                      CFG_PCI_MMIO_BASE,
+                      CFG_PCI_MMIO_PHYS, CFG_PCI_MMIO_SIZE, PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose[0].regions + 2,
+                      CFG_PCI_IO_BASE,
+                      CFG_PCI_IO_PHYS, CFG_PCI_IO_SIZE, PCI_REGION_IO);
+
+       /* System memory space */
+       pci_set_region(hose[0].regions + 3,
+                      CFG_PCI_SLV_MEM_LOCAL,
+                      CFG_PCI_SLV_MEM_BUS,
+                      CFG_PCI_SLV_MEM_SIZE,
+                      PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       hose[0].region_count = 4;
+
+       pci_setup_indirect(&hose[0],
+                          (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304));
+
+       pci_register_hose(hose);
+
+       /*
+        * Write command register
+        */
+       reg16 = 0xff;
+       dev = PCI_BDF(0, 0, 0);
+       pci_hose_read_config_word(&hose[0], dev, PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(&hose[0], dev, PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(&hose[0], dev, PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(&hose[0], dev, PCI_LATENCY_TIMER, 0x80);
+       pci_hose_write_config_byte(&hose[0], dev, PCI_CACHE_LINE_SIZE, 0x08);
+
+       printf("PCI 32bit bus on PMC2 & PMC3\n");
+
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+}
+#endif                         /* CONFIG_PCISLAVE */
+
+#ifdef CONFIG_OF_FLAT_TREE
+void
+ft_pci_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
+       if (p != NULL) {
+               p[0] = hose[0].first_busno;
+               p[1] = hose[0].last_busno;
+       }
+}
+#endif                         /* CONFIG_OF_FLAT_TREE */
+#endif                         /* CONFIG_PCI */
diff --git a/board/mpc832xemds/u-boot.lds b/board/mpc832xemds/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 873bdd01cd66527494f9112d222dbeeea436a8b9..071591ed8356fc0de728812a5744dceb998d268b 100644 (file)
@@ -119,6 +119,20 @@ int fixed_sdram(void)
 #if (CFG_DDR_SIZE != 256)
 #warning Currenly any ddr size other than 256 is not supported
 #endif
+#ifdef CONFIG_DDR_II
+       im->ddr.csbnds[2].csbnds = CFG_DDR_CS2_BNDS;
+       im->ddr.cs_config[2] = CFG_DDR_CS2_CONFIG;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG;
+       im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE2;
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+#else
        im->ddr.csbnds[2].csbnds = 0x0000000f;
        im->ddr.cs_config[2] = CFG_DDR_CONFIG;
 
@@ -143,6 +157,7 @@ int fixed_sdram(void)
        im->ddr.sdram_mode = CFG_DDR_MODE;
 
        im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+#endif
        udelay(200);
 
        /* enable DDR controller */
@@ -239,7 +254,7 @@ void sdram_init(void)
 #else
 void sdram_init(void)
 {
-       put("SDRAM on Local Bus is NOT available!\n");
+       puts("   SDRAM on Local Bus is NOT available!\n");
 }
 #endif
 
index 2e113118bd75d0aff0a8d3c9e8c45272c3b8335c..1901fdc2cef9891f3127f434d5128d53c32355cf 100644 (file)
 #
 
 #
-# MPC8349ITX
+# MPC8349E-mITX and MPC8349E-mITX-GP
 #
 
+sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
+
+ifndef TEXT_BASE
 TEXT_BASE  =   0xFEF00000
+endif
 
 ifneq ($(OBJTREE),$(SRCTREE))
 # We are building u-boot in a separate directory, use generated
index 4838e707f095dbb77428b0ccfb3552c07dcfe37d..2b3ded17629d9ba2bceb98399d59970cedec119f 100644 (file)
@@ -134,88 +134,6 @@ volatile static struct pci_controller hose[] = {
 };
 #endif                         /* CONFIG_PCI */
 
-/* If MPC8349E-mITX is soldered with SDRAM, then initialize it. */
-
-void sdram_init(void)
-{
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
-       volatile lbus83xx_t *lbc = &immap->lbus;
-
-#if defined(CFG_BR2_PRELIM) \
-       && defined(CFG_OR2_PRELIM) \
-       && defined(CFG_LBLAWBAR2_PRELIM) \
-       && defined(CFG_LBLAWAR2_PRELIM) \
-       && !defined(CONFIG_COMPACT_FLASH)
-
-       uint *sdram_addr = (uint *) CFG_LBC_SDRAM_BASE;
-
-       puts("\n   SDRAM on Local Bus: ");
-       print_size(CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n");
-
-       /*
-        * Setup SDRAM Base and Option Registers, already done in cpu_init.c
-        */
-
-       /*setup mtrpt, lsrt and lbcr for LB bus */
-       lbc->lbcr = CFG_LBC_LBCR;
-       lbc->mrtpr = CFG_LBC_MRTPR;
-       lbc->lsrt = CFG_LBC_LSRT;
-       asm("sync");
-
-       /*
-        * Configure the SDRAM controller Machine Mode register.
-        */
-       lbc->lsdmr = CFG_LBC_LSDMR_5;   /* 0x40636733; normal operation */
-
-       lbc->lsdmr = CFG_LBC_LSDMR_1;   /*0x68636733; precharge all the banks */
-       asm("sync");
-       *sdram_addr = 0xff;
-       udelay(100);
-
-       lbc->lsdmr = CFG_LBC_LSDMR_2;   /*0x48636733; auto refresh */
-       asm("sync");
-       *sdram_addr = 0xff; /*1 time*/
-       udelay(100);
-       *sdram_addr = 0xff; /*2 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*3 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*4 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*5 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*6 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*7 times*/
-       udelay(100);
-       *sdram_addr = 0xff; /*8 times*/
-       udelay(100);
-
-       lbc->lsdmr = CFG_LBC_LSDMR_4;   /*0x58636733;mode register write operation */
-       asm("sync");
-       *sdram_addr = 0xff;
-       udelay(100);
-
-       lbc->lsdmr = CFG_LBC_LSDMR_5;   /*0x40636733;normal operation */
-       asm("sync");
-       *sdram_addr = 0xff;
-       udelay(100);
-
-#else
-       puts("SDRAM on Local Bus is NOT available!\n");
-
-#ifdef CFG_BR2_PRELIM
-       lbc->bank[2].br = CFG_BR2_PRELIM;
-       lbc->bank[2].or = CFG_OR2_PRELIM;
-#endif
-
-#ifdef CFG_BR3_PRELIM
-       lbc->bank[3].br = CFG_BR3_PRELIM;
-       lbc->bank[3].or = CFG_OR3_PRELIM;
-#endif
-#endif
-}
-
 long int initdram(int board_type)
 {
        volatile immap_t *im = (immap_t *) CFG_IMMR;
@@ -243,18 +161,18 @@ long int initdram(int board_type)
                ddr_enable_ecc(msize * 1048576);
 #endif
 
-       /*
-        * Initialize SDRAM if it is on local bus.
-        */
-       sdram_init();
        puts("   DDR RAM: ");
-       /* return total bus SDRAM size(bytes)  -- DDR */
+       /* return total bus RAM size(bytes) */
        return msize * 1024 * 1024;
 }
 
 int checkboard(void)
 {
+#ifdef CONFIG_MPC8349ITX
        puts("Board: Freescale MPC8349E-mITX\n");
+#else
+       puts("Board: Freescale MPC8349E-mITX-GP\n");
+#endif
 
        return 0;
 }
@@ -267,6 +185,7 @@ int checkboard(void)
  */
 int misc_init_f(void)
 {
+#ifdef CONFIG_VSC7385
        volatile u32 *vsc7385_cpuctrl;
 
        /* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register.  The power up
@@ -286,6 +205,7 @@ int misc_init_f(void)
 
        vsc7385_cpuctrl = (volatile u32 *)(CFG_VSC7385_BASE + 0x1c0c0);
        *vsc7385_cpuctrl |= 0x0c;
+#endif
 
 #ifdef CONFIG_COMPACT_FLASH
        /* UPM Table Configuration Code */
@@ -345,7 +265,7 @@ int misc_init_r(void)
 
 #ifdef CONFIG_HARD_I2C
 
-       unsigned int orig_bus = i2c_get_bus_num();;
+       unsigned int orig_bus = i2c_get_bus_num();
        u8 i2c_data;
 
 #ifdef CFG_I2C_RTC_ADDR
@@ -355,9 +275,19 @@ int misc_init_r(void)
 #ifdef CFG_I2C_EEPROM_ADDR
        static u8 eeprom_data[] =       /* HRCW data */
        {
-               0xaa, 0x55, 0xaa,
-               0x7c, 0x02, 0x40, 0x05, 0x04, 0x00, 0x00,
-               0x7c, 0x02, 0x41, 0xb4, 0x60, 0xa0, 0x00,
+               0xAA, 0x55, 0xAA,       /* Preamble */
+               0x7C,                   /* ACS=0, BYTE_EN=1111, CONT=1 */
+               0x02, 0x40,             /* RCWL ADDR=0x0_0900 */
+               (CFG_HRCW_LOW >> 24) & 0xFF,
+               (CFG_HRCW_LOW >> 16) & 0xFF,
+               (CFG_HRCW_LOW >> 8) & 0xFF,
+               CFG_HRCW_LOW & 0xFF,
+               0x7C,                   /* ACS=0, BYTE_EN=1111, CONT=1 */
+               0x02, 0x41,             /* RCWH ADDR=0x0_0904 */
+               (CFG_HRCW_HIGH >> 24) & 0xFF,
+               (CFG_HRCW_HIGH >> 16) & 0xFF,
+               (CFG_HRCW_HIGH >> 8) & 0xFF,
+               CFG_HRCW_HIGH & 0xFF
        };
 
        u8 data[sizeof(eeprom_data)];
index ddc1047c6188d1109bf0a02d1fad8f20ca9c4b12..535884cb509d1e54192e1c0d838219e44d70a266 100644 (file)
@@ -90,11 +90,18 @@ const qe_iop_conf_t qe_iop_conf_tab[] = {
 
 int board_early_init_f(void)
 {
-       volatile u8 *bcsr = (volatile u8 *)CFG_BCSR;
+
+       u8 *bcsr = (u8 *)CFG_BCSR;
+       const immap_t *immr = (immap_t *)CFG_IMMR;
 
        /* Enable flash write */
        bcsr[0xa] &= ~0x04;
 
+       /* Disable G1TXCLK, G2TXCLK h/w buffers (rev.2 h/w bug workaround) */
+       if (immr->sysconf.spridr == SPR_8360_REV20 ||
+           immr->sysconf.spridr == SPR_8360E_REV20)
+               bcsr[0xe] = 0x30;
+
        return 0;
 }
 
@@ -158,6 +165,20 @@ int fixed_sdram(void)
 #if (CFG_DDR_SIZE != 256)
 #warning Currenly any ddr size other than 256 is not supported
 #endif
+#ifdef CONFIG_DDR_II
+       im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS;
+       im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG;
+       im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE2;
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+#else
        im->ddr.csbnds[0].csbnds = 0x00000007;
        im->ddr.csbnds[1].csbnds = 0x0008000f;
 
@@ -170,6 +191,7 @@ int fixed_sdram(void)
 
        im->ddr.sdram_mode = CFG_DDR_MODE;
        im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+#endif
        udelay(200);
        im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
 
index 15a48dcf4071f9ab6779030bb9c6df32a8d1a726..67cd70981ca32008c278d12f130b3ce0532948af 100644 (file)
@@ -18,6 +18,9 @@
 #include <common.h>
 #include <pci.h>
 #include <i2c.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
 
 #include <asm/fsl_i2c.h>
 
index ff1190ab21294cc24533d8a30693f26c72f933aa..1d28513d87e7963847957788f68dae9e2083065e 100644 (file)
@@ -48,7 +48,7 @@ int testdram (void)
 
 #include <common.h>
 #include <asm/processor.h>
-#include <405gp_i2c.h>
+#include <4xx_i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index 34f328999d1d27b7ac8df257a791e3cd3be20964..4b1c1c06694be56a7e61d010aa8c4e350dc14b75 100644 (file)
@@ -65,7 +65,7 @@
 #include <common.h>
 #include "mip405.h"
 #include <asm/processor.h>
-#include <405gp_i2c.h>
+#include <4xx_i2c.h>
 #include <miiphy.h>
 #include "../common/common_util.h"
 #include <i2c.h>
@@ -73,9 +73,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-extern block_dev_desc_t * scsi_get_dev(int dev);
-extern block_dev_desc_t * ide_get_dev(int dev);
-
 #undef SDRAM_DEBUG
 #define ENABLE_ECC /* for ecc boards */
 #define FALSE           0
diff --git a/board/prodrive/p3mx/p3mx.h b/board/prodrive/p3mx/p3mx.h
new file mode 100644 (file)
index 0000000..1caae6b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * (C) Copyright 2005
+ *
+ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V. roel.loeffen@prodrive.nl
+ *
+ * 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 __P3MX_H__
+#define __P3MX_H__
+
+#define LED_OFF                1
+#define LED_GREEN      2
+#define LED_RED                3
+#define LED_ORANGE     4
+
+#endif /* __P3MX_H__ */
index 859dd7afe56bb1afbb7aa1b8341984098de5571f..1e3dffb1ee11038f211379f8a6a4a235899af619 100644 (file)
  */
 #include <common.h>
 #include <ppc4xx.h>
-#if defined(CONFIG_440)
-#   include <440_i2c.h>
-#else
-#   include <405gp_i2c.h>
-#endif
+#include <4xx_i2c.h>
 #include <i2c.h>
-#include <440_i2c.h>
 #include <command.h>
 #include "ppc440gx_i2c.h"
 
index cd4fc86661f85a87521e72b109f08125bdd77849..10000f5ba9b0bf55058cc249f7198213bec2817d 100644 (file)
  */
 #include <common.h>
 #include <ppc4xx.h>
-#if defined(CONFIG_440)
-#   include <440_i2c.h>
-#else
-#   include <405gp_i2c.h>
-#endif
+#include <4xx_i2c.h>
 #include <i2c.h>
 
 #ifdef CONFIG_HARD_I2C
diff --git a/board/sbc8349/Makefile b/board/sbc8349/Makefile
new file mode 100644 (file)
index 0000000..02cf569
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2006 Wind River Systems, Inc.
+#
+# 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 pci.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(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/sbc8349/config.mk b/board/sbc8349/config.mk
new file mode 100644 (file)
index 0000000..05fa5a0
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2006 Wind River Systems, Inc.
+#
+# 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
+#
+
+#
+# SBC8349E
+#
+
+TEXT_BASE  =   0xFFF00000
diff --git a/board/sbc8349/pci.c b/board/sbc8349/pci.c
new file mode 100644 (file)
index 0000000..eadf230
--- /dev/null
@@ -0,0 +1,348 @@
+/*
+ * pci.c -- WindRiver SBC8349 PCI board support.
+ * Copyright (c) 2006 Wind River Systems, Inc.
+ *
+ * Based on MPC8349 PCI support but w/o PIB related code.
+ *
+ * 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 <asm/mmu.h>
+#include <common.h>
+#include <asm/global_data.h>
+#include <pci.h>
+#include <asm/mpc8349_pci.h>
+#include <i2c.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_PCI
+
+/* System RAM mapped to PCI space */
+#define CONFIG_PCI_SYS_MEM_BUS CFG_SDRAM_BASE
+#define CONFIG_PCI_SYS_MEM_PHYS        CFG_SDRAM_BASE
+
+#ifndef CONFIG_PCI_PNP
+static struct pci_config_table pci_mpc8349emds_config_table[] = {
+       {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+        PCI_IDSEL_NUMBER, PCI_ANY_ID,
+        pci_cfgfunc_config_device, {PCI_ENET0_IOADDR,
+                                    PCI_ENET0_MEMADDR,
+                                    PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
+               }
+       },
+       {}
+};
+#endif
+
+static struct pci_controller pci_hose[] = {
+       {
+#ifndef CONFIG_PCI_PNP
+       config_table:pci_mpc8349emds_config_table,
+#endif
+       },
+       {
+#ifndef CONFIG_PCI_PNP
+       config_table:pci_mpc8349emds_config_table,
+#endif
+       }
+};
+
+/**************************************************************************
+ * pci_init_board()
+ *
+ * NOTICE: PCI2 is not supported. There is only one
+ * physical PCI slot on the board.
+ *
+ */
+void
+pci_init_board(void)
+{
+       volatile immap_t *      immr;
+       volatile clk83xx_t *    clk;
+       volatile law83xx_t *    pci_law;
+       volatile pot83xx_t *    pci_pot;
+       volatile pcictrl83xx_t *        pci_ctrl;
+       volatile pciconf83xx_t *        pci_conf;
+       u16 reg16;
+       u32 reg32;
+       u32 dev;
+       struct  pci_controller * hose;
+
+       immr = (immap_t *)CFG_IMMR;
+       clk = (clk83xx_t *)&immr->clk;
+       pci_law = immr->sysconf.pcilaw;
+       pci_pot = immr->ios.pot;
+       pci_ctrl = immr->pci_ctrl;
+       pci_conf = immr->pci_conf;
+
+       hose = &pci_hose[0];
+
+       /*
+        * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode
+        */
+
+       reg32 = clk->occr;
+       udelay(2000);
+       clk->occr = 0xff000000;
+       udelay(2000);
+
+       /*
+        * Release PCI RST Output signal
+        */
+       pci_ctrl[0].gcr = 0;
+       udelay(2000);
+       pci_ctrl[0].gcr = 1;
+
+#ifdef CONFIG_MPC83XX_PCI2
+       pci_ctrl[1].gcr = 0;
+       udelay(2000);
+       pci_ctrl[1].gcr = 1;
+#endif
+
+       /* We need to wait at least a 1sec based on PCI specs */
+       {
+               int i;
+
+               for (i = 0; i < 1000; ++i)
+                       udelay (1000);
+       }
+
+       /*
+        * Configure PCI Local Access Windows
+        */
+       pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G;
+
+       pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_4M;
+
+       /*
+        * Configure PCI Outbound Translation Windows
+        */
+
+       /* PCI1 mem space - prefetch */
+       pci_pot[0].potar = (CFG_PCI1_MEM_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[0].pobar = (CFG_PCI1_MEM_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[0].pocmr = POCMR_EN | POCMR_PREFETCH_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI1 IO space */
+       pci_pot[1].potar = (CFG_PCI1_IO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[1].pobar = (CFG_PCI1_IO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[1].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK);
+
+       /* PCI1 mmio - non-prefetch mem space */
+       pci_pot[2].potar = (CFG_PCI1_MMIO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[2].pobar = (CFG_PCI1_MMIO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[2].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+
+       /* we need RAM mapped to PCI space for the devices to
+        * access main memory */
+       pci_ctrl[0].pitar1 = 0x0;
+       pci_ctrl[0].pibar1 = 0x0;
+       pci_ctrl[0].piebar1 = 0x0;
+       pci_ctrl[0].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       /* PCI memory prefetch space */
+       pci_set_region(hose->regions + 0,
+                      CFG_PCI1_MEM_BASE,
+                      CFG_PCI1_MEM_PHYS,
+                      CFG_PCI1_MEM_SIZE,
+                      PCI_REGION_MEM|PCI_REGION_PREFETCH);
+
+       /* PCI memory space */
+       pci_set_region(hose->regions + 1,
+                      CFG_PCI1_MMIO_BASE,
+                      CFG_PCI1_MMIO_PHYS,
+                      CFG_PCI1_MMIO_SIZE,
+                      PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose->regions + 2,
+                      CFG_PCI1_IO_BASE,
+                      CFG_PCI1_IO_PHYS,
+                      CFG_PCI1_IO_SIZE,
+                      PCI_REGION_IO);
+
+       /* System memory space */
+       pci_set_region(hose->regions + 3,
+                      CONFIG_PCI_SYS_MEM_BUS,
+                      CONFIG_PCI_SYS_MEM_PHYS,
+                      gd->ram_size,
+                      PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       hose->region_count = 4;
+
+       pci_setup_indirect(hose,
+                          (CFG_IMMR+0x8300),
+                          (CFG_IMMR+0x8304));
+
+       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);
+
+#ifdef CONFIG_MPC83XX_PCI2
+       hose = &pci_hose[1];
+
+       /*
+        * Configure PCI Outbound Translation Windows
+        */
+
+       /* PCI2 mem space - prefetch */
+       pci_pot[3].potar = (CFG_PCI2_MEM_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[3].pobar = (CFG_PCI2_MEM_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[3].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_PREFETCH_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI2 IO space */
+       pci_pot[4].potar = (CFG_PCI2_IO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[4].pobar = (CFG_PCI2_IO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[4].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK);
+
+       /* PCI2 mmio - non-prefetch mem space */
+       pci_pot[5].potar = (CFG_PCI2_MMIO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[5].pobar = (CFG_PCI2_MMIO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[5].pocmr = POCMR_EN | POCMR_PCI2 | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+
+       /* we need RAM mapped to PCI space for the devices to
+        * access main memory */
+       pci_ctrl[1].pitar1 = 0x0;
+       pci_ctrl[1].pibar1 = 0x0;
+       pci_ctrl[1].piebar1 = 0x0;
+       pci_ctrl[1].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       hose->first_busno = pci_hose[0].last_busno + 1;
+       hose->last_busno = 0xff;
+
+       /* PCI memory prefetch space */
+       pci_set_region(hose->regions + 0,
+                      CFG_PCI2_MEM_BASE,
+                      CFG_PCI2_MEM_PHYS,
+                      CFG_PCI2_MEM_SIZE,
+                      PCI_REGION_MEM|PCI_REGION_PREFETCH);
+
+       /* PCI memory space */
+       pci_set_region(hose->regions + 1,
+                      CFG_PCI2_MMIO_BASE,
+                      CFG_PCI2_MMIO_PHYS,
+                      CFG_PCI2_MMIO_SIZE,
+                      PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose->regions + 2,
+                      CFG_PCI2_IO_BASE,
+                      CFG_PCI2_IO_PHYS,
+                      CFG_PCI2_IO_SIZE,
+                      PCI_REGION_IO);
+
+       /* System memory space */
+       pci_set_region(hose->regions + 3,
+                      CONFIG_PCI_SYS_MEM_BUS,
+                      CONFIG_PCI_SYS_MEM_PHYS,
+                      gd->ram_size,
+                      PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       hose->region_count = 4;
+
+       pci_setup_indirect(hose,
+                          (CFG_IMMR+0x8380),
+                          (CFG_IMMR+0x8384));
+
+       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);
+
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+#endif
+
+}
+
+#ifdef CONFIG_OF_FLAT_TREE
+void
+ft_pci_setup(void *blob, bd_t *bd)
+{
+               u32 *p;
+               int len;
+
+               p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
+               if (p != NULL) {
+                       p[0] = pci_hose[0].first_busno;
+                       p[1] = pci_hose[0].last_busno;
+               }
+
+#ifdef CONFIG_MPC83XX_PCI2
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len);
+       if (p != NULL) {
+               p[0] = pci_hose[1].first_busno;
+               p[1] = pci_hose[1].last_busno;
+       }
+#endif
+}
+#endif /* CONFIG_OF_FLAT_TREE */
+#endif /* CONFIG_PCI */
diff --git a/board/sbc8349/sbc8349.c b/board/sbc8349/sbc8349.c
new file mode 100644 (file)
index 0000000..4cd447e
--- /dev/null
@@ -0,0 +1,585 @@
+/*
+ * sbc8349.c -- WindRiver SBC8349 board support.
+ * Copyright (c) 2006-2007 Wind River Systems, Inc.
+ *
+ * Paul Gortmaker <paul.gortmaker@windriver.com>
+ * Based on board/mpc8349emds/mpc8349emds.c (and previous 834x releases.)
+ *
+ * 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 <ioports.h>
+#include <mpc83xx.h>
+#include <asm/mpc8349_pci.h>
+#include <i2c.h>
+#include <spd.h>
+#include <miiphy.h>
+#include <command.h>
+#if defined(CONFIG_SPD_EEPROM)
+#include <spd_sdram.h>
+#endif
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
+int fixed_sdram(void);
+void sdram_init(void);
+
+#if defined(CONFIG_DDR_ECC) && defined(CONFIG_MPC83XX)
+void ddr_enable_ecc(unsigned int dram_size);
+#endif
+
+#ifdef CONFIG_BOARD_EARLY_INIT_F
+int board_early_init_f (void)
+{
+       return 0;
+}
+#endif
+
+#define ns2clk(ns) (ns / (1000000000 / CONFIG_8349_CLKIN) + 1)
+
+long int initdram (int board_type)
+{
+       volatile immap_t *im = (immap_t *)CFG_IMMR;
+       u32 msize = 0;
+
+       if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
+               return -1;
+
+       puts("Initializing\n");
+
+       /* DDR SDRAM - Main SODIMM */
+       im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR;
+#if defined(CONFIG_SPD_EEPROM)
+       msize = spd_sdram();
+#else
+       msize = fixed_sdram();
+#endif
+       /*
+        * Initialize SDRAM if it is on local bus.
+        */
+       sdram_init();
+
+#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+       /*
+        * Initialize and enable DDR ECC.
+        */
+       ddr_enable_ecc(msize * 1024 * 1024);
+#endif
+       puts("   DDR RAM: ");
+       /* return total bus SDRAM size(bytes)  -- DDR */
+       return (msize * 1024 * 1024);
+}
+
+#if !defined(CONFIG_SPD_EEPROM)
+/*************************************************************************
+ *  fixed sdram init -- doesn't use serial presence detect.
+ ************************************************************************/
+int fixed_sdram(void)
+{
+       volatile immap_t *im = (immap_t *)CFG_IMMR;
+       u32 msize = 0;
+       u32 ddr_size;
+       u32 ddr_size_log2;
+
+       msize = CFG_DDR_SIZE;
+       for (ddr_size = msize << 20, ddr_size_log2 = 0;
+            (ddr_size > 1);
+            ddr_size = ddr_size>>1, ddr_size_log2++) {
+               if (ddr_size & 1) {
+                       return -1;
+               }
+       }
+       im->sysconf.ddrlaw[0].bar = ((CFG_DDR_SDRAM_BASE>>12) & 0xfffff);
+       im->sysconf.ddrlaw[0].ar = LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
+
+#if (CFG_DDR_SIZE != 256)
+#warning Currently any ddr size other than 256 is not supported
+#endif
+       im->ddr.csbnds[2].csbnds = 0x0000000f;
+       im->ddr.cs_config[2] = CFG_DDR_CONFIG;
+
+       /* currently we use only one CS, so disable the other banks */
+       im->ddr.cs_config[0] = 0;
+       im->ddr.cs_config[1] = 0;
+       im->ddr.cs_config[3] = 0;
+
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+
+       im->ddr.sdram_cfg =
+               SDRAM_CFG_SREN
+#if defined(CONFIG_DDR_2T_TIMING)
+               | SDRAM_CFG_2T_EN
+#endif
+               | 2 << SDRAM_CFG_SDRAM_TYPE_SHIFT;
+#if defined (CONFIG_DDR_32BIT)
+       /* for 32-bit mode burst length is 8 */
+       im->ddr.sdram_cfg |= (SDRAM_CFG_32_BE | SDRAM_CFG_8_BE);
+#endif
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       udelay(200);
+
+       /* enable DDR controller */
+       im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
+       return msize;
+}
+#endif/*!CFG_SPD_EEPROM*/
+
+
+int checkboard (void)
+{
+       puts("Board: Wind River SBC834x\n");
+       return 0;
+}
+
+/*
+ * if board is fitted with SDRAM
+ */
+#if defined(CFG_BR2_PRELIM)  \
+       && defined(CFG_OR2_PRELIM) \
+       && defined(CFG_LBLAWBAR2_PRELIM) \
+       && defined(CFG_LBLAWAR2_PRELIM)
+/*
+ * Initialize SDRAM memory on the Local Bus.
+ */
+
+void sdram_init(void)
+{
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile lbus83xx_t *lbc= &immap->lbus;
+       uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE;
+
+       puts("\n   SDRAM on Local Bus: ");
+       print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n");
+
+       /*
+        * Setup SDRAM Base and Option Registers, already done in cpu_init.c
+        */
+
+       /* setup mtrpt, lsrt and lbcr for LB bus */
+       lbc->lbcr = CFG_LBC_LBCR;
+       lbc->mrtpr = CFG_LBC_MRTPR;
+       lbc->lsrt = CFG_LBC_LSRT;
+       asm("sync");
+
+       /*
+        * Configure the SDRAM controller Machine Mode Register.
+        */
+       lbc->lsdmr = CFG_LBC_LSDMR_5; /* 0x40636733; normal operation */
+
+       lbc->lsdmr = CFG_LBC_LSDMR_1; /* 0x68636733; precharge all the banks */
+       asm("sync");
+       *sdram_addr = 0xff;
+       udelay(100);
+
+       lbc->lsdmr = CFG_LBC_LSDMR_2; /* 0x48636733; auto refresh */
+       asm("sync");
+       /*1 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*2 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*3 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*4 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*5 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*6 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*7 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+       /*8 times*/
+       *sdram_addr = 0xff;
+       udelay(100);
+
+       /* 0x58636733; mode register write operation */
+       lbc->lsdmr = CFG_LBC_LSDMR_4;
+       asm("sync");
+       *sdram_addr = 0xff;
+       udelay(100);
+
+       lbc->lsdmr = CFG_LBC_LSDMR_5; /* 0x40636733; normal operation */
+       asm("sync");
+       *sdram_addr = 0xff;
+       udelay(100);
+}
+#else
+void sdram_init(void)
+{
+       puts("   SDRAM on Local Bus: Disabled in config\n");
+}
+#endif
+
+#if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD)
+/*
+ * ECC user commands
+ */
+void ecc_print_status(void)
+{
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile ddr83xx_t *ddr = &immap->ddr;
+
+       printf("\nECC mode: %s\n\n", (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) ? "ON" : "OFF");
+
+       /* Interrupts */
+       printf("Memory Error Interrupt Enable:\n");
+       printf("  Multiple-Bit Error Interrupt Enable: %d\n",
+                       (ddr->err_int_en & ECC_ERR_INT_EN_MBEE) ? 1 : 0);
+       printf("  Single-Bit Error Interrupt Enable: %d\n",
+                       (ddr->err_int_en & ECC_ERR_INT_EN_SBEE) ? 1 : 0);
+       printf("  Memory Select Error Interrupt Enable: %d\n\n",
+                       (ddr->err_int_en & ECC_ERR_INT_EN_MSEE) ? 1 : 0);
+
+       /* Error disable */
+       printf("Memory Error Disable:\n");
+       printf("  Multiple-Bit Error Disable: %d\n",
+                       (ddr->err_disable & ECC_ERROR_DISABLE_MBED) ? 1 : 0);
+       printf("  Sinle-Bit Error Disable: %d\n",
+                       (ddr->err_disable & ECC_ERROR_DISABLE_SBED) ? 1 : 0);
+       printf("  Memory Select Error Disable: %d\n\n",
+                       (ddr->err_disable & ECC_ERROR_DISABLE_MSED) ? 1 : 0);
+
+       /* Error injection */
+       printf("Memory Data Path Error Injection Mask High/Low: %08lx %08lx\n",
+                       ddr->data_err_inject_hi, ddr->data_err_inject_lo);
+
+       printf("Memory Data Path Error Injection Mask ECC:\n");
+       printf("  ECC Mirror Byte: %d\n",
+                       (ddr->ecc_err_inject & ECC_ERR_INJECT_EMB) ? 1 : 0);
+       printf("  ECC Injection Enable: %d\n",
+                       (ddr->ecc_err_inject & ECC_ERR_INJECT_EIEN) ? 1 : 0);
+       printf("  ECC Error Injection Mask: 0x%02x\n\n",
+                       ddr->ecc_err_inject & ECC_ERR_INJECT_EEIM);
+
+       /* SBE counter/threshold */
+       printf("Memory Single-Bit Error Management (0..255):\n");
+       printf("  Single-Bit Error Threshold: %d\n",
+                       (ddr->err_sbe & ECC_ERROR_MAN_SBET) >> ECC_ERROR_MAN_SBET_SHIFT);
+       printf("  Single-Bit Error Counter: %d\n\n",
+                       (ddr->err_sbe & ECC_ERROR_MAN_SBEC) >> ECC_ERROR_MAN_SBEC_SHIFT);
+
+       /* Error detect */
+       printf("Memory Error Detect:\n");
+       printf("  Multiple Memory Errors: %d\n",
+                       (ddr->err_detect & ECC_ERROR_DETECT_MME) ? 1 : 0);
+       printf("  Multiple-Bit Error: %d\n",
+                       (ddr->err_detect & ECC_ERROR_DETECT_MBE) ? 1 : 0);
+       printf("  Single-Bit Error: %d\n",
+                       (ddr->err_detect & ECC_ERROR_DETECT_SBE) ? 1 : 0);
+       printf("  Memory Select Error: %d\n\n",
+                       (ddr->err_detect & ECC_ERROR_DETECT_MSE) ? 1 : 0);
+
+       /* Capture data */
+       printf("Memory Error Address Capture: 0x%08lx\n", ddr->capture_address);
+       printf("Memory Data Path Read Capture High/Low: %08lx %08lx\n",
+                       ddr->capture_data_hi, ddr->capture_data_lo);
+       printf("Memory Data Path Read Capture ECC: 0x%02x\n\n",
+               ddr->capture_ecc & CAPTURE_ECC_ECE);
+
+       printf("Memory Error Attributes Capture:\n");
+       printf("  Data Beat Number: %d\n",
+                       (ddr->capture_attributes & ECC_CAPT_ATTR_BNUM) >> ECC_CAPT_ATTR_BNUM_SHIFT);
+       printf("  Transaction Size: %d\n",
+                       (ddr->capture_attributes & ECC_CAPT_ATTR_TSIZ) >> ECC_CAPT_ATTR_TSIZ_SHIFT);
+       printf("  Transaction Source: %d\n",
+                       (ddr->capture_attributes & ECC_CAPT_ATTR_TSRC) >> ECC_CAPT_ATTR_TSRC_SHIFT);
+       printf("  Transaction Type: %d\n",
+                       (ddr->capture_attributes & ECC_CAPT_ATTR_TTYP) >> ECC_CAPT_ATTR_TTYP_SHIFT);
+       printf("  Error Information Valid: %d\n\n",
+                       ddr->capture_attributes & ECC_CAPT_ATTR_VLD);
+}
+
+int do_ecc ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile ddr83xx_t *ddr = &immap->ddr;
+       volatile u32 val;
+       u64 *addr, count, val64;
+       register u64 *i;
+
+       if (argc > 4) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       if (argc == 2) {
+               if (strcmp(argv[1], "status") == 0) {
+                       ecc_print_status();
+                       return 0;
+               } else if (strcmp(argv[1], "captureclear") == 0) {
+                       ddr->capture_address = 0;
+                       ddr->capture_data_hi = 0;
+                       ddr->capture_data_lo = 0;
+                       ddr->capture_ecc = 0;
+                       ddr->capture_attributes = 0;
+                       return 0;
+               }
+       }
+
+       if (argc == 3) {
+               if (strcmp(argv[1], "sbecnt") == 0) {
+                       val = simple_strtoul(argv[2], NULL, 10);
+                       if (val > 255) {
+                               printf("Incorrect Counter value, should be 0..255\n");
+                               return 1;
+                       }
+
+                       val = (val << ECC_ERROR_MAN_SBEC_SHIFT);
+                       val |= (ddr->err_sbe & ECC_ERROR_MAN_SBET);
+
+                       ddr->err_sbe = val;
+                       return 0;
+               } else if (strcmp(argv[1], "sbethr") == 0) {
+                       val = simple_strtoul(argv[2], NULL, 10);
+                       if (val > 255) {
+                               printf("Incorrect Counter value, should be 0..255\n");
+                               return 1;
+                       }
+
+                       val = (val << ECC_ERROR_MAN_SBET_SHIFT);
+                       val |= (ddr->err_sbe & ECC_ERROR_MAN_SBEC);
+
+                       ddr->err_sbe = val;
+                       return 0;
+               } else if (strcmp(argv[1], "errdisable") == 0) {
+                       val = ddr->err_disable;
+
+                       if (strcmp(argv[2], "+sbe") == 0) {
+                               val |= ECC_ERROR_DISABLE_SBED;
+                       } else if (strcmp(argv[2], "+mbe") == 0) {
+                               val |= ECC_ERROR_DISABLE_MBED;
+                       } else if (strcmp(argv[2], "+mse") == 0) {
+                               val |= ECC_ERROR_DISABLE_MSED;
+                       } else if (strcmp(argv[2], "+all") == 0) {
+                               val |= (ECC_ERROR_DISABLE_SBED |
+                                       ECC_ERROR_DISABLE_MBED |
+                                       ECC_ERROR_DISABLE_MSED);
+                       } else if (strcmp(argv[2], "-sbe") == 0) {
+                               val &= ~ECC_ERROR_DISABLE_SBED;
+                       } else if (strcmp(argv[2], "-mbe") == 0) {
+                               val &= ~ECC_ERROR_DISABLE_MBED;
+                       } else if (strcmp(argv[2], "-mse") == 0) {
+                               val &= ~ECC_ERROR_DISABLE_MSED;
+                       } else if (strcmp(argv[2], "-all") == 0) {
+                               val &= ~(ECC_ERROR_DISABLE_SBED |
+                                       ECC_ERROR_DISABLE_MBED |
+                                       ECC_ERROR_DISABLE_MSED);
+                       } else {
+                               printf("Incorrect err_disable field\n");
+                               return 1;
+                       }
+
+                       ddr->err_disable = val;
+                       __asm__ __volatile__ ("sync");
+                       __asm__ __volatile__ ("isync");
+                       return 0;
+               } else if (strcmp(argv[1], "errdetectclr") == 0) {
+                       val = ddr->err_detect;
+
+                       if (strcmp(argv[2], "mme") == 0) {
+                               val |= ECC_ERROR_DETECT_MME;
+                       } else if (strcmp(argv[2], "sbe") == 0) {
+                               val |= ECC_ERROR_DETECT_SBE;
+                       } else if (strcmp(argv[2], "mbe") == 0) {
+                               val |= ECC_ERROR_DETECT_MBE;
+                       } else if (strcmp(argv[2], "mse") == 0) {
+                               val |= ECC_ERROR_DETECT_MSE;
+                       } else if (strcmp(argv[2], "all") == 0) {
+                               val |= (ECC_ERROR_DETECT_MME |
+                                       ECC_ERROR_DETECT_MBE |
+                                       ECC_ERROR_DETECT_SBE |
+                                       ECC_ERROR_DETECT_MSE);
+                       } else {
+                               printf("Incorrect err_detect field\n");
+                               return 1;
+                       }
+
+                       ddr->err_detect = val;
+                       return 0;
+               } else if (strcmp(argv[1], "injectdatahi") == 0) {
+                       val = simple_strtoul(argv[2], NULL, 16);
+
+                       ddr->data_err_inject_hi = val;
+                       return 0;
+               } else if (strcmp(argv[1], "injectdatalo") == 0) {
+                       val = simple_strtoul(argv[2], NULL, 16);
+
+                       ddr->data_err_inject_lo = val;
+                       return 0;
+               } else if (strcmp(argv[1], "injectecc") == 0) {
+                       val = simple_strtoul(argv[2], NULL, 16);
+                       if (val > 0xff) {
+                               printf("Incorrect ECC inject mask, should be 0x00..0xff\n");
+                               return 1;
+                       }
+                       val |= (ddr->ecc_err_inject & ~ECC_ERR_INJECT_EEIM);
+
+                       ddr->ecc_err_inject = val;
+                       return 0;
+               } else if (strcmp(argv[1], "inject") == 0) {
+                       val = ddr->ecc_err_inject;
+
+                       if (strcmp(argv[2], "en") == 0)
+                               val |= ECC_ERR_INJECT_EIEN;
+                       else if (strcmp(argv[2], "dis") == 0)
+                               val &= ~ECC_ERR_INJECT_EIEN;
+                       else
+                               printf("Incorrect command\n");
+
+                       ddr->ecc_err_inject = val;
+                       __asm__ __volatile__ ("sync");
+                       __asm__ __volatile__ ("isync");
+                       return 0;
+               } else if (strcmp(argv[1], "mirror") == 0) {
+                       val = ddr->ecc_err_inject;
+
+                       if (strcmp(argv[2], "en") == 0)
+                               val |= ECC_ERR_INJECT_EMB;
+                       else if (strcmp(argv[2], "dis") == 0)
+                               val &= ~ECC_ERR_INJECT_EMB;
+                       else
+                               printf("Incorrect command\n");
+
+                       ddr->ecc_err_inject = val;
+                       return 0;
+               }
+       }
+
+       if (argc == 4) {
+               if (strcmp(argv[1], "test") == 0) {
+                       addr = (u64 *)simple_strtoul(argv[2], NULL, 16);
+                       count = simple_strtoul(argv[3], NULL, 16);
+
+                       if ((u32)addr % 8) {
+                               printf("Address not alligned on double word boundary\n");
+                               return 1;
+                       }
+
+                       disable_interrupts();
+                       icache_disable();
+
+                       for (i = addr; i < addr + count; i++) {
+                               /* enable injects */
+                               ddr->ecc_err_inject |= ECC_ERR_INJECT_EIEN;
+                               __asm__ __volatile__ ("sync");
+                               __asm__ __volatile__ ("isync");
+
+                               /* write memory location injecting errors */
+                               *i = 0x1122334455667788ULL;
+                               __asm__ __volatile__ ("sync");
+
+                               /* disable injects */
+                               ddr->ecc_err_inject &= ~ECC_ERR_INJECT_EIEN;
+                               __asm__ __volatile__ ("sync");
+                               __asm__ __volatile__ ("isync");
+
+                               /* read data, this generates ECC error */
+                               val64 = *i;
+                               __asm__ __volatile__ ("sync");
+
+                               /* disable errors for ECC */
+                               ddr->err_disable |= ~ECC_ERROR_ENABLE;
+                               __asm__ __volatile__ ("sync");
+                               __asm__ __volatile__ ("isync");
+
+                               /* re-initialize memory, write the location again
+                                * NOT injecting errors this time */
+                               *i = 0xcafecafecafecafeULL;
+                               __asm__ __volatile__ ("sync");
+
+                               /* enable errors for ECC */
+                               ddr->err_disable &= ECC_ERROR_ENABLE;
+                               __asm__ __volatile__ ("sync");
+                               __asm__ __volatile__ ("isync");
+                       }
+
+                       icache_enable();
+                       enable_interrupts();
+
+                       return 0;
+               }
+       }
+
+       printf ("Usage:\n%s\n", cmdtp->usage);
+       return 1;
+}
+
+U_BOOT_CMD(
+       ecc,     4,     0,      do_ecc,
+       "ecc     - support for DDR ECC features\n",
+       "status              - print out status info\n"
+       "ecc captureclear        - clear capture regs data\n"
+       "ecc sbecnt <val>        - set Single-Bit Error counter\n"
+       "ecc sbethr <val>        - set Single-Bit Threshold\n"
+       "ecc errdisable <flag>   - clear/set disable Memory Error Disable, flag:\n"
+       "  [-|+]sbe - Single-Bit Error\n"
+       "  [-|+]mbe - Multiple-Bit Error\n"
+       "  [-|+]mse - Memory Select Error\n"
+       "  [-|+]all - all errors\n"
+       "ecc errdetectclr <flag> - clear Memory Error Detect, flag:\n"
+       "  mme - Multiple Memory Errors\n"
+       "  sbe - Single-Bit Error\n"
+       "  mbe - Multiple-Bit Error\n"
+       "  mse - Memory Select Error\n"
+       "  all - all errors\n"
+       "ecc injectdatahi <hi>  - set Memory Data Path Error Injection Mask High\n"
+       "ecc injectdatalo <lo>  - set Memory Data Path Error Injection Mask Low\n"
+       "ecc injectecc <ecc>    - set ECC Error Injection Mask\n"
+       "ecc inject <en|dis>    - enable/disable error injection\n"
+       "ecc mirror <en|dis>    - enable/disable mirror byte\n"
+       "ecc test <addr> <cnt>  - test mem region:\n"
+       "  - enables injects\n"
+       "  - writes pattern injecting errors\n"
+       "  - disables injects\n"
+       "  - reads pattern back, generates error\n"
+       "  - re-inits memory"
+);
+#endif /* if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD) */
+
+#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 != NULL) {
+               *p++ = cpu_to_be32(bd->bi_memstart);
+               *p = cpu_to_be32(bd->bi_memsize);
+       }
+}
+#endif
diff --git a/board/sbc8349/u-boot.lds b/board/sbc8349/u-boot.lds
new file mode 100644 (file)
index 0000000..e32c075
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2006 Wind River Systems, Inc.
+ * u-boot.lds for WindRiver SBC8349.
+ *
+ * Based on the MPC8349 u-boot.lds
+ *
+ * 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 36d901f094255bec9910916e3972192f7e388fbf..9c35e22c8e10ec556400513c4d0aa5f143804fa4 100644 (file)
@@ -148,14 +148,14 @@ int checkboard (void)
        u32 w, f;
 
        immr = (immap_t *)CFG_IMMR;
-       if (!(immr->reset.rcwh & RCWH_PCIHOST)) {
+       if (!(immr->reset.rcwh & HRCWH_PCI_HOST)) {
                printf("PCI:   NOT in host mode..?!\n");
                return 0;
        }
 
        /* get bus width */
        w = 32;
-       if (immr->reset.rcwh & RCWH_PCI64)
+       if (immr->reset.rcwh & HRCWH_64_BIT_PCI)
                w = 64;
 
        /* get clock */
index d2c8d44a79f87188ac87383da844491700a40474..f4074aecb11e45eee39723d66f4b5d89a803d8b0 100644 (file)
@@ -203,7 +203,6 @@ extern int flash_write (char *, ulong, ulong);
 /* change char* to void* to shutup the compiler */
 extern int i2c_write_multiple (uchar, uint, int, void *, int);
 extern int i2c_read_multiple (uchar, uint, int, void *, int);
-extern block_dev_desc_t *get_dev (char*, int);
 extern int u_boot_hush_start(void);
 
 int
index b803585845f65be892df025a69ec70056253bb1a..7a6b3be72e6b3067723de17c28739c9a828f7caa 100644 (file)
@@ -170,9 +170,9 @@ long int initdram (int board_type)
 
        /* find RAM size using SDRAM CS0 only */
        sdram_start(0);
-       test1 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x20000000);
+       test1 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
        sdram_start(1);
-       test2 = get_ram_size((ulong *)CFG_SDRAM_BASE, 0x20000000);
+       test2 = get_ram_size((long *)CFG_SDRAM_BASE, 0x20000000);
        if (test1 > test2) {
                sdram_start(0);
                dramsize = test1;
@@ -266,7 +266,7 @@ struct kbd_data_t* get_keys (struct kbd_data_t *kbd_data)
        return kbd_data;
 }
 
-static int compare_magic (const struct kbd_data_t *kbd_data, uchar *str)
+static int compare_magic (const struct kbd_data_t *kbd_data, char *str)
 {
        char s1 = str[0];
 
@@ -283,11 +283,11 @@ static int compare_magic (const struct kbd_data_t *kbd_data, uchar *str)
        return 0;
 }
 
-static uchar *key_match (const struct kbd_data_t *kbd_data)
+static char *key_match (const struct kbd_data_t *kbd_data)
 {
-       uchar magic[sizeof (kbd_magic_prefix) + 1];
-       uchar *suffix;
-       uchar *kbd_magic_keys;
+       char magic[sizeof (kbd_magic_prefix) + 1];
+       char *suffix;
+       char *kbd_magic_keys;
 
        /*
         * The following string defines the characters that can be appended
@@ -308,7 +308,7 @@ static uchar *key_match (const struct kbd_data_t *kbd_data)
                sprintf (magic, "%s%c", kbd_magic_prefix, *suffix);
 
                if (compare_magic(kbd_data, getenv(magic)) == 0) {
-                       uchar cmd_name[sizeof (kbd_command_prefix) + 1];
+                       char cmd_name[sizeof (kbd_command_prefix) + 1];
                        char *cmd;
 
                        sprintf (cmd_name, "%s%c", kbd_command_prefix, *suffix);
@@ -331,7 +331,7 @@ int misc_init_r (void)
 #ifdef CONFIG_PREBOOT
        struct kbd_data_t kbd_data;
        /* Decode keys */
-       uchar *str = strdup (key_match (get_keys (&kbd_data)));
+       char *str = strdup (key_match (get_keys (&kbd_data)));
        /* Set or delete definition */
        setenv ("preboot", str);
        free (str);
index 02c22fbef1f1fe1a92e1824bf74584a73514253f..05ad23524f1d8455beef77eada6d40aef6f3419e 100644 (file)
@@ -28,7 +28,7 @@ $(shell mkdir -p $(obj)../xilinx_enet)
 $(shell mkdir -p $(obj)../xilinx_iic)
 endif
 
-INCS           := -I../ml300 -I../common -I../xilinx_enet -I../xilinx_iic
+INCS           := -I../common -I../xilinx_enet -I../xilinx_iic
 CFLAGS         += $(INCS)
 HOST_CFLAGS    += $(INCS)
 
index dad562f1c7761d0d2d47fb867e18bea8838444ca..60f0bc24e78a7dde6806a051a31300ac3c31a7d3 100644 (file)
@@ -38,9 +38,9 @@
  *
  */
 
+#include <config.h>
 #include <common.h>
 #include <asm/processor.h>
-#include "xparameters.h"
 
 #ifdef CFG_ENV_IS_IN_EEPROM
 extern void convert_env(void);
index c204b88e415bae025f8829025b4af8e642355624..9b03f89eff44e2f56c0f39775a3da2956534ce7e 100644 (file)
@@ -40,8 +40,7 @@
 #include <asm/processor.h>
 #include <common.h>
 #include <command.h>
-#include <configs/ml300.h>
-#include "xparameters.h"
+#include <config.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index b30e8976692211c55242938ed70296f90a5ab38d..f159cb6e3921dbfd6dbd63c77cd1f1e07f6b83e1 100644 (file)
@@ -37,9 +37,9 @@
 *
 ******************************************************************************/
 
+#include <config.h>
 #include <common.h>
 #include <net.h>
-#include "xparameters.h"
 #include "xemac.h"
 
 #if defined(XPAR_EMAC_0_DEVICE_ID)
index ed704bf29b3c25dc3c5165297925bb1b11348093..584cb7ac51e0be5619aef1baebca638e6fe087d0 100644 (file)
 
 /***************************** Include Files *********************************/
 
+#include <config.h>
 #include "xbasic_types.h"
 #include "xstatus.h"
-#include "xparameters.h"
 #include "xpacket_fifo_v1_00_b.h"      /* Uses v1.00b of Packet Fifo */
 #include "xdma_channel.h"
 
index 9340f911f860d3ec09bc81bb4e0e7be73d1b2824..d9851574f73bd7fef6161026568c3eed31f1dd7b 100644 (file)
@@ -43,7 +43,7 @@
 *
 *******************************************************************/
 
-#include "xparameters.h"
+#include <config.h>
 #include "xemac.h"
 
 /*
index 163fe1511dba17b4c08ec4ac119c15648e6b1ad6..37dce03916456edcabcc42c16052651dfaa7a800 100644 (file)
 *
 ******************************************************************************/
 
+#include <config.h>
 #include <common.h>
 #include <environment.h>
 #include <net.h>
-#include "xparameters.h"
 
 #ifdef CFG_ENV_IS_IN_EEPROM
 #include <i2c.h>
index 0106088e242de968e1fddaff159bb66e8aae7dba..6f81c4abcf372de20530741c9e69a2002e76e0fb 100644 (file)
@@ -27,8 +27,7 @@ LIB   = $(obj)libcommon.a
 
 AOBJS  =
 
-COBJS  = main.o ACEX1K.o altera.o bedbug.o circbuf.o \
-         cmd_ace.o cmd_autoscript.o \
+COBJS  = main.o ACEX1K.o altera.o bedbug.o circbuf.o cmd_autoscript.o \
          cmd_bdinfo.o cmd_bedbug.o cmd_bmp.o cmd_boot.o cmd_bootm.o \
          cmd_cache.o cmd_console.o \
          cmd_date.o cmd_dcr.o cmd_diag.o cmd_display.o cmd_doc.o cmd_dtt.o \
diff --git a/common/cmd_ace.c b/common/cmd_ace.c
deleted file mode 100644 (file)
index b6d6105..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (c) 2004 Picture Elements, Inc.
- *    Stephen Williams (XXXXXXXXXXXXXXXX)
- *
- *    This source code is free software; you can redistribute it
- *    and/or modify it in source code form 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
- */
-#ident "$Id:$"
-
-/*
- * The Xilinx SystemACE chip support is activated by defining
- * CONFIG_SYSTEMACE to turn on support, and CFG_SYSTEMACE_BASE
- * to set the base address of the device. This code currently
- * assumes that the chip is connected via a byte-wide bus.
- *
- * The CONFIG_SYSTEMACE also adds to fat support the device class
- * "ace" that allows the user to execute "fatls ace 0" and the
- * like. This works by making the systemace_get_dev function
- * available to cmd_fat.c:get_dev and filling in a block device
- * description that has all the bits needed for FAT support to
- * read sectors.
- *
- * According to Xilinx technical support, before accessing the
- * SystemACE CF you need to set the following control bits:
- *     FORCECFGMODE : 1
- *     CFGMODE : 0
- *     CFGSTART : 0
- */
-
-# include  <common.h>
-# include  <command.h>
-# include  <systemace.h>
-# include  <part.h>
-# include  <asm/io.h>
-
-#ifdef CONFIG_SYSTEMACE
-
-/*
- * The ace_readw and writew functions read/write 16bit words, but the
- * offset value is the BYTE offset as most used in the Xilinx
- * datasheet for the SystemACE chip. The CFG_SYSTEMACE_BASE is defined
- * to be the base address for the chip, usually in the local
- * peripheral bus.
- */
-static unsigned ace_readw(unsigned offset)
-{
-#if (CFG_SYSTEMACE_WIDTH == 8)
-  u16 temp;
-
-#if !defined(__BIG_ENDIAN)
-  temp =((u16)readb(CFG_SYSTEMACE_BASE+offset) << 8);
-  temp |= (u16)readb(CFG_SYSTEMACE_BASE+offset+1);
-#else
-  temp = (u16)readb(CFG_SYSTEMACE_BASE+offset);
-  temp |=((u16)readb(CFG_SYSTEMACE_BASE+offset+1) << 8);
-#endif
-  return temp;
-#else
-  return readw(CFG_SYSTEMACE_BASE+offset);
-#endif
-}
-
-static void ace_writew(unsigned val, unsigned offset)
-{
-#if (CFG_SYSTEMACE_WIDTH == 8)
-#if !defined(__BIG_ENDIAN)
-  writeb((u8)(val>>8), CFG_SYSTEMACE_BASE+offset);
-  writeb((u8)val, CFG_SYSTEMACE_BASE+offset+1);
-#else
-  writeb((u8)val, CFG_SYSTEMACE_BASE+offset);
-  writeb((u8)(val>>8), CFG_SYSTEMACE_BASE+offset+1);
-#endif
-#else
-  writew(val, CFG_SYSTEMACE_BASE+offset);
-#endif
-}
-
-/* */
-
-static unsigned long systemace_read(int dev,
-                                   unsigned long start,
-                                   unsigned long blkcnt,
-                                   unsigned long *buffer);
-
-static block_dev_desc_t systemace_dev = {0};
-
-static int get_cf_lock(void)
-{
-      int retry = 10;
-
-       /* CONTROLREG = LOCKREG */
-      unsigned val=ace_readw(0x18);
-      val|=0x0002;
-      ace_writew((val&0xffff), 0x18);
-
-       /* Wait for MPULOCK in STATUSREG[15:0] */
-      while (! (ace_readw(0x04) & 0x0002)) {
-
-           if (retry < 0)
-                 return -1;
-
-           udelay(100000);
-           retry -= 1;
-      }
-
-      return 0;
-}
-
-static void release_cf_lock(void)
-{
-       unsigned val=ace_readw(0x18);
-       val&=~(0x0002);
-       ace_writew((val&0xffff), 0x18);
-}
-
-block_dev_desc_t *  systemace_get_dev(int dev)
-{
-       /* The first time through this, the systemace_dev object is
-          not yet initialized. In that case, fill it in. */
-      if (systemace_dev.blksz == 0) {
-           systemace_dev.if_type   = IF_TYPE_UNKNOWN;
-           systemace_dev.dev       = 0;
-           systemace_dev.part_type = PART_TYPE_UNKNOWN;
-           systemace_dev.type      = DEV_TYPE_HARDDISK;
-           systemace_dev.blksz     = 512;
-           systemace_dev.removable = 1;
-           systemace_dev.block_read = systemace_read;
-
-           init_part(&systemace_dev);
-
-      }
-
-      return &systemace_dev;
-}
-
-/*
- * This function is called (by dereferencing the block_read pointer in
- * the dev_desc) to read blocks of data. The return value is the
- * number of blocks read. A zero return indicates an error.
- */
-static unsigned long systemace_read(int dev,
-                                   unsigned long start,
-                                   unsigned long blkcnt,
-                                   unsigned long *buffer)
-{
-      int retry;
-      unsigned blk_countdown;
-      unsigned char*dp = (unsigned char*)buffer;
-      unsigned val;
-
-      if (get_cf_lock() < 0) {
-           unsigned status = ace_readw(0x04);
-
-             /* If CFDETECT is false, card is missing. */
-           if (! (status&0x0010)) {
-                 printf("** CompactFlash card not present. **\n");
-                 return 0;
-           }
-
-           printf("**** ACE locked away from me (STATUSREG=%04x)\n", status);
-           return 0;
-      }
-
-#ifdef DEBUG_SYSTEMACE
-      printf("... systemace read %lu sectors at %lu\n", blkcnt, start);
-#endif
-
-      retry = 2000;
-      for (;;) {
-           val = ace_readw(0x04);
-
-             /* If CFDETECT is false, card is missing. */
-           if (! (val & 0x0010)) {
-                 printf("**** ACE CompactFlash not found.\n");
-                 release_cf_lock();
-                 return 0;
-           }
-
-             /* If RDYFORCMD, then we are ready to go. */
-           if (val & 0x0100)
-                 break;
-
-           if (retry < 0) {
-                 printf("**** SystemACE not ready.\n");
-                 release_cf_lock();
-                 return 0;
-           }
-
-           udelay(1000);
-           retry -= 1;
-      }
-
-       /* The SystemACE can only transfer 256 sectors at a time, so
-          limit the current chunk of sectors. The blk_countdown
-          variable is the number of sectors left to transfer. */
-
-      blk_countdown = blkcnt;
-      while (blk_countdown > 0) {
-           unsigned trans = blk_countdown;
-
-           if (trans > 256) trans = 256;
-
-#ifdef DEBUG_SYSTEMACE
-           printf("... transfer %lu sector in a chunk\n", trans);
-#endif
-             /* Write LBA block address */
-           ace_writew((start>> 0) & 0xffff, 0x10);
-           ace_writew((start>>16) & 0x00ff, 0x12);
-
-             /* NOTE: in the Write Sector count below, a count of 0
-                causes a transfer of 256, so &0xff gives the right
-                value for whatever transfer count we want. */
-
-             /* Write sector count | ReadMemCardData. */
-           ace_writew((trans&0xff) | 0x0300, 0x14);
-
-           /* Reset the configruation controller */
-           val = ace_readw(0x18);
-           val|=0x0080;
-           ace_writew(val, 0x18);
-
-           retry = trans * 16;
-           while (retry > 0) {
-                 int idx;
-
-                   /* Wait for buffer to become ready. */
-                 while (! (ace_readw(0x04) & 0x0020)) {
-                       udelay(100);
-                 }
-
-                   /* Read 16 words of 2bytes from the sector buffer. */
-                 for (idx = 0 ;  idx < 16 ;  idx += 1) {
-                       unsigned short val = ace_readw(0x40);
-                       *dp++ = val & 0xff;
-                       *dp++ = (val>>8) & 0xff;
-                 }
-
-                 retry -= 1;
-           }
-
-           /* Clear the configruation controller reset */
-           val = ace_readw(0x18);
-           val&=~0x0080;
-           ace_writew(val, 0x18);
-
-             /* Count the blocks we transfer this time. */
-           start += trans;
-           blk_countdown -= trans;
-      }
-
-      release_cf_lock();
-
-      return blkcnt;
-}
-#endif /* CONFIG_SYSTEMACE */
index 84932f75680893512e4cdf84d94b298ab0a8af25..33d2e5661e4466cb2429188ec84f0e99e744d74d 100644 (file)
@@ -27,6 +27,7 @@
 #include <common.h>
 #include <command.h>
 #include <rtc.h>
+#include <i2c.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -44,6 +45,11 @@ int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        struct rtc_time tm;
        int rcode = 0;
+       int old_bus;
+
+       /* switch to correct I2C bus */
+       old_bus = I2C_GET_BUS();
+       I2C_SET_BUS(CFG_RTC_BUS_NUM);
 
        switch (argc) {
        case 2:                 /* set date & time */
@@ -56,7 +62,7 @@ int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        /* insert new date & time */
                        if (mk_date (argv[1], &tm) != 0) {
                                puts ("## Bad date format\n");
-                               return 1;
+                               break;
                        }
                        /* and write to RTC */
                        rtc_set (&tm);
@@ -71,11 +77,15 @@ int do_date (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                                "unknown " : RELOC(weekdays[tm.tm_wday]),
                        tm.tm_hour, tm.tm_min, tm.tm_sec);
 
-               return 0;
+               break;
        default:
                printf ("Usage:\n%s\n", cmdtp->usage);
                rcode = 1;
        }
+
+       /* switch back to original I2C bus */
+       I2C_SET_BUS(old_bus);
+
        return rcode;
 }
 
index 9db64e9e3d1f82d5b59be13c2f4eec56c1752b76..4f7b049d792c60be7f78811559c458055ada3ca7 100644 (file)
 #if (CONFIG_COMMANDS & CFG_CMD_DTT)
 
 #include <dtt.h>
+#include <i2c.h>
 
 int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
        int i;
        unsigned char sensors[] = CONFIG_DTT_SENSORS;
+       int old_bus;
+
+       /* switch to correct I2C bus */
+       old_bus = I2C_GET_BUS();
+       I2C_SET_BUS(CFG_DTT_BUS_NUM);
 
        /*
         * Loop through sensors, read
         * temperature, and output it.
         */
-       for (i = 0; i < sizeof (sensors); i++) {
+       for (i = 0; i < sizeof (sensors); i++)
                printf ("DTT%d: %i C\n", i + 1, dtt_get_temp (sensors[i]));
-       }
+
+       /* switch back to original I2C bus */
+       I2C_SET_BUS(old_bus);
 
        return 0;
 }      /* do_dtt() */
index 5db42f2b0d65e79e9d3b546b1864abb4ba26799a..94bd9b61e6779a01f241700817fba6c817478348 100644 (file)
@@ -33,6 +33,7 @@
  * Ext2fs support
  */
 #include <common.h>
+#include <part.h>
 
 #if (CONFIG_COMMANDS & CFG_CMD_EXT2)
 #include <config.h>
 #define PRINTF(fmt,args...)
 #endif
 
-static block_dev_desc_t *get_dev (char* ifname, int dev)
-{
-#if (CONFIG_COMMANDS & CFG_CMD_IDE)
-       if (strncmp(ifname,"ide",3)==0) {
-               extern block_dev_desc_t * ide_get_dev(int dev);
-               return((dev >= CFG_IDE_MAXDEVICE) ? NULL : ide_get_dev(dev));
-       }
-#endif
-#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
-       if (strncmp(ifname,"scsi",4)==0) {
-               extern block_dev_desc_t * scsi_get_dev(int dev);
-               return((dev >= CFG_SCSI_MAXDEVICE) ? NULL : scsi_get_dev(dev));
-       }
-#endif
-#if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE))
-       if (strncmp(ifname,"usb",3)==0) {
-               extern block_dev_desc_t * usb_stor_get_dev(int dev);
-               return((dev >= USB_MAX_STOR_DEV) ? NULL : usb_stor_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_MMC)
-       if (strncmp(ifname,"mmc",3)==0) {
-               extern block_dev_desc_t *  mmc_get_dev(int dev);
-               return((dev >= 1) ? NULL : mmc_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_SYSTEMACE)
-       if (strcmp(ifname,"ace")==0) {
-               extern block_dev_desc_t *  systemace_get_dev(int dev);
-               return((dev >= 1) ? NULL : systemace_get_dev(dev));
-       }
-#endif
-       return(NULL);
-}
-
 int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        char *filename = "/";
@@ -106,7 +72,7 @@ int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return(1);
        }
        dev = (int)simple_strtoul (argv[2], &ep, 16);
-       dev_desc=get_dev(argv[1],dev);
+       dev_desc = get_dev(argv[1],dev);
 
        if (dev_desc == NULL) {
                printf ("\n** Block device %s %d not supported\n", argv[1], dev);
@@ -210,7 +176,7 @@ int do_ext2load (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        }
 
        dev = (int)simple_strtoul (argv[2], &ep, 16);
-       dev_desc=get_dev(argv[1],dev);
+       dev_desc = get_dev(argv[1],dev);
        if (dev_desc==NULL) {
                printf ("\n** Block device %s %d not supported\n", argv[1], dev);
                return(1);
index 6844c103f22290fa70f6fe46a3397684bbf5e07a..afaf299569bf612b891ae04917585d28d7a2c3f3 100644 (file)
@@ -29,6 +29,7 @@
 #include <s_record.h>
 #include <net.h>
 #include <ata.h>
+#include <part.h>
 
 #if (CONFIG_COMMANDS & CFG_CMD_FAT)
 
 #include <fat.h>
 
 
-block_dev_desc_t *get_dev (char* ifname, int dev)
-{
-#if (CONFIG_COMMANDS & CFG_CMD_IDE)
-       if (strncmp(ifname,"ide",3)==0) {
-               extern block_dev_desc_t * ide_get_dev(int dev);
-               return(ide_get_dev(dev));
-       }
-#endif
-#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
-       if (strncmp(ifname,"scsi",4)==0) {
-               extern block_dev_desc_t * scsi_get_dev(int dev);
-               return(scsi_get_dev(dev));
-       }
-#endif
-#if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE))
-       if (strncmp(ifname,"usb",3)==0) {
-               extern block_dev_desc_t * usb_stor_get_dev(int dev);
-               return(usb_stor_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_MMC)
-       if (strncmp(ifname,"mmc",3)==0) {
-               extern block_dev_desc_t *  mmc_get_dev(int dev);
-               return(mmc_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_SYSTEMACE)
-       if (strcmp(ifname,"ace")==0) {
-               extern block_dev_desc_t *  systemace_get_dev(int dev);
-               return(systemace_get_dev(dev));
-       }
-#endif
-       return NULL;
-}
-
-
 int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        long size;
index 45cfde2eb840aeb0585dc2abdf07ae03ea5c94de..34571ee73b8e82d36fbcf2007bee4459adf1d8a2 100644 (file)
@@ -701,6 +701,7 @@ int do_sdram  ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        switch(data[2]) {
                case 2:  puts ("EDO\n");        break;
                case 4:  puts ("SDRAM\n");      break;
+               case 8:  puts ("DDR2\n");       break;
                default: puts ("unknown\n");    break;
        }
        puts ("Row address bits             ");
@@ -722,6 +723,7 @@ int do_sdram  ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                case 2:  puts ("HSTL 1.5\n");   break;
                case 3:  puts ("SSTL 3.3\n");   break;
                case 4:  puts ("SSTL 2.5\n");   break;
+               case 5:  puts ("SSTL 1.8\n");   break;
                default: puts ("unknown\n");    break;
        }
        printf("SDRAM cycle time             %d.%d nS\n",
@@ -948,6 +950,26 @@ int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 
 /***************************************************/
 
+#if defined(CONFIG_I2C_CMD_TREE)
+U_BOOT_CMD(
+       i2c, 6, 1, do_i2c,
+       "i2c     - I2C sub-system\n",
+#if defined(CONFIG_I2C_MULTI_BUS)
+       "dev [dev] - show or set current I2C bus\n"
+#endif  /* CONFIG_I2C_MULTI_BUS */
+       "i2c speed [speed] - show or set I2C bus speed\n"
+       "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
+       "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
+       "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
+       "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
+       "i2c crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
+       "i2c probe - show devices on the I2C bus\n"
+       "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n"
+#if (CONFIG_COMMANDS & CFG_CMD_SDRAM)
+       "i2c sdram chip - print SDRAM configuration information\n"
+#endif  /* CFG_CMD_SDRAM */
+);
+#else /* CONFIG_I2C_CMD_TREE */
 U_BOOT_CMD(
        imd,    4,      1,      do_i2c_md,              \
        "imd     - i2c memory display\n",                               \
@@ -1002,26 +1024,6 @@ U_BOOT_CMD(
        "      (valid chip values 50..57)\n"
 );
 #endif
-
-#if defined(CONFIG_I2C_CMD_TREE)
-U_BOOT_CMD(
-       i2c, 6, 1, do_i2c,
-       "i2c     - I2C sub-system\n",
-#if defined(CONFIG_I2C_MULTI_BUS)
-       "dev [dev] - show or set current I2C bus\n"
-#endif  /* CONFIG_I2C_MULTI_BUS */
-       "i2c speed [speed] - show or set I2C bus speed\n"
-       "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
-       "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
-       "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
-       "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
-       "i2c crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
-       "i2c probe - show devices on the I2C bus\n"
-       "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n"
-#if (CONFIG_COMMANDS & CFG_CMD_SDRAM)
-       "i2c sdram chip - print SDRAM configuration information\n"
-#endif  /* CFG_CMD_SDRAM */
-);
 #endif  /* CONFIG_I2C_CMD_TREE */
 
 #endif /* CFG_CMD_I2C */
index a4155029a7b8ddb7755619056af7c5c29a1e0ef7..2e185cc4411010ed750307b8296bf682d9b134b1 100644 (file)
 #include <command.h>
 #include <image.h>
 #include <asm/byteorder.h>
+
 #if defined(CONFIG_IDE_8xx_DIRECT) || defined(CONFIG_IDE_PCMCIA)
 # include <pcmcia.h>
 #endif
+
 #ifdef CONFIG_8xx
 # include <mpc8xx.h>
 #endif
+
 #ifdef CONFIG_MPC5xxx
 #include <mpc5xxx.h>
 #endif
+
 #include <ide.h>
 #include <ata.h>
+
 #ifdef CONFIG_STATUS_LED
 # include <status_led.h>
 #endif
+
 #ifndef __PPC__
 #include <asm/io.h>
 #ifdef __MIPS__
@@ -182,7 +188,7 @@ static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len
 
 #ifdef CONFIG_ATAPI
 static void    atapi_inquiry(block_dev_desc_t *dev_desc);
-ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer);
+ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer);
 #endif
 
 
@@ -697,7 +703,7 @@ void ide_init (void)
 
 block_dev_desc_t * ide_get_dev(int dev)
 {
-       return ((block_dev_desc_t *)&ide_dev_desc[dev]);
+       return (dev < CFG_IDE_MAXDEVICE) ? &ide_dev_desc[dev] : NULL;
 }
 
 
@@ -1227,7 +1233,7 @@ static void ide_ident (block_dev_desc_t *dev_desc)
 
 /* ------------------------------------------------------------------------- */
 
-ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
+ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
 {
        ulong n = 0;
        unsigned char c;
@@ -1347,7 +1353,7 @@ IDE_READ_E:
 /* ------------------------------------------------------------------------- */
 
 
-ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
+ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
 {
        ulong n = 0;
        unsigned char c;
@@ -2009,7 +2015,7 @@ static void       atapi_inquiry(block_dev_desc_t * dev_desc)
 #define ATAPI_READ_BLOCK_SIZE  2048    /* assuming CD part */
 #define ATAPI_READ_MAX_BLOCK ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE        /* max blocks */
 
-ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
+ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
 {
        ulong n = 0;
        unsigned char ccb[12]; /* Command descriptor block */
index d0fae6b24c23ca87bf6ef9187aaeabe5ff93fc7a..fcbb0236d2501dc43af04b473fd1824d6af7ab27 100644 (file)
@@ -92,8 +92,9 @@ static        ulong   base_address = 0;
 int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        ulong   addr, length;
-       ulong   i, nbytes, linebytes;
-       u_char  *cp;
+#if defined(CONFIG_HAS_DATAFLASH)
+       ulong   nbytes, linebytes;
+#endif
        int     size;
        int rc = 0;
 
@@ -128,6 +129,7 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        length = simple_strtoul(argv[2], NULL, 16);
        }
 
+#if defined(CONFIG_HAS_DATAFLASH)
        /* Print the lines.
         *
         * We buffer all read data, so we can make sure data is read only
@@ -136,64 +138,25 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        nbytes = length * size;
        do {
                char    linebuf[DISP_LINE_LEN];
-               uint    *uip = (uint   *)linebuf;
-               ushort  *usp = (ushort *)linebuf;
-               u_char  *ucp = (u_char *)linebuf;
-#ifdef CONFIG_HAS_DATAFLASH
-               int rc;
-#endif
-               printf("%08lx:", addr);
+               void* p;
                linebytes = (nbytes>DISP_LINE_LEN)?DISP_LINE_LEN:nbytes;
 
-#ifdef CONFIG_HAS_DATAFLASH
-               if ((rc = read_dataflash(addr, (linebytes/size)*size, linebuf)) == DATAFLASH_OK){
-                       /* if outside dataflash */
-                       /*if (rc != 1) {
-                               dataflash_perror (rc);
-                               return (1);
-                       }*/
-                       for (i=0; i<linebytes; i+= size) {
-                               if (size == 4) {
-                                       printf(" %08x", *uip++);
-                               } else if (size == 2) {
-                                       printf(" %04x", *usp++);
-                               } else {
-                                       printf(" %02x", *ucp++);
-                               }
-                               addr += size;
-                       }
+               rc = read_dataflash(addr, (linebytes/size)*size, linebuf);
+               p = (rc == DATAFLASH_OK) ? linebuf : (void*)addr;
+               print_buffer(addr, p, size, linebytes/size, DISP_LINE_LEN/size);
 
-               } else {        /* addr does not correspond to DataFlash */
-#endif
-               for (i=0; i<linebytes; i+= size) {
-                       if (size == 4) {
-                               printf(" %08x", (*uip++ = *((uint *)addr)));
-                       } else if (size == 2) {
-                               printf(" %04x", (*usp++ = *((ushort *)addr)));
-                       } else {
-                               printf(" %02x", (*ucp++ = *((u_char *)addr)));
-                       }
-                       addr += size;
-               }
-#ifdef CONFIG_HAS_DATAFLASH
-               }
-#endif
-               puts ("    ");
-               cp = (u_char *)linebuf;
-               for (i=0; i<linebytes; i++) {
-                       if ((*cp < 0x20) || (*cp > 0x7e))
-                               putc ('.');
-                       else
-                               printf("%c", *cp);
-                       cp++;
-               }
-               putc ('\n');
                nbytes -= linebytes;
+               addr += linebytes;
                if (ctrlc()) {
                        rc = 1;
                        break;
                }
        } while (nbytes > 0);
+#else
+       /* Print the lines. */
+       print_buffer(addr, (void*)addr, size, length, DISP_LINE_LEN/size);
+       addr += size*length;
+#endif
 
        dp_last_addr = addr;
        dp_last_length = length;
index 508ffcbdac8eb4e3dfd04c7ae5ddb7fcfe375714..09c86e66d76fe56477565cb70666ba2b5fbe97b0 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/ctype.h>
 #include <asm/byteorder.h>
 #include <reiserfs.h>
+#include <part.h>
 
 #ifndef CONFIG_DOS_PARTITION
 #error DOS partition support must be selected
 #define PRINTF(fmt,args...)
 #endif
 
-static block_dev_desc_t *get_dev (char* ifname, int dev)
-{
-#if (CONFIG_COMMANDS & CFG_CMD_IDE)
-       if (strncmp(ifname,"ide",3)==0) {
-               extern block_dev_desc_t * ide_get_dev(int dev);
-               return((dev >= CFG_IDE_MAXDEVICE) ? NULL : ide_get_dev(dev));
-       }
-#endif
-#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
-       if (strncmp(ifname,"scsi",4)==0) {
-               extern block_dev_desc_t * scsi_get_dev(int dev);
-               return((dev >= CFG_SCSI_MAXDEVICE) ? NULL : scsi_get_dev(dev));
-       }
-#endif
-#if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE))
-       if (strncmp(ifname,"usb",3)==0) {
-               extern block_dev_desc_t * usb_stor_get_dev(int dev);
-               return((dev >= USB_MAX_STOR_DEV) ? NULL : usb_stor_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_MMC)
-       if (strncmp(ifname,"mmc",3)==0) {
-               extern block_dev_desc_t *  mmc_get_dev(int dev);
-               return((dev >= 1) ? NULL : mmc_get_dev(dev));
-       }
-#endif
-#if defined(CONFIG_SYSTEMACE)
-       if (strcmp(ifname,"ace")==0) {
-               extern block_dev_desc_t *  systemace_get_dev(int dev);
-               return((dev >= 1) ? NULL : systemace_get_dev(dev));
-       }
-#endif
-       return NULL;
-}
-
 int do_reiserls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        char *filename = "/";
@@ -97,7 +63,7 @@ int do_reiserls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return 1;
        }
        dev = (int)simple_strtoul (argv[2], &ep, 16);
-       dev_desc=get_dev(argv[1],dev);
+       dev_desc = get_dev(argv[1],dev);
 
        if (dev_desc == NULL) {
                printf ("\n** Block device %s %d not supported\n", argv[1], dev);
@@ -196,7 +162,7 @@ int do_reiserload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        }
 
        dev = (int)simple_strtoul (argv[2], &ep, 16);
-       dev_desc=get_dev(argv[1],dev);
+       dev_desc = get_dev(argv[1],dev);
        if (dev_desc==NULL) {
                printf ("\n** Block device %s %d not supported\n", argv[1], dev);
                return 1;
index cc08743d5dcc7a42a8c5030a04a9bce4d017dfc4..da36ed9e1d1937e0e28c5abe3e479008970795a0 100644 (file)
@@ -74,7 +74,7 @@ void scsi_setup_inquiry(ccb * pccb);
 void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
 
 
-ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer);
+ulong scsi_read(int device, ulong blknr, ulong blkcnt, void *buffer);
 
 
 /*********************************************************************************
@@ -194,7 +194,7 @@ void scsi_init(void)
 
 block_dev_desc_t * scsi_get_dev(int dev)
 {
-       return((block_dev_desc_t *)&scsi_dev_desc[dev]);
+       return (dev < CFG_SCSI_MAX_DEVICE) ? &scsi_dev_desc[dev] : NULL;
 }
 
 
@@ -424,7 +424,7 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 #define SCSI_MAX_READ_BLK 0xFFFF /* almost the maximum amount of the scsi_ext command.. */
 
-ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer)
+ulong scsi_read(int device, ulong blknr, ulong blkcnt, void *buffer)
 {
        ulong start,blks, buf_addr;
        unsigned short smallblks;
index 28c05aa20eaf69afa8a4145a61a293c0ae0f6f4a..904df7159f42c7b5960717bcfbd6ad1df80c1ae8 100644 (file)
@@ -28,6 +28,7 @@
 #include <common.h>
 #include <command.h>
 #include <asm/byteorder.h>
+#include <part.h>
 
 #if (CONFIG_COMMANDS & CFG_CMD_USB)
 
index 980e40f55d55f639219775c120a125e17804dd09..5a0575e89aa4036a6b1af7bf82d01c9426669a19 100644 (file)
@@ -29,6 +29,7 @@
 #include <stddef.h>
 
 #include <ft_build.h>
+#include <linux/ctype.h>
 
 #undef DEBUG
 
@@ -180,11 +181,6 @@ void ft_finalize_tree(struct ft_cxt *cxt) {
        bph->dt_strings_size = cxt->p_end - cxt->p;
 }
 
-static inline int isprint(int c)
-{
-       return c >= 0x20 && c <= 0x7e;
-}
-
 static int is_printable_string(const void *data, int len)
 {
        const char *s = data;
index 06ea99b2f1a750d441db8e13999970d76ceaa825..196ceb735934289255047991a41a4942798a93be 100644 (file)
@@ -56,6 +56,7 @@
 
 
 #if (CONFIG_COMMANDS & CFG_CMD_USB)
+#include <part.h>
 #include <usb.h>
 
 #ifdef CONFIG_USB_STORAGE
@@ -168,13 +169,13 @@ static struct us_data usb_stor[USB_MAX_STOR_DEV];
 
 int usb_stor_get_info(struct usb_device *dev, struct us_data *us, block_dev_desc_t *dev_desc);
 int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,struct us_data *ss);
-unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, unsigned long *buffer);
+unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, void *buffer);
 struct usb_device * usb_get_dev_index(int index);
 void uhci_show_temp_int_td(void);
 
 block_dev_desc_t *usb_stor_get_dev(int index)
 {
-       return &usb_dev_desc[index];
+       return (index < USB_MAX_STOR_DEV) ? &usb_dev_desc[index] : NULL;
 }
 
 
@@ -940,7 +941,7 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor,
 
 #define USB_MAX_READ_BLK 20
 
-unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, unsigned long *buffer)
+unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, void *buffer)
 {
        unsigned long start,blks, buf_addr;
        unsigned short smallblks;
index d6ee121df2a52b5b6591d6b38c0198759d3f06a6..13a3870f3dc68b0b8c241f2a1a951a0e0a267fd9 100644 (file)
@@ -878,13 +878,13 @@ int mpc5xxx_fec_initialize(bd_t * bis)
        fec->eth = (ethernet_regs *)MPC5XXX_FEC;
        fec->tbdBase = (FEC_TBD *)FEC_BD_BASE;
        fec->rbdBase = (FEC_RBD *)(FEC_BD_BASE + FEC_TBD_NUM * sizeof(FEC_TBD));
-#if defined(CONFIG_CANMB)   || defined(CONFIG_HMI1001) || \
-    defined(CONFIG_ICECUBE) || defined(CONFIG_INKA4X0) || \
-    defined(CONFIG_JUPITER) || \
-    defined(CONFIG_MCC200)  || defined(CONFIG_O2DNT)   || \
-    defined(CONFIG_PM520)   || defined(CONFIG_TOP5200) || \
-    defined(CONFIG_TQM5200) || defined(CONFIG_V38B)    || \
-    defined(CONFIG_UC101)
+#if defined(CONFIG_CANMB)    || defined(CONFIG_HMI1001)        || \
+    defined(CONFIG_ICECUBE)  || defined(CONFIG_INKA4X0)        || \
+    defined(CONFIG_JUPITER)  || defined(CONFIG_MCC200) || \
+    defined(CONFIG_MOTIONPRO)|| defined(CONFIG_O2DNT)  || \
+    defined(CONFIG_PM520)    || defined(CONFIG_TOP5200)        || \
+    defined(CONFIG_TQM5200)  || defined(CONFIG_UC101)  || \
+    defined(CONFIG_V38B)
 # ifndef CONFIG_FEC_10MBIT
        fec->xcv_type = MII100;
 # else
index 1b5107881ed9b3079845fea409c6153fa3aa40bb..e4bc4052db5dee4923ad28b0aff71b1920b1d03b 100644 (file)
@@ -56,49 +56,78 @@ int checkcpu(void)
        switch(spridr) {
        case SPR_8349E_REV10:
        case SPR_8349E_REV11:
+       case SPR_8349E_REV31:
                puts("MPC8349E, ");
                break;
        case SPR_8349_REV10:
        case SPR_8349_REV11:
+       case SPR_8349_REV31:
                puts("MPC8349, ");
                break;
        case SPR_8347E_REV10_TBGA:
        case SPR_8347E_REV11_TBGA:
+       case SPR_8347E_REV31_TBGA:
        case SPR_8347E_REV10_PBGA:
        case SPR_8347E_REV11_PBGA:
+       case SPR_8347E_REV31_PBGA:
                puts("MPC8347E, ");
                break;
        case SPR_8347_REV10_TBGA:
        case SPR_8347_REV11_TBGA:
+       case SPR_8347_REV31_TBGA:
        case SPR_8347_REV10_PBGA:
        case SPR_8347_REV11_PBGA:
+       case SPR_8347_REV31_PBGA:
                puts("MPC8347, ");
                break;
        case SPR_8343E_REV10:
        case SPR_8343E_REV11:
+       case SPR_8343E_REV31:
                puts("MPC8343E, ");
                break;
        case SPR_8343_REV10:
        case SPR_8343_REV11:
+       case SPR_8343_REV31:
                puts("MPC8343, ");
                break;
        case SPR_8360E_REV10:
        case SPR_8360E_REV11:
        case SPR_8360E_REV12:
+       case SPR_8360E_REV20:
                puts("MPC8360E, ");
                break;
        case SPR_8360_REV10:
        case SPR_8360_REV11:
        case SPR_8360_REV12:
+       case SPR_8360_REV20:
                puts("MPC8360, ");
                break;
+       case SPR_8323E_REV10:
+       case SPR_8323E_REV11:
+               puts("MPC8323E, ");
+               break;
+       case SPR_8323_REV10:
+       case SPR_8323_REV11:
+               puts("MPC8323, ");
+               break;
+       case SPR_8321E_REV10:
+       case SPR_8321E_REV11:
+               puts("MPC8321E, ");
+               break;
+       case SPR_8321_REV10:
+       case SPR_8321_REV11:
+               puts("MPC8321, ");
+               break;
        default:
-               puts("Rev: Unknown\n");
-               return -1;      /* Not sure what this is */
+               puts("Rev: Unknown revision number.\nWarning: Unsupported cpu revision!\n");
+               return 0;
        }
 
-#if defined(CONFIG_MPC8349)
-       printf("Rev: %02x at %s MHz\n", (spridr & 0x0000FFFF)>>4 |(spridr & 0x0000000F), strmhz(buf, clock));
+#if defined(CONFIG_MPC834X)
+       /* 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));
 #else
        printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock));
 #endif
@@ -250,7 +279,6 @@ unsigned long get_tbclk(void)
 #if defined(CONFIG_WATCHDOG)
 void watchdog_reset (void)
 {
-#ifdef CONFIG_MPC834X
        int re_enable = disable_interrupts();
 
        /* Reset the 83xx watchdog */
@@ -260,9 +288,6 @@ void watchdog_reset (void)
 
        if (re_enable)
                enable_interrupts ();
-#else
-       hang();
-#endif
 }
 #endif
 
@@ -292,14 +317,64 @@ ft_cpu_setup(void *blob, bd_t *bd)
                *p = cpu_to_be32(clock);
 
 #ifdef CONFIG_MPC83XX_TSEC1
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len);
+       if (p != NULL)
                memcpy(p, bd->bi_enetaddr, 6);
 #endif
 
 #ifdef CONFIG_MPC83XX_TSEC2
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet1addr, 6);
+
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len);
+       if (p != NULL)
                memcpy(p, bd->bi_enet1addr, 6);
 #endif
+
+#ifdef CONFIG_UEC_ETH1
+#if CFG_UEC1_UCC_NUM == 0  /* UCC1 */
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@2000/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@2000/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+#elif CFG_UEC1_UCC_NUM == 2  /* UCC3 */
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@2200/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@2200/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+#endif
+#endif
+
+#ifdef CONFIG_UEC_ETH2
+#if CFG_UEC2_UCC_NUM == 1  /* UCC2 */
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@3000/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet1addr, 6);
+
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@3000/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet1addr, 6);
+#elif CFG_UEC2_UCC_NUM == 3  /* UCC4 */
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@3200/mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet1addr, 6);
+
+       p = ft_get_prop(blob, "/" OF_QE "/ucc@3200/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet1addr, 6);
+#endif
+#endif
 }
 #endif
 
index e5725fb91d95ef7cc7cb90e064e61ab474889db7..3ac91619c4ba8cf4a20035d540b8fadbae6b8e46 100644 (file)
@@ -69,31 +69,53 @@ void cpu_init_f (volatile immap_t * im)
 
 #ifdef CFG_ACR_PIPE_DEP
        /* Arbiter pipeline depth */
-       im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) | (3 << ACR_PIPE_DEP_SHIFT);
+       im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) |
+                         (CFG_ACR_PIPE_DEP << ACR_PIPE_DEP_SHIFT);
 #endif
 
 #ifdef CFG_SPCR_TSEC1EP
        /* TSEC1 Emergency priority */
-       im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) | (3 << SPCR_TSEC1EP_SHIFT);
+       im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) | (CFG_SPCR_TSEC1EP << SPCR_TSEC1EP_SHIFT);
 #endif
 
 #ifdef CFG_SPCR_TSEC2EP
        /* TSEC2 Emergency priority */
-       im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (3 << SPCR_TSEC2EP_SHIFT);
+       im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (CFG_SPCR_TSEC2EP << SPCR_TSEC2EP_SHIFT);
 #endif
 
+#ifdef CONFIG_MPC834X
 #ifdef CFG_SCCR_TSEC1CM
        /* TSEC1 clock mode */
-       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (1 << SCCR_TSEC1CM_SHIFT);
+       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (CFG_SCCR_TSEC1CM << SCCR_TSEC1CM_SHIFT);
 #endif
 #ifdef CFG_SCCR_TSEC2CM
        /* TSEC2 & I2C1 clock mode */
-       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (1 << SCCR_TSEC2CM_SHIFT);
+       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (CFG_SCCR_TSEC2CM << SCCR_TSEC2CM_SHIFT);
+#endif
+#ifdef CFG_SCCR_USBMPHCM
+       /* USB MPH clock mode */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_USBMPHCM) | (CFG_SCCR_USBMPHCM << SCCR_USBMPHCM_SHIFT);
+#endif
+#endif /* CONFIG_MPC834X */
+
+#ifdef CFG_SCCR_PCICM
+       /* PCI & DMA clock mode */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_PCICM) | (CFG_SCCR_PCICM << SCCR_PCICM_SHIFT);
+#endif
+
+#ifdef CFG_SCCR_USBDRCM
+       /* USB DR clock mode */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_USBDRCM) | (CFG_SCCR_USBDRCM << SCCR_USBDRCM_SHIFT);
+#endif
+
+#ifdef CFG_SCCR_ENCCM
+       /* Encryption clock mode */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_ENCCM) | (CFG_SCCR_ENCCM << SCCR_PCICM_SHIFT);
 #endif
 
 #ifdef CFG_ACR_RPTCNT
        /* Arbiter repeat count */
-       im->arbiter.acr = ((im->arbiter.acr & ~(ACR_RPTCNT)) | (3 << ACR_RPTCNT_SHIFT));
+       im->arbiter.acr = ((im->arbiter.acr & ~(ACR_RPTCNT)) | (CFG_ACR_RPTCNT << ACR_RPTCNT_SHIFT));
 #endif
 
        /* RSR - Reset Status Register - clear all status (4.6.1.3) */
@@ -119,6 +141,11 @@ void cpu_init_f (volatile immap_t * im)
 #ifdef CFG_SICRL
        im->sysconf.sicrl = CFG_SICRL;
 #endif
+       /* DDR control driver register */
+#ifdef CFG_DDRCDR
+       im->sysconf.ddrcdr = CFG_DDRCDR;
+#endif
+
 #ifdef CONFIG_QE
        /* Config QE ioports */
        config_qe_ioports();
@@ -202,12 +229,12 @@ void cpu_init_f (volatile immap_t * im)
        im->sysconf.lblaw[7].ar = CFG_LBLAWAR7_PRELIM;
 #endif
 #ifdef CFG_GPIO1_PRELIM
-       im->pgio[0].dir = CFG_GPIO1_DIR;
-       im->pgio[0].dat = CFG_GPIO1_DAT;
+       im->gpio[0].dir = CFG_GPIO1_DIR;
+       im->gpio[0].dat = CFG_GPIO1_DAT;
 #endif
 #ifdef CFG_GPIO2_PRELIM
-       im->pgio[1].dir = CFG_GPIO2_DIR;
-       im->pgio[1].dat = CFG_GPIO2_DAT;
+       im->gpio[1].dir = CFG_GPIO2_DIR;
+       im->gpio[1].dat = CFG_GPIO2_DAT;
 #endif
 }
 
index ebe348711200e70be58b91b1d7a5a2fefc89037f..8b3937aa9b9594e2a54bb47db191124e03dab3d0 100644 (file)
@@ -35,7 +35,7 @@ void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
        u32                     pin_1bit_mask;
        u32                     tmp_val;
        volatile immap_t        *im = (volatile immap_t *)CFG_IMMR;
-       volatile gpio83xx_t     *par_io =(volatile gpio83xx_t *)&im->gpio;
+       volatile qepio83xx_t    *par_io = (volatile qepio83xx_t *)&im->qepio;
 
        /* Caculate pin location and 2bit mask and dir */
        pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
index 0d93f2e1ea4ea25a455356e725bd985208cef696..d9b8753ca09b421ff08ae6d3d55339e1b58081de 100644 (file)
@@ -106,16 +106,29 @@ long int spd_sdram()
        volatile ddr83xx_t *ddr = &immap->ddr;
        volatile law83xx_t *ecm = &immap->sysconf.ddrlaw[0];
        spd_eeprom_t spd;
+       unsigned int n_ranks;
+       unsigned int odt_rd_cfg, odt_wr_cfg;
+       unsigned char twr_clk, twtr_clk;
+       unsigned char sdram_type;
        unsigned int memsize;
        unsigned int law_size;
        unsigned char caslat, caslat_ctrl;
+       unsigned int trfc, trfc_clk, trfc_low, trfc_high;
+       unsigned int trcd_clk, trtp_clk;
+       unsigned char cke_min_clk;
+       unsigned char add_lat, wr_lat;
+       unsigned char wr_data_delay;
+       unsigned char four_act;
+       unsigned char cpo;
        unsigned char burstlen;
+       unsigned char odt_cfg, mode_odt_enable;
        unsigned int max_bus_clk;
        unsigned int max_data_rate, effective_data_rate;
        unsigned int ddrc_clk;
        unsigned int refresh_clk;
-       unsigned sdram_cfg;
+       unsigned int sdram_cfg;
        unsigned int ddrc_ecc_enable;
+       unsigned int pvr = get_pvr();
 
        /* Read SPD parameters with I2C */
        CFG_READ_SPD(SPD_EEPROM_ADDRESS, 0, 1, (uchar *) & spd, sizeof (spd));
@@ -123,19 +136,25 @@ long int spd_sdram()
        spd_debug(&spd);
 #endif
        /* Check the memory type */
-       if (spd.mem_type != SPD_MEMTYPE_DDR) {
+       if (spd.mem_type != SPD_MEMTYPE_DDR && spd.mem_type != SPD_MEMTYPE_DDR2) {
                printf("DDR: Module mem type is %02X\n", spd.mem_type);
                return 0;
        }
 
        /* Check the number of physical bank */
-       if (spd.nrows > 2) {
-               printf("DDR: The number of physical bank is %02X\n", spd.nrows);
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               n_ranks = spd.nrows;
+       } else {
+               n_ranks = (spd.nrows & 0x7) + 1;
+       }
+
+       if (n_ranks > 2) {
+               printf("DDR: The number of physical bank is %02X\n", n_ranks);
                return 0;
        }
 
        /* Check if the number of row of the module is in the range of DDRC */
-       if (spd.nrow_addr < 12 || spd.nrow_addr > 14) {
+       if (spd.nrow_addr < 12 || spd.nrow_addr > 15) {
                printf("DDR: Row number is out of range of DDRC, row=%02X\n",
                                                         spd.nrow_addr);
                return 0;
@@ -147,20 +166,43 @@ long int spd_sdram()
                                                         spd.ncol_addr);
                return 0;
        }
+
+#ifdef CFG_DDRCDR_VALUE
+       /*
+        * Adjust DDR II IO voltage biasing.  It just makes it work.
+        */
+       if(spd.mem_type == SPD_MEMTYPE_DDR2) {
+               immap->sysconf.ddrcdr = CFG_DDRCDR_VALUE;
+       }
+#endif
+
+       /*
+        * ODT configuration recommendation from DDR Controller Chapter.
+        */
+       odt_rd_cfg = 0;                 /* Never assert ODT */
+       odt_wr_cfg = 0;                 /* Never assert ODT */
+       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
+               odt_wr_cfg = 1;         /* Assert ODT on writes to CSn */
+       }
+
        /* Setup DDR chip select register */
 #ifdef CFG_83XX_DDR_USES_CS0
        ddr->csbnds[0].csbnds = (banksize(spd.row_dens) >> 24) - 1;
        ddr->cs_config[0] = ( 1 << 31
+                           | (odt_rd_cfg << 20)
+                           | (odt_wr_cfg << 16)
                            | (spd.nrow_addr - 12) << 8
                            | (spd.ncol_addr - 8) );
        debug("\n");
        debug("cs0_bnds = 0x%08x\n",ddr->csbnds[0].csbnds);
        debug("cs0_config = 0x%08x\n",ddr->cs_config[0]);
 
-       if (spd.nrows == 2) {
+       if (n_ranks == 2) {
                ddr->csbnds[1].csbnds = ( (banksize(spd.row_dens) >> 8)
                                  | ((banksize(spd.row_dens) >> 23) - 1) );
                ddr->cs_config[1] = ( 1<<31
+                                   | (odt_rd_cfg << 20)
+                                   | (odt_wr_cfg << 16)
                                    | (spd.nrow_addr-12) << 8
                                    | (spd.ncol_addr-8) );
                debug("cs1_bnds = 0x%08x\n",ddr->csbnds[1].csbnds);
@@ -170,16 +212,20 @@ long int spd_sdram()
 #else
        ddr->csbnds[2].csbnds = (banksize(spd.row_dens) >> 24) - 1;
        ddr->cs_config[2] = ( 1 << 31
+                           | (odt_rd_cfg << 20)
+                           | (odt_wr_cfg << 16)
                            | (spd.nrow_addr - 12) << 8
                            | (spd.ncol_addr - 8) );
        debug("\n");
        debug("cs2_bnds = 0x%08x\n",ddr->csbnds[2].csbnds);
        debug("cs2_config = 0x%08x\n",ddr->cs_config[2]);
 
-       if (spd.nrows == 2) {
+       if (n_ranks == 2) {
                ddr->csbnds[3].csbnds = ( (banksize(spd.row_dens) >> 8)
                                  | ((banksize(spd.row_dens) >> 23) - 1) );
                ddr->cs_config[3] = ( 1<<31
+                                   | (odt_rd_cfg << 20)
+                                   | (odt_wr_cfg << 16)
                                    | (spd.nrow_addr-12) << 8
                                    | (spd.ncol_addr-8) );
                debug("cs3_bnds = 0x%08x\n",ddr->csbnds[3].csbnds);
@@ -187,15 +233,10 @@ long int spd_sdram()
        }
 #endif
 
-       if (spd.mem_type != 0x07) {
-               puts("No DDR module found!\n");
-               return 0;
-       }
-
        /*
         * Figure out memory size in Megabytes.
         */
-       memsize = spd.nrows * banksize(spd.row_dens) / 0x100000;
+       memsize = n_ranks * banksize(spd.row_dens) / 0x100000;
 
        /*
         * First supported LAW size is 16M, at LAWAR_SIZE_16M == 23.
@@ -215,24 +256,32 @@ long int spd_sdram()
         * in the spd.cas_lat field.  Translate it to a DDR
         * controller field value:
         *
-        *      CAS Lat  DDR I     Ctrl
-        *      Clocks   SPD Bit   Value
-        *      -------+--------+---------
-        *      1.0        0        001
-        *      1.5        1        010
-        *      2.0        2        011
-        *      2.5        3        100
-        *      3.0        4        101
-        *      3.5        5        110
-        *      4.0        6        111
+        *      CAS Lat DDR I   DDR II  Ctrl
+        *      Clocks  SPD Bit SPD Bit Value
+        *      ------- ------- ------- -----
+        *      1.0     0               0001
+        *      1.5     1               0010
+        *      2.0     2       2       0011
+        *      2.5     3               0100
+        *      3.0     4       3       0101
+        *      3.5     5               0110
+        *      4.0     6       4       0111
+        *      4.5                     1000
+        *      5.0             5       1001
         */
        caslat = __ilog2(spd.cas_lat);
-
-       if (caslat > 6 ) {
-               printf("DDR: Invalid SPD CAS Latency, caslat=%02X\n",
-                       spd.cas_lat);
+       if ((spd.mem_type == SPD_MEMTYPE_DDR)
+           && (caslat > 6)) {
+               printf("DDR I: Invalid SPD CAS Latency: 0x%x.\n", spd.cas_lat);
+               return 0;
+       } else if (spd.mem_type == SPD_MEMTYPE_DDR2
+                  && (caslat < 2 || caslat > 5)) {
+               printf("DDR II: Invalid SPD CAS Latency: 0x%x.\n",
+                      spd.cas_lat);
                return 0;
        }
+       debug("DDR: caslat SPD bit is %d\n", caslat);
+
        max_bus_clk = 1000 *10 / (((spd.clk_cycle & 0xF0) >> 4) * 10
                        + (spd.clk_cycle & 0x0f));
        max_data_rate = max_bus_clk * 2;
@@ -240,10 +289,11 @@ long int spd_sdram()
        debug("DDR:Module maximum data rate is: %dMhz\n", max_data_rate);
 
        ddrc_clk = gd->ddr_clk / 1000000;
+       effective_data_rate = 0;
 
-       if (max_data_rate >= 390) { /* it is DDR 400 */
-               if (ddrc_clk <= 410 && ddrc_clk > 350) {
-                       /* DDR controller clk at 350~410 */
+       if (max_data_rate >= 390 && max_data_rate < 460) { /* it is DDR 400 */
+               if (ddrc_clk <= 460 && ddrc_clk > 350) {
+                       /* DDR controller clk at 350~460 */
                        effective_data_rate = 400; /* 5ns */
                        caslat = caslat;
                } else if (ddrc_clk <= 350 && ddrc_clk > 280) {
@@ -258,16 +308,16 @@ long int spd_sdram()
                        effective_data_rate = 266; /* 7.5ns */
                        if (spd.clk_cycle3 == 0x75)
                                caslat = caslat - 2;
-                       else if (spd.clk_cycle2 == 0x60)
+                       else if (spd.clk_cycle2 == 0x75)
                                caslat = caslat - 1;
                        else
                                caslat = caslat;
                } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
                        /* DDR controller clk at 90~230 */
                        effective_data_rate = 200; /* 10ns */
-                       if (spd.clk_cycle3 == 0x75)
+                       if (spd.clk_cycle3 == 0xa0)
                                caslat = caslat - 2;
-                       else if (spd.clk_cycle2 == 0x60)
+                       else if (spd.clk_cycle2 == 0xa0)
                                caslat = caslat - 1;
                        else
                                caslat = caslat;
@@ -289,7 +339,7 @@ long int spd_sdram()
                        effective_data_rate = 200; /* 10ns */
                        if (spd.clk_cycle3 == 0xa0)
                                caslat = caslat - 2;
-                       else if (spd.clk_cycle2 == 0x75)
+                       else if (spd.clk_cycle2 == 0xa0)
                                caslat = caslat - 1;
                        else
                                caslat = caslat;
@@ -330,41 +380,197 @@ long int spd_sdram()
         * Errata DDR6 work around: input enable 2 cycles earlier.
         * including MPC834x Rev1.0/1.1 and MPC8360 Rev1.1/1.2.
         */
-       if (caslat == 2)
-               ddr->debug_reg = 0x201c0000; /* CL=2 */
-       else if (caslat == 3)
-               ddr->debug_reg = 0x202c0000; /* CL=2.5 */
-       else if (caslat == 4)
-               ddr->debug_reg = 0x202c0000; /* CL=3.0 */
+       if(PVR_MAJ(pvr) <= 1 && spd.mem_type == SPD_MEMTYPE_DDR){
+               if (caslat == 2)
+                       ddr->debug_reg = 0x201c0000; /* CL=2 */
+               else if (caslat == 3)
+                       ddr->debug_reg = 0x202c0000; /* CL=2.5 */
+               else if (caslat == 4)
+                       ddr->debug_reg = 0x202c0000; /* CL=3.0 */
 
-       __asm__ __volatile__ ("sync");
+               __asm__ __volatile__ ("sync");
 
-       debug("Errata DDR6 (debug_reg=0x%08x)\n", ddr->debug_reg);
+               debug("Errata DDR6 (debug_reg=0x%08x)\n", ddr->debug_reg);
+       }
 
        /*
-        * note: caslat must also be programmed into ddr->sdram_mode
-        * register.
-        *
-        * note: WRREC(Twr) and WRTORD(Twtr) are not in SPD,
-        * use conservative value here.
+        * Convert caslat clocks to DDR controller value.
+        * Force caslat_ctrl to be DDR Controller field-sized.
+        */
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               caslat_ctrl = (caslat + 1) & 0x07;
+       } else {
+               caslat_ctrl =  (2 * caslat - 1) & 0x0f;
+       }
+
+       debug("DDR: effective data rate is %d MHz\n", effective_data_rate);
+       debug("DDR: caslat SPD bit is %d, controller field is 0x%x\n",
+             caslat, caslat_ctrl);
+
+       /*
+        * Timing Config 0.
+        * Avoid writing for DDR I.
+        */
+       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
+               unsigned char taxpd_clk = 8;            /* By the book. */
+               unsigned char tmrd_clk = 2;             /* By the book. */
+               unsigned char act_pd_exit = 2;          /* Empirical? */
+               unsigned char pre_pd_exit = 6;          /* Empirical? */
+
+               ddr->timing_cfg_0 = (0
+                       | ((act_pd_exit & 0x7) << 20)   /* ACT_PD_EXIT */
+                       | ((pre_pd_exit & 0x7) << 16)   /* PRE_PD_EXIT */
+                       | ((taxpd_clk & 0xf) << 8)      /* ODT_PD_EXIT */
+                       | ((tmrd_clk & 0xf) << 0)       /* MRS_CYC */
+                       );
+               debug("DDR: timing_cfg_0 = 0x%08x\n", ddr->timing_cfg_0);
+       }
+
+       /*
+        * For DDR I, WRREC(Twr) and WRTORD(Twtr) are not in SPD,
+        * use conservative value.
+        * For DDR II, they are bytes 36 and 37, in quarter nanos.
         */
-       caslat_ctrl = (caslat + 1) & 0x07; /* see as above */
+
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               twr_clk = 3;    /* Clocks */
+               twtr_clk = 1;   /* Clocks */
+       } else {
+               twr_clk = picos_to_clk(spd.twr * 250);
+               twtr_clk = picos_to_clk(spd.twtr * 250);
+       }
+
+       /*
+        * Calculate Trfc, in picos.
+        * DDR I:  Byte 42 straight up in ns.
+        * DDR II: Byte 40 and 42 swizzled some, in ns.
+        */
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               trfc = spd.trfc * 1000;         /* up to ps */
+       } else {
+               unsigned int byte40_table_ps[8] = {
+                       0,
+                       250,
+                       330,
+                       500,
+                       660,
+                       750,
+                       0,
+                       0
+               };
+
+               trfc = (((spd.trctrfc_ext & 0x1) * 256) + spd.trfc) * 1000
+                       + byte40_table_ps[(spd.trctrfc_ext >> 1) & 0x7];
+       }
+       trfc_clk = picos_to_clk(trfc);
+
+       /*
+        * Trcd, Byte 29, from quarter nanos to ps and clocks.
+        */
+       trcd_clk = picos_to_clk(spd.trcd * 250) & 0x7;
+
+       /*
+        * Convert trfc_clk to DDR controller fields.  DDR I should
+        * fit in the REFREC field (16-19) of TIMING_CFG_1, but the
+        * 83xx controller has an extended REFREC field of three bits.
+        * The controller automatically adds 8 clocks to this value,
+        * so preadjust it down 8 first before splitting it up.
+        */
+       trfc_low = (trfc_clk - 8) & 0xf;
+       trfc_high = ((trfc_clk - 8) >> 4) & 0x3;
 
        ddr->timing_cfg_1 =
-           (((picos_to_clk(spd.trp * 250) & 0x07) << 28 ) |
-            ((picos_to_clk(spd.tras * 1000) & 0x0f ) << 24 ) |
-            ((picos_to_clk(spd.trcd * 250) & 0x07) << 20 ) |
-            ((caslat_ctrl & 0x07) << 16 ) |
-            (((picos_to_clk(spd.trfc * 1000) - 8) & 0x0f) << 12 ) |
-            ( 0x300 ) |
-            ((picos_to_clk(spd.trrd * 250) & 0x07) << 4) | 1);
+           (((picos_to_clk(spd.trp * 250) & 0x07) << 28 ) |    /* PRETOACT */
+            ((picos_to_clk(spd.tras * 1000) & 0x0f ) << 24 ) | /* ACTTOPRE */
+            (trcd_clk << 20 ) |                                /* ACTTORW */
+            (caslat_ctrl << 16 ) |                             /* CASLAT */
+            (trfc_low << 12 ) |                                /* REFEC */
+            ((twr_clk & 0x07) << 8) |                          /* WRRREC */
+            ((picos_to_clk(spd.trrd * 250) & 0x07) << 4) |     /* ACTTOACT */
+            ((twtr_clk & 0x07) << 0)                           /* WRTORD */
+           );
+
+       /*
+        * Additive Latency
+        * For DDR I, 0.
+        * For DDR II, with ODT enabled, use "a value" less than ACTTORW,
+        * which comes from Trcd, and also note that:
+        *      add_lat + caslat must be >= 4
+        */
+       add_lat = 0;
+       if (spd.mem_type == SPD_MEMTYPE_DDR2
+           && (odt_wr_cfg || odt_rd_cfg)
+           && (caslat < 4)) {
+               add_lat = trcd_clk - 1;
+               if ((add_lat + caslat) < 4) {
+                       add_lat = 0;
+               }
+       }
 
-       ddr->timing_cfg_2 = 0x00000800;
+       /*
+        * Write Data Delay
+        * Historically 0x2 == 4/8 clock delay.
+        * Empirically, 0x3 == 6/8 clock delay is suggested for DDR I 266.
+        */
+       wr_data_delay = 2;
+
+       /*
+        * Write Latency
+        * Read to Precharge
+        * Minimum CKE Pulse Width.
+        * Four Activate Window
+        */
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               /*
+                * This is a lie.  It should really be 1, but if it is
+                * set to 1, bits overlap into the old controller's
+                * otherwise unused ACSM field.  If we leave it 0, then
+                * the HW will magically treat it as 1 for DDR 1.  Oh Yea.
+                */
+               wr_lat = 0;
+
+               trtp_clk = 2;           /* By the book. */
+               cke_min_clk = 1;        /* By the book. */
+               four_act = 1;           /* By the book. */
+
+       } else {
+               wr_lat = caslat - 1;
+
+               /* Convert SPD value from quarter nanos to picos. */
+               trtp_clk = picos_to_clk(spd.trtp * 250);
+
+               cke_min_clk = 3;        /* By the book. */
+               four_act = picos_to_clk(37500); /* By the book. 1k pages? */
+       }
+
+       /*
+        * Empirically set ~MCAS-to-preamble override for DDR 2.
+        * Your milage will vary.
+        */
+       cpo = 0;
+       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
+               if (effective_data_rate == 266 || effective_data_rate == 333) {
+                       cpo = 0x7;              /* READ_LAT + 5/4 */
+               } else if (effective_data_rate == 400) {
+                       cpo = 0x9;              /* READ_LAT + 7/4 */
+               } else {
+                       /* Automatic calibration */
+                       cpo = 0x1f;
+               }
+       }
+
+       ddr->timing_cfg_2 = (0
+               | ((add_lat & 0x7) << 28)               /* ADD_LAT */
+               | ((cpo & 0x1f) << 23)                  /* CPO */
+               | ((wr_lat & 0x7) << 19)                /* WR_LAT */
+               | ((trtp_clk & 0x7) << 13)              /* RD_TO_PRE */
+               | ((wr_data_delay & 0x7) << 10)         /* WR_DATA_DELAY */
+               | ((cke_min_clk & 0x7) << 6)            /* CKE_PLS */
+               | ((four_act & 0x1f) << 0)              /* FOUR_ACT */
+               );
 
        debug("DDR:timing_cfg_1=0x%08x\n", ddr->timing_cfg_1);
        debug("DDR:timing_cfg_2=0x%08x\n", ddr->timing_cfg_2);
-       /* Setup init value, but not enable */
-       ddr->sdram_cfg = 0x42000000;
 
        /* Check DIMM data bus width */
        if (spd.dataw_lsb == 0x20) {
@@ -384,7 +590,8 @@ long int spd_sdram()
        /* Burst length is always 4 for 64 bit data bus, 8 for 32 bit data bus,
           Burst type is sequential
         */
-       switch (caslat) {
+       if (spd.mem_type == SPD_MEMTYPE_DDR) {
+               switch (caslat) {
                case 1:
                        ddr->sdram_mode = 0x50 | burstlen; /* CL=1.5 */
                        break;
@@ -400,9 +607,36 @@ long int spd_sdram()
                default:
                        printf("DDR:only CL 1.5, 2.0, 2.5, 3.0 is supported\n");
                        return 0;
+               }
+       } else {
+               mode_odt_enable = 0x0;                  /* Default disabled */
+               if (odt_wr_cfg || odt_rd_cfg) {
+                       /*
+                        * Bits 6 and 2 in Extended MRS(1)
+                        * Bit 2 == 0x04 == 75 Ohm, with 2 DIMM modules.
+                        * Bit 6 == 0x40 == 150 Ohm, with 1 DIMM module.
+                        */
+                       mode_odt_enable = 0x40;         /* 150 Ohm */
+               }
+
+               ddr->sdram_mode =
+                       (0
+                        | (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 */
+                        | (caslat << 4)                /* caslat */
+                        | (burstlen << 0)              /* Burst length */
+                       );
        }
        debug("DDR:sdram_mode=0x%08x\n", ddr->sdram_mode);
 
+       /*
+        * Clear EMRS2 and EMRS3.
+        */
+       ddr->sdram_mode2 = 0;
+       debug("DDR: sdram_mode2 = 0x%08x\n", ddr->sdram_mode2);
+
        switch (spd.refresh) {
                case 0x00:
                case 0x80:
@@ -440,10 +674,31 @@ long int spd_sdram()
        ddr->sdram_interval = ((refresh_clk & 0x3fff) << 16) | 0x100;
        debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval);
 
+       /*
+        * SDRAM Cfg 2
+        */
+       odt_cfg = 0;
+       if (odt_rd_cfg | odt_wr_cfg) {
+               odt_cfg = 0x2;          /* ODT to IOs during reads */
+       }
+       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
+               ddr->sdram_cfg2 = (0
+                           | (0 << 26) /* True DQS */
+                           | (odt_cfg << 21)   /* ODT only read */
+                           | (1 << 12) /* 1 refresh at a time */
+                           );
+
+               debug("DDR: sdram_cfg2  = 0x%08x\n", ddr->sdram_cfg2);
+       }
+
+#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);
 
        asm("sync;isync");
@@ -458,11 +713,22 @@ long int spd_sdram()
         *
         * sdram_cfg[0]   = 1 (ddr sdram logic enable)
         * sdram_cfg[1]   = 1 (self-refresh-enable)
-        * sdram_cfg[6:7] = 2 (SDRAM type = DDR SDRAM)
+        * sdram_cfg[5:7] = (SDRAM type = DDR SDRAM)
+        *                      010 DDR 1 SDRAM
+        *                      011 DDR 2 SDRAM
         * sdram_cfg[12] = 0 (32_BE =0 , 64 bit bus mode)
         * sdram_cfg[13] = 0 (8_BE =0, 4-beat bursts)
         */
-       sdram_cfg = 0xC2000000;
+       if (spd.mem_type == SPD_MEMTYPE_DDR)
+               sdram_type = 2;
+       else
+               sdram_type = 3;
+
+       sdram_cfg = (0
+                    | (1 << 31)                        /* DDR enable */
+                    | (1 << 30)                        /* Self refresh */
+                    | (sdram_type << 24)               /* SDRAM type */
+                    );
 
        /* sdram_cfg[3] = RD_EN - registered DIMM enable */
        if (spd.mod_attr & 0x02)
index 7e53b1e6061c69fab129da0d6f42bee3c0ea8985..c75993059e0a28a3fbf56efb3865817d7fd969d3 100644 (file)
@@ -99,7 +99,7 @@ int get_clocks(void)
        u32 lcrr;
 
        u32 csb_clk;
-#if defined(CONFIG_MPC8349)
+#if defined(CONFIG_MPC834X)
        u32 tsec1_clk;
        u32 tsec2_clk;
        u32 usbmph_clk;
@@ -107,15 +107,19 @@ int get_clocks(void)
 #endif
        u32 core_clk;
        u32 i2c1_clk;
+#if !defined(CONFIG_MPC832X)
        u32 i2c2_clk;
+#endif
        u32 enc_clk;
        u32 lbiu_clk;
        u32 lclk_clk;
        u32 ddr_clk;
-#if defined (CONFIG_MPC8360)
+#if defined(CONFIG_MPC8360)
+       u32 ddr_sec_clk;
+#endif
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
        u32 qepmf;
        u32 qepdf;
-       u32 ddr_sec_clk;
        u32 qe_clk;
        u32 brg_clk;
 #endif
@@ -139,12 +143,12 @@ int get_clocks(void)
 #endif
        }
 
-       spmf = ((im->reset.rcwl & RCWL_SPMF) >> RCWL_SPMF_SHIFT);
+       spmf = ((im->reset.rcwl & HRCWL_SPMF) >> HRCWL_SPMF_SHIFT);
        csb_clk = pci_sync_in * (1 + clkin_div) * spmf;
 
        sccr = im->clk.sccr;
 
-#if defined(CONFIG_MPC8349)
+#if defined(CONFIG_MPC834X)
        switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {
        case 0:
                tsec1_clk = 0;
@@ -227,10 +231,12 @@ int get_clocks(void)
                return -9;
        }
 #endif
-#if defined (CONFIG_MPC8360)
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
        i2c1_clk = csb_clk;
 #endif
+#if !defined(CONFIG_MPC832X)
        i2c2_clk = csb_clk;     /* i2c-2 clk is equal to csb clk */
+#endif
 
        switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) {
        case 0:
@@ -249,12 +255,9 @@ int get_clocks(void)
                /* unkown SCCR_ENCCM value */
                return -6;
        }
-#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360)
+
        lbiu_clk = csb_clk *
-                  (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT));
-#else
-#error Unknown MPC83xx chip
-#endif
+                  (1 + ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT));
        lcrr = (im->lbus.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT;
        switch (lcrr) {
        case 2:
@@ -266,16 +269,13 @@ int get_clocks(void)
                /* unknown lcrr */
                return -10;
        }
-#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360)
+
        ddr_clk = csb_clk *
-                 (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT));
-       corepll = (im->reset.rcwl & RCWL_COREPLL) >> RCWL_COREPLL_SHIFT;
-#if defined (CONFIG_MPC8360)
+                 (1 + ((im->reset.rcwl & HRCWL_DDRCM) >> HRCWL_DDRCM_SHIFT));
+       corepll = (im->reset.rcwl & HRCWL_COREPLL) >> HRCWL_COREPLL_SHIFT;
+#if defined(CONFIG_MPC8360)
        ddr_sec_clk = csb_clk * (1 +
-                      ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT));
-#endif
-#else
-#error Unknown MPC83xx chip
+                      ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT));
 #endif
 
        corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5);
@@ -306,15 +306,15 @@ int get_clocks(void)
                return -12;
        }
 
-#if defined (CONFIG_MPC8360)
-       qepmf = (im->reset.rcwl & RCWL_CEPMF) >> RCWL_CEPMF_SHIFT;
-       qepdf = (im->reset.rcwl & RCWL_CEPDF) >> RCWL_CEPDF_SHIFT;
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
+       qepmf = (im->reset.rcwl & HRCWL_CEPMF) >> HRCWL_CEPMF_SHIFT;
+       qepdf = (im->reset.rcwl & HRCWL_CEPDF) >> HRCWL_CEPDF_SHIFT;
        qe_clk = (pci_sync_in * qepmf) / (1 + qepdf);
        brg_clk = qe_clk / 2;
 #endif
 
        gd->csb_clk = csb_clk;
-#if defined(CONFIG_MPC8349)
+#if defined(CONFIG_MPC834X)
        gd->tsec1_clk = tsec1_clk;
        gd->tsec2_clk = tsec2_clk;
        gd->usbmph_clk = usbmph_clk;
@@ -322,13 +322,17 @@ int get_clocks(void)
 #endif
        gd->core_clk = core_clk;
        gd->i2c1_clk = i2c1_clk;
+#if !defined(CONFIG_MPC832X)
        gd->i2c2_clk = i2c2_clk;
+#endif
        gd->enc_clk = enc_clk;
        gd->lbiu_clk = lbiu_clk;
        gd->lclk_clk = lclk_clk;
        gd->ddr_clk = ddr_clk;
-#if defined (CONFIG_MPC8360)
+#if defined(CONFIG_MPC8360)
        gd->ddr_sec_clk = ddr_sec_clk;
+#endif
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
        gd->qe_clk = qe_clk;
        gd->brg_clk = brg_clk;
 #endif
@@ -352,19 +356,22 @@ int print_clock_conf(void)
        printf("Clock configuration:\n");
        printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);
        printf("  Core:                %4d MHz\n", gd->core_clk / 1000000);
-#if defined (CONFIG_MPC8360)
+#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);
 #endif
        printf("  Local Bus Controller:%4d MHz\n", gd->lbiu_clk / 1000000);
        printf("  Local Bus:           %4d MHz\n", gd->lclk_clk / 1000000);
        printf("  DDR:                 %4d MHz\n", gd->ddr_clk / 1000000);
-#if defined (CONFIG_MPC8360)
+#if defined(CONFIG_MPC8360)
        printf("  DDR Secondary:       %4d MHz\n", gd->ddr_sec_clk / 1000000);
 #endif
        printf("  SEC:                 %4d MHz\n", gd->enc_clk / 1000000);
        printf("  I2C1:                %4d MHz\n", gd->i2c1_clk / 1000000);
+#if !defined(CONFIG_MPC832X)
        printf("  I2C2:                %4d MHz\n", gd->i2c2_clk / 1000000);
-#if defined(CONFIG_MPC8349)
+#endif
+#if defined(CONFIG_MPC834X)
        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);
index 0f27bb61f8cec196394b61ac00208dbff119b7e2..6ee9ec96c97b888b812871a43e440a2aa92300fb 100644 (file)
        END_GOT
 
 /*
- * Version string - must be in data segment because MPC83xx uses the
- * first 256 bytes for the Hard Reset Configuration Word table (see
- * below).  Similarly, can't have the U-Boot Magic Number as the first
- * thing in the image - don't know how this will affect the image tools,
- * but I guess I'll find out soon.
+ * The Hard Reset Configuration Word (HRCW) table is in the first 64
+ * (0x40) bytes of flash.  It has 8 bytes, but each byte is repeated 8
+ * times so the processor can fetch it out of flash whether the flash
+ * is 8, 16, 32, or 64 bits wide (hardware trickery).
  */
-       .data
-       .globl  version_string
-version_string:
-       .ascii U_BOOT_VERSION
-       .ascii " (", __DATE__, " - ", __TIME__, ")"
-       .ascii " ", CONFIG_IDENT_STRING, "\0"
-
        .text
 #define _HRCW_TABLE_ENTRY(w)           \
        .fill   8,1,(((w)>>24)&0xff);   \
@@ -100,6 +92,18 @@ version_string:
        _HRCW_TABLE_ENTRY(CFG_HRCW_LOW)
        _HRCW_TABLE_ENTRY(CFG_HRCW_HIGH)
 
+/*
+ * Magic number and version string - put it after the HRCW since it
+ * cannot be first in flash like it is in many other processors.
+ */
+       .long   0x27051956              /* U-Boot Magic Number */
+
+       .globl  version_string
+version_string:
+       .ascii U_BOOT_VERSION
+       .ascii " (", __DATE__, " - ", __TIME__, ")"
+       .ascii " ", CONFIG_IDENT_STRING, "\0"
+
 
 #ifndef CONFIG_DEFAULT_IMMR
 #error CONFIG_DEFAULT_IMMR must be defined
diff --git a/cpu/ppc4xx/40x_spd_sdram.c b/cpu/ppc4xx/40x_spd_sdram.c
new file mode 100644 (file)
index 0000000..19c4f76
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ * cpu/ppc4xx/40x_spd_sdram.c
+ * This SPD SDRAM detection code supports IBM/AMCC PPC44x cpu with a
+ * SDRAM controller. Those are all current 405 PPC's.
+ *
+ * (C) Copyright 2001
+ * Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
+ *
+ * Based on code by:
+ *
+ * Kenneth Johansson ,Ericsson AB.
+ * kenneth.johansson@etx.ericsson.se
+ *
+ * hacked up by bill hunter. fixed so we could run before
+ * serial_init and console_init. previous version avoided this by
+ * running out of cache memory during serial/console init, then running
+ * this code later.
+ *
+ * (C) Copyright 2002
+ * Jun Gu, Artesyn Technology, jung@artesyncp.com
+ * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
+ *
+ * (C) Copyright 2005
+ * 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 <asm/processor.h>
+#include <i2c.h>
+#include <ppc4xx.h>
+
+#if defined(CONFIG_SPD_EEPROM) && !defined(CONFIG_440)
+
+/*
+ * Set default values
+ */
+#ifndef CFG_I2C_SPEED
+#define CFG_I2C_SPEED  50000
+#endif
+
+#ifndef CFG_I2C_SLAVE
+#define CFG_I2C_SLAVE  0xFE
+#endif
+
+#define ONE_BILLION    1000000000
+
+#define         SDRAM0_CFG_DCE         0x80000000
+#define         SDRAM0_CFG_SRE         0x40000000
+#define         SDRAM0_CFG_PME         0x20000000
+#define         SDRAM0_CFG_MEMCHK      0x10000000
+#define         SDRAM0_CFG_REGEN       0x08000000
+#define         SDRAM0_CFG_ECCDD       0x00400000
+#define         SDRAM0_CFG_EMDULR      0x00200000
+#define         SDRAM0_CFG_DRW_SHIFT   (31-6)
+#define         SDRAM0_CFG_BRPF_SHIFT  (31-8)
+
+#define         SDRAM0_TR_CASL_SHIFT   (31-8)
+#define         SDRAM0_TR_PTA_SHIFT    (31-13)
+#define         SDRAM0_TR_CTP_SHIFT    (31-15)
+#define         SDRAM0_TR_LDF_SHIFT    (31-17)
+#define         SDRAM0_TR_RFTA_SHIFT   (31-29)
+#define         SDRAM0_TR_RCD_SHIFT    (31-31)
+
+#define         SDRAM0_RTR_SHIFT       (31-15)
+#define         SDRAM0_ECCCFG_SHIFT    (31-11)
+
+/* SDRAM0_CFG enable macro  */
+#define SDRAM0_CFG_BRPF(x) ( ( x & 0x3)<< SDRAM0_CFG_BRPF_SHIFT )
+
+#define SDRAM0_BXCR_SZ_MASK    0x000e0000
+#define SDRAM0_BXCR_AM_MASK    0x0000e000
+
+#define SDRAM0_BXCR_SZ_SHIFT   (31-14)
+#define SDRAM0_BXCR_AM_SHIFT   (31-18)
+
+#define SDRAM0_BXCR_SZ(x)      ( (( x << SDRAM0_BXCR_SZ_SHIFT) & SDRAM0_BXCR_SZ_MASK) )
+#define SDRAM0_BXCR_AM(x)      ( (( x << SDRAM0_BXCR_AM_SHIFT) & SDRAM0_BXCR_AM_MASK) )
+
+#ifdef CONFIG_SPDDRAM_SILENT
+# define SPD_ERR(x) do { return 0; } while (0)
+#else
+# define SPD_ERR(x) do { printf(x); return(0); } while (0)
+#endif
+
+#define sdram_HZ_to_ns(hertz) (1000000000/(hertz))
+
+/* function prototypes */
+int spd_read(uint addr);
+
+
+/*
+ * This function is reading data from the DIMM module EEPROM over the SPD bus
+ * and uses that to program the sdram controller.
+ *
+ * This works on boards that has the same schematics that the AMCC walnut has.
+ *
+ * Input: null for default I2C spd functions or a pointer to a custom function
+ * returning spd_data.
+ */
+
+long int spd_sdram(int(read_spd)(uint addr))
+{
+       int tmp,row,col;
+       int total_size,bank_size,bank_code;
+       int ecc_on;
+       int mode;
+       int bank_cnt;
+
+       int sdram0_pmit=0x07c00000;
+#ifndef CONFIG_405EP /* not on PPC405EP */
+       int sdram0_besr0=-1;
+       int sdram0_besr1=-1;
+       int sdram0_eccesr=-1;
+#endif
+       int sdram0_ecccfg;
+
+       int sdram0_rtr=0;
+       int sdram0_tr=0;
+
+       int sdram0_b0cr;
+       int sdram0_b1cr;
+       int sdram0_b2cr;
+       int sdram0_b3cr;
+
+       int sdram0_cfg=0;
+
+       int t_rp;
+       int t_rcd;
+       int t_ras;
+       int t_rc;
+       int min_cas;
+
+       PPC405_SYS_INFO sys_info;
+       unsigned long bus_period_x_10;
+
+       /*
+        * get the board info
+        */
+       get_sys_info(&sys_info);
+       bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
+
+       if (read_spd == 0){
+               read_spd=spd_read;
+               /*
+                * Make sure I2C controller is initialized
+                * before continuing.
+                */
+               i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+       }
+
+       /* Make shure we are using SDRAM */
+       if (read_spd(2) != 0x04) {
+               SPD_ERR("SDRAM - non SDRAM memory module found\n");
+       }
+
+       /* ------------------------------------------------------------------
+        * configure memory timing register
+        *
+        * data from DIMM:
+        * 27   IN Row Precharge Time ( t RP)
+        * 29   MIN RAS to CAS Delay ( t RCD)
+        * 127   Component and Clock Detail ,clk0-clk3, junction temp, CAS
+        * -------------------------------------------------------------------*/
+
+       /*
+        * first figure out which cas latency mode to use
+        * use the min supported mode
+        */
+
+       tmp = read_spd(127) & 0x6;
+       if (tmp == 0x02) {              /* only cas = 2 supported */
+               min_cas = 2;
+/*             t_ck = read_spd(9); */
+/*             t_ac = read_spd(10); */
+       } else if (tmp == 0x04) {       /* only cas = 3 supported */
+               min_cas = 3;
+/*             t_ck = read_spd(9); */
+/*             t_ac = read_spd(10); */
+       } else if (tmp == 0x06) {       /* 2,3 supported, so use 2 */
+               min_cas = 2;
+/*             t_ck = read_spd(23); */
+/*             t_ac = read_spd(24); */
+       } else {
+               SPD_ERR("SDRAM - unsupported CAS latency \n");
+       }
+
+       /* get some timing values, t_rp,t_rcd,t_ras,t_rc
+        */
+       t_rp = read_spd(27);
+       t_rcd = read_spd(29);
+       t_ras = read_spd(30);
+       t_rc = t_ras + t_rp;
+
+       /* The following timing calcs subtract 1 before deviding.
+        * this has effect of using ceiling instead of floor rounding,
+        * and also subtracting 1 to convert number to reg value
+        */
+       /* set up CASL */
+       sdram0_tr = (min_cas - 1) << SDRAM0_TR_CASL_SHIFT;
+       /* set up PTA */
+       sdram0_tr |= ((((t_rp - 1) * 10)/bus_period_x_10) & 0x3) << SDRAM0_TR_PTA_SHIFT;
+       /* set up CTP */
+       tmp = (((t_rc - t_rcd - t_rp -1) * 10) / bus_period_x_10) & 0x3;
+       if (tmp < 1)
+               tmp = 1;
+       sdram0_tr |= tmp << SDRAM0_TR_CTP_SHIFT;
+       /* set LDF      = 2 cycles, reg value = 1 */
+       sdram0_tr |= 1 << SDRAM0_TR_LDF_SHIFT;
+       /* set RFTA = t_rfc/bus_period, use t_rfc = t_rc */
+       tmp = (((t_rc - 1) * 10) / bus_period_x_10) - 3;
+       if (tmp < 0)
+               tmp = 0;
+       if (tmp > 6)
+               tmp = 6;
+       sdram0_tr |= tmp << SDRAM0_TR_RFTA_SHIFT;
+       /* set RCD = t_rcd/bus_period*/
+       sdram0_tr |= ((((t_rcd - 1) * 10) / bus_period_x_10) &0x3) << SDRAM0_TR_RCD_SHIFT ;
+
+
+       /*------------------------------------------------------------------
+        * configure RTR register
+        * -------------------------------------------------------------------*/
+       row = read_spd(3);
+       col = read_spd(4);
+       tmp = read_spd(12) & 0x7f ; /* refresh type less self refresh bit */
+       switch (tmp) {
+       case 0x00:
+               tmp = 15625;
+               break;
+       case 0x01:
+               tmp = 15625 / 4;
+               break;
+       case 0x02:
+               tmp = 15625 / 2;
+               break;
+       case 0x03:
+               tmp = 15625 * 2;
+               break;
+       case 0x04:
+               tmp = 15625 * 4;
+               break;
+       case 0x05:
+               tmp = 15625 * 8;
+               break;
+       default:
+               SPD_ERR("SDRAM - Bad refresh period \n");
+       }
+       /* convert from nsec to bus cycles */
+       tmp = (tmp * 10) / bus_period_x_10;
+       sdram0_rtr = (tmp & 0x3ff8) <<  SDRAM0_RTR_SHIFT;
+
+       /*------------------------------------------------------------------
+        * determine the number of banks used
+        * -------------------------------------------------------------------*/
+       /* byte 7:6 is module data width */
+       if (read_spd(7) != 0)
+               SPD_ERR("SDRAM - unsupported module width\n");
+       tmp = read_spd(6);
+       if (tmp < 32)
+               SPD_ERR("SDRAM - unsupported module width\n");
+       else if (tmp < 64)
+               bank_cnt = 1;           /* one bank per sdram side */
+       else if (tmp < 73)
+               bank_cnt = 2;   /* need two banks per side */
+       else if (tmp < 161)
+               bank_cnt = 4;   /* need four banks per side */
+       else
+               SPD_ERR("SDRAM - unsupported module width\n");
+
+       /* byte 5 is the module row count (refered to as dimm "sides") */
+       tmp = read_spd(5);
+       if (tmp == 1)
+               ;
+       else if (tmp==2)
+               bank_cnt *= 2;
+       else if (tmp==4)
+               bank_cnt *= 4;
+       else
+               bank_cnt = 8;           /* 8 is an error code */
+
+       if (bank_cnt > 4)       /* we only have 4 banks to work with */
+               SPD_ERR("SDRAM - unsupported module rows for this width\n");
+
+       /* now check for ECC ability of module. We only support ECC
+        *   on 32 bit wide devices with 8 bit ECC.
+        */
+       if ((read_spd(11)==2) && (read_spd(6)==40) && (read_spd(14)==8)) {
+               sdram0_ecccfg = 0xf << SDRAM0_ECCCFG_SHIFT;
+               ecc_on = 1;
+       } else {
+               sdram0_ecccfg = 0;
+               ecc_on = 0;
+       }
+
+       /*------------------------------------------------------------------
+        * calculate total size
+        * -------------------------------------------------------------------*/
+       /* calculate total size and do sanity check */
+       tmp = read_spd(31);
+       total_size = 1 << 22;   /* total_size = 4MB */
+       /* now multiply 4M by the smallest device row density */
+       /* note that we don't support asymetric rows */
+       while (((tmp & 0x0001) == 0) && (tmp != 0)) {
+               total_size = total_size << 1;
+               tmp = tmp >> 1;
+       }
+       total_size *= read_spd(5);      /* mult by module rows (dimm sides) */
+
+       /*------------------------------------------------------------------
+        * map  rows * cols * banks to a mode
+        * -------------------------------------------------------------------*/
+
+       switch (row) {
+       case 11:
+               switch (col) {
+               case 8:
+                       mode=4; /* mode 5 */
+                       break;
+               case 9:
+               case 10:
+                       mode=0; /* mode 1 */
+                       break;
+               default:
+                       SPD_ERR("SDRAM - unsupported mode\n");
+               }
+               break;
+       case 12:
+               switch (col) {
+               case 8:
+                       mode=3; /* mode 4 */
+                       break;
+               case 9:
+               case 10:
+                       mode=1; /* mode 2 */
+                       break;
+               default:
+                       SPD_ERR("SDRAM - unsupported mode\n");
+               }
+               break;
+       case 13:
+               switch (col) {
+               case 8:
+                       mode=5; /* mode 6 */
+                       break;
+               case 9:
+               case 10:
+                       if (read_spd(17) == 2)
+                               mode = 6; /* mode 7 */
+                       else
+                               mode = 2; /* mode 3 */
+                       break;
+               case 11:
+                       mode = 2; /* mode 3 */
+                       break;
+               default:
+                       SPD_ERR("SDRAM - unsupported mode\n");
+               }
+               break;
+       default:
+               SPD_ERR("SDRAM - unsupported mode\n");
+       }
+
+       /*------------------------------------------------------------------
+        * using the calculated values, compute the bank
+        * config register values.
+        * -------------------------------------------------------------------*/
+       sdram0_b1cr = 0;
+       sdram0_b2cr = 0;
+       sdram0_b3cr = 0;
+
+       /* compute the size of each bank */
+       bank_size = total_size / bank_cnt;
+       /* convert bank size to bank size code for ppc4xx
+          by takeing log2(bank_size) - 22 */
+       tmp = bank_size;                /* start with tmp = bank_size */
+       bank_code = 0;                  /* and bank_code = 0 */
+       while (tmp > 1) {               /* this takes log2 of tmp */
+               bank_code++;            /* and stores result in bank_code */
+               tmp = tmp >> 1;
+       }                               /* bank_code is now log2(bank_size) */
+       bank_code -= 22;                /* subtract 22 to get the code */
+
+       tmp = SDRAM0_BXCR_SZ(bank_code) | SDRAM0_BXCR_AM(mode) | 1;
+       sdram0_b0cr = (bank_size * 0) | tmp;
+#ifndef CONFIG_405EP /* not on PPC405EP */
+       if (bank_cnt > 1)
+               sdram0_b2cr = (bank_size * 1) | tmp;
+       if (bank_cnt > 2)
+               sdram0_b1cr = (bank_size * 2) | tmp;
+       if (bank_cnt > 3)
+               sdram0_b3cr = (bank_size * 3) | tmp;
+#else
+       /* PPC405EP chip only supports two SDRAM banks */
+       if (bank_cnt > 1)
+               sdram0_b1cr = (bank_size * 1) | tmp;
+       if (bank_cnt > 2)
+               total_size = 2 * bank_size;
+#endif
+
+       /*
+        *   enable sdram controller DCE=1
+        *  enable burst read prefetch to 32 bytes BRPF=2
+        *  leave other functions off
+        */
+
+       /*------------------------------------------------------------------
+        * now that we've done our calculations, we are ready to
+        * program all the registers.
+        * -------------------------------------------------------------------*/
+
+#define mtsdram0(reg, data)  mtdcr(memcfga,reg);mtdcr(memcfgd,data)
+       /* disable memcontroller so updates work */
+       mtsdram0( mem_mcopt1, 0 );
+
+#ifndef CONFIG_405EP /* not on PPC405EP */
+       mtsdram0( mem_besra , sdram0_besr0 );
+       mtsdram0( mem_besrb , sdram0_besr1 );
+       mtsdram0( mem_ecccf , sdram0_ecccfg );
+       mtsdram0( mem_eccerr, sdram0_eccesr );
+#endif
+       mtsdram0( mem_rtr   , sdram0_rtr );
+       mtsdram0( mem_pmit  , sdram0_pmit );
+       mtsdram0( mem_mb0cf , sdram0_b0cr );
+       mtsdram0( mem_mb1cf , sdram0_b1cr );
+#ifndef CONFIG_405EP /* not on PPC405EP */
+       mtsdram0( mem_mb2cf , sdram0_b2cr );
+       mtsdram0( mem_mb3cf , sdram0_b3cr );
+#endif
+       mtsdram0( mem_sdtr1 , sdram0_tr );
+
+       /* SDRAM have a power on delay,  500 micro should do */
+       udelay(500);
+       sdram0_cfg = SDRAM0_CFG_DCE | SDRAM0_CFG_BRPF(1) | SDRAM0_CFG_ECCDD | SDRAM0_CFG_EMDULR;
+       if (ecc_on)
+               sdram0_cfg |= SDRAM0_CFG_MEMCHK;
+       mtsdram0(mem_mcopt1, sdram0_cfg);
+
+       return (total_size);
+}
+
+int spd_read(uint addr)
+{
+       uchar data[2];
+
+       if (i2c_read(SPD_EEPROM_ADDRESS, addr, 1, data, 1) == 0)
+               return (int)data[0];
+       else
+               return 0;
+}
+
+#endif /* CONFIG_SPD_EEPROM */
diff --git a/cpu/ppc4xx/44x_spd_ddr.c b/cpu/ppc4xx/44x_spd_ddr.c
new file mode 100644 (file)
index 0000000..10b4c18
--- /dev/null
@@ -0,0 +1,1449 @@
+/*
+ * cpu/ppc4xx/44x_spd_ddr.c
+ * This SPD DDR detection code supports IBM/AMCC PPC44x cpu with a
+ * DDR controller. Those are 440GP/GX/EP/GR.
+ *
+ * (C) Copyright 2001
+ * Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
+ *
+ * Based on code by:
+ *
+ * Kenneth Johansson ,Ericsson AB.
+ * kenneth.johansson@etx.ericsson.se
+ *
+ * hacked up by bill hunter. fixed so we could run before
+ * serial_init and console_init. previous version avoided this by
+ * running out of cache memory during serial/console init, then running
+ * this code later.
+ *
+ * (C) Copyright 2002
+ * Jun Gu, Artesyn Technology, jung@artesyncp.com
+ * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
+ *
+ * (C) Copyright 2005
+ * 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 <asm/processor.h>
+#include <i2c.h>
+#include <ppc4xx.h>
+#include <asm/mmu.h>
+
+#if defined(CONFIG_SPD_EEPROM) &&                                      \
+       (defined(CONFIG_440GP) || defined(CONFIG_440GX) ||              \
+        defined(CONFIG_440EP) || defined(CONFIG_440GR))
+
+/*
+ * Set default values
+ */
+#ifndef CFG_I2C_SPEED
+#define CFG_I2C_SPEED  50000
+#endif
+
+#ifndef CFG_I2C_SLAVE
+#define CFG_I2C_SLAVE  0xFE
+#endif
+
+#define ONE_BILLION    1000000000
+
+/*-----------------------------------------------------------------------------
+  |  Memory Controller Options 0
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_CFG0_DCEN                0x80000000      /* SDRAM Controller Enable      */
+#define SDRAM_CFG0_MCHK_MASK   0x30000000      /* Memory data errchecking mask */
+#define SDRAM_CFG0_MCHK_NON    0x00000000      /* No ECC generation            */
+#define SDRAM_CFG0_MCHK_GEN    0x20000000      /* ECC generation               */
+#define SDRAM_CFG0_MCHK_CHK    0x30000000      /* ECC generation and checking  */
+#define SDRAM_CFG0_RDEN                0x08000000      /* Registered DIMM enable       */
+#define SDRAM_CFG0_PMUD                0x04000000      /* Page management unit         */
+#define SDRAM_CFG0_DMWD_MASK   0x02000000      /* DRAM width mask              */
+#define SDRAM_CFG0_DMWD_32     0x00000000      /* 32 bits                      */
+#define SDRAM_CFG0_DMWD_64     0x02000000      /* 64 bits                      */
+#define SDRAM_CFG0_UIOS_MASK   0x00C00000      /* Unused IO State              */
+#define SDRAM_CFG0_PDP         0x00200000      /* Page deallocation policy     */
+
+/*-----------------------------------------------------------------------------
+  |  Memory Controller Options 1
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_CFG1_SRE         0x80000000      /* Self-Refresh Entry           */
+#define SDRAM_CFG1_PMEN                0x40000000      /* Power Management Enable      */
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM DEVPOT Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_DEVOPT_DLL       0x80000000
+#define SDRAM_DEVOPT_DS                0x40000000
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM MCSTS Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_MCSTS_MRSC       0x80000000
+#define SDRAM_MCSTS_SRMS       0x40000000
+#define SDRAM_MCSTS_CIS                0x20000000
+
+/*-----------------------------------------------------------------------------
+  |  SDRAM Refresh Timer Register
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_RTR_RINT_MASK      0xFFFF0000
+#define SDRAM_RTR_RINT_ENCODE(n)  (((n) << 16) & SDRAM_RTR_RINT_MASK)
+#define sdram_HZ_to_ns(hertz)    (1000000000/(hertz))
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM UABus Base Address Reg
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_UABBA_UBBA_MASK  0x0000000F
+
+/*-----------------------------------------------------------------------------+
+  |  Memory Bank 0-7 configuration
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_BXCR_SDBA_MASK   0xff800000        /* Base address             */
+#define SDRAM_BXCR_SDSZ_MASK   0x000e0000        /* Size                     */
+#define SDRAM_BXCR_SDSZ_8      0x00020000        /*   8M                     */
+#define SDRAM_BXCR_SDSZ_16     0x00040000        /*  16M                     */
+#define SDRAM_BXCR_SDSZ_32     0x00060000        /*  32M                     */
+#define SDRAM_BXCR_SDSZ_64     0x00080000        /*  64M                     */
+#define SDRAM_BXCR_SDSZ_128    0x000a0000        /* 128M                     */
+#define SDRAM_BXCR_SDSZ_256    0x000c0000        /* 256M                     */
+#define SDRAM_BXCR_SDSZ_512    0x000e0000        /* 512M                     */
+#define SDRAM_BXCR_SDAM_MASK   0x0000e000        /* Addressing mode          */
+#define SDRAM_BXCR_SDAM_1      0x00000000        /*   Mode 1                 */
+#define SDRAM_BXCR_SDAM_2      0x00002000        /*   Mode 2                 */
+#define SDRAM_BXCR_SDAM_3      0x00004000        /*   Mode 3                 */
+#define SDRAM_BXCR_SDAM_4      0x00006000        /*   Mode 4                 */
+#define SDRAM_BXCR_SDBE                0x00000001        /* Memory Bank Enable       */
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM TR0 Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_TR0_SDWR_MASK    0x80000000
+#define         SDRAM_TR0_SDWR_2_CLK   0x00000000
+#define         SDRAM_TR0_SDWR_3_CLK   0x80000000
+#define SDRAM_TR0_SDWD_MASK    0x40000000
+#define         SDRAM_TR0_SDWD_0_CLK   0x00000000
+#define         SDRAM_TR0_SDWD_1_CLK   0x40000000
+#define SDRAM_TR0_SDCL_MASK    0x01800000
+#define         SDRAM_TR0_SDCL_2_0_CLK 0x00800000
+#define         SDRAM_TR0_SDCL_2_5_CLK 0x01000000
+#define         SDRAM_TR0_SDCL_3_0_CLK 0x01800000
+#define SDRAM_TR0_SDPA_MASK    0x000C0000
+#define         SDRAM_TR0_SDPA_2_CLK   0x00040000
+#define         SDRAM_TR0_SDPA_3_CLK   0x00080000
+#define         SDRAM_TR0_SDPA_4_CLK   0x000C0000
+#define SDRAM_TR0_SDCP_MASK    0x00030000
+#define         SDRAM_TR0_SDCP_2_CLK   0x00000000
+#define         SDRAM_TR0_SDCP_3_CLK   0x00010000
+#define         SDRAM_TR0_SDCP_4_CLK   0x00020000
+#define         SDRAM_TR0_SDCP_5_CLK   0x00030000
+#define SDRAM_TR0_SDLD_MASK    0x0000C000
+#define         SDRAM_TR0_SDLD_1_CLK   0x00000000
+#define         SDRAM_TR0_SDLD_2_CLK   0x00004000
+#define SDRAM_TR0_SDRA_MASK    0x0000001C
+#define         SDRAM_TR0_SDRA_6_CLK   0x00000000
+#define         SDRAM_TR0_SDRA_7_CLK   0x00000004
+#define         SDRAM_TR0_SDRA_8_CLK   0x00000008
+#define         SDRAM_TR0_SDRA_9_CLK   0x0000000C
+#define         SDRAM_TR0_SDRA_10_CLK  0x00000010
+#define         SDRAM_TR0_SDRA_11_CLK  0x00000014
+#define         SDRAM_TR0_SDRA_12_CLK  0x00000018
+#define         SDRAM_TR0_SDRA_13_CLK  0x0000001C
+#define SDRAM_TR0_SDRD_MASK    0x00000003
+#define         SDRAM_TR0_SDRD_2_CLK   0x00000001
+#define         SDRAM_TR0_SDRD_3_CLK   0x00000002
+#define         SDRAM_TR0_SDRD_4_CLK   0x00000003
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM TR1 Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_TR1_RDSS_MASK    0xC0000000
+#define         SDRAM_TR1_RDSS_TR0     0x00000000
+#define         SDRAM_TR1_RDSS_TR1     0x40000000
+#define         SDRAM_TR1_RDSS_TR2     0x80000000
+#define         SDRAM_TR1_RDSS_TR3     0xC0000000
+#define SDRAM_TR1_RDSL_MASK    0x00C00000
+#define         SDRAM_TR1_RDSL_STAGE1  0x00000000
+#define         SDRAM_TR1_RDSL_STAGE2  0x00400000
+#define         SDRAM_TR1_RDSL_STAGE3  0x00800000
+#define SDRAM_TR1_RDCD_MASK    0x00000800
+#define         SDRAM_TR1_RDCD_RCD_0_0 0x00000000
+#define         SDRAM_TR1_RDCD_RCD_1_2 0x00000800
+#define SDRAM_TR1_RDCT_MASK    0x000001FF
+#define         SDRAM_TR1_RDCT_ENCODE(x)  (((x) << 0) & SDRAM_TR1_RDCT_MASK)
+#define         SDRAM_TR1_RDCT_DECODE(x)  (((x) & SDRAM_TR1_RDCT_MASK) >> 0)
+#define         SDRAM_TR1_RDCT_MIN     0x00000000
+#define         SDRAM_TR1_RDCT_MAX     0x000001FF
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM WDDCTR Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_WDDCTR_WRCP_MASK 0xC0000000
+#define         SDRAM_WDDCTR_WRCP_0DEG   0x00000000
+#define         SDRAM_WDDCTR_WRCP_90DEG  0x40000000
+#define         SDRAM_WDDCTR_WRCP_180DEG 0x80000000
+#define SDRAM_WDDCTR_DCD_MASK  0x000001FF
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM CLKTR Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_CLKTR_CLKP_MASK  0xC0000000
+#define         SDRAM_CLKTR_CLKP_0DEG    0x00000000
+#define         SDRAM_CLKTR_CLKP_90DEG   0x40000000
+#define         SDRAM_CLKTR_CLKP_180DEG  0x80000000
+#define SDRAM_CLKTR_DCDT_MASK  0x000001FF
+
+/*-----------------------------------------------------------------------------+
+  |  SDRAM DLYCAL Options
+  +-----------------------------------------------------------------------------*/
+#define SDRAM_DLYCAL_DLCV_MASK 0x000003FC
+#define         SDRAM_DLYCAL_DLCV_ENCODE(x) (((x)<<2) & SDRAM_DLYCAL_DLCV_MASK)
+#define         SDRAM_DLYCAL_DLCV_DECODE(x) (((x) & SDRAM_DLYCAL_DLCV_MASK)>>2)
+
+/*-----------------------------------------------------------------------------+
+  |  General Definition
+  +-----------------------------------------------------------------------------*/
+#define DEFAULT_SPD_ADDR1      0x53
+#define DEFAULT_SPD_ADDR2      0x52
+#define MAXBANKS               4               /* at most 4 dimm banks */
+#define MAX_SPD_BYTES          256
+#define NUMHALFCYCLES          4
+#define NUMMEMTESTS            8
+#define NUMMEMWORDS            8
+#define MAXBXCR                        4
+#define TRUE                   1
+#define FALSE                  0
+
+/*
+ * This DDR2 setup code can dynamically setup the TLB entries for the DDR2 memory
+ * region. Right now the cache should still be disabled in U-Boot because of the
+ * EMAC driver, that need it's buffer descriptor to be located in non cached
+ * memory.
+ *
+ * If at some time this restriction doesn't apply anymore, just define
+ * CFG_ENABLE_SDRAM_CACHE in the board config file and this code should setup
+ * everything correctly.
+ */
+#ifdef CFG_ENABLE_SDRAM_CACHE
+#define MY_TLB_WORD2_I_ENABLE  0                       /* enable caching on SDRAM */
+#else
+#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;
+       unsigned long bank_size_bytes;
+};
+
+typedef struct bank_param BANKPARMS;
+
+#ifdef CFG_SIMULATE_SPD_EEPROM
+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);
+
+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
+ * and uses that to program the sdram controller.
+ *
+ * This works on boards that has the same schematics that the AMCC walnut has.
+ *
+ * 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)];
+       unsigned long total_size;
+       unsigned long cfg0;
+       unsigned long mcsts;
+       unsigned long num_dimm_banks;               /* on board dimm banks */
+
+       num_dimm_banks = sizeof(iic0_dimm_addr);
+
+       /*
+        * Make sure I2C controller is initialized
+        * before continuing.
+        */
+       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+
+       /*
+        * Read the SPD information using I2C interface. Check to see if the
+        * DIMM slots are populated.
+        */
+       get_spd_info(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * Check the memory type for the dimms plugged.
+        */
+       check_mem_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * Check the voltage type for the dimms plugged.
+        */
+       check_volt_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_440SP)
+       /*
+        * Soft-reset SDRAM controller.
+        */
+       mtsdr(sdr_srst, SDR0_SRST_DMC);
+       mtsdr(sdr_srst, 0x00000000);
+#endif
+
+       /*
+        * program 440GP SDRAM controller options (SDRAM0_CFG0)
+        */
+       program_cfg0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * program 440GP SDRAM controller options (SDRAM0_CFG1)
+        */
+       program_cfg1(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * program SDRAM refresh register (SDRAM0_RTR)
+        */
+       program_rtr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * program SDRAM Timing Register 0 (SDRAM0_TR0)
+        */
+       program_tr0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*
+        * program the BxCR registers to find out total sdram installed
+        */
+       total_size = program_bxcr(dimm_populated, iic0_dimm_addr,
+                                 num_dimm_banks);
+
+#ifdef CONFIG_PROG_SDRAM_TLB /* this define should eventually be removed */
+       /* and program tlb entries for this size (dynamic) */
+       program_tlb(0, total_size, MY_TLB_WORD2_I_ENABLE);
+#endif
+
+       /*
+        * program SDRAM Clock Timing Register (SDRAM0_CLKTR)
+        */
+       mtsdram(mem_clktr, 0x40000000);
+
+       /*
+        * delay to ensure 200 usec has elapsed
+        */
+       udelay(400);
+
+       /*
+        * enable the memory controller
+        */
+       mfsdram(mem_cfg0, cfg0);
+       mtsdram(mem_cfg0, cfg0 | SDRAM_CFG0_DCEN);
+
+       /*
+        * wait for SDRAM_CFG0_DC_EN to complete
+        */
+       while (1) {
+               mfsdram(mem_mcsts, mcsts);
+               if ((mcsts & SDRAM_MCSTS_MRSC) != 0) {
+                       break;
+               }
+       }
+
+       /*
+        * program SDRAM Timing Register 1, adding some delays
+        */
+       program_tr1();
+
+       /*
+        * if ECC is enabled, initialize parity bits
+        */
+
+       return total_size;
+}
+
+unsigned char spd_read(uchar chip, uint addr)
+{
+       unsigned char data[2];
+
+#ifdef CFG_SIMULATE_SPD_EEPROM
+       if (chip == CFG_SIMULATE_SPD_EEPROM) {
+               /*
+                * Onboard spd eeprom requested -> simulate values
+                */
+               return cfg_simulate_spd_eeprom[addr];
+       }
+#endif /* CFG_SIMULATE_SPD_EEPROM */
+
+       if (i2c_probe(chip) == 0) {
+               if (i2c_read(chip, addr, 1, data, 1) == 0) {
+                       return data[0];
+               }
+       }
+
+       return 0;
+}
+
+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;
+       unsigned char num_of_bytes;
+       unsigned char total_size;
+
+       dimm_found = FALSE;
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               num_of_bytes = 0;
+               total_size = 0;
+
+               num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0);
+               total_size = spd_read(iic0_dimm_addr[dimm_num], 1);
+
+               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
+               } else {
+                       dimm_populated[dimm_num] = FALSE;
+#if 0
+                       printf("DIMM slot %lu: Not populated\n", dimm_num);
+#endif
+               }
+       }
+
+       if (dimm_found == FALSE) {
+               printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
+               hang();
+       }
+}
+
+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;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       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
+                               break;
+                       default:
+                               printf("ERROR: Unsupported DIMM detected in slot %lu.\n",
+                                      dimm_num);
+                               printf("Only DDR SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       }
+               }
+       }
+}
+
+
+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;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8);
+                       if (voltage_type != 0x04) {
+                               printf("ERROR: DIMM %lu with unsupported voltage level.\n",
+                                      dimm_num);
+                               hang();
+                       } else {
+#if 0
+                               printf("DIMM %lu voltage level supported.\n", dimm_num);
+#endif
+                       }
+                       break;
+               }
+       }
+}
+
+void program_cfg0(unsigned long* dimm_populated,
+                 unsigned char* iic0_dimm_addr,
+                 unsigned long  num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long cfg0;
+       unsigned long ecc_enabled;
+       unsigned char ecc;
+       unsigned char attributes;
+       unsigned long data_width;
+       unsigned long dimm_32bit;
+       unsigned long dimm_64bit;
+
+       /*
+        * get Memory Controller Options 0 data
+        */
+       mfsdram(mem_cfg0, cfg0);
+
+       /*
+        * clear bits
+        */
+       cfg0 &= ~(SDRAM_CFG0_DCEN | SDRAM_CFG0_MCHK_MASK |
+                 SDRAM_CFG0_RDEN | SDRAM_CFG0_PMUD |
+                 SDRAM_CFG0_DMWD_MASK |
+                 SDRAM_CFG0_UIOS_MASK | SDRAM_CFG0_PDP);
+
+
+       /*
+        * FIXME: assume the DDR SDRAMs in both banks are the same
+        */
+       ecc_enabled = TRUE;
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       ecc = spd_read(iic0_dimm_addr[dimm_num], 11);
+                       if (ecc != 0x02) {
+                               ecc_enabled = FALSE;
+                       }
+
+                       /*
+                        * program Registered DIMM Enable
+                        */
+                       attributes = spd_read(iic0_dimm_addr[dimm_num], 21);
+                       if ((attributes & 0x02) != 0x00) {
+                               cfg0 |= SDRAM_CFG0_RDEN;
+                       }
+
+                       /*
+                        * program DDR SDRAM Data Width
+                        */
+                       data_width =
+                               (unsigned long)spd_read(iic0_dimm_addr[dimm_num],6) +
+                               (((unsigned long)spd_read(iic0_dimm_addr[dimm_num],7)) << 8);
+                       if (data_width == 64 || data_width == 72) {
+                               dimm_64bit = TRUE;
+                               cfg0 |= SDRAM_CFG0_DMWD_64;
+                       } else if (data_width == 32 || data_width == 40) {
+                               dimm_32bit = TRUE;
+                               cfg0 |= SDRAM_CFG0_DMWD_32;
+                       } else {
+                               printf("WARNING: DIMM with datawidth of %lu bits.\n",
+                                      data_width);
+                               printf("Only DIMMs with 32 or 64 bit datawidths supported.\n");
+                               hang();
+                       }
+                       break;
+               }
+       }
+
+       /*
+        * program Memory Data Error Checking
+        */
+       if (ecc_enabled == TRUE) {
+               cfg0 |= SDRAM_CFG0_MCHK_GEN;
+       } else {
+               cfg0 |= SDRAM_CFG0_MCHK_NON;
+       }
+
+       /*
+        * program Page Management Unit (0 == enabled)
+        */
+       cfg0 &= ~SDRAM_CFG0_PMUD;
+
+       /*
+        * program Memory Controller Options 0
+        * Note: DCEN must be enabled after all DDR SDRAM controller
+        * configuration registers get initialized.
+        */
+       mtsdram(mem_cfg0, cfg0);
+}
+
+void program_cfg1(unsigned long* dimm_populated,
+                 unsigned char* iic0_dimm_addr,
+                 unsigned long  num_dimm_banks)
+{
+       unsigned long cfg1;
+       mfsdram(mem_cfg1, cfg1);
+
+       /*
+        * Self-refresh exit, disable PM
+        */
+       cfg1 &= ~(SDRAM_CFG1_SRE | SDRAM_CFG1_PMEN);
+
+       /*
+        * program Memory Controller Options 1
+        */
+       mtsdram(mem_cfg1, cfg1);
+}
+
+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;
+       unsigned long refresh_rate = 0;
+       unsigned char refresh_rate_type;
+       unsigned long refresh_interval;
+       unsigned long sdram_rtr;
+       PPC440_SYS_INFO sys_info;
+
+       /*
+        * get the board info
+        */
+       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);
+                       switch (refresh_rate_type) {
+                       case 0x00:
+                               refresh_rate = 15625;
+                               break;
+                       case 0x01:
+                               refresh_rate = 15625/4;
+                               break;
+                       case 0x02:
+                               refresh_rate = 15625/2;
+                               break;
+                       case 0x03:
+                               refresh_rate = 15626*2;
+                               break;
+                       case 0x04:
+                               refresh_rate = 15625*4;
+                               break;
+                       case 0x05:
+                               refresh_rate = 15625*8;
+                               break;
+                       default:
+                               printf("ERROR: DIMM %lu, unsupported refresh rate/type.\n",
+                                      dimm_num);
+                               printf("Replace the DIMM module with a supported DIMM.\n");
+                               break;
+                       }
+
+                       break;
+               }
+       }
+
+       refresh_interval = refresh_rate * 10 / bus_period_x_10;
+       sdram_rtr = (refresh_interval & 0x3ff8) <<  16;
+
+       /*
+        * program Refresh Timer Register (SDRAM0_RTR)
+        */
+       mtsdram(mem_rtr, sdram_rtr);
+}
+
+void program_tr0 (unsigned long* dimm_populated,
+                 unsigned char* iic0_dimm_addr,
+                 unsigned long  num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long tr0;
+       unsigned char wcsbc;
+       unsigned char t_rp_ns;
+       unsigned char t_rcd_ns;
+       unsigned char t_ras_ns;
+       unsigned long t_rp_clk;
+       unsigned long t_ras_rcd_clk;
+       unsigned long t_rcd_clk;
+       unsigned long t_rfc_clk;
+       unsigned long plb_check;
+       unsigned char cas_bit;
+       unsigned long cas_index;
+       unsigned char cas_2_0_available;
+       unsigned char cas_2_5_available;
+       unsigned char cas_3_0_available;
+       unsigned long cycle_time_ns_x_10[3];
+       unsigned long tcyc_3_0_ns_x_10;
+       unsigned long tcyc_2_5_ns_x_10;
+       unsigned long tcyc_2_0_ns_x_10;
+       unsigned long tcyc_reg;
+       unsigned long bus_period_x_10;
+       PPC440_SYS_INFO sys_info;
+       unsigned long residue;
+
+       /*
+        * get the board info
+        */
+       get_sys_info(&sys_info);
+       bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
+
+       /*
+        * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
+        */
+       mfsdram(mem_tr0, tr0);
+       tr0 &= ~(SDRAM_TR0_SDWR_MASK | SDRAM_TR0_SDWD_MASK |
+                SDRAM_TR0_SDCL_MASK | SDRAM_TR0_SDPA_MASK |
+                SDRAM_TR0_SDCP_MASK | SDRAM_TR0_SDLD_MASK |
+                SDRAM_TR0_SDRA_MASK | SDRAM_TR0_SDRD_MASK);
+
+       /*
+        * initialization
+        */
+       wcsbc = 0;
+       t_rp_ns = 0;
+       t_rcd_ns = 0;
+       t_ras_ns = 0;
+       cas_2_0_available = TRUE;
+       cas_2_5_available = TRUE;
+       cas_3_0_available = TRUE;
+       tcyc_2_0_ns_x_10 = 0;
+       tcyc_2_5_ns_x_10 = 0;
+       tcyc_3_0_ns_x_10 = 0;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       wcsbc = spd_read(iic0_dimm_addr[dimm_num], 15);
+                       t_rp_ns  = spd_read(iic0_dimm_addr[dimm_num], 27) >> 2;
+                       t_rcd_ns = spd_read(iic0_dimm_addr[dimm_num], 29) >> 2;
+                       t_ras_ns = spd_read(iic0_dimm_addr[dimm_num], 30);
+                       cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
+
+                       for (cas_index = 0; cas_index < 3; cas_index++) {
+                               switch (cas_index) {
+                               case 0:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
+                                       break;
+                               case 1:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
+                                       break;
+                               default:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
+                                       break;
+                               }
+
+                               if ((tcyc_reg & 0x0F) >= 10) {
+                                       printf("ERROR: Tcyc incorrect for DIMM in slot %lu\n",
+                                              dimm_num);
+                                       hang();
+                               }
+
+                               cycle_time_ns_x_10[cas_index] =
+                                       (((tcyc_reg & 0xF0) >> 4) * 10) + (tcyc_reg & 0x0F);
+                       }
+
+                       cas_index = 0;
+
+                       if ((cas_bit & 0x80) != 0) {
+                               cas_index += 3;
+                       } else if ((cas_bit & 0x40) != 0) {
+                               cas_index += 2;
+                       } else if ((cas_bit & 0x20) != 0) {
+                               cas_index += 1;
+                       }
+
+                       if (((cas_bit & 0x10) != 0) && (cas_index < 3)) {
+                               tcyc_3_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
+                               cas_index++;
+                       } else {
+                               if (cas_index != 0) {
+                                       cas_index++;
+                               }
+                               cas_3_0_available = FALSE;
+                       }
+
+                       if (((cas_bit & 0x08) != 0) || (cas_index < 3)) {
+                               tcyc_2_5_ns_x_10 = cycle_time_ns_x_10[cas_index];
+                               cas_index++;
+                       } else {
+                               if (cas_index != 0) {
+                                       cas_index++;
+                               }
+                               cas_2_5_available = FALSE;
+                       }
+
+                       if (((cas_bit & 0x04) != 0) || (cas_index < 3)) {
+                               tcyc_2_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
+                               cas_index++;
+                       } else {
+                               if (cas_index != 0) {
+                                       cas_index++;
+                               }
+                               cas_2_0_available = FALSE;
+                       }
+
+                       break;
+               }
+       }
+
+       /*
+        * Program SD_WR and SD_WCSBC fields
+        */
+       tr0 |= SDRAM_TR0_SDWR_2_CLK;                /* Write Recovery: 2 CLK */
+       switch (wcsbc) {
+       case 0:
+               tr0 |= SDRAM_TR0_SDWD_0_CLK;
+               break;
+       default:
+               tr0 |= SDRAM_TR0_SDWD_1_CLK;
+               break;
+       }
+
+       /*
+        * Program SD_CASL field
+        */
+       if ((cas_2_0_available == TRUE) &&
+           (bus_period_x_10 >= tcyc_2_0_ns_x_10)) {
+               tr0 |= SDRAM_TR0_SDCL_2_0_CLK;
+       } else if ((cas_2_5_available == TRUE) &&
+                (bus_period_x_10 >= tcyc_2_5_ns_x_10)) {
+               tr0 |= SDRAM_TR0_SDCL_2_5_CLK;
+       } else if ((cas_3_0_available == TRUE) &&
+                (bus_period_x_10 >= tcyc_3_0_ns_x_10)) {
+               tr0 |= SDRAM_TR0_SDCL_3_0_CLK;
+       } else {
+               printf("ERROR: No supported CAS latency with the installed DIMMs.\n");
+               printf("Only CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
+               printf("Make sure the PLB speed is within the supported range.\n");
+               hang();
+       }
+
+       /*
+        * Calculate Trp in clock cycles and round up if necessary
+        * Program SD_PTA field
+        */
+       t_rp_clk = sys_info.freqPLB * t_rp_ns / ONE_BILLION;
+       plb_check = ONE_BILLION * t_rp_clk / t_rp_ns;
+       if (sys_info.freqPLB != plb_check) {
+               t_rp_clk++;
+       }
+       switch ((unsigned long)t_rp_clk) {
+       case 0:
+       case 1:
+       case 2:
+               tr0 |= SDRAM_TR0_SDPA_2_CLK;
+               break;
+       case 3:
+               tr0 |= SDRAM_TR0_SDPA_3_CLK;
+               break;
+       default:
+               tr0 |= SDRAM_TR0_SDPA_4_CLK;
+               break;
+       }
+
+       /*
+        * Program SD_CTP field
+        */
+       t_ras_rcd_clk = sys_info.freqPLB * (t_ras_ns - t_rcd_ns) / ONE_BILLION;
+       plb_check = ONE_BILLION * t_ras_rcd_clk / (t_ras_ns - t_rcd_ns);
+       if (sys_info.freqPLB != plb_check) {
+               t_ras_rcd_clk++;
+       }
+       switch (t_ras_rcd_clk) {
+       case 0:
+       case 1:
+       case 2:
+               tr0 |= SDRAM_TR0_SDCP_2_CLK;
+               break;
+       case 3:
+               tr0 |= SDRAM_TR0_SDCP_3_CLK;
+               break;
+       case 4:
+               tr0 |= SDRAM_TR0_SDCP_4_CLK;
+               break;
+       default:
+               tr0 |= SDRAM_TR0_SDCP_5_CLK;
+               break;
+       }
+
+       /*
+        * Program SD_LDF field
+        */
+       tr0 |= SDRAM_TR0_SDLD_2_CLK;
+
+       /*
+        * Program SD_RFTA field
+        * FIXME tRFC hardcoded as 75 nanoseconds
+        */
+       t_rfc_clk = sys_info.freqPLB / (ONE_BILLION / 75);
+       residue = sys_info.freqPLB % (ONE_BILLION / 75);
+       if (residue >= (ONE_BILLION / 150)) {
+               t_rfc_clk++;
+       }
+       switch (t_rfc_clk) {
+       case 0:
+       case 1:
+       case 2:
+       case 3:
+       case 4:
+       case 5:
+       case 6:
+               tr0 |= SDRAM_TR0_SDRA_6_CLK;
+               break;
+       case 7:
+               tr0 |= SDRAM_TR0_SDRA_7_CLK;
+               break;
+       case 8:
+               tr0 |= SDRAM_TR0_SDRA_8_CLK;
+               break;
+       case 9:
+               tr0 |= SDRAM_TR0_SDRA_9_CLK;
+               break;
+       case 10:
+               tr0 |= SDRAM_TR0_SDRA_10_CLK;
+               break;
+       case 11:
+               tr0 |= SDRAM_TR0_SDRA_11_CLK;
+               break;
+       case 12:
+               tr0 |= SDRAM_TR0_SDRA_12_CLK;
+               break;
+       default:
+               tr0 |= SDRAM_TR0_SDRA_13_CLK;
+               break;
+       }
+
+       /*
+        * Program SD_RCD field
+        */
+       t_rcd_clk = sys_info.freqPLB * t_rcd_ns / ONE_BILLION;
+       plb_check = ONE_BILLION * t_rcd_clk / t_rcd_ns;
+       if (sys_info.freqPLB != plb_check) {
+               t_rcd_clk++;
+       }
+       switch (t_rcd_clk) {
+       case 0:
+       case 1:
+       case 2:
+               tr0 |= SDRAM_TR0_SDRD_2_CLK;
+               break;
+       case 3:
+               tr0 |= SDRAM_TR0_SDRD_3_CLK;
+               break;
+       default:
+               tr0 |= SDRAM_TR0_SDRD_4_CLK;
+               break;
+       }
+
+#if 0
+       printf("tr0: %x\n", tr0);
+#endif
+       mtsdram(mem_tr0, tr0);
+}
+
+void program_tr1 (void)
+{
+       unsigned long tr0;
+       unsigned long tr1;
+       unsigned long cfg0;
+       unsigned long ecc_temp;
+       unsigned long dlycal;
+       unsigned long dly_val;
+       unsigned long i, j, k;
+       unsigned long bxcr_num;
+       unsigned long max_pass_length;
+       unsigned long current_pass_length;
+       unsigned long current_fail_length;
+       unsigned long current_start;
+       unsigned long rdclt;
+       unsigned long rdclt_offset;
+       long max_start;
+       long max_end;
+       long rdclt_average;
+       unsigned char window_found;
+       unsigned char fail_found;
+       unsigned char pass_found;
+       unsigned long * membase;
+       PPC440_SYS_INFO sys_info;
+
+       /*
+        * get the board info
+        */
+       get_sys_info(&sys_info);
+
+       /*
+        * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
+        */
+       mfsdram(mem_tr1, tr1);
+       tr1 &= ~(SDRAM_TR1_RDSS_MASK | SDRAM_TR1_RDSL_MASK |
+                SDRAM_TR1_RDCD_MASK | SDRAM_TR1_RDCT_MASK);
+
+       mfsdram(mem_tr0, tr0);
+       if (((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) &&
+           (sys_info.freqPLB > 100000000)) {
+               tr1 |= SDRAM_TR1_RDSS_TR2;
+               tr1 |= SDRAM_TR1_RDSL_STAGE3;
+               tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
+       } else {
+               tr1 |= SDRAM_TR1_RDSS_TR1;
+               tr1 |= SDRAM_TR1_RDSL_STAGE2;
+               tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
+       }
+
+       /*
+        * save CFG0 ECC setting to a temporary variable and turn ECC off
+        */
+       mfsdram(mem_cfg0, cfg0);
+       ecc_temp = cfg0 & SDRAM_CFG0_MCHK_MASK;
+       mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | SDRAM_CFG0_MCHK_NON);
+
+       /*
+        * get the delay line calibration register value
+        */
+       mfsdram(mem_dlycal, dlycal);
+       dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
+
+       max_pass_length = 0;
+       max_start = 0;
+       max_end = 0;
+       current_pass_length = 0;
+       current_fail_length = 0;
+       current_start = 0;
+       rdclt_offset = 0;
+       window_found = FALSE;
+       fail_found = FALSE;
+       pass_found = FALSE;
+#ifdef DEBUG
+       printf("Starting memory test ");
+#endif
+       for (k = 0; k < NUMHALFCYCLES; k++) {
+               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 (fail_found == TRUE) {
+                                       pass_found = TRUE;
+                                       if (current_pass_length == 0) {
+                                               current_start = rdclt_offset + rdclt;
+                                       }
+
+                                       current_fail_length = 0;
+                                       current_pass_length++;
+
+                                       if (current_pass_length > max_pass_length) {
+                                               max_pass_length = current_pass_length;
+                                               max_start = current_start;
+                                               max_end = rdclt_offset + rdclt;
+                                       }
+                               }
+                       } else {
+                               current_pass_length = 0;
+                               current_fail_length++;
+
+                               if (current_fail_length >= (dly_val>>2)) {
+                                       if (fail_found == FALSE) {
+                                               fail_found = TRUE;
+                                       } else if (pass_found == TRUE) {
+                                               window_found = TRUE;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+#ifdef DEBUG
+               printf(".");
+#endif
+               if (window_found == TRUE) {
+                       break;
+               }
+
+               tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
+               rdclt_offset += dly_val;
+       }
+#ifdef DEBUG
+       printf("\n");
+#endif
+
+       /*
+        * make sure we find the window
+        */
+       if (window_found == FALSE) {
+               printf("ERROR: Cannot determine a common read delay.\n");
+               hang();
+       }
+
+       /*
+        * restore the orignal ECC setting
+        */
+       mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | ecc_temp);
+
+       /*
+        * set the SDRAM TR1 RDCD value
+        */
+       tr1 &= ~SDRAM_TR1_RDCD_MASK;
+       if ((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) {
+               tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
+       } else {
+               tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
+       }
+
+       /*
+        * set the SDRAM TR1 RDCLT value
+        */
+       tr1 &= ~SDRAM_TR1_RDCT_MASK;
+       while (max_end >= (dly_val << 1)) {
+               max_end -= (dly_val << 1);
+               max_start -= (dly_val << 1);
+       }
+
+       rdclt_average = ((max_start + max_end) >> 1);
+       if (rdclt_average >= 0x60)
+               while (1)
+                       ;
+
+       if (rdclt_average < 0) {
+               rdclt_average = 0;
+       }
+
+       if (rdclt_average >= dly_val) {
+               rdclt_average -= dly_val;
+               tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
+       }
+       tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
+
+#if 0
+       printf("tr1: %x\n", tr1);
+#endif
+       /*
+        * 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)
+{
+       unsigned long dimm_num;
+       unsigned long bank_base_addr;
+       unsigned long cr;
+       unsigned long i;
+       unsigned long j;
+       unsigned long temp;
+       unsigned char num_row_addr;
+       unsigned char num_col_addr;
+       unsigned char num_banks;
+       unsigned char bank_size_id;
+       unsigned long ctrl_bank_num[MAXBANKS];
+       unsigned long bx_cr_num;
+       unsigned long largest_size_index;
+       unsigned long largest_size;
+       unsigned long current_size_index;
+       BANKPARMS bank_parms[MAXBXCR];
+       unsigned long sorted_bank_num[MAXBXCR]; /* DDR Controller bank number table (sorted by size) */
+       unsigned long sorted_bank_size[MAXBXCR]; /* DDR Controller bank size table (sorted by size)*/
+
+       /*
+        * Set the BxCR regs.  First, wipe out the bank config registers.
+        */
+       for (bx_cr_num = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
+               mtdcr(memcfga, mem_b0cr + (bx_cr_num << 2));
+               mtdcr(memcfgd, 0x00000000);
+               bank_parms[bx_cr_num].bank_size_bytes = 0;
+       }
+
+#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
+        * 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
+        * ctrl_bank_num corresponds to the first usable DDR controller bank number by DIMM
+        */
+       ctrl_bank_num[0] = 0;
+       ctrl_bank_num[1] = 1;
+       ctrl_bank_num[2] = 3;
+#else
+       ctrl_bank_num[0] = 0;
+       ctrl_bank_num[1] = 1;
+       ctrl_bank_num[2] = 2;
+       ctrl_bank_num[3] = 3;
+#endif
+
+       /*
+        * reset the bank_base address
+        */
+       bank_base_addr = CFG_SDRAM_BASE;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       num_row_addr = spd_read(iic0_dimm_addr[dimm_num], 3);
+                       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);
+
+                       /*
+                        * Set the SDRAM0_BxCR regs
+                        */
+                       cr = 0;
+                       switch (bank_size_id) {
+                       case 0x02:
+                               cr |= SDRAM_BXCR_SDSZ_8;
+                               break;
+                       case 0x04:
+                               cr |= SDRAM_BXCR_SDSZ_16;
+                               break;
+                       case 0x08:
+                               cr |= SDRAM_BXCR_SDSZ_32;
+                               break;
+                       case 0x10:
+                               cr |= SDRAM_BXCR_SDSZ_64;
+                               break;
+                       case 0x20:
+                               cr |= SDRAM_BXCR_SDSZ_128;
+                               break;
+                       case 0x40:
+                               cr |= SDRAM_BXCR_SDSZ_256;
+                               break;
+                       case 0x80:
+                               cr |= SDRAM_BXCR_SDSZ_512;
+                               break;
+                       default:
+                               printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
+                                      dimm_num);
+                               printf("ERROR: Unsupported value for the banksize: %d.\n",
+                                      bank_size_id);
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                       }
+
+                       switch (num_col_addr) {
+                       case 0x08:
+                               cr |= SDRAM_BXCR_SDAM_1;
+                               break;
+                       case 0x09:
+                               cr |= SDRAM_BXCR_SDAM_2;
+                               break;
+                       case 0x0A:
+                               cr |= SDRAM_BXCR_SDAM_3;
+                               break;
+                       case 0x0B:
+                               cr |= SDRAM_BXCR_SDAM_4;
+                               break;
+                       default:
+                               printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
+                                      dimm_num);
+                               printf("ERROR: Unsupported value for number of "
+                                      "column addresses: %d.\n", num_col_addr);
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                       }
+
+                       /*
+                        * enable the bank
+                        */
+                       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;
+                       }
+               }
+       }
+
+       /* Initialize sort tables */
+       for (i = 0; i < MAXBXCR; i++) {
+               sorted_bank_num[i] = i;
+               sorted_bank_size[i] = bank_parms[i].bank_size_bytes;
+       }
+
+       for (i = 0; i < MAXBXCR-1; i++) {
+               largest_size = sorted_bank_size[i];
+               largest_size_index = 255;
+
+               /* Find the largest remaining value */
+               for (j = i + 1; j < MAXBXCR; j++) {
+                       if (sorted_bank_size[j] > largest_size) {
+                               /* Save largest remaining value and its index */
+                               largest_size = sorted_bank_size[j];
+                               largest_size_index = j;
+                       }
+               }
+
+               if (largest_size_index != 255) {
+                       /* Swap the current and largest values */
+                       current_size_index = sorted_bank_num[largest_size_index];
+                       sorted_bank_size[largest_size_index] = sorted_bank_size[i];
+                       sorted_bank_size[i] = largest_size;
+                       sorted_bank_num[largest_size_index] = sorted_bank_num[i];
+                       sorted_bank_num[i] = current_size_index;
+               }
+       }
+
+       /* Set the SDRAM0_BxCR regs thanks to sort tables */
+       for (bx_cr_num = 0, bank_base_addr = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
+               if (bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes) {
+                       mtdcr(memcfga, mem_b0cr + (sorted_bank_num[bx_cr_num] << 2));
+                       temp = mfdcr(memcfgd) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
+                                                 SDRAM_BXCR_SDAM_MASK | SDRAM_BXCR_SDBE);
+                       temp = temp | (bank_base_addr & SDRAM_BXCR_SDBA_MASK) |
+                               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;
+               }
+       }
+
+       return(bank_base_addr);
+}
+
+void program_ecc (unsigned long         num_bytes)
+{
+       unsigned long bank_base_addr;
+       unsigned long current_address;
+       unsigned long end_address;
+       unsigned long address_increment;
+       unsigned long cfg0;
+
+       /*
+        * get Memory Controller Options 0 data
+        */
+       mfsdram(mem_cfg0, cfg0);
+
+       /*
+        * reset the bank_base address
+        */
+       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);
+
+               if ((cfg0 & SDRAM_CFG0_DMWD_MASK) == SDRAM_CFG0_DMWD_32) {
+                       address_increment = 4;
+               } else {
+                       address_increment = 8;
+               }
+
+               current_address = (unsigned long)(bank_base_addr);
+               end_address = (unsigned long)(bank_base_addr) + num_bytes;
+
+               while (current_address < end_address) {
+                       *((unsigned long*)current_address) = 0x00000000;
+                       current_address += address_increment;
+               }
+
+               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) |
+                       SDRAM_CFG0_MCHK_CHK);
+       }
+}
+#endif /* CONFIG_SPD_EEPROM */
diff --git a/cpu/ppc4xx/44x_spd_ddr2.c b/cpu/ppc4xx/44x_spd_ddr2.c
new file mode 100644 (file)
index 0000000..83c9911
--- /dev/null
@@ -0,0 +1,2954 @@
+/*
+ * cpu/ppc4xx/44x_spd_ddr2.c
+ * This SPD SDRAM detection code supports AMCC PPC44x cpu's with a
+ * DDR2 controller (non Denali Core). Those are 440SP/SPe.
+ *
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
+ *
+ * COPYRIGHT   AMCC   CORPORATION 2004
+ *
+ * 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
+ *
+ */
+
+/* define DEBUG for debugging output (obviously ;-)) */
+#if 0
+#define DEBUG
+#endif
+
+#include <common.h>
+#include <command.h>
+#include <ppc4xx.h>
+#include <i2c.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/mmu.h>
+
+#if defined(CONFIG_SPD_EEPROM) &&                              \
+       (defined(CONFIG_440SP) || defined(CONFIG_440SPE))
+
+/*-----------------------------------------------------------------------------+
+ * Defines
+ *-----------------------------------------------------------------------------*/
+#ifndef        TRUE
+#define TRUE           1
+#endif
+#ifndef FALSE
+#define FALSE          0
+#endif
+
+#define SDRAM_DDR1     1
+#define SDRAM_DDR2     2
+#define SDRAM_NONE     0
+
+#define MAXDIMMS       2
+#define MAXRANKS       4
+#define MAXBXCF                4
+#define MAX_SPD_BYTES  256   /* Max number of bytes on the DIMM's SPD EEPROM */
+
+#define ONE_BILLION    1000000000
+
+#define MULDIV64(m1, m2, d)    (u32)(((u64)(m1) * (u64)(m2)) / (u64)(d))
+
+#define CMD_NOP                (7 << 19)
+#define CMD_PRECHARGE  (2 << 19)
+#define CMD_REFRESH    (1 << 19)
+#define CMD_EMR                (0 << 19)
+#define CMD_READ       (5 << 19)
+#define CMD_WRITE      (4 << 19)
+
+#define SELECT_MR      (0 << 16)
+#define SELECT_EMR     (1 << 16)
+#define SELECT_EMR2    (2 << 16)
+#define SELECT_EMR3    (3 << 16)
+
+/* MR */
+#define DLL_RESET      0x00000100
+
+#define WRITE_RECOV_2  (1 << 9)
+#define WRITE_RECOV_3  (2 << 9)
+#define WRITE_RECOV_4  (3 << 9)
+#define WRITE_RECOV_5  (4 << 9)
+#define WRITE_RECOV_6  (5 << 9)
+
+#define BURST_LEN_4    0x00000002
+
+/* EMR */
+#define ODT_0_OHM      0x00000000
+#define ODT_50_OHM     0x00000044
+#define ODT_75_OHM     0x00000004
+#define ODT_150_OHM    0x00000040
+
+#define ODS_FULL       0x00000000
+#define ODS_REDUCED    0x00000002
+
+/* defines for ODT (On Die Termination) of the 440SP(e) DDR2 controller */
+#define ODT_EB0R       (0x80000000 >> 8)
+#define ODT_EB0W       (0x80000000 >> 7)
+#define CALC_ODT_R(n)  (ODT_EB0R << (n << 1))
+#define CALC_ODT_W(n)  (ODT_EB0W << (n << 1))
+#define CALC_ODT_RW(n) (CALC_ODT_R(n) | CALC_ODT_W(n))
+
+/* Defines for the Read Cycle Delay test */
+#define NUMMEMTESTS 8
+#define NUMMEMWORDS 8
+
+#define CONFIG_ECC_ERROR_RESET         /* test-only: see description below, at check_ecc() */
+
+/*
+ * This DDR2 setup code can dynamically setup the TLB entries for the DDR2 memory
+ * region. Right now the cache should still be disabled in U-Boot because of the
+ * EMAC driver, that need it's buffer descriptor to be located in non cached
+ * memory.
+ *
+ * If at some time this restriction doesn't apply anymore, just define
+ * CFG_ENABLE_SDRAM_CACHE in the board config file and this code should setup
+ * everything correctly.
+ */
+#ifdef CFG_ENABLE_SDRAM_CACHE
+#define MY_TLB_WORD2_I_ENABLE  0                       /* enable caching on SDRAM */
+#else
+#define MY_TLB_WORD2_I_ENABLE  TLB_WORD2_I_ENABLE      /* disable caching on SDRAM */
+#endif
+
+/* Private Structure Definitions */
+
+/* enum only to ease code for cas latency setting */
+typedef enum ddr_cas_id {
+       DDR_CAS_2      = 20,
+       DDR_CAS_2_5    = 25,
+       DDR_CAS_3      = 30,
+       DDR_CAS_4      = 40,
+       DDR_CAS_5      = 50
+} ddr_cas_id_t;
+
+/*-----------------------------------------------------------------------------+
+ * Prototypes
+ *-----------------------------------------------------------------------------*/
+static unsigned long sdram_memsize(void);
+void program_tlb(u32 start, u32 size, u32 tlb_word2_i_value);
+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_frequency(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks);
+static void check_rank_number(unsigned long *dimm_populated,
+                             unsigned char *iic0_dimm_addr,
+                             unsigned long num_dimm_banks);
+static void check_voltage_type(unsigned long *dimm_populated,
+                              unsigned char *iic0_dimm_addr,
+                              unsigned long num_dimm_banks);
+static void program_memory_queue(unsigned long *dimm_populated,
+                                unsigned char *iic0_dimm_addr,
+                                unsigned long num_dimm_banks);
+static void program_codt(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void program_mode(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks,
+                        ddr_cas_id_t *selected_cas,
+                        int *write_recovery);
+static void program_tr(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_bxcf(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void program_copt1(unsigned long *dimm_populated,
+                         unsigned char *iic0_dimm_addr,
+                         unsigned long num_dimm_banks);
+static void program_initplr(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks,
+                           ddr_cas_id_t selected_cas,
+                           int write_recovery);
+static unsigned long is_ecc_enabled(void);
+#ifdef CONFIG_DDR_ECC
+static void program_ecc(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks,
+                       unsigned long tlb_word2_i_value);
+static void program_ecc_addr(unsigned long start_address,
+                            unsigned long num_bytes,
+                            unsigned long tlb_word2_i_value);
+#endif
+static void program_DQS_calibration(unsigned long *dimm_populated,
+                                   unsigned char *iic0_dimm_addr,
+                                   unsigned long num_dimm_banks);
+#ifdef HARD_CODED_DQS /* calibration test with hardvalues */
+static void    test(void);
+#else
+static void    DQS_calibration_process(void);
+#endif
+#if defined(DEBUG)
+static void ppc440sp_sdram_register_dump(void);
+#endif
+int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+void dcbz_area(u32 start_address, u32 num_bytes);
+void dflush(void);
+
+static u32 mfdcr_any(u32 dcr)
+{
+       u32 val;
+
+       switch (dcr) {
+       case SDRAM_R0BAS + 0:
+               val = mfdcr(SDRAM_R0BAS + 0);
+               break;
+       case SDRAM_R0BAS + 1:
+               val = mfdcr(SDRAM_R0BAS + 1);
+               break;
+       case SDRAM_R0BAS + 2:
+               val = mfdcr(SDRAM_R0BAS + 2);
+               break;
+       case SDRAM_R0BAS + 3:
+               val = mfdcr(SDRAM_R0BAS + 3);
+               break;
+       default:
+               printf("DCR %d not defined in case statement!!!\n", dcr);
+               val = 0; /* just to satisfy the compiler */
+       }
+
+       return val;
+}
+
+static void mtdcr_any(u32 dcr, u32 val)
+{
+       switch (dcr) {
+       case SDRAM_R0BAS + 0:
+               mtdcr(SDRAM_R0BAS + 0, val);
+               break;
+       case SDRAM_R0BAS + 1:
+               mtdcr(SDRAM_R0BAS + 1, val);
+               break;
+       case SDRAM_R0BAS + 2:
+               mtdcr(SDRAM_R0BAS + 2, val);
+               break;
+       case SDRAM_R0BAS + 3:
+               mtdcr(SDRAM_R0BAS + 3, val);
+               break;
+       default:
+               printf("DCR %d not defined in case statement!!!\n", dcr);
+       }
+}
+
+static unsigned char spd_read(uchar chip, uint addr)
+{
+       unsigned char data[2];
+
+       if (i2c_probe(chip) == 0)
+               if (i2c_read(chip, addr, 1, data, 1) == 0)
+                       return data[0];
+
+       return 0;
+}
+
+/*-----------------------------------------------------------------------------+
+ * sdram_memsize
+ *-----------------------------------------------------------------------------*/
+static unsigned long sdram_memsize(void)
+{
+       unsigned long mem_size;
+       unsigned long mcopt2;
+       unsigned long mcstat;
+       unsigned long mb0cf;
+       unsigned long sdsz;
+       unsigned long i;
+
+       mem_size = 0;
+
+       mfsdram(SDRAM_MCOPT2, mcopt2);
+       mfsdram(SDRAM_MCSTAT, mcstat);
+
+       /* DDR controller must be enabled and not in self-refresh. */
+       /* Otherwise memsize is zero. */
+       if (((mcopt2 & SDRAM_MCOPT2_DCEN_MASK) == SDRAM_MCOPT2_DCEN_ENABLE)
+           && ((mcopt2 & SDRAM_MCOPT2_SREN_MASK) == SDRAM_MCOPT2_SREN_EXIT)
+           && ((mcstat & (SDRAM_MCSTAT_MIC_MASK | SDRAM_MCSTAT_SRMS_MASK))
+               == (SDRAM_MCSTAT_MIC_COMP | SDRAM_MCSTAT_SRMS_NOT_SF))) {
+               for (i = 0; i < MAXBXCF; i++) {
+                       mfsdram(SDRAM_MB0CF + (i << 2), mb0cf);
+                       /* Banks enabled */
+                       if ((mb0cf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
+                               sdsz = mfdcr_any(SDRAM_R0BAS + i) & SDRAM_RXBAS_SDSZ_MASK;
+
+                               switch(sdsz) {
+                               case SDRAM_RXBAS_SDSZ_8:
+                                       mem_size+=8;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_16:
+                                       mem_size+=16;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_32:
+                                       mem_size+=32;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_64:
+                                       mem_size+=64;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_128:
+                                       mem_size+=128;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_256:
+                                       mem_size+=256;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_512:
+                                       mem_size+=512;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_1024:
+                                       mem_size+=1024;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_2048:
+                                       mem_size+=2048;
+                                       break;
+                               case SDRAM_RXBAS_SDSZ_4096:
+                                       mem_size+=4096;
+                                       break;
+                               default:
+                                       mem_size=0;
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       mem_size *= 1024 * 1024;
+       return(mem_size);
+}
+
+/*-----------------------------------------------------------------------------+
+ * initdram.  Initializes the 440SP Memory Queue and DDR SDRAM controller.
+ * Note: This routine runs from flash with a stack set up in the chip's
+ * sram space.  It is important that the routine does not require .sbss, .bss or
+ * .data sections.  It also cannot call routines that require these sections.
+ *-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------
+ * Function:    initdram
+ * Description:  Configures SDRAM memory banks for DDR operation.
+ *              Auto Memory Configuration option reads the DDR SDRAM EEPROMs
+ *              via the IIC bus and then configures the DDR SDRAM memory
+ *              banks appropriately. If Auto Memory Configuration is
+ *              not used, it is assumed that no DIMM is plugged
+ *-----------------------------------------------------------------------------*/
+long int initdram(int board_type)
+{
+       unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;
+       unsigned char spd0[MAX_SPD_BYTES];
+       unsigned char spd1[MAX_SPD_BYTES];
+       unsigned char *dimm_spd[MAXDIMMS];
+       unsigned long dimm_populated[MAXDIMMS];
+       unsigned long num_dimm_banks;               /* on board dimm banks */
+       unsigned long val;
+       ddr_cas_id_t  selected_cas;
+       int write_recovery;
+       unsigned long dram_size = 0;
+
+       num_dimm_banks = sizeof(iic0_dimm_addr);
+
+       /*------------------------------------------------------------------
+        * Set up an array of SPD matrixes.
+        *-----------------------------------------------------------------*/
+       dimm_spd[0] = spd0;
+       dimm_spd[1] = spd1;
+
+       /*------------------------------------------------------------------
+        * Reset the DDR-SDRAM controller.
+        *-----------------------------------------------------------------*/
+       mtsdr(SDR0_SRST, (0x80000000 >> 10));
+       mtsdr(SDR0_SRST, 0x00000000);
+
+       /*
+        * Make sure I2C controller is initialized
+        * before continuing.
+        */
+
+       /* switch to correct I2C bus */
+       I2C_SET_BUS(CFG_SPD_BUS_NUM);
+       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+
+       /*------------------------------------------------------------------
+        * Clear out the serial presence detect buffers.
+        * Perform IIC reads from the dimm.  Fill in the spds.
+        * Check to see if the dimm slots are populated
+        *-----------------------------------------------------------------*/
+       get_spd_info(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Check the memory type for the dimms plugged.
+        *-----------------------------------------------------------------*/
+       check_mem_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Check the frequency supported for the dimms plugged.
+        *-----------------------------------------------------------------*/
+       check_frequency(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Check the total rank number.
+        *-----------------------------------------------------------------*/
+       check_rank_number(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Check the voltage type for the dimms plugged.
+        *-----------------------------------------------------------------*/
+       check_voltage_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Program SDRAM controller options 2 register
+        * Except Enabling of the memory controller.
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT2, val);
+       mtsdram(SDRAM_MCOPT2,
+               (val &
+                ~(SDRAM_MCOPT2_SREN_MASK | SDRAM_MCOPT2_PMEN_MASK |
+                  SDRAM_MCOPT2_IPTR_MASK | SDRAM_MCOPT2_XSRP_MASK |
+                  SDRAM_MCOPT2_ISIE_MASK))
+               | (SDRAM_MCOPT2_SREN_ENTER | SDRAM_MCOPT2_PMEN_DISABLE |
+                  SDRAM_MCOPT2_IPTR_IDLE | SDRAM_MCOPT2_XSRP_ALLOW |
+                  SDRAM_MCOPT2_ISIE_ENABLE));
+
+       /*------------------------------------------------------------------
+        * Program SDRAM controller options 1 register
+        * Note: Does not enable the memory controller.
+        *-----------------------------------------------------------------*/
+       program_copt1(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Controller On Die Termination Register
+        *-----------------------------------------------------------------*/
+       program_codt(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Program SDRAM refresh register.
+        *-----------------------------------------------------------------*/
+       program_rtr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Program SDRAM mode register.
+        *-----------------------------------------------------------------*/
+       program_mode(dimm_populated, iic0_dimm_addr, num_dimm_banks,
+                    &selected_cas, &write_recovery);
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Write Data/DM/DQS Clock Timing Reg
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_WRDTR, val);
+       mtsdram(SDRAM_WRDTR, (val & ~(SDRAM_WRDTR_LLWP_MASK | SDRAM_WRDTR_WTR_MASK)) |
+               (SDRAM_WRDTR_LLWP_1_CYC | SDRAM_WRDTR_WTR_90_DEG_ADV));
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Clock Timing Register
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_CLKTR, val);
+       mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_0_DEG);
+
+       /*------------------------------------------------------------------
+        * Program the BxCF registers.
+        *-----------------------------------------------------------------*/
+       program_bxcf(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Program SDRAM timing registers.
+        *-----------------------------------------------------------------*/
+       program_tr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Set the Extended Mode register
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MEMODE, val);
+       mtsdram(SDRAM_MEMODE,
+               (val & ~(SDRAM_MEMODE_DIC_MASK  | SDRAM_MEMODE_DLL_MASK |
+                        SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) |
+               (SDRAM_MEMODE_DIC_NORMAL | SDRAM_MEMODE_DLL_ENABLE
+                | SDRAM_MEMODE_RTT_150OHM | SDRAM_MEMODE_DQS_ENABLE));
+
+       /*------------------------------------------------------------------
+        * Program Initialization preload registers.
+        *-----------------------------------------------------------------*/
+       program_initplr(dimm_populated, iic0_dimm_addr, num_dimm_banks,
+                       selected_cas, write_recovery);
+
+       /*------------------------------------------------------------------
+        * Delay to ensure 200usec have elapsed since reset.
+        *-----------------------------------------------------------------*/
+       udelay(400);
+
+       /*------------------------------------------------------------------
+        * Set the memory queue core base addr.
+        *-----------------------------------------------------------------*/
+       program_memory_queue(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+       /*------------------------------------------------------------------
+        * Program SDRAM controller options 2 register
+        * Enable the memory controller.
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT2, val);
+       mtsdram(SDRAM_MCOPT2,
+               (val & ~(SDRAM_MCOPT2_SREN_MASK | SDRAM_MCOPT2_DCEN_MASK |
+                        SDRAM_MCOPT2_IPTR_MASK | SDRAM_MCOPT2_ISIE_MASK)) |
+               (SDRAM_MCOPT2_DCEN_ENABLE | SDRAM_MCOPT2_IPTR_EXECUTE));
+
+       /*------------------------------------------------------------------
+        * Wait for SDRAM_CFG0_DC_EN to complete.
+        *-----------------------------------------------------------------*/
+       do {
+               mfsdram(SDRAM_MCSTAT, val);
+       } while ((val & SDRAM_MCSTAT_MIC_MASK) == SDRAM_MCSTAT_MIC_NOTCOMP);
+
+       /* get installed memory size */
+       dram_size = sdram_memsize();
+
+       /* and program tlb entries for this size (dynamic) */
+       program_tlb(0, dram_size, MY_TLB_WORD2_I_ENABLE);
+
+       /*------------------------------------------------------------------
+        * DQS calibration.
+        *-----------------------------------------------------------------*/
+       program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
+
+#ifdef CONFIG_DDR_ECC
+       /*------------------------------------------------------------------
+        * If ecc is enabled, initialize the parity bits.
+        *-----------------------------------------------------------------*/
+       program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, MY_TLB_WORD2_I_ENABLE);
+#endif
+
+#ifdef DEBUG
+       ppc440sp_sdram_register_dump();
+#endif
+
+       return dram_size;
+}
+
+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;
+       unsigned char num_of_bytes;
+       unsigned char total_size;
+
+       dimm_found = FALSE;
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               num_of_bytes = 0;
+               total_size = 0;
+
+               num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0);
+               debug("\nspd_read(0x%x) returned %d\n",
+                     iic0_dimm_addr[dimm_num], num_of_bytes);
+               total_size = spd_read(iic0_dimm_addr[dimm_num], 1);
+               debug("spd_read(0x%x) returned %d\n",
+                     iic0_dimm_addr[dimm_num], total_size);
+
+               if ((num_of_bytes != 0) && (total_size != 0)) {
+                       dimm_populated[dimm_num] = TRUE;
+                       dimm_found = TRUE;
+                       debug("DIMM slot %lu: populated\n", dimm_num);
+               } else {
+                       dimm_populated[dimm_num] = FALSE;
+                       debug("DIMM slot %lu: Not populated\n", dimm_num);
+               }
+       }
+
+       if (dimm_found == FALSE) {
+               printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
+               hang();
+       }
+}
+
+#ifdef CONFIG_ADD_RAM_INFO
+void board_add_ram_info(int use_default)
+{
+       if (is_ecc_enabled())
+               puts(" (ECC enabled)");
+       else
+               puts(" (ECC not enabled)");
+}
+#endif
+
+/*------------------------------------------------------------------
+ * For the memory DIMMs installed, this routine verifies that they
+ * really are DDR specific DIMMs.
+ *-----------------------------------------------------------------*/
+static void check_mem_type(unsigned long *dimm_populated,
+                          unsigned char *iic0_dimm_addr,
+                          unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long dimm_type;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] == TRUE) {
+                       dimm_type = spd_read(iic0_dimm_addr[dimm_num], 2);
+                       switch (dimm_type) {
+                       case 1:
+                               printf("ERROR: Standard Fast Page Mode DRAM DIMM detected in "
+                                      "slot %d.\n", (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 2:
+                               printf("ERROR: EDO DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 3:
+                               printf("ERROR: Pipelined Nibble DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 4:
+                               printf("ERROR: SDRAM DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 5:
+                               printf("ERROR: Multiplexed ROM DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 6:
+                               printf("ERROR: SGRAM DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       case 7:
+                               debug("DIMM slot %d: DDR1 SDRAM detected\n", dimm_num);
+                               dimm_populated[dimm_num] = SDRAM_DDR1;
+                               break;
+                       case 8:
+                               debug("DIMM slot %d: DDR2 SDRAM detected\n", dimm_num);
+                               dimm_populated[dimm_num] = SDRAM_DDR2;
+                               break;
+                       default:
+                               printf("ERROR: Unknown DIMM detected in slot %d.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Only DDR1 and DDR2 SDRAM DIMMs are supported.\n");
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       }
+               }
+       }
+       for (dimm_num = 1; dimm_num < num_dimm_banks; dimm_num++) {
+               if ((dimm_populated[dimm_num-1] != SDRAM_NONE)
+                   && (dimm_populated[dimm_num]   != SDRAM_NONE)
+                   && (dimm_populated[dimm_num-1] != dimm_populated[dimm_num])) {
+                       printf("ERROR: DIMM's DDR1 and DDR2 type can not be mixed.\n");
+                       hang();
+               }
+       }
+}
+
+/*------------------------------------------------------------------
+ * For the memory DIMMs installed, this routine verifies that
+ * frequency previously calculated is supported.
+ *-----------------------------------------------------------------*/
+static void check_frequency(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long tcyc_reg;
+       unsigned long cycle_time;
+       unsigned long calc_cycle_time;
+       unsigned long sdram_freq;
+       unsigned long sdr_ddrpll;
+       PPC440_SYS_INFO board_cfg;
+
+       /*------------------------------------------------------------------
+        * Get the board configuration info.
+        *-----------------------------------------------------------------*/
+       get_sys_info(&board_cfg);
+
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
+       sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
+
+       /*
+        * calc_cycle_time is calculated from DDR frequency set by board/chip
+        * and is expressed in multiple of 10 picoseconds
+        * to match the way DIMM cycle time is calculated below.
+        */
+       calc_cycle_time = MULDIV64(ONE_BILLION, 100, sdram_freq);
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
+                       /*
+                        * Byte 9, Cycle time for CAS Latency=X, is split into two nibbles:
+                        * the higher order nibble (bits 4-7) designates the cycle time
+                        * to a granularity of 1ns;
+                        * the value presented by the lower order nibble (bits 0-3)
+                        * has a granularity of .1ns and is added to the value designated
+                        * by the higher nibble. In addition, four lines of the lower order
+                        * nibble are assigned to support +.25,+.33, +.66 and +.75.
+                        */
+                        /* Convert from hex to decimal */
+                       if ((tcyc_reg & 0x0F) == 0x0D)
+                               cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 75;
+                       else if ((tcyc_reg & 0x0F) == 0x0C)
+                               cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 66;
+                       else if ((tcyc_reg & 0x0F) == 0x0B)
+                               cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 33;
+                       else if ((tcyc_reg & 0x0F) == 0x0A)
+                               cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) + 25;
+                       else
+                               cycle_time = (((tcyc_reg & 0xF0) >> 4) * 100) +
+                                       ((tcyc_reg & 0x0F)*10);
+
+                       if  (cycle_time > (calc_cycle_time + 10)) {
+                               /*
+                                * the provided sdram cycle_time is too small
+                                * for the available DIMM cycle_time.
+                                * The additionnal 100ps is here to accept a small incertainty.
+                                */
+                               printf("ERROR: DRAM DIMM detected with cycle_time %d ps in "
+                                      "slot %d \n while calculated cycle time is %d ps.\n",
+                                      (unsigned int)(cycle_time*10),
+                                      (unsigned int)dimm_num,
+                                      (unsigned int)(calc_cycle_time*10));
+                               printf("Replace the DIMM, or change DDR frequency via "
+                                      "strapping bits.\n\n");
+                               hang();
+                       }
+               }
+       }
+}
+
+/*------------------------------------------------------------------
+ * For the memory DIMMs installed, this routine verifies two
+ * ranks/banks maximum are availables.
+ *-----------------------------------------------------------------*/
+static void check_rank_number(unsigned long *dimm_populated,
+                             unsigned char *iic0_dimm_addr,
+                             unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long dimm_rank;
+       unsigned long total_rank = 0;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       dimm_rank = spd_read(iic0_dimm_addr[dimm_num], 5);
+                       if (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
+                               dimm_rank = (dimm_rank & 0x0F) +1;
+                       else
+                               dimm_rank = dimm_rank & 0x0F;
+
+
+                       if (dimm_rank > MAXRANKS) {
+                               printf("ERROR: DRAM DIMM detected with %d ranks in "
+                                      "slot %d is not supported.\n", dimm_rank, dimm_num);
+                               printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                       } else
+                               total_rank += dimm_rank;
+               }
+               if (total_rank > MAXRANKS) {
+                       printf("ERROR: DRAM DIMM detected with a total of %d ranks "
+                              "for all slots.\n", (unsigned int)total_rank);
+                       printf("Only %d ranks are supported for all DIMM.\n", MAXRANKS);
+                       printf("Remove one of the DIMM modules.\n\n");
+                       hang();
+               }
+       }
+}
+
+/*------------------------------------------------------------------
+ * only support 2.5V modules.
+ * This routine verifies this.
+ *-----------------------------------------------------------------*/
+static void check_voltage_type(unsigned long *dimm_populated,
+                              unsigned char *iic0_dimm_addr,
+                              unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long voltage_type;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8);
+                       switch (voltage_type) {
+                       case 0x00:
+                               printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
+                               printf("This DIMM is 5.0 Volt/TTL.\n");
+                               printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
+                                      (unsigned int)dimm_num);
+                               hang();
+                               break;
+                       case 0x01:
+                               printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
+                               printf("This DIMM is LVTTL.\n");
+                               printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
+                                      (unsigned int)dimm_num);
+                               hang();
+                               break;
+                       case 0x02:
+                               printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
+                               printf("This DIMM is 1.5 Volt.\n");
+                               printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
+                                      (unsigned int)dimm_num);
+                               hang();
+                               break;
+                       case 0x03:
+                               printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
+                               printf("This DIMM is 3.3 Volt/TTL.\n");
+                               printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
+                                      (unsigned int)dimm_num);
+                               hang();
+                               break;
+                       case 0x04:
+                               /* 2.5 Voltage only for DDR1 */
+                               break;
+                       case 0x05:
+                               /* 1.8 Voltage only for DDR2 */
+                               break;
+                       default:
+                               printf("ERROR: Only DIMMs DDR 2.5V or DDR2 1.8V are supported.\n");
+                               printf("Replace the DIMM module in slot %d with a supported DIMM.\n\n",
+                                      (unsigned int)dimm_num);
+                               hang();
+                               break;
+                       }
+               }
+       }
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_copt1.
+ *-----------------------------------------------------------------------------*/
+static void program_copt1(unsigned long *dimm_populated,
+                         unsigned char *iic0_dimm_addr,
+                         unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long mcopt1;
+       unsigned long ecc_enabled;
+       unsigned long ecc = 0;
+       unsigned long data_width = 0;
+       unsigned long dimm_32bit;
+       unsigned long dimm_64bit;
+       unsigned long registered = 0;
+       unsigned long attribute = 0;
+       unsigned long buf0, buf1; /* TODO: code to be changed for IOP1.6 to support 4 DIMMs */
+       unsigned long bankcount;
+       unsigned long ddrtype;
+       unsigned long val;
+
+#ifdef CONFIG_DDR_ECC
+       ecc_enabled = TRUE;
+#else
+       ecc_enabled = FALSE;
+#endif
+       dimm_32bit = FALSE;
+       dimm_64bit = FALSE;
+       buf0 = FALSE;
+       buf1 = FALSE;
+
+       /*------------------------------------------------------------------
+        * Set memory controller options reg 1, SDRAM_MCOPT1.
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT1, val);
+       mcopt1 = val & ~(SDRAM_MCOPT1_MCHK_MASK | SDRAM_MCOPT1_RDEN_MASK |
+                        SDRAM_MCOPT1_PMU_MASK  | SDRAM_MCOPT1_DMWD_MASK |
+                        SDRAM_MCOPT1_UIOS_MASK | SDRAM_MCOPT1_BCNT_MASK |
+                        SDRAM_MCOPT1_DDR_TYPE_MASK | SDRAM_MCOPT1_RWOO_MASK |
+                        SDRAM_MCOPT1_WOOO_MASK | SDRAM_MCOPT1_DCOO_MASK |
+                        SDRAM_MCOPT1_DREF_MASK);
+
+       mcopt1 |= SDRAM_MCOPT1_QDEP;
+       mcopt1 |= SDRAM_MCOPT1_PMU_OPEN;
+       mcopt1 |= SDRAM_MCOPT1_RWOO_DISABLED;
+       mcopt1 |= SDRAM_MCOPT1_WOOO_DISABLED;
+       mcopt1 |= SDRAM_MCOPT1_DCOO_DISABLED;
+       mcopt1 |= SDRAM_MCOPT1_DREF_NORMAL;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       /* test ecc support */
+                       ecc = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 11);
+                       if (ecc != 0x02) /* ecc not supported */
+                               ecc_enabled = FALSE;
+
+                       /* test bank count */
+                       bankcount = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 17);
+                       if (bankcount == 0x04) /* bank count = 4 */
+                               mcopt1 |= SDRAM_MCOPT1_4_BANKS;
+                       else /* bank count = 8 */
+                               mcopt1 |= SDRAM_MCOPT1_8_BANKS;
+
+                       /* test DDR type */
+                       ddrtype = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2);
+                       /* test for buffered/unbuffered, registered, differential clocks */
+                       registered = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 20);
+                       attribute = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 21);
+
+                       /* TODO: code to be changed for IOP1.6 to support 4 DIMMs */
+                       if (dimm_num == 0) {
+                               if (dimm_populated[dimm_num] == SDRAM_DDR1) /* DDR1 type */
+                                       mcopt1 |= SDRAM_MCOPT1_DDR1_TYPE;
+                               if (dimm_populated[dimm_num] == SDRAM_DDR2) /* DDR2 type */
+                                       mcopt1 |= SDRAM_MCOPT1_DDR2_TYPE;
+                               if (registered == 1) { /* DDR2 always buffered */
+                                       /* TODO: what about above  comments ? */
+                                       mcopt1 |= SDRAM_MCOPT1_RDEN;
+                                       buf0 = TRUE;
+                               } else {
+                                       /* TODO: the mask 0x02 doesn't match Samsung def for byte 21. */
+                                       if ((attribute & 0x02) == 0x00) {
+                                               /* buffered not supported */
+                                               buf0 = FALSE;
+                                       } else {
+                                               mcopt1 |= SDRAM_MCOPT1_RDEN;
+                                               buf0 = TRUE;
+                                       }
+                               }
+                       }
+                       else if (dimm_num == 1) {
+                               if (dimm_populated[dimm_num] == SDRAM_DDR1) /* DDR1 type */
+                                       mcopt1 |= SDRAM_MCOPT1_DDR1_TYPE;
+                               if (dimm_populated[dimm_num] == SDRAM_DDR2) /* DDR2 type */
+                                       mcopt1 |= SDRAM_MCOPT1_DDR2_TYPE;
+                               if (registered == 1) {
+                                       /* DDR2 always buffered */
+                                       mcopt1 |= SDRAM_MCOPT1_RDEN;
+                                       buf1 = TRUE;
+                               } else {
+                                       if ((attribute & 0x02) == 0x00) {
+                                               /* buffered not supported */
+                                               buf1 = FALSE;
+                                       } else {
+                                               mcopt1 |= SDRAM_MCOPT1_RDEN;
+                                               buf1 = TRUE;
+                                       }
+                               }
+                       }
+
+                       /* Note that for DDR2 the byte 7 is reserved, but OK to keep code as is. */
+                       data_width = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 6) +
+                               (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 7)) << 8);
+
+                       switch (data_width) {
+                       case 72:
+                       case 64:
+                               dimm_64bit = TRUE;
+                               break;
+                       case 40:
+                       case 32:
+                               dimm_32bit = TRUE;
+                               break;
+                       default:
+                               printf("WARNING: Detected a DIMM with a data width of %d bits.\n",
+                                      data_width);
+                               printf("Only DIMMs with 32 or 64 bit DDR-SDRAM widths are supported.\n");
+                               break;
+                       }
+               }
+       }
+
+       /* verify matching properties */
+       if ((dimm_populated[0] != SDRAM_NONE) && (dimm_populated[1] != SDRAM_NONE)) {
+               if (buf0 != buf1) {
+                       printf("ERROR: DIMM's buffered/unbuffered, registered, clocking don't match.\n");
+                       hang();
+               }
+       }
+
+       if ((dimm_64bit == TRUE) && (dimm_32bit == TRUE)) {
+               printf("ERROR: Cannot mix 32 bit and 64 bit DDR-SDRAM DIMMs together.\n");
+               hang();
+       }
+       else if ((dimm_64bit == TRUE) && (dimm_32bit == FALSE)) {
+               mcopt1 |= SDRAM_MCOPT1_DMWD_64;
+       } else if ((dimm_64bit == FALSE) && (dimm_32bit == TRUE)) {
+               mcopt1 |= SDRAM_MCOPT1_DMWD_32;
+       } else {
+               printf("ERROR: Please install only 32 or 64 bit DDR-SDRAM DIMMs.\n\n");
+               hang();
+       }
+
+       if (ecc_enabled == TRUE)
+               mcopt1 |= SDRAM_MCOPT1_MCHK_GEN;
+       else
+               mcopt1 |= SDRAM_MCOPT1_MCHK_NON;
+
+       mtsdram(SDRAM_MCOPT1, mcopt1);
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_codt.
+ *-----------------------------------------------------------------------------*/
+static void program_codt(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
+{
+       unsigned long codt;
+       unsigned long modt0 = 0;
+       unsigned long modt1 = 0;
+       unsigned long modt2 = 0;
+       unsigned long modt3 = 0;
+       unsigned char dimm_num;
+       unsigned char dimm_rank;
+       unsigned char total_rank = 0;
+       unsigned char total_dimm = 0;
+       unsigned char dimm_type = 0;
+       unsigned char firstSlot = 0;
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Controller On Die Termination Register
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_CODT, codt);
+       codt |= (SDRAM_CODT_IO_NMODE
+                & (~SDRAM_CODT_DQS_SINGLE_END
+                   & ~SDRAM_CODT_CKSE_SINGLE_END
+                   & ~SDRAM_CODT_FEEBBACK_RCV_SINGLE_END
+                   & ~SDRAM_CODT_FEEBBACK_DRV_SINGLE_END));
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       dimm_rank = (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 5);
+                       if (((unsigned long)spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08) {
+                               dimm_rank = (dimm_rank & 0x0F) + 1;
+                               dimm_type = SDRAM_DDR2;
+                       } else {
+                               dimm_rank = dimm_rank & 0x0F;
+                               dimm_type = SDRAM_DDR1;
+                       }
+
+                       total_rank += dimm_rank;
+                       total_dimm++;
+                       if ((dimm_num == 0) && (total_dimm == 1))
+                               firstSlot = TRUE;
+                       else
+                               firstSlot = FALSE;
+               }
+       }
+       if (dimm_type == SDRAM_DDR2) {
+               codt |= SDRAM_CODT_DQS_1_8_V_DDR2;
+               if ((total_dimm == 1) && (firstSlot == TRUE)) {
+                       if (total_rank == 1) {
+                               codt |= CALC_ODT_R(0);
+                               modt0 = CALC_ODT_W(0);
+                               modt1 = 0x00000000;
+                               modt2 = 0x00000000;
+                               modt3 = 0x00000000;
+                       }
+                       if (total_rank == 2) {
+                               codt |= CALC_ODT_R(0) | CALC_ODT_R(1);
+                               modt0 = CALC_ODT_W(0);
+                               modt1 = CALC_ODT_W(0);
+                               modt2 = 0x00000000;
+                               modt3 = 0x00000000;
+                       }
+               } else if ((total_dimm == 1) && (firstSlot != TRUE)) {
+                       if (total_rank == 1) {
+                               codt |= CALC_ODT_R(2);
+                               modt0 = 0x00000000;
+                               modt1 = 0x00000000;
+                               modt2 = CALC_ODT_W(2);
+                               modt3 = 0x00000000;
+                       }
+                       if (total_rank == 2) {
+                               codt |= CALC_ODT_R(2) | CALC_ODT_R(3);
+                               modt0 = 0x00000000;
+                               modt1 = 0x00000000;
+                               modt2 = CALC_ODT_W(2);
+                               modt3 = CALC_ODT_W(2);
+                       }
+               }
+               if (total_dimm == 2) {
+                       if (total_rank == 2) {
+                               codt |= CALC_ODT_R(0) | CALC_ODT_R(2);
+                               modt0 = CALC_ODT_RW(2);
+                               modt1 = 0x00000000;
+                               modt2 = CALC_ODT_RW(0);
+                               modt3 = 0x00000000;
+                       }
+                       if (total_rank == 4) {
+                               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);
+                               modt3 = 0x00000000;
+                       }
+               }
+       } else {
+               codt |= SDRAM_CODT_DQS_2_5_V_DDR1;
+               modt0 = 0x00000000;
+               modt1 = 0x00000000;
+               modt2 = 0x00000000;
+               modt3 = 0x00000000;
+
+               if (total_dimm == 1) {
+                       if (total_rank == 1)
+                               codt |= 0x00800000;
+                       if (total_rank == 2)
+                               codt |= 0x02800000;
+               }
+               if (total_dimm == 2) {
+                       if (total_rank == 2)
+                               codt |= 0x08800000;
+                       if (total_rank == 4)
+                               codt |= 0x2a800000;
+               }
+       }
+
+       debug("nb of dimm %d\n", total_dimm);
+       debug("nb of rank %d\n", total_rank);
+       if (total_dimm == 1)
+               debug("dimm in slot %d\n", firstSlot);
+
+       mtsdram(SDRAM_CODT, codt);
+       mtsdram(SDRAM_MODT0, modt0);
+       mtsdram(SDRAM_MODT1, modt1);
+       mtsdram(SDRAM_MODT2, modt2);
+       mtsdram(SDRAM_MODT3, modt3);
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_initplr.
+ *-----------------------------------------------------------------------------*/
+static void program_initplr(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks,
+                           ddr_cas_id_t selected_cas,
+                           int write_recovery)
+{
+       u32 cas = 0;
+       u32 odt = 0;
+       u32 ods = 0;
+       u32 mr;
+       u32 wr;
+       u32 emr;
+       u32 emr2;
+       u32 emr3;
+       int dimm_num;
+       int total_dimm = 0;
+
+       /******************************************************
+        ** Assumption: if more than one DIMM, all DIMMs are the same
+        **             as already checked in check_memory_type
+        ******************************************************/
+
+       if ((dimm_populated[0] == SDRAM_DDR1) || (dimm_populated[1] == SDRAM_DDR1)) {
+               mtsdram(SDRAM_INITPLR0, 0x81B80000);
+               mtsdram(SDRAM_INITPLR1, 0x81900400);
+               mtsdram(SDRAM_INITPLR2, 0x81810000);
+               mtsdram(SDRAM_INITPLR3, 0xff800162);
+               mtsdram(SDRAM_INITPLR4, 0x81900400);
+               mtsdram(SDRAM_INITPLR5, 0x86080000);
+               mtsdram(SDRAM_INITPLR6, 0x86080000);
+               mtsdram(SDRAM_INITPLR7, 0x81000062);
+       } else if ((dimm_populated[0] == SDRAM_DDR2) || (dimm_populated[1] == SDRAM_DDR2)) {
+               switch (selected_cas) {
+               case DDR_CAS_3:
+                       cas = 3 << 4;
+                       break;
+               case DDR_CAS_4:
+                       cas = 4 << 4;
+                       break;
+               case DDR_CAS_5:
+                       cas = 5 << 4;
+                       break;
+               default:
+                       printf("ERROR: ucode error on selected_cas value %d", selected_cas);
+                       hang();
+                       break;
+               }
+
+#if 0
+               /*
+                * ToDo - Still a problem with the write recovery:
+                * On the Corsair CM2X512-5400C4 module, setting write recovery
+                * in the INITPLR reg to the value calculated in program_mode()
+                * results in not correctly working DDR2 memory (crash after
+                * relocation).
+                *
+                * So for now, set the write recovery to 3. This seems to work
+                * on the Corair module too.
+                *
+                * 2007-03-01, sr
+                */
+               switch (write_recovery) {
+               case 3:
+                       wr = WRITE_RECOV_3;
+                       break;
+               case 4:
+                       wr = WRITE_RECOV_4;
+                       break;
+               case 5:
+                       wr = WRITE_RECOV_5;
+                       break;
+               case 6:
+                       wr = WRITE_RECOV_6;
+                       break;
+               default:
+                       printf("ERROR: write recovery not support (%d)", write_recovery);
+                       hang();
+                       break;
+               }
+#else
+               wr = WRITE_RECOV_3; /* test-only, see description above */
+#endif
+
+               for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++)
+                       if (dimm_populated[dimm_num] != SDRAM_NONE)
+                               total_dimm++;
+               if (total_dimm == 1) {
+                       odt = ODT_150_OHM;
+                       ods = ODS_FULL;
+               } else if (total_dimm == 2) {
+                       odt = ODT_75_OHM;
+                       ods = ODS_REDUCED;
+               } else {
+                       printf("ERROR: Unsupported number of DIMM's (%d)", total_dimm);
+                       hang();
+               }
+
+               mr = CMD_EMR | SELECT_MR | BURST_LEN_4 | wr | cas;
+               emr = CMD_EMR | SELECT_EMR | odt | ods;
+               emr2 = CMD_EMR | SELECT_EMR2;
+               emr3 = CMD_EMR | SELECT_EMR3;
+               mtsdram(SDRAM_INITPLR0,  0xB5000000 | CMD_NOP);         /* NOP */
+               udelay(1000);
+               mtsdram(SDRAM_INITPLR1,  0x82000400 | CMD_PRECHARGE);   /* precharge 8 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR2,  0x80800000 | emr2);            /* EMR2 */
+               mtsdram(SDRAM_INITPLR3,  0x80800000 | emr3);            /* EMR3 */
+               mtsdram(SDRAM_INITPLR4,  0x80800000 | emr);             /* EMR DLL ENABLE */
+               mtsdram(SDRAM_INITPLR5,  0x80800000 | mr | DLL_RESET);  /* MR w/ DLL reset */
+               udelay(1000);
+               mtsdram(SDRAM_INITPLR6,  0x82000400 | CMD_PRECHARGE);   /* precharge 8 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR7,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR8,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR9,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR10, 0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
+               mtsdram(SDRAM_INITPLR11, 0x80000000 | mr);              /* MR w/o DLL reset */
+               mtsdram(SDRAM_INITPLR12, 0x80800380 | emr);             /* EMR OCD Default */
+               mtsdram(SDRAM_INITPLR13, 0x80800000 | emr);             /* EMR OCD Exit */
+       } else {
+               printf("ERROR: ucode error as unknown DDR type in program_initplr");
+               hang();
+       }
+}
+
+/*------------------------------------------------------------------
+ * This routine programs the SDRAM_MMODE register.
+ * the selected_cas is an output parameter, that will be passed
+ * by caller to call the above program_initplr( )
+ *-----------------------------------------------------------------*/
+static void program_mode(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks,
+                        ddr_cas_id_t *selected_cas,
+                        int *write_recovery)
+{
+       unsigned long dimm_num;
+       unsigned long sdram_ddr1;
+       unsigned long t_wr_ns;
+       unsigned long t_wr_clk;
+       unsigned long cas_bit;
+       unsigned long cas_index;
+       unsigned long sdram_freq;
+       unsigned long ddr_check;
+       unsigned long mmode;
+       unsigned long tcyc_reg;
+       unsigned long cycle_2_0_clk;
+       unsigned long cycle_2_5_clk;
+       unsigned long cycle_3_0_clk;
+       unsigned long cycle_4_0_clk;
+       unsigned long cycle_5_0_clk;
+       unsigned long max_2_0_tcyc_ns_x_100;
+       unsigned long max_2_5_tcyc_ns_x_100;
+       unsigned long max_3_0_tcyc_ns_x_100;
+       unsigned long max_4_0_tcyc_ns_x_100;
+       unsigned long max_5_0_tcyc_ns_x_100;
+       unsigned long cycle_time_ns_x_100[3];
+       PPC440_SYS_INFO board_cfg;
+       unsigned char cas_2_0_available;
+       unsigned char cas_2_5_available;
+       unsigned char cas_3_0_available;
+       unsigned char cas_4_0_available;
+       unsigned char cas_5_0_available;
+       unsigned long sdr_ddrpll;
+
+       /*------------------------------------------------------------------
+        * Get the board configuration info.
+        *-----------------------------------------------------------------*/
+       get_sys_info(&board_cfg);
+
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
+       sdram_freq = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(sdr_ddrpll), 1);
+
+       /*------------------------------------------------------------------
+        * Handle the timing.  We need to find the worst case timing of all
+        * the dimm modules installed.
+        *-----------------------------------------------------------------*/
+       t_wr_ns = 0;
+       cas_2_0_available = TRUE;
+       cas_2_5_available = TRUE;
+       cas_3_0_available = TRUE;
+       cas_4_0_available = TRUE;
+       cas_5_0_available = TRUE;
+       max_2_0_tcyc_ns_x_100 = 10;
+       max_2_5_tcyc_ns_x_100 = 10;
+       max_3_0_tcyc_ns_x_100 = 10;
+       max_4_0_tcyc_ns_x_100 = 10;
+       max_5_0_tcyc_ns_x_100 = 10;
+       sdram_ddr1 = TRUE;
+
+       /* loop through all the DIMM slots on the board */
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               /* If a dimm is installed in a particular slot ... */
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       if (dimm_populated[dimm_num] == SDRAM_DDR1)
+                               sdram_ddr1 = TRUE;
+                       else
+                               sdram_ddr1 = FALSE;
+
+                       /* t_wr_ns = max(t_wr_ns, (unsigned long)dimm_spd[dimm_num][36] >> 2); */ /*  not used in this loop. */
+                       cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
+
+                       /* For a particular DIMM, grab the three CAS values it supports */
+                       for (cas_index = 0; cas_index < 3; cas_index++) {
+                               switch (cas_index) {
+                               case 0:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
+                                       break;
+                               case 1:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
+                                       break;
+                               default:
+                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
+                                       break;
+                               }
+
+                               if ((tcyc_reg & 0x0F) >= 10) {
+                                       if ((tcyc_reg & 0x0F) == 0x0D) {
+                                               /* Convert from hex to decimal */
+                                               cycle_time_ns_x_100[cas_index] = (((tcyc_reg & 0xF0) >> 4) * 100) + 75;
+                                       } else {
+                                               printf("ERROR: SPD reported Tcyc is incorrect for DIMM "
+                                                      "in slot %d\n", (unsigned int)dimm_num);
+                                               hang();
+                                       }
+                               } else {
+                                       /* Convert from hex to decimal */
+                                       cycle_time_ns_x_100[cas_index] = (((tcyc_reg & 0xF0) >> 4) * 100) +
+                                               ((tcyc_reg & 0x0F)*10);
+                               }
+                       }
+
+                       /* The rest of this routine determines if CAS 2.0, 2.5, 3.0, 4.0 and 5.0 are */
+                       /* supported for a particular DIMM. */
+                       cas_index = 0;
+
+                       if (sdram_ddr1) {
+                               /*
+                                * DDR devices use the following bitmask for CAS latency:
+                                *  Bit   7    6    5    4    3    2    1    0
+                                *       TBD  4.0  3.5  3.0  2.5  2.0  1.5  1.0
+                                */
+                               if (((cas_bit & 0x40) == 0x40) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_4_0_tcyc_ns_x_100 = max(max_4_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_4_0_available = FALSE;
+                               }
+
+                               if (((cas_bit & 0x10) == 0x10) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_3_0_tcyc_ns_x_100 = max(max_3_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_3_0_available = FALSE;
+                               }
+
+                               if (((cas_bit & 0x08) == 0x08) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_2_5_tcyc_ns_x_100 = max(max_2_5_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_2_5_available = FALSE;
+                               }
+
+                               if (((cas_bit & 0x04) == 0x04) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_2_0_tcyc_ns_x_100 = max(max_2_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_2_0_available = FALSE;
+                               }
+                       } else {
+                               /*
+                                * DDR2 devices use the following bitmask for CAS latency:
+                                *  Bit   7    6    5    4    3    2    1    0
+                                *       TBD  6.0  5.0  4.0  3.0  2.0  TBD  TBD
+                                */
+                               if (((cas_bit & 0x20) == 0x20) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_5_0_tcyc_ns_x_100 = max(max_5_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_5_0_available = FALSE;
+                               }
+
+                               if (((cas_bit & 0x10) == 0x10) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_4_0_tcyc_ns_x_100 = max(max_4_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_4_0_available = FALSE;
+                               }
+
+                               if (((cas_bit & 0x08) == 0x08) && (cas_index < 3) && (cycle_time_ns_x_100[cas_index] != 0)) {
+                                       max_3_0_tcyc_ns_x_100 = max(max_3_0_tcyc_ns_x_100, cycle_time_ns_x_100[cas_index]);
+                                       cas_index++;
+                               } else {
+                                       if (cas_index != 0)
+                                               cas_index++;
+                                       cas_3_0_available = FALSE;
+                               }
+                       }
+               }
+       }
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM mode, SDRAM_MMODE
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MMODE, mmode);
+       mmode = mmode & ~(SDRAM_MMODE_WR_MASK | SDRAM_MMODE_DCL_MASK);
+
+       /* add 10 here because of rounding problems */
+       cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100) + 10;
+       cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100) + 10;
+       cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100) + 10;
+       cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100) + 10;
+       cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100) + 10;
+
+       if (sdram_ddr1 == TRUE) { /* DDR1 */
+               if ((cas_2_0_available == TRUE) && (sdram_freq <= cycle_2_0_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR1_2_0_CLK;
+                       *selected_cas = DDR_CAS_2;
+               } else if ((cas_2_5_available == TRUE) && (sdram_freq <= cycle_2_5_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR1_2_5_CLK;
+                       *selected_cas = DDR_CAS_2_5;
+               } else if ((cas_3_0_available == TRUE) && (sdram_freq <= cycle_3_0_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR1_3_0_CLK;
+                       *selected_cas = DDR_CAS_3;
+               } else {
+                       printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
+                       printf("Only DIMMs DDR1 with CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
+                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n\n");
+                       hang();
+               }
+       } else { /* DDR2 */
+               if ((cas_3_0_available == TRUE) && (sdram_freq <= cycle_3_0_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR2_3_0_CLK;
+                       *selected_cas = DDR_CAS_3;
+               } else if ((cas_4_0_available == TRUE) && (sdram_freq <= cycle_4_0_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR2_4_0_CLK;
+                       *selected_cas = DDR_CAS_4;
+               } else if ((cas_5_0_available == TRUE) && (sdram_freq <= cycle_5_0_clk)) {
+                       mmode |= SDRAM_MMODE_DCL_DDR2_5_0_CLK;
+                       *selected_cas = DDR_CAS_5;
+               } else {
+                       printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
+                       printf("Only DIMMs DDR2 with CAS latencies of 3.0, 4.0, and 5.0 are supported.\n");
+                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n");
+                       printf("cas3=%d cas4=%d cas5=%d\n",
+                              cas_3_0_available, cas_4_0_available, cas_5_0_available);
+                       printf("sdram_freq=%d cycle3=%d cycle4=%d cycle5=%d\n\n",
+                              sdram_freq, cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk);
+                       hang();
+               }
+       }
+
+       if (sdram_ddr1 == TRUE)
+               mmode |= SDRAM_MMODE_WR_DDR1;
+       else {
+
+               /* loop through all the DIMM slots on the board */
+               for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+                       /* If a dimm is installed in a particular slot ... */
+                       if (dimm_populated[dimm_num] != SDRAM_NONE)
+                               t_wr_ns = max(t_wr_ns,
+                                             spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
+               }
+
+               /*
+                * convert from nanoseconds to ddr clocks
+                * round up if necessary
+                */
+               t_wr_clk = MULDIV64(sdram_freq, t_wr_ns, ONE_BILLION);
+               ddr_check = MULDIV64(ONE_BILLION, t_wr_clk, t_wr_ns);
+               if (sdram_freq != ddr_check)
+                       t_wr_clk++;
+
+               switch (t_wr_clk) {
+               case 0:
+               case 1:
+               case 2:
+               case 3:
+                       mmode |= SDRAM_MMODE_WR_DDR2_3_CYC;
+                       break;
+               case 4:
+                       mmode |= SDRAM_MMODE_WR_DDR2_4_CYC;
+                       break;
+               case 5:
+                       mmode |= SDRAM_MMODE_WR_DDR2_5_CYC;
+                       break;
+               default:
+                       mmode |= SDRAM_MMODE_WR_DDR2_6_CYC;
+                       break;
+               }
+               *write_recovery = t_wr_clk;
+       }
+
+       debug("CAS latency = %d\n", *selected_cas);
+       debug("Write recovery = %d\n", *write_recovery);
+
+       mtsdram(SDRAM_MMODE, mmode);
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_rtr.
+ *-----------------------------------------------------------------------------*/
+static void program_rtr(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks)
+{
+       PPC440_SYS_INFO board_cfg;
+       unsigned long max_refresh_rate;
+       unsigned long dimm_num;
+       unsigned long refresh_rate_type;
+       unsigned long refresh_rate;
+       unsigned long rint;
+       unsigned long sdram_freq;
+       unsigned long sdr_ddrpll;
+       unsigned long val;
+
+       /*------------------------------------------------------------------
+        * Get the board configuration info.
+        *-----------------------------------------------------------------*/
+       get_sys_info(&board_cfg);
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Refresh Timing Register, SDRAM_RTR
+        *-----------------------------------------------------------------*/
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
+       sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
+
+       max_refresh_rate = 0;
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+
+                       refresh_rate_type = spd_read(iic0_dimm_addr[dimm_num], 12);
+                       refresh_rate_type &= 0x7F;
+                       switch (refresh_rate_type) {
+                       case 0:
+                               refresh_rate =  15625;
+                               break;
+                       case 1:
+                               refresh_rate =   3906;
+                               break;
+                       case 2:
+                               refresh_rate =   7812;
+                               break;
+                       case 3:
+                               refresh_rate =  31250;
+                               break;
+                       case 4:
+                               refresh_rate =  62500;
+                               break;
+                       case 5:
+                               refresh_rate = 125000;
+                               break;
+                       default:
+                               refresh_rate = 0;
+                               printf("ERROR: DIMM %d unsupported refresh rate/type.\n",
+                                      (unsigned int)dimm_num);
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                               break;
+                       }
+
+                       max_refresh_rate = max(max_refresh_rate, refresh_rate);
+               }
+       }
+
+       rint = MULDIV64(sdram_freq, max_refresh_rate, ONE_BILLION);
+       mfsdram(SDRAM_RTR, val);
+       mtsdram(SDRAM_RTR, (val & ~SDRAM_RTR_RINT_MASK) |
+               (SDRAM_RTR_RINT_ENCODE(rint)));
+}
+
+/*------------------------------------------------------------------
+ * This routine programs the SDRAM_TRx registers.
+ *-----------------------------------------------------------------*/
+static void program_tr(unsigned long *dimm_populated,
+                      unsigned char *iic0_dimm_addr,
+                      unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long sdram_ddr1;
+       unsigned long t_rp_ns;
+       unsigned long t_rcd_ns;
+       unsigned long t_rrd_ns;
+       unsigned long t_ras_ns;
+       unsigned long t_rc_ns;
+       unsigned long t_rfc_ns;
+       unsigned long t_wpc_ns;
+       unsigned long t_wtr_ns;
+       unsigned long t_rpc_ns;
+       unsigned long t_rp_clk;
+       unsigned long t_rcd_clk;
+       unsigned long t_rrd_clk;
+       unsigned long t_ras_clk;
+       unsigned long t_rc_clk;
+       unsigned long t_rfc_clk;
+       unsigned long t_wpc_clk;
+       unsigned long t_wtr_clk;
+       unsigned long t_rpc_clk;
+       unsigned long sdtr1, sdtr2, sdtr3;
+       unsigned long ddr_check;
+       unsigned long sdram_freq;
+       unsigned long sdr_ddrpll;
+
+       PPC440_SYS_INFO board_cfg;
+
+       /*------------------------------------------------------------------
+        * Get the board configuration info.
+        *-----------------------------------------------------------------*/
+       get_sys_info(&board_cfg);
+
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
+       sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
+
+       /*------------------------------------------------------------------
+        * Handle the timing.  We need to find the worst case timing of all
+        * the dimm modules installed.
+        *-----------------------------------------------------------------*/
+       t_rp_ns = 0;
+       t_rrd_ns = 0;
+       t_rcd_ns = 0;
+       t_ras_ns = 0;
+       t_rc_ns = 0;
+       t_rfc_ns = 0;
+       t_wpc_ns = 0;
+       t_wtr_ns = 0;
+       t_rpc_ns = 0;
+       sdram_ddr1 = TRUE;
+
+       /* loop through all the DIMM slots on the board */
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               /* If a dimm is installed in a particular slot ... */
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       if (dimm_populated[dimm_num] == SDRAM_DDR2)
+                               sdram_ddr1 = TRUE;
+                       else
+                               sdram_ddr1 = FALSE;
+
+                       t_rcd_ns = max(t_rcd_ns, spd_read(iic0_dimm_addr[dimm_num], 29) >> 2);
+                       t_rrd_ns = max(t_rrd_ns, spd_read(iic0_dimm_addr[dimm_num], 28) >> 2);
+                       t_rp_ns  = max(t_rp_ns,  spd_read(iic0_dimm_addr[dimm_num], 27) >> 2);
+                       t_ras_ns = max(t_ras_ns, spd_read(iic0_dimm_addr[dimm_num], 30));
+                       t_rc_ns  = max(t_rc_ns,  spd_read(iic0_dimm_addr[dimm_num], 41));
+                       t_rfc_ns = max(t_rfc_ns, spd_read(iic0_dimm_addr[dimm_num], 42));
+               }
+       }
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Timing Reg 1, SDRAM_TR1
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_SDTR1, sdtr1);
+       sdtr1 &= ~(SDRAM_SDTR1_LDOF_MASK | SDRAM_SDTR1_RTW_MASK |
+                  SDRAM_SDTR1_WTWO_MASK | SDRAM_SDTR1_RTRO_MASK);
+
+       /* default values */
+       sdtr1 |= SDRAM_SDTR1_LDOF_2_CLK;
+       sdtr1 |= SDRAM_SDTR1_RTW_2_CLK;
+
+       /* normal operations */
+       sdtr1 |= SDRAM_SDTR1_WTWO_0_CLK;
+       sdtr1 |= SDRAM_SDTR1_RTRO_1_CLK;
+
+       mtsdram(SDRAM_SDTR1, sdtr1);
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Timing Reg 2, SDRAM_TR2
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_SDTR2, sdtr2);
+       sdtr2 &= ~(SDRAM_SDTR2_RCD_MASK  | SDRAM_SDTR2_WTR_MASK |
+                  SDRAM_SDTR2_XSNR_MASK | SDRAM_SDTR2_WPC_MASK |
+                  SDRAM_SDTR2_RPC_MASK  | SDRAM_SDTR2_RP_MASK  |
+                  SDRAM_SDTR2_RRD_MASK);
+
+       /*
+        * convert t_rcd from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_rcd_clk = MULDIV64(sdram_freq, t_rcd_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_rcd_clk, t_rcd_ns);
+       if (sdram_freq != ddr_check)
+               t_rcd_clk++;
+
+       switch (t_rcd_clk) {
+       case 0:
+       case 1:
+               sdtr2 |= SDRAM_SDTR2_RCD_1_CLK;
+               break;
+       case 2:
+               sdtr2 |= SDRAM_SDTR2_RCD_2_CLK;
+               break;
+       case 3:
+               sdtr2 |= SDRAM_SDTR2_RCD_3_CLK;
+               break;
+       case 4:
+               sdtr2 |= SDRAM_SDTR2_RCD_4_CLK;
+               break;
+       default:
+               sdtr2 |= SDRAM_SDTR2_RCD_5_CLK;
+               break;
+       }
+
+       if (sdram_ddr1 == TRUE) { /* DDR1 */
+               if (sdram_freq < 200000000) {
+                       sdtr2 |= SDRAM_SDTR2_WTR_1_CLK;
+                       sdtr2 |= SDRAM_SDTR2_WPC_2_CLK;
+                       sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
+               } else {
+                       sdtr2 |= SDRAM_SDTR2_WTR_2_CLK;
+                       sdtr2 |= SDRAM_SDTR2_WPC_3_CLK;
+                       sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
+               }
+       } else { /* DDR2 */
+               /* loop through all the DIMM slots on the board */
+               for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+                       /* If a dimm is installed in a particular slot ... */
+                       if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                               t_wpc_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
+                               t_wtr_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 37) >> 2);
+                               t_rpc_ns = max(t_rpc_ns, spd_read(iic0_dimm_addr[dimm_num], 38) >> 2);
+                       }
+               }
+
+               /*
+                * convert from nanoseconds to ddr clocks
+                * round up if necessary
+                */
+               t_wpc_clk = MULDIV64(sdram_freq, t_wpc_ns, ONE_BILLION);
+               ddr_check = MULDIV64(ONE_BILLION, t_wpc_clk, t_wpc_ns);
+               if (sdram_freq != ddr_check)
+                       t_wpc_clk++;
+
+               switch (t_wpc_clk) {
+               case 0:
+               case 1:
+               case 2:
+                       sdtr2 |= SDRAM_SDTR2_WPC_2_CLK;
+                       break;
+               case 3:
+                       sdtr2 |= SDRAM_SDTR2_WPC_3_CLK;
+                       break;
+               case 4:
+                       sdtr2 |= SDRAM_SDTR2_WPC_4_CLK;
+                       break;
+               case 5:
+                       sdtr2 |= SDRAM_SDTR2_WPC_5_CLK;
+                       break;
+               default:
+                       sdtr2 |= SDRAM_SDTR2_WPC_6_CLK;
+                       break;
+               }
+
+               /*
+                * convert from nanoseconds to ddr clocks
+                * round up if necessary
+                */
+               t_wtr_clk = MULDIV64(sdram_freq, t_wtr_ns, ONE_BILLION);
+               ddr_check = MULDIV64(ONE_BILLION, t_wtr_clk, t_wtr_ns);
+               if (sdram_freq != ddr_check)
+                       t_wtr_clk++;
+
+               switch (t_wtr_clk) {
+               case 0:
+               case 1:
+                       sdtr2 |= SDRAM_SDTR2_WTR_1_CLK;
+                       break;
+               case 2:
+                       sdtr2 |= SDRAM_SDTR2_WTR_2_CLK;
+                       break;
+               case 3:
+                       sdtr2 |= SDRAM_SDTR2_WTR_3_CLK;
+                       break;
+               default:
+                       sdtr2 |= SDRAM_SDTR2_WTR_4_CLK;
+                       break;
+               }
+
+               /*
+                * convert from nanoseconds to ddr clocks
+                * round up if necessary
+                */
+               t_rpc_clk = MULDIV64(sdram_freq, t_rpc_ns, ONE_BILLION);
+               ddr_check = MULDIV64(ONE_BILLION, t_rpc_clk, t_rpc_ns);
+               if (sdram_freq != ddr_check)
+                       t_rpc_clk++;
+
+               switch (t_rpc_clk) {
+               case 0:
+               case 1:
+               case 2:
+                       sdtr2 |= SDRAM_SDTR2_RPC_2_CLK;
+                       break;
+               case 3:
+                       sdtr2 |= SDRAM_SDTR2_RPC_3_CLK;
+                       break;
+               default:
+                       sdtr2 |= SDRAM_SDTR2_RPC_4_CLK;
+                       break;
+               }
+       }
+
+       /* default value */
+       sdtr2 |= SDRAM_SDTR2_XSNR_16_CLK;
+
+       /*
+        * convert t_rrd from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_rrd_clk = MULDIV64(sdram_freq, t_rrd_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_rrd_clk, t_rrd_ns);
+       if (sdram_freq != ddr_check)
+               t_rrd_clk++;
+
+       if (t_rrd_clk == 3)
+               sdtr2 |= SDRAM_SDTR2_RRD_3_CLK;
+       else
+               sdtr2 |= SDRAM_SDTR2_RRD_2_CLK;
+
+       /*
+        * convert t_rp from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_rp_clk = MULDIV64(sdram_freq, t_rp_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_rp_clk, t_rp_ns);
+       if (sdram_freq != ddr_check)
+               t_rp_clk++;
+
+       switch (t_rp_clk) {
+       case 0:
+       case 1:
+       case 2:
+       case 3:
+               sdtr2 |= SDRAM_SDTR2_RP_3_CLK;
+               break;
+       case 4:
+               sdtr2 |= SDRAM_SDTR2_RP_4_CLK;
+               break;
+       case 5:
+               sdtr2 |= SDRAM_SDTR2_RP_5_CLK;
+               break;
+       case 6:
+               sdtr2 |= SDRAM_SDTR2_RP_6_CLK;
+               break;
+       default:
+               sdtr2 |= SDRAM_SDTR2_RP_7_CLK;
+               break;
+       }
+
+       mtsdram(SDRAM_SDTR2, sdtr2);
+
+       /*------------------------------------------------------------------
+        * Set the SDRAM Timing Reg 3, SDRAM_TR3
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_SDTR3, sdtr3);
+       sdtr3 &= ~(SDRAM_SDTR3_RAS_MASK  | SDRAM_SDTR3_RC_MASK |
+                  SDRAM_SDTR3_XCS_MASK | SDRAM_SDTR3_RFC_MASK);
+
+       /*
+        * convert t_ras from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_ras_clk = MULDIV64(sdram_freq, t_ras_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_ras_clk, t_ras_ns);
+       if (sdram_freq != ddr_check)
+               t_ras_clk++;
+
+       sdtr3 |= SDRAM_SDTR3_RAS_ENCODE(t_ras_clk);
+
+       /*
+        * convert t_rc from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_rc_clk = MULDIV64(sdram_freq, t_rc_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_rc_clk, t_rc_ns);
+       if (sdram_freq != ddr_check)
+               t_rc_clk++;
+
+       sdtr3 |= SDRAM_SDTR3_RC_ENCODE(t_rc_clk);
+
+       /* default xcs value */
+       sdtr3 |= SDRAM_SDTR3_XCS;
+
+       /*
+        * convert t_rfc from nanoseconds to ddr clocks
+        * round up if necessary
+        */
+       t_rfc_clk = MULDIV64(sdram_freq, t_rfc_ns, ONE_BILLION);
+       ddr_check = MULDIV64(ONE_BILLION, t_rfc_clk, t_rfc_ns);
+       if (sdram_freq != ddr_check)
+               t_rfc_clk++;
+
+       sdtr3 |= SDRAM_SDTR3_RFC_ENCODE(t_rfc_clk);
+
+       mtsdram(SDRAM_SDTR3, sdtr3);
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_bxcf.
+ *-----------------------------------------------------------------------------*/
+static void program_bxcf(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long num_col_addr;
+       unsigned long num_ranks;
+       unsigned long num_banks;
+       unsigned long mode;
+       unsigned long ind_rank;
+       unsigned long ind;
+       unsigned long ind_bank;
+       unsigned long bank_0_populated;
+
+       /*------------------------------------------------------------------
+        * Set the BxCF regs.  First, wipe out the bank config registers.
+        *-----------------------------------------------------------------*/
+       mtdcr(SDRAMC_CFGADDR, SDRAM_MB0CF);
+       mtdcr(SDRAMC_CFGDATA, 0x00000000);
+       mtdcr(SDRAMC_CFGADDR, SDRAM_MB1CF);
+       mtdcr(SDRAMC_CFGDATA, 0x00000000);
+       mtdcr(SDRAMC_CFGADDR, SDRAM_MB2CF);
+       mtdcr(SDRAMC_CFGDATA, 0x00000000);
+       mtdcr(SDRAMC_CFGADDR, SDRAM_MB3CF);
+       mtdcr(SDRAMC_CFGDATA, 0x00000000);
+
+       mode = SDRAM_BXCF_M_BE_ENABLE;
+
+       bank_0_populated = 0;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
+                       num_ranks = spd_read(iic0_dimm_addr[dimm_num], 5);
+                       if ((spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
+                               num_ranks = (num_ranks & 0x0F) +1;
+                       else
+                               num_ranks = num_ranks & 0x0F;
+
+                       num_banks = spd_read(iic0_dimm_addr[dimm_num], 17);
+
+                       for (ind_bank = 0; ind_bank < 2; ind_bank++) {
+                               if (num_banks == 4)
+                                       ind = 0;
+                               else
+                                       ind = 5;
+                               switch (num_col_addr) {
+                               case 0x08:
+                                       mode |= (SDRAM_BXCF_M_AM_0 + ind);
+                                       break;
+                               case 0x09:
+                                       mode |= (SDRAM_BXCF_M_AM_1 + ind);
+                                       break;
+                               case 0x0A:
+                                       mode |= (SDRAM_BXCF_M_AM_2 + ind);
+                                       break;
+                               case 0x0B:
+                                       mode |= (SDRAM_BXCF_M_AM_3 + ind);
+                                       break;
+                               case 0x0C:
+                                       mode |= (SDRAM_BXCF_M_AM_4 + ind);
+                                       break;
+                               default:
+                                       printf("DDR-SDRAM: DIMM %d BxCF configuration.\n",
+                                              (unsigned int)dimm_num);
+                                       printf("ERROR: Unsupported value for number of "
+                                              "column addresses: %d.\n", (unsigned int)num_col_addr);
+                                       printf("Replace the DIMM module with a supported DIMM.\n\n");
+                                       hang();
+                               }
+                       }
+
+                       if ((dimm_populated[dimm_num] != SDRAM_NONE)&& (dimm_num ==1))
+                               bank_0_populated = 1;
+
+                       for (ind_rank = 0; ind_rank < num_ranks; ind_rank++) {
+                               mtdcr(SDRAMC_CFGADDR, SDRAM_MB0CF + ((dimm_num + bank_0_populated + ind_rank) << 2));
+                               mtdcr(SDRAMC_CFGDATA, mode);
+                       }
+               }
+       }
+}
+
+/*------------------------------------------------------------------
+ * program memory queue.
+ *-----------------------------------------------------------------*/
+static void program_memory_queue(unsigned long *dimm_populated,
+                                unsigned char *iic0_dimm_addr,
+                                unsigned long num_dimm_banks)
+{
+       unsigned long dimm_num;
+       unsigned long rank_base_addr;
+       unsigned long rank_reg;
+       unsigned long rank_size_bytes;
+       unsigned long rank_size_id;
+       unsigned long num_ranks;
+       unsigned long baseadd_size;
+       unsigned long i;
+       unsigned long bank_0_populated = 0;
+
+       /*------------------------------------------------------------------
+        * Reset the rank_base_address.
+        *-----------------------------------------------------------------*/
+       rank_reg   = SDRAM_R0BAS;
+
+       rank_base_addr = 0x00000000;
+
+       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
+               if (dimm_populated[dimm_num] != SDRAM_NONE) {
+                       num_ranks = spd_read(iic0_dimm_addr[dimm_num], 5);
+                       if ((spd_read(iic0_dimm_addr[dimm_num], 2)) == 0x08)
+                               num_ranks = (num_ranks & 0x0F) + 1;
+                       else
+                               num_ranks = num_ranks & 0x0F;
+
+                       rank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
+
+                       /*------------------------------------------------------------------
+                        * Set the sizes
+                        *-----------------------------------------------------------------*/
+                       baseadd_size = 0;
+                       rank_size_bytes = 4 * 1024 * 1024 * rank_size_id;
+                       switch (rank_size_id) {
+                       case 0x02:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_8;
+                               break;
+                       case 0x04:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_16;
+                               break;
+                       case 0x08:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_32;
+                               break;
+                       case 0x10:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_64;
+                               break;
+                       case 0x20:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_128;
+                               break;
+                       case 0x40:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_256;
+                               break;
+                       case 0x80:
+                               baseadd_size |= SDRAM_RXBAS_SDSZ_512;
+                               break;
+                       default:
+                               printf("DDR-SDRAM: DIMM %d memory queue configuration.\n",
+                                      (unsigned int)dimm_num);
+                               printf("ERROR: Unsupported value for the banksize: %d.\n",
+                                      (unsigned int)rank_size_id);
+                               printf("Replace the DIMM module with a supported DIMM.\n\n");
+                               hang();
+                       }
+
+                       if ((dimm_populated[dimm_num] != SDRAM_NONE) && (dimm_num == 1))
+                               bank_0_populated = 1;
+
+                       for (i = 0; i < num_ranks; i++) {
+                               mtdcr_any(rank_reg+i+dimm_num+bank_0_populated,
+                                         (SDRAM_RXBAS_SDBA_ENCODE(rank_base_addr) |
+                                          baseadd_size));
+                               rank_base_addr += rank_size_bytes;
+                       }
+               }
+       }
+}
+
+/*-----------------------------------------------------------------------------+
+ * is_ecc_enabled.
+ *-----------------------------------------------------------------------------*/
+static unsigned long is_ecc_enabled(void)
+{
+       unsigned long dimm_num;
+       unsigned long ecc;
+       unsigned long val;
+
+       ecc = 0;
+       /* loop through all the DIMM slots on the board */
+       for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
+               mfsdram(SDRAM_MCOPT1, val);
+               ecc = max(ecc, SDRAM_MCOPT1_MCHK_CHK_DECODE(val));
+       }
+
+       return ecc;
+}
+
+#ifdef CONFIG_DDR_ECC
+/*-----------------------------------------------------------------------------+
+ * program_ecc.
+ *-----------------------------------------------------------------------------*/
+static void program_ecc(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks,
+                       unsigned long tlb_word2_i_value)
+{
+       unsigned long mcopt1;
+       unsigned long mcopt2;
+       unsigned long mcstat;
+       unsigned long dimm_num;
+       unsigned long ecc;
+
+       ecc = 0;
+       /* loop through all the DIMM slots on the board */
+       for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
+               /* If a dimm is installed in a particular slot ... */
+               if (dimm_populated[dimm_num] != SDRAM_NONE)
+                       ecc = max(ecc, spd_read(iic0_dimm_addr[dimm_num], 11));
+       }
+       if (ecc == 0)
+               return;
+
+       mfsdram(SDRAM_MCOPT1, mcopt1);
+       mfsdram(SDRAM_MCOPT2, mcopt2);
+
+       if ((mcopt1 & SDRAM_MCOPT1_MCHK_MASK) != SDRAM_MCOPT1_MCHK_NON) {
+               /* DDR controller must be enabled and not in self-refresh. */
+               mfsdram(SDRAM_MCSTAT, mcstat);
+               if (((mcopt2 & SDRAM_MCOPT2_DCEN_MASK) == SDRAM_MCOPT2_DCEN_ENABLE)
+                   && ((mcopt2 & SDRAM_MCOPT2_SREN_MASK) == SDRAM_MCOPT2_SREN_EXIT)
+                   && ((mcstat & (SDRAM_MCSTAT_MIC_MASK | SDRAM_MCSTAT_SRMS_MASK))
+                       == (SDRAM_MCSTAT_MIC_COMP | SDRAM_MCSTAT_SRMS_NOT_SF))) {
+
+                       program_ecc_addr(0, sdram_memsize(), tlb_word2_i_value);
+               }
+       }
+
+       return;
+}
+
+#ifdef CONFIG_ECC_ERROR_RESET
+/*
+ * Check for ECC errors and reset board upon any error here
+ *
+ * On the Katmai 440SPe eval board, from time to time, the first
+ * lword write access after DDR2 initializazion with ECC checking
+ * enabled, leads to an ECC error. I couldn't find a configuration
+ * without this happening. On my board with the current setup it
+ * happens about 1 from 10 times.
+ *
+ * The ECC modules used for testing are:
+ * - Kingston ValueRAM KVR667D2E5/512 (tested with 1 and 2 DIMM's)
+ *
+ * This has to get fixed for the Katmai and tested for the other
+ * board (440SP/440SPe) that will eventually use this code in the
+ * future.
+ *
+ * 2007-03-01, sr
+ */
+static void check_ecc(void)
+{
+       u32 val;
+
+       mfsdram(SDRAM_ECCCR, val);
+       if (val != 0) {
+               printf("\nECC error: MCIF0_ECCES=%08lx MQ0_ESL=%08lx address=%08lx\n",
+                      val, mfdcr(0x4c), mfdcr(0x4e));
+               printf("ECC error occured, resetting board...\n");
+               do_reset(NULL, 0, 0, NULL);
+       }
+}
+#endif
+
+static void wait_ddr_idle(void)
+{
+       u32 val;
+
+       do {
+               mfsdram(SDRAM_MCSTAT, val);
+       } while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
+}
+
+/*-----------------------------------------------------------------------------+
+ * program_ecc_addr.
+ *-----------------------------------------------------------------------------*/
+static void program_ecc_addr(unsigned long start_address,
+                            unsigned long num_bytes,
+                            unsigned long tlb_word2_i_value)
+{
+       unsigned long current_address;
+       unsigned long end_address;
+       unsigned long address_increment;
+       unsigned long mcopt1;
+       char str[] = "ECC generation...";
+       int i;
+
+       current_address = start_address;
+       mfsdram(SDRAM_MCOPT1, mcopt1);
+       if ((mcopt1 & SDRAM_MCOPT1_MCHK_MASK) != SDRAM_MCOPT1_MCHK_NON) {
+               mtsdram(SDRAM_MCOPT1,
+                       (mcopt1 & ~SDRAM_MCOPT1_MCHK_MASK) | SDRAM_MCOPT1_MCHK_GEN);
+               sync();
+               eieio();
+               wait_ddr_idle();
+
+               puts(str);
+               if (tlb_word2_i_value == TLB_WORD2_I_ENABLE) {
+                       /* ECC bit set method for non-cached memory */
+                       if ((mcopt1 & SDRAM_MCOPT1_DMWD_MASK) == SDRAM_MCOPT1_DMWD_32)
+                               address_increment = 4;
+                       else
+                               address_increment = 8;
+                       end_address = current_address + num_bytes;
+
+                       while (current_address < end_address) {
+                               *((unsigned long *)current_address) = 0x00000000;
+                               current_address += address_increment;
+                       }
+               } else {
+                       /* ECC bit set method for cached memory */
+                       dcbz_area(start_address, num_bytes);
+                       dflush();
+               }
+               for (i=0; i<strlen(str); i++)
+                       putc('\b');
+
+               sync();
+               eieio();
+               wait_ddr_idle();
+
+               /* clear ECC error repoting registers */
+               mtsdram(SDRAM_ECCCR, 0xffffffff);
+               mtdcr(0x4c, 0xffffffff);
+
+               mtsdram(SDRAM_MCOPT1,
+                       (mcopt1 & ~SDRAM_MCOPT1_MCHK_MASK) | SDRAM_MCOPT1_MCHK_CHK_REP);
+               sync();
+               eieio();
+               wait_ddr_idle();
+
+#ifdef CONFIG_ECC_ERROR_RESET
+               /*
+                * One write to 0 is enough to trigger this ECC error
+                * (see description above)
+                */
+               out_be32(0, 0x12345678);
+               check_ecc();
+#endif
+       }
+}
+#endif
+
+/*-----------------------------------------------------------------------------+
+ * program_DQS_calibration.
+ *-----------------------------------------------------------------------------*/
+static void program_DQS_calibration(unsigned long *dimm_populated,
+                                   unsigned char *iic0_dimm_addr,
+                                   unsigned long num_dimm_banks)
+{
+       unsigned long val;
+
+#ifdef HARD_CODED_DQS /* calibration test with hardvalues */
+       mtsdram(SDRAM_RQDC, 0x80000037);
+       mtsdram(SDRAM_RDCC, 0x40000000);
+       mtsdram(SDRAM_RFDC, 0x000001DF);
+
+       test();
+#else
+       /*------------------------------------------------------------------
+        * Program RDCC register
+        * Read sample cycle auto-update enable
+        *-----------------------------------------------------------------*/
+
+       /*
+        * Modified for the Katmai platform:  with some DIMMs, the DDR2
+        * controller automatically selects the T2 read cycle, but this
+        * proves unreliable.  Go ahead and force the DDR2 controller
+        * to use the T4 sample and disable the automatic update of the
+        * RDSS field.
+        */
+       mfsdram(SDRAM_RDCC, val);
+       mtsdram(SDRAM_RDCC,
+               (val & ~(SDRAM_RDCC_RDSS_MASK | SDRAM_RDCC_RSAE_MASK))
+               | (SDRAM_RDCC_RDSS_T4 | SDRAM_RDCC_RSAE_DISABLE));
+
+       /*------------------------------------------------------------------
+        * Program RQDC register
+        * Internal DQS delay mechanism enable
+        *-----------------------------------------------------------------*/
+       mtsdram(SDRAM_RQDC, (SDRAM_RQDC_RQDE_ENABLE|SDRAM_RQDC_RQFD_ENCODE(0x38)));
+
+       /*------------------------------------------------------------------
+        * Program RFDC register
+        * Set Feedback Fractional Oversample
+        * Auto-detect read sample cycle enable
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_RFDC, val);
+       mtsdram(SDRAM_RFDC,
+               (val & ~(SDRAM_RFDC_ARSE_MASK | SDRAM_RFDC_RFOS_MASK |
+                        SDRAM_RFDC_RFFD_MASK))
+               | (SDRAM_RFDC_ARSE_ENABLE | SDRAM_RFDC_RFOS_ENCODE(0) |
+                  SDRAM_RFDC_RFFD_ENCODE(0)));
+
+       DQS_calibration_process();
+#endif
+}
+
+static u32 short_mem_test(void)
+{
+       u32 *membase;
+       u32 bxcr_num;
+       u32 bxcf;
+       int i;
+       int j;
+       u32 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 < MAXBXCF; bxcr_num++) {
+               mfsdram(SDRAM_MB0CF + (bxcr_num << 2), bxcf);
+
+               /* Banks enabled */
+               if ((bxcf & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
+
+                       /* Bank is enabled */
+                       membase = (u32 *)(SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+bxcr_num)));
+
+                       /*------------------------------------------------------------------
+                        * Run the short memory test.
+                        *-----------------------------------------------------------------*/
+                       for (i = 0; i < NUMMEMTESTS; i++) {
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       membase[j] = test[i][j];
+                                       ppcDcbf((u32)&(membase[j]));
+                               }
+                               sync();
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       if (membase[j] != test[i][j]) {
+                                               ppcDcbf((u32)&(membase[j]));
+                                               break;
+                                       }
+                                       ppcDcbf((u32)&(membase[j]));
+                               }
+                               sync();
+                               if (j < NUMMEMWORDS)
+                                       break;
+                       }
+                       if (i < NUMMEMTESTS)
+                               break;
+               }       /* if bank enabled */
+       }               /* for bxcf_num */
+
+       return bxcr_num;
+}
+
+#ifndef HARD_CODED_DQS
+/*-----------------------------------------------------------------------------+
+ * DQS_calibration_process.
+ *-----------------------------------------------------------------------------*/
+static void DQS_calibration_process(void)
+{
+       unsigned long ecc_temp;
+       unsigned long rfdc_reg;
+       unsigned long rffd;
+       unsigned long rqdc_reg;
+       unsigned long rqfd;
+       unsigned long bxcr_num;
+       unsigned long val;
+       long rqfd_average;
+       long rffd_average;
+       long max_start;
+       long min_end;
+       unsigned long begin_rqfd[MAXRANKS];
+       unsigned long begin_rffd[MAXRANKS];
+       unsigned long end_rqfd[MAXRANKS];
+       unsigned long end_rffd[MAXRANKS];
+       char window_found;
+       unsigned long dlycal;
+       unsigned long dly_val;
+       unsigned long max_pass_length;
+       unsigned long current_pass_length;
+       unsigned long current_fail_length;
+       unsigned long current_start;
+       long max_end;
+       unsigned char fail_found;
+       unsigned char pass_found;
+
+       /*------------------------------------------------------------------
+        * Test to determine the best read clock delay tuning bits.
+        *
+        * Before the DDR controller can be used, the read clock delay needs to be
+        * set.  This is SDRAM_RQDC[RQFD] and SDRAM_RFDC[RFFD].
+        * This value cannot be hardcoded into the program because it changes
+        * depending on the board's setup and environment.
+        * To do this, all delay values are tested to see if they
+        * work or not.  By doing this, you get groups of fails with groups of
+        * passing values.  The idea is to find the start and end of a passing
+        * window and take the center of it to use as the read clock delay.
+        *
+        * A failure has to be seen first so that when we hit a pass, we know
+        * that it is truely the start of the window.  If we get passing values
+        * to start off with, we don't know if we are at the start of the window.
+        *
+        * The code assumes that a failure will always be found.
+        * If a failure is not found, there is no easy way to get the middle
+        * of the passing window.  I guess we can pretty much pick any value
+        * but some values will be better than others.  Since the lowest speed
+        * we can clock the DDR interface at is 200 MHz (2x 100 MHz PLB speed),
+        * from experimentation it is safe to say you will always have a failure.
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT1, ecc_temp);
+       ecc_temp &= SDRAM_MCOPT1_MCHK_MASK;
+       mfsdram(SDRAM_MCOPT1, val);
+       mtsdram(SDRAM_MCOPT1, (val & ~SDRAM_MCOPT1_MCHK_MASK) |
+               SDRAM_MCOPT1_MCHK_NON);
+
+       max_start = 0;
+       min_end = 0;
+       begin_rqfd[0] = 0;
+       begin_rffd[0] = 0;
+       begin_rqfd[1] = 0;
+       begin_rffd[1] = 0;
+       end_rqfd[0] = 0;
+       end_rffd[0] = 0;
+       end_rqfd[1] = 0;
+       end_rffd[1] = 0;
+       window_found = FALSE;
+
+       max_pass_length = 0;
+       max_start = 0;
+       max_end = 0;
+       current_pass_length = 0;
+       current_fail_length = 0;
+       current_start = 0;
+       window_found = FALSE;
+       fail_found = FALSE;
+       pass_found = FALSE;
+
+       /* first fix RQDC[RQFD] to an average of 80 degre phase shift to find RFDC[RFFD] */
+       /* rqdc_reg = mfsdram(SDRAM_RQDC) & ~(SDRAM_RQDC_RQFD_MASK); */
+
+       /*
+        * get the delay line calibration register value
+        */
+       mfsdram(SDRAM_DLCR, dlycal);
+       dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
+
+       for (rffd = 0; rffd <= SDRAM_RFDC_RFFD_MAX; rffd++) {
+               mfsdram(SDRAM_RFDC, rfdc_reg);
+               rfdc_reg &= ~(SDRAM_RFDC_RFFD_MASK);
+
+               /*------------------------------------------------------------------
+                * Set the timing reg for the test.
+                *-----------------------------------------------------------------*/
+               mtsdram(SDRAM_RFDC, rfdc_reg | SDRAM_RFDC_RFFD_ENCODE(rffd));
+
+               /* do the small memory test */
+               bxcr_num = short_mem_test();
+
+               /*------------------------------------------------------------------
+                * See if the rffd value passed.
+                *-----------------------------------------------------------------*/
+               if (bxcr_num == MAXBXCF) {
+                       if (fail_found == TRUE) {
+                               pass_found = TRUE;
+                               if (current_pass_length == 0)
+                                       current_start = rffd;
+
+                               current_fail_length = 0;
+                               current_pass_length++;
+
+                               if (current_pass_length > max_pass_length) {
+                                       max_pass_length = current_pass_length;
+                                       max_start = current_start;
+                                       max_end = rffd;
+                               }
+                       }
+               } else {
+                       current_pass_length = 0;
+                       current_fail_length++;
+
+                       if (current_fail_length >= (dly_val >> 2)) {
+                               if (fail_found == FALSE) {
+                                       fail_found = TRUE;
+                               } else if (pass_found == TRUE) {
+                                       window_found = TRUE;
+                                       break;
+                               }
+                       }
+               }
+       }               /* for rffd */
+
+       /*------------------------------------------------------------------
+        * Set the average RFFD value
+        *-----------------------------------------------------------------*/
+       rffd_average = ((max_start + max_end) >> 1);
+
+       if (rffd_average < 0)
+               rffd_average = 0;
+
+       if (rffd_average > SDRAM_RFDC_RFFD_MAX)
+               rffd_average = SDRAM_RFDC_RFFD_MAX;
+       /* now fix RFDC[RFFD] found and find RQDC[RQFD] */
+       mtsdram(SDRAM_RFDC, rfdc_reg | SDRAM_RFDC_RFFD_ENCODE(rffd_average));
+
+       max_pass_length = 0;
+       max_start = 0;
+       max_end = 0;
+       current_pass_length = 0;
+       current_fail_length = 0;
+       current_start = 0;
+       window_found = FALSE;
+       fail_found = FALSE;
+       pass_found = FALSE;
+
+       for (rqfd = 0; rqfd <= SDRAM_RQDC_RQFD_MAX; rqfd++) {
+               mfsdram(SDRAM_RQDC, rqdc_reg);
+               rqdc_reg &= ~(SDRAM_RQDC_RQFD_MASK);
+
+               /*------------------------------------------------------------------
+                * Set the timing reg for the test.
+                *-----------------------------------------------------------------*/
+               mtsdram(SDRAM_RQDC, rqdc_reg | SDRAM_RQDC_RQFD_ENCODE(rqfd));
+
+               /* do the small memory test */
+               bxcr_num = short_mem_test();
+
+               /*------------------------------------------------------------------
+                * See if the rffd value passed.
+                *-----------------------------------------------------------------*/
+               if (bxcr_num == MAXBXCF) {
+                       if (fail_found == TRUE) {
+                               pass_found = TRUE;
+                               if (current_pass_length == 0)
+                                       current_start = rqfd;
+
+                               current_fail_length = 0;
+                               current_pass_length++;
+
+                               if (current_pass_length > max_pass_length) {
+                                       max_pass_length = current_pass_length;
+                                       max_start = current_start;
+                                       max_end = rqfd;
+                               }
+                       }
+               } else {
+                       current_pass_length = 0;
+                       current_fail_length++;
+
+                       if (fail_found == FALSE) {
+                               fail_found = TRUE;
+                       } else if (pass_found == TRUE) {
+                               window_found = TRUE;
+                               break;
+                       }
+               }
+       }
+
+       /*------------------------------------------------------------------
+        * Make sure we found the valid read passing window.  Halt if not
+        *-----------------------------------------------------------------*/
+       if (window_found == FALSE) {
+               printf("ERROR: Cannot determine a common read delay for the "
+                      "DIMM(s) installed.\n");
+               debug("%s[%d] ERROR : \n", __FUNCTION__,__LINE__);
+               hang();
+       }
+
+       rqfd_average = ((max_start + max_end) >> 1);
+
+       if (rqfd_average < 0)
+               rqfd_average = 0;
+
+       if (rqfd_average > SDRAM_RQDC_RQFD_MAX)
+               rqfd_average = SDRAM_RQDC_RQFD_MAX;
+
+       /*------------------------------------------------------------------
+        * Restore the ECC variable to what it originally was
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT1, val);
+       mtsdram(SDRAM_MCOPT1, (val & ~SDRAM_MCOPT1_MCHK_MASK) | ecc_temp);
+
+       mtsdram(SDRAM_RQDC,
+               (rqdc_reg & ~SDRAM_RQDC_RQFD_MASK) |
+               SDRAM_RQDC_RQFD_ENCODE(rqfd_average));
+
+       mfsdram(SDRAM_DLCR, val);
+       debug("%s[%d] DLCR: 0x%08X\n", __FUNCTION__, __LINE__, val);
+       mfsdram(SDRAM_RQDC, val);
+       debug("%s[%d] RQDC: 0x%08X\n", __FUNCTION__, __LINE__, val);
+       mfsdram(SDRAM_RFDC, val);
+       debug("%s[%d] RFDC: 0x%08X\n", __FUNCTION__, __LINE__, val);
+}
+#else /* calibration test with hardvalues */
+/*-----------------------------------------------------------------------------+
+ * DQS_calibration_process.
+ *-----------------------------------------------------------------------------*/
+static void test(void)
+{
+       unsigned long dimm_num;
+       unsigned long ecc_temp;
+       unsigned long i, j;
+       unsigned long *membase;
+       unsigned long bxcf[MAXRANKS];
+       unsigned long val;
+       char window_found;
+       char begin_found[MAXDIMMS];
+       char end_found[MAXDIMMS];
+       char search_end[MAXDIMMS];
+       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} };
+
+       /*------------------------------------------------------------------
+        * Test to determine the best read clock delay tuning bits.
+        *
+        * Before the DDR controller can be used, the read clock delay needs to be
+        * set.  This is SDRAM_RQDC[RQFD] and SDRAM_RFDC[RFFD].
+        * This value cannot be hardcoded into the program because it changes
+        * depending on the board's setup and environment.
+        * To do this, all delay values are tested to see if they
+        * work or not.  By doing this, you get groups of fails with groups of
+        * passing values.  The idea is to find the start and end of a passing
+        * window and take the center of it to use as the read clock delay.
+        *
+        * A failure has to be seen first so that when we hit a pass, we know
+        * that it is truely the start of the window.  If we get passing values
+        * to start off with, we don't know if we are at the start of the window.
+        *
+        * The code assumes that a failure will always be found.
+        * If a failure is not found, there is no easy way to get the middle
+        * of the passing window.  I guess we can pretty much pick any value
+        * but some values will be better than others.  Since the lowest speed
+        * we can clock the DDR interface at is 200 MHz (2x 100 MHz PLB speed),
+        * from experimentation it is safe to say you will always have a failure.
+        *-----------------------------------------------------------------*/
+       mfsdram(SDRAM_MCOPT1, ecc_temp);
+       ecc_temp &= SDRAM_MCOPT1_MCHK_MASK;
+       mfsdram(SDRAM_MCOPT1, val);
+       mtsdram(SDRAM_MCOPT1, (val & ~SDRAM_MCOPT1_MCHK_MASK) |
+               SDRAM_MCOPT1_MCHK_NON);
+
+       window_found = FALSE;
+       begin_found[0] = FALSE;
+       end_found[0] = FALSE;
+       search_end[0] = FALSE;
+       begin_found[1] = FALSE;
+       end_found[1] = FALSE;
+       search_end[1] = FALSE;
+
+       for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
+               mfsdram(SDRAM_MB0CF + (bxcr_num << 2), bxcf[bxcr_num]);
+
+               /* Banks enabled */
+               if ((bxcf[dimm_num] & SDRAM_BXCF_M_BE_MASK) == SDRAM_BXCF_M_BE_ENABLE) {
+
+                       /* Bank is enabled */
+                       membase =
+                               (unsigned long*)(SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+dimm_num)));
+
+                       /*------------------------------------------------------------------
+                        * Run the short memory test.
+                        *-----------------------------------------------------------------*/
+                       for (i = 0; i < NUMMEMTESTS; i++) {
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       membase[j] = test[i][j];
+                                       ppcDcbf((u32)&(membase[j]));
+                               }
+                               sync();
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       if (membase[j] != test[i][j]) {
+                                               ppcDcbf((u32)&(membase[j]));
+                                               break;
+                                       }
+                                       ppcDcbf((u32)&(membase[j]));
+                               }
+                               sync();
+                               if (j < NUMMEMWORDS)
+                                       break;
+                       }
+
+                       /*------------------------------------------------------------------
+                        * See if the rffd value passed.
+                        *-----------------------------------------------------------------*/
+                       if (i < NUMMEMTESTS) {
+                               if ((end_found[dimm_num] == FALSE) &&
+                                   (search_end[dimm_num] == TRUE)) {
+                                       end_found[dimm_num] = TRUE;
+                               }
+                               if ((end_found[0] == TRUE) &&
+                                   (end_found[1] == TRUE))
+                                       break;
+                       } else {
+                               if (begin_found[dimm_num] == FALSE) {
+                                       begin_found[dimm_num] = TRUE;
+                                       search_end[dimm_num] = TRUE;
+                               }
+                       }
+               } else {
+                       begin_found[dimm_num] = TRUE;
+                       end_found[dimm_num] = TRUE;
+               }
+       }
+
+       if ((begin_found[0] == TRUE) && (begin_found[1] == TRUE))
+               window_found = TRUE;
+
+       /*------------------------------------------------------------------
+        * Make sure we found the valid read passing window.  Halt if not
+        *-----------------------------------------------------------------*/
+       if (window_found == FALSE) {
+               printf("ERROR: Cannot determine a common read delay for the "
+                      "DIMM(s) installed.\n");
+               hang();
+       }
+
+       /*------------------------------------------------------------------
+        * Restore the ECC variable to what it originally was
+        *-----------------------------------------------------------------*/
+       mtsdram(SDRAM_MCOPT1,
+               (ppcMfdcr_sdram(SDRAM_MCOPT1) & ~SDRAM_MCOPT1_MCHK_MASK)
+               | ecc_temp);
+}
+#endif
+
+#if defined(DEBUG)
+static void ppc440sp_sdram_register_dump(void)
+{
+       unsigned int sdram_reg;
+       unsigned int sdram_data;
+       unsigned int dcr_data;
+
+       printf("\n  Register Dump:\n");
+       sdram_reg = SDRAM_MCSTAT;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MCSTAT    = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MCOPT1;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MCOPT1    = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MCOPT2;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MCOPT2    = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MODT0;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MODT0     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MODT1;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MODT1     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MODT2;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MODT2     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MODT3;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MODT3     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_CODT;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_CODT      = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_VVPR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_VVPR      = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_OPARS;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_OPARS     = 0x%08X\n", sdram_data);
+       /*
+        * OPAR2 is only used as a trigger register.
+        * No data is contained in this register, and reading or writing
+        * to is can cause bad things to happen (hangs).  Just skip it
+        * and report NA
+        * sdram_reg = SDRAM_OPAR2;
+        * mfsdram(sdram_reg, sdram_data);
+        * printf("        SDRAM_OPAR2     = 0x%08X\n", sdram_data);
+        */
+       printf("        SDRAM_OPART     = N/A       ");
+       sdram_reg = SDRAM_RTR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_RTR       = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MB0CF;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MB0CF     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MB1CF;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MB1CF     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MB2CF;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MB2CF     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MB3CF;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MB3CF     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR0;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR0  = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR1;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR1  = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR2;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR2  = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR3;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR3  = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR4;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR4  = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR5;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR5  = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR6;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR6  = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR7;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR7  = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR8;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR8  = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR9;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR9  = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR10;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR10 = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR11;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR11 = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR12;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR12 = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR13;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR13 = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_INITPLR14;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR14 = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_INITPLR15;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_INITPLR15 = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_RQDC;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_RQDC      = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_RFDC;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_RFDC      = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_RDCC;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_RDCC      = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_DLCR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_DLCR      = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_CLKTR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_CLKTR     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_WRDTR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_WRDTR     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_SDTR1;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_SDTR1     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_SDTR2;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_SDTR2     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_SDTR3;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_SDTR3     = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_MMODE;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MMODE     = 0x%08X\n", sdram_data);
+       sdram_reg = SDRAM_MEMODE;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_MEMODE    = 0x%08X", sdram_data);
+       sdram_reg = SDRAM_ECCCR;
+       mfsdram(sdram_reg, sdram_data);
+       printf("        SDRAM_ECCCR     = 0x%08X\n\n", sdram_data);
+
+       dcr_data = mfdcr(SDRAM_R0BAS);
+       printf("        MQ0_B0BAS       = 0x%08X", dcr_data);
+       dcr_data = mfdcr(SDRAM_R1BAS);
+       printf("        MQ1_B0BAS       = 0x%08X\n", dcr_data);
+       dcr_data = mfdcr(SDRAM_R2BAS);
+       printf("        MQ2_B0BAS       = 0x%08X", dcr_data);
+       dcr_data = mfdcr(SDRAM_R3BAS);
+       printf("        MQ3_B0BAS       = 0x%08X\n", dcr_data);
+}
+#endif
+#endif /* CONFIG_SPD_EEPROM */
index baecf70352aca6bce11be1a2a0d1c292f4859c92..96f0f62eb6094ea149d6b45f0d767859285a1e56 100644 (file)
@@ -31,7 +31,8 @@ COBJS = 405gp_pci.o 4xx_enet.o \
          bedbug_405.o commproc.o \
          cpu.o cpu_init.o i2c.o interrupts.o \
          miiphy.o ndfc.o sdram.o serial.o \
-         spd_sdram.o speed.o traps.o usb_ohci.o usbdev.o \
+         40x_spd_sdram.o 44x_spd_ddr.o 44x_spd_ddr2.o speed.o \
+         tlb.o traps.o usb_ohci.o usbdev.o \
          440spe_pcie.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
index ae245910872e9e6f212683d0fbe200da91ffdf90..82ae4434b0be9a45900d2abc1a9d2305223ce0ce 100644 (file)
@@ -314,7 +314,7 @@ cpu_init_f (void)
 #endif
 
 #if defined (CFG_EBC_CFG)
-       mtebc(epcr, CFG_EBC_CFG);
+       mtebc(EBC0_CFG, CFG_EBC_CFG);
 #endif
 
 #if defined(CONFIG_WATCHDOG)
index 7db1cd8046b3c29d7fd5693faaa35208c0242072..8f4da8621dde85bd2b3f75cac6659407e66ecc27 100644 (file)
-/*****************************************************************************/
-/* I2C Bus interface initialisation and I2C Commands                         */
-/* for PPC405GP                                                                     */
-/* Author : AS HARNOIS                                                       */
-/* Date   : 13.Dec.00                                                        */
-/*****************************************************************************/
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
+ *
+ * based on work by Anne Sophie Harnois <anne-sophie.harnois@nextream.fr>
+ *
+ * (C) Copyright 2001
+ * Bill Hunter,  Wave 7 Optics, williamhunter@mediaone.net
+ *
+ * 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>
-#if defined(CONFIG_440)
-#   include <440_i2c.h>
-#else
-#   include <405gp_i2c.h>
-#endif
+#include <4xx_i2c.h>
 #include <i2c.h>
+#include <asm-ppc/io.h>
 
 #ifdef CONFIG_HARD_I2C
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define IIC_OK         0
-#define IIC_NOK                1
-#define IIC_NOK_LA     2               /* Lost arbitration */
-#define IIC_NOK_ICT    3               /* Incomplete transfer */
-#define IIC_NOK_XFRA   4               /* Transfer aborted */
-#define IIC_NOK_DATA   5               /* No data in buffer */
-#define IIC_NOK_TOUT   6               /* Transfer timeout */
-
-#define IIC_TIMEOUT 1                  /* 1 seconde */
-
+#if defined(CONFIG_I2C_MULTI_BUS)
+/* Initialize the bus pointer to whatever one the SPD EEPROM is on.
+ * Default is bus 0.  This is necessary because the DDR initialization
+ * runs from ROM, and we can't switch buses because we can't modify
+ * the global variables.
+ */
+#ifdef CFG_SPD_BUS_NUM
+static unsigned int i2c_bus_num __attribute__ ((section ("data"))) = CFG_SPD_BUS_NUM;
+#else
+static unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0;
+#endif
+#endif /* CONFIG_I2C_MULTI_BUS */
 
-static void _i2c_bus_reset (void)
+static void _i2c_bus_reset(void)
 {
-       int i, status;
+       int i;
+       u8 dc;
 
        /* Reset status register */
        /* write 1 in SCMP and IRQA to clear these fields */
-       out8 (IIC_STS, 0x0A);
+       out_8((u8 *)IIC_STS, 0x0A);
 
        /* write 1 in IRQP IRQD LA ICT XFRA to clear these fields */
-       out8 (IIC_EXTSTS, 0x8F);
-       __asm__ volatile ("eieio");
-
-       /*
-        * Get current state, reset bus
-        * only if no transfers are pending.
-        */
-       i = 10;
-       do {
-               /* Get status */
-               status = in8 (IIC_STS);
-               udelay (500);                   /* 500us */
-               i--;
-       } while ((status & IIC_STS_PT) && (i > 0));
-       /* Soft reset controller */
-       status = in8 (IIC_XTCNTLSS);
-       out8 (IIC_XTCNTLSS, (status | IIC_XTCNTLSS_SRST));
-       __asm__ volatile ("eieio");
-
-       /* make sure where in initial state, data hi, clock hi */
-       out8 (IIC_DIRECTCNTL, 0xC);
-       for (i = 0; i < 10; i++) {
-               if ((in8 (IIC_DIRECTCNTL) & 0x3) != 0x3) {
-                       /* clock until we get to known state */
-                       out8 (IIC_DIRECTCNTL, 0x8);     /* clock lo */
-                       udelay (100);           /* 100us */
-                       out8 (IIC_DIRECTCNTL, 0xC);     /* clock hi */
-                       udelay (100);           /* 100us */
-               } else {
-                       break;
+       out_8((u8 *)IIC_EXTSTS, 0x8F);
+
+       /* Place chip in the reset state */
+       out_8((u8 *)IIC_XTCNTLSS, IIC_XTCNTLSS_SRST);
+
+       /* Check if bus is free */
+       dc = in_8((u8 *)IIC_DIRECTCNTL);
+       if (!DIRCTNL_FREE(dc)){
+               /* Try to set bus free state */
+               out_8((u8 *)IIC_DIRECTCNTL, IIC_DIRCNTL_SDAC | IIC_DIRCNTL_SCC);
+
+               /* Wait until we regain bus control */
+               for (i = 0; i < 100; ++i) {
+                       dc = in_8((u8 *)IIC_DIRECTCNTL);
+                       if (DIRCTNL_FREE(dc))
+                               break;
+
+                       /* Toggle SCL line */
+                       dc ^= IIC_DIRCNTL_SCC;
+                       out_8((u8 *)IIC_DIRECTCNTL, dc);
+                       udelay(10);
+                       dc ^= IIC_DIRCNTL_SCC;
+                       out_8((u8 *)IIC_DIRECTCNTL, dc);
                }
        }
-       /* send start condition */
-       out8 (IIC_DIRECTCNTL, 0x4);
-       udelay (1000);                          /* 1ms */
-       /* send stop condition */
-       out8 (IIC_DIRECTCNTL, 0xC);
-       udelay (1000);                          /* 1ms */
-       /* Unreset controller */
-       out8 (IIC_XTCNTLSS, (status & ~IIC_XTCNTLSS_SRST));
-       udelay (1000);                          /* 1ms */
+
+       /* Remove reset */
+       out_8((u8 *)IIC_XTCNTLSS, 0);
 }
 
-void i2c_init (int speed, int slaveadd)
+void i2c_init(int speed, int slaveadd)
 {
        sys_info_t sysInfo;
        unsigned long freqOPB;
        int val, divisor;
+       int bus;
 
 #ifdef CFG_I2C_INIT_BOARD
        /* call board specific i2c bus reset routine before accessing the   */
@@ -94,101 +103,100 @@ void i2c_init (int speed, int slaveadd)
        i2c_init_board();
 #endif
 
-       /* Handle possible failed I2C state */
-       /* FIXME: put this into i2c_init_board()? */
-       _i2c_bus_reset ();
+       for (bus = 0; bus < CFG_MAX_I2C_BUS; bus++) {
+               I2C_SET_BUS(bus);
 
-       /* clear lo master address */
-       out8 (IIC_LMADR, 0);
+               /* Handle possible failed I2C state */
+               /* FIXME: put this into i2c_init_board()? */
+               _i2c_bus_reset();
 
-       /* clear hi master address */
-       out8 (IIC_HMADR, 0);
+               /* clear lo master address */
+               out_8((u8 *)IIC_LMADR, 0);
 
-       /* clear lo slave address */
-       out8 (IIC_LSADR, 0);
+               /* clear hi master address */
+               out_8((u8 *)IIC_HMADR, 0);
 
-       /* clear hi slave address */
-       out8 (IIC_HSADR, 0);
+               /* clear lo slave address */
+               out_8((u8 *)IIC_LSADR, 0);
 
-       /* Clock divide Register */
-       /* get OPB frequency */
-       get_sys_info (&sysInfo);
-       freqOPB = sysInfo.freqPLB / sysInfo.pllOpbDiv;
-       /* set divisor according to freqOPB */
-       divisor = (freqOPB - 1) / 10000000;
-       if (divisor == 0)
-               divisor = 1;
-       out8 (IIC_CLKDIV, divisor);
+               /* clear hi slave address */
+               out_8((u8 *)IIC_HSADR, 0);
 
-       /* no interrupts */
-       out8 (IIC_INTRMSK, 0);
+               /* Clock divide Register */
+               /* get OPB frequency */
+               get_sys_info(&sysInfo);
+               freqOPB = sysInfo.freqPLB / sysInfo.pllOpbDiv;
+               /* set divisor according to freqOPB */
+               divisor = (freqOPB - 1) / 10000000;
+               if (divisor == 0)
+                       divisor = 1;
+               out_8((u8 *)IIC_CLKDIV, divisor);
 
-       /* clear transfer count */
-       out8 (IIC_XFRCNT, 0);
+               /* no interrupts */
+               out_8((u8 *)IIC_INTRMSK, 0);
 
-       /* clear extended control & stat */
-       /* write 1 in SRC SRS SWC SWS to clear these fields */
-       out8 (IIC_XTCNTLSS, 0xF0);
+               /* clear transfer count */
+               out_8((u8 *)IIC_XFRCNT, 0);
 
-       /* Mode Control Register
-          Flush Slave/Master data buffer */
-       out8 (IIC_MDCNTL, IIC_MDCNTL_FSDB | IIC_MDCNTL_FMDB);
-       __asm__ volatile ("eieio");
+               /* clear extended control & stat */
+               /* write 1 in SRC SRS SWC SWS to clear these fields */
+               out_8((u8 *)IIC_XTCNTLSS, 0xF0);
 
+               /* Mode Control Register
+                  Flush Slave/Master data buffer */
+               out_8((u8 *)IIC_MDCNTL, IIC_MDCNTL_FSDB | IIC_MDCNTL_FMDB);
 
-       val = in8(IIC_MDCNTL);
-       __asm__ volatile ("eieio");
+               val = in_8((u8 *)IIC_MDCNTL);
 
-       /* Ignore General Call, slave transfers are ignored,
-          disable interrupts, exit unknown bus state, enable hold
-          SCL
-          100kHz normaly or FastMode for 400kHz and above
-       */
+               /* Ignore General Call, slave transfers are ignored,
+                * disable interrupts, exit unknown bus state, enable hold
+                * SCL 100kHz normaly or FastMode for 400kHz and above
+                */
 
-       val |= IIC_MDCNTL_EUBS|IIC_MDCNTL_HSCL;
-       if( speed >= 400000 ){
-               val |= IIC_MDCNTL_FSM;
-       }
-       out8 (IIC_MDCNTL, val);
+               val |= IIC_MDCNTL_EUBS|IIC_MDCNTL_HSCL;
+               if (speed >= 400000)
+                       val |= IIC_MDCNTL_FSM;
+               out_8((u8 *)IIC_MDCNTL, val);
 
-       /* clear control reg */
-       out8 (IIC_CNTL, 0x00);
-       __asm__ volatile ("eieio");
+               /* clear control reg */
+               out_8((u8 *)IIC_CNTL, 0x00);
+       }
 
+       /* set to SPD bus as default bus upon powerup */
+       I2C_SET_BUS(CFG_SPD_BUS_NUM);
 }
 
 /*
-  This code tries to use the features of the 405GP i2c
-  controller. It will transfer up to 4 bytes in one pass
-  on the loop. It only does out8(lbz) to the buffer when it
-  is possible to do out16(lhz) transfers.
-
-  cmd_type is 0 for write 1 for read.
-
-  addr_len can take any value from 0-255, it is only limited
-  by the char, we could make it larger if needed. If it is
-  0 we skip the address write cycle.
-
-  Typical case is a Write of an addr followd by a Read. The
-  IBM FAQ does not cover this. On the last byte of the write
-  we don't set the creg CHT bit, and on the first bytes of the
-  read we set the RPST bit.
-
-  It does not support address only transfers, there must be
-  a data part. If you want to write the address yourself, put
-  it in the data pointer.
-
-  It does not support transfer to/from address 0.
-
-  It does not check XFRCNT.
-*/
-static
-int i2c_transfer(unsigned char cmd_type,
-                unsigned char chip,
-                unsigned char addr[],
-                unsigned char addr_len,
-                unsigned char data[],
-                unsigned short data_len )
+ * This code tries to use the features of the 405GP i2c
+ * controller. It will transfer up to 4 bytes in one pass
+ * on the loop. It only does out_8((u8 *)lbz) to the buffer when it
+ * is possible to do out16(lhz) transfers.
+ *
+ * cmd_type is 0 for write 1 for read.
+ *
+ * addr_len can take any value from 0-255, it is only limited
+ * by the char, we could make it larger if needed. If it is
+ * 0 we skip the address write cycle.
+ *
+ * Typical case is a Write of an addr followd by a Read. The
+ * IBM FAQ does not cover this. On the last byte of the write
+ * we don't set the creg CHT bit, and on the first bytes of the
+ * read we set the RPST bit.
+ *
+ * It does not support address only transfers, there must be
+ * a data part. If you want to write the address yourself, put
+ * it in the data pointer.
+ *
+ * It does not support transfer to/from address 0.
+ *
+ * It does not check XFRCNT.
+ */
+static int i2c_transfer(unsigned char cmd_type,
+                       unsigned char chip,
+                       unsigned char addr[],
+                       unsigned char addr_len,
+                       unsigned char data[],
+                       unsigned short data_len)
 {
        unsigned char* ptr;
        int reading;
@@ -198,97 +206,88 @@ int i2c_transfer(unsigned char cmd_type,
        int i;
        uchar creg;
 
-       if( data == 0 || data_len == 0 ){
-               /*Don't support data transfer of no length or to address 0*/
+       if (data == 0 || data_len == 0) {
+               /* Don't support data transfer of no length or to address 0 */
                printf( "i2c_transfer: bad call\n" );
                return IIC_NOK;
        }
-       if( addr && addr_len ){
+       if (addr && addr_len) {
                ptr = addr;
                cnt = addr_len;
                reading = 0;
-       }else{
+       } else {
                ptr = data;
                cnt = data_len;
                reading = cmd_type;
        }
 
-       /*Clear Stop Complete Bit*/
-       out8(IIC_STS,IIC_STS_SCMP);
+       /* Clear Stop Complete Bit */
+       out_8((u8 *)IIC_STS, IIC_STS_SCMP);
        /* Check init */
-       i=10;
+       i = 10;
        do {
                /* Get status */
-               status = in8(IIC_STS);
-               __asm__ volatile("eieio");
+               status = in_8((u8 *)IIC_STS);
                i--;
-       } while ((status & IIC_STS_PT) && (i>0));
+       } while ((status & IIC_STS_PT) && (i > 0));
 
        if (status & IIC_STS_PT) {
                result = IIC_NOK_TOUT;
                return(result);
        }
-       /*flush the Master/Slave Databuffers*/
-       out8(IIC_MDCNTL, ((in8(IIC_MDCNTL))|IIC_MDCNTL_FMDB|IIC_MDCNTL_FSDB));
-       /*need to wait 4 OPB clocks? code below should take that long*/
+       /* flush the Master/Slave Databuffers */
+       out_8((u8 *)IIC_MDCNTL, ((in_8((u8 *)IIC_MDCNTL))|IIC_MDCNTL_FMDB|IIC_MDCNTL_FSDB));
+       /* need to wait 4 OPB clocks? code below should take that long */
 
        /* 7-bit adressing */
-       out8(IIC_HMADR,0);
-       out8(IIC_LMADR, chip);
-       __asm__ volatile("eieio");
+       out_8((u8 *)IIC_HMADR, 0);
+       out_8((u8 *)IIC_LMADR, chip);
 
        tran = 0;
        result = IIC_OK;
        creg = 0;
 
-       while ( tran != cnt && (result == IIC_OK)) {
+       while (tran != cnt && (result == IIC_OK)) {
                int  bc,j;
 
                /* Control register =
-                  Normal transfer, 7-bits adressing, Transfer up to bc bytes, Normal start,
-                  Transfer is a sequence of transfers
-               */
+                * Normal transfer, 7-bits adressing, Transfer up to bc bytes, Normal start,
+                * Transfer is a sequence of transfers
+                */
                creg |= IIC_CNTL_PT;
 
-               bc = (cnt - tran) > 4 ? 4 :
-                       cnt - tran;
-               creg |= (bc-1)<<4;
-               /* if the real cmd type is write continue trans*/
-               if ( (!cmd_type && (ptr == addr)) || ((tran+bc) != cnt) )
+               bc = (cnt - tran) > 4 ? 4 : cnt - tran;
+               creg |= (bc - 1) << 4;
+               /* if the real cmd type is write continue trans */
+               if ((!cmd_type && (ptr == addr)) || ((tran + bc) != cnt))
                        creg |= IIC_CNTL_CHT;
 
                if (reading)
                        creg |= IIC_CNTL_READ;
-               else {
-                       for(j=0; j<bc; j++) {
+               else
+                       for(j=0; j < bc; j++)
                                /* Set buffer */
-                               out8(IIC_MDBUF,ptr[tran+j]);
-                               __asm__ volatile("eieio");
-                       }
-               }
-               out8(IIC_CNTL, creg );
-               __asm__ volatile("eieio");
+                               out_8((u8 *)IIC_MDBUF, ptr[tran+j]);
+               out_8((u8 *)IIC_CNTL, creg);
 
                /* Transfer is in progress
-                  we have to wait for upto 5 bytes of data
-                  1 byte chip address+r/w bit then bc bytes
-                  of data.
-                  udelay(10) is 1 bit time at 100khz
-                  Doubled for slop. 20 is too small.
-               */
-               i=2*5*8;
+                * we have to wait for upto 5 bytes of data
+                * 1 byte chip address+r/w bit then bc bytes
+                * of data.
+                * udelay(10) is 1 bit time at 100khz
+                * Doubled for slop. 20 is too small.
+                */
+               i = 2*5*8;
                do {
                        /* Get status */
-                       status = in8(IIC_STS);
-                       __asm__ volatile("eieio");
-                       udelay (10);
+                       status = in_8((u8 *)IIC_STS);
+                       udelay(10);
                        i--;
-               } while ((status & IIC_STS_PT) && !(status & IIC_STS_ERR)
-                        && (i>0));
+               } while ((status & IIC_STS_PT) && !(status & IIC_STS_ERR) && (i > 0));
 
                if (status & IIC_STS_ERR) {
                        result = IIC_NOK;
-                       status = in8 (IIC_EXTSTS);
+                       status = in_8((u8 *)IIC_EXTSTS);
                        /* Lost arbitration? */
                        if (status & IIC_EXTSTS_LA)
                                result = IIC_NOK_LA;
@@ -306,34 +305,32 @@ int i2c_transfer(unsigned char cmd_type,
                        /* Are there data in buffer */
                        if (status & IIC_STS_MDBS) {
                                /*
-                                 even if we have data we have to wait 4OPB clocks
-                                 for it to hit the front of the FIFO, after that
-                                 we can just read. We should check XFCNT here and
-                                 if the FIFO is full there is no need to wait.
-                               */
-                               udelay (1);
-                               for(j=0;j<bc;j++) {
-                                       ptr[tran+j] = in8(IIC_MDBUF);
-                                       __asm__ volatile("eieio");
-                               }
+                                * even if we have data we have to wait 4OPB clocks
+                                * for it to hit the front of the FIFO, after that
+                                * we can just read. We should check XFCNT here and
+                                * if the FIFO is full there is no need to wait.
+                                */
+                               udelay(1);
+                               for (j=0; j<bc; j++)
+                                       ptr[tran+j] = in_8((u8 *)IIC_MDBUF);
                        } else
                                result = IIC_NOK_DATA;
                }
                creg = 0;
-               tran+=bc;
-               if( ptr == addr && tran == cnt ) {
+               tran += bc;
+               if (ptr == addr && tran == cnt) {
                        ptr = data;
                        cnt = data_len;
                        tran = 0;
                        reading = cmd_type;
-                       if( reading )
+                       if (reading)
                                creg = IIC_CNTL_RPST;
                }
        }
        return (result);
 }
 
-int i2c_probe (uchar chip)
+int i2c_probe(uchar chip)
 {
        uchar buf[1];
 
@@ -344,21 +341,21 @@ int i2c_probe (uchar chip)
         * address was <ACK>ed (i.e. there was a chip at that address which
         * drove the data line low).
         */
-       return(i2c_transfer (1, chip << 1, 0,0, buf, 1) != 0);
+       return (i2c_transfer(1, chip << 1, 0,0, buf, 1) != 0);
 }
 
 
-int i2c_read (uchar chip, uint addr, int alen, uchar * buffer, int len)
+int i2c_read(uchar chip, uint addr, int alen, uchar * buffer, int len)
 {
        uchar xaddr[4];
        int ret;
 
-       if ( alen > 4 ) {
+       if (alen > 4) {
                printf ("I2C read: addr len %d not supported\n", alen);
                return 1;
        }
 
-       if ( alen > 0 ) {
+       if (alen > 0) {
                xaddr[0] = (addr >> 24) & 0xFF;
                xaddr[1] = (addr >> 16) & 0xFF;
                xaddr[2] = (addr >> 8) & 0xFF;
@@ -378,10 +375,10 @@ int i2c_read (uchar chip, uint addr, int alen, uchar * buffer, int len)
         * still be one byte because the extra address bits are
         * hidden in the chip address.
         */
-       if( alen > 0 )
+       if (alen > 0)
                chip |= ((addr >> (alen * 8)) & CFG_I2C_EEPROM_ADDR_OVERFLOW);
 #endif
-       if( (ret = i2c_transfer( 1, chip<<1, &xaddr[4-alen], alen, buffer, len )) != 0) {
+       if ((ret = i2c_transfer(1, chip<<1, &xaddr[4-alen], alen, buffer, len)) != 0) {
                if (gd->have_console)
                        printf( "I2c read: failed %d\n", ret);
                return 1;
@@ -389,16 +386,17 @@ int i2c_read (uchar chip, uint addr, int alen, uchar * buffer, int len)
        return 0;
 }
 
-int i2c_write (uchar chip, uint addr, int alen, uchar * buffer, int len)
+int i2c_write(uchar chip, uint addr, int alen, uchar * buffer, int len)
 {
        uchar xaddr[4];
 
-       if ( alen > 4 ) {
+       if (alen > 4) {
                printf ("I2C write: addr len %d not supported\n", alen);
                return 1;
 
        }
-       if ( alen > 0 ) {
+
+       if (alen > 0) {
                xaddr[0] = (addr >> 24) & 0xFF;
                xaddr[1] = (addr >> 16) & 0xFF;
                xaddr[2] = (addr >> 8) & 0xFF;
@@ -417,11 +415,11 @@ int i2c_write (uchar chip, uint addr, int alen, uchar * buffer, int len)
         * still be one byte because the extra address bits are
         * hidden in the chip address.
         */
-       if( alen > 0 )
+       if (alen > 0)
                chip |= ((addr >> (alen * 8)) & CFG_I2C_EEPROM_ADDR_OVERFLOW);
 #endif
 
-       return (i2c_transfer( 0, chip<<1, &xaddr[4-alen], alen, buffer, len ) != 0);
+       return (i2c_transfer(0, chip<<1, &xaddr[4-alen], alen, buffer, len ) != 0);
 }
 
 /*-----------------------------------------------------------------------
@@ -433,7 +431,7 @@ uchar i2c_reg_read(uchar i2c_addr, uchar reg)
 
        i2c_read(i2c_addr, reg, 1, &buf, 1);
 
-       return(buf);
+       return (buf);
 }
 
 /*-----------------------------------------------------------------------
@@ -443,4 +441,38 @@ void i2c_reg_write(uchar i2c_addr, uchar reg, uchar val)
 {
        i2c_write(i2c_addr, reg, 1, &val, 1);
 }
+
+#if defined(CONFIG_I2C_MULTI_BUS)
+/*
+ * Functions for multiple I2C bus handling
+ */
+unsigned int i2c_get_bus_num(void)
+{
+       return i2c_bus_num;
+}
+
+int i2c_set_bus_num(unsigned int bus)
+{
+       if (bus >= CFG_MAX_I2C_BUS)
+               return -1;
+
+       i2c_bus_num = bus;
+
+       return 0;
+}
+#endif /* CONFIG_I2C_MULTI_BUS */
+
+/* TODO: add 100/400k switching */
+unsigned int i2c_get_bus_speed(void)
+{
+       return CFG_I2C_SPEED;
+}
+
+int i2c_set_bus_speed(unsigned int speed)
+{
+       if (speed != CFG_I2C_SPEED)
+               return -1;
+
+       return 0;
+}
 #endif /* CONFIG_HARD_I2C */
diff --git a/cpu/ppc4xx/spd_sdram.c b/cpu/ppc4xx/spd_sdram.c
deleted file mode 100644 (file)
index c24456b..0000000
+++ /dev/null
@@ -1,1831 +0,0 @@
-/*
- * (C) Copyright 2001
- * Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
- *
- * Based on code by:
- *
- * Kenneth Johansson ,Ericsson AB.
- * kenneth.johansson@etx.ericsson.se
- *
- * hacked up by bill hunter. fixed so we could run before
- * serial_init and console_init. previous version avoided this by
- * running out of cache memory during serial/console init, then running
- * this code later.
- *
- * (C) Copyright 2002
- * Jun Gu, Artesyn Technology, jung@artesyncp.com
- * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
- *
- * (C) Copyright 2005
- * 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 <asm/processor.h>
-#include <i2c.h>
-#include <ppc4xx.h>
-
-#ifdef CONFIG_SPD_EEPROM
-
-/*
- * Set default values
- */
-#ifndef CFG_I2C_SPEED
-#define CFG_I2C_SPEED  50000
-#endif
-
-#ifndef CFG_I2C_SLAVE
-#define CFG_I2C_SLAVE  0xFE
-#endif
-
-#define ONE_BILLION    1000000000
-
-#ifndef         CONFIG_440             /* for 405 WALNUT/SYCAMORE/BUBINGA boards */
-
-#define         SDRAM0_CFG_DCE         0x80000000
-#define         SDRAM0_CFG_SRE         0x40000000
-#define         SDRAM0_CFG_PME         0x20000000
-#define         SDRAM0_CFG_MEMCHK      0x10000000
-#define         SDRAM0_CFG_REGEN       0x08000000
-#define         SDRAM0_CFG_ECCDD       0x00400000
-#define         SDRAM0_CFG_EMDULR      0x00200000
-#define         SDRAM0_CFG_DRW_SHIFT   (31-6)
-#define         SDRAM0_CFG_BRPF_SHIFT  (31-8)
-
-#define         SDRAM0_TR_CASL_SHIFT   (31-8)
-#define         SDRAM0_TR_PTA_SHIFT    (31-13)
-#define         SDRAM0_TR_CTP_SHIFT    (31-15)
-#define         SDRAM0_TR_LDF_SHIFT    (31-17)
-#define         SDRAM0_TR_RFTA_SHIFT   (31-29)
-#define         SDRAM0_TR_RCD_SHIFT    (31-31)
-
-#define         SDRAM0_RTR_SHIFT       (31-15)
-#define         SDRAM0_ECCCFG_SHIFT    (31-11)
-
-/* SDRAM0_CFG enable macro  */
-#define SDRAM0_CFG_BRPF(x) ( ( x & 0x3)<< SDRAM0_CFG_BRPF_SHIFT )
-
-#define SDRAM0_BXCR_SZ_MASK    0x000e0000
-#define SDRAM0_BXCR_AM_MASK    0x0000e000
-
-#define SDRAM0_BXCR_SZ_SHIFT   (31-14)
-#define SDRAM0_BXCR_AM_SHIFT   (31-18)
-
-#define SDRAM0_BXCR_SZ(x)      ( (( x << SDRAM0_BXCR_SZ_SHIFT) & SDRAM0_BXCR_SZ_MASK) )
-#define SDRAM0_BXCR_AM(x)      ( (( x << SDRAM0_BXCR_AM_SHIFT) & SDRAM0_BXCR_AM_MASK) )
-
-#ifdef CONFIG_SPDDRAM_SILENT
-# define SPD_ERR(x) do { return 0; } while (0)
-#else
-# define SPD_ERR(x) do { printf(x); return(0); } while (0)
-#endif
-
-#define sdram_HZ_to_ns(hertz) (1000000000/(hertz))
-
-/* function prototypes */
-int spd_read(uint addr);
-
-
-/*
- * This function is reading data from the DIMM module EEPROM over the SPD bus
- * and uses that to program the sdram controller.
- *
- * This works on boards that has the same schematics that the AMCC walnut has.
- *
- * Input: null for default I2C spd functions or a pointer to a custom function
- * returning spd_data.
- */
-
-long int spd_sdram(int(read_spd)(uint addr))
-{
-       int tmp,row,col;
-       int total_size,bank_size,bank_code;
-       int ecc_on;
-       int mode;
-       int bank_cnt;
-
-       int sdram0_pmit=0x07c00000;
-#ifndef CONFIG_405EP /* not on PPC405EP */
-       int sdram0_besr0=-1;
-       int sdram0_besr1=-1;
-       int sdram0_eccesr=-1;
-#endif
-       int sdram0_ecccfg;
-
-       int sdram0_rtr=0;
-       int sdram0_tr=0;
-
-       int sdram0_b0cr;
-       int sdram0_b1cr;
-       int sdram0_b2cr;
-       int sdram0_b3cr;
-
-       int sdram0_cfg=0;
-
-       int t_rp;
-       int t_rcd;
-       int t_ras;
-       int t_rc;
-       int min_cas;
-
-       PPC405_SYS_INFO sys_info;
-       unsigned long bus_period_x_10;
-
-       /*
-        * get the board info
-        */
-       get_sys_info(&sys_info);
-       bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
-
-       if (read_spd == 0){
-               read_spd=spd_read;
-               /*
-                * Make sure I2C controller is initialized
-                * before continuing.
-                */
-               i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
-       }
-
-       /* Make shure we are using SDRAM */
-       if (read_spd(2) != 0x04) {
-               SPD_ERR("SDRAM - non SDRAM memory module found\n");
-       }
-
-       /* ------------------------------------------------------------------
-        * configure memory timing register
-        *
-        * data from DIMM:
-        * 27   IN Row Precharge Time ( t RP)
-        * 29   MIN RAS to CAS Delay ( t RCD)
-        * 127   Component and Clock Detail ,clk0-clk3, junction temp, CAS
-        * -------------------------------------------------------------------*/
-
-       /*
-        * first figure out which cas latency mode to use
-        * use the min supported mode
-        */
-
-       tmp = read_spd(127) & 0x6;
-       if (tmp == 0x02) {              /* only cas = 2 supported */
-               min_cas = 2;
-/*             t_ck = read_spd(9); */
-/*             t_ac = read_spd(10); */
-       } else if (tmp == 0x04) {       /* only cas = 3 supported */
-               min_cas = 3;
-/*             t_ck = read_spd(9); */
-/*             t_ac = read_spd(10); */
-       } else if (tmp == 0x06) {       /* 2,3 supported, so use 2 */
-               min_cas = 2;
-/*             t_ck = read_spd(23); */
-/*             t_ac = read_spd(24); */
-       } else {
-               SPD_ERR("SDRAM - unsupported CAS latency \n");
-       }
-
-       /* get some timing values, t_rp,t_rcd,t_ras,t_rc
-        */
-       t_rp = read_spd(27);
-       t_rcd = read_spd(29);
-       t_ras = read_spd(30);
-       t_rc = t_ras + t_rp;
-
-       /* The following timing calcs subtract 1 before deviding.
-        * this has effect of using ceiling instead of floor rounding,
-        * and also subtracting 1 to convert number to reg value
-        */
-       /* set up CASL */
-       sdram0_tr = (min_cas - 1) << SDRAM0_TR_CASL_SHIFT;
-       /* set up PTA */
-       sdram0_tr |= ((((t_rp - 1) * 10)/bus_period_x_10) & 0x3) << SDRAM0_TR_PTA_SHIFT;
-       /* set up CTP */
-       tmp = (((t_rc - t_rcd - t_rp -1) * 10) / bus_period_x_10) & 0x3;
-       if (tmp < 1)
-               tmp = 1;
-       sdram0_tr |= tmp << SDRAM0_TR_CTP_SHIFT;
-       /* set LDF      = 2 cycles, reg value = 1 */
-       sdram0_tr |= 1 << SDRAM0_TR_LDF_SHIFT;
-       /* set RFTA = t_rfc/bus_period, use t_rfc = t_rc */
-       tmp = (((t_rc - 1) * 10) / bus_period_x_10) - 3;
-       if (tmp < 0)
-               tmp = 0;
-       if (tmp > 6)
-               tmp = 6;
-       sdram0_tr |= tmp << SDRAM0_TR_RFTA_SHIFT;
-       /* set RCD = t_rcd/bus_period*/
-       sdram0_tr |= ((((t_rcd - 1) * 10) / bus_period_x_10) &0x3) << SDRAM0_TR_RCD_SHIFT ;
-
-
-       /*------------------------------------------------------------------
-        * configure RTR register
-        * -------------------------------------------------------------------*/
-       row = read_spd(3);
-       col = read_spd(4);
-       tmp = read_spd(12) & 0x7f ; /* refresh type less self refresh bit */
-       switch (tmp) {
-       case 0x00:
-               tmp = 15625;
-               break;
-       case 0x01:
-               tmp = 15625 / 4;
-               break;
-       case 0x02:
-               tmp = 15625 / 2;
-               break;
-       case 0x03:
-               tmp = 15625 * 2;
-               break;
-       case 0x04:
-               tmp = 15625 * 4;
-               break;
-       case 0x05:
-               tmp = 15625 * 8;
-               break;
-       default:
-               SPD_ERR("SDRAM - Bad refresh period \n");
-       }
-       /* convert from nsec to bus cycles */
-       tmp = (tmp * 10) / bus_period_x_10;
-       sdram0_rtr = (tmp & 0x3ff8) <<  SDRAM0_RTR_SHIFT;
-
-       /*------------------------------------------------------------------
-        * determine the number of banks used
-        * -------------------------------------------------------------------*/
-       /* byte 7:6 is module data width */
-       if (read_spd(7) != 0)
-               SPD_ERR("SDRAM - unsupported module width\n");
-       tmp = read_spd(6);
-       if (tmp < 32)
-               SPD_ERR("SDRAM - unsupported module width\n");
-       else if (tmp < 64)
-               bank_cnt = 1;           /* one bank per sdram side */
-       else if (tmp < 73)
-               bank_cnt = 2;   /* need two banks per side */
-       else if (tmp < 161)
-               bank_cnt = 4;   /* need four banks per side */
-       else
-               SPD_ERR("SDRAM - unsupported module width\n");
-
-       /* byte 5 is the module row count (refered to as dimm "sides") */
-       tmp = read_spd(5);
-       if (tmp == 1)
-               ;
-       else if (tmp==2)
-               bank_cnt *= 2;
-       else if (tmp==4)
-               bank_cnt *= 4;
-       else
-               bank_cnt = 8;           /* 8 is an error code */
-
-       if (bank_cnt > 4)       /* we only have 4 banks to work with */
-               SPD_ERR("SDRAM - unsupported module rows for this width\n");
-
-       /* now check for ECC ability of module. We only support ECC
-        *   on 32 bit wide devices with 8 bit ECC.
-        */
-       if ((read_spd(11)==2) && (read_spd(6)==40) && (read_spd(14)==8)) {
-               sdram0_ecccfg = 0xf << SDRAM0_ECCCFG_SHIFT;
-               ecc_on = 1;
-       } else {
-               sdram0_ecccfg = 0;
-               ecc_on = 0;
-       }
-
-       /*------------------------------------------------------------------
-        * calculate total size
-        * -------------------------------------------------------------------*/
-       /* calculate total size and do sanity check */
-       tmp = read_spd(31);
-       total_size = 1 << 22;   /* total_size = 4MB */
-       /* now multiply 4M by the smallest device row density */
-       /* note that we don't support asymetric rows */
-       while (((tmp & 0x0001) == 0) && (tmp != 0)) {
-               total_size = total_size << 1;
-               tmp = tmp >> 1;
-       }
-       total_size *= read_spd(5);      /* mult by module rows (dimm sides) */
-
-       /*------------------------------------------------------------------
-        * map  rows * cols * banks to a mode
-        * -------------------------------------------------------------------*/
-
-       switch (row) {
-       case 11:
-               switch (col) {
-               case 8:
-                       mode=4; /* mode 5 */
-                       break;
-               case 9:
-               case 10:
-                       mode=0; /* mode 1 */
-                       break;
-               default:
-                       SPD_ERR("SDRAM - unsupported mode\n");
-               }
-               break;
-       case 12:
-               switch (col) {
-               case 8:
-                       mode=3; /* mode 4 */
-                       break;
-               case 9:
-               case 10:
-                       mode=1; /* mode 2 */
-                       break;
-               default:
-                       SPD_ERR("SDRAM - unsupported mode\n");
-               }
-               break;
-       case 13:
-               switch (col) {
-               case 8:
-                       mode=5; /* mode 6 */
-                       break;
-               case 9:
-               case 10:
-                       if (read_spd(17) == 2)
-                               mode = 6; /* mode 7 */
-                       else
-                               mode = 2; /* mode 3 */
-                       break;
-               case 11:
-                       mode = 2; /* mode 3 */
-                       break;
-               default:
-                       SPD_ERR("SDRAM - unsupported mode\n");
-               }
-               break;
-       default:
-               SPD_ERR("SDRAM - unsupported mode\n");
-       }
-
-       /*------------------------------------------------------------------
-        * using the calculated values, compute the bank
-        * config register values.
-        * -------------------------------------------------------------------*/
-       sdram0_b1cr = 0;
-       sdram0_b2cr = 0;
-       sdram0_b3cr = 0;
-
-       /* compute the size of each bank */
-       bank_size = total_size / bank_cnt;
-       /* convert bank size to bank size code for ppc4xx
-          by takeing log2(bank_size) - 22 */
-       tmp = bank_size;                /* start with tmp = bank_size */
-       bank_code = 0;                  /* and bank_code = 0 */
-       while (tmp > 1) {               /* this takes log2 of tmp */
-               bank_code++;            /* and stores result in bank_code */
-               tmp = tmp >> 1;
-       }                               /* bank_code is now log2(bank_size) */
-       bank_code -= 22;                /* subtract 22 to get the code */
-
-       tmp = SDRAM0_BXCR_SZ(bank_code) | SDRAM0_BXCR_AM(mode) | 1;
-       sdram0_b0cr = (bank_size * 0) | tmp;
-#ifndef CONFIG_405EP /* not on PPC405EP */
-       if (bank_cnt > 1)
-               sdram0_b2cr = (bank_size * 1) | tmp;
-       if (bank_cnt > 2)
-               sdram0_b1cr = (bank_size * 2) | tmp;
-       if (bank_cnt > 3)
-               sdram0_b3cr = (bank_size * 3) | tmp;
-#else
-       /* PPC405EP chip only supports two SDRAM banks */
-       if (bank_cnt > 1)
-               sdram0_b1cr = (bank_size * 1) | tmp;
-       if (bank_cnt > 2)
-               total_size = 2 * bank_size;
-#endif
-
-       /*
-        *   enable sdram controller DCE=1
-        *  enable burst read prefetch to 32 bytes BRPF=2
-        *  leave other functions off
-        */
-
-       /*------------------------------------------------------------------
-        * now that we've done our calculations, we are ready to
-        * program all the registers.
-        * -------------------------------------------------------------------*/
-
-#define mtsdram0(reg, data)  mtdcr(memcfga,reg);mtdcr(memcfgd,data)
-       /* disable memcontroller so updates work */
-       mtsdram0( mem_mcopt1, 0 );
-
-#ifndef CONFIG_405EP /* not on PPC405EP */
-       mtsdram0( mem_besra , sdram0_besr0 );
-       mtsdram0( mem_besrb , sdram0_besr1 );
-       mtsdram0( mem_ecccf , sdram0_ecccfg );
-       mtsdram0( mem_eccerr, sdram0_eccesr );
-#endif
-       mtsdram0( mem_rtr   , sdram0_rtr );
-       mtsdram0( mem_pmit  , sdram0_pmit );
-       mtsdram0( mem_mb0cf , sdram0_b0cr );
-       mtsdram0( mem_mb1cf , sdram0_b1cr );
-#ifndef CONFIG_405EP /* not on PPC405EP */
-       mtsdram0( mem_mb2cf , sdram0_b2cr );
-       mtsdram0( mem_mb3cf , sdram0_b3cr );
-#endif
-       mtsdram0( mem_sdtr1 , sdram0_tr );
-
-       /* SDRAM have a power on delay,  500 micro should do */
-       udelay(500);
-       sdram0_cfg = SDRAM0_CFG_DCE | SDRAM0_CFG_BRPF(1) | SDRAM0_CFG_ECCDD | SDRAM0_CFG_EMDULR;
-       if (ecc_on)
-               sdram0_cfg |= SDRAM0_CFG_MEMCHK;
-       mtsdram0(mem_mcopt1, sdram0_cfg);
-
-       return (total_size);
-}
-
-int spd_read(uint addr)
-{
-       uchar data[2];
-
-       if (i2c_read(SPD_EEPROM_ADDRESS, addr, 1, data, 1) == 0)
-               return (int)data[0];
-       else
-               return 0;
-}
-
-#else /* CONFIG_440 */
-
-/*-----------------------------------------------------------------------------
-  |  Memory Controller Options 0
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CFG0_DCEN                0x80000000      /* SDRAM Controller Enable      */
-#define SDRAM_CFG0_MCHK_MASK   0x30000000      /* Memory data errchecking mask */
-#define SDRAM_CFG0_MCHK_NON    0x00000000      /* No ECC generation            */
-#define SDRAM_CFG0_MCHK_GEN    0x20000000      /* ECC generation               */
-#define SDRAM_CFG0_MCHK_CHK    0x30000000      /* ECC generation and checking  */
-#define SDRAM_CFG0_RDEN                0x08000000      /* Registered DIMM enable       */
-#define SDRAM_CFG0_PMUD                0x04000000      /* Page management unit         */
-#define SDRAM_CFG0_DMWD_MASK   0x02000000      /* DRAM width mask              */
-#define SDRAM_CFG0_DMWD_32     0x00000000      /* 32 bits                      */
-#define SDRAM_CFG0_DMWD_64     0x02000000      /* 64 bits                      */
-#define SDRAM_CFG0_UIOS_MASK   0x00C00000      /* Unused IO State              */
-#define SDRAM_CFG0_PDP         0x00200000      /* Page deallocation policy     */
-
-/*-----------------------------------------------------------------------------
-  |  Memory Controller Options 1
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CFG1_SRE         0x80000000      /* Self-Refresh Entry           */
-#define SDRAM_CFG1_PMEN                0x40000000      /* Power Management Enable      */
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM DEVPOT Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_DEVOPT_DLL       0x80000000
-#define SDRAM_DEVOPT_DS                0x40000000
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM MCSTS Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_MCSTS_MRSC       0x80000000
-#define SDRAM_MCSTS_SRMS       0x40000000
-#define SDRAM_MCSTS_CIS                0x20000000
-
-/*-----------------------------------------------------------------------------
-  |  SDRAM Refresh Timer Register
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_RTR_RINT_MASK      0xFFFF0000
-#define SDRAM_RTR_RINT_ENCODE(n)  (((n) << 16) & SDRAM_RTR_RINT_MASK)
-#define sdram_HZ_to_ns(hertz)    (1000000000/(hertz))
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM UABus Base Address Reg
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_UABBA_UBBA_MASK  0x0000000F
-
-/*-----------------------------------------------------------------------------+
-  |  Memory Bank 0-7 configuration
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_BXCR_SDBA_MASK   0xff800000        /* Base address             */
-#define SDRAM_BXCR_SDSZ_MASK   0x000e0000        /* Size                     */
-#define SDRAM_BXCR_SDSZ_8      0x00020000        /*   8M                     */
-#define SDRAM_BXCR_SDSZ_16     0x00040000        /*  16M                     */
-#define SDRAM_BXCR_SDSZ_32     0x00060000        /*  32M                     */
-#define SDRAM_BXCR_SDSZ_64     0x00080000        /*  64M                     */
-#define SDRAM_BXCR_SDSZ_128    0x000a0000        /* 128M                     */
-#define SDRAM_BXCR_SDSZ_256    0x000c0000        /* 256M                     */
-#define SDRAM_BXCR_SDSZ_512    0x000e0000        /* 512M                     */
-#define SDRAM_BXCR_SDAM_MASK   0x0000e000        /* Addressing mode          */
-#define SDRAM_BXCR_SDAM_1      0x00000000        /*   Mode 1                 */
-#define SDRAM_BXCR_SDAM_2      0x00002000        /*   Mode 2                 */
-#define SDRAM_BXCR_SDAM_3      0x00004000        /*   Mode 3                 */
-#define SDRAM_BXCR_SDAM_4      0x00006000        /*   Mode 4                 */
-#define SDRAM_BXCR_SDBE                0x00000001        /* Memory Bank Enable       */
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM TR0 Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_TR0_SDWR_MASK    0x80000000
-#define         SDRAM_TR0_SDWR_2_CLK   0x00000000
-#define         SDRAM_TR0_SDWR_3_CLK   0x80000000
-#define SDRAM_TR0_SDWD_MASK    0x40000000
-#define         SDRAM_TR0_SDWD_0_CLK   0x00000000
-#define         SDRAM_TR0_SDWD_1_CLK   0x40000000
-#define SDRAM_TR0_SDCL_MASK    0x01800000
-#define         SDRAM_TR0_SDCL_2_0_CLK 0x00800000
-#define         SDRAM_TR0_SDCL_2_5_CLK 0x01000000
-#define         SDRAM_TR0_SDCL_3_0_CLK 0x01800000
-#define SDRAM_TR0_SDPA_MASK    0x000C0000
-#define         SDRAM_TR0_SDPA_2_CLK   0x00040000
-#define         SDRAM_TR0_SDPA_3_CLK   0x00080000
-#define         SDRAM_TR0_SDPA_4_CLK   0x000C0000
-#define SDRAM_TR0_SDCP_MASK    0x00030000
-#define         SDRAM_TR0_SDCP_2_CLK   0x00000000
-#define         SDRAM_TR0_SDCP_3_CLK   0x00010000
-#define         SDRAM_TR0_SDCP_4_CLK   0x00020000
-#define         SDRAM_TR0_SDCP_5_CLK   0x00030000
-#define SDRAM_TR0_SDLD_MASK    0x0000C000
-#define         SDRAM_TR0_SDLD_1_CLK   0x00000000
-#define         SDRAM_TR0_SDLD_2_CLK   0x00004000
-#define SDRAM_TR0_SDRA_MASK    0x0000001C
-#define         SDRAM_TR0_SDRA_6_CLK   0x00000000
-#define         SDRAM_TR0_SDRA_7_CLK   0x00000004
-#define         SDRAM_TR0_SDRA_8_CLK   0x00000008
-#define         SDRAM_TR0_SDRA_9_CLK   0x0000000C
-#define         SDRAM_TR0_SDRA_10_CLK  0x00000010
-#define         SDRAM_TR0_SDRA_11_CLK  0x00000014
-#define         SDRAM_TR0_SDRA_12_CLK  0x00000018
-#define         SDRAM_TR0_SDRA_13_CLK  0x0000001C
-#define SDRAM_TR0_SDRD_MASK    0x00000003
-#define         SDRAM_TR0_SDRD_2_CLK   0x00000001
-#define         SDRAM_TR0_SDRD_3_CLK   0x00000002
-#define         SDRAM_TR0_SDRD_4_CLK   0x00000003
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM TR1 Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_TR1_RDSS_MASK    0xC0000000
-#define         SDRAM_TR1_RDSS_TR0     0x00000000
-#define         SDRAM_TR1_RDSS_TR1     0x40000000
-#define         SDRAM_TR1_RDSS_TR2     0x80000000
-#define         SDRAM_TR1_RDSS_TR3     0xC0000000
-#define SDRAM_TR1_RDSL_MASK    0x00C00000
-#define         SDRAM_TR1_RDSL_STAGE1  0x00000000
-#define         SDRAM_TR1_RDSL_STAGE2  0x00400000
-#define         SDRAM_TR1_RDSL_STAGE3  0x00800000
-#define SDRAM_TR1_RDCD_MASK    0x00000800
-#define         SDRAM_TR1_RDCD_RCD_0_0 0x00000000
-#define         SDRAM_TR1_RDCD_RCD_1_2 0x00000800
-#define SDRAM_TR1_RDCT_MASK    0x000001FF
-#define         SDRAM_TR1_RDCT_ENCODE(x)  (((x) << 0) & SDRAM_TR1_RDCT_MASK)
-#define         SDRAM_TR1_RDCT_DECODE(x)  (((x) & SDRAM_TR1_RDCT_MASK) >> 0)
-#define         SDRAM_TR1_RDCT_MIN     0x00000000
-#define         SDRAM_TR1_RDCT_MAX     0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM WDDCTR Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_WDDCTR_WRCP_MASK 0xC0000000
-#define         SDRAM_WDDCTR_WRCP_0DEG   0x00000000
-#define         SDRAM_WDDCTR_WRCP_90DEG  0x40000000
-#define         SDRAM_WDDCTR_WRCP_180DEG 0x80000000
-#define SDRAM_WDDCTR_DCD_MASK  0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM CLKTR Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CLKTR_CLKP_MASK  0xC0000000
-#define         SDRAM_CLKTR_CLKP_0DEG    0x00000000
-#define         SDRAM_CLKTR_CLKP_90DEG   0x40000000
-#define         SDRAM_CLKTR_CLKP_180DEG  0x80000000
-#define SDRAM_CLKTR_DCDT_MASK  0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM DLYCAL Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_DLYCAL_DLCV_MASK 0x000003FC
-#define         SDRAM_DLYCAL_DLCV_ENCODE(x) (((x)<<2) & SDRAM_DLYCAL_DLCV_MASK)
-#define         SDRAM_DLYCAL_DLCV_DECODE(x) (((x) & SDRAM_DLYCAL_DLCV_MASK)>>2)
-
-/*-----------------------------------------------------------------------------+
-  |  General Definition
-  +-----------------------------------------------------------------------------*/
-#define DEFAULT_SPD_ADDR1      0x53
-#define DEFAULT_SPD_ADDR2      0x52
-#define MAXBANKS               4               /* at most 4 dimm banks */
-#define MAX_SPD_BYTES          256
-#define NUMHALFCYCLES          4
-#define NUMMEMTESTS            8
-#define NUMMEMWORDS            8
-#define MAXBXCR                        4
-#define TRUE                   1
-#define FALSE                  0
-
-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;
-       unsigned long bank_size_bytes;
-};
-
-typedef struct bank_param BANKPARMS;
-
-#ifdef CFG_SIMULATE_SPD_EEPROM
-extern unsigned char cfg_simulate_spd_eeprom[128];
-#endif
-
-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);
-
-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
- * and uses that to program the sdram controller.
- *
- * This works on boards that has the same schematics that the AMCC walnut has.
- *
- * 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)];
-       unsigned long total_size;
-       unsigned long cfg0;
-       unsigned long mcsts;
-       unsigned long num_dimm_banks;               /* on board dimm banks */
-
-       num_dimm_banks = sizeof(iic0_dimm_addr);
-
-       /*
-        * Make sure I2C controller is initialized
-        * before continuing.
-        */
-       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
-
-       /*
-        * Read the SPD information using I2C interface. Check to see if the
-        * DIMM slots are populated.
-        */
-       get_spd_info(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * Check the memory type for the dimms plugged.
-        */
-       check_mem_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * Check the voltage type for the dimms plugged.
-        */
-       check_volt_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_440SP)
-       /*
-        * Soft-reset SDRAM controller.
-        */
-       mtsdr(sdr_srst, SDR0_SRST_DMC);
-       mtsdr(sdr_srst, 0x00000000);
-#endif
-
-       /*
-        * program 440GP SDRAM controller options (SDRAM0_CFG0)
-        */
-       program_cfg0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * program 440GP SDRAM controller options (SDRAM0_CFG1)
-        */
-       program_cfg1(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * program SDRAM refresh register (SDRAM0_RTR)
-        */
-       program_rtr(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * program SDRAM Timing Register 0 (SDRAM0_TR0)
-        */
-       program_tr0(dimm_populated, iic0_dimm_addr, num_dimm_banks);
-
-       /*
-        * program the BxCR registers to find out total sdram installed
-        */
-       total_size = program_bxcr(dimm_populated, iic0_dimm_addr,
-                                 num_dimm_banks);
-
-       /*
-        * program SDRAM Clock Timing Register (SDRAM0_CLKTR)
-        */
-       mtsdram(mem_clktr, 0x40000000);
-
-       /*
-        * delay to ensure 200 usec has elapsed
-        */
-       udelay(400);
-
-       /*
-        * enable the memory controller
-        */
-       mfsdram(mem_cfg0, cfg0);
-       mtsdram(mem_cfg0, cfg0 | SDRAM_CFG0_DCEN);
-
-       /*
-        * wait for SDRAM_CFG0_DC_EN to complete
-        */
-       while (1) {
-               mfsdram(mem_mcsts, mcsts);
-               if ((mcsts & SDRAM_MCSTS_MRSC) != 0) {
-                       break;
-               }
-       }
-
-       /*
-        * program SDRAM Timing Register 1, adding some delays
-        */
-       program_tr1();
-
-       /*
-        * if ECC is enabled, initialize parity bits
-        */
-
-       return total_size;
-}
-
-unsigned char spd_read(uchar chip, uint addr)
-{
-       unsigned char data[2];
-
-#ifdef CFG_SIMULATE_SPD_EEPROM
-       if (chip == CFG_SIMULATE_SPD_EEPROM) {
-               /*
-                * Onboard spd eeprom requested -> simulate values
-                */
-               return cfg_simulate_spd_eeprom[addr];
-       }
-#endif /* CFG_SIMULATE_SPD_EEPROM */
-
-       if (i2c_probe(chip) == 0) {
-               if (i2c_read(chip, addr, 1, data, 1) == 0) {
-                       return data[0];
-               }
-       }
-
-       return 0;
-}
-
-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;
-       unsigned char num_of_bytes;
-       unsigned char total_size;
-
-       dimm_found = FALSE;
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               num_of_bytes = 0;
-               total_size = 0;
-
-               num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0);
-               total_size = spd_read(iic0_dimm_addr[dimm_num], 1);
-
-               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
-               } else {
-                       dimm_populated[dimm_num] = FALSE;
-#if 0
-                       printf("DIMM slot %lu: Not populated\n", dimm_num);
-#endif
-               }
-       }
-
-       if (dimm_found == FALSE) {
-               printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
-               hang();
-       }
-}
-
-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;
-
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               if (dimm_populated[dimm_num] == TRUE) {
-                       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
-                               break;
-                       default:
-                               printf("ERROR: Unsupported DIMM detected in slot %lu.\n",
-                                      dimm_num);
-                               printf("Only DDR SDRAM DIMMs are supported.\n");
-                               printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
-                               break;
-                       }
-               }
-       }
-}
-
-
-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;
-
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               if (dimm_populated[dimm_num] == TRUE) {
-                       voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8);
-                       if (voltage_type != 0x04) {
-                               printf("ERROR: DIMM %lu with unsupported voltage level.\n",
-                                      dimm_num);
-                               hang();
-                       } else {
-#if 0
-                               printf("DIMM %lu voltage level supported.\n", dimm_num);
-#endif
-                       }
-                       break;
-               }
-       }
-}
-
-void program_cfg0(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
-{
-       unsigned long dimm_num;
-       unsigned long cfg0;
-       unsigned long ecc_enabled;
-       unsigned char ecc;
-       unsigned char attributes;
-       unsigned long data_width;
-       unsigned long dimm_32bit;
-       unsigned long dimm_64bit;
-
-       /*
-        * get Memory Controller Options 0 data
-        */
-       mfsdram(mem_cfg0, cfg0);
-
-       /*
-        * clear bits
-        */
-       cfg0 &= ~(SDRAM_CFG0_DCEN | SDRAM_CFG0_MCHK_MASK |
-                 SDRAM_CFG0_RDEN | SDRAM_CFG0_PMUD |
-                 SDRAM_CFG0_DMWD_MASK |
-                 SDRAM_CFG0_UIOS_MASK | SDRAM_CFG0_PDP);
-
-
-       /*
-        * FIXME: assume the DDR SDRAMs in both banks are the same
-        */
-       ecc_enabled = TRUE;
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               if (dimm_populated[dimm_num] == TRUE) {
-                       ecc = spd_read(iic0_dimm_addr[dimm_num], 11);
-                       if (ecc != 0x02) {
-                               ecc_enabled = FALSE;
-                       }
-
-                       /*
-                        * program Registered DIMM Enable
-                        */
-                       attributes = spd_read(iic0_dimm_addr[dimm_num], 21);
-                       if ((attributes & 0x02) != 0x00) {
-                               cfg0 |= SDRAM_CFG0_RDEN;
-                       }
-
-                       /*
-                        * program DDR SDRAM Data Width
-                        */
-                       data_width =
-                               (unsigned long)spd_read(iic0_dimm_addr[dimm_num],6) +
-                               (((unsigned long)spd_read(iic0_dimm_addr[dimm_num],7)) << 8);
-                       if (data_width == 64 || data_width == 72) {
-                               dimm_64bit = TRUE;
-                               cfg0 |= SDRAM_CFG0_DMWD_64;
-                       } else if (data_width == 32 || data_width == 40) {
-                               dimm_32bit = TRUE;
-                               cfg0 |= SDRAM_CFG0_DMWD_32;
-                       } else {
-                               printf("WARNING: DIMM with datawidth of %lu bits.\n",
-                                      data_width);
-                               printf("Only DIMMs with 32 or 64 bit datawidths supported.\n");
-                               hang();
-                       }
-                       break;
-               }
-       }
-
-       /*
-        * program Memory Data Error Checking
-        */
-       if (ecc_enabled == TRUE) {
-               cfg0 |= SDRAM_CFG0_MCHK_GEN;
-       } else {
-               cfg0 |= SDRAM_CFG0_MCHK_NON;
-       }
-
-       /*
-        * program Page Management Unit (0 == enabled)
-        */
-       cfg0 &= ~SDRAM_CFG0_PMUD;
-
-       /*
-        * program Memory Controller Options 0
-        * Note: DCEN must be enabled after all DDR SDRAM controller
-        * configuration registers get initialized.
-        */
-       mtsdram(mem_cfg0, cfg0);
-}
-
-void program_cfg1(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
-{
-       unsigned long cfg1;
-       mfsdram(mem_cfg1, cfg1);
-
-       /*
-        * Self-refresh exit, disable PM
-        */
-       cfg1 &= ~(SDRAM_CFG1_SRE | SDRAM_CFG1_PMEN);
-
-       /*
-        * program Memory Controller Options 1
-        */
-       mtsdram(mem_cfg1, cfg1);
-}
-
-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;
-       unsigned long refresh_rate = 0;
-       unsigned char refresh_rate_type;
-       unsigned long refresh_interval;
-       unsigned long sdram_rtr;
-       PPC440_SYS_INFO sys_info;
-
-       /*
-        * get the board info
-        */
-       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);
-                       switch (refresh_rate_type) {
-                       case 0x00:
-                               refresh_rate = 15625;
-                               break;
-                       case 0x01:
-                               refresh_rate = 15625/4;
-                               break;
-                       case 0x02:
-                               refresh_rate = 15625/2;
-                               break;
-                       case 0x03:
-                               refresh_rate = 15626*2;
-                               break;
-                       case 0x04:
-                               refresh_rate = 15625*4;
-                               break;
-                       case 0x05:
-                               refresh_rate = 15625*8;
-                               break;
-                       default:
-                               printf("ERROR: DIMM %lu, unsupported refresh rate/type.\n",
-                                      dimm_num);
-                               printf("Replace the DIMM module with a supported DIMM.\n");
-                               break;
-                       }
-
-                       break;
-               }
-       }
-
-       refresh_interval = refresh_rate * 10 / bus_period_x_10;
-       sdram_rtr = (refresh_interval & 0x3ff8) <<  16;
-
-       /*
-        * program Refresh Timer Register (SDRAM0_RTR)
-        */
-       mtsdram(mem_rtr, sdram_rtr);
-}
-
-void program_tr0 (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
-{
-       unsigned long dimm_num;
-       unsigned long tr0;
-       unsigned char wcsbc;
-       unsigned char t_rp_ns;
-       unsigned char t_rcd_ns;
-       unsigned char t_ras_ns;
-       unsigned long t_rp_clk;
-       unsigned long t_ras_rcd_clk;
-       unsigned long t_rcd_clk;
-       unsigned long t_rfc_clk;
-       unsigned long plb_check;
-       unsigned char cas_bit;
-       unsigned long cas_index;
-       unsigned char cas_2_0_available;
-       unsigned char cas_2_5_available;
-       unsigned char cas_3_0_available;
-       unsigned long cycle_time_ns_x_10[3];
-       unsigned long tcyc_3_0_ns_x_10;
-       unsigned long tcyc_2_5_ns_x_10;
-       unsigned long tcyc_2_0_ns_x_10;
-       unsigned long tcyc_reg;
-       unsigned long bus_period_x_10;
-       PPC440_SYS_INFO sys_info;
-       unsigned long residue;
-
-       /*
-        * get the board info
-        */
-       get_sys_info(&sys_info);
-       bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
-
-       /*
-        * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
-        */
-       mfsdram(mem_tr0, tr0);
-       tr0 &= ~(SDRAM_TR0_SDWR_MASK | SDRAM_TR0_SDWD_MASK |
-                SDRAM_TR0_SDCL_MASK | SDRAM_TR0_SDPA_MASK |
-                SDRAM_TR0_SDCP_MASK | SDRAM_TR0_SDLD_MASK |
-                SDRAM_TR0_SDRA_MASK | SDRAM_TR0_SDRD_MASK);
-
-       /*
-        * initialization
-        */
-       wcsbc = 0;
-       t_rp_ns = 0;
-       t_rcd_ns = 0;
-       t_ras_ns = 0;
-       cas_2_0_available = TRUE;
-       cas_2_5_available = TRUE;
-       cas_3_0_available = TRUE;
-       tcyc_2_0_ns_x_10 = 0;
-       tcyc_2_5_ns_x_10 = 0;
-       tcyc_3_0_ns_x_10 = 0;
-
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               if (dimm_populated[dimm_num] == TRUE) {
-                       wcsbc = spd_read(iic0_dimm_addr[dimm_num], 15);
-                       t_rp_ns  = spd_read(iic0_dimm_addr[dimm_num], 27) >> 2;
-                       t_rcd_ns = spd_read(iic0_dimm_addr[dimm_num], 29) >> 2;
-                       t_ras_ns = spd_read(iic0_dimm_addr[dimm_num], 30);
-                       cas_bit = spd_read(iic0_dimm_addr[dimm_num], 18);
-
-                       for (cas_index = 0; cas_index < 3; cas_index++) {
-                               switch (cas_index) {
-                               case 0:
-                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 9);
-                                       break;
-                               case 1:
-                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 23);
-                                       break;
-                               default:
-                                       tcyc_reg = spd_read(iic0_dimm_addr[dimm_num], 25);
-                                       break;
-                               }
-
-                               if ((tcyc_reg & 0x0F) >= 10) {
-                                       printf("ERROR: Tcyc incorrect for DIMM in slot %lu\n",
-                                              dimm_num);
-                                       hang();
-                               }
-
-                               cycle_time_ns_x_10[cas_index] =
-                                       (((tcyc_reg & 0xF0) >> 4) * 10) + (tcyc_reg & 0x0F);
-                       }
-
-                       cas_index = 0;
-
-                       if ((cas_bit & 0x80) != 0) {
-                               cas_index += 3;
-                       } else if ((cas_bit & 0x40) != 0) {
-                               cas_index += 2;
-                       } else if ((cas_bit & 0x20) != 0) {
-                               cas_index += 1;
-                       }
-
-                       if (((cas_bit & 0x10) != 0) && (cas_index < 3)) {
-                               tcyc_3_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
-                               cas_index++;
-                       } else {
-                               if (cas_index != 0) {
-                                       cas_index++;
-                               }
-                               cas_3_0_available = FALSE;
-                       }
-
-                       if (((cas_bit & 0x08) != 0) || (cas_index < 3)) {
-                               tcyc_2_5_ns_x_10 = cycle_time_ns_x_10[cas_index];
-                               cas_index++;
-                       } else {
-                               if (cas_index != 0) {
-                                       cas_index++;
-                               }
-                               cas_2_5_available = FALSE;
-                       }
-
-                       if (((cas_bit & 0x04) != 0) || (cas_index < 3)) {
-                               tcyc_2_0_ns_x_10 = cycle_time_ns_x_10[cas_index];
-                               cas_index++;
-                       } else {
-                               if (cas_index != 0) {
-                                       cas_index++;
-                               }
-                               cas_2_0_available = FALSE;
-                       }
-
-                       break;
-               }
-       }
-
-       /*
-        * Program SD_WR and SD_WCSBC fields
-        */
-       tr0 |= SDRAM_TR0_SDWR_2_CLK;                /* Write Recovery: 2 CLK */
-       switch (wcsbc) {
-       case 0:
-               tr0 |= SDRAM_TR0_SDWD_0_CLK;
-               break;
-       default:
-               tr0 |= SDRAM_TR0_SDWD_1_CLK;
-               break;
-       }
-
-       /*
-        * Program SD_CASL field
-        */
-       if ((cas_2_0_available == TRUE) &&
-           (bus_period_x_10 >= tcyc_2_0_ns_x_10)) {
-               tr0 |= SDRAM_TR0_SDCL_2_0_CLK;
-       } else if ((cas_2_5_available == TRUE) &&
-                (bus_period_x_10 >= tcyc_2_5_ns_x_10)) {
-               tr0 |= SDRAM_TR0_SDCL_2_5_CLK;
-       } else if ((cas_3_0_available == TRUE) &&
-                (bus_period_x_10 >= tcyc_3_0_ns_x_10)) {
-               tr0 |= SDRAM_TR0_SDCL_3_0_CLK;
-       } else {
-               printf("ERROR: No supported CAS latency with the installed DIMMs.\n");
-               printf("Only CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
-               printf("Make sure the PLB speed is within the supported range.\n");
-               hang();
-       }
-
-       /*
-        * Calculate Trp in clock cycles and round up if necessary
-        * Program SD_PTA field
-        */
-       t_rp_clk = sys_info.freqPLB * t_rp_ns / ONE_BILLION;
-       plb_check = ONE_BILLION * t_rp_clk / t_rp_ns;
-       if (sys_info.freqPLB != plb_check) {
-               t_rp_clk++;
-       }
-       switch ((unsigned long)t_rp_clk) {
-       case 0:
-       case 1:
-       case 2:
-               tr0 |= SDRAM_TR0_SDPA_2_CLK;
-               break;
-       case 3:
-               tr0 |= SDRAM_TR0_SDPA_3_CLK;
-               break;
-       default:
-               tr0 |= SDRAM_TR0_SDPA_4_CLK;
-               break;
-       }
-
-       /*
-        * Program SD_CTP field
-        */
-       t_ras_rcd_clk = sys_info.freqPLB * (t_ras_ns - t_rcd_ns) / ONE_BILLION;
-       plb_check = ONE_BILLION * t_ras_rcd_clk / (t_ras_ns - t_rcd_ns);
-       if (sys_info.freqPLB != plb_check) {
-               t_ras_rcd_clk++;
-       }
-       switch (t_ras_rcd_clk) {
-       case 0:
-       case 1:
-       case 2:
-               tr0 |= SDRAM_TR0_SDCP_2_CLK;
-               break;
-       case 3:
-               tr0 |= SDRAM_TR0_SDCP_3_CLK;
-               break;
-       case 4:
-               tr0 |= SDRAM_TR0_SDCP_4_CLK;
-               break;
-       default:
-               tr0 |= SDRAM_TR0_SDCP_5_CLK;
-               break;
-       }
-
-       /*
-        * Program SD_LDF field
-        */
-       tr0 |= SDRAM_TR0_SDLD_2_CLK;
-
-       /*
-        * Program SD_RFTA field
-        * FIXME tRFC hardcoded as 75 nanoseconds
-        */
-       t_rfc_clk = sys_info.freqPLB / (ONE_BILLION / 75);
-       residue = sys_info.freqPLB % (ONE_BILLION / 75);
-       if (residue >= (ONE_BILLION / 150)) {
-               t_rfc_clk++;
-       }
-       switch (t_rfc_clk) {
-       case 0:
-       case 1:
-       case 2:
-       case 3:
-       case 4:
-       case 5:
-       case 6:
-               tr0 |= SDRAM_TR0_SDRA_6_CLK;
-               break;
-       case 7:
-               tr0 |= SDRAM_TR0_SDRA_7_CLK;
-               break;
-       case 8:
-               tr0 |= SDRAM_TR0_SDRA_8_CLK;
-               break;
-       case 9:
-               tr0 |= SDRAM_TR0_SDRA_9_CLK;
-               break;
-       case 10:
-               tr0 |= SDRAM_TR0_SDRA_10_CLK;
-               break;
-       case 11:
-               tr0 |= SDRAM_TR0_SDRA_11_CLK;
-               break;
-       case 12:
-               tr0 |= SDRAM_TR0_SDRA_12_CLK;
-               break;
-       default:
-               tr0 |= SDRAM_TR0_SDRA_13_CLK;
-               break;
-       }
-
-       /*
-        * Program SD_RCD field
-        */
-       t_rcd_clk = sys_info.freqPLB * t_rcd_ns / ONE_BILLION;
-       plb_check = ONE_BILLION * t_rcd_clk / t_rcd_ns;
-       if (sys_info.freqPLB != plb_check) {
-               t_rcd_clk++;
-       }
-       switch (t_rcd_clk) {
-       case 0:
-       case 1:
-       case 2:
-               tr0 |= SDRAM_TR0_SDRD_2_CLK;
-               break;
-       case 3:
-               tr0 |= SDRAM_TR0_SDRD_3_CLK;
-               break;
-       default:
-               tr0 |= SDRAM_TR0_SDRD_4_CLK;
-               break;
-       }
-
-#if 0
-       printf("tr0: %x\n", tr0);
-#endif
-       mtsdram(mem_tr0, tr0);
-}
-
-void program_tr1 (void)
-{
-       unsigned long tr0;
-       unsigned long tr1;
-       unsigned long cfg0;
-       unsigned long ecc_temp;
-       unsigned long dlycal;
-       unsigned long dly_val;
-       unsigned long i, j, k;
-       unsigned long bxcr_num;
-       unsigned long max_pass_length;
-       unsigned long current_pass_length;
-       unsigned long current_fail_length;
-       unsigned long current_start;
-       unsigned long rdclt;
-       unsigned long rdclt_offset;
-       long max_start;
-       long max_end;
-       long rdclt_average;
-       unsigned char window_found;
-       unsigned char fail_found;
-       unsigned char pass_found;
-       unsigned long * membase;
-       PPC440_SYS_INFO sys_info;
-
-       /*
-        * get the board info
-        */
-       get_sys_info(&sys_info);
-
-       /*
-        * get SDRAM Timing Register 0 (SDRAM_TR0) and clear bits
-        */
-       mfsdram(mem_tr1, tr1);
-       tr1 &= ~(SDRAM_TR1_RDSS_MASK | SDRAM_TR1_RDSL_MASK |
-                SDRAM_TR1_RDCD_MASK | SDRAM_TR1_RDCT_MASK);
-
-       mfsdram(mem_tr0, tr0);
-       if (((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) &&
-           (sys_info.freqPLB > 100000000)) {
-               tr1 |= SDRAM_TR1_RDSS_TR2;
-               tr1 |= SDRAM_TR1_RDSL_STAGE3;
-               tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
-       } else {
-               tr1 |= SDRAM_TR1_RDSS_TR1;
-               tr1 |= SDRAM_TR1_RDSL_STAGE2;
-               tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
-       }
-
-       /*
-        * save CFG0 ECC setting to a temporary variable and turn ECC off
-        */
-       mfsdram(mem_cfg0, cfg0);
-       ecc_temp = cfg0 & SDRAM_CFG0_MCHK_MASK;
-       mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | SDRAM_CFG0_MCHK_NON);
-
-       /*
-        * get the delay line calibration register value
-        */
-       mfsdram(mem_dlycal, dlycal);
-       dly_val = SDRAM_DLYCAL_DLCV_DECODE(dlycal) << 2;
-
-       max_pass_length = 0;
-       max_start = 0;
-       max_end = 0;
-       current_pass_length = 0;
-       current_fail_length = 0;
-       current_start = 0;
-       rdclt_offset = 0;
-       window_found = FALSE;
-       fail_found = FALSE;
-       pass_found = FALSE;
-#ifdef DEBUG
-       printf("Starting memory test ");
-#endif
-       for (k = 0; k < NUMHALFCYCLES; k++) {
-               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 (fail_found == TRUE) {
-                                       pass_found = TRUE;
-                                       if (current_pass_length == 0) {
-                                               current_start = rdclt_offset + rdclt;
-                                       }
-
-                                       current_fail_length = 0;
-                                       current_pass_length++;
-
-                                       if (current_pass_length > max_pass_length) {
-                                               max_pass_length = current_pass_length;
-                                               max_start = current_start;
-                                               max_end = rdclt_offset + rdclt;
-                                       }
-                               }
-                       } else {
-                               current_pass_length = 0;
-                               current_fail_length++;
-
-                               if (current_fail_length >= (dly_val>>2)) {
-                                       if (fail_found == FALSE) {
-                                               fail_found = TRUE;
-                                       } else if (pass_found == TRUE) {
-                                               window_found = TRUE;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-#ifdef DEBUG
-               printf(".");
-#endif
-               if (window_found == TRUE) {
-                       break;
-               }
-
-               tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
-               rdclt_offset += dly_val;
-       }
-#ifdef DEBUG
-       printf("\n");
-#endif
-
-       /*
-        * make sure we find the window
-        */
-       if (window_found == FALSE) {
-               printf("ERROR: Cannot determine a common read delay.\n");
-               hang();
-       }
-
-       /*
-        * restore the orignal ECC setting
-        */
-       mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) | ecc_temp);
-
-       /*
-        * set the SDRAM TR1 RDCD value
-        */
-       tr1 &= ~SDRAM_TR1_RDCD_MASK;
-       if ((tr0 & SDRAM_TR0_SDCL_MASK) == SDRAM_TR0_SDCL_2_5_CLK) {
-               tr1 |= SDRAM_TR1_RDCD_RCD_1_2;
-       } else {
-               tr1 |= SDRAM_TR1_RDCD_RCD_0_0;
-       }
-
-       /*
-        * set the SDRAM TR1 RDCLT value
-        */
-       tr1 &= ~SDRAM_TR1_RDCT_MASK;
-       while (max_end >= (dly_val << 1)) {
-               max_end -= (dly_val << 1);
-               max_start -= (dly_val << 1);
-       }
-
-       rdclt_average = ((max_start + max_end) >> 1);
-       if (rdclt_average >= 0x60)
-               while (1)
-                       ;
-
-       if (rdclt_average < 0) {
-               rdclt_average = 0;
-       }
-
-       if (rdclt_average >= dly_val) {
-               rdclt_average -= dly_val;
-               tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
-       }
-       tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
-
-#if 0
-       printf("tr1: %x\n", tr1);
-#endif
-       /*
-        * 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)
-{
-       unsigned long dimm_num;
-       unsigned long bank_base_addr;
-       unsigned long cr;
-       unsigned long i;
-       unsigned long j;
-       unsigned long temp;
-       unsigned char num_row_addr;
-       unsigned char num_col_addr;
-       unsigned char num_banks;
-       unsigned char bank_size_id;
-       unsigned long ctrl_bank_num[MAXBANKS];
-       unsigned long bx_cr_num;
-       unsigned long largest_size_index;
-       unsigned long largest_size;
-       unsigned long current_size_index;
-       BANKPARMS bank_parms[MAXBXCR];
-       unsigned long sorted_bank_num[MAXBXCR]; /* DDR Controller bank number table (sorted by size) */
-       unsigned long sorted_bank_size[MAXBXCR]; /* DDR Controller bank size table (sorted by size)*/
-
-       /*
-        * Set the BxCR regs.  First, wipe out the bank config registers.
-        */
-       for (bx_cr_num = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
-               mtdcr(memcfga, mem_b0cr + (bx_cr_num << 2));
-               mtdcr(memcfgd, 0x00000000);
-               bank_parms[bx_cr_num].bank_size_bytes = 0;
-       }
-
-#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
-        * 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
-        * ctrl_bank_num corresponds to the first usable DDR controller bank number by DIMM
-        */
-       ctrl_bank_num[0] = 0;
-       ctrl_bank_num[1] = 1;
-       ctrl_bank_num[2] = 3;
-#else
-       ctrl_bank_num[0] = 0;
-       ctrl_bank_num[1] = 1;
-       ctrl_bank_num[2] = 2;
-       ctrl_bank_num[3] = 3;
-#endif
-
-       /*
-        * reset the bank_base address
-        */
-       bank_base_addr = CFG_SDRAM_BASE;
-
-       for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
-               if (dimm_populated[dimm_num] == TRUE) {
-                       num_row_addr = spd_read(iic0_dimm_addr[dimm_num], 3);
-                       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);
-
-                       /*
-                        * Set the SDRAM0_BxCR regs
-                        */
-                       cr = 0;
-                       switch (bank_size_id) {
-                       case 0x02:
-                               cr |= SDRAM_BXCR_SDSZ_8;
-                               break;
-                       case 0x04:
-                               cr |= SDRAM_BXCR_SDSZ_16;
-                               break;
-                       case 0x08:
-                               cr |= SDRAM_BXCR_SDSZ_32;
-                               break;
-                       case 0x10:
-                               cr |= SDRAM_BXCR_SDSZ_64;
-                               break;
-                       case 0x20:
-                               cr |= SDRAM_BXCR_SDSZ_128;
-                               break;
-                       case 0x40:
-                               cr |= SDRAM_BXCR_SDSZ_256;
-                               break;
-                       case 0x80:
-                               cr |= SDRAM_BXCR_SDSZ_512;
-                               break;
-                       default:
-                               printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
-                                      dimm_num);
-                               printf("ERROR: Unsupported value for the banksize: %d.\n",
-                                      bank_size_id);
-                               printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
-                       }
-
-                       switch (num_col_addr) {
-                       case 0x08:
-                               cr |= SDRAM_BXCR_SDAM_1;
-                               break;
-                       case 0x09:
-                               cr |= SDRAM_BXCR_SDAM_2;
-                               break;
-                       case 0x0A:
-                               cr |= SDRAM_BXCR_SDAM_3;
-                               break;
-                       case 0x0B:
-                               cr |= SDRAM_BXCR_SDAM_4;
-                               break;
-                       default:
-                               printf("DDR-SDRAM: DIMM %lu BxCR configuration.\n",
-                                      dimm_num);
-                               printf("ERROR: Unsupported value for number of "
-                                      "column addresses: %d.\n", num_col_addr);
-                               printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
-                       }
-
-                       /*
-                        * enable the bank
-                        */
-                       cr |= SDRAM_BXCR_SDBE;
-
-                       for (i = 0; i < num_banks; i++) {
-                               bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
-                                       (4 * 1024 * 1024) * bank_size_id;
-                               bank_parms[ctrl_bank_num[dimm_num]+i].cr = cr;
-                       }
-               }
-       }
-
-       /* Initialize sort tables */
-       for (i = 0; i < MAXBXCR; i++) {
-               sorted_bank_num[i] = i;
-               sorted_bank_size[i] = bank_parms[i].bank_size_bytes;
-       }
-
-       for (i = 0; i < MAXBXCR-1; i++) {
-               largest_size = sorted_bank_size[i];
-               largest_size_index = 255;
-
-               /* Find the largest remaining value */
-               for (j = i + 1; j < MAXBXCR; j++) {
-                       if (sorted_bank_size[j] > largest_size) {
-                               /* Save largest remaining value and its index */
-                               largest_size = sorted_bank_size[j];
-                               largest_size_index = j;
-                       }
-               }
-
-               if (largest_size_index != 255) {
-                       /* Swap the current and largest values */
-                       current_size_index = sorted_bank_num[largest_size_index];
-                       sorted_bank_size[largest_size_index] = sorted_bank_size[i];
-                       sorted_bank_size[i] = largest_size;
-                       sorted_bank_num[largest_size_index] = sorted_bank_num[i];
-                       sorted_bank_num[i] = current_size_index;
-               }
-       }
-
-       /* Set the SDRAM0_BxCR regs thanks to sort tables */
-       for (bx_cr_num = 0, bank_base_addr = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
-               if (bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes) {
-                       mtdcr(memcfga, mem_b0cr + (sorted_bank_num[bx_cr_num] << 2));
-                       temp = mfdcr(memcfgd) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
-                                                 SDRAM_BXCR_SDAM_MASK | SDRAM_BXCR_SDBE);
-                       temp = temp | (bank_base_addr & SDRAM_BXCR_SDBA_MASK) |
-                               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;
-               }
-       }
-
-       return(bank_base_addr);
-}
-
-void program_ecc (unsigned long         num_bytes)
-{
-       unsigned long bank_base_addr;
-       unsigned long current_address;
-       unsigned long end_address;
-       unsigned long address_increment;
-       unsigned long cfg0;
-
-       /*
-        * get Memory Controller Options 0 data
-        */
-       mfsdram(mem_cfg0, cfg0);
-
-       /*
-        * reset the bank_base address
-        */
-       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);
-
-               if ((cfg0 & SDRAM_CFG0_DMWD_MASK) == SDRAM_CFG0_DMWD_32) {
-                       address_increment = 4;
-               } else {
-                       address_increment = 8;
-               }
-
-               current_address = (unsigned long)(bank_base_addr);
-               end_address = (unsigned long)(bank_base_addr) + num_bytes;
-
-               while (current_address < end_address) {
-                       *((unsigned long*)current_address) = 0x00000000;
-                       current_address += address_increment;
-               }
-
-               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) |
-                       SDRAM_CFG0_MCHK_CHK);
-       }
-}
-
-#endif /* CONFIG_440 */
-
-#endif /* CONFIG_SPD_EEPROM */
index 2d16a83420a671051345252b39d4ea8bf1594221..06220c343943d9c2bea6d155458a8fe6661fb04e 100644 (file)
@@ -331,7 +331,7 @@ void get_sys_info (sys_info_t * sysInfo)
        unsigned long m;
        unsigned long prbdv0;
 
-#if defined(CONFIG_440SPE)
+#if defined(CONFIG_YUCCA)
        unsigned long sys_freq;
        unsigned long sys_per=0;
        unsigned long msr;
@@ -348,7 +348,7 @@ void get_sys_info (sys_info_t * sysInfo)
        /*-------------------------------------------------------------------------+
         | Calculate the system clock speed from the period.
         +-------------------------------------------------------------------------*/
-       sys_freq=(ONE_BILLION/sys_per)*1000;
+       sys_freq = (ONE_BILLION / sys_per) * 1000;
 #endif
 
        /* Extract configured divisors */
@@ -385,17 +385,17 @@ void get_sys_info (sys_info_t * sysInfo)
                m = sysInfo->pllExtBusDiv * sysInfo->pllOpbDiv * sysInfo->pllFwdDivB;
 
        /* Now calculate the individual clocks */
-#if defined(CONFIG_440SPE)
+#if defined(CONFIG_YUCCA)
        sysInfo->freqVCOMhz = (m * sys_freq) ;
 #else
-       sysInfo->freqVCOMhz = (m * CONFIG_SYS_CLK_FREQ) + (m>>1);
+       sysInfo->freqVCOMhz = (m * CONFIG_SYS_CLK_FREQ) + (m >> 1);
 #endif
        sysInfo->freqProcessor = sysInfo->freqVCOMhz/sysInfo->pllFwdDivA;
        sysInfo->freqPLB = sysInfo->freqVCOMhz/sysInfo->pllFwdDivB/prbdv0;
        sysInfo->freqOPB = sysInfo->freqPLB/sysInfo->pllOpbDiv;
        sysInfo->freqEPB = sysInfo->freqOPB/sysInfo->pllExtBusDiv;
 
-#if defined(CONFIG_440SPE)
+#if defined(CONFIG_YUCCA)
        /* Determine PCI Clock Period */
        pci_clock_per = determine_pci_clock_per();
        sysInfo->freqPCI = (ONE_BILLION/pci_clock_per) * 1000;
@@ -408,7 +408,7 @@ void get_sys_info (sys_info_t * sysInfo)
 
 #endif
 
-#if defined(CONFIG_440SPE)
+#if defined(CONFIG_YUCCA)
 unsigned long determine_sysper(void)
 {
        unsigned int fpga_clocking_reg;
@@ -583,7 +583,6 @@ unsigned long determine_sysper(void)
        }
 
        return(sys_per);
-
 }
 
 /*-------------------------------------------------------------------------+
index 8e000d309240181e7b61319990f4fcadfd5cf02c..54be37cf68204d97b1d24d3230ac17e0b18a3f71 100644 (file)
@@ -1361,7 +1361,7 @@ ppcSync:
 relocate_code:
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
     defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
-    defined(CONFIG_440SPE)
+    defined(CONFIG_440SP) || defined(CONFIG_440SPE)
        /*
         * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
         * to speed up the boot process. Now this cache needs to be disabled.
@@ -1856,3 +1856,103 @@ pll_wait:
                                     /* execution will continue from the poweron */
                                     /* vector of 0xfffffffc */
 #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.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb3)
+       TLBWE(4,3,2)
+       blr
+       function_epilog(mttlb3)
+
+/*----------------------------------------------------------------------------+
+| mftlb3.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb3)
+       TLBRE(3,3,2)
+       blr
+       function_epilog(mftlb3)
+
+/*----------------------------------------------------------------------------+
+| mttlb2.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb2)
+       TLBWE(4,3,1)
+       blr
+       function_epilog(mttlb2)
+
+/*----------------------------------------------------------------------------+
+| mftlb2.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb2)
+       TLBRE(3,3,1)
+       blr
+       function_epilog(mftlb2)
+
+/*----------------------------------------------------------------------------+
+| mttlb1.
++----------------------------------------------------------------------------*/
+       function_prolog(mttlb1)
+       TLBWE(4,3,0)
+       blr
+       function_epilog(mttlb1)
+
+/*----------------------------------------------------------------------------+
+| mftlb1.
++----------------------------------------------------------------------------*/
+       function_prolog(mftlb1)
+       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 */
diff --git a/cpu/ppc4xx/tlb.c b/cpu/ppc4xx/tlb.c
new file mode 100644 (file)
index 0000000..50344a4
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ * (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>
+
+#if defined(CONFIG_440)
+
+#include <ppc4xx.h>
+#include <ppc440.h>
+#include <asm/io.h>
+#include <asm/mmu.h>
+
+typedef struct region {
+       unsigned long base;
+       unsigned long size;
+       unsigned long tlb_word2_i_value;
+} region_t;
+
+static int add_tlb_entry(unsigned long base_addr,
+                        unsigned long tlb_word0_size_value,
+                        unsigned long tlb_word2_i_value)
+{
+       int i;
+       unsigned long tlb_word0_value;
+       unsigned long tlb_word1_value;
+       unsigned long tlb_word2_value;
+
+       /* First, find the index of a TLB entry not being used */
+       for (i=0; i<PPC4XX_TLB_SIZE; i++) {
+               tlb_word0_value = mftlb1(i);
+               if ((tlb_word0_value & TLB_WORD0_V_MASK) == TLB_WORD0_V_DISABLE)
+                       break;
+       }
+       if (i >= PPC4XX_TLB_SIZE)
+               return -1;
+
+       /* Second, create the TLB entry */
+       tlb_word0_value = TLB_WORD0_EPN_ENCODE(base_addr) | TLB_WORD0_V_ENABLE |
+               TLB_WORD0_TS_0 | tlb_word0_size_value;
+       tlb_word1_value = TLB_WORD1_RPN_ENCODE(base_addr) | TLB_WORD1_ERPN_ENCODE(0);
+       tlb_word2_value = TLB_WORD2_U0_DISABLE | TLB_WORD2_U1_DISABLE |
+               TLB_WORD2_U2_DISABLE | TLB_WORD2_U3_DISABLE |
+               TLB_WORD2_W_DISABLE | tlb_word2_i_value |
+               TLB_WORD2_M_DISABLE | TLB_WORD2_G_DISABLE |
+               TLB_WORD2_E_DISABLE | TLB_WORD2_UX_ENABLE |
+               TLB_WORD2_UW_ENABLE | TLB_WORD2_UR_ENABLE |
+               TLB_WORD2_SX_ENABLE | TLB_WORD2_SW_ENABLE |
+               TLB_WORD2_SR_ENABLE;
+
+       /* Wait for all memory accesses to complete */
+       sync();
+
+       /* Third, add the TLB entries */
+       mttlb1(i, tlb_word0_value);
+       mttlb2(i, tlb_word1_value);
+       mttlb3(i, tlb_word2_value);
+
+       /* Execute an ISYNC instruction so that the new TLB entry takes effect */
+       asm("isync");
+
+       return 0;
+}
+
+static void program_tlb_addr(unsigned long base_addr, unsigned long mem_size,
+                            unsigned long tlb_word2_i_value)
+{
+       int rc;
+       int tlb_i;
+
+       tlb_i = tlb_word2_i_value;
+       while (mem_size != 0) {
+               rc = 0;
+               /* Add the TLB entries in to map the region. */
+               if (((base_addr & TLB_256MB_ALIGN_MASK) == base_addr) &&
+                   (mem_size >= TLB_256MB_SIZE)) {
+                       /* Add a 256MB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_256MB, tlb_i)) == 0) {
+                               mem_size -= TLB_256MB_SIZE;
+                               base_addr += TLB_256MB_SIZE;
+                       }
+               } else if (((base_addr & TLB_16MB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_16MB_SIZE)) {
+                       /* Add a 16MB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_16MB, tlb_i)) == 0) {
+                               mem_size -= TLB_16MB_SIZE;
+                               base_addr += TLB_16MB_SIZE;
+                       }
+               } else if (((base_addr & TLB_1MB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_1MB_SIZE)) {
+                       /* Add a 1MB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_1MB, tlb_i)) == 0) {
+                               mem_size -= TLB_1MB_SIZE;
+                               base_addr += TLB_1MB_SIZE;
+                       }
+               } else if (((base_addr & TLB_256KB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_256KB_SIZE)) {
+                       /* Add a 256KB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_256KB, tlb_i)) == 0) {
+                               mem_size -= TLB_256KB_SIZE;
+                               base_addr += TLB_256KB_SIZE;
+                       }
+               } else if (((base_addr & TLB_64KB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_64KB_SIZE)) {
+                       /* Add a 64KB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_64KB, tlb_i)) == 0) {
+                               mem_size -= TLB_64KB_SIZE;
+                               base_addr += TLB_64KB_SIZE;
+                       }
+               } else if (((base_addr & TLB_16KB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_16KB_SIZE)) {
+                       /* Add a 16KB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_16KB, tlb_i)) == 0) {
+                               mem_size -= TLB_16KB_SIZE;
+                               base_addr += TLB_16KB_SIZE;
+                       }
+               } else if (((base_addr & TLB_4KB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_4KB_SIZE)) {
+                       /* Add a 4KB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_4KB, tlb_i)) == 0) {
+                               mem_size -= TLB_4KB_SIZE;
+                               base_addr += TLB_4KB_SIZE;
+                       }
+               } else if (((base_addr & TLB_1KB_ALIGN_MASK) == base_addr) &&
+                          (mem_size >= TLB_1KB_SIZE)) {
+                       /* Add a 1KB TLB entry */
+                       if ((rc = add_tlb_entry(base_addr, TLB_WORD0_SIZE_1KB, tlb_i)) == 0) {
+                               mem_size -= TLB_1KB_SIZE;
+                               base_addr += TLB_1KB_SIZE;
+                       }
+               } else {
+                       printf("ERROR: no TLB size exists for the base address 0x%0X.\n",
+                               base_addr);
+               }
+
+               if (rc != 0)
+                       printf("ERROR: no TLB entries available for the base addr 0x%0X.\n",
+                               base_addr);
+       }
+
+       return;
+}
+
+/*
+ * Program one (or multiple) TLB entries for one memory region
+ *
+ * Common usage for boards with SDRAM DIMM modules to dynamically
+ * configure the TLB's for the SDRAM
+ */
+void program_tlb(u32 start, u32 size, u32 tlb_word2_i_value)
+{
+       region_t region_array;
+
+       region_array.base = start;
+       region_array.size = size;
+       region_array.tlb_word2_i_value = tlb_word2_i_value;     /* en-/disable cache */
+
+       /* Call the routine to add in the tlb entries for the memory regions */
+       program_tlb_addr(region_array.base, region_array.size,
+                        region_array.tlb_word2_i_value);
+
+       return;
+}
+
+#endif /* CONFIG_440 */
index f7020eec951398fadc349d4e40df67c93ee19d3d..0fbaa162fa05cae7c1853557f0ab9ff1e6294eed 100644 (file)
@@ -37,7 +37,7 @@ static block_dev_desc_t mmc_dev;
 
 block_dev_desc_t * mmc_get_dev(int dev)
 {
-       return ((block_dev_desc_t *)&mmc_dev);
+       return (dev == 0) ? &mmc_dev : NULL;
 }
 
 /*
@@ -363,7 +363,7 @@ mmc_write(uchar *src, ulong dst, int size)
 
 ulong
 /****************************************************/
-mmc_bread(int dev_num, ulong blknr, ulong blkcnt, ulong *dst)
+mmc_bread(int dev_num, ulong blknr, ulong blkcnt, void *dst)
 /****************************************************/
 {
        int mmc_block_size = MMC_BLOCK_SIZE;
index 2255e726cf5c687994e7e7d7c138413bc2acd374..9e8bd4fb8899c50a288695a8fb9a051f8bc38743 100644 (file)
@@ -24,6 +24,7 @@
 #include <common.h>
 #include <command.h>
 #include <ide.h>
+#include <part.h>
 
 #undef PART_DEBUG
 
 #define PRINTF(fmt,args...)
 #endif
 
+#if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
+     (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
+     (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+     defined(CONFIG_MMC) || \
+     defined(CONFIG_SYSTEMACE) )
+
+struct block_drvr {
+       char *name;
+       block_dev_desc_t* (*get_dev)(int dev);
+};
+
+static const struct block_drvr block_drvr[] = {
+#if (CONFIG_COMMANDS & CFG_CMD_IDE)
+       { .name = "ide", .get_dev = ide_get_dev, },
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_SCSI)
+       { .name = "scsi", .get_dev = scsi_get_dev, },
+#endif
+#if ((CONFIG_COMMANDS & CFG_CMD_USB) && defined(CONFIG_USB_STORAGE))
+       { .name = "usb", .get_dev = usb_stor_get_dev, },
+#endif
+#if defined(CONFIG_MMC)
+       { .name = "mmc", .get_dev = mmc_get_dev, },
+#endif
+#if defined(CONFIG_SYSTEMACE)
+       { .name = "ace", .get_dev = systemace_get_dev, },
+#endif
+       { },
+};
+
+DECLARE_GLOBAL_DATA_PTR;
+
+block_dev_desc_t *get_dev(char* ifname, int dev)
+{
+       const struct block_drvr *drvr = block_drvr;
+       block_dev_desc_t* (*reloc_get_dev)(int dev);
+
+       while (drvr->name) {
+               reloc_get_dev = drvr->get_dev + gd->reloc_off;
+               if (strncmp(ifname, drvr->name, strlen(drvr->name)) == 0)
+                       return reloc_get_dev(dev);
+               drvr++;
+       }
+       return NULL;
+}
+#else
+block_dev_desc_t *get_dev(char* ifname, int dev)
+{
+       return NULL;
+}
+#endif
+
 #if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
      (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
      (CONFIG_COMMANDS & CFG_CMD_USB)   || \
diff --git a/doc/README.mpc832xemds b/doc/README.mpc832xemds
new file mode 100644 (file)
index 0000000..b63cc79
--- /dev/null
@@ -0,0 +1,128 @@
+Freescale MPC832XEMDS Board
+-----------------------------------------
+1. Board Switches and Jumpers
+1.0 There are five Dual-In-Line Packages(DIP) Switches on MPC832XE SYS board
+       For some reason, the HW designers describe the switch settings
+       in terms of 0 and 1, and then map that to physical switches where
+       the label "On" refers to logic 0 and "Off" is logic 1.
+
+       Switch bits are numbered 1 through, like, 4 6 8 or 10, but the
+       bits may contribute to signals that are numbered based at 0,
+       and some of those signals may be high-bit-number-0 too.  Heed
+       well the names and labels and do not get confused.
+
+               "Off" == 1
+               "On"  == 0
+
+       SW3 is switch 18 as silk-screened onto the board.
+       SW4[8] is the bit labled 8 on Switch 4.
+       SW5[1:6] refers to bits labeled 1 through 6 in order on switch 5.
+       SW6[7:1] refers to bits labeled 7 through 1 in order on switch 6.
+       SW7[1:8]= 0000_0001 refers to bits labeled 1 through 6 is set as "On"
+               and bits labeled 8 is set as "Off".
+
+1.1 For the MPC832XEMDS PROTO Board
+
+       First, make sure the board default setting is consistent with the document
+                shipped with your board. Then apply the following setting:
+       SW3[1-8]= 0000_1000  (core PLL setting, core enable)
+       SW4[1-8]= 0001_0010  (Flash boot on local bus, system PLL setting)
+       SW5[1-8]= 0010_0110  (Boot from high end)
+       SW6[1-8]= 0011_0100  (Flash boot on 16 bit local bus)
+       SW7[1-8]= 1000_0011  (QE PLL setting)
+
+       ENET3/4 MII mode settings:
+       J1 1-2 (ETH3_TXER)
+       J2 2-3 (MII mode)
+       J3 2-3 (MII mode)
+       J4 2-3 (ADSL clockOscillator)
+       J5 1-2 (ETH4_TXER)
+       J6 2-3 (ClockOscillator)
+       JP1 removed (don't force PORESET)
+       JP2 mounted (ETH4/2 MII)
+       JP3 mounted (ETH3 MII)
+       JP4 mounted (HRCW from BCSR)
+
+       ENET3/4 RMII mode settings:
+       J1 1-2 (ETH3_TXER)
+       J2 1-2 (RMII mode)
+       J3 1-2 (RMII mode)
+       J4 2-3 (ADSL clockOscillator)
+       J5 1-2 (ETH4_TXER)
+       J6 2-3 (ClockOscillator)
+       JP1 removed (don't force PORESET)
+       JP2 removed (ETH4/2 RMII)
+       JP3 removed (ETH3 RMII)
+       JP4 removed (HRCW from FLASH)
+
+       on board Oscillator: 66M
+
+
+2. Memory Map
+
+2.1 The memory map should look pretty much like this:
+
+       0x0000_0000     0x7fff_ffff     DDR                     2G
+       0x8000_0000     0x8fff_ffff     PCI MEM prefetch        256M
+       0x9000_0000     0x9fff_ffff     PCI MEM non-prefetch    256M
+       0xc000_0000     0xdfff_ffff     Empty                   512M
+       0xe000_0000     0xe01f_ffff     Int Mem Reg Space       2M
+       0xe020_0000     0xe02f_ffff     Empty                   1M
+       0xe030_0000     0xe03f_ffff     PCI IO                  1M
+       0xe040_0000     0xefff_ffff     Empty                   252M
+       0xf400_0000     0xf7ff_ffff     Empty                   64M
+       0xf800_0000     0xf800_7fff     BCSR on CS1             32K
+       0xf800_8000     0xf800_ffff     PIB CS2                 32K
+       0xf801_0000     0xf801_7fff     PIB CS3                 32K
+       0xfe00_0000     0xfeff_ffff     FLASH on CS0            16M
+
+
+3. Definitions
+
+3.1 Explanation of NEW definitions in:
+
+       include/configs/MPC832XEPB.h
+
+    CONFIG_MPC83XX     MPC83XX family for MPC8349, MPC8360 and MPC832X
+    CONFIG_MPC832X     MPC832X specific
+    CONFIG_MPC832XEMDS MPC832XEMDS board specific
+
+4. Compilation
+
+       Assuming you're using BASH shell:
+
+               export CROSS_COMPILE=your-cross-compile-prefix
+               cd u-boot
+               make distclean
+               make MPC832XEMDS_config
+               make
+
+       MPC832X support PCI 33MHz and PCI 66MHz, to make u-boot support PCI:
+
+               1)Make sure the DIP SW support PCI mode as described in Section 1.1.
+
+               2)To Make U-Boot image support PCI 33MHz, use
+                       Make MPC832XEMDS_HOST_33_config
+
+               3)To Make U-Boot image support PCI 66MHz, use
+                       Make MPC832XEMDS_HOST_66M_config
+
+5. Downloading and Flashing Images
+
+5.0 Download over network:
+
+       tftp 10000 u-boot.bin
+
+5.1 Reflash U-boot Image using U-boot
+
+       tftp 20000 u-boot.bin
+       protect off fe000000 fe0fffff
+       erase fe000000 fe0fffff
+       cp.b 20000 fe000000 xxxx
+
+You have to supply the correct byte count with 'xxxx' from the TFTP result log.
+Maybe 3ffff will work too, that corresponds to the erased sectors.
+
+
+6. Notes
+       1) The console baudrate for MPC832XEMDS is 115200bps.
diff --git a/doc/README.mpc8349itx b/doc/README.mpc8349itx
new file mode 100644 (file)
index 0000000..4ae03ae
--- /dev/null
@@ -0,0 +1,187 @@
+Freescale MPC8349E-mITX and MPC8349E-mITX-GP Boards
+---------------------------------------------------
+
+1.     Board Description
+
+       The MPC8349E-mITX and MPC8349E-mITX-GP are reference boards featuring
+       the Freescale MPC8349E processor in a Mini-ITX form factor.
+
+       The MPC8349E-mITX-GP is an MPC8349E-mITX with the following differences:
+
+       A) One 8MB on-board flash EEPROM chip, instead of two.
+       B) No SATA controller
+       C) No Compact Flash slot
+       D) No Mini-PCI slot
+       E) No Vitesse 7385 5-port Ethernet switch
+       F) No 4-port USB Type-A interface
+
+2.     Board Switches and Jumpers
+
+2.0    Descriptions for all of the board jumpers can be found in the User
+       Guide.  Of particular interest to U-Boot developers is jumper J22:
+
+       Pos.    Name            Default         Description
+       -----------------------------------------------------------------------
+       A       LGPL0           ON (0)          HRCW source, bit 0
+       B       LGPL1           ON (0)          HRCW source, bit 1
+       C       LGPL3           ON (0)          HRCW source, bit 2
+       D       LGPL5           OFF (1)         PCI_SYNC_OUT frequency
+       E       BOOT1           ON (0)          Flash EEPROM boot device
+       F       PCI_M66EN       ON (0)          PCI 66MHz enable
+       G       I2C-WP          ON (0)          I2C EEPROM write protection
+       H       F_WP            OFF (1)         Flash EEPROM write protection
+
+       Jumper J22.E is only for the ITX, and it decides the configuration
+       of the flash chips.  If J22.E is ON (i.e. jumpered), then flash chip
+       U4 is located at address FE000000 and flash chip U7 is at FE800000.
+       If J22.E is OFF, then U7 is at FE000000 and U4 is at FE800000.
+
+       For U-Boot development, J22.E can be used to switch back-and-forth
+       between two U-Boot images.
+
+3.     Memory Map
+
+3.1.   The memory map should look pretty much like this:
+
+       0x0000_0000 - 0x0FFF_FFFF DDR SDRAM (256 MB)
+       0x8000_0000 - 0x9FFF_FFFF PCI1 memory space (512 MB)
+       0xA000_0000 - 0xBFFF_FFFF PCI2 memory space (512 MB)
+       0xE000_0000 - 0xEFFF_FFFF IMMR (1 MB)
+       0xE200_0000 - 0xE2FF_FFFF PCI1 I/O space (16 MB)
+       0xE300_0000 - 0xE3FF_FFFF PCI2 I/O space (16 MB)
+       0xF000_0000 - 0xF000_FFFF Compact Flash (ITX only)
+       0xF001_0000 - 0xF001_FFFF Local bus expansion slot
+       0xF800_0000 - 0xF801_FFFF Vitesse 7385 Parallel Interface (ITX only)
+       0xFE00_0000 - 0xFE7F_FFFF First 8MB bank of Flash memory
+       0xFE80_0000 - 0xFEFF_FFFF Second 8MB bank of Flash memory (ITX only)
+
+3.2    Flash EEPROM layout.
+
+       On the ITX, jumper J22.E is used to determine which flash chips are
+       at which address.  When J22.E is switched, addresses from FE000000
+       to FE7FFFFF are swapped with addresses from FE800000 to FEFFFFFF.
+
+       On the ITX, at the normal boot address (aka HIGHBOOT):
+
+       FE00_0000       HRCW
+       FE70_0000       Alternative U-Boot image
+       FE80_0000       Alternative HRCW
+       FEF0_0000       U-Boot image
+       FEFF_FFFF       End of flash
+
+       On the ITX, at the low boot address (LOWBOOT)
+
+       FE00_0000       HRCW and U-Boot image
+       FE04_0000       U-Boot environment variables
+       FE80_0000       Alternative HRCW and U-Boot image
+       FEFF_FFFF       End of flash
+
+       On the ITX-GP, the only option is LOWBOOT and there is only one chip
+
+       FE00_0000       HRCW and U-Boot image
+       FE04_0000       U-Boot environment variables
+       F7FF_FFFF       End of flash
+
+4. Definitions
+
+4.1 Explanation of NEW definitions in:
+
+       include/configs/MPC8349ITX.h
+
+       CONFIG_MPC83XX          MPC83xx family
+       CONFIG_MPC8349          MPC8349 specific
+       CONFIG_MPC8349ITX               MPC8349E-mITX
+       CONFIG_MPC8349ITXGP             MPC8349E-mITX-GP
+
+5. Compilation
+
+       Assuming you're using BASH shell:
+
+               export CROSS_COMPILE=your-cross-compile-prefix
+               cd u-boot
+               make distclean
+
+               make MPC8349ITX_config
+       or:
+               make MPC8349ITXGP_config
+       or:
+               make MPC8349ITX_LOWBOOT_config
+
+               make
+
+6. Downloading and Flashing Images
+
+6.1 Download via tftp:
+
+       tftp $loadaddr <uboot>
+
+       where "<uboot>" is the path and filename, on the TFTP server, of
+       the U-Boot image.
+
+6.1 Reflash U-Boot Image using U-Boot
+
+       setenv uboot <uboot>
+       run tftpflash
+
+       where "<uboot>" is the path and filename, on the TFTP server, of
+       the U-Boot image.
+
+6.2 Using the HRCW to switch between two different U-Boot images on the ITX
+
+       Because the ITX has 16MB of flash, it is possible to keep two U-Boot
+       images in flash, and use the HRCW to specify which one is to be used
+       when the board boots.  This trick is especially effective with a
+       hardware debugger that can override the HRCW, such as the BDI-2000.
+
+       When the BMS bit in the HRCW is 0, the ITX will boot the U-Boot image
+       at address FE000000.  When the BMS bit is 1, the ITX will boot the
+       image at address FEF00000.
+
+       Therefore, just put a U-Boot image at both FE000000 and FEF00000 and
+       change the BMS bit whenever you want to boot the other image.
+
+       Step-by-step instructions:
+
+       1) Build an ITX image to be loaded at FEF00000
+
+               make distclean
+               make MPC8349ITX_config
+               make
+
+       2) Take the u-boot.bin image and flash it at FEF00000.
+
+               tftp $loadaddr u-boot.bin
+               protect off all
+               erase FEF00000 +$filesize
+               cp.b $loadaddr FEF00000 $filesize
+
+       3) Build an ITX image to be loaded at FE000000
+
+               make distclean
+               make MPC8349ITX_LOWBOOT_config
+               make
+
+       4) Take the u-boot.bin image and flash it at FE000000.
+
+               tftp $loadaddr u-boot.bin
+               protect off FE000000 +$filesize
+               erase FE000000 +$filesize
+               cp.b $loadaddr FE000000 $filesize
+
+       The HRCW in flash is currently set to boot the image at FE000000.
+
+       If you have a hardware debugger, configure it to set the HRCW to
+       B460A000 04040000 if you want to boot the image at FEF00000, or set
+       it to B060A000 04040000 if you want to boot the image at FE000000.
+
+       To change the HRCW in flash to boot the image at FEF00000, use these
+       U-Boot commands:
+
+               cp.b FE000000 1000 10000        ; copy 1st flash sector to 1000
+               mw.b 1020 b4 8                  ; modify BMS bit
+               protect off FE000000 +10000
+               erase FE000000 +10000
+               cp.b 1000 FE000000 10000
+
+7. Notes
+       1) The console baudrate for MPC8349EITX is 115200bps.
diff --git a/doc/README.sbc8349 b/doc/README.sbc8349
new file mode 100644 (file)
index 0000000..a0ac638
--- /dev/null
@@ -0,0 +1,99 @@
+
+
+       U-Boot for Wind River SBC834x Boards
+       ====================================
+
+
+The Wind River SBC834x board is a 6U form factor (not CPCI) reference
+design that uses the MPC8347E or MPC8349E processor.  U-Boot support
+for this board is heavily based on the existing U-Boot support for
+Freescale MPC8349 reference boards.
+
+Support has been primarily tested on the SBC8349 version of the board,
+although earlier versions were also tested on the SBC8347.  The primary
+difference in the two is the level of PCI functionality.
+
+       http://www.windriver.com/products/OCD/SBC8347E_49E/
+
+
+Flash Details:
+==============
+
+The flash type is intel 28F640Jx (4096x16) [one device].  Base address
+is 0xFF80_0000 which is also where the Hardware Reset Configuration
+Word (HRCW) is stored.  Caution should be used to not overwrite the
+HRCW, or "CF RCW" with a Wind River ICE will be required to restore
+the HRCW and allow the board to enter background mode for further
+steps in the flash process.
+
+
+Restoring a corrupted or missing flash image:
+=============================================
+
+Details for storing U-boot to flash using a Wind River ICE can be found
+on page 19 of the board manual (request ERG-00328-001).  The following
+is a summary of that information:
+
+  - Connect ICE and establish connection to it from WorkBench/OCD.
+  - Ensure you have background mode (BKM) in the OCD terminal window.
+  - Select the appropriate flash type (listed above)
+  - Prepare a u-boot image by using the Wind River Convert utility;
+    by using "Convert and Add file" on the ELF file from your build.
+    Convert from FFF0_0000 to FFFF_FFFF (or to FFF3_FFFF if you are
+    trying to preserve your old environment settings).
+  - Set the start address of the erase/flash process to FFF0_0000
+  - Set the target RAM required to 64kB.
+  - Select sectors for erasing (see note on enviroment below)
+  - Select Erase and Reprogram.
+
+Note that some versions of the register files used with Workbench
+would zero some TSEC registers, which inhibits ethernet operation
+by u-boot when this register file is played to the target.  Using
+"INN" in the OCD terminal window instead of "IN" before the "GO"
+will not play the register file, and allow u-boot to use the TSEC
+interface while executed from the ICE "GO" command.
+
+Alternatively, you can locate the register file which will be named
+WRS_SBC8349_PCT00328001.reg or similar) and "REM" out all the lines
+beginning with "SCGA TSEC1" and "SCGA TSEC2".  This allows you to
+use all the remaining register file content.
+
+If you wish to preserve your prior U-Boot environment settings,
+then convert (and erase to) 0xFFF3FFFF instead of 0xFFFFFFFF.
+The size for converting (and erasing) must be at least as large
+as u-boot.bin.
+
+
+Updating U-Boot with U-Boot:
+============================
+
+This procedure is very similar to other boards that have u-boot installed.
+Assuming that the network has been configured, and that the new u-boot.bin
+has been copied to the TFTP server, the commands are:
+
+       tftp 200000 u-boot.bin
+       protect off all
+       erase fff00000 fff3ffff
+       cp.b 200000 fff00000 3ffff
+       protect on all
+
+
+PCI:
+====
+
+This board and U-Boot have been tested with PCI built in, on a SBC8349
+and confirmed that the "pci" command showed the intel e1000 that was
+present in the PCI slot.  Note that if a 33MHz 32bit card is inserted
+in the slot, then the whole board will clock down to a 33MHz base
+clock instead of the default 66MHz.  This will change the baud clocks
+and mess up your serial console output.  If you want to use a 33MHz PCI
+card, then you should build a U-Boot with #undef PCI_66M in the
+include/configs/sbc8349.h and store this to flash prior to powering down
+the board and inserting the 33MHz PCI card.
+
+By default PCI support is disabled to better support very early
+revision MPC834x chips with possible PCI issues.  Also PCI support is
+untested on the sbc8347 variants at this point in time.
+
+
+                                               Paul Gortmaker, 01/2007
index 5a369df2c418914c2e1245fafb57ddd21d10582f..fffc22a5e1d72451739d67ffe17ba3df105c3fb1 100644 (file)
@@ -44,7 +44,7 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          serial.o serial_max3100.o \
          serial_pl010.o serial_pl011.o serial_xuartlite.o \
          sl811_usb.o sm501.o smc91111.o smiLynxEM.o \
-         status_led.o sym53c8xx.o ahci.o \
+         status_led.o sym53c8xx.o systemace.o ahci.o \
          ti_pci1410a.o tigon3.o tsec.o \
          usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o \
          videomodes.o w83c553f.o \
index 696f9a47ada93a25b65a918adf7d32da720945f0..5579a1efc155e3cb9d488af81d5262b2d2b19c95 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <common.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 #include <asm/byteorder.h>
 #include <environment.h>
 #ifdef CFG_FLASH_CFI_DRIVER
@@ -931,27 +932,18 @@ static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset
                debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr.cp, cmd,
                       cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.cp = cword.c;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_16BIT:
                debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr.wp,
                       cmd, cword.w,
                       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.wp = cword.w;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_32BIT:
                debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr.lp,
                       cmd, cword.l,
                       info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
                *addr.lp = cword.l;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        case FLASH_CFI_64BIT:
 #ifdef DEBUG
@@ -966,11 +958,11 @@ static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset
                }
 #endif
                *addr.llp = cword.ll;
-#ifdef CONFIG_BLACKFIN
-               asm("ssync;");
-#endif
                break;
        }
+
+       /* Ensure all the instructions are fully finished */
+       sync();
 }
 
 static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect)
index c92909608a38099e4401f0ed88155c67e098c7c8..ebae5af154ee95bcadd738e8a78a57372f66d7c7 100644 (file)
@@ -58,6 +58,7 @@ i2c_init(int speed, int slaveadd)
        dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET);
 
        writeb(0, &dev->cr);                    /* stop I2C controller */
+       udelay(5);                              /* let it shutdown in peace */
        writeb(0x3F, &dev->fdr);                /* set bus speed */
        writeb(0x3F, &dev->dfsrr);              /* set default filter */
        writeb(slaveadd << 1, &dev->adr);       /* write slave address */
@@ -191,15 +192,17 @@ __i2c_read(u8 *data, int length)
 int
 i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
 {
-       int i = 0;
+       int i = -1; /* signal error */
        u8 *a = (u8*)&addr;
 
        if (i2c_wait4bus() >= 0
            && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0
-           && __i2c_write(&a[4 - alen], alen) == alen
-           && i2c_write_addr(dev, I2C_READ_BIT, 1) != 0) {
+           && __i2c_write(&a[4 - alen], alen) == alen)
+               i = 0; /* No error so far */
+
+       if (length
+           && i2c_write_addr(dev, I2C_READ_BIT, 1) != 0)
                i = __i2c_read(data, length);
-       }
 
        writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr);
 
@@ -212,7 +215,7 @@ i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
 int
 i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)
 {
-       int i = 0;
+       int i = -1; /* signal error */
        u8 *a = (u8*)&addr;
 
        if (i2c_wait4bus() >= 0
@@ -232,16 +235,14 @@ i2c_write(u8 dev, uint addr, int alen, u8 *data, int length)
 int
 i2c_probe(uchar chip)
 {
-       int tmp;
-
-       /*
-        * Try to read the first location of the chip.  The underlying
-        * driver doesn't appear to support sending just the chip address
-        * and looking for an <ACK> back.
+       /* For unknow reason the controller will ACK when
+        * probing for a slave with the same address, so skip
+        * it.
         */
-       udelay(10000);
+       if (chip == (readb(&i2c_dev[i2c_bus_num]->adr) >> 1))
+               return -1;
 
-       return i2c_read(chip, 0, 1, (uchar *)&tmp, 1);
+       return i2c_read(chip, 0, 0, NULL, 0);
 }
 
 uchar
index f7f8ed0a7245590f1cad6175295b83940b08b23c..0bcd0a9573e8941515c3deeee68d97dd8b448229 100644 (file)
@@ -30,7 +30,7 @@
 #define UCC_MAX_NUM    8
 
 #define QE_DATAONLY_BASE       (uint)(128)
-#define QE_DATAONLY_SIZE       ((uint)(0xc000) - QE_DATAONLY_BASE)
+#define QE_DATAONLY_SIZE       (QE_MURAM_SIZE - QE_DATAONLY_BASE)
 
 /* QE threads SNUM
 */
index f640c8191618c5f19342edaf52987c4bf10d531c..c416a67c83271276e14c660fcbb7901c0cfcc246 100644 (file)
@@ -432,7 +432,12 @@ static int init_phy(struct eth_device *dev)
        }
        memset(mii_info, 0, sizeof(*mii_info));
 
-       mii_info->speed = SPEED_1000;
+       if (uec->uec_info->uf_info.eth_type == GIGA_ETH) {
+               mii_info->speed = SPEED_1000;
+       } else {
+               mii_info->speed = SPEED_100;
+       }
+
        mii_info->duplex = DUPLEX_FULL;
        mii_info->pause = 0;
        mii_info->link = 1;
@@ -508,7 +513,8 @@ static void adjust_link(struct eth_device *dev)
                }
 
                if (mii_info->speed != uec->oldspeed) {
-                       switch (mii_info->speed) {
+                       if (uec->uec_info->uf_info.eth_type == GIGA_ETH) {
+                               switch (mii_info->speed) {
                                case 1000:
                                        break;
                                case 100:
@@ -531,6 +537,7 @@ static void adjust_link(struct eth_device *dev)
                                        printf("%s: Ack,Speed(%d)is illegal\n",
                                                dev->name, mii_info->speed);
                                        break;
+                               }
                        }
 
                        printf("%s: Speed %dBT\n", dev->name, mii_info->speed);
@@ -1122,7 +1129,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        uec_private_t           *uec;
        ucc_fast_private_t      *uccf;
        volatile qe_bd_t        *bd;
-       volatile u16            status;
+       u16                     status;
        int                     i;
        int                     result = 0;
 
@@ -1131,7 +1138,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        bd = uec->txBd;
 
        /* Find an empty TxBD */
-       for (i = 0; BD_STATUS(bd) & TxBD_READY; i++) {
+       for (i = 0; bd->status & TxBD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx buffer not ready\n", dev->name);
                        return result;
@@ -1141,7 +1148,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        /* Init TxBD */
        BD_DATA_SET(bd, buf);
        BD_LENGTH_SET(bd, len);
-       status = BD_STATUS(bd);
+       status = bd->status;
        status &= BD_WRAP;
        status |= (TxBD_READY | TxBD_LAST);
        BD_STATUS_SET(bd, status);
@@ -1150,13 +1157,11 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        ucc_fast_transmit_on_demand(uccf);
 
        /* Wait for buffer to be transmitted */
-       status = BD_STATUS(bd);
-       for (i = 0; status & TxBD_READY; i++) {
+       for (i = 0; bd->status & TxBD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx error\n", dev->name);
                        return result;
                }
-               status = BD_STATUS(bd);
        }
 
        /* Ok, the buffer be transimitted */
@@ -1171,12 +1176,12 @@ static int uec_recv(struct eth_device* dev)
 {
        uec_private_t           *uec = dev->priv;
        volatile qe_bd_t        *bd;
-       volatile u16            status;
+       u16                     status;
        u16                     len;
        u8                      *data;
 
        bd = uec->rxBd;
-       status = BD_STATUS(bd);
+       status = bd->status;
 
        while (!(status & RxBD_EMPTY)) {
                if (!(status & RxBD_ERROR)) {
@@ -1190,7 +1195,7 @@ static int uec_recv(struct eth_device* dev)
                BD_LENGTH_SET(bd, 0);
                BD_STATUS_SET(bd, status | RxBD_EMPTY);
                BD_ADVANCE(bd, status, uec->p_rx_bd_ring);
-               status = BD_STATUS(bd);
+               status = bd->status;
        }
        uec->rxBd = bd;
 
diff --git a/drivers/systemace.c b/drivers/systemace.c
new file mode 100644 (file)
index 0000000..3848d9c
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2004 Picture Elements, Inc.
+ *    Stephen Williams (XXXXXXXXXXXXXXXX)
+ *
+ *    This source code is free software; you can redistribute it
+ *    and/or modify it in source code form 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
+ */
+
+/*
+ * The Xilinx SystemACE chip support is activated by defining
+ * CONFIG_SYSTEMACE to turn on support, and CFG_SYSTEMACE_BASE
+ * to set the base address of the device. This code currently
+ * assumes that the chip is connected via a byte-wide bus.
+ *
+ * The CONFIG_SYSTEMACE also adds to fat support the device class
+ * "ace" that allows the user to execute "fatls ace 0" and the
+ * like. This works by making the systemace_get_dev function
+ * available to cmd_fat.c:get_dev and filling in a block device
+ * description that has all the bits needed for FAT support to
+ * read sectors.
+ *
+ * According to Xilinx technical support, before accessing the
+ * SystemACE CF you need to set the following control bits:
+ *      FORCECFGMODE : 1
+ *      CFGMODE : 0
+ *      CFGSTART : 0
+ */
+
+#include <common.h>
+#include <command.h>
+#include <systemace.h>
+#include <part.h>
+#include <asm/io.h>
+
+#ifdef CONFIG_SYSTEMACE
+
+/*
+ * The ace_readw and writew functions read/write 16bit words, but the
+ * offset value is the BYTE offset as most used in the Xilinx
+ * datasheet for the SystemACE chip. The CFG_SYSTEMACE_BASE is defined
+ * to be the base address for the chip, usually in the local
+ * peripheral bus.
+ */
+#if (CFG_SYSTEMACE_WIDTH == 8)
+#if !defined(__BIG_ENDIAN)
+#define ace_readw(off) ((readb(CFG_SYSTEMACE_BASE+off)<<8) | \
+                       (readb(CFG_SYSTEMACE_BASE+off+1)))
+#define ace_writew(val, off) {writeb(val>>8, CFG_SYSTEMACE_BASE+off); \
+                             writeb(val, CFG_SYSTEMACE_BASE+off+1);}
+#else
+#define ace_readw(off) ((readb(CFG_SYSTEMACE_BASE+off)) | \
+                       (readb(CFG_SYSTEMACE_BASE+off+1)<<8))
+#define ace_writew(val, off) {writeb(val, CFG_SYSTEMACE_BASE+off); \
+                             writeb(val>>8, CFG_SYSTEMACE_BASE+off+1);}
+#endif
+#else
+#define ace_readw(off) (in16(CFG_SYSTEMACE_BASE+off))
+#define ace_writew(val, off) (out16(CFG_SYSTEMACE_BASE+off,val))
+#endif
+
+/* */
+
+static unsigned long systemace_read(int dev, unsigned long start,
+                                   unsigned long blkcnt, void *buffer);
+
+static block_dev_desc_t systemace_dev = { 0 };
+
+static int get_cf_lock(void)
+{
+       int retry = 10;
+
+       /* CONTROLREG = LOCKREG */
+       unsigned val = ace_readw(0x18);
+       val |= 0x0002;
+       ace_writew((val & 0xffff), 0x18);
+
+       /* Wait for MPULOCK in STATUSREG[15:0] */
+       while (!(ace_readw(0x04) & 0x0002)) {
+
+               if (retry < 0)
+                       return -1;
+
+               udelay(100000);
+               retry -= 1;
+       }
+
+       return 0;
+}
+
+static void release_cf_lock(void)
+{
+       unsigned val = ace_readw(0x18);
+       val &= ~(0x0002);
+       ace_writew((val & 0xffff), 0x18);
+}
+
+block_dev_desc_t *systemace_get_dev(int dev)
+{
+       /* The first time through this, the systemace_dev object is
+          not yet initialized. In that case, fill it in. */
+       if (systemace_dev.blksz == 0) {
+               systemace_dev.if_type = IF_TYPE_UNKNOWN;
+               systemace_dev.dev = 0;
+               systemace_dev.part_type = PART_TYPE_UNKNOWN;
+               systemace_dev.type = DEV_TYPE_HARDDISK;
+               systemace_dev.blksz = 512;
+               systemace_dev.removable = 1;
+               systemace_dev.block_read = systemace_read;
+
+               /*
+                * Ensure the correct bus mode (8/16 bits) gets enabled
+                */
+               ace_writew(CFG_SYSTEMACE_WIDTH == 8 ? 0 : 0x0001, 0);
+
+               init_part(&systemace_dev);
+
+       }
+
+       return &systemace_dev;
+}
+
+/*
+ * This function is called (by dereferencing the block_read pointer in
+ * the dev_desc) to read blocks of data. The return value is the
+ * number of blocks read. A zero return indicates an error.
+ */
+static unsigned long systemace_read(int dev, unsigned long start,
+                                   unsigned long blkcnt, void *buffer)
+{
+       int retry;
+       unsigned blk_countdown;
+       unsigned char *dp = buffer;
+       unsigned val;
+
+       if (get_cf_lock() < 0) {
+               unsigned status = ace_readw(0x04);
+
+               /* If CFDETECT is false, card is missing. */
+               if (!(status & 0x0010)) {
+                       printf("** CompactFlash card not present. **\n");
+                       return 0;
+               }
+
+               printf("**** ACE locked away from me (STATUSREG=%04x)\n",
+                      status);
+               return 0;
+       }
+#ifdef DEBUG_SYSTEMACE
+       printf("... systemace read %lu sectors at %lu\n", blkcnt, start);
+#endif
+
+       retry = 2000;
+       for (;;) {
+               val = ace_readw(0x04);
+
+               /* If CFDETECT is false, card is missing. */
+               if (!(val & 0x0010)) {
+                       printf("**** ACE CompactFlash not found.\n");
+                       release_cf_lock();
+                       return 0;
+               }
+
+               /* If RDYFORCMD, then we are ready to go. */
+               if (val & 0x0100)
+                       break;
+
+               if (retry < 0) {
+                       printf("**** SystemACE not ready.\n");
+                       release_cf_lock();
+                       return 0;
+               }
+
+               udelay(1000);
+               retry -= 1;
+       }
+
+       /* The SystemACE can only transfer 256 sectors at a time, so
+          limit the current chunk of sectors. The blk_countdown
+          variable is the number of sectors left to transfer. */
+
+       blk_countdown = blkcnt;
+       while (blk_countdown > 0) {
+               unsigned trans = blk_countdown;
+
+               if (trans > 256)
+                       trans = 256;
+
+#ifdef DEBUG_SYSTEMACE
+               printf("... transfer %lu sector in a chunk\n", trans);
+#endif
+               /* Write LBA block address */
+               ace_writew((start >> 0) & 0xffff, 0x10);
+               ace_writew((start >> 16) & 0x0fff, 0x12);
+
+               /* NOTE: in the Write Sector count below, a count of 0
+                  causes a transfer of 256, so &0xff gives the right
+                  value for whatever transfer count we want. */
+
+               /* Write sector count | ReadMemCardData. */
+               ace_writew((trans & 0xff) | 0x0300, 0x14);
+
+               /* Reset the configruation controller */
+               val = ace_readw(0x18);
+               val |= 0x0080;
+               ace_writew(val, 0x18);
+
+               retry = trans * 16;
+               while (retry > 0) {
+                       int idx;
+
+                       /* Wait for buffer to become ready. */
+                       while (!(ace_readw(0x04) & 0x0020)) {
+                               udelay(100);
+                       }
+
+                       /* Read 16 words of 2bytes from the sector buffer. */
+                       for (idx = 0; idx < 16; idx += 1) {
+                               unsigned short val = ace_readw(0x40);
+                               *dp++ = val & 0xff;
+                               *dp++ = (val >> 8) & 0xff;
+                       }
+
+                       retry -= 1;
+               }
+
+               /* Clear the configruation controller reset */
+               val = ace_readw(0x18);
+               val &= ~0x0080;
+               ace_writew(val, 0x18);
+
+               /* Count the blocks we transfer this time. */
+               start += trans;
+               blk_countdown -= trans;
+       }
+
+       release_cf_lock();
+
+       return blkcnt;
+}
+#endif /* CONFIG_SYSTEMACE */
index 2524e4f6d2b6644a3ec69cb7324f16d37b202e4c..3f11eb03b41da825fee54a06daa9a5161b583be0 100644 (file)
@@ -381,6 +381,61 @@ uint mii_parse_sr(uint mii_reg, struct tsec_private * priv)
        return 0;
 }
 
+/*
+ * Parse the BCM54xx status register for speed and duplex information.
+ * The linux sungem_phy has this information, but in a table format.
+ */
+uint mii_parse_BCM54xx_sr(uint mii_reg, struct tsec_private *priv)
+{
+
+       switch((mii_reg & MIIM_BCM54xx_AUXSTATUS_LINKMODE_MASK) >> MIIM_BCM54xx_AUXSTATUS_LINKMODE_SHIFT){
+
+               case 1:
+                       printf("Enet starting in 10BT/HD\n");
+                       priv->duplexity = 0;
+                       priv->speed = 10;
+                       break;
+
+               case 2:
+                       printf("Enet starting in 10BT/FD\n");
+                       priv->duplexity = 1;
+                       priv->speed = 10;
+                       break;
+
+               case 3:
+                       printf("Enet starting in 100BT/HD\n");
+                       priv->duplexity = 0;
+                       priv->speed = 100;
+                       break;
+
+               case 5:
+                       printf("Enet starting in 100BT/FD\n");
+                       priv->duplexity = 1;
+                       priv->speed = 100;
+                       break;
+
+               case 6:
+                       printf("Enet starting in 1000BT/HD\n");
+                       priv->duplexity = 0;
+                       priv->speed = 1000;
+                       break;
+
+               case 7:
+                       printf("Enet starting in 1000BT/FD\n");
+                       priv->duplexity = 1;
+                       priv->speed = 1000;
+                       break;
+
+               default:
+                       printf("Auto-neg error, defaulting to 10BT/HD\n");
+                       priv->duplexity = 0;
+                       priv->speed = 10;
+                       break;
+       }
+
+       return 0;
+
+}
 /* Parse the 88E1011's status register for speed and duplex
  * information
  */
@@ -770,6 +825,34 @@ static void tsec_halt(struct eth_device *dev)
                phy_run_commands(priv, priv->phyinfo->shutdown);
 }
 
+/* The 5411 id is 0x206070, the 5421 is 0x2060e0 */
+struct phy_info phy_info_BCM5461S = {
+       0x02060c1,      /* 5461 ID */
+       "Broadcom BCM5461S",
+       0, /* not clear to me what minor revisions we can shift away */
+       (struct phy_cmd[]) { /* config */
+               /* Reset and configure the PHY */
+               {MIIM_CONTROL, MIIM_CONTROL_RESET, NULL},
+               {MIIM_GBIT_CONTROL, MIIM_GBIT_CONTROL_INIT, NULL},
+               {MIIM_ANAR, MIIM_ANAR_INIT, NULL},
+               {MIIM_CONTROL, MIIM_CONTROL_RESET, NULL},
+               {MIIM_CONTROL, MIIM_CONTROL_INIT, &mii_cr_init},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* startup */
+               /* Status is read once to clear old link state */
+               {MIIM_STATUS, miim_read, NULL},
+               /* Auto-negotiate */
+               {MIIM_STATUS, miim_read, &mii_parse_sr},
+               /* Read the status */
+               {MIIM_BCM54xx_AUXSTATUS, miim_read, &mii_parse_BCM54xx_sr},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* shutdown */
+               {miim_end,}
+       },
+};
+
 struct phy_info phy_info_M88E1011S = {
        0x01410c6,
        "Marvell 88E1011S",
@@ -1112,6 +1195,7 @@ struct phy_info phy_info_dp83865 = {
 struct phy_info *phy_info[] = {
        &phy_info_cis8204,
        &phy_info_cis8201,
+       &phy_info_BCM5461S,
        &phy_info_M88E1011S,
        &phy_info_M88E1111S,
        &phy_info_M88E1145,
index cee30037db03dee0fb30b4c4f36605ecf55ac1d5..422bc6692292bc43b2f6271ed01d2c6fe4a6dbc9 100644 (file)
 #define MIIM_GBIT_CONTROL      0x9
 #define MIIM_GBIT_CONTROL_INIT 0xe00
 
+/* Broadcom BCM54xx -- taken from linux sungem_phy */
+#define MIIM_BCM54xx_AUXSTATUS                 0x19
+#define MIIM_BCM54xx_AUXSTATUS_LINKMODE_MASK   0x0700
+#define MIIM_BCM54xx_AUXSTATUS_LINKMODE_SHIFT  8
+
 /* Cicada Auxiliary Control/Status Register */
 #define MIIM_CIS8201_AUX_CONSTAT        0x1c
 #define MIIM_CIS8201_AUXCONSTAT_INIT    0x0004
index 14c38f0a83df2cba55b9fc428066d43e014b1d6b..9f65cfb2740169adbd6f38eb6abcd18f8bb7896b 100644 (file)
@@ -144,12 +144,15 @@ dtt_init (void)
        unsigned char sensors[] = CONFIG_DTT_SENSORS;
        const char *const header = "DTT:   ";
 
+       /* switch to correct I2C bus */
+       I2C_SET_BUS(CFG_DTT_BUS_NUM);
+
        for (i = 0; i < sizeof(sensors); i++) {
-           if (_dtt_init(sensors[i]) != 0)
-               printf ("%s%d FAILED INIT\n", header, i+1);
-           else
-               printf ("%s%d is %i C\n", header, i+1,
-                      dtt_get_temp(sensors[i]));
+               if (_dtt_init(sensors[i]) != 0)
+                       printf ("%s%d FAILED INIT\n", header, i+1);
+               else
+                       printf ("%s%d is %i C\n", header, i+1,
+                               dtt_get_temp(sensors[i]));
        }
 
        return (0);
diff --git a/include/405gp_i2c.h b/include/405gp_i2c.h
deleted file mode 100644 (file)
index 5a9a497..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _405gp_i2c_h_
-#define _405gp_i2c_h_
-
-#define           I2C_REGISTERS_BASE_ADDRESS 0xEF600500
-#define    IIC_MDBUF   (I2C_REGISTERS_BASE_ADDRESS+IICMDBUF)
-#define    IIC_SDBUF   (I2C_REGISTERS_BASE_ADDRESS+IICSDBUF)
-#define    IIC_LMADR   (I2C_REGISTERS_BASE_ADDRESS+IICLMADR)
-#define    IIC_HMADR   (I2C_REGISTERS_BASE_ADDRESS+IICHMADR)
-#define    IIC_CNTL    (I2C_REGISTERS_BASE_ADDRESS+IICCNTL)
-#define    IIC_MDCNTL  (I2C_REGISTERS_BASE_ADDRESS+IICMDCNTL)
-#define    IIC_STS     (I2C_REGISTERS_BASE_ADDRESS+IICSTS)
-#define    IIC_EXTSTS  (I2C_REGISTERS_BASE_ADDRESS+IICEXTSTS)
-#define    IIC_LSADR   (I2C_REGISTERS_BASE_ADDRESS+IICLSADR)
-#define    IIC_HSADR   (I2C_REGISTERS_BASE_ADDRESS+IICHSADR)
-#define    IIC_CLKDIV  (I2C_REGISTERS_BASE_ADDRESS+IICCLKDIV)
-#define    IIC_INTRMSK (I2C_REGISTERS_BASE_ADDRESS+IICINTRMSK)
-#define    IIC_XFRCNT  (I2C_REGISTERS_BASE_ADDRESS+IICXFRCNT)
-#define    IIC_XTCNTLSS        (I2C_REGISTERS_BASE_ADDRESS+IICXTCNTLSS)
-#define    IIC_DIRECTCNTL (I2C_REGISTERS_BASE_ADDRESS+IICDIRECTCNTL)
-
-/* MDCNTL Register Bit definition */
-#define    IIC_MDCNTL_HSCL 0x01
-#define    IIC_MDCNTL_EUBS 0x02
-#define    IIC_MDCNTL_EINT 0x04
-#define    IIC_MDCNTL_ESM  0x08
-#define    IIC_MDCNTL_FSM  0x10
-#define    IIC_MDCNTL_EGC  0x20
-#define    IIC_MDCNTL_FMDB 0x40
-#define    IIC_MDCNTL_FSDB 0x80
-
-/* CNTL Register Bit definition */
-#define    IIC_CNTL_PT     0x01
-#define    IIC_CNTL_READ   0x02
-#define    IIC_CNTL_CHT    0x04
-#define    IIC_CNTL_RPST   0x08
-/* bit 2/3 for Transfer count*/
-#define    IIC_CNTL_AMD    0x40
-#define    IIC_CNTL_HMT    0x80
-
-/* STS Register Bit definition */
-#define    IIC_STS_PT     0X01
-#define    IIC_STS_IRQA    0x02
-#define    IIC_STS_ERR    0X04
-#define    IIC_STS_SCMP    0x08
-#define    IIC_STS_MDBF    0x10
-#define    IIC_STS_MDBS    0X20
-#define    IIC_STS_SLPR    0x40
-#define    IIC_STS_SSS     0x80
-
-/* EXTSTS Register Bit definition */
-#define    IIC_EXTSTS_XFRA 0X01
-#define    IIC_EXTSTS_ICT  0X02
-#define    IIC_EXTSTS_LA   0X04
-
-/* XTCNTLSS Register Bit definition */
-#define    IIC_XTCNTLSS_SRST  0x01
-#define    IIC_XTCNTLSS_EPI   0x02
-#define    IIC_XTCNTLSS_SDBF  0x04
-#define    IIC_XTCNTLSS_SBDD  0x08
-#define    IIC_XTCNTLSS_SWS   0x10
-#define    IIC_XTCNTLSS_SWC   0x20
-#define    IIC_XTCNTLSS_SRS   0x40
-#define    IIC_XTCNTLSS_SRC   0x80
-#endif
diff --git a/include/440_i2c.h b/include/440_i2c.h
deleted file mode 100644 (file)
index 0c2bf36..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef _440_i2c_h_
-#define _440_i2c_h_
-
-#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
-    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
-#define    I2C_BASE_ADDR (CFG_PERIPHERAL_BASE + 0x00000700)
-#else
-#define    I2C_BASE_ADDR (CFG_PERIPHERAL_BASE + 0x00000400)
-#endif /*CONFIG_440EP CONFIG_440GR*/
-
-#define           I2C_REGISTERS_BASE_ADDRESS I2C_BASE_ADDR
-#define    IIC_MDBUF   (I2C_REGISTERS_BASE_ADDRESS+IICMDBUF)
-#define    IIC_SDBUF   (I2C_REGISTERS_BASE_ADDRESS+IICSDBUF)
-#define    IIC_LMADR   (I2C_REGISTERS_BASE_ADDRESS+IICLMADR)
-#define    IIC_HMADR   (I2C_REGISTERS_BASE_ADDRESS+IICHMADR)
-#define    IIC_CNTL    (I2C_REGISTERS_BASE_ADDRESS+IICCNTL)
-#define    IIC_MDCNTL  (I2C_REGISTERS_BASE_ADDRESS+IICMDCNTL)
-#define    IIC_STS     (I2C_REGISTERS_BASE_ADDRESS+IICSTS)
-#define    IIC_EXTSTS  (I2C_REGISTERS_BASE_ADDRESS+IICEXTSTS)
-#define    IIC_LSADR   (I2C_REGISTERS_BASE_ADDRESS+IICLSADR)
-#define    IIC_HSADR   (I2C_REGISTERS_BASE_ADDRESS+IICHSADR)
-#define    IIC_CLKDIV  (I2C_REGISTERS_BASE_ADDRESS+IICCLKDIV)
-#define    IIC_INTRMSK (I2C_REGISTERS_BASE_ADDRESS+IICINTRMSK)
-#define    IIC_XFRCNT  (I2C_REGISTERS_BASE_ADDRESS+IICXFRCNT)
-#define    IIC_XTCNTLSS        (I2C_REGISTERS_BASE_ADDRESS+IICXTCNTLSS)
-#define    IIC_DIRECTCNTL (I2C_REGISTERS_BASE_ADDRESS+IICDIRECTCNTL)
-
-/* MDCNTL Register Bit definition */
-#define    IIC_MDCNTL_HSCL 0x01
-#define    IIC_MDCNTL_EUBS 0x02
-#define    IIC_MDCNTL_EINT 0x04
-#define    IIC_MDCNTL_ESM  0x08
-#define    IIC_MDCNTL_FSM  0x10
-#define    IIC_MDCNTL_EGC  0x20
-#define    IIC_MDCNTL_FMDB 0x40
-#define    IIC_MDCNTL_FSDB 0x80
-
-/* CNTL Register Bit definition */
-#define    IIC_CNTL_PT     0x01
-#define    IIC_CNTL_READ   0x02
-#define    IIC_CNTL_CHT    0x04
-#define    IIC_CNTL_RPST   0x08
-/* bit 2/3 for Transfer count*/
-#define    IIC_CNTL_AMD    0x40
-#define    IIC_CNTL_HMT    0x80
-
-/* STS Register Bit definition */
-#define    IIC_STS_PT     0X01
-#define    IIC_STS_IRQA    0x02
-#define    IIC_STS_ERR    0X04
-#define    IIC_STS_SCMP    0x08
-#define    IIC_STS_MDBF    0x10
-#define    IIC_STS_MDBS    0X20
-#define    IIC_STS_SLPR    0x40
-#define    IIC_STS_SSS     0x80
-
-/* EXTSTS Register Bit definition */
-#define    IIC_EXTSTS_XFRA 0X01
-#define    IIC_EXTSTS_ICT  0X02
-#define    IIC_EXTSTS_LA   0X04
-
-/* XTCNTLSS Register Bit definition */
-#define    IIC_XTCNTLSS_SRST  0x01
-#define    IIC_XTCNTLSS_EPI   0x02
-#define    IIC_XTCNTLSS_SDBF  0x04
-#define    IIC_XTCNTLSS_SBDD  0x08
-#define    IIC_XTCNTLSS_SWS   0x10
-#define    IIC_XTCNTLSS_SWC   0x20
-#define    IIC_XTCNTLSS_SRS   0x40
-#define    IIC_XTCNTLSS_SRC   0x80
-#endif
diff --git a/include/4xx_i2c.h b/include/4xx_i2c.h
new file mode 100644 (file)
index 0000000..66b7997
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * (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
+ */
+
+#ifndef _4xx_i2c_h_
+#define _4xx_i2c_h_
+
+#define IIC_OK         0
+#define IIC_NOK                1
+#define IIC_NOK_LA     2               /* Lost arbitration */
+#define IIC_NOK_ICT    3               /* Incomplete transfer */
+#define IIC_NOK_XFRA   4               /* Transfer aborted */
+#define IIC_NOK_DATA   5               /* No data in buffer */
+#define IIC_NOK_TOUT   6               /* Transfer timeout */
+
+#define IIC_TIMEOUT    1               /* 1 second */
+
+#if defined(CONFIG_I2C_MULTI_BUS)
+#define I2C_BUS_OFFS   (i2c_bus_num * 0x100)
+#else
+#define I2C_BUS_OFFS   (0x000)
+#endif /* CONFIG_I2C_MULTI_BUS */
+
+#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+#define I2C_BASE_ADDR  (CFG_PERIPHERAL_BASE + 0x00000700 + I2C_BUS_OFFS)
+#elif defined(CONFIG_440)
+/* all remaining 440 variants */
+#define I2C_BASE_ADDR  (CFG_PERIPHERAL_BASE + 0x00000400 + I2C_BUS_OFFS)
+#else
+/* all 405 variants */
+#define I2C_BASE_ADDR  (0xEF600500 + I2C_BUS_OFFS)
+#endif
+
+#define I2C_REGISTERS_BASE_ADDRESS I2C_BASE_ADDR
+#define IIC_MDBUF      (I2C_REGISTERS_BASE_ADDRESS+IICMDBUF)
+#define IIC_SDBUF      (I2C_REGISTERS_BASE_ADDRESS+IICSDBUF)
+#define IIC_LMADR      (I2C_REGISTERS_BASE_ADDRESS+IICLMADR)
+#define IIC_HMADR      (I2C_REGISTERS_BASE_ADDRESS+IICHMADR)
+#define IIC_CNTL       (I2C_REGISTERS_BASE_ADDRESS+IICCNTL)
+#define IIC_MDCNTL     (I2C_REGISTERS_BASE_ADDRESS+IICMDCNTL)
+#define IIC_STS                (I2C_REGISTERS_BASE_ADDRESS+IICSTS)
+#define IIC_EXTSTS     (I2C_REGISTERS_BASE_ADDRESS+IICEXTSTS)
+#define IIC_LSADR      (I2C_REGISTERS_BASE_ADDRESS+IICLSADR)
+#define IIC_HSADR      (I2C_REGISTERS_BASE_ADDRESS+IICHSADR)
+#define IIC_CLKDIV     (I2C_REGISTERS_BASE_ADDRESS+IICCLKDIV)
+#define IIC_INTRMSK    (I2C_REGISTERS_BASE_ADDRESS+IICINTRMSK)
+#define IIC_XFRCNT     (I2C_REGISTERS_BASE_ADDRESS+IICXFRCNT)
+#define IIC_XTCNTLSS   (I2C_REGISTERS_BASE_ADDRESS+IICXTCNTLSS)
+#define IIC_DIRECTCNTL (I2C_REGISTERS_BASE_ADDRESS+IICDIRECTCNTL)
+
+/* MDCNTL Register Bit definition */
+#define IIC_MDCNTL_HSCL                0x01
+#define IIC_MDCNTL_EUBS                0x02
+#define IIC_MDCNTL_EINT                0x04
+#define IIC_MDCNTL_ESM         0x08
+#define IIC_MDCNTL_FSM         0x10
+#define IIC_MDCNTL_EGC         0x20
+#define IIC_MDCNTL_FMDB                0x40
+#define IIC_MDCNTL_FSDB                0x80
+
+/* CNTL Register Bit definition */
+#define IIC_CNTL_PT            0x01
+#define IIC_CNTL_READ          0x02
+#define IIC_CNTL_CHT           0x04
+#define IIC_CNTL_RPST          0x08
+/* bit 2/3 for Transfer count*/
+#define IIC_CNTL_AMD           0x40
+#define IIC_CNTL_HMT           0x80
+
+/* STS Register Bit definition */
+#define IIC_STS_PT             0x01
+#define IIC_STS_IRQA           0x02
+#define IIC_STS_ERR            0x04
+#define IIC_STS_SCMP           0x08
+#define IIC_STS_MDBF           0x10
+#define IIC_STS_MDBS           0x20
+#define IIC_STS_SLPR           0x40
+#define IIC_STS_SSS            0x80
+
+/* EXTSTS Register Bit definition */
+#define IIC_EXTSTS_XFRA                0x01
+#define IIC_EXTSTS_ICT         0x02
+#define IIC_EXTSTS_LA          0x04
+
+/* XTCNTLSS Register Bit definition */
+#define IIC_XTCNTLSS_SRST      0x01
+#define IIC_XTCNTLSS_EPI       0x02
+#define IIC_XTCNTLSS_SDBF      0x04
+#define IIC_XTCNTLSS_SBDD      0x08
+#define IIC_XTCNTLSS_SWS       0x10
+#define IIC_XTCNTLSS_SWC       0x20
+#define IIC_XTCNTLSS_SRS       0x40
+#define IIC_XTCNTLSS_SRC       0x80
+
+/* IICx_DIRECTCNTL register */
+#define IIC_DIRCNTL_SDAC       0x08
+#define IIC_DIRCNTL_SCC                0x04
+#define IIC_DIRCNTL_MSDA       0x02
+#define IIC_DIRCNTL_MSC                0x01
+
+#define DIRCTNL_FREE(v)                (((v) & 0x0f) == 0x0f)
+#endif
index 648a10dd92368745e2529c73fb0ff12604ac451e..47c18e7e86965defdf8500c739bffe4dc1424a19 100644 (file)
 #include <asm/arch/hardware.h>
 #endif /* XXX###XXX */
 
+static inline void sync(void)
+{
+}
+
 /*
  * Generic virtual read/write.  Note that we don't support half-word
  * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
index e86c456ae1e48b30584b2100a0795e8cee304169..3c0d569233e2693933ea667075a362fe7535e3ec 100644 (file)
@@ -89,4 +89,8 @@ static __inline__ void * phys_to_virt(unsigned long address)
 
 #endif /* __KERNEL__ */
 
+static inline void sync(void)
+{
+}
+
 #endif /* __ASM_AVR32_IO_H */
index e5b388e262b87f2411677c14e7aac7a5b6bc30bb..fc27194a42e99796fea0fc43941046e96f6d13c8 100644 (file)
 #ifndef _BLACKFIN_IO_H
 #define _BLACKFIN_IO_H
 
+static inline void sync(void)
+{
+       __asm__ __volatile__ asm("ssync" : : : "memory");
+}
+
 #ifdef __KERNEL__
 
 #include <linux/config.h>
index 85d44aaa15b71fe3092526ae6782fed63b4699c9..e64d788fa758cbba566688e22a967765a7252a18 100644 (file)
@@ -201,4 +201,8 @@ __OUTS(b)
 __OUTS(w)
 __OUTS(l)
 
+static inline void sync(void)
+{
+}
+
 #endif
index 79a9626b5500c171eaa6dbeef1681e91f922e9dc..7bbdefba7603151e794a9486fb1a1b44f8390796 100644 (file)
@@ -1 +1,8 @@
-/* */
+#ifndef __ASM_M68K_IO_H_
+#define __ASM_M68K_IO_H_
+
+static inline void sync(void)
+{
+}
+
+#endif /* __ASM_M68K_IO_H_ */
index 33590454cfd8de3b5dd2f014cab358a7b40ce9ff..1c77ade4f1a173bb1d0cd1325d9084f838aabf21 100644 (file)
@@ -125,4 +125,8 @@ io_outsl (unsigned long port, const void *src, unsigned long count)
 #define ioremap_writethrough(physaddr, size)   (physaddr)
 #define ioremap_fullcache(physaddr, size)      (physaddr)
 
+static inline void sync(void)
+{
+}
+
 #endif /* __MICROBLAZE_IO_H__ */
index 857fb0302ce2432e6b0173d096a14d5625deb2d3..cd4d5dc9d9e8e4ff158e18f89ceeb268d6e495e9 100644 (file)
@@ -447,4 +447,8 @@ extern void (*_dma_cache_inv)(unsigned long start, unsigned long size);
 #define dma_cache_wback(start,size)    _dma_cache_wback(start,size)
 #define dma_cache_inv(start,size)      _dma_cache_inv(start,size)
 
+static inline void sync(void)
+{
+}
+
 #endif /* _ASM_IO_H */
index 07499d966d5a6645daa61964e97b3941c197b787..d77695abb9e1ccd1c9ff30cb327c7f8bd0f31f95 100644 (file)
@@ -97,4 +97,8 @@ static inline void outsl (unsigned long port, const void *src, unsigned long cou
        while (count--) outl (*p++, port);
 }
 
+static inline void sync(void)
+{
+}
+
 #endif /* __ASM_NIOS_IO_H_ */
index 0fab53bf0e9ead5eb60825854f51e2d8bdf1c07f..5bb5322952f86884b0b8efe86afe659f9edce66e 100644 (file)
 #ifndef __ASM_NIOS2_IO_H_
 #define __ASM_NIOS2_IO_H_
 
-#define sync() asm volatile ("sync" : : : "memory");
+static inline void sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
 
 extern unsigned char inb (unsigned char *port);
 extern unsigned short inw (unsigned short *port);
index 79dcae416f9b44029c7a84382d759b46ee24db92..ff9512f203cd06d41f1ed9a125486471436c3b1b 100644 (file)
 #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
+
 /*
  * Hardware Implementation-Dependent Register 0 (HID0)
  */
index 8bc61b63a859943220e37f7df6a34bbe78eb2dcc..c113b7ee0e4942d34ccb129b77aa6fbb9fa6c579 100644 (file)
@@ -52,12 +52,12 @@ typedef     struct  global_data {
 #if defined(CONFIG_MPC83XX)
        /* There are other clocks in the MPC83XX */
        u32 csb_clk;
-#if defined (CONFIG_MPC8349)
+#if defined (CONFIG_MPC834X)
        u32 tsec1_clk;
        u32 tsec2_clk;
        u32 usbmph_clk;
        u32 usbdr_clk;
-#endif /* CONFIG_MPC8349 */
+#endif /* CONFIG_MPC834X */
        u32 core_clk;
        u32 i2c1_clk;
        u32 i2c2_clk;
index 43cde5e28ef7a563f5743c6e11e79092563dba54..5e088d67d24b395335ed498d9bbd81960efb64c1 100644 (file)
@@ -3,20 +3,11 @@
  *
  * MPC83xx Internal Memory Map
  *
- * History :
- * 20060601: Daveliu (daveliu@freescale.com)
- *          TanyaJiang (tanya.jiang@freescale.com)
- *          Unified variable names for mpc83xx
- * 2005           : Mandy Lavi (mandy.lavi@freescale.com)
- *          support for mpc8360e
- * 2004           : Eran Liberty (liberty@freescale.com)
- *          Initialized for mpc8349
- *          based on:
- *          MPC8260 Internal Memory Map
- *          Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
- *          MPC85xx Internal Memory Map
- *          Copyright(c) 2002,2003 Motorola Inc.
- *          Xianghua Xiao (x.xiao@motorola.com)
+ * Contributors:
+ *     Dave Liu <daveliu@freescale.com>
+ *     Tanya Jiang <tanya.jiang@freescale.com>
+ *     Mandy Lavi <mandy.lavi@freescale.com>
+ *     Eran Liberty <liberty@freescale.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -25,7 +16,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
 #ifndef __IMMAP_83xx__
 #define __IMMAP_83xx__
 
-#include <config.h>
 #include <asm/types.h>
 #include <asm/fsl_i2c.h>
 
 /*
- * Local Access Window.
+ * Local Access Window
  */
 typedef struct law83xx {
        u32 bar;                /* LBIU local access window base address register */
-/* Identifies the 20 most-significant address bits of the base of local
- * access window n. The specified base address should be aligned to the
- * window size, as defined by LBLAWARn[SIZE].
- */
-#define LAWBAR_BAR        0xFFFFF000
-#define LAWBAR_RES          ~(LAWBAR_BAR)
        u32 ar;                 /* LBIU local access window attribute register */
 } law83xx_t;
 
 /*
- * System configuration registers.
+ * System configuration registers
  */
 typedef struct sysconf83xx {
        u32 immrbar;            /* Internal memory map base address register */
        u8 res0[0x04];
        u32 altcbar;            /* Alternate configuration base address register */
-/* Identifies the12 most significant address bits of an alternate base
- * address used for boot sequencer configuration accesses.
- */
-#define ALTCBAR_BASE_ADDR     0xFFF00000
-#define ALTCBAR_RES          ~(ALTCBAR_BASE_ADDR)      /* Reserved. Write has no effect, read returns 0. */
        u8 res1[0x14];
        law83xx_t lblaw[4];     /* LBIU local access window */
        u8 res2[0x20];
@@ -77,116 +56,14 @@ typedef struct sysconf83xx {
        u32 sgprl;              /* System General Purpose Register Low */
        u32 sgprh;              /* System General Purpose Register High */
        u32 spridr;             /* System Part and Revision ID Register */
-#define SPRIDR_PARTID        0xFFFF0000        /* Part Identification. */
-#define SPRIDR_REVID         0x0000FFFF        /* Revision Identification. */
        u8 res5[0x04];
        u32 spcr;               /* System Priority Configuration Register */
-#define SPCR_PCIHPE   0x10000000       /* PCI Highest Priority Enable. */
-#define SPCR_PCIHPE_SHIFT      (31-3)
-#define SPCR_PCIPR    0x03000000       /* PCI bridge system bus request priority. */
-#define SPCR_PCIPR_SHIFT       (31-7)
-#define SPCR_OPT      0x00800000       /* Optimize */
-#define SPCR_TBEN     0x00400000       /* E300 PowerPC core time base unit enable. */
-#define SPCR_TBEN_SHIFT                (31-9)
-#define SPCR_COREPR   0x00300000       /* E300 PowerPC Core system bus request priority. */
-#define SPCR_COREPR_SHIFT      (31-11)
-#if defined (CONFIG_MPC8349)
-#define SPCR_TSEC1DP  0x00003000       /* TSEC1 data priority. */
-#define SPCR_TSEC1DP_SHIFT     (31-19)
-#define SPCR_TSEC1BDP 0x00000C00       /* TSEC1 buffer descriptor priority. */
-#define SPCR_TSEC1BDP_SHIFT    (31-21)
-#define SPCR_TSEC1EP  0x00000300       /* TSEC1 emergency priority. */
-#define SPCR_TSEC1EP_SHIFT     (31-23)
-#define SPCR_TSEC2DP  0x00000030       /* TSEC2 data priority. */
-#define SPCR_TSEC2DP_SHIFT     (31-27)
-#define SPCR_TSEC2BDP 0x0000000C       /* TSEC2 buffer descriptor priority. */
-#define SPCR_TSEC2BDP_SHIFT    (31-29)
-#define SPCR_TSEC2EP  0x00000003       /* TSEC2 emergency priority. */
-#define SPCR_TSEC2EP_SHIFT     (31-31)
-#define SPCR_RES      ~(SPCR_PCIHPE | SPCR_PCIPR | SPCR_TBEN | SPCR_COREPR \
-                       | SPCR_TSEC1DP | SPCR_TSEC1BDP | SPCR_TSEC1EP \
-                       | SPCR_TSEC2DP | SPCR_TSEC2BDP | SPCR_TSEC2EP)
-#elif defined (CONFIG_MPC8360)
-#define SPCR_RES      ~(SPCR_PCIHPE|SPCR_PCIPR|SPCR_OPT|SPCR_TBEN|SPCR_COREPR)
-#endif
-       u32 sicrl;              /* System General Purpose Register Low */
-#if defined (CONFIG_MPC8349)
-#define SICRL_LDP_A   0x80000000
-#define SICRL_USB1    0x40000000
-#define SICRL_USB0    0x20000000
-#define SICRL_UART    0x0C000000
-#define SICRL_GPIO1_A 0x02000000
-#define SICRL_GPIO1_B 0x01000000
-#define SICRL_GPIO1_C 0x00800000
-#define SICRL_GPIO1_D 0x00400000
-#define SICRL_GPIO1_E 0x00200000
-#define SICRL_GPIO1_F 0x00180000
-#define SICRL_GPIO1_G 0x00040000
-#define SICRL_GPIO1_H 0x00020000
-#define SICRL_GPIO1_I 0x00010000
-#define SICRL_GPIO1_J 0x00008000
-#define SICRL_GPIO1_K 0x00004000
-#define SICRL_GPIO1_L 0x00003000
-#define SICRL_RES ~(SICRL_LDP_A | SICRL_USB0 | SICRL_USB1 | SICRL_UART \
-                       | SICRL_GPIO1_A | SICRL_GPIO1_B | SICRL_GPIO1_C \
-                       | SICRL_GPIO1_D | SICRL_GPIO1_E | SICRL_GPIO1_F \
-                       | SICRL_GPIO1_G | SICRL_GPIO1_H | SICRL_GPIO1_I \
-                       | SICRL_GPIO1_J | SICRL_GPIO1_K | SICRL_GPIO1_L )
-#elif defined (CONFIG_MPC8360)
-#define SICRL_LDP_A   0xC0000000
-#define SICRL_LCLK_1  0x10000000
-#define SICRL_LCLK_2  0x08000000
-#define SICRL_SRCID_A 0x03000000
-#define SICRL_IRQ_CKSTP_A 0x00C00000
-#define SICRL_RES     ~(SICRL_LDP_A | SICRL_LCLK_1 | SICRL_LCLK_2 | \
-                       SICRL_SRCID_A | SICRL_IRQ_CKSTP_A)
-#endif
-       u32 sicrh;              /* System General Purpose Register High */
-#define SICRH_DDR     0x80000000
-#if defined (CONFIG_MPC8349)
-#define SICRH_TSEC1_A 0x10000000
-#define SICRH_TSEC1_B 0x08000000
-#define SICRH_TSEC1_C 0x04000000
-#define SICRH_TSEC1_D 0x02000000
-#define SICRH_TSEC1_E 0x01000000
-#define SICRH_TSEC1_F 0x00800000
-#define SICRH_TSEC2_A 0x00400000
-#define SICRH_TSEC2_B 0x00200000
-#define SICRH_TSEC2_C 0x00100000
-#define SICRH_TSEC2_D 0x00080000
-#define SICRH_TSEC2_E 0x00040000
-#define SICRH_TSEC2_F 0x00020000
-#define SICRH_TSEC2_G 0x00010000
-#define SICRH_TSEC2_H 0x00008000
-#define SICRH_GPIO2_A 0x00004000
-#define SICRH_GPIO2_B 0x00002000
-#define SICRH_GPIO2_C 0x00001000
-#define SICRH_GPIO2_D 0x00000800
-#define SICRH_GPIO2_E 0x00000400
-#define SICRH_GPIO2_F 0x00000200
-#define SICRH_GPIO2_G 0x00000180
-#define SICRH_GPIO2_H 0x00000060
-#define SICRH_TSOBI1  0x00000002
-#define SICRH_TSOBI2  0x00000001
-#define SICRH_RES     ~(  SICRH_DDR | SICRH_TSEC1_A | SICRH_TSEC1_B \
-                       | SICRH_TSEC1_C | SICRH_TSEC1_D | SICRH_TSEC1_E \
-                       | SICRH_TSEC1_F | SICRH_TSEC2_A | SICRH_TSEC2_B \
-                       | SICRH_TSEC2_C | SICRH_TSEC2_D | SICRH_TSEC2_E \
-                       | SICRH_TSEC2_F | SICRH_TSEC2_G | SICRH_TSEC2_H \
-                       | SICRH_GPIO2_A | SICRH_GPIO2_B | SICRH_GPIO2_C \
-                       | SICRH_GPIO2_D | SICRH_GPIO2_E | SICRH_GPIO2_F \
-                       | SICRH_GPIO2_G | SICRH_GPIO2_H | SICRH_TSOBI1 \
-                       | SICRH_TSOBI2)
-#elif defined (CONFIG_MPC8360)
-#define SICRH_SECONDARY_DDR 0x40000000
-#define SICRH_SDDROE   0x02000000      /* SDDRIOE bit from reset configuration word high. */
-#define SICRH_UC1EOBI  0x00000004      /* UCC1 Ethernet Output Buffer Impedance. */
-#define SICRH_UC2E1OBI 0x00000002      /* UCC2 Ethernet pin option 1 Output Buffer Impedance. */
-#define SICRH_UC2E2OBI 0x00000001      /* UCC2 Ethernet pin option 2 Output Buffer Impedance. */
-#define SICRH_RES     ~(SICRH_DDR | SICRH_SECONDARY_DDR | SICRH_SDDROE | \
-                       SICRH_UC2E1OBI | SICRH_UC2E2OBI | SICRH_UC2E2OBI)
-#endif
-       u8 res6[0xE4];
+       u32 sicrl;              /* System I/O Configuration Register Low */
+       u32 sicrh;              /* System I/O Configuration Register High */
+       u8 res6[0x0C];
+       u32 ddrcdr;             /* DDR Control Driver Register */
+       u32 ddrdsr;             /* DDR Debug Status Register */
+       u8 res7[0xD0];
 } sysconf83xx_t;
 
 /*
@@ -196,11 +73,8 @@ typedef struct wdt83xx {
        u8 res0[4];
        u32 swcrr;              /* System watchdog control register */
        u32 swcnr;              /* System watchdog count register */
-#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field.
-#define SWCNR_RES  ~(SWCNR_SWCN)
        u8 res1[2];
        u16 swsrr;              /* System watchdog service register */
-#define SWSRR_WS 0x0000FFFF    /* Software Watchdog Service Field. */
        u8 res2[0xF0];
 } wdt83xx_t;
 
@@ -209,91 +83,46 @@ typedef struct wdt83xx {
  */
 typedef struct rtclk83xx {
        u32 cnr;                /* control register */
-#define CNR_CLEN 0x00000080    /* Clock Enable Control Bit  */
-#define CNR_CLIN 0x00000040    /* Input Clock Control Bit  */
-#define CNR_AIM         0x00000002     /* Alarm Interrupt Mask Bit  */
-#define CNR_SIM         0x00000001     /* Second Interrupt Mask Bit  */
-#define CNR_RES         ~(CNR_CLEN | CNR_CLIN | CNR_AIM | CNR_SIM)
        u32 ldr;                /* load register */
-#define LDR_CLDV 0xFFFFFFFF    /* Contains the 32-bit value to be
-                                * loaded in a 32-bit RTC counter.*/
        u32 psr;                /* prescale register */
-#define PSR_PRSC 0xFFFFFFFF    /*  RTC Prescaler bits. */
-       u32 ctr;                /* Counter value field register */
-#define CRT_CNTV 0xFFFFFFFF    /* RTC Counter value field. */
+       u32 ctr;                /* counter value field register */
        u32 evr;                /* event register */
-#define RTEVR_SIF  0x00000001  /* Second Interrupt Flag Bit  */
-#define RTEVR_AIF  0x00000002  /* Alarm Interrupt Flag Bit  */
-#define RTEVR_RES ~(RTEVR_SIF | RTEVR_AIF)
-#define PTEVR_PIF  0x00000001  /* Periodic interrupt flag bit. */
-#define PTEVR_RES ~(PTEVR_PIF)
        u32 alr;                /* alarm register */
        u8 res0[0xE8];
 } rtclk83xx_t;
 
 /*
- * Global timper module
+ * Global timer module
  */
-
 typedef struct gtm83xx {
-       u8 cfr1;                /* Timer1/2 Configuration  */
-#define CFR1_PCAS 0x80         /* Pair Cascade mode  */
-#define CFR1_BCM  0x40         /* Backward compatible mode  */
-#define CFR1_STP2 0x20         /* Stop timer  */
-#define CFR1_RST2 0x10         /* Reset timer  */
-#define CFR1_GM2  0x08         /* Gate mode for pin 2  */
-#define CFR1_GM1  0x04         /* Gate mode for pin 1  */
-#define CFR1_STP1 0x02         /* Stop timer  */
-#define CFR1_RST1 0x01         /* Reset timer  */
-#define CFR1_RES ~(CFR1_PCAS | CFR1_STP2 | CFR1_RST2 | CFR1_GM2 |\
-                CFR1_GM1 | CFR1_STP1 | CFR1_RST1)
+       u8 cfr1;                /* Timer1/2 Configuration */
        u8 res0[3];
-       u8 cfr2;                /* Timer3/4 Configuration  */
-#define CFR2_PCAS 0x80         /* Pair Cascade mode  */
-#define CFR2_SCAS 0x40         /* Super Cascade mode  */
-#define CFR2_STP4 0x20         /* Stop timer  */
-#define CFR2_RST4 0x10         /* Reset timer  */
-#define CFR2_GM4  0x08         /* Gate mode for pin 4  */
-#define CFR2_GM3  0x04         /* Gate mode for pin 3  */
-#define CFR2_STP3 0x02         /* Stop timer  */
-#define CFR2_RST3 0x01         /* Reset timer  */
+       u8 cfr2;                /* Timer3/4 Configuration */
        u8 res1[10];
-       u16 mdr1;               /* Timer1 Mode Register  */
-#define MDR_SPS         0xff00         /* Secondary Prescaler value  */
-#define MDR_CE  0x00c0         /* Capture edge and enable interrupt  */
-#define MDR_OM  0x0020         /* Output mode  */
-#define MDR_ORI         0x0010         /* Output reference interrupt enable  */
-#define MDR_FRR         0x0008         /* Free run/restart  */
-#define MDR_ICLK 0x0006                /* Input clock source for the timer  */
-#define MDR_GE  0x0001         /* Gate enable  */
-       u16 mdr2;               /* Timer2 Mode Register  */
-       u16 rfr1;               /* Timer1 Reference Register  */
-       u16 rfr2;               /* Timer2 Reference Register  */
-       u16 cpr1;               /* Timer1 Capture Register  */
-       u16 cpr2;               /* Timer2 Capture Register  */
-       u16 cnr1;               /* Timer1 Counter Register  */
-       u16 cnr2;               /* Timer2 Counter Register  */
-       u16 mdr3;               /* Timer3 Mode Register  */
-       u16 mdr4;               /* Timer4 Mode Register  */
-       u16 rfr3;               /* Timer3 Reference Register  */
-       u16 rfr4;               /* Timer4 Reference Register  */
-       u16 cpr3;               /* Timer3 Capture Register  */
-       u16 cpr4;               /* Timer4 Capture Register  */
-       u16 cnr3;               /* Timer3 Counter Register  */
-       u16 cnr4;               /* Timer4 Counter Register  */
-       u16 evr1;               /* Timer1 Event Register  */
-       u16 evr2;               /* Timer2 Event Register  */
-       u16 evr3;               /* Timer3 Event Register  */
-       u16 evr4;               /* Timer4 Event Register  */
-#define GTEVR_REF 0x0002       /* Output reference event  */
-#define GTEVR_CAP 0x0001       /* Counter Capture event   */
-#define GTEVR_RES ~(EVR_CAP|EVR_REF)
-       u16 psr1;               /* Timer1 Prescaler Register  */
-       u16 psr2;               /* Timer2 Prescaler Register  */
-       u16 psr3;               /* Timer3 Prescaler Register  */
-       u16 psr4;               /* Timer4 Prescaler Register  */
-#define GTPSR_PPS  0x00FF      /* Primary Prescaler Bits. */
-#define GTPSR_RES  ~(GTPSR_PPS)
+       u16 mdr1;               /* Timer1 Mode Register */
+       u16 mdr2;               /* Timer2 Mode Register */
+       u16 rfr1;               /* Timer1 Reference Register */
+       u16 rfr2;               /* Timer2 Reference Register */
+       u16 cpr1;               /* Timer1 Capture Register */
+       u16 cpr2;               /* Timer2 Capture Register */
+       u16 cnr1;               /* Timer1 Counter Register */
+       u16 cnr2;               /* Timer2 Counter Register */
+       u16 mdr3;               /* Timer3 Mode Register */
+       u16 mdr4;               /* Timer4 Mode Register */
+       u16 rfr3;               /* Timer3 Reference Register */
+       u16 rfr4;               /* Timer4 Reference Register */
+       u16 cpr3;               /* Timer3 Capture Register */
+       u16 cpr4;               /* Timer4 Capture Register */
+       u16 cnr3;               /* Timer3 Counter Register */
+       u16 cnr4;               /* Timer4 Counter Register */
+       u16 evr1;               /* Timer1 Event Register */
+       u16 evr2;               /* Timer2 Event Register */
+       u16 evr3;               /* Timer3 Event Register */
+       u16 evr4;               /* Timer4 Event Register */
+       u16 psr1;               /* Timer1 Prescaler Register */
+       u16 psr2;               /* Timer2 Prescaler Register */
+       u16 psr3;               /* Timer3 Prescaler Register */
+       u16 psr4;               /* Timer4 Prescaler Register */
        u8 res[0xC0];
 } gtm83xx_t;
 
@@ -301,188 +130,31 @@ typedef struct gtm83xx {
  * Integrated Programmable Interrupt Controller
  */
 typedef struct ipic83xx {
-       u32 sicfr;              /*  System Global Interrupt Configuration Register (SICFR)  */
-#define SICFR_HPI  0x7f000000  /*  Highest Priority Interrupt  */
-#define SICFR_MPSB 0x00400000  /*  Mixed interrupts Priority Scheme for group B  */
-#define SICFR_MPSA 0x00200000  /*  Mixed interrupts Priority Scheme for group A  */
-#define SICFR_IPSD 0x00080000  /*  Internal interrupts Priority Scheme for group D  */
-#define SICFR_IPSA 0x00010000  /*  Internal interrupts Priority Scheme for group A  */
-#define SICFR_HPIT 0x00000300  /*  HPI priority position IPIC output interrupt Type  */
-#define SICFR_RES ~(SICFR_HPI|SICFR_MPSB|SICFR_MPSA|SICFR_IPSD|SICFR_IPSA|SICFR_HPIT)
-       u32 sivcr;              /*  System Global Interrupt Vector Register (SIVCR)  */
-#define SICVR_IVECX 0xfc000000 /*  Interrupt vector (for CE compatibility purpose only not used in 8349 IPIC implementation)  */
-#define SICVR_IVEC  0x0000007f /*  Interrupt vector  */
-#define SICVR_RES ~(SICVR_IVECX|SICVR_IVEC)
-       u32 sipnr_h;            /*  System Internal Interrupt Pending Register - High (SIPNR_H)  */
-#if defined (CONFIG_MPC8349)
-#define SIIH_TSEC1TX 0x80000000 /*  TSEC1 Tx interrupt */
-#define SIIH_TSEC1RX 0x40000000 /*  TSEC1 Rx interrupt */
-#define SIIH_TSEC1ER 0x20000000 /*  TSEC1 Eror interrupt  */
-#define SIIH_TSEC2TX 0x10000000 /*  TSEC2 Tx interrupt */
-#define SIIH_TSEC2RX 0x08000000 /*  TSEC2 Rx interrupt */
-#define SIIH_TSEC2ER 0x04000000 /*  TSEC2 Eror interrupt  */
-#define SIIH_USB2DR  0x02000000 /*  USB2 DR interrupt  */
-#define SIIH_USB2MPH 0x01000000 /*  USB2 MPH interrupt */
-#endif
-#if defined (CONFIG_MPC8360)
-#define SIIH_H_QE_H   0x80000000       /*  QE high interrupt */
-#define SIIH_H_QE_L   0x40000000       /*  QE low interrupt */
-#endif
-#define SIIH_UART1   0x00000080 /*  UART1 interrupt  */
-#define SIIH_UART2   0x00000040 /*  UART2 interrupt  */
-#define SIIH_SEC     0x00000020 /*  SEC interrupt  */
-#define SIIH_I2C1    0x00000004 /*  I2C1 interrupt  */
-#define SIIH_I2C2    0x00000002 /*  I2C2 interrupt  */
-#if defined (CONFIG_MPC8349)
-#define SIIH_SPI     0x00000001 /*  SPI interrupt  */
-#define SIIH_RES       ~(SIIH_TSEC1TX | SIIH_TSEC1RX | SIIH_TSEC1ER \
-                       | SIIH_TSEC2TX | SIIH_TSEC2RX | SIIH_TSEC2ER \
-                       | SIIH_USB2DR | SIIH_USB2MPH | SIIH_UART1 \
-                       | SIIH_UART2 | SIIH_SEC | SIIH_I2C1 \
-                       | SIIH_I2C2 | SIIH_SPI)
-#endif
-#if defined (CONFIG_MPC8360)
-#define SIIH_RES       ~(SIIH_H_QE_H | SIIH_H_QE_L | SIIH_H_UART1 | \
-                       SIIH_H_UART2| SIIH_H_SEC  | SIIH_H_I2C1 |SIIH_H_I2C2)
-#endif
-       u32 sipnr_l;            /*  System Internal Interrupt Pending Register - Low (SIPNR_L)  */
-#define SIIL_RTCS  0x80000000  /*  RTC SECOND interrupt  */
-#define SIIL_PIT   0x40000000  /*  PIT interrupt  */
-#define SIIL_PCI1  0x20000000  /*  PCI1 interrupt  */
-#if defined (CONFIG_MPC8349)
-#define SIIL_PCI2  0x10000000  /*  PCI2 interrupt  */
-#endif
-#define SIIL_RTCA  0x08000000  /*  RTC ALARM interrupt  */
-#define SIIL_MU           0x04000000   /*  Message Unit interrupt  */
-#define SIIL_SBA   0x02000000  /*  System Bus Arbiter interrupt  */
-#define SIIL_DMA   0x01000000  /*  DMA interrupt  */
-#define SIIL_GTM4  0x00800000  /*  GTM4 interrupt  */
-#define SIIL_GTM8  0x00400000  /*  GTM8 interrupt  */
-#if defined (CONFIG_MPC8349)
-#define SIIL_GPIO1 0x00200000  /*  GPIO1 interrupt  */
-#define SIIL_GPIO2 0x00100000  /*  GPIO2 interrupt  */
-#endif
-#if defined (CONFIG_MPC8360)
-#define SIIL_QEP   0x00200000  /*  QE ports interrupt  */
-#define SIIL_SDDR  0x00100000  /*  SDDR interrupt  */
-#endif
-#define SIIL_DDR   0x00080000  /*  DDR interrupt  */
-#define SIIL_LBC   0x00040000  /*  LBC interrupt  */
-#define SIIL_GTM2  0x00020000  /*  GTM2 interrupt  */
-#define SIIL_GTM6  0x00010000  /*  GTM6 interrupt  */
-#define SIIL_PMC   0x00008000  /*  PMC interrupt  */
-#define SIIL_GTM3  0x00000800  /*  GTM3 interrupt  */
-#define SIIL_GTM7  0x00000400  /*  GTM7 interrupt  */
-#define SIIL_GTM1  0x00000020  /*  GTM1 interrupt  */
-#define SIIL_GTM5  0x00000010  /*  GTM5 interrupt  */
-#define SIIL_DPTC  0x00000001  /*  DPTC interrupt (!!! Invisible for user !!!)  */
-#if defined (CONFIG_MPC8349)
-#define SIIL_RES       ~(SIIL_RTCS | SIIL_PIT | SIIL_PCI1 | SIIL_PCI2 \
-                       | SIIL_RTCA | SIIL_MU | SIIL_SBA | SIIL_DMA \
-                       | SIIL_GTM4 | SIIL_GTM8 | SIIL_GPIO1 | SIIL_GPIO2 \
-                       | SIIL_DDR | SIIL_LBC | SIIL_GTM2 | SIIL_GTM6 \
-                       | SIIL_PMC |SIIL_GTM3 | SIIL_GTM7 | SIIL_GTM1 \
-                       | SIIL_GTM5 |SIIL_DPTC )
-#endif
-#if defined (CONFIG_MPC8360)
-#define SIIL_RES       ~(SIIL_RTCS  |SIIL_PIT  |SIIL_PCI1 |SIIL_RTCALR \
-                       |SIIL_MU |SIIL_SBA  |SIIL_DMA  |SIIL_GTM4 |SIIL_GTM8 \
-                       |SIIL_QEP | SIIL_SDDR| SIIL_DDR  |SIIL_LBC  |SIIL_GTM2 \
-                       |SIIL_GTM6 |SIIL_PMC  |SIIL_GTM3 |SIIL_GTM7 |SIIL_GTM1 \
-                       |SIIL_GTM5 )
-#endif
-       u32 siprr_a;            /*  System Internal Interrupt Group A Priority Register (PRR)  */
+       u32 sicfr;              /* System Global Interrupt Configuration Register */
+       u32 sivcr;              /* System Global Interrupt Vector Register */
+       u32 sipnr_h;            /* System Internal Interrupt Pending Register - High */
+       u32 sipnr_l;            /* System Internal Interrupt Pending Register - Low */
+       u32 siprr_a;            /* System Internal Interrupt Group A Priority Register */
        u8 res0[8];
-       u32 siprr_d;            /*  System Internal Interrupt Group D Priority Register (PRR)  */
-       u32 simsr_h;            /*  System Internal Interrupt Mask Register - High (SIIH)  */
-       u32 simsr_l;            /*  System Internal Interrupt Mask Register - Low (SIIL)  */
+       u32 siprr_d;            /* System Internal Interrupt Group D Priority Register */
+       u32 simsr_h;            /* System Internal Interrupt Mask Register - High */
+       u32 simsr_l;            /* System Internal Interrupt Mask Register - Low */
        u8 res1[4];
-       u32 sepnr;              /*  System External Interrupt Pending Register (SEI)  */
-       u32 smprr_a;            /*  System Mixed Interrupt Group A Priority Register (PRR)  */
-       u32 smprr_b;            /*  System Mixed Interrupt Group B Priority Register (PRR)  */
-#define PRR_0 0xe0000000       /* Priority Register, Position 0 programming */
-#define PRR_1 0x1c000000       /* Priority Register, Position 1 programming */
-#define PRR_2 0x03800000       /* Priority Register, Position 2 programming */
-#define PRR_3 0x00700000       /* Priority Register, Position 3 programming */
-#define PRR_4 0x0000e000       /* Priority Register, Position 4 programming */
-#define PRR_5 0x00001c00       /* Priority Register, Position 5 programming */
-#define PRR_6 0x00000380       /* Priority Register, Position 6 programming */
-#define PRR_7 0x00000070       /* Priority Register, Position 7 programming */
-#define PRR_RES ~(PRR_0|PRR_1|PRR_2|PRR_3|PRR_4|PRR_5|PRR_6|PRR_7)
-       u32 semsr;              /*  System External Interrupt Mask Register (SEI)  */
-#define SEI_IRQ0  0x80000000   /*  IRQ0 external interrupt  */
-#define SEI_IRQ1  0x40000000   /*  IRQ1 external interrupt  */
-#define SEI_IRQ2  0x20000000   /*  IRQ2 external interrupt  */
-#define SEI_IRQ3  0x10000000   /*  IRQ3 external interrupt  */
-#define SEI_IRQ4  0x08000000   /*  IRQ4 external interrupt  */
-#define SEI_IRQ5  0x04000000   /*  IRQ5 external interrupt  */
-#define SEI_IRQ6  0x02000000   /*  IRQ6 external interrupt  */
-#define SEI_IRQ7  0x01000000   /*  IRQ7 external interrupt  */
-#define SEI_SIRQ0 0x00008000   /*  SIRQ0 external interrupt  */
-#define SEI_RES                ~( SEI_IRQ0 | SEI_IRQ1 | SEI_IRQ2 | SEI_IRQ3 \
-                       | SEI_IRQ4 | SEI_IRQ5 | SEI_IRQ6 | SEI_IRQ7 \
-                       | SEI_SIRQ0)
-       u32 secnr;              /*  System External Interrupt Control Register (SECNR) */
-#define SECNR_MIXB0T 0xc0000000 /*  MIXB0 priority position IPIC output interrupt type */
-#define SECNR_MIXB1T 0x30000000 /*  MIXB1 priority position IPIC output interrupt type */
-#define SECNR_MIXA0T 0x00c00000 /*  MIXA0 priority position IPIC output interrupt type */
-#define SECNR_SYSA1T 0x00300000 /*  MIXA1 priority position IPIC output interrupt type */
-#define SECNR_EDI0   0x00008000 /*  IRQ0 external interrupt edge/level detect  */
-#define SECNR_EDI1   0x00004000 /*  IRQ1 external interrupt edge/level detect  */
-#define SECNR_EDI2   0x00002000 /*  IRQ2 external interrupt edge/level detect  */
-#define SECNR_EDI3   0x00001000 /*  IRQ3 external interrupt edge/level detect  */
-#define SECNR_EDI4   0x00000800 /*  IRQ4 external interrupt edge/level detect  */
-#define SECNR_EDI5   0x00000400 /*  IRQ5 external interrupt edge/level detect  */
-#define SECNR_EDI6   0x00000200 /*  IRQ6 external interrupt edge/level detect  */
-#define SECNR_EDI7   0x00000100 /*  IRQ7 external interrupt edge/level detect  */
-#define SECNR_RES      ~( SECNR_MIXB0T | SECNR_MIXB1T | SECNR_MIXA0T \
-                       | SECNR_SYSA1T | SECNR_EDI0 | SECNR_EDI1 \
-                       | SECNR_EDI2 | SECNR_EDI3 | SECNR_EDI4 \
-                       | SECNR_EDI5 | SECNR_EDI6 | SECNR_EDI7)
-       u32 sersr;              /*  System Error Status Register (SERR)  */
-       u32 sermr;              /*  System Error Mask Register (SERR)  */
-#define SERR_IRQ0 0x80000000   /*  IRQ0 MCP request  */
-#define SERR_WDT  0x40000000   /*  WDT MCP request  */
-#define SERR_SBA  0x20000000   /*  SBA MCP request  */
-#if defined (CONFIG_MPC8349)
-#define SERR_DDR  0x10000000   /*  DDR MCP request  */
-#define SERR_LBC  0x08000000   /*  LBC MCP request  */
-#define SERR_PCI1 0x04000000   /*  PCI1 MCP request  */
-#define SERR_PCI2 0x02000000   /*  PCI2 MCP request  */
-#endif
-#if defined (CONFIG_MPC8360)
-#define SERR_CIEE 0x10000000   /*  CIEE MCP request  */
-#define SERR_CMEE 0x08000000   /*  CMEEMCP request  */
-#define SERR_PCI  0x04000000   /*  PCI MCP request  */
-#endif
-#define SERR_MU          0x01000000    /*  MU MCP request  */
-#define SERR_RNC  0x00010000   /*  MU MCP request (!!! Non-visible for users !!!)  */
-#if defined (CONFIG_MPC8349)
-#define SERR_RES       ~( SERR_IRQ0 | SERR_WDT | SERR_SBA | SERR_DDR \
-                       |SERR_LBC | SERR_PCI1 | SERR_PCI2 | SERR_MU \
-                       |SERR_RNC )
-#elif defined (CONFIG_MPC8360)
-#define SERR_RES       ~( SERR_IRQ0|SERR_WDT |SERR_SBA |SERR_CIEE\
-                       |SERR_CMEE|SERR_PCI|SERR_MU)
-#endif
-       u32 sercr;              /*  System Error Control Register  (SERCR)  */
-#define SERCR_MCPR 0x00000001  /*  MCP Route  */
-#define SERCR_RES ~(SERCR_MCPR)
+       u32 sepnr;              /* System External Interrupt Pending Register */
+       u32 smprr_a;            /* System Mixed Interrupt Group A Priority Register */
+       u32 smprr_b;            /* System Mixed Interrupt Group B Priority Register */
+       u32 semsr;              /* System External Interrupt Mask Register */
+       u32 secnr;              /* System External Interrupt Control Register */
+       u32 sersr;              /* System Error Status Register */
+       u32 sermr;              /* System Error Mask Register */
+       u32 sercr;              /* System Error Control Register */
        u8 res2[4];
-       u32 sifcr_h;            /*  System Internal Interrupt Force Register - High (SIIH)  */
-       u32 sifcr_l;            /*  System Internal Interrupt Force Register - Low (SIIL)  */
-       u32 sefcr;              /*  System External Interrupt Force Register (SEI)  */
-       u32 serfr;              /*  System Error Force Register (SERR)  */
+       u32 sifcr_h;            /* System Internal Interrupt Force Register - High */
+       u32 sifcr_l;            /* System Internal Interrupt Force Register - Low */
+       u32 sefcr;              /* System External Interrupt Force Register */
+       u32 serfr;              /* System Error Force Register */
        u32 scvcr;              /* System Critical Interrupt Vector Register */
-#define SCVCR_CVECX    0xFC000000      /* Backward (MPC8260) compatible
-                                          critical interrupt vector. */
-#define SCVCR_CVEC     0x0000007F      /* Critical interrupt vector */
-#define SCVCR_RES      ~(SCVCR_CVECX|SCVCR_CVEC)
        u32 smvcr;              /* System Management Interrupt Vector Register */
-#define SMVCR_CVECX    0xFC000000      /* Backward (MPC8260) compatible
-                                          critical interrupt vector. */
-#define SMVCR_CVEC     0x0000007F      /* Critical interrupt vector */
-#define SMVCR_RES      ~(SMVCR_CVECX|SMVCR_CVEC)
        u8 res3[0x98];
 } ipic83xx_t;
 
@@ -491,43 +163,14 @@ typedef struct ipic83xx {
  */
 typedef struct arbiter83xx {
        u32 acr;                /* Arbiter Configuration Register */
-#define ACR_COREDIS    0x10000000      /* Core disable. */
-#define ACR_COREDIS_SHIFT              (31-7)
-#define ACR_PIPE_DEP   0x00070000      /* Pipeline depth (number of outstanding transactions). */
-#define ACR_PIPE_DEP_SHIFT             (31-15)
-#define ACR_PCI_RPTCNT 0x00007000      /* PCI repeat count. */
-#define ACR_PCI_RPTCNT_SHIFT           (31-19)
-#define ACR_RPTCNT     0x00000700      /* Repeat count. */
-#define ACR_RPTCNT_SHIFT               (31-23)
-#define ACR_APARK      0x00000030      /* Address parking. */
-#define ACR_APARK_SHIFT                        (31-27)
-#define ACR_PARKM         0x0000000F   /* Parking master. */
-#define ACR_PARKM_SHIFT                        (31-31)
-#define ACR_RES ~(ACR_COREDIS|ACR_PIPE_DEP|ACR_PCI_RPTCNT|ACR_RPTCNT|ACR_APARK|ACR_PARKM)
        u32 atr;                /* Arbiter Timers Register */
-#define ATR_DTO 0x00FF0000     /* Data time out. */
-#define ATR_ATO 0x000000FF     /* Address time out. */
-#define ATR_RES ~(ATR_DTO|ATR_ATO)
        u8 res[4];
-       u32 aer;                /* Arbiter Event Register (AE) */
-       u32 aidr;               /* Arbiter Interrupt Definition Register (AE) */
-       u32 amr;                /* Arbiter Mask Register (AE) */
+       u32 aer;                /* Arbiter Event Register */
+       u32 aidr;               /* Arbiter Interrupt Definition Register */
+       u32 amr;                /* Arbiter Mask Register */
        u32 aeatr;              /* Arbiter Event Attributes Register */
-#define AEATR_EVENT   0x07000000       /* Event type. */
-#define AEATR_MSTR_ID 0x001F0000       /* Master Id. */
-#define AEATR_TBST    0x00000800       /* Transfer burst. */
-#define AEATR_TSIZE   0x00000700       /* Transfer Size. */
-#define AEATR_TTYPE      0x0000001F    /* Transfer Type. */
-#define AEATR_RES ~(AEATR_EVENT|AEATR_MSTR_ID|AEATR_TBST|AEATR_TSIZE|AEATR_TTYPE)
        u32 aeadr;              /* Arbiter Event Address Register */
-       u32 aerr;               /* Arbiter Event Response Register (AE) */
-#define AE_ETEA 0x00000020     /* Transfer error. */
-#define AE_RES_ 0x00000010     /* Reserved transfer type. */
-#define AE_ECW 0x00000008      /* External control word transfer type. */
-#define AE_AO  0x00000004      /* Address Only transfer type. */
-#define AE_DTO 0x00000002      /* Data time out. */
-#define AE_ATO 0x00000001      /* Address time out. */
-#define AE_RSRV ~(AE_ETEA|AE_RES_|AE_ECW|AE_AO|AE_DTO|AE_ATO)
+       u32 aerr;               /* Arbiter Event Response Register */
        u8 res1[0xDC];
 } arbiter83xx_t;
 
@@ -535,184 +178,24 @@ typedef struct arbiter83xx {
  * Reset Module
  */
 typedef struct reset83xx {
-       u32 rcwl;               /* RCWL Register  */
-#define RCWL_LBIUCM  0x80000000 /* LBIUCM  */
-#define RCWL_LBIUCM_SHIFT    31
-#define RCWL_DDRCM   0x40000000 /* DDRCM  */
-#define RCWL_DDRCM_SHIFT     30
-#if defined (CONFIG_MPC8349)
-#define RCWL_SVCOD   0x30000000 /* SVCOD  */
-#endif
-#define RCWL_SPMF    0x0f000000 /* SPMF         */
-#define RCWL_SPMF_SHIFT             24
-#define RCWL_COREPLL 0x007F0000 /* COREPLL  */
-#define RCWL_COREPLL_SHIFT   16
-#define RCWL_CEVCOD  0x000000C0 /* CEVCOD  */
-#define RCWL_CEPDF   0x00000020 /* CEPDF  */
-#define RCWL_CEPDF_SHIFT      5
-#define RCWL_CEPMF   0x0000001F /* CEPMF  */
-#define RCWL_CEPMF_SHIFT      0
-#if defined (CONFIG_MPC8349)
-#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SVCOD|RCWL_SPMF|RCWL_COREPLL|RCWL_CEVCOD|RCWL_CEPDF|RCWL_CEPMF)
-#elif defined (CONFIG_MPC8360)
-#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SPMF|RCWL_COREPLL|RCWL_CEPDF|RCWL_CEPMF)
-#endif
-       u32 rcwh;               /* RCHL Register  */
-#define RCWH_PCIHOST 0x80000000 /* PCIHOST  */
-#define RCWH_PCIHOST_SHIFT   31
-#if defined (CONFIG_MPC8349)
-#define RCWH_PCI64   0x40000000 /* PCI64  */
-#define RCWH_PCI1ARB 0x20000000 /* PCI1ARB  */
-#define RCWH_PCI2ARB 0x10000000 /* PCI2ARB  */
-#elif defined (CONFIG_MPC8360)
-#define RCWH_PCIARB   0x20000000       /* PCI internal arbiter mode. */
-#define RCWH_PCICKDRV 0x10000000       /* PCI clock output drive. */
-#endif
-#define RCWH_COREDIS 0x08000000 /* COREDIS  */
-#define RCWH_BMS     0x04000000 /* BMS */
-#define RCWH_BOOTSEQ 0x03000000 /* BOOTSEQ  */
-#define RCWH_SWEN    0x00800000 /* SWEN         */
-#define RCWH_ROMLOC  0x00700000 /* ROMLOC  */
-#if defined (CONFIG_MPC8349)
-#define RCWH_TSEC1M  0x0000c000 /* TSEC1M  */
-#define RCWH_TSEC2M  0x00003000 /* TSEC2M  */
-#define RCWH_TPR     0x00000100 /* TPR */
-#elif defined (CONFIG_MPC8360)
-#define RCWH_SDDRIOE  0x00000010       /* Secondary DDR IO Enable.  */
-#endif
-#define RCWH_TLE     0x00000008 /* TLE */
-#define RCWH_LALE    0x00000004 /* LALE         */
-#if defined (CONFIG_MPC8349)
-#define RCWH_RES       ~(RCWH_PCIHOST | RCWH_PCI64 | RCWH_PCI1ARB \
-                       | RCWH_PCI2ARB | RCWH_COREDIS | RCWH_BMS \
-                       | RCWH_BOOTSEQ | RCWH_SWEN | RCWH_ROMLOC \
-                       | RCWH_TSEC1M | RCWH_TSEC2M | RCWH_TPR \
-                       | RCWH_TLE | RCWH_LALE)
-#elif defined (CONFIG_MPC8360)
-#define RCWH_RES       ~(RCWH_PCIHOST|RCWH_PCIARB|RCWH_PCICKDRV \
-                       |RCWH_COREDIS|RCWH_BMS|RCWH_BOOTSEQ|RCWH_SWEN \
-                       |RCWH_SDDRIOE |RCWH_TLE)
-#endif
+       u32 rcwl;               /* Reset Configuration Word Low Register */
+       u32 rcwh;               /* Reset Configuration Word High Register */
        u8 res0[8];
-       u32 rsr;                /* Reset status Register  */
-#define RSR_RSTSRC 0xE0000000  /* Reset source  */
-#define RSR_RSTSRC_SHIFT   29
-#define RSR_BSF           0x00010000   /* Boot seq. fail  */
-#define RSR_BSF_SHIFT     16
-#define RSR_SWSR   0x00002000  /* software soft reset  */
-#define RSR_SWSR_SHIFT    13
-#define RSR_SWHR   0x00001000  /* software hard reset  */
-#define RSR_SWHR_SHIFT    12
-#define RSR_JHRS   0x00000200  /* jtag hreset  */
-#define RSR_JHRS_SHIFT     9
-#define RSR_JSRS   0x00000100  /* jtag sreset status  */
-#define RSR_JSRS_SHIFT     8
-#define RSR_CSHR   0x00000010  /* checkstop reset status  */
-#define RSR_CSHR_SHIFT     4
-#define RSR_SWRS   0x00000008  /* software watchdog reset status  */
-#define RSR_SWRS_SHIFT     3
-#define RSR_BMRS   0x00000004  /* bus monitop reset status  */
-#define RSR_BMRS_SHIFT     2
-#define RSR_SRS           0x00000002   /* soft reset status  */
-#define RSR_SRS_SHIFT      1
-#define RSR_HRS           0x00000001   /* hard reset status  */
-#define RSR_HRS_SHIFT      0
-#define RSR_RES ~(RSR_RSTSRC | RSR_BSF | RSR_SWSR | RSR_SWHR | RSR_JHRS | RSR_JSRS | RSR_CSHR | RSR_SWRS | RSR_BMRS | RSR_SRS | RSR_HRS)
-       u32 rmr;                /* Reset mode Register  */
-#define RMR_CSRE   0x00000001  /* checkstop reset enable  */
-#define RMR_CSRE_SHIFT     0
-#define RMR_RES ~(RMR_CSRE)
-       u32 rpr;                /* Reset protection Register  */
-       u32 rcr;                /* Reset Control Register  */
-#define RCR_SWHR 0x00000002    /* software hard reset  */
-#define RCR_SWSR 0x00000001    /* software soft reset  */
-#define RCR_RES ~(RCR_SWHR | RCR_SWSR)
-       u32 rcer;               /* Reset Control Enable Register  */
-#define RCER_CRE 0x00000001    /* software hard reset  */
-#define RCER_RES ~(RCER_CRE)
+       u32 rsr;                /* Reset Status Register */
+       u32 rmr;                /* Reset Mode Register */
+       u32 rpr;                /* Reset protection Register */
+       u32 rcr;                /* Reset Control Register */
+       u32 rcer;               /* Reset Control Enable Register */
        u8 res1[0xDC];
 } reset83xx_t;
 
+/*
+ * Clock Module
+ */
 typedef struct clk83xx {
-       u32 spmr;               /* system PLL mode Register  */
-#define SPMR_LBIUCM  0x80000000 /* LBIUCM  */
-#define SPMR_DDRCM   0x40000000 /* DDRCM  */
-#if defined (CONFIG_MPC8349)
-#define SPMR_SVCOD   0x30000000 /* SVCOD  */
-#endif
-#define SPMR_SPMF    0x0F000000 /* SPMF         */
-#define SPMR_CKID    0x00800000 /* CKID         */
-#define SPMR_CKID_SHIFT 23
-#define SPMR_COREPLL 0x007F0000 /* COREPLL  */
-#define SPMR_CEVCOD  0x000000C0 /* CEVCOD  */
-#define SPMR_CEPDF   0x00000020 /* CEPDF  */
-#define SPMR_CEPMF   0x0000001F /* CEPMF  */
-#if defined (CONFIG_MPC8349)
-#define SPMR_RES       ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SVCOD \
-                       | SPMR_SPMF | SPMR_CKID | SPMR_COREPLL \
-                       | SPMR_CEVCOD | SPMR_CEPDF | SPMR_CEPMF)
-#elif defined (CONFIG_MPC8360)
-#define SPMR_RES       ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SPMF \
-                       | SPMR_CKID | SPMR_COREPLL | SPMR_CEVCOD \
-                       | SPMR_CEPDF | SPMR_CEPMF)
-#endif
-       u32 occr;               /* output clock control Register  */
-#define OCCR_PCICOE0 0x80000000 /* PCICOE0  */
-#define OCCR_PCICOE1 0x40000000 /* PCICOE1  */
-#define OCCR_PCICOE2 0x20000000 /* PCICOE2  */
-#if defined (CONFIG_MPC8349)
-#define OCCR_PCICOE3 0x10000000 /* PCICOE3  */
-#define OCCR_PCICOE4 0x08000000 /* PCICOE4  */
-#define OCCR_PCICOE5 0x04000000 /* PCICOE5  */
-#define OCCR_PCICOE6 0x02000000 /* PCICOE6  */
-#define OCCR_PCICOE7 0x01000000 /* PCICOE7  */
-#endif
-#define OCCR_PCICD0  0x00800000 /* PCICD0  */
-#define OCCR_PCICD1  0x00400000 /* PCICD1  */
-#define OCCR_PCICD2  0x00200000 /* PCICD2  */
-#if defined (CONFIG_MPC8349)
-#define OCCR_PCICD3  0x00100000 /* PCICD3  */
-#define OCCR_PCICD4  0x00080000 /* PCICD4  */
-#define OCCR_PCICD5  0x00040000 /* PCICD5  */
-#define OCCR_PCICD6  0x00020000 /* PCICD6  */
-#define OCCR_PCICD7  0x00010000 /* PCICD7  */
-#define OCCR_PCI1CR  0x00000002 /* PCI1CR  */
-#define OCCR_PCI2CR  0x00000001 /* PCI2CR  */
-#define OCCR_RES       ~(OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2 \
-                       | OCCR_PCICOE3 | OCCR_PCICOE4 | OCCR_PCICOE5 \
-                       | OCCR_PCICOE6 | OCCR_PCICOE7 | OCCR_PCICD0 \
-                       | OCCR_PCICD1 | OCCR_PCICD2  | OCCR_PCICD3 \
-                       | OCCR_PCICD4  | OCCR_PCICD5 | OCCR_PCICD6  \
-                       | OCCR_PCICD7  | OCCR_PCI1CR  | OCCR_PCI2CR )
-#endif
-#if defined (CONFIG_MPC8360)
-#define OCCR_PCICR     0x00000002      /* PCI clock rate  */
-#define OCCR_RES       ~(OCCR_PCICOE0|OCCR_PCICOE1|OCCR_PCICOE2 \
-                       |OCCR_PCICD0|OCCR_PCICD1|OCCR_PCICD2|OCCR_PCICR )
-#endif
-       u32 sccr;               /* system clock control Register  */
-#if defined (CONFIG_MPC8349)
-#define SCCR_TSEC1CM  0xc0000000       /* TSEC1CM  */
-#define SCCR_TSEC1CM_SHIFT 30
-#define SCCR_TSEC2CM  0x30000000       /* TSEC2CM  */
-#define SCCR_TSEC2CM_SHIFT 28
-#endif
-#define SCCR_ENCCM    0x03000000       /* ENCCM  */
-#define SCCR_ENCCM_SHIFT 24
-#if defined (CONFIG_MPC8349)
-#define SCCR_USBMPHCM 0x00c00000       /* USBMPHCM  */
-#define SCCR_USBMPHCM_SHIFT 22
-#define SCCR_USBDRCM  0x00300000       /* USBDRCM  */
-#define SCCR_USBDRCM_SHIFT 20
-#endif
-#define SCCR_PCICM    0x00010000       /* PCICM  */
-#if defined (CONFIG_MPC8349)
-#define SCCR_RES       ~( SCCR_TSEC1CM | SCCR_TSEC2CM | SCCR_ENCCM \
-                       | SCCR_USBMPHCM | SCCR_USBDRCM | SCCR_PCICM)
-#endif
-#if defined (CONFIG_MPC8360)
-#define SCCR_RES       ~(SCCR_ENCCM | SCCR_PCICM)
-#endif
+       u32 spmr;               /* system PLL mode Register */
+       u32 occr;               /* output clock control Register */
+       u32 sccr;               /* system clock control Register */
        u8 res0[0xF4];
 } clk83xx_t;
 
@@ -720,27 +203,14 @@ typedef struct clk83xx {
  * Power Management Control Module
  */
 typedef struct pmc83xx {
-       u32 pmccr;              /* PMC Configuration Register  */
-#define PMCCR_SLPEN 0x00000001 /* System Low Power Enable  */
-#define PMCCR_DLPEN 0x00000002 /* DDR SDRAM Low Power Enable  */
-#if defined (CONFIG_MPC8360)
-#define PMCCR_SDLPEN 0x00000004 /* Secondary DDR SDRAM Low Power Enable         */
-#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN | PMCCR_SDLPEN)
-#elif defined (CONFIG_MPC8349)
-#define PMCCR_RES    ~(PMCCR_SLPEN | PMCCR_DLPEN)
-#endif
-       u32 pmcer;              /* PMC Event Register  */
-#define PMCER_PMCI  0x00000001 /* PMC Interrupt  */
-#define PMCER_RES ~(PMCER_PMCI)
-       u32 pmcmr;              /* PMC Mask Register  */
-#define PMCMR_PMCIE 0x0001     /* PMC Interrupt Enable  */
-#define PMCMR_RES ~(PMCMR_PMCIE)
+       u32 pmccr;              /* PMC Configuration Register */
+       u32 pmcer;              /* PMC Event Register */
+       u32 pmcmr;              /* PMC Mask Register */
        u8 res0[0xF4];
 } pmc83xx_t;
 
-#if defined (CONFIG_MPC8349)
 /*
- * general purpose I/O module
+ * General purpose I/O module
  */
 typedef struct gpio83xx {
        u32 dir;                /* direction register */
@@ -751,124 +221,20 @@ typedef struct gpio83xx {
        u32 icr;                /* external interrupt control register */
        u8 res0[0xE8];
 } gpio83xx_t;
-#endif
 
-#if defined (CONFIG_MPC8360)
 /*
  * QE Ports Interrupts Registers
  */
 typedef struct qepi83xx {
        u8 res0[0xC];
        u32 qepier;             /* QE Ports Interrupt Event Register */
-#define QEPIER_PA15 0x80000000
-#define QEPIER_PA16 0x40000000
-#define QEPIER_PA29 0x20000000
-#define QEPIER_PA30 0x10000000
-#define QEPIER_PB3  0x08000000
-#define QEPIER_PB5  0x04000000
-#define QEPIER_PB12 0x02000000
-#define QEPIER_PB13 0x01000000
-#define QEPIER_PB26 0x00800000
-#define QEPIER_PB27 0x00400000
-#define QEPIER_PC27 0x00200000
-#define QEPIER_PC28 0x00100000
-#define QEPIER_PC29 0x00080000
-#define QEPIER_PD12 0x00040000
-#define QEPIER_PD13 0x00020000
-#define QEPIER_PD16 0x00010000
-#define QEPIER_PD17 0x00008000
-#define QEPIER_PD26 0x00004000
-#define QEPIER_PD27 0x00002000
-#define QEPIER_PE12 0x00001000
-#define QEPIER_PE13 0x00000800
-#define QEPIER_PE24 0x00000400
-#define QEPIER_PE25 0x00000200
-#define QEPIER_PE26 0x00000100
-#define QEPIER_PE27 0x00000080
-#define QEPIER_PE31 0x00000040
-#define QEPIER_PF20 0x00000020
-#define QEPIER_PG31 0x00000010
-#define QEPIER_RES ~(QEPIER_PA15|QEPIER_PA16|QEPIER_PA29|QEPIER_PA30|QEPIER_PB3 \
-                  |QEPIER_PB5|QEPIER_PB12|QEPIER_PB13|QEPIER_PB26|QEPIER_PB27 \
-                  |QEPIER_PC27|QEPIER_PC28|QEPIER_PC29|QEPIER_PD12|QEPIER_PD13 \
-                  |QEPIER_PD16|QEPIER_PD17|QEPIER_PD26|QEPIER_PD27|QEPIER_PE12 \
-                  |QEPIER_PE13|QEPIER_PE24|QEPIER_PE25|QEPIER_PE26|QEPIER_PE27 \
-                  |QEPIER_PE31|QEPIER_PF20|QEPIER_PG31)
        u32 qepimr;             /* QE Ports Interrupt Mask Register */
-#define QEPIMR_PA15 0x80000000
-#define QEPIMR_PA16 0x40000000
-#define QEPIMR_PA29 0x20000000
-#define QEPIMR_PA30 0x10000000
-#define QEPIMR_PB3  0x08000000
-#define QEPIMR_PB5  0x04000000
-#define QEPIMR_PB12 0x02000000
-#define QEPIMR_PB13 0x01000000
-#define QEPIMR_PB26 0x00800000
-#define QEPIMR_PB27 0x00400000
-#define QEPIMR_PC27 0x00200000
-#define QEPIMR_PC28 0x00100000
-#define QEPIMR_PC29 0x00080000
-#define QEPIMR_PD12 0x00040000
-#define QEPIMR_PD13 0x00020000
-#define QEPIMR_PD16 0x00010000
-#define QEPIMR_PD17 0x00008000
-#define QEPIMR_PD26 0x00004000
-#define QEPIMR_PD27 0x00002000
-#define QEPIMR_PE12 0x00001000
-#define QEPIMR_PE13 0x00000800
-#define QEPIMR_PE24 0x00000400
-#define QEPIMR_PE25 0x00000200
-#define QEPIMR_PE26 0x00000100
-#define QEPIMR_PE27 0x00000080
-#define QEPIMR_PE31 0x00000040
-#define QEPIMR_PF20 0x00000020
-#define QEPIMR_PG31 0x00000010
-#define QEPIMR_RES ~(QEPIMR_PA15|QEPIMR_PA16|QEPIMR_PA29|QEPIMR_PA30|QEPIMR_PB3 \
-                  |QEPIMR_PB5|QEPIMR_PB12|QEPIMR_PB13|QEPIMR_PB26|QEPIMR_PB27 \
-                  |QEPIMR_PC27|QEPIMR_PC28|QEPIMR_PC29|QEPIMR_PD12|QEPIMR_PD13 \
-                  |QEPIMR_PD16|QEPIMR_PD17|QEPIMR_PD26|QEPIMR_PD27|QEPIMR_PE12 \
-                  |QEPIMR_PE13|QEPIMR_PE24|QEPIMR_PE25|QEPIMR_PE26|QEPIMR_PE27 \
-                  |QEPIMR_PE31|QEPIMR_PF20|QEPIMR_PG31)
        u32 qepicr;             /* QE Ports Interrupt Control Register */
-#define QEPICR_PA15 0x80000000
-#define QEPICR_PA16 0x40000000
-#define QEPICR_PA29 0x20000000
-#define QEPICR_PA30 0x10000000
-#define QEPICR_PB3  0x08000000
-#define QEPICR_PB5  0x04000000
-#define QEPICR_PB12 0x02000000
-#define QEPICR_PB13 0x01000000
-#define QEPICR_PB26 0x00800000
-#define QEPICR_PB27 0x00400000
-#define QEPICR_PC27 0x00200000
-#define QEPICR_PC28 0x00100000
-#define QEPICR_PC29 0x00080000
-#define QEPICR_PD12 0x00040000
-#define QEPICR_PD13 0x00020000
-#define QEPICR_PD16 0x00010000
-#define QEPICR_PD17 0x00008000
-#define QEPICR_PD26 0x00004000
-#define QEPICR_PD27 0x00002000
-#define QEPICR_PE12 0x00001000
-#define QEPICR_PE13 0x00000800
-#define QEPICR_PE24 0x00000400
-#define QEPICR_PE25 0x00000200
-#define QEPICR_PE26 0x00000100
-#define QEPICR_PE27 0x00000080
-#define QEPICR_PE31 0x00000040
-#define QEPICR_PF20 0x00000020
-#define QEPICR_PG31 0x00000010
-#define QEPICR_RES ~(QEPICR_PA15|QEPICR_PA16|QEPICR_PA29|QEPICR_PA30|QEPICR_PB3 \
-                  |QEPICR_PB5|QEPICR_PB12|QEPICR_PB13|QEPICR_PB26|QEPICR_PB27 \
-                  |QEPICR_PC27|QEPICR_PC28|QEPICR_PC29|QEPICR_PD12|QEPICR_PD13 \
-                  |QEPICR_PD16|QEPICR_PD17|QEPICR_PD26|QEPICR_PD27|QEPICR_PE12 \
-                  |QEPICR_PE13|QEPICR_PE24|QEPICR_PE25|QEPICR_PE26|QEPICR_PE27 \
-                  |QEPICR_PE31|QEPICR_PF20|QEPICR_PG31)
        u8 res1[0xE8];
 } qepi83xx_t;
 
 /*
- * general purpose I/O module
+ * QE Parallel I/O Ports
  */
 typedef struct gpio_n {
        u32 podr;               /* Open Drain Register */
@@ -879,238 +245,93 @@ typedef struct gpio_n {
        u32 ppar2;              /* Pin Assignment Register 2 */
 } gpio_n_t;
 
-typedef struct gpio83xx {
+typedef struct qegpio83xx {
        gpio_n_t ioport[0x7];
        u8 res0[0x358];
-} gpio83xx_t;
+} qepio83xx_t;
 
 /*
  * QE Secondary Bus Access Windows
  */
-
 typedef struct qesba83xx {
        u32 lbmcsar;            /* Local bus memory controller start address */
-#define LBMCSAR_SA     0x000FFFFF      /* 20 most-significant bits of the start address */
-#define LBMCSAR_RES    ~(LBMCSAR_SA)
        u32 sdmcsar;            /* Secondary DDR memory controller start address */
-#define SDMCSAR_SA     0x000FFFFF      /* 20 most-significant bits of the start address */
-#define SDMCSAR_RES    ~(SDMCSAR_SA)
        u8 res0[0x38];
        u32 lbmcear;            /* Local bus memory controller end address */
-#define LBMCEAR_EA     0x000FFFFF      /* 20 most-significant bits of the end address */
-#define LBMCEAR_RES    ~(LBMCEAR_EA)
        u32 sdmcear;            /* Secondary DDR memory controller end address */
-#define SDMCEAR_EA     0x000FFFFF      /* 20 most-significant bits of the end address */
-#define SDMCEAR_RES    ~(SDMCEAR_EA)
        u8 res1[0x38];
-       u32 lbmcar;             /* Local bus memory controller attributes  */
-#define LBMCAR_WEN     0x00000001      /* Forward transactions to the QE local bus */
-#define LBMCAR_RES     ~(LBMCAR_WEN)
+       u32 lbmcar;             /* Local bus memory controller attributes */
        u32 sdmcar;             /* Secondary DDR memory controller attributes */
-#define SDMCAR_WEN     0x00000001      /* Forward transactions to the second DDR bus */
-#define SDMCAR_RES     ~(SDMCAR_WEN)
-       u8 res2[0x778];
+       u8 res2[0x378];
 } qesba83xx_t;
-#endif
 
 /*
  * DDR Memory Controller Memory Map
  */
 typedef struct ddr_cs_bnds {
        u32 csbnds;
-#define CSBNDS_SA 0x00FF0000
-#define CSBNDS_SA_SHIFT           8
-#define CSBNDS_EA 0x000000FF
-#define CSBNDS_EA_SHIFT          24
        u8 res0[4];
 } ddr_cs_bnds_t;
 
 typedef struct ddr83xx {
-       ddr_cs_bnds_t csbnds[4];            /**< Chip Select x Memory Bounds */
+       ddr_cs_bnds_t csbnds[4];/* Chip Select x Memory Bounds */
        u8 res0[0x60];
-       u32 cs_config[4];       /**< Chip Select x Configuration */
-#define CSCONFIG_EN        0x80000000
-#define CSCONFIG_AP        0x00800000
-#define CSCONFIG_ROW_BIT    0x00000700
-#define CSCONFIG_ROW_BIT_12 0x00000000
-#define CSCONFIG_ROW_BIT_13 0x00000100
-#define CSCONFIG_ROW_BIT_14 0x00000200
-#define CSCONFIG_COL_BIT    0x00000007
-#define CSCONFIG_COL_BIT_8  0x00000000
-#define CSCONFIG_COL_BIT_9  0x00000001
-#define CSCONFIG_COL_BIT_10 0x00000002
-#define CSCONFIG_COL_BIT_11 0x00000003
-       u8 res1[0x78];
-       u32 timing_cfg_1;       /**< SDRAM Timing Configuration 1 */
-#define TIMING_CFG1_PRETOACT 0x70000000
-#define TIMING_CFG1_PRETOACT_SHIFT   28
-#define TIMING_CFG1_ACTTOPRE 0x0F000000
-#define TIMING_CFG1_ACTTOPRE_SHIFT   24
-#define TIMING_CFG1_ACTTORW  0x00700000
-#define TIMING_CFG1_ACTTORW_SHIFT    20
-#define TIMING_CFG1_CASLAT   0x00070000
-#define TIMING_CFG1_CASLAT_SHIFT     16
-#define TIMING_CFG1_REFREC   0x0000F000
-#define TIMING_CFG1_REFREC_SHIFT     12
-#define TIMING_CFG1_WRREC    0x00000700
-#define TIMING_CFG1_WRREC_SHIFT              8
-#define TIMING_CFG1_ACTTOACT 0x00000070
-#define TIMING_CFG1_ACTTOACT_SHIFT    4
-#define TIMING_CFG1_WRTORD   0x00000007
-#define TIMING_CFG1_WRTORD_SHIFT      0
-#define TIMING_CFG1_CASLAT_20 0x00030000       /* CAS latency = 2.0 */
-#define TIMING_CFG1_CASLAT_25 0x00040000       /* CAS latency = 2.5 */
-
-       u32 timing_cfg_2;       /**< SDRAM Timing Configuration 2 */
-#define TIMING_CFG2_CPO                  0x0F000000
-#define TIMING_CFG2_CPO_SHIFT            24
-#define TIMING_CFG2_ACSM         0x00080000
-#define TIMING_CFG2_WR_DATA_DELAY 0x00001C00
-#define TIMING_CFG2_WR_DATA_DELAY_SHIFT          10
-#define TIMING_CFG2_CPO_DEF      0x00000000    /* default (= CASLAT + 1) */
-
-       u32 sdram_cfg;          /**< SDRAM Control Configuration */
-#define SDRAM_CFG_MEM_EN     0x80000000
-#define SDRAM_CFG_SREN      0x40000000
-#define SDRAM_CFG_ECC_EN     0x20000000
-#define SDRAM_CFG_RD_EN             0x10000000
-#define SDRAM_CFG_SDRAM_TYPE 0x03000000
-#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
-
+       u32 cs_config[4];       /* Chip Select x Configuration */
+       u8 res1[0x70];
+       u32 timing_cfg_3;       /* SDRAM Timing Configuration 3 */
+       u32 timing_cfg_0;       /* SDRAM Timing Configuration 0 */
+       u32 timing_cfg_1;       /* SDRAM Timing Configuration 1 */
+       u32 timing_cfg_2;       /* SDRAM Timing Configuration 2 */
+       u32 sdram_cfg;          /* SDRAM Control Configuration */
+       u32 sdram_cfg2;         /* SDRAM Control Configuration 2 */
+       u32 sdram_mode;         /* SDRAM Mode Configuration */
+       u32 sdram_mode2;        /* SDRAM Mode Configuration 2 */
+       u32 sdram_md_cntl;      /* SDRAM Mode Control */
+       u32 sdram_interval;     /* SDRAM Interval Configuration */
+       u32 ddr_data_init;      /* SDRAM Data Initialization */
        u8 res2[4];
-       u32 sdram_mode;         /**< SDRAM Mode Configuration */
-#define SDRAM_MODE_ESD 0xFFFF0000
-#define SDRAM_MODE_ESD_SHIFT   16
-#define SDRAM_MODE_SD  0x0000FFFF
-#define SDRAM_MODE_SD_SHIFT    0
-#define DDR_MODE_EXT_MODEREG   0x4000  /* select extended mode reg */
-#define DDR_MODE_EXT_OPMODE    0x3FF8  /* operating mode, mask */
-#define DDR_MODE_EXT_OP_NORMAL 0x0000  /* normal operation */
-#define DDR_MODE_QFC           0x0004  /* QFC / compatibility, mask */
-#define DDR_MODE_QFC_COMP      0x0000  /* compatible to older SDRAMs */
-#define DDR_MODE_WEAK          0x0002  /* weak drivers */
-#define DDR_MODE_DLL_DIS       0x0001  /* disable DLL */
-#define DDR_MODE_CASLAT                0x0070  /* CAS latency, mask */
-#define DDR_MODE_CASLAT_15     0x0010  /* CAS latency 1.5 */
-#define DDR_MODE_CASLAT_20     0x0020  /* CAS latency 2 */
-#define DDR_MODE_CASLAT_25     0x0060  /* CAS latency 2.5 */
-#define DDR_MODE_CASLAT_30     0x0030  /* CAS latency 3 */
-#define DDR_MODE_BTYPE_SEQ     0x0000  /* sequential burst */
-#define DDR_MODE_BTYPE_ILVD    0x0008  /* interleaved burst */
-#define DDR_MODE_BLEN_2                0x0001  /* burst length 2 */
-#define DDR_MODE_BLEN_4                0x0002  /* burst length 4 */
-#define DDR_REFINT_166MHZ_7US  1302    /* exact value for 7.8125 Âµs */
-#define DDR_BSTOPRE    256     /* use 256 cycles as a starting point */
-#define DDR_MODE_MODEREG       0x0000  /* select mode register */
-
-       u8 res3[8];
-       u32 sdram_interval;     /**< SDRAM Interval Configuration */
-#define SDRAM_INTERVAL_REFINT  0x3FFF0000
-#define SDRAM_INTERVAL_REFINT_SHIFT    16
-#define SDRAM_INTERVAL_BSTOPRE 0x00003FFF
-#define SDRAM_INTERVAL_BSTOPRE_SHIFT   0
-       u8 res9[8];
-       u32 sdram_clk_cntl;
-#define DDR_SDRAM_CLK_CNTL_SS_EN               0x80000000
-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_025      0x01000000
-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05       0x02000000
-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_075      0x03000000
-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_1                0x04000000
-
-       u8 res4[0xCCC];
-       u32 data_err_inject_hi; /**< Memory Data Path Error Injection Mask High */
-       u32 data_err_inject_lo; /**< Memory Data Path Error Injection Mask Low */
-       u32 ecc_err_inject;     /**< Memory Data Path Error Injection Mask ECC */
-#define ECC_ERR_INJECT_EMB                     (0x80000000>>22)        /* ECC Mirror Byte */
-#define ECC_ERR_INJECT_EIEN                    (0x80000000>>23)        /* Error Injection Enable */
-#define ECC_ERR_INJECT_EEIM                    (0xff000000>>24)        /* ECC Erroe Injection Enable */
-#define ECC_ERR_INJECT_EEIM_SHIFT              0
-       u8 res5[0x14];
-       u32 capture_data_hi;    /**< Memory Data Path Read Capture High */
-       u32 capture_data_lo;    /**< Memory Data Path Read Capture Low */
-       u32 capture_ecc;        /**< Memory Data Path Read Capture ECC */
-#define CAPTURE_ECC_ECE                                (0xff000000>>24)
-#define CAPTURE_ECC_ECE_SHIFT                  0
+       u32 sdram_clk_cntl;     /* SDRAM Clock Control */
+       u8 res3[0x14];
+       u32 ddr_init_addr;      /* DDR training initialization address */
+       u32 ddr_init_ext_addr;  /* DDR training initialization extended address */
+       u8 res4[0xAA8];
+       u32 ddr_ip_rev1;        /* DDR IP block revision 1 */
+       u32 ddr_ip_rev2;        /* DDR IP block revision 2 */
+       u8 res5[0x200];
+       u32 data_err_inject_hi; /* Memory Data Path Error Injection Mask High */
+       u32 data_err_inject_lo; /* Memory Data Path Error Injection Mask Low */
+       u32 ecc_err_inject;     /* Memory Data Path Error Injection Mask ECC */
        u8 res6[0x14];
-       u32 err_detect;         /**< Memory Error Detect */
-#define ECC_ERROR_DETECT_MME                   (0x80000000>>0) /* Multiple Memory Errors */
-#define ECC_ERROR_DETECT_MBE                   (0x80000000>>28)        /* Multiple-Bit Error */
-#define ECC_ERROR_DETECT_SBE                   (0x80000000>>29)        /* Single-Bit ECC Error Pickup */
-#define ECC_ERROR_DETECT_MSE                   (0x80000000>>31)        /* Memory Select Error */
-       u32 err_disable;        /**< Memory Error Disable */
-#define ECC_ERROR_DISABLE_MBED                 (0x80000000>>28)        /* Multiple-Bit ECC Error Disable */
-#define ECC_ERROR_DISABLE_SBED                 (0x80000000>>29)        /* Sinle-Bit ECC Error disable */
-#define ECC_ERROR_DISABLE_MSED                 (0x80000000>>31)        /* Memory Select Error Disable */
-#define ECC_ERROR_ENABLE                       ~(ECC_ERROR_DISABLE_MSED|ECC_ERROR_DISABLE_SBED|ECC_ERROR_DISABLE_MBED)
-       u32 err_int_en;         /**< Memory Error Interrupt Enable */
-#define ECC_ERR_INT_EN_MBEE                    (0x80000000>>28)        /* Multiple-Bit ECC Error Interrupt Enable */
-#define ECC_ERR_INT_EN_SBEE                    (0x80000000>>29)        /* Single-Bit ECC Error Interrupt Enable */
-#define ECC_ERR_INT_EN_MSEE                    (0x80000000>>31)        /* Memory Select Error Interrupt Enable */
-#define ECC_ERR_INT_DISABLE                    ~(ECC_ERR_INT_EN_MBEE|ECC_ERR_INT_EN_SBEE|ECC_ERR_INT_EN_MSEE)
-       u32 capture_attributes; /**< Memory Error Attributes Capture */
-#define ECC_CAPT_ATTR_BNUM                     (0xe0000000>>1) /* Data Beat Num */
-#define ECC_CAPT_ATTR_BNUM_SHIFT               28
-#define ECC_CAPT_ATTR_TSIZ                     (0xc0000000>>6) /* Transaction Size */
-#define ECC_CAPT_ATTR_TSIZ_FOUR_DW             0
-#define ECC_CAPT_ATTR_TSIZ_ONE_DW              1
-#define ECC_CAPT_ATTR_TSIZ_TWO_DW              2
-#define ECC_CAPT_ATTR_TSIZ_THREE_DW            3
-#define ECC_CAPT_ATTR_TSIZ_SHIFT               24
-#define ECC_CAPT_ATTR_TSRC                     (0xf8000000>>11)        /* Transaction Source */
-#define ECC_CAPT_ATTR_TSRC_E300_CORE_DT                0x0
-#define ECC_CAPT_ATTR_TSRC_E300_CORE_IF                0x2
-#define ECC_CAPT_ATTR_TSRC_TSEC1               0x4
-#define ECC_CAPT_ATTR_TSRC_TSEC2               0x5
-#define ECC_CAPT_ATTR_TSRC_USB                 (0x06|0x07)
-#define ECC_CAPT_ATTR_TSRC_ENCRYPT             0x8
-#define ECC_CAPT_ATTR_TSRC_I2C                 0x9
-#define ECC_CAPT_ATTR_TSRC_JTAG                        0xA
-#define ECC_CAPT_ATTR_TSRC_PCI1                        0xD
-#define ECC_CAPT_ATTR_TSRC_PCI2                        0xE
-#define ECC_CAPT_ATTR_TSRC_DMA                 0xF
-#define ECC_CAPT_ATTR_TSRC_SHIFT               16
-#define ECC_CAPT_ATTR_TTYP                     (0xe0000000>>18)        /* Transaction Type */
-#define ECC_CAPT_ATTR_TTYP_WRITE               0x1
-#define ECC_CAPT_ATTR_TTYP_READ                        0x2
-#define ECC_CAPT_ATTR_TTYP_R_M_W               0x3
-#define ECC_CAPT_ATTR_TTYP_SHIFT               12
-#define ECC_CAPT_ATTR_VLD                      (0x80000000>>31)        /* Valid */
-       u32 capture_address;    /**< Memory Error Address Capture */
-       u32 capture_ext_address;/**< Memory Error Extended Address Capture */
-       u32 err_sbe;            /**< Memory Single-Bit ECC Error Management */
-#define ECC_ERROR_MAN_SBET                     (0xff000000>>8) /* Single-Bit Error Threshold 0..255 */
-#define ECC_ERROR_MAN_SBET_SHIFT               16
-#define ECC_ERROR_MAN_SBEC                     (0xff000000>>24)        /* Single Bit Error Counter 0..255 */
-#define ECC_ERROR_MAN_SBEC_SHIFT               0
-       u8 res7[0xA4];
+       u32 capture_data_hi;    /* Memory Data Path Read Capture High */
+       u32 capture_data_lo;    /* Memory Data Path Read Capture Low */
+       u32 capture_ecc;        /* Memory Data Path Read Capture ECC */
+       u8 res7[0x14];
+       u32 err_detect;         /* Memory Error Detect */
+       u32 err_disable;        /* Memory Error Disable */
+       u32 err_int_en;         /* Memory Error Interrupt Enable */
+       u32 capture_attributes; /* Memory Error Attributes Capture */
+       u32 capture_address;    /* Memory Error Address Capture */
+       u32 capture_ext_address;/* Memory Error Extended Address Capture */
+       u32 err_sbe;            /* Memory Single-Bit ECC Error Management */
+       u8 res8[0xA4];
        u32 debug_reg;
-       u8 res8[0xFC];
+       u8 res9[0xFC];
 } ddr83xx_t;
 
-/*
- * I2C1 Controller
- */
-
 /*
  * DUART
  */
 typedef struct duart83xx {
-       u8 urbr_ulcr_udlb; /**< combined register for URBR, UTHR and UDLB */
-       u8 uier_udmb;      /**< combined register for UIER and UDMB */
-       u8 uiir_ufcr_uafr; /**< combined register for UIIR, UFCR and UAFR */
-       u8 ulcr;        /**< line control register */
-       u8 umcr;        /**< MODEM control register */
-       u8 ulsr;        /**< line status register */
-       u8 umsr;        /**< MODEM status register */
-       u8 uscr;        /**< scratch register */
+       u8 urbr_ulcr_udlb;      /* combined register for URBR, UTHR and UDLB */
+       u8 uier_udmb;           /* combined register for UIER and UDMB */
+       u8 uiir_ufcr_uafr;      /* combined register for UIIR, UFCR and UAFR */
+       u8 ulcr;                /* line control register */
+       u8 umcr;                /* MODEM control register */
+       u8 ulsr;                /* line status register */
+       u8 umsr;                /* MODEM status register */
+       u8 uscr;                /* scratch register */
        u8 res0[8];
-       u8 udsr;        /**< DMA status register */
+       u8 udsr;                /* DMA status register */
        u8 res1[3];
        u8 res2[0xEC];
 } duart83xx_t;
@@ -1119,75 +340,52 @@ typedef struct duart83xx {
  * Local Bus Controller Registers
  */
 typedef struct lbus_bank {
-       u32 br;             /**< Base Register  */
-       u32 or;             /**< Base Register  */
+       u32 br;                 /* Base Register */
+       u32 or;                 /* Option Register */
 } lbus_bank_t;
 
 typedef struct lbus83xx {
        lbus_bank_t bank[8];
        u8 res0[0x28];
-       u32 mar;                /**< UPM Address Register */
+       u32 mar;                /* UPM Address Register */
        u8 res1[0x4];
-       u32 mamr;               /**< UPMA Mode Register */
-       u32 mbmr;               /**< UPMB Mode Register */
-       u32 mcmr;               /**< UPMC Mode Register */
+       u32 mamr;               /* UPMA Mode Register */
+       u32 mbmr;               /* UPMB Mode Register */
+       u32 mcmr;               /* UPMC Mode Register */
        u8 res2[0x8];
-       u32 mrtpr;              /**< Memory Refresh Timer Prescaler Register */
-       u32 mdr;                /**< UPM Data Register */
+       u32 mrtpr;              /* Memory Refresh Timer Prescaler Register */
+       u32 mdr;                /* UPM Data Register */
        u8 res3[0x8];
-       u32 lsdmr;              /**< SDRAM Mode Register */
+       u32 lsdmr;              /* SDRAM Mode Register */
        u8 res4[0x8];
-       u32 lurt;               /**< UPM Refresh Timer */
-       u32 lsrt;               /**< SDRAM Refresh Timer */
+       u32 lurt;               /* UPM Refresh Timer */
+       u32 lsrt;               /* SDRAM Refresh Timer */
        u8 res5[0x8];
-       u32 ltesr;              /**< Transfer Error Status Register */
-       u32 ltedr;              /**< Transfer Error Disable Register */
-       u32 lteir;              /**< Transfer Error Interrupt Register */
-       u32 lteatr;             /**< Transfer Error Attributes Register */
-       u32 ltear;              /**< Transfer Error Address Register */
+       u32 ltesr;              /* Transfer Error Status Register */
+       u32 ltedr;              /* Transfer Error Disable Register */
+       u32 lteir;              /* Transfer Error Interrupt Register */
+       u32 lteatr;             /* Transfer Error Attributes Register */
+       u32 ltear;              /* Transfer Error Address Register */
        u8 res6[0xC];
-       u32 lbcr;               /**< Configuration Register */
-#define LBCR_LDIS  0x80000000
-#define LBCR_LDIS_SHIFT           31
-#define LBCR_BCTLC 0x00C00000
-#define LBCR_BCTLC_SHIFT   22
-#define LBCR_LPBSE 0x00020000
-#define LBCR_LPBSE_SHIFT   17
-#define LBCR_EPAR  0x00010000
-#define LBCR_EPAR_SHIFT           16
-#define LBCR_BMT   0x0000FF00
-#define LBCR_BMT_SHIFT     8
-       u32 lcrr;               /**< Clock Ratio Register */
-#define LCRR_DBYP    0x80000000
-#define LCRR_DBYP_SHIFT             31
-#define LCRR_BUFCMDC 0x30000000
-#define LCRR_BUFCMDC_SHIFT   28
-#define LCRR_ECL     0x03000000
-#define LCRR_ECL_SHIFT      24
-#define LCRR_EADC    0x00030000
-#define LCRR_EADC_SHIFT             16
-#define LCRR_CLKDIV  0x0000000F
-#define LCRR_CLKDIV_SHIFT     0
-
+       u32 lbcr;               /* Configuration Register */
+       u32 lcrr;               /* Clock Ratio Register */
        u8 res7[0x28];
        u8 res8[0xF00];
 } lbus83xx_t;
 
-#if defined (CONFIG_MPC8349)
 /*
  * Serial Peripheral Interface
  */
 typedef struct spi83xx {
-       u32 mode;     /**< mode register  */
-       u32 event;    /**< event register */
-       u32 mask;     /**< mask register  */
-       u32 com;      /**< command register */
+       u32 mode;               /* mode register */
+       u32 event;              /* event register */
+       u32 mask;               /* mask register */
+       u32 com;                /* command register */
        u8 res0[0x10];
-       u32 tx;       /**< transmit register */
-       u32 rx;       /**< receive register */
-       u8 res1[0xD8];
+       u32 tx;                 /* transmit register */
+       u32 rx;                 /* receive register */
+       u8 res1[0xFD8];
 } spi83xx_t;
-#endif
 
 /*
  * DMA/Messaging Unit
@@ -1197,21 +395,17 @@ typedef struct dma83xx {
        u32 omisr;              /* 0x30 Outbound message interrupt status register */
        u32 omimr;              /* 0x34 Outbound message interrupt mask register */
        u32 res1[0x6];          /* 0x38-0x49 reserved */
-
        u32 imr0;               /* 0x50 Inbound message register 0 */
        u32 imr1;               /* 0x54 Inbound message register 1 */
        u32 omr0;               /* 0x58 Outbound message register 0 */
        u32 omr1;               /* 0x5C Outbound message register 1 */
-
        u32 odr;                /* 0x60 Outbound doorbell register */
        u32 res2;               /* 0x64-0x67 reserved */
        u32 idr;                /* 0x68 Inbound doorbell register */
        u32 res3[0x5];          /* 0x6C-0x79 reserved */
-
        u32 imisr;              /* 0x80 Inbound message interrupt status register */
        u32 imimr;              /* 0x84 Inbound message interrupt mask register */
        u32 res4[0x1E];         /* 0x88-0x99 reserved */
-
        u32 dmamr0;             /* 0x100 DMA 0 mode register */
        u32 dmasr0;             /* 0x104 DMA 0 status register */
        u32 dmacdar0;           /* 0x108 DMA 0 current descriptor address register */
@@ -1223,7 +417,6 @@ typedef struct dma83xx {
        u32 dmabcr0;            /* 0x120 DMA 0 byte count register */
        u32 dmandar0;           /* 0x124 DMA 0 next descriptor address register */
        u32 res8[0x16];         /* 0x128-0x179 reserved */
-
        u32 dmamr1;             /* 0x180 DMA 1 mode register */
        u32 dmasr1;             /* 0x184 DMA 1 status register */
        u32 dmacdar1;           /* 0x188 DMA 1 current descriptor address register */
@@ -1235,7 +428,6 @@ typedef struct dma83xx {
        u32 dmabcr1;            /* 0x1A0 DMA 1 byte count register */
        u32 dmandar1;           /* 0x1A4 DMA 1 next descriptor address register */
        u32 res12[0x16];        /* 0x1A8-0x199 reserved */
-
        u32 dmamr2;             /* 0x200 DMA 2 mode register */
        u32 dmasr2;             /* 0x204 DMA 2 status register */
        u32 dmacdar2;           /* 0x208 DMA 2 current descriptor address register */
@@ -1247,7 +439,6 @@ typedef struct dma83xx {
        u32 dmabcr2;            /* 0x220 DMA 2 byte count register */
        u32 dmandar2;           /* 0x224 DMA 2 next descriptor address register */
        u32 res16[0x16];        /* 0x228-0x279 reserved */
-
        u32 dmamr3;             /* 0x280 DMA 3 mode register */
        u32 dmasr3;             /* 0x284 DMA 3 status register */
        u32 dmacdar3;           /* 0x288 DMA 3 current descriptor address register */
@@ -1258,39 +449,15 @@ typedef struct dma83xx {
        u32 res19;              /* 0x29C reserved */
        u32 dmabcr3;            /* 0x2A0 DMA 3 byte count register */
        u32 dmandar3;           /* 0x2A4 DMA 3 next descriptor address register */
-
        u32 dmagsr;             /* 0x2A8 DMA general status register */
        u32 res20[0x15];        /* 0x2AC-0x2FF reserved */
 } dma83xx_t;
 
-/* DMAMRn bits */
-#define DMA_CHANNEL_START                      (0x00000001)    /* Bit - DMAMRn CS */
-#define DMA_CHANNEL_TRANSFER_MODE_DIRECT       (0x00000004)    /* Bit - DMAMRn CTM */
-#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN     (0x00001000)    /* Bit - DMAMRn SAHE */
-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B     (0x00000000)    /* 2Bit- DMAMRn SAHTS 1byte */
-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B     (0x00004000)    /* 2Bit- DMAMRn SAHTS 2bytes */
-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B     (0x00008000)    /* 2Bit- DMAMRn SAHTS 4bytes */
-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B     (0x0000c000)    /* 2Bit- DMAMRn SAHTS 8bytes */
-#define DMA_CHANNEL_SNOOP                      (0x00010000)    /* Bit - DMAMRn DMSEN */
-
-/* DMASRn bits */
-#define DMA_CHANNEL_BUSY                       (0x00000004)    /* Bit - DMASRn CB */
-#define DMA_CHANNEL_TRANSFER_ERROR             (0x00000080)    /* Bit - DMASRn TE */
-
 /*
  * PCI Software Configuration Registers
  */
 typedef struct pciconf83xx {
        u32 config_address;
-#define PCI_CONFIG_ADDRESS_EN  0x80000000
-#define PCI_CONFIG_ADDRESS_BN_SHIFT    16
-#define PCI_CONFIG_ADDRESS_BN_MASK     0x00ff0000
-#define PCI_CONFIG_ADDRESS_DN_SHIFT    11
-#define PCI_CONFIG_ADDRESS_DN_MASK     0x0000f800
-#define PCI_CONFIG_ADDRESS_FN_SHIFT    8
-#define PCI_CONFIG_ADDRESS_FN_MASK     0x00000700
-#define PCI_CONFIG_ADDRESS_RN_SHIFT    0
-#define PCI_CONFIG_ADDRESS_RN_MASK     0x000000fc
        u32 config_data;
        u32 int_ack;
        u8 res[116];
@@ -1313,34 +480,6 @@ typedef struct pci_outbound_window {
  */
 typedef struct ios83xx {
        pot83xx_t pot[6];
-#define POTAR_TA_MASK  0x000fffff
-#define POBAR_BA_MASK  0x000fffff
-#define POCMR_EN       0x80000000
-#define POCMR_IO       0x40000000      /* 0--memory space 1--I/O space */
-#define POCMR_SE       0x20000000      /* streaming enable */
-#define POCMR_DST      0x10000000      /* 0--PCI1 1--PCI2 */
-#define POCMR_CM_MASK  0x000fffff
-#define POCMR_CM_4G    0x00000000
-#define POCMR_CM_2G    0x00080000
-#define POCMR_CM_1G    0x000C0000
-#define POCMR_CM_512M  0x000E0000
-#define POCMR_CM_256M  0x000F0000
-#define POCMR_CM_128M  0x000F8000
-#define POCMR_CM_64M   0x000FC000
-#define POCMR_CM_32M   0x000FE000
-#define POCMR_CM_16M   0x000FF000
-#define POCMR_CM_8M    0x000FF800
-#define POCMR_CM_4M    0x000FFC00
-#define POCMR_CM_2M    0x000FFE00
-#define POCMR_CM_1M    0x000FFF00
-#define POCMR_CM_512K  0x000FFF80
-#define POCMR_CM_256K  0x000FFFC0
-#define POCMR_CM_128K  0x000FFFE0
-#define POCMR_CM_64K   0x000FFFF0
-#define POCMR_CM_32K   0x000FFFF8
-#define POCMR_CM_16K   0x000FFFFC
-#define POCMR_CM_8K    0x000FFFFE
-#define POCMR_CM_4K    0x000FFFFF
        u8 res0[0x60];
        u32 pmcr;
        u8 res1[4];
@@ -1353,74 +492,13 @@ typedef struct ios83xx {
  */
 typedef struct pcictrl83xx {
        u32 esr;
-#define ESR_MERR       0x80000000
-#define ESR_APAR       0x00000400
-#define ESR_PCISERR    0x00000200
-#define ESR_MPERR      0x00000100
-#define ESR_TPERR      0x00000080
-#define ESR_NORSP      0x00000040
-#define ESR_TABT       0x00000020
        u32 ecdr;
-#define ECDR_APAR      0x00000400
-#define ECDR_PCISERR   0x00000200
-#define ECDR_MPERR     0x00000100
-#define ECDR_TPERR     0x00000080
-#define ECDR_NORSP     0x00000040
-#define ECDR_TABT      0x00000020
        u32 eer;
-#define EER_APAR       0x00000400
-#define EER_PCISERR    0x00000200
-#define EER_MPERR      0x00000100
-#define EER_TPERR      0x00000080
-#define EER_NORSP      0x00000040
-#define EER_TABT       0x00000020
        u32 eatcr;
-#define EATCR_ERRTYPR_MASK     0x70000000
-#define EATCR_ERRTYPR_APR      0x00000000      /* address parity error */
-#define EATCR_ERRTYPR_WDPR     0x10000000      /* write data parity error */
-#define EATCR_ERRTYPR_RDPR     0x20000000      /* read data parity error */
-#define EATCR_ERRTYPR_MA       0x30000000      /* master abort */
-#define EATCR_ERRTYPR_TA       0x40000000      /* target abort */
-#define EATCR_ERRTYPR_SE       0x50000000      /* system error indication received */
-#define EATCR_ERRTYPR_PEA      0x60000000      /* parity error indication received on a read */
-#define EATCR_ERRTYPR_PEW      0x70000000      /* parity error indication received on a write */
-#define EATCR_BN_MASK          0x0f000000      /* beat number */
-#define EATCR_BN_1st           0x00000000
-#define EATCR_BN_2ed           0x01000000
-#define EATCR_BN_3rd           0x02000000
-#define EATCR_BN_4th           0x03000000
-#define EATCR_BN_5th           0x0400000
-#define EATCR_BN_6th           0x05000000
-#define EATCR_BN_7th           0x06000000
-#define EATCR_BN_8th           0x07000000
-#define EATCR_BN_9th           0x08000000
-#define EATCR_TS_MASK          0x00300000      /* transaction size */
-#define EATCR_TS_4             0x00000000
-#define EATCR_TS_1             0x00100000
-#define EATCR_TS_2             0x00200000
-#define EATCR_TS_3             0x00300000
-#define EATCR_ES_MASK          0x000f0000      /* error source */
-#define EATCR_ES_EM            0x00000000      /* external master */
-#define EATCR_ES_DMA           0x00050000
-#define EATCR_CMD_MASK         0x0000f000
-#if defined (CONFIG_MPC8349)
-#define EATCR_HBE_MASK         0x00000f00      /* PCI high byte enable */
-#endif
-#define EATCR_BE_MASK          0x000000f0      /* PCI byte enable */
-#if defined (CONFIG_MPC8349)
-#define EATCR_HPB              0x00000004      /* high parity bit */
-#endif
-#define EATCR_PB               0x00000002      /* parity bit */
-#define EATCR_VI               0x00000001      /* error information valid */
        u32 eacr;
        u32 eeacr;
-#if defined (CONFIG_MPC8349)
        u32 edlcr;
        u32 edhcr;
-#elif defined (CONFIG_MPC8360)
-       u32 edcr;               /* was edlcr */
-       u8 res_edcr[0x4];
-#endif
        u32 gcr;
        u32 ecr;
        u32 gsr;
@@ -1443,41 +521,8 @@ typedef struct pcictrl83xx {
        u8 res6[4];
        u32 piwar0;
        u8 res7[132];
-#define PITAR_TA_MASK          0x000fffff
-#define PIBAR_MASK             0xffffffff
-#define PIEBAR_EBA_MASK                0x000fffff
-#define PIWAR_EN               0x80000000
-#define PIWAR_PF               0x20000000
-#define PIWAR_RTT_MASK         0x000f0000
-#define PIWAR_RTT_NO_SNOOP     0x00040000
-#define PIWAR_RTT_SNOOP                0x00050000
-#define PIWAR_WTT_MASK         0x0000f000
-#define PIWAR_WTT_NO_SNOOP     0x00004000
-#define PIWAR_WTT_SNOOP                0x00005000
-#define PIWAR_IWS_MASK 0x0000003F
-#define PIWAR_IWS_4K   0x0000000B
-#define PIWAR_IWS_8K   0x0000000C
-#define PIWAR_IWS_16K  0x0000000D
-#define PIWAR_IWS_32K  0x0000000E
-#define PIWAR_IWS_64K  0x0000000F
-#define PIWAR_IWS_128K 0x00000010
-#define PIWAR_IWS_256K 0x00000011
-#define PIWAR_IWS_512K 0x00000012
-#define PIWAR_IWS_1M   0x00000013
-#define PIWAR_IWS_2M   0x00000014
-#define PIWAR_IWS_4M   0x00000015
-#define PIWAR_IWS_8M   0x00000016
-#define PIWAR_IWS_16M  0x00000017
-#define PIWAR_IWS_32M  0x00000018
-#define PIWAR_IWS_64M  0x00000019
-#define PIWAR_IWS_128M 0x0000001A
-#define PIWAR_IWS_256M 0x0000001B
-#define PIWAR_IWS_512M 0x0000001C
-#define PIWAR_IWS_1G   0x0000001D
-#define PIWAR_IWS_2G   0x0000001E
 } pcictrl83xx_t;
 
-#if defined (CONFIG_MPC8349)
 /*
  * USB
  */
@@ -1491,7 +536,6 @@ typedef struct usb83xx {
 typedef struct tsec83xx {
        u8 fixme[0x1000];
 } tsec83xx_t;
-#endif
 
 /*
  * Security
@@ -1500,581 +544,119 @@ typedef struct security83xx {
        u8 fixme[0x10000];
 } security83xx_t;
 
-#if defined (CONFIG_MPC8360)
-/*
- * iram
- */
-typedef struct iram83xx {
-       u32 iadd;               /* I-RAM address register */
-       u32 idata;              /* I-RAM data register */
-       u8 res0[0x78];
-} iram83xx_t;
-
-/*
- * Interrupt Controller
- */
-typedef struct irq83xx {
-       u32 cicr;               /* QE system interrupt configuration */
-       u32 civec;              /* QE system interrupt vector register */
-       u32 cripnr;             /* QE RISC interrupt pending register */
-       u32 cipnr;              /*  QE system interrupt pending register */
-       u32 cipxcc;             /* QE interrupt priority register */
-       u32 cipycc;             /* QE interrupt priority register */
-       u32 cipwcc;             /* QE interrupt priority register */
-       u32 cipzcc;             /* QE interrupt priority register */
-       u32 cimr;               /* QE system interrupt mask register */
-       u32 crimr;              /* QE RISC interrupt mask register */
-       u32 cicnr;              /* QE system interrupt control register */
-       u8 res0[0x4];
-       u32 ciprta;             /* QE system interrupt priority register for RISC tasks A */
-       u32 ciprtb;             /* QE system interrupt priority register for RISC tasks B */
-       u8 res1[0x4];
-       u32 cricr;              /* QE system RISC interrupt control */
-       u8 res2[0x20];
-       u32 chivec;             /* QE high system interrupt vector */
-       u8 res3[0x1C];
-} irq83xx_t;
-
-/*
- * Communications Processor
- */
-typedef struct cp83xx {
-       u32 cecr;               /* QE command register */
-       u32 ceccr;              /* QE controller configuration register */
-       u32 cecdr;              /* QE command data register */
-       u8 res0[0xA];
-       u16 ceter;              /* QE timer event register */
-       u8 res1[0x2];
-       u16 cetmr;              /* QE timers mask register */
-       u32 cetscr;             /* QE time-stamp timer control register */
-       u32 cetsr1;             /* QE time-stamp register 1 */
-       u32 cetsr2;             /* QE time-stamp register 2 */
-       u8 res2[0x8];
-       u32 cevter;             /* QE virtual tasks event register */
-       u32 cevtmr;             /* QE virtual tasks mask register */
-       u16 cercr;              /* QE RAM control register */
-       u8 res3[0x2];
-       u8 res4[0x24];
-       u16 ceexe1;             /* QE external request 1 event register */
-       u8 res5[0x2];
-       u16 ceexm1;             /* QE external request 1 mask register */
-       u8 res6[0x2];
-       u16 ceexe2;             /* QE external request 2 event register */
-       u8 res7[0x2];
-       u16 ceexm2;             /* QE external request 2 mask register */
-       u8 res8[0x2];
-       u16 ceexe3;             /* QE external request 3 event register */
-       u8 res9[0x2];
-       u16 ceexm3;             /* QE external request 3 mask register */
-       u8 res10[0x2];
-       u16 ceexe4;             /* QE external request 4 event register */
-       u8 res11[0x2];
-       u16 ceexm4;             /* QE external request 4 mask register */
-       u8 res12[0x2];
-       u8 res13[0x280];
-} cp83xx_t;
-
-/*
- * QE Multiplexer
- */
-
-typedef struct qmx83xx {
-       u32 cmxgcr;             /* CMX general clock route register */
-       u32 cmxsi1cr_l;         /* CMX SI1 clock route low register */
-       u32 cmxsi1cr_h;         /* CMX SI1 clock route high register */
-       u32 cmxsi1syr;          /* CMX SI1 SYNC route register */
-       u32 cmxucr1;            /* CMX UCC1, UCC3 clock route register */
-       u32 cmxucr2;            /* CMX UCC5, UCC7 clock route register */
-       u32 cmxucr3;            /* CMX UCC2, UCC4 clock route register */
-       u32 cmxucr4;            /* CMX UCC6, UCC8 clock route register */
-       u32 cmxupcr;            /* CMX UPC clock route register */
-       u8 res0[0x1C];
-} qmx83xx_t;
-
-/*
-* QE Timers
-*/
-
-typedef struct qet83xx {
-       u8 gtcfr1;              /* Timer 1 and Timer 2 global configuration register */
-       u8 res0[0x3];
-       u8 gtcfr2;              /* Timer 3 and timer 4 global configuration register */
-       u8 res1[0xB];
-       u16 gtmdr1;             /* Timer 1 mode register */
-       u16 gtmdr2;             /* Timer 2 mode register */
-       u16 gtrfr1;             /* Timer 1 reference register */
-       u16 gtrfr2;             /* Timer 2 reference register */
-       u16 gtcpr1;             /* Timer 1 capture register */
-       u16 gtcpr2;             /* Timer 2 capture register */
-       u16 gtcnr1;             /* Timer 1 counter */
-       u16 gtcnr2;             /* Timer 2 counter */
-       u16 gtmdr3;             /* Timer 3 mode register */
-       u16 gtmdr4;             /* Timer 4 mode register */
-       u16 gtrfr3;             /* Timer 3 reference register */
-       u16 gtrfr4;             /* Timer 4 reference register */
-       u16 gtcpr3;             /* Timer 3 capture register */
-       u16 gtcpr4;             /* Timer 4 capture register */
-       u16 gtcnr3;             /* Timer 3 counter */
-       u16 gtcnr4;             /* Timer 4 counter */
-       u16 gtevr1;             /* Timer 1 event register */
-       u16 gtevr2;             /* Timer 2 event register */
-       u16 gtevr3;             /* Timer 3 event register */
-       u16 gtevr4;             /* Timer 4 event register */
-       u16 gtps;               /* Timer 1 prescale register */
-       u8 res2[0x46];
-} qet83xx_t;
-
-/*
-* spi
-*/
-
-typedef struct spi83xx {
-       u8 res0[0x20];
-       u32 spmode;             /* SPI mode register */
-       u8 res1[0x2];
-       u8 spie;                /* SPI event register */
-       u8 res2[0x1];
-       u8 res3[0x2];
-       u8 spim;                /* SPI mask register */
-       u8 res4[0x1];
-       u8 res5[0x1];
-       u8 spcom;               /* SPI command register  */
-       u8 res6[0x2];
-       u32 spitd;              /* SPI transmit data register (cpu mode) */
-       u32 spird;              /* SPI receive data register (cpu mode) */
-       u8 res7[0x8];
-} spi83xx_t;
-
-/*
-* mcc
-*/
-
-typedef struct mcc83xx {
-       u32 mcce;               /* MCC event register */
-       u32 mccm;               /* MCC mask register */
-       u32 mccf;               /* MCC configuration register */
-       u32 merl;               /* MCC emergency request level register */
-       u8 res0[0xF0];
-} mcc83xx_t;
-
-/*
-* brg
-*/
-
-typedef struct brg83xx {
-       u32 brgc1;              /* BRG1 configuration register */
-       u32 brgc2;              /* BRG2 configuration register */
-       u32 brgc3;              /* BRG3 configuration register */
-       u32 brgc4;              /* BRG4 configuration register */
-       u32 brgc5;              /* BRG5 configuration register */
-       u32 brgc6;              /* BRG6 configuration register */
-       u32 brgc7;              /* BRG7 configuration register */
-       u32 brgc8;              /* BRG8 configuration register */
-       u32 brgc9;              /* BRG9 configuration register */
-       u32 brgc10;             /* BRG10 configuration register */
-       u32 brgc11;             /* BRG11 configuration register */
-       u32 brgc12;             /* BRG12 configuration register */
-       u32 brgc13;             /* BRG13 configuration register */
-       u32 brgc14;             /* BRG14 configuration register */
-       u32 brgc15;             /* BRG15 configuration register */
-       u32 brgc16;             /* BRG16 configuration register */
-       u8 res0[0x40];
-} brg83xx_t;
-
-/*
-* USB
-*/
-
-typedef struct usb83xx {
-       u8 usmod;               /* USB mode register */
-       u8 usadd;               /* USB address register */
-       u8 uscom;               /* USB command register */
-       u8 res0[0x1];
-       u16 usep0;              /* USB endpoint register 0 */
-       u16 usep1;              /* USB endpoint register 1 */
-       u16 usep2;              /* USB endpoint register 2 */
-       u16 usep3;              /* USB endpoint register 3 */
-       u8 res1[0x4];
-       u16 usber;              /* USB event register */
-       u8 res2[0x2];
-       u16 usbmr;              /* USB mask register */
-       u8 res3[0x1];
-       u8 usbs;                /* USB status register */
-       u32 ussft;              /* USB start of frame timer */
-       u8 res4[0x24];
-} usb83xx_t;
-
-/*
-* SI
-*/
-
-typedef struct si1_83xx {
-       u16 siamr1;             /* SI1 TDMA mode register */
-       u16 sibmr1;             /* SI1 TDMB mode register */
-       u16 sicmr1;             /* SI1 TDMC mode register */
-       u16 sidmr1;             /* SI1 TDMD mode register */
-       u8 siglmr1_h;           /* SI1 global mode register high */
-       u8 res0[0x1];
-       u8 sicmdr1_h;           /* SI1 command register high */
-       u8 res2[0x1];
-       u8 sistr1_h;            /* SI1 status register high */
-       u8 res3[0x1];
-       u16 sirsr1_h;           /* SI1 RAM shadow address register high */
-       u8 sitarc1;             /* SI1 RAM counter Tx TDMA */
-       u8 sitbrc1;             /* SI1 RAM counter Tx TDMB */
-       u8 sitcrc1;             /* SI1 RAM counter Tx TDMC */
-       u8 sitdrc1;             /* SI1 RAM counter Tx TDMD */
-       u8 sirarc1;             /* SI1 RAM counter Rx TDMA */
-       u8 sirbrc1;             /* SI1 RAM counter Rx TDMB */
-       u8 sircrc1;             /* SI1 RAM counter Rx TDMC */
-       u8 sirdrc1;             /* SI1 RAM counter Rx TDMD */
-       u8 res4[0x8];
-       u16 siemr1;             /* SI1 TDME mode register 16 bits */
-       u16 sifmr1;             /* SI1 TDMF mode register 16 bits */
-       u16 sigmr1;             /* SI1 TDMG mode register 16 bits */
-       u16 sihmr1;             /* SI1 TDMH mode register 16 bits */
-       u8 siglmg1_l;           /* SI1 global mode register low 8 bits */
-       u8 res5[0x1];
-       u8 sicmdr1_l;           /* SI1 command register low 8 bits */
-       u8 res6[0x1];
-       u8 sistr1_l;            /* SI1 status register low 8 bits */
-       u8 res7[0x1];
-       u16 sirsr1_l;           /* SI1 RAM shadow address register low 16 bits */
-       u8 siterc1;             /* SI1 RAM counter Tx TDME 8 bits */
-       u8 sitfrc1;             /* SI1 RAM counter Tx TDMF 8 bits */
-       u8 sitgrc1;             /* SI1 RAM counter Tx TDMG 8 bits */
-       u8 sithrc1;             /* SI1 RAM counter Tx TDMH 8 bits */
-       u8 sirerc1;             /* SI1 RAM counter Rx TDME 8 bits */
-       u8 sirfrc1;             /* SI1 RAM counter Rx TDMF 8 bits */
-       u8 sirgrc1;             /* SI1 RAM counter Rx TDMG 8 bits */
-       u8 sirhrc1;             /* SI1 RAM counter Rx TDMH 8 bits */
-       u8 res8[0x8];
-       u32 siml1;              /* SI1 multiframe limit register */
-       u8 siedm1;              /* SI1 extended diagnostic mode register */
-       u8 res9[0xBB];
-} si1_83xx_t;
-
-/*
-*  SI Routing Tables
-*/
-
-typedef struct sir83xx {
-       u8 tx[0x400];
-       u8 rx[0x400];
-       u8 res0[0x800];
-} sir83xx_t;
-
-/*
-* ucc
-*/
-
-typedef struct uslow {
-       u32 gumr_l;             /* UCCx general mode register (low) */
-       u32 gumr_h;             /* UCCx general mode register (high) */
-       u16 upsmr;              /* UCCx protocol-specific mode register */
-       u8 res0[0x2];
-       u16 utodr;              /* UCCx transmit on demand register */
-       u16 udsr;               /* UCCx data synchronization register */
-       u16 ucce;               /* UCCx event register */
-       u8 res1[0x2];
-       u16 uccm;               /* UCCx mask register */
-       u8 res2[0x1];
-       u8 uccs;                /* UCCx status register */
-       u8 res3[0x1E8];
-} uslow_t;
-
-typedef struct ufast {
-       u32 gumr;               /* UCCx general mode register */
-       u32 upsmr;              /* UCCx protocol-specific mode register  */
-       u16 utodr;              /* UCCx transmit on demand register  */
-       u8 res0[0x2];
-       u16 udsr;               /* UCCx data synchronization register  */
-       u8 res1[0x2];
-       u32 ucce;               /* UCCx event register */
-       u32 uccm;               /* UCCx mask register.  */
-       u8 uccs;                /* UCCx status register */
-       u8 res2[0x7];
-       u32 urfb;               /* UCC receive FIFO base  */
-       u16 urfs;               /* UCC receive FIFO size  */
-       u8 res3[0x2];
-       u16 urfet;              /* UCC receive FIFO emergency threshold  */
-       u16 urfset;             /* UCC receive FIFO special emergency threshold  */
-       u32 utfb;               /* UCC transmit FIFO base */
-       u16 utfs;               /* UCC transmit FIFO size  */
-       u8 res4[0x2];
-       u16 utfet;              /* UCC transmit FIFO emergency threshold */
-       u8 res5[0x2];
-       u16 utftt;              /* UCC transmit FIFO transmit threshold */
-       u8 res6[0x2];
-       u16 utpt;               /* UCC transmit polling timer */
-       u32 urtry;              /* UCC retry counter register */
-       u8 res7[0x4C];
-       u8 guemr;               /* UCC general extended mode register */
-       u8 res8[0x3];
-       u8 res9[0x6C];
-       u32 maccfg1;            /* Mac configuration register #1  */
-       u32 maccfg2;            /* Mac configuration register #2  */
-       u16 ipgifg;             /* Interframe gap register  */
-       u8 res10[0x2];
-       u32 hafdup;             /* Half-duplex register  */
-       u8 res11[0xC];
-       u32 emtr;               /* Ethernet MAC test register  */
-       u32 miimcfg;            /* MII mgmt configuration register  */
-       u32 miimcom;            /* MII mgmt command register  */
-       u32 miimadd;            /* MII mgmt address register  */
-       u32 miimcon;            /* MII mgmt control register  */
-       u32 miistat;            /* MII mgmt status register */
-       u32 miimnd;             /* MII mgmt indication register */
-       u32 ifctl;              /* Interface control register  */
-       u32 ifstat;             /* Interface status register  */
-       u32 macstnaddr1;        /* Station address part 1 register */
-       u32 macstnaddr2;        /* Station address part 2 register */
-       u8 res12[0x8];
-       u32 uempr;              /* UCC Ethernet MAC parameter register */
-       u32 utbipa;             /* UCC TBI address */
-       u16 uescr;              /* UCC Ethernet statistics control register */
-       u8 res13[0x26];
-       u32 tx64;               /* Transmit and receive 64-byte frame counter */
-       u32 tx127;              /* Transmit and receive 65- to 127-byte frame counter */
-       u32 tx255;              /* Transmit and receive 128- to 255-byte frame counter */
-       u32 rx64;               /* Receive and receive 64-byte frame counter */
-       u32 rx127;              /* Receive and receive 65- to 127-byte frame counter */
-       u32 rx255;              /* Receive and receive 128- to 255-byte frame counter */
-       u32 txok;               /* Transmit good bytes counter */
-       u32 txcf;               /* Transmit control frame counter */
-       u32 tmca;               /* Transmit multicast control frame counter */
-       u32 tbca;               /* Transmit broadcast packet counter */
-       u32 rxfok;              /* Receive frame OK counter */
-       u32 rbyt;               /* Receive good and bad bytes counter */
-       u32 rxbok;              /* Receive bytes OK counter */
-       u32 rmca;               /* Receive multicast packet counter */
-       u32 rbca;               /* Receive broadcast packet counter */
-       u32 scar;               /* Statistics carry register */
-       u32 scam;               /* Statistics carry mask register */
-       u8 res14[0x3C];
-} ufast_t;
-
-typedef struct ucc83xx {
-       union {
-               uslow_t slow;
-               ufast_t fast;
-       };
-} ucc83xx_t;
-
-/*
-*  MultiPHY UTOPIA POS Controllers
-*/
-
-typedef struct upc83xx {
-       u32 upgcr;              /* UTOPIA/POS general configuration register  */
-#define UPGCR_PROTOCOL 0x80000000      /* protocol ul2 or pl2 */
-#define UPGCR_TMS      0x40000000      /* Transmit master/slave mode */
-#define UPGCR_RMS      0x20000000      /* Receive master/slave mode */
-#define UPGCR_ADDR     0x10000000      /* Master MPHY Addr multiplexing: */
-#define UPGCR_DIAG     0x01000000      /* Diagnostic mode */
-       u32 uplpa;              /* UTOPIA/POS last PHY address */
-       u32 uphec;              /* ATM HEC register */
-       u32 upuc;               /* UTOPIA/POS UCC configuration */
-       u32 updc1;              /* UTOPIA/POS device 1 configuration */
-       u32 updc2;              /* UTOPIA/POS device 2 configuration  */
-       u32 updc3;              /* UTOPIA/POS device 3 configuration */
-       u32 updc4;              /* UTOPIA/POS device 4 configuration  */
-       u32 upstpa;             /* UTOPIA/POS STPA threshold  */
-       u8 res0[0xC];
-       u32 updrs1_h;           /* UTOPIA/POS device 1 rate select  */
-       u32 updrs1_l;           /* UTOPIA/POS device 1 rate select  */
-       u32 updrs2_h;           /* UTOPIA/POS device 2 rate select  */
-       u32 updrs2_l;           /* UTOPIA/POS device 2 rate select */
-       u32 updrs3_h;           /* UTOPIA/POS device 3 rate select */
-       u32 updrs3_l;           /* UTOPIA/POS device 3 rate select */
-       u32 updrs4_h;           /* UTOPIA/POS device 4 rate select */
-       u32 updrs4_l;           /* UTOPIA/POS device 4 rate select */
-       u32 updrp1;             /* UTOPIA/POS device 1 receive priority low  */
-       u32 updrp2;             /* UTOPIA/POS device 2 receive priority low  */
-       u32 updrp3;             /* UTOPIA/POS device 3 receive priority low  */
-       u32 updrp4;             /* UTOPIA/POS device 4 receive priority low  */
-       u32 upde1;              /* UTOPIA/POS device 1 event */
-       u32 upde2;              /* UTOPIA/POS device 2 event */
-       u32 upde3;              /* UTOPIA/POS device 3 event */
-       u32 upde4;              /* UTOPIA/POS device 4 event */
-       u16 uprp1;
-       u16 uprp2;
-       u16 uprp3;
-       u16 uprp4;
-       u8 res1[0x8];
-       u16 uptirr1_0;          /* Device 1 transmit internal rate 0 */
-       u16 uptirr1_1;          /* Device 1 transmit internal rate 1 */
-       u16 uptirr1_2;          /* Device 1 transmit internal rate 2 */
-       u16 uptirr1_3;          /* Device 1 transmit internal rate 3 */
-       u16 uptirr2_0;          /* Device 2 transmit internal rate 0 */
-       u16 uptirr2_1;          /* Device 2 transmit internal rate 1 */
-       u16 uptirr2_2;          /* Device 2 transmit internal rate 2 */
-       u16 uptirr2_3;          /* Device 2 transmit internal rate 3 */
-       u16 uptirr3_0;          /* Device 3 transmit internal rate 0 */
-       u16 uptirr3_1;          /* Device 3 transmit internal rate 1 */
-       u16 uptirr3_2;          /* Device 3 transmit internal rate 2 */
-       u16 uptirr3_3;          /* Device 3 transmit internal rate 3 */
-       u16 uptirr4_0;          /* Device 4 transmit internal rate 0 */
-       u16 uptirr4_1;          /* Device 4 transmit internal rate 1 */
-       u16 uptirr4_2;          /* Device 4 transmit internal rate 2 */
-       u16 uptirr4_3;          /* Device 4 transmit internal rate 3 */
-       u32 uper1;              /* Device 1 port enable register */
-       u32 uper2;              /* Device 2 port enable register */
-       u32 uper3;              /* Device 3 port enable register */
-       u32 uper4;              /* Device 4 port enable register */
-       u8 res2[0x150];
-} upc83xx_t;
-
-/*
-* SDMA
-*/
-
-typedef struct sdma83xx {
-       u32 sdsr;               /* Serial DMA status register */
-       u32 sdmr;               /* Serial DMA mode register */
-       u32 sdtr1;              /* SDMA system bus threshold register */
-       u32 sdtr2;              /* SDMA secondary bus threshold register */
-       u32 sdhy1;              /* SDMA system bus hysteresis register */
-       u32 sdhy2;              /* SDMA secondary bus hysteresis register */
-       u32 sdta1;              /* SDMA system bus address register */
-       u32 sdta2;              /* SDMA secondary bus address register */
-       u32 sdtm1;              /* SDMA system bus MSNUM register */
-       u32 sdtm2;              /* SDMA secondary bus MSNUM register */
-       u8 res0[0x10];
-       u32 sdaqr;              /* SDMA address bus qualify register */
-       u32 sdaqmr;             /* SDMA address bus qualify mask register */
-       u8 res1[0x4];
-       u32 sdwbcr;             /* SDMA CAM entries base register */
-       u8 res2[0x38];
-} sdma83xx_t;
-
-/*
-* Debug Space
-*/
-
-typedef struct dbg83xx {
-       u32 bpdcr;              /* Breakpoint debug command register */
-       u32 bpdsr;              /* Breakpoint debug status register */
-       u32 bpdmr;              /* Breakpoint debug mask register */
-       u32 bprmrr0;            /* Breakpoint request mode risc register 0 */
-       u32 bprmrr1;            /* Breakpoint request mode risc register 1 */
-       u8 res0[0x8];
-       u32 bprmtr0;            /* Breakpoint request mode trb register 0 */
-       u32 bprmtr1;            /* Breakpoint request mode trb register 1 */
-       u8 res1[0x8];
-       u32 bprmir;             /* Breakpoint request mode immediate register */
-       u32 bprmsr;             /* Breakpoint request mode serial register */
-       u32 bpemr;              /* Breakpoint exit mode register */
-       u8 res2[0x48];
-} dbg83xx_t;
-
-/*
-*  RISC Special Registers (Trap and Breakpoint)
-*/
+#if defined(CONFIG_MPC834X)
+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[2];        /* General purpose I/O module */
+       u8                      res0[0x200];
+       u8                      dll_ddr[0x100];
+       u8                      dll_lbc[0x100];
+       u8                      res1[0xE00];
+       ddr83xx_t               ddr;            /* DDR Memory Controller Memory */
+       fsl_i2c_t               i2c[2];         /* I2C Controllers */
+       u8                      res2[0x1300];
+       duart83xx_t             duart[2];       /* DUART */
+       u8                      res3[0x900];
+       lbus83xx_t              lbus;           /* Local Bus Controller Registers */
+       u8                      res4[0x1000];
+       spi83xx_t               spi;            /* Serial Peripheral Interface */
+       dma83xx_t               dma;            /* DMA */
+       pciconf83xx_t           pci_conf[2];    /* PCI Software Configuration Registers */
+       ios83xx_t               ios;            /* Sequencer */
+       pcictrl83xx_t           pci_ctrl[2];    /* PCI Controller Control and Status Registers */
+       u8                      res5[0x19900];
+       usb83xx_t               usb;
+       tsec83xx_t              tsec[2];
+       u8                      res6[0xA000];
+       security83xx_t          security;
+       u8                      res7[0xC0000];
+} immap_t;
 
-typedef struct rsp83xx {
-       u8 fixme[0x100];
-} rsp83xx_t;
-#endif
+#elif defined(CONFIG_MPC8360)
+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 */
+       u8                      res0[0x200];
+       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 */
+       qepi83xx_t              qepi;           /* QE Ports Interrupts Registers */
+       u8                      res1[0x300];
+       u8                      dll_ddr[0x100];
+       u8                      dll_lbc[0x100];
+       u8                      res2[0x200];
+       qepio83xx_t             qepio;          /* QE Parallel I/O ports */
+       qesba83xx_t             qesba;          /* QE Secondary Bus Access Windows */
+       u8                      res3[0x400];
+       ddr83xx_t               ddr;            /* DDR Memory Controller Memory */
+       fsl_i2c_t               i2c[2];         /* I2C Controllers */
+       u8                      res4[0x1300];
+       duart83xx_t             duart[2];       /* DUART */
+       u8                      res5[0x900];
+       lbus83xx_t              lbus;           /* Local Bus Controller Registers */
+       u8                      res6[0x2000];
+       dma83xx_t               dma;            /* DMA */
+       pciconf83xx_t           pci_conf[1];    /* PCI Software Configuration Registers */
+       u8                      res7[128];
+       ios83xx_t               ios;            /* Sequencer (IOS) */
+       pcictrl83xx_t           pci_ctrl[1];    /* PCI Controller Control and Status Registers */
+       u8                      res8[0x4A00];
+       ddr83xx_t               ddr_secondary;  /* Secondary DDR Memory Controller Memory Map */
+       u8                      res9[0x22000];
+       security83xx_t          security;
+       u8                      res10[0xC0000];
+       u8                      qe[0x100000];   /* QE block */
+} immap_t;
 
+#elif defined(CONFIG_MPC832X)
 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 */
-#if defined (CONFIG_MPC8349)
-       gpio83xx_t pgio[2];     /* general purpose I/O module */
-#elif defined (CONFIG_MPC8360)
-       qepi83xx_t qepi;        /* QE Ports Interrupts Registers */
-#endif
-       u8 res0[0x200];
-#if defined (CONFIG_MPC8360)
-       u8 DLL_LBDDR[0x100];
-#endif
-       u8 DDL_DDR[0x100];
-       u8 DDL_LBIU[0x100];
-#if defined (CONFIG_MPC8349)
-       u8 res1[0xE00];
-#elif defined (CONFIG_MPC8360)
-       u8 res1[0x200];
-       gpio83xx_t gpio;        /* General purpose I/O module */
-       qesba83xx_t qesba;      /* QE Secondary Bus Access Windows */
-#endif
-       ddr83xx_t ddr;          /* DDR Memory Controller Memory */
-       fsl_i2c_t i2c[2];       /* I2C Controllers */
-       u8 res2[0x1300];
-       duart83xx_t duart[2];   /* DUART */
-#if defined (CONFIG_MPC8349)
-       u8 res3[0x900];
-       lbus83xx_t lbus;        /* Local Bus Controller Registers */
-       u8 res4[0x1000];
-       spi83xx_t spi;          /* Serial Peripheral Interface */
-       u8 res5[0xF00];
-#elif defined (CONFIG_MPC8360)
-       u8 res3[0x900];
-       lbus83xx_t lbus;        /* Local Bus Controller */
-       u8 res4[0x2000];
-#endif
-       dma83xx_t dma;          /* DMA */
-#if defined (CONFIG_MPC8349)
-       pciconf83xx_t pci_conf[2];      /* PCI Software Configuration Registers */
-       ios83xx_t ios;          /* Sequencer */
-       pcictrl83xx_t pci_ctrl[2];      /* PCI Controller Control and Status Registers */
-       u8 res6[0x19900];
-       usb83xx_t usb;
-       tsec83xx_t tsec[2];
-       u8 res7[0xA000];
-       security83xx_t security;
-#elif defined (CONFIG_MPC8360)
-       pciconf83xx_t pci_conf[1];      /* PCI Software Configuration Registers */
-       u8 res_5[128];
-       ios83xx_t ios;          /* Sequencer (IOS) */
-       pcictrl83xx_t pci_ctrl[1];      /* PCI Controller Control and Status Registers */
-       u8 res6[0x4A00];
-       ddr83xx_t ddr_secondary;        /* Secondary DDR Memory Controller Memory Map */
-       u8 res7[0x22000];
-       security83xx_t security;
-       u8 res8[0xC0000];
-       iram83xx_t iram;        /* IRAM */
-       irq83xx_t irq;          /* Interrupt Controller */
-       cp83xx_t cp;            /* Communications Processor */
-       qmx83xx_t qmx;          /* QE Multiplexer */
-       qet83xx_t qet;          /* QE Timers */
-       spi83xx_t spi[0x2];     /* spi  */
-       mcc83xx_t mcc;          /* mcc */
-       brg83xx_t brg;          /* brg */
-       usb83xx_t usb;          /* USB */
-       si1_83xx_t si1;         /* SI */
-       u8 res9[0x800];
-       sir83xx_t sir;          /* SI Routing Tables  */
-       ucc83xx_t ucc1;         /* ucc1 */
-       ucc83xx_t ucc3;         /* ucc3 */
-       ucc83xx_t ucc5;         /* ucc5 */
-       ucc83xx_t ucc7;         /* ucc7 */
-       u8 res10[0x600];
-       upc83xx_t upc1;         /* MultiPHY UTOPIA POS Controller 1 */
-       ucc83xx_t ucc2;         /* ucc2 */
-       ucc83xx_t ucc4;         /* ucc4 */
-       ucc83xx_t ucc6;         /* ucc6 */
-       ucc83xx_t ucc8;         /* ucc8 */
-       u8 res11[0x600];
-       upc83xx_t upc2;         /* MultiPHY UTOPIA POS Controller 2 */
-       sdma83xx_t sdma;        /* SDMA */
-       dbg83xx_t dbg;          /* Debug Space */
-       rsp83xx_t rsp[0x2];     /* RISC Special Registers (Trap and Breakpoint) */
-       u8 res12[0x300];
-       u8 res13[0x3A00];
-       u8 res14[0x8000];       /* 0x108000 -  0x110000 */
-       u8 res15[0xC000];       /* 0x110000 -  0x11C000 Multi-user RAM */
-       u8 res16[0x24000];      /* 0x11C000 -  0x140000 */
-       u8 res17[0xC0000];      /* 0x140000 -  0x200000 */
-#endif
+       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 */
+       qepi83xx_t              qepi;           /* QE Ports Interrupts Registers */
+       u8                      res0[0x300];
+       u8                      dll_ddr[0x100];
+       u8                      dll_lbc[0x100];
+       u8                      res1[0x200];
+       qepio83xx_t             qepio;          /* QE Parallel I/O ports */
+       u8                      res2[0x800];
+       ddr83xx_t               ddr;            /* DDR Memory Controller Memory */
+       fsl_i2c_t               i2c[2];         /* I2C Controllers */
+       u8                      res3[0x1300];
+       duart83xx_t             duart[2];       /* DUART */
+       u8                      res4[0x900];
+       lbus83xx_t              lbus;           /* Local Bus Controller Registers */
+       u8                      res5[0x2000];
+       dma83xx_t               dma;            /* DMA */
+       pciconf83xx_t           pci_conf[1];    /* PCI Software Configuration Registers */
+       u8                      res6[128];
+       ios83xx_t               ios;            /* Sequencer (IOS) */
+       pcictrl83xx_t           pci_ctrl[1];    /* PCI Controller Control and Status Registers */
+       u8                      res7[0x27A00];
+       security83xx_t          security;
+       u8                      res8[0xC0000];
+       u8                      qe[0x100000];   /* QE block */
 } immap_t;
+#endif
 
 #endif                         /* __IMMAP_83xx__ */
index f38503206cc4d8d4cb1a199c81107208d932ad88..950b9497f8ab0d7467274566461264676af98997 100644 (file)
@@ -547,4 +547,10 @@ typedef struct qe_immap {
 
 extern qe_map_t *qe_immr;
 
+#if defined(CONFIG_MPC8360)
+#define QE_MURAM_SIZE          0xc000UL
+#elif defined(CONFIG_MPC832X)
+#define QE_MURAM_SIZE          0x4000UL
+#endif
+
 #endif                         /* __IMMAP_QE_H__ */
index 8e5fe113cb31b5e8f729ded45827d626b840b31f..bbc9ba0be655feb8a4f7d0edb1bac921c55ce19c 100644 (file)
@@ -95,8 +95,15 @@ extern void _outsl_ns(volatile u32 *port, const void *buf, int nl);
  * Acts as a barrier to ensure all previous I/O accesses have
  * completed before any further ones are issued.
  */
-#define eieio() __asm__ __volatile__ ("eieio" : : : "memory");
-#define sync()  __asm__ __volatile__ ("sync" : : : "memory");
+static inline void eieio(void)
+{
+       __asm__ __volatile__ ("eieio" : : : "memory");
+}
+
+static inline void sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
 
 /* Enforce in-order execution of data I/O.
  * No distinction between read/write on PPC; use eieio for all three.
index 914f28b46174b157cc63c1a4e5a571a50ecaf048..b226825ee20681a7db246e5082f9a414a1890915 100644 (file)
@@ -335,41 +335,6 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
  * instructions.
  */
 
-#define        TLB_LO          1
-#define        TLB_HI          0
-
-#define        TLB_DATA        TLB_LO
-#define        TLB_TAG         TLB_HI
-
-/* Tag portion */
-
-#define TLB_EPN_MASK    0xFFFFFC00      /* Effective Page Number */
-#define TLB_PAGESZ_MASK 0x00000380
-#define TLB_PAGESZ(x)   (((x) & 0x7) << 7)
-#define   PAGESZ_1K            0
-#define   PAGESZ_4K             1
-#define   PAGESZ_16K            2
-#define   PAGESZ_64K            3
-#define   PAGESZ_256K           4
-#define   PAGESZ_1M             5
-#define   PAGESZ_4M             6
-#define   PAGESZ_16M            7
-#define TLB_VALID       0x00000040      /* Entry is valid */
-
-/* Data portion */
-
-#define TLB_RPN_MASK    0xFFFFFC00      /* Real Page Number */
-#define TLB_PERM_MASK   0x00000300
-#define TLB_EX          0x00000200      /* Instruction execution allowed */
-#define TLB_WR          0x00000100      /* Writes permitted */
-#define TLB_ZSEL_MASK   0x000000F0
-#define TLB_ZSEL(x)     (((x) & 0xF) << 4)
-#define TLB_ATTR_MASK   0x0000000F
-#define TLB_W           0x00000008      /* Caching is write-through */
-#define TLB_I           0x00000004      /* Caching is inhibited */
-#define TLB_M           0x00000002      /* Memory is coherent */
-#define TLB_G           0x00000001      /* Memory is guarded from prefetch */
-
 /*
  * e500 support
  */
@@ -482,7 +447,162 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
 #define LAWAR_SIZE_16G         (LAWAR_SIZE_BASE+23)
 #define LAWAR_SIZE_32G         (LAWAR_SIZE_BASE+24)
 
-#ifdef CONFIG_440SPE
+#ifdef CONFIG_440
+/* 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_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)
+
+/*----------------------------------------------------------------------------+
+| TLB specific defines.
++----------------------------------------------------------------------------*/
+#define TLB_256MB_ALIGN_MASK 0xF0000000
+#define TLB_16MB_ALIGN_MASK  0xFF000000
+#define TLB_1MB_ALIGN_MASK   0xFFF00000
+#define TLB_256KB_ALIGN_MASK 0xFFFC0000
+#define TLB_64KB_ALIGN_MASK  0xFFFF0000
+#define TLB_16KB_ALIGN_MASK  0xFFFFC000
+#define TLB_4KB_ALIGN_MASK   0xFFFFF000
+#define TLB_1KB_ALIGN_MASK   0xFFFFFC00
+#define TLB_256MB_SIZE       0x10000000
+#define TLB_16MB_SIZE        0x01000000
+#define TLB_1MB_SIZE         0x00100000
+#define TLB_256KB_SIZE       0x00040000
+#define TLB_64KB_SIZE        0x00010000
+#define TLB_16KB_SIZE        0x00004000
+#define TLB_4KB_SIZE         0x00001000
+#define TLB_1KB_SIZE         0x00000400
+
+#define TLB_WORD0_EPN_MASK   0xFFFFFC00
+#define TLB_WORD0_EPN_ENCODE(n) (((unsigned long)(n))&0xFFFFFC00)
+#define TLB_WORD0_EPN_DECODE(n) (((unsigned long)(n))&0xFFFFFC00)
+#define TLB_WORD0_V_MASK     0x00000200
+#define TLB_WORD0_V_ENABLE   0x00000200
+#define TLB_WORD0_V_DISABLE  0x00000000
+#define TLB_WORD0_TS_MASK    0x00000100
+#define TLB_WORD0_TS_1       0x00000100
+#define TLB_WORD0_TS_0       0x00000000
+#define TLB_WORD0_SIZE_MASK  0x000000F0
+#define TLB_WORD0_SIZE_1KB   0x00000000
+#define TLB_WORD0_SIZE_4KB   0x00000010
+#define TLB_WORD0_SIZE_16KB  0x00000020
+#define TLB_WORD0_SIZE_64KB  0x00000030
+#define TLB_WORD0_SIZE_256KB 0x00000040
+#define TLB_WORD0_SIZE_1MB   0x00000050
+#define TLB_WORD0_SIZE_16MB  0x00000070
+#define TLB_WORD0_SIZE_256MB 0x00000090
+#define TLB_WORD0_TPAR_MASK  0x0000000F
+#define TLB_WORD0_TPAR_ENCODE(n) ((((unsigned long)(n))&0x0F)<<0)
+#define TLB_WORD0_TPAR_DECODE(n) ((((unsigned long)(n))>>0)&0x0F)
+
+#define TLB_WORD1_RPN_MASK   0xFFFFFC00
+#define TLB_WORD1_RPN_ENCODE(n) (((unsigned long)(n))&0xFFFFFC00)
+#define TLB_WORD1_RPN_DECODE(n) (((unsigned long)(n))&0xFFFFFC00)
+#define TLB_WORD1_PAR1_MASK  0x00000300
+#define TLB_WORD1_PAR1_ENCODE(n) ((((unsigned long)(n))&0x03)<<8)
+#define TLB_WORD1_PAR1_DECODE(n) ((((unsigned long)(n))>>8)&0x03)
+#define TLB_WORD1_PAR1_0     0x00000000
+#define TLB_WORD1_PAR1_1     0x00000100
+#define TLB_WORD1_PAR1_2     0x00000200
+#define TLB_WORD1_PAR1_3     0x00000300
+#define TLB_WORD1_ERPN_MASK  0x0000000F
+#define TLB_WORD1_ERPN_ENCODE(n) ((((unsigned long)(n))&0x0F)<<0)
+#define TLB_WORD1_ERPN_DECODE(n) ((((unsigned long)(n))>>0)&0x0F)
+
+#define TLB_WORD2_PAR2_MASK  0xC0000000
+#define TLB_WORD2_PAR2_ENCODE(n) ((((unsigned long)(n))&0x03)<<30)
+#define TLB_WORD2_PAR2_DECODE(n) ((((unsigned long)(n))>>30)&0x03)
+#define TLB_WORD2_PAR2_0     0x00000000
+#define TLB_WORD2_PAR2_1     0x40000000
+#define TLB_WORD2_PAR2_2     0x80000000
+#define TLB_WORD2_PAR2_3     0xC0000000
+#define TLB_WORD2_U0_MASK    0x00008000
+#define TLB_WORD2_U0_ENABLE  0x00008000
+#define TLB_WORD2_U0_DISABLE 0x00000000
+#define TLB_WORD2_U1_MASK    0x00004000
+#define TLB_WORD2_U1_ENABLE  0x00004000
+#define TLB_WORD2_U1_DISABLE 0x00000000
+#define TLB_WORD2_U2_MASK    0x00002000
+#define TLB_WORD2_U2_ENABLE  0x00002000
+#define TLB_WORD2_U2_DISABLE 0x00000000
+#define TLB_WORD2_U3_MASK    0x00001000
+#define TLB_WORD2_U3_ENABLE  0x00001000
+#define TLB_WORD2_U3_DISABLE 0x00000000
+#define TLB_WORD2_W_MASK     0x00000800
+#define TLB_WORD2_W_ENABLE   0x00000800
+#define TLB_WORD2_W_DISABLE  0x00000000
+#define TLB_WORD2_I_MASK     0x00000400
+#define TLB_WORD2_I_ENABLE   0x00000400
+#define TLB_WORD2_I_DISABLE  0x00000000
+#define TLB_WORD2_M_MASK     0x00000200
+#define TLB_WORD2_M_ENABLE   0x00000200
+#define TLB_WORD2_M_DISABLE  0x00000000
+#define TLB_WORD2_G_MASK     0x00000100
+#define TLB_WORD2_G_ENABLE   0x00000100
+#define TLB_WORD2_G_DISABLE  0x00000000
+#define TLB_WORD2_E_MASK     0x00000080
+#define TLB_WORD2_E_ENABLE   0x00000080
+#define TLB_WORD2_E_DISABLE  0x00000000
+#define TLB_WORD2_UX_MASK    0x00000020
+#define TLB_WORD2_UX_ENABLE  0x00000020
+#define TLB_WORD2_UX_DISABLE 0x00000000
+#define TLB_WORD2_UW_MASK    0x00000010
+#define TLB_WORD2_UW_ENABLE  0x00000010
+#define TLB_WORD2_UW_DISABLE 0x00000000
+#define TLB_WORD2_UR_MASK    0x00000008
+#define TLB_WORD2_UR_ENABLE  0x00000008
+#define TLB_WORD2_UR_DISABLE 0x00000000
+#define TLB_WORD2_SX_MASK    0x00000004
+#define TLB_WORD2_SX_ENABLE  0x00000004
+#define TLB_WORD2_SX_DISABLE 0x00000000
+#define TLB_WORD2_SW_MASK    0x00000002
+#define TLB_WORD2_SW_ENABLE  0x00000002
+#define TLB_WORD2_SW_DISABLE 0x00000000
+#define TLB_WORD2_SR_MASK    0x00000001
+#define TLB_WORD2_SR_ENABLE  0x00000001
+#define TLB_WORD2_SR_DISABLE 0x00000000
+
 /*----------------------------------------------------------------------------+
 | Following instructions are not available in Book E mode of the GNU assembler.
 +----------------------------------------------------------------------------*/
@@ -516,11 +636,15 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
 #define MBAR_INST                              .long 0x7c000000|\
                                        (854<<1)
 
-/*----------------------------------------------------------------------------+
-| Following instruction is not available in PPC405 mode of the GNU assembler.
-+----------------------------------------------------------------------------*/
-#define TLBRE(rt,ra,ws)                        .long 0x7c000000|\
-                                       (rt<<21)|(ra<<16)|(ws<<11)|(946<<1)
+#ifndef __ASSEMBLY__
+/* Prototypes */
+void mttlb1(unsigned long index, unsigned long value);
+void mttlb2(unsigned long index, unsigned long value);
+void mttlb3(unsigned long index, unsigned long value);
+unsigned long mftlb1(unsigned long index);
+unsigned long mftlb2(unsigned long index);
+unsigned long mftlb3(unsigned long index);
+#endif /* __ASSEMBLY__ */
 
-#endif
+#endif /* CONFIG_440 */
 #endif /* _PPC_MMU_H_ */
index 982d6a8637f502be02804b73eee62ef34189bd13..b162dbd7cfc421592dc3cf4afa37f5930113d36d 100644 (file)
@@ -187,6 +187,7 @@ void        hang            (void) __attribute__ ((noreturn));
 long int initdram (int);
 int    display_options (void);
 void   print_size (ulong, const char *);
+int    print_buffer (ulong addr, void* data, uint width, uint count, uint linelen);
 
 /* common/main.c */
 void   main_loop       (void);
diff --git a/include/configs/MPC832XEMDS.h b/include/configs/MPC832XEMDS.h
new file mode 100644 (file)
index 0000000..cecb225
--- /dev/null
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * 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
+
+#undef DEBUG
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_E300            1       /* E300 family */
+#define CONFIG_QE              1       /* Has QE */
+#define CONFIG_MPC83XX         1       /* MPC83xx family */
+#define CONFIG_MPC832X         1       /* MPC832x CPU specific */
+#define CONFIG_MPC832XEMDS     1       /* MPC832XEMDS board specific */
+
+/*
+ * System Clock Setup
+ */
+#ifdef CONFIG_PCISLAVE
+#define CONFIG_83XX_PCICLK     66000000        /* in HZ */
+#else
+#define CONFIG_83XX_CLKIN      66000000        /* in Hz */
+#endif
+
+#ifndef CONFIG_SYS_CLK_FREQ
+#define CONFIG_SYS_CLK_FREQ    66000000
+#endif
+
+/*
+ * Hardware Reset Configuration Word
+ */
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_VCO_1X2 |\
+       HRCWL_CSB_TO_CLKIN_2X1 |\
+       HRCWL_CORE_TO_CSB_2X1 |\
+       HRCWL_CE_PLL_VCO_DIV_2 |\
+       HRCWL_CE_PLL_DIV_1X1 |\
+       HRCWL_CE_TO_PLL_1X3)
+
+#ifdef CONFIG_PCISLAVE
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_AGENT |\
+       HRCWH_PCI1_ARBITER_DISABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0XFFF00100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_BIG_ENDIAN |\
+       HRCWH_LALE_NORMAL)
+#else
+#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_BIG_ENDIAN |\
+       HRCWH_LALE_NORMAL)
+#endif
+
+/*
+ * System IO Config
+ */
+#define CFG_SICRL              0x00000000
+
+#define CONFIG_BOARD_EARLY_INIT_F      /* call board_pre_init */
+
+/*
+ * IMMR new address
+ */
+#define CFG_IMMR               0xE0000000
+
+/*
+ * 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
+#define CFG_DDRCDR             0x73000002      /* DDR II voltage is 1.8V */
+
+#undef CONFIG_SPD_EEPROM
+#if defined(CONFIG_SPD_EEPROM)
+/* Determine DDR configuration from I2C interface
+ */
+#define SPD_EEPROM_ADDRESS     0x51    /* DDR SODIMM */
+#else
+/* Manually set up DDR parameters
+ */
+#define CFG_DDR_SIZE           128     /* MB */
+#define CFG_DDR_CS0_CONFIG     0x80840102
+#define CFG_DDR_TIMING_0       0x00220802
+#define CFG_DDR_TIMING_1       0x3935d322
+#define CFG_DDR_TIMING_2       0x0f9048ca
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_CLK_CNTL       0x02000000
+#define CFG_DDR_MODE           0x44400232
+#define CFG_DDR_MODE2          0x8000c000
+#define CFG_DDR_INTERVAL       0x03200064
+#define CFG_DDR_CS0_BNDS       0x00000007
+#define CFG_DDR_SDRAM_CFG      0x43080000
+#define CFG_DDR_SDRAM_CFG2     0x00401000
+#endif
+
+/*
+ * Memory test
+ */
+#undef CFG_DRAM_TEST           /* memory test, takes time */
+#define CFG_MEMTEST_START      0x00000000      /* memtest region */
+#define CFG_MEMTEST_END                0x00100000
+
+/*
+ * The reserved memory
+ */
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#else
+#undef  CFG_RAMBOOT
+#endif
+
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
+
+/*
+ * Initial RAM Base Address Setup
+ */
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR      0xE6000000      /* 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)
+
+/*
+ * Local Bus Configuration & Clock Setup
+ */
+#define CFG_LCRR               (LCRR_DBYP | LCRR_CLKDIV_2)
+#define CFG_LBC_LBCR           0x00000000
+
+/*
+ * 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      /* FLASH base address */
+#define CFG_FLASH_SIZE         16      /* FLASH size is 16M */
+
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* Window base at flash base */
+#define CFG_LBLAWAR0_PRELIM    0x80000018      /* 32MB window size */
+
+#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         0xfe006ff7      /* 16MB Flash size */
+
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks */
+#define CFG_MAX_FLASH_SECT     128             /* sectors per device */
+
+#undef CFG_FLASH_CHECKSUM
+
+/*
+ * BCSR on the Local Bus
+ */
+#define CFG_BCSR               0xF8000000
+#define CFG_LBLAWBAR1_PRELIM   CFG_BCSR        /* Access window base at BCSR base */
+#define CFG_LBLAWAR1_PRELIM    0x8000000E      /* Access window size 32K */
+
+#define CFG_BR1_PRELIM         (CFG_BCSR|0x00000801)   /* Port size=8bit, MSEL=GPCM */
+#define CFG_OR1_PRELIM         0xFFFFE9f7      /* length 32K */
+
+/*
+ * SDRAM on the Local Bus
+ */
+#undef CFG_LB_SDRAM            /* The board has not SRDAM on local bus */
+
+#ifdef CFG_LB_SDRAM
+#define CFG_LBC_SDRAM_BASE     0xF0000000      /* SDRAM base address */
+#define CFG_LBC_SDRAM_SIZE     64              /* LBC SDRAM is 64MB */
+
+#define CFG_LBLAWBAR2_PRELIM   CFG_LBC_SDRAM_BASE
+#define CFG_LBLAWAR2_PRELIM    0x80000019      /* 64MB */
+
+/*local bus BR2, OR2 definition for SDRAM if soldered on the EPB board */
+/*
+ * Base Register 2 and Option Register 2 configure SDRAM.
+ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000.
+ *
+ * For BR2, need:
+ *    Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0
+ *    port size = 32-bits = BR2[19:20] = 11
+ *    no parity checking = BR2[21:22] = 00
+ *    SDRAM for MSEL = BR2[24:26] = 011
+ *    Valid = BR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861
+ *
+ * CFG_LBC_SDRAM_BASE should be masked and OR'ed into
+ * the top 17 bits of BR2.
+ */
+
+#define CFG_BR2_PRELIM 0xf0001861      /*Port size=32bit, MSEL=SDRAM */
+
+/*
+ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64.
+ *
+ * For OR2, need:
+ *    64MB mask for AM, OR2[0:7] = 1111 1100
+ *                 XAM, OR2[17:18] = 11
+ *    9 columns OR2[19-21] = 010
+ *    13 rows   OR2[23-25] = 100
+ *    EAD set for extra time OR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901
+ */
+
+#define CFG_OR2_PRELIM 0xfc006901
+
+#define CFG_LBC_LSRT   0x32000000      /* LB sdram refresh timer, about 6us */
+#define CFG_LBC_MRTPR  0x20000000      /* LB refresh timer prescal, 266MHz/32 */
+
+/*
+ * LSDMR masks
+ */
+#define CFG_LBC_LSDMR_OP_NORMAL        (0 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ARFRSH        (1 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_SRFRSH        (2 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_MRW   (3 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PCHALL        (5 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ACTBNK        (6 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4))
+
+#define CFG_LBC_LSDMR_COMMON   0x0063b723
+
+/*
+ * SDRAM Controller configuration sequence.
+ */
+#define CFG_LBC_LSDMR_1                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_PCHALL)
+#define CFG_LBC_LSDMR_2                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_3                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_4                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_MRW)
+#define CFG_LBC_LSDMR_5                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_NORMAL)
+
+#endif
+
+/*
+ * Windows to access PIB via local bus
+ */
+#define CFG_LBLAWBAR3_PRELIM   0xf8008000      /* windows base 0xf8008000 */
+#define CFG_LBLAWAR3_PRELIM    0x8000000f      /* windows size 64KB */
+
+/*
+ * CS2 on Local Bus, to PIB
+ */
+#define CFG_BR2_PRELIM 0xf8008801      /* CS2 base address at 0xf8008000 */
+#define CFG_OR2_PRELIM 0xffffe9f7      /* size 32KB, port size 8bit, GPCM */
+
+/*
+ * CS3 on Local Bus, to PIB
+ */
+#define CFG_BR3_PRELIM 0xf8010801      /* CS3 base address at 0xf8010000 */
+#define CFG_OR3_PRELIM 0xffffe9f7      /* size 32KB, port size 8bit, GPCM */
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX      1
+#undef CONFIG_SERIAL_SOFTWARE_FIFO
+#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)
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#ifdef CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+#endif
+
+/* 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,8323@0"
+#define OF_SOC                 "soc8323@e0000000"
+#define OF_QE                  "qe@e0100000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc8323@e0000000/serial@4500"
+
+/* I2C */
+#define CONFIG_HARD_I2C                /* I2C with hardware support */
+#undef CONFIG_SOFT_I2C         /* I2C bit-banged */
+#define CONFIG_FSL_I2C
+#define CFG_I2C_SPEED  400000  /* I2C speed and slave address */
+#define CFG_I2C_SLAVE  0x7F
+#define CFG_I2C_NOPROBES       {0x51}  /* Don't probe these addrs */
+#define CFG_I2C_OFFSET 0x3000
+
+/*
+ * Config on-board RTC
+ */
+#define CONFIG_RTC_DS1374              /* use ds1374 rtc via i2c */
+#define CFG_I2C_RTC_ADDR       0x68    /* at address 0x68 */
+
+/*
+ * General PCI
+ * Addresses are mapped 1-1.
+ */
+#define CFG_PCI_MEM_BASE       0x80000000
+#define CFG_PCI_MEM_PHYS       CFG_PCI_MEM_BASE
+#define CFG_PCI_MEM_SIZE       0x10000000      /* 256M */
+#define CFG_PCI_MMIO_BASE      0x90000000
+#define CFG_PCI_MMIO_PHYS      CFG_PCI_MMIO_BASE
+#define CFG_PCI_MMIO_SIZE      0x10000000      /* 256M */
+#define CFG_PCI_IO_BASE                0xE0300000
+#define CFG_PCI_IO_PHYS                0xE0300000
+#define CFG_PCI_IO_SIZE                0x100000        /* 1M */
+
+#define CFG_PCI_SLV_MEM_LOCAL  CFG_SDRAM_BASE
+#define CFG_PCI_SLV_MEM_BUS    0x00000000
+#define CFG_PCI_SLV_MEM_SIZE   0x80000000
+
+
+#ifdef CONFIG_PCI
+
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_PCI_SCAN_SHOW    /* show pci devices on startup */
+#define CFG_PCI_SUBSYS_VENDORID        0x1957  /* Freescale */
+
+#endif /* CONFIG_PCI */
+
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+/*
+ * QE UEC ethernet configuration
+ */
+#define CONFIG_UEC_ETH
+#define CONFIG_ETHPRIME                "Freescale GETH"
+
+#define CONFIG_UEC_ETH1                /* ETH3 */
+
+#ifdef CONFIG_UEC_ETH1
+#define CFG_UEC1_UCC_NUM       2       /* UCC3 */
+#define CFG_UEC1_RX_CLK                QE_CLK9
+#define CFG_UEC1_TX_CLK                QE_CLK10
+#define CFG_UEC1_ETH_TYPE      FAST_ETH
+#define CFG_UEC1_PHY_ADDR      3
+#define CFG_UEC1_INTERFACE_MODE        ENET_100_MII
+#endif
+
+#define CONFIG_UEC_ETH2                /* ETH4 */
+
+#ifdef CONFIG_UEC_ETH2
+#define CFG_UEC2_UCC_NUM       3       /* UCC4 */
+#define CFG_UEC2_RX_CLK                QE_CLK7
+#define CFG_UEC2_TX_CLK                QE_CLK8
+#define CFG_UEC2_ETH_TYPE      FAST_ETH
+#define CFG_UEC2_PHY_ADDR      4
+#define CFG_UEC2_INTERFACE_MODE        ENET_100_MII
+#endif
+
+/*
+ * Environment
+ */
+#ifndef CFG_RAMBOOT
+       #define CFG_ENV_IS_IN_FLASH     1
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE + 0x40000)
+       #define CFG_ENV_SECT_SIZE       0x40000 /* 256K(one sector) for env */
+       #define CFG_ENV_SIZE            0x2000
+#else
+       #define CFG_NO_FLASH            1       /* Flash is not usable now */
+       #define CFG_ENV_IS_NOWHERE      1       /* Store ENV in memory only */
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - 0x1000)
+       #define CFG_ENV_SIZE            0x2000
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#if defined(CFG_RAMBOOT)
+#if defined(CONFIG_PCI)
+#define  CONFIG_COMMANDS       ((CONFIG_CMD_DFL \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_ASKENV \
+                               | CFG_CMD_PCI \
+                               | CFG_CMD_I2C) \
+                               & \
+                               ~(CFG_CMD_ENV \
+                               | CFG_CMD_LOADS))
+#else
+#define  CONFIG_COMMANDS       ((CONFIG_CMD_DFL \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_ASKENV \
+                               | CFG_CMD_I2C) \
+                               & \
+                               ~(CFG_CMD_ENV \
+                               | CFG_CMD_LOADS))
+#endif
+#else
+#if defined(CONFIG_PCI)
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL \
+                               | CFG_CMD_PCI \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_ASKENV \
+                               | CFG_CMD_I2C)
+#else
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_ASKENV \
+                               | CFG_CMD_I2C  )
+#endif
+#endif
+
+#include <cmd_confdefs.h>
+
+#undef CONFIG_WATCHDOG         /* watchdog disabled */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP           /* undef to save memory */
+#define CFG_LOAD_ADDR          0x2000000       /* default load address */
+#define CFG_PROMPT             "=> "   /* Monitor Command Prompt */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+       #define CFG_CBSIZE      1024    /* Console I/O Buffer Size */
+#else
+       #define CFG_CBSIZE      256     /* Console I/O Buffer Size */
+#endif
+
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)  /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size */
+#define CFG_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 */
+
+/*
+ * Core HID Setup
+ */
+#define CFG_HID0_INIT          0x000000000
+#define CFG_HID0_FINAL         HID0_ENABLE_MACHINE_CHECK
+#define CFG_HID2               HID2_HBE
+
+/*
+ * Cache Config
+ */
+#define CFG_DCACHE_SIZE                16384
+#define CFG_CACHELINE_SIZE     32
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /*log base 2 of the above value */
+#endif
+
+/*
+ * MMU Setup
+ */
+
+/* DDR: cache cacheable */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_DBAT0L     CFG_IBAT0L
+#define CFG_DBAT0U     CFG_IBAT0U
+
+/* IMMRBAR & PCI IO: cache-inhibit and guarded */
+#define CFG_IBAT1L     (CFG_IMMR | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT1U     (CFG_IMMR | BATU_BL_4M | BATU_VS | BATU_VP)
+#define CFG_DBAT1L     CFG_IBAT1L
+#define CFG_DBAT1U     CFG_IBAT1U
+
+/* BCSR: cache-inhibit and guarded */
+#define CFG_IBAT2L     (CFG_BCSR | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT2U     (CFG_BCSR | BATU_BL_128K | BATU_VS | BATU_VP)
+#define CFG_DBAT2L     CFG_IBAT2L
+#define CFG_DBAT2U     CFG_IBAT2U
+
+/* FLASH: icache cacheable, but dcache-inhibit and guarded */
+#define CFG_IBAT3L     (CFG_FLASH_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT3U     (CFG_FLASH_BASE | BATU_BL_32M | BATU_VS | BATU_VP)
+#define CFG_DBAT3L     (CFG_FLASH_BASE | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_DBAT3U     CFG_IBAT3U
+
+#define CFG_IBAT4L     (0)
+#define CFG_IBAT4U     (0)
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+
+/* Stack in dcache: cacheable, no memory coherence */
+#define CFG_IBAT5L     (CFG_INIT_RAM_ADDR | BATL_PP_10)
+#define CFG_IBAT5U     (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+
+#ifdef CONFIG_PCI
+/* PCI MEM space: cacheable */
+#define CFG_IBAT6L     (CFG_PCI_MEM_PHYS | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT6U     (CFG_PCI_MEM_PHYS | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+/* PCI MMIO space: cache-inhibit and guarded */
+#define CFG_IBAT7L     (CFG_PCI_MMIO_PHYS | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT7U     (CFG_PCI_MMIO_PHYS | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+#else
+#define CFG_IBAT6L     (0)
+#define CFG_IBAT6U     (0)
+#define CFG_IBAT7L     (0)
+#define CFG_IBAT7U     (0)
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+#endif
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01    /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02    /* Software reboot */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   230400  /* speed of kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  2       /* which serial port to use */
+#endif
+
+/*
+ * Environment Configuration
+ */
+
+#define CONFIG_ENV_OVERWRITE
+
+#if defined(CONFIG_UEC_ETH)
+#define CONFIG_ETHADDR 00:04:9f:ef:03:01
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR        00:04:9f:ef:03:02
+#endif
+
+#define CONFIG_BAUDRATE        115200
+
+#define CONFIG_LOADADDR        200000  /* default location for tftp and bootm */
+
+#define CONFIG_BOOTDELAY 6     /* -1 disables auto-boot */
+#undef  CONFIG_BOOTARGS                /* the boot command will set bootargs */
+
+#define CONFIG_EXTRA_ENV_SETTINGS                                      \
+   "netdev=eth0\0"                                                     \
+   "consoledev=ttyS0\0"                                                        \
+   "ramdiskaddr=1000000\0"                                             \
+   "ramdiskfile=ramfs.83xx\0"                                          \
+   "fdtaddr=400000\0"                                                  \
+   "fdtfile=mpc832xemds.dtb\0"                                         \
+   ""
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+   "setenv bootargs root=/dev/nfs rw "                                 \
+      "nfsroot=$serverip:$rootpath "                                   \
+      "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off "        \
+      "console=$consoledev,$baudrate $othbootargs;"                    \
+   "tftp $loadaddr $bootfile;"                                         \
+   "tftp $fdtaddr $fdtfile;"                                           \
+   "bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND                                          \
+   "setenv bootargs root=/dev/ram rw "                                 \
+      "console=$consoledev,$baudrate $othbootargs;"                    \
+   "tftp $ramdiskaddr $ramdiskfile;"                                   \
+   "tftp $loadaddr $bootfile;"                                         \
+   "tftp $fdtaddr $fdtfile;"                                           \
+   "bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+
+#define CONFIG_BOOTCOMMAND CONFIG_NFSBOOTCOMMAND
+
+#endif /* __CONFIG_H */
index 5bed2d0a29fa05b37f276ce58574c48ecc661d99..0460be9e569cfaa6447ab3da1278c5ec01aecf08 100644 (file)
 #endif
 #endif
 
-#define CFG_SCCR_INIT          (SCCR_DEFAULT & (~SCCR_CLK_MASK))
-#define CFG_SCCR_TSEC1CM       SCCR_TSEC1CM_1  /* TSEC1 clock setting */
-#define CFG_SCCR_TSEC2CM       SCCR_TSEC2CM_1  /* TSEC2 clock setting */
-#define CFG_SCCR_ENCCM         SCCR_ENCCM_3    /* ENC clock setting */
-#define CFG_SCCR_USBCM         SCCR_USBCM_3    /* USB clock setting */
-#define CFG_SCCR_VAL           ( CFG_SCCR_INIT         \
-                               | CFG_SCCR_TSEC1CM      \
-                               | CFG_SCCR_TSEC2CM      \
-                               | CFG_SCCR_ENCCM        \
-                               | CFG_SCCR_USBCM        )
-
 #define CONFIG_BOARD_EARLY_INIT_F              /* call board_pre_init */
 
 #define CFG_IMMR               0xE0000000
@@ -82,7 +71,7 @@
 /*
  * DDR Setup
  */
-#undef CONFIG_DDR_ECC                  /* only for ECC DDR module */
+#define CONFIG_DDR_ECC                 /* support DDR ECC function */
 #define CONFIG_DDR_ECC_CMD             /* use DDR ECC user commands */
 #define CONFIG_SPD_EEPROM              /* use SPD EEPROM for 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
+#define CFG_DDR_SDRAM_CLK_CNTL (DDR_SDRAM_CLK_CNTL_SS_EN | \
+                               DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05)
 #undef  CONFIG_DDR_2T_TIMING
 
+/*
+ * DDRCDR - DDR Control Driver Register
+ */
+#define CFG_DDRCDR_VALUE       0x80080001
+
 #if defined(CONFIG_SPD_EEPROM)
 /*
  * Determine DDR configuration from I2C interface.
  * Manually set up DDR parameters
  */
 #define CFG_DDR_SIZE           256             /* MB */
+#if defined(CONFIG_DDR_II)
+#define CFG_DDRCDR             0x80080001
+#define CFG_DDR_CS2_BNDS       0x0000000f
+#define CFG_DDR_CS2_CONFIG     0x80330102
+#define CFG_DDR_TIMING_0       0x00220802
+#define CFG_DDR_TIMING_1       0x38357322
+#define CFG_DDR_TIMING_2       0x2f9048c8
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_CLK_CNTL       0x02000000
+#define CFG_DDR_MODE           0x47d00432
+#define CFG_DDR_MODE2          0x8000c000
+#define CFG_DDR_INTERVAL       0x03cf0080
+#define CFG_DDR_SDRAM_CFG      0x43000000
+#define CFG_DDR_SDRAM_CFG2     0x00401000
+#else
 #define CFG_DDR_CONFIG         (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10)
 #define CFG_DDR_TIMING_1       0x36332321
 #define CFG_DDR_TIMING_2       0x00000800      /* P9-45,may need tuning */
 #define CFG_DDR_MODE           0x00000022      /* DLL,normal,seq,4/2.5, 4 burst len */
 #endif
 #endif
+#endif
 
 /*
  * SDRAM 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_SIZE         32              /* max flash size in MB */
 /* #define CFG_FLASH_USE_BUFFER_WRITE */
 
 #define CFG_BR0_PRELIM         (CFG_FLASH_BASE |       /* flash Base address */ \
-                               (2 << BR_PS_SHIFT) |    /* 32 bit port size */   \
+                               (2 << BR_PS_SHIFT) |    /* 16 bit port size */   \
                                BR_V)                   /* valid */
-
-#define CFG_OR0_PRELIM         0xFF806FF7      /* 8 MB flash size */
+#define CFG_OR0_PRELIM         ((~(CFG_FLASH_SIZE - 1) << 20) | OR_UPM_XAM | \
+                               OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | OR_GPCM_SCY_15 | \
+                               OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD)
 #define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* window base at flash base */
-#define CFG_LBLAWAR0_PRELIM    0x80000016      /* 8 MB window size */
+#define CFG_LBLAWAR0_PRELIM    0x80000018      /* 32 MB window size */
 
 #define CFG_MAX_FLASH_BANKS    1               /* number of banks */
-#define CFG_MAX_FLASH_SECT     64              /* sectors per device */
+#define CFG_MAX_FLASH_SECT     256             /* max sectors per device */
 
 #undef CFG_FLASH_CHECKSUM
 #define CFG_FLASH_ERASE_TOUT   60000   /* Flash Erase Timeout (ms) */
 #define CFG_LCRR       (LCRR_DBYP | LCRR_CLKDIV_4)
 #define CFG_LBC_LBCR   0x00000000
 
-#define CFG_LB_SDRAM   /* if board has SRDAM on local bus */
+/*
+ * The MPC834xEA MDS for 834xE rev3.1 may not be assembled SDRAM memory.
+ * if board has SRDAM on local bus, you can define CFG_LB_SDRAM
+ */
+#undef CFG_LB_SDRAM
 
 #ifdef CFG_LB_SDRAM
 /* Local bus BR2, OR2 definition for SDRAM if soldered on the MDS board */
 #define CFG_NS16550_COM1        (CFG_IMMR+0x4500)
 #define CFG_NS16550_COM2        (CFG_IMMR+0x4600)
 
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
 /* Use the HUSH parser */
 #define CFG_HUSH_PARSER
 #ifdef  CFG_HUSH_PARSER
index cbdbb2921dbe1ff1b91644ab3654db411076d8af..37bbfb336d2d6f1c5daa04f22d6e110551cc7762 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 /*
- MPC8349E-mITX board configuration file
+ MPC8349E-mITX and MPC8349E-mITX-GP board configuration file
 
  Memory map:
 
  0xE000_0000-0xEFFF_FFFF IMMR (1 MB)
  0xE200_0000-0xE2FF_FFFF PCI1 I/O space (16 MB)
  0xE300_0000-0xE3FF_FFFF PCI2 I/O space (16 MB)
- 0xF000_0000-0xF000_FFFF Compact Flash
+ 0xF000_0000-0xF000_FFFF Compact Flash (MPC8349E-mITX only)
  0xF001_0000-0xF001_FFFF Local bus expansion slot
- 0xF800_0000-0xF801_FFFF GBE L2 Switch VSC7385
- 0xFF00_0000-0xFF7F_FFFF Alternative bank of Flash memory (8MB)
- 0xFF80_0000-0xFFFF_FFFF Boot Flash (8 MB)
+ 0xF800_0000-0xF801_FFFF Vitesse 7385 Parallel Interface (MPC8349E-mITX only)
+ 0xFE00_0000-0xFE7F_FFFF First 8MB bank of Flash memory
+ 0xFE80_0000-0xFEFF_FFFF Second 8MB bank of Flash memory (MPC8349E-mITX only)
 
  I2C address list:
                                                Align.  Board
@@ -56,7 +56,9 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#undef DEBUG
+#if (TEXT_BASE == 0xFE000000)
+#define CFG_LOWBOOT
+#endif
 
 /*
  * High Level Configuration Options
 #define CONFIG_MPC834X         /* MPC834x family (8343, 8347, 8349) */
 #define CONFIG_MPC8349         /* MPC8349 specific */
 
-#define CONFIG_PCI
+#define CFG_IMMR               0xE0000000      /* The IMMR is relocated to here */
+
+
+/* On-board devices */
 
+#ifdef CONFIG_MPC8349ITX
 #define CONFIG_COMPACT_FLASH   /* The CF card interface on the back of the board */
-#define CONFIG_RTC_DS1337
+#define CONFIG_VSC7385         /* The Vitesse 7385 5-port switch */
+#endif
 
-/* I2C */
+#define CONFIG_PCI
+#define CONFIG_RTC_DS1337
 #define CONFIG_HARD_I2C
+#define CONFIG_TSEC_ENET               /* TSEC Ethernet support */
 
+/*
+ * Device configurations
+ */
+
+/* I2C */
 #ifdef CONFIG_HARD_I2C
 
 #define CONFIG_MISC_INIT_F
 
 #endif
 
-#define CONFIG_TSEC_ENET               /* tsec ethernet support */
-#define CONFIG_ENV_OVERWRITE
+/* Compact Flash */
+#ifdef CONFIG_COMPACT_FLASH
 
-#define PCI_66M
-#ifdef PCI_66M
-#define CONFIG_83XX_CLKIN      66666666        /* in Hz */
-#else
-#define CONFIG_83XX_CLKIN      33333333        /* in Hz */
-#endif
+#define CFG_IDE_MAXBUS         1
+#define CFG_IDE_MAXDEVICE      1
 
-#ifndef CONFIG_SYS_CLK_FREQ
-#ifdef PCI_66M
-#define CONFIG_SYS_CLK_FREQ    66666666
-#else
-#define CONFIG_SYS_CLK_FREQ    33333333
-#endif
-#endif
+#define CFG_ATA_IDE0_OFFSET    0x0000
+#define CFG_ATA_BASE_ADDR      CFG_CF_BASE
+#define CFG_ATA_DATA_OFFSET    0x0000
+#define CFG_ATA_REG_OFFSET     0
+#define CFG_ATA_ALT_OFFSET     0x0200
+#define CFG_ATA_STRIDE         2
 
-#define CFG_IMMR               0xE0000000      /* The IMMR is relocated to here */
+#define ATA_RESET_TIME 1       /* If a CF card is not inserted, time out quickly */
 
-#undef CFG_DRAM_TEST                           /* memory test, takes time */
-#define CFG_MEMTEST_START      0x00003000      /* memtest region */
-#define CFG_MEMTEST_END                0x07100000      /* only has 128M */
+#define CONFIG_DOS_PARTITION
 
-/*
- * DDR Setup
- */
-#undef CONFIG_DDR_ECC                  /* only for ECC DDR module */
-#undef CONFIG_DDR_ECC_CMD              /* use DDR ECC user commands */
-#define CONFIG_SPD_EEPROM              /* use SPD EEPROM for DDR setup*/
+#endif
 
 /*
- * 32-bit data path mode.
- *
- * Please note that using this mode for devices with the real density of 64-bit
- * effectively reduces the amount of available memory due to the effect of
- * wrapping around while translating address to row/columns, for example in the
- * 256MB module the upper 128MB get aliased with contents of the lower
- * 128MB); normally this define should be used for devices with real 32-bit
- * data path.
+ * DDR Setup
  */
-#undef CONFIG_DDR_32BIT
-
-#define CFG_DDR_BASE   0x00000000      /* DDR is system memory*/
-#define CFG_SDRAM_BASE CFG_DDR_BASE
-#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE
-#undef CONFIG_DDR_2T_TIMING
+#define CFG_DDR_BASE           0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE                 CFG_DDR_BASE
+#define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
 #define CFG_83XX_DDR_USES_CS0
+#define CFG_MEMTEST_START      0x1000          /* memtest region */
+#define CFG_MEMTEST_END                0x2000
 
-#ifndef CONFIG_SPD_EEPROM
-/*
- * Manually set up DDR parameters
- */
+#ifdef CONFIG_HARD_I2C
+#define CONFIG_SPD_EEPROM              /* use SPD EEPROM for DDR setup*/
+#endif
+
+#ifndef CONFIG_SPD_EEPROM      /* No SPD? Then manually set up DDR parameters */
     #define CFG_DDR_SIZE       256             /* Mb */
     #define CFG_DDR_CONFIG     (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10)
 
     #define CFG_DDR_TIMING_2   0x00000800  /* P9-45, may need tuning */
 #endif
 
-/* FLASH on the Local Bus */
+/*
+ *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         16              /* FLASH size in MB */
 #define CFG_FLASH_EMPTY_INFO
+#define CFG_MAX_FLASH_SECT     135     /* 127 64KB sectors + 8 8KB 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_FLASH_CFI_WIDTH    FLASH_CFI_16BIT
+
+/* The ITX has two flash chips, but the ITX-GP has only one.  To support both
+boards, we say we have two, but don't display a message if we find only one. */
+#define CFG_FLASH_QUIET_TEST
+#define CFG_MAX_FLASH_BANKS    2               /* number of banks */
+#define CFG_FLASH_BANKS_LIST   {CFG_FLASH_BASE, CFG_FLASH_BASE + 0x800000}
+#define CFG_FLASH_SIZE         16              /* FLASH size in MB */
+#define CFG_FLASH_SIZE_SHIFT   4               /* log2 of the above value */
+
+/*
+ * BRx, ORx, LBLAWBARx, and LBLAWARx
+ */
+
+/* Flash */
 
 #define CFG_BR0_PRELIM         (CFG_FLASH_BASE | BR_PS_16 | BR_V)
 #define CFG_OR0_PRELIM         ((~(CFG_FLASH_SIZE - 1) << 20) | OR_UPM_XAM | \
                                OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | OR_GPCM_SCY_15 | \
                                OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD)
-#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* Window base at flash base */
-#define CFG_LBLAWAR0_PRELIM    0x80000017      /* 16Mb window bytes */
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE
+#define CFG_LBLAWAR0_PRELIM    (LBLAWAR_EN | (0x13 + CFG_FLASH_SIZE_SHIFT))
 
-/* VSC7385 on the Local Bus */
-#define CFG_VSC7385_BASE       0xF8000000      /* start of VSC7385   */
+/* Vitesse 7385 */
 
-#define CFG_BR1_PRELIM         (CFG_VSC7385_BASE | BR_PS_8 | BR_V)
-#define CFG_OR1_PRELIM         (0xFFFE0000 /* 128KB */ | \
-                               OR_GPCM_CSNT | OR_GPCM_XACS | OR_GPCM_SCY_15 | \
-                               OR_GPCM_SETA | OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD)
+#ifdef CONFIG_VSC7385
 
-#define CFG_LBLAWBAR1_PRELIM   CFG_VSC7385_BASE        /* Access window base at VSC7385 base */
-#define CFG_LBLAWAR1_PRELIM    0x80000010              /* Access window size 128K */
+#define CFG_VSC7385_BASE       0xF8000000
 
-#define CFG_MAX_FLASH_BANKS    2               /* number of banks */
-#define CFG_MAX_FLASH_SECT     135             /* sectors per device */
+#define CFG_BR1_PRELIM         (CFG_VSC7385_BASE | BR_PS_8 | BR_V)
+#define CFG_OR1_PRELIM         (OR_AM_128KB | OR_GPCM_CSNT | OR_GPCM_XACS | \
+                               OR_GPCM_SCY_15 | OR_GPCM_SETA | OR_GPCM_TRLX | \
+                               OR_GPCM_EHTR | OR_GPCM_EAD)
 
-#define CFG_FLASH_BANKS_LIST {CFG_FLASH_BASE, CFG_FLASH_BASE + 0x800000}
+#define CFG_LBLAWBAR1_PRELIM   CFG_VSC7385_BASE
+#define CFG_LBLAWAR1_PRELIM    (LBLAWAR_EN | LBLAWAR_128KB)
 
-#undef CFG_FLASH_CHECKSUM
-#define CFG_FLASH_ERASE_TOUT   60000   /* Flash Erase Timeout (ms) */
-#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (ms) */
+#endif
 
-#define CFG_LED_BASE           0xF9000000  /* start of LED and Board ID */
+/* LED */
+
+#define CFG_LED_BASE           0xF9000000
 #define CFG_BR2_PRELIM         (CFG_LED_BASE | BR_PS_8 | BR_V)
-#define CFG_OR2_PRELIM         (0xFFE00000 /* 2MB */ | \
-                               OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | \
-                               OR_GPCM_SCY_9 | \
-                               OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD)
+#define CFG_OR2_PRELIM         (OR_AM_2MB | OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | \
+                               OR_GPCM_XACS | OR_GPCM_SCY_9 | OR_GPCM_TRLX | \
+                               OR_GPCM_EHTR | OR_GPCM_EAD)
+
+/* Compact Flash */
 
 #ifdef CONFIG_COMPACT_FLASH
 
 #define CFG_BR3_PRELIM         (CFG_CF_BASE | BR_PS_16 | BR_MS_UPMA | BR_V)
 #define CFG_OR3_PRELIM         (OR_UPM_AM | OR_UPM_BI)
 
-#define CFG_LBLAWBAR2_PRELIM   CFG_CF_BASE     /* Window base at flash base + LED & Board ID */
-#define CFG_LBLAWAR2_PRELIM    0x8000000F      /* 64K bytes */
-
-#undef CONFIG_IDE_RESET
-#undef CONFIG_IDE_PREINIT
-
-#define CFG_IDE_MAXBUS         1
-#define CFG_IDE_MAXDEVICE      1
-
-#define CFG_ATA_IDE0_OFFSET    0x0000
-#define CFG_ATA_BASE_ADDR      CFG_CF_BASE
-#define CFG_ATA_DATA_OFFSET    0x0000
-#define CFG_ATA_REG_OFFSET     0
-#define CFG_ATA_ALT_OFFSET     0x0200
-#define CFG_ATA_STRIDE         2
-
-#define ATA_RESET_TIME 1       /* If a CF card is not inserted, time out quickly */
+#define CFG_LBLAWBAR3_PRELIM   CFG_CF_BASE
+#define CFG_LBLAWAR3_PRELIM    (LBLAWAR_EN | LBLAWAR_64KB)
 
 #endif
 
-#define CONFIG_DOS_PARTITION
-
-#define CFG_MID_FLASH_JUMP     0x7F000000
+/*
+ * U-Boot memory configuration
+ */
 #define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
 
-
 #if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
 #define CFG_RAMBOOT
 #else
 
 #define CONFIG_L1_INIT_RAM
 #define CFG_INIT_RAM_LOCK
-#define CFG_INIT_RAM_ADDR      0xFD000000              /* Initial RAM address */
-#define CFG_INIT_RAM_END       0x1000       /* End of used area in RAM*/
+#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_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_LCRR       (LCRR_DBYP | LCRR_CLKDIV_4)
 #define CFG_LBC_LBCR   0x00000000
 
-#undef CFG_LB_SDRAM    /* if board has SRDAM on local bus */
-
-#ifdef CFG_LB_SDRAM
-/*local bus BR2, OR2 definition for SDRAM if soldered on the ADS board*/
-/*
- * Base Register 2 and Option Register 2 configure SDRAM.
- * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000.
- *
- * For BR2, need:
- *    Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0
- *    port-size = 32-bits = BR2[19:20] = 11
- *    no parity checking = BR2[21:22] = 00
- *    SDRAM for MSEL = BR2[24:26] = 011
- *    Valid = BR[31] = 1
- *
- * 0   4    8    12   16   20   24   28
- * 1111 0000 0000 0000 0001 1000 0110 0001 = F0001861
- */
-
-#define CFG_LBC_SDRAM_BASE     0xf0000000      /* Localbus SDRAM */
-#define CFG_LBC_SDRAM_SIZE     64              /* LBC SDRAM is 64MB */
-
-#define CFG_LBLAWBAR2_PRELIM   0xF0000000
-#define CFG_LBLAWAR2_PRELIM    0x80000019 /* 64M */
-
-#define CFG_BR2_PRELIM         (CFG_LBC_SDRAM_BASE | BR_PS_32 | BR_MS_SDRAM | BR_V)
-#define CFG_OR2_PRELIM         (0xFC000000 /* 64 MB */ | \
-                                OR_SDRAM_XAM | \
-                                ((9 - 7) << OR_SDRAM_COLS_SHIFT) | \
-                                ((13 - 9) << OR_SDRAM_ROWS_SHIFT) | \
-                                OR_SDRAM_EAD)
-
 #define CFG_LBC_LSRT   0x32000000    /* LB sdram refresh timer, about 6us */
 #define CFG_LBC_MRTPR  0x20000000    /* LB refresh timer prescal, 266MHz/32*/
 
-/*
- * LSDMR masks
- */
-#define CFG_LBC_LSDMR_RFEN     (1 << (31 -  1))
-#define CFG_LBC_LSDMR_BSMA1516 (3 << (31 - 10))
-#define CFG_LBC_LSDMR_BSMA1617 (4 << (31 - 10))
-#define CFG_LBC_LSDMR_RFCR5    (3 << (31 - 16))
-#define CFG_LBC_LSDMR_RFCR8    (5 << (31 - 16))
-#define CFG_LBC_LSDMR_RFCR16   (7 << (31 - 16))
-#define CFG_LBC_LSDMR_PRETOACT3 (3 << (31 - 19))
-#define CFG_LBC_LSDMR_PRETOACT6 (5 << (31 - 19))
-#define CFG_LBC_LSDMR_PRETOACT7 (7 << (31 - 19))
-#define CFG_LBC_LSDMR_ACTTORW3 (3 << (31 - 22))
-#define CFG_LBC_LSDMR_ACTTORW7 (7 << (31 - 22))
-#define CFG_LBC_LSDMR_ACTTORW6 (6 << (31 - 22))
-#define CFG_LBC_LSDMR_BL8      (1 << (31 - 23))
-#define CFG_LBC_LSDMR_WRC2     (2 << (31 - 27))
-#define CFG_LBC_LSDMR_WRC3     (3 << (31 - 27))
-#define CFG_LBC_LSDMR_WRC4     (0 << (31 - 27))
-#define CFG_LBC_LSDMR_BUFCMD   (1 << (31 - 29))
-#define CFG_LBC_LSDMR_CL3      (3 << (31 - 31))
-
-#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_MRW   (3 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4))
-#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4))
-
-#define CFG_LBC_LSDMR_COMMON   ( CFG_LBC_LSDMR_RFEN            \
-                               | CFG_LBC_LSDMR_BSMA1516        \
-                               | CFG_LBC_LSDMR_RFCR8           \
-                               | CFG_LBC_LSDMR_PRETOACT6       \
-                               | CFG_LBC_LSDMR_ACTTORW3        \
-                               | CFG_LBC_LSDMR_BL8             \
-                               | CFG_LBC_LSDMR_WRC3            \
-                               | CFG_LBC_LSDMR_CL3             \
-                               )
-
-/*
- * SDRAM Controller configuration sequence.
- */
-#define CFG_LBC_LSDMR_1                ( CFG_LBC_LSDMR_COMMON \
-                               | CFG_LBC_LSDMR_OP_PCHALL)
-#define CFG_LBC_LSDMR_2                ( CFG_LBC_LSDMR_COMMON \
-                               | CFG_LBC_LSDMR_OP_ARFRSH)
-#define CFG_LBC_LSDMR_3                ( CFG_LBC_LSDMR_COMMON \
-                               | CFG_LBC_LSDMR_OP_ARFRSH)
-#define CFG_LBC_LSDMR_4                ( CFG_LBC_LSDMR_COMMON \
-                               | CFG_LBC_LSDMR_OP_MRW)
-#define CFG_LBC_LSDMR_5                ( CFG_LBC_LSDMR_COMMON \
-                               | CFG_LBC_LSDMR_OP_NORMAL)
-#endif
-
 /*
  * Serial Port
  */
 #define CFG_NS16550_CLK                get_bus_freq(0)
 
 #define CFG_BAUDRATE_TABLE  \
-       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200}
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 115200}
+
+#define CONFIG_BAUDRATE                115200
 
 #define CFG_NS16550_COM1       (CFG_IMMR + 0x4500)
 #define CFG_NS16550_COM2       (CFG_IMMR + 0x4600)
 
-/* Use the HUSH parser */
-#define CFG_HUSH_PARSER
-#ifdef CFG_HUSH_PARSER
-#define CFG_PROMPT_HUSH_PS2 "> "
-#endif
-
 /* pass open firmware flat tree */
-#define CONFIG_OF_FLAT_TREE    1
-#define CONFIG_OF_BOARD_SETUP  1
+#define CONFIG_OF_FLAT_TREE
+#define CONFIG_OF_BOARD_SETUP
 
 /* maximum size of the flat tree (8K) */
 #define OF_FLAT_TREE_MAX_SIZE  8192
 #define OF_TBCLK               (bd->bi_busfreq / 4)
 #define OF_STDOUT_PATH         "/soc8349@e0000000/serial@4500"
 
+/*
+ * PCI
+ */
 #ifdef CONFIG_PCI
 
 #define CONFIG_MPC83XX_PCI2
 
 #endif
 
+#define PCI_66M
+#ifdef PCI_66M
+#define CONFIG_83XX_CLKIN      66666666        /* in Hz */
+#else
+#define CONFIG_83XX_CLKIN      33333333        /* in Hz */
+#endif
+
 /* TSEC */
 
 #ifdef CONFIG_TSEC_ENET
 
-#ifndef CONFIG_NET_MULTI
 #define CONFIG_NET_MULTI
-#endif
-
 #define CONFIG_MII
 #define CONFIG_PHY_GIGE                /* In case CFG_CMD_MII is specified */
 
 #endif
 
 #ifdef CONFIG_MPC83XX_TSEC2
+#define CONFIG_HAS_ETH1
 #define CONFIG_MPC83XX_TSEC2_NAME  "TSEC1"
 #define CFG_TSEC2_OFFSET       0x25000
 #define CONFIG_UNKNOWN_TSEC    /* TSEC2 is proprietary */
 
 #endif
 
-
 /*
  * Environment
  */
+#define CONFIG_ENV_OVERWRITE
+
 #ifndef CFG_RAMBOOT
   #define CFG_ENV_IS_IN_FLASH
-  #define CFG_ENV_ADDR         (CFG_MONITOR_BASE + 0x40000)
-  #define CFG_ENV_SECT_SIZE    0x20000 /* 128K(one sector) for env */
+  #define CFG_ENV_SECT_SIZE    0x10000 /* 64K (one sector) for environment */
+  #define CFG_ENV_ADDR         (CFG_MONITOR_BASE + (4 * CFG_ENV_SECT_SIZE))
   #define CFG_ENV_SIZE         0x2000
 #else
   #define CFG_NO_FLASH         /* Flash is not usable now */
 /* Watchdog */
 
 #undef CONFIG_WATCHDOG         /* watchdog disabled */
-#ifdef CONFIG_WATCHDOG
-#define CFG_WATCHDOG_VALUE     0xFFFFFFC3
-#endif
 
 /*
  * Miscellaneous configurable options
  */
 #define CFG_LONGHELP                   /* undef to save memory */
+#define CONFIG_CMDLINE_EDITING         /* Command-line editing */
+#define CFG_HUSH_PARSER                        /* Use the HUSH parser */
+#define CFG_PROMPT_HUSH_PS2 "> "
+
 #define CFG_LOAD_ADDR  0x2000000       /* default load address */
-#define CFG_PROMPT     "MPC8349E-mITX> "               /* Monitor Command Prompt */
+#define CONFIG_LOADADDR        200000  /* default location for tftp and bootm */
+
+#ifdef CONFIG_MPC8349ITX
+#define CFG_PROMPT     "MPC8349E-mITX> "       /* Monitor Command Prompt */
+#else
+#define CFG_PROMPT     "MPC8349E-mITX-GP> "    /* Monitor Command Prompt */
+#endif
 
 #if (CONFIG_COMMANDS & CFG_CMD_KGDB)
     #define CFG_CBSIZE 1024            /* Console I/O Buffer Size */
  */
 #define CFG_BOOTMAPSZ  (8 << 20)       /* Initial Memory map for Linux*/
 
-/* Cache Configuration */
+/*
+ * Cache Configuration
+ */
 #define CFG_DCACHE_SIZE                32768
 #define CFG_CACHELINE_SIZE     32
 #if (CONFIG_COMMANDS & CFG_CMD_KGDB)
 #define CFG_CACHELINE_SHIFT    5       /* log2 of the above value */
 #endif
 
-#define CFG_RCWH_PCIHOST 0x80000000 /* PCIHOST */
-
 #define CFG_HRCW_LOW (\
        HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
        HRCWL_DDR_TO_SCB_CLK_1X1 |\
        HRCWL_VCO_1X2 |\
        HRCWL_CORE_TO_CSB_2X1)
 
-#ifdef PCI_64BIT
+#ifdef CFG_LOWBOOT
 #define CFG_HRCW_HIGH (\
        HRCWH_PCI_HOST |\
-       HRCWH_64_BIT_PCI |\
+       HRCWH_32_BIT_PCI |\
        HRCWH_PCI1_ARBITER_ENABLE |\
-       HRCWH_PCI2_ARBITER_DISABLE |\
+       HRCWH_PCI2_ARBITER_ENABLE |\
        HRCWH_CORE_ENABLE |\
        HRCWH_FROM_0X00000100 |\
        HRCWH_BOOTSEQ_DISABLE |\
        HRCWH_PCI_HOST |\
        HRCWH_32_BIT_PCI |\
        HRCWH_PCI1_ARBITER_ENABLE |\
-       HRCWH_PCI2_ARBITER_DISABLE |\
+       HRCWH_PCI2_ARBITER_ENABLE |\
        HRCWH_CORE_ENABLE |\
        HRCWH_FROM_0XFFF00100 |\
        HRCWH_BOOTSEQ_DISABLE |\
        HRCWH_TSEC2M_IN_GMII )
 #endif
 
-/* System performance */
+/*
+ * System performance
+ */
 #define CFG_ACR_PIPE_DEP       3       /* Arbiter pipeline depth (0-3) */
 #define CFG_ACR_RPTCNT         3       /* Arbiter repeat count (0-7) */
 #define CFG_SPCR_TSEC1EP       3       /* TSEC1 emergency priority (0-3) */
 #define CFG_SPCR_TSEC2EP       3       /* TSEC2 emergency priority (0-3) */
 #define CFG_SCCR_TSEC1CM       1       /* TSEC1 clock mode (0-3) */
 #define CFG_SCCR_TSEC2CM       1       /* TSEC2 & I2C0 clock mode (0-3) */
-#define CFG_ACR_RPTCNT         3       /* Arbiter repeat count */
 
-/* System IO Config */
+/*
+ * System IO Config
+ */
 #define CFG_SICRH SICRH_TSOBI1 /* Needed for gigabit to work on TSEC 1 */
 #define CFG_SICRL (SICRL_LDP_A | SICRL_USB1)
 
-#define CFG_HID0_INIT 0x000000000
-
-#define CFG_HID0_FINAL CFG_HID0_INIT
+#define CFG_HID0_INIT  0x000000000
+#define CFG_HID0_FINAL CFG_HID0_INIT
 
 #define CFG_HID2       HID2_HBE
 
-/* DDR @ 0x00000000 */
+/* DDR  */
 #define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
 #define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
 
-/* PCI @ 0x80000000 */
+/* PCI  */
 #ifdef CONFIG_PCI
 #define CFG_IBAT1L     (CFG_PCI1_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
 #define CFG_IBAT1U     (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
 #endif
 
 #ifdef CONFIG_MPC83XX_TSEC2
-#define CONFIG_HAS_ETH1
 #define CONFIG_ETH1ADDR                00:E0:0C:00:8C:02
 #endif
 
-#if 1
-#define CONFIG_IPADDR          10.82.19.159
-#define CONFIG_SERVERIP                10.82.48.106
-#define CONFIG_GATEWAYIP       10.82.19.254
-#define CONFIG_NETMASK         255.255.252.0
-#define CONFIG_NETDEV          eth0
-
-#define CONFIG_HOSTNAME                mpc8349emitx
-#define CONFIG_ROOTPATH                /nfsroot0/u/timur/itx-ltib/rootfs
-#define CONFIG_BOOTFILE                timur/uImage
-
-#define CONFIG_UBOOTPATH       timur/u-boot.bin
-#else
 #define CONFIG_IPADDR          192.168.1.253
 #define CONFIG_SERVERIP                192.168.1.1
 #define CONFIG_GATEWAYIP       192.168.1.1
 #define CONFIG_NETMASK         255.255.252.0
 #define CONFIG_NETDEV          eth0
 
+#ifdef CONFIG_MPC8349ITX
 #define CONFIG_HOSTNAME                mpc8349emitx
-#define CONFIG_ROOTPATH                /nfsroot/rootfs
-#define CONFIG_BOOTFILE                uImage
-
-#define CONFIG_UBOOTPATH       u-boot.bin
+#else
+#define CONFIG_HOSTNAME                mpc8349emitxgp
 #endif
 
-#define CONFIG_UBOOTSTART      fe700000
-#define CONFIG_UBOOTEND                fe77ffff
-
-#define CONFIG_LOADADDR                200000  /* default location for tftp and bootm */
-
-#define CONFIG_BAUDRATE                115200
+/* Default path and filenames */
+#define CONFIG_ROOTPATH                /nfsroot/rootfs
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_UBOOTPATH       u-boot.bin      /* U-Boot image on TFTP server */
 
-#undef CONFIG_BOOTCOMMAND
-#ifdef CONFIG_BOOTCOMMAND
-#define CONFIG_BOOTDELAY       6
+#ifdef CONFIG_MPC8349ITX
+#define CONFIG_FDTFILE         mpc8349emitx.dtb
 #else
-#define CONFIG_BOOTDELAY       -1      /* -1 disables auto-boot */
+#define CONFIG_FDTFILE         mpc8349emitxgp.dtb
 #endif
 
+#define CONFIG_BOOTDELAY       0
+
 #define XMK_STR(x)     #x
 #define MK_STR(x)      XMK_STR(x)
 
 #define CONFIG_BOOTARGS \
        "root=/dev/nfs rw" \
        " nfsroot=" MK_STR(CONFIG_SERVERIP) ":" MK_STR(CONFIG_ROOTPATH) \
-       " ip=" MK_STR(CONFIG_IPADDR) ":" MK_STR(CONFIG_SERVERIP) ":" \
+       " ip=" MK_STR(CONFIG_IPADDR) ":" MK_STR(CONFIG_SERVERIP) ":"    \
                MK_STR(CONFIG_GATEWAYIP) ":" MK_STR(CONFIG_NETMASK) ":" \
                MK_STR(CONFIG_HOSTNAME) ":" MK_STR(CONFIG_NETDEV) ":off" \
        " console=ttyS0," MK_STR(CONFIG_BAUDRATE)
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
-       "netdev=" MK_STR(CONFIG_NETDEV) "\0" \
-       "tftpflash=tftpboot $loadaddr " MK_STR(CONFIG_UBOOTPATH) "; " \
-               "erase " MK_STR(CONFIG_UBOOTSTART) " " MK_STR(CONFIG_UBOOTEND) "; " \
-               "cp.b $loadaddr " MK_STR(CONFIG_UBOOTSTART) " $filesize; " \
-               "cmp.b $loadaddr " MK_STR(CONFIG_UBOOTSTART) " $filesize\0" \
-       "tftpupdate=tftpboot $loadaddr " MK_STR(CONFIG_UBOOTPATH) "; " \
-               "protect off FEF00000 FEF7FFFF; " \
-               "erase FEF00000 FEF7FFFF; " \
-               "cp.b $loadaddr FEF00000 $filesize; " \
-               "protect on FEF00000 FEF7FFFF; " \
-               "cmp.b $loadaddr FEF00000 $filesize\0" \
-       "tftplinux=tftpboot $loadaddr $bootfile; bootm\0" \
-       "copyuboot=erase " MK_STR(CONFIG_UBOOTSTART) " " MK_STR(CONFIG_UBOOTEND) "; " \
-               "cp.b fef00000 " MK_STR(CONFIG_UBOOTSTART) " 80000\0"   \
+       "netdev=" MK_STR(CONFIG_NETDEV) "\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=mpc8349emitx.dtb\0"                                    \
-       ""
+       "fdtfile=" MK_STR(CONFIG_FDTFILE) "\0"
 
 #define CONFIG_NFSBOOTCOMMAND                                          \
-   "setenv bootargs root=/dev/nfs rw "                                 \
-      "nfsroot=$serverip:$rootpath "                                   \
-      "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
-      "console=$consoledev,$baudrate $othbootargs;"                    \
-   "tftp $loadaddr $bootfile;"                                         \
-   "tftp $fdtaddr $fdtfile;"                                           \
-   "bootm $loadaddr - $fdtaddr"
+       "setenv bootargs root=/dev/nfs rw nfsroot=$serverip:$rootpath"  \
+       " ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+       " console=$console,$baudrate $othbootargs; "                    \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr - $fdtaddr"
 
 #define CONFIG_RAMBOOTCOMMAND                                          \
-   "setenv bootargs root=/dev/ram rw "                                 \
-      "console=$consoledev,$baudrate $othbootargs;"                    \
-   "tftp $ramdiskaddr $ramdiskfile;"                                   \
-   "tftp $loadaddr $bootfile;"                                         \
-   "tftp $fdtaddr $fdtfile;"                                           \
-   "bootm $loadaddr $ramdiskaddr $fdtaddr"
-
+       "setenv bootargs root=/dev/ram rw"                              \
+       " console=$console,$baudrate $othbootargs; "                    \
+       "tftp $ramdiskaddr $ramdiskfile;"                               \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr $ramdiskaddr $fdtaddr"
 
 #undef MK_STR
 #undef XMK_STR
index 8ad6551de73553b9412ea0aafb10ee6563448391..d2af0e1dfc4f86ac6810fd2b6481abe6a61cf4cb 100644 (file)
 #define CFG_DDR_BASE           0x00000000 /* DDR is system memory */
 #define CFG_SDRAM_BASE         CFG_DDR_BASE
 #define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
+#define CFG_DDR_SDRAM_CLK_CNTL (DDR_SDRAM_CLK_CNTL_SS_EN | \
+                               DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05)
 
 #define CFG_83XX_DDR_USES_CS0
 
-#undef CONFIG_DDR_ECC          /* only for ECC DDR module */
+#define CONFIG_DDR_ECC         /* support DDR ECC function */
 #define CONFIG_DDR_ECC_CMD     /* Use DDR ECC user commands */
 
+/*
+ * DDRCDR - DDR Control Driver Register
+ */
+#define CFG_DDRCDR_VALUE       0x80080001
+
 #define CONFIG_SPD_EEPROM      /* Use SPD EEPROM for DDR setup */
 #if defined(CONFIG_SPD_EEPROM)
 /*
  * Manually set up DDR parameters
  */
 #define CFG_DDR_SIZE           256 /* MB */
+#if defined(CONFIG_DDR_II)
+#define CFG_DDRCDR             0x80080001
+#define CFG_DDR_CS0_BNDS       0x0000000f
+#define CFG_DDR_CS0_CONFIG     0x80330102
+#define CFG_DDR_TIMING_0       0x00220802
+#define CFG_DDR_TIMING_1       0x38357322
+#define CFG_DDR_TIMING_2       0x2f9048c8
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_CLK_CNTL       0x02000000
+#define CFG_DDR_MODE           0x47d00432
+#define CFG_DDR_MODE2          0x8000c000
+#define CFG_DDR_INTERVAL       0x03cf0080
+#define CFG_DDR_SDRAM_CFG      0x43000000
+#define CFG_DDR_SDRAM_CFG2     0x00401000
+#else
 #define CFG_DDR_CONFIG (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_9)
 #define CFG_DDR_TIMING_1       0x37344321 /* tCL-tRCD-tRP-tRAS=2.5-3-3-7 */
 #define CFG_DDR_TIMING_2       0x00000800 /* may need tuning */
 #define CFG_DDR_MODE           0x20000162 /* DLL,normal,seq,4/2.5 */
 #define CFG_DDR_INTERVAL       0x045b0100 /* page mode */
 #endif
+#endif
 
 /*
  * Memory test
 #define CFG_FLASH_CFI          /* use the Common Flash Interface */
 #define CFG_FLASH_CFI_DRIVER   /* use the CFI driver */
 #define CFG_FLASH_BASE         0xFE000000 /* FLASH base address */
-#define CFG_FLASH_SIZE         16 /* FLASH size is 16M */
+#define CFG_FLASH_SIZE         32 /* max FLASH size is 32M */
 
 #define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE /* Window base at flash base */
 #define CFG_LBLAWAR0_PRELIM    0x80000018 /* 32MB window size */
 #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         0xfe006ff7 /* 16MB Flash size */
+#define CFG_OR0_PRELIM         ((~(CFG_FLASH_SIZE - 1) << 20) | OR_UPM_XAM | \
+                               OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | OR_GPCM_SCY_15 | \
+                               OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD)
 
 #define CFG_MAX_FLASH_BANKS    1 /* number of banks */
-#define CFG_MAX_FLASH_SECT     128 /* sectors per device */
+#define CFG_MAX_FLASH_SECT     256 /* max sectors per device */
 
 #undef CFG_FLASH_CHECKSUM
 
  */
 #define CFG_BCSR               0xF8000000
 #define CFG_LBLAWBAR1_PRELIM   CFG_BCSR /* Access window base at BCSR base */
-#define CFG_LBLAWAR1_PRELIM    0x8000000E /* Access window size 32K */
+#define CFG_LBLAWAR1_PRELIM    0x8000000F /* Access window size 64K */
 
 #define CFG_BR1_PRELIM         (CFG_BCSR|0x00000801) /* Port size=8bit, MSEL=GPCM */
 #define CFG_OR1_PRELIM         0xFFFFE9f7 /* length 32K */
 /*
  * Windows to access PIB via local bus
  */
-#define CFG_LBLAWBAR3_PRELIM   0xf8008000 /* windows base 0xf8008000 */
-#define CFG_LBLAWAR3_PRELIM    0x8000000f /* windows size 64KB */
+#define CFG_LBLAWBAR3_PRELIM   0xf8010000 /* windows base 0xf8010000 */
+#define CFG_LBLAWAR3_PRELIM    0x8000000e /* windows size 32KB */
 
 /*
  * CS4 on Local Bus, to PIB
 #define CFG_NS16550_COM1       (CFG_IMMR+0x4500)
 #define CFG_NS16550_COM2       (CFG_IMMR+0x4600)
 
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
 /* Use the HUSH parser */
 #define CFG_HUSH_PARSER
 #ifdef CFG_HUSH_PARSER
 
 #define OF_CPU                 "PowerPC,8360@0"
 #define OF_SOC                 "soc8360@e0000000"
+#define OF_QE                  "qe@e0100000"
 #define OF_TBCLK               (bd->bi_busfreq / 4)
 #define OF_STDOUT_PATH         "/soc8360@e0000000/serial@4500"
 
    "ramdiskaddr=1000000\0"                                             \
    "ramdiskfile=ramfs.83xx\0"                                          \
    "fdtaddr=400000\0"                                                  \
-   "fdtfile=mpc8349emds.dtb\0"                                         \
+   "fdtfile=mpc8360emds.dtb\0"                                         \
    ""
 
 #define CONFIG_NFSBOOTCOMMAND                                          \
index dd5d83168042f121c85a6c7938e2234bfabcb2d9..d02c39b28f96b4b88271f873b05a367fb5c6857c 100644 (file)
 
 #define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
 
-#if 0 /* test-only */
 #define CONFIG_NET_MULTI       1
+#undef  CONFIG_HAS_ETH1
 
 #define CONFIG_MII             1       /* MII PHY management           */
 #define CONFIG_PHY_ADDR                0       /* PHY address                  */
-#define CONFIG_PHY1_ADDR       1       /* PHY address                  */
-#else
-#define CONFIG_MII             1       /* MII PHY management           */
-#define CONFIG_PHY_ADDR                0       /* PHY address                  */
-#endif
 #define CONFIG_LXT971_NO_SLEEP  1       /* disable sleep mode in LXT971 */
+#define CONFIG_RESET_PHY_R      1       /* use reset_phy() to disable phy sleep mode */
 
 #define CONFIG_PHY_CLK_FREQ    EMAC_STACR_CLK_66MHZ /* 66 MHz OPB clock*/
 
index 728083b304c4e4b58f48a985e3044b1472fe1838..ed0357791b457653c31f09db3fab76d756e470ce 100644 (file)
  */
 #define CFG_LCRR               (LCRR_DBYP | LCRR_CLKDIV_8)
 
-#define CFG_SCCR_INIT          (SCCR_DEFAULT & (~SCCR_CLK_MASK))
-#define CFG_SCCR_TSEC1CM       SCCR_TSEC1CM_1  /* TSEC1 clock setting */
-#define CFG_SCCR_TSEC2CM       SCCR_TSEC2CM_1  /* TSEC2 clock setting */
-#define CFG_SCCR_ENCCM         SCCR_ENCCM_3    /* ENC clock setting */
-#define CFG_SCCR_USBCM         SCCR_USBCM_3    /* USB clock setting */
-#define CFG_SCCR_VAL           ( CFG_SCCR_INIT         \
-                               | CFG_SCCR_TSEC1CM      \
-                               | CFG_SCCR_TSEC2CM      \
-                               | CFG_SCCR_ENCCM        \
-                               | CFG_SCCR_USBCM        )
-
 /* board pre init: do not call, nothing to do */
 #undef CONFIG_BOARD_EARLY_INIT_F
 
index cfaf1532233264ec1091ada20b30e260d16cbe0f..095b5f6dc27b2d1557e58ebaf3062ddf81f05d7e 100644 (file)
  */
 #define CONFIG_MPC5xxx_FEC     1
 #define CONFIG_PHY_ADDR                0x00
+#define CONFIG_MII             1               /* MII PHY management           */
 
 /*
  * GPIO configuration
index f21550dc36e847d679d1e5facc6be97ac7b57e9f..64dbd9b9f9eaa9d9ba4dccd5c165bf40b9aa8463 100644 (file)
@@ -58,7 +58,7 @@
  * 0x40000000 - 0x4fffffff - PCI Memory
  * 0x50000000 - 0x50ffffff - PCI IO Space
  */
-//#define CONFIG_PCI
+/*#define CONFIG_PCI           */
 
 #if defined(CONFIG_PCI)
 #define CONFIG_PCI_PNP         1
diff --git a/include/configs/katmai.h b/include/configs/katmai.h
new file mode 100644 (file)
index 0000000..1606d0d
--- /dev/null
@@ -0,0 +1,429 @@
+/*
+ * (C) Copyright 2007
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
+ *
+ * (C) Copyright 2004 Paul Reynolds <PaulReynolds@lhsolutions.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
+ */
+
+/************************************************************************
+ * katmai.h - configuration for AMCC Katmai (440SPe)
+ ***********************************************************************/
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*-----------------------------------------------------------------------
+ * High Level Configuration Options
+ *----------------------------------------------------------------------*/
+#define CONFIG_KATMAI                  1       /* Board is Katmai      */
+#define CONFIG_4xx                     1       /* ... PPC4xx family    */
+#define CONFIG_440                     1       /* ... PPC440 family    */
+#define CONFIG_440SPE                  1       /* Specifc SPe support  */
+#undef CFG_DRAM_TEST                           /* Disable-takes long time */
+#define CONFIG_SYS_CLK_FREQ    33333333        /* external freq to pll */
+
+#define CONFIG_BOARD_EARLY_INIT_F 1    /* Call board_pre_init          */
+#define        CONFIG_MISC_INIT_F      1       /* Use misc_init_f()            */
+#define CONFIG_ADD_RAM_INFO    1       /* Print additional info        */
+#undef  CONFIG_SHOW_BOOT_PROGRESS
+
+/*-----------------------------------------------------------------------
+ * Base addresses -- Note these are effective addresses where the
+ * actual resources get mapped (not physical addresses)
+ *----------------------------------------------------------------------*/
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (512 * 1024)    /* Reserve 512 kB for malloc */
+
+#define CFG_SDRAM_BASE         0x00000000      /* _must_ be 0          */
+#define CFG_FLASH_BASE         0xff000000      /* start of FLASH       */
+#define CFG_MONITOR_BASE       TEXT_BASE
+#define CFG_PERIPHERAL_BASE    0xa0000000      /* internal peripherals */
+#define CFG_ISRAM_BASE         0x90000000      /* internal SRAM        */
+
+#define CFG_PCI_MEMBASE                0x80000000      /* mapped PCI memory    */
+#define CFG_PCI_BASE           0xd0000000      /* internal PCI regs    */
+#define CFG_PCI_TARGBASE       CFG_PCI_MEMBASE
+
+#define CFG_PCIE_MEMBASE       0xb0000000      /* mapped PCIe memory   */
+#define CFG_PCIE_MEMSIZE       0x01000000
+#define CFG_PCIE_BASE          0xe0000000      /* PCIe UTL regs */
+
+#define CFG_PCIE0_CFGBASE      0xc0000000
+#define CFG_PCIE0_XCFGBASE     0xc0000400
+#define CFG_PCIE1_CFGBASE      0xc0001000
+#define CFG_PCIE1_XCFGBASE     0xc0001400
+#define CFG_PCIE2_CFGBASE      0xc0002000
+#define CFG_PCIE2_XCFGBASE     0xc0002400
+
+/* System RAM mapped to PCI space */
+#define CONFIG_PCI_SYS_MEM_BUS CFG_SDRAM_BASE
+#define CONFIG_PCI_SYS_MEM_PHYS        CFG_SDRAM_BASE
+#define CONFIG_PCI_SYS_MEM_SIZE        (1024 * 1024 * 1024)
+
+#define CFG_ACE_BASE           0xe0000000      /* Xilinx ACE controller - Compact Flash */
+
+/*-----------------------------------------------------------------------
+ * Initial RAM & stack pointer (placed in internal SRAM)
+ *----------------------------------------------------------------------*/
+#define CFG_TEMP_STACK_OCM     1
+#define CFG_OCM_DATA_ADDR      CFG_ISRAM_BASE
+#define CFG_INIT_RAM_ADDR      CFG_ISRAM_BASE  /* Initial RAM address  */
+#define CFG_INIT_RAM_END       0x2000          /* End of used area in RAM */
+#define CFG_GBL_DATA_SIZE      128             /* num bytes initial data */
+
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_POST_WORD_ADDR     (CFG_GBL_DATA_OFFSET - 0x4)
+#define CFG_INIT_SP_OFFSET     CFG_POST_WORD_ADDR
+
+/*-----------------------------------------------------------------------
+ * Serial Port
+ *----------------------------------------------------------------------*/
+#define CONFIG_SERIAL_MULTI    1
+#undef CONFIG_UART1_CONSOLE
+#undef CFG_EXT_SERIAL_CLOCK
+#define CONFIG_BAUDRATE                115200
+#define CFG_BAUDRATE_TABLE  \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
+
+/*-----------------------------------------------------------------------
+ * DDR SDRAM
+ *----------------------------------------------------------------------*/
+#define CONFIG_SPD_EEPROM      1       /* Use SPD EEPROM for setup     */
+#define SPD_EEPROM_ADDRESS     {0x51, 0x52}    /* SPD i2c spd addresses*/
+#define CONFIG_DDR_ECC         1       /* with ECC support             */
+#undef  CONFIG_STRESS
+
+/*-----------------------------------------------------------------------
+ * I2C
+ *----------------------------------------------------------------------*/
+#define CONFIG_HARD_I2C                1       /* I2C with hardware support    */
+#undef CONFIG_SOFT_I2C                 /* I2C bit-banged               */
+#define CFG_I2C_SPEED          100000  /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_CMD_TREE
+#define CFG_SPD_BUS_NUM                0       /* The I2C bus for SPD          */
+
+#define IIC0_BOOTPROM_ADDR     0x50
+#define IIC0_ALT_BOOTPROM_ADDR 0x54
+
+#define CFG_I2C_MULTI_EEPROMS
+#define CFG_I2C_EEPROM_ADDR    (0x50)
+#define CFG_I2C_EEPROM_ADDR_LEN 1
+#define CFG_EEPROM_PAGE_WRITE_ENABLE
+#define CFG_EEPROM_PAGE_WRITE_BITS 3
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10
+
+/* I2C RTC */
+#define CONFIG_RTC_M41T11      1
+#define CFG_RTC_BUS_NUM                1       /* The I2C bus for RTC          */
+#define CFG_I2C_RTC_ADDR       0x68
+#define CFG_M41T11_BASE_YEAR   1900    /* play along with linux        */
+
+/* I2C DTT */
+#define CONFIG_DTT_ADM1021     1       /* ADM1021 temp sensor support  */
+#define CFG_DTT_BUS_NUM                1       /* The I2C bus for DTT          */
+/*
+ * standard dtt sensor configuration - bottom bit will determine local or
+ * remote sensor of the ADM1021, the rest determines index into
+ * CFG_DTT_ADM1021 array below.
+ */
+#define CONFIG_DTT_SENSORS     { 0, 1 }
+
+/*
+ * ADM1021 temp sensor configuration (see dtt/adm1021.c for details).
+ * there will be one entry in this array for each two (dummy) sensors in
+ * CONFIG_DTT_SENSORS.
+ *
+ * For Katmai board:
+ * - only one ADM1021
+ * - i2c addr 0x18
+ * - conversion rate 0x02 = 0.25 conversions/second
+ * - ALERT ouput disabled
+ * - local temp sensor enabled, min set to 0 deg, max set to 85 deg
+ * - remote temp sensor enabled, min set to 0 deg, max set to 85 deg
+ */
+#define CFG_DTT_ADM1021                { { 0x18, 0x02, 0, 1, 0, 85, 1, 0, 58} }
+
+/*-----------------------------------------------------------------------
+ * Environment
+ *----------------------------------------------------------------------*/
+#define        CFG_ENV_IS_IN_FLASH     1       /* Environment uses flash       */
+
+#define CONFIG_PREBOOT "echo;" \
+       "echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
+       "echo"
+
+#undef CONFIG_BOOTARGS
+
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "netdev=eth0\0"                                                 \
+       "hostname=katmai\0"                                             \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}\0"\
+       "flash_nfs=run nfsargs addip addtty;"                           \
+               "bootm ${kernel_addr}\0"                                \
+       "flash_self=run ramargs addip addtty;"                          \
+               "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
+       "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;"     \
+               "bootm\0"                                               \
+       "rootpath=/opt/eldk/ppc_4xx\0"                          \
+       "bootfile=katmai/uImage\0"                                      \
+       "kernel_addr=fff10000\0"                                        \
+       "ramdisk_addr=fff20000\0"                                       \
+       "initrd_high=30000000\0"                                        \
+       "load=tftp 200000 katmai/u-boot.bin\0"                          \
+       "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
+               "cp.b ${fileaddr} fffc0000 ${filesize};"                \
+               "setenv filesize;saveenv\0"                             \
+       "upd=run load;run update\0"                                     \
+       "kozio=bootm ffc60000\0"                                        \
+       ""
+#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+#define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds     */
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
+
+#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
+                               CFG_CMD_ASKENV  | \
+                               CFG_CMD_EEPROM  | \
+                               CFG_CMD_DATE    | \
+                               CFG_CMD_DHCP    | \
+                               CFG_CMD_DIAG    | \
+                               CFG_CMD_DTT     | \
+                               CFG_CMD_ELF     | \
+                               CFG_CMD_EXT2    | \
+                               CFG_CMD_FAT     | \
+                               CFG_CMD_I2C     | \
+                               CFG_CMD_IRQ     | \
+                               CFG_CMD_MII     | \
+                               CFG_CMD_NET     | \
+                               CFG_CMD_NFS     | \
+                               CFG_CMD_PCI     | \
+                               CFG_CMD_PING    | \
+                               CFG_CMD_REGINFO | \
+                               CFG_CMD_SDRAM)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define        CONFIG_IBM_EMAC4_V4     1       /* 440SPe has this EMAC version */
+#define CONFIG_MII             1       /* MII PHY management           */
+#define CONFIG_PHY_ADDR                1       /* PHY address, See schematics  */
+#define CONFIG_HAS_ETH0
+#define CONFIG_PHY_RESET        1      /* reset phy upon startup       */
+#define CONFIG_PHY_RESET_DELAY 1000
+#define CONFIG_CIS8201_PHY     1       /* Enable 'special' RGMII mode for Cicada phy */
+#define CONFIG_PHY_GIGE                1       /* Include GbE speed/duplex detection */
+#define CFG_RX_ETH_BUFFER      32      /* Number of ethernet rx buffers & descriptors */
+
+#define CONFIG_NETCONSOLE              /* include NetConsole support   */
+#define CONFIG_NET_MULTI               /* needed for NetConsole        */
+
+#undef CONFIG_WATCHDOG                 /* watchdog disabled            */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                           /* undef to save memory         */
+#define CFG_PROMPT             "=> "           /* Monitor Command Prompt       */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CBSIZE             1024            /* Console I/O Buffer Size      */
+#else
+#define CFG_CBSIZE             256             /* Console I/O Buffer Size      */
+#endif
+#define CFG_PBSIZE             (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS            16              /* max number of command args   */
+#define CFG_BARGSIZE           CFG_CBSIZE      /* Boot Argument Buffer Size    */
+
+#define CFG_MEMTEST_START      0x0400000       /* memtest works on             */
+#define CFG_MEMTEST_END                0x0C00000       /* 4 ... 12 MB in DRAM          */
+
+#define CFG_LOAD_ADDR          0x100000        /* default load address         */
+#define CFG_EXTBDINFO          1               /* To use extended board_into (bd_t) */
+
+#define CFG_HZ                 1000            /* decrementer freq: 1 ms ticks */
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+#define CONFIG_LOOPW            1       /* enable loopw command         */
+#define CONFIG_MX_CYCLIC        1       /* enable mdc/mwc commands      */
+#define CONFIG_ZERO_BOOTDELAY_CHECK    /* check for keypress on bootdelay==0 */
+#define CONFIG_VERSION_VARIABLE 1      /* include version env variable */
+
+#define CFG_4xx_RESET_TYPE     0x2     /* use chip reset on this board */
+
+/*-----------------------------------------------------------------------
+ * FLASH related
+ *----------------------------------------------------------------------*/
+#define CFG_FLASH_CFI
+#define CFG_FLASH_CFI_DRIVER
+#define CFG_FLASH_EMPTY_INFO           /* print 'E' for empty sector on flinfo */
+#define CFG_FLASH_USE_BUFFER_WRITE 1   /* use buffered writes (20x faster)     */
+
+#define CFG_FLASH_BANKS_LIST    {CFG_FLASH_BASE}
+#define CFG_MAX_FLASH_BANKS     1                  /* number of banks      */
+#define CFG_MAX_FLASH_SECT     1024                /* sectors per device   */
+
+#undef CFG_FLASH_CHECKSUM
+#define CFG_FLASH_ERASE_TOUT   120000  /* Timeout for Flash Erase (in ms)      */
+#define CFG_FLASH_WRITE_TOUT   500     /* Timeout for Flash Write (in ms)      */
+
+#define CFG_ENV_SECT_SIZE      0x20000 /* size of one complete sector  */
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE)
+#define        CFG_ENV_SIZE            0x4000  /* Total Size of Environment Sector     */
+
+/* Address and size of Redundant Environment Sector    */
+#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR-CFG_ENV_SECT_SIZE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
+
+/*-----------------------------------------------------------------------
+ * PCI stuff
+ *-----------------------------------------------------------------------
+ */
+/* General PCI */
+#define CONFIG_PCI                     /* include pci support          */
+#define CONFIG_PCI_PNP         1       /* do pci plug-and-play         */
+#define CONFIG_PCI_SCAN_SHOW   1       /* show pci devices on startup  */
+#undef CONFIG_PCI_CONFIG_HOST_BRIDGE
+
+/* Board-specific PCI */
+#define CFG_PCI_PRE_INIT       1       /* enable board pci_pre_init()  */
+#define CFG_PCI_TARGET_INIT            /* let board init pci target    */
+#undef CFG_PCI_MASTER_INIT
+
+#define CFG_PCI_SUBSYS_VENDORID 0x1014 /* IBM                          */
+#define CFG_PCI_SUBSYS_DEVICEID 0xcafe /* Whatever                     */
+/* #define CFG_PCI_SUBSYS_ID   CFG_PCI_SUBSYS_DEVICEID */
+
+/*
+ *  NETWORK Support (PCI):
+ */
+/* Support for Intel 82557/82559/82559ER chips. */
+#define CONFIG_EEPRO100
+
+/*-----------------------------------------------------------------------
+ * Xilinx System ACE support
+ *----------------------------------------------------------------------*/
+#define CONFIG_SYSTEMACE       1       /* Enable SystemACE support     */
+#define CFG_SYSTEMACE_WIDTH    16      /* Data bus width is 16         */
+#define CFG_SYSTEMACE_BASE     CFG_ACE_BASE
+#define CONFIG_DOS_PARTITION   1
+
+/*-----------------------------------------------------------------------
+ * External Bus Controller (EBC) Setup
+ *----------------------------------------------------------------------*/
+
+/* Memory Bank 0 (Flash) initialization                                        */
+#define CFG_EBC_PB0AP          (EBC_BXAP_BME_DISABLED      |           \
+                                EBC_BXAP_TWT_ENCODE(7)     |           \
+                                EBC_BXAP_BCE_DISABLE       |           \
+                                EBC_BXAP_BCT_2TRANS        |           \
+                                EBC_BXAP_CSN_ENCODE(0)     |           \
+                                EBC_BXAP_OEN_ENCODE(0)     |           \
+                                EBC_BXAP_WBN_ENCODE(0)     |           \
+                                EBC_BXAP_WBF_ENCODE(0)     |           \
+                                EBC_BXAP_TH_ENCODE(0)      |           \
+                                EBC_BXAP_RE_DISABLED       |           \
+                                EBC_BXAP_SOR_DELAYED       |           \
+                                EBC_BXAP_BEM_WRITEONLY     |           \
+                                EBC_BXAP_PEN_DISABLED)
+#define CFG_EBC_PB0CR          (EBC_BXCR_BAS_ENCODE(CFG_FLASH_BASE) |  \
+                                EBC_BXCR_BS_16MB                    |  \
+                                EBC_BXCR_BU_RW                      |  \
+                                EBC_BXCR_BW_16BIT)
+
+/* Memory Bank 1 (Xilinx System ACE controller) initialization         */
+#define CFG_EBC_PB1AP          0x7F8FFE80
+#define CFG_EBC_PB1CR          (EBC_BXCR_BAS_ENCODE(CFG_ACE_BASE)  |   \
+                                EBC_BXCR_BS_1MB                    |   \
+                                EBC_BXCR_BU_RW                     |   \
+                                EBC_BXCR_BW_16BIT)
+
+/*-------------------------------------------------------------------------
+ * Initialize EBC CONFIG -
+ * Keep the Default value, but the bit PDT which has to be set to 1 ?TBC
+ * default value : 0x07C00000 - 0 0 000 1 1 1 1 1 0000 0 00000 000000000000
+ *-------------------------------------------------------------------------*/
+#define CFG_EBC_CFG            (EBC_CFG_LE_UNLOCK    | \
+                                EBC_CFG_PTD_ENABLE   | \
+                                EBC_CFG_RTC_16PERCLK | \
+                                EBC_CFG_ATC_PREVIOUS | \
+                                EBC_CFG_DTC_PREVIOUS | \
+                                EBC_CFG_CTC_PREVIOUS | \
+                                EBC_CFG_OEO_PREVIOUS | \
+                                EBC_CFG_EMC_DEFAULT  | \
+                                EBC_CFG_PME_DISABLE  | \
+                                EBC_CFG_PR_16)
+
+/*-----------------------------------------------------------------------
+ * GPIO Setup
+ *----------------------------------------------------------------------*/
+#define CFG_GPIO_PCIE_PRESENT0 17
+#define CFG_GPIO_PCIE_PRESENT1 21
+#define CFG_GPIO_PCIE_PRESENT2 23
+#define CFG_GPIO_RS232_FORCEOFF        30
+
+#define CFG_PFC0               (GPIO_VAL(CFG_GPIO_PCIE_PRESENT0) | \
+                                GPIO_VAL(CFG_GPIO_PCIE_PRESENT1) | \
+                                GPIO_VAL(CFG_GPIO_PCIE_PRESENT2) | \
+                                GPIO_VAL(CFG_GPIO_RS232_FORCEOFF))
+#define CFG_GPIO_OR            GPIO_VAL(CFG_GPIO_RS232_FORCEOFF)
+#define CFG_GPIO_TCR           GPIO_VAL(CFG_GPIO_RS232_FORCEOFF)
+#define CFG_GPIO_ODR           0
+
+/*
+ * 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                8192    /* For AMCC 405 CPUs            */
+#define CFG_CACHELINE_SIZE     32      /* ...                          */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /* log base 2 of the above value */
+#endif
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01            /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02            /* Software reboot */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   230400  /* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  2       /* which serial port to use */
+#endif
+
+#endif /* __CONFIG_H */
index 5c9d208feb6edd79a3acefd7d4244de28ae40eaf..9c8769b200bf65b82b87d48aee4371bfb0fd11d6 100644 (file)
@@ -37,8 +37,9 @@
 #define CONFIG_440             1
 #define CONFIG_SYS_CLK_FREQ    33333333 /* external freq to pll        */
 
-#define CONFIG_BOARD_EARLY_INIT_F 1     /* call board_early_init_f()   */
+#define CONFIG_BOARD_EARLY_INIT_F 1    /* call board_early_init_f()    */
 #define CONFIG_MISC_INIT_R     1       /* call misc_init_r()           */
+#define CONFIG_ADD_RAM_INFO    1       /* Print additional info        */
 
 /*-----------------------------------------------------------------------
  * Base addresses -- Note these are effective addresses where the
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------*/
-#undef  CONFIG_SPD_EEPROM              /* SPD EEPROM init doesn't support DDR2 */
-#define SPD_EEPROM_ADDRESS {0x52,0x53} /* I2C SPD addresses */
-#define IIC0_DIMM0_ADDR         0x52
-#define IIC0_DIMM1_ADDR         0x53
+#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       */
 
 /*-----------------------------------------------------------------------
  * I2C
 #define CONFIG_NETCONSOLE              /* include NetConsole support   */
 #define CONFIG_NET_MULTI               /* needed for NetConsole        */
 
-/* Partitions */
-#define CONFIG_MAC_PARTITION
-#define CONFIG_DOS_PARTITION
-#define CONFIG_ISO_PARTITION
-
 #ifdef DEBUG
 #define CONFIG_PANIC_HANG
 #else
 
 #define CONFIG_COMMANDS               (CONFIG_CMD_DFL          |       \
                                CFG_CMD_ASKENV          |       \
-                               CFG_CMD_CACHE           |       \
                                CFG_CMD_DHCP            |       \
-                               CFG_CMD_DIAG            |       \
                                CFG_CMD_ELF             |       \
                                CFG_CMD_EEPROM          |       \
                                CFG_CMD_I2C             |       \
                                CFG_CMD_PCI             |       \
                                CFG_CMD_PING            |       \
                                CFG_CMD_REGINFO         |       \
-                               CFG_CMD_SETGETDCR       |       \
                                CFG_CMD_SDRAM           |       \
                                0)
 
index f60973b26d5768fc367142dabb895bd560a0fe9c..621a81c9c56c18428a49ef28bbef542bea329b69 100644 (file)
  */
 #if !defined(CONFIG_PRS200)
 #define CONFIG_LCD             1
+#define CONFIG_PROGRESSBAR 1
 #endif
 
 #if defined(CONFIG_LCD)
index ccb029332946539f8794f43908551c58d21de491..0c1029426c286cffc7074b3e09e35a533196294d 100644 (file)
 /* USB */
 #if 0
 #define CONFIG_USB_OHCI
-#define ADD_USB_CMD             CFG_CMD_USB | CFG_CMD_FAT
+#define ADD_USB_CMD            CFG_CMD_USB | CFG_CMD_FAT
 #define CONFIG_USB_STORAGE
 #else
-#define ADD_USB_CMD             0
+#define ADD_USB_CMD            0
 #endif
 
 /*
 #define CONFIG_COMMANDS                (CONFIG_CMD_DFL | \
                                 CFG_CMD_EEPROM | \
                                 CFG_CMD_FAT    | \
-                                 CFG_CMD_EXT2   | \
+                                CFG_CMD_EXT2   | \
                                 CFG_CMD_I2C    | \
                                 CFG_CMD_IDE    | \
                                 CFG_CMD_BSP    | \
 #include <cmd_confdefs.h>
 
 #if (TEXT_BASE == 0xFF000000)          /* Boot low with 16 MB Flash */
-#   define CFG_LOWBOOT         1
+#   define CFG_LOWBOOT         1
 #   define CFG_LOWBOOT16       1
 #endif
 #if (TEXT_BASE == 0xFF800000)          /* Boot low with  8 MB Flash */
-#   define CFG_LOWBOOT         1
+#   define CFG_LOWBOOT         1
 #   define CFG_LOWBOOT08       1
 #endif
 
 
 #define        CONFIG_EXTRA_ENV_SETTINGS \
        "netdev=eth0\0" \
-        "flash_vxworks0=run ata_vxworks_args;setenv loadaddr ff000000;bootvx\0" \
-        "flash_vxworks1=run ata_vxworks_args;setenv loadaddr ff200000:bootvx\0" \
-        "net_vxworks=tftp $(loadaddr) $(image);run vxworks_args;bootvx\0" \
-        "vxworks_args=setenv bootargs fec(0,0)$(host):$(image) h=$(serverip) e=$(ipaddr) g=$(gatewayip) u=$(user) $(pass) tn=$(target) s=$(script)\0" \
-        "ata_vxworks_args=setenv bootargs /ata0/vxWorks h=$(serverip) e=$(ipaddr) g=$(gatewayip) u=$(user) $(pass) tn=$(target) s=$(script) o=fec0 \0" \
-        "loadaddr=01000000\0" \
-        "serverip=192.168.2.99\0" \
-        "gatewayip=10.0.0.79\0" \
-        "user=mu\0" \
-        "target=mecp5200.esd\0" \
-        "script=mecp5200.bat\0" \
-        "image=/tftpboot/vxWorks_mecp5200\0" \
-        "ipaddr=10.0.13.196\0" \
-        "netmask=255.255.0.0\0" \
+       "flash_vxworks0=run ata_vxworks_args;setenv loadaddr ff000000;bootvx\0" \
+       "flash_vxworks1=run ata_vxworks_args;setenv loadaddr ff200000:bootvx\0" \
+       "net_vxworks=tftp $(loadaddr) $(image);run vxworks_args;bootvx\0" \
+       "vxworks_args=setenv bootargs fec(0,0)$(host):$(image) h=$(serverip) e=$(ipaddr) g=$(gatewayip) u=$(user) $(pass) tn=$(target) s=$(script)\0" \
+       "ata_vxworks_args=setenv bootargs /ata0/vxWorks h=$(serverip) e=$(ipaddr) g=$(gatewayip) u=$(user) $(pass) tn=$(target) s=$(script) o=fec0 \0" \
+       "loadaddr=01000000\0" \
+       "serverip=192.168.2.99\0" \
+       "gatewayip=10.0.0.79\0" \
+       "user=mu\0" \
+       "target=mecp5200.esd\0" \
+       "script=mecp5200.bat\0" \
+       "image=/tftpboot/vxWorks_mecp5200\0" \
+       "ipaddr=10.0.13.196\0" \
+       "netmask=255.255.0.0\0" \
        ""
 
 #define CONFIG_BOOTCOMMAND     "run flash_vxworks0"
 #define CFG_I2C_EEPROM_ADDR_LEN                2
 #define CFG_EEPROM_PAGE_WRITE_BITS     5
 #define CFG_EEPROM_PAGE_WRITE_DELAY_MS 20
-#define CFG_I2C_MULTI_EEPROMS           1
+#define CFG_I2C_MULTI_EEPROMS          1
 /*
  * Flash configuration
  */
 #define CFG_FLASH_BASE         0xFFC00000
-#define CFG_FLASH_SIZE         0x00400000
+#define CFG_FLASH_SIZE         0x00400000
 #define CFG_ENV_ADDR           (CFG_FLASH_BASE + 0x003E0000)
 #define CFG_MAX_FLASH_BANKS    1       /* max num of memory banks      */
 #define CFG_MAX_FLASH_SECT     512
 #define CONFIG_ENV_OVERWRITE   1
 #endif
 
-#define CFG_FLASH_CFI_DRIVER    1          /* Flash is CFI conformant           */
-#define CFG_FLASH_CFI           1          /* Flash is CFI conformant           */
-#define CFG_FLASH_PROTECTION    1          /* use hardware protection           */
+#define CFG_FLASH_CFI_DRIVER   1          /* Flash is CFI conformant           */
+#define CFG_FLASH_CFI          1          /* Flash is CFI conformant           */
+#define CFG_FLASH_PROTECTION   1          /* use hardware protection           */
 #if 0
 #define CFG_FLASH_USE_BUFFER_WRITE 1       /* use buffered writes (20x faster)  */
 #endif
-#define CFG_FLASH_INCREMENT     0x00400000 /* size of  flash bank               */
+#define CFG_FLASH_INCREMENT    0x00400000 /* size of  flash bank               */
 #define CFG_FLASH_BANKS_LIST  { CFG_FLASH_BASE }
-#define CFG_FLASH_EMPTY_INFO    1          /* show if bank is empty             */
+#define CFG_FLASH_EMPTY_INFO   1          /* show if bank is empty             */
 
 
 /*
 
 #define CFG_LOAD_ADDR          0x100000        /* default load address */
 
-#define CFG_HZ                 1000            /* decrementer freq: 1 ms ticks */
+#define CFG_HZ                 1000            /* decrementer freq: 1 ms ticks */
 
 #define CFG_VXWORKS_MAC_PTR    0x00000000      /* Pass Ethernet MAC to VxWorks */
 
 /* Offset for alternate registers      */
 #define CFG_ATA_ALT_OFFSET     (0x005C)
 
-/* Interval between registers                                                */
-#define CFG_ATA_STRIDE          4
+/* Interval between registers          */
+#define CFG_ATA_STRIDE         4
 
 #endif /* __CONFIG_H */
diff --git a/include/configs/motionpro.h b/include/configs/motionpro.h
new file mode 100644 (file)
index 0000000..5328e8d
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * (C) Copyright 2003-2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * Based on PRO Motion board config file by Andy Joseph, andy@promessdev.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
+ */
+
+#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 */
+#define CONFIG_MOTIONPRO       1       /* ... on Promess Motion-PRO board */
+
+
+/*
+ * Supported commands
+ */
+#define CONFIG_COMMANDS                (CONFIG_CMD_DFL | \
+                               CFG_CMD_ASKENV  | \
+                               CFG_CMD_DHCP    | \
+                               CFG_CMD_REGINFO | \
+                               CFG_CMD_IMMAP   | \
+                               CFG_CMD_ELF     | \
+                               CFG_CMD_MII     | \
+                               CFG_CMD_BEDBUG  | \
+                               CFG_CMD_NET     | \
+                               CFG_CMD_PING)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+
+/*
+ * Serial console configuration
+ */
+#define CONFIG_PSC_CONSOLE     1       /* console is on PSC1 */
+#define CONFIG_NETCONSOLE      1       /* network console */
+#define CONFIG_BAUDRATE                115200
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200, 230400 }
+
+
+/*
+ * Ethernet configuration
+ */
+#define CONFIG_MPC5xxx_FEC     1
+#define CONFIG_PHY_ADDR                0x2
+#define CONFIG_PHY_TYPE                0x79c874
+
+
+/*
+ * Autobooting
+ */
+#define CONFIG_BOOTDELAY       2       /* autoboot after 2 seconds */
+#define CONFIG_AUTOBOOT_KEYED
+#define CONFIG_AUTOBOOT_STOP_STR       "\x1b\x1b"
+#define DEBUG_BOOTKEYS         0
+#undef CONFIG_AUTOBOOT_DELAY_STR
+#undef CONFIG_BOOTARGS
+#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, "           \
+                                       "press \"<Esc><Esc>\" to stop\n"
+
+#define CONFIG_ETHADDR         00:50:C2:40:10:00
+#define CONFIG_OVERWRITE_ETHADDR_ONCE  1
+#define CONFIG_VERSION_VARIABLE        1       /* include version env variable */
+
+
+/*
+ * 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"                                          \
+       "u-boot_addr=100000\0"                                          \
+       "kernel_sector=20\0"                                            \
+       "kernel_size=1000\0"                                            \
+       "console=ttyS0,115200\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"                          \
+       "update=prot off fff00000 fff3ffff; era fff00000 fff3ffff; "    \
+               "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"                    \
+       ""
+#define CONFIG_BOOTCOMMAND     "run net_nfs"
+
+
+/*
+ * do board-specific init
+ */
+#define CONFIG_BOARD_EARLY_INIT_R      1
+
+
+/*
+ * Low level configuration
+ */
+
+
+/*
+ * Clock configuration: SYS_XTALIN = 25MHz
+ */
+#define CFG_MPC5XXX_CLKIN      25000000
+
+
+/*
+ * Memory map
+ */
+/*
+ * Warning!!! with the current BestComm Task, MBAR MUST BE set to 0xf0000000.
+ * Setting MBAR to otherwise will cause system hang when using SmartDMA such
+ * as network commands.
+ */
+#define CFG_MBAR               0xf0000000
+#define CFG_SDRAM_BASE         0x00000000
+
+/*
+ * If building for running out of SDRAM, then MBAR has been set up beforehand
+ * (e.g., by the BDI). Otherwise we must specify the default boot-up value of
+ * MBAR, as given in the doccumentation.
+ */
+#if TEXT_BASE == 0x00100000
+#define CFG_DEFAULT_MBAR       0xf0000000
+#else /* TEXT_BASE != 0x00100000 */
+#define CFG_DEFAULT_MBAR       0x80000000
+#define CFG_LOWBOOT            1
+#endif /* TEXT_BASE == 0x00100000 */
+
+/* Use SRAM until RAM will be available */
+#define CFG_INIT_RAM_ADDR      MPC5XXX_SRAM
+#define CFG_INIT_RAM_END       MPC5XXX_SRAM_SIZE
+
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes for 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_BASE       TEXT_BASE
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT            1
+#endif
+
+#define CFG_MONITOR_LEN                (256 << 10)     /* 256 kB for Monitor */
+#define CFG_MALLOC_LEN         (128 << 10)     /* 128 kB for malloc() */
+#define CFG_BOOTMAPSZ          (8 << 20)       /* initial mem map for Linux */
+
+
+/*
+ * Chip selects configuration
+ */
+/* Boot Chipselect */
+#define CFG_BOOTCS_START       CFG_FLASH_BASE
+#define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
+#define CFG_BOOTCS_CFG         0x03035D00
+
+/* Flash memory addressing */
+#define CFG_CS0_START          CFG_FLASH_BASE
+#define CFG_CS0_SIZE           CFG_FLASH_SIZE
+#define CFG_CS0_CFG            CFG_BOOTCS_CFG
+
+/* Dual Port SRAM -- Kollmorgen Drive memory addressing */
+#define CFG_CS1_START          0x50000000
+#define CFG_CS1_SIZE           0x10000
+#define CFG_CS1_CFG            0x05055800
+
+/* Local register access */
+#define CFG_CS2_START          0x50010000
+#define CFG_CS2_SIZE           0x10000
+#define CFG_CS2_CFG            0x05055800
+
+/* Anybus CompactCom Module memory addressing */
+#define CFG_CS3_START          0x50020000
+#define CFG_CS3_SIZE           0x10000
+#define CFG_CS3_CFG            0x05055800
+
+/* No burst and dead cycle = 2 for all CSs */
+#define CFG_CS_BURST           0x00000000
+#define CFG_CS_DEADCYCLE       0x22222222
+
+
+/*
+ * SDRAM configuration
+ */
+/* 2 x MT48LC16M16A2BG-75 IT:D, CASL 2, 32 bit data bus */
+#define SDRAM_CONFIG1          0x52222600
+#define SDRAM_CONFIG2          0x88b70000
+#define SDRAM_CONTROL          0x50570000
+#define SDRAM_MODE             0x008d0000
+
+
+/*
+ * Flash configuration
+ */
+#define CFG_FLASH_CFI          1       /* Flash is CFI conformant */
+#define CFG_FLASH_CFI_DRIVER   1
+#define CFG_FLASH_BASE         0xff000000
+#define CFG_FLASH_SIZE         0x01000000
+#define CFG_MAX_FLASH_BANKS    1       /* max num of memory banks */
+#define CFG_FLASH_BANKS_LIST   { CFG_FLASH_BASE }
+#define CFG_MAX_FLASH_SECT     256     /* max num of sects on one chip */
+#define CONFIG_FLASH_16BIT             /* Flash is 16-bit */
+
+
+/*
+ * Environment settings
+ */
+#define CFG_ENV_IS_IN_FLASH    1
+/* This has to be a multiple of the Flash sector size */
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
+#define CFG_ENV_SIZE           0x1000
+#define CFG_ENV_SECT_SIZE      0x10000
+
+
+/*
+ * Pin multiplexing configuration
+ */
+
+/* PSC1: UART1
+ * PSC2: GPIO (default)
+ * PSC3: GPIO (default)
+ * USB: 2xUART4/5
+ * Ethernet: Ethernet 100Mbit with MD
+ * Timer: CAN2/GPIO
+ * PSC6/IRDA: GPIO (default)
+ */
+#define CFG_GPS_PORT_CONFIG    0x1105a004
+
+
+/*
+ * 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_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      0x00100000      /* memtest works on */
+#define CFG_MEMTEST_END                0x03f00000      /* 1 ... 64 MiB in DRAM */
+
+#define CFG_LOAD_ADDR          0x200000        /* default kernel load addr */
+
+#define CFG_HZ                 1000    /* decrementer freq: 1 ms ticks */
+
+
+/*
+ * Various low-level settings
+ */
+#define CFG_HID0_INIT          HID0_ICE | HID0_ICFI
+#define CFG_HID0_FINAL         HID0_ICE
+
+#define BOOTFLAG_COLD          0x01    /* Normal Power-On: Boot from FLASH  */
+#define BOOTFLAG_WARM          0x02    /* Software reboot */
+
+#define CFG_CACHELINE_SIZE     32      /* For MPC5xxx CPUs */
+
+
+/* Not needed for MPC 5xxx U-Boot, but used by tools/updater */
+#define CFG_RESET_ADDRESS      0xfff00100
+
+#endif /* __CONFIG_H */
index 0e3660ba2da8b59b3e13bc21e14fa7cbb3c3d123..fe4e63810ee35b493edb7eaffdc86073f1d5963b 100644 (file)
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------*/
-#define CONFIG_SPD_EEPROM      1        /* Use SPD EEPROM for setup     */
+#define CONFIG_SPD_EEPROM      1       /* Use SPD EEPROM for setup     */
 #define SPD_EEPROM_ADDRESS {0x53,0x52} /* SPD i2c spd addresses        */
+#define CONFIG_PROG_SDRAM_TLB  1       /* setup SDRAM TLB's dynamically*/
 
 /*-----------------------------------------------------------------------
  * I2C
diff --git a/include/configs/sbc8349.h b/include/configs/sbc8349.h
new file mode 100644 (file)
index 0000000..65aac5c
--- /dev/null
@@ -0,0 +1,734 @@
+/*
+ * WindRiver SBC8349 U-Boot configuration file.
+ * Copyright (c) 2006, 2007 Wind River Systems, Inc.
+ *
+ * Paul Gortmaker <paul.gortmaker@windriver.com>
+ * Based on the MPC8349EMDS config.
+ *
+ * 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
+ */
+
+/*
+ * sbc8349 board configuration file.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#undef DEBUG
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_E300            1       /* E300 Family */
+#define CONFIG_MPC83XX         1       /* MPC83XX family */
+#define CONFIG_MPC834X         1       /* MPC834X family */
+#define CONFIG_MPC8349         1       /* MPC8349 specific */
+#define CONFIG_SBC8349         1       /* WRS SBC8349 board specific */
+
+#undef CONFIG_PCI
+/* Don't enable PCI2 on sbc834x - it doesn't exist physically. */
+#undef CONFIG_MPC83XX_PCI2             /* support for 2nd PCI controller */
+
+#define PCI_66M
+#ifdef PCI_66M
+#define CONFIG_83XX_CLKIN      66000000        /* in Hz */
+#else
+#define CONFIG_83XX_CLKIN      33000000        /* in Hz */
+#endif
+
+#ifndef CONFIG_SYS_CLK_FREQ
+#ifdef PCI_66M
+#define CONFIG_SYS_CLK_FREQ    66000000
+#define HRCWL_CSB_TO_CLKIN     HRCWL_CSB_TO_CLKIN_4X1
+#else
+#define CONFIG_SYS_CLK_FREQ    33000000
+#define HRCWL_CSB_TO_CLKIN     HRCWL_CSB_TO_CLKIN_8X1
+#endif
+#endif
+
+#undef CONFIG_BOARD_EARLY_INIT_F               /* call board_pre_init */
+
+#define CFG_IMMR               0xE0000000
+
+#undef CFG_DRAM_TEST                           /* memory test, takes time */
+#define CFG_MEMTEST_START      0x00000000      /* memtest region */
+#define CFG_MEMTEST_END                0x00100000
+
+/*
+ * DDR Setup
+ */
+#undef CONFIG_DDR_ECC                  /* only for ECC DDR module */
+#undef CONFIG_DDR_ECC_CMD              /* use DDR ECC user commands */
+#define CONFIG_SPD_EEPROM              /* use SPD EEPROM for DDR setup*/
+#define CFG_83XX_DDR_USES_CS0          /* WRS; Fsl board uses CS2/CS3 */
+
+/*
+ * 32-bit data path mode.
+ *
+ * Please note that using this mode for devices with the real density of 64-bit
+ * effectively reduces the amount of available memory due to the effect of
+ * wrapping around while translating address to row/columns, for example in the
+ * 256MB module the upper 128MB get aliased with contents of the lower
+ * 128MB); normally this define should be used for devices with real 32-bit
+ * data path.
+ */
+#undef CONFIG_DDR_32BIT
+
+#define CFG_DDR_BASE           0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE         CFG_DDR_BASE
+#define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
+#define CFG_DDR_SDRAM_CLK_CNTL (DDR_SDRAM_CLK_CNTL_SS_EN | \
+                               DDR_SDRAM_CLK_CNTL_CLK_ADJUST_075)
+#define CONFIG_DDR_2T_TIMING
+
+#if defined(CONFIG_SPD_EEPROM)
+/*
+ * Determine DDR configuration from I2C interface.
+ */
+#define SPD_EEPROM_ADDRESS     0x52            /* DDR DIMM */
+
+#else
+/*
+ * Manually set up DDR parameters
+ * NB: manual DDR setup untested on sbc834x
+ */
+#define CFG_DDR_SIZE           256             /* MB */
+#define CFG_DDR_CONFIG         (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10)
+#define CFG_DDR_TIMING_1       0x36332321
+#define CFG_DDR_TIMING_2       0x00000800      /* P9-45,may need tuning */
+#define CFG_DDR_CONTROL                0xc2000000      /* unbuffered,no DYN_PWR */
+#define CFG_DDR_INTERVAL       0x04060100      /* autocharge,no open page */
+
+#if defined(CONFIG_DDR_32BIT)
+/* set burst length to 8 for 32-bit data path */
+#define CFG_DDR_MODE           0x00000023      /* DLL,normal,seq,4/2.5, 8 burst len */
+#else
+/* the default burst length is 4 - for 64-bit data path */
+#define CFG_DDR_MODE           0x00000022      /* DLL,normal,seq,4/2.5, 4 burst len */
+#endif
+#endif
+
+/*
+ * SDRAM on the Local Bus
+ */
+#define CFG_LBC_SDRAM_BASE     0x10000000      /* Localbus SDRAM */
+#define CFG_LBC_SDRAM_SIZE     128             /* LBC SDRAM is 128MB */
+
+/*
+ * 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         0xFF800000      /* start of FLASH   */
+#define CFG_FLASH_SIZE         8               /* flash size in MB */
+/* #define CFG_FLASH_USE_BUFFER_WRITE */
+
+#define CFG_BR0_PRELIM         (CFG_FLASH_BASE |       /* flash Base address */ \
+                               (2 << BR_PS_SHIFT) |    /* 32 bit port size */   \
+                               BR_V)                   /* valid */
+
+#define CFG_OR0_PRELIM         0xFF806FF7      /* 8 MB flash size */
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* window base at flash base */
+#define CFG_LBLAWAR0_PRELIM    0x80000016      /* 8 MB window size */
+
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks */
+#define CFG_MAX_FLASH_SECT     64              /* sectors per device */
+
+#undef CFG_FLASH_CHECKSUM
+#define CFG_FLASH_ERASE_TOUT   60000   /* Flash Erase Timeout (ms) */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (ms) */
+
+#define CFG_MID_FLASH_JUMP     0x7F000000
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#else
+#undef  CFG_RAMBOOT
+#endif
+
+#define CONFIG_L1_INIT_RAM
+#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         (128 * 1024)            /* Reserved for malloc */
+
+/*
+ * Local Bus LCRR and LBCR regs
+ *    LCRR:  DLL bypass, Clock divider is 4
+ * External Local Bus rate is
+ *    CLKIN * HRCWL_CSB_TO_CLKIN / HRCWL_LCL_BUS_TO_SCB_CLK / LCRR_CLKDIV
+ */
+#define CFG_LCRR       (LCRR_DBYP | LCRR_CLKDIV_4)
+#define CFG_LBC_LBCR   0x00000000
+
+#undef CFG_LB_SDRAM    /* if board has SDRAM on local bus */
+
+#ifdef CFG_LB_SDRAM
+/* Local bus BR2, OR2 definition for SDRAM if soldered on the board*/
+/*
+ * Base Register 2 and Option Register 2 configure SDRAM.
+ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000.
+ *
+ * For BR2, need:
+ *    Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0
+ *    port-size = 32-bits = BR2[19:20] = 11
+ *    no parity checking = BR2[21:22] = 00
+ *    SDRAM for MSEL = BR2[24:26] = 011
+ *    Valid = BR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 0000 0000 0000 0001 1000 0110 0001 = F0001861
+ *
+ * FIXME: CFG_LBC_SDRAM_BASE should be masked and OR'ed into
+ * FIXME: the top 17 bits of BR2.
+ */
+
+#define CFG_BR2_PRELIM         0xF0001861 /* Port-size=32bit, MSEL=SDRAM */
+#define CFG_LBLAWBAR2_PRELIM   0xF0000000
+#define CFG_LBLAWAR2_PRELIM    0x80000019 /* 64M */
+
+/*
+ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64.
+ *
+ * For OR2, need:
+ *    64MB mask for AM, OR2[0:7] = 1111 1100
+ *                 XAM, OR2[17:18] = 11
+ *    9 columns OR2[19-21] = 010
+ *    13 rows   OR2[23-25] = 100
+ *    EAD set for extra time OR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1100 0000 0000 0110 1001 0000 0001 = FC006901
+ */
+
+#define CFG_OR2_PRELIM 0xFC006901
+
+#define CFG_LBC_LSRT   0x32000000    /* LB sdram refresh timer, about 6us */
+#define CFG_LBC_MRTPR  0x20000000    /* LB refresh timer prescal, 266MHz/32 */
+
+/*
+ * LSDMR masks
+ */
+#define CFG_LBC_LSDMR_RFEN     (1 << (31 -  1))
+#define CFG_LBC_LSDMR_BSMA1516 (3 << (31 - 10))
+#define CFG_LBC_LSDMR_BSMA1617 (4 << (31 - 10))
+#define CFG_LBC_LSDMR_RFCR5    (3 << (31 - 16))
+#define CFG_LBC_LSDMR_RFCR8    (5 << (31 - 16))
+#define CFG_LBC_LSDMR_RFCR16   (7 << (31 - 16))
+#define CFG_LBC_LSDMR_PRETOACT3        (3 << (31 - 19))
+#define CFG_LBC_LSDMR_PRETOACT6        (5 << (31 - 19))
+#define CFG_LBC_LSDMR_PRETOACT7        (7 << (31 - 19))
+#define CFG_LBC_LSDMR_ACTTORW3 (3 << (31 - 22))
+#define CFG_LBC_LSDMR_ACTTORW7 (7 << (31 - 22))
+#define CFG_LBC_LSDMR_ACTTORW6 (6 << (31 - 22))
+#define CFG_LBC_LSDMR_BL8      (1 << (31 - 23))
+#define CFG_LBC_LSDMR_WRC2     (2 << (31 - 27))
+#define CFG_LBC_LSDMR_WRC3     (3 << (31 - 27))
+#define CFG_LBC_LSDMR_WRC4     (0 << (31 - 27))
+#define CFG_LBC_LSDMR_BUFCMD   (1 << (31 - 29))
+#define CFG_LBC_LSDMR_CL3      (3 << (31 - 31))
+
+#define CFG_LBC_LSDMR_OP_NORMAL        (0 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ARFRSH        (1 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_SRFRSH        (2 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_MRW   (3 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PCHALL        (5 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ACTBNK        (6 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4))
+
+#define CFG_LBC_LSDMR_COMMON    ( CFG_LBC_LSDMR_RFEN            \
+                               | CFG_LBC_LSDMR_BSMA1516        \
+                               | CFG_LBC_LSDMR_RFCR8           \
+                               | CFG_LBC_LSDMR_PRETOACT6       \
+                               | CFG_LBC_LSDMR_ACTTORW3        \
+                               | CFG_LBC_LSDMR_BL8             \
+                               | CFG_LBC_LSDMR_WRC3            \
+                               | CFG_LBC_LSDMR_CL3             \
+                               )
+
+/*
+ * SDRAM Controller configuration sequence.
+ */
+#define CFG_LBC_LSDMR_1                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_PCHALL)
+#define CFG_LBC_LSDMR_2                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_3                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_4                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_MRW)
+#define CFG_LBC_LSDMR_5                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_NORMAL)
+#endif
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX     1
+#undef CONFIG_SERIAL_SOFTWARE_FIFO
+#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)
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#ifdef  CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+#endif
+
+/* 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,8349@0"
+#define OF_SOC                 "soc8349@e0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc8349@e0000000/serial@4500"
+
+/* I2C */
+#define CONFIG_HARD_I2C                        /* I2C with hardware support*/
+#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
+#define CONFIG_FSL_I2C
+#define CONFIG_I2C_CMD_TREE
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address */
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_NOPROBES       {{0,0x69}}      /* Don't probe these addrs */
+#define CFG_I2C1_OFFSET                0x3000
+#define CFG_I2C2_OFFSET                0x3100
+#define CFG_I2C_OFFSET         CFG_I2C2_OFFSET
+/* could also use CONFIG_I2C_MULTI_BUS and CONFIG_SPD_BUS_NUM... */
+
+/* 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)
+
+/*
+ * 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 CFG_PCI2_MEM_BASE      0xA0000000
+#define CFG_PCI2_MEM_PHYS      CFG_PCI2_MEM_BASE
+#define CFG_PCI2_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI2_MMIO_BASE     0xB0000000
+#define CFG_PCI2_MMIO_PHYS     CFG_PCI2_MMIO_BASE
+#define CFG_PCI2_MMIO_SIZE     0x10000000      /* 256M */
+#define CFG_PCI2_IO_BASE       0x00000000
+#define CFG_PCI2_IO_PHYS       0xE2100000
+#define CFG_PCI2_IO_SIZE       0x00100000      /* 1M */
+
+#if defined(CONFIG_PCI)
+
+#define PCI_64BIT
+#define PCI_ONE_PCI1
+#if defined(PCI_64BIT)
+#undef PCI_ALL_PCI1
+#undef PCI_TWO_PCI1
+#undef PCI_ONE_PCI1
+#endif
+
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_TULIP
+
+#if !defined(CONFIG_PCI_PNP)
+       #define PCI_ENET0_IOADDR        0xFIXME
+       #define PCI_ENET0_MEMADDR       0xFIXME
+       #define PCI_IDSEL_NUMBER        0xFIXME
+#endif
+
+#undef CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup */
+#define CFG_PCI_SUBSYS_VENDORID 0x1057  /* Motorola */
+
+#endif /* CONFIG_PCI */
+
+/*
+ * TSEC configuration
+ */
+#define CONFIG_TSEC_ENET               /* TSEC ethernet support */
+
+#if defined(CONFIG_TSEC_ENET)
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+#define CONFIG_MPC83XX_TSEC1   1
+#define CONFIG_MPC83XX_TSEC1_NAME      "TSEC0"
+#define CONFIG_MPC83XX_TSEC2   1
+#define CONFIG_MPC83XX_TSEC2_NAME      "TSEC1"
+#define CONFIG_PHY_BCM5421S    1
+#define TSEC1_PHY_ADDR         0x19
+#define TSEC2_PHY_ADDR         0x1a
+#define TSEC1_PHYIDX           0
+#define TSEC2_PHYIDX           0
+
+/* Options are: TSEC[0-1] */
+#define CONFIG_ETHPRIME                "TSEC0"
+
+#endif /* CONFIG_TSEC_ENET */
+
+/*
+ * Environment
+ */
+#ifndef CFG_RAMBOOT
+       #define CFG_ENV_IS_IN_FLASH     1
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE + 0x40000)
+       #define CFG_ENV_SECT_SIZE       0x20000 /* 128K(one sector) for env */
+       #define CFG_ENV_SIZE            0x2000
+
+/* Address and size of Redundant Environment Sector    */
+#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
+
+#else
+       #define CFG_NO_FLASH            1       /* Flash is not usable now */
+       #define CFG_ENV_IS_NOWHERE      1       /* Store ENV in memory only */
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - 0x1000)
+       #define CFG_ENV_SIZE            0x2000
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#if defined(CFG_RAMBOOT)
+#if defined(CONFIG_PCI)
+#define  CONFIG_COMMANDS       ((CONFIG_CMD_DFL        \
+                                | CFG_CMD_PING         \
+                                | CFG_CMD_PCI          \
+                                | CFG_CMD_I2C)         \
+                               &                       \
+                                ~(CFG_CMD_ENV          \
+                                 | CFG_CMD_LOADS))
+#else
+#define  CONFIG_COMMANDS       ((CONFIG_CMD_DFL        \
+                                | CFG_CMD_PING         \
+                                | CFG_CMD_I2C)         \
+                               &                       \
+                                ~(CFG_CMD_ENV          \
+                                 | CFG_CMD_LOADS))
+#endif
+#else
+#if defined(CONFIG_PCI)
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL         \
+                               | CFG_CMD_PCI           \
+                               | CFG_CMD_PING          \
+                               | CFG_CMD_I2C           \
+                               )
+#else
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL         \
+                               | CFG_CMD_PING          \
+                               | CFG_CMD_I2C           \
+                               | CFG_CMD_MII           \
+                               )
+#endif
+#endif
+
+#include <cmd_confdefs.h>
+
+#undef CONFIG_WATCHDOG                 /* watchdog disabled */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory */
+#define CFG_LOAD_ADDR  0x2000000       /* default load address */
+#define CFG_PROMPT     "=> "           /* Monitor Command Prompt */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+       #define CFG_CBSIZE      1024            /* Console I/O Buffer Size */
+#else
+       #define CFG_CBSIZE      256             /* Console I/O Buffer Size */
+#endif
+
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size */
+#define CFG_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                32768
+#define CFG_CACHELINE_SIZE     32
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /*log base 2 of the above value*/
+#endif
+
+#define CFG_RCWH_PCIHOST 0x80000000 /* PCIHOST  */
+
+#if 1 /*528/264*/
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_1X1 |\
+       HRCWL_CSB_TO_CLKIN |\
+       HRCWL_VCO_1X2 |\
+       HRCWL_CORE_TO_CSB_2X1)
+#elif 0 /*396/132*/
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_1X1 |\
+       HRCWL_CSB_TO_CLKIN |\
+       HRCWL_VCO_1X4 |\
+       HRCWL_CORE_TO_CSB_3X1)
+#elif 0 /*264/132*/
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_1X1 |\
+       HRCWL_CSB_TO_CLKIN |\
+       HRCWL_VCO_1X4 |\
+       HRCWL_CORE_TO_CSB_2X1)
+#elif 0 /*132/132*/
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_1X1 |\
+       HRCWL_CSB_TO_CLKIN |\
+       HRCWL_VCO_1X4 |\
+       HRCWL_CORE_TO_CSB_1X1)
+#elif 0 /*264/264 */
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_1X1 |\
+       HRCWL_CSB_TO_CLKIN |\
+       HRCWL_VCO_1X4 |\
+       HRCWL_CORE_TO_CSB_1X1)
+#endif
+
+#if defined(PCI_64BIT)
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_HOST |\
+       HRCWH_64_BIT_PCI |\
+       HRCWH_PCI1_ARBITER_ENABLE |\
+       HRCWH_PCI2_ARBITER_DISABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0X00000100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_TSEC1M_IN_GMII |\
+       HRCWH_TSEC2M_IN_GMII )
+#else
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_HOST |\
+       HRCWH_32_BIT_PCI |\
+       HRCWH_PCI1_ARBITER_ENABLE |\
+       HRCWH_PCI2_ARBITER_ENABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0X00000100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_TSEC1M_IN_GMII |\
+       HRCWH_TSEC2M_IN_GMII )
+#endif
+
+/* System IO Config */
+#define CFG_SICRH SICRH_TSOBI1
+#define CFG_SICRL SICRL_LDP_A
+
+#define CFG_HID0_INIT  0x000000000
+#define CFG_HID0_FINAL HID0_ENABLE_MACHINE_CHECK
+
+/* #define CFG_HID0_FINAL              (\
+       HID0_ENABLE_INSTRUCTION_CACHE |\
+       HID0_ENABLE_M_BIT |\
+       HID0_ENABLE_ADDRESS_BROADCAST ) */
+
+
+#define CFG_HID2 HID2_HBE
+
+/* DDR @ 0x00000000 */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* PCI @ 0x80000000 */
+#ifdef CONFIG_PCI
+#define CFG_IBAT1L     (CFG_PCI1_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#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)
+#else
+#define CFG_IBAT1L     (0)
+#define CFG_IBAT1U     (0)
+#define CFG_IBAT2L     (0)
+#define CFG_IBAT2U     (0)
+#endif
+
+#ifdef CONFIG_MPC83XX_PCI2
+#define CFG_IBAT3L     (CFG_PCI2_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT3U     (CFG_PCI2_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT4L     (CFG_PCI2_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT4U     (CFG_PCI2_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#else
+#define CFG_IBAT3L     (0)
+#define CFG_IBAT3U     (0)
+#define CFG_IBAT4L     (0)
+#define CFG_IBAT4U     (0)
+#endif
+
+/* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 */
+#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 | BATL_MEMCOHERENCE)
+#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 */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   230400  /* speed of kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  2       /* which serial port to use */
+#endif
+
+/*
+ * Environment Configuration
+ */
+#define CONFIG_ENV_OVERWRITE
+
+#if defined(CONFIG_TSEC_ENET)
+#define CONFIG_ETHADDR         00:a0:1e:a0:13:8d
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR                00:a0:1e:a0:13:8e
+#endif
+
+#define CONFIG_IPADDR          192.168.1.234
+
+#define CONFIG_HOSTNAME                SBC8349
+#define CONFIG_ROOTPATH                /tftpboot/rootfs
+#define CONFIG_BOOTFILE                uImage
+
+#define CONFIG_SERVERIP                192.168.1.1
+#define CONFIG_GATEWAYIP       192.168.1.1
+#define CONFIG_NETMASK         255.255.255.0
+
+#define CONFIG_LOADADDR                200000  /* default location for tftp and bootm */
+
+#define CONFIG_BOOTDELAY       6       /* -1 disables auto-boot */
+#undef  CONFIG_BOOTARGS                        /* the boot command will set bootargs */
+
+#define CONFIG_BAUDRATE         115200
+
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "netdev=eth0\0"                                                 \
+       "hostname=sbc8349\0"                                    \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}\0"\
+       "flash_nfs=run nfsargs addip addtty;"                           \
+               "bootm ${kernel_addr}\0"                                \
+       "flash_self=run ramargs addip addtty;"                          \
+               "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
+       "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;"     \
+               "bootm\0"                                               \
+       "load=tftp 100000 /tftpboot/sbc8349/u-boot.bin\0"               \
+       "update=protect off fff00000 fff3ffff; "                        \
+               "era fff00000 fff3ffff; cp.b 100000 fff00000 ${filesize}\0"     \
+       "upd=run load;run update\0"                                     \
+       "fdtaddr=400000\0"                                              \
+       "fdtfile=sbc8349.dtb\0"                                 \
+       ""
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+   "setenv bootargs root=/dev/nfs rw "                                  \
+      "nfsroot=$serverip:$rootpath "                                    \
+      "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+      "console=$consoledev,$baudrate $othbootargs;"                     \
+   "tftp $loadaddr $bootfile;"                                          \
+   "tftp $fdtaddr $fdtfile;"                                           \
+   "bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND                                          \
+   "setenv bootargs root=/dev/ram rw "                                  \
+      "console=$consoledev,$baudrate $othbootargs;"                     \
+   "tftp $ramdiskaddr $ramdiskfile;"                                    \
+   "tftp $loadaddr $bootfile;"                                          \
+   "tftp $fdtaddr $fdtfile;"                                           \
+   "bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+#endif /* __CONFIG_H */
index b767449759d9ba2875c9139ef400562434d3e71d..f2f059863d825f0264dec8e7237ac3befc737599 100644 (file)
                ":${hostname}:${netdev}:off panic=1\0"                  \
        "flash_nfs=run nfsargs addip;"                                  \
                "bootm ${kernel_addr}\0"                                \
-       "flash_nand=nand_args addip addcon;bootm ${kernel_addr}\0"      \
+       "flash_nand=run nand_args addip addcon;bootm ${kernel_addr}\0"  \
        "net_nfs=tftp 200000 ${bootfile};run nfsargs addip;bootm\0"     \
        "rootpath=/opt/eldk/ppc_4xx\0"                                  \
        "bootfile=/tftpboot/sc3/uImage\0"                               \
index 098aa3f0a6edaaa61db94b41b22ea38b9771f015..29f3b408d27569e2bddb1827aae34ef8c97cd6d3 100644 (file)
 #if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
 #define CFG_NAND_CS            3               /* NAND chip connected to CSx   */
 /* Memory Bank 0 (NOR-FLASH) initialization                                    */
-#define CFG_EBC_PB0AP          0x03017300
+#define CFG_EBC_PB0AP          0x03017200
 #define CFG_EBC_PB0CR          (CFG_FLASH | 0xda000)
 
 /* Memory Bank 3 (NAND-FLASH) initialization                                   */
 #else
 #define CFG_NAND_CS            0               /* NAND chip connected to CSx   */
 /* Memory Bank 3 (NOR-FLASH) initialization                                    */
-#define CFG_EBC_PB3AP          0x03017300
+#define CFG_EBC_PB3AP          0x03017200
 #define CFG_EBC_PB3CR          (CFG_FLASH | 0xda000)
 
 /* Memory Bank 0 (NAND-FLASH) initialization                                   */
index 6417ed891df4e9693a1fe89e648639ce98cd6c1d..eb4859c3e97162056e1656a2e474593f24be7caf 100644 (file)
 #define EXTCLK_50              50000000
 #define EXTCLK_83              83333333
 
-#define        CONFIG_IBM_EMAC4_V4             1
-#define        CONFIG_MISC_INIT_F              1       /* Use misc_init_f()    */
+#define        CONFIG_MISC_INIT_F      1       /* Use misc_init_f()            */
+#define CONFIG_ADD_RAM_INFO    1       /* Print additional info        */
 #undef  CONFIG_SHOW_BOOT_PROGRESS
 #undef  CONFIG_STRESS
-#undef  ENABLE_ECC
+
 /*-----------------------------------------------------------------------
  * Base addresses -- Note these are effective addresses where the
  * actual resources get mapped (not physical addresses)
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------*/
-#undef CONFIG_SPD_EEPROM               /* Use SPD EEPROM for setup     */
-#define SPD_EEPROM_ADDRESS {0x53, 0x52}        /* SPD i2c spd addresses        */
-#define IIC0_DIMM0_ADDR                0x53
-#define IIC0_DIMM1_ADDR                0x52
+#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       */
 
 /*-----------------------------------------------------------------------
  * I2C
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
 
+#define        CONFIG_IBM_EMAC4_V4     1
 #define CONFIG_MII             1       /* MII PHY management           */
 #undef CONFIG_NET_MULTI
 #define CONFIG_PHY_ADDR                1       /* PHY address, See schematics  */
index a8f729afe0148f27764783b7579ffb54c6577139..6e6c84531277e7683ac3dc98e05bee929054df06 100644 (file)
  */
 #define I2C_RXTX_LEN   128     /* maximum tx/rx buffer length */
 
+#if defined(CONFIG_I2C_MULTI_BUS)
+#define CFG_MAX_I2C_BUS                2
+#define I2C_GET_BUS()          i2c_get_bus_num()
+#define I2C_SET_BUS(a)         i2c_set_bus_num(a)
+#else
+#define CFG_MAX_I2C_BUS                1
+#define I2C_GET_BUS()          0
+#define I2C_SET_BUS(a)
+#endif
+
+/* define the I2C bus number for RTC and DTT if not already done */
+#if !defined(CFG_RTC_BUS_NUM)
+#define CFG_RTC_BUS_NUM                0
+#endif
+#if !defined(CFG_DTT_BUS_NUM)
+#define CFG_DTT_BUS_NUM                0
+#endif
+#if !defined(CFG_SPD_BUS_NUM)
+#define CFG_SPD_BUS_NUM                0
+#endif
+
 /*
  * Initialization, must be called once on start up, may be called
  * repeatedly to change the speed and slave addresses.
index dfef32f267d1316fcd8a811e90013249f5fc72cb..6976a6c319c3736b4a0c33ab89e57739cb9299c4 100644 (file)
@@ -48,8 +48,8 @@ typedef ulong lbaint_t;
  * Function Prototypes
  */
 
-void  ide_init  (void);
-ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer);
-ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer);
+void ide_init(void);
+ulong ide_read(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
+ulong ide_write(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
 
 #endif /* _IDE_H */
index 03dd0cafd2dbff9510929f218779450209dbef84..c2a4ff587745d69bb9bedd394b58726f38a6c322 100644 (file)
  * the License, or (at your option) any later version.
  */
 
-/*
- * mpc83xx.h
- *
- * MPC83xx specific definitions
- */
-
 #ifndef __MPC83XX_H__
 #define __MPC83XX_H__
 
 #include <asm/e300.h>
 #endif
 
-/*
- * MPC83xx cpu provide RCR register to do reset thing specially. easier
- * to implement
+/* MPC83xx cpu provide RCR register to do reset thing specially
  */
-
 #define MPC83xx_RESET
 
-/*
- * System reset offset (PowerPC standard)
+/* System reset offset (PowerPC standard)
  */
-#define EXC_OFF_SYS_RESET      0x0100
+#define EXC_OFF_SYS_RESET              0x0100
 
-/*
- * Default Internal Memory Register Space (Freescale recomandation)
+/* IMMRBAR - Internal Memory Register Base Address
  */
-#define CONFIG_DEFAULT_IMMR 0xFF400000
+#define CONFIG_DEFAULT_IMMR            0xFF400000      /* Default IMMR base address */
+#define IMMRBAR                                0x0000          /* Register offset to immr */
+#define IMMRBAR_BASE_ADDR              0xFFF00000      /* Base address mask */
+#define IMMRBAR_RES                    ~(IMMRBAR_BASE_ADDR)
 
-/*
- * Watchdog
+/* LAWBAR - Local Access Window Base Address Register
  */
-#define SWCRR      0x0204
-#define SWCRR_SWTC 0xFFFF0000 /* Software Watchdog Time Count. */
-#define SWCRR_SWEN 0x00000004 /* Watchdog Enable bit. */
-#define SWCRR_SWRI 0x00000002 /* Software Watchdog Reset/Interrupt Select bit. */
-#define SWCRR_SWPR 0x00000001 /* Software Watchdog Counter Prescale bit. */
-#define SWCRR_RES  ~(SWCRR_SWTC | SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR)
+#define LBLAWBAR0                      0x0020          /* Register offset to immr */
+#define LBLAWAR0                       0x0024
+#define LBLAWBAR1                      0x0028
+#define LBLAWAR1                       0x002C
+#define LBLAWBAR2                      0x0030
+#define LBLAWAR2                       0x0034
+#define LBLAWBAR3                      0x0038
+#define LBLAWAR3                       0x003C
+#define LAWBAR_BAR                     0xFFFFF000      /* Base address mask */
+
+/* SPRIDR - System Part and Revision ID Register
+ */
+#define SPRIDR_PARTID                  0xFFFF0000      /* Part Identification */
+#define SPRIDR_REVID                   0x0000FFFF      /* Revision Identification */
+
+#define SPR_8349E_REV10                        0x80300100
+#define SPR_8349_REV10                 0x80310100
+#define SPR_8347E_REV10_TBGA           0x80320100
+#define SPR_8347_REV10_TBGA            0x80330100
+#define SPR_8347E_REV10_PBGA           0x80340100
+#define SPR_8347_REV10_PBGA            0x80350100
+#define SPR_8343E_REV10                        0x80360100
+#define SPR_8343_REV10                 0x80370100
+
+#define SPR_8349E_REV11                        0x80300101
+#define SPR_8349_REV11                 0x80310101
+#define SPR_8347E_REV11_TBGA           0x80320101
+#define SPR_8347_REV11_TBGA            0x80330101
+#define SPR_8347E_REV11_PBGA           0x80340101
+#define SPR_8347_REV11_PBGA            0x80350101
+#define SPR_8343E_REV11                        0x80360101
+#define SPR_8343_REV11                 0x80370101
+
+#define SPR_8349E_REV31                        0x80300300
+#define SPR_8349_REV31                 0x80310300
+#define SPR_8347E_REV31_TBGA           0x80320300
+#define SPR_8347_REV31_TBGA            0x80330300
+#define SPR_8347E_REV31_PBGA           0x80340300
+#define SPR_8347_REV31_PBGA            0x80350300
+#define SPR_8343E_REV31                        0x80360300
+#define SPR_8343_REV31                 0x80370300
+
+#define SPR_8360E_REV10                        0x80480010
+#define SPR_8360_REV10                 0x80490010
+#define SPR_8360E_REV11                        0x80480011
+#define SPR_8360_REV11                 0x80490011
+#define SPR_8360E_REV12                        0x80480012
+#define SPR_8360_REV12                 0x80490012
+#define SPR_8360E_REV20                        0x80480020
+#define SPR_8360_REV20                 0x80490020
+
+#define SPR_8323E_REV10                        0x80620010
+#define SPR_8323_REV10                 0x80630010
+#define SPR_8321E_REV10                        0x80660010
+#define SPR_8321_REV10                 0x80670010
+#define SPR_8323E_REV11                        0x80620011
+#define SPR_8323_REV11                 0x80630011
+#define SPR_8321E_REV11                        0x80660011
+#define SPR_8321_REV11                 0x80670011
+
+/* SPCR - System Priority Configuration Register
+ */
+#define SPCR_PCIHPE                    0x10000000      /* PCI Highest Priority Enable */
+#define SPCR_PCIHPE_SHIFT              (31-3)
+#define SPCR_PCIPR                     0x03000000      /* PCI bridge system bus request priority */
+#define SPCR_PCIPR_SHIFT               (31-7)
+#define SPCR_OPT                       0x00800000      /* Optimize */
+#define SPCR_TBEN                      0x00400000      /* E300 PowerPC core time base unit enable */
+#define SPCR_TBEN_SHIFT                        (31-9)
+#define SPCR_COREPR                    0x00300000      /* E300 PowerPC Core system bus request priority */
+#define SPCR_COREPR_SHIFT              (31-11)
+
+#if defined(CONFIG_MPC834X)
+/* SPCR bits - MPC8349 specific */
+#define SPCR_TSEC1DP                   0x00003000      /* TSEC1 data priority */
+#define SPCR_TSEC1DP_SHIFT             (31-19)
+#define SPCR_TSEC1BDP                  0x00000C00      /* TSEC1 buffer descriptor priority */
+#define SPCR_TSEC1BDP_SHIFT            (31-21)
+#define SPCR_TSEC1EP                   0x00000300      /* TSEC1 emergency priority */
+#define SPCR_TSEC1EP_SHIFT             (31-23)
+#define SPCR_TSEC2DP                   0x00000030      /* TSEC2 data priority */
+#define SPCR_TSEC2DP_SHIFT             (31-27)
+#define SPCR_TSEC2BDP                  0x0000000C      /* TSEC2 buffer descriptor priority */
+#define SPCR_TSEC2BDP_SHIFT            (31-29)
+#define SPCR_TSEC2EP                   0x00000003      /* TSEC2 emergency priority */
+#define SPCR_TSEC2EP_SHIFT             (31-31)
+#endif
 
-#define SWCNR      0x0208
-#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field.
-#define SWCNR_RES  ~(SWCNR_SWCN)
+/* SICRL/H - System I/O Configuration Register Low/High
+ */
+#if defined(CONFIG_MPC834X)
+/* SICRL bits - MPC8349 specific */
+#define SICRL_LDP_A                    0x80000000
+#define SICRL_USB1                     0x40000000
+#define SICRL_USB0                     0x20000000
+#define SICRL_UART                     0x0C000000
+#define SICRL_GPIO1_A                  0x02000000
+#define SICRL_GPIO1_B                  0x01000000
+#define SICRL_GPIO1_C                  0x00800000
+#define SICRL_GPIO1_D                  0x00400000
+#define SICRL_GPIO1_E                  0x00200000
+#define SICRL_GPIO1_F                  0x00180000
+#define SICRL_GPIO1_G                  0x00040000
+#define SICRL_GPIO1_H                  0x00020000
+#define SICRL_GPIO1_I                  0x00010000
+#define SICRL_GPIO1_J                  0x00008000
+#define SICRL_GPIO1_K                  0x00004000
+#define SICRL_GPIO1_L                  0x00003000
+
+/* SICRH bits - MPC8349 specific */
+#define SICRH_DDR                      0x80000000
+#define SICRH_TSEC1_A                  0x10000000
+#define SICRH_TSEC1_B                  0x08000000
+#define SICRH_TSEC1_C                  0x04000000
+#define SICRH_TSEC1_D                  0x02000000
+#define SICRH_TSEC1_E                  0x01000000
+#define SICRH_TSEC1_F                  0x00800000
+#define SICRH_TSEC2_A                  0x00400000
+#define SICRH_TSEC2_B                  0x00200000
+#define SICRH_TSEC2_C                  0x00100000
+#define SICRH_TSEC2_D                  0x00080000
+#define SICRH_TSEC2_E                  0x00040000
+#define SICRH_TSEC2_F                  0x00020000
+#define SICRH_TSEC2_G                  0x00010000
+#define SICRH_TSEC2_H                  0x00008000
+#define SICRH_GPIO2_A                  0x00004000
+#define SICRH_GPIO2_B                  0x00002000
+#define SICRH_GPIO2_C                  0x00001000
+#define SICRH_GPIO2_D                  0x00000800
+#define SICRH_GPIO2_E                  0x00000400
+#define SICRH_GPIO2_F                  0x00000200
+#define SICRH_GPIO2_G                  0x00000180
+#define SICRH_GPIO2_H                  0x00000060
+#define SICRH_TSOBI1                   0x00000002
+#define SICRH_TSOBI2                   0x00000001
+
+#elif defined(CONFIG_MPC8360)
+/* SICRL bits - MPC8360 specific */
+#define SICRL_LDP_A                    0xC0000000
+#define SICRL_LCLK_1                   0x10000000
+#define SICRL_LCLK_2                   0x08000000
+#define SICRL_SRCID_A                  0x03000000
+#define SICRL_IRQ_CKSTP_A              0x00C00000
+
+/* SICRH bits - MPC8360 specific */
+#define SICRH_DDR                      0x80000000
+#define SICRH_SECONDARY_DDR            0x40000000
+#define SICRH_SDDROE                   0x20000000
+#define SICRH_IRQ3                     0x10000000
+#define SICRH_UC1EOBI                  0x00000004
+#define SICRH_UC2E1OBI                 0x00000002
+#define SICRH_UC2E2OBI                 0x00000001
+
+#elif defined(CONFIG_MPC832X)
+/* SICRL bits - MPC832X specific */
+#define SICRL_LDP_LCS_A                        0x80000000
+#define SICRL_IRQ_CKS                  0x20000000
+#define SICRL_PCI_MSRC                 0x10000000
+#define SICRL_URT_CTPR                 0x06000000
+#define SICRL_IRQ_CTPR                 0x00C00000
+#endif
 
-#define SWSRR      0x020E
+/* SWCRR - System Watchdog Control Register
+ */
+#define SWCRR                          0x0204          /* Register offset to immr */
+#define SWCRR_SWTC                     0xFFFF0000      /* Software Watchdog Time Count */
+#define SWCRR_SWEN                     0x00000004      /* Watchdog Enable bit */
+#define SWCRR_SWRI                     0x00000002      /* Software Watchdog Reset/Interrupt Select bit */
+#define SWCRR_SWPR                     0x00000001      /* Software Watchdog Counter Prescale bit */
+#define SWCRR_RES                      ~(SWCRR_SWTC | SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR)
+
+/* SWCNR - System Watchdog Counter Register
+ */
+#define SWCNR                          0x0208          /* Register offset to immr */
+#define SWCNR_SWCN                     0x0000FFFF      /* Software Watchdog Count mask */
+#define SWCNR_RES                      ~(SWCNR_SWCN)
 
-/*
- * Default Internal Memory Register Space (Freescale recomandation)
+/* SWSRR - System Watchdog Service Register
  */
-#define IMMRBAR 0x0000
-#define IMMRBAR_BASE_ADDR     0xFFF00000 /* Identifies the 12 most-significant address bits of the base of the 1 MByte internal memory window. */
-#define IMMRBAR_RES           ~(IMMRBAR_BASE_ADDR)
+#define SWSRR                          0x020E          /* Register offset to immr */
 
-/*
- * Default Internal Memory Register Space (Freescale recomandation)
+/* ACR - Arbiter Configuration Register
  */
-#define LBLAWBAR0 0x0020
-#define LBLAWAR0  0x0024
-#define LBLAWBAR1 0x0028
-#define LBLAWAR1  0x002C
-#define LBLAWBAR2 0x0030
-#define LBLAWAR2  0x0034
-#define LBLAWBAR3 0x0038
-#define LBLAWAR3  0x003C
+#define ACR_COREDIS                    0x10000000      /* Core disable */
+#define ACR_COREDIS_SHIFT              (31-7)
+#define ACR_PIPE_DEP                   0x00070000      /* Pipeline depth */
+#define ACR_PIPE_DEP_SHIFT             (31-15)
+#define ACR_PCI_RPTCNT                 0x00007000      /* PCI repeat count */
+#define ACR_PCI_RPTCNT_SHIFT           (31-19)
+#define ACR_RPTCNT                     0x00000700      /* Repeat count */
+#define ACR_RPTCNT_SHIFT               (31-23)
+#define ACR_APARK                      0x00000030      /* Address parking */
+#define ACR_APARK_SHIFT                        (31-27)
+#define ACR_PARKM                      0x0000000F      /* Parking master */
+#define ACR_PARKM_SHIFT                        (31-31)
+
+/* ATR - Arbiter Timers Register
+ */
+#define ATR_DTO                                0x00FF0000      /* Data time out */
+#define ATR_ATO                                0x000000FF      /* Address time out */
 
-/*
- * The device ID and revision numbers
- */
-#define SPR_8349E_REV10                0x80300100
-#define SPR_8349_REV10         0x80310100
-#define SPR_8347E_REV10_TBGA   0x80320100
-#define SPR_8347_REV10_TBGA    0x80330100
-#define SPR_8347E_REV10_PBGA   0x80340100
-#define SPR_8347_REV10_PBGA    0x80350100
-#define SPR_8343E_REV10                0x80360100
-#define SPR_8343_REV10         0x80370100
-
-#define SPR_8349E_REV11                0x80300101
-#define SPR_8349_REV11         0x80310101
-#define SPR_8347E_REV11_TBGA   0x80320101
-#define SPR_8347_REV11_TBGA    0x80330101
-#define SPR_8347E_REV11_PBGA   0x80340101
-#define SPR_8347_REV11_PBGA    0x80350101
-#define SPR_8343E_REV11                0x80360101
-#define SPR_8343_REV11         0x80370101
-
-#define SPR_8360E_REV10                0x80480010
-#define SPR_8360_REV10         0x80490010
-#define SPR_8360E_REV11                0x80480011
-#define SPR_8360_REV11         0x80490011
-#define SPR_8360E_REV12                0x80480012
-#define SPR_8360_REV12         0x80490012
+/* AER - Arbiter Event Register
+ */
+#define AER_ETEA                       0x00000020      /* Transfer error */
+#define AER_RES                                0x00000010      /* Reserved transfer type */
+#define AER_ECW                                0x00000008      /* External control word transfer type */
+#define AER_AO                         0x00000004      /* Address Only transfer type */
+#define AER_DTO                                0x00000002      /* Data time out */
+#define AER_ATO                                0x00000001      /* Address time out */
+
+/* AEATR - Arbiter Event Address Register
+ */
+#define AEATR_EVENT                    0x07000000      /* Event type */
+#define AEATR_MSTR_ID                  0x001F0000      /* Master Id */
+#define AEATR_TBST                     0x00000800      /* Transfer burst */
+#define AEATR_TSIZE                    0x00000700      /* Transfer Size */
+#define AEATR_TTYPE                    0x0000001F      /* Transfer Type */
 
-/*
- * Base Registers & Option Registers
- */
-#define BR0 0x5000
-#define BR1 0x5008
-#define BR2 0x5010
-#define BR3 0x5018
-#define BR4 0x5020
-#define BR5 0x5028
-#define BR6 0x5030
-#define BR7 0x5038
-
-#define BR_BA          0xFFFF8000
-#define BR_BA_SHIFT            15
-#define BR_PS          0x00001800
-#define BR_PS_SHIFT            11
-#define BR_PS_8                0x00000800  /* Port Size 8 bit */
-#define BR_PS_16       0x00001000  /* Port Size 16 bit */
-#define BR_PS_32       0x00001800  /* Port Size 32 bit */
-#define BR_DECC                0x00000600
-#define BR_DECC_SHIFT           9
-#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_SDRAM    0x00000060  /* SDRAM */
-#define BR_MS_UPMA     0x00000080  /* UPMA */
-#define BR_MS_UPMB     0x000000A0  /* UPMB */
-#define BR_MS_UPMC     0x000000C0  /* UPMC */
-#if defined (CONFIG_MPC8360)
-#define BR_ATOM                0x0000000C
-#define BR_ATOM_SHIFT          2
+/* HRCWL - Hard Reset Configuration Word Low
+ */
+#define HRCWL_LBIUCM                   0x80000000
+#define HRCWL_LBIUCM_SHIFT             31
+#define HRCWL_LCL_BUS_TO_SCB_CLK_1X1   0x00000000
+#define HRCWL_LCL_BUS_TO_SCB_CLK_2X1   0x80000000
+
+#define HRCWL_DDRCM                    0x40000000
+#define HRCWL_DDRCM_SHIFT              30
+#define HRCWL_DDR_TO_SCB_CLK_1X1       0x00000000
+#define HRCWL_DDR_TO_SCB_CLK_2X1       0x40000000
+
+#define HRCWL_SPMF                     0x0f000000
+#define HRCWL_SPMF_SHIFT               24
+#define HRCWL_CSB_TO_CLKIN_16X1                0x00000000
+#define HRCWL_CSB_TO_CLKIN_1X1         0x01000000
+#define HRCWL_CSB_TO_CLKIN_2X1         0x02000000
+#define HRCWL_CSB_TO_CLKIN_3X1         0x03000000
+#define HRCWL_CSB_TO_CLKIN_4X1         0x04000000
+#define HRCWL_CSB_TO_CLKIN_5X1         0x05000000
+#define HRCWL_CSB_TO_CLKIN_6X1         0x06000000
+#define HRCWL_CSB_TO_CLKIN_7X1         0x07000000
+#define HRCWL_CSB_TO_CLKIN_8X1         0x08000000
+#define HRCWL_CSB_TO_CLKIN_9X1         0x09000000
+#define HRCWL_CSB_TO_CLKIN_10X1                0x0A000000
+#define HRCWL_CSB_TO_CLKIN_11X1                0x0B000000
+#define HRCWL_CSB_TO_CLKIN_12X1                0x0C000000
+#define HRCWL_CSB_TO_CLKIN_13X1                0x0D000000
+#define HRCWL_CSB_TO_CLKIN_14X1                0x0E000000
+#define HRCWL_CSB_TO_CLKIN_15X1                0x0F000000
+
+#define HRCWL_VCO_BYPASS               0x00000000
+#define HRCWL_VCO_1X2                  0x00000000
+#define HRCWL_VCO_1X4                  0x00200000
+#define HRCWL_VCO_1X8                  0x00400000
+
+#define HRCWL_COREPLL                  0x007F0000
+#define HRCWL_COREPLL_SHIFT            16
+#define HRCWL_CORE_TO_CSB_BYPASS       0x00000000
+#define HRCWL_CORE_TO_CSB_1X1          0x00020000
+#define HRCWL_CORE_TO_CSB_1_5X1                0x00030000
+#define HRCWL_CORE_TO_CSB_2X1          0x00040000
+#define HRCWL_CORE_TO_CSB_2_5X1                0x00050000
+#define HRCWL_CORE_TO_CSB_3X1          0x00060000
+
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
+#define HRCWL_CEVCOD                   0x000000C0
+#define HRCWL_CEVCOD_SHIFT             6
+#define HRCWL_CE_PLL_VCO_DIV_4         0x00000000
+#define HRCWL_CE_PLL_VCO_DIV_8         0x00000040
+#define HRCWL_CE_PLL_VCO_DIV_2         0x00000080
+
+#define HRCWL_CEPDF                    0x00000020
+#define HRCWL_CEPDF_SHIFT              5
+#define HRCWL_CE_PLL_DIV_1X1           0x00000000
+#define HRCWL_CE_PLL_DIV_2X1           0x00000020
+
+#define HRCWL_CEPMF                    0x0000001F
+#define HRCWL_CEPMF_SHIFT              0
+#define HRCWL_CE_TO_PLL_1X16_          0x00000000
+#define HRCWL_CE_TO_PLL_1X2            0x00000002
+#define HRCWL_CE_TO_PLL_1X3            0x00000003
+#define HRCWL_CE_TO_PLL_1X4            0x00000004
+#define HRCWL_CE_TO_PLL_1X5            0x00000005
+#define HRCWL_CE_TO_PLL_1X6            0x00000006
+#define HRCWL_CE_TO_PLL_1X7            0x00000007
+#define HRCWL_CE_TO_PLL_1X8            0x00000008
+#define HRCWL_CE_TO_PLL_1X9            0x00000009
+#define HRCWL_CE_TO_PLL_1X10           0x0000000A
+#define HRCWL_CE_TO_PLL_1X11           0x0000000B
+#define HRCWL_CE_TO_PLL_1X12           0x0000000C
+#define HRCWL_CE_TO_PLL_1X13           0x0000000D
+#define HRCWL_CE_TO_PLL_1X14           0x0000000E
+#define HRCWL_CE_TO_PLL_1X15           0x0000000F
+#define HRCWL_CE_TO_PLL_1X16           0x00000010
+#define HRCWL_CE_TO_PLL_1X17           0x00000011
+#define HRCWL_CE_TO_PLL_1X18           0x00000012
+#define HRCWL_CE_TO_PLL_1X19           0x00000013
+#define HRCWL_CE_TO_PLL_1X20           0x00000014
+#define HRCWL_CE_TO_PLL_1X21           0x00000015
+#define HRCWL_CE_TO_PLL_1X22           0x00000016
+#define HRCWL_CE_TO_PLL_1X23           0x00000017
+#define HRCWL_CE_TO_PLL_1X24           0x00000018
+#define HRCWL_CE_TO_PLL_1X25           0x00000019
+#define HRCWL_CE_TO_PLL_1X26           0x0000001A
+#define HRCWL_CE_TO_PLL_1X27           0x0000001B
+#define HRCWL_CE_TO_PLL_1X28           0x0000001C
+#define HRCWL_CE_TO_PLL_1X29           0x0000001D
+#define HRCWL_CE_TO_PLL_1X30           0x0000001E
+#define HRCWL_CE_TO_PLL_1X31           0x0000001F
 #endif
-#define BR_V           0x00000001
-#define BR_V_SHIFT              0
-#if defined (CONFIG_MPC8349)
-#define BR_RES         ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V)
-#elif defined (CONFIG_MPC8360)
-#define BR_RES         ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_ATOM|BR_V)
+
+/* HRCWH - Hardware Reset Configuration Word High
+ */
+#define HRCWH_PCI_HOST                 0x80000000
+#define HRCWH_PCI_HOST_SHIFT           31
+#define HRCWH_PCI_AGENT                        0x00000000
+
+#if defined(CONFIG_MPC834X)
+#define HRCWH_32_BIT_PCI               0x00000000
+#define HRCWH_64_BIT_PCI               0x40000000
 #endif
 
-#define OR0 0x5004
-#define OR1 0x500C
-#define OR2 0x5014
-#define OR3 0x501C
-#define OR4 0x5024
-#define OR5 0x502C
-#define OR6 0x5034
-#define OR7 0x503C
+#define HRCWH_PCI1_ARBITER_DISABLE     0x00000000
+#define HRCWH_PCI1_ARBITER_ENABLE      0x20000000
 
-#define OR_GPCM_AM             0xFFFF8000
-#define OR_GPCM_AM_SHIFT               15
-#define OR_GPCM_BCTLD          0x00001000
-#define OR_GPCM_BCTLD_SHIFT            12
-#define OR_GPCM_CSNT           0x00000800
-#define OR_GPCM_CSNT_SHIFT             11
-#define OR_GPCM_ACS            0x00000600
-#define OR_GPCM_ACS_SHIFT               9
-#define OR_GPCM_ACS_0b10       0x00000400
-#define OR_GPCM_ACS_0b11       0x00000600
-#define OR_GPCM_XACS           0x00000100
-#define OR_GPCM_XACS_SHIFT              8
-#define OR_GPCM_SCY            0x000000F0
-#define OR_GPCM_SCY_SHIFT               4
-#define OR_GPCM_SCY_1          0x00000010
-#define OR_GPCM_SCY_2          0x00000020
-#define OR_GPCM_SCY_3          0x00000030
-#define OR_GPCM_SCY_4          0x00000040
-#define OR_GPCM_SCY_5          0x00000050
-#define OR_GPCM_SCY_6          0x00000060
-#define OR_GPCM_SCY_7          0x00000070
-#define OR_GPCM_SCY_8          0x00000080
-#define OR_GPCM_SCY_9          0x00000090
-#define OR_GPCM_SCY_10         0x000000a0
-#define OR_GPCM_SCY_11         0x000000b0
-#define OR_GPCM_SCY_12         0x000000c0
-#define OR_GPCM_SCY_13         0x000000d0
-#define OR_GPCM_SCY_14         0x000000e0
-#define OR_GPCM_SCY_15         0x000000f0
-#define OR_GPCM_SETA           0x00000008
-#define OR_GPCM_SETA_SHIFT              3
-#define OR_GPCM_TRLX           0x00000004
-#define OR_GPCM_TRLX_SHIFT              2
-#define OR_GPCM_EHTR           0x00000002
-#define OR_GPCM_EHTR_SHIFT              1
-#define OR_GPCM_EAD            0x00000001
-#define OR_GPCM_EAD_SHIFT               0
-
-#define OR_UPM_AM    0xFFFF8000
-#define OR_UPM_AM_SHIFT      15
-#define OR_UPM_XAM   0x00006000
-#define OR_UPM_XAM_SHIFT     13
-#define OR_UPM_BCTLD 0x00001000
-#define OR_UPM_BCTLD_SHIFT   12
-#define OR_UPM_BI    0x00000100
-#define OR_UPM_BI_SHIFT       8
-#define OR_UPM_TRLX  0x00000004
-#define OR_UPM_TRLX_SHIFT     2
-#define OR_UPM_EHTR  0x00000002
-#define OR_UPM_EHTR_SHIFT     1
-#define OR_UPM_EAD   0x00000001
-#define OR_UPM_EAD_SHIFT      0
-
-#define OR_SDRAM_AM    0xFFFF8000
-#define OR_SDRAM_AM_SHIFT      15
-#define OR_SDRAM_XAM   0x00006000
-#define OR_SDRAM_XAM_SHIFT     13
-#define OR_SDRAM_COLS  0x00001C00
-#define OR_SDRAM_COLS_SHIFT    10
-#define OR_SDRAM_ROWS  0x000001C0
-#define OR_SDRAM_ROWS_SHIFT     6
-#define OR_SDRAM_PMSEL 0x00000020
-#define OR_SDRAM_PMSEL_SHIFT    5
-#define OR_SDRAM_EAD   0x00000001
-#define OR_SDRAM_EAD_SHIFT      0
+#define HRCWH_PCI_ARBITER_DISABLE      0x00000000
+#define HRCWH_PCI_ARBITER_ENABLE       0x20000000
 
-/*
- * Hard Reset Configration Word - High
- */
-#define HRCWH_PCI_AGENT              0x00000000
-#define HRCWH_PCI_HOST               0x80000000
+#if defined(CONFIG_MPC834X)
+#define HRCWH_PCI2_ARBITER_DISABLE     0x00000000
+#define HRCWH_PCI2_ARBITER_ENABLE      0x10000000
 
-#if defined (CONFIG_MPC8349)
-#define HRCWH_32_BIT_PCI             0x00000000
-#define HRCWH_64_BIT_PCI             0x40000000
+#elif defined(CONFIG_MPC8360)
+#define HRCWH_PCICKDRV_DISABLE         0x00000000
+#define HRCWH_PCICKDRV_ENABLE          0x10000000
 #endif
 
-#define HRCWH_PCI1_ARBITER_DISABLE   0x00000000
-#define HRCWH_PCI1_ARBITER_ENABLE    0x20000000
+#define HRCWH_CORE_DISABLE             0x08000000
+#define HRCWH_CORE_ENABLE              0x00000000
+
+#define HRCWH_FROM_0X00000100          0x00000000
+#define HRCWH_FROM_0XFFF00100          0x04000000
+
+#define HRCWH_BOOTSEQ_DISABLE          0x00000000
+#define HRCWH_BOOTSEQ_NORMAL           0x01000000
+#define HRCWH_BOOTSEQ_EXTENDED         0x02000000
+
+#define HRCWH_SW_WATCHDOG_DISABLE      0x00000000
+#define HRCWH_SW_WATCHDOG_ENABLE       0x00800000
 
-#if defined (CONFIG_MPC8349)
-#define HRCWH_PCI2_ARBITER_DISABLE   0x00000000
-#define HRCWH_PCI2_ARBITER_ENABLE    0x10000000
-#elif defined (CONFIG_MPC8360)
-#define HRCWH_PCICKDRV_DISABLE       0x00000000
-#define HRCWH_PCICKDRV_ENABLE        0x10000000
+#define HRCWH_ROM_LOC_DDR_SDRAM                0x00000000
+#define HRCWH_ROM_LOC_PCI1             0x00100000
+#if defined(CONFIG_MPC834X)
+#define HRCWH_ROM_LOC_PCI2             0x00200000
+#endif
+#define HRCWH_ROM_LOC_LOCAL_8BIT       0x00500000
+#define HRCWH_ROM_LOC_LOCAL_16BIT      0x00600000
+#define HRCWH_ROM_LOC_LOCAL_32BIT      0x00700000
+
+#if defined(CONFIG_MPC834X)
+#define HRCWH_TSEC1M_IN_RGMII          0x00000000
+#define HRCWH_TSEC1M_IN_RTBI           0x00004000
+#define HRCWH_TSEC1M_IN_GMII           0x00008000
+#define HRCWH_TSEC1M_IN_TBI            0x0000C000
+#define HRCWH_TSEC2M_IN_RGMII          0x00000000
+#define HRCWH_TSEC2M_IN_RTBI           0x00001000
+#define HRCWH_TSEC2M_IN_GMII           0x00002000
+#define HRCWH_TSEC2M_IN_TBI            0x00003000
+#endif
+
+#if defined(CONFIG_MPC8360)
+#define HRCWH_SECONDARY_DDR_DISABLE    0x00000000
+#define HRCWH_SECONDARY_DDR_ENABLE     0x00000010
 #endif
 
-#define HRCWH_CORE_DISABLE           0x08000000
-#define HRCWH_CORE_ENABLE            0x00000000
+#define HRCWH_BIG_ENDIAN               0x00000000
+#define HRCWH_LITTLE_ENDIAN            0x00000008
 
-#define HRCWH_FROM_0X00000100        0x00000000
-#define HRCWH_FROM_0XFFF00100        0x04000000
+#define HRCWH_LALE_NORMAL              0x00000000
+#define HRCWH_LALE_EARLY               0x00000004
 
-#define HRCWH_BOOTSEQ_DISABLE        0x00000000
-#define HRCWH_BOOTSEQ_NORMAL         0x01000000
-#define HRCWH_BOOTSEQ_EXTENDED       0x02000000
+#define HRCWH_LDP_SET                  0x00000000
+#define HRCWH_LDP_CLEAR                        0x00000002
 
-#define HRCWH_SW_WATCHDOG_DISABLE    0x00000000
-#define HRCWH_SW_WATCHDOG_ENABLE     0x00800000
+/* RSR - Reset Status Register
+ */
+#define RSR_RSTSRC                     0xE0000000      /* Reset source */
+#define RSR_RSTSRC_SHIFT               29
+#define RSR_BSF                                0x00010000      /* Boot seq. fail */
+#define RSR_BSF_SHIFT                  16
+#define RSR_SWSR                       0x00002000      /* software soft reset */
+#define RSR_SWSR_SHIFT                 13
+#define RSR_SWHR                       0x00001000      /* software hard reset */
+#define RSR_SWHR_SHIFT                 12
+#define RSR_JHRS                       0x00000200      /* jtag hreset */
+#define RSR_JHRS_SHIFT                 9
+#define RSR_JSRS                       0x00000100      /* jtag sreset status */
+#define RSR_JSRS_SHIFT                 8
+#define RSR_CSHR                       0x00000010      /* checkstop reset status */
+#define RSR_CSHR_SHIFT                 4
+#define RSR_SWRS                       0x00000008      /* software watchdog reset status */
+#define RSR_SWRS_SHIFT                 3
+#define RSR_BMRS                       0x00000004      /* bus monitop reset status */
+#define RSR_BMRS_SHIFT                 2
+#define RSR_SRS                                0x00000002      /* soft reset status */
+#define RSR_SRS_SHIFT                  1
+#define RSR_HRS                                0x00000001      /* hard reset status */
+#define RSR_HRS_SHIFT                  0
+#define RSR_RES                                ~(RSR_RSTSRC | RSR_BSF | RSR_SWSR | RSR_SWHR |\
+                                        RSR_JHRS | RSR_JSRS | RSR_CSHR | RSR_SWRS |\
+                                        RSR_BMRS | RSR_SRS | RSR_HRS)
+/* RMR - Reset Mode Register
+ */
+#define RMR_CSRE                       0x00000001      /* checkstop reset enable */
+#define RMR_CSRE_SHIFT                 0
+#define RMR_RES                                ~(RMR_CSRE)
 
-#define HRCWH_ROM_LOC_DDR_SDRAM      0x00000000
-#define HRCWH_ROM_LOC_PCI1           0x00100000
-#if defined (CONFIG_MPC8349)
-#define HRCWH_ROM_LOC_PCI2           0x00200000
+/* RCR - Reset Control Register
+ */
+#define RCR_SWHR                       0x00000002      /* software hard reset */
+#define RCR_SWSR                       0x00000001      /* software soft reset */
+#define RCR_RES                                ~(RCR_SWHR | RCR_SWSR)
+
+/* RCER - Reset Control Enable Register
+ */
+#define RCER_CRE                       0x00000001      /* software hard reset */
+#define RCER_RES                       ~(RCER_CRE)
+
+/* SPMR - System PLL Mode Register
+ */
+#define SPMR_LBIUCM                    0x80000000
+#define SPMR_DDRCM                     0x40000000
+#define SPMR_SPMF                      0x0F000000
+#define SPMR_CKID                      0x00800000
+#define SPMR_CKID_SHIFT                        23
+#define SPMR_COREPLL                   0x007F0000
+#define SPMR_CEVCOD                    0x000000C0
+#define SPMR_CEPDF                     0x00000020
+#define SPMR_CEPMF                     0x0000001F
+
+/* OCCR - Output Clock Control Register
+ */
+#define OCCR_PCICOE0                   0x80000000
+#define OCCR_PCICOE1                   0x40000000
+#define OCCR_PCICOE2                   0x20000000
+#define OCCR_PCICOE3                   0x10000000
+#define OCCR_PCICOE4                   0x08000000
+#define OCCR_PCICOE5                   0x04000000
+#define OCCR_PCICOE6                   0x02000000
+#define OCCR_PCICOE7                   0x01000000
+#define OCCR_PCICD0                    0x00800000
+#define OCCR_PCICD1                    0x00400000
+#define OCCR_PCICD2                    0x00200000
+#define OCCR_PCICD3                    0x00100000
+#define OCCR_PCICD4                    0x00080000
+#define OCCR_PCICD5                    0x00040000
+#define OCCR_PCICD6                    0x00020000
+#define OCCR_PCICD7                    0x00010000
+#define OCCR_PCI1CR                    0x00000002
+#define OCCR_PCI2CR                    0x00000001
+#define OCCR_PCICR                     OCCR_PCI1CR
+
+/* SCCR - System Clock Control Register
+ */
+#define SCCR_ENCCM                     0x03000000
+#define SCCR_ENCCM_SHIFT               24
+#define SCCR_ENCCM_0                   0x00000000
+#define SCCR_ENCCM_1                   0x01000000
+#define SCCR_ENCCM_2                   0x02000000
+#define SCCR_ENCCM_3                   0x03000000
+
+#define SCCR_PCICM                     0x00010000
+#define SCCR_PCICM_SHIFT               16
+
+/* SCCR bits - MPC8349 specific */
+#ifdef CONFIG_MPC834X
+#define SCCR_TSEC1CM                   0xc0000000
+#define SCCR_TSEC1CM_SHIFT             30
+#define SCCR_TSEC1CM_0                 0x00000000
+#define SCCR_TSEC1CM_1                 0x40000000
+#define SCCR_TSEC1CM_2                 0x80000000
+#define SCCR_TSEC1CM_3                 0xC0000000
+
+#define SCCR_TSEC2CM                   0x30000000
+#define SCCR_TSEC2CM_SHIFT             28
+#define SCCR_TSEC2CM_0                 0x00000000
+#define SCCR_TSEC2CM_1                 0x10000000
+#define SCCR_TSEC2CM_2                 0x20000000
+#define SCCR_TSEC2CM_3                 0x30000000
 #endif
-#define HRCWH_ROM_LOC_LOCAL_8BIT     0x00500000
-#define HRCWH_ROM_LOC_LOCAL_16BIT    0x00600000
-#define HRCWH_ROM_LOC_LOCAL_32BIT    0x00700000
-
-#if defined (CONFIG_MPC8349)
-#define HRCWH_TSEC1M_IN_RGMII        0x00000000
-#define HRCWH_TSEC1M_IN_RTBI         0x00004000
-#define HRCWH_TSEC1M_IN_GMII         0x00008000
-#define HRCWH_TSEC1M_IN_TBI          0x0000C000
-
-#define HRCWH_TSEC2M_IN_RGMII        0x00000000
-#define HRCWH_TSEC2M_IN_RTBI         0x00001000
-#define HRCWH_TSEC2M_IN_GMII         0x00002000
-#define HRCWH_TSEC2M_IN_TBI          0x00003000
+
+#define SCCR_USBMPHCM                  0x00c00000
+#define SCCR_USBMPHCM_SHIFT            22
+#define SCCR_USBDRCM                   0x00300000
+#define SCCR_USBDRCM_SHIFT             20
+
+#define SCCR_USBCM_0                   0x00000000
+#define SCCR_USBCM_1                   0x00500000
+#define SCCR_USBCM_2                   0x00A00000
+#define SCCR_USBCM_3                   0x00F00000
+
+/* CSn_BDNS - Chip Select memory Bounds Register
+ */
+#define CSBNDS_SA                      0x00FF0000
+#define CSBNDS_SA_SHIFT                        8
+#define CSBNDS_EA                      0x000000FF
+#define CSBNDS_EA_SHIFT                        24
+
+/* CSn_CONFIG - Chip Select Configuration Register
+ */
+#define CSCONFIG_EN                    0x80000000
+#define CSCONFIG_AP                    0x00800000
+#define CSCONFIG_ROW_BIT               0x00000700
+#define CSCONFIG_ROW_BIT_12            0x00000000
+#define CSCONFIG_ROW_BIT_13            0x00000100
+#define CSCONFIG_ROW_BIT_14            0x00000200
+#define CSCONFIG_COL_BIT               0x00000007
+#define CSCONFIG_COL_BIT_8             0x00000000
+#define CSCONFIG_COL_BIT_9             0x00000001
+#define CSCONFIG_COL_BIT_10            0x00000002
+#define CSCONFIG_COL_BIT_11            0x00000003
+
+/* TIMING_CFG_1 - DDR SDRAM Timing Configuration 1
+ */
+#define TIMING_CFG1_PRETOACT           0x70000000
+#define TIMING_CFG1_PRETOACT_SHIFT     28
+#define TIMING_CFG1_ACTTOPRE           0x0F000000
+#define TIMING_CFG1_ACTTOPRE_SHIFT     24
+#define TIMING_CFG1_ACTTORW            0x00700000
+#define TIMING_CFG1_ACTTORW_SHIFT      20
+#define TIMING_CFG1_CASLAT             0x00070000
+#define TIMING_CFG1_CASLAT_SHIFT       16
+#define TIMING_CFG1_REFREC             0x0000F000
+#define TIMING_CFG1_REFREC_SHIFT       12
+#define TIMING_CFG1_WRREC              0x00000700
+#define TIMING_CFG1_WRREC_SHIFT                8
+#define TIMING_CFG1_ACTTOACT           0x00000070
+#define TIMING_CFG1_ACTTOACT_SHIFT     4
+#define TIMING_CFG1_WRTORD             0x00000007
+#define TIMING_CFG1_WRTORD_SHIFT       0
+#define TIMING_CFG1_CASLAT_20          0x00030000      /* CAS latency = 2.0 */
+#define TIMING_CFG1_CASLAT_25          0x00040000      /* CAS latency = 2.5 */
+
+/* TIMING_CFG_2 - DDR SDRAM Timing Configuration 2
+ */
+#define TIMING_CFG2_CPO                        0x0F800000
+#define TIMING_CFG2_CPO_SHIFT          23
+#define TIMING_CFG2_ACSM               0x00080000
+#define TIMING_CFG2_WR_DATA_DELAY      0x00001C00
+#define TIMING_CFG2_WR_DATA_DELAY_SHIFT        10
+#define TIMING_CFG2_CPO_DEF            0x00000000      /* default (= CASLAT + 1) */
+
+/* DDR_SDRAM_CFG - DDR SDRAM Control Configuration
+ */
+#define SDRAM_CFG_MEM_EN               0x80000000
+#define SDRAM_CFG_SREN                 0x40000000
+#define SDRAM_CFG_ECC_EN               0x20000000
+#define SDRAM_CFG_RD_EN                        0x10000000
+#define SDRAM_CFG_SDRAM_TYPE           0x03000000
+#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
+
+/* DDR_SDRAM_MODE - DDR SDRAM Mode Register
+ */
+#define SDRAM_MODE_ESD                 0xFFFF0000
+#define SDRAM_MODE_ESD_SHIFT           16
+#define SDRAM_MODE_SD                  0x0000FFFF
+#define SDRAM_MODE_SD_SHIFT            0
+#define DDR_MODE_EXT_MODEREG           0x4000          /* select extended mode reg */
+#define DDR_MODE_EXT_OPMODE            0x3FF8          /* operating mode, mask */
+#define DDR_MODE_EXT_OP_NORMAL         0x0000          /* normal operation */
+#define DDR_MODE_QFC                   0x0004          /* QFC / compatibility, mask */
+#define DDR_MODE_QFC_COMP              0x0000          /* compatible to older SDRAMs */
+#define DDR_MODE_WEAK                  0x0002          /* weak drivers */
+#define DDR_MODE_DLL_DIS               0x0001          /* disable DLL */
+#define DDR_MODE_CASLAT                        0x0070          /* CAS latency, mask */
+#define DDR_MODE_CASLAT_15             0x0010          /* CAS latency 1.5 */
+#define DDR_MODE_CASLAT_20             0x0020          /* CAS latency 2 */
+#define DDR_MODE_CASLAT_25             0x0060          /* CAS latency 2.5 */
+#define DDR_MODE_CASLAT_30             0x0030          /* CAS latency 3 */
+#define DDR_MODE_BTYPE_SEQ             0x0000          /* sequential burst */
+#define DDR_MODE_BTYPE_ILVD            0x0008          /* interleaved burst */
+#define DDR_MODE_BLEN_2                        0x0001          /* burst length 2 */
+#define DDR_MODE_BLEN_4                        0x0002          /* burst length 4 */
+#define DDR_REFINT_166MHZ_7US          1302            /* exact value for 7.8125us */
+#define DDR_BSTOPRE                    256             /* use 256 cycles as a starting point */
+#define DDR_MODE_MODEREG               0x0000          /* select mode register */
+
+/* DDR_SDRAM_INTERVAL - DDR SDRAM Interval Register
+ */
+#define SDRAM_INTERVAL_REFINT          0x3FFF0000
+#define SDRAM_INTERVAL_REFINT_SHIFT    16
+#define SDRAM_INTERVAL_BSTOPRE         0x00003FFF
+#define SDRAM_INTERVAL_BSTOPRE_SHIFT   0
+
+/* DDR_SDRAM_CLK_CNTL - DDR SDRAM Clock Control Register
+ */
+#define DDR_SDRAM_CLK_CNTL_SS_EN               0x80000000
+#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_025      0x01000000
+#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05       0x02000000
+#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_075      0x03000000
+#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_1                0x04000000
+
+/* ECC_ERR_INJECT - Memory data path error injection mask ECC
+ */
+#define ECC_ERR_INJECT_EMB             (0x80000000>>22)        /* ECC Mirror Byte */
+#define ECC_ERR_INJECT_EIEN            (0x80000000>>23)        /* Error Injection Enable */
+#define ECC_ERR_INJECT_EEIM            (0xff000000>>24)        /* ECC Erroe Injection Enable */
+#define ECC_ERR_INJECT_EEIM_SHIFT      0
+
+/* CAPTURE_ECC - Memory data path read capture ECC
+ */
+#define CAPTURE_ECC_ECE                        (0xff000000>>24)
+#define CAPTURE_ECC_ECE_SHIFT          0
+
+/* ERR_DETECT - Memory error detect
+ */
+#define ECC_ERROR_DETECT_MME           (0x80000000>>0)         /* Multiple Memory Errors */
+#define ECC_ERROR_DETECT_MBE           (0x80000000>>28)        /* Multiple-Bit Error */
+#define ECC_ERROR_DETECT_SBE           (0x80000000>>29)        /* Single-Bit ECC Error Pickup */
+#define ECC_ERROR_DETECT_MSE           (0x80000000>>31)        /* Memory Select Error */
+
+/* ERR_DISABLE - Memory error disable
+ */
+#define ECC_ERROR_DISABLE_MBED         (0x80000000>>28)        /* Multiple-Bit ECC Error Disable */
+#define ECC_ERROR_DISABLE_SBED         (0x80000000>>29)        /* Sinle-Bit ECC Error disable */
+#define ECC_ERROR_DISABLE_MSED         (0x80000000>>31)        /* Memory Select Error Disable */
+#define ECC_ERROR_ENABLE               ~(ECC_ERROR_DISABLE_MSED | ECC_ERROR_DISABLE_SBED |\
+                                        ECC_ERROR_DISABLE_MBED)
+/* ERR_INT_EN - Memory error interrupt enable
+ */
+#define ECC_ERR_INT_EN_MBEE            (0x80000000>>28)        /* Multiple-Bit ECC Error Interrupt Enable */
+#define ECC_ERR_INT_EN_SBEE            (0x80000000>>29)        /* Single-Bit ECC Error Interrupt Enable */
+#define ECC_ERR_INT_EN_MSEE            (0x80000000>>31)        /* Memory Select Error Interrupt Enable */
+#define ECC_ERR_INT_DISABLE            ~(ECC_ERR_INT_EN_MBEE | ECC_ERR_INT_EN_SBEE |\
+                                        ECC_ERR_INT_EN_MSEE)
+/* CAPTURE_ATTRIBUTES - Memory error attributes capture
+ */
+#define ECC_CAPT_ATTR_BNUM             (0xe0000000>>1)         /* Data Beat Num */
+#define ECC_CAPT_ATTR_BNUM_SHIFT       28
+#define ECC_CAPT_ATTR_TSIZ             (0xc0000000>>6)         /* Transaction Size */
+#define ECC_CAPT_ATTR_TSIZ_FOUR_DW     0
+#define ECC_CAPT_ATTR_TSIZ_ONE_DW      1
+#define ECC_CAPT_ATTR_TSIZ_TWO_DW      2
+#define ECC_CAPT_ATTR_TSIZ_THREE_DW    3
+#define ECC_CAPT_ATTR_TSIZ_SHIFT       24
+#define ECC_CAPT_ATTR_TSRC             (0xf8000000>>11)        /* Transaction Source */
+#define ECC_CAPT_ATTR_TSRC_E300_CORE_DT        0x0
+#define ECC_CAPT_ATTR_TSRC_E300_CORE_IF        0x2
+#define ECC_CAPT_ATTR_TSRC_TSEC1       0x4
+#define ECC_CAPT_ATTR_TSRC_TSEC2       0x5
+#define ECC_CAPT_ATTR_TSRC_USB         (0x06|0x07)
+#define ECC_CAPT_ATTR_TSRC_ENCRYPT     0x8
+#define ECC_CAPT_ATTR_TSRC_I2C         0x9
+#define ECC_CAPT_ATTR_TSRC_JTAG                0xA
+#define ECC_CAPT_ATTR_TSRC_PCI1                0xD
+#define ECC_CAPT_ATTR_TSRC_PCI2                0xE
+#define ECC_CAPT_ATTR_TSRC_DMA         0xF
+#define ECC_CAPT_ATTR_TSRC_SHIFT       16
+#define ECC_CAPT_ATTR_TTYP             (0xe0000000>>18)        /* Transaction Type */
+#define ECC_CAPT_ATTR_TTYP_WRITE       0x1
+#define ECC_CAPT_ATTR_TTYP_READ                0x2
+#define ECC_CAPT_ATTR_TTYP_R_M_W       0x3
+#define ECC_CAPT_ATTR_TTYP_SHIFT       12
+#define ECC_CAPT_ATTR_VLD              (0x80000000>>31)        /* Valid */
+
+/* ERR_SBE - Single bit ECC memory error management
+ */
+#define ECC_ERROR_MAN_SBET             (0xff000000>>8)         /* Single-Bit Error Threshold 0..255 */
+#define ECC_ERROR_MAN_SBET_SHIFT       16
+#define ECC_ERROR_MAN_SBEC             (0xff000000>>24)        /* Single Bit Error Counter 0..255 */
+#define ECC_ERROR_MAN_SBEC_SHIFT       0
+
+/* BR - Base Registers
+ */
+#define BR0                            0x5000          /* Register offset to immr */
+#define BR1                            0x5008
+#define BR2                            0x5010
+#define BR3                            0x5018
+#define BR4                            0x5020
+#define BR5                            0x5028
+#define BR6                            0x5030
+#define BR7                            0x5038
+
+#define BR_BA                          0xFFFF8000
+#define BR_BA_SHIFT                    15
+#define BR_PS                          0x00001800
+#define BR_PS_SHIFT                    11
+#define BR_PS_8                                0x00000800      /* Port Size 8 bit */
+#define BR_PS_16                       0x00001000      /* Port Size 16 bit */
+#define BR_PS_32                       0x00001800      /* Port Size 32 bit */
+#define BR_DECC                                0x00000600
+#define BR_DECC_SHIFT                  9
+#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_SDRAM                    0x00000060      /* SDRAM */
+#define BR_MS_UPMA                     0x00000080      /* UPMA */
+#define BR_MS_UPMB                     0x000000A0      /* UPMB */
+#define BR_MS_UPMC                     0x000000C0      /* UPMC */
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
+#define BR_ATOM                                0x0000000C
+#define BR_ATOM_SHIFT                  2
 #endif
+#define BR_V                           0x00000001
+#define BR_V_SHIFT                     0
 
-#if defined (CONFIG_MPC8360)
-#define HRCWH_SECONDARY_DDR_DISABLE  0x00000000
-#define HRCWH_SECONDARY_DDR_ENABLE   0x00000010
+#if defined(CONFIG_MPC834X)
+#define BR_RES                         ~(BR_BA | BR_PS | BR_DECC | BR_WP | BR_MSEL | BR_V)
+#elif defined(CONFIG_MPC8360)
+#define BR_RES                         ~(BR_BA | BR_PS | BR_DECC | BR_WP | BR_MSEL | BR_ATOM | BR_V)
 #endif
 
-#define HRCWH_BIG_ENDIAN             0x00000000
-#define HRCWH_LITTLE_ENDIAN          0x00000008
+/* OR - Option Registers
+ */
+#define OR0                            0x5004          /* Register offset to immr */
+#define OR1                            0x500C
+#define OR2                            0x5014
+#define OR3                            0x501C
+#define OR4                            0x5024
+#define OR5                            0x502C
+#define OR6                            0x5034
+#define OR7                            0x503C
+
+#define OR_GPCM_AM                     0xFFFF8000
+#define OR_GPCM_AM_SHIFT               15
+#define OR_GPCM_BCTLD                  0x00001000
+#define OR_GPCM_BCTLD_SHIFT            12
+#define OR_GPCM_CSNT                   0x00000800
+#define OR_GPCM_CSNT_SHIFT             11
+#define OR_GPCM_ACS                    0x00000600
+#define OR_GPCM_ACS_SHIFT              9
+#define OR_GPCM_ACS_0b10               0x00000400
+#define OR_GPCM_ACS_0b11               0x00000600
+#define OR_GPCM_XACS                   0x00000100
+#define OR_GPCM_XACS_SHIFT             8
+#define OR_GPCM_SCY                    0x000000F0
+#define OR_GPCM_SCY_SHIFT              4
+#define OR_GPCM_SCY_1                  0x00000010
+#define OR_GPCM_SCY_2                  0x00000020
+#define OR_GPCM_SCY_3                  0x00000030
+#define OR_GPCM_SCY_4                  0x00000040
+#define OR_GPCM_SCY_5                  0x00000050
+#define OR_GPCM_SCY_6                  0x00000060
+#define OR_GPCM_SCY_7                  0x00000070
+#define OR_GPCM_SCY_8                  0x00000080
+#define OR_GPCM_SCY_9                  0x00000090
+#define OR_GPCM_SCY_10                 0x000000a0
+#define OR_GPCM_SCY_11                 0x000000b0
+#define OR_GPCM_SCY_12                 0x000000c0
+#define OR_GPCM_SCY_13                 0x000000d0
+#define OR_GPCM_SCY_14                 0x000000e0
+#define OR_GPCM_SCY_15                 0x000000f0
+#define OR_GPCM_SETA                   0x00000008
+#define OR_GPCM_SETA_SHIFT             3
+#define OR_GPCM_TRLX                   0x00000004
+#define OR_GPCM_TRLX_SHIFT             2
+#define OR_GPCM_EHTR                   0x00000002
+#define OR_GPCM_EHTR_SHIFT             1
+#define OR_GPCM_EAD                    0x00000001
+#define OR_GPCM_EAD_SHIFT              0
+
+#define OR_UPM_AM                      0xFFFF8000
+#define OR_UPM_AM_SHIFT                        15
+#define OR_UPM_XAM                     0x00006000
+#define OR_UPM_XAM_SHIFT               13
+#define OR_UPM_BCTLD                   0x00001000
+#define OR_UPM_BCTLD_SHIFT             12
+#define OR_UPM_BI                      0x00000100
+#define OR_UPM_BI_SHIFT                        8
+#define OR_UPM_TRLX                    0x00000004
+#define OR_UPM_TRLX_SHIFT              2
+#define OR_UPM_EHTR                    0x00000002
+#define OR_UPM_EHTR_SHIFT              1
+#define OR_UPM_EAD                     0x00000001
+#define OR_UPM_EAD_SHIFT               0
+
+#define OR_SDRAM_AM                    0xFFFF8000
+#define OR_SDRAM_AM_SHIFT              15
+#define OR_SDRAM_XAM                   0x00006000
+#define OR_SDRAM_XAM_SHIFT             13
+#define OR_SDRAM_COLS                  0x00001C00
+#define OR_SDRAM_COLS_SHIFT            10
+#define OR_SDRAM_ROWS                  0x000001C0
+#define OR_SDRAM_ROWS_SHIFT            6
+#define OR_SDRAM_PMSEL                 0x00000020
+#define OR_SDRAM_PMSEL_SHIFT           5
+#define OR_SDRAM_EAD                   0x00000001
+#define OR_SDRAM_EAD_SHIFT             0
+
+#define OR_AM_32KB                     0xFFFF8000
+#define OR_AM_64KB                     0xFFFF0000
+#define OR_AM_128KB                    0xFFFE0000
+#define OR_AM_256KB                    0xFFFC0000
+#define OR_AM_512KB                    0xFFF80000
+#define OR_AM_1MB                      0xFFF00000
+#define OR_AM_2MB                      0xFFE00000
+#define OR_AM_4MB                      0xFFC00000
+#define OR_AM_8MB                      0xFF800000
+#define OR_AM_16MB                     0xFF000000
+#define OR_AM_32MB                     0xFE000000
+#define OR_AM_64MB                     0xFC000000
+#define OR_AM_128MB                    0xF8000000
+#define OR_AM_256MB                    0xF0000000
+#define OR_AM_512MB                    0xE0000000
+#define OR_AM_1GB                      0xC0000000
+#define OR_AM_2GB                      0x80000000
+#define OR_AM_4GB                      0x00000000
+
+#define LBLAWAR_EN                     0x80000000
+#define LBLAWAR_4KB                    0x0000000B
+#define LBLAWAR_8KB                    0x0000000C
+#define LBLAWAR_16KB                   0x0000000D
+#define LBLAWAR_32KB                   0x0000000E
+#define LBLAWAR_64KB                   0x0000000F
+#define LBLAWAR_128KB                  0x00000010
+#define LBLAWAR_256KB                  0x00000011
+#define LBLAWAR_512KB                  0x00000012
+#define LBLAWAR_1MB                    0x00000013
+#define LBLAWAR_2MB                    0x00000014
+#define LBLAWAR_4MB                    0x00000015
+#define LBLAWAR_8MB                    0x00000016
+#define LBLAWAR_16MB                   0x00000017
+#define LBLAWAR_32MB                   0x00000018
+#define LBLAWAR_64MB                   0x00000019
+#define LBLAWAR_128MB                  0x0000001A
+#define LBLAWAR_256MB                  0x0000001B
+#define LBLAWAR_512MB                  0x0000001C
+#define LBLAWAR_1GB                    0x0000001D
+#define LBLAWAR_2GB                    0x0000001E
+
+/* LBCR - Local Bus Configuration Register
+ */
+#define LBCR_LDIS                      0x80000000
+#define LBCR_LDIS_SHIFT                        31
+#define LBCR_BCTLC                     0x00C00000
+#define LBCR_BCTLC_SHIFT               22
+#define LBCR_LPBSE                     0x00020000
+#define LBCR_LPBSE_SHIFT               17
+#define LBCR_EPAR                      0x00010000
+#define LBCR_EPAR_SHIFT                        16
+#define LBCR_BMT                       0x0000FF00
+#define LBCR_BMT_SHIFT                 8
+
+/* LCRR - Clock Ratio Register
+ */
+#define LCRR_DBYP                      0x80000000
+#define LCRR_DBYP_SHIFT                        31
+#define LCRR_BUFCMDC                   0x30000000
+#define LCRR_BUFCMDC_SHIFT             28
+#define LCRR_BUFCMDC_1                 0x10000000
+#define LCRR_BUFCMDC_2                 0x20000000
+#define LCRR_BUFCMDC_3                 0x30000000
+#define LCRR_BUFCMDC_4                 0x00000000
+#define LCRR_ECL                       0x03000000
+#define LCRR_ECL_SHIFT                 24
+#define LCRR_ECL_4                     0x00000000
+#define LCRR_ECL_5                     0x01000000
+#define LCRR_ECL_6                     0x02000000
+#define LCRR_ECL_7                     0x03000000
+#define LCRR_EADC                      0x00030000
+#define LCRR_EADC_SHIFT                        16
+#define LCRR_EADC_1                    0x00010000
+#define LCRR_EADC_2                    0x00020000
+#define LCRR_EADC_3                    0x00030000
+#define LCRR_EADC_4                    0x00000000
+#define LCRR_CLKDIV                    0x0000000F
+#define LCRR_CLKDIV_SHIFT              0
+#define LCRR_CLKDIV_2                  0x00000002
+#define LCRR_CLKDIV_4                  0x00000004
+#define LCRR_CLKDIV_8                  0x00000008
+
+/* DMAMR - DMA Mode Register
+ */
+#define DMA_CHANNEL_START                      0x00000001      /* Bit - DMAMRn CS */
+#define DMA_CHANNEL_TRANSFER_MODE_DIRECT       0x00000004      /* Bit - DMAMRn CTM */
+#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN     0x00001000      /* Bit - DMAMRn SAHE */
+#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B     0x00000000      /* 2Bit- DMAMRn SAHTS 1byte */
+#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B     0x00004000      /* 2Bit- DMAMRn SAHTS 2bytes */
+#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B     0x00008000      /* 2Bit- DMAMRn SAHTS 4bytes */
+#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B     0x0000c000      /* 2Bit- DMAMRn SAHTS 8bytes */
+#define DMA_CHANNEL_SNOOP                      0x00010000      /* Bit - DMAMRn DMSEN */
+
+/* DMASR - DMA Status Register
+ */
+#define DMA_CHANNEL_BUSY                       0x00000004      /* Bit - DMASRn CB */
+#define DMA_CHANNEL_TRANSFER_ERROR             0x00000080      /* Bit - DMASRn TE */
 
-#define HRCWH_LALE_NORMAL            0x00000000
-#define HRCWH_LALE_EARLY             0x00000004
+/* CONFIG_ADDRESS - PCI Config Address Register
+ */
+#define PCI_CONFIG_ADDRESS_EN          0x80000000
+#define PCI_CONFIG_ADDRESS_BN_SHIFT    16
+#define PCI_CONFIG_ADDRESS_BN_MASK     0x00ff0000
+#define PCI_CONFIG_ADDRESS_DN_SHIFT    11
+#define PCI_CONFIG_ADDRESS_DN_MASK     0x0000f800
+#define PCI_CONFIG_ADDRESS_FN_SHIFT    8
+#define PCI_CONFIG_ADDRESS_FN_MASK     0x00000700
+#define PCI_CONFIG_ADDRESS_RN_SHIFT    0
+#define PCI_CONFIG_ADDRESS_RN_MASK     0x000000fc
+
+/* POTAR - PCI Outbound Translation Address Register
+ */
+#define POTAR_TA_MASK                  0x000fffff
 
-#define HRCWH_LDP_SET                0x00000000
-#define HRCWH_LDP_CLEAR              0x00000002
+/* POBAR - PCI Outbound Base Address Register
+ */
+#define POBAR_BA_MASK                  0x000fffff
 
-/*
- * Hard Reset Configration Word - Low
- */
-#define HRCWL_LCL_BUS_TO_SCB_CLK_1X1 0x00000000
-#define HRCWL_LCL_BUS_TO_SCB_CLK_2X1 0x80000000
-
-#define HRCWL_DDR_TO_SCB_CLK_1X1     0x00000000
-#define HRCWL_DDR_TO_SCB_CLK_2X1     0x40000000
-
-#define HRCWL_CSB_TO_CLKIN_16X1      0x00000000
-#define HRCWL_CSB_TO_CLKIN_1X1       0x01000000
-#define HRCWL_CSB_TO_CLKIN_2X1       0x02000000
-#define HRCWL_CSB_TO_CLKIN_3X1       0x03000000
-#define HRCWL_CSB_TO_CLKIN_4X1       0x04000000
-#define HRCWL_CSB_TO_CLKIN_5X1       0x05000000
-#define HRCWL_CSB_TO_CLKIN_6X1       0x06000000
-#define HRCWL_CSB_TO_CLKIN_7X1       0x07000000
-#define HRCWL_CSB_TO_CLKIN_8X1       0x08000000
-#define HRCWL_CSB_TO_CLKIN_9X1       0x09000000
-#define HRCWL_CSB_TO_CLKIN_10X1      0x0A000000
-#define HRCWL_CSB_TO_CLKIN_11X1      0x0B000000
-#define HRCWL_CSB_TO_CLKIN_12X1      0x0C000000
-#define HRCWL_CSB_TO_CLKIN_13X1      0x0D000000
-#define HRCWL_CSB_TO_CLKIN_14X1      0x0E000000
-#define HRCWL_CSB_TO_CLKIN_15X1      0x0F000000
-
-#define HRCWL_VCO_BYPASS             0x00000000
-#define HRCWL_VCO_1X2                0x00000000
-#define HRCWL_VCO_1X4                0x00200000
-#define HRCWL_VCO_1X8                0x00400000
-
-#define HRCWL_CORE_TO_CSB_BYPASS     0x00000000
-#define HRCWL_CORE_TO_CSB_1X1        0x00020000
-#define HRCWL_CORE_TO_CSB_1_5X1      0x00030000
-#define HRCWL_CORE_TO_CSB_2X1        0x00040000
-#define HRCWL_CORE_TO_CSB_2_5X1      0x00050000
-#define HRCWL_CORE_TO_CSB_3X1        0x00060000
-
-#if defined (CONFIG_MPC8360)
-#define HRCWL_CE_PLL_VCO_DIV_4       0x00000000
-#define HRCWL_CE_PLL_VCO_DIV_8       0x00000040
-#define HRCWL_CE_PLL_VCO_DIV_2       0x00000080
-
-#define HRCWL_CE_PLL_DIV_1X1         0x00000000
-#define HRCWL_CE_PLL_DIV_2X1         0x00000020
-
-#define HRCWL_CE_TO_PLL_1X16_        0x00000000
-#define HRCWL_CE_TO_PLL_1X2          0x00000002
-#define HRCWL_CE_TO_PLL_1X3          0x00000003
-#define HRCWL_CE_TO_PLL_1X4          0x00000004
-#define HRCWL_CE_TO_PLL_1X5          0x00000005
-#define HRCWL_CE_TO_PLL_1X6          0x00000006
-#define HRCWL_CE_TO_PLL_1X7          0x00000007
-#define HRCWL_CE_TO_PLL_1X8          0x00000008
-#define HRCWL_CE_TO_PLL_1X9          0x00000009
-#define HRCWL_CE_TO_PLL_1X10         0x0000000A
-#define HRCWL_CE_TO_PLL_1X11         0x0000000B
-#define HRCWL_CE_TO_PLL_1X12         0x0000000C
-#define HRCWL_CE_TO_PLL_1X13         0x0000000D
-#define HRCWL_CE_TO_PLL_1X14         0x0000000E
-#define HRCWL_CE_TO_PLL_1X15         0x0000000F
-#define HRCWL_CE_TO_PLL_1X16         0x00000010
-#define HRCWL_CE_TO_PLL_1X17         0x00000011
-#define HRCWL_CE_TO_PLL_1X18         0x00000012
-#define HRCWL_CE_TO_PLL_1X19         0x00000013
-#define HRCWL_CE_TO_PLL_1X20         0x00000014
-#define HRCWL_CE_TO_PLL_1X21         0x00000015
-#define HRCWL_CE_TO_PLL_1X22         0x00000016
-#define HRCWL_CE_TO_PLL_1X23         0x00000017
-#define HRCWL_CE_TO_PLL_1X24         0x00000018
-#define HRCWL_CE_TO_PLL_1X25         0x00000019
-#define HRCWL_CE_TO_PLL_1X26         0x0000001A
-#define HRCWL_CE_TO_PLL_1X27         0x0000001B
-#define HRCWL_CE_TO_PLL_1X28         0x0000001C
-#define HRCWL_CE_TO_PLL_1X29         0x0000001D
-#define HRCWL_CE_TO_PLL_1X30         0x0000001E
-#define HRCWL_CE_TO_PLL_1X31         0x0000001F
-#endif
+/* POCMR - PCI Outbound Comparision Mask Register
+ */
+#define POCMR_EN                       0x80000000
+#define POCMR_IO                       0x40000000      /* 0-memory space 1-I/O space */
+#define POCMR_SE                       0x20000000      /* streaming enable */
+#define POCMR_DST                      0x10000000      /* 0-PCI1 1-PCI2 */
+#define POCMR_CM_MASK                  0x000fffff
+#define POCMR_CM_4G                    0x00000000
+#define POCMR_CM_2G                    0x00080000
+#define POCMR_CM_1G                    0x000C0000
+#define POCMR_CM_512M                  0x000E0000
+#define POCMR_CM_256M                  0x000F0000
+#define POCMR_CM_128M                  0x000F8000
+#define POCMR_CM_64M                   0x000FC000
+#define POCMR_CM_32M                   0x000FE000
+#define POCMR_CM_16M                   0x000FF000
+#define POCMR_CM_8M                    0x000FF800
+#define POCMR_CM_4M                    0x000FFC00
+#define POCMR_CM_2M                    0x000FFE00
+#define POCMR_CM_1M                    0x000FFF00
+#define POCMR_CM_512K                  0x000FFF80
+#define POCMR_CM_256K                  0x000FFFC0
+#define POCMR_CM_128K                  0x000FFFE0
+#define POCMR_CM_64K                   0x000FFFF0
+#define POCMR_CM_32K                   0x000FFFF8
+#define POCMR_CM_16K                   0x000FFFFC
+#define POCMR_CM_8K                    0x000FFFFE
+#define POCMR_CM_4K                    0x000FFFFF
+
+/* PITAR - PCI Inbound Translation Address Register
+ */
+#define PITAR_TA_MASK                  0x000fffff
 
-/*
- * LCRR - Clock Ratio Register (10.3.1.16)
- */
-#define LCRR_DBYP      0x80000000
-#define LCRR_DBYP_SHIFT        31
-#define LCRR_BUFCMDC   0x30000000
-#define LCRR_BUFCMDC_1 0x10000000
-#define LCRR_BUFCMDC_2 0x20000000
-#define LCRR_BUFCMDC_3 0x30000000
-#define LCRR_BUFCMDC_4 0x00000000
-#define LCRR_BUFCMDC_SHIFT     28
-#define LCRR_ECL       0x03000000
-#define LCRR_ECL_4     0x00000000
-#define LCRR_ECL_5     0x01000000
-#define LCRR_ECL_6     0x02000000
-#define LCRR_ECL_7     0x03000000
-#define LCRR_ECL_SHIFT         24
-#define LCRR_EADC      0x00030000
-#define LCRR_EADC_1    0x00010000
-#define LCRR_EADC_2    0x00020000
-#define LCRR_EADC_3    0x00030000
-#define LCRR_EADC_4    0x00000000
-#define LCRR_EADC_SHIFT        16
-#define LCRR_CLKDIV    0x0000000F
-#define LCRR_CLKDIV_2  0x00000002
-#define LCRR_CLKDIV_4  0x00000004
-#define LCRR_CLKDIV_8  0x00000008
-#define LCRR_CLKDIV_SHIFT       0
+/* PIBAR - PCI Inbound Base/Extended Address Register
+ */
+#define PIBAR_MASK                     0xffffffff
+#define PIEBAR_EBA_MASK                        0x000fffff
 
-/*
- * SCCR-System Clock Control Register
- */
-#define SCCR_TSEC1CM_0 0x00000000
-#define SCCR_TSEC1CM_1 0x40000000
-#define SCCR_TSEC1CM_2 0x80000000
-#define SCCR_TSEC1CM_3 0xC0000000
-#define SCCR_TSEC2CM_0 0x00000000
-#define SCCR_TSEC2CM_1 0x10000000
-#define SCCR_TSEC2CM_2 0x20000000
-#define SCCR_TSEC2CM_3 0x30000000
-#define SCCR_ENCCM_0   0x00000000
-#define SCCR_ENCCM_1   0x01000000
-#define SCCR_ENCCM_2   0x02000000
-#define SCCR_ENCCM_3   0x03000000
-#define SCCR_USBCM_0   0x00000000
-#define SCCR_USBCM_1   0x00500000
-#define SCCR_USBCM_2   0x00A00000
-#define SCCR_USBCM_3   0x00F00000
-
-#define SCCR_CLK_MASK  ( SCCR_TSEC1CM_3        \
-                       | SCCR_TSEC2CM_3        \
-                       | SCCR_ENCCM_3          \
-                       | SCCR_USBCM_3          )
-
-#define SCCR_DEFAULT   0xFFFFFFFF
+/* PIWAR - PCI Inbound Windows Attributes Register
+ */
+#define PIWAR_EN                       0x80000000
+#define PIWAR_PF                       0x20000000
+#define PIWAR_RTT_MASK                 0x000f0000
+#define PIWAR_RTT_NO_SNOOP             0x00040000
+#define PIWAR_RTT_SNOOP                        0x00050000
+#define PIWAR_WTT_MASK                 0x0000f000
+#define PIWAR_WTT_NO_SNOOP             0x00004000
+#define PIWAR_WTT_SNOOP                        0x00005000
+#define PIWAR_IWS_MASK                 0x0000003F
+#define PIWAR_IWS_4K                   0x0000000B
+#define PIWAR_IWS_8K                   0x0000000C
+#define PIWAR_IWS_16K                  0x0000000D
+#define PIWAR_IWS_32K                  0x0000000E
+#define PIWAR_IWS_64K                  0x0000000F
+#define PIWAR_IWS_128K                 0x00000010
+#define PIWAR_IWS_256K                 0x00000011
+#define PIWAR_IWS_512K                 0x00000012
+#define PIWAR_IWS_1M                   0x00000013
+#define PIWAR_IWS_2M                   0x00000014
+#define PIWAR_IWS_4M                   0x00000015
+#define PIWAR_IWS_8M                   0x00000016
+#define PIWAR_IWS_16M                  0x00000017
+#define PIWAR_IWS_32M                  0x00000018
+#define PIWAR_IWS_64M                  0x00000019
+#define PIWAR_IWS_128M                 0x0000001A
+#define PIWAR_IWS_256M                 0x0000001B
+#define PIWAR_IWS_512M                 0x0000001C
+#define PIWAR_IWS_1G                   0x0000001D
+#define PIWAR_IWS_2G                   0x0000001E
 
 #endif /* __MPC83XX_H__ */
index 318aa3cb3ff3348f5724ba14344156c0a5bd702c..29c03205f2dc2950f98aa03252eb3a86e348b0f7 100644 (file)
@@ -22,6 +22,7 @@
  */
 #ifndef _PART_H
 #define _PART_H
+
 #include <ide.h>
 
 typedef struct block_dev_desc {
@@ -43,7 +44,11 @@ typedef struct block_dev_desc {
        unsigned long   (*block_read)(int dev,
                                      unsigned long start,
                                      lbaint_t blkcnt,
-                                     unsigned long *buffer);
+                                     void *buffer);
+       unsigned long   (*block_write)(int dev,
+                                      unsigned long start,
+                                      lbaint_t blkcnt,
+                                      const void *buffer);
 }block_dev_desc_t;
 
 /* Interface types: */
@@ -83,6 +88,14 @@ typedef struct disk_partition {
        uchar   type[32];       /* string type description              */
 } disk_partition_t;
 
+/* Misc _get_dev functions */
+block_dev_desc_t* get_dev(char* ifname, int dev);
+block_dev_desc_t* ide_get_dev(int dev);
+block_dev_desc_t* scsi_get_dev(int dev);
+block_dev_desc_t* usb_stor_get_dev(int dev);
+block_dev_desc_t* mmc_get_dev(int dev);
+block_dev_desc_t* systemace_get_dev(int dev);
+
 /* disk/part.c */
 int get_partition_info (block_dev_desc_t * dev_desc, int part, disk_partition_t *info);
 void print_part (block_dev_desc_t *dev_desc);
index e475fa54cdf27751bb90bf745661c9aa1aea7ad6..a49912cabb969055337f6e0c3ea86f16e2d64cee 100644 (file)
   #define pbesr0      0x21    /* periph bus error status reg 0       */
   #define pbesr1      0x22    /* periph bus error status reg 1       */
   #define epcr        0x23    /* external periph control reg         */
+#define EBC0_CFG       0x23    /* external bus configuration reg       */
 
 #ifdef CONFIG_405EP
 /******************************************************************************
index 91cff414af6539ecf971b292242f34ab7fec2019..9b15c2c5653d7d031ba4d55708e7980bdb1fc4cf 100644 (file)
 #define SDR0_PEGPLLSET1                0x000003A0      /* PE Pll LC Tank Setting1 */
 #define SDR0_PEGPLLSET2                0x000003A1      /* PE Pll LC Tank Setting2 */
 #define SDR0_PEGPLLSTS         0x000003A2      /* PE Pll LC Tank Status */
+#endif /* CONFIG_440SPE */
 
+#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
 /*----------------------------------------------------------------------------+
 | SDRAM Controller
 +----------------------------------------------------------------------------*/
 /*-----------------------------------------------------------------------------+
 |  Memory Bank 0-7 configuration
 +-----------------------------------------------------------------------------*/
-#define SDRAM_RXBAS_SDBA_MASK          0xFF800000      /* Base address */
+#if defined(CONFIG_440SPE)
+#define SDRAM_RXBAS_SDBA_MASK          0xFFE00000      /* Base address */
 #define SDRAM_RXBAS_SDBA_ENCODE(n)     ((((unsigned long)(n))&0xFFE00000)>>2)
 #define SDRAM_RXBAS_SDBA_DECODE(n)     ((((unsigned long)(n))&0xFFE00000)<<2)
+#endif /* CONFIG_440SPE */
+#if defined(CONFIG_440SP)
+#define SDRAM_RXBAS_SDBA_MASK          0xFF800000      /* Base address */
+#define SDRAM_RXBAS_SDBA_ENCODE(n)     ((((unsigned long)(n))&0xFF800000))
+#define SDRAM_RXBAS_SDBA_DECODE(n)     ((((unsigned long)(n))&0xFF800000))
+#endif /* CONFIG_440SP */
 #define SDRAM_RXBAS_SDSZ_MASK          0x0000FFC0      /* Size         */
 #define SDRAM_RXBAS_SDSZ_ENCODE(n)     ((((unsigned long)(n))&0x3FF)<<6)
 #define SDRAM_RXBAS_SDSZ_DECODE(n)     ((((unsigned long)(n))>>6)&0x3FF)
 #define SDRAM_MCSTAT_MIC_MASK          0x80000000      /* Memory init status mask      */
 #define SDRAM_MCSTAT_MIC_NOTCOMP       0x00000000      /* Mem init not complete        */
 #define SDRAM_MCSTAT_MIC_COMP          0x80000000      /* Mem init complete            */
-#define SDRAM_MCSTAT_SRMS_MASK         0x80000000      /* Mem self refresh stat mask   */
+#define SDRAM_MCSTAT_SRMS_MASK         0x40000000      /* Mem self refresh stat mask   */
 #define SDRAM_MCSTAT_SRMS_NOT_SF       0x00000000      /* Mem not in self refresh      */
-#define SDRAM_MCSTAT_SRMS_SF           0x80000000      /* Mem in self refresh          */
+#define SDRAM_MCSTAT_SRMS_SF           0x40000000      /* Mem in self refresh          */
+#define SDRAM_MCSTAT_IDLE_MASK         0x20000000      /* Mem self refresh stat mask   */
+#define SDRAM_MCSTAT_IDLE_NOT          0x00000000      /* Mem contr not idle           */
+#define SDRAM_MCSTAT_IDLE              0x20000000      /* Mem contr idle               */
 
 /*-----------------------------------------------------------------------------+
 |  Memory Controller Options 1
 #define SDRAM_WRDTR_LLWP_1_CYC         0x00000000
 #define SDRAM_WRDTR_WTR_MASK           0x0E000000
 #define SDRAM_WRDTR_WTR_0_DEG          0x06000000
+#define SDRAM_WRDTR_WTR_90_DEG_ADV     0x04000000
 #define SDRAM_WRDTR_WTR_180_DEG_ADV    0x02000000
 #define SDRAM_WRDTR_WTR_270_DEG_ADV    0x00000000
 
 #define pbear          0x20    /* periph bus error addr reg            */
 #define pbesr          0x21    /* periph bus error status reg          */
 #define xbcfg          0x23    /* external bus configuration reg       */
+#define EBC0_CFG       0x23    /* external bus configuration reg       */
 #define xbcid          0x24    /* external bus core id reg             */
 
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
 /*-----------------------------------------------------------------------------+
 |  SDR0 Bit Settings
 +-----------------------------------------------------------------------------*/
+#if defined(CONFIG_440SP)
+#define SDR0_SRST                      0x0200
+
+#define SDR0_DDR0                      0x00E1
+#define SDR0_DDR0_DPLLRST              0x80000000
+#define SDR0_DDR0_DDRM_MASK            0x60000000
+#define SDR0_DDR0_DDRM_DDR1            0x20000000
+#define SDR0_DDR0_DDRM_DDR2            0x40000000
+#define SDR0_DDR0_DDRM_ENCODE(n)       ((((unsigned long)(n))&0x03)<<29)
+#define SDR0_DDR0_DDRM_DECODE(n)       ((((unsigned long)(n))>>29)&0x03)
+#define SDR0_DDR0_TUNE_ENCODE(n)       ((((unsigned long)(n))&0x2FF)<<0)
+#define SDR0_DDR0_TUNE_DECODE(n)       ((((unsigned long)(n))>>0)&0x2FF)
+#endif
+
 #if defined(CONFIG_440SPE)
 #define SDR0_CP440                     0x0180
 #define SDR0_CP440_ERPN_MASK           0x30000000
 #define GPIO0                  0
 #define GPIO1                  1
 
-#if defined(CONFIG_440GP) || defined(CONFIG_440GX)
+#if defined(CONFIG_440GP) || defined(CONFIG_440GX) || \
+    defined(CONFIG_440SP) || defined(CONFIG_440SPE)
 #define GPIO0_BASE             (CFG_PERIPHERAL_BASE+0x00000700)
 
 #define GPIO0_OR               (GPIO0_BASE+0x0)
 #define GPIO_IN_SEL        0x40000000      /* GPIO_IN value put in GPIO_ISx for the GPIO nb 0 */
                                            /* For the other GPIO number, you must shift */
 
+#define GPIO_VAL(gpio)         (0x80000000 >> (gpio))
+
 #ifndef __ASSEMBLY__
 
 typedef enum gpio_select { GPIO_SEL, GPIO_ALT1, GPIO_ALT2, GPIO_ALT3 } gpio_select_t;
@@ -3280,32 +3311,31 @@ typedef struct { unsigned long  add;    /* gpio core base address */
        gpio_select_t  alt_nb; /* Selected Alternate */
 } gpio_param_s;
 
-
 #endif /* __ASSEMBLY__ */
 
 /*
  * Macros for accessing the indirect EBC registers
  */
-#define mtebc(reg, data)       { mtdcr(ebccfga,reg);mtdcr(ebccfgd,data); }
-#define mfebc(reg, data)       { mtdcr(ebccfga,reg);data = mfdcr(ebccfgd); }
+#define mtebc(reg, data)       do { mtdcr(ebccfga,reg);mtdcr(ebccfgd,data); } while (0)
+#define mfebc(reg, data)       do { mtdcr(ebccfga,reg);data = mfdcr(ebccfgd); } while (0)
 
 /*
  * Macros for accessing the indirect SDRAM controller registers
  */
-#define mtsdram(reg, data)     { mtdcr(memcfga,reg);mtdcr(memcfgd,data); }
-#define mfsdram(reg, data)     { mtdcr(memcfga,reg);data = mfdcr(memcfgd); }
+#define mtsdram(reg, data)     do { mtdcr(memcfga,reg);mtdcr(memcfgd,data); } while (0)
+#define mfsdram(reg, data)     do { mtdcr(memcfga,reg);data = mfdcr(memcfgd); } while (0)
 
 /*
  * Macros for accessing the indirect clocking controller registers
  */
-#define mtclk(reg, data)       { mtdcr(clkcfga,reg);mtdcr(clkcfgd,data); }
-#define mfclk(reg, data)       { mtdcr(clkcfga,reg);data = mfdcr(clkcfgd); }
+#define mtclk(reg, data)       do { mtdcr(clkcfga,reg);mtdcr(clkcfgd,data); } while (0)
+#define mfclk(reg, data)       do { mtdcr(clkcfga,reg);data = mfdcr(clkcfgd); } while (0)
 
 /*
  * Macros for accessing the sdr controller registers
  */
-#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)
 
 
 #ifndef __ASSEMBLY__
index 512e8980d9d70fa4299277a3809784f5c67d657f..5ddd94fd5aca4ea8c1f4fe9f0868b46f8fd7f3e5 100644 (file)
  * MA 02111-1307 USA
  */
 
+#include <config.h>
 #include <common.h>
+#include <linux/ctype.h>
+#include <asm/io.h>
 
 int display_options (void)
 {
@@ -65,3 +68,70 @@ void print_size (ulong size, const char *s)
        }
        printf (" %cB%s", c, s);
 }
+
+/*
+ * Print data buffer in hex and ascii form to the terminal.
+ *
+ * data reads are buffered so that each memory address is only read once.
+ * Useful when displaying the contents of volatile registers.
+ *
+ * parameters:
+ *    addr: Starting address to display at start of line
+ *    data: pointer to data buffer
+ *    width: data value width.  May be 1, 2, or 4.
+ *    count: number of values to display
+ *    linelen: Number of values to print per line; specify 0 for default length
+ */
+#define MAX_LINE_LENGTH_BYTES (64)
+#define DEFAULT_LINE_LENGTH_BYTES (16)
+int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
+{
+       uint8_t linebuf[MAX_LINE_LENGTH_BYTES];
+       uint32_t *uip = (void*)linebuf;
+       uint16_t *usp = (void*)linebuf;
+       uint8_t *ucp = (void*)linebuf;
+       int i;
+
+       if (linelen*width > MAX_LINE_LENGTH_BYTES)
+               linelen = MAX_LINE_LENGTH_BYTES / width;
+       if (linelen < 1)
+               linelen = DEFAULT_LINE_LENGTH_BYTES / width;
+
+       while (count) {
+               printf("%08lx:", addr);
+
+               /* check for overflow condition */
+               if (count < linelen)
+                       linelen = count;
+
+               /* Copy from memory into linebuf and print hex values */
+               for (i = 0; i < linelen; i++) {
+                       if (width == 4) {
+                               uip[i] = *(volatile uint32_t *)data;
+                               printf(" %08x", uip[i]);
+                       } else if (width == 2) {
+                               usp[i] = *(volatile uint16_t *)data;
+                               printf(" %04x", usp[i]);
+                       } else {
+                               ucp[i] = *(volatile uint8_t *)data;
+                               printf(" %02x", ucp[i]);
+                       }
+                       data += width;
+               }
+
+               /* Print data in ASCII characters */
+               puts("    ");
+               for (i = 0; i < linelen * width; i++)
+                       putc(isprint(ucp[i]) && (ucp[i] < 0x80) ? ucp[i] : '.');
+               putc ('\n');
+
+               /* update references */
+               addr += linelen * width;
+               count -= linelen;
+
+               if (ctrlc())
+                       return -1;
+       }
+
+       return 0;
+}
index b42da8cf682d96e5bb54712a47458d7f183fb3e9..510999db03ac85f7ab58788f7c1fcfc39f1f3541 100644 (file)
@@ -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 ndfc.o sdram.o speed.o
 
 SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
@@ -69,6 +69,10 @@ $(obj)start.S:
        @rm -f $(obj)start.S
        ln -s $(SRCTREE)/cpu/ppc4xx/start.S $(obj)start.S
 
+$(obj)speed.c:
+       @rm -f $(obj)speed.c
+       ln -s $(SRCTREE)/cpu/ppc4xx/speed.c $(obj)speed.c
+
 # from board directory
 $(obj)init.S:
        @rm -f $(obj)init.S
index 228bafc6a77e0c115ce91c8a60805378e55a9054..f32af951624ceb56ecbc9061771e12bc10ef7ddd 100644 (file)
 #
 
 
-SUBDIRS = cpu
+SUBDIRS = drivers cpu lib_$(ARCH) board/$(BOARDDIR)
 
 LIB    = libpost.a
 
-AOBJS  = cache_8xx.o
-COBJS  = cache.o codec.o cpu.o dsp.o ether.o
-COBJS  += i2c.o memory.o post.o rtc.o
-COBJS  += spr.o sysmon.o tests.o uart.o
-COBJS  += usb.o watchdog.o
+COBJS  = post.o tests.o
 
 include $(TOPDIR)/post/rules.mk
diff --git a/post/board/lwmon/Makefile b/post/board/lwmon/Makefile
new file mode 100644 (file)
index 0000000..899b0dc
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2002-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
+#
+
+
+LIB    = libpostlwmon.a
+
+COBJS  = sysmon.o
+
+include $(TOPDIR)/post/rules.mk
diff --git a/post/board/lwmon/sysmon.c b/post/board/lwmon/sysmon.c
new file mode 100644 (file)
index 0000000..f61d598
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * (C) Copyright 2003
+ * 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 <post.h>
+#include <common.h>
+
+#ifdef CONFIG_POST
+
+/*
+ * SYSMON test
+ *
+ * This test performs the system hardware monitoring.
+ * The test passes when all the following voltages and temperatures
+ * are within allowed ranges:
+ *
+ * Board temperature
+ * Front temperature
+ * +3.3V CPU logic
+ * +5V logic
+ * +12V PCMCIA
+ * +12V CCFL
+ * +5V standby
+ *
+ * CCFL is not enabled if temperature values are not within allowed ranges
+ *
+ * See the list off all parameters in the sysmon_table below
+ */
+
+#include <post.h>
+#include <watchdog.h>
+#include <i2c.h>
+
+#if CONFIG_POST & CFG_POST_SYSMON
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int sysmon_temp_invalid = 0;
+
+/* #define DEBUG */
+
+#define        RELOC(x) if (x != NULL) x = (void *) ((ulong) (x) + gd->reloc_off)
+
+typedef struct sysmon_s sysmon_t;
+typedef struct sysmon_table_s sysmon_table_t;
+
+static void sysmon_lm87_init (sysmon_t * this);
+static void sysmon_pic_init (sysmon_t * this);
+static uint sysmon_i2c_read (sysmon_t * this, uint addr);
+static uint sysmon_i2c_read_sgn (sysmon_t * this, uint addr);
+static void sysmon_ccfl_disable (sysmon_table_t * this);
+static void sysmon_ccfl_enable (sysmon_table_t * this);
+
+struct sysmon_s
+{
+       uchar   chip;
+       void    (*init)(sysmon_t *);
+       uint    (*read)(sysmon_t *, uint);
+};
+
+static sysmon_t sysmon_lm87 =
+       {CFG_I2C_SYSMON_ADDR, sysmon_lm87_init, sysmon_i2c_read};
+static sysmon_t sysmon_lm87_sgn =
+       {CFG_I2C_SYSMON_ADDR, sysmon_lm87_init, sysmon_i2c_read_sgn};
+static sysmon_t sysmon_pic =
+       {CFG_I2C_PICIO_ADDR, sysmon_pic_init, sysmon_i2c_read};
+
+static sysmon_t * sysmon_list[] =
+{
+       &sysmon_lm87,
+       &sysmon_lm87_sgn,
+       &sysmon_pic,
+       NULL
+};
+
+struct sysmon_table_s
+{
+       char *          name;
+       char *          unit_name;
+       sysmon_t *      sysmon;
+       void            (*exec_before)(sysmon_table_t *);
+       void            (*exec_after)(sysmon_table_t *);
+
+       int             unit_precision;
+       int             unit_div;
+       int             unit_min;
+       int             unit_max;
+       uint            val_mask;
+       uint            val_min;
+       uint            val_max;
+       int             val_valid;
+       uint            val_min_alt;
+       uint            val_max_alt;
+       int             val_valid_alt;
+       uint            addr;
+};
+
+static sysmon_table_t sysmon_table[] =
+{
+    {"Board temperature", " C", &sysmon_lm87_sgn, NULL, sysmon_ccfl_disable,
+     1, 1, -128, 127, 0xFF, 0x58, 0xD5, 0, 0x6C, 0xC6, 0, 0x27},
+
+    {"Front temperature", " C", &sysmon_lm87, NULL, sysmon_ccfl_disable,
+     1, 100, -27316, 8984, 0xFF, 0xA4, 0xFC, 0, 0xB2, 0xF1, 0, 0x29},
+
+    {"+3.3V CPU logic", "V", &sysmon_lm87, NULL, NULL,
+     100, 1000, 0, 4386, 0xFF, 0xB6, 0xC9, 0, 0xB6, 0xC9, 0, 0x22},
+
+    {"+ 5 V logic", "V", &sysmon_lm87, NULL, NULL,
+     100, 1000, 0, 6630, 0xFF, 0xB6, 0xCA, 0, 0xB6, 0xCA, 0, 0x23},
+
+    {"+12 V PCMCIA", "V", &sysmon_lm87, NULL, NULL,
+     100, 1000, 0, 15460, 0xFF, 0xBC, 0xD0, 0, 0xBC, 0xD0, 0, 0x21},
+
+    {"+12 V CCFL", "V", &sysmon_lm87, NULL, sysmon_ccfl_enable,
+     100, 1000, 0, 15900, 0xFF, 0xB6, 0xCA, 0, 0xB6, 0xCA, 0, 0x24},
+
+    {"+ 5 V standby", "V", &sysmon_pic, NULL, NULL,
+     100, 1000, 0, 6040, 0xFF, 0xC8, 0xDE, 0, 0xC8, 0xDE, 0, 0x7C},
+};
+static int sysmon_table_size = sizeof(sysmon_table) / sizeof(sysmon_table[0]);
+
+static int conversion_done = 0;
+
+
+int sysmon_init_f (void)
+{
+       sysmon_t ** l;
+       ulong reg;
+
+       /* Power on CCFL, PCMCIA */
+       reg = pic_read  (0x60);
+       reg |= 0x09;
+       pic_write (0x60, reg);
+
+       for (l = sysmon_list; *l; l++) {
+               (*l)->init(*l);
+       }
+
+       return 0;
+}
+
+void sysmon_reloc (void)
+{
+       sysmon_t ** l;
+       sysmon_table_t * t;
+
+       for (l = sysmon_list; *l; l++) {
+               RELOC(*l);
+               RELOC((*l)->init);
+               RELOC((*l)->read);
+       }
+
+       for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) {
+               RELOC(t->exec_before);
+               RELOC(t->exec_after);
+               RELOC(t->sysmon);
+       }
+}
+
+static char *sysmon_unit_value (sysmon_table_t *s, uint val)
+{
+       static char buf[32];
+       int unit_val =
+           s->unit_min + (s->unit_max - s->unit_min) * val / s->val_mask;
+       char *p, sign;
+       int dec, frac;
+
+       if (val == -1) {
+               return "I/O ERROR";
+       }
+
+       if (unit_val < 0) {
+               sign = '-';
+               unit_val = -unit_val;
+       } else {
+               sign = '+';
+       }
+
+       p = buf + sprintf(buf, "%c%2d", sign, unit_val / s->unit_div);
+
+
+       frac = unit_val % s->unit_div;
+
+       frac /= (s->unit_div / s->unit_precision);
+
+       dec = s->unit_precision;
+
+       if (dec != 1) {
+               *p++ = '.';
+       }
+       for (dec /= 10; dec != 0; dec /= 10) {
+               *p++ = '0' + (frac / dec) % 10;
+       }
+       strcpy(p, s->unit_name);
+
+       return buf;
+}
+
+static void sysmon_lm87_init (sysmon_t * this)
+{
+       uchar val;
+
+       /* Detect LM87 chip */
+       if (i2c_read(this->chip, 0x40, 1, &val, 1) || (val & 0x80) != 0 ||
+           i2c_read(this->chip, 0x3E, 1, &val, 1) || val != 0x02) {
+               printf("Error: LM87 not found at 0x%02X\n", this->chip);
+               return;
+       }
+
+       /* Configure pins 5,6 as AIN */
+       val = 0x03;
+       if (i2c_write(this->chip, 0x16, 1, &val, 1)) {
+               printf("Error: can't write LM87 config register\n");
+               return;
+       }
+
+       /* Start monitoring */
+       val = 0x01;
+       if (i2c_write(this->chip, 0x40, 1, &val, 1)) {
+               printf("Error: can't write LM87 config register\n");
+               return;
+       }
+}
+
+static void sysmon_pic_init (sysmon_t * this)
+{
+}
+
+static uint sysmon_i2c_read (sysmon_t * this, uint addr)
+{
+       uchar val;
+       uint res = i2c_read(this->chip, addr, 1, &val, 1);
+
+       return res == 0 ? val : -1;
+}
+
+static uint sysmon_i2c_read_sgn (sysmon_t * this, uint addr)
+{
+       uchar val;
+       return i2c_read(this->chip, addr, 1, &val, 1) == 0 ?
+               128 + (signed char)val : -1;
+}
+
+static void sysmon_ccfl_disable (sysmon_table_t * this)
+{
+       if (!this->val_valid_alt) {
+               sysmon_temp_invalid = 1;
+       }
+}
+
+static void sysmon_ccfl_enable (sysmon_table_t * this)
+{
+       ulong reg;
+
+       if (!sysmon_temp_invalid) {
+               reg = pic_read  (0x60);
+               reg |= 0x06;
+               pic_write (0x60, reg);
+       }
+}
+
+int sysmon_post_test (int flags)
+{
+       int res = 0;
+       sysmon_table_t * t;
+       uint val;
+
+       /*
+        * The A/D conversion on the LM87 sensor takes 300 ms.
+        */
+       if (! conversion_done) {
+               while (post_time_ms(gd->post_init_f_time) < 300) WATCHDOG_RESET ();
+               conversion_done = 1;
+       }
+
+       for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) {
+               if (t->exec_before) {
+                       t->exec_before(t);
+               }
+
+               val = t->sysmon->read(t->sysmon, t->addr);
+               if (val != -1) {
+                       t->val_valid = val >= t->val_min && val <= t->val_max;
+                       t->val_valid_alt = val >= t->val_min_alt && val <= t->val_max_alt;
+               } else {
+                       t->val_valid = 0;
+                       t->val_valid_alt = 0;
+               }
+
+               if (t->exec_after) {
+                       t->exec_after(t);
+               }
+
+               if ((!t->val_valid) || (flags & POST_MANUAL)) {
+                       printf("%-17s = %-10s ", t->name, sysmon_unit_value(t, val));
+                       printf("allowed range");
+                       printf(" %-8s ..", sysmon_unit_value(t, t->val_min));
+                       printf(" %-8s", sysmon_unit_value(t, t->val_max));
+                       printf("     %s\n", t->val_valid ? "OK" : "FAIL");
+               }
+
+               if (!t->val_valid) {
+                       res = -1;
+               }
+       }
+
+       return res;
+}
+
+#endif /* CONFIG_POST & CFG_POST_SYSMON */
+#endif /* CONFIG_POST */
diff --git a/post/board/netta/Makefile b/post/board/netta/Makefile
new file mode 100644 (file)
index 0000000..60c7790
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2002-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
+#
+
+
+LIB    = libpostnetta.a
+
+COBJS  = codec.o dsp.o
+
+include $(TOPDIR)/post/rules.mk
diff --git a/post/board/netta/codec.c b/post/board/netta/codec.c
new file mode 100644 (file)
index 0000000..e881752
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * (C) Copyright 2004
+ * Pantelis Antoniou, Intracom S.A. , panto@intracom.gr
+ *
+ * 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>
+
+/*
+ * CODEC test
+ *
+ * This test verifies the connection and performs a memory test
+ * on any connected codec(s). The meat of the work is done
+ * in the board specific function.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+
+#if CONFIG_POST & CFG_POST_CODEC
+
+extern int board_post_codec(int flags);
+
+int codec_post_test (int flags)
+{
+       return board_post_codec(flags);
+}
+
+#endif /* CONFIG_POST & CFG_POST_CODEC */
+#endif /* CONFIG_POST */
diff --git a/post/board/netta/dsp.c b/post/board/netta/dsp.c
new file mode 100644 (file)
index 0000000..63531a2
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * (C) Copyright 2004
+ * Pantelis Antoniou, Intracom S.A. , panto@intracom.gr
+ *
+ * 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>
+
+/*
+ * DSP test
+ *
+ * This test verifies the connection and performs a memory test
+ * on any connected DSP(s). The meat of the work is done
+ * in the board specific function.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+
+#if CONFIG_POST & CFG_POST_DSP
+
+extern int board_post_dsp(int flags);
+
+int dsp_post_test (int flags)
+{
+       return board_post_dsp(flags);
+}
+
+#endif /* CONFIG_POST & CFG_POST_DSP */
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/Makefile b/post/cpu/mpc8xx/Makefile
new file mode 100644 (file)
index 0000000..9dd3f0f
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2002-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
+#
+
+LIB    = libpostmpc8xx.a
+
+AOBJS  = cache_8xx.o
+COBJS  = ether.o spr.o uart.o usb.o watchdog.o
+
+include $(TOPDIR)/post/rules.mk
diff --git a/post/cpu/mpc8xx/cache_8xx.S b/post/cpu/mpc8xx/cache_8xx.S
new file mode 100644 (file)
index 0000000..2d41b55
--- /dev/null
@@ -0,0 +1,495 @@
+/*
+ *  Copyright (C) 2002 Wolfgang Denk <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 <config.h>
+
+#ifdef CONFIG_POST
+#if defined(CONFIG_MPC823) || \
+    defined(CONFIG_MPC850) || \
+    defined(CONFIG_MPC855) || \
+    defined(CONFIG_MPC860) || \
+    defined(CONFIG_MPC862)
+
+#include <post.h>
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+
+#if CONFIG_POST & CFG_POST_CACHE
+
+       .text
+
+cache_post_dinvalidate:
+       lis     r10, IDC_INVALL@h
+       mtspr   DC_CST, r10
+       blr
+
+cache_post_iinvalidate:
+       lis     r10, IDC_INVALL@h
+       mtspr   IC_CST, r10
+       isync
+       blr
+
+cache_post_ddisable:
+       lis     r10, IDC_DISABLE@h
+       mtspr   DC_CST, r10
+       blr
+
+cache_post_dwb:
+       lis     r10, IDC_ENABLE@h
+       mtspr   DC_CST, r10
+       lis     r10, DC_CFWT@h
+       mtspr   DC_CST, r10
+       blr
+
+cache_post_dwt:
+       lis     r10, IDC_ENABLE@h
+       mtspr   DC_CST, r10
+       lis     r10, DC_SFWT@h
+       mtspr   DC_CST, r10
+       blr
+
+cache_post_idisable:
+       lis     r10, IDC_DISABLE@h
+       mtspr   IC_CST, r10
+       isync
+       blr
+
+cache_post_ienable:
+       lis     r10, IDC_ENABLE@h
+       mtspr   IC_CST, r10
+       isync
+       blr
+
+cache_post_iunlock:
+       lis     r10, IDC_UNALL@h
+       mtspr   IC_CST, r10
+       isync
+       blr
+
+cache_post_ilock:
+       mtspr   IC_ADR, r3
+       lis     r10, IDC_LDLCK@h
+       mtspr   IC_CST, r10
+       isync
+       blr
+
+/*
+ * turn on the data cache
+ * switch the data cache to write-back or write-through mode
+ * invalidate the data cache
+ * write the negative pattern to a cached area
+ * read the area
+ *
+ * The negative pattern must be read at the last step
+ */
+       .global cache_post_test1
+cache_post_test1:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       stwu    r3, -4(r1)
+       stwu    r4, -4(r1)
+
+       bl      cache_post_dwb
+       bl      cache_post_dinvalidate
+
+       /* Write the negative pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0xff
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       /* Read the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       lwz     r4, 4(r1)
+       subi    r4, r4, 1
+       li      r3, 0
+1:
+       lbzu    r0, 1(r4)
+       cmpli   cr0, r0, 0xff
+       beq     2f
+       li      r3, -1
+       b       3f
+2:
+       bdnz    1b
+3:
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       addi    r1, r1, 8
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+/*
+ * turn on the data cache
+ * switch the data cache to write-back or write-through mode
+ * invalidate the data cache
+ * write the zero pattern to a cached area
+ * turn off the data cache
+ * write the negative pattern to the area
+ * turn on the data cache
+ * read the area
+ *
+ * The negative pattern must be read at the last step
+ */
+       .global cache_post_test2
+cache_post_test2:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       stwu    r3, -4(r1)
+       stwu    r4, -4(r1)
+
+       bl      cache_post_dwb
+       bl      cache_post_dinvalidate
+
+       /* Write the zero pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_ddisable
+
+       /* Write the negative pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0xff
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_dwb
+
+       /* Read the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       lwz     r4, 4(r1)
+       subi    r4, r4, 1
+       li      r3, 0
+1:
+       lbzu    r0, 1(r4)
+       cmpli   cr0, r0, 0xff
+       beq     2f
+       li      r3, -1
+       b       3f
+2:
+       bdnz    1b
+3:
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       addi    r1, r1, 8
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+/*
+ * turn on the data cache
+ * switch the data cache to write-through mode
+ * invalidate the data cache
+ * write the zero pattern to a cached area
+ * flush the data cache
+ * write the negative pattern to the area
+ * turn off the data cache
+ * read the area
+ *
+ * The negative pattern must be read at the last step
+ */
+       .global cache_post_test3
+cache_post_test3:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       stwu    r3, -4(r1)
+       stwu    r4, -4(r1)
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       /* Write the zero pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_dwt
+       bl      cache_post_dinvalidate
+
+       /* Write the negative pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0xff
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       /* Read the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       lwz     r4, 4(r1)
+       subi    r4, r4, 1
+       li      r3, 0
+1:
+       lbzu    r0, 1(r4)
+       cmpli   cr0, r0, 0xff
+       beq     2f
+       li      r3, -1
+       b       3f
+2:
+       bdnz    1b
+3:
+
+       addi    r1, r1, 8
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+/*
+ * turn on the data cache
+ * switch the data cache to write-back mode
+ * invalidate the data cache
+ * write the negative pattern to a cached area
+ * flush the data cache
+ * write the zero pattern to the area
+ * invalidate the data cache
+ * read the area
+ *
+ * The negative pattern must be read at the last step
+ */
+       .global cache_post_test4
+cache_post_test4:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       stwu    r3, -4(r1)
+       stwu    r4, -4(r1)
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       /* Write the negative pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0xff
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_dwb
+       bl      cache_post_dinvalidate
+
+       /* Write the zero pattern to the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       li      r0, 0
+       lwz     r3, 4(r1)
+       subi    r3, r3, 1
+1:
+       stbu    r0, 1(r3)
+       bdnz    1b
+
+       bl      cache_post_ddisable
+       bl      cache_post_dinvalidate
+
+       /* Read the test area */
+       lwz     r0, 0(r1)
+       mtctr   r0
+       lwz     r4, 4(r1)
+       subi    r4, r4, 1
+       li      r3, 0
+1:
+       lbzu    r0, 1(r4)
+       cmpli   cr0, r0, 0xff
+       beq     2f
+       li      r3, -1
+       b       3f
+2:
+       bdnz    1b
+3:
+
+       addi    r1, r1, 8
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+cache_post_test5_1:
+       li      r3, 0
+cache_post_test5_2:
+       li      r3, -1
+
+/*
+ * turn on the instruction cache
+ * unlock the entire instruction cache
+ * invalidate the instruction cache
+ * lock a branch instruction in the instruction cache
+ * replace the branch instruction with "nop"
+ * jump to the branch instruction
+ * check that the branch instruction was executed
+*/
+       .global cache_post_test5
+cache_post_test5:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       bl      cache_post_ienable
+       bl      cache_post_iunlock
+       bl      cache_post_iinvalidate
+
+       /* Compute r9 = cache_post_test5_reloc */
+       bl      cache_post_test5_reloc
+cache_post_test5_reloc:
+       mflr    r9
+
+       /* Copy the test instruction to cache_post_test5_data */
+       lis     r3, (cache_post_test5_1 - cache_post_test5_reloc)@h
+       ori     r3, r3, (cache_post_test5_1 - cache_post_test5_reloc)@l
+       add     r3, r3, r9
+       lis     r4, (cache_post_test5_data - cache_post_test5_reloc)@h
+       ori     r4, r4, (cache_post_test5_data - cache_post_test5_reloc)@l
+       add     r4, r4, r9
+       lwz     r0, 0(r3)
+       stw     r0, 0(r4)
+
+       bl      cache_post_iinvalidate
+
+       /* Lock the branch instruction */
+       lis     r3, (cache_post_test5_data - cache_post_test5_reloc)@h
+       ori     r3, r3, (cache_post_test5_data - cache_post_test5_reloc)@l
+       add     r3, r3, r9
+       bl      cache_post_ilock
+
+       /* Replace the test instruction */
+       lis     r3, (cache_post_test5_2 - cache_post_test5_reloc)@h
+       ori     r3, r3, (cache_post_test5_2 - cache_post_test5_reloc)@l
+       add     r3, r3, r9
+       lis     r4, (cache_post_test5_data - cache_post_test5_reloc)@h
+       ori     r4, r4, (cache_post_test5_data - cache_post_test5_reloc)@l
+       add     r4, r4, r9
+       lwz     r0, 0(r3)
+       stw     r0, 0(r4)
+
+       bl      cache_post_iinvalidate
+
+       /* Execute to the test instruction */
+cache_post_test5_data:
+       nop
+
+       bl      cache_post_iunlock
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+cache_post_test6_1:
+       li      r3, -1
+cache_post_test6_2:
+       li      r3, 0
+
+/*
+ * turn on the instruction cache
+ * unlock the entire instruction cache
+ * invalidate the instruction cache
+ * lock a branch instruction in the instruction cache
+ * replace the branch instruction with "nop"
+ * jump to the branch instruction
+ * check that the branch instruction was executed
+ */
+       .global cache_post_test6
+cache_post_test6:
+       mflr    r0
+       stw     r0, 4(r1)
+
+       bl      cache_post_ienable
+       bl      cache_post_iunlock
+       bl      cache_post_iinvalidate
+
+       /* Compute r9 = cache_post_test6_reloc */
+       bl      cache_post_test6_reloc
+cache_post_test6_reloc:
+       mflr    r9
+
+       /* Copy the test instruction to cache_post_test6_data */
+       lis     r3, (cache_post_test6_1 - cache_post_test6_reloc)@h
+       ori     r3, r3, (cache_post_test6_1 - cache_post_test6_reloc)@l
+       add     r3, r3, r9
+       lis     r4, (cache_post_test6_data - cache_post_test6_reloc)@h
+       ori     r4, r4, (cache_post_test6_data - cache_post_test6_reloc)@l
+       add     r4, r4, r9
+       lwz     r0, 0(r3)
+       stw     r0, 0(r4)
+
+       bl      cache_post_iinvalidate
+
+       /* Replace the test instruction */
+       lis     r3, (cache_post_test6_2 - cache_post_test6_reloc)@h
+       ori     r3, r3, (cache_post_test6_2 - cache_post_test6_reloc)@l
+       add     r3, r3, r9
+       lis     r4, (cache_post_test6_data - cache_post_test6_reloc)@h
+       ori     r4, r4, (cache_post_test6_data - cache_post_test6_reloc)@l
+       add     r4, r4, r9
+       lwz     r0, 0(r3)
+       stw     r0, 0(r4)
+
+       bl      cache_post_iinvalidate
+
+       /* Execute to the test instruction */
+cache_post_test6_data:
+       nop
+
+       lwz     r0, 4(r1)
+       mtlr    r0
+       blr
+
+#endif /* CONFIG_MPC823 || MPC850 || MPC855 || MPC860 */
+#endif /* CONFIG_POST & CFG_POST_CACHE */
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/ether.c b/post/cpu/mpc8xx/ether.c
new file mode 100644 (file)
index 0000000..8c87b59
--- /dev/null
@@ -0,0 +1,631 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * Ethernet test
+ *
+ * The Serial Communication Controllers (SCC) listed in ctlr_list array below
+ * are tested in the loopback ethernet mode.
+ * The controllers are configured accordingly and several packets
+ * are transmitted. The configurable test parameters are:
+ *   MIN_PACKET_LENGTH - minimum size of packet to transmit
+ *   MAX_PACKET_LENGTH - maximum size of packet to transmit
+ *   TEST_NUM - number of tests
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#if CONFIG_POST & CFG_POST_ETHER
+#if defined(CONFIG_8xx)
+#include <commproc.h>
+#elif defined(CONFIG_MPC8260)
+#include <asm/cpm_8260.h>
+#else
+#error "Apparently a bad configuration, please fix."
+#endif
+
+#include <command.h>
+#include <net.h>
+#include <serial.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define MIN_PACKET_LENGTH      64
+#define MAX_PACKET_LENGTH      256
+#define TEST_NUM               1
+
+#define CTLR_SCC 0
+
+extern void spi_init_f (void);
+extern void spi_init_r (void);
+
+/* The list of controllers to test */
+#if defined(CONFIG_MPC823)
+static int ctlr_list[][2] = { {CTLR_SCC, 1} };
+#else
+static int ctlr_list[][2] = { };
+#endif
+
+#define CTRL_LIST_SIZE (sizeof(ctlr_list) / sizeof(ctlr_list[0]))
+
+static struct {
+       void (*init) (int index);
+       void (*halt) (int index);
+       int (*send) (int index, volatile void *packet, int length);
+       int (*recv) (int index, void *packet, int length);
+} ctlr_proc[1];
+
+static char *ctlr_name[1] = { "SCC" };
+
+/* Ethernet Transmit and Receive Buffers */
+#define DBUF_LENGTH  1520
+
+#define TX_BUF_CNT 2
+
+#define TOUT_LOOP 100
+
+static char txbuf[DBUF_LENGTH];
+
+static uint rxIdx;             /* index of the current RX buffer */
+static uint txIdx;             /* index of the current TX buffer */
+
+/*
+  * SCC Ethernet Tx and Rx buffer descriptors allocated at the
+  *  immr->udata_bd address on Dual-Port RAM
+  * Provide for Double Buffering
+  */
+
+typedef volatile struct CommonBufferDescriptor {
+       cbd_t rxbd[PKTBUFSRX];          /* Rx BD */
+       cbd_t txbd[TX_BUF_CNT];         /* Tx BD */
+} RTXBD;
+
+static RTXBD *rtx;
+
+  /*
+   * SCC callbacks
+   */
+
+static void scc_init (int scc_index)
+{
+       bd_t *bd = gd->bd;
+
+       static int proff[] =
+                       { PROFF_SCC1, PROFF_SCC2, PROFF_SCC3, PROFF_SCC4 };
+       static unsigned int cpm_cr[] =
+                       { CPM_CR_CH_SCC1, CPM_CR_CH_SCC2, CPM_CR_CH_SCC3,
+CPM_CR_CH_SCC4 };
+
+       int i;
+       scc_enet_t *pram_ptr;
+
+       volatile immap_t *immr = (immap_t *) CFG_IMMR;
+
+       immr->im_cpm.cp_scc[scc_index].scc_gsmrl &=
+                       ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+
+#if defined(CONFIG_FADS)
+#if defined(CONFIG_MPC860T) || defined(CONFIG_MPC86xADS)
+       /* The FADS860T and MPC86xADS don't use the MODEM_EN or DATA_VOICE signals. */
+       *((uint *) BCSR4) &= ~BCSR4_ETHLOOP;
+       *((uint *) BCSR4) |= BCSR4_TFPLDL | BCSR4_TPSQEL;
+       *((uint *) BCSR1) &= ~BCSR1_ETHEN;
+#else
+       *((uint *) BCSR4) &= ~(BCSR4_ETHLOOP | BCSR4_MODEM_EN);
+       *((uint *) BCSR4) |= BCSR4_TFPLDL | BCSR4_TPSQEL | BCSR4_DATA_VOICE;
+       *((uint *) BCSR1) &= ~BCSR1_ETHEN;
+#endif
+#endif
+
+       pram_ptr = (scc_enet_t *) & (immr->im_cpm.cp_dparam[proff[scc_index]]);
+
+       rxIdx = 0;
+       txIdx = 0;
+
+#ifdef CFG_ALLOC_DPRAM
+       rtx = (RTXBD *) (immr->im_cpm.cp_dpmem +
+                                        dpram_alloc_align (sizeof (RTXBD), 8));
+#else
+       rtx = (RTXBD *) (immr->im_cpm.cp_dpmem + CPM_SCC_BASE);
+#endif
+
+#if 0
+
+#if (defined(PA_ENET_RXD) && defined(PA_ENET_TXD))
+       /* Configure port A pins for Txd and Rxd.
+        */
+       immr->im_ioport.iop_papar |= (PA_ENET_RXD | PA_ENET_TXD);
+       immr->im_ioport.iop_padir &= ~(PA_ENET_RXD | PA_ENET_TXD);
+       immr->im_ioport.iop_paodr &= ~PA_ENET_TXD;
+#elif (defined(PB_ENET_RXD) && defined(PB_ENET_TXD))
+       /* Configure port B pins for Txd and Rxd.
+        */
+       immr->im_cpm.cp_pbpar |= (PB_ENET_RXD | PB_ENET_TXD);
+       immr->im_cpm.cp_pbdir &= ~(PB_ENET_RXD | PB_ENET_TXD);
+       immr->im_cpm.cp_pbodr &= ~PB_ENET_TXD;
+#else
+#error Configuration Error: exactly ONE of PA_ENET_[RT]XD, PB_ENET_[RT]XD must be defined
+#endif
+
+#if defined(PC_ENET_LBK)
+       /* Configure port C pins to disable External Loopback
+        */
+       immr->im_ioport.iop_pcpar &= ~PC_ENET_LBK;
+       immr->im_ioport.iop_pcdir |= PC_ENET_LBK;
+       immr->im_ioport.iop_pcso &= ~PC_ENET_LBK;
+       immr->im_ioport.iop_pcdat &= ~PC_ENET_LBK;      /* Disable Loopback */
+#endif /* PC_ENET_LBK */
+
+       /* Configure port C pins to enable CLSN and RENA.
+        */
+       immr->im_ioport.iop_pcpar &= ~(PC_ENET_CLSN | PC_ENET_RENA);
+       immr->im_ioport.iop_pcdir &= ~(PC_ENET_CLSN | PC_ENET_RENA);
+       immr->im_ioport.iop_pcso |= (PC_ENET_CLSN | PC_ENET_RENA);
+
+       /* Configure port A for TCLK and RCLK.
+        */
+       immr->im_ioport.iop_papar |= (PA_ENET_TCLK | PA_ENET_RCLK);
+       immr->im_ioport.iop_padir &= ~(PA_ENET_TCLK | PA_ENET_RCLK);
+
+       /*
+        * Configure Serial Interface clock routing -- see section 16.7.5.3
+        * First, clear all SCC bits to zero, then set the ones we want.
+        */
+
+       immr->im_cpm.cp_sicr &= ~SICR_ENET_MASK;
+       immr->im_cpm.cp_sicr |= SICR_ENET_CLKRT;
+#else
+       /*
+        * SCC2 receive clock is BRG2
+        * SCC2 transmit clock is BRG3
+        */
+       immr->im_cpm.cp_brgc2 = 0x0001000C;
+       immr->im_cpm.cp_brgc3 = 0x0001000C;
+
+       immr->im_cpm.cp_sicr &= ~0x00003F00;
+       immr->im_cpm.cp_sicr |=  0x00000a00;
+#endif /* 0 */
+
+
+       /*
+        * Initialize SDCR -- see section 16.9.23.7
+        * SDMA configuration register
+        */
+       immr->im_siu_conf.sc_sdcr = 0x01;
+
+
+       /*
+        * Setup SCC Ethernet Parameter RAM
+        */
+
+       pram_ptr->sen_genscc.scc_rfcr = 0x18;   /* Normal Operation and Mot byte ordering */
+       pram_ptr->sen_genscc.scc_tfcr = 0x18;   /* Mot byte ordering, Normal access */
+
+       pram_ptr->sen_genscc.scc_mrblr = DBUF_LENGTH;   /* max. ET package len 1520 */
+
+       pram_ptr->sen_genscc.scc_rbase = (unsigned int) (&rtx->rxbd[0]);        /* Set RXBD tbl start at Dual Port */
+       pram_ptr->sen_genscc.scc_tbase = (unsigned int) (&rtx->txbd[0]);        /* Set TXBD tbl start at Dual Port */
+
+       /*
+        * Setup Receiver Buffer Descriptors (13.14.24.18)
+        * Settings:
+        *     Empty, Wrap
+        */
+
+       for (i = 0; i < PKTBUFSRX; i++) {
+               rtx->rxbd[i].cbd_sc = BD_ENET_RX_EMPTY;
+               rtx->rxbd[i].cbd_datlen = 0;    /* Reset */
+               rtx->rxbd[i].cbd_bufaddr = (uint) NetRxPackets[i];
+       }
+
+       rtx->rxbd[PKTBUFSRX - 1].cbd_sc |= BD_ENET_RX_WRAP;
+
+       /*
+        * Setup Ethernet Transmitter Buffer Descriptors (13.14.24.19)
+        * Settings:
+        *    Add PADs to Short FRAMES, Wrap, Last, Tx CRC
+        */
+
+       for (i = 0; i < TX_BUF_CNT; i++) {
+               rtx->txbd[i].cbd_sc =
+                               (BD_ENET_TX_PAD | BD_ENET_TX_LAST | BD_ENET_TX_TC);
+               rtx->txbd[i].cbd_datlen = 0;    /* Reset */
+               rtx->txbd[i].cbd_bufaddr = (uint) (&txbuf[0]);
+       }
+
+       rtx->txbd[TX_BUF_CNT - 1].cbd_sc |= BD_ENET_TX_WRAP;
+
+       /*
+        * Enter Command:  Initialize Rx Params for SCC
+        */
+
+       do {                            /* Spin until ready to issue command    */
+               __asm__ ("eieio");
+       } while (immr->im_cpm.cp_cpcr & CPM_CR_FLG);
+       /* Issue command */
+       immr->im_cpm.cp_cpcr =
+                       ((CPM_CR_INIT_RX << 8) | (cpm_cr[scc_index] << 4) |
+                        CPM_CR_FLG);
+       do {                            /* Spin until command processed     */
+               __asm__ ("eieio");
+       } while (immr->im_cpm.cp_cpcr & CPM_CR_FLG);
+
+       /*
+        * Ethernet Specific Parameter RAM
+        *     see table 13-16, pg. 660,
+        *     pg. 681 (example with suggested settings)
+        */
+
+       pram_ptr->sen_cpres = ~(0x0);   /* Preset CRC */
+       pram_ptr->sen_cmask = 0xdebb20e3;       /* Constant Mask for CRC */
+       pram_ptr->sen_crcec = 0x0;      /* Error Counter CRC (unused) */
+       pram_ptr->sen_alec = 0x0;       /* Alignment Error Counter (unused) */
+       pram_ptr->sen_disfc = 0x0;      /* Discard Frame Counter (unused) */
+       pram_ptr->sen_pads = 0x8888;    /* Short Frame PAD Characters */
+
+       pram_ptr->sen_retlim = 15;      /* Retry Limit Threshold */
+       pram_ptr->sen_maxflr = 1518;    /* MAX Frame Length Register */
+       pram_ptr->sen_minflr = 64;      /* MIN Frame Length Register */
+
+       pram_ptr->sen_maxd1 = DBUF_LENGTH;      /* MAX DMA1 Length Register */
+       pram_ptr->sen_maxd2 = DBUF_LENGTH;      /* MAX DMA2 Length Register */
+
+       pram_ptr->sen_gaddr1 = 0x0;     /* Group Address Filter 1 (unused) */
+       pram_ptr->sen_gaddr2 = 0x0;     /* Group Address Filter 2 (unused) */
+       pram_ptr->sen_gaddr3 = 0x0;     /* Group Address Filter 3 (unused) */
+       pram_ptr->sen_gaddr4 = 0x0;     /* Group Address Filter 4 (unused) */
+
+#define ea bd->bi_enetaddr
+       pram_ptr->sen_paddrh = (ea[5] << 8) + ea[4];
+       pram_ptr->sen_paddrm = (ea[3] << 8) + ea[2];
+       pram_ptr->sen_paddrl = (ea[1] << 8) + ea[0];
+#undef ea
+
+       pram_ptr->sen_pper = 0x0;       /* Persistence (unused) */
+       pram_ptr->sen_iaddr1 = 0x0;     /* Individual Address Filter 1 (unused) */
+       pram_ptr->sen_iaddr2 = 0x0;     /* Individual Address Filter 2 (unused) */
+       pram_ptr->sen_iaddr3 = 0x0;     /* Individual Address Filter 3 (unused) */
+       pram_ptr->sen_iaddr4 = 0x0;     /* Individual Address Filter 4 (unused) */
+       pram_ptr->sen_taddrh = 0x0;     /* Tmp Address (MSB) (unused) */
+       pram_ptr->sen_taddrm = 0x0;     /* Tmp Address (unused) */
+       pram_ptr->sen_taddrl = 0x0;     /* Tmp Address (LSB) (unused) */
+
+       /*
+        * Enter Command:  Initialize Tx Params for SCC
+        */
+
+       do {                            /* Spin until ready to issue command    */
+               __asm__ ("eieio");
+       } while (immr->im_cpm.cp_cpcr & CPM_CR_FLG);
+       /* Issue command */
+       immr->im_cpm.cp_cpcr =
+                       ((CPM_CR_INIT_TX << 8) | (cpm_cr[scc_index] << 4) |
+                        CPM_CR_FLG);
+       do {                            /* Spin until command processed     */
+               __asm__ ("eieio");
+       } while (immr->im_cpm.cp_cpcr & CPM_CR_FLG);
+
+       /*
+        * Mask all Events in SCCM - we use polling mode
+        */
+       immr->im_cpm.cp_scc[scc_index].scc_sccm = 0;
+
+       /*
+        * Clear Events in SCCE -- Clear bits by writing 1's
+        */
+
+       immr->im_cpm.cp_scc[scc_index].scc_scce = ~(0x0);
+
+
+       /*
+        * Initialize GSMR High 32-Bits
+        * Settings:  Normal Mode
+        */
+
+       immr->im_cpm.cp_scc[scc_index].scc_gsmrh = 0;
+
+       /*
+        * Initialize GSMR Low 32-Bits, but do not Enable Transmit/Receive
+        * Settings:
+        *     TCI = Invert
+        *     TPL =  48 bits
+        *     TPP = Repeating 10's
+        *     LOOP = Loopback
+        *     MODE = Ethernet
+        */
+
+       immr->im_cpm.cp_scc[scc_index].scc_gsmrl = (SCC_GSMRL_TCI |
+                                                   SCC_GSMRL_TPL_48 |
+                                                   SCC_GSMRL_TPP_10 |
+                                                   SCC_GSMRL_DIAG_LOOP |
+                                                   SCC_GSMRL_MODE_ENET);
+
+       /*
+        * Initialize the DSR -- see section 13.14.4 (pg. 513) v0.4
+        */
+
+       immr->im_cpm.cp_scc[scc_index].scc_dsr = 0xd555;
+
+       /*
+        * Initialize the PSMR
+        * Settings:
+        *  CRC = 32-Bit CCITT
+        *  NIB = Begin searching for SFD 22 bits after RENA
+        *  LPB = Loopback Enable (Needed when FDE is set)
+        */
+       immr->im_cpm.cp_scc[scc_index].scc_psmr = SCC_PSMR_ENCRC |
+                       SCC_PSMR_NIB22 | SCC_PSMR_LPB;
+
+#if 0
+       /*
+        * Configure Ethernet TENA Signal
+        */
+
+#if (defined(PC_ENET_TENA) && !defined(PB_ENET_TENA))
+       immr->im_ioport.iop_pcpar |= PC_ENET_TENA;
+       immr->im_ioport.iop_pcdir &= ~PC_ENET_TENA;
+#elif (defined(PB_ENET_TENA) && !defined(PC_ENET_TENA))
+       immr->im_cpm.cp_pbpar |= PB_ENET_TENA;
+       immr->im_cpm.cp_pbdir |= PB_ENET_TENA;
+#else
+#error Configuration Error: exactly ONE of PB_ENET_TENA, PC_ENET_TENA must be defined
+#endif
+
+#if defined(CONFIG_ADS) && defined(CONFIG_MPC860)
+       /*
+        * Port C is used to control the PHY,MC68160.
+        */
+       immr->im_ioport.iop_pcdir |=
+                       (PC_ENET_ETHLOOP | PC_ENET_TPFLDL | PC_ENET_TPSQEL);
+
+       immr->im_ioport.iop_pcdat |= PC_ENET_TPFLDL;
+       immr->im_ioport.iop_pcdat &= ~(PC_ENET_ETHLOOP | PC_ENET_TPSQEL);
+       *((uint *) BCSR1) &= ~BCSR1_ETHEN;
+#endif /* MPC860ADS */
+
+#if defined(CONFIG_AMX860)
+       /*
+        * Port B is used to control the PHY,MC68160.
+        */
+       immr->im_cpm.cp_pbdir |=
+                       (PB_ENET_ETHLOOP | PB_ENET_TPFLDL | PB_ENET_TPSQEL);
+
+       immr->im_cpm.cp_pbdat |= PB_ENET_TPFLDL;
+       immr->im_cpm.cp_pbdat &= ~(PB_ENET_ETHLOOP | PB_ENET_TPSQEL);
+
+       immr->im_ioport.iop_pddir |= PD_ENET_ETH_EN;
+       immr->im_ioport.iop_pddat &= ~PD_ENET_ETH_EN;
+#endif /* AMX860 */
+
+#endif /* 0 */
+
+#ifdef CONFIG_RPXCLASSIC
+       *((uchar *) BCSR0) &= ~BCSR0_ETHLPBK;
+       *((uchar *) BCSR0) |= (BCSR0_ETHEN | BCSR0_COLTEST | BCSR0_FULLDPLX);
+#endif
+
+#ifdef CONFIG_RPXLITE
+       *((uchar *) BCSR0) |= BCSR0_ETHEN;
+#endif
+
+#ifdef CONFIG_MBX
+       board_ether_init ();
+#endif
+
+       /*
+        * Set the ENT/ENR bits in the GSMR Low -- Enable Transmit/Receive
+        */
+
+       immr->im_cpm.cp_scc[scc_index].scc_gsmrl |=
+                       (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+
+       /*
+        * Work around transmit problem with first eth packet
+        */
+#if defined (CONFIG_FADS)
+       udelay (10000);                         /* wait 10 ms */
+#elif defined (CONFIG_AMX860) || defined(CONFIG_RPXCLASSIC)
+       udelay (100000);                        /* wait 100 ms */
+#endif
+}
+
+static void scc_halt (int scc_index)
+{
+       volatile immap_t *immr = (immap_t *) CFG_IMMR;
+
+       immr->im_cpm.cp_scc[scc_index].scc_gsmrl &=
+                       ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+       immr->im_ioport.iop_pcso  &=  ~(PC_ENET_CLSN | PC_ENET_RENA);
+}
+
+static int scc_send (int index, volatile void *packet, int length)
+{
+       int i, j = 0;
+
+       while ((rtx->txbd[txIdx].cbd_sc & BD_ENET_TX_READY) && (j < TOUT_LOOP)) {
+               udelay (1);             /* will also trigger Wd if needed */
+               j++;
+       }
+       if (j >= TOUT_LOOP)
+               printf ("TX not ready\n");
+       rtx->txbd[txIdx].cbd_bufaddr = (uint) packet;
+       rtx->txbd[txIdx].cbd_datlen = length;
+       rtx->txbd[txIdx].cbd_sc |=
+                       (BD_ENET_TX_READY | BD_ENET_TX_LAST | BD_ENET_TX_WRAP);
+       while ((rtx->txbd[txIdx].cbd_sc & BD_ENET_TX_READY) && (j < TOUT_LOOP)) {
+               udelay (1);             /* will also trigger Wd if needed */
+               j++;
+       }
+       if (j >= TOUT_LOOP)
+               printf ("TX timeout\n");
+       i = (rtx->txbd[txIdx].
+                cbd_sc & BD_ENET_TX_STATS) /* return only status bits */ ;
+       return i;
+}
+
+static int scc_recv (int index, void *packet, int max_length)
+{
+       int length = -1;
+
+       if (rtx->rxbd[rxIdx].cbd_sc & BD_ENET_RX_EMPTY) {
+               goto Done;              /* nothing received */
+       }
+
+       if (!(rtx->rxbd[rxIdx].cbd_sc & 0x003f)) {
+               length = rtx->rxbd[rxIdx].cbd_datlen - 4;
+               memcpy (packet,
+                               (void *) (NetRxPackets[rxIdx]),
+                               length < max_length ? length : max_length);
+       }
+
+       /* Give the buffer back to the SCC. */
+       rtx->rxbd[rxIdx].cbd_datlen = 0;
+
+       /* wrap around buffer index when necessary */
+       if ((rxIdx + 1) >= PKTBUFSRX) {
+               rtx->rxbd[PKTBUFSRX - 1].cbd_sc =
+                               (BD_ENET_RX_WRAP | BD_ENET_RX_EMPTY);
+               rxIdx = 0;
+       } else {
+               rtx->rxbd[rxIdx].cbd_sc = BD_ENET_RX_EMPTY;
+               rxIdx++;
+       }
+
+Done:
+       return length;
+}
+
+  /*
+   * Test routines
+   */
+
+static void packet_fill (char *packet, int length)
+{
+       char c = (char) length;
+       int i;
+
+       packet[0] = 0xFF;
+       packet[1] = 0xFF;
+       packet[2] = 0xFF;
+       packet[3] = 0xFF;
+       packet[4] = 0xFF;
+       packet[5] = 0xFF;
+
+       for (i = 6; i < length; i++) {
+               packet[i] = c++;
+       }
+}
+
+static int packet_check (char *packet, int length)
+{
+       char c = (char) length;
+       int i;
+
+       for (i = 6; i < length; i++) {
+               if (packet[i] != c++)
+                       return -1;
+       }
+
+       return 0;
+}
+
+static int test_ctlr (int ctlr, int index)
+{
+       int res = -1;
+       char packet_send[MAX_PACKET_LENGTH];
+       char packet_recv[MAX_PACKET_LENGTH];
+       int length;
+       int i;
+       int l;
+
+       ctlr_proc[ctlr].init (index);
+
+       for (i = 0; i < TEST_NUM; i++) {
+               for (l = MIN_PACKET_LENGTH; l <= MAX_PACKET_LENGTH; l++) {
+                       packet_fill (packet_send, l);
+
+                       ctlr_proc[ctlr].send (index, packet_send, l);
+
+                       length = ctlr_proc[ctlr].recv (index, packet_recv,
+                                                       MAX_PACKET_LENGTH);
+
+                       if (length != l || packet_check (packet_recv, length) < 0) {
+                               goto Done;
+                       }
+               }
+       }
+
+       res = 0;
+
+Done:
+
+       ctlr_proc[ctlr].halt (index);
+
+       /*
+        * SCC2 Ethernet parameter RAM space overlaps
+        * the SPI parameter RAM space. So we need to restore
+        * the SPI configuration after SCC2 ethernet test.
+        */
+#if defined(CONFIG_SPI)
+       if (ctlr == CTLR_SCC && index == 1) {
+               spi_init_f ();
+               spi_init_r ();
+       }
+#endif
+
+       if (res != 0) {
+               post_log ("ethernet %s%d test failed\n", ctlr_name[ctlr],
+                                 index + 1);
+       }
+
+       return res;
+}
+
+int ether_post_test (int flags)
+{
+       int res = 0;
+       int i;
+
+       ctlr_proc[CTLR_SCC].init = scc_init;
+       ctlr_proc[CTLR_SCC].halt = scc_halt;
+       ctlr_proc[CTLR_SCC].send = scc_send;
+       ctlr_proc[CTLR_SCC].recv = scc_recv;
+
+       for (i = 0; i < CTRL_LIST_SIZE; i++) {
+               if (test_ctlr (ctlr_list[i][0], ctlr_list[i][1]) != 0) {
+                       res = -1;
+               }
+       }
+
+#if !defined(CONFIG_8xx_CONS_NONE)
+       serial_reinit_all ();
+#endif
+       return res;
+}
+
+#endif /* CONFIG_POST & CFG_POST_ETHER */
+
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/spr.c b/post/cpu/mpc8xx/spr.c
new file mode 100644 (file)
index 0000000..330b977
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * SPR test
+ *
+ * The test checks the contents of Special Purpose Registers (SPR) listed
+ * in the spr_test_list array below.
+ * Each SPR value is read using mfspr instruction, some bits are masked
+ * according to the table and the resulting value is compared to the
+ * corresponding table value.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+
+#if CONFIG_POST & CFG_POST_SPR
+
+static struct
+{
+    int number;
+    char * name;
+    unsigned long mask;
+    unsigned long value;
+} spr_test_list [] = {
+       /* Standard Special-Purpose Registers */
+
+       {1,     "XER",          0x00000000,     0x00000000},
+       {8,     "LR",           0x00000000,     0x00000000},
+       {9,     "CTR",          0x00000000,     0x00000000},
+       {18,    "DSISR",        0x00000000,     0x00000000},
+       {19,    "DAR",          0x00000000,     0x00000000},
+       {22,    "DEC",          0x00000000,     0x00000000},
+       {26,    "SRR0",         0x00000000,     0x00000000},
+       {27,    "SRR1",         0x00000000,     0x00000000},
+       {272,   "SPRG0",        0x00000000,     0x00000000},
+       {273,   "SPRG1",        0x00000000,     0x00000000},
+       {274,   "SPRG2",        0x00000000,     0x00000000},
+       {275,   "SPRG3",        0x00000000,     0x00000000},
+       {287,   "PVR",          0xFFFF0000,     0x00500000},
+
+       /* Additional Special-Purpose Registers */
+
+       {144,   "CMPA",         0x00000000,     0x00000000},
+       {145,   "CMPB",         0x00000000,     0x00000000},
+       {146,   "CMPC",         0x00000000,     0x00000000},
+       {147,   "CMPD",         0x00000000,     0x00000000},
+       {148,   "ICR",          0xFFFFFFFF,     0x00000000},
+       {149,   "DER",          0x00000000,     0x00000000},
+       {150,   "COUNTA",       0xFFFFFFFF,     0x00000000},
+       {151,   "COUNTB",       0xFFFFFFFF,     0x00000000},
+       {152,   "CMPE",         0x00000000,     0x00000000},
+       {153,   "CMPF",         0x00000000,     0x00000000},
+       {154,   "CMPG",         0x00000000,     0x00000000},
+       {155,   "CMPH",         0x00000000,     0x00000000},
+       {156,   "LCTRL1",       0xFFFFFFFF,     0x00000000},
+       {157,   "LCTRL2",       0xFFFFFFFF,     0x00000000},
+       {158,   "ICTRL",        0xFFFFFFFF,     0x00000007},
+       {159,   "BAR",          0x00000000,     0x00000000},
+       {630,   "DPDR",         0x00000000,     0x00000000},
+       {631,   "DPIR",         0x00000000,     0x00000000},
+       {638,   "IMMR",         0xFFFF0000,     CFG_IMMR  },
+       {560,   "IC_CST",       0x8E380000,     0x00000000},
+       {561,   "IC_ADR",       0x00000000,     0x00000000},
+       {562,   "IC_DAT",       0x00000000,     0x00000000},
+       {568,   "DC_CST",       0xEF380000,     0x00000000},
+       {569,   "DC_ADR",       0x00000000,     0x00000000},
+       {570,   "DC_DAT",       0x00000000,     0x00000000},
+       {784,   "MI_CTR",       0xFFFFFFFF,     0x00000000},
+       {786,   "MI_AP",        0x00000000,     0x00000000},
+       {787,   "MI_EPN",       0x00000000,     0x00000000},
+       {789,   "MI_TWC",       0xFFFFFE02,     0x00000000},
+       {790,   "MI_RPN",       0x00000000,     0x00000000},
+       {816,   "MI_DBCAM",     0x00000000,     0x00000000},
+       {817,   "MI_DBRAM0",    0x00000000,     0x00000000},
+       {818,   "MI_DBRAM1",    0x00000000,     0x00000000},
+       {792,   "MD_CTR",       0xFFFFFFFF,     0x04000000},
+       {793,   "M_CASID",      0xFFFFFFF0,     0x00000000},
+       {794,   "MD_AP",        0x00000000,     0x00000000},
+       {795,   "MD_EPN",       0x00000000,     0x00000000},
+       {796,   "M_TWB",        0x00000003,     0x00000000},
+       {797,   "MD_TWC",       0x00000003,     0x00000000},
+       {798,   "MD_RPN",       0x00000000,     0x00000000},
+       {799,   "M_TW",         0x00000000,     0x00000000},
+       {824,   "MD_DBCAM",     0x00000000,     0x00000000},
+       {825,   "MD_DBRAM0",    0x00000000,     0x00000000},
+       {826,   "MD_DBRAM1",    0x00000000,     0x00000000},
+};
+
+static int spr_test_list_size =
+               sizeof (spr_test_list) / sizeof (spr_test_list[0]);
+
+int spr_post_test (int flags)
+{
+       int ret = 0;
+       int ic = icache_status ();
+       int i;
+
+       unsigned long code[] = {
+               0x7c6002a6,                             /* mfspr r3,SPR */
+               0x4e800020                              /* blr          */
+       };
+       unsigned long (*get_spr) (void) = (void *) code;
+
+       if (ic)
+               icache_disable ();
+
+       for (i = 0; i < spr_test_list_size; i++) {
+               int num = spr_test_list[i].number;
+
+               /* mfspr r3,num */
+               code[0] = 0x7c6002a6 | ((num & 0x1F) << 16) | ((num & 0x3E0) << 6);
+
+               if ((get_spr () & spr_test_list[i].mask) !=
+                       (spr_test_list[i].value & spr_test_list[i].mask)) {
+                       post_log ("The value of %s special register "
+                                 "is incorrect: 0x%08X\n",
+                                       spr_test_list[i].name, get_spr ());
+                       ret = -1;
+               }
+       }
+
+       if (ic)
+               icache_enable ();
+
+       return ret;
+}
+#endif /* CONFIG_POST & CFG_POST_SPR */
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/uart.c b/post/cpu/mpc8xx/uart.c
new file mode 100644 (file)
index 0000000..fd97e38
--- /dev/null
@@ -0,0 +1,560 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * UART test
+ *
+ * The Serial Management Controllers (SMC) and the Serial Communication
+ * Controllers (SCC) listed in ctlr_list array below are tested in
+ * the loopback UART mode.
+ * The controllers are configured accordingly and several characters
+ * are transmitted. The configurable test parameters are:
+ *   MIN_PACKET_LENGTH - minimum size of packet to transmit
+ *   MAX_PACKET_LENGTH - maximum size of packet to transmit
+ *   TEST_NUM - number of tests
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#if CONFIG_POST & CFG_POST_UART
+#if defined(CONFIG_8xx)
+#include <commproc.h>
+#elif defined(CONFIG_MPC8260)
+#include <asm/cpm_8260.h>
+#else
+#error "Apparently a bad configuration, please fix."
+#endif
+#include <command.h>
+#include <serial.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define CTLR_SMC 0
+#define CTLR_SCC 1
+
+/* The list of controllers to test */
+#if defined(CONFIG_MPC823)
+static int ctlr_list[][2] =
+               { {CTLR_SMC, 0}, {CTLR_SMC, 1}, {CTLR_SCC, 1} };
+#else
+static int ctlr_list[][2] = { };
+#endif
+
+#define CTRL_LIST_SIZE (sizeof(ctlr_list) / sizeof(ctlr_list[0]))
+
+static struct {
+       void (*init) (int index);
+       void (*halt) (int index);
+       void (*putc) (int index, const char c);
+       int (*getc) (int index);
+} ctlr_proc[2];
+
+static char *ctlr_name[2] = { "SMC", "SCC" };
+
+static int proff_smc[] = { PROFF_SMC1, PROFF_SMC2 };
+static int proff_scc[] =
+               { PROFF_SCC1, PROFF_SCC2, PROFF_SCC3, PROFF_SCC4 };
+
+/*
+ * SMC callbacks
+ */
+
+static void smc_init (int smc_index)
+{
+       static int cpm_cr_ch[] = { CPM_CR_CH_SMC1, CPM_CR_CH_SMC2 };
+
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile smc_t *sp;
+       volatile smc_uart_t *up;
+       volatile cbd_t *tbdf, *rbdf;
+       volatile cpm8xx_t *cp = &(im->im_cpm);
+       uint dpaddr;
+
+       /* initialize pointers to SMC */
+
+       sp = (smc_t *) & (cp->cp_smc[smc_index]);
+       up = (smc_uart_t *) & cp->cp_dparam[proff_smc[smc_index]];
+
+       /* Disable transmitter/receiver.
+        */
+       sp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
+
+       /* Enable SDMA.
+        */
+       im->im_siu_conf.sc_sdcr = 1;
+
+       /* clear error conditions */
+#ifdef CFG_SDSR
+       im->im_sdma.sdma_sdsr = CFG_SDSR;
+#else
+       im->im_sdma.sdma_sdsr = 0x83;
+#endif
+
+       /* clear SDMA interrupt mask */
+#ifdef CFG_SDMR
+       im->im_sdma.sdma_sdmr = CFG_SDMR;
+#else
+       im->im_sdma.sdma_sdmr = 0x00;
+#endif
+
+#if defined(CONFIG_FADS)
+       /* Enable RS232 */
+       *((uint *) BCSR1) &=
+                       ~(smc_index == 1 ? BCSR1_RS232EN_1 : BCSR1_RS232EN_2);
+#endif
+
+#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
+       /* Enable Monitor Port Transceiver */
+       *((uchar *) BCSR0) |= BCSR0_ENMONXCVR;
+#endif
+
+       /* Set the physical address of the host memory buffers in
+        * the buffer descriptors.
+        */
+
+#ifdef CFG_ALLOC_DPRAM
+       dpaddr = dpram_alloc_align (sizeof (cbd_t) * 2 + 2, 8);
+#else
+       dpaddr = CPM_POST_BASE;
+#endif
+
+       /* Allocate space for two buffer descriptors in the DP ram.
+        * For now, this address seems OK, but it may have to
+        * change with newer versions of the firmware.
+        * damm: allocating space after the two buffers for rx/tx data
+        */
+
+       rbdf = (cbd_t *) & cp->cp_dpmem[dpaddr];
+       rbdf->cbd_bufaddr = (uint) (rbdf + 2);
+       rbdf->cbd_sc = 0;
+       tbdf = rbdf + 1;
+       tbdf->cbd_bufaddr = ((uint) (rbdf + 2)) + 1;
+       tbdf->cbd_sc = 0;
+
+       /* Set up the uart parameters in the parameter ram.
+        */
+       up->smc_rbase = dpaddr;
+       up->smc_tbase = dpaddr + sizeof (cbd_t);
+       up->smc_rfcr = SMC_EB;
+       up->smc_tfcr = SMC_EB;
+
+#if defined(CONFIG_MBX)
+       board_serial_init ();
+#endif
+
+       /* Set UART mode, 8 bit, no parity, one stop.
+        * Enable receive and transmit.
+        * Set local loopback mode.
+        */
+       sp->smc_smcmr = smcr_mk_clen (9) | SMCMR_SM_UART | (ushort) 0x0004;
+
+       /* Mask all interrupts and remove anything pending.
+        */
+       sp->smc_smcm = 0;
+       sp->smc_smce = 0xff;
+
+       /* Set up the baud rate generator.
+        */
+       cp->cp_simode = 0x00000000;
+
+       cp->cp_brgc1 =
+                       (((gd->cpu_clk / 16 / gd->baudrate) -
+                         1) << 1) | CPM_BRG_EN;
+
+       /* Make the first buffer the only buffer.
+        */
+       tbdf->cbd_sc |= BD_SC_WRAP;
+       rbdf->cbd_sc |= BD_SC_EMPTY | BD_SC_WRAP;
+
+       /* Single character receive.
+        */
+       up->smc_mrblr = 1;
+       up->smc_maxidl = 0;
+
+       /* Initialize Tx/Rx parameters.
+        */
+
+       while (cp->cp_cpcr & CPM_CR_FLG)        /* wait if cp is busy */
+               ;
+
+       cp->cp_cpcr =
+                       mk_cr_cmd (cpm_cr_ch[smc_index], CPM_CR_INIT_TRX) | CPM_CR_FLG;
+
+       while (cp->cp_cpcr & CPM_CR_FLG)        /* wait if cp is busy */
+               ;
+
+       /* Enable transmitter/receiver.
+        */
+       sp->smc_smcmr |= SMCMR_REN | SMCMR_TEN;
+}
+
+static void smc_halt(int smc_index)
+{
+}
+
+static void smc_putc (int smc_index, const char c)
+{
+       volatile cbd_t *tbdf;
+       volatile char *buf;
+       volatile smc_uart_t *up;
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cpmp = &(im->im_cpm);
+
+       up = (smc_uart_t *) & cpmp->cp_dparam[proff_smc[smc_index]];
+
+       tbdf = (cbd_t *) & cpmp->cp_dpmem[up->smc_tbase];
+
+       /* Wait for last character to go.
+        */
+
+       buf = (char *) tbdf->cbd_bufaddr;
+#if 0
+       __asm__ ("eieio");
+       while (tbdf->cbd_sc & BD_SC_READY)
+               __asm__ ("eieio");
+#endif
+
+       *buf = c;
+       tbdf->cbd_datlen = 1;
+       tbdf->cbd_sc |= BD_SC_READY;
+       __asm__ ("eieio");
+#if 1
+       while (tbdf->cbd_sc & BD_SC_READY)
+               __asm__ ("eieio");
+#endif
+}
+
+static int smc_getc (int smc_index)
+{
+       volatile cbd_t *rbdf;
+       volatile unsigned char *buf;
+       volatile smc_uart_t *up;
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cpmp = &(im->im_cpm);
+       unsigned char c;
+       int i;
+
+       up = (smc_uart_t *) & cpmp->cp_dparam[proff_smc[smc_index]];
+
+       rbdf = (cbd_t *) & cpmp->cp_dpmem[up->smc_rbase];
+
+       /* Wait for character to show up.
+        */
+       buf = (unsigned char *) rbdf->cbd_bufaddr;
+#if 0
+       while (rbdf->cbd_sc & BD_SC_EMPTY);
+#else
+       for (i = 100; i > 0; i--) {
+               if (!(rbdf->cbd_sc & BD_SC_EMPTY))
+                       break;
+               udelay (1000);
+       }
+
+       if (i == 0)
+               return -1;
+#endif
+       c = *buf;
+       rbdf->cbd_sc |= BD_SC_EMPTY;
+
+       return (c);
+}
+
+  /*
+   * SCC callbacks
+   */
+
+static void scc_init (int scc_index)
+{
+       static int cpm_cr_ch[] = {
+               CPM_CR_CH_SCC1,
+               CPM_CR_CH_SCC2,
+               CPM_CR_CH_SCC3,
+               CPM_CR_CH_SCC4,
+       };
+
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile scc_t *sp;
+       volatile scc_uart_t *up;
+       volatile cbd_t *tbdf, *rbdf;
+       volatile cpm8xx_t *cp = &(im->im_cpm);
+       uint dpaddr;
+
+       /* initialize pointers to SCC */
+
+       sp = (scc_t *) & (cp->cp_scc[scc_index]);
+       up = (scc_uart_t *) & cp->cp_dparam[proff_scc[scc_index]];
+
+       /* Disable transmitter/receiver.
+        */
+       sp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+
+
+       /* Allocate space for two buffer descriptors in the DP ram.
+        */
+
+#ifdef CFG_ALLOC_DPRAM
+       dpaddr = dpram_alloc_align (sizeof (cbd_t) * 2 + 2, 8);
+#else
+       dpaddr = CPM_POST_BASE;
+#endif
+
+       /* Enable SDMA.
+        */
+       im->im_siu_conf.sc_sdcr = 0x0001;
+
+       /* Set the physical address of the host memory buffers in
+        * the buffer descriptors.
+        */
+
+       rbdf = (cbd_t *) & cp->cp_dpmem[dpaddr];
+       rbdf->cbd_bufaddr = (uint) (rbdf + 2);
+       rbdf->cbd_sc = 0;
+       tbdf = rbdf + 1;
+       tbdf->cbd_bufaddr = ((uint) (rbdf + 2)) + 1;
+       tbdf->cbd_sc = 0;
+
+       /* Set up the baud rate generator.
+        */
+       cp->cp_sicr &= ~(0x000000FF << (8 * scc_index));
+       /* no |= needed, since BRG1 is 000 */
+
+       cp->cp_brgc1 =
+                       (((gd->cpu_clk / 16 / gd->baudrate) -
+                         1) << 1) | CPM_BRG_EN;
+
+       /* Set up the uart parameters in the parameter ram.
+        */
+       up->scc_genscc.scc_rbase = dpaddr;
+       up->scc_genscc.scc_tbase = dpaddr + sizeof (cbd_t);
+
+       /* Initialize Tx/Rx parameters.
+        */
+       while (cp->cp_cpcr & CPM_CR_FLG)        /* wait if cp is busy */
+               ;
+       cp->cp_cpcr =
+                       mk_cr_cmd (cpm_cr_ch[scc_index], CPM_CR_INIT_TRX) | CPM_CR_FLG;
+
+       while (cp->cp_cpcr & CPM_CR_FLG)        /* wait if cp is busy */
+               ;
+
+       up->scc_genscc.scc_rfcr = SCC_EB | 0x05;
+       up->scc_genscc.scc_tfcr = SCC_EB | 0x05;
+
+       up->scc_genscc.scc_mrblr = 1;   /* Single character receive */
+       up->scc_maxidl = 0;             /* disable max idle */
+       up->scc_brkcr = 1;              /* send one break character on stop TX */
+       up->scc_parec = 0;
+       up->scc_frmec = 0;
+       up->scc_nosec = 0;
+       up->scc_brkec = 0;
+       up->scc_uaddr1 = 0;
+       up->scc_uaddr2 = 0;
+       up->scc_toseq = 0;
+       up->scc_char1 = 0x8000;
+       up->scc_char2 = 0x8000;
+       up->scc_char3 = 0x8000;
+       up->scc_char4 = 0x8000;
+       up->scc_char5 = 0x8000;
+       up->scc_char6 = 0x8000;
+       up->scc_char7 = 0x8000;
+       up->scc_char8 = 0x8000;
+       up->scc_rccm = 0xc0ff;
+
+       /* Set low latency / small fifo.
+        */
+       sp->scc_gsmrh = SCC_GSMRH_RFW;
+
+       /* Set UART mode
+        */
+       sp->scc_gsmrl &= ~0xF;
+       sp->scc_gsmrl |= SCC_GSMRL_MODE_UART;
+
+       /* Set local loopback mode.
+        */
+       sp->scc_gsmrl &= ~SCC_GSMRL_DIAG_LE;
+       sp->scc_gsmrl |= SCC_GSMRL_DIAG_LOOP;
+
+       /* Set clock divider 16 on Tx and Rx
+        */
+       sp->scc_gsmrl |= (SCC_GSMRL_TDCR_16 | SCC_GSMRL_RDCR_16);
+
+       sp->scc_psmr |= SCU_PSMR_CL;
+
+       /* Mask all interrupts and remove anything pending.
+        */
+       sp->scc_sccm = 0;
+       sp->scc_scce = 0xffff;
+       sp->scc_dsr = 0x7e7e;
+       sp->scc_psmr = 0x3000;
+
+       /* Make the first buffer the only buffer.
+        */
+       tbdf->cbd_sc |= BD_SC_WRAP;
+       rbdf->cbd_sc |= BD_SC_EMPTY | BD_SC_WRAP;
+
+       /* Enable transmitter/receiver.
+        */
+       sp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+}
+
+static void scc_halt(int scc_index)
+{
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cp = &(im->im_cpm);
+       volatile scc_t *sp = (scc_t *) & (cp->cp_scc[scc_index]);
+
+       sp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT | SCC_GSMRL_DIAG_LE);
+}
+
+static void scc_putc (int scc_index, const char c)
+{
+       volatile cbd_t *tbdf;
+       volatile char *buf;
+       volatile scc_uart_t *up;
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cpmp = &(im->im_cpm);
+
+       up = (scc_uart_t *) & cpmp->cp_dparam[proff_scc[scc_index]];
+
+       tbdf = (cbd_t *) & cpmp->cp_dpmem[up->scc_genscc.scc_tbase];
+
+       /* Wait for last character to go.
+        */
+
+       buf = (char *) tbdf->cbd_bufaddr;
+#if 0
+       __asm__ ("eieio");
+       while (tbdf->cbd_sc & BD_SC_READY)
+               __asm__ ("eieio");
+#endif
+
+       *buf = c;
+       tbdf->cbd_datlen = 1;
+       tbdf->cbd_sc |= BD_SC_READY;
+       __asm__ ("eieio");
+#if 1
+       while (tbdf->cbd_sc & BD_SC_READY)
+               __asm__ ("eieio");
+#endif
+}
+
+static int scc_getc (int scc_index)
+{
+       volatile cbd_t *rbdf;
+       volatile unsigned char *buf;
+       volatile scc_uart_t *up;
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cpmp = &(im->im_cpm);
+       unsigned char c;
+       int i;
+
+       up = (scc_uart_t *) & cpmp->cp_dparam[proff_scc[scc_index]];
+
+       rbdf = (cbd_t *) & cpmp->cp_dpmem[up->scc_genscc.scc_rbase];
+
+       /* Wait for character to show up.
+        */
+       buf = (unsigned char *) rbdf->cbd_bufaddr;
+#if 0
+       while (rbdf->cbd_sc & BD_SC_EMPTY);
+#else
+       for (i = 100; i > 0; i--) {
+               if (!(rbdf->cbd_sc & BD_SC_EMPTY))
+                       break;
+               udelay (1000);
+       }
+
+       if (i == 0)
+               return -1;
+#endif
+       c = *buf;
+       rbdf->cbd_sc |= BD_SC_EMPTY;
+
+       return (c);
+}
+
+  /*
+   * Test routines
+   */
+
+static int test_ctlr (int ctlr, int index)
+{
+       int res = -1;
+       char test_str[] = "*** UART Test String ***\r\n";
+       int i;
+
+       ctlr_proc[ctlr].init (index);
+
+       for (i = 0; i < sizeof (test_str) - 1; i++) {
+               ctlr_proc[ctlr].putc (index, test_str[i]);
+               if (ctlr_proc[ctlr].getc (index) != test_str[i])
+                       goto Done;
+       }
+
+       res = 0;
+
+Done:
+       ctlr_proc[ctlr].halt (index);
+
+       if (res != 0) {
+               post_log ("uart %s%d test failed\n",
+                               ctlr_name[ctlr], index + 1);
+       }
+
+       return res;
+}
+
+int uart_post_test (int flags)
+{
+       int res = 0;
+       int i;
+
+       ctlr_proc[CTLR_SMC].init = smc_init;
+       ctlr_proc[CTLR_SMC].halt = smc_halt;
+       ctlr_proc[CTLR_SMC].putc = smc_putc;
+       ctlr_proc[CTLR_SMC].getc = smc_getc;
+
+       ctlr_proc[CTLR_SCC].init = scc_init;
+       ctlr_proc[CTLR_SCC].halt = scc_halt;
+       ctlr_proc[CTLR_SCC].putc = scc_putc;
+       ctlr_proc[CTLR_SCC].getc = scc_getc;
+
+       for (i = 0; i < CTRL_LIST_SIZE; i++) {
+               if (test_ctlr (ctlr_list[i][0], ctlr_list[i][1]) != 0) {
+                       res = -1;
+               }
+       }
+
+#if !defined(CONFIG_8xx_CONS_NONE)
+       serial_reinit_all ();
+#endif
+
+       return res;
+}
+
+#endif /* CONFIG_POST & CFG_POST_UART */
+
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/usb.c b/post/cpu/mpc8xx/usb.c
new file mode 100644 (file)
index 0000000..0c74cfa
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * USB test
+ *
+ * The USB controller is tested in the local loopback mode.
+ * It is configured so that endpoint 0 operates as host and endpoint 1
+ * operates as function endpoint. After that an IN token transaction
+ * is performed.
+ * Refer to MPC850 User Manual, Section 32.11.1 USB Host Controller
+ * Initialization Example.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+
+#if CONFIG_POST & CFG_POST_USB
+
+#include <commproc.h>
+#include <command.h>
+
+#define TOUT_LOOP 100
+
+#define        PROFF_USB               ((uint)0x0000)
+
+#define CPM_USB_EP0_BASE       0x0a00
+#define CPM_USB_EP1_BASE       0x0a20
+
+#define CPM_USB_DT0_BASE       0x0a80
+#define CPM_USB_DT1_BASE       0x0a90
+#define CPM_USB_DR0_BASE       0x0aa0
+#define CPM_USB_DR1_BASE       0x0ab0
+
+#define CPM_USB_RX0_BASE       0x0b00
+#define CPM_USB_RX1_BASE       0x0b08
+#define CPM_USB_TX0_BASE       0x0b20
+#define CPM_USB_TX1_BASE       0x0b28
+
+#define USB_EXPECT(x)          if (!(x)) goto Done;
+
+typedef struct usb_param {
+       ushort ep0ptr;
+       ushort ep1ptr;
+       ushort ep2ptr;
+       ushort ep3ptr;
+       uint rstate;
+       uint rptr;
+       ushort frame_n;
+       ushort rbcnt;
+       ushort rtemp;
+} usb_param_t;
+
+typedef struct usb_param_block {
+       ushort rbase;
+       ushort tbase;
+       uchar rfcr;
+       uchar tfcr;
+       ushort mrblr;
+       ushort rbptr;
+       ushort tbptr;
+       uint tstate;
+       uint tptr;
+       ushort tcrc;
+       ushort tbcnt;
+       uint res[2];
+} usb_param_block_t;
+
+typedef struct usb {
+       uchar usmod;
+       uchar usadr;
+       uchar uscom;
+       uchar res1;
+       ushort usep[4];
+       uchar res2[4];
+       ushort usber;
+       uchar res3[2];
+       ushort usbmr;
+       uchar res4;
+       uchar usbs;
+       uchar res5[8];
+} usb_t;
+
+int usb_post_test (int flags)
+{
+       int res = -1;
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       volatile cpm8xx_t *cp = &(im->im_cpm);
+       volatile usb_param_t *pram_ptr;
+       uint dpram;
+       ushort DPRAM;
+       volatile cbd_t *tx;
+       volatile cbd_t *rx;
+       volatile usb_t *usbr;
+       volatile usb_param_block_t *ep0;
+       volatile usb_param_block_t *ep1;
+       int j;
+
+       pram_ptr = (usb_param_t *) & (im->im_cpm.cp_dparam[PROFF_USB]);
+       dpram = (uint) im->im_cpm.cp_dpmem;
+       DPRAM = dpram;
+       tx = (cbd_t *) (dpram + CPM_USB_TX0_BASE);
+       rx = (cbd_t *) (dpram + CPM_USB_RX0_BASE);
+       ep0 = (usb_param_block_t *) (dpram + CPM_USB_EP0_BASE);
+       ep1 = (usb_param_block_t *) (dpram + CPM_USB_EP1_BASE);
+       usbr = (usb_t *) & (im->im_cpm.cp_scc[0]);
+
+       /* 01 */
+       im->im_ioport.iop_padir &= ~(ushort) 0x0200;
+       im->im_ioport.iop_papar |= (ushort) 0x0200;
+
+       cp->cp_sicr &= ~0x000000FF;
+       cp->cp_sicr |= 0x00000018;
+
+       cp->cp_brgc4 = 0x00010001;
+
+       /* 02 */
+       im->im_ioport.iop_padir &= ~(ushort) 0x0002;
+       im->im_ioport.iop_padir &= ~(ushort) 0x0001;
+
+       im->im_ioport.iop_papar |= (ushort) 0x0002;
+       im->im_ioport.iop_papar |= (ushort) 0x0001;
+
+       /* 03 */
+       im->im_ioport.iop_pcdir &= ~(ushort) 0x0020;
+       im->im_ioport.iop_pcdir &= ~(ushort) 0x0010;
+
+       im->im_ioport.iop_pcpar &= ~(ushort) 0x0020;
+       im->im_ioport.iop_pcpar &= ~(ushort) 0x0010;
+
+       im->im_ioport.iop_pcso |= (ushort) 0x0020;
+       im->im_ioport.iop_pcso |= (ushort) 0x0010;
+
+       /* 04 */
+       im->im_ioport.iop_pcdir |= (ushort) 0x0200;
+       im->im_ioport.iop_pcdir |= (ushort) 0x0100;
+
+       im->im_ioport.iop_pcpar |= (ushort) 0x0200;
+       im->im_ioport.iop_pcpar |= (ushort) 0x0100;
+
+       /* 05 */
+       pram_ptr->frame_n = 0;
+
+       /* 06 */
+       pram_ptr->ep0ptr = DPRAM + CPM_USB_EP0_BASE;
+       pram_ptr->ep1ptr = DPRAM + CPM_USB_EP1_BASE;
+
+       /* 07-10 */
+       tx[0].cbd_sc = 0xB800;
+       tx[0].cbd_datlen = 3;
+       tx[0].cbd_bufaddr = dpram + CPM_USB_DT0_BASE;
+
+       tx[1].cbd_sc = 0xBC80;
+       tx[1].cbd_datlen = 3;
+       tx[1].cbd_bufaddr = dpram + CPM_USB_DT1_BASE;
+
+       rx[0].cbd_sc = 0xA000;
+       rx[0].cbd_datlen = 0;
+       rx[0].cbd_bufaddr = dpram + CPM_USB_DR0_BASE;
+
+       rx[1].cbd_sc = 0xA000;
+       rx[1].cbd_datlen = 0;
+       rx[1].cbd_bufaddr = dpram + CPM_USB_DR1_BASE;
+
+       /* 11-12 */
+       *(volatile int *) (dpram + CPM_USB_DT0_BASE) = 0x69856000;
+       *(volatile int *) (dpram + CPM_USB_DT1_BASE) = 0xABCD1234;
+
+       *(volatile int *) (dpram + CPM_USB_DR0_BASE) = 0;
+       *(volatile int *) (dpram + CPM_USB_DR1_BASE) = 0;
+
+       /* 13-16 */
+       ep0->rbase = DPRAM + CPM_USB_RX0_BASE;
+       ep0->tbase = DPRAM + CPM_USB_TX0_BASE;
+       ep0->rfcr = 0x18;
+       ep0->tfcr = 0x18;
+       ep0->mrblr = 0x100;
+       ep0->rbptr = DPRAM + CPM_USB_RX0_BASE;
+       ep0->tbptr = DPRAM + CPM_USB_TX0_BASE;
+       ep0->tstate = 0;
+
+       /* 17-20 */
+       ep1->rbase = DPRAM + CPM_USB_RX1_BASE;
+       ep1->tbase = DPRAM + CPM_USB_TX1_BASE;
+       ep1->rfcr = 0x18;
+       ep1->tfcr = 0x18;
+       ep1->mrblr = 0x100;
+       ep1->rbptr = DPRAM + CPM_USB_RX1_BASE;
+       ep1->tbptr = DPRAM + CPM_USB_TX1_BASE;
+       ep1->tstate = 0;
+
+       /* 21-24 */
+       usbr->usep[0] = 0x0000;
+       usbr->usep[1] = 0x1100;
+       usbr->usep[2] = 0x2200;
+       usbr->usep[3] = 0x3300;
+
+       /* 25 */
+       usbr->usmod = 0x06;
+
+       /* 26 */
+       usbr->usadr = 0x05;
+
+       /* 27 */
+       usbr->uscom = 0;
+
+       /* 28 */
+       usbr->usmod |= 0x01;
+       udelay (1);
+
+       /* 29-30 */
+       usbr->uscom = 0x80;
+       usbr->uscom = 0x81;
+
+       /* Wait for the data packet to be transmitted */
+       for (j = 0; j < TOUT_LOOP; j++) {
+               if (tx[1].cbd_sc & (ushort) 0x8000)
+                       udelay (1);
+               else
+                       break;
+       }
+
+       USB_EXPECT (j < TOUT_LOOP);
+
+       USB_EXPECT (tx[0].cbd_sc == 0x3800);
+       USB_EXPECT (tx[0].cbd_datlen == 3);
+
+       USB_EXPECT (tx[1].cbd_sc == 0x3C80);
+       USB_EXPECT (tx[1].cbd_datlen == 3);
+
+       USB_EXPECT (rx[0].cbd_sc == 0x2C00);
+       USB_EXPECT (rx[0].cbd_datlen == 5);
+
+       USB_EXPECT (*(volatile int *) (dpram + CPM_USB_DR0_BASE) ==
+                               0xABCD122B);
+       USB_EXPECT (*(volatile char *) (dpram + CPM_USB_DR0_BASE + 4) == 0x42);
+
+       res = 0;
+  Done:
+
+       return res;
+}
+
+#endif /* CONFIG_POST & CFG_POST_USB */
+
+#endif /* CONFIG_POST */
diff --git a/post/cpu/mpc8xx/watchdog.c b/post/cpu/mpc8xx/watchdog.c
new file mode 100644 (file)
index 0000000..48c4282
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * Watchdog test
+ *
+ * The test verifies the watchdog timer operation.
+ * On the first iteration, the test routine disables interrupts and
+ * makes a 10-second delay. If the system does not reboot during this delay,
+ * the watchdog timer is not operational and the test fails. If the system
+ * reboots, on the second iteration the test routine reports a success.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <watchdog.h>
+
+#if CONFIG_POST & CFG_POST_WATCHDOG
+
+static ulong gettbl (void)
+{
+       ulong r;
+
+  asm ("mftbl %0":"=r" (r));
+
+       return r;
+}
+
+int watchdog_post_test (int flags)
+{
+       if (flags & POST_REBOOT) {
+               /* Test passed */
+
+               return 0;
+       } else {
+               /* 10-second delay */
+               int ints = disable_interrupts ();
+               ulong base = gettbl ();
+               ulong clk = get_tbclk ();
+
+               while ((gettbl () - base) / 10 < clk);
+
+               if (ints)
+                       enable_interrupts ();
+
+               /*
+                * If we have reached this point, the watchdog timer
+                * does not work
+                */
+               return -1;
+       }
+}
+
+#endif /* CONFIG_POST & CFG_POST_WATCHDOG */
+#endif /* CONFIG_POST */
diff --git a/post/drivers/Makefile b/post/drivers/Makefile
new file mode 100644 (file)
index 0000000..068fa98
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# (C) Copyright 2002-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
+#
+
+
+SUBDIRS =
+
+LIB    = libpostdrivers.a
+
+COBJS  = cache.o i2c.o memory.o rtc.o
+
+include $(TOPDIR)/post/rules.mk
diff --git a/post/drivers/cache.c b/post/drivers/cache.c
new file mode 100644 (file)
index 0000000..501465c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/* Cache test
+ *
+ * This test verifies the CPU data and instruction cache using
+ * several test scenarios.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <watchdog.h>
+
+#if CONFIG_POST & CFG_POST_CACHE
+
+#define CACHE_POST_SIZE        1024
+
+extern int cache_post_test1 (char *, unsigned int);
+extern int cache_post_test2 (char *, unsigned int);
+extern int cache_post_test3 (char *, unsigned int);
+extern int cache_post_test4 (char *, unsigned int);
+extern int cache_post_test5 (void);
+extern int cache_post_test6 (void);
+
+int cache_post_test (int flags)
+{
+       int ints = disable_interrupts ();
+       int res = 0;
+       static char ta[CACHE_POST_SIZE + 0xf];
+       char *testarea = (char *) (((unsigned long) ta + 0xf) & ~0xf);
+
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test1 (testarea, CACHE_POST_SIZE);
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test2 (testarea, CACHE_POST_SIZE);
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test3 (testarea, CACHE_POST_SIZE);
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test4 (testarea, CACHE_POST_SIZE);
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test5 ();
+       WATCHDOG_RESET ();
+       if (res == 0)
+               res = cache_post_test6 ();
+
+       WATCHDOG_RESET ();
+       if (ints)
+               enable_interrupts ();
+       return res;
+}
+
+#endif /* CONFIG_POST & CFG_POST_CACHE */
+#endif /* CONFIG_POST */
diff --git a/post/drivers/i2c.c b/post/drivers/i2c.c
new file mode 100644 (file)
index 0000000..1b2e644
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+#ifdef CONFIG_POST
+
+/*
+ * I2C test
+ *
+ * For verifying the I2C bus, a full I2C bus scanning is performed.
+ *
+ * #ifdef I2C_ADDR_LIST
+ *   The test is considered as passed if all the devices and
+ *   only the devices in the list are found.
+ * #else [ ! I2C_ADDR_LIST ]
+ *   The test is considered as passed if any I2C device is found.
+ * #endif
+ */
+
+#include <post.h>
+#include <i2c.h>
+
+#if CONFIG_POST & CFG_POST_I2C
+
+int i2c_post_test (int flags)
+{
+       unsigned int i;
+       unsigned int good = 0;
+#ifdef I2C_ADDR_LIST
+       unsigned int bad  = 0;
+       int j;
+       unsigned char i2c_addr_list[] = I2C_ADDR_LIST;
+       unsigned char i2c_miss_list[] = I2C_ADDR_LIST;
+#endif
+
+       for (i = 0; i < 128; i++) {
+               if (i2c_probe (i) == 0) {
+#ifndef        I2C_ADDR_LIST
+                       good++;
+#else  /* I2C_ADDR_LIST */
+                       for (j=0; j<sizeof(i2c_addr_list); ++j) {
+                               if (i == i2c_addr_list[j]) {
+                                       good++;
+                                       i2c_miss_list[j] = 0xFF;
+                                       break;
+                               }
+                       }
+                       if (j == sizeof(i2c_addr_list)) {
+                               bad++;
+                               post_log ("I2C: addr %02X not expected\n",
+                                               i);
+                       }
+#endif /* I2C_ADDR_LIST */
+               }
+       }
+
+#ifndef        I2C_ADDR_LIST
+       return good > 0 ? 0 : -1;
+#else  /* I2C_ADDR_LIST */
+       if (good != sizeof(i2c_addr_list)) {
+               for (j=0; j<sizeof(i2c_miss_list); ++j) {
+                       if (i2c_miss_list[j] != 0xFF) {
+                               post_log ("I2C: addr %02X did not respond\n",
+                                               i2c_miss_list[j]);
+                       }
+               }
+       }
+       return ((good == sizeof(i2c_addr_list)) && (bad == 0)) ? 0 : -1;
+#endif
+}
+
+#endif /* CONFIG_POST & CFG_POST_I2C */
+#endif /* CONFIG_POST */
diff --git a/post/drivers/memory.c b/post/drivers/memory.c
new file mode 100644 (file)
index 0000000..a2c088b
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/* Memory test
+ *
+ * General observations:
+ * o The recommended test sequence is to test the data lines: if they are
+ *   broken, nothing else will work properly.  Then test the address
+ *   lines.  Finally, test the cells in the memory now that the test
+ *   program knows that the address and data lines work properly.
+ *   This sequence also helps isolate and identify what is faulty.
+ *
+ * o For the address line test, it is a good idea to use the base
+ *   address of the lowest memory location, which causes a '1' bit to
+ *   walk through a field of zeros on the address lines and the highest
+ *   memory location, which causes a '0' bit to walk through a field of
+ *   '1's on the address line.
+ *
+ * o Floating buses can fool memory tests if the test routine writes
+ *   a value and then reads it back immediately.  The problem is, the
+ *   write will charge the residual capacitance on the data bus so the
+ *   bus retains its state briefely.  When the test program reads the
+ *   value back immediately, the capacitance of the bus can allow it
+ *   to read back what was written, even though the memory circuitry
+ *   is broken.  To avoid this, the test program should write a test
+ *   pattern to the target location, write a different pattern elsewhere
+ *   to charge the residual capacitance in a differnt manner, then read
+ *   the target location back.
+ *
+ * o Always read the target location EXACTLY ONCE and save it in a local
+ *   variable.  The problem with reading the target location more than
+ *   once is that the second and subsequent reads may work properly,
+ *   resulting in a failed test that tells the poor technician that
+ *   "Memory error at 00000000, wrote aaaaaaaa, read aaaaaaaa" which
+ *   doesn't help him one bit and causes puzzled phone calls.  Been there,
+ *   done that.
+ *
+ * Data line test:
+ * ---------------
+ * This tests data lines for shorts and opens by forcing adjacent data
+ * to opposite states. Because the data lines could be routed in an
+ * arbitrary manner the must ensure test patterns ensure that every case
+ * is tested. By using the following series of binary patterns every
+ * combination of adjacent bits is test regardless of routing.
+ *
+ *     ...101010101010101010101010
+ *     ...110011001100110011001100
+ *     ...111100001111000011110000
+ *     ...111111110000000011111111
+ *
+ * Carrying this out, gives us six hex patterns as follows:
+ *
+ *     0xaaaaaaaaaaaaaaaa
+ *     0xcccccccccccccccc
+ *     0xf0f0f0f0f0f0f0f0
+ *     0xff00ff00ff00ff00
+ *     0xffff0000ffff0000
+ *     0xffffffff00000000
+ *
+ * To test for short and opens to other signals on our boards, we
+ * simply test with the 1's complemnt of the paterns as well, resulting
+ * in twelve patterns total.
+ *
+ * After writing a test pattern. a special pattern 0x0123456789ABCDEF is
+ * written to a different address in case the data lines are floating.
+ * Thus, if a byte lane fails, you will see part of the special
+ * pattern in that byte lane when the test runs.  For example, if the
+ * xx__xxxxxxxxxxxx byte line fails, you will see aa23aaaaaaaaaaaa
+ * (for the 'a' test pattern).
+ *
+ * Address line test:
+ * ------------------
+ *  This function performs a test to verify that all the address lines
+ *  hooked up to the RAM work properly.  If there is an address line
+ *  fault, it usually shows up as two different locations in the address
+ *  map (related by the faulty address line) mapping to one physical
+ *  memory storage location.  The artifact that shows up is writing to
+ *  the first location "changes" the second location.
+ *
+ * To test all address lines, we start with the given base address and
+ * xor the address with a '1' bit to flip one address line.  For each
+ * test, we shift the '1' bit left to test the next address line.
+ *
+ * In the actual code, we start with address sizeof(ulong) since our
+ * test pattern we use is a ulong and thus, if we tried to test lower
+ * order address bits, it wouldn't work because our pattern would
+ * overwrite itself.
+ *
+ * Example for a 4 bit address space with the base at 0000:
+ *   0000 <- base
+ *   0001 <- test 1
+ *   0010 <- test 2
+ *   0100 <- test 3
+ *   1000 <- test 4
+ * Example for a 4 bit address space with the base at 0010:
+ *   0010 <- base
+ *   0011 <- test 1
+ *   0000 <- (below the base address, skipped)
+ *   0110 <- test 2
+ *   1010 <- test 3
+ *
+ * The test locations are successively tested to make sure that they are
+ * not "mirrored" onto the base address due to a faulty address line.
+ * Note that the base and each test location are related by one address
+ * line flipped.  Note that the base address need not be all zeros.
+ *
+ * Memory tests 1-4:
+ * -----------------
+ * These tests verify RAM using sequential writes and reads
+ * to/from RAM. There are several test cases that use different patterns to
+ * verify RAM. Each test case fills a region of RAM with one pattern and
+ * then reads the region back and compares its contents with the pattern.
+ * The following patterns are used:
+ *
+ *  1a) zero pattern (0x00000000)
+ *  1b) negative pattern (0xffffffff)
+ *  1c) checkerboard pattern (0x55555555)
+ *  1d) checkerboard pattern (0xaaaaaaaa)
+ *  2)  bit-flip pattern ((1 << (offset % 32))
+ *  3)  address pattern (offset)
+ *  4)  address pattern (~offset)
+ *
+ * Being run in normal mode, the test verifies only small 4Kb
+ * regions of RAM around each 1Mb boundary. For example, for 64Mb
+ * RAM the following areas are verified: 0x00000000-0x00000800,
+ * 0x000ff800-0x00100800, 0x001ff800-0x00200800, ..., 0x03fff800-
+ * 0x04000000. If the test is run in slow-test mode, it verifies
+ * the whole RAM.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <watchdog.h>
+
+#if CONFIG_POST & CFG_POST_MEMORY
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Define INJECT_*_ERRORS for testing error detection in the presence of
+ * _good_ hardware.
+ */
+#undef  INJECT_DATA_ERRORS
+#undef  INJECT_ADDRESS_ERRORS
+
+#ifdef INJECT_DATA_ERRORS
+#warning "Injecting data line errors for testing purposes"
+#endif
+
+#ifdef INJECT_ADDRESS_ERRORS
+#warning "Injecting address line errors for testing purposes"
+#endif
+
+
+/*
+ * This function performs a double word move from the data at
+ * the source pointer to the location at the destination pointer.
+ * This is helpful for testing memory on processors which have a 64 bit
+ * wide data bus.
+ *
+ * On those PowerPC with FPU, use assembly and a floating point move:
+ * this does a 64 bit move.
+ *
+ * For other processors, let the compiler generate the best code it can.
+ */
+static void move64(unsigned long long *src, unsigned long long *dest)
+{
+#if defined(CONFIG_MPC8260) || defined(CONFIG_MPC824X)
+       asm ("lfd  0, 0(3)\n\t" /* fpr0   =  *scr       */
+        "stfd 0, 0(4)"         /* *dest  =  fpr0       */
+        : : : "fr0" );         /* Clobbers fr0         */
+    return;
+#else
+       *dest = *src;
+#endif
+}
+
+/*
+ * This is 64 bit wide test patterns.  Note that they reside in ROM
+ * (which presumably works) and the tests write them to RAM which may
+ * not work.
+ *
+ * The "otherpattern" is written to drive the data bus to values other
+ * than the test pattern.  This is for detecting floating bus lines.
+ *
+ */
+const static unsigned long long pattern[] = {
+       0xaaaaaaaaaaaaaaaaULL,
+       0xccccccccccccccccULL,
+       0xf0f0f0f0f0f0f0f0ULL,
+       0xff00ff00ff00ff00ULL,
+       0xffff0000ffff0000ULL,
+       0xffffffff00000000ULL,
+       0x00000000ffffffffULL,
+       0x0000ffff0000ffffULL,
+       0x00ff00ff00ff00ffULL,
+       0x0f0f0f0f0f0f0f0fULL,
+       0x3333333333333333ULL,
+       0x5555555555555555ULL
+};
+const unsigned long long otherpattern = 0x0123456789abcdefULL;
+
+
+static int memory_post_dataline(unsigned long long * pmem)
+{
+       unsigned long long temp64 = 0;
+       int num_patterns = sizeof(pattern)/ sizeof(pattern[0]);
+       int i;
+       unsigned int hi, lo, pathi, patlo;
+       int ret = 0;
+
+       for ( i = 0; i < num_patterns; i++) {
+               move64((unsigned long long *)&(pattern[i]), pmem++);
+               /*
+                * Put a different pattern on the data lines: otherwise they
+                * may float long enough to read back what we wrote.
+                */
+               move64((unsigned long long *)&otherpattern, pmem--);
+               move64(pmem, &temp64);
+
+#ifdef INJECT_DATA_ERRORS
+               temp64 ^= 0x00008000;
+#endif
+
+               if (temp64 != pattern[i]){
+                       pathi = (pattern[i]>>32) & 0xffffffff;
+                       patlo = pattern[i] & 0xffffffff;
+
+                       hi = (temp64>>32) & 0xffffffff;
+                       lo = temp64 & 0xffffffff;
+
+                       post_log ("Memory (date line) error at %08x, "
+                                 "wrote %08x%08x, read %08x%08x !\n",
+                                         pmem, pathi, patlo, hi, lo);
+                       ret = -1;
+               }
+       }
+       return ret;
+}
+
+static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size)
+{
+       ulong *target;
+       ulong *end;
+       ulong readback;
+       ulong xor;
+       int   ret = 0;
+
+       end = (ulong *)((ulong)base + size);    /* pointer arith! */
+       xor = 0;
+       for(xor = sizeof(ulong); xor > 0; xor <<= 1) {
+               target = (ulong *)((ulong)testaddr ^ xor);
+               if((target >= base) && (target < end)) {
+                       *testaddr = ~*target;
+                       readback  = *target;
+
+#ifdef INJECT_ADDRESS_ERRORS
+                       if(xor == 0x00008000) {
+                               readback = *testaddr;
+                       }
+#endif
+                       if(readback == *testaddr) {
+                               post_log ("Memory (address line) error at %08x<->%08x, "
+                                       "XOR value %08x !\n",
+                                       testaddr, target, xor);
+                               ret = -1;
+                       }
+               }
+       }
+       return ret;
+}
+
+static int memory_post_test1 (unsigned long start,
+                             unsigned long size,
+                             unsigned long val)
+{
+       unsigned long i;
+       ulong *mem = (ulong *) start;
+       ulong readback;
+       int ret = 0;
+
+       for (i = 0; i < size / sizeof (ulong); i++) {
+               mem[i] = val;
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {
+               readback = mem[i];
+               if (readback != val) {
+                       post_log ("Memory error at %08x, "
+                                 "wrote %08x, read %08x !\n",
+                                         mem + i, val, readback);
+
+                       ret = -1;
+                       break;
+               }
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       return ret;
+}
+
+static int memory_post_test2 (unsigned long start, unsigned long size)
+{
+       unsigned long i;
+       ulong *mem = (ulong *) start;
+       ulong readback;
+       int ret = 0;
+
+       for (i = 0; i < size / sizeof (ulong); i++) {
+               mem[i] = 1 << (i % 32);
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {
+               readback = mem[i];
+               if (readback != (1 << (i % 32))) {
+                       post_log ("Memory error at %08x, "
+                                 "wrote %08x, read %08x !\n",
+                                         mem + i, 1 << (i % 32), readback);
+
+                       ret = -1;
+                       break;
+               }
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       return ret;
+}
+
+static int memory_post_test3 (unsigned long start, unsigned long size)
+{
+       unsigned long i;
+       ulong *mem = (ulong *) start;
+       ulong readback;
+       int ret = 0;
+
+       for (i = 0; i < size / sizeof (ulong); i++) {
+               mem[i] = i;
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {
+               readback = mem[i];
+               if (readback != i) {
+                       post_log ("Memory error at %08x, "
+                                 "wrote %08x, read %08x !\n",
+                                         mem + i, i, readback);
+
+                       ret = -1;
+                       break;
+               }
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       return ret;
+}
+
+static int memory_post_test4 (unsigned long start, unsigned long size)
+{
+       unsigned long i;
+       ulong *mem = (ulong *) start;
+       ulong readback;
+       int ret = 0;
+
+       for (i = 0; i < size / sizeof (ulong); i++) {
+               mem[i] = ~i;
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) {
+               readback = mem[i];
+               if (readback != ~i) {
+                       post_log ("Memory error at %08x, "
+                                 "wrote %08x, read %08x !\n",
+                                         mem + i, ~i, readback);
+
+                       ret = -1;
+                       break;
+               }
+               if (i % 1024 == 0)
+                       WATCHDOG_RESET ();
+       }
+
+       return ret;
+}
+
+static int memory_post_tests (unsigned long start, unsigned long size)
+{
+       int ret = 0;
+
+       if (ret == 0)
+               ret = memory_post_dataline ((unsigned long long *)start);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_addrline ((ulong *)start, (ulong *)start, size);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_addrline ((ulong *)(start + size - 8),
+                                           (ulong *)start, size);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test1 (start, size, 0x00000000);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test1 (start, size, 0xffffffff);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test1 (start, size, 0x55555555);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test1 (start, size, 0xaaaaaaaa);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test2 (start, size);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test3 (start, size);
+       WATCHDOG_RESET ();
+       if (ret == 0)
+               ret = memory_post_test4 (start, size);
+       WATCHDOG_RESET ();
+
+       return ret;
+}
+
+int memory_post_test (int flags)
+{
+       int ret = 0;
+       bd_t *bd = gd->bd;
+       unsigned long memsize = (bd->bi_memsize >= 256 << 20 ?
+                                256 << 20 : bd->bi_memsize) - (1 << 20);
+
+
+       if (flags & POST_SLOWTEST) {
+               ret = memory_post_tests (CFG_SDRAM_BASE, memsize);
+       } else {                        /* POST_NORMAL */
+
+               unsigned long i;
+
+               for (i = 0; i < (memsize >> 20) && ret == 0; i++) {
+                       if (ret == 0)
+                               ret = memory_post_tests (i << 20, 0x800);
+                       if (ret == 0)
+                               ret = memory_post_tests ((i << 20) + 0xff800, 0x800);
+               }
+       }
+
+       return ret;
+}
+
+#endif /* CONFIG_POST & CFG_POST_MEMORY */
+#endif /* CONFIG_POST */
diff --git a/post/drivers/rtc.c b/post/drivers/rtc.c
new file mode 100644 (file)
index 0000000..7d4f9b8
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * RTC test
+ *
+ * The Real Time Clock (RTC) operation is verified by this test.
+ * The following features are verified:
+ *   o) Time uniformity
+ *      This is verified by reading RTC in polling within
+ *      a short period of time.
+ *   o) Passing month boundaries
+ *      This is checked by setting RTC to a second before
+ *      a month boundary and reading it after its passing the
+ *      boundary. The test is performed for both leap- and
+ *      nonleap-years.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <rtc.h>
+
+#if CONFIG_POST & CFG_POST_RTC
+
+static int rtc_post_skip (ulong * diff)
+{
+       struct rtc_time tm1;
+       struct rtc_time tm2;
+       ulong start1;
+       ulong start2;
+
+       rtc_get (&tm1);
+       start1 = get_timer (0);
+
+       while (1) {
+               rtc_get (&tm2);
+               start2 = get_timer (0);
+               if (tm1.tm_sec != tm2.tm_sec)
+                       break;
+               if (start2 - start1 > 1500)
+                       break;
+       }
+
+       if (tm1.tm_sec != tm2.tm_sec) {
+               *diff = start2 - start1;
+
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+static void rtc_post_restore (struct rtc_time *tm, unsigned int sec)
+{
+       time_t t = mktime (tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour,
+                                          tm->tm_min, tm->tm_sec) + sec;
+       struct rtc_time ntm;
+
+       to_tm (t, &ntm);
+
+       rtc_set (&ntm);
+}
+
+int rtc_post_test (int flags)
+{
+       ulong diff;
+       unsigned int i;
+       struct rtc_time svtm;
+       static unsigned int daysnl[] =
+                       { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+       static unsigned int daysl[] =
+                       { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+       unsigned int ynl = 1999;
+       unsigned int yl = 2000;
+       unsigned int skipped = 0;
+
+       /* Time uniformity */
+       if (rtc_post_skip (&diff) != 0) {
+               post_log ("Timeout while waiting for a new second !\n");
+
+               return -1;
+       }
+
+       for (i = 0; i < 5; i++) {
+               if (rtc_post_skip (&diff) != 0) {
+                       post_log ("Timeout while waiting for a new second !\n");
+
+                       return -1;
+               }
+
+               if (diff < 950 || diff > 1050) {
+                       post_log ("Invalid second duration !\n");
+
+                       return -1;
+               }
+       }
+
+       /* Passing month boundaries */
+
+       if (rtc_post_skip (&diff) != 0) {
+               post_log ("Timeout while waiting for a new second !\n");
+
+               return -1;
+       }
+       rtc_get (&svtm);
+
+       for (i = 0; i < 12; i++) {
+               time_t t = mktime (ynl, i + 1, daysnl[i], 23, 59, 59);
+               struct rtc_time tm;
+
+               to_tm (t, &tm);
+               rtc_set (&tm);
+
+               skipped++;
+               if (rtc_post_skip (&diff) != 0) {
+                       rtc_post_restore (&svtm, skipped);
+                       post_log ("Timeout while waiting for a new second !\n");
+
+                       return -1;
+               }
+
+               rtc_get (&tm);
+               if (tm.tm_mon == i + 1) {
+                       rtc_post_restore (&svtm, skipped);
+                       post_log ("Month %d boundary is not passed !\n", i + 1);
+
+                       return -1;
+               }
+       }
+
+       for (i = 0; i < 12; i++) {
+               time_t t = mktime (yl, i + 1, daysl[i], 23, 59, 59);
+               struct rtc_time tm;
+
+               to_tm (t, &tm);
+               rtc_set (&tm);
+
+               skipped++;
+               if (rtc_post_skip (&diff) != 0) {
+                       rtc_post_restore (&svtm, skipped);
+                       post_log ("Timeout while waiting for a new second !\n");
+
+                       return -1;
+               }
+
+               rtc_get (&tm);
+               if (tm.tm_mon == i + 1) {
+                       rtc_post_restore (&svtm, skipped);
+                       post_log ("Month %d boundary is not passed !\n", i + 1);
+
+                       return -1;
+               }
+       }
+       rtc_post_restore (&svtm, skipped);
+
+       return 0;
+}
+
+#endif /* CONFIG_POST & CFG_POST_RTC */
+#endif /* CONFIG_POST */
diff --git a/post/lib_ppc/Makefile b/post/lib_ppc/Makefile
new file mode 100644 (file)
index 0000000..14354a0
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# (C) Copyright 2002-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
+#
+
+
+LIB    = libpostppc.a
+
+AOBJS  = asm.o
+COBJS  = cpu.o cmp.o cmpi.o two.o twox.o three.o threex.o
+COBJS   += threei.o andi.o srawi.o rlwnm.o rlwinm.o rlwimi.o
+COBJS  += store.o load.o cr.o b.o multi.o string.o complex.o
+
+include $(TOPDIR)/post/rules.mk
diff --git a/post/lib_ppc/andi.c b/post/lib_ppc/andi.c
new file mode 100644 (file)
index 0000000..7ddf2ab
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Logic instructions:         andi., andis.
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_andi_s
+{
+    ulong cmd;
+    ulong op1;
+    ushort op2;
+    ulong res;
+} cpu_post_andi_table[] =
+{
+    {
+       OP_ANDI_,
+       0x80008000,
+       0xffff,
+       0x00008000
+    },
+    {
+       OP_ANDIS_,
+       0x80008000,
+       0xffff,
+       0x80000000
+    },
+};
+static unsigned int cpu_post_andi_size =
+    sizeof (cpu_post_andi_table) / sizeof (struct cpu_post_andi_s);
+
+int cpu_post_test_andi (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_andi_size && ret == 0; i++)
+    {
+       struct cpu_post_andi_s *test = cpu_post_andi_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11IX(test->cmd, reg1, reg0, test->op2),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           cpu_post_exec_21 (codecr, & cr, & res, test->op1);
+
+           ret = res == test->res &&
+                 (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+           if (ret != 0)
+           {
+               post_log ("Error at andi test %d !\n", i);
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/asm.S b/post/lib_ppc/asm.S
new file mode 100644 (file)
index 0000000..a0815a4
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ *  Copyright (C) 2002 Wolfgang Denk <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 <config.h>
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+
+#if CONFIG_POST & CFG_POST_CPU
+
+/* void cpu_post_exec_02 (ulong *code, ulong op1, ulong op2); */
+       .global cpu_post_exec_02
+cpu_post_exec_02:
+       mflr    r0
+       stwu    r0, -4(r1)
+
+       subi    r1, r1, 104
+       stmw    r6, 0(r1)
+
+       mtlr    r3
+       mr      r3, r4
+       mr      r4, r5
+       blrl
+
+       lmw     r6, 0(r1)
+       addi    r1, r1, 104
+
+       lwz     r0, 0(r1)
+       addi    r1, r1, 4
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_04 (ulong *code, ulong op1, ulong op2, ulong op3, ulong op4); */
+       .global cpu_post_exec_04
+cpu_post_exec_04:
+       mflr    r0
+       stwu    r0, -4(r1)
+
+       subi    r1, r1, 96
+       stmw    r8, 0(r1)
+
+       mtlr    r3
+       mr      r3, r4
+       mr      r4, r5
+       mr      r5, r6
+       mtxer   r7
+       blrl
+
+       lmw     r8, 0(r1)
+       addi    r1, r1, 96
+
+       lwz     r0, 0(r1)
+       addi    r1, r1, 4
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_12 (ulong *code, ulong *res, ulong op1, ulong op2); */
+       .global cpu_post_exec_12
+cpu_post_exec_12:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+
+       mtlr    r3
+       mr      r3, r5
+       mr      r4, r6
+       blrl
+
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 4(r1)
+       addi    r1, r1, 8
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1); */
+       .global cpu_post_exec_11
+cpu_post_exec_11:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+
+       mtlr    r3
+       mr      r3, r5
+       blrl
+
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 4(r1)
+       addi    r1, r1, 8
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op1); */
+       .global cpu_post_exec_21
+cpu_post_exec_21:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r5, -4(r1)
+
+       li      r0, 0
+       mtxer   r0
+       lwz     r0, 0(r4)
+       mtcr    r0
+
+       mtlr    r3
+       mr      r3, r6
+       blrl
+
+       mfcr    r0
+       lwz     r4, 4(r1)
+       stw     r0, 0(r4)
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 8(r1)
+       addi    r1, r1, 12
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
+    ulong op2); */
+       .global cpu_post_exec_22
+cpu_post_exec_22:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r5, -4(r1)
+
+       li      r0, 0
+       mtxer   r0
+       lwz     r0, 0(r4)
+       mtcr    r0
+
+       mtlr    r3
+       mr      r3, r6
+       mr      r4, r7
+       blrl
+
+       mfcr    r0
+       lwz     r4, 4(r1)
+       stw     r0, 0(r4)
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 8(r1)
+       addi    r1, r1, 12
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_12w (ulong *code, ulong *op1, ulong op2, ulong op3); */
+       .global cpu_post_exec_12w
+cpu_post_exec_12w:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+
+       mtlr    r3
+       lwz     r3, 0(r4)
+       mr      r4, r5
+       mr      r5, r6
+       blrl
+
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 4(r1)
+       addi    r1, r1, 8
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_11w (ulong *code, ulong *op1, ulong op2); */
+       .global cpu_post_exec_11w
+cpu_post_exec_11w:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+
+       mtlr    r3
+       lwz     r3, 0(r4)
+       mr      r4, r5
+       blrl
+
+       lwz     r4, 0(r1)
+       stw     r3, 0(r4)
+
+       lwz     r0, 4(r1)
+       addi    r1, r1, 8
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_22w (ulong *code, ulong *op1, ulong op2, ulong *op3); */
+       .global cpu_post_exec_22w
+cpu_post_exec_22w:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r6, -4(r1)
+
+       mtlr    r3
+       lwz     r3, 0(r4)
+       mr      r4, r5
+       blrl
+
+       lwz     r4, 4(r1)
+       stw     r3, 0(r4)
+       lwz     r4, 0(r1)
+       stw     r5, 0(r4)
+
+       lwz     r0, 8(r1)
+       addi    r1, r1, 12
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_21w (ulong *code, ulong *op1, ulong *op2); */
+       .global cpu_post_exec_21w
+cpu_post_exec_21w:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r5, -4(r1)
+
+       mtlr    r3
+       lwz     r3, 0(r4)
+       blrl
+
+       lwz     r5, 4(r1)
+       stw     r3, 0(r5)
+       lwz     r5, 0(r1)
+       stw     r4, 0(r5)
+
+       lwz     r0, 8(r1)
+       addi    r1, r1, 12
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_21x (ulong *code, ulong *op1, ulong *op2, ulong op3); */
+       .global cpu_post_exec_21x
+cpu_post_exec_21x:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r5, -4(r1)
+
+       mtlr    r3
+       mr      r3, r6
+       blrl
+
+       lwz     r5, 4(r1)
+       stw     r3, 0(r5)
+       lwz     r5, 0(r1)
+       stw     r4, 0(r5)
+
+       lwz     r0, 8(r1)
+       addi    r1, r1, 12
+       mtlr    r0
+       blr
+
+/* void cpu_post_exec_31 (ulong *code, ulong *ctr, ulong *lr, ulong *jump,
+    ulong cr); */
+       .global cpu_post_exec_31
+cpu_post_exec_31:
+       mflr    r0
+       stwu    r0, -4(r1)
+       stwu    r4, -4(r1)
+       stwu    r5, -4(r1)
+       stwu    r6, -4(r1)
+
+       mtlr    r3
+       lwz     r3, 0(r4)
+       lwz     r4, 0(r5)
+       mr      r6, r7
+       blrl
+
+       lwz     r7, 8(r1)
+       stw     r3, 0(r7)
+       lwz     r7, 4(r1)
+       stw     r4, 0(r7)
+       lwz     r7, 0(r1)
+       stw     r5, 0(r7)
+
+       lwz     r0, 12(r1)
+       addi    r1, r1, 16
+       mtlr    r0
+       blr
+
+/* int cpu_post_complex_1_asm (int a1, int a2, int a3, int a4, int n); */
+       .global cpu_post_complex_1_asm
+cpu_post_complex_1_asm:
+       li      r9,0
+       cmpw    r9,r7
+       bge     cpu_post_complex_1_done
+       mtctr   r7
+cpu_post_complex_1_loop:
+       mullw   r0,r3,r4
+       subf    r0,r5,r0
+       divw    r0,r0,r6
+       add     r9,r9,r0
+       bdnz    cpu_post_complex_1_loop
+cpu_post_complex_1_done:
+       mr      r3,r9
+       blr
+
+/* int cpu_post_complex_2_asm (int x, int n); */
+       .global cpu_post_complex_2_asm
+cpu_post_complex_2_asm:
+       mr.     r0,r4
+       mtctr   r0
+       mr      r0,r3
+       li      r3,1
+       li      r4,1
+       blelr
+cpu_post_complex_2_loop:
+       mullw   r3,r3,r0
+       add     r3,r3,r4
+       bdnz    cpu_post_complex_2_loop
+blr
+
+#endif
+#endif
diff --git a/post/lib_ppc/b.c b/post/lib_ppc/b.c
new file mode 100644 (file)
index 0000000..b4b17c8
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Branch instructions:                b, bl, bc
+ *
+ * The first 2 instructions (b, bl) are verified by jumping
+ * to a fixed address and checking whether control was transfered
+ * to that very point. For the bl instruction the value of the
+ * link register is checked as well (using mfspr).
+ * To verify the bc instruction various combinations of the BI/BO
+ * fields, the CTR and the condition register values are
+ * checked. The list of such combinations is pre-built and
+ * linked in U-Boot at build time.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1);
+extern void cpu_post_exec_31 (ulong *code, ulong *ctr, ulong *lr, ulong *jump,
+    ulong cr);
+
+static int cpu_post_test_bc (ulong cmd, ulong bo, ulong bi,
+    int pjump, int dec, int link, ulong pctr, ulong cr)
+{
+    int ret = 0;
+    ulong lr = 0;
+    ulong ctr = pctr;
+    ulong jump;
+
+    unsigned long code[] =
+    {
+       ASM_MTCR(6),
+       ASM_MFLR(6),
+       ASM_MTCTR(3),
+       ASM_MTLR(4),
+       ASM_LI(5, 1),
+       ASM_3O(cmd, bo, bi, 8),
+       ASM_LI(5, 0),
+       ASM_MFCTR(3),
+       ASM_MFLR(4),
+       ASM_MTLR(6),
+       ASM_BLR,
+    };
+
+    cpu_post_exec_31 (code, &ctr, &lr, &jump, cr);
+
+    if (ret == 0)
+       ret = pjump == jump ? 0 : -1;
+    if (ret == 0)
+    {
+       if (dec)
+           ret = pctr == ctr + 1 ? 0 : -1;
+       else
+           ret = pctr == ctr ? 0 : -1;
+    }
+    if (ret == 0)
+    {
+       if (link)
+           ret = lr == (ulong) code + 24 ? 0 : -1;
+       else
+           ret = lr == 0 ? 0 : -1;
+    }
+
+    return ret;
+}
+
+int cpu_post_test_b (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    if (ret == 0)
+    {
+       ulong code[] =
+       {
+          ASM_MFLR(4),
+          ASM_MTLR(3),
+          ASM_B(4),
+          ASM_MFLR(3),
+          ASM_MTLR(4),
+          ASM_BLR,
+       };
+       ulong res;
+
+       cpu_post_exec_11 (code, &res, 0);
+
+       ret = res == 0 ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at b1 test !\n");
+       }
+    }
+
+    if (ret == 0)
+    {
+       ulong code[] =
+       {
+          ASM_MFLR(4),
+          ASM_MTLR(3),
+          ASM_BL(4),
+          ASM_MFLR(3),
+          ASM_MTLR(4),
+          ASM_BLR,
+       };
+       ulong res;
+
+       cpu_post_exec_11 (code, &res, 0);
+
+       ret = res == (ulong)code + 12 ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at b2 test !\n");
+       }
+    }
+
+    if (ret == 0)
+    {
+       ulong cc, cd;
+       int cond;
+       ulong ctr;
+       int link;
+
+       i = 0;
+
+       for (cc = 0; cc < 4 && ret == 0; cc++)
+       {
+           for (cd = 0; cd < 4 && ret == 0; cd++)
+           {
+               for (link = 0; link <= 1 && ret == 0; link++)
+               {
+                   for (cond = 0; cond <= 1 && ret == 0; cond++)
+                   {
+                       for (ctr = 1; ctr <= 2 && ret == 0; ctr++)
+                       {
+                           int dec = cd < 2;
+                           int cr = cond ? 0x80000000 : 0x00000000;
+                           int jumpc = cc >= 2 ||
+                                       (cc == 0 && !cond) ||
+                                       (cc == 1 && cond);
+                           int jumpd = cd >= 2 ||
+                                       (cd == 0 && ctr != 1) ||
+                                       (cd == 1 && ctr == 1);
+                           int jump = jumpc && jumpd;
+
+                           ret = cpu_post_test_bc (link ? OP_BCL : OP_BC,
+                               (cc << 3) + (cd << 1), 0, jump, dec, link,
+                               ctr, cr);
+
+                           if (ret != 0)
+                           {
+                               post_log ("Error at b3 test %d !\n", i);
+                           }
+
+                           i++;
+                       }
+                   }
+               }
+           }
+       }
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/cmp.c b/post/lib_ppc/cmp.c
new file mode 100644 (file)
index 0000000..789a24c
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Integer compare instructions:       cmpw, cmplw
+ *
+ * To verify these instructions the test runs them with
+ * different combinations of operands, reads the condition
+ * register value and compares it with the expected one.
+ * The test contains a pre-built table
+ * containing the description of each test case: the instruction,
+ * the values of the operands, the condition field to save
+ * the result in and the expected result.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_12 (ulong *code, ulong *res, ulong op1, ulong op2);
+
+static struct cpu_post_cmp_s
+{
+    ulong cmd;
+    ulong op1;
+    ulong op2;
+    ulong cr;
+    ulong res;
+} cpu_post_cmp_table[] =
+{
+    {
+       OP_CMPW,
+       123,
+       123,
+       2,
+       0x02
+    },
+    {
+       OP_CMPW,
+       123,
+       133,
+       3,
+       0x08
+    },
+    {
+       OP_CMPW,
+       123,
+       -133,
+       4,
+       0x04
+    },
+    {
+       OP_CMPLW,
+       123,
+       123,
+       2,
+       0x02
+    },
+    {
+       OP_CMPLW,
+       123,
+       -133,
+       3,
+       0x08
+    },
+    {
+       OP_CMPLW,
+       123,
+       113,
+       4,
+       0x04
+    },
+};
+static unsigned int cpu_post_cmp_size =
+    sizeof (cpu_post_cmp_table) / sizeof (struct cpu_post_cmp_s);
+
+int cpu_post_test_cmp (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    for (i = 0; i < cpu_post_cmp_size && ret == 0; i++)
+    {
+       struct cpu_post_cmp_s *test = cpu_post_cmp_table + i;
+       unsigned long code[] =
+       {
+           ASM_2C(test->cmd, test->cr, 3, 4),
+           ASM_MFCR(3),
+           ASM_BLR
+       };
+       ulong res;
+
+       cpu_post_exec_12 (code, & res, test->op1, test->op2);
+
+       ret = ((res >> (28 - 4 * test->cr)) & 0xe) == test->res ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cmp test %d !\n", i);
+       }
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/cmpi.c b/post/lib_ppc/cmpi.c
new file mode 100644 (file)
index 0000000..e0c2aaf
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Integer compare instructions:       cmpwi, cmplwi
+ *
+ * To verify these instructions the test runs them with
+ * different combinations of operands, reads the condition
+ * register value and compares it with the expected one.
+ * The test contains a pre-built table
+ * containing the description of each test case: the instruction,
+ * the values of the operands, the condition field to save
+ * the result in and the expected result.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1);
+
+static struct cpu_post_cmpi_s
+{
+    ulong cmd;
+    ulong op1;
+    ushort op2;
+    ulong cr;
+    ulong res;
+} cpu_post_cmpi_table[] =
+{
+    {
+       OP_CMPWI,
+       123,
+       123,
+       2,
+       0x02
+    },
+    {
+       OP_CMPWI,
+       123,
+       133,
+       3,
+       0x08
+    },
+    {
+       OP_CMPWI,
+       123,
+       -133,
+       4,
+       0x04
+    },
+    {
+       OP_CMPLWI,
+       123,
+       123,
+       2,
+       0x02
+    },
+    {
+       OP_CMPLWI,
+       123,
+       -133,
+       3,
+       0x08
+    },
+    {
+       OP_CMPLWI,
+       123,
+       113,
+       4,
+       0x04
+    },
+};
+static unsigned int cpu_post_cmpi_size =
+    sizeof (cpu_post_cmpi_table) / sizeof (struct cpu_post_cmpi_s);
+
+int cpu_post_test_cmpi (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    for (i = 0; i < cpu_post_cmpi_size && ret == 0; i++)
+    {
+       struct cpu_post_cmpi_s *test = cpu_post_cmpi_table + i;
+       unsigned long code[] =
+       {
+           ASM_1IC(test->cmd, test->cr, 3, test->op2),
+           ASM_MFCR(3),
+           ASM_BLR
+       };
+       ulong res;
+
+       cpu_post_exec_11 (code, & res, test->op1);
+
+       ret = ((res >> (28 - 4 * test->cr)) & 0xe) == test->res ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cmpi test %d !\n", i);
+       }
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/complex.c b/post/lib_ppc/complex.c
new file mode 100644 (file)
index 0000000..033584b
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Complex calculations
+ *
+ * The calculations in this test are just a combination of simpler
+ * calculations, but probably under different timing conditions, etc.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern int cpu_post_complex_1_asm (int a1, int a2, int a3, int a4, int n);
+extern int cpu_post_complex_2_asm (int x, int n);
+
+  /*
+   *     n
+   *   SUM (a1 * a2 - a3) / a4 = n * result
+   *    i=1
+   */
+static int cpu_post_test_complex_1 (void)
+{
+    int a1 = 666;
+    int a2 = 667;
+    int a3 = 668;
+    int a4 = 66;
+    int n = 100;
+    int result = 6720; /* (a1 * a2 - a3) / a4 */
+
+    if (cpu_post_complex_1_asm(a1, a2, a3, a4, n) != n * result)
+    {
+       return -1;
+    }
+
+    return 0;
+}
+
+  /*   (1 + x + x^2 + ... + x^n) * (1 - x) = 1 - x^(n+1)
+   */
+static int cpu_post_test_complex_2 (void)
+{
+    int ret = -1;
+    int x;
+    int n;
+    int k;
+    int left;
+    int right;
+
+    for (x = -8; x <= 8; x ++)
+    {
+       n = 9;
+
+       left = cpu_post_complex_2_asm(x, n);
+       left *= 1 - x;
+
+       right = 1;
+       for (k = 0; k <= n; k ++)
+       {
+           right *= x;
+       }
+       right = 1 - right;
+
+       if (left != right)
+       {
+           goto Done;
+       }
+    }
+
+    ret = 0;
+    Done:
+
+    return ret;
+}
+
+int cpu_post_test_complex (void)
+{
+    int ret = 0;
+
+    if (ret == 0)
+    {
+       ret = cpu_post_test_complex_1();
+    }
+
+    if (ret == 0)
+    {
+       ret = cpu_post_test_complex_2();
+    }
+
+    if (ret != 0)
+    {
+       post_log ("Error at complex test !\n");
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/cpu.c b/post/lib_ppc/cpu.c
new file mode 100644 (file)
index 0000000..1f2ded2
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ *
+ * This test checks the arithmetic logic unit (ALU) of CPU.
+ * It tests independently various groups of instructions using
+ * run-time modification of the code to reduce the memory footprint.
+ * For more details refer to post/cpu/ *.c files.
+ */
+
+#ifdef CONFIG_POST
+
+#include <watchdog.h>
+#include <post.h>
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern int cpu_post_test_cmp (void);
+extern int cpu_post_test_cmpi (void);
+extern int cpu_post_test_two (void);
+extern int cpu_post_test_twox (void);
+extern int cpu_post_test_three (void);
+extern int cpu_post_test_threex (void);
+extern int cpu_post_test_threei (void);
+extern int cpu_post_test_andi (void);
+extern int cpu_post_test_srawi (void);
+extern int cpu_post_test_rlwnm (void);
+extern int cpu_post_test_rlwinm (void);
+extern int cpu_post_test_rlwimi (void);
+extern int cpu_post_test_store (void);
+extern int cpu_post_test_load (void);
+extern int cpu_post_test_cr (void);
+extern int cpu_post_test_b (void);
+extern int cpu_post_test_multi (void);
+extern int cpu_post_test_string (void);
+extern int cpu_post_test_complex (void);
+
+ulong cpu_post_makecr (long v)
+{
+       ulong cr = 0;
+
+       if (v < 0)
+               cr |= 0x80000000;
+       if (v > 0)
+               cr |= 0x40000000;
+       if (v == 0)
+               cr |= 0x20000000;
+
+       return cr;
+}
+
+int cpu_post_test (int flags)
+{
+       int ic = icache_status ();
+       int ret = 0;
+
+       WATCHDOG_RESET();
+       if (ic)
+               icache_disable ();
+
+       if (ret == 0)
+               ret = cpu_post_test_cmp ();
+       if (ret == 0)
+               ret = cpu_post_test_cmpi ();
+       if (ret == 0)
+               ret = cpu_post_test_two ();
+       if (ret == 0)
+               ret = cpu_post_test_twox ();
+       WATCHDOG_RESET();
+       if (ret == 0)
+               ret = cpu_post_test_three ();
+       if (ret == 0)
+               ret = cpu_post_test_threex ();
+       if (ret == 0)
+               ret = cpu_post_test_threei ();
+       if (ret == 0)
+               ret = cpu_post_test_andi ();
+       WATCHDOG_RESET();
+       if (ret == 0)
+               ret = cpu_post_test_srawi ();
+       if (ret == 0)
+               ret = cpu_post_test_rlwnm ();
+       if (ret == 0)
+               ret = cpu_post_test_rlwinm ();
+       if (ret == 0)
+               ret = cpu_post_test_rlwimi ();
+       WATCHDOG_RESET();
+       if (ret == 0)
+               ret = cpu_post_test_store ();
+       if (ret == 0)
+               ret = cpu_post_test_load ();
+       if (ret == 0)
+               ret = cpu_post_test_cr ();
+       if (ret == 0)
+               ret = cpu_post_test_b ();
+       WATCHDOG_RESET();
+       if (ret == 0)
+               ret = cpu_post_test_multi ();
+       WATCHDOG_RESET();
+       if (ret == 0)
+               ret = cpu_post_test_string ();
+       if (ret == 0)
+               ret = cpu_post_test_complex ();
+       WATCHDOG_RESET();
+
+       if (ic)
+               icache_enable ();
+
+       WATCHDOG_RESET();
+
+       return ret;
+}
+
+#endif /* CONFIG_POST & CFG_POST_CPU */
+#endif /* CONFIG_POST */
diff --git a/post/lib_ppc/cpu_asm.h b/post/lib_ppc/cpu_asm.h
new file mode 100644 (file)
index 0000000..1cbaf41
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * (C) Copyright 2002
+ * 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
+ */
+#ifndef _CPU_ASM_H
+#define _CPU_ASM_H
+
+#define BIT_C                          0x00000001
+
+#define OP_BLR                         0x4e800020
+#define OP_EXTSB                       0x7c000774
+#define OP_EXTSH                       0x7c000734
+#define OP_NEG                         0x7c0000d0
+#define OP_CNTLZW                      0x7c000034
+#define OP_ADD                         0x7c000214
+#define OP_ADDC                                0x7c000014
+#define OP_ADDME                       0x7c0001d4
+#define OP_ADDZE                       0x7c000194
+#define OP_ADDE                                0x7c000114
+#define OP_ADDI                                0x38000000
+#define OP_SUBF                                0x7c000050
+#define OP_SUBFC                       0x7c000010
+#define OP_SUBFE                       0x7c000110
+#define OP_SUBFME                      0x7c0001d0
+#define OP_SUBFZE                      0x7c000190
+#define OP_MFCR                                0x7c000026
+#define OP_MTCR                                0x7c0ff120
+#define OP_MFXER                       0x7c0102a6
+#define OP_MTXER                       0x7c0103a6
+#define OP_MCRXR                       0x7c000400
+#define OP_MCRF                                0x4c000000
+#define OP_CRAND                       0x4c000202
+#define OP_CRANDC                      0x4c000102
+#define OP_CROR                                0x4c000382
+#define OP_CRORC                       0x4c000342
+#define OP_CRXOR                       0x4c000182
+#define OP_CRNAND                      0x4c0001c2
+#define OP_CRNOR                       0x4c000042
+#define OP_CREQV                       0x4c000242
+#define OP_CMPW                                0x7c000000
+#define OP_CMPLW                       0x7c000040
+#define OP_CMPWI                       0x2c000000
+#define OP_CMPLWI                      0x28000000
+#define OP_MULLW                       0x7c0001d6
+#define OP_MULHW                       0x7c000096
+#define OP_MULHWU                      0x7c000016
+#define OP_DIVW                                0x7c0003d6
+#define OP_DIVWU                       0x7c000396
+#define OP_OR                          0x7c000378
+#define OP_ORC                         0x7c000338
+#define OP_XOR                         0x7c000278
+#define OP_NAND                                0x7c0003b8
+#define OP_NOR                         0x7c0000f8
+#define OP_EQV                         0x7c000238
+#define OP_SLW                         0x7c000030
+#define OP_SRW                         0x7c000430
+#define OP_SRAW                                0x7c000630
+#define OP_ORI                         0x60000000
+#define OP_ORIS                                0x64000000
+#define OP_XORI                                0x68000000
+#define OP_XORIS                       0x6c000000
+#define OP_ANDI_                       0x70000000
+#define OP_ANDIS_                      0x74000000
+#define OP_SRAWI                       0x7c000670
+#define OP_RLWINM                      0x54000000
+#define OP_RLWNM                       0x5c000000
+#define OP_RLWIMI                      0x50000000
+#define OP_LWZ                         0x80000000
+#define OP_LHZ                         0xa0000000
+#define OP_LHA                         0xa8000000
+#define OP_LBZ                         0x88000000
+#define OP_LWZU                                0x84000000
+#define OP_LHZU                                0xa4000000
+#define OP_LHAU                                0xac000000
+#define OP_LBZU                                0x8c000000
+#define OP_LWZX                                0x7c00002e
+#define OP_LHZX                                0x7c00022e
+#define OP_LHAX                                0x7c0002ae
+#define OP_LBZX                                0x7c0000ae
+#define OP_LWZUX                       0x7c00006e
+#define OP_LHZUX                       0x7c00026e
+#define OP_LHAUX                       0x7c0002ee
+#define OP_LBZUX                       0x7c0000ee
+#define OP_STW                         0x90000000
+#define OP_STH                         0xb0000000
+#define OP_STB                         0x98000000
+#define OP_STWU                                0x94000000
+#define OP_STHU                                0xb4000000
+#define OP_STBU                                0x9c000000
+#define OP_STWX                                0x7c00012e
+#define OP_STHX                                0x7c00032e
+#define OP_STBX                                0x7c0001ae
+#define OP_STWUX                       0x7c00016e
+#define OP_STHUX                       0x7c00036e
+#define OP_STBUX                       0x7c0001ee
+#define OP_B                           0x48000000
+#define OP_BL                          0x48000001
+#define OP_BC                          0x40000000
+#define OP_BCL                         0x40000001
+#define OP_MTLR                                0x7c0803a6
+#define OP_MFLR                                0x7c0802a6
+#define OP_MTCTR                       0x7c0903a6
+#define OP_MFCTR                       0x7c0902a6
+#define OP_LMW                         0xb8000000
+#define OP_STMW                                0xbc000000
+#define OP_LSWI                                0x7c0004aa
+#define OP_LSWX                                0x7c00042a
+#define OP_STSWI                       0x7c0005aa
+#define OP_STSWX                       0x7c00052a
+
+#define ASM_0(opcode)                  (opcode)
+#define ASM_1(opcode, rd)              ((opcode) +             \
+                                        ((rd) << 21))
+#define ASM_1C(opcode, cr)             ((opcode) +             \
+                                        ((cr) << 23))
+#define ASM_11(opcode, rd, rs)         ((opcode) +             \
+                                        ((rd) << 21) +         \
+                                        ((rs) << 16))
+#define ASM_11C(opcode, cd, cs)                ((opcode) +             \
+                                        ((cd) << 23) +         \
+                                        ((cs) << 18))
+#define ASM_11X(opcode, rd, rs)                ((opcode) +             \
+                                        ((rs) << 21) +         \
+                                        ((rd) << 16))
+#define ASM_11I(opcode, rd, rs, simm)  ((opcode) +             \
+                                        ((rd) << 21) +         \
+                                        ((rs) << 16) +         \
+                                        ((simm) & 0xffff))
+#define ASM_11IF(opcode, rd, rs, simm) ((opcode) +             \
+                                        ((rd) << 21) +         \
+                                        ((rs) << 16) +         \
+                                        ((simm) << 11))
+#define ASM_11S(opcode, rd, rs, sh)    ((opcode) +             \
+                                        ((rs) << 21) +         \
+                                        ((rd) << 16) +         \
+                                        ((sh) << 11))
+#define ASM_11IX(opcode, rd, rs, imm)  ((opcode) +             \
+                                        ((rs) << 21) +         \
+                                        ((rd) << 16) +         \
+                                        ((imm) & 0xffff))
+#define ASM_12(opcode, rd, rs1, rs2)   ((opcode) +             \
+                                        ((rd) << 21) +         \
+                                        ((rs1) << 16) +        \
+                                        ((rs2) << 11))
+#define ASM_12F(opcode, fd, fs1, fs2)  ((opcode) +             \
+                                        ((fd) << 21) +         \
+                                        ((fs1) << 16) +        \
+                                        ((fs2) << 11))
+#define ASM_12X(opcode, rd, rs1, rs2)  ((opcode) +             \
+                                        ((rs1) << 21) +        \
+                                        ((rd) << 16) +         \
+                                        ((rs2) << 11))
+#define ASM_2C(opcode, cr, rs1, rs2)   ((opcode) +             \
+                                        ((cr) << 23) +         \
+                                        ((rs1) << 16) +        \
+                                        ((rs2) << 11))
+#define ASM_1IC(opcode, cr, rs, imm)   ((opcode) +             \
+                                        ((cr) << 23) +         \
+                                        ((rs) << 16) +         \
+                                        ((imm) & 0xffff))
+#define ASM_122(opcode, rd, rs1, rs2, imm1, imm2)              \
+                                       ((opcode) +             \
+                                        ((rs1) << 21) +        \
+                                        ((rd) << 16) +         \
+                                        ((rs2) << 11) +        \
+                                        ((imm1) << 6) +        \
+                                        ((imm2) << 1))
+#define ASM_113(opcode, rd, rs, imm1, imm2, imm3)              \
+                                       ((opcode) +             \
+                                        ((rs) << 21) +         \
+                                        ((rd) << 16) +         \
+                                        ((imm1) << 11) +       \
+                                        ((imm2) << 6) +        \
+                                        ((imm3) << 1))
+#define ASM_1O(opcode, off)            ((opcode) + (off))
+#define ASM_3O(opcode, bo, bi, off)    ((opcode) +             \
+                                        ((bo) << 21) +         \
+                                        ((bi) << 16) +         \
+                                        (off))
+
+#define ASM_ADDI(rd, rs, simm)         ASM_11I(OP_ADDI, rd, rs, simm)
+#define ASM_BLR                                ASM_0(OP_BLR)
+#define ASM_STW(rd, rs, simm)          ASM_11I(OP_STW, rd, rs, simm)
+#define ASM_LWZ(rd, rs, simm)          ASM_11I(OP_LWZ, rd, rs, simm)
+#define ASM_MFCR(rd)                   ASM_1(OP_MFCR, rd)
+#define ASM_MTCR(rd)                   ASM_1(OP_MTCR, rd)
+#define ASM_MFXER(rd)                  ASM_1(OP_MFXER, rd)
+#define ASM_MTXER(rd)                  ASM_1(OP_MTXER, rd)
+#define ASM_MFCTR(rd)                  ASM_1(OP_MFCTR, rd)
+#define ASM_MTCTR(rd)                  ASM_1(OP_MTCTR, rd)
+#define ASM_MCRXR(cr)                  ASM_1C(OP_MCRXR, cr)
+#define ASM_MCRF(cd, cs)               ASM_11C(OP_MCRF, cd, cs)
+#define ASM_B(off)                     ASM_1O(OP_B, off)
+#define ASM_BL(off)                    ASM_1O(OP_BL, off)
+#define ASM_MFLR(rd)                   ASM_1(OP_MFLR, rd)
+#define ASM_MTLR(rd)                   ASM_1(OP_MTLR, rd)
+#define ASM_LI(rd, imm)                        ASM_ADDI(rd, 0, imm)
+#define ASM_LMW(rd, rs, simm)          ASM_11I(OP_LMW, rd, rs, simm)
+#define ASM_STMW(rd, rs, simm)         ASM_11I(OP_STMW, rd, rs, simm)
+#define ASM_LSWI(rd, rs, simm)         ASM_11IF(OP_LSWI, rd, rs, simm)
+#define ASM_LSWX(rd, rs1, rs2)         ASM_12(OP_LSWX, rd, rs1, rs2)
+#define ASM_STSWI(rd, rs, simm)                ASM_11IF(OP_STSWI, rd, rs, simm)
+#define ASM_STSWX(rd, rs1, rs2)                ASM_12(OP_STSWX, rd, rs1, rs2)
+
+
+#endif /* _CPU_ASM_H */
diff --git a/post/lib_ppc/cr.c b/post/lib_ppc/cr.c
new file mode 100644 (file)
index 0000000..da6ef37
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Condition register istructions:     mtcr, mfcr, mcrxr,
+ *                                     crand, crandc, cror, crorc, crxor,
+ *                                     crnand, crnor, creqv, mcrf
+ *
+ * The mtcrf/mfcr instructions is tested by loading different
+ * values into the condition register (mtcrf), moving its value
+ * to a general-purpose register (mfcr) and comparing this value
+ * with the expected one.
+ * The mcrxr instruction is tested by loading a fixed value
+ * into the XER register (mtspr), moving XER value to the
+ * condition register (mcrxr), moving it to a general-purpose
+ * register (mfcr) and comparing the value of this register with
+ * the expected one.
+ * The rest of instructions is tested by loading a fixed
+ * value into the condition register (mtcrf), executing each
+ * instruction several times to modify all 4-bit condition
+ * fields, moving the value of the conditional register to a
+ * general-purpose register (mfcr) and comparing it with the
+ * expected one.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1);
+extern void cpu_post_exec_21x (ulong *code, ulong *op1, ulong *op2, ulong op3);
+
+static ulong cpu_post_cr_table1[] =
+{
+    0xaaaaaaaa,
+    0x55555555,
+};
+static unsigned int cpu_post_cr_size1 =
+    sizeof (cpu_post_cr_table1) / sizeof (ulong);
+
+static struct cpu_post_cr_s2 {
+    ulong xer;
+    ulong cr;
+} cpu_post_cr_table2[] =
+{
+    {
+       0xa0000000,
+       1
+    },
+    {
+       0x40000000,
+       5
+    },
+};
+static unsigned int cpu_post_cr_size2 =
+    sizeof (cpu_post_cr_table2) / sizeof (struct cpu_post_cr_s2);
+
+static struct cpu_post_cr_s3 {
+    ulong cr;
+    ulong cs;
+    ulong cd;
+    ulong res;
+} cpu_post_cr_table3[] =
+{
+    {
+       0x01234567,
+       0,
+       4,
+       0x01230567
+    },
+    {
+       0x01234567,
+       7,
+       0,
+       0x71234567
+    },
+};
+static unsigned int cpu_post_cr_size3 =
+    sizeof (cpu_post_cr_table3) / sizeof (struct cpu_post_cr_s3);
+
+static struct cpu_post_cr_s4 {
+    ulong cmd;
+    ulong cr;
+    ulong op1;
+    ulong op2;
+    ulong op3;
+    ulong res;
+} cpu_post_cr_table4[] =
+{
+    {
+       OP_CRAND,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRAND,
+       0x0000ffff,
+       16,
+       17,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CRANDC,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRANDC,
+       0x0000ffff,
+       16,
+       0,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CROR,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CROR,
+       0x0000ffff,
+       0,
+       1,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRORC,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRORC,
+       0x0000ffff,
+       0,
+       0,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CRXOR,
+       0x0000ffff,
+       0,
+       0,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRXOR,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CRNAND,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CRNAND,
+       0x0000ffff,
+       16,
+       17,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRNOR,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x0000ffff
+    },
+    {
+       OP_CRNOR,
+       0x0000ffff,
+       0,
+       1,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CREQV,
+       0x0000ffff,
+       0,
+       0,
+       0,
+       0x8000ffff
+    },
+    {
+       OP_CREQV,
+       0x0000ffff,
+       0,
+       16,
+       0,
+       0x0000ffff
+    },
+};
+static unsigned int cpu_post_cr_size4 =
+    sizeof (cpu_post_cr_table4) / sizeof (struct cpu_post_cr_s4);
+
+int cpu_post_test_cr (void)
+{
+    int ret = 0;
+    unsigned int i;
+    unsigned long cr_sav;
+
+    asm ( "mfcr %0" : "=r" (cr_sav) : );
+
+    for (i = 0; i < cpu_post_cr_size1 && ret == 0; i++)
+    {
+       ulong cr = cpu_post_cr_table1[i];
+       ulong res;
+
+       unsigned long code[] =
+       {
+           ASM_MTCR(3),
+           ASM_MFCR(3),
+           ASM_BLR,
+       };
+
+       cpu_post_exec_11 (code, &res, cr);
+
+       ret = res == cr ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cr1 test %d !\n", i);
+       }
+    }
+
+    for (i = 0; i < cpu_post_cr_size2 && ret == 0; i++)
+    {
+       struct cpu_post_cr_s2 *test = cpu_post_cr_table2 + i;
+       ulong res;
+       ulong xer;
+
+       unsigned long code[] =
+       {
+           ASM_MTXER(3),
+           ASM_MCRXR(test->cr),
+           ASM_MFCR(3),
+           ASM_MFXER(4),
+           ASM_BLR,
+       };
+
+       cpu_post_exec_21x (code, &res, &xer, test->xer);
+
+       ret = xer == 0 && ((res << (4 * test->cr)) & 0xe0000000) == test->xer ?
+             0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cr2 test %d !\n", i);
+       }
+    }
+
+    for (i = 0; i < cpu_post_cr_size3 && ret == 0; i++)
+    {
+       struct cpu_post_cr_s3 *test = cpu_post_cr_table3 + i;
+       ulong res;
+
+       unsigned long code[] =
+       {
+           ASM_MTCR(3),
+           ASM_MCRF(test->cd, test->cs),
+           ASM_MFCR(3),
+           ASM_BLR,
+       };
+
+       cpu_post_exec_11 (code, &res, test->cr);
+
+       ret = res == test->res ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cr3 test %d !\n", i);
+       }
+    }
+
+    for (i = 0; i < cpu_post_cr_size4 && ret == 0; i++)
+    {
+       struct cpu_post_cr_s4 *test = cpu_post_cr_table4 + i;
+       ulong res;
+
+       unsigned long code[] =
+       {
+           ASM_MTCR(3),
+           ASM_12F(test->cmd, test->op3, test->op1, test->op2),
+           ASM_MFCR(3),
+           ASM_BLR,
+       };
+
+       cpu_post_exec_11 (code, &res, test->cr);
+
+       ret = res == test->res ? 0 : -1;
+
+       if (ret != 0)
+       {
+           post_log ("Error at cr4 test %d !\n", i);
+       }
+    }
+
+    asm ( "mtcr %0" : : "r" (cr_sav));
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/load.c b/post/lib_ppc/load.c
new file mode 100644 (file)
index 0000000..393c568
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Load instructions:          lbz(x)(u), lhz(x)(u), lha(x)(u), lwz(x)(u)
+ *
+ * All operations are performed on a 16-byte array. The array
+ * is 4-byte aligned. The base register points to offset 8.
+ * The immediate offset (index register) ranges in [-8 ... +7].
+ * The test cases are composed so that they do not
+ * cause alignment exceptions.
+ * The test contains a pre-built table describing all test cases.
+ * The table entry contains:
+ * the instruction opcode, the array contents, the value of the index
+ * register and the expected value of the destination register.
+ * After executing the instruction, the test verifies the
+ * value of the destination register and the value of the base
+ * register (it must change for "load with update" instructions).
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_22w (ulong *code, ulong *op1, ulong op2, ulong *op3);
+extern void cpu_post_exec_21w (ulong *code, ulong *op1, ulong *op2);
+
+static struct cpu_post_load_s
+{
+    ulong cmd;
+    uint width;
+    int update;
+    int index;
+    ulong offset;
+} cpu_post_load_table[] =
+{
+    {
+       OP_LWZ,
+       4,
+       0,
+       0,
+       4
+    },
+    {
+       OP_LHA,
+       3,
+       0,
+       0,
+       2
+    },
+    {
+       OP_LHZ,
+       2,
+       0,
+       0,
+       2
+    },
+    {
+       OP_LBZ,
+       1,
+       0,
+       0,
+       1
+    },
+    {
+       OP_LWZU,
+       4,
+       1,
+       0,
+       4
+    },
+    {
+       OP_LHAU,
+       3,
+       1,
+       0,
+       2
+    },
+    {
+       OP_LHZU,
+       2,
+       1,
+       0,
+       2
+    },
+    {
+       OP_LBZU,
+       1,
+       1,
+       0,
+       1
+    },
+    {
+       OP_LWZX,
+       4,
+       0,
+       1,
+       4
+    },
+    {
+       OP_LHAX,
+       3,
+       0,
+       1,
+       2
+    },
+    {
+       OP_LHZX,
+       2,
+       0,
+       1,
+       2
+    },
+    {
+       OP_LBZX,
+       1,
+       0,
+       1,
+       1
+    },
+    {
+       OP_LWZUX,
+       4,
+       1,
+       1,
+       4
+    },
+    {
+       OP_LHAUX,
+       3,
+       1,
+       1,
+       2
+    },
+    {
+       OP_LHZUX,
+       2,
+       1,
+       1,
+       2
+    },
+    {
+       OP_LBZUX,
+       1,
+       1,
+       1,
+       1
+    },
+};
+static unsigned int cpu_post_load_size =
+    sizeof (cpu_post_load_table) / sizeof (struct cpu_post_load_s);
+
+int cpu_post_test_load (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    for (i = 0; i < cpu_post_load_size && ret == 0; i++)
+    {
+       struct cpu_post_load_s *test = cpu_post_load_table + i;
+       uchar data[16] =
+       { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+       ulong base0 = (ulong) (data + 8);
+       ulong base = base0;
+       ulong value;
+
+       if (test->index)
+       {
+           ulong code[] =
+           {
+               ASM_12(test->cmd, 5, 3, 4),
+               ASM_BLR,
+           };
+
+           cpu_post_exec_22w (code, &base, test->offset, &value);
+       }
+       else
+       {
+           ulong code[] =
+           {
+               ASM_11I(test->cmd, 4, 3, test->offset),
+               ASM_BLR,
+           };
+
+           cpu_post_exec_21w (code, &base, &value);
+       }
+
+       if (ret == 0)
+       {
+          if (test->update)
+              ret = base == base0 + test->offset ? 0 : -1;
+          else
+              ret = base == base0 ? 0 : -1;
+       }
+
+       if (ret == 0)
+       {
+           switch (test->width)
+           {
+           case 1:
+               ret = *(uchar *)(base0 + test->offset) == value ?
+                     0 : -1;
+               break;
+           case 2:
+               ret = *(ushort *)(base0 + test->offset) == value ?
+                     0 : -1;
+               break;
+           case 3:
+               ret = *(short *)(base0 + test->offset) == value ?
+                     0 : -1;
+               break;
+           case 4:
+               ret = *(ulong *)(base0 + test->offset) == value ?
+                     0 : -1;
+               break;
+           }
+       }
+
+       if (ret != 0)
+       {
+           post_log ("Error at load test %d !\n", i);
+       }
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/multi.c b/post/lib_ppc/multi.c
new file mode 100644 (file)
index 0000000..8724384
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Load/store multiple word instructions:      lmw, stmw
+ *
+ * 26 consecutive words are loaded from a source memory buffer
+ * into GPRs r6 through r31. After that, 26 consecutive words are stored
+ * from the GPRs r6 through r31 into a target memory buffer. The contents
+ * of the source and target buffers are then compared.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_02 (ulong *code, ulong op1, ulong op2);
+
+int cpu_post_test_multi (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    if (ret == 0)
+    {
+       ulong src [26], dst [26];
+
+       ulong code[] =
+       {
+           ASM_LMW(5, 3, 0),
+           ASM_STMW(5, 4, 0),
+           ASM_BLR,
+       };
+
+       for (i = 0; i < sizeof(src) / sizeof(src[0]); i ++)
+       {
+           src[i] = i;
+           dst[i] = 0;
+       }
+
+       cpu_post_exec_02(code, (ulong)src, (ulong)dst);
+
+       ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
+    }
+
+    if (ret != 0)
+    {
+       post_log ("Error at multi test !\n");
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/rlwimi.c b/post/lib_ppc/rlwimi.c
new file mode 100644 (file)
index 0000000..f65f79a
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Shift instructions:         rlwimi
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
+    ulong op2);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_rlwimi_s
+{
+    ulong cmd;
+    ulong op0;
+    ulong op1;
+    uchar op2;
+    uchar mb;
+    uchar me;
+    ulong res;
+} cpu_post_rlwimi_table[] =
+{
+    {
+       OP_RLWIMI,
+       0xff00ffff,
+       0x0000aa00,
+       8,
+       8,
+       15,
+       0xffaaffff
+    },
+};
+static unsigned int cpu_post_rlwimi_size =
+    sizeof (cpu_post_rlwimi_table) / sizeof (struct cpu_post_rlwimi_s);
+
+int cpu_post_test_rlwimi (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_rlwimi_size && ret == 0; i++)
+    {
+       struct cpu_post_rlwimi_s *test = cpu_post_rlwimi_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -20),
+               ASM_STW(3, stk, 8),
+               ASM_STW(4, stk, 12),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg1, stk, 8),
+               ASM_LWZ(reg0, stk, 12),
+               ASM_113(test->cmd, reg1, reg0, test->op2, test->mb, test->me),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 20),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -20),
+               ASM_STW(3, stk, 8),
+               ASM_STW(4, stk, 12),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg1, stk, 8),
+               ASM_LWZ(reg0, stk, 12),
+               ASM_113(test->cmd, reg1, reg0, test->op2, test->mb, test->me) |
+                   BIT_C,
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 20),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_22 (code, & cr, & res, test->op0, test->op1);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwimi test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_22 (codecr, & cr, & res, test->op0, test->op1);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwimi test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/rlwinm.c b/post/lib_ppc/rlwinm.c
new file mode 100644 (file)
index 0000000..e240c41
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Shift instructions:         rlwinm
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op1);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_rlwinm_s
+{
+    ulong cmd;
+    ulong op1;
+    uchar op2;
+    uchar mb;
+    uchar me;
+    ulong res;
+} cpu_post_rlwinm_table[] =
+{
+   {
+       OP_RLWINM,
+       0xffff0000,
+       24,
+       16,
+       23,
+       0x0000ff00
+   },
+};
+static unsigned int cpu_post_rlwinm_size =
+    sizeof (cpu_post_rlwinm_table) / sizeof (struct cpu_post_rlwinm_s);
+
+int cpu_post_test_rlwinm (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_rlwinm_size && ret == 0; i++)
+    {
+       struct cpu_post_rlwinm_s *test = cpu_post_rlwinm_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_113(test->cmd, reg1, reg0, test->op2, test->mb, test->me),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_113(test->cmd, reg1, reg0, test->op2, test->mb,
+                   test->me) | BIT_C,
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_21 (code, & cr, & res, test->op1);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwinm test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_21 (codecr, & cr, & res, test->op1);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwinm test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/rlwnm.c b/post/lib_ppc/rlwnm.c
new file mode 100644 (file)
index 0000000..523cf4d
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Shift instructions:         rlwnm
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
+    ulong op2);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_rlwnm_s
+{
+    ulong cmd;
+    ulong op1;
+    ulong op2;
+    uchar mb;
+    uchar me;
+    ulong res;
+} cpu_post_rlwnm_table[] =
+{
+   {
+       OP_RLWNM,
+       0xffff0000,
+       24,
+       16,
+       23,
+       0x0000ff00
+   },
+};
+static unsigned int cpu_post_rlwnm_size =
+    sizeof (cpu_post_rlwnm_table) / sizeof (struct cpu_post_rlwnm_s);
+
+int cpu_post_test_rlwnm (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_rlwnm_size && ret == 0; i++)
+    {
+       struct cpu_post_rlwnm_s *test = cpu_post_rlwnm_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int reg2 = (reg + 2) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_122(test->cmd, reg2, reg1, reg0, test->mb, test->me),
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_122(test->cmd, reg2, reg1, reg0, test->mb, test->me) |
+                   BIT_C,
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_22 (code, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwnm test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_22 (codecr, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at rlwnm test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/srawi.c b/post/lib_ppc/srawi.c
new file mode 100644 (file)
index 0000000..91c82c9
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Shift instructions:         srawi
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_srawi_s
+{
+    ulong cmd;
+    ulong op1;
+    uchar op2;
+    ulong res;
+} cpu_post_srawi_table[] =
+{
+    {
+       OP_SRAWI,
+       0x8000,
+       3,
+       0x1000
+    },
+    {
+       OP_SRAWI,
+       0x80000000,
+       3,
+       0xf0000000
+    },
+};
+static unsigned int cpu_post_srawi_size =
+    sizeof (cpu_post_srawi_table) / sizeof (struct cpu_post_srawi_s);
+
+int cpu_post_test_srawi (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_srawi_size && ret == 0; i++)
+    {
+       struct cpu_post_srawi_s *test = cpu_post_srawi_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11S(test->cmd, reg1, reg0, test->op2),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11S(test->cmd, reg1, reg0, test->op2) | BIT_C,
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_21 (code, & cr, & res, test->op1);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at srawi test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_21 (codecr, & cr, & res, test->op1);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at srawi test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/store.c b/post/lib_ppc/store.c
new file mode 100644 (file)
index 0000000..f495bf2
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Store instructions:         stb(x)(u), sth(x)(u), stw(x)(u)
+ *
+ * All operations are performed on a 16-byte array. The array
+ * is 4-byte aligned. The base register points to offset 8.
+ * The immediate offset (index register) ranges in [-8 ... +7].
+ * The test cases are composed so that they do not
+ * cause alignment exceptions.
+ * The test contains a pre-built table describing all test cases.
+ * The table entry contains:
+ * the instruction opcode, the value of the index register and
+ * the value of the source register. After executing the
+ * instruction, the test verifies the contents of the array
+ * and the value of the base register (it must change for "store
+ * with update" instructions).
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_12w (ulong *code, ulong *op1, ulong op2, ulong op3);
+extern void cpu_post_exec_11w (ulong *code, ulong *op1, ulong op2);
+
+static struct cpu_post_store_s
+{
+    ulong cmd;
+    uint width;
+    int update;
+    int index;
+    ulong offset;
+    ulong value;
+} cpu_post_store_table[] =
+{
+    {
+       OP_STW,
+       4,
+       0,
+       0,
+       -4,
+       0xff00ff00
+    },
+    {
+       OP_STH,
+       2,
+       0,
+       0,
+       -2,
+       0xff00
+    },
+    {
+       OP_STB,
+       1,
+       0,
+       0,
+       -1,
+       0xff
+    },
+    {
+       OP_STWU,
+       4,
+       1,
+       0,
+       -4,
+       0xff00ff00
+    },
+    {
+       OP_STHU,
+       2,
+       1,
+       0,
+       -2,
+       0xff00
+    },
+    {
+       OP_STBU,
+       1,
+       1,
+       0,
+       -1,
+       0xff
+    },
+    {
+       OP_STWX,
+       4,
+       0,
+       1,
+       -4,
+       0xff00ff00
+    },
+    {
+       OP_STHX,
+       2,
+       0,
+       1,
+       -2,
+       0xff00
+    },
+    {
+       OP_STBX,
+       1,
+       0,
+       1,
+       -1,
+       0xff
+    },
+    {
+       OP_STWUX,
+       4,
+       1,
+       1,
+       -4,
+       0xff00ff00
+    },
+    {
+       OP_STHUX,
+       2,
+       1,
+       1,
+       -2,
+       0xff00
+    },
+    {
+       OP_STBUX,
+       1,
+       1,
+       1,
+       -1,
+       0xff
+    },
+};
+static unsigned int cpu_post_store_size =
+    sizeof (cpu_post_store_table) / sizeof (struct cpu_post_store_s);
+
+int cpu_post_test_store (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    for (i = 0; i < cpu_post_store_size && ret == 0; i++)
+    {
+       struct cpu_post_store_s *test = cpu_post_store_table + i;
+       uchar data[16] =
+       { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+       ulong base0 = (ulong) (data + 8);
+       ulong base = base0;
+
+       if (test->index)
+       {
+           ulong code[] =
+           {
+               ASM_12(test->cmd, 5, 3, 4),
+               ASM_BLR,
+           };
+
+           cpu_post_exec_12w (code, &base, test->offset, test->value);
+       }
+       else
+       {
+           ulong code[] =
+           {
+               ASM_11I(test->cmd, 4, 3, test->offset),
+               ASM_BLR,
+           };
+
+           cpu_post_exec_11w (code, &base, test->value);
+       }
+
+       if (ret == 0)
+       {
+          if (test->update)
+              ret = base == base0 + test->offset ? 0 : -1;
+          else
+              ret = base == base0 ? 0 : -1;
+       }
+
+       if (ret == 0)
+       {
+           switch (test->width)
+           {
+           case 1:
+               ret = *(uchar *)(base0 + test->offset) == test->value ?
+                     0 : -1;
+               break;
+           case 2:
+               ret = *(ushort *)(base0 + test->offset) == test->value ?
+                     0 : -1;
+               break;
+           case 4:
+               ret = *(ulong *)(base0 + test->offset) == test->value ?
+                     0 : -1;
+               break;
+           }
+       }
+
+       if (ret != 0)
+       {
+           post_log ("Error at store test %d !\n", i);
+       }
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/string.c b/post/lib_ppc/string.c
new file mode 100644 (file)
index 0000000..bd83bd1
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Load/store string instructions:     lswi, stswi, lswx, stswx
+ *
+ * Several consecutive bytes from a source memory buffer are loaded
+ * left to right into GPRs. After that, the bytes are stored
+ * from the GPRs into a target memory buffer. The contents
+ * of the source and target buffers are then compared.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_02 (ulong *code, ulong op1, ulong op2);
+extern void cpu_post_exec_04 (ulong *code, ulong op1, ulong op2, ulong op3,
+    ulong op4);
+
+#include <bedbug/regs.h>
+int cpu_post_test_string (void)
+{
+    int ret = 0;
+    unsigned int i;
+
+    if (ret == 0)
+    {
+       char src [31], dst [31];
+
+       ulong code[] =
+       {
+           ASM_LSWI(5, 3, 31),
+           ASM_STSWI(5, 4, 31),
+           ASM_BLR,
+       };
+
+       for (i = 0; i < sizeof(src); i ++)
+       {
+           src[i] = (char) i;
+           dst[i] = 0;
+       }
+
+       cpu_post_exec_02(code, (ulong)src, (ulong)dst);
+
+       ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
+    }
+
+    if (ret == 0)
+    {
+       char src [95], dst [95];
+
+       ulong code[] =
+       {
+           ASM_LSWX(8, 3, 5),
+           ASM_STSWX(8, 4, 5),
+           ASM_BLR,
+       };
+
+       for (i = 0; i < sizeof(src); i ++)
+       {
+           src[i] = (char) i;
+           dst[i] = 0;
+       }
+
+       cpu_post_exec_04(code, (ulong)src, (ulong)dst, 0, sizeof(src));
+
+       ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
+    }
+
+    if (ret != 0)
+    {
+       post_log ("Error at string test !\n");
+    }
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/three.c b/post/lib_ppc/three.c
new file mode 100644 (file)
index 0000000..c2d7476
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Ternary instructions                instr rD,rA,rB
+ *
+ * Arithmetic instructions:    add, addc, adde, subf, subfc, subfe,
+ *                             mullw, mulhw, mulhwu, divw, divwu
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
+    ulong op2);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_three_s
+{
+    ulong cmd;
+    ulong op1;
+    ulong op2;
+    ulong res;
+} cpu_post_three_table[] =
+{
+    {
+       OP_ADD,
+       100,
+       200,
+       300
+    },
+    {
+       OP_ADD,
+       100,
+       -200,
+       -100
+    },
+    {
+       OP_ADDC,
+       100,
+       200,
+       300
+    },
+    {
+       OP_ADDC,
+       100,
+       -200,
+       -100
+    },
+    {
+       OP_ADDE,
+       100,
+       200,
+       300
+    },
+    {
+       OP_ADDE,
+       100,
+       -200,
+       -100
+    },
+    {
+       OP_SUBF,
+       100,
+       200,
+       100
+    },
+    {
+       OP_SUBF,
+       300,
+       200,
+       -100
+    },
+    {
+       OP_SUBFC,
+       100,
+       200,
+       100
+    },
+    {
+       OP_SUBFC,
+       300,
+       200,
+       -100
+    },
+    {
+       OP_SUBFE,
+       100,
+       200,
+       200 + ~100
+    },
+    {
+       OP_SUBFE,
+       300,
+       200,
+       200 + ~300
+    },
+    {
+       OP_MULLW,
+       200,
+       300,
+       200 * 300
+    },
+    {
+       OP_MULHW,
+       0x10000000,
+       0x10000000,
+       0x1000000
+    },
+    {
+       OP_MULHWU,
+       0x80000000,
+       0x80000000,
+       0x40000000
+    },
+    {
+       OP_DIVW,
+       -20,
+       5,
+       -4
+    },
+    {
+       OP_DIVWU,
+       0x8000,
+       0x200,
+       0x40
+    },
+};
+static unsigned int cpu_post_three_size =
+    sizeof (cpu_post_three_table) / sizeof (struct cpu_post_three_s);
+
+int cpu_post_test_three (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_three_size && ret == 0; i++)
+    {
+       struct cpu_post_three_s *test = cpu_post_three_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int reg2 = (reg + 2) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_12(test->cmd, reg2, reg1, reg0),
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_12(test->cmd, reg2, reg1, reg0) | BIT_C,
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_22 (code, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at three test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_22 (codecr, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at three test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/threei.c b/post/lib_ppc/threei.c
new file mode 100644 (file)
index 0000000..79f0178
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Ternary instructions                instr rA,rS,UIMM
+ *
+ * Logic instructions:         ori, oris, xori, xoris
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_threei_s
+{
+    ulong cmd;
+    ulong op1;
+    ushort op2;
+    ulong res;
+} cpu_post_threei_table[] =
+{
+    {
+       OP_ORI,
+       0x80000000,
+       0xffff,
+       0x8000ffff
+    },
+    {
+       OP_ORIS,
+       0x00008000,
+       0xffff,
+       0xffff8000
+    },
+    {
+       OP_XORI,
+       0x8000ffff,
+       0xffff,
+       0x80000000
+    },
+    {
+       OP_XORIS,
+       0x00008000,
+       0xffff,
+       0xffff8000
+    },
+};
+static unsigned int cpu_post_threei_size =
+    sizeof (cpu_post_threei_table) / sizeof (struct cpu_post_threei_s);
+
+int cpu_post_test_threei (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_threei_size && ret == 0; i++)
+    {
+       struct cpu_post_threei_s *test = cpu_post_threei_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11IX(test->cmd, reg1, reg0, test->op2),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           cr = 0;
+           cpu_post_exec_21 (code, & cr, & res, test->op1);
+
+           ret = res == test->res && cr == 0 ? 0 : -1;
+
+           if (ret != 0)
+           {
+               post_log ("Error at threei test %d !\n", i);
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/threex.c b/post/lib_ppc/threex.c
new file mode 100644 (file)
index 0000000..2c72063
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Ternary instructions                instr rA,rS,rB
+ *
+ * Logic instructions:         or, orc, xor, nand, nor, eqv
+ * Shift instructions:         slw, srw, sraw
+ *
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
+    ulong op2);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_threex_s
+{
+    ulong cmd;
+    ulong op1;
+    ulong op2;
+    ulong res;
+} cpu_post_threex_table[] =
+{
+    {
+       OP_OR,
+       0x1234,
+       0x5678,
+       0x1234 | 0x5678
+    },
+    {
+       OP_ORC,
+       0x1234,
+       0x5678,
+       0x1234 | ~0x5678
+    },
+    {
+       OP_XOR,
+       0x1234,
+       0x5678,
+       0x1234 ^ 0x5678
+    },
+    {
+       OP_NAND,
+       0x1234,
+       0x5678,
+       ~(0x1234 & 0x5678)
+    },
+    {
+       OP_NOR,
+       0x1234,
+       0x5678,
+       ~(0x1234 | 0x5678)
+    },
+    {
+       OP_EQV,
+       0x1234,
+       0x5678,
+       ~(0x1234 ^ 0x5678)
+    },
+    {
+       OP_SLW,
+       0x80,
+       16,
+       0x800000
+    },
+    {
+       OP_SLW,
+       0x80,
+       32,
+       0
+    },
+    {
+       OP_SRW,
+       0x800000,
+       16,
+       0x80
+    },
+    {
+       OP_SRW,
+       0x800000,
+       32,
+       0
+    },
+    {
+       OP_SRAW,
+       0x80000000,
+       3,
+       0xf0000000
+    },
+    {
+       OP_SRAW,
+       0x8000,
+       3,
+       0x1000
+    },
+};
+static unsigned int cpu_post_threex_size =
+    sizeof (cpu_post_threex_table) / sizeof (struct cpu_post_threex_s);
+
+int cpu_post_test_threex (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_threex_size && ret == 0; i++)
+    {
+       struct cpu_post_threex_s *test = cpu_post_threex_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int reg2 = (reg + 2) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_12X(test->cmd, reg2, reg1, reg0),
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -24),
+               ASM_STW(3, stk, 12),
+               ASM_STW(4, stk, 16),
+               ASM_STW(reg0, stk, 8),
+               ASM_STW(reg1, stk, 4),
+               ASM_STW(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 12),
+               ASM_LWZ(reg0, stk, 16),
+               ASM_12X(test->cmd, reg2, reg1, reg0) | BIT_C,
+               ASM_STW(reg2, stk, 12),
+               ASM_LWZ(reg2, stk, 0),
+               ASM_LWZ(reg1, stk, 4),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_LWZ(3, stk, 12),
+               ASM_ADDI(1, stk, 24),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_22 (code, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at threex test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_22 (codecr, & cr, & res, test->op1, test->op2);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at threex test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/two.c b/post/lib_ppc/two.c
new file mode 100644 (file)
index 0000000..cfbac5e
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Binary instructions         instr rD,rA
+ *
+ * Logic instructions:         neg
+ * Arithmetic instructions:    addme, addze, subfme, subfze
+
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op1);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_two_s
+{
+    ulong cmd;
+    ulong op;
+    ulong res;
+} cpu_post_two_table[] =
+{
+    {
+       OP_NEG,
+       3,
+       -3
+    },
+    {
+       OP_NEG,
+       5,
+       -5
+    },
+    {
+       OP_ADDME,
+       6,
+       5
+    },
+    {
+       OP_ADDZE,
+       5,
+       5
+    },
+    {
+       OP_SUBFME,
+       6,
+       ~6 - 1
+    },
+    {
+       OP_SUBFZE,
+       5,
+       ~5
+    },
+};
+static unsigned int cpu_post_two_size =
+    sizeof (cpu_post_two_table) / sizeof (struct cpu_post_two_s);
+
+int cpu_post_test_two (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_two_size && ret == 0; i++)
+    {
+       struct cpu_post_two_s *test = cpu_post_two_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11(test->cmd, reg1, reg0),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11(test->cmd, reg1, reg0) | BIT_C,
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_21 (code, & cr, & res, test->op);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at two test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_21 (codecr, & cr, & res, test->op);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at two test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
diff --git a/post/lib_ppc/twox.c b/post/lib_ppc/twox.c
new file mode 100644 (file)
index 0000000..48d9954
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * (C) Copyright 2002
+ * 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 <common.h>
+
+/*
+ * CPU test
+ * Binary instructions         instr rA,rS
+ *
+ * Logic instructions:         cntlzw
+ * Arithmetic instructions:    extsb, extsh
+
+ * The test contains a pre-built table of instructions, operands and
+ * expected results. For each table entry, the test will cyclically use
+ * different sets of operand registers and result registers.
+ */
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include "cpu_asm.h"
+
+#if CONFIG_POST & CFG_POST_CPU
+
+extern void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op1);
+extern ulong cpu_post_makecr (long v);
+
+static struct cpu_post_twox_s
+{
+    ulong cmd;
+    ulong op;
+    ulong res;
+} cpu_post_twox_table[] =
+{
+    {
+       OP_EXTSB,
+       3,
+       3
+    },
+    {
+       OP_EXTSB,
+       0xff,
+       -1
+    },
+    {
+       OP_EXTSH,
+       3,
+       3
+    },
+    {
+       OP_EXTSH,
+       0xff,
+       0xff
+    },
+    {
+       OP_EXTSH,
+       0xffff,
+       -1
+    },
+    {
+       OP_CNTLZW,
+       0x000fffff,
+       12
+    },
+};
+static unsigned int cpu_post_twox_size =
+    sizeof (cpu_post_twox_table) / sizeof (struct cpu_post_twox_s);
+
+int cpu_post_test_twox (void)
+{
+    int ret = 0;
+    unsigned int i, reg;
+    int flag = disable_interrupts();
+
+    for (i = 0; i < cpu_post_twox_size && ret == 0; i++)
+    {
+       struct cpu_post_twox_s *test = cpu_post_twox_table + i;
+
+       for (reg = 0; reg < 32 && ret == 0; reg++)
+       {
+           unsigned int reg0 = (reg + 0) % 32;
+           unsigned int reg1 = (reg + 1) % 32;
+           unsigned int stk = reg < 16 ? 31 : 15;
+           unsigned long code[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11X(test->cmd, reg1, reg0),
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           unsigned long codecr[] =
+           {
+               ASM_STW(stk, 1, -4),
+               ASM_ADDI(stk, 1, -16),
+               ASM_STW(3, stk, 8),
+               ASM_STW(reg0, stk, 4),
+               ASM_STW(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 8),
+               ASM_11X(test->cmd, reg1, reg0) | BIT_C,
+               ASM_STW(reg1, stk, 8),
+               ASM_LWZ(reg1, stk, 0),
+               ASM_LWZ(reg0, stk, 4),
+               ASM_LWZ(3, stk, 8),
+               ASM_ADDI(1, stk, 16),
+               ASM_LWZ(stk, 1, -4),
+               ASM_BLR,
+           };
+           ulong res;
+           ulong cr;
+
+           if (ret == 0)
+           {
+               cr = 0;
+               cpu_post_exec_21 (code, & cr, & res, test->op);
+
+               ret = res == test->res && cr == 0 ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at twox test %d !\n", i);
+               }
+           }
+
+           if (ret == 0)
+           {
+               cpu_post_exec_21 (codecr, & cr, & res, test->op);
+
+               ret = res == test->res &&
+                     (cr & 0xe0000000) == cpu_post_makecr (res) ? 0 : -1;
+
+               if (ret != 0)
+               {
+                   post_log ("Error at twox test %d !\n", i);
+               }
+           }
+       }
+    }
+
+    if (flag)
+       enable_interrupts();
+
+    return ret;
+}
+
+#endif
+#endif
index e1066da6bd1e9b5ec7237e7f3e2eeb2f7346e2d8..ac419908605578ce66322fe5ea26ba08303a9073 100644 (file)
@@ -430,6 +430,7 @@ unsigned long post_time_ms (unsigned long base)
 #ifdef CONFIG_PPC
        return (unsigned long)get_ticks () / (get_tbclk () / CFG_HZ) - base;
 #else
+#warning "Not implemented yet"
        return 0; /* Not implemented yet */
 #endif
 }