]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge with /home/tur/git/u-boot#motionpro
authorWolfgang Denk <wd@denx.de>
Sun, 27 May 2007 23:11:11 +0000 (01:11 +0200)
committerWolfgang Denk <wd@denx.de>
Sun, 27 May 2007 23:11:11 +0000 (01:11 +0200)
633 files changed:
CHANGELOG
CREDITS
MAINTAINERS
MAKEALL
Makefile
README
avr32_config.mk
blackfin_config.mk
board/AtmarkTechno/suzaku/suzaku.c
board/AtmarkTechno/suzaku/u-boot.lds
board/amcc/acadia/Makefile [new file with mode: 0644]
board/amcc/acadia/acadia.c [new file with mode: 0644]
board/amcc/acadia/config.mk [new file with mode: 0644]
board/amcc/acadia/cpr.c [new file with mode: 0644]
board/amcc/acadia/memory.c [new file with mode: 0644]
board/amcc/acadia/u-boot.lds [moved from board/amcc/yellowstone/u-boot.lds with 86% similarity]
board/amcc/bamboo/bamboo.c
board/amcc/bamboo/bamboo.h
board/amcc/bamboo/u-boot.lds
board/amcc/ebony/init.S
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 [moved from board/amcc/yellowstone/config.mk with 87% similarity]
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/yellowstone/init.S [deleted file]
board/amcc/yellowstone/yellowstone.c [deleted file]
board/amcc/yosemite/yosemite.c
board/amcc/yucca/init.S
board/amcc/yucca/yucca.c
board/atmel/atstk1000/Makefile
board/atmel/atstk1000/atstk1000.c
board/atmel/atstk1000/eth.c [moved from cpu/at32ap/at32ap7000/hebi.c with 66% similarity]
board/atmel/atstk1000/flash.c
board/atmel/atstk1000/u-boot.lds
board/bf533-ezkit/Makefile [new file with mode: 0644]
board/bf533-ezkit/bf533-ezkit.c [moved from board/ezkit533/ezkit533.c with 72% similarity]
board/bf533-ezkit/config.mk [new file with mode: 0644]
board/bf533-ezkit/flash-defines.h [moved from board/ezkit533/flash-defines.h with 91% similarity]
board/bf533-ezkit/flash.c [moved from board/ezkit533/flash.c with 74% similarity]
board/bf533-ezkit/psd4256.h [moved from board/ezkit533/psd4256.h with 61% similarity]
board/bf533-ezkit/u-boot.lds.S [moved from board/ezkit533/u-boot.lds with 92% similarity]
board/bf533-stamp/Makefile [new file with mode: 0644]
board/bf533-stamp/bf533-stamp.c [moved from board/stamp/stamp.c with 59% similarity]
board/bf533-stamp/bf533-stamp.h [moved from board/stamp/stamp.h with 89% similarity]
board/bf533-stamp/config.mk [new file with mode: 0644]
board/bf533-stamp/spi.c [new file with mode: 0644]
board/bf533-stamp/u-boot.lds.S [moved from board/stamp/u-boot.lds with 91% similarity]
board/bf537-stamp/Makefile [new file with mode: 0644]
board/bf537-stamp/bf537-stamp.c [new file with mode: 0644]
board/bf537-stamp/cmd_bf537led.c [new file with mode: 0644]
board/bf537-stamp/config.mk [new file with mode: 0644]
board/bf537-stamp/ether_bf537.c [new file with mode: 0644]
board/bf537-stamp/ether_bf537.h [new file with mode: 0644]
board/bf537-stamp/flash-defines.h [new file with mode: 0644]
board/bf537-stamp/flash.c [new file with mode: 0644]
board/bf537-stamp/nand.c [new file with mode: 0644]
board/bf537-stamp/post-memory.c [new file with mode: 0644]
board/bf537-stamp/stm_m25p64.c [new file with mode: 0644]
board/bf537-stamp/u-boot.lds.S [new file with mode: 0644]
board/bf561-ezkit/Makefile [new file with mode: 0644]
board/bf561-ezkit/bf561-ezkit.c [new file with mode: 0644]
board/bf561-ezkit/config.mk [new file with mode: 0644]
board/bf561-ezkit/u-boot.lds.S [new file with mode: 0644]
board/cds/mpc8541cds/mpc8541cds.c
board/cds/mpc8541cds/u-boot.lds
board/cds/mpc8548cds/init.S
board/cds/mpc8548cds/mpc8548cds.c
board/cds/mpc8548cds/u-boot.lds
board/cds/mpc8555cds/mpc8555cds.c
board/cds/mpc8555cds/u-boot.lds
board/cray/L1/L1.c
board/esd/common/auto_update.c
board/esd/cpci750/cpci750.c
board/esd/cpci750/sdram_init.c
board/esd/du405/du405.c
board/esd/mecp5200/Makefile [moved from board/amcc/yellowstone/Makefile with 95% similarity]
board/esd/mecp5200/config.mk [new file with mode: 0644]
board/esd/mecp5200/mecp5200.c [new file with mode: 0644]
board/esd/mecp5200/mt46v16m16-75.h [new file with mode: 0644]
board/esd/mecp5200/u-boot.lds [new file with mode: 0644]
board/esd/plu405/plu405.c
board/freescale/common/pixis.c [moved from board/mpc8641hpcn/pixis.c with 60% similarity]
board/freescale/common/pixis.h [moved from board/mpc8641hpcn/pixis.h with 89% similarity]
board/freescale/mpc8544ds/Makefile [new file with mode: 0644]
board/freescale/mpc8544ds/config.mk [new file with mode: 0644]
board/freescale/mpc8544ds/init.S [new file with mode: 0644]
board/freescale/mpc8544ds/mpc8544ds.c [new file with mode: 0644]
board/freescale/mpc8544ds/u-boot.lds [new file with mode: 0644]
board/hmi1001/hmi1001.c
board/icecube/icecube.c
board/ixdp425/config.mk
board/jupiter/Makefile [moved from board/ezkit533/Makefile with 90% similarity]
board/jupiter/config.mk [new file with mode: 0644]
board/jupiter/jupiter.c [new file with mode: 0644]
board/jupiter/u-boot.lds [new file with mode: 0644]
board/lpc2292sodimm/Makefile [new file with mode: 0644]
board/lpc2292sodimm/config.mk [new file with mode: 0644]
board/lpc2292sodimm/eth.c [new file with mode: 0644]
board/lpc2292sodimm/flash.c [new file with mode: 0644]
board/lpc2292sodimm/iap_entry.S [new file with mode: 0644]
board/lpc2292sodimm/lowlevel_init.S [new file with mode: 0644]
board/lpc2292sodimm/lpc2292sodimm.c [new file with mode: 0644]
board/lpc2292sodimm/mmc.c [new file with mode: 0644]
board/lpc2292sodimm/mmc_hw.c [new file with mode: 0644]
board/lpc2292sodimm/mmc_hw.h [new file with mode: 0644]
board/lpc2292sodimm/spi.c [new file with mode: 0644]
board/lpc2292sodimm/spi.h [new file with mode: 0644]
board/lpc2292sodimm/u-boot.lds [new file with mode: 0644]
board/mcc200/auto_update.c
board/mcc200/lcd.c
board/motionpro/motionpro.c
board/mpc7448hpc2/Makefile [new file with mode: 0644]
board/mpc7448hpc2/asm_init.S [new file with mode: 0644]
board/mpc7448hpc2/config.mk [new file with mode: 0644]
board/mpc7448hpc2/mpc7448hpc2.c [new file with mode: 0644]
board/mpc7448hpc2/tsi108_init.c [new file with mode: 0644]
board/mpc7448hpc2/u-boot.lds [new file with mode: 0644]
board/mpc8313erdb/Makefile [new file with mode: 0644]
board/mpc8313erdb/config.mk [new file with mode: 0644]
board/mpc8313erdb/mpc8313erdb.c [new file with mode: 0644]
board/mpc8313erdb/sdram.c [new file with mode: 0644]
board/mpc8313erdb/u-boot.lds [new file with mode: 0644]
board/mpc832xemds/Makefile [new file with mode: 0644]
board/mpc832xemds/config.mk [moved from board/stamp/config.mk with 91% similarity]
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/mpc8540ads/init.S
board/mpc8560ads/init.S
board/mpc8568mds/Makefile [moved from board/stamp/Makefile with 56% similarity]
board/mpc8568mds/bcsr.c [new file with mode: 0644]
board/mpc8568mds/bcsr.h [new file with mode: 0644]
board/mpc8568mds/config.mk [new file with mode: 0644]
board/mpc8568mds/ft_board.c [new file with mode: 0644]
board/mpc8568mds/init.S [new file with mode: 0644]
board/mpc8568mds/mpc8568mds.c [new file with mode: 0644]
board/mpc8568mds/u-boot.lds [new file with mode: 0644]
board/mpc8641hpcn/Makefile
board/mpc8641hpcn/init.S
board/mpc8641hpcn/mpc8641hpcn.c
board/mpc8641hpcn/u-boot.lds
board/mpl/common/memtst.c
board/mpl/mip405/mip405.c
board/nc650/config.mk
board/nc650/nc650.c
board/prodrive/p3mx/p3mx.h [moved from include/asm-microblaze/platform.h with 77% similarity]
board/prodrive/pdnb3/config.mk
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/sc3/Makefile
board/stxssa/Makefile [new file with mode: 0644]
board/stxssa/config.mk [new file with mode: 0644]
board/stxssa/init.S [new file with mode: 0644]
board/stxssa/stxssa.c [new file with mode: 0644]
board/stxssa/u-boot.lds [new file with mode: 0644]
board/tqm8272/tqm8272.c
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/ml401/Makefile [new file with mode: 0644]
board/xilinx/ml401/config.mk [new file with mode: 0644]
board/xilinx/ml401/ml401.c [new file with mode: 0644]
board/xilinx/ml401/u-boot.lds [new file with mode: 0644]
board/xilinx/ml401/xparameters.h [new file with mode: 0755]
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
board/xilinx/xupv2p/Makefile [new file with mode: 0644]
board/xilinx/xupv2p/config.mk [new file with mode: 0644]
board/xilinx/xupv2p/u-boot.lds [new file with mode: 0644]
board/xilinx/xupv2p/xparameters.h [new file with mode: 0644]
board/xilinx/xupv2p/xupv2p.c [new file with mode: 0644]
common/Makefile
common/cmd_ace.c [deleted file]
common/cmd_bdinfo.c
common/cmd_bootm.c
common/cmd_date.c
common/cmd_dtt.c
common/cmd_ext2.c
common/cmd_fat.c
common/cmd_fdt.c [new file with mode: 0644]
common/cmd_i2c.c
common/cmd_ide.c
common/cmd_mem.c
common/cmd_mfsl.c [new file with mode: 0644]
common/cmd_nvedit.c
common/cmd_reiser.c
common/cmd_scsi.c
common/cmd_usb.c
common/console.c
common/fdt_support.c [new file with mode: 0644]
common/ft_build.c
common/main.c
common/serial.c
common/usb_storage.c
config.mk
cpu/74xx_7xx/cpu.c
cpu/74xx_7xx/cpu_init.c
cpu/74xx_7xx/speed.c
cpu/arm720t/cpu.c
cpu/arm720t/interrupts.c
cpu/arm720t/serial.c
cpu/arm720t/start.S
cpu/at32ap/Makefile
cpu/at32ap/at32ap7000/Makefile
cpu/at32ap/at32ap7000/devices.c [deleted file]
cpu/at32ap/at32ap7000/gpio.c [new file with mode: 0644]
cpu/at32ap/atmel_mci.c [new file with mode: 0644]
cpu/at32ap/atmel_mci.h [new file with mode: 0644]
cpu/at32ap/cpu.c
cpu/at32ap/device.c [deleted file]
cpu/at32ap/entry.S
cpu/at32ap/exception.c
cpu/at32ap/hsdramc.c
cpu/at32ap/hsdramc1.h
cpu/at32ap/hsmc3.h
cpu/at32ap/interrupts.c
cpu/at32ap/pio.c
cpu/at32ap/pio2.h
cpu/at32ap/pm.c
cpu/at32ap/sm.h
cpu/at32ap/start.S
cpu/bf533/Makefile
cpu/bf533/bf533_serial.h
cpu/bf533/cache.S
cpu/bf533/config.mk
cpu/bf533/cplbhdlr.S [deleted file]
cpu/bf533/cplbmgr.S [deleted file]
cpu/bf533/cpu.c
cpu/bf533/cpu.h
cpu/bf533/flush.S
cpu/bf533/init_sdram.S [new file with mode: 0644]
cpu/bf533/init_sdram_bootrom_initblock.S [new file with mode: 0644]
cpu/bf533/interrupt.S
cpu/bf533/interrupts.c
cpu/bf533/ints.c
cpu/bf533/serial.c
cpu/bf533/start.S
cpu/bf533/start1.S
cpu/bf533/traps.c
cpu/bf533/video.c [new file with mode: 0644]
cpu/bf533/video.h [new file with mode: 0644]
cpu/bf537/Makefile [new file with mode: 0644]
cpu/bf537/cache.S [new file with mode: 0644]
cpu/bf537/config.mk [new file with mode: 0644]
cpu/bf537/cpu.c [new file with mode: 0644]
cpu/bf537/cpu.h [new file with mode: 0644]
cpu/bf537/flush.S [new file with mode: 0644]
cpu/bf537/i2c.c [new file with mode: 0644]
cpu/bf537/init_sdram.S [new file with mode: 0644]
cpu/bf537/init_sdram_bootrom_initblock.S [new file with mode: 0644]
cpu/bf537/interrupt.S [new file with mode: 0644]
cpu/bf537/interrupts.c [new file with mode: 0644]
cpu/bf537/ints.c [new file with mode: 0644]
cpu/bf537/serial.c [new file with mode: 0644]
cpu/bf537/serial.h [new file with mode: 0644]
cpu/bf537/start.S [new file with mode: 0644]
cpu/bf537/start1.S [new file with mode: 0644]
cpu/bf537/traps.c [new file with mode: 0644]
cpu/bf537/video.c [new file with mode: 0644]
cpu/bf537/video.h [new file with mode: 0644]
cpu/bf561/Makefile [new file with mode: 0644]
cpu/bf561/cache.S [new file with mode: 0644]
cpu/bf561/config.mk [new file with mode: 0644]
cpu/bf561/cpu.c [new file with mode: 0644]
cpu/bf561/cpu.h [new file with mode: 0644]
cpu/bf561/flush.S [new file with mode: 0644]
cpu/bf561/init_sdram.S [new file with mode: 0644]
cpu/bf561/init_sdram_bootrom_initblock.S [new file with mode: 0644]
cpu/bf561/interrupt.S [new file with mode: 0644]
cpu/bf561/interrupts.c [new file with mode: 0644]
cpu/bf561/ints.c [new file with mode: 0644]
cpu/bf561/serial.c [new file with mode: 0644]
cpu/bf561/serial.h [new file with mode: 0644]
cpu/bf561/start.S [new file with mode: 0644]
cpu/bf561/start1.S [new file with mode: 0644]
cpu/bf561/traps.c [new file with mode: 0644]
cpu/bf561/video.c [new file with mode: 0644]
cpu/bf561/video.h [new file with mode: 0644]
cpu/ixp/npe/Makefile
cpu/microblaze/Makefile
cpu/microblaze/cache.c [new file with mode: 0755]
cpu/microblaze/exception.c [new file with mode: 0644]
cpu/microblaze/interrupts.c [changed mode: 0644->0755]
cpu/microblaze/irq.S [new file with mode: 0755]
cpu/microblaze/start.S
cpu/microblaze/timer.c [new file with mode: 0644]
cpu/mpc5xxx/cpu.c
cpu/mpc5xxx/fec.c
cpu/mpc8260/cpu_init.c
cpu/mpc8260/pci.c
cpu/mpc83xx/Makefile
cpu/mpc83xx/cpu.c
cpu/mpc83xx/cpu_init.c
cpu/mpc83xx/pci.c [new file with mode: 0644]
cpu/mpc83xx/qe_io.c
cpu/mpc83xx/spd_sdram.c
cpu/mpc83xx/speed.c
cpu/mpc83xx/start.S
cpu/mpc85xx/cpu.c
cpu/mpc85xx/cpu_init.c
cpu/mpc85xx/pci.c
cpu/mpc85xx/spd_sdram.c
cpu/mpc85xx/speed.c
cpu/mpc85xx/start.S
cpu/mpc86xx/cpu.c
cpu/mpc86xx/interrupts.c
cpu/mpc86xx/spd_sdram.c
cpu/mpc86xx/start.S
cpu/mpc8xx/serial.c
cpu/ppc4xx/40x_spd_sdram.c [new file with mode: 0644]
cpu/ppc4xx/44x_spd_ddr.c [moved from cpu/ppc4xx/spd_sdram.c with 77% similarity]
cpu/ppc4xx/44x_spd_ddr2.c [new file with mode: 0644]
cpu/ppc4xx/4xx_enet.c
cpu/ppc4xx/Makefile
cpu/ppc4xx/cpu.c
cpu/ppc4xx/cpu_init.c
cpu/ppc4xx/gpio.c [new file with mode: 0644]
cpu/ppc4xx/i2c.c
cpu/ppc4xx/ndfc.c
cpu/ppc4xx/serial.c
cpu/ppc4xx/speed.c
cpu/ppc4xx/start.S
cpu/ppc4xx/tlb.c [new file with mode: 0644]
cpu/ppc4xx/usb_ohci.c
cpu/ppc4xx/vecnum.h
cpu/pxa/mmc.c
disk/part.c
doc/README.Lite5200B_low_power [new file with mode: 0644]
doc/README.NetConsole
doc/README.mpc7448hpc2 [new file with mode: 0644]
doc/README.mpc8313erdb [new file with mode: 0644]
doc/README.mpc832xemds [new file with mode: 0644]
doc/README.mpc8349itx [new file with mode: 0644]
doc/README.mpc8641hpcn
doc/README.nand
doc/README.sbc8349 [new file with mode: 0644]
doc/README.sbc8560 [deleted file]
drivers/Makefile
drivers/atmel_usart.c
drivers/atmel_usart.h
drivers/cfi_flash.c
drivers/fsl_i2c.c
drivers/macb.c [new file with mode: 0644]
drivers/macb.h [new file with mode: 0644]
drivers/nand/nand_base.c
drivers/pci_auto.c
drivers/qe/qe.h
drivers/qe/uec.c
drivers/smc91111.c
drivers/systemace.c [new file with mode: 0644]
drivers/tsec.c
drivers/tsec.h
drivers/tsi108_eth.c [new file with mode: 0644]
drivers/tsi108_i2c.c [new file with mode: 0644]
drivers/tsi108_pci.c [new file with mode: 0644]
dtt/adm1021.c
examples/Makefile
examples/stubs.c
fs/jffs2/compr_zlib.c
include/405gp_i2c.h [deleted file]
include/440_i2c.h [deleted file]
include/4xx_i2c.h [new file with mode: 0644]
include/74xx_7xx.h
include/asm-arm/arch-arm720t/hardware.h
include/asm-arm/arch-arm720t/lpc2292_registers.h [new file with mode: 0644]
include/asm-arm/arch-arm720t/mmc.h [moved from include/asm-microblaze/suzaku.h with 71% similarity]
include/asm-arm/io.h
include/asm-avr32/arch-at32ap7000/clk.h [new file with mode: 0644]
include/asm-avr32/arch-at32ap7000/gpio.h [new file with mode: 0644]
include/asm-avr32/arch-at32ap7000/hmatrix2.h
include/asm-avr32/arch-at32ap7000/memory-map.h
include/asm-avr32/arch-at32ap7000/mmc.h [new file with mode: 0644]
include/asm-avr32/arch-at32ap7000/platform.h [deleted file]
include/asm-avr32/global_data.h
include/asm-avr32/initcalls.h
include/asm-avr32/io.h
include/asm-blackfin/arch-bf533/anomaly.h [new file with mode: 0644]
include/asm-blackfin/arch-bf533/bf533_serial.h [moved from include/asm-blackfin/cpu/bf533_serial.h with 94% similarity]
include/asm-blackfin/arch-bf533/bf5xx_rtc.h [moved from include/asm-blackfin/cpu/bf533_rtc.h with 90% similarity]
include/asm-blackfin/arch-bf533/cdefBF531.h [moved from include/asm-blackfin/cpu/cdefBF531.h with 93% similarity]
include/asm-blackfin/arch-bf533/cdefBF532.h [moved from include/asm-blackfin/cpu/cdefBF532.h with 99% similarity]
include/asm-blackfin/arch-bf533/cdefBF533.h [moved from include/asm-blackfin/cpu/cdefBF533.h with 93% similarity]
include/asm-blackfin/arch-bf533/defBF531.h [moved from include/asm-blackfin/cpu/defBF531.h with 100% similarity]
include/asm-blackfin/arch-bf533/defBF532.h [moved from include/asm-blackfin/cpu/defBF532.h with 93% similarity]
include/asm-blackfin/arch-bf533/defBF533.h [moved from include/asm-blackfin/cpu/defBF533.h with 100% similarity]
include/asm-blackfin/arch-bf533/defBF533_extn.h [moved from include/asm-blackfin/cpu/defBF533_extn.h with 95% similarity]
include/asm-blackfin/arch-bf533/irq.h [moved from include/asm-blackfin/cpu/bf533_irq.h with 97% similarity]
include/asm-blackfin/arch-bf537/anomaly.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/bf537_serial.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/bf5xx_rtc.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/cdefBF534.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/cdefBF537.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/defBF534.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/defBF537.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/defBF537_extn.h [new file with mode: 0644]
include/asm-blackfin/arch-bf537/irq.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/anomaly.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/bf561_serial.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/cdefBF561.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/defBF561.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/defBF561_extn.h [new file with mode: 0644]
include/asm-blackfin/arch-bf561/irq.h [new file with mode: 0644]
include/asm-blackfin/arch-common/bf53x_rtc.h [new file with mode: 0644]
include/asm-blackfin/arch-common/cdefBF5xx.h [new file with mode: 0644]
include/asm-blackfin/arch-common/cdef_LPBlackfin.h [moved from include/asm-blackfin/cpu/cdef_LPBlackfin.h with 86% similarity]
include/asm-blackfin/arch-common/def_LPBlackfin.h [moved from include/asm-blackfin/cpu/def_LPBlackfin.h with 99% similarity]
include/asm-blackfin/bitops.h
include/asm-blackfin/blackfin.h
include/asm-blackfin/blackfin_defs.h
include/asm-blackfin/byteorder.h
include/asm-blackfin/cplb.h
include/asm-blackfin/cplbtab.h [deleted file]
include/asm-blackfin/cpu/cdefBF53x.h [deleted file]
include/asm-blackfin/current.h
include/asm-blackfin/delay.h
include/asm-blackfin/entry.h
include/asm-blackfin/errno.h
include/asm-blackfin/global_data.h
include/asm-blackfin/hw_irq.h
include/asm-blackfin/io-kernel.h
include/asm-blackfin/io.h
include/asm-blackfin/irq.h
include/asm-blackfin/linkage.h
include/asm-blackfin/machdep.h
include/asm-blackfin/mem_init.h
include/asm-blackfin/page.h [deleted file]
include/asm-blackfin/page_offset.h
include/asm-blackfin/posix_types.h
include/asm-blackfin/processor.h
include/asm-blackfin/ptrace.h
include/asm-blackfin/segment.h
include/asm-blackfin/setup.h
include/asm-blackfin/shared_resources.h
include/asm-blackfin/string.h
include/asm-blackfin/system.h
include/asm-blackfin/traps.h
include/asm-blackfin/types.h
include/asm-blackfin/u-boot.h
include/asm-blackfin/uaccess.h
include/asm-blackfin/virtconvert.h
include/asm-i386/io.h
include/asm-m68k/io.h
include/asm-microblaze/asm.h [new file with mode: 0755]
include/asm-microblaze/io.h
include/asm-microblaze/microblaze_intc.h [new file with mode: 0644]
include/asm-microblaze/microblaze_timer.h [new file with mode: 0644]
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/gpio.h [new file with mode: 0644]
include/asm-ppc/immap_83xx.h
include/asm-ppc/immap_86xx.h
include/asm-ppc/immap_qe.h
include/asm-ppc/io.h
include/asm-ppc/mmu.h
include/asm-ppc/processor.h
include/asm-ppc/u-boot.h
include/cmd_confdefs.h
include/common.h
include/configs/IceCube.h
include/configs/MPC8313ERDB.h [new file with mode: 0644]
include/configs/MPC832XEMDS.h [new file with mode: 0644]
include/configs/MPC8349EMDS.h
include/configs/MPC8349ITX.h
include/configs/MPC8360EMDS.h
include/configs/MPC8540ADS.h
include/configs/MPC8541CDS.h
include/configs/MPC8544DS.h [new file with mode: 0644]
include/configs/MPC8548CDS.h
include/configs/MPC8560ADS.h
include/configs/MPC8568MDS.h [new file with mode: 0644]
include/configs/MPC8641HPCN.h
include/configs/NC650.h
include/configs/PCI405.h
include/configs/PLU405.h
include/configs/SBC8560.h [deleted file]
include/configs/TQM834x.h
include/configs/acadia.h [new file with mode: 0644]
include/configs/alpr.h
include/configs/atstk1002.h
include/configs/bamboo.h
include/configs/bf533-ezkit.h [new file with mode: 0644]
include/configs/bf533-stamp.h [new file with mode: 0644]
include/configs/bf537-stamp.h [new file with mode: 0644]
include/configs/bf561-ezkit.h [new file with mode: 0644]
include/configs/bubinga.h
include/configs/delta.h
include/configs/ebony.h
include/configs/ezkit533.h [deleted file]
include/configs/hmi1001.h
include/configs/jupiter.h [new file with mode: 0644]
include/configs/katmai.h [new file with mode: 0644]
include/configs/lpc2292sodimm.h [new file with mode: 0644]
include/configs/luan.h
include/configs/mcc200.h
include/configs/mecp5200.h [new file with mode: 0644]
include/configs/ml401.h [new file with mode: 0644]
include/configs/mpc7448hpc2.h [new file with mode: 0644]
include/configs/ocotea.h
include/configs/pdnb3.h
include/configs/sbc8349.h [new file with mode: 0644]
include/configs/sc3.h
include/configs/sequoia.h
include/configs/stamp.h [deleted file]
include/configs/stxssa.h [new file with mode: 0644]
include/configs/suzaku.h
include/configs/taishan.h
include/configs/walnut.h
include/configs/xupv2p.h [new file with mode: 0644]
include/configs/yellowstone.h [deleted file]
include/configs/yosemite.h
include/configs/yucca.h
include/configs/zylonite.h
include/fdt.h [new file with mode: 0644]
include/fdt_support.h [new file with mode: 0644]
include/flash.h
include/i2c.h
include/ide.h
include/libfdt.h [new file with mode: 0644]
include/libfdt_env.h [new file with mode: 0644]
include/linux/mii.h [new file with mode: 0644]
include/linux/stat.h
include/mpc83xx.h
include/mpc86xx.h
include/part.h
include/ppc405.h
include/ppc440.h
include/ppc4xx_enet.h
include/serial.h
include/tsi108.h [new file with mode: 0644]
lib_avr32/avr32_linux.c
lib_avr32/board.c
lib_blackfin/Makefile
lib_blackfin/bf533_linux.c
lib_blackfin/bf533_string.c
lib_blackfin/blackfin_board.h
lib_blackfin/board.c
lib_blackfin/cache.c
lib_blackfin/cache.h [new file with mode: 0644]
lib_blackfin/memcmp.S [new file with mode: 0644]
lib_blackfin/memcpy.S [new file with mode: 0644]
lib_blackfin/memmove.S [new file with mode: 0644]
lib_blackfin/memset.S [new file with mode: 0644]
lib_blackfin/muldi3.c
lib_blackfin/post.c [new file with mode: 0644]
lib_blackfin/tests.c [new file with mode: 0644]
lib_generic/display_options.c
lib_microblaze/board.c
lib_microblaze/microblaze_linux.c
lib_microblaze/time.c
lib_ppc/board.c
lib_ppc/extable.c
libfdt/Makefile [new file with mode: 0644]
libfdt/README [new file with mode: 0644]
libfdt/fdt.c [new file with mode: 0644]
libfdt/fdt_ro.c [new file with mode: 0644]
libfdt/fdt_rw.c [new file with mode: 0644]
libfdt/fdt_strerror.c [new file with mode: 0644]
libfdt/fdt_sw.c [new file with mode: 0644]
libfdt/fdt_wip.c [new file with mode: 0644]
libfdt/libfdt_internal.h [new file with mode: 0644]
microblaze_config.mk
net/eth.c
net/net.c
post/Makefile
post/board/lwmon/Makefile [moved from board/ezkit533/config.mk with 89% similarity]
post/board/lwmon/sysmon.c [moved from post/sysmon.c with 100% similarity]
post/board/netta/Makefile [new file with mode: 0644]
post/board/netta/codec.c [moved from post/codec.c with 100% similarity]
post/board/netta/dsp.c [moved from post/dsp.c with 100% similarity]
post/cpu/mpc8xx/Makefile [new file with mode: 0644]
post/cpu/mpc8xx/cache_8xx.S [moved from post/cache_8xx.S with 100% similarity]
post/cpu/mpc8xx/ether.c [moved from post/ether.c with 100% similarity]
post/cpu/mpc8xx/spr.c [moved from post/spr.c with 100% similarity]
post/cpu/mpc8xx/uart.c [moved from post/uart.c with 100% similarity]
post/cpu/mpc8xx/usb.c [moved from post/usb.c with 100% similarity]
post/cpu/mpc8xx/watchdog.c [moved from post/watchdog.c with 100% similarity]
post/drivers/Makefile [new file with mode: 0644]
post/drivers/cache.c [moved from post/cache.c with 100% similarity]
post/drivers/i2c.c [moved from post/i2c.c with 100% similarity]
post/drivers/memory.c [moved from post/memory.c with 100% similarity]
post/drivers/rtc.c [moved from post/rtc.c with 100% similarity]
post/lib_ppc/Makefile [moved from post/cpu/Makefile with 93% similarity]
post/lib_ppc/andi.c [moved from post/cpu/andi.c with 100% similarity]
post/lib_ppc/asm.S [moved from post/cpu/asm.S with 100% similarity]
post/lib_ppc/b.c [moved from post/cpu/b.c with 100% similarity]
post/lib_ppc/cmp.c [moved from post/cpu/cmp.c with 100% similarity]
post/lib_ppc/cmpi.c [moved from post/cpu/cmpi.c with 100% similarity]
post/lib_ppc/complex.c [moved from post/cpu/complex.c with 100% similarity]
post/lib_ppc/cpu.c [moved from post/cpu.c with 100% similarity]
post/lib_ppc/cpu_asm.h [moved from post/cpu/cpu_asm.h with 100% similarity]
post/lib_ppc/cr.c [moved from post/cpu/cr.c with 100% similarity]
post/lib_ppc/load.c [moved from post/cpu/load.c with 100% similarity]
post/lib_ppc/multi.c [moved from post/cpu/multi.c with 100% similarity]
post/lib_ppc/rlwimi.c [moved from post/cpu/rlwimi.c with 100% similarity]
post/lib_ppc/rlwinm.c [moved from post/cpu/rlwinm.c with 100% similarity]
post/lib_ppc/rlwnm.c [moved from post/cpu/rlwnm.c with 100% similarity]
post/lib_ppc/srawi.c [moved from post/cpu/srawi.c with 100% similarity]
post/lib_ppc/store.c [moved from post/cpu/store.c with 100% similarity]
post/lib_ppc/string.c [moved from post/cpu/string.c with 100% similarity]
post/lib_ppc/three.c [moved from post/cpu/three.c with 100% similarity]
post/lib_ppc/threei.c [moved from post/cpu/threei.c with 100% similarity]
post/lib_ppc/threex.c [moved from post/cpu/threex.c with 100% similarity]
post/lib_ppc/two.c [moved from post/cpu/two.c with 100% similarity]
post/lib_ppc/twox.c [moved from post/cpu/twox.c with 100% similarity]
post/post.c
rtc/Makefile
rtc/bf5xx_rtc.c [moved from rtc/bf533_rtc.c with 75% similarity]

index 3bfd48da32606482fa9bde6fa837285421eeeddb..24d805eb389af244a8cd54a2c16aeb6c09ed71c8 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
+commit d62f64cc23a940eafe712c776b3249e4160753d1
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed May 16 00:13:33 2007 +0200
+
+    Coding Style Cleanup, new CHANGELOG
+
+commit 7d98ba770a7eaefa29ce927f31a0956df85bf650
+Author: Piotr Kruszynski <ppk@semihalf.com>
+Date:  Thu May 10 16:55:52 2007 +0200
+
+    [Motion-PRO] Add MTD and JFFS2 support, also add default partition
+    definition.
+
+commit e69f66c6ebe82bbbd1da766bc4eda40ec7ee5af1
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 15:57:43 2007 +0200
+
+    add: reading special purpose registers
+
+commit 1a50f164beb065f360fbddb76029607d6b099698
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 14:52:52 2007 +0200
+
+    add: Microblaze V5 exception handling
+
+commit ab874d5047e5d30dbc1e517ff26083efffa98ecb
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue May 8 14:39:11 2007 +0200
+
+    add: FSL control read and write
+
+commit de1de02a7cbf05e6b63e0d8ffc624f12493f6ba3
+Author: Piotr Kruszynski <ppk@semihalf.com>
+Date:  Tue May 8 13:05:44 2007 +0200
+
+    [Motion-PRO] Add support for I2C, EEPROM and RTC.
+
+commit fa5c2ba123b1bf88455bfc21db5e786ca045029d
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 10:23:56 2007 +0200
+
+    [Motion-PRO] Add ATA support. Add CF-booting commands to the default
+    environment.
+
+commit 06241d50a3ab1b20a0b08baeeaffcaa23ae4b839
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 09:39:12 2007 +0200
+
+    [Motion-PRO] Change IPB clock frequency from 50MHz to 100MHz. This
+    eliminates networking problems in Linux (timeouts).
+
+commit 1f1369c34b629be94702684d41d3fddf0f6193e7
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue May 8 09:21:57 2007 +0200
+
+    [Motion-PRO] Enable Flat Device Tree support and modify default environment
+    to allow booting of FDT-expecting kernels.
+
+commit fb05f6da35ea1c15c553abe6f23f656bf18dc5db
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 23:58:31 2007 +0200
+
+    new: USE_MSR_INTR support
+
+commit 008861a2f3ef2c062744d733787c7e530a1b8761
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Mon May 7 22:36:15 2007 +0200
+
+    [MPC5xxx] There are networking problems on the Motion-PRO board with
+    current PHY initalization code (tftp timeouts all the time). This commit
+    temporarily disables PHY initalization sequence to make the networking
+    operational, until a fix is found.
+
+commit abca901869c3760b6c5fecb825db6c1d91a78a93
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Mon May 7 22:10:36 2007 +0200
+
+    Get rid of duplicated file (see include/configs/sbc8560.h instead)
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 207b7b2c9d9752e0f6478c30c29b7087f6e6cbb6
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Mon May 7 22:07:08 2007 +0200
+
+    Get rid of duplicated file (see doc/README.SBC8560 instead)
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit a7bac7e9b57ba948051beb19ec5be3a75ce75383
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:43:10 2007 +0200
+
+    fix: read and write MSR - repair number of parameters
+
+commit 19bf1fbad7f19d5a120be9b1daf136e052fcab39
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:33:51 2007 +0200
+
+    new: fsl interrupt support
+    FSL_Has_data is connected to INTC.
+
+commit 792032baa7d625e34c981ab6df521911bd8dc861
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:30:12 2007 +0200
+
+    fix: interrupt handler
+    remove asm code
+
+commit f3f001a341ef185d0f13841be5b5dc3395aacc31
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:25:08 2007 +0200
+
+    fix: remove asm code
+
+commit fb7c2dbef02c9f6f8d7b04ec4c2bfb91418b9c01
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 19:12:43 2007 +0200
+
+    fix: clean interrupt
+
+commit 42efed6130c8fcf7da881385b5427065d2801757
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 17:22:25 2007 +0200
+
+    fix: interrupt handler for multiple sources
+
+commit 48fbd3a4cdabbebc1debd7eed73c00c2caf914f6
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Mon May 7 17:11:09 2007 +0200
+
+    new: add writing to msr register
+
+commit ac4cd59d59c9bf3f89cb7a344abf8184d678f562
+Author: Timur Tabi <timur@freescale.com>
+Date:  Sat May 5 08:12:30 2007 +0200
+
+    5xxx: write MAC address to mac-address and local-mac-address
+
+    Some device trees have a mac-address property, some have local-mac-address,
+    and some have both.  To support all of these device trees, ftp_cpu_setup()
+    should write the MAC address to mac-address and local-mac-address, if they
+    exist.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+    Acked-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit a9d87e2707dcb249f6bb7f7ff7e00acd8cda9fd2
+Author: Grzegorz Wianecki <grzegorz.wianecki@gmail.com>
+Date:  Sun Apr 29 14:01:54 2007 +0200
+
+    [PATCH] Use PVR to distinguish MPC5200B from MPC5200 in boot message
+
+    MPC5200B systems are incorrectly reported as MPC5200 in U-Boot start-up
+    message. Use PVR to distinguish between the two variants, and print proper CPU
+    information.
+
+    Signed-off-by: Grzegorz Wianecki <grzegorz.wianecki@gmail.com>
+    Signed-off-by: Bartlomiej Sieka <tur@semihalf.com>
+    Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 4ec5bd55ed1ffa91a774af298769621f4fbb18c1
+Author: Ladislav Michl <ladis@linux-mips.org>
+Date:  Wed Apr 25 16:01:26 2007 +0200
+
+    [PATCH] simplify silent console
+
+    Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit b7598a43f2b421a713d8135e98a42c37d9eb9df0
+Author: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+Date:  Mon Apr 23 15:30:39 2007 +0200
+
+    [PATCH] Avoid assigning PCI resources from zero address
+
+    If a PCI IDE card happens to get a zero address assigned to it, the Linux IDE
+    core complains and IDE drivers fails to work.  Also, assigning zero to a BAR
+    was illegal according to PCI 2.1 (the later revisions seem to have excluded the
+    sentence about "0" being considered an invalid address) -- so, use a reasonable
+    starting value of 0x1000 (that's what the most Linux archs are using).
+
+    Alternatively, one might have fixed the calls to pci_set_region() individually
+    (some code even seems to have taken care of this issue) but that would have
+    been a lot more work. :-)
+
+    Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit 9ffd451afeb08e5be7ddae680487ec962b2bca25
+Author: Jeffrey Mann <mannj@embeddedplanet.com>
+Date:  Mon Apr 23 14:00:11 2007 +0200
+
+    [patch] setenv(...) can delete environmentalvariables
+
+    update setenv() function so that entering a NULL value for the
+    variable's value will delete the environmental variable
+
+    Signed-off-by: Jeffrey Mann <mannj@embeddedplanet.com>
+    Acked-by: Stefan Roese <sr@denx.de>
+
+commit ebd0a0ae05a44769c4e27458ad4e9f3438250443
+Author: Mike Frysinger <vapier@gentoo.org>
+Date:  Mon Apr 23 13:54:24 2007 +0200
+
+    [patch] use unsigned char in smc91111 driver for mac
+
+    the v_mac variable in the smc91111 driver is declared as a signed char ...
+    this causes problems when one of the bytes in the MAC is "signed" like 0xE0
+    because when it gets printed out, you get a display like:
+    0xFFFFFFE0 and that's no good
+
+    Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+commit ffc50f9bb194343c6303517a517708457a5eb6b8
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat May 5 18:54:42 2007 +0200
+
+    new: FSL and MSR support #2
+
+commit f7e2e0eb0668136305f78bb9c21be79b48a34247
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat May 5 18:27:16 2007 +0200
+
+    new: FSL and MSR support
+
+commit 2f15278c2eb911c668b4fe562130b78cf554d139
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Sat May 5 18:23:11 2007 +0200
+
+    Coding stylke cleanup; update CHANGELOG.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 885ec89b648a899a2f32393fd3ffd9f7234c4402
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Sat May 5 18:05:02 2007 +0200
+
+    Add STX GP3 SSA board to MAKEALL script; update CHANGELOG.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 5499645b3fe17a548af9dfc479ca6e2455f179a2
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Sat May 5 17:15:50 2007 +0200
+
+    Make "file" command happy with some config.mk files; update CHANGELOG
+
+commit e3b8c78bc2489c27ae020986ef0eaca684866cef
+Author: Jeffrey Mann <mannj@embeddedplanet.com>
+Date:  Sat May 5 08:32:14 2007 +0200
+
+    ppc4xx: Detect if the sysclk on Sequoia is 33 or 33.333 MHz
+
+    The AMCC Secquoia board has been changed in a new revision from using a
+    33.000 MHz clock to a 33.333 MHz system clock. A bit in the CPLD
+    indicates the difference. This patch reads that bit and uses the correct
+    clock speed for the board. This code is backward compatable will all
+    prior boards. All prior boards will be read as 33.000.
+
+    Signed-off-by: Jeffrey Mann <mannj@embeddedplanet.com>
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit f544ff6656fca263ed1ebe39899b6d95da67c8b8
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat May 5 08:29:01 2007 +0200
+
+    ppc4xx: Sequoia: Remove cpu/ppc4xx/speed.c from NAND booting
+
+    Using cpu/ppc4xx/speed.c to calculate the bus frequency is too big
+    for the 4k NAND boot image so define bus_frequency to 133MHz here
+    which is save for the refresh counter setup.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit a79886590593ba1d667c840caa4940c61639f18f
+Author: Thomas Knobloch <knobloch@siemens.com>
+Date:  Sat May 5 07:04:42 2007 +0200
+
+    NAND: Wrong calculation of page number in nand_block_bad()
+
+    In case that there is no memory based bad block table available the
+    function nand_block_checkbad() in drivers/mtd/nand/nand_base.c will call
+    nand_block_bad() directly. When parameter 'getchip' is set to zero,
+    nand_block_bad() will not right shift the offset to calculate the
+    correct page number.
+
+    Signed-off-by: Thomas Knobloch <knobloch@siemens.com>
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 9877d7dcd1eebe61aa5d8b8ffe9c048ea426e6f6
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Fri May 4 10:02:33 2007 +0200
+
+    Fix initrd length corruption in bootm command.
+
+    When using FDT Images, the length of an inital ramdisk was
+    overwritten (bug introduced by commit 87a449c8, 22 Aug 2006).
+
+    Patches by Timur Tabi & Johns Daniel.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 068aab660bc3912b930be5540e6b3f3fd6ad3c96
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Thu May 3 19:43:52 2007 -0500
+
+    mpc83xx: fix trivial error in MAKEALL
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
+commit c64a89d6ce8584b9fc64f4e85da9ecac3cfc2c2a
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Thu May 3 16:34:41 2007 +0200
+
+    Update board configuration for STX GP3SSA board:
+
+    Enable hush shell, environment in flash rather in EEPROM,
+    more user-friendly default environment, etc.
+    The simple EEPROM environment can be selected easily in the board
+    config file.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 2c6fb199dc5756fc72f49d1f4de105e089049d65
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Tue Apr 24 14:37:49 2007 +0200
+
+    Cleanup STX GP3SSA code; fix build and compile problems.
+
+commit 35171dc04e028ecacc23ad916a66295472555dbf
+Author: Dan Malek <dan@embeddedalley.com>
+Date:  Fri Jan 5 09:15:34 2007 +0100
+
+    Add support for STX GP3SSA (stxssa) Board
+
+    Signed-off-by Dan Malek, <dan@embeddedalley.com>
+
+commit ffa621a0d12a1ccd81c936c567f8917a213787a8
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Sat Feb 24 01:08:13 2007 -0600
+
+    Cleaned up some 85xx PCI bugs
+
+    * Cleaned up the CDS PCI Config Tables and added NULL entries to
+      the end
+    * Fixed PCIe LAWBAR assignemt to use the cpu-relative address
+    * Fixed 85xx PCI code to assign powar region sizes based on the
+      config values (rather than hard-coding them)
+    * Fixed the 8548 CDS PCI2 IO to once again have 0 as the base address
+
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 6743105988fc44d5b0d30388c790607835aae7a6
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Mon Apr 23 02:54:25 2007 -0500
+
+    Add support for the 8568 MDS board
+
+    This included some changes to common files:
+    * Add 8568 processor SVR to various places
+    * Add support for setting the qe bus-frequency value in the dts
+    * Add the 8568MDS target to the Makefile
+
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit af1c2b84bf27c8565baddc82d1abb93700d10e2e
+Author: David Updegraff <dave@cray.com>
+Date:  Fri Apr 20 14:34:48 2007 -0500
+
+    Add support for treating unknown PHYs as generic PHYs.
+
+    When bringing up u-boot on new boards, PHY support sometimes gets
+    neglected. Most PHYs don't really need any special support,
+    though.  By adding a generic entry that always matches if nothing
+    else does, we can provide support for "unsupported" PHYs for the
+    tsec.
+
+    The generic PHY driver supports most PHYs, including gigabit.
+
+    Signed-off-by: David Updegraff <dave@cray.com>
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit a75af9bfd8fff0499efdbb90601cec5a2afef117
+Author: James Yang <James.Yang@freescale.com>
+Date:  Wed Feb 7 15:28:04 2007 -0600
+
+    Conditionalize 8641 Rev1.0 MCM workarounds
+
+    Signed-off-by: James Yang <James.Yang@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit f64702b7fc8f8df39d31add770df6e372f9e9ce3
+Author: Timur Tabi <timur@freescale.com>
+Date:  Mon Apr 30 13:59:50 2007 -0500
+
+    Fix memory initialization on MPC8349E-mITX
+
+    Define CFG_DDR_SDRAM_CLK_CNTL for the MPC8349E-mITX and MPC8349E-mITX-GP.
+    This allows ddr->sdram_clk_cntl to be properly initialized.  This is necessary
+    on some ITX boards, notably those with a revision 3.1 CPU.
+
+    Also change spd_sdram() in cpu/mpc83xx/spd_sdram.c to not write anything into
+    ddr->sdram_clk_cntl if CFG_DDR_SDRAM_CLK_CNTL is not defined.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+    Acked-by: Michael Benedict <MBenedict@twacs.com>
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
+commit 54b2d434ae9d01787936f34fe1759cf3d7624ae3
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Mon Apr 30 15:26:21 2007 -0500
+
+    mpc83xx: replace elaborate boottime verbosity with 'clocks' command
+
+    and fix CPU: to align with Board: display text.
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
+commit c1ab82669d9525998c34e802a12cad662723f22a
+Author: James Yang <James.Yang@freescale.com>
+Date:  Fri Mar 16 13:02:53 2007 -0500
+
+    Rewrote picos_to_clk() to avoid rounding errors.
+    Clarified that conversion is to DRAM clocks rather than platform clocks.
+    Made function static to spd_sdram.c.
+
+    Signed-off-by: James Yang <James.Yang@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 8b39501d28754e72726ce7fb02310e56dbdf116a
+Author: Stefan Roese <sr@denx.de>
+Date:  Sun Apr 29 14:13:01 2007 +0200
+
+    ppc4xx: Bamboo: Use current NAND driver and *not* the legacy driver
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 5c5d3242935cf3543af01142627494434834cf98
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Wed Apr 25 12:34:38 2007 -0500
+
+    mpc83xx: minor fixups for 8313rdb introduction
+
+commit 144876a380f5756f57412caf74c1d6dc201dd796
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue Apr 24 23:01:02 2007 +0200
+
+    [PATCH] MTD partition support, JFFS2 support
+
+commit 37ed6cdd4159195bfad68d8a237f6adda8f482cb
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Tue Apr 24 14:03:45 2007 +0200
+
+    ppc4xx: setup 440EPx/GRx ZMII/RGMII bridge depending on PFC register content.
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit 66ed6cca3f340f7a8a06d9272ae2ef8e96f0273d
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Mon Apr 23 02:37:47 2007 -0500
+
+    Reworked 85xx speed detection code
+
+    Changed the code to read the registers and calculate the clock
+    rates, rather than using a "switch" statement.
+
+    Idea from Andrew Klossner <andrew@cesa.opbu.xerox.com>
+
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 81f481ca708ed6a56bf9c410e3191dbad581c565
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Mon Apr 23 02:24:28 2007 -0500
+
+    Enable 8544 support
+
+    * Add support to the Makefile
+    * Add 8544 configuration support to the tsec driver
+    * Add 8544 SVR numbers to processor.h
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 0d8c3a2096eaff8d7de89d45e9af4d4b0d4868fe
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Fri Feb 23 17:12:25 2007 -0600
+
+    Support 1G size on 8548
+
+    e500v2 and newer cores support 1G page sizes.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 45cef612cc601d2d1c890fbbd7cdc9609a189a46
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Fri Feb 23 17:11:16 2007 -0600
+
+    Changed BOOKE_PAGESZ_nGB to BOOKE_PAGESZ_nG
+
+    The other pagesz constants use one letter to specify order of
+    magnitude. Also change the one reference to it in mpc8548cds/init.S
+
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 1f9a318cea14272edd10d63739e2d326c90f430e
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Fri Feb 23 16:28:46 2007 -0600
+
+    Only set ddrioovcr for 8548 rev1.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 9343dbf85bc03033f2102d8e8543567c2c1ad2d2
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Sat Feb 24 01:16:45 2007 -0600
+
+    Tweak DDR ECC error counter
+
+    Enable single-bit error counter when memory was cleared by ddr controller.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Andy Fleming <afleming@freescale.com>
+
+commit 85e7c7a45e3dd9c7ce3e722352ba60f8df1a7a4b
+Author: Timur Tabi <timur@freescale.com>
+Date:  Mon Feb 12 13:34:55 2007 -0600
+
+    85xx: write MAC address to mac-address and local-mac-address
+
+    Some device trees have a mac-address property, some have local-mac-address,
+    and some have both.  To support all of these device trees, ftp_cpu_setup()
+    should write the MAC address to mac-address and local-mac-address, if they
+    exist.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+
+commit 03b81b48eec0ad249ec97a4ae16c36fa2e014ff4
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Mon Apr 23 01:44:44 2007 -0500
+
+    Some 85xx cpu cleanups
+
+    * Cleaned up the TSR[WIS] clearing
+    * Cleaned up DMA initialization
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+    Acked-by: Andy Fleming <afleming@freescale.com>
+
+commit 151d5d992eab8c497b24c816c73dc1ad8bffb4eb
+Author: Andy Fleming <afleming@freescale.com>
+Date:  Mon Apr 23 01:32:22 2007 -0500
+
+    Add cpu support for the 8544
+
+    Recognize new SVR values, and add a few register definitions
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+    Acked-by: Andy Fleming <afleming@freescale.com>
+
+commit 25d83d7f4ac65727182d8ddaf7ba42fa74cf65ae
+Author: Jon Loeliger <jdl@freescale.com>
+Date:  Wed Apr 11 16:51:02 2007 -0500
+
+    Add MPC8544DS basic port board files.
+
+    Add board port under new board/freescale directory
+    structure and reuse existing PIXIS FPGA support there.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 0cde4b00fc7393b89f379d83a9d436dcb1334bfa
+Author: Jon Loeliger <jdl@freescale.com>
+Date:  Wed Apr 11 16:50:57 2007 -0500
+
+    Add MPC8544DS main configuration file.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 362dd83077ac04c0296bca3e824ec2fb3d44d9d6
+Author: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+Date:  Wed Dec 27 22:07:15 2006 +0300
+
+    Fix PCI I/O space mapping on Freescale MPC85x0ADS
+
+    The PCI I/O space mapping for Freescale MPC8540ADS board was broken by commit
+    52c7a68b8d587ebcf5a6b051b58b3d3ffa377ddc which failed to update the #define's
+    describing the local address window used for the PCI I/O space accesses -- fix
+    this and carry over the necessary changes into the MPC8560ADS code since the
+    PCI I/O space mapping was also broken for this board (by the earlier commit
+    087454609e47295443af793a282cddcd91a5f49c). Add the comments clarifying how
+    the PCI I/O space must be mapped to all the MPC85xx board config. headers.
+
+    Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+
+     board/mpc8540ads/init.S     |    4 ++--
+     board/mpc8560ads/init.S     |    4 ++--
+     include/configs/MPC8540ADS.h |    5 ++---
+     include/configs/MPC8541CDS.h |    2 +-
+     include/configs/MPC8548CDS.h |    2 +-
+     include/configs/MPC8560ADS.h |    8 ++++----
+     6 files changed, 12 insertions(+), 13 deletions(-)
+
+commit 96629cbabdb727d4a5e62542deefc01d498db6dc
+Author: Zang Roy-r61911 <tie-fei.zang@freescale.com>
+Date:  Tue Dec 5 16:42:30 2006 +0800
+
+    u-boot: Fix e500 v2 core reset bug
+
+    The following patch fixes the e500 v2 core reset bug.
+    For e500 v2 core, a new reset control register is added to reset the
+    processor.
+
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 63247a5acd58032e6cf33f525bc3923b467bac88
+Author: Zang Roy-r61911 <tie-fei.zang@freescale.com>
+Date:  Wed Dec 20 11:01:00 2006 +0800
+
+    u-boot: v2: Remove the fixed TLB and LAW entrynubmer
+
+    Remove the fixed TLB and LAW entry nubmer. Use actually TLB and LAW
+    entry number to control the loop.  This can reduce the potential risk
+    for the 85xx processor increasing its TLB adn LAW entry number.
+
+    Signed-off-by: Swarthout Edward <swarthout@freescale.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 0b1934ba12fd408fcc3b8bd9f4b04864c42a42bf
+Author: Zang Roy-r61911 <tie-fei.zang@freescale.com>
+Date:  Mon Dec 18 17:01:04 2006 +0800
+
+    u-boot: Fix the 85xxcds tsec bug
+
+    Fix the 85xxcds tsec bug.
+    When enable PCI, tsec.o should be added to u-boot.lds to make tsec work.
+
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 7337b237ffc4aaf1b9467024fe472a880d852598
+Author: Zang Roy-r61911 <tie-fei.zang@freescale.com>
+Date:  Fri Dec 15 14:43:31 2006 +0800
+
+    u-boot: Fix CPU2 errata on MPC8548CDS board
+
+    This patch apply workaround of CPU2 errata on MPC8548CDS board.
+
+    Signed-off-by:Ebony Zhu <ebony.zhu@freescale.com>
+
+commit 39b18c4f3e0b6d0dc00f4e68bad2da3766c85f09
+Author: ebony.zhu@freescale.com <ebony.zhu@freescale.com>
+Date:  Mon Dec 18 16:25:15 2006 +0800
+
+    u-boot: Disables MPC8548CDS 2T_TIMING for DDR by default
+
+    This patch disables MPC8548CDS 2T_TIMING for DDR by default.
+
+    Signed-off-by:Ebony Zhu <ebony.zhu@freescale.com>
+
+commit 41fb7e0f1ec9b91bdae2565bab5f2e3ee15039c7
+Author: Zang Roy-r61911 <tie-fei.zang@freescale.com>
+Date:  Thu Dec 14 14:14:55 2006 +0800
+
+    u-boot: Enable PCI function and add PEX & rapidio memory map on MPC8548CDS board
+
+    Enable PCI function and add PEX & rapidio memory map on MPC8548CDS
+    board.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 96b8a05432f346f36493535c85320b70ec9c7c1b
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:54:15 2007 -0500
+
+    mpc83xx: Add MPC8313ERDB support.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 49ea3b6eafe606285ae4d5c378026153dde53200
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:21 2007 -0500
+
+    mpc83xx: Add generic PCI setup code.
+
+    Board code can now request the generic setup code rather than having to
+    copy-and-paste it for themselves.  Boards should be converted to use this
+    once they're tested with it.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 7c98e5193e93df6b9b651851d54b638a61ebb0ea
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:19 2007 -0500
+
+    mpc83xx: Add 831x support to speed.c.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 0f253283a32d91e06844d7f87f9b33f4f4fbce8f
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:18 2007 -0500
+
+    mpc83xx: Add 831x support to global_data.h
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 95e7ef897e54591e615fc1b458b74c286fe1fb06
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:16 2007 -0500
+
+    mpc83xx: Change PVR_83xx to PVR_E300C1-3, and update checkcpu().
+
+    Rather than misleadingly define PVR_83xx as the specific type of 83xx
+    being built for, the PVR of each core revision is defined. checkcpu() now
+    prints the core that it detects, rather than aborting if it doesn't find
+    what it thinks it wants.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit a35b0c4950d84cf9e3a9e32b916135956d1ac636
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:34:15 2007 -0500
+
+    mpc83xx: Recognize SPR values for MPC8311 and MPC8313.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit d87c57b201b4572d16f1b642998faa00c9912b16
+Author: Scott Wood <scottwood@freescale.com>
+Date:  Mon Apr 16 14:31:55 2007 -0500
+
+    mpc83xx: Add register definitions for MPC831x.
+
+    Signed-off-by: Scott Wood <scottwood@freescale.com>
+
+commit 323bfa8f436dc3bc57187c9b1488bc3146ff1522
+Author: Stefan Roese <sr@denx.de>
+Date:  Mon Apr 23 12:00:22 2007 +0200
+
+    Remove BOARDLIBS usage completely
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 32556443840f127170e4baa8bdd5b567039f6c36
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 21:07:22 2007 +0200
+
+    [PATCH] SystemACE support for Microblaze
+
+commit 0643631aa1036cd746bf5d15f5a34bc7bc01ea4f
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 21:02:40 2007 +0200
+
+    16bit read/write little endian
+
+commit 9d1d6a34d26c5933bc097ce73c9348f95573cdd4
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sat Apr 21 20:53:31 2007 +0200
+
+    Change ML401 parameters - Xilinx BSP
+
+commit 2e343b9a57f32e1bd08c35c9976910333fb4e13d
+Author: Ed Swarthout <Ed.Swarthout@freescale.com>
+Date:  Wed Feb 28 05:37:29 2007 -0600
+
+    mpc8641hpcn: Fix LAW and TLB setup to use the IO_PHYS #defines.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+
+commit 79cb47391eebef85acadb3f6961ef6c55cace6ac
+Author: Zhang Wei <wei.zhang@freescale.com>
+Date:  Fri Jan 19 10:42:37 2007 +0800
+
+    Enable LAWs for MPC8641 PCI-Ex2.
+
+    Signed-off-by: Zhang Wei <wei.zhang@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit bd7851ce1e1f140665b520026abf1042968b1102
+Author: Jon Loeliger <jdl@freescale.com>
+Date:  Fri Apr 20 14:12:26 2007 -0500
+
+    mpc86xx; Write MAC address to mac-address and local-mac-address
+
+    Some device trees have a mac-address property, some have local-mac-address,
+    and some have both.  To support all of these device trees, ftp_cpu_setup()
+    should write the MAC address to mac-address and local-mac-address, if they
+    exist.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 7dbdf28b8bd855a8530dc3292e4982575a197060
+Author: Jon Loeliger <jdl@freescale.com>
+Date:  Fri Apr 20 14:11:38 2007 -0500
+
+    mpc86xx: protect memcpy to bad address if a mac-address is missing from dt
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 14da5f7675bbb427c469e3f45006e027b6e21db9
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Fri Apr 20 17:43:28 2007 +0200
+
+    Cleanup compiler warnings, update CHANGELOG
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 6923565db12af34fd5e02d354ee65a8c78ac460f
+Author: Detlev Zundel <dzu@denx.de>
+Date:  Fri Apr 20 12:01:47 2007 +0200
+
+    Fix breakage of NC650 board with respect to nand support.
+
+    Signed-off-by: Detlev Zundel <dzu@denx.de>
+
+commit 39f23cd90947639ac278a18ff277ec786b5ac167
+Author: Domen Puncer <domen.puncer@telargo.com>
+Date:  Fri Apr 20 11:13:16 2007 +0200
+
+    [RFC PATCH] icecube/lite5200b: fix OF_TBCLK (timebase-frequency) calculation
+
+    G2 core reference manual says decrementer and time base
+    are decreasing/increasing once every 4 bus clock cycles.
+    Lets fix it, so time in Linux won't run twice as fast
+
+    Signed-off-by: Domen Puncer <domen.puncer@telargo.com>
+    Acked-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 7651f8bdbba03bb0b4f241e2d2c4cb65b230bd56
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Thu Apr 19 23:14:39 2007 -0400
+
+    Fix serious pointer bug with bootm and reserve map.
+
+    What was suppose to be a stack variable was declared as a pointer,
+      overwriting random memory.
+    Also moved the libfdt.a requirement into the main Makefile.  That is
+      The U-Boot Way.
+
+commit d21686263574e95cb3e9e9b0496f968b1b897fdb
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Apr 19 09:53:52 2007 +0200
+
+    ppc4xx: Fix chip select timing for SysACE access on AMCC Katmai
+
+    Previous versions used full wait states for the chip select #1 which
+    is connected to the Xilinix SystemACE controller on the AMCC Katmai
+    evaluation board. This leads to really slow access and therefore low
+    performance. This patch now sets up the chip select a lot faster
+    resulting in much better read/write performance of the Linux driver.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 37837828d89084879bee2f2b8c7c68d4695940df
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 18 17:49:29 2007 +0200
+
+    Clenaup, update CHANGELOG
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit fd094c6379e2ef8a4d0ceb5640b24cb0c8d04449
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 18 17:20:58 2007 +0200
+
+    Update CHANGELOG
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 2a26ec4732efd7a308d0bbc97714c1d75ef1173b
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 18 17:07:26 2007 +0200
+
+    Cleanup, update CHANGELOG
+
+    Sigend-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 5f6c732affea9647762d27a4617a2ae64c52dceb
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 18 16:17:46 2007 +0200
+
+    Update CHANGELOG
+
+commit ad4eb555671d97f96dc56eab55103b1f86874b01
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 18 14:30:39 2007 +0200
+
+    MCC200 board: remove warning which is obsolete after PSoC firmware changes
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 3747a3f010b2b1442dec3e871c69788b6017aaae
+Author: Domen Puncer <domen.puncer@telargo.com>
+Date:  Wed Apr 18 12:11:05 2007 +0200
+
+    [PATCH] icecube/lite5200b: document wakeup from low-power support
+
+    Signed-off-by: Domen Puncer <domen.puncer@telargo.com>
+
+commit e673226ff9d6aa91b47ceac74b8c13770b06bb37
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Apr 18 12:07:47 2007 +0200
+
+    ppc4xx: Update Acadia to not setup PLL when booting via bootstrap EEPROM
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 90e6f41cf09fc98f6ccb510e183d53ab8546cf2f
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Apr 18 12:05:59 2007 +0200
+
+    ppc4xx: Add output for bootrom location to 405EZ ports
+
+    Now 405EZ ports also show upon bootup from which boot device
+    they are configured to boot:
+
+    U-Boot 1.2.0-gd3832e8f-dirty (Apr 18 2007 - 07:47:05)
+
+    CPU:   AMCC PowerPC 405EZ Rev. A at 199.999 MHz (PLB=133, OPB=66, EBC=66 MHz)
+          Bootstrap Option E - Boot ROM Location EBC (32 bits)
+          16 kB I-Cache 16 kB D-Cache
+    Board: Acadia - AMCC PPC405EZ Evaluation Board
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 9c00dfb0bf89c8c23e8af5b5bdf49cf66d769f85
+Author: Peter Pearse <peter.pearse@arm.com>
+Date:  Tue Apr 17 13:30:33 2007 +0100
+
+    Move ppearse to ARM board list
+    Add Konstantin Kletschke for scb9328.
+    Signed-off-by: Peter Pearse <peter.pearse@arm.com>
+
+commit d3832e8fe1b214ec62424eac36cfda9fc56d21b3
+Author: Domen Puncer <domen.puncer@telargo.com>
+Date:  Mon Apr 16 14:00:13 2007 +0200
+
+    [PATCH] icecube/lite5200b: wakeup from low-power support
+
+    U-Boot part of Lite5200b low power mode support.
+    Puts SDRAM out of self-refresh and transfers control to
+    address saved at physical 0x0.
+
+    Signed-off-by: Domen Puncer <domen.puncer@telargo.com>
+    Acked-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit f35a53fc7b0c79fcfe7bdc01163c4b34aaba1460
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sun Apr 15 13:54:26 2007 -0400
+
+    Fix the ft_cpu_setup() property settings.
+
+    Use "setter" functions instead of flags, cleaner and more flexible.
+    It also fixes the problem noted by Timur Tabi that the ethernet MAC
+    addresses were all being set incorrectly to the same MAC address.
+
+commit c28abb9c614f65ce2096cc4a66fc886c77d0e5a4
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Apr 14 22:51:24 2007 -0400
+
+    Improve the bootm command for CONFIG_OF_LIBFDT
+
+    In bootm, create the "/chosen" node only if it doesn't already exist
+      (better matches the previous behavior).
+    Update for proper reserved memory map handling for initrd.
+
+commit 3f9f08cf91c8a6949a5d78a18bd3d8df7b86d888
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Apr 14 22:46:41 2007 -0400
+
+    Add some utilities to manipulate the reserved memory map.
+
+commit 8048cdd56f04a756eeea4951f402bf5cc33785db
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Sat Apr 14 21:16:54 2007 +0200
+
+    Update CHANGELOG
+
+commit 8e6875183cdca91c134408d119d4abcd48ef6856
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 18:56:46 2006 +0100
+
+    AVR32: Enable MMC support
+
+    Set up the portmux for the MMC interface and enable the MMC driver
+    along with support for DOS partitions, ext2 and FAT filesystems.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit fc26c97bb6df41b4a95662c34054fe912387bf38
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Fri Jan 20 10:03:53 2006 +0100
+
+    Atmel MCI driver
+
+    Driver for the Atmel MCI controller (MMC interface) for AT32AP CPUs.
+
+    The AT91 ARM-based CPUs use basically the same hardware, so it should
+    be possible to share this driver, but no effort has been made so far.
+
+    Hardware documentation can be found in the AT32AP7000 data sheet,
+    which can be downloaded from
+
+    http://www.atmel.com/dyn/products/datasheets.asp?family_id=682
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 05fdab1ef6a10d049a50021a86f1226f444d9b9f
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 18:55:37 2006 +0100
+
+    AVR32: Add clk and gpio infrastructure for mmci
+
+    Implement functions for configuring the mmci pins, as well as
+    functions for getting the clock rate of the mmci controller.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 7fac3f69e9f05c5e5326681976c35d129324c4de
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 18:53:56 2006 +0100
+
+    Enable partition support with MMC
+
+    Include implementations of init_part() and get_partition_info() when
+    CONFIG_MMC is set.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 9a24f477a1ed5bb0f74377c985d754ebbfa44872
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 17:14:30 2006 +0100
+
+    AVR32: Enable networking
+
+    Implement MACB initialization for AVR32 and ATSTK1000, and turn
+    everything on, including the MACB driver.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 5c1fe1ffffd1750a7e47e5a2e2cd600c00e4f009
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Fri Jan 20 10:03:34 2006 +0100
+
+    Atmel MACB ethernet driver
+
+    Driver for the Atmel MACB on-chip ethernet controller.
+
+    This driver has been tested on the ATSTK1000 board with a AT32AP7000
+    CPU. It should probably work on AT91SAM926x as well with some minor
+    modifications.
+
+    Hardware documentation can be found in the AT32AP7000 data sheet,
+    which can be downloaded from
+
+    http://www.atmel.com/dyn/products/datasheets.asp?family_id=682
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit b4ec9c2d43d894729bb633bfdbdfa95a962c1556
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 16:56:14 2006 +0100
+
+    AVR32: Add clk and gpio infrastructure for macb0 and macb1
+
+    Implement functions for configuring the macb0 and macb1 pins, as
+    well as functions for getting the clock rate of the various
+    busses the macb ethernet controllers are connected to.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit d5acb95b16a0a74c643524342c3437e765426d05
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 15:39:15 2006 +0100
+
+    AVR32: Implement simple DMA memory allocator
+
+    Implement dma_alloc_coherent() which returns cache-aligned
+    uncacheable memory.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 91975b0fea773c9e681fea8cf3349669f27685ee
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 15:46:02 2006 +0100
+
+    Import <linux/mii.h> from the Linux kernel
+
+    Instead of creating yet another set of MII register definitions
+    in the macb driver, here's a complete set of definitions for everyone
+    to use.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 1b804b229556a4d862da93c0ec94e79419364b2c
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Wed Mar 21 19:47:36 2007 +0100
+
+    AVR32: Include more commands for ATSTK1000
+
+    Include the imi, imls and jffs commands sets by default on ATSTK1000.
+    Also define CONFIG_BOOTARGS to something more useful, define
+    CONFIG_BOOTCOMMAND and enable autoboot by default.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 9c0deb5ae3ea0189f2e08ac29ef1316f1fb8548d
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Wed Mar 21 19:44:48 2007 +0100
+
+    AVR32: Provide a definition of struct stat
+
+    Copy the definition of struct stat from the Linux kernel.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 12f099c08167a7a51aeee623bc16dafd0841271c
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Dec 17 14:46:06 2006 +0100
+
+    AVR32: Use initdram() instead of board_init_memories()
+
+    Conform to the "standard" interface and use initdram() instead of
+    board_init_memories() on AVR32. This enables us to get rid of the
+    sdram_size member of the global_data struct as well.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 1f4f2121c2685182eb87fa9a9b799d1917387a1c
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Mon Nov 20 15:53:10 2006 +0100
+
+    AVR32: Relocate u-boot to SDRAM
+
+    Relocate the u-boot image into SDRAM like everyone else does. This
+    means that we can handle much larger .data and .bss than we used to.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit df548d3c3e2bbc40258713167859ffc2ce99a900
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sun Nov 19 18:06:53 2006 +0100
+
+    AVR32: Resource management rewrite
+
+    Rewrite the resource management code (i.e. I/O memory, clock gating,
+    gpio) so it doesn't depend on any global state. This is necessary
+    because this code is heavily used before relocation to RAM, so we
+    can't write to any global variables.
+
+    As an added bonus, this makes u-boot's memory footprint a bit smaller,
+    although some functionality has been left out; all clocks are enabled
+    all the time, and there's no checking for gpio line conflicts.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 03d1e1365796cd15d1726e8a51fd8b5be50b2fe9
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sat Nov 18 18:01:13 2006 +0100
+
+    AVR32: Clean up memory-map.h for at32ap7000
+
+    Convert spaces to tabs (must have missed this one last time around),
+    sort the entries by address and group them together by bus
+    connectivity.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 28c699ef69f4b6cdf252e4747b7b590028a88981
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sat Nov 18 17:32:31 2006 +0100
+
+    AVR32: Build position-independent u-boot
+
+    Add -fPIC -mno-init-got to the avr32-specific CFLAGS to make u-boot
+    position independent. This will make relocation a lot easier.
+
+    -mno-init-got means that gcc shouldn't emit code to load the GOT
+    address into r6 in every function prologue. We do it once and for
+    all in the early startup assembly code, so enabling this option
+    makes u-boot a bit faster and smaller.
+
+    The assembly parts have always been position-independent, so no code
+    changes should be necessary.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 5374b36de91d006d1df9536259fa9f66b01aa3aa
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sat Nov 18 17:24:31 2006 +0100
+
+    AVR32: Use avr32-linux- cross-compilation prefix by default
+
+    It doesn't really matter which toolchain you use to compile u-boot,
+    but the avr32-linux one is probably what most people have installed.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit c841beeddebece0039e724fb27f4d1a39ee1c6b6
+Author: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date:  Sat Nov 18 17:15:30 2006 +0100
+
+    AVR32: Split start_u_boot into board_init_f and board_init_r
+
+    Split the avr32 initialization code into a function to run before
+    relocation, board_init_f and a function to run after relocation,
+    board_init_r. For now, board_init_f simply calls board_init_r
+    at the end.
+
+    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
+
+commit 37403005cfe6bb13964d450f6a48a0b0f2f7017e
+Author: Heiko Schocher <hs@pollux.denx.de>
+Date:  Sat Apr 14 05:26:48 2007 +0200
+
+    [Fix]      Set the LED status register on the UC101 for the LXT971 PHY.
+           clear the Display after reset.
+
+    Signed-off-by: Heiko Schocher <hs@denx.de>
+
+commit 7882751c78b7ecabfd49b0eff8de27661c71f16c
+Author: Denis Peter <d.peter@mpl.ch>
+Date:  Fri Apr 13 09:13:33 2007 +0200
+
+    [PATCH] Fix bugs in cmd_ide.c and cmd_scsi.c
+
+    Fix bug introduced by "Fix get_partition_info() parameter error in all
+    other calls" from 2005-03-04 in cmd_ide.c and cmd_scsi.c, which prevented
+    to use diskboot or scsiboot form another device than 0.
+
+    Signed-off-by: Denis Peter <d.peter@mpl.ch>
+
+commit 0b94504d22e70f537c17a0d38c87edb6e370977d
+Author: Greg Lopp <lopp@pobox.com>
+Date:  Fri Apr 13 08:02:24 2007 +0200
+
+    [PATCH] Fix use of "void *" for block dev read/write buffer pointers
+
+    Signed-of-by: Greg Lopp <lopp@pobox.com>
+    Acked-by: Grant Likely <grant.likely@secretlab.ca>
+
+commit 6fbf261f8df294e589cfadebebe5468e3c0f29e9
+Author: Xie Xiaobo <r63061@freescale.com>
+Date:  Fri Mar 9 19:08:25 2007 +0800
+
+    Fix two bugs for MPC83xx DDR2 controller SPD Init
+
+    There are a few bugs in the cpu/mpc83xx/spd_sdram.c
+    the first bug is that the picos_to_clk routine introduces a huge
+    rounding error in 83xx.
+    the second bug is that the mode register write recovery field is
+    tWR-1, not tWR >> 1.
+
+commit 2ad3aba01d37b72e7c957b07e102fccd64fe6d13
+Author: Jeffrey Mann <mannj@embeddedplanet.com>
+Date:  Thu Apr 12 14:15:59 2007 +0200
+
+    ppc4xx: Fix i2c divisor calcularion for PPC4xx
+
+    This patch fixes changes the i2c_init(...) function to use the function
+    get_OPB_freq() rather than calculating the OPB speed by
+    sysInfo.freqPLB/sysInfo.pllOpbDiv. The get_OPB_freq() function is
+    specific per processor. The prior method was not and so was calculating
+    the wrong speed for some PPC4xx processors.
+
+    Signed-off-by: Jeffrey Mann <mannj@embeddedplanet.com>
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 6c9ba919375db977aaad9146bf320c7afd07ae7a
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 11 17:25:01 2007 +0200
+
+    Update CHANGELOG
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 51056dd9863e6a1bc363afbbe1775c58cd967418
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 11 17:22:55 2007 +0200
+
+    Update for SC3 board
+
+    * Make IDE timeout configurable through ide_reset_timeout variable.
+    * Use Newline as "password" string
+    * Use just a single partition in NAND flash
+
+commit 3d98b85800c80dc68227c8f10bf5c93456d6d054
+Author: Haiying Wang <haiying.wang@freescale.com>
+Date:  Mon Jan 22 12:37:30 2007 -0600
+
+    Add PIXIS FPGA support for MPC8641HPCN board.
+
+    Move the 8641HPCN's PIXIS code to the new directory
+    board/freescale/common/ as it will be shared by
+    future boards not in the same processor family.
+
+    Write a "pixis_reset" command that utilizes the FPGA
+    reset sequencer to support alternate soft-reset options
+    such as using the "alternate" flash bank, enabling
+    the watch dog, or choosing different CPU frequencies.
+
+    Add documentation for the pixis_reset to README.mpc8641hpcn.
+
+    Signed-off-by: Haiying Wang <haiying.wang@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 64dbbd40c58349b64f43fd33dbb5ca0adb67d642
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Fri Apr 6 14:19:43 2007 -0400
+
+    Moved fdt command support code to fdt_support.c
+
+    ...in preparation for improving the bootm command's handling of fdt blobs.
+    Also cleaned up some coding sloppiness.
+
+commit 6679f9299534e488a171a9bb8f9bb891de247aab
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Fri Apr 6 14:17:14 2007 -0400
+
+    libfdt: Make fdt_check_header() public
+
+    Changed _fdt_check_header() to fdt_check_header() and made it part of
+    the interface - it is a useful routine.
+
+    Also did some asthetics cleanup to the include files (headers).
+
+commit c0707ce65677650b5ceab0500ee50ae5168afef2
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:34:06 2007 +0800
+
+    [Blackfin][PATCH] Kill off a bunch of common local prototypes
+
+commit 7b7e30aa64bb6657a1bfd32fdbdbfeb561e6a48d
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:33:04 2007 +0800
+
+    [Blackfin][PATCH] Fix dynamic CPLB generation issue
+
+commit 0445e3a264251d75b1be45ef713c70726a2952f0
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:31:47 2007 +0800
+
+    [Blackfin][PATCH] minior cleanup
+
+commit 155fd766573981090e638b493d5857562151862e
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:31:18 2007 +0800
+
+    [Blackfin][PATCH] Fix copyright and update license
+
+commit 9fd437bbd75d282f899e1da50be20a2bf38450bc
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:30:25 2007 +0800
+
+    [Blackfin][PATCH] Add BF537 EMAC driver initialization
+
+commit 889256e8604e0c68db1d866d720894dffede9df6
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:29:55 2007 +0800
+
+    [Blackfin][PATCH] call real the system synchronize instruction
+
+commit e0df1c921b788289564e4c1ee7120a6a9cd3ab05
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:29:17 2007 +0800
+
+    [Blackfin][PATCH] remove asm/page.h as we do not actually use/want any of these definitions nor does any other arch include it
+
+commit dfeeab2cd680df047e68e723b246adf6f33bb556
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Thu Apr 5 18:28:34 2007 +0800
+
+    [Blackfin][PATCH]: fix flash unaligned copy issue
+
+commit 443feb740584e406efa203af909fe2926608e8d5
+Author: Igor Marnat <marny@rambler.ru>
+Date:  Wed Mar 21 09:55:01 2007 +0300
+
+    Update usage of 'nc' in README.NetConsole
+
+    Added information about usage of NetConsole on systems where the -l and -p
+    switches are mutually exclusive.
+
+    Signed-off-by: Igor Marnat <marny@rambler.ru>
+    Signed-off-by: Ben Warren <bwarren@qstreams.com>
+
+commit 31c98a88228021b314c89ebb8104fb6473da4471
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 4 02:09:30 2007 +0200
+
+    Minor coding style cleanup.
+
+commit 94abd7c0583ebe01e799b25f451201deeaab550d
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Apr 4 01:49:15 2007 +0200
+
+    Minor cleanup.
+
+commit a65c5768e5537530bd1780af3d3fddc3113a163c
+Author: Stefan Roese <sr@denx.de>
+Date:  Mon Apr 2 10:09:30 2007 +0200
+
+    ppc4xx: Change SysACE address on Katmai
+
+    With this new base address of the Xilinx SystemACE controller
+    the Linux driver will be easier to adapt, since it can now be
+    mapped via the "normal" ioremap() call.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit aea03c4e8c3a21ce43d3faf48a6e6d474c8bdf73
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 14:30:53 2007 -0400
+
+    Fix some minor whitespace violations.
+
+commit 213bf8c822de8eecaf69860684469cdaba2e9e6a
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 12:23:51 2007 -0400
+
+    Add a flattened device tree (fdt) command (2 of 2)
+
+    Modifications to the existing code to support the new fdt command.
+
+commit 781e09ee6e3e3e392ab362c1f0ef1068adc76e3e
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 12:22:10 2007 -0400
+
+    Add a flattened device tree (fdt) command (1 of 2)
+
+    The fdt command uses David Gibson's libfdt library to manipulate as well
+    as print the flattened device tree.  This patch is the new command,
+    the second part is the modifications to the existing code.
+
+commit 3af0d587d93e0be5f96e1b30fa41e662f8b0803e
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 12:13:43 2007 -0400
+
+    libfdt: Enhanced and published fdt_next_tag()
+
+    Enhanced the formerly private function _fdt_next_tag() to allow stepping
+      through the tree, used to produce a human-readable dump, and made
+      it part of the published interface.
+    Also added some comments.
+
+commit fa3a74cec73dfd06a5ae35a9a3368200273aaa71
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 12:05:39 2007 -0400
+
+    libfdt: Customizations for use by u-boot.
+
+    Changes to David Gibson's original source to fit into u-boot's
+    environment.  No functionality changes.
+
+commit 35748177c64a4a83a00057e93bb33e40278a2a96
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 12:00:56 2007 -0400
+
+    libfdt: Import libfdt source (2 of 2)
+
+    This adds the applicable libfdt source files (unmodified) and a README
+    to explain where the source came from.
+
+commit 7cd5da0fe877e7171a4cdd44880bce783132871a
+Author: Gerald Van Baren <vanbaren@cideas.com>
+Date:  Sat Mar 31 11:59:59 2007 -0400
+
+    libfdt: Import libfdt source (1 of 2)
+
+    This adds the applicable libfdt source files (unmodified) and a README
+    to explain where the source came from.
+
+commit da6ebc1bc082cbe3b6bbde079cafe09f7ebbad4b
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 31 13:16:23 2007 +0200
+
+    ppc4xx: Update Katmai bootstrap command
+
+    Now the DDR2 frequency is also 2*PLB frequency when 166MHz PLB
+    is selected.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit cabee756a6532986729477c3cc1ea16ef8517ad2
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 31 13:15:06 2007 +0200
+
+    ppc4xx: Update 44x_spd_ddr2 code (440SP/440SPe)
+
+    Additional RAM information is now printed upon powerup, like
+    DDR2 frequency and CAS latency.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 60723803431ac75cad085690789e433d5ab9174e
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 31 08:48:36 2007 +0200
+
+    ppc4xx: Change Yucca config file to support ECC
+
+    With the updated 44x DDR2 driver the Yucca board now supports
+    ECC generation and checking.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 490e5730c674b20d708b783a2c5ffd7208f83873
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 31 08:47:34 2007 +0200
+
+    ppc4xx: Fix "bootstrap" command for Katmai board
+
+    The board specific "bootstrap" command is now fixed and can
+    be used for the AMCC Katmai board to configure different
+    CPU/PLB/OPB frequencies.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 94f54703c3a776ec23e427ca2a16e0a79a5d50c1
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 31 08:46:08 2007 +0200
+
+    ppc4xx: Update 44x_spd_ddr2 code (440SP/440SPe)
+
+    Fix a bug in the auto calibration routine. This driver now runs
+    more reliable with the tested modules. It's also tested with
+    167MHz PLB frequency (667MHz DDR2 frequency) on the Katmai.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 342cd097be1e7affe82f42ab3da220959a699e64
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Fri Mar 30 22:52:09 2007 +0200
+
+    [PATCH] Clean include dependence
+
+commit 6f934210fb293fde2cfb4251c6d96fdc58b6a906
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Fri Mar 30 22:42:45 2007 +0200
+
+    [CLEAN] Remove inefficient Suzaku code
+
+commit 430f1b0f9a670c2f13eaa52e66a10db96dd3647d
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 28 15:03:16 2007 +0200
+
+    Merge some AMCC make targets to keep the top-level Makefile smaller
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 0c75c9d84307a9f1cbe1ff0c4d8937ee3a96475e
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 28 14:52:12 2007 +0200
+
+    i2c: Enable "old" i2c commands even when CONFIG_I2C_CMD_TREE is defined
+
+    The "old" i2c commands (iprobe, imd...) are now compiled in again,
+    even when the i2c command tree is enabled via the CONFIG_I2C_CMD_TREE
+    config option.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 5da048adf44bea5e3b94080d02903c2e3fe7aa4a
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Tue Mar 27 00:32:16 2007 +0200
+
+    PATCH: Resolve GPL license problem
+
+commit 1798049522f594013aea29457d46794298c6ae15
+Author: Michal Simek <root@monstr.eu>
+Date:  Mon Mar 26 01:39:07 2007 +0200
+
+    Support for XUPV2P board
+    Reset support
+    BSP autoconfig support
+
+commit 0d974d5297349504a2ddfa09314be573b5df320a
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 24 15:57:09 2007 +0100
+
+    [PATCH] Add 4xx GPIO functions
+
+    This patch adds some 4xx GPIO functions. It also moves some of the
+    common code and defines into a common 4xx GPIO header file.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 2db633658bbf366ab0c8dad7a0727e1fb2ae6b11
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 24 15:55:58 2007 +0100
+
+    [PATCH] Small Sequoia cleanup
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 3cb86f3e40d2a80356177434a99f75bc8baa9caf
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Mar 24 15:45:34 2007 +0100
+
+    [PATCH] Clean up 40EZ/Acadia support
+
+    This patch cleans up all the open issue of the preliminary
+    Acadia support.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 6eb1df835191d8ce4b81d5af40fa8e0fbe78e997
+Author: Jon Loeliger <jdl@freescale.com>
+Date:  Tue Dec 12 11:02:20 2006 -0600
+
+    Fix 8641HPCN problem with ld version 2.16
+
+    (Dot outside sections problem).
+
+    This fix is in the spirit of 807d5d7319330e336ab34a5623c5e0d73b87d540.
+
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 9964a4dd0d4ef5a037febaebf1aa494b1a72991c
+Author: Haiying Wang <haiying.wang@freescale.com>
+Date:  Thu Dec 7 10:35:55 2006 -0600
+
+    Set Rev 2.x 86xx PIC in mixed mode.
+
+    Prevent false interrupt from hanging Linux as MSR[EE] is set
+    to enable interrupts by changing the PIC out of the default
+    pass through mode into mixed mode.
+
+    Signed-off-by: Haiying Wang <haiying.wang@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 5a58a73ceb0a4059c42ef64cedbc1a45e0aaa00e
+Author: Jason Jin <jason.jin@freescale.com>
+Date:  Thu Dec 7 10:32:35 2006 -0600
+
+    Add flash cmd function to 8641HPCN ramboot
+
+    Also fixes some commmand for 8641 HPCN ramboot case.
+
+    Signed-off-by: Jason Jin <jason.jin@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 2ccceacc04b009d923afb7c26189ba2f8a2a5d46
+Author: Ed Swarthout <ed.swarthout@freescale.com>
+Date:  Thu Dec 7 10:34:14 2006 -0600
+
+    Add support for 8641 Rev 2 silicon.
+
+    Without this patch, I am unable to get to the prompt on rev 2 silicon.
+    Only set ddrioovcr for rev1.
+
+    Signed-off-by: Ed Swarthout<ed.swarthout@freescale.com>
+    Signed-off-by: Jon Loeliger <jdl@freescale.com>
+
+commit 44ba464b99001f8bd1c456a1e9d59726252f707a
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Thu Mar 22 00:13:12 2007 +0100
+
+    Code cleanup / re-insert previous Copyright entries.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 2a8dfe08359a1b663418b2faa1da1d7bce34d302
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Wed Mar 21 23:26:15 2007 +0100
+
+    Code cleanup. Update CHANGELOG
+
+commit e6615ecf4eaf4dd52696934aed8f5c6474cfd286
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 21 14:54:29 2007 +0100
+
+    ppc4xx: Fix file mode of include/configs/acadia.h
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit d5f4614c9350d9333e575100fb250aab774d0258
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Wed Mar 21 14:41:46 2007 +0100
+
+    SPC1920: fix small clock routing bug
+
+    Signed-off-by: Markus Klotzbuecher <mk@denx.de>
+
+commit 16c0cc1c82081a493ab87c51980b28336ce1bce8
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 21 13:39:57 2007 +0100
+
+    [PATCH] Add AMCC Acadia (405EZ) eval board support
+
+    This patch adds support for the new AMCC Acadia eval board.
+
+    Please note that this Acadia/405EZ support is still in a beta stage.
+    Still lot's of cleanup needed but we need a preliminary release now.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit e01bd218b00af73499331a1a701625a852cd286f
+Author: Stefan Roese <sr@denx.de>
+Date:  Wed Mar 21 13:38:59 2007 +0100
+
+    [PATCH] Add AMCC PPC405EZ support
+
+    This patch adds support for the new AMCC 405EZ PPC. It is in
+    preparation for the AMCC Acadia board support.
+
+    Please note that this Acadia/405EZ support is still in a beta stage.
+    Still lot's of cleanup needed but we need a preliminary release now.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 07e82cb2e284a893df6693f2a1337ab2c47bf6a1
+Author: Heiko Schocher <hs@pollux.denx.de>
+Date:  Wed Mar 21 08:45:17 2007 +0100
+
+    [PATCH] TQM8272: dont change the bits given from the HRCW
+                    for the SIUMCR and BCR Register.
+                    Fix the calculation for the EEprom Size
+
+    Signed-off-by: Heiko Schocher <hs@denx.de>
+
+commit 654589873dbafcf104dff133ce0d03a4506e9cc3
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Tue Mar 20 18:16:24 2007 +0800
+
+    [Blackfin][PATCH] Add BF561 EZKIT board support
+
+commit a6154fd1cfd020f6da8527e0365b1020a11a71d0
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 19 22:55:58 2007 +0800
+
+    [Blackfin][PATCH] minor cleanup
+
+commit 389b6bb50f745bf5038ce030300d8a8512e96f79
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Mon Mar 19 13:10:08 2007 +0100
+
+    Remove obsoleted POST files.
+
+    Signed-off-by: Wolfgang Denk <wd@denx.de>
+
+commit 8e709bbb2636b5670a8f2b575e138eb1f55773f6
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 19 01:26:11 2007 +0800
+
+    [PATCH] Add flash chip M29W320ET/B support
+
+commit 26bf7deca364a5b33f39e8f14ddd3f4081345015
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 19 01:24:52 2007 +0800
+
+    [Blackfin][PATCH] Add BF537 stamp board support
+
+commit 8423e5e31a7235d05a482627315fb11d49c17bd7
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Mar 16 21:11:42 2007 +0100
+
+    [PATCH] Use dynamic SDRAM TLB setup on AMCC Ebony 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 76d1466f918b881cda2d259254761e73885093c2
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Tue Mar 13 13:38:05 2007 +0100
+
+    [PATCH] renamed environment variable 'addcon' to 'addcons' for PCI405
+           boards in terms of unification.
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit a7090b993d3d4d2221ac3f33e6cb1d1b2ccc6bf0
+Author: Wolfgang Denk <wd@denx.de>
+Date:  Tue Mar 13 16:05:55 2007 +0100
+
+    Make SC3 board build with 'make O='; use 'addcons' consistently
+    (SC3 and Jupiter used to use 'addcon' instead).
+
+    Signed-off-by: Wolfgang Denk wd@denx.de
+
+commit 8502e30a28e492c756ea2d7df0ace026388fce4b
+Author: Heiko Schocher <hs@pollux.denx.de>
+Date:  Tue Mar 13 09:40:59 2007 +0100
+
+    [PATCH] update board config for jupiter Board:
+           added Hush Shell,
+                 CONFIG_CMDLINE_EDITING,
+                 CFG_ENV_ADDR_REDUND activated
+
+    Signed-off-by: Heiko Schocher <hs@denx.de>
+
+commit 0d93de11449390a5984b0236c3612e50f6dbb7e8
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 12 12:11:55 2007 +0800
+
+    [Blackfin][PATCH] minor cleanup
+
+commit bfa5754a58477ac917d21527cd0f079d87cf188e
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 12 01:42:06 2007 +0800
+
+    [Blackfin][PATCH] Fix BUILD_DIR option of MAKEALL building issue
+
+commit 8440bb14581a294375c34b91b42512f9753d1130
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Mon Mar 12 00:25:14 2007 +0800
+
+    [Blackfin][PATCH] code cleanup
+
+commit cfc67116a706fd18b8f6a9c11a16753c5626d689
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sun Mar 11 13:48:24 2007 +0100
+
+    [Microblaze][PATCH] part 2
+    timer support
+    interrupt controller support
+    flash support
+    ethernet support
+    cache support
+    board information support
+    env support
+    booting image support
+
+    adding support for Xilinx ML401
+
+commit 76316a318de91f6184e7c22a10e02d275ade2441
+Author: Michal Simek <monstr@monstr.eu>
+Date:  Sun Mar 11 13:42:58 2007 +0100
+
+    [Microblaze][PATCH]
+    timer support
+    interrupt controller support
+    flash support
+    ethernet support
+    cache support
+    board information support
+    env support
+    booting image support
+
+    adding support for Xilinx ML401
+
+commit 8db13d63157811c839d15a313d9f2d2f5fd10af3
+Author: Aubrey Li <aubrey.adi@gmail.com>
+Date:  Sat Mar 10 23:49:29 2007 +0800
+
+    [Blackfin][PATCH] code cleanup
+
+commit ef26a08fef928b7bc11ae2c109e638dc3a016d91
+Author: Aubrey.Li <aubrey.adi@gmail.com>
+Date:  Fri Mar 9 13:40:56 2007 +0800
+
+    [Blackfin][PATCH-2/2] Common files changed to support bf533 platform
+
+commit 3f0606ad0b5639f7f22848fe5b4574e754d0470f
+Author: Aubrey.Li <aubrey.adi@gmail.com>
+Date:  Fri Mar 9 13:38:44 2007 +0800
+
+    [Blackfin]PATCH-1/2]: Remove obsolete blackfin port and add bf533 platform support
+
+commit 992423ab43c2bcf6b704853bd00af77450915e20
+Author: Stefan Roese <sr@denx.de>
+Date:  Thu Mar 8 23:00:08 2007 +0100
+
+    ppc4xx: Fix file mode of sequoia.c
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit eb92f613556800f7483666db09d9a237ad911d4a
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Thu Mar 8 22:52:51 2007 +0100
+
+    Minor cleanup.
+
+commit 8ce16f55c7b9752af3d8bed84521aec5337e2de1
+Author: John Otken john@softadvances.com <john@softadvances.com>
+Date:  Thu Mar 8 09:39:48 2007 -0600
+
+    ppc4xx: Clear Sequoia/Rainier security engine reset bits
+
+    Signed-off-by: John Otken john@softadvances.com <john@softadvances.com>
+
+commit 650a330dd2539130c8c324791e2f9f75aed79d4e
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Thu Mar 8 16:26:52 2007 +0100
+
+    [PATCH] I2C: add some more SPD eeprom decoding for DDR2 modules
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit d9fc703246840c4b268debf48c334ba55c597dc0
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Thu Mar 8 16:25:47 2007 +0100
+
+    [PATCH] I2C: disable flat i2c commands when CONFIG_I2C_CMD_TREE is defined
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit ced5b9029043397348cdc88e0cfcd6b1f629250b
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Thu Mar 8 16:23:11 2007 +0100
+
+    [PATCH] 4xx: allow CONFIG_I2C_CMD_TREE without CONFIG_I2C_MULTI_BUS
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit d8a8ea5c476d37006fc7f85b7f903142795c8b14
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Thu Mar 8 16:20:32 2007 +0100
+
+    [PATCH] I2C: Add missing default CFG_SPD_BUS_NUM
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit f9fc6a5852a6335840882fa2111925010eea1abe
+Author: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+Date:  Wed Mar 7 15:32:01 2007 +0100
+
+    fixed ethernet phy configuration for plu405 board
+
+    Signed-off-by: Matthias Fuchs <matthias.fuchs@esd-electronics.com>
+
+commit 769104c9356594deb2092e204a39c05b33202d6c
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Thu Mar 8 21:49:27 2007 +0100
+
+    Minor cleanup
+
+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 83853178bd36bca6f0f8f1331476620c84a587fc
+Author: Ed Swarthout <Ed.Swarthout@freescale.com>
+Date:  Wed Mar 7 12:14:50 2007 -0600
+
+    net - Support ping reply when processing net-loop
+
+    Add ICMP_ECHO_REQUEST packet support by responding with a ICMP_ECHO_REPLY.
+
+    This permits the ping command to test the phy interface when the phy
+    is put in loopback mode (typically by setting register 0 bit 14).
+
+    It also allows the port to respond to an external ping when u-boot is
+    processing some other net command (such as tftp).  This is useful when
+    tftp appears to hang.
+
+    Signed-off-by: Ed Swarthout <Ed.Swarthout@freescale.com>
+    Signed-off-by: Ben Warren <bwarren@qstreams.com>
+
+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 647d3c3eed0da1d1505eecabe0b0fab96f956e68
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Sun Mar 4 01:36:05 2007 +0100
+
+    Some code cleanup.
+
+commit 781e026c8aa6f7e9eb5f0e72cc4d20971219b148
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Wed Feb 28 00:02:04 2007 -0600
+
+    mpc83xx: fix implicit declaration of function 'ft_get_prop' warnings
+
+    (cherry picked from c5bf13b02284c3204a723566a9bab700e5059659 commit)
+
+commit 4feab4de7bfc2cb2fed36ad76f93c3a69659bbaf
+Author: Kumar Gala <galak@kernel.crashing.org>
+Date:  Tue Feb 27 23:51:42 2007 -0600
+
+    mpc83xx: Fix config of Arbiter, System Priority, and Clock Mode
+
+    The config value for:
+    * CFG_ACR_PIPE_DEP
+    * CFG_ACR_RPTCNT
+    * CFG_SPCR_TSEC1EP
+    * CFG_SPCR_TSEC2EP
+    * CFG_SCCR_TSEC1CM
+    * CFG_SCCR_TSEC2CM
+
+    Were not being used when setting the appropriate register
+
+    Added:
+    * CFG_SCCR_USBMPHCM
+    * CFG_SCCR_USBDRCM
+    * CFG_SCCR_PCICM
+    * CFG_SCCR_ENCCM
+
+    To allow full config of the SCCR.
+
+    Also removed random CFG_SCCR settings in MPC8349EMDS, TQM834x, and sbc8349
+    that were just bogus.
+
+    Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
+
+commit d51b3cf371cd441030460ef19d36b2924c361b1a
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Thu Feb 22 20:06:57 2007 -0600
+
+    mpc83xx: update [local-]mac-address properties on UEC based devices
+
+    8360 and 832x weren't updating their [local-]mac-address
+    properties. This patch fixes that.
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+
+commit 61f4f912acbe60776c5e00df1ec94094ce672957
+Author: Timur Tabi <timur@freescale.com>
+Date:  Tue Feb 13 10:41:42 2007 -0600
+
+    mpc83xx: write MAC address to mac-address and local-mac-address
+
+    Some device trees have a mac-address property, some have local-mac-address,
+    and some have both.  To support all of these device trees, this patch
+    updates ftp_cpu_setup() to write the MAC address to mac-address if it exists.
+    This function already updates local-mac-address.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+
+commit 22d71a71f57fd5d38b27ac3848e50d790360a598
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Tue Feb 27 18:41:08 2007 -0600
+
+    mpc83xx: add command line editing by default
+
+commit 3fc0bd159103b536e1c54c6f4457a09b3aba66ca
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Wed Feb 14 19:50:53 2007 -0600
+
+    mpc83xx: Disable G1TXCLK, G2TXCLK h/w buffers
+
+    Disable G1TXCLK, G2TXCLK h/w buffers. This patch
+    fixes a networking timeout issue with MPC8360EA (Rev.2) PBs.
+
+    Verified on Rev. 1.1, Rev. 1.2, and Rev. 2.0 boards.
+
+    Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
+    Signed-off-by: Emilian Medve <Emilian.Medve@freescale.com>
+
+commit d61853cf2472e0b8bcbd131461a93d1c49ff0c1f
+Author: Xie Xiaobo <r63061@freescale.com>
+Date:  Wed Feb 14 18:27:17 2007 +0800
+
+    mpc83xx: Add DDR2 controller fixed/SPD Init for MPC83xx
+
+    The code supply fixed and SPD initialization for MPC83xx DDR2 Controller.
+    it pass DDR/DDR2 compliance tests.
+
+    Signed-off-by: Xie Xiaobo <X.Xie@freescale.com>
+
+commit b110f40bd180c6b560276589beedf753e97c46ce
+Author: Xie Xiaobo <r63061@freescale.com>
+Date:  Wed Feb 14 18:27:06 2007 +0800
+
+    mpc83xx: Add the cpu specific code for MPC8360E rev2.0 MDS
+
+    MPC8360E rev2.0 have new spridr,and PVR value,
+    The MDS board for MPC8360E rev2.0 has 32M bytes Flash and 256M DDR2 DIMM.
+
+    Signed-off-by: Xie Xiaobo <X.Xie@freescale.com>
+
+commit 8d172c0f0d85998a256a95b7459a5403a30380ed
+Author: Xie Xiaobo <r63061@freescale.com>
+Date:  Wed Feb 14 18:26:44 2007 +0800
+
+    mpc83xx: Add the cpu and board specific code for MPC8349E rev3.1 MDS
+
+    MPC8349E rev3.1 have new spridr,and PVR value,
+    The MDS board for MPC8349E rev3.1 has 32M bytes Flash and 256M DDR2 DIMM.
+
+    Signed-off-by: Xie Xiaobo<X.Xie@freescale.com>
+
+commit f6f5f709e5c8e4564c4dfeecfdf2279244f9c83b
+Author: Joakim Tjernlund <joakim.tjernlund@transmode.se>
+Date:  Wed Jan 31 11:04:19 2007 +0100
+
+    mpc83xx: Fix empty i2c reads/writes in fsl_i2c.c
+
+    Fix empty i2c reads/writes, i2c_write(0x50, 0x00, 0, NULL, 0)
+    which is used to se if an slave will ACK after receiving its address.
+
+    Correct i2c probing to use this method as the old method could upset
+    a slave as it wrote a data byte to it.
+
+    Add a small delay in i2c_init() to let the controller
+    shutdown any ongoing I2C activity.
+
+    Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
+
+commit 7a78f148d6a7298e4fface680dc7eacd877b1aba
+Author: Timur Tabi <timur@freescale.com>
+Date:  Wed Jan 31 15:54:29 2007 -0600
+
+    mpc83xx: Add support for the MPC8349E-mITX-GP
+
+    Add support for the MPC8349E-mITX-GP, a stripped-down version of the
+    MPC8349E-mITX.  Bonus features include support for low-boot (BMS bit in
+    HRCW is 0) for the ITX and a README for the ITX and the ITX-GP.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+
+commit fab16807adad350f618024350c6950165c247c72
+Author: Timur Tabi <timur@freescale.com>
+Date:  Wed Jan 31 15:54:20 2007 -0600
+
+    mpc83xx: Delete sdram_init() for MPC8349E-mITX
+
+    There is no SDRAM on any of the 8349 ITX variants, so function sdram_init()
+    never does anything.  This patch deletes it.
+
+    Signed-off-by: Timur Tabi <timur@freescale.com>
+
+commit a87c856eb411b9365937d0d4b9c21e46adbe1c14
+Author: Dave Liu <daveliu@freescale.com>
+Date:  Fri Jan 19 10:43:26 2007 +0800
+
+    mpc83xx: Fix the LAW1/3 bug
+
+    The patch solves the alignment problem of the local bus access windows to
+    render accessible the memory bank and PHY registers of UPC 1 (starting at
+    0xf801 0000). What we actually did was to adjust the sizes of the bus
+    access windows so that the base address alignment requirement would be met.
+
+    Signed-off-by: Chereji Marian <marian.chereji@freescale.com>
+    Signed-off-by: Gridish Shlomi <gridish@freescale.com>
+    Signed-off-by: Dave Liu <daveliu@freescale.com>
+
+commit 97c4b397dce236a7318b304667bf89e59d08b17c
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Tue Jan 30 16:15:31 2007 -0600
+
+    mpc83xx: don't hang if watchdog configured on 8360, 832x
+
+    don't hang if watchdog configured on 8360, 832x
+
+    The watchdog programming model is the same across all 83xx devices;
+    make the code reflect that.
+
+commit b70047478570e371ce7223be342ce98afea0f7d6
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Tue Jan 30 16:15:21 2007 -0600
+
+    mpc83xx: protect memcpy to bad address if a local-mac-address is missing from dt
+
+    protect memcpy to bad address if a local-mac-address is missing from dt
+
+commit 6752ed088c75c26a89b70c46b7326a4cd6015f29
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Tue Jan 30 16:15:04 2007 -0600
+
+    mpc83xx: make 8360 default environment fdt be 8360 (not 8349)
+
+    make 8360 default environment fdt be 8360 (not 8349)
+
+commit a28899c910024a0226331df07207b1038c300c93
+Author: Emilian Medve <Emilian.Medve@freescale.com>
+Date:  Tue Jan 30 16:14:50 2007 -0600
+
+    mpc83xx: Fix alternating tx error / tx buffer not ready bug in QE UEC
+
+    The problem is not gcc4 but the code itself. The BD_STATUS() macro can't
+    be used for busy-waiting since it strips the 'volatile' property from
+    the bd variable. gcc3 was working by pure luck.
+
+    This is a follow on patch to "Fix the UEC driver bug of QE"
+
+commit 3e78a31cfe3d3022f46f67eb88e1281d5cc2eb89
+Author: Kumar Gala <galak@kernel.crashing.org>
+Date:  Tue Jan 30 14:08:30 2007 -0600
+
+    mpc83xx: Replace CONFIG_MPC8349 and use CONFIG_MPC834X instead
+
+    The code that is ifdef'd with CONFIG_MPC8349 is actually applicable to all
+    MPC834X class processors.  Change the protections from CONFIG_MPC8349 to
+    CONFIG_MPC834X so they are more generic.
+
+    Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
+
+commit ae246dc6c1937c291014eadd90b6d48c438c7cb0
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Thu Jan 25 13:40:55 2007 -0600
+
+    mpc83xx: add MPC832XEMDS and sbc8349 to MAKEALL
+
+commit 4decd84e8f04279c5cfff7f8e907465ef8d8a3fb
+Author: Kim Phillips <kim.phillips@freescale.com>
+Date:  Wed Jan 24 17:18:37 2007 -0600
+
+    mpc83xx: sort Makefile targets
+
+    reordered targets alphabetically
+
+commit 91e25769771c1164ed63ffca0add49f934ae3343
+Author: Paul Gortmaker <paul.gortmaker@windriver.com>
+Date:  Tue Jan 16 11:38:14 2007 -0500
+
+    mpc83xx: U-Boot support for Wind River SBC8349
+
+    I've redone the SBC8349 support to match git-current, which
+    incorporates all the MPC834x updates from Freescale since the 1.1.6
+    release,  including the DDR changes.
+
+    I've kept all the SBC8349 files as parallel as possible to the
+    MPC8349EMDS ones for ease of maintenance and to allow for easy
+    inspection of what was changed to support this board.  Hence the SBC8349
+    U-Boot has FDT support and everything else that the MPC8349EMDS has.
+
+    Fortunately the Freescale updates added support for boards using CS0,
+    but I had to change spd_sdram.c to allow for board specific settings for
+    the sdram_clk_cntl (it is/was hard coded to zero, and that remains the
+    default if the board doesn't specify a value.)
+
+    Hopefully this should be mergeable as-is and require no whitespace
+    cleanups or similar, but if something doesn't measure up then let me
+    know and I'll fix it.
+
+    Thanks,
+    Paul.
+
+commit 05031db456ab227f3e3752f37b9b812b65bb83ad
+Author: Sam Song <samsongshu@yahoo.com.cn>
+Date:  Thu Dec 14 19:03:21 2006 +0800
+
+    mpc83xx: Remove a redundant semicolon in mpc8349itx.c
+
+    A redundant semicolon existed in mpc8349itx.c
+    should be removed.
+
+    Signed-off-by: Sam Song <samsongshu@yahoo.com.cn>
+
+commit f35f358241c549be3f75cfe2eaa642914275b7ba
+Author: Jerry Van Baren <gerald.vanbaren@comcast.net>
+Date:  Wed Dec 6 21:23:55 2006 -0500
+
+    mpc83xx: Put the version (and magic) after the HRCW.
+
+    Put the version (and magic) after the HRCW.  This puts it in a fixed
+    location in flash, not at the start of flash but as close as we can get.
+
+    Signed-off-by: Jerry Van Baren <vanbaren@cideas.com>
+
+commit 48aecd969171a6e99a55fae04933857787f9a5bd
+Author: Dave Liu <r63238@freescale.com>
+Date:  Thu Dec 7 21:14:51 2006 +0800
+
+    mpc83xx: Add the MPC832XEMDS board readme
+
+    Add the MPC832XEMDS board readme
+
+    Signed-off-by: Dave Liu <daveliu@freescale.com>
+
+commit 24c3aca3f1358b113d3215adb5433b156e99f72b
+Author: Dave Liu <r63238@freescale.com>
+Date:  Thu Dec 7 21:13:15 2006 +0800
+
+    mpc83xx: Add support for the MPC832XEMDS board
+
+    This patch supports DUART, ETH3/4 and PCI etc.
+
+    Signed-off-by: Dave Liu <daveliu@freescale.com>
+
+commit e080313c32322e15ab5a18eb896a252858c57284
+Author: Dave Liu <r63238@freescale.com>
+Date:  Thu Dec 7 21:11:58 2006 +0800
+
+    mpc83xx: streamline the 83xx immr head file
+
+    For better format and style, I streamlined the 83xx head files,
+    including immap_83xx.h and mpc83xx.h. In the old head files, 1)
+    duplicated macro definition appear in the both files; 2) the structure
+    of QE immr is duplicated in the immap_83xx.h and immap_qe.h; 3) The
+    macro definition put inside the each structure. So, I cleaned up the
+    structure of QE immr from immap_83xx.h, deleted the duplicated stuff and
+    moved the macro definition to mpc83xx.h, Just like MPC8260.
+
+    CHANGELOG
+
+    *streamline the 83xx immr head file
+
+    Signed-off-by: Dave Liu <daveliu@freescale.com>
+
+commit ddd02492f43db5408f5ab9f823b0ba5796e28ef0
+Author: Dave Liu <r63238@freescale.com>
+Date:  Wed Dec 6 11:38:17 2006 +0800
+
+    mpc83xx: Fix the UEC driver bug of QE
+
+    The patch prevents the GCC tool chain from striping useful code for
+    optimization. It will make UEC ethernet driver workable, Otherwise the
+    UEC will fail in tx when you are using gcc4.x. but the driver can work
+    when using gcc3.4.3.
+
+    CHANGELOG
+
+    *Prevent the GCC from striping code for optimization, Otherwise the UEC
+    will tx failed when you are using gcc4.x.
+
+    Signed-off-by: Dave Liu <daveliu@freescale.com>
+
+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
+
+    Add port for the lpc2292sodimm evaluation board from EmbeddedArtists
+
+commit 2daf046ba627f85f44195815778140039636244e
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue Jan 23 17:22:06 2007 +0100
+
+    [iDMR] Add MTD and JFFS2 support, also add default partition definition.
+
+commit f7db33101fbc9c8f0a10738ce87034875a17aeb9
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue Jan 23 14:21:14 2007 +0100
+
+    [iDMR] Flash driver on initialisation write-protects some sectors,
+    currently sectors 0-3. Sector 3 does not need to be protected, though
+    (U-boot occupies sectors 0-1 and the environment sector 2). This commit
+    fixes this, i.e., only sectors 0-2 are protected.
+
+commit 0ed47bb119cd2c4c16edb2548789148f9e6dc9de
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue Jan 23 14:11:22 2007 +0100
+
+    [iDMR] Using MII-related commands on iDRM board doesn't work now (e.g.,
+    "mii device" results in "Unexpected exception"). Fixing this properly
+    requires some clean-up in the FEC drivers infrastructure for ColdFire, so
+    this commit disables MII commads for now.
+
+commit 363d1d8f9c99b63daef81f5985cab3fc00edde5c
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Tue Jan 23 13:25:22 2007 +0100
+
+    [ColdFire MCF5271 family] Add CPU detection based on the value of Chip
+    Identification Register (CIR).
+
+commit fdef388758506765d4d6a7155c8f1584c63ff581
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Mon Jan 22 13:19:21 2007 +0800
+
+    use  CFG_WRITE_SWAPPED_DATA define instead of define CFG_FLASH_CFI_SWAP
+    The patch by Heiko Schocher <hs@pollux.denx.de> on Jan, 19, 2007
+    fixes cfi_driver bug for mpc7448hpc2 board. The default cfi_driver can support
+    mpc7448hpc2 board.
+
+commit a4012396645533aef218354eeba754dff0deace8
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Fri Jan 19 23:08:39 2007 +0100
+
+    Minor code cleanup.
+
 commit f539b7ba7d7ef6dd187c8209609001cb1cd95e39
 Author: Heiko Schocher <hs@pollux.denx.de>
 Date:  Fri Jan 19 19:57:10 2007 +0100
@@ -407,6 +3377,72 @@ Date:     Fri Dec 8 16:23:08 2006 +0100
 
     automatic update mechanism
 
+commit 9d27b3a0685ff99fc477983f315c04d49f657a8a
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Mon Dec 4 17:56:59 2006 +0800
+
+    Slight code clean up.
+    Add comments, delete duplicate define and remove spaces.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 4dbcd69e3e2776ea334590d5768e3692c5fae5c1
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Mon Dec 4 17:54:21 2006 +0800
+
+    Introduce PLL_CFG[0:4] table for processor 7448/7447A/7455/7457. The original
+    multiplier table can not refect the real PLL clock behavior of these
+    processors. Please refer to the hardware specification for detailed
+    information of the corresponding processors.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 4efe20c9579011d9987f62ed7d35ee8cdc1cf0e0
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Mon Dec 4 14:46:23 2006 +0800
+
+    Remove the static MAC address, ip address, server ip, netmask and
+    gateway ip for network setting.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 6f12c61cf31ed73d72ddfcfc712a854a3a177aaf
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Mon Dec 4 14:33:08 2006 +0800
+
+    Remove the duplicate memory test code for mpc744ihpc2 board.
+    If a memory test is needed, please use the functions in
+    post/memory.c or memtest command.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit c9c1eeed7dd193fa65fb194654132040d49d4d3a
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Fri Dec 1 19:01:25 2006 +0800
+
+    Fix the exception occuring in RAM table search issue.
+    The original search_one_table() function code can only processes the search
+    for the exception occurring in FLASH/ROM, because the exception and fixup
+    table usually locate in FLASH. If the exception address is also in
+    FLASH, it will be OK.
+    If the exception occurs in RAM, after the u-boot relocation, a
+    relocation offset should be added.
+
+    clean up the code in cpu/74xx_7xx/cpu.c
+
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit ee311214e0d216f904feea269599d0934bf71f23
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Fri Dec 1 11:47:36 2006 +0800
+
+    Clean up the code according to codestyle:
+    (1) remove some C++ comments.
+    (2) remove trailing white space.
+    (3) remove trailing empty line.
+    (4) Indentation by table.
+    (5) remove {} in one line condition.
+    (6) add space before '(' in function call.
+    Remove some weird printf () output.
+    Add necessary comments.
+    Modified Makefile to support building in a separate directory.
+
 commit dd520bf314c7add4183c5191692180f576f96b60
 Author: Wolfgang Denk <wd@pollux.denx.de>
 Date:  Thu Nov 30 18:02:20 2006 +0100
@@ -544,6 +3580,14 @@ Date:     Tue Nov 28 11:04:45 2006 +0100
 
     Signed-off-by: Stefan Roese <sr@denx.de>
 
+commit 58e3b14c18ed3288ceef8d086946dbf3df64ccf2
+Author: Stefan Roese <sr@denx.de>
+Date:  Tue Nov 28 11:04:45 2006 +0100
+
+    [PATCH] nand: Fix patch merge problem
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
 commit 4f4b602ec7524a032bdf3c6d28c7f525a4a67eaa
 Author: Wolfgang Denk <wd@pollux.denx.de>
 Date:  Mon Nov 27 22:53:53 2006 +0100
@@ -1105,12 +4149,191 @@ Date:  Thu Sep 7 07:39:46 2006 -0700
 
     Signed-off-by: Nick Spence <nick.spence@freescale.com>
 
+commit 4831c8b8a97799da77923d6bbb4c260c0d45521c
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Fri Nov 3 13:10:00 2006 +0800
+
+    Remove some unused CFG define.
+    undef CFG_DRAM_TEST
+
+commit 99c09c4dec34f77c243bf51bea532e3f339410ad
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Fri Nov 3 13:07:36 2006 +0800
+
+    Change the TEXT_BASE from 0xFFF00000 to 0xFF000000.
+    Both work. 0xFF000000 seems more reasonable.
+
 commit c59200443072353044aa4bf737a5a60f9a9af231
 Author: Wolfgang Denk <wd@pollux.denx.de>
 Date:  Thu Nov 2 15:15:01 2006 +0100
 
     Release U-Boot 1.1.6
 
+commit c1fbe4103a0d6c8957f912af902d705ba67836f2
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 19:14:48 2006 +0800
+
+    This patch comes from Yuli's posted patch on 8/8/2006
+    titled "CFI Driver Little-Endian write Issue".
+
+    http://sourceforge.net/mailarchive/message.php?msg_id=36311999
+
+    If that patch applied, please discard this one.
+    Until now , I do not see his patch is applied. So please apply this one.
+
+    Signed-off-by: Yuli Barcohen <yuli@arabellasw.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit b825f158e449e1e9cf74c08e572955e122394c96
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 19:12:31 2006 +0800
+
+    Tsi108 on chip i2c support.
+
+    The i2c  Interface provides a master-only, serial interface that can be
+    used for initializing Tsi108/Tsi109 registers from an EEPROM after a
+    device reset.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 9226e7d6f09b9a1ac074cd918c81225a4689bba8
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 19:11:06 2006 +0800
+
+    Tsi108 on chip pci controller support.
+
+    If there is no pci card, the tsi108/109 pci configure read will
+    cause a machine check exception to the processor. PCI error should
+    also be cleared after the read.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit d1927cee977126e547ceeba23e4f978f377cfb8f
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 19:08:55 2006 +0800
+
+    Tundra tsi108 on chip Ethernet controller support.
+
+    The following is a brief description of the Ethernet controller:
+    The Tsi108/9 Ethernet Controller connects Switch Fabric to two independent
+    Gigabit Ethernet ports,E0 and E1.  It uses a single Management interface
+    to manage the two physical connection devices (PHYs).  Each Ethernet port
+    has its own statistics monitor that tracks and reports key interface
+    statistics.  Each port supports a 256-entry hash table for address
+    filtering. In addition, each port is bridged to the Switch Fabric
+    through a 2-Kbyte transmit FIFO and a 4-Kbyte Receive FIFO.
+
+    Each Ethernet port also has a pair of internal Ethernet DMA channels to
+    support the transmit and receive data flows.  The Ethernet DMA channels
+    use descriptors set up in memory, the memory map of the device, and
+    access via the Switch Fabric.  The Ethernet Controller?s DMA arbiter
+    handles arbitration for the Switch Fabric. The Controller also
+    has a register businterface for register accesses and status monitor
+    control.
+
+    The PMD (Physical Media Device) interface operates in MII, GMII, or TBI
+    modes.  The MII mode is used for connecting with 10 or 100 Mbit/s PMDs.
+    The GMII and TBI modes are used to connect with Gigabit PMDs.  Internal
+    data flows to and from the Ethernet Controller through the Switch Fabric.
+
+    Each Ethernet port uses its transmit and receive DMA channels to manage
+    data flows through buffer descriptors that are predefined by the
+    system (the descriptors can exist anywhere in the system memory map).
+    These descriptors are data structures that point to buffers filled
+    with data ready to transmit over Ethernet, or they point to empty
+    buffers ready to receive data from Ethernet.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 78aa0c3427f3ecdeb34aabfbbe2dd23b6ad8f40e
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 19:01:33 2006 +0800
+
+    Tundra tsi108 header file.
+
+    The Tundra Semiconductor Corporation (Tundra) Tsi108 is a host bridge for
+    PowerPC processors that offers numerous system interconnect options for
+    embedded application designers. The Tsi108 can interconnect 60x or
+    MPX processors to PCI/X peripherals, DDR2-400 memory, Gigabit Ethernet,
+    and Flash. Provided the macro define for tsi108 chip.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 87c4db09699c6b89176b31004afcb83eb1585d47
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:59:15 2006 +0800
+
+    Add  mpc7448hpc2  (mpc7448 + tsi108)  board associated code support.
+    mpc7448hpc2 board support high level code:tsi108 init + mpc7448hpc2.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 27801b8ab11c61b577e45742a515bb3b23b80241
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:57:21 2006 +0800
+
+    Add  mpc7448hpc2  (mpc7448 + tsi108)  board associated code support.
+    Make ,config.mk and link file for the mpc7448hpc2 board.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit c6411c0c3bbc79f9ba8aef58296a42d8f9d8a0a6
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:55:04 2006 +0800
+
+    Add  mpc7448hpc2  (mpc7448 + tsi108)  board associated code support.
+    The mpc7448hpc2 board support header file.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 625bb5ddb50b243f931262ca8c46956409471917
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:52:21 2006 +0800
+
+    Add  mpc7448hpc2  (mpc7448 + tsi108)  board associated code support.
+    The mpc7448hpc2 board support low level assemble language init code.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 4c52783b3d024e153c4972b97332e314bc3bdc46
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:49:51 2006 +0800
+
+    General code modification for mpc7448hpc2 board support.
+    1. Add 7447A and 7448 processor support.
+    2. Add the following flags.
+
+    CFG_CONFIG_BUS_CLK : If the 74xx bus frequency can be configured dynamically
+    (such as by switch on board), this flag should be set.
+
+    CFG_EXCEPTION_AFTER_RELOCATE: If an exception occurs after the u-boot
+    relocates to RAM, this flag should be set.
+
+    CFG_SERIAL_HANG_IN_EXCEPTION: If the print out function will cause the
+    system hang in exception, this flag should be set.
+
+    There is a design issue for tsi108/109 pci configure  read. When pci scan
+    the slots, if there is no pci card, the tsi108/9 will cause a machine
+    check exception for mpc7448 processor.
+
+    Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
+commit 69366bf42f22d67efce8da3f8c40a43d4a3c2695
+Author: roy zang <tie-fei.zang@freescale.com>
+Date:  Thu Nov 2 18:34:47 2006 +0800
+
+    Add README file for mpc7448hpc2 board.
+    Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
+
 commit 25721b5cec2be4bce79cfade17ec8f6aa1e67526
 Author: Bartlomiej Sieka <tur@semihalf.com>
 Date:  Wed Nov 1 02:04:38 2006 +0100
diff --git a/CREDITS b/CREDITS
index 802158879f2463ebf17caec93c6af3dd058ff72f..7af1b806ab0e3a651b00998cdd94475cdaf78554 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
@@ -470,3 +474,8 @@ N: Timur Tabi
 E: timur@freescale.com
 D: Support for MPC8349E-mITX
 W: www.freescale.com
+
+N: Michal Simek
+E: monstr@monstr.eu
+D: Support for Microblaze, ML401, XUPV2P board
+W: www.monstr.eu
index e9203eb05f3c0f741cad8b87a8d83d84e019d169..2eaef1784eaccbf31f6870135a6d1399ebb6d977 100644 (file)
@@ -28,6 +28,7 @@ Pantelis Antoniou <panto@intracom.gr>
 Reinhard Arlt <reinhard.arlt@esd-electronics.com>
 
        cpci5200                MPC5200
+       mecp5200                MPC5200
        pf5200                  MPC5200
 
        CPCI750                 PPC750FX/GX
@@ -220,10 +221,11 @@ Jon Loeliger <jdl@freescale.com>
 
        MPC8641HPCN             MPC8641D
 
-Dan Malek <dan@embeddededge.com>
+Dan Malek <dan@embeddedalley.com>
 
-       STxGP3                  MPC85xx
-       STxXTc                  MPC8xx
+       stxgp3                  MPC85xx
+       stxssa                  MPC85xx
+       stxxtc                  MPC8xx
 
 Eran Man <eran@nbase.co.il>
 
@@ -256,15 +258,6 @@ Frank Panno <fpanno@delphintech.com>
 
        ep8260                  MPC8260
 
-Peter Pearse <peter.pearse@arm.com>
-       integratorcp            All current ARM supplied &
-                               supported core modules
-                               - see http://www.arm.com
-                               /products/DevTools
-                               /Hardware_Platforms.html
-       versatile               ARM926EJ-S
-       versatile               ARM926EJ-S
-
 Denis Peter <d.peter@mpl.ch>
 
        MIP405                  PPC4xx
@@ -283,10 +276,12 @@ Stefan Roese <sr@denx.de>
 
        TQM85xx                 MPC8540/8541/8555/8560
 
+       acadia                  PPC405EZ
        alpr                    PPC440GX
        bamboo                  PPC440EP
        bunbinga                PPC405EP
        ebony                   PPC440GP
+       katmai                  PPC440SPe
        ocotea                  PPC440GX
        p3p440                  PPC440GP
        pcs440ep                PPC440EP
@@ -348,6 +343,7 @@ John Zhan <zhanz@sinovee.com>
 Timur Tabi <timur@freescale.com>
 
        MPC8349E-mITX           MPC8349
+       MPC8349E-mITX-GP        MPC8349
 
 Kim Phillips <kim.phillips@freescale.com>
 
@@ -440,6 +436,9 @@ Gary Jennejohn <gj@denx.de>
        smdk2400                ARM920T
        trab                    ARM920T
 
+Konstantin Kletschke <kletschke@synertronixx.de>
+       scb9328                 ARM920T
+
 Nishant Kamat <nskamat@ti.com>
 
        omap1610h2              ARM926EJS
@@ -457,6 +456,15 @@ Rolf Offermanns <rof@sysgo.de>
 
        shannon                 SA1100
 
+Peter Pearse <peter.pearse@arm.com>
+       integratorcp            All current ARM supplied &
+                               supported core modules
+                               -see http://www.arm.com
+                               /products/DevTools
+                               /Hardware_Platforms.html
+       versatile               ARM926EJ-S
+       versatile               ARM926EJ-S
+
 Dave Peverley <dpeverley@mpc-data.co.uk>
 
        omap730p2               ARM926EJS
@@ -560,6 +568,11 @@ Yasushi Shoji <yashi@atmark-techno.com>
 
        SUZAKU                  MicroBlaze
 
+Michal Simek <monstr@monstr.eu>
+
+       ML401                   MicroBlaze
+       XUPV2P                  MicroBlaze
+
 #########################################################################
 # Coldfire Systems:                                                    #
 #                                                                      #
diff --git a/MAKEALL b/MAKEALL
index 9221e7084abc27524f10d54e95df22ed4b433312..04653a056d75cbb22cc910c025bf5bf332e01209 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -37,9 +37,10 @@ LIST_5xx="   \
 LIST_5xxx="    \
        BC3450          cpci5200        EVAL5200        fo300           \
        icecube_5100    icecube_5200    lite5200b       mcc200          \
-       motionpro       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                                                            \
 "
 
 #########################################################################
@@ -74,22 +75,22 @@ LIST_8xx="  \
 #########################################################################
 
 LIST_4xx="     \
-       ADCIOP          alpr            AP1000          AR405           \
-       ASH405          bamboo          bubinga         CANBT           \
-       CMS700          CPCI2DP         CPCI405         CPCI4052        \
-       CPCI405AB       CPCI405DT       CPCI440         CPCIISER4       \
-       CRAYL1          csb272          csb472          DASA_SIM        \
-       DP405           DU405           ebony           ERIC            \
-       EXBITGEN        G2000           HH405           HUB405          \
-       JSE             KAREF           luan            METROBOX        \
-       MIP405          MIP405T         ML2             ml300           \
-       ocotea          OCRTC           ORSG            p3p440          \
-       PCI405          pcs440ep        PIP405          PLU405          \
-       PMC405          PPChameleonEVB  sbc405          sc3             \
-       sequoia         sequoia_nand    taishan         VOH405          \
-       VOM405          W7OLMC          W7OLMG          walnut          \
-       WUH405          XPEDITE1K       yellowstone     yosemite        \
-       yucca                                                           \
+       acadia          ADCIOP          alpr            AP1000          \
+       AR405           ASH405          bamboo          bubinga         \
+       CANBT           CMS700          CPCI2DP         CPCI405         \
+       CPCI4052        CPCI405AB       CPCI405DT       CPCI440         \
+       CPCIISER4       CRAYL1          csb272          csb472          \
+       DASA_SIM        DP405           DU405           ebony           \
+       ERIC            EXBITGEN        G2000           HH405           \
+       HUB405          JSE             KAREF           katmai          \
+       luan            METROBOX        MIP405          MIP405T         \
+       ML2             ml300           ocotea          OCRTC           \
+       ORSG            p3p440          PCI405          pcs440ep        \
+       PIP405          PLU405          PMC405          PPChameleonEVB  \
+       sbc405          sc3             sequoia         sequoia_nand    \
+       taishan         VOH405          VOM405          W7OLMC          \
+       W7OLMG          walnut          WUH405          XPEDITE1K       \
+       yellowstone     yosemite        yucca                           \
 "
 
 #########################################################################
@@ -131,7 +132,8 @@ LIST_8260=" \
 #########################################################################
 
 LIST_83xx="    \
-       TQM834x         MPC8349EMDS     MPC8349ITX      MPC8360EMDS     \
+       MPC8313ERDB     MPC832XEMDS     MPC8349EMDS     MPC8349ITX      \
+       MPC8349ITXGP    MPC8360EMDS     sbc8349         TQM834x         \
 "
 
 
@@ -140,10 +142,11 @@ LIST_83xx="       \
 #########################################################################
 
 LIST_85xx="    \
-       MPC8540ADS      MPC8540EVAL     MPC8541CDS      MPC8548CDS      \
-       MPC8555CDS      MPC8560ADS      PM854           PM856           \
-       sbc8540         sbc8560         stxgp3          TQM8540         \
-       TQM8541         TQM8555         TQM8560                         \
+       MPC8540ADS      MPC8540EVAL     MPC8541CDS      MPC8544DS       \
+       MPC8548CDS      MPC8555CDS      MPC8560ADS      PM854           \
+       PM856           sbc8540         sbc8560         stxgp3          \
+       stxssa          TQM8540         TQM8541         TQM8555         \
+       TQM8560                                                         \
 "
 
 #########################################################################
@@ -153,6 +156,7 @@ LIST_85xx=" \
 LIST_74xx="    \
        DB64360         DB64460         EVB64260        P3G4            \
        p3m7448         PCIPPC2         PCIPPC6         ZUMA            \
+       mpc7448hpc2
 "
 
 LIST_7xx="     \
@@ -181,7 +185,7 @@ LIST_SA="assabet dnp1110 gcplus lart shannon"
 LIST_ARM7="    \
        armadillo       B2              ep7312          evb4510         \
        impa7           integratorap    ap7             ap720t          \
-       modnet50                                                        \
+       lpc2292sodimm   modnet50                                        \
 "
 
 #########################################################################
@@ -291,7 +295,7 @@ LIST_nios2="        \
 #########################################################################
 
 LIST_microblaze="      \
-       suzaku
+       suzaku          ml401           xupv2p
 "
 
 #########################################################################
@@ -310,6 +314,14 @@ LIST_coldfire="    \
 
 LIST_avr32="atstk1002"
 
+#########################################################################
+## Blackfin Systems
+#########################################################################
+
+LIST_blackfin=" \
+       bf533-ezkit     bf533-stamp     bf537-stamp     bf561-ezkit     \
+"
+
 #-----------------------------------------------------------------------
 
 #----- for now, just run PPC by default -----
@@ -336,14 +348,15 @@ build_target() {
 for arg in $@
 do
        case "$arg" in
-       ppc|5xx|5xxx|8xx|8220|824x|8260|83xx|85xx|4xx|7xx|74xx| \
-       arm|SA|ARM7|ARM9|ARM10|ARM11|pxa|ixp| \
+       arm|SA|ARM7|ARM9|ARM10|ARM11|ixp|pxa| \
+       avr32| \
+       blackfin| \
+       coldfire| \
        microblaze| \
        mips|mips_el| \
        nios|nios2| \
-       x86|I486| \
-       coldfire| \
-       avr32)
+       ppc|5xx|5xxx|8xx|8220|824x|8260|83xx|85xx|4xx|7xx|74xx| \
+       x86|I486)
                        for target in `eval echo '$LIST_'${arg}`
                        do
                                build_target ${target}
index e1bab6674c4f30ef3ec2fa2d2db0da0c801f4046..caa5a0e0ad0789d2336267c7b023498871d75a69 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
@@ -150,10 +146,10 @@ ifeq ($(ARCH),microblaze)
 CROSS_COMPILE = mb-
 endif
 ifeq ($(ARCH),blackfin)
-CROSS_COMPILE = bfin-elf-
+CROSS_COMPILE = bfin-uclinux-
 endif
 ifeq ($(ARCH),avr32)
-CROSS_COMPILE = avr32-
+CROSS_COMPILE = avr32-linux-
 endif
 endif
 endif
@@ -182,7 +178,15 @@ OBJS += cpu/$(CPU)/resetvec.o
 endif
 ifeq ($(CPU),bf533)
 OBJS += cpu/$(CPU)/start1.o    cpu/$(CPU)/interrupt.o  cpu/$(CPU)/cache.o
-OBJS += cpu/$(CPU)/cplbhdlr.o  cpu/$(CPU)/cplbmgr.o    cpu/$(CPU)/flush.o
+OBJS += cpu/$(CPU)/flush.o     cpu/$(CPU)/init_sdram.o
+endif
+ifeq ($(CPU),bf537)
+OBJS += cpu/$(CPU)/start1.o    cpu/$(CPU)/interrupt.o  cpu/$(CPU)/cache.o
+OBJS += cpu/$(CPU)/flush.o     cpu/$(CPU)/init_sdram.o
+endif
+ifeq ($(CPU),bf561)
+OBJS += cpu/$(CPU)/start1.o    cpu/$(CPU)/interrupt.o  cpu/$(CPU)/cache.o
+OBJS += cpu/$(CPU)/flush.o     cpu/$(CPU)/init_sdram.o
 endif
 
 OBJS := $(addprefix $(obj),$(OBJS))
@@ -193,6 +197,9 @@ LIBS += cpu/$(CPU)/lib$(CPU).a
 ifdef SOC
 LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
 endif
+ifeq ($(CPU),ixp)
+LIBS += cpu/ixp/npe/libnpe.a
+endif
 LIBS += lib_$(ARCH)/lib$(ARCH).a
 LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
        fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
@@ -207,9 +214,15 @@ 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)
+LIBS += libfdt/libfdt.a
 
 LIBS := $(addprefix $(obj),$(LIBS))
 .PHONY : $(LIBS)
@@ -220,9 +233,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)
@@ -411,6 +423,9 @@ icecube_5100_config:                        unconfig
                }
        @$(MKCONFIG) -a IceCube ppc mpc5xxx icecube
 
+jupiter_config:         unconfig
+       @$(MKCONFIG) jupiter ppc mpc5xxx jupiter
+
 v38b_config: unconfig
        @./mkconfig -a v38b ppc mpc5xxx v38b
 
@@ -418,6 +433,7 @@ inka4x0_config:     unconfig
        @$(MKCONFIG) inka4x0 ppc mpc5xxx inka4x0
 
 lite5200b_config       \
+lite5200b_PM_config    \
 lite5200b_LOWBOOT_config:      unconfig
        @mkdir -p $(obj)include
        @mkdir -p $(obj)board/icecube
@@ -426,6 +442,10 @@ lite5200b_LOWBOOT_config:  unconfig
        @ echo "... DDR memory revision"
        @ echo "#define CONFIG_MPC5200"         >>$(obj)include/config.h
        @ echo "#define CONFIG_LITE5200B"       >>$(obj)include/config.h
+       @[ -z "$(findstring _PM_,$@)" ] || \
+               { echo "#define CONFIG_LITE5200B_PM"    >>$(obj)include/config.h ; \
+                 echo "... with power management (low-power mode) support" ; \
+               }
        @[ -z "$(findstring LOWBOOT_,$@)" ] || \
                { echo "TEXT_BASE = 0xFF000000" >$(obj)board/icecube/config.tmp ; \
                  echo "... with LOWBOOT configuration" ; \
@@ -482,6 +502,9 @@ prs200_highboot_DDR_config: unconfig
                }
        @$(MKCONFIG) -n $@ -a mcc200 ppc mpc5xxx mcc200
 
+mecp5200_config:  unconfig
+       @$(MKCONFIG) -a mecp5200  ppc mpc5xxx mecp5200 esd
+
 o2dnt_config:
        @$(MKCONFIG) o2dnt ppc mpc5xxx o2dnt
 
@@ -991,6 +1014,9 @@ wtk_config:        unconfig
 #########################################################################
 xtract_4xx = $(subst _25,,$(subst _33,,$(subst _BA,,$(subst _ME,,$(subst _HI,,$(subst _config,,$1))))))
 
+acadia_config: unconfig
+       @$(MKCONFIG) $(@:_config=) ppc ppc4xx acadia amcc
+
 ADCIOP_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx adciop esd
 
@@ -1092,6 +1118,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
 
@@ -1169,47 +1198,31 @@ PPChameleonEVB_HI_33_config:    unconfig
                }
        @$(MKCONFIG) -a $(call xtract_4xx,$@) ppc ppc4xx PPChameleonEVB dave
 
-rainier_config:        unconfig
-       @mkdir -p $(obj)include
-       @echo "#define CONFIG_RAINIER" > $(obj)include/config.h
-       @echo "Configuring for rainier board as subset of sequoia..."
-       @$(MKCONFIG) -a sequoia ppc ppc4xx sequoia amcc
-
-rainier_nand_config:   unconfig
-       @mkdir -p $(obj)include
-       @mkdir -p $(obj)nand_spl
-       @mkdir -p $(obj)board/amcc/sequoia
-       @echo "#define CONFIG_RAINIER" > $(obj)include/config.h
-       @echo "Configuring for rainier board as subset of sequoia..."
-       @echo "#define CONFIG_NAND_U_BOOT" >> $(obj)include/config.h
-       @echo "Compile NAND boot image for sequoia"
-       @$(MKCONFIG) -a sequoia ppc ppc4xx sequoia amcc
-       @echo "TEXT_BASE = 0x01000000" > $(obj)board/amcc/sequoia/config.tmp
-       @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
-
 sbc405_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx sbc405
 
-sequoia_config:        unconfig
-       @$(MKCONFIG) $(@:_config=) ppc ppc4xx sequoia amcc
+sequoia_config \
+rainier_config: unconfig
+       @mkdir -p $(obj)include
+       @echo "#define CONFIG_$$(echo $(subst ,,$(@:_config=)) | \
+               tr '[:lower:]' '[:upper:]')" >$(obj)include/config.h
+       @$(MKCONFIG) -n $@ -a sequoia ppc ppc4xx sequoia amcc
 
-sequoia_nand_config:   unconfig
+sequoia_nand_config \
+rainier_nand_config: unconfig
        @mkdir -p $(obj)include
        @mkdir -p $(obj)nand_spl
        @mkdir -p $(obj)board/amcc/sequoia
        @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
-       @echo "Compile NAND boot image for sequoia"
-       @$(MKCONFIG) -a sequoia ppc ppc4xx sequoia amcc
+       @echo "#define CONFIG_$$(echo $(subst ,,$(@:_config=)) | \
+               tr '[:lower:]' '[:upper:]')" >> $(obj)include/config.h
+       @$(MKCONFIG) -n $@ -a sequoia ppc ppc4xx sequoia amcc
        @echo "TEXT_BASE = 0x01000000" > $(obj)board/amcc/sequoia/config.tmp
        @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
 
 sc3_config:unconfig
        @./mkconfig $(@:_config=) ppc ppc4xx sc3
 
-sycamore_config:       unconfig
-       @echo "Configuring for sycamore board as subset of walnut..."
-       @$(MKCONFIG) -a walnut ppc ppc4xx walnut amcc
-
 taishan_config:        unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx taishan amcc
 
@@ -1226,8 +1239,10 @@ W7OLMC_config    \
 W7OLMG_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx w7o
 
-walnut_config: unconfig
-       @$(MKCONFIG) $(@:_config=) ppc ppc4xx walnut amcc
+# Walnut & Sycamore images are identical (recognized via PVR)
+walnut_config \
+sycamore_config: unconfig
+       @$(MKCONFIG) -n $@ -a walnut ppc ppc4xx walnut amcc
 
 WUH405_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx wuh405 esd
@@ -1235,11 +1250,12 @@ WUH405_config:  unconfig
 XPEDITE1K_config:      unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx xpedite1k
 
-yosemite_config:       unconfig
-       @$(MKCONFIG) $(@:_config=) ppc ppc4xx yosemite amcc
-
-yellowstone_config:    unconfig
-       @$(MKCONFIG) $(@:_config=) ppc ppc4xx yellowstone amcc
+yosemite_config \
+yellowstone_config: unconfig
+       @mkdir -p $(obj)include
+       @echo "#define CONFIG_$$(echo $(subst ,,$(@:_config=)) | \
+               tr '[:lower:]' '[:upper:]')" >$(obj)include/config.h
+       @$(MKCONFIG) -n $@ -a yosemite ppc ppc4xx yosemite amcc
 
 yucca_config:  unconfig
        @$(MKCONFIG) $(@:_config=) ppc ppc4xx yucca amcc
@@ -1610,12 +1626,60 @@ r5200_config :          unconfig
 ## MPC83xx Systems
 #########################################################################
 
-TQM834x_config:        unconfig
-       @$(MKCONFIG) $(@:_config=) ppc mpc83xx tqm834x
+MPC8313ERDB_33_config \
+MPC8313ERDB_66_config: unconfig
+       @echo "" >include/config.h ; \
+       if [ "$(findstring _33_,$@)" ] ; then \
+               echo -n "...33M ..." ; \
+               echo "#define CFG_33MHZ" >>include/config.h ; \
+       fi ; \
+       if [ "$(findstring _66_,$@)" ] ; then \
+               echo -n "...66M..." ; \
+               echo "#define CFG_66MHZ" >>include/config.h ; \
+       fi ;
+       @$(MKCONFIG) -a MPC8313ERDB ppc mpc83xx mpc8313erdb
+
+MPC832XEMDS_config \
+MPC832XEMDS_HOST_33_config \
+MPC832XEMDS_HOST_66_config \
+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 \
@@ -1640,8 +1704,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
@@ -1677,12 +1745,18 @@ MPC8560ADS_config:      unconfig
 MPC8541CDS_config:     unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8541cds cds
 
+MPC8544DS_config:      unconfig
+       @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8544ds freescale
+
 MPC8548CDS_config:     unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8548cds cds
 
 MPC8555CDS_config:     unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8555cds cds
 
+MPC8568MDS_config:     unconfig
+       @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8568mds
+
 PM854_config:  unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx pm854
 
@@ -1718,6 +1792,9 @@ sbc8560_66_config:      unconfig
 stxgp3_config:         unconfig
        @$(MKCONFIG) $(@:_config=) ppc mpc85xx stxgp3
 
+stxssa_config:         unconfig
+       @$(MKCONFIG) $(@:_config=) ppc mpc85xx stxssa
+
 TQM8540_config         \
 TQM8541_config         \
 TQM8555_config         \
@@ -1767,6 +1844,9 @@ EVB64260_config   \
 EVB64260_750CX_config: unconfig
        @$(MKCONFIG) EVB64260 ppc 74xx_7xx evb64260
 
+mpc7448hpc2_config:  unconfig
+       @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx mpc7448hpc2
+
 P3G4_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx evb64260
 
@@ -2032,6 +2112,9 @@ modnet50_config : unconfig
 evb4510_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm720t evb4510
 
+lpc2292sodimm_config:  unconfig
+       @$(MKCONFIG) $(@:_config=) arm arm720t lpc2292sodimm
+
 #########################################################################
 ## XScale Systems
 #########################################################################
@@ -2296,17 +2379,30 @@ suzaku_config:  unconfig
        @echo "#define CONFIG_SUZAKU 1" >> $(obj)include/config.h
        @$(MKCONFIG) -a $(@:_config=) microblaze microblaze suzaku AtmarkTechno
 
+ml401_config:  unconfig
+       @ >include/config.h
+       @echo "#define CONFIG_ML401 1" >> include/config.h
+       @./mkconfig -a $(@:_config=) microblaze microblaze ml401 xilinx
+
+xupv2p_config: unconfig
+       @ >include/config.h
+       @echo "#define CONFIG_XUPV2P 1" >> include/config.h
+       @./mkconfig -a $(@:_config=) microblaze microblaze xupv2p xilinx
+
 #########################################################################
 ## Blackfin
 #########################################################################
-ezkit533_config        :       unconfig
-       @$(MKCONFIG) $(@:_config=) blackfin bf533 ezkit533
+bf533-ezkit_config:    unconfig
+       @$(MKCONFIG) $(@:_config=) blackfin bf533 bf533-ezkit
+
+bf533-stamp_config:    unconfig
+       @$(MKCONFIG) $(@:_config=) blackfin bf533 bf533-stamp
 
-stamp_config   :       unconfig
-       @$(MKCONFIG) $(@:_config=) blackfin bf53stamp
+bf537-stamp_config:    unconfig
+       @$(MKCONFIG) $(@:_config=) blackfin bf537 bf537-stamp
 
-dspstamp_config        :       unconfig
-       @$(MKCONFIG) $(@:_config=) blackfin bf533 dsp_stamp
+bf561-ezkit_config:    unconfig
+       @$(MKCONFIG) $(@:_config=) blackfin bf561 bf561-ezkit
 
 #========================================================================
 # AVR32
@@ -2343,6 +2439,8 @@ clean:
        rm -f $(obj)board/netstar/*.srec $(obj)board/netstar/*.bin
        rm -f $(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom
        rm -f $(obj)board/integratorap/u-boot.lds $(obj)board/integratorcp/u-boot.lds
+       rm -f $(obj)board/bf533-ezkit/u-boot.lds $(obj)board/bf533-stamp/u-boot.lds
+       rm -f $(obj)board/bf537-stamp/u-boot.lds $(obj)board/bf561-ezkit/u-boot.lds
        rm -f $(obj)include/bmp_logo.h
        rm -f $(obj)nand_spl/u-boot-spl $(obj)nand_spl/u-boot-spl.map
 
diff --git a/README b/README
index ecfd1f82f0987a708f58ccadaaeee5ebb94377f4..bb5b46e33791c787cf492deac85c45a0a7142214 100644 (file)
--- a/README
+++ b/README
@@ -164,6 +164,7 @@ Directory Hierarchy:
 - lib_mips     Files generic to MIPS    architecture
 - lib_nios     Files generic to NIOS    architecture
 - lib_ppc      Files generic to PowerPC architecture
+- libfdt       Library files to support flattened device trees
 - net          Networking code
 - post         Power On Self Test
 - rtc          Real Time Clock drivers
@@ -430,12 +431,23 @@ The following options need to be configured:
                expect it to be in bytes, others in MB.
                Define CONFIG_MEMSIZE_IN_BYTES to make it in bytes.
 
-               CONFIG_OF_FLAT_TREE
+               CONFIG_OF_LIBFDT / CONFIG_OF_FLAT_TREE
 
                New kernel versions are expecting firmware settings to be
-               passed using flat open firmware trees.
-               The environment variable "disable_of", when set, disables this
-               functionality.
+               passed using flattened device trees (based on open firmware
+               concepts).
+
+               CONFIG_OF_LIBFDT
+                * New libfdt-based support
+                * Adds the "fdt" command
+                * The bootm command does _not_ modify the fdt
+
+               CONFIG_OF_FLAT_TREE
+                * Deprecated, see CONFIG_OF_LIBFDT
+                * Original ft_build.c-based support
+                * Automatically modifies the dft as part of the bootm command
+                * The environment variable "disable_of", when set,
+                    disables this functionality.
 
                CONFIG_OF_FLAT_TREE_MAX_SIZE
 
@@ -448,13 +460,16 @@ The following options need to be configured:
 
                CONFIG_OF_HAS_BD_T
 
-               The resulting flat device tree will have a copy of the bd_t.
-               Space should be pre-allocated in the dts for the bd_t.
+                * CONFIG_OF_LIBFDT - enables the "fdt bd_t" command
+                * CONFIG_OF_FLAT_TREE - The resulting flat device tree
+                    will have a copy of the bd_t.  Space should be
+                    pre-allocated in the dts for the bd_t.
 
                CONFIG_OF_HAS_UBOOT_ENV
 
-               The resulting flat device tree will have a copy of u-boot's
-               environment variables
+                * CONFIG_OF_LIBFDT - enables the "fdt bd_t" command
+                * CONFIG_OF_FLAT_TREE - The resulting flat device tree
+                    will have a copy of u-boot's environment variables
 
                CONFIG_OF_BOARD_SETUP
 
@@ -703,6 +718,7 @@ The following options need to be configured:
                CFG_CMD_VFD     * VFD support (TRAB)
                CFG_CMD_BSP     * Board SPecific functions
                CFG_CMD_CDP     * Cisco Discover Protocol support
+               CFG_CMD_FSL     * Microblaze FSL support
                -----------------------------------------------
                CFG_CMD_ALL     all
 
@@ -721,6 +737,8 @@ The following options need to be configured:
 
                #define CONFIG_COMMANDS (CFG_CMD_ALL & ~CFG_CMD_NET)
 
+       Other Commands:
+               fdt (flattened device tree) command: CONFIG_OF_LIBFDT
 
        Note:   Don't enable the "icache" and "dcache" commands
                (configuration option CFG_CMD_CACHE) unless you know
@@ -1347,6 +1365,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
@@ -2371,17 +2399,17 @@ configurations; the following names are supported:
        csb272_config           lwmon_config            sbc8260_config
        CU824_config            MBX860T_config          sbc8560_33_config
        DUET_ADS_config         MBX_config              sbc8560_66_config
-       EBONY_config            MPC8260ADS_config       SM850_config
-       ELPT860_config          MPC8540ADS_config       SPD823TS_config
-       ESTEEM192E_config       MPC8540EVAL_config      stxgp3_config
-       ETX094_config           MPC8560ADS_config       SXNI855T_config
-       FADS823_config          NETVIA_config           TQM823L_config
-       FADS850SAR_config       omap1510inn_config      TQM850L_config
-       FADS860T_config         omap1610h2_config       TQM855L_config
-       FPS850L_config          omap1610inn_config      TQM860L_config
-                               omap5912osk_config      walnut_config
-                               omap2420h4_config       Yukon8220_config
-                                                       ZPC1900_config
+       EBONY_config            mpc7448hpc2_config      SM850_config
+       ELPT860_config          MPC8260ADS_config       SPD823TS_config
+       ESTEEM192E_config       MPC8540ADS_config       stxgp3_config
+       ETX094_config           MPC8540EVAL_config      SXNI855T_config
+       FADS823_config          NMPC8560ADS_config      TQM823L_config
+       FADS850SAR_config       NETVIA_config           TQM850L_config
+       FADS860T_config         omap1510inn_config      TQM855L_config
+       FPS850L_config          omap1610h2_config       TQM860L_config
+                               omap1610inn_config      walnut_config
+                               omap5912osk_config      Yukon8220_config
+                               omap2420h4_config       ZPC1900_config
 
 Note: for some board special configuration names may exist; check if
       additional information is available from the board vendor; for
index 0b92053e1af9d0fe65051fe25d9b08af4157e3ed..441caa405ae3c5e2a8a1c66c0ee5c3970c4480a2 100644 (file)
@@ -21,5 +21,5 @@
 # MA 02111-1307 USA
 #
 
-PLATFORM_RELFLAGS      += -ffixed-r5 -mno-pic -mrelax
+PLATFORM_RELFLAGS      += -ffixed-r5 -fPIC -mno-init-got -mrelax
 PLATFORM_LDFLAGS       += --relax
index e2747aafe97411356fcfc8ed13b99b4f29cc6ca8..df324b7efa9a76d384dbaed26852d93b05dba7a1 100644 (file)
@@ -21,4 +21,4 @@
 # MA 02111-1307 USA
 #
 
-PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN -D__blackfin__
+PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN
index afe124a9d3cb089fe28bd3adcd7802c8de16946a..267c476f06c1339e92dd83daf0f63d35be391c0f 100644 (file)
@@ -24,7 +24,7 @@
 
 /* This is a board specific file.  It's OK to include board specific
  * header files */
-#include <asm/suzaku.h>
+#include <config.h>
 
 void do_reset(void)
 {
index 00a8ef7ad9e4ff6127a746e3772880447202eb39..cb90854a3929c1c870a0eee41934a7ff6892753f 100644 (file)
@@ -61,6 +61,7 @@ SECTIONS
        {
                __bss_start = .;
                *(.bss)
-               __bss_start = .;
+               __bss_end = .;
        }
+       __end = . ;
 }
diff --git a/board/amcc/acadia/Makefile b/board/amcc/acadia/Makefile
new file mode 100644 (file)
index 0000000..abcbf3e
--- /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 cpr.o memory.o
+SOBJS  =
+
+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/acadia/acadia.c b/board/amcc/acadia/acadia.c
new file mode 100644 (file)
index 0000000..3b63c8a
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * (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 <asm/processor.h>
+
+extern void board_pll_init_f(void);
+
+static void acadia_gpio_init(void)
+{
+       /*
+        * GPIO0 setup (select GPIO or alternate function)
+        */
+               out32(GPIO0_OSRL, CFG_GPIO0_OSRL);
+               out32(GPIO0_OSRH, CFG_GPIO0_OSRH);      /* output select */
+               out32(GPIO0_ISR1L, CFG_GPIO0_ISR1L);
+               out32(GPIO0_ISR1H, CFG_GPIO0_ISR1H);    /* input select */
+               out32(GPIO0_TSRL, CFG_GPIO0_TSRL);
+               out32(GPIO0_TSRH, CFG_GPIO0_TSRH);      /* three-state select */
+               out32(GPIO0_TCR, CFG_GPIO0_TCR);  /* enable output driver for outputs */
+
+       /*
+        * Ultra (405EZ) was nice enough to add another GPIO controller
+        */
+       out32(GPIO1_OSRH, CFG_GPIO1_OSRH);      /* output select */
+       out32(GPIO1_OSRL, CFG_GPIO1_OSRL);
+       out32(GPIO1_ISR1H, CFG_GPIO1_ISR1H);    /* input select */
+       out32(GPIO1_ISR1L, CFG_GPIO1_ISR1L);
+       out32(GPIO1_TSRH, CFG_GPIO1_TSRH);      /* three-state select */
+       out32(GPIO1_TSRL, CFG_GPIO1_TSRL);
+       out32(GPIO1_TCR, CFG_GPIO1_TCR);  /* enable output driver for outputs */
+}
+
+int board_early_init_f(void)
+{
+       unsigned int reg;
+
+       /* don't reinit PLL when booting via I2C bootstrap option */
+       mfsdr(SDR_PINSTP, reg);
+       if (reg != 0xf0000000)
+               board_pll_init_f();
+
+       acadia_gpio_init();
+
+       /* Configure 405EZ for NAND usage */
+       mtsdr(sdrnand0, 0x80c00000);
+       mtsdr(sdrultra0, 0x8d110000);
+
+       /* USB Host core needs this bit set */
+       mfsdr(sdrultra1, reg);
+       mtsdr(sdrultra1, reg | SDR_ULTRA1_LEDNENABLE);
+
+       mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
+       mtdcr(uicer, 0x00000000);       /* disable all ints */
+       mtdcr(uiccr, 0x00000010);
+       mtdcr(uicpr, 0xFE7FFFF0);       /* set int polarities */
+       mtdcr(uictr, 0x00000010);       /* set int trigger levels */
+       mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
+
+       return 0;
+}
+
+int misc_init_f(void)
+{
+       /* Set EPLD to take PHY out of reset */
+       out8(CFG_CPLD_BASE + 0x05, 0x00);
+       udelay(100000);
+
+       return 0;
+}
+
+/*
+ * Check Board Identity:
+ */
+int checkboard(void)
+{
+       char *s = getenv("serial#");
+       u8 rev;
+
+       rev = in8(CFG_CPLD_BASE + 0);
+       printf("Board: Acadia - AMCC PPC405EZ Evaluation Board, Rev. %X", rev);
+
+       if (s != NULL) {
+               puts(", serial# ");
+               puts(s);
+       }
+       putc('\n');
+
+       return (0);
+}
diff --git a/board/amcc/acadia/config.mk b/board/amcc/acadia/config.mk
new file mode 100644 (file)
index 0000000..c8566ec
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# (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
+#
+
+ifndef TEXT_BASE
+TEXT_BASE = 0xFFFC0000
+endif
+
+ifeq ($(debug),1)
+PLATFORM_CPPFLAGS += -DDEBUG
+endif
diff --git a/board/amcc/acadia/cpr.c b/board/amcc/acadia/cpr.c
new file mode 100644 (file)
index 0000000..9dcce35
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * (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 <asm/processor.h>
+#include <ppc405.h>
+
+/* test-only: move into cpu directory!!! */
+
+#if defined(PLLMR0_200_133_66)
+void board_pll_init_f(void)
+{
+       /*
+        * set PLL clocks based on input sysclk is 33M
+        *
+        * ----------------------------------
+        * | CLK   | FREQ (MHz) | DIV RATIO |
+        * ----------------------------------
+        * | CPU   |  200.0     |   4 (0x02)|
+        * | PLB   |  133.3     |   6 (0x06)|
+        * | OPB   |   66.6     |  12 (0x0C)|
+        * | EBC   |   66.6     |  12 (0x0C)|
+        * | SPI   |   66.6     |  12 (0x0C)|
+        * | UART0 |   10.0     |  40 (0x28)|
+        * | UART1 |   10.0     |  40 (0x28)|
+        * | DAC   |    2.0     | 200 (0xC8)|
+        * | ADC   |    2.0     | 200 (0xC8)|
+        * | PWM   |  100.0     |   4 (0x04)|
+        * | EMAC  |   25.0     |  16 (0x10)|
+        * -----------------------------------
+        */
+
+       /* Initialize PLL */
+       mtcpr(cprpllc, 0x0000033c);
+       mtcpr(cprplld, 0x0c010200);
+       mtcpr(cprprimad, 0x04060c0c);
+       mtcpr(cprperd0, 0x000c0000);    /* SPI clk div. eq. OPB clk div. */
+       mtcpr(cprclkupd, 0x40000000);
+}
+
+#elif defined(PLLMR0_266_160_80)
+
+void board_pll_init_f(void)
+{
+       /*
+        * set PLL clocks based on input sysclk is 33M
+        *
+        * ----------------------------------
+        * | CLK   | FREQ (MHz) | DIV RATIO |
+        * ----------------------------------
+        * | CPU   |  266.64    |   3       |
+        * | PLB   |  159.98    |   5 (0x05)|
+        * | OPB   |   79.99    |  10 (0x0A)|
+        * | EBC   |   79.99    |  10 (0x0A)|
+        * | SPI   |   79.99    |  10 (0x0A)|
+        * | UART0 |   28.57    |   7 (0x07)|
+        * | UART1 |   28.57    |   7 (0x07)|
+        * | DAC   |   28.57    |   7 (0xA7)|
+        * | ADC   |    4       |  50 (0x32)|
+        * | PWM   |   28.57    |   7 (0x07)|
+        * | EMAC  |    4       |  50 (0x32)|
+        * -----------------------------------
+        */
+
+       /* Initialize PLL */
+       mtcpr(cprpllc, 0x20000238);
+       mtcpr(cprplld, 0x03010400);
+       mtcpr(cprprimad, 0x03050a0a);
+       mtcpr(cprperc0, 0x00000000);
+       mtcpr(cprperd0, 0x070a0707);    /* SPI clk div. eq. OPB clk div. */
+       mtcpr(cprperd1, 0x07323200);
+       mtcpr(cprclkupd, 0x40000000);
+}
+
+#elif defined(PLLMR0_333_166_83)
+
+void board_pll_init_f(void)
+{
+       /*
+        * set PLL clocks based on input sysclk is 33M
+        *
+        * ----------------------------------
+        * | CLK   | FREQ (MHz) | DIV RATIO |
+        * ----------------------------------
+        * | CPU   |  333.33    |   2       |
+        * | PLB   |  166.66    |   4 (0x04)|
+        * | OPB   |   83.33    |   8 (0x08)|
+        * | EBC   |   83.33    |   8 (0x08)|
+        * | SPI   |   83.33    |   8 (0x08)|
+        * | UART0 |   16.66    |   5 (0x05)|
+        * | UART1 |   16.66    |   5 (0x05)|
+        * | DAC   |   ????     | 166 (0xA6)|
+        * | ADC   |   ????     | 166 (0xA6)|
+        * | PWM   |   41.66    |   3 (0x03)|
+        * | EMAC  |   ????     |   3 (0x03)|
+        * -----------------------------------
+        */
+
+       /* Initialize PLL */
+       mtcpr(cprpllc, 0x0000033C);
+       mtcpr(cprplld, 0x0a010000);
+       mtcpr(cprprimad, 0x02040808);
+       mtcpr(cprperd0, 0x02080505);    /* SPI clk div. eq. OPB clk div. */
+       mtcpr(cprperd1, 0xA6A60300);
+       mtcpr(cprclkupd, 0x40000000);
+}
+
+#elif defined(PLLMR0_100_100_12)
+
+void board_pll_init_f(void)
+{
+       /*
+        * set PLL clocks based on input sysclk is 33M
+        *
+        * ----------------------
+        * | CLK   | FREQ (MHz) |
+        * ----------------------
+        * | CPU   |  100.00    |
+        * | PLB   |  100.00    |
+        * | OPB   |   12.00    |
+        * | EBC   |   49.00    |
+        * ----------------------
+        */
+
+       /* Initialize PLL */
+       mtcpr(cprpllc, 0x000003BC);
+       mtcpr(cprplld, 0x06060600);
+       mtcpr(cprprimad, 0x02020004);
+       mtcpr(cprperd0, 0x04002828);    /* SPI clk div. eq. OPB clk div. */
+       mtcpr(cprperd1, 0xC8C81600);
+       mtcpr(cprclkupd, 0x40000000);
+}
+#endif                         /* CPU_<speed>_405EZ */
+
+#if defined(CONFIG_NAND_SPL) || defined(CONFIG_SPI_SPL)
+/*
+ * Get timebase clock frequency
+ */
+unsigned long get_tbclk(void)
+{
+       unsigned long cpr_plld;
+       unsigned long cpr_primad;
+       unsigned long primad_cpudv;
+       unsigned long pllFbkDiv;
+       unsigned long freqProcessor;
+
+       /*
+        * Read PLL Mode registers
+        */
+       mfcpr(cprplld, cpr_plld);
+
+       /*
+        * Read CPR_PRIMAD register
+        */
+       mfcpr(cprprimad, cpr_primad);
+
+       /*
+        * Determine CPU clock frequency
+        */
+       primad_cpudv = ((cpr_primad & PRIMAD_CPUDV_MASK) >> 24);
+       if (primad_cpudv == 0)
+               primad_cpudv = 16;
+
+       /*
+        * Determine FBK_DIV.
+        */
+       pllFbkDiv = ((cpr_plld & PLLD_FBDV_MASK) >> 24);
+       if (pllFbkDiv == 0)
+               pllFbkDiv = 256;
+
+       freqProcessor = (CONFIG_SYS_CLK_FREQ * pllFbkDiv) / primad_cpudv;
+
+       return (freqProcessor);
+}
+#endif /* defined(CONFIG_NAND_SPL) || defined(CONFIG_SPI_SPL) */
diff --git a/board/amcc/acadia/memory.c b/board/amcc/acadia/memory.c
new file mode 100644 (file)
index 0000000..5375d36
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * (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
+ */
+
+/* define DEBUG for debugging output (obviously ;-)) */
+#if 0
+#define DEBUG
+#endif
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/gpio.h>
+
+/*
+ * sdram_init - Dummy implementation for start.S, spd_sdram used on this board!
+ */
+void sdram_init(void)
+{
+       return;
+}
+
+static void cram_bcr_write(u32 wr_val)
+{
+       wr_val <<= 2;
+
+       /* set CRAM_CRE to 1 */
+       gpio_write_bit(CFG_GPIO_CRAM_CRE, 1);
+
+       /* Write BCR to CRAM on CS1 */
+       out32(wr_val + 0x00200000, 0);
+       debug("CRAM VAL: %08x for CS1 ", wr_val + 0x00200000);
+
+       /* Write BCR to CRAM on CS2 */
+       out32(wr_val + 0x02200000, 0);
+       debug("CRAM VAL: %08x for CS2\n", wr_val + 0x02200000);
+
+       sync();
+       eieio();
+
+       /* set CRAM_CRE back to 0 (normal operation) */
+       gpio_write_bit(CFG_GPIO_CRAM_CRE, 0);
+
+       return;
+}
+
+long int initdram(int board_type)
+{
+       u32 val;
+
+       /* 1. EBC need to program READY, CLK, ADV for ASync mode */
+       gpio_config(CFG_GPIO_CRAM_CLK, GPIO_OUT, GPIO_SEL, GPIO_OUT_0);
+       gpio_config(CFG_GPIO_CRAM_ADV, GPIO_OUT, GPIO_SEL, GPIO_OUT_0);
+       gpio_config(CFG_GPIO_CRAM_CRE, GPIO_OUT, GPIO_SEL, GPIO_OUT_0);
+       gpio_config(CFG_GPIO_CRAM_WAIT, GPIO_IN, GPIO_SEL, GPIO_OUT_NO_CHG);
+
+       /* 2. EBC in Async mode */
+       mtebc(pb1ap, 0x078F1EC0);
+       mtebc(pb2ap, 0x078F1EC0);
+       mtebc(pb1cr, 0x000BC000);
+       mtebc(pb2cr, 0x020BC000);
+
+       /* 3. Set CRAM in Sync mode */
+       cram_bcr_write(0x7012);         /* CRAM burst setting */
+
+       /* 4. EBC in Sync mode */
+       mtebc(pb1ap, 0x9C0201C0);
+       mtebc(pb2ap, 0x9C0201C0);
+
+       /* Set GPIO pins back to alternate function */
+       gpio_config(CFG_GPIO_CRAM_CLK, GPIO_OUT, GPIO_ALT1, GPIO_OUT_NO_CHG);
+       gpio_config(CFG_GPIO_CRAM_ADV, GPIO_OUT, GPIO_ALT1, GPIO_OUT_NO_CHG);
+
+       /* Config EBC to use RDY */
+       mfsdr(sdrultra0, val);
+       mtsdr(sdrultra0, val | 0x04000000);
+
+       return (CFG_MBYTES_RAM << 20);
+}
+
+int testdram(void)
+{
+       return (0);
+}
similarity index 86%
rename from board/amcc/yellowstone/u-boot.lds
rename to board/amcc/acadia/u-boot.lds
index a0ba44de889e76704e512364da933efae1fddb07..b08c9994bdff7ea8d8997c378e84bb271bf8fea8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2002
+ * (C) Copyright 2000
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
@@ -32,11 +32,6 @@ SECTIONS
     *(.resetvec)
   } = 0xffff
 
-  .bootpg 0xFFFFF000 :
-  {
-    cpu/ppc4xx/start.o (.bootpg)
-  } = 0xffff
-
   /* Read-only sections, merged into text segment: */
   . = + SIZEOF_HEADERS;
   .interp : { *(.interp) }
@@ -67,20 +62,6 @@ SECTIONS
     /* the sector layout of our flash chips!   XXX FIXME XXX   */
 
     cpu/ppc4xx/start.o (.text)
-    board/amcc/yellowstone/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)
@@ -131,7 +112,6 @@ SECTIONS
   .u_boot_cmd : { *(.u_boot_cmd) }
   __u_boot_cmd_end = .;
 
-
   . = .;
   __start___ex_table = .;
   __ex_table : { *(__ex_table) }
index c93ba6e3ca10002b87ae2711915400dfef0e853f..6260b016df3d1f5a8f9aab896d9d26b5be38df0a 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <common.h>
 #include <asm/processor.h>
+#include <asm/gpio.h>
 #include <spd_sdram.h>
 #include <ppc440.h>
 #include "bamboo.h"
@@ -276,87 +277,6 @@ int board_early_init_f(void)
        return 0;
 }
 
-#if (CONFIG_COMMANDS & CFG_CMD_NAND)
-#include <linux/mtd/nand_legacy.h>
-extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
-
-/*----------------------------------------------------------------------------+
-  | nand_reset.
-  |   Reset Nand flash
-  |   This routine will abort previous cmd
-  +----------------------------------------------------------------------------*/
-int nand_reset(ulong addr)
-{
-       int wait=0, stat=0;
-
-       out8(addr + NAND_CMD_REG, NAND0_CMD_RESET);
-       out8(addr + NAND_CMD_REG, NAND0_CMD_READ_STATUS);
-
-       while ((stat != 0xc0) && (wait != 0xffff)) {
-               stat = in8(addr + NAND_DATA_REG);
-               wait++;
-       }
-
-       if (stat == 0xc0) {
-               return 0;
-       } else {
-               printf("NAND Reset timeout.\n");
-               return -1;
-       }
-}
-
-void board_nand_set_device(int cs, ulong addr)
-{
-       /* Set NandFlash Core Configuration Register */
-       out32(addr + NAND_CCR_REG, 0x00001000 | (cs << 24));
-
-       switch (cs) {
-       case 1:
-               /* -------
-                *  NAND0
-                * -------
-                * K9F1208U0A : 4 addr cyc, 1 col + 3 Row
-                * Set NDF1CR - Enable External CS1 in NAND FLASH controller
-                */
-               out32(addr + NAND_CR1_REG, 0x80002222);
-               break;
-
-       case 2:
-               /* -------
-                *  NAND1
-                * -------
-                * K9K2G0B : 5 addr cyc, 2 col + 3 Row
-                * Set NDF2CR : Enable External CS2 in NAND FLASH controller
-                */
-               out32(addr + NAND_CR2_REG, 0xC0007777);
-               break;
-       }
-
-       /* Perform Reset Command */
-       if (nand_reset(addr) != 0)
-               return;
-}
-
-void nand_init(void)
-{
-       board_nand_set_device(1, CFG_NAND_ADDR);
-
-       nand_probe(CFG_NAND_ADDR);
-       if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN) {
-               print_size(nand_dev_desc[0].totlen, "\n");
-       }
-
-#if 0 /* NAND1 not supported yet */
-       board_nand_set_device(2, CFG_NAND2_ADDR);
-
-       nand_probe(CFG_NAND2_ADDR);
-       if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN) {
-               print_size(nand_dev_desc[0].totlen, "\n");
-       }
-#endif
-}
-#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
-
 int checkboard(void)
 {
        char *s = getenv("serial#");
index 1ce6366da4a8a58fe55cebcb84b4638922a462f2..447486297a8232fa20d2a02e0bc6c1f069903ca4 100644 (file)
 #define TRUE 1
 #define FALSE 0
 
-#define GPIO_GROUP_MAX     2
-#define GPIO_MAX           32
-#define GPIO_ALT1_SEL      0x40000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 0 */
-#define GPIO_ALT2_SEL      0x80000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 1 */
-#define GPIO_ALT3_SEL      0xC0000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 2 */
-#define GPIO_MASK          0xC0000000      /* GPIO_MASK */
-#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 GPIO0          0
 #define GPIO1          1
 
-
 /*#define MAX_SELECTION_NB     CORE_NB */
 #define MAX_CORE_SELECT_NB     22
 
index 176900ec2f893ef0005ccef5f6b65324328219fa..f6d7183199e8dc584d4c87470ddd759077a7493c 100644 (file)
@@ -68,19 +68,7 @@ SECTIONS
 
     cpu/ppc4xx/start.o (.text)
     board/amcc/bamboo/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)*/
+    board/amcc/bamboo/bamboo.o (.text)
 
     *(.text)
     *(.fixup)
index cc8f8b444e08ed368f4720b65be92336f324429c..c86076e806914f344efb5143d3abf22c3384739b 100644 (file)
 
 #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
-    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_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
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..439be4f
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * (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>
+
+#define        CONFIG_STRESS           /* enable 667 MHz CPU freq selection */
+#define DEBUG
+
+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;
+
+       /* on Katmai SysClk is always 33MHz */
+       strcpy(sysClock, "33");
+
+       do {
+#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(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
+       }
+#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 = 0x000007E1;
+
+       if (strcmp(pcixClock, "66") == 0)
+               data = 0x000006E1;
+
+       if (strcmp(pcixClock, "100") == 0)
+               data = 0x000005E1;
+
+       if (strcmp(pcixClock, "133") == 0)
+               data = 0x000004E1;
+
+       if (strcmp(plbClock, "166") == 0)
+/*             data |= 0x05950000; */  /* this set's DDR2 clock == PLB clock */
+               data |= 0x05A50000;     /* this set's DDR2 clock == 2 * PLB clock */
+       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"
+       );
similarity index 87%
rename from board/amcc/yellowstone/config.mk
rename to board/amcc/katmai/config.mk
index 4ab0ea0084f7a5544960511e52d60473495e5d88..115c1aed05314a3e72e21b6c8ca1d10fd6ca391c 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2002
+# (C) Copyright 2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
 #
 
 #
-# esd ADCIOP boards
+# AMCC 440SPe Evaluation (Katmai) board
 #
 
-#TEXT_BASE = 0x00001000
-
-ifeq ($(ramsym),1)
-TEXT_BASE = 0xFBD00000
-else
-TEXT_BASE = 0xFFF80000
-endif
+TEXT_BASE = 0xfffc0000
 
 PLATFORM_CPPFLAGS += -DCONFIG_440=1
 
diff --git a/board/amcc/katmai/init.S b/board/amcc/katmai/init.S
new file mode 100644 (file)
index 0000000..5202ae6
--- /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, CFG_ACE_BASE, 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..286bdc1
--- /dev/null
@@ -0,0 +1,530 @@
+/*
+ * (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 <asm-ppc/gpio.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..d045df1872cf085424500f636d5953c4a0a40b45 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
@@ -371,6 +371,14 @@ void denali_core_search_data_eye(unsigned long memory_size)
 }
 #endif /* CONFIG_DDR_DATA_EYE */
 
+#if defined(CONFIG_NAND_SPL)
+/* Using cpu/ppc4xx/speed.c to calculate the bus frequency is too big
+ * for the 4k NAND boot image so define bus_frequency to 133MHz here
+ * which is save for the refresh counter setup.
+ */
+#define get_bus_freq(val)      133000000
+#endif
+
 /*************************************************************************
  *
  * initdram -- 440EPx's DDR controller is a DENALI Core
@@ -379,16 +387,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 +412,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 > 133333334)
+               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..870401458e8a2492381710c06922c1ab98cdff11 100644 (file)
@@ -132,6 +132,12 @@ int board_early_init_f(void)
                (0x80000000 >> (28 + CFG_NAND_CS));
        mtsdr(SDR0_CUST0, sdr0_cust0);
 
+       /* Update EBC speed after booting from i2c bootstrap settings
+        * on newer boards with 33.333 MHZ Clocks
+        */
+       if (in8(CFG_BCSR_BASE + 3) & 0x80)
+               mtcpr(0xe0, 0x02000000);
+
        return 0;
 }
 
@@ -336,6 +342,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
@@ -359,8 +369,8 @@ int checkboard(void)
        printf("Board: Rainier - AMCC PPC440GRx Evaluation Board");
 #endif
 
-       rev = *(u8 *)(CFG_CPLD + 0);
-       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
+       rev = in8(CFG_BCSR_BASE + 0);
+       val = in8(CFG_BCSR_BASE + 5) & 0x01;
        printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
 
        if (s != NULL) {
diff --git a/board/amcc/yellowstone/init.S b/board/amcc/yellowstone/init.S
deleted file mode 100644 (file)
index 425ad08..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-*
-* See file CREDITS for list of people who contributed to this
-* project.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as
-* published by the Free Software Foundation; either version 2 of
-* the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-* MA 02111-1307 USA
-*/
-
-#include <ppc_asm.tmpl>
-#include <config.h>
-
-/* General */
-#define TLB_VALID   0x00000200
-
-/* Supported page sizes */
-
-#define SZ_1K      0x00000000
-#define SZ_4K      0x00000010
-#define SZ_16K     0x00000020
-#define SZ_64K     0x00000030
-#define SZ_256K            0x00000040
-#define SZ_1M      0x00000050
-#define SZ_8M       0x00000060
-#define SZ_16M     0x00000070
-#define SZ_256M            0x00000090
-
-/* Storage attributes */
-#define SA_W       0x00000800      /* Write-through */
-#define SA_I       0x00000400      /* Caching inhibited */
-#define SA_M       0x00000200      /* Memory coherence */
-#define SA_G       0x00000100      /* Guarded */
-#define SA_E       0x00000080      /* Endian */
-
-/* Access control */
-#define AC_X       0x00000024      /* Execute */
-#define AC_W       0x00000012      /* Write */
-#define AC_R       0x00000009      /* Read */
-
-/* Some handy macros */
-
-#define EPN(e)         ((e) & 0xfffffc00)
-#define TLB0(epn,sz)   ( (EPN((epn)) | (sz) | TLB_VALID ) )
-#define TLB1(rpn,erpn) ( ((rpn)&0xfffffc00) | (erpn) )
-#define TLB2(a)                ( (a)&0x00000fbf )
-
-#define tlbtab_start\
-       mflr    r1  ;\
-       bl 0f       ;
-
-#define tlbtab_end\
-       .long 0, 0, 0   ;   \
-0:     mflr    r0      ;   \
-       mtlr    r1      ;   \
-       blr             ;
-
-#define tlbentry(epn,sz,rpn,erpn,attr)\
-       .long TLB0(epn,sz),TLB1(rpn,erpn),TLB2(attr)
-
-
-/**************************************************************************
- * 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"
-    .globl tlbtab
-
-tlbtab:
-    tlbtab_start
-
-    /*
-     * BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the
-     * speed up boot process. It is patched after relocation to enable SA_I
-     */
-    tlbentry( CFG_BOOT_BASE_ADDR, SZ_256M, CFG_BOOT_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_G/*|SA_I*/)
-
-    /* TLB-entry for init-ram in dcache (SA_I must be turned off!) */
-    tlbentry( CFG_INIT_RAM_ADDR, SZ_64K, CFG_INIT_RAM_ADDR, 0, AC_R|AC_W|AC_X|SA_G )
-
-    tlbentry( CFG_SDRAM_BASE, SZ_256M, CFG_SDRAM_BASE, 0, AC_R|AC_W|AC_X|SA_G|SA_I )
-    tlbentry( CFG_PCI_BASE, SZ_256M, CFG_PCI_BASE, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_NVRAM_BASE_ADDR, SZ_256M, CFG_NVRAM_BASE_ADDR, 0, AC_R|AC_W|AC_X|SA_W|SA_I )
-
-    /* PCI */
-    tlbentry( CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 0, AC_R|AC_W|SA_G|SA_I )
-    tlbentry( CFG_PCI_MEMBASE3, SZ_256M, CFG_PCI_MEMBASE3, 0, AC_R|AC_W|SA_G|SA_I )
-
-    /* USB 2.0 Device */
-    tlbentry( CFG_USB_DEVICE, SZ_1K, 0x50000000, 0, AC_R|AC_W|SA_G|SA_I )
-
-    tlbtab_end
diff --git a/board/amcc/yellowstone/yellowstone.c b/board/amcc/yellowstone/yellowstone.c
deleted file mode 100644 (file)
index 04f58e0..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- *
- * 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 <spd_sdram.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips   */
-
-int board_early_init_f(void)
-{
-       register uint reg;
-
-       /*--------------------------------------------------------------------
-        * Setup the external bus controller/chip selects
-        *-------------------------------------------------------------------*/
-       mtdcr(ebccfga, xbcfg);
-       reg = mfdcr(ebccfgd);
-       mtdcr(ebccfgd, reg | 0x04000000);       /* Set ATC */
-
-       /*--------------------------------------------------------------------
-        * Setup the GPIO pins
-        *-------------------------------------------------------------------*/
-       /*CPLD cs */
-       /*setup Address lines for flash size 64Meg. */
-       out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x50010000);
-       out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x50010000);
-       out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x50000000);
-
-       /*setup emac */
-       out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xC080);
-       out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x40);
-       out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x55);
-       out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0x50004000);
-       out32(GPIO0_ISR1H, in32(GPIO0_ISR1H) | 0x00440000);
-
-       /*UART1 */
-       out32(GPIO1_TCR, in32(GPIO1_TCR) | 0x02000000);
-       out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x00080000);
-       out32(GPIO1_ISR2L, in32(GPIO1_ISR2L) | 0x00010000);
-
-       /* external interrupts IRQ0...3 */
-       out32(GPIO1_TCR, in32(GPIO1_TCR) & ~0x00f00000);
-       out32(GPIO1_TSRL, in32(GPIO1_TSRL) & ~0x0000ff00);
-       out32(GPIO1_ISR1L, in32(GPIO1_ISR1L) | 0x00005500);
-
-#if 0 /* test-only */
-       /*setup USB 2.0 */
-       out32(GPIO1_TCR, in32(GPIO1_TCR) | 0xc0000000);
-       out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x50000000);
-       out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xf);
-       out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0xaa);
-       out32(GPIO0_ISR2H, in32(GPIO0_ISR2H) | 0x00000500);
-#endif
-
-       /*--------------------------------------------------------------------
-        * Setup the interrupt controller polarities, triggers, etc.
-        *-------------------------------------------------------------------*/
-       mtdcr(uic0sr, 0xffffffff);      /* clear all */
-       mtdcr(uic0er, 0x00000000);      /* disable all */
-       mtdcr(uic0cr, 0x00000009);      /* ATI & UIC1 crit are critical */
-       mtdcr(uic0pr, 0xfffffe13);      /* per ref-board manual */
-       mtdcr(uic0tr, 0x01c00008);      /* per ref-board manual */
-       mtdcr(uic0vr, 0x00000001);      /* int31 highest, base=0x000 */
-       mtdcr(uic0sr, 0xffffffff);      /* clear all */
-
-       mtdcr(uic1sr, 0xffffffff);      /* clear all */
-       mtdcr(uic1er, 0x00000000);      /* disable all */
-       mtdcr(uic1cr, 0x00000000);      /* all non-critical */
-       mtdcr(uic1pr, 0xffffe0ff);      /* per ref-board manual */
-       mtdcr(uic1tr, 0x00ffc000);      /* per ref-board manual */
-       mtdcr(uic1vr, 0x00000001);      /* int31 highest, base=0x000 */
-       mtdcr(uic1sr, 0xffffffff);      /* clear all */
-
-       /*--------------------------------------------------------------------
-        * Setup other serial configuration
-        *-------------------------------------------------------------------*/
-       mfsdr(sdr_pci0, reg);
-       mtsdr(sdr_pci0, 0x80000000 | reg);      /* PCI arbiter enabled */
-       mtsdr(sdr_pfc0, 0x00003e00);    /* Pin function */
-       mtsdr(sdr_pfc1, 0x00048000);    /* Pin function: UART0 has 4 pins */
-
-       /*clear tmrclk divisor */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x04) = 0x00;
-
-       /*enable ethernet */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x08) = 0xf0;
-
-#if 0 /* test-only */
-       /*enable usb 1.1 fs device and remove usb 2.0 reset */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x09) = 0x00;
-#endif
-
-       /*get rid of flash write protect */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x00;
-
-       return 0;
-}
-
-int misc_init_r (void)
-{
-       uint pbcr;
-       int size_val = 0;
-
-       /* Re-do sizing to get full correct info */
-       mtdcr(ebccfga, pb0cr);
-       pbcr = mfdcr(ebccfgd);
-       switch (gd->bd->bi_flashsize) {
-       case 1 << 20:
-               size_val = 0;
-               break;
-       case 2 << 20:
-               size_val = 1;
-               break;
-       case 4 << 20:
-               size_val = 2;
-               break;
-       case 8 << 20:
-               size_val = 3;
-               break;
-       case 16 << 20:
-               size_val = 4;
-               break;
-       case 32 << 20:
-               size_val = 5;
-               break;
-       case 64 << 20:
-               size_val = 6;
-               break;
-       case 128 << 20:
-               size_val = 7;
-               break;
-       }
-       pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
-       mtdcr(ebccfga, pb0cr);
-       mtdcr(ebccfgd, pbcr);
-
-       /* adjust flash start and offset */
-       gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
-       gd->bd->bi_flashoffset = 0;
-
-       /* Monitor protection ON by default */
-       (void)flash_protect(FLAG_PROTECT_SET,
-                           -CFG_MONITOR_LEN,
-                           0xffffffff,
-                           &flash_info[0]);
-
-       return 0;
-}
-
-int checkboard(void)
-{
-       char *s = getenv("serial#");
-       u8 rev;
-       u8 val;
-
-       printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
-
-       rev = *(u8 *)(CFG_CPLD + 0);
-       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
-       printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
-
-       if (s != NULL) {
-               puts(", serial# ");
-               puts(s);
-       }
-       putc('\n');
-
-       return (0);
-}
-
-/*************************************************************************
- *  sdram_init -- doesn't use serial presence detect.
- *
- *  Assumes:    256 MB, ECC, non-registered
- *              PLB @ 133 MHz
- *
- ************************************************************************/
-#define NUM_TRIES 64
-#define NUM_READS 10
-
-void sdram_tr1_set(int ram_address, int* tr1_value)
-{
-       int i;
-       int j, k;
-       volatile unsigned int* ram_pointer =  (unsigned int*)ram_address;
-       int first_good = -1, last_bad = 0x1ff;
-
-       unsigned long test[NUM_TRIES] = {
-               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 };
-
-       /* go through all possible SDRAM0_TR1[RDCT] values */
-       for (i=0; i<=0x1ff; i++) {
-               /* set the current value for TR1 */
-               mtsdram(mem_tr1, (0x80800800 | i));
-
-               /* write values */
-               for (j=0; j<NUM_TRIES; j++) {
-                       ram_pointer[j] = test[j];
-
-                       /* clear any cache at ram location */
-                       __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
-               }
-
-               /* read values back */
-               for (j=0; j<NUM_TRIES; j++) {
-                       for (k=0; k<NUM_READS; k++) {
-                               /* clear any cache at ram location */
-                               __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
-
-                               if (ram_pointer[j] != test[j])
-                                       break;
-                       }
-
-                       /* read error */
-                       if (k != NUM_READS) {
-                               break;
-                       }
-               }
-
-               /* we have a SDRAM0_TR1[RDCT] that is part of the window */
-               if (j == NUM_TRIES) {
-                       if (first_good == -1)
-                               first_good = i;         /* found beginning of window */
-               } else { /* bad read */
-                       /* if we have not had a good read then don't care */
-                       if(first_good != -1) {
-                               /* first failure after a good read */
-                               last_bad = i-1;
-                               break;
-                       }
-               }
-       }
-
-       /* return the current value for TR1 */
-       *tr1_value = (first_good + last_bad) / 2;
-}
-
-void sdram_init(void)
-{
-       register uint reg;
-       int tr1_bank1, tr1_bank2;
-
-       /*--------------------------------------------------------------------
-        * Setup some default
-        *------------------------------------------------------------------*/
-       mtsdram(mem_uabba, 0x00000000); /* ubba=0 (default)             */
-       mtsdram(mem_slio, 0x00000000);  /* rdre=0 wrre=0 rarw=0         */
-       mtsdram(mem_devopt, 0x00000000);        /* dll=0 ds=0 (normal)          */
-       mtsdram(mem_clktr, 0x40000000); /* ?? */
-       mtsdram(mem_wddctr, 0x40000000);        /* ?? */
-
-       /*clear this first, if the DDR is enabled by a debugger
-         then you can not make changes. */
-       mtsdram(mem_cfg0, 0x00000000);  /* Disable EEC */
-
-       /*--------------------------------------------------------------------
-        * Setup for board-specific specific mem
-        *------------------------------------------------------------------*/
-       /*
-        * Following for CAS Latency = 2.5 @ 133 MHz PLB
-        */
-       mtsdram(mem_b0cr, 0x000a4001);  /* SDBA=0x000 128MB, Mode 3, enabled */
-       mtsdram(mem_b1cr, 0x080a4001);  /* SDBA=0x080 128MB, Mode 3, enabled */
-
-       mtsdram(mem_tr0, 0x410a4012);   /* ?? */
-       mtsdram(mem_rtr, 0x04080000);   /* ?? */
-       mtsdram(mem_cfg1, 0x00000000);  /* Self-refresh exit, disable PM    */
-       mtsdram(mem_cfg0, 0x30000000);  /* Disable EEC */
-       udelay(400);            /* Delay 200 usecs (min)            */
-
-       /*--------------------------------------------------------------------
-        * Enable the controller, then wait for DCEN to complete
-        *------------------------------------------------------------------*/
-       mtsdram(mem_cfg0, 0x80000000);  /* Enable */
-
-       for (;;) {
-               mfsdram(mem_mcsts, reg);
-               if (reg & 0x80000000)
-                       break;
-       }
-
-       sdram_tr1_set(0x00000000, &tr1_bank1);
-       sdram_tr1_set(0x08000000, &tr1_bank2);
-       mtsdram(mem_tr1, (((tr1_bank1+tr1_bank2)/2) | 0x80800800) );
-}
-
-/*************************************************************************
- *  long int initdram
- *
- ************************************************************************/
-long int initdram(int board)
-{
-       sdram_init();
-       return CFG_SDRAM_BANKS * (CFG_KBYTES_SDRAM * 1024);     /* return bytes */
-}
-
-#if defined(CFG_DRAM_TEST)
-int testdram(void)
-{
-       unsigned long *mem = (unsigned long *)0;
-       const unsigned long kend = (1024 / sizeof(unsigned long));
-       unsigned long k, n;
-
-       mtmsr(0);
-
-       for (k = 0; k < CFG_KBYTES_SDRAM;
-            ++k, mem += (1024 / sizeof(unsigned long))) {
-               if ((k & 1023) == 0) {
-                       printf("%3d MB\r", k / 1024);
-               }
-
-               memset(mem, 0xaaaaaaaa, 1024);
-               for (n = 0; n < kend; ++n) {
-                       if (mem[n] != 0xaaaaaaaa) {
-                               printf("SDRAM test fails at: %08x\n",
-                                      (uint) & mem[n]);
-                               return 1;
-                       }
-               }
-
-               memset(mem, 0x55555555, 1024);
-               for (n = 0; n < kend; ++n) {
-                       if (mem[n] != 0x55555555) {
-                               printf("SDRAM test fails at: %08x\n",
-                                      (uint) & mem[n]);
-                               return 1;
-                       }
-               }
-       }
-       printf("SDRAM test passes\n");
-       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 addr;
-
-       /*-------------------------------------------------------------------------+
-         | Set priority for all PLB3 devices to 0.
-         | Set PLB3 arbiter to fair mode.
-         +-------------------------------------------------------------------------*/
-       mfsdr(sdr_amp1, addr);
-       mtsdr(sdr_amp1, (addr & 0x000000FF) | 0x0000FF00);
-       addr = mfdcr(plb3_acr);
-       mtdcr(plb3_acr, addr | 0x80000000);
-
-       /*-------------------------------------------------------------------------+
-         | Set priority for all PLB4 devices to 0.
-         +-------------------------------------------------------------------------*/
-       mfsdr(sdr_amp0, addr);
-       mtsdr(sdr_amp0, (addr & 0x000000FF) | 0x0000FF00);
-       addr = mfdcr(plb4_acr) | 0xa0000000;    /* Was 0x8---- */
-       mtdcr(plb4_acr, addr);
-
-       /*-------------------------------------------------------------------------+
-         | Set Nebula PLB4 arbiter to fair mode.
-         +-------------------------------------------------------------------------*/
-       /* Segment0 */
-       addr = (mfdcr(plb0_acr) & ~plb0_acr_ppm_mask) | plb0_acr_ppm_fair;
-       addr = (addr & ~plb0_acr_hbu_mask) | plb0_acr_hbu_enabled;
-       addr = (addr & ~plb0_acr_rdp_mask) | plb0_acr_rdp_4deep;
-       addr = (addr & ~plb0_acr_wrp_mask) | plb0_acr_wrp_2deep;
-       mtdcr(plb0_acr, addr);
-
-       /* Segment1 */
-       addr = (mfdcr(plb1_acr) & ~plb1_acr_ppm_mask) | plb1_acr_ppm_fair;
-       addr = (addr & ~plb1_acr_hbu_mask) | plb1_acr_hbu_enabled;
-       addr = (addr & ~plb1_acr_rdp_mask) | plb1_acr_rdp_4deep;
-       addr = (addr & ~plb1_acr_wrp_mask) | plb1_acr_wrp_2deep;
-       mtdcr(plb1_acr, addr);
-
-       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)
-{
-       /*--------------------------------------------------------------------------+
-        * Set up Direct MMIO registers
-        *--------------------------------------------------------------------------*/
-       /*--------------------------------------------------------------------------+
-         | PowerPC440 EP PCI Master configuration.
-         | Map one 1Gig range of PLB/processor addresses to PCI memory space.
-         |   PLB address 0xA0000000-0xDFFFFFFF ==> PCI address 0xA0000000-0xDFFFFFFF
-         |   Use byte reversed out routines to handle endianess.
-         | Make this region non-prefetchable.
-         +--------------------------------------------------------------------------*/
-       out32r(PCIX0_PMM0MA, 0x00000000);       /* PMM0 Mask/Attribute - disabled b4 setting */
-       out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE);  /* PMM0 Local Address */
-       out32r(PCIX0_PMM0PCILA, CFG_PCI_MEMBASE);       /* PMM0 PCI Low Address */
-       out32r(PCIX0_PMM0PCIHA, 0x00000000);    /* PMM0 PCI High Address */
-       out32r(PCIX0_PMM0MA, 0xE0000001);       /* 512M + No prefetching, and enable region */
-
-       out32r(PCIX0_PMM1MA, 0x00000000);       /* PMM0 Mask/Attribute - disabled b4 setting */
-       out32r(PCIX0_PMM1LA, CFG_PCI_MEMBASE2); /* PMM0 Local Address */
-       out32r(PCIX0_PMM1PCILA, CFG_PCI_MEMBASE2);      /* PMM0 PCI Low Address */
-       out32r(PCIX0_PMM1PCIHA, 0x00000000);    /* PMM0 PCI High Address */
-       out32r(PCIX0_PMM1MA, 0xE0000001);       /* 512M + No prefetching, and enable region */
-
-       out32r(PCIX0_PTM1MS, 0x00000001);       /* Memory Size/Attribute */
-       out32r(PCIX0_PTM1LA, 0);        /* Local Addr. Reg */
-       out32r(PCIX0_PTM2MS, 0);        /* Memory Size/Attribute */
-       out32r(PCIX0_PTM2LA, 0);        /* Local Addr. Reg */
-
-       /*--------------------------------------------------------------------------+
-        * Set up Configuration registers
-        *--------------------------------------------------------------------------*/
-
-       /* Program the board's subsystem id/vendor id */
-       pci_write_config_word(0, PCI_SUBSYSTEM_VENDOR_ID,
-                             CFG_PCI_SUBSYS_VENDORID);
-       pci_write_config_word(0, PCI_SUBSYSTEM_ID, CFG_PCI_SUBSYS_ID);
-
-       /* Configure command register as bus master */
-       pci_write_config_word(0, PCI_COMMAND, PCI_COMMAND_MASTER);
-
-       /* 240nS PCI clock */
-       pci_write_config_word(0, PCI_LATENCY_TIMER, 1);
-
-       /* No error reporting */
-       pci_write_config_word(0, PCI_ERREN, 0);
-
-       pci_write_config_dword(0, PCI_BRDGOPT2, 0x00000101);
-
-}
-#endif                         /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */
-
-/*************************************************************************
- *  pci_master_init
- *
- ************************************************************************/
-#if defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT)
-void pci_master_init(struct pci_controller *hose)
-{
-       unsigned short temp_short;
-
-       /*--------------------------------------------------------------------------+
-         | Write the PowerPC440 EP PCI Configuration regs.
-         |   Enable PowerPC440 EP to be a master on the PCI bus (PMM).
-         |   Enable PowerPC440 EP to act as a PCI memory target (PTM).
-         +--------------------------------------------------------------------------*/
-       pci_read_config_word(0, PCI_COMMAND, &temp_short);
-       pci_write_config_word(0, PCI_COMMAND,
-                             temp_short | PCI_COMMAND_MASTER |
-                             PCI_COMMAND_MEMORY);
-}
-#endif                         /* defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) */
-
-/*************************************************************************
- *  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.
- *
- *
- ************************************************************************/
-#if defined(CONFIG_PCI)
-int is_pci_host(struct pci_controller *hose)
-{
-       /* Bamboo is always configured as host. */
-       return (1);
-}
-#endif                         /* defined(CONFIG_PCI) */
-
-/*************************************************************************
- *  hw_watchdog_reset
- *
- *     This routine is called to reset (keep alive) the watchdog timer
- *
- ************************************************************************/
-#if defined(CONFIG_HW_WATCHDOG)
-void hw_watchdog_reset(void)
-{
-
-}
-#endif
-
-void board_reset(void)
-{
-       /* give reset to BCSR */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x06) = 0x09;
-}
index d47219cb6f8746e3e4c30f1118d8ca84d305e2e5..c2e12ba12ea85d7c40b9ba5fe22cd21b69780355 100644 (file)
@@ -65,12 +65,14 @@ int board_early_init_f(void)
        out32(GPIO1_TSRL, in32(GPIO1_TSRL) & ~0x0000ff00);
        out32(GPIO1_ISR1L, in32(GPIO1_ISR1L) | 0x00005500);
 
+#ifdef CONFIG_440EP
        /*setup USB 2.0 */
        out32(GPIO1_TCR, in32(GPIO1_TCR) | 0xc0000000);
        out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x50000000);
        out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xf);
        out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0xaa);
        out32(GPIO0_ISR2H, in32(GPIO0_ISR2H) | 0x00000500);
+#endif
 
        /*--------------------------------------------------------------------
         * Setup the interrupt controller polarities, triggers, etc.
@@ -105,8 +107,10 @@ int board_early_init_f(void)
        /*enable ethernet */
        *(unsigned char *)(CFG_BCSR_BASE | 0x08) = 0xf0;
 
+#ifdef CONFIG_440EP
        /*enable usb 1.1 fs device and remove usb 2.0 reset */
        *(unsigned char *)(CFG_BCSR_BASE | 0x09) = 0x00;
+#endif
 
        /*get rid of flash write protect */
        *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x00;
@@ -171,7 +175,11 @@ int checkboard(void)
        u8 rev;
        u8 val;
 
+#ifdef CONFIG_440EP
        printf("Board: Yosemite - AMCC PPC440EP Evaluation Board");
+#else
+       printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
+#endif
 
        rev = *(u8 *)(CFG_CPLD + 0);
        val = *(u8 *)(CFG_CPLD + 5) & 0x01;
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 155d46ac979d6989d75524f67544adb35bc95f4d..8a15713cc42c8f3dee0559e2fbda0350b2083060 100644 (file)
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
 
 LIB    := $(obj)lib$(BOARD).a
 
-COBJS  := $(BOARD).o flash.o
+COBJS  := $(BOARD).o flash.o eth.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
index 4d737d293adc540fec06931bf9e03f027d49c141..6618963cc0e4ed6a17c07877b7ccaf0c27b20b6b 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <asm/io.h>
 #include <asm/sdram.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/hmatrix2.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -40,9 +42,27 @@ static const struct sdram_info sdram = {
        .txsr           = 5,
 };
 
-void board_init_memories(void)
+int board_early_init_f(void)
 {
-       gd->sdram_size = sdram_init(&sdram);
+       /* Set the SDRAM_ENABLE bit in the HEBI SFR */
+       hmatrix2_writel(SFR4, 1 << 1);
+
+       gpio_enable_ebi();
+       gpio_enable_usart1();
+#if defined(CONFIG_MACB)
+       gpio_enable_macb0();
+       gpio_enable_macb1();
+#endif
+#if defined(CONFIG_MMC)
+       gpio_enable_mmci();
+#endif
+
+       return 0;
+}
+
+long int initdram(int board_type)
+{
+       return sdram_init(&sdram);
 }
 
 void board_init_info(void)
similarity index 66%
rename from cpu/at32ap/at32ap7000/hebi.c
rename to board/atmel/atstk1000/eth.c
index 3b32adf1ea9d8daa02c115708f69d76d44545cd8..3a7916efed294be45c6bd1ea7222f044181f84f1 100644 (file)
@@ -1,5 +1,7 @@
 /*
- * Copyright (C) 2006 Atmel Corporation
+ * Copyright (C) 2005-2006 Atmel Corporation
+ *
+ * Ethernet initialization for the ATSTK1000 starterkit
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  */
 #include <common.h>
 
-#include <asm/io.h>
-
-#include <asm/arch/hmatrix2.h>
 #include <asm/arch/memory-map.h>
-#include <asm/arch/platform.h>
 
-void cpu_enable_sdram(void)
-{
-       const struct device *hmatrix;
+extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);
 
-       hmatrix = get_device(DEVICE_HMATRIX);
+#if defined(CONFIG_MACB) && (CONFIG_COMMANDS & CFG_CMD_NET)
+void atstk1000_eth_initialize(bd_t *bi)
+{
+       int id = 0;
 
-       /* Set the SDRAM_ENABLE bit in the HEBI SFR */
-       hmatrix2_writel(hmatrix, SFR4, 1 << 1);
+       macb_eth_initialize(id++, (void *)MACB0_BASE, bi->bi_phy_id[0]);
+       macb_eth_initialize(id++, (void *)MACB1_BASE, bi->bi_phy_id[1]);
 }
+#endif
index 3aebf66ee24015a01d5f5f4c0ff68e2dc4bb86c0..958f4dc330c82fb0c245c3fafcf2deae7306632e 100644 (file)
@@ -57,7 +57,7 @@ unsigned long flash_init(void)
 
        gd->bd->bi_flashstart = CFG_FLASH_BASE;
        gd->bd->bi_flashsize = CFG_FLASH_SIZE;
-       gd->bd->bi_flashoffset = __edata_lma - _text;
+       gd->bd->bi_flashoffset = _edata - _text;
 
        flash_info[0].size = CFG_FLASH_SIZE;
        flash_info[0].sector_count = 135;
index ef89ea4dfa53d696cb47d5fb1ab6e06f76192632..34e347aecd5e6b7abd2ace5dd293f840838d427a 100644 (file)
@@ -40,35 +40,38 @@ SECTIONS
        }
        . = ALIGN(32);
        __flashprog_end = .;
+       _etext = .;
 
-       . = ALIGN(8);
        .rodata : {
                *(.rodata)
                *(.rodata.*)
        }
-       _etext = .;
 
-       __data_lma = ALIGN(8);
-       . = 0x24000000;
+       . = ALIGN(8);
        _data = .;
-       .data : AT(__data_lma) {
+       .data : {
                *(.data)
                *(.data.*)
        }
 
        . = ALIGN(4);
        __u_boot_cmd_start = .;
-       __u_boot_cmd_lma = __data_lma + (__u_boot_cmd_start - _data);
-       .u_boot_cmd : AT(__u_boot_cmd_lma) {
+       .u_boot_cmd : {
                KEEP(*(.u_boot_cmd))
        }
        __u_boot_cmd_end = .;
 
+       . = ALIGN(4);
+       _got = .;
+       .got : {
+               *(.got)
+       }
+       _egot = .;
+
        . = ALIGN(8);
        _edata = .;
-       __edata_lma = __u_boot_cmd_lma + (_edata - __u_boot_cmd_start);
 
-       .bss : AT(__edata_lma) {
+       .bss : {
                *(.bss)
                *(.bss.*)
        }
diff --git a/board/bf533-ezkit/Makefile b/board/bf533-ezkit/Makefile
new file mode 100644 (file)
index 0000000..e55c1a7
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Device Inc.
+#
+# (C) Copyright 2000-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 flash.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS) u-boot.lds
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+u-boot.lds: u-boot.lds.S
+       $(CPP) $(CPPFLAGS) -P -Ubfin $^ > $@.tmp
+       mv -f $@.tmp $@
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
similarity index 72%
rename from board/ezkit533/ezkit533.c
rename to board/bf533-ezkit/bf533-ezkit.c
index 8d6c8de70b0ebbcfb51059d2d0a5b6317a1ceeec..1dd4a3fe2e0af9c9139a13a13478a43c625e84a7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - ezkit533.c
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include "psd4256.h"
 #endif
 
-DECLARE_GLOBAL_DATA_PTR;
-
 int checkboard(void)
 {
+#if (BFIN_CPU == ADSP_BF531)
+       printf("CPU:   ADSP BF531 Rev.: 0.%d\n", *pCHIPID >> 28);
+#elif (BFIN_CPU == ADSP_BF532)
+       printf("CPU:   ADSP BF532 Rev.: 0.%d\n", *pCHIPID >> 28);
+#else
        printf("CPU:   ADSP BF533 Rev.: 0.%d\n", *pCHIPID >> 28);
+#endif
        printf("Board: ADI BF533 EZ-Kit Lite board\n");
        printf("       Support: http://blackfin.uclinux.org/\n");
-       printf("       Richard Klingler <richard@uclinux.net>\n");
        return 0;
 }
 
 long int initdram(int board_type)
 {
+       DECLARE_GLOBAL_DATA_PTR;
 #ifdef DEBUG
        int brate;
        char *tmp = getenv("baudrate");
        brate = simple_strtoul(tmp, NULL, 16);
-       printf("Serial Port initialized with Baud rate = %x\n",brate);
+       printf("Serial Port initialized with Baud rate = %x\n", brate);
        printf("SDRAM attributes:\n");
        printf("tRCD %d SCLK Cycles,tRP %d SCLK Cycles,tRAS %d SCLK Cycles"
               "tWR %d SCLK Cycles,CAS Latency %d SCLK cycles \n",
@@ -64,9 +68,13 @@ long int initdram(int board_type)
 /* miscellaneous platform dependent initialisations */
 int misc_init_r(void)
 {
-       /* Set direction bits for Video en/decoder reset as output      */
-       *(volatile unsigned char *)(CFG_FLASH1_BASE + PSD_PORTA_DIR) = PSDA_VDEC_RST | PSDA_VENC_RST;
-       /* Deactivate Video en/decoder reset lines                      */
-       *(volatile unsigned char *)(CFG_FLASH1_BASE + PSD_PORTA_DOUT) = PSDA_VDEC_RST | PSDA_VENC_RST;
+       /* Set direction bits for Video en/decoder reset as output      */
+       *(volatile unsigned char *)(CFG_FLASH1_BASE + PSD_PORTA_DIR) =
+           PSDA_VDEC_RST | PSDA_VENC_RST;
+       /* Deactivate Video en/decoder reset lines                      */
+       *(volatile unsigned char *)(CFG_FLASH1_BASE + PSD_PORTA_DOUT) =
+           PSDA_VDEC_RST | PSDA_VENC_RST;
+
+       return 0;
 }
 #endif
diff --git a/board/bf533-ezkit/config.mk b/board/bf533-ezkit/config.mk
new file mode 100644 (file)
index 0000000..f39be5f
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# TEXT_BASE should be defined as the MAX_SDRAM Address - 256k bytes
+#  256k is defined as CFG_MONITOR_LEN in ./include/configs/<board>.h
+TEXT_BASE = 0x01FC0000
similarity index 91%
rename from board/ezkit533/flash-defines.h
rename to board/bf533-ezkit/flash-defines.h
index 8f9dff5de815742ec611cc9a556d9a442257b274..bd9e859e70db09be2207e64d99e6eb43109ba9ff 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - flash-defines.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __FLASHDEFINES_H__
 #define CFG_FLASH0_BASE                0x20000000
 #define RESET_VAL              0xF0
 
-
-asm("#define FLASH_START_L 0x0000");
-asm("#define FLASH_START_H 0x2000");
-
 flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
 
 int get_codes(void);
 int poll_toggle_bit(long lOffset);
 void reset_flash(void);
 int erase_flash(void);
-int erase_block_flash(int,unsigned long);
+int erase_block_flash(int, unsigned long);
 void unlock_flash(long lOffset);
-int write_data(long lStart, long lCount, long lStride, int *pnData);
+int write_data(long lStart, long lCount, uchar *pnData);
 int FillData(long lStart, long lCount, long lStride, int *pnData);
 int read_data(long lStart, long lCount, long lStride, int *pnData);
 int read_flash(long nOffset, int *pnValue);
similarity index 74%
rename from board/ezkit533/flash.c
rename to board/bf533-ezkit/flash.c
index b0a0796b864e002b89b3dd2d1fe1ed0ad6b02058..299cdbae735bbc4521349b41e6539272035997a2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - flash.c Flash driver for PSD4256GV
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  * This file is based on BF533EzFlash.c originally written by Analog Devices, Inc.
  *
  * (C) Copyright 2000-2004
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
+#include <asm/io.h>
 #include "flash-defines.h"
 
 void flash_reset(void)
@@ -33,14 +34,13 @@ void flash_reset(void)
        reset_flash();
 }
 
-unsigned long flash_get_size(ulong baseaddr, flash_info_t * info,
-                            int bank_flag)
+unsigned long flash_get_size(ulong baseaddr, flash_info_t * info, int bank_flag)
 {
        int id = 0, i = 0;
        static int FlagDev = 1;
 
        id = get_codes();
-       if(FlagDev)     {
+       if (FlagDev) {
 #ifdef DEBUG
                printf("Device ID of the Flash is %x\n", id);
 #endif
@@ -100,10 +100,11 @@ unsigned long flash_init(void)
 
        if (flash_info[0].flash_id == FLASH_UNKNOWN || size_b0 == 0) {
                printf("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
-                       size_b0, size_b0 >> 20);
+                      size_b0, size_b0 >> 20);
        }
 
-       (void)flash_protect(FLAG_PROTECT_SET,CFG_FLASH0_BASE,(flash_info[0].start[2] - 1),&flash_info[0]);
+       (void)flash_protect(FLAG_PROTECT_SET, CFG_FLASH0_BASE,
+                           (flash_info[0].start[2] - 1), &flash_info[0]);
 
        return (size_b0 + size_b1 + size_b2);
 }
@@ -122,15 +123,14 @@ void flash_print_info(flash_info_t * info)
                printf("ST Microelectronics ");
                break;
        default:
-               printf("Unknown Vendor ");
+               printf("Unknown Vendor: (0x%08X) ", info->flash_id);
                break;
        }
        for (i = 0; i < info->sector_count; ++i) {
                if ((i % 5) == 0)
                        printf("\n   ");
                printf(" %08lX%s",
-                       info->start[i],
-                       info->protect[i] ? " (RO)" : "     ");
+                      info->start[i], info->protect[i] ? " (RO)" : "     ");
        }
        printf("\n");
        return;
@@ -138,8 +138,8 @@ void flash_print_info(flash_info_t * info)
 
 int flash_erase(flash_info_t * info, int s_first, int s_last)
 {
-       int cnt = 0,i;
-       int prot,sect;
+       int cnt = 0, i;
+       int prot, sect;
 
        prot = 0;
        for (sect = s_first; sect <= s_last; ++sect) {
@@ -148,15 +148,16 @@ int flash_erase(flash_info_t * info, int s_first, int s_last)
        }
 
        if (prot)
-               printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+               printf("- Warning: %d protected sectors will not be erased!\n",
+                      prot);
        else
-               printf ("\n");
+               printf("\n");
 
        cnt = s_last - s_first + 1;
 
        if (cnt == FLASH_TOT_SECT) {
                printf("Erasing flash, Please Wait \n");
-               if(erase_flash() < 0) {
+               if (erase_flash() < 0) {
                        printf("Erasing flash failed \n");
                        return FLASH_FAIL;
                }
@@ -164,7 +165,7 @@ int flash_erase(flash_info_t * info, int s_first, int s_last)
                printf("Erasing Flash locations, Please Wait\n");
                for (i = s_first; i <= s_last; i++) {
                        if (info->protect[i] == 0) {    /* not protected */
-                               if(erase_block_flash(i, info->start[i]) < 0) {
+                               if (erase_block_flash(i, info->start[i]) < 0) {
                                        printf("Error Sector erasing \n");
                                        return FLASH_FAIL;
                                }
@@ -177,60 +178,66 @@ int flash_erase(flash_info_t * info, int s_first, int s_last)
 int write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
 {
        int ret;
-
-       ret = write_data(addr, cnt, 1, (int *) src);
-       if(ret == FLASH_FAIL)
+       int d;
+       if (addr % 2) {
+               read_flash(addr - 1 - CFG_FLASH_BASE, &d);
+               d = (int)((d & 0x00FF) | (*src++ << 8));
+               ret = write_data(addr - 1, 2, (uchar *) & d);
+               if (ret == FLASH_FAIL)
+                       return ERR_NOT_ERASED;
+               ret = write_data(addr + 1, cnt - 1, src);
+       } else
+               ret = write_data(addr, cnt, src);
+       if (ret == FLASH_FAIL)
                return ERR_NOT_ERASED;
        return FLASH_SUCCESS;
 }
 
-
-int write_data(long lStart, long lCount, long lStride, int *pnData)
+int write_data(long lStart, long lCount, uchar * pnData)
 {
        long i = 0;
-       int j = 0;
        unsigned long ulOffset = lStart - CFG_FLASH_BASE;
        int d;
-       int iShift = 0;
-       int iNumWords = 2;
-       int nLeftover = lCount % 4;
        int nSector = 0;
+       int flag = 0;
 
-       for (i = 0; (i < lCount / 4) && (i < BUFFER_SIZE); i++) {
-               for (iShift = 0, j = 0; (j < iNumWords);
-                       j++, ulOffset += (lStride * 2)) {
-                       if ((ulOffset >= INVALIDLOCNSTART)
-                       && (ulOffset < INVALIDLOCNEND)) {
-                               printf("Invalid locations, Try writing to another location \n");
-                               return FLASH_FAIL;
-                       }
-                       get_sector_number(ulOffset, &nSector);
-                       read_flash(ulOffset,&d);
-                       if(d != 0xffff) {
-                               printf("Flash not erased at offset 0x%x Please erase to reprogram \n",ulOffset);
-                               return FLASH_FAIL;
-                       }
-                       unlock_flash(ulOffset);
-                       if(write_flash(ulOffset, (pnData[i] >> iShift)) < 0) {
-                               printf("Error programming the flash \n");
-                               return FLASH_FAIL;
-                       }
-                       iShift += 16;
+       if (lCount % 2) {
+               flag = 1;
+               lCount = lCount - 1;
+       }
+
+       for (i = 0; i < lCount - 1; i += 2, ulOffset += 2) {
+               get_sector_number(ulOffset, &nSector);
+               read_flash(ulOffset, &d);
+               if (d != 0xffff) {
+                       printf
+                           ("Flash not erased at offset 0x%x Please erase to reprogram \n",
+                            ulOffset);
+                       return FLASH_FAIL;
+               }
+               unlock_flash(ulOffset);
+               d = (int)(pnData[i] | pnData[i + 1] << 8);
+               write_flash(ulOffset, d);
+               if (poll_toggle_bit(ulOffset) < 0) {
+                       printf("Error programming the flash \n");
+                       return FLASH_FAIL;
                }
+               if ((i > 0) && (!(i % AFP_SectorSize2)))
+                       printf(".");
        }
-       if (nLeftover > 0) {
-               if ((ulOffset >= INVALIDLOCNSTART)
-                       && (ulOffset < INVALIDLOCNEND))
-                               return FLASH_FAIL;
+       if (flag) {
                get_sector_number(ulOffset, &nSector);
-               read_flash(ulOffset,&d);
-               if(d != 0xffff) {
-                       printf("Flash already programmed. Please erase to reprogram \n");
-                       printf("uloffset = 0x%x \t d = 0x%x\n",ulOffset,d);
+               read_flash(ulOffset, &d);
+               if (d != 0xffff) {
+                       printf
+                           ("Flash not erased at offset 0x%x Please erase to reprogram \n",
+                            ulOffset);
                        return FLASH_FAIL;
                }
                unlock_flash(ulOffset);
-               if(write_flash(ulOffset, pnData[i]) < 0) {
+               d = (int)(pnData[i] | (d & 0xFF00));
+               write_flash(ulOffset, d);
+               if (poll_toggle_bit(ulOffset) < 0) {
                        printf("Error programming the flash \n");
                        return FLASH_FAIL;
                }
@@ -252,8 +259,8 @@ int read_data(long ulStart, long lCount, long lStride, int *pnData)
        for (i = 0; (i < lCount / 4) && (i < BUFFER_SIZE); i++) {
                for (iShift = 0, j = 0; j < iNumWords; j += 2) {
                        if ((ulOffset >= INVALIDLOCNSTART)
-                               && (ulOffset < INVALIDLOCNEND))
-                                       return FLASH_FAIL;
+                           && (ulOffset < INVALIDLOCNEND))
+                               return FLASH_FAIL;
 
                        get_sector_number(ulOffset, &nSector);
                        read_flash(ulOffset, &nLow);
@@ -265,8 +272,8 @@ int read_data(long ulStart, long lCount, long lStride, int *pnData)
        }
        if (nLeftover > 0) {
                if ((ulOffset >= INVALIDLOCNSTART)
-                       && (ulOffset < INVALIDLOCNEND))
-                               return FLASH_FAIL;
+                   && (ulOffset < INVALIDLOCNEND))
+                       return FLASH_FAIL;
 
                get_sector_number(ulOffset, &nSector);
                read_flash(ulOffset, &pnData[i]);
@@ -279,10 +286,10 @@ int write_flash(long nOffset, int nValue)
        long addr;
 
        addr = (CFG_FLASH_BASE + nOffset);
-       asm("ssync;");
-       *(unsigned volatile short *) addr = nValue;
-       asm("ssync;");
-       if(poll_toggle_bit(nOffset) < 0)
+       sync();
+       *(unsigned volatile short *)addr = nValue;
+       sync();
+       if (poll_toggle_bit(nOffset) < 0)
                return FLASH_FAIL;
        return FLASH_SUCCESS;
 }
@@ -294,29 +301,30 @@ int read_flash(long nOffset, int *pnValue)
 
        if (nOffset != 0x2)
                reset_flash();
-       asm("ssync;");
-       nValue = *(volatile unsigned short *) addr;
-       asm("ssync;");
+       sync();
+       nValue = *(volatile unsigned short *)addr;
+       sync();
        *pnValue = nValue;
        return TRUE;
 }
 
 int poll_toggle_bit(long lOffset)
 {
-       unsigned int u1,u2;
+       unsigned int u1, u2;
        unsigned long timeout = 0xFFFFFFFF;
-       volatile unsigned long *FB = (volatile unsigned long *)(0x20000000 + lOffset);
-       while(1) {
-               if(timeout < 0)
+       volatile unsigned long *FB =
+           (volatile unsigned long *)(0x20000000 + lOffset);
+       while (1) {
+               if (timeout < 0)
                        break;
                u1 = *(volatile unsigned short *)FB;
                u2 = *(volatile unsigned short *)FB;
-               if((u1 & 0x0040) == (u2 & 0x0040))
+               if ((u1 & 0x0040) == (u2 & 0x0040))
                        return FLASH_SUCCESS;
-               if((u2 & 0x0020) == 0x0000)
+               if ((u2 & 0x0020) == 0x0000)
                        continue;
                u1 = *(volatile unsigned short *)FB;
-               if((u2 & 0x0040) == (u1 & 0x0040))
+               if ((u2 & 0x0040) == (u1 & 0x0040))
                        return FLASH_SUCCESS;
                else {
                        reset_flash();
@@ -325,7 +333,8 @@ int poll_toggle_bit(long lOffset)
                timeout--;
        }
        printf("Time out occured \n");
-       if(timeout <0)  return FLASH_FAIL;
+       if (timeout < 0)
+               return FLASH_FAIL;
 }
 
 void reset_flash(void)
@@ -344,7 +353,7 @@ int erase_flash(void)
        write_flash(WRITESEQ5, WRITEDATA5);
        write_flash(WRITESEQ6, WRITEDATA6);
 
-       if(poll_toggle_bit(0x0000) < 0)
+       if (poll_toggle_bit(0x0000) < 0)
                return FLASH_FAIL;
 
        write_flash(SecFlashAOff + WRITESEQ1, WRITEDATA1);
@@ -354,7 +363,7 @@ int erase_flash(void)
        write_flash(SecFlashAOff + WRITESEQ5, WRITEDATA5);
        write_flash(SecFlashAOff + WRITESEQ6, WRITEDATA6);
 
-       if(poll_toggle_bit(SecFlashASec1Off) < 0)
+       if (poll_toggle_bit(SecFlashASec1Off) < 0)
                return FLASH_FAIL;
 
        write_flash(PriFlashBOff + WRITESEQ1, WRITEDATA1);
@@ -364,7 +373,7 @@ int erase_flash(void)
        write_flash(PriFlashBOff + WRITESEQ5, WRITEDATA5);
        write_flash(PriFlashBOff + WRITESEQ6, WRITEDATA6);
 
-       if(poll_toggle_bit(PriFlashBOff) <0)
+       if (poll_toggle_bit(PriFlashBOff) < 0)
                return FLASH_FAIL;
 
        write_flash(SecFlashBOff + WRITESEQ1, WRITEDATA1);
@@ -374,7 +383,7 @@ int erase_flash(void)
        write_flash(SecFlashBOff + WRITESEQ5, WRITEDATA5);
        write_flash(SecFlashBOff + WRITESEQ6, WRITEDATA6);
 
-       if(poll_toggle_bit(SecFlashBOff) < 0)
+       if (poll_toggle_bit(SecFlashBOff) < 0)
                return FLASH_FAIL;
 
        return FLASH_SUCCESS;
@@ -397,7 +406,7 @@ int erase_block_flash(int nBlock, unsigned long address)
 
        write_flash(ulSectorOff, BlockEraseVal);
 
-       if(poll_toggle_bit(ulSectorOff) < 0)
+       if (poll_toggle_bit(ulSectorOff) < 0)
                return FLASH_FAIL;
 
        return FLASH_SUCCESS;
@@ -435,34 +444,34 @@ void get_sector_number(long ulOffset, int *pnSector)
 
        if (ulOffset >= SecFlashAOff) {
                if ((ulOffset < SecFlashASec1Off)
-                       && (ulOffset < SecFlashASec2Off)) {
-                               nSector = SECT32;
+                   && (ulOffset < SecFlashASec2Off)) {
+                       nSector = SECT32;
                } else if ((ulOffset >= SecFlashASec2Off)
-                       && (ulOffset < SecFlashASec3Off)) {
-                               nSector = SECT33;
+                          && (ulOffset < SecFlashASec3Off)) {
+                       nSector = SECT33;
                } else if ((ulOffset >= SecFlashASec3Off)
-                       && (ulOffset < SecFlashASec4Off)) {
-                               nSector = SECT34;
+                          && (ulOffset < SecFlashASec4Off)) {
+                       nSector = SECT34;
                } else if ((ulOffset >= SecFlashASec4Off)
-                       && (ulOffset < SecFlashAEndOff)) {
-                               nSector = SECT35;
+                          && (ulOffset < SecFlashAEndOff)) {
+                       nSector = SECT35;
                }
        } else if (ulOffset >= SecFlashBOff) {
                if ((ulOffset < SecFlashBSec1Off)
-                       && (ulOffset < SecFlashBSec2Off)) {
-                               nSector = SECT36;
+                   && (ulOffset < SecFlashBSec2Off)) {
+                       nSector = SECT36;
                }
                if ((ulOffset < SecFlashBSec2Off)
-                       && (ulOffset < SecFlashBSec3Off)) {
-                               nSector = SECT37;
+                   && (ulOffset < SecFlashBSec3Off)) {
+                       nSector = SECT37;
                }
                if ((ulOffset < SecFlashBSec3Off)
-                       && (ulOffset < SecFlashBSec4Off)) {
-                               nSector = SECT38;
+                   && (ulOffset < SecFlashBSec4Off)) {
+                       nSector = SECT38;
                }
                if ((ulOffset < SecFlashBSec4Off)
-                       && (ulOffset < SecFlashBEndOff)) {
-                               nSector = SECT39;
+                   && (ulOffset < SecFlashBEndOff)) {
+                       nSector = SECT39;
                }
        } else if ((ulOffset >= PriFlashAOff) && (ulOffset < SecFlashAOff)) {
                nSector = ulOffset & 0xffff0000;
similarity index 61%
rename from board/ezkit533/psd4256.h
rename to board/bf533-ezkit/psd4256.h
index 01f656601b708d21cec5d07a7f6a48392a552467..cc654b89561436e8c47b64a3f4795439d5ecd3e2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - psd4256.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /*
  * Flash A Port A Bit definitions
  */
 
-#define        PSDA_PPICLK1    0x20            /* PPI Clock select bit 1               */
-#define        PSDA_PPICLK0    0x10            /* PPI Clock select bit 0               */
-#define        PSDA_VDEC_RST   0x08            /* Video decoder reset, 0 = RESET       */
-#define        PSDA_VENC_RST   0x04            /* Video encoder reset, 0 = RESET       */
-#define        PSDA_CODEC_RST  0x01            /* Codec reset, 0 = RESET               */
+#define        PSDA_PPICLK1    0x20    /* PPI Clock select bit 1               */
+#define        PSDA_PPICLK0    0x10    /* PPI Clock select bit 0               */
+#define        PSDA_VDEC_RST   0x08    /* Video decoder reset, 0 = RESET       */
+#define        PSDA_VENC_RST   0x04    /* Video encoder reset, 0 = RESET       */
+#define        PSDA_CODEC_RST  0x01    /* Codec reset, 0 = RESET               */
 
 /*
  * Flash A Port B Bit definitions
  */
 
-#define        PSDA_LED9       0x20            /* LED 9, 1 = LED ON                    */
-#define        PSDA_LED8       0x10            /* LED 8, 1 = LED ON                    */
-#define        PSDA_LED7       0x08            /* LED 7, 1 = LED ON                    */
-#define        PSDA_LED6       0x04            /* LED 6, 1 = LED ON                    */
-#define        PSDA_LED5       0x02            /* LED 5, 1 = LED ON                    */
-#define        PSDA_LED4       0x01            /* LED 4, 1 = LED ON                    */
+#define        PSDA_LED9       0x20    /* LED 9, 1 = LED ON                    */
+#define        PSDA_LED8       0x10    /* LED 8, 1 = LED ON                    */
+#define        PSDA_LED7       0x08    /* LED 7, 1 = LED ON                    */
+#define        PSDA_LED6       0x04    /* LED 6, 1 = LED ON                    */
+#define        PSDA_LED5       0x02    /* LED 5, 1 = LED ON                    */
+#define        PSDA_LED4       0x01    /* LED 4, 1 = LED ON                    */
similarity index 92%
rename from board/ezkit533/u-boot.lds
rename to board/bf533-ezkit/u-boot.lds.S
index 10203ff89be0a820ce119f4ac643c7c71bb91ad8..9742e0297c06779b6265ee2e114e933c0f204047 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * U-boot - u-boot.lds
+ * U-boot - u-boot.lds.S
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Device Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -25,6 +25,8 @@
  * MA 02111-1307 USA
  */
 
+#include <config.h>
+
 OUTPUT_ARCH(bfin)
 SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
 /* Do we need any of these for elf?
@@ -55,6 +57,7 @@ SECTIONS
   .rela.plt      : { *(.rela.plt)      }
   .init          : { *(.init)          }
   .plt : { *(.plt) }
+  . = CFG_MONITOR_BASE;
   .text      :
   {
     /* WARNING - the following is hand-optimized to fit within */
@@ -68,10 +71,11 @@ SECTIONS
     cpu/bf533/interrupt.o      (.text)
     cpu/bf533/serial.o         (.text)
     common/dlmalloc.o          (.text)
-    lib_generic/vsprintf.o     (.text)
+/*  lib_blackfin/bf533_string.o        (.text) */
+/*  lib_generic/vsprintf.o     (.text) */
     lib_generic/crc32.o                (.text)
     lib_generic/zlib.o         (.text)
-    board/ezkit533/ezkit533.o          (.text)
+    board/bf533-ezkit/bf533-ezkit.o            (.text)
 
     . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o       (.text)
@@ -119,9 +123,9 @@ SECTIONS
   _edata  =  .;
   PROVIDE (edata = .);
 
-  __u_boot_cmd_start = .;
+  ___u_boot_cmd_start = .;
   .u_boot_cmd : { *(.u_boot_cmd) }
-  __u_boot_cmd_end = .;
+  ___u_boot_cmd_end = .;
 
 
   __start___ex_table = .;
diff --git a/board/bf533-stamp/Makefile b/board/bf533-stamp/Makefile
new file mode 100644 (file)
index 0000000..02c941b
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Device Inc.
+#
+# (C) Copyright 2000-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 spi.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS) u-boot.lds
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+u-boot.lds: u-boot.lds.S
+       $(CPP) $(CPPFLAGS) -P -Ubfin $^ > $@.tmp
+       mv -f $@.tmp $@
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
similarity index 59%
rename from board/stamp/stamp.c
rename to board/bf533-stamp/bf533-stamp.c
index 7e3af20eab2a554d87e8f79070039ff076d2ffe1..b9dff99171a46cf81b2eebdad9d2ab4255b67e37 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - stamp.c STAMP board specific routines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <asm/mem_init.h>
-#include "stamp.h"
-
-DECLARE_GLOBAL_DATA_PTR;
+#include <asm/io.h>
+#include "bf533-stamp.h"
 
 #define STATUS_LED_OFF 0
 #define STATUS_LED_ON  1
@@ -40,42 +39,45 @@ DECLARE_GLOBAL_DATA_PTR;
 # define SHOW_BOOT_PROGRESS(arg)
 #endif
 
-int checkboard (void)
+int checkboard(void)
 {
-       printf ("CPU:   ADSP BF533 Rev.: 0.%d\n", *pCHIPID >> 28);
-       printf ("Board: ADI BF533 Stamp board\n");
-       printf ("       Support: http://blackfin.uclinux.org/\n");
-       printf ("       Richard Klingler <richard@uclinux.net>\n");
+#if (BFIN_CPU == ADSP_BF531)
+       printf("CPU:   ADSP BF531 Rev.: 0.%d\n", *pCHIPID >> 28);
+#elif (BFIN_CPU == ADSP_BF532)
+       printf("CPU:   ADSP BF532 Rev.: 0.%d\n", *pCHIPID >> 28);
+#else
+       printf("CPU:   ADSP BF533 Rev.: 0.%d\n", *pCHIPID >> 28);
+#endif
+       printf("Board: ADI BF533 Stamp board\n");
+       printf("       Support: http://blackfin.uclinux.org/\n");
        return 0;
 }
 
-long int initdram (int board_type)
+long int initdram(int board_type)
 {
+       DECLARE_GLOBAL_DATA_PTR;
 #ifdef DEBUG
-       printf ("SDRAM attributes:\n");
-       printf ("  tRCD:%d Cycles; tRP:%d Cycles; tRAS:%d Cycles; tWR:%d Cycles; "
-               "CAS Latency:%d cycles\n",
-               (SDRAM_tRCD >> 15),
-               (SDRAM_tRP >> 11),
-               (SDRAM_tRAS >> 6),
-               (SDRAM_tWR >> 19),
-               (SDRAM_CL >> 2));
-       printf ("SDRAM Begin: 0x%x\n", CFG_SDRAM_BASE);
-       printf ("Bank size = %d MB\n", 128);
+       printf("SDRAM attributes:\n");
+       printf
+           ("  tRCD:%d Cycles; tRP:%d Cycles; tRAS:%d Cycles; tWR:%d Cycles; "
+            "CAS Latency:%d cycles\n", (SDRAM_tRCD >> 15), (SDRAM_tRP >> 11),
+            (SDRAM_tRAS >> 6), (SDRAM_tWR >> 19), (SDRAM_CL >> 2));
+       printf("SDRAM Begin: 0x%x\n", CFG_SDRAM_BASE);
+       printf("Bank size = %d MB\n", 128);
 #endif
        gd->bd->bi_memstart = CFG_SDRAM_BASE;
        gd->bd->bi_memsize = CFG_MAX_RAM_SIZE;
        return (gd->bd->bi_memsize);
 }
 
-void swap_to (int device_id)
+void swap_to(int device_id)
 {
 
        if (device_id == ETHERNET) {
                *pFIO_DIR = PF0;
-               asm ("ssync;");
+               sync();
                *pFIO_FLAG_S = PF0;
-               asm ("ssync;");
+               sync();
        } else if (device_id == FLASH) {
                *pFIO_DIR = (PF4 | PF3 | PF2 | PF1 | PF0);
                *pFIO_FLAG_S = (PF4 | PF3 | PF2);
@@ -85,9 +87,9 @@ void swap_to (int device_id)
                *pFIO_EDGE = (PF8 | PF7 | PF6 | PF5);
                *pFIO_INEN = (PF8 | PF7 | PF6 | PF5);
                *pFIO_FLAG_D = (PF4 | PF3 | PF2);
-               asm ("ssync;");
+               sync();
        } else {
-               printf ("Unknown bank to switch\n");
+               printf("Unknown bank to switch\n");
        }
 
        return;
@@ -95,7 +97,7 @@ void swap_to (int device_id)
 
 #if defined(CONFIG_MISC_INIT_R)
 /* miscellaneous platform dependent initialisations */
-int misc_init_r (void)
+int misc_init_r(void)
 {
        int i;
        int cf_stat = 0;
@@ -104,7 +106,7 @@ int misc_init_r (void)
        *pFIO_EDGE = FIO_EDGE_CF_BITS;
        *pFIO_POLAR = FIO_POLAR_CF_BITS;
        for (i = 0; i < 0x300; i++)
-               asm ("nop;");
+               asm("nop;");
 
        if ((*pFIO_FLAG_S) & CF_STAT_BITS) {
                cf_stat = 0;
@@ -115,37 +117,36 @@ int misc_init_r (void)
        *pFIO_EDGE = FIO_EDGE_BITS;
        *pFIO_POLAR = FIO_POLAR_BITS;
 
-
        if (cf_stat) {
-               printf ("Booting from COMPACT flash\n");
+               printf("Booting from COMPACT flash\n");
 
                /* Set cycle time for CF */
-               *(volatile unsigned long *) ambctl1 = CF_AMBCTL1VAL;
+               *(volatile unsigned long *)ambctl1 = CF_AMBCTL1VAL;
 
                for (i = 0; i < 0x1000; i++)
-                       asm ("nop;");
+                       asm("nop;");
                for (i = 0; i < 0x1000; i++)
-                       asm ("nop;");
+                       asm("nop;");
                for (i = 0; i < 0x1000; i++)
-                       asm ("nop;");
+                       asm("nop;");
 
-               serial_setbrg ();
-               ide_init ();
+               serial_setbrg();
+               ide_init();
 
-               setenv ("bootargs", "");
-               setenv ("bootcmd",
-                       "fatload ide 0:1 0x1000000 uImage-stamp;bootm 0x1000000;bootm 0x20100000");
+               setenv("bootargs", "");
+               setenv("bootcmd",
+                      "fatload ide 0:1 0x1000000 uImage-stamp;bootm 0x1000000;bootm 0x20100000");
        } else {
-               printf ("Booting from FLASH\n");
+               printf("Booting from FLASH\n");
        }
 
-       return 1;
+       return 0;
 }
 #endif
 
 #ifdef CONFIG_STAMP_CF
 
-void cf_outb (unsigned char val, volatile unsigned char *addr)
+void cf_outb(unsigned char val, volatile unsigned char *addr)
 {
        /*
         * Set PF1 PF0 respectively to 0 1 to divert address
@@ -153,70 +154,70 @@ void cf_outb (unsigned char val, volatile unsigned char *addr)
         */
        *pFIO_FLAG_S = CF_PF0;
        *pFIO_FLAG_C = CF_PF1;
-       asm ("ssync;");
+       sync();
 
        *(addr) = val;
-       asm ("ssync;");
+       sync();
 
        /* Setback PF1 PF0 to 0 0 to address external
         * memory banks  */
-       *(volatile unsigned short *) pFIO_FLAG_C = CF_PF1_PF0;
-       asm ("ssync;");
+       *(volatile unsigned short *)pFIO_FLAG_C = CF_PF1_PF0;
+       sync();
 }
 
-unsigned char cf_inb (volatile unsigned char *addr)
+unsigned char cf_inb(volatile unsigned char *addr)
 {
        volatile unsigned char c;
 
        *pFIO_FLAG_S = CF_PF0;
        *pFIO_FLAG_C = CF_PF1;
-       asm ("ssync;");
+       sync();
 
        c = *(addr);
-       asm ("ssync;");
+       sync();
 
        *pFIO_FLAG_C = CF_PF1_PF0;
-       asm ("ssync;");
+       sync();
 
        return c;
 }
 
-void cf_insw (unsigned short *sect_buf, unsigned short *addr, int words)
+void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words)
 {
        int i;
 
        *pFIO_FLAG_S = CF_PF0;
        *pFIO_FLAG_C = CF_PF1;
-       asm ("ssync;");
+       sync();
 
        for (i = 0; i < words; i++) {
                *(sect_buf + i) = *(addr);
-               asm ("ssync;");
+               sync();
        }
 
        *pFIO_FLAG_C = CF_PF1_PF0;
-       asm ("ssync;");
+       sync();
 }
 
-void cf_outsw (unsigned short *addr, unsigned short *sect_buf, int words)
+void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words)
 {
        int i;
 
        *pFIO_FLAG_S = CF_PF0;
        *pFIO_FLAG_C = CF_PF1;
-       asm ("ssync;");
+       sync();
 
        for (i = 0; i < words; i++) {
                *(addr) = *(sect_buf + i);
-               asm ("ssync;");
+               sync();
        }
 
        *pFIO_FLAG_C = CF_PF1_PF0;
-       asm ("ssync;");
+       sync();
 }
 #endif
 
-void stamp_led_set (int LED1, int LED2, int LED3)
+void stamp_led_set(int LED1, int LED2, int LED3)
 {
        *pFIO_INEN &= ~(PF2 | PF3 | PF4);
        *pFIO_DIR |= (PF2 | PF3 | PF4);
@@ -233,31 +234,31 @@ void stamp_led_set (int LED1, int LED2, int LED3)
                *pFIO_FLAG_S = PF4;
        else
                *pFIO_FLAG_C = PF4;
-       asm ("ssync;");
+       sync();
 }
 
-void show_boot_progress (int status)
+void show_boot_progress(int status)
 {
        switch (status) {
        case 1:
-               stamp_led_set (STATUS_LED_OFF, STATUS_LED_OFF, STATUS_LED_ON);
+               stamp_led_set(STATUS_LED_OFF, STATUS_LED_OFF, STATUS_LED_ON);
                break;
        case 2:
-               stamp_led_set (STATUS_LED_OFF, STATUS_LED_ON, STATUS_LED_OFF);
+               stamp_led_set(STATUS_LED_OFF, STATUS_LED_ON, STATUS_LED_OFF);
                break;
        case 3:
-               stamp_led_set (STATUS_LED_OFF, STATUS_LED_ON, STATUS_LED_ON);
+               stamp_led_set(STATUS_LED_OFF, STATUS_LED_ON, STATUS_LED_ON);
                break;
        case 4:
-               stamp_led_set (STATUS_LED_ON, STATUS_LED_OFF, STATUS_LED_OFF);
+               stamp_led_set(STATUS_LED_ON, STATUS_LED_OFF, STATUS_LED_OFF);
                break;
        case 5:
        case 6:
-               stamp_led_set (STATUS_LED_ON, STATUS_LED_OFF, STATUS_LED_ON);
+               stamp_led_set(STATUS_LED_ON, STATUS_LED_OFF, STATUS_LED_ON);
                break;
        case 7:
        case 8:
-               stamp_led_set (STATUS_LED_ON, STATUS_LED_ON, STATUS_LED_OFF);
+               stamp_led_set(STATUS_LED_ON, STATUS_LED_ON, STATUS_LED_OFF);
                break;
        case 9:
        case 10:
@@ -266,11 +267,10 @@ void show_boot_progress (int status)
        case 13:
        case 14:
        case 15:
-               stamp_led_set (STATUS_LED_OFF, STATUS_LED_OFF,
-                              STATUS_LED_OFF);
+               stamp_led_set(STATUS_LED_OFF, STATUS_LED_OFF, STATUS_LED_OFF);
                break;
        default:
-               stamp_led_set (STATUS_LED_ON, STATUS_LED_ON, STATUS_LED_ON);
+               stamp_led_set(STATUS_LED_ON, STATUS_LED_ON, STATUS_LED_ON);
                break;
        }
 }
similarity index 89%
rename from board/stamp/stamp.h
rename to board/bf533-stamp/bf533-stamp.h
index 7bc33b41476c0828121c5af4ea0a48a7a228f3bc..1e58e47546d759c13c8fa2e41240950d2820bca0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - stamp.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __STAMP_H__
@@ -36,7 +36,6 @@ extern volatile unsigned long *amgctl;
 
 extern unsigned long pll_div_fact;
 extern void serial_setbrg(void);
-extern void pll_set(int vco, int crystal_frq, int pll_div);
 
 /* Definitions used in  Compact Flash Boot support */
 #define FIO_EDGE_CF_BITS       0x0000
diff --git a/board/bf533-stamp/config.mk b/board/bf533-stamp/config.mk
new file mode 100644 (file)
index 0000000..113438b
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# TEXT_BASE should be defined as the MAX_SDRAM Address - 256k bytes
+#  256k is defined as CFG_MONITOR_LEN in ./include/configs/<board>.h
+TEXT_BASE = 0x07FC0000
diff --git a/board/bf533-stamp/spi.c b/board/bf533-stamp/spi.c
new file mode 100644 (file)
index 0000000..d30750f
--- /dev/null
@@ -0,0 +1,473 @@
+/****************************************************************************
+ *  SPI flash driver for M25P64
+ ****************************************************************************/
+#include <common.h>
+#include <linux/ctype.h>
+#include <asm/io.h>
+
+#if defined(CONFIG_SPI)
+
+ /*Application definitions */
+
+#define        NUM_SECTORS     128     /* number of sectors */
+#define SECTOR_SIZE            0x10000
+#define NOP_NUM                1000
+
+#define COMMON_SPI_SETTINGS (SPE|MSTR|CPHA|CPOL)       /*Settings to the SPI_CTL */
+#define TIMOD01 (0x01)         /*stes the SPI to work with core instructions */
+
+ /*Flash commands */
+#define SPI_WREN       (0x06)  /*Set Write Enable Latch */
+#define SPI_WRDI       (0x04)  /*Reset Write Enable Latch */
+#define SPI_RDSR       (0x05)  /*Read Status Register */
+#define SPI_WRSR       (0x01)  /*Write Status Register */
+#define SPI_READ       (0x03)  /*Read data from memory */
+#define SPI_PP         (0x02)  /*Program Data into memory */
+#define SPI_SE         (0xD8)  /*Erase one sector in memory */
+#define SPI_BE         (0xC7)  /*Erase all memory */
+#define WIP            (0x1)   /*Check the write in progress bit of the SPI status register */
+#define WEL            (0x2)   /*Check the write enable bit of the SPI status register */
+
+#define TIMEOUT 350000000
+
+typedef enum {
+       NO_ERR,
+       POLL_TIMEOUT,
+       INVALID_SECTOR,
+       INVALID_BLOCK,
+} ERROR_CODE;
+
+void spi_init_f(void);
+void spi_init_r(void);
+ssize_t spi_read(uchar *, int, uchar *, int);
+ssize_t spi_write(uchar *, int, uchar *, int);
+
+char ReadStatusRegister(void);
+void Wait_For_SPIF(void);
+void SetupSPI(const int spi_setting);
+void SPI_OFF(void);
+void SendSingleCommand(const int iCommand);
+
+ERROR_CODE GetSectorNumber(unsigned long ulOffset, int *pnSector);
+ERROR_CODE EraseBlock(int nBlock);
+ERROR_CODE ReadData(unsigned long ulStart, long lCount, int *pnData);
+ERROR_CODE WriteData(unsigned long ulStart, long lCount, int *pnData);
+ERROR_CODE Wait_For_Status(char Statusbit);
+ERROR_CODE Wait_For_WEL(void);
+
+/* -------------------
+ * Variables
+ * ------------------- */
+
+/* **************************************************************************
+ *
+ *  Function:    spi_init_f
+ *
+ *  Description: Init SPI-Controller (ROM part)
+ *
+ *  return:      ---
+ *
+ * *********************************************************************** */
+void spi_init_f(void)
+{
+}
+
+/* **************************************************************************
+ *
+ *  Function:    spi_init_r
+ *
+ *  Description: Init SPI-Controller (RAM part) -
+ *              The malloc engine is ready and we can move our buffers to
+ *              normal RAM
+ *
+ *  return:      ---
+ *
+ * *********************************************************************** */
+void spi_init_r(void)
+{
+       return;
+}
+
+/****************************************************************************
+ *  Function:    spi_write
+ **************************************************************************** */
+ssize_t spi_write(uchar * addr, int alen, uchar * buffer, int len)
+{
+       unsigned long offset;
+       int start_block, end_block;
+       int start_byte, end_byte;
+       ERROR_CODE result = NO_ERR;
+       uchar temp[SECTOR_SIZE];
+       int i, num;
+
+       offset = addr[0] << 16 | addr[1] << 8 | addr[2];
+       /* Get the start block number */
+       result = GetSectorNumber(offset, &start_block);
+       if (result == INVALID_SECTOR) {
+               printf("Invalid sector! ");
+               return 0;
+       }
+       /* Get the end block number */
+       result = GetSectorNumber(offset + len - 1, &end_block);
+       if (result == INVALID_SECTOR) {
+               printf("Invalid sector! ");
+               return 0;
+       }
+
+       for (num = start_block; num <= end_block; num++) {
+               ReadData(num * SECTOR_SIZE, SECTOR_SIZE, (int *)temp);
+               start_byte = num * SECTOR_SIZE;
+               end_byte = (num + 1) * SECTOR_SIZE - 1;
+               if (start_byte < offset)
+                       start_byte = offset;
+               if (end_byte > (offset + len))
+                       end_byte = (offset + len - 1);
+               for (i = start_byte; i <= end_byte; i++)
+                       temp[i - num * SECTOR_SIZE] = buffer[i - offset];
+               EraseBlock(num);
+               result = WriteData(num * SECTOR_SIZE, SECTOR_SIZE, (int *)temp);
+               if (result != NO_ERR)
+                       return 0;
+               printf(".");
+       }
+       return len;
+}
+
+/****************************************************************************
+ *  Function:    spi_read
+ **************************************************************************** */
+ssize_t spi_read(uchar * addr, int alen, uchar * buffer, int len)
+{
+       unsigned long offset;
+       offset = addr[0] << 16 | addr[1] << 8 | addr[2];
+       ReadData(offset, len, (int *)buffer);
+       return len;
+}
+
+void SendSingleCommand(const int iCommand)
+{
+       unsigned short dummy;
+
+       /*turns on the SPI in single write mode */
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+       /*sends the actual command to the SPI TX register */
+       *pSPI_TDBR = iCommand;
+       sync();
+
+       /*The SPI status register will be polled to check the SPIF bit */
+       Wait_For_SPIF();
+
+       dummy = *pSPI_RDBR;
+
+       /*The SPI will be turned off */
+       SPI_OFF();
+
+}
+
+void SetupSPI(const int spi_setting)
+{
+
+       if (icache_status() || dcache_status())
+               udelay(CONFIG_CCLK_HZ / 50000000);
+       /*sets up the PF2 to be the slave select of the SPI */
+       *pSPI_FLG = 0xFB04;
+       *pSPI_BAUD = CONFIG_SPI_BAUD;
+       *pSPI_CTL = spi_setting;
+       sync();
+}
+
+void SPI_OFF(void)
+{
+
+       *pSPI_CTL = 0x0400;     /* disable SPI */
+       *pSPI_FLG = 0;
+       *pSPI_BAUD = 0;
+       sync();
+       udelay(CONFIG_CCLK_HZ / 50000000);
+
+}
+
+void Wait_For_SPIF(void)
+{
+       unsigned short dummyread;
+       while ((*pSPI_STAT & TXS)) ;
+       while (!(*pSPI_STAT & SPIF)) ;
+       while (!(*pSPI_STAT & RXS)) ;
+       dummyread = *pSPI_RDBR; /* Read dummy to empty the receive register      */
+
+}
+
+ERROR_CODE Wait_For_WEL(void)
+{
+       int i;
+       char status_register = 0;
+       ERROR_CODE ErrorCode = NO_ERR;  /* tells us if there was an error erasing flash */
+
+       for (i = 0; i < TIMEOUT; i++) {
+               status_register = ReadStatusRegister();
+               if ((status_register & WEL)) {
+                       ErrorCode = NO_ERR;     /* tells us if there was an error erasing flash */
+                       break;
+               }
+               ErrorCode = POLL_TIMEOUT;       /* Time out error */
+       };
+
+       return ErrorCode;
+}
+
+ERROR_CODE Wait_For_Status(char Statusbit)
+{
+       int i;
+       char status_register = 0xFF;
+       ERROR_CODE ErrorCode = NO_ERR;  /* tells us if there was an error erasing flash */
+
+       for (i = 0; i < TIMEOUT; i++) {
+               status_register = ReadStatusRegister();
+               if (!(status_register & Statusbit)) {
+                       ErrorCode = NO_ERR;     /* tells us if there was an error erasing flash */
+                       break;
+               }
+               ErrorCode = POLL_TIMEOUT;       /* Time out error */
+       };
+
+       return ErrorCode;
+}
+
+char ReadStatusRegister(void)
+{
+       char status_register = 0;
+
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));      /* Turn on the SPI */
+
+       *pSPI_TDBR = SPI_RDSR;  /* send instruction to read status register */
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       *pSPI_TDBR = 0;         /*send dummy to receive the status register */
+       sync();
+       Wait_For_SPIF();        /*wait until the data has been sent */
+       status_register = *pSPI_RDBR;   /*read the status register */
+
+       SPI_OFF();              /* Turn off the SPI */
+
+       return status_register;
+}
+
+ERROR_CODE GetSectorNumber(unsigned long ulOffset, int *pnSector)
+{
+       int nSector = 0;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       if (ulOffset > (NUM_SECTORS * 0x10000 - 1)) {
+               ErrorCode = INVALID_SECTOR;
+               return ErrorCode;
+       }
+
+       nSector = (int)ulOffset / 0x10000;
+       *pnSector = nSector;
+
+       /* ok */
+       return ErrorCode;
+}
+
+ERROR_CODE EraseBlock(int nBlock)
+{
+       unsigned long ulSectorOff = 0x0, ShiftValue;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       /* if the block is invalid just return */
+       if ((nBlock < 0) || (nBlock > NUM_SECTORS)) {
+               ErrorCode = INVALID_BLOCK;      /* tells us if there was an error erasing flash */
+               return ErrorCode;
+       }
+       /* figure out the offset of the block in flash */
+       if ((nBlock >= 0) && (nBlock < NUM_SECTORS)) {
+               ulSectorOff = (nBlock * SECTOR_SIZE);
+
+       } else {
+               ErrorCode = INVALID_BLOCK;      /* tells us if there was an error erasing flash */
+               return ErrorCode;
+       }
+
+       /* A write enable instruction must previously have been executed */
+       SendSingleCommand(SPI_WREN);
+
+       /*The status register will be polled to check the write enable latch "WREN" */
+       ErrorCode = Wait_For_WEL();
+
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Erase block error\n");
+               return ErrorCode;
+       } else
+               /*Turn on the SPI to send single commands */
+               SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+       /* Send the erase block command to the flash followed by the 24 address  */
+       /* to point to the start of a sector. */
+       *pSPI_TDBR = SPI_SE;
+       sync();
+       Wait_For_SPIF();
+       ShiftValue = (ulSectorOff >> 16);       /* Send the highest byte of the 24 bit address at first */
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+       ShiftValue = (ulSectorOff >> 8);        /* Send the middle byte of the 24 bit address  at second */
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+       *pSPI_TDBR = ulSectorOff;       /* Send the lowest byte of the 24 bit address finally */
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+
+       /*Turns off the SPI */
+       SPI_OFF();
+
+       /* Poll the status register to check the Write in Progress bit */
+       /* Sector erase takes time */
+       ErrorCode = Wait_For_Status(WIP);
+
+       /* block erase should be complete */
+       return ErrorCode;
+}
+
+/*****************************************************************************
+* ERROR_CODE ReadData()
+*
+* Read a value from flash for verify purpose
+*
+* Inputs:      unsigned long ulStart - holds the SPI start address
+*                      int pnData - pointer to store value read from flash
+*                      long lCount - number of elements to read
+***************************************************************************** */
+ERROR_CODE ReadData(unsigned long ulStart, long lCount, int *pnData)
+{
+       unsigned long ShiftValue;
+       char *cnData;
+       int i;
+
+       cnData = (char *)pnData;        /* Pointer cast to be able to increment byte wise */
+
+       /* Start SPI interface   */
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+       *pSPI_TDBR = SPI_READ;  /* Send the read command to SPI device */
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+       ShiftValue = (ulStart >> 16);   /* Send the highest byte of the 24 bit address at first */
+       *pSPI_TDBR = ShiftValue;        /* Send the byte to the SPI device */
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+       ShiftValue = (ulStart >> 8);    /* Send the middle byte of the 24 bit address  at second */
+       *pSPI_TDBR = ShiftValue;        /* Send the byte to the SPI device */
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+       *pSPI_TDBR = ulStart;   /* Send the lowest byte of the 24 bit address finally */
+       sync();
+       Wait_For_SPIF();        /* Wait until the instruction has been sent */
+
+       /* After the SPI device address has been placed on the MOSI pin the data can be */
+       /* received on the MISO pin. */
+       for (i = 0; i < lCount; i++) {
+               *pSPI_TDBR = 0; /*send dummy */
+               sync();
+               while (!(*pSPI_STAT & RXS)) ;
+               *cnData++ = *pSPI_RDBR; /*read  */
+
+               if ((i >= SECTOR_SIZE) && (i % SECTOR_SIZE == 0))
+                       printf(".");
+       }
+
+       SPI_OFF();              /* Turn off the SPI */
+
+       return NO_ERR;
+}
+
+ERROR_CODE WriteFlash(unsigned long ulStartAddr, long lTransferCount,
+                     int *iDataSource, long *lWriteCount)
+{
+
+       unsigned long ulWAddr;
+       long lWTransferCount = 0;
+       int i;
+       char iData;
+       char *temp = (char *)iDataSource;
+       ERROR_CODE ErrorCode = NO_ERR;  /* tells us if there was an error erasing flash */
+
+       /* First, a Write Enable Command must be sent to the SPI. */
+       SendSingleCommand(SPI_WREN);
+
+       /* Second, the SPI Status Register will be tested whether the  */
+       /*         Write Enable Bit has been set.  */
+       ErrorCode = Wait_For_WEL();
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Write Time Out\n");
+               return ErrorCode;
+       } else
+               /* Third, the 24 bit address will be shifted out the SPI MOSI bytewise. */
+               SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));      /* Turns the SPI on */
+       *pSPI_TDBR = SPI_PP;
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       ulWAddr = (ulStartAddr >> 16);
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       ulWAddr = (ulStartAddr >> 8);
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       ulWAddr = ulStartAddr;
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       /* Fourth, maximum number of 256 bytes will be taken from the Buffer */
+       /* and sent to the SPI device. */
+       for (i = 0; (i < lTransferCount) && (i < 256); i++, lWTransferCount++) {
+               iData = *temp;
+               *pSPI_TDBR = iData;
+               sync();
+               Wait_For_SPIF();        /*wait until the instruction has been sent */
+               temp++;
+       }
+
+       SPI_OFF();              /* Turns the SPI off */
+
+       /* Sixth, the SPI Write in Progress Bit must be toggled to ensure the  */
+       /* programming is done before start of next transfer. */
+       ErrorCode = Wait_For_Status(WIP);
+
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Program Time out!\n");
+               return ErrorCode;
+       } else
+
+               *lWriteCount = lWTransferCount;
+
+       return ErrorCode;
+}
+
+ERROR_CODE WriteData(unsigned long ulStart, long lCount, int *pnData)
+{
+
+       unsigned long ulWStart = ulStart;
+       long lWCount = lCount, lWriteCount;
+       long *pnWriteCount = &lWriteCount;
+
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       while (lWCount != 0) {
+               ErrorCode = WriteFlash(ulWStart, lWCount, pnData, pnWriteCount);
+
+               /* After each function call of WriteFlash the counter must be adjusted */
+               lWCount -= *pnWriteCount;
+
+               /* Also, both address pointers must be recalculated. */
+               ulWStart += *pnWriteCount;
+               pnData += *pnWriteCount / 4;
+       }
+
+       /* return the appropriate error code */
+       return ErrorCode;
+}
+
+#endif                         /* CONFIG_SPI */
similarity index 91%
rename from board/stamp/u-boot.lds
rename to board/bf533-stamp/u-boot.lds.S
index 9a22e507817831436fada683c800324c2643eb5d..03ef72b6090892f742ae619892c9f5b7193bdae6 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * U-boot - u-boot.lds
+ * U-boot - u-boot.lds.S
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Device Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -25,6 +25,8 @@
  * MA 02111-1307 USA
  */
 
+#include <config.h>
+
 OUTPUT_ARCH(bfin)
 SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
 /* Do we need any of these for elf?
@@ -55,6 +57,7 @@ SECTIONS
   .rela.plt      : { *(.rela.plt)      }
   .init          : { *(.init)          }
   .plt : { *(.plt) }
+  . = CFG_MONITOR_BASE;
   .text      :
   {
     /* WARNING - the following is hand-optimized to fit within */
@@ -68,9 +71,11 @@ SECTIONS
     cpu/bf533/interrupt.o      (.text)
     cpu/bf533/serial.o         (.text)
     common/dlmalloc.o          (.text)
-    lib_generic/vsprintf.o     (.text)
+/*  lib_blackfin/bf533_string.o        (.text) */
+/*  lib_generic/vsprintf.o     (.text) */
     lib_generic/crc32.o                (.text)
-    lib_generic/zlib.o         (.text)
+/*  lib_generic/zlib.o         (.text) */
+/*  board/stamp/stamp.o                (.text) */
 
     . = DEFINED(env_offset) ? env_offset : .;
     common/environment.o       (.text)
@@ -118,9 +123,9 @@ SECTIONS
   _edata  =  .;
   PROVIDE (edata = .);
 
-  __u_boot_cmd_start = .;
+  ___u_boot_cmd_start = .;
   .u_boot_cmd : { *(.u_boot_cmd) }
-  __u_boot_cmd_end = .;
+  ___u_boot_cmd_end = .;
 
 
   __start___ex_table = .;
diff --git a/board/bf537-stamp/Makefile b/board/bf537-stamp/Makefile
new file mode 100644 (file)
index 0000000..e488844
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Device Inc.
+#
+# (C) Copyright 2000-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 flash.o ether_bf537.o post-memory.o stm_m25p64.o cmd_bf537led.o nand.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS) u-boot.lds
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+u-boot.lds: u-boot.lds.S
+       $(CPP) $(CPPFLAGS) -P -Ubfin $^ > $@.tmp
+       mv -f $@.tmp $@
+
+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/bf537-stamp/bf537-stamp.c b/board/bf537-stamp/bf537-stamp.c
new file mode 100644 (file)
index 0000000..47f7c9e
--- /dev/null
@@ -0,0 +1,437 @@
+/*
+ * U-boot - BF537.c
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <config.h>
+#include <command.h>
+#include <asm/blackfin.h>
+#include <asm/io.h>
+#include "ether_bf537.h"
+
+#define POST_WORD_ADDR 0xFF903FFC
+
+/*
+ * the bootldr command loads an address, checks to see if there
+ *   is a Boot stream that the on-chip BOOTROM can understand,
+ *   and loads it via the BOOTROM Callback. It is possible
+ *   to also add booting from SPI, or TWI, but this function does
+ *   not currently support that.
+ */
+int do_bootldr(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       ulong addr, entry;
+       ulong *data;
+
+       /* Get the address */
+       if (argc < 2) {
+               addr = load_addr;
+       } else {
+               addr = simple_strtoul(argv[1], NULL, 16);
+       }
+
+       /* Check if it is a LDR file */
+       data = (ulong *) addr;
+       if (*data == 0xFF800060 || *data == 0xFF800040 || *data == 0xFF800020) {
+               /* We want to boot from FLASH or SDRAM */
+               entry = _BOOTROM_BOOT_DXE_FLASH;
+               printf("## Booting ldr image at 0x%08lx ...\n", addr);
+               if (icache_status())
+                       icache_disable();
+               if (dcache_status())
+                       dcache_disable();
+
+             __asm__("R7=%[a];\n" "P0=%[b];\n" "JUMP (P0);\n":
+             :[a] "d"(addr),[b] "a"(entry)
+             :"R7", "P0");
+
+       } else {
+               printf("## No ldr image at address 0x%08lx\n", addr);
+       }
+
+       return 0;
+}
+
+U_BOOT_CMD(bootldr, 2, 0, do_bootldr,
+          "bootldr - boot ldr image from memory\n",
+          "[addr]\n         - boot ldr image stored in memory\n");
+
+int checkboard(void)
+{
+#if (BFIN_CPU == ADSP_BF534)
+       printf("CPU:   ADSP BF534 Rev.: 0.%d\n", *pCHIPID >> 28);
+#elif (BFIN_CPU == ADSP_BF536)
+       printf("CPU:   ADSP BF536 Rev.: 0.%d\n", *pCHIPID >> 28);
+#else
+       printf("CPU:   ADSP BF537 Rev.: 0.%d\n", *pCHIPID >> 28);
+#endif
+       printf("Board: ADI BF537 stamp board\n");
+       printf("       Support: http://blackfin.uclinux.org/\n");
+       return 0;
+}
+
+#if defined(CONFIG_BFIN_IDE)
+
+void cf_outb(unsigned char val, volatile unsigned char *addr)
+{
+       *(addr) = val;
+       sync();
+}
+
+unsigned char cf_inb(volatile unsigned char *addr)
+{
+       volatile unsigned char c;
+
+       c = *(addr);
+       sync();
+
+       return c;
+}
+
+void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words)
+{
+       int i;
+
+       for (i = 0; i < words; i++)
+               *(sect_buf + i) = *(addr);
+       sync();
+}
+
+void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words)
+{
+       int i;
+
+       for (i = 0; i < words; i++)
+               *(addr) = *(sect_buf + i);
+       sync();
+}
+#endif                         /* CONFIG_BFIN_IDE */
+
+long int initdram(int board_type)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+#ifdef DEBUG
+       int brate;
+       char *tmp = getenv("baudrate");
+       brate = simple_strtoul(tmp, NULL, 16);
+       printf("Serial Port initialized with Baud rate = %x\n", brate);
+       printf("SDRAM attributes:\n");
+       printf("tRCD %d SCLK Cycles,tRP %d SCLK Cycles,tRAS %d SCLK Cycles"
+              "tWR %d SCLK Cycles,CAS Latency %d SCLK cycles \n",
+              3, 3, 6, 2, 3);
+       printf("SDRAM Begin: 0x%x\n", CFG_SDRAM_BASE);
+       printf("Bank size = %d MB\n", CFG_MAX_RAM_SIZE >> 20);
+#endif
+       gd->bd->bi_memstart = CFG_SDRAM_BASE;
+       gd->bd->bi_memsize = CFG_MAX_RAM_SIZE;
+       return CFG_MAX_RAM_SIZE;
+}
+
+#if defined(CONFIG_MISC_INIT_R)
+/* miscellaneous platform dependent initialisations */
+int misc_init_r(void)
+{
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT)
+       char nid[32];
+       unsigned char *pMACaddr = (unsigned char *)0x203F0000;
+       u8 SrcAddr[6] = { 0x02, 0x80, 0xAD, 0x20, 0x31, 0xB8 };
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+       /* The 0xFF check here is to make sure we don't use the address
+        * in flash if it's simply been erased (aka all 0xFF values) */
+       if (getenv("ethaddr") == NULL && is_valid_ether_addr(pMACaddr)) {
+               sprintf(nid, "%02x:%02x:%02x:%02x:%02x:%02x",
+                       pMACaddr[0], pMACaddr[1],
+                       pMACaddr[2], pMACaddr[3], pMACaddr[4], pMACaddr[5]);
+               setenv("ethaddr", nid);
+       }
+       if (getenv("ethaddr")) {
+               SetupMacAddr(SrcAddr);
+       }
+#endif                         /* CONFIG_COMMANDS & CFG_CMD_NET */
+#endif                         /* BFIN_BOOT_MODE == BF537_BYPASS_BOOT */
+
+#if defined(CONFIG_BFIN_IDE)
+#if defined(CONFIG_BFIN_TRUE_IDE)
+       /* Enable ATASEL when in True IDE mode */
+       printf("Using CF True IDE Mode\n");
+       cf_outb(0, (unsigned char *)CONFIG_CF_ATASEL_ENA);
+       udelay(1000);
+#elif defined(CONFIG_BFIN_CF_IDE)
+       /* Disable ATASEL when we're in Common Memory Mode */
+       printf("Using CF Common Memory Mode\n");
+       cf_outb(0, (unsigned char *)CONFIG_CF_ATASEL_DIS);
+       udelay(1000);
+#elif defined(CONFIG_BFIN_HDD_IDE)
+       printf("Using HDD IDE Mode\n");
+#endif
+       ide_init();
+#endif                         /* CONFIG_BFIN_IDE */
+       return 0;
+}
+#endif                         /* CONFIG_MISC_INIT_R */
+
+#ifdef CONFIG_POST
+#if (BFIN_BOOT_MODE != BF537_BYPASS_BOOT)
+/* Using sw10-PF5 as the hotkey */
+int post_hotkeys_pressed(void)
+{
+       return 0;
+}
+#else
+/* Using sw10-PF5 as the hotkey */
+int post_hotkeys_pressed(void)
+{
+       int delay = 3;
+       int i;
+       unsigned short value;
+
+       *pPORTF_FER &= ~PF5;
+       *pPORTFIO_DIR &= ~PF5;
+       *pPORTFIO_INEN |= PF5;
+
+       printf("########Press SW10 to enter Memory POST########: %2d ", delay);
+       while (delay--) {
+               for (i = 0; i < 100; i++) {
+                       value = *pPORTFIO & PF5;
+                       if (value != 0) {
+                               break;
+                       }
+                       udelay(10000);
+               }
+               printf("\b\b\b%2d ", delay);
+       }
+       printf("\b\b\b 0");
+       printf("\n");
+       if (value == 0)
+               return 0;
+       else {
+               printf("Hotkey has been pressed, Enter POST . . . . . .\n");
+               return 1;
+       }
+}
+#endif
+#endif
+
+#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
+void post_word_store(ulong a)
+{
+       volatile ulong *save_addr = (volatile ulong *)POST_WORD_ADDR;
+       *save_addr = a;
+}
+
+ulong post_word_load(void)
+{
+       volatile ulong *save_addr = (volatile ulong *)POST_WORD_ADDR;
+       return *save_addr;
+}
+#endif
+
+#ifdef CONFIG_POST
+int uart_post_test(int flags)
+{
+       return 0;
+}
+
+#define BLOCK_SIZE 0x10000
+#define VERIFY_ADDR 0x2000000
+extern int erase_block_flash(int);
+extern int write_data(long lStart, long lCount, uchar * pnData);
+int flash_post_test(int flags)
+{
+       unsigned short *pbuf, *temp;
+       int offset, n, i;
+       int value = 0;
+       int result = 0;
+       printf("\n");
+       pbuf = (unsigned short *)VERIFY_ADDR;
+       temp = pbuf;
+       for (n = FLASH_START_POST_BLOCK; n < FLASH_END_POST_BLOCK; n++) {
+               offset = (n - 7) * BLOCK_SIZE;
+               printf("--------Erase   block:%2d..", n);
+               erase_block_flash(n);
+               printf("OK\r");
+               printf("--------Program block:%2d...", n);
+               write_data(CFG_FLASH_BASE + offset, BLOCK_SIZE, pbuf);
+               printf("OK\r");
+               printf("--------Verify  block:%2d...", n);
+               for (i = 0; i < BLOCK_SIZE; i += 2) {
+                       if (*(unsigned short *)(CFG_FLASH_BASE + offset + i) !=
+                           *temp++) {
+                               value = 1;
+                               result = 1;
+                       }
+               }
+               if (value)
+                       printf("failed\n");
+               else
+                       printf("OK              %3d%%\r",
+                              (int)(
+                                    (n + 1 -
+                                     FLASH_START_POST_BLOCK) *
+                                    100 / (FLASH_END_POST_BLOCK -
+                                           FLASH_START_POST_BLOCK)));
+
+               temp = pbuf;
+               value = 0;
+       }
+       printf("\n");
+       if (result)
+               return -1;
+       else
+               return 0;
+}
+
+/****************************************************
+ * LED1 ---- PF6       LED2 ---- PF7               *
+ * LED3 ---- PF8       LED4 ---- PF9               *
+ * LED5 ---- PF10      LED6 ---- PF11              *
+ ****************************************************/
+int led_post_test(int flags)
+{
+       *pPORTF_FER &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11);
+       *pPORTFIO_DIR |= PF6 | PF7 | PF8 | PF9 | PF10 | PF11;
+       *pPORTFIO_INEN &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11);
+       *pPORTFIO &= ~(PF6 | PF7 | PF8 | PF9 | PF10 | PF11);
+       udelay(1000000);
+       printf("LED1 on");
+       *pPORTFIO |= PF6;
+       udelay(1000000);
+       printf("\b\b\b\b\b\b\b");
+       printf("LED2 on");
+       *pPORTFIO |= PF7;
+       udelay(1000000);
+       printf("\b\b\b\b\b\b\b");
+       printf("LED3 on");
+       *pPORTFIO |= PF8;
+       udelay(1000000);
+       printf("\b\b\b\b\b\b\b");
+       printf("LED4 on");
+       *pPORTFIO |= PF9;
+       udelay(1000000);
+       printf("\b\b\b\b\b\b\b");
+       printf("LED5 on");
+       *pPORTFIO |= PF10;
+       udelay(1000000);
+       printf("\b\b\b\b\b\b\b");
+       printf("lED6 on");
+       *pPORTFIO |= PF11;
+       printf("\b\b\b\b\b\b\b ");
+       return 0;
+}
+
+/************************************************
+ *  SW10 ---- PF5      SW11 ---- PF4           *
+ *  SW12 ---- PF3      SW13 ---- PF2           *
+ ************************************************/
+int button_post_test(int flags)
+{
+       int i, delay = 5;
+       unsigned short value = 0;
+       int result = 0;
+
+       *pPORTF_FER &= ~(PF5 | PF4 | PF3 | PF2);
+       *pPORTFIO_DIR &= ~(PF5 | PF4 | PF3 | PF2);
+       *pPORTFIO_INEN |= (PF5 | PF4 | PF3 | PF2);
+
+       printf("\n--------Press SW10: %2d ", delay);
+       while (delay--) {
+               for (i = 0; i < 100; i++) {
+                       value = *pPORTFIO & PF5;
+                       if (value != 0) {
+                               break;
+                       }
+                       udelay(10000);
+               }
+               printf("\b\b\b%2d ", delay);
+       }
+       if (value != 0)
+               printf("\b\bOK");
+       else {
+               result = -1;
+               printf("\b\bfailed");
+       }
+
+       delay = 5;
+       printf("\n--------Press SW11: %2d ", delay);
+       while (delay--) {
+               for (i = 0; i < 100; i++) {
+                       value = *pPORTFIO & PF4;
+                       if (value != 0) {
+                               break;
+                       }
+                       udelay(10000);
+               }
+               printf("\b\b\b%2d ", delay);
+       }
+       if (value != 0)
+               printf("\b\bOK");
+       else {
+               result = -1;
+               printf("\b\bfailed");
+       }
+
+       delay = 5;
+       printf("\n--------Press SW12: %2d ", delay);
+       while (delay--) {
+               for (i = 0; i < 100; i++) {
+                       value = *pPORTFIO & PF3;
+                       if (value != 0) {
+                               break;
+                       }
+                       udelay(10000);
+               }
+               printf("\b\b\b%2d ", delay);
+       }
+       if (value != 0)
+               printf("\b\bOK");
+       else {
+               result = -1;
+               printf("\b\bfailed");
+       }
+
+       delay = 5;
+       printf("\n--------Press SW13: %2d ", delay);
+       while (delay--) {
+               for (i = 0; i < 100; i++) {
+                       value = *pPORTFIO & PF2;
+                       if (value != 0) {
+                               break;
+                       }
+                       udelay(10000);
+               }
+               printf("\b\b\b%2d ", delay);
+       }
+       if (value != 0)
+               printf("\b\bOK");
+       else {
+               result = -1;
+               printf("\b\bfailed");
+       }
+       printf("\n");
+       return result;
+}
+#endif
diff --git a/board/bf537-stamp/cmd_bf537led.c b/board/bf537-stamp/cmd_bf537led.c
new file mode 100644 (file)
index 0000000..fa650f2
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * U-boot - cmd_bf537led.c
+ *
+ * Copyright (C) 2006 Aaron Gage, Ocean Optics 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 <common.h>
+#include <config.h>
+#include <command.h>
+#include <asm/blackfin.h>
+#include <asm-blackfin/string.h>
+#ifdef CONFIG_BF537_STAMP_LEDCMD
+
+/* Define the command usage in a reusable way */
+#define USAGE_LONG \
+       "led <number> <action>\n" \
+       "    <number>  - Index (0-5) of LED to change, or \"all\"\n" \
+       "    <action>  - Must be one of:\n" \
+       "               on off toggle\n"
+
+/* Number of LEDs supported by the board */
+#define NUMBER_LEDS     6
+/* The BF537 stamp has 6 LEDs.  This mask indicates that all should be lit. */
+#define LED_ALL_MASK    0x003F
+
+void show_cmd_usage(void);
+void set_led_state(int index, int state);
+void configure_GPIO_to_output(int index);
+
+/* Map of LEDs according to their GPIO ports.  This can be rearranged or
+ * otherwise changed to account for different GPIO configurations.
+ */
+int led_ports[] = { PF6, PF7, PF8, PF9, PF10, PF11 };
+
+#define ACTION_TOGGLE   -1
+#define ACTION_OFF      0
+#define ACTION_ON       1
+
+#define LED_STATE_OFF   0
+#define LED_STATE_ON    1
+
+/* This is a trivial atoi implementation since we don't have one available */
+int atoi(char *string)
+{
+       int length;
+       int retval = 0;
+       int i;
+       int sign = 1;
+
+       length = strlen(string);
+       for (i = 0; i < length; i++) {
+               if (0 == i && string[0] == '-') {
+                       sign = -1;
+                       continue;
+               }
+               if (string[i] > '9' || string[i] < '0') {
+                       break;
+               }
+               retval *= 10;
+               retval += string[i] - '0';
+       }
+       retval *= sign;
+       return retval;
+}
+
+int do_bf537led(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       int led_mask = 0;
+       int led_current_state = 0;
+       int action = ACTION_OFF;
+       int temp;
+
+       if (3 != argc) {
+               /* Not enough arguments, so just show usage information */
+               show_cmd_usage();
+               return 1;
+       }
+
+       if (strcmp(argv[1], "all") == 0) {
+               led_mask = LED_ALL_MASK;
+       } else {
+               temp = atoi(argv[1]);
+               if (temp < 0 || temp >= NUMBER_LEDS) {
+                       printf("Invalid LED number [%s]\n", argv[1]);
+                       show_cmd_usage();
+                       return 2;
+               }
+               led_mask |= (1 << temp);
+       }
+
+       if (strcmp(argv[2], "off") == 0) {
+               action = ACTION_OFF;
+       } else if (strcmp(argv[2], "on") == 0) {
+               action = ACTION_ON;
+       } else if (strcmp(argv[2], "toggle") == 0) {
+               action = ACTION_TOGGLE;
+       } else {
+               printf("Invalid action [%s]\n", argv[2]);
+               show_cmd_usage();
+               return 3;
+       }
+
+       for (temp = 0; temp < NUMBER_LEDS; temp++) {
+               if ((led_mask & (1 << temp)) > 0) {
+                       /*
+                        * It is possible that the user has wired one of PF6-PF11 to
+                        * something other than an LED, so this will only change a pin
+                        * to output if the user has indicated a state change.  This may
+                        * happen a lot, but this way is safer than just setting all pins
+                        * to output.
+                        */
+                       configure_GPIO_to_output(temp);
+
+                       led_current_state =
+                           ((*pPORTFIO & led_ports[temp]) >
+                            0) ? LED_STATE_ON : LED_STATE_OFF;
+       /*
+               printf("LED state for index %d (%x) is %d\n", temp, led_ports[temp],
+                       led_current_state);
+               printf("*pPORTFIO is %x\n", *pPORTFIO);
+       */
+                       if (ACTION_ON == action
+                           || (ACTION_TOGGLE == action
+                               && 0 == led_current_state)) {
+                               printf("Turning LED %d on\n", temp);
+                               set_led_state(temp, LED_STATE_ON);
+                       } else {
+                               printf("Turning LED %d off\n", temp);
+                               set_led_state(temp, LED_STATE_OFF);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+/*
+ * The GPIO pins that go to the LEDs on the BF537 stamp must be configured
+ * as output.  This function simply configures them that way.  This could
+ * be done to all of the GPIO lines at once, but if a user is using a
+ * custom board, this will try to be nice and only change the GPIO lines
+ * that the user specifically names.
+ */
+void configure_GPIO_to_output(int index)
+{
+       int port;
+
+       port = led_ports[index];
+
+       /* Clear the Port F Function Enable Register */
+       *pPORTF_FER &= ~port;
+       /* Set the Port F I/O direction register */
+       *pPORTFIO_DIR |= port;
+       /* Clear the Port F I/O Input Enable Register */
+       *pPORTFIO_INEN &= ~port;
+}
+
+/* Enforce the given state on the GPIO line for the indicated LED */
+void set_led_state(int index, int state)
+{
+       int port;
+
+       port = led_ports[index];
+
+       if (LED_STATE_OFF == state) {
+               /* Clear the bit to turn off the LED */
+               *pPORTFIO &= ~port;
+       } else {
+               /* Set the bit to turn on the LED */
+               *pPORTFIO |= port;
+       }
+}
+
+/* Display usage information */
+void show_cmd_usage()
+{
+       printf("Usage:\n%s", USAGE_LONG);
+}
+
+/* Register information for u-boot to find this command */
+U_BOOT_CMD(led, 3, 1, do_bf537led,
+          "led- Control BF537 stamp LEDs\n", USAGE_LONG);
+
+#endif
diff --git a/board/bf537-stamp/config.mk b/board/bf537-stamp/config.mk
new file mode 100644 (file)
index 0000000..a623c3d
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# TEXT_BASE should be defined as the MAX_SDRAM Address - 256k bytes
+#  256k is defined as CFG_MONITOR_LEN in ./include/configs/<board>.h
+TEXT_BASE = 0x03FC0000
diff --git a/board/bf537-stamp/ether_bf537.c b/board/bf537-stamp/ether_bf537.c
new file mode 100644 (file)
index 0000000..f00837a
--- /dev/null
@@ -0,0 +1,545 @@
+/*
+ * ADI Blackfin 537 MAC Ethernet
+ *
+ * Copyright (c) 2005 Analog Device, 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 <common.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <net.h>
+#include <command.h>
+#include <malloc.h>
+#include "ether_bf537.h"
+
+#ifdef CONFIG_POST
+#include <post.h>
+#endif
+
+#undef DEBUG_ETHERNET
+
+#ifdef DEBUG_ETHERNET
+#define DEBUGF(fmt,args...) printf(fmt,##args)
+#else
+#define DEBUGF(fmt,args...)
+#endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+
+#define RXBUF_BASE_ADDR                0xFF900000
+#define TXBUF_BASE_ADDR                0xFF800000
+#define TX_BUF_CNT             1
+
+#define TOUT_LOOP              1000000
+
+ADI_ETHER_BUFFER *txbuf[TX_BUF_CNT];
+ADI_ETHER_BUFFER *rxbuf[PKTBUFSRX];
+static u16 txIdx;              /* index of the current RX buffer */
+static u16 rxIdx;              /* index of the current TX buffer */
+
+u8 SrcAddr[6];
+u16 PHYregs[NO_PHY_REGS];      /* u16 PHYADDR; */
+
+/* DMAx_CONFIG values at DMA Restart */
+const ADI_DMA_CONFIG_REG rxdmacfg = { 1, 1, 2, 0, 0, 0, 0, 5, 7 };
+
+#if 0
+       rxdmacfg.b_DMA_EN = 1;  /* enabled */
+       rxdmacfg.b_WNR    = 1;  /* write to memory */
+       rxdmacfg.b_WDSIZE = 2;  /* wordsize is 32 bits */
+       rxdmacfg.b_DMA2D  = 0;  /* N/A */
+       rxdmacfg.b_RESTART= 0;  /* N/A */
+       rxdmacfg.b_DI_SEL = 0;  /* N/A */
+       rxdmacfg.b_DI_EN  = 0;  /* no interrupt */
+       rxdmacfg.b_NDSIZE = 5;  /* 5 half words is desc size. */
+       rxdmacfg.b_FLOW   = 7;  /* large desc flow  */
+#endif
+
+const ADI_DMA_CONFIG_REG txdmacfg = { 1, 0, 2, 0, 0, 0, 0, 5, 7 };
+
+#if 0
+       txdmacfg.b_DMA_EN = 1;  /* enabled */
+       txdmacfg.b_WNR    = 0;  /* read from memory */
+       txdmacfg.b_WDSIZE = 2;  /* wordsize is 32 bits */
+       txdmacfg.b_DMA2D  = 0;  /* N/A */
+       txdmacfg.b_RESTART= 0;  /* N/A */
+       txdmacfg.b_DI_SEL = 0;  /* N/A */
+       txdmacfg.b_DI_EN  = 0;  /* no interrupt */
+       txdmacfg.b_NDSIZE = 5;  /* 5 half words is desc size. */
+       txdmacfg.b_FLOW   = 7;  /* large desc flow */
+#endif
+
+ADI_ETHER_BUFFER *SetupRxBuffer(int no);
+ADI_ETHER_BUFFER *SetupTxBuffer(int no);
+
+static int bfin_EMAC_init(struct eth_device *dev, bd_t * bd);
+static void bfin_EMAC_halt(struct eth_device *dev);
+static int bfin_EMAC_send(struct eth_device *dev, volatile void *packet,
+                         int length);
+static int bfin_EMAC_recv(struct eth_device *dev);
+
+int bfin_EMAC_initialize(bd_t * bis)
+{
+       struct eth_device *dev;
+       dev = (struct eth_device *)malloc(sizeof(*dev));
+       if (dev == NULL)
+               hang();
+
+       memset(dev, 0, sizeof(*dev));
+       sprintf(dev->name, "BF537 ETHERNET");
+
+       dev->iobase = 0;
+       dev->priv = 0;
+       dev->init = bfin_EMAC_init;
+       dev->halt = bfin_EMAC_halt;
+       dev->send = bfin_EMAC_send;
+       dev->recv = bfin_EMAC_recv;
+
+       eth_register(dev);
+
+       return 1;
+}
+
+static int bfin_EMAC_send(struct eth_device *dev, volatile void *packet,
+                         int length)
+{
+       int i;
+       int result = 0;
+       unsigned int *buf;
+       buf = (unsigned int *)packet;
+
+       if (length <= 0) {
+               printf("Ethernet: bad packet size: %d\n", length);
+               goto out;
+       }
+
+       if ((*pDMA2_IRQ_STATUS & DMA_ERR) != 0) {
+               printf("Ethernet: tx DMA error\n");
+               goto out;
+       }
+
+       for (i = 0; (*pDMA2_IRQ_STATUS & DMA_RUN) != 0; i++) {
+               if (i > TOUT_LOOP) {
+                       puts("Ethernet: tx time out\n");
+                       goto out;
+               }
+       }
+       txbuf[txIdx]->FrmData->NoBytes = length;
+       memcpy(txbuf[txIdx]->FrmData->Dest, (void *)packet, length);
+       txbuf[txIdx]->Dma[0].START_ADDR = (u32) txbuf[txIdx]->FrmData;
+       *pDMA2_NEXT_DESC_PTR = &txbuf[txIdx]->Dma[0];
+       *pDMA2_CONFIG = *(u16 *) (void *)(&txdmacfg);
+       *pEMAC_OPMODE |= TE;
+
+       for (i = 0; (txbuf[txIdx]->StatusWord & TX_COMP) == 0; i++) {
+               if (i > TOUT_LOOP) {
+                       puts("Ethernet: tx error\n");
+                       goto out;
+               }
+       }
+       result = txbuf[txIdx]->StatusWord;
+       txbuf[txIdx]->StatusWord = 0;
+       if ((txIdx + 1) >= TX_BUF_CNT)
+               txIdx = 0;
+       else
+               txIdx++;
+      out:
+       DEBUGF("BFIN EMAC send: length = %d\n", length);
+       return result;
+}
+
+static int bfin_EMAC_recv(struct eth_device *dev)
+{
+       int length = 0;
+
+       for (;;) {
+               if ((rxbuf[rxIdx]->StatusWord & RX_COMP) == 0) {
+                       length = -1;
+                       break;
+               }
+               if ((rxbuf[rxIdx]->StatusWord & RX_DMAO) != 0) {
+                       printf("Ethernet: rx dma overrun\n");
+                       break;
+               }
+               if ((rxbuf[rxIdx]->StatusWord & RX_OK) == 0) {
+                       printf("Ethernet: rx error\n");
+                       break;
+               }
+               length = rxbuf[rxIdx]->StatusWord & 0x000007FF;
+               if (length <= 4) {
+                       printf("Ethernet: bad frame\n");
+                       break;
+               }
+               NetRxPackets[rxIdx] =
+                   (volatile uchar *)(rxbuf[rxIdx]->FrmData->Dest);
+               NetReceive(NetRxPackets[rxIdx], length - 4);
+               *pDMA1_IRQ_STATUS |= DMA_DONE | DMA_ERR;
+               rxbuf[rxIdx]->StatusWord = 0x00000000;
+               if ((rxIdx + 1) >= PKTBUFSRX)
+                       rxIdx = 0;
+               else
+                       rxIdx++;
+       }
+
+       return length;
+}
+
+/**************************************************************
+ *
+ * Ethernet Initialization Routine
+ *
+ *************************************************************/
+
+static int bfin_EMAC_init(struct eth_device *dev, bd_t * bd)
+{
+       u32 opmode;
+       int dat;
+       int i;
+       DEBUGF("Eth_init: ......\n");
+
+       txIdx = 0;
+       rxIdx = 0;
+
+/* Initialize System Register */
+       if (SetupSystemRegs(&dat) < 0)
+               return -1;
+
+/* Initialize EMAC address */
+       SetupMacAddr(SrcAddr);
+
+/* Initialize TX and RX buffer */
+       for (i = 0; i < PKTBUFSRX; i++) {
+               rxbuf[i] = SetupRxBuffer(i);
+               if (i > 0) {
+                       rxbuf[i - 1]->Dma[1].NEXT_DESC_PTR =
+                           &(rxbuf[i]->Dma[0]);
+                       if (i == (PKTBUFSRX - 1))
+                               rxbuf[i]->Dma[1].NEXT_DESC_PTR =
+                                   &(rxbuf[0]->Dma[0]);
+               }
+       }
+       for (i = 0; i < TX_BUF_CNT; i++) {
+               txbuf[i] = SetupTxBuffer(i);
+               if (i > 0) {
+                       txbuf[i - 1]->Dma[1].NEXT_DESC_PTR =
+                           &(txbuf[i]->Dma[0]);
+                       if (i == (TX_BUF_CNT - 1))
+                               txbuf[i]->Dma[1].NEXT_DESC_PTR =
+                                   &(txbuf[0]->Dma[0]);
+               }
+       }
+
+       /* Set RX DMA */
+       *pDMA1_NEXT_DESC_PTR = &rxbuf[0]->Dma[0];
+       *pDMA1_CONFIG = *((u16 *) (void *)&rxbuf[0]->Dma[0].CONFIG);
+
+       /* Wait MII done */
+       PollMdcDone();
+
+       /* We enable only RX here */
+       /* ASTP   : Enable Automatic Pad Stripping
+          PR     : Promiscuous Mode for test
+          PSF    : Receive frames with total length less than 64 bytes.
+          FDMODE : Full Duplex Mode
+          LB     : Internal Loopback for test
+          RE     : Receiver Enable */
+       if (dat == FDMODE)
+               opmode = ASTP | FDMODE | PSF;
+       else
+               opmode = ASTP | PSF;
+       opmode |= RE;
+#ifdef CONFIG_BFIN_MAC_RMII
+       opmode |= TE | RMII;
+#endif
+       /* Turn on the EMAC */
+       *pEMAC_OPMODE = opmode;
+       return 0;
+}
+
+static void bfin_EMAC_halt(struct eth_device *dev)
+{
+       DEBUGF("Eth_halt: ......\n");
+       /* Turn off the EMAC */
+       *pEMAC_OPMODE = 0x00000000;
+       /* Turn off the EMAC RX DMA */
+       *pDMA1_CONFIG = 0x0000;
+       *pDMA2_CONFIG = 0x0000;
+
+}
+
+void SetupMacAddr(u8 * MACaddr)
+{
+       char *tmp, *end;
+       int i;
+       /* this depends on a little-endian machine */
+       tmp = getenv("ethaddr");
+       if (tmp) {
+               for (i = 0; i < 6; i++) {
+                       MACaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
+                       if (tmp)
+                               tmp = (*end) ? end + 1 : end;
+               }
+
+#ifndef CONFIG_NETCONSOLE
+               printf("Using MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n",
+                      MACaddr[0], MACaddr[1],
+                      MACaddr[2], MACaddr[3], MACaddr[4], MACaddr[5]);
+#endif
+               *pEMAC_ADDRLO = MACaddr[0] | MACaddr[1] << 8 |
+                   MACaddr[2] << 16 | MACaddr[3] << 24;
+               *pEMAC_ADDRHI = MACaddr[4] | MACaddr[5] << 8;
+       }
+}
+
+void PollMdcDone(void)
+{
+       /* poll the STABUSY bit */
+       while (*pEMAC_STAADD & STABUSY) ;
+}
+
+void WrPHYReg(u16 PHYAddr, u16 RegAddr, u16 Data)
+{
+       PollMdcDone();
+
+       *pEMAC_STADAT = Data;
+
+       *pEMAC_STAADD = SET_PHYAD(PHYAddr) | SET_REGAD(RegAddr) |
+           STAOP | STAIE | STABUSY;
+}
+
+/*********************************************************************************
+ *             Read an off-chip register in a PHY through the MDC/MDIO port     *
+ *********************************************************************************/
+u16 RdPHYReg(u16 PHYAddr, u16 RegAddr)
+{
+       u16 Data;
+
+       PollMdcDone();
+
+       *pEMAC_STAADD = SET_PHYAD(PHYAddr) | SET_REGAD(RegAddr) |
+           STAIE | STABUSY;
+
+       PollMdcDone();
+
+       Data = (u16) * pEMAC_STADAT;
+
+       PHYregs[RegAddr] = Data;        /* save shadow copy */
+
+       return Data;
+}
+
+void SoftResetPHY(void)
+{
+       u16 phydat;
+       /* set the reset bit */
+       WrPHYReg(PHYADDR, PHY_MODECTL, PHY_RESET);
+       /* and clear it again */
+       WrPHYReg(PHYADDR, PHY_MODECTL, 0x0000);
+       do {
+               /* poll until reset is complete */
+               phydat = RdPHYReg(PHYADDR, PHY_MODECTL);
+       } while ((phydat & PHY_RESET) != 0);
+}
+
+int SetupSystemRegs(int *opmode)
+{
+       u16 sysctl, phydat;
+       int count = 0;
+       /* Enable PHY output */
+       *pVR_CTL |= PHYCLKOE;
+       /* MDC  = 2.5 MHz */
+       sysctl = SET_MDCDIV(24);
+       /* Odd word alignment for Receive Frame DMA word */
+       /* Configure checksum support and rcve frame word alignment */
+       sysctl |= RXDWA | RXCKS;
+       *pEMAC_SYSCTL = sysctl;
+       /* auto negotiation on  */
+       /* full duplex */
+       /* 100 Mbps */
+       phydat = PHY_ANEG_EN | PHY_DUPLEX | PHY_SPD_SET;
+       WrPHYReg(PHYADDR, PHY_MODECTL, phydat);
+       do {
+               udelay(1000);
+               phydat = RdPHYReg(PHYADDR, PHY_MODESTAT);
+               if (count > 3000) {
+                       printf
+                           ("Link is down, please check your network connection\n");
+                       return -1;
+               }
+               count++;
+       } while (!(phydat & 0x0004));
+
+       phydat = RdPHYReg(PHYADDR, PHY_ANLPAR);
+
+       if ((phydat & 0x0100) || (phydat & 0x0040))
+               *opmode = FDMODE;
+       else
+               *opmode = 0;
+
+       *pEMAC_MMC_CTL = RSTC | CROLL;
+
+       /* Initialize the TX DMA channel registers */
+       *pDMA2_X_COUNT = 0;
+       *pDMA2_X_MODIFY = 4;
+       *pDMA2_Y_COUNT = 0;
+       *pDMA2_Y_MODIFY = 0;
+
+       /* Initialize the RX DMA channel registers */
+       *pDMA1_X_COUNT = 0;
+       *pDMA1_X_MODIFY = 4;
+       *pDMA1_Y_COUNT = 0;
+       *pDMA1_Y_MODIFY = 0;
+       return 0;
+}
+
+ADI_ETHER_BUFFER *SetupRxBuffer(int no)
+{
+       ADI_ETHER_FRAME_BUFFER *frmbuf;
+       ADI_ETHER_BUFFER *buf;
+       int nobytes_buffer = sizeof(ADI_ETHER_BUFFER[2]) / 2;   /* ensure a multi. of 4 */
+       int total_size = nobytes_buffer + RECV_BUFSIZE;
+
+       buf = (ADI_ETHER_BUFFER *) (RXBUF_BASE_ADDR + no * total_size);
+       frmbuf =
+           (ADI_ETHER_FRAME_BUFFER *) (RXBUF_BASE_ADDR + no * total_size +
+                                       nobytes_buffer);
+
+       memset(buf, 0x00, nobytes_buffer);
+       buf->FrmData = frmbuf;
+       memset(frmbuf, 0xfe, RECV_BUFSIZE);
+
+       /* set up first desc to point to receive frame buffer */
+       buf->Dma[0].NEXT_DESC_PTR = &(buf->Dma[1]);
+       buf->Dma[0].START_ADDR = (u32) buf->FrmData;
+       buf->Dma[0].CONFIG.b_DMA_EN = 1;        /* enabled */
+       buf->Dma[0].CONFIG.b_WNR = 1;   /* Write to memory */
+       buf->Dma[0].CONFIG.b_WDSIZE = 2;        /* wordsize is 32 bits */
+       buf->Dma[0].CONFIG.b_NDSIZE = 5;        /* 5 half words is desc size. */
+       buf->Dma[0].CONFIG.b_FLOW = 7;  /* large desc flow */
+
+       /* set up second desc to point to status word */
+       buf->Dma[1].NEXT_DESC_PTR = &(buf->Dma[0]);
+       buf->Dma[1].START_ADDR = (u32) & buf->IPHdrChksum;
+       buf->Dma[1].CONFIG.b_DMA_EN = 1;        /* enabled */
+       buf->Dma[1].CONFIG.b_WNR = 1;   /* Write to memory */
+       buf->Dma[1].CONFIG.b_WDSIZE = 2;        /* wordsize is 32 bits */
+       buf->Dma[1].CONFIG.b_DI_EN = 1; /* enable interrupt */
+       buf->Dma[1].CONFIG.b_NDSIZE = 5;        /* must be 0 when FLOW is 0 */
+       buf->Dma[1].CONFIG.b_FLOW = 7;  /* stop */
+
+       return buf;
+}
+
+ADI_ETHER_BUFFER *SetupTxBuffer(int no)
+{
+       ADI_ETHER_FRAME_BUFFER *frmbuf;
+       ADI_ETHER_BUFFER *buf;
+       int nobytes_buffer = sizeof(ADI_ETHER_BUFFER[2]) / 2;   /* ensure a multi. of 4 */
+       int total_size = nobytes_buffer + RECV_BUFSIZE;
+
+       buf = (ADI_ETHER_BUFFER *) (TXBUF_BASE_ADDR + no * total_size);
+       frmbuf =
+           (ADI_ETHER_FRAME_BUFFER *) (TXBUF_BASE_ADDR + no * total_size +
+                                       nobytes_buffer);
+
+       memset(buf, 0x00, nobytes_buffer);
+       buf->FrmData = frmbuf;
+       memset(frmbuf, 0x00, RECV_BUFSIZE);
+
+       /* set up first desc to point to receive frame buffer */
+       buf->Dma[0].NEXT_DESC_PTR = &(buf->Dma[1]);
+       buf->Dma[0].START_ADDR = (u32) buf->FrmData;
+       buf->Dma[0].CONFIG.b_DMA_EN = 1;        /* enabled */
+       buf->Dma[0].CONFIG.b_WNR = 0;   /* Read to memory */
+       buf->Dma[0].CONFIG.b_WDSIZE = 2;        /* wordsize is 32 bits */
+       buf->Dma[0].CONFIG.b_NDSIZE = 5;        /* 5 half words is desc size. */
+       buf->Dma[0].CONFIG.b_FLOW = 7;  /* large desc flow */
+
+       /* set up second desc to point to status word */
+       buf->Dma[1].NEXT_DESC_PTR = &(buf->Dma[0]);
+       buf->Dma[1].START_ADDR = (u32) & buf->StatusWord;
+       buf->Dma[1].CONFIG.b_DMA_EN = 1;        /* enabled */
+       buf->Dma[1].CONFIG.b_WNR = 1;   /* Write to memory */
+       buf->Dma[1].CONFIG.b_WDSIZE = 2;        /* wordsize is 32 bits */
+       buf->Dma[1].CONFIG.b_DI_EN = 1; /* enable interrupt */
+       buf->Dma[1].CONFIG.b_NDSIZE = 0;        /* must be 0 when FLOW is 0 */
+       buf->Dma[1].CONFIG.b_FLOW = 0;  /* stop */
+
+       return buf;
+}
+
+#if defined(CONFIG_POST) && defined(CFG_POST_ETHER)
+int ether_post_test(int flags)
+{
+       uchar buf[64];
+       int i, value = 0;
+       int length;
+
+       printf("\n--------");
+       bfin_EMAC_init(NULL, NULL);
+       /* construct the package */
+       buf[0] = buf[6] = (unsigned char)(*pEMAC_ADDRLO & 0xFF);
+       buf[1] = buf[7] = (unsigned char)((*pEMAC_ADDRLO & 0xFF00) >> 8);
+       buf[2] = buf[8] = (unsigned char)((*pEMAC_ADDRLO & 0xFF0000) >> 16);
+       buf[3] = buf[9] = (unsigned char)((*pEMAC_ADDRLO & 0xFF000000) >> 24);
+       buf[4] = buf[10] = (unsigned char)(*pEMAC_ADDRHI & 0xFF);
+       buf[5] = buf[11] = (unsigned char)((*pEMAC_ADDRHI & 0xFF00) >> 8);
+       buf[12] = 0x08;         /* Type: ARP */
+       buf[13] = 0x06;
+       buf[14] = 0x00;         /* Hardware type: Ethernet */
+       buf[15] = 0x01;
+       buf[16] = 0x08;         /* Protocal type: IP */
+       buf[17] = 0x00;
+       buf[18] = 0x06;         /* Hardware size    */
+       buf[19] = 0x04;         /* Protocol size    */
+       buf[20] = 0x00;         /* Opcode: request  */
+       buf[21] = 0x01;
+
+       for (i = 0; i < 42; i++)
+               buf[i + 22] = i;
+       printf("--------Send 64 bytes......\n");
+       bfin_EMAC_send(NULL, (volatile void *)buf, 64);
+       for (i = 0; i < 100; i++) {
+               udelay(10000);
+               if ((rxbuf[rxIdx]->StatusWord & RX_COMP) != 0) {
+                       value = 1;
+                       break;
+               }
+       }
+       if (value == 0) {
+               printf("--------EMAC can't receive any data\n");
+               eth_halt();
+               return -1;
+       }
+       length = rxbuf[rxIdx]->StatusWord & 0x000007FF - 4;
+       for (i = 0; i < length; i++) {
+               if (rxbuf[rxIdx]->FrmData->Dest[i] != buf[i]) {
+                       printf("--------EMAC receive error data!\n");
+                       eth_halt();
+                       return -1;
+               }
+       }
+       printf("--------receive %d bytes, matched\n", length);
+       bfin_EMAC_halt(NULL);
+       return 0;
+}
+#endif
+#endif                         /* CFG_CMD_NET */
diff --git a/board/bf537-stamp/ether_bf537.h b/board/bf537-stamp/ether_bf537.h
new file mode 100644 (file)
index 0000000..64240ba
--- /dev/null
@@ -0,0 +1,110 @@
+#define PHYADDR                        0x01
+#define NO_PHY_REGS            0x20
+
+#define DEFAULT_PHY_PHYID1     0x0007
+#define DEFAULT_PHY_PHYID2     0xC0A3
+#define PHY_MODECTL            0x00
+#define PHY_MODESTAT           0x01
+#define PHY_PHYID1             0x02
+#define PHY_PHYID2             0x03
+#define PHY_ANAR               0x04
+#define PHY_ANLPAR             0x05
+#define PHY_ANER               0x06
+
+#define PHY_RESET              0x8000
+#define PHY_ANEG_EN            0x1000
+#define PHY_DUPLEX             0x0100
+#define PHY_SPD_SET            0x2000
+
+#define RECV_BUFSIZE           (0x614)
+
+typedef volatile u32 reg32;
+typedef volatile u16 reg16;
+
+typedef struct ADI_DMA_CONFIG_REG {
+       u16 b_DMA_EN:1;         /* 0    Enabled                         */
+       u16 b_WNR:1;            /* 1    Direction                       */
+       u16 b_WDSIZE:2;         /* 2:3  Transfer word size              */
+       u16 b_DMA2D:1;          /* 4    DMA mode                        */
+       u16 b_RESTART:1;        /* 5    Retain FIFO                     */
+       u16 b_DI_SEL:1;         /* 6    Data interrupt timing select    */
+       u16 b_DI_EN:1;          /* 7    Data interrupt enabled          */
+       u16 b_NDSIZE:4;         /* 8:11 Flex descriptor size            */
+       u16 b_FLOW:3;           /* 12:14Flow                            */
+} ADI_DMA_CONFIG_REG;
+
+typedef struct adi_ether_frame_buffer {
+       u16 NoBytes;            /* the no. of following bytes   */
+       u8 Dest[6];             /* destination MAC address      */
+       u8 Srce[6];             /* source MAC address           */
+       u16 LTfield;            /* length/type field            */
+       u8 Data[0];             /* payload bytes                */
+} ADI_ETHER_FRAME_BUFFER;
+/* 16 bytes/struct     */
+
+typedef struct dma_descriptor {
+       struct dma_descriptor *NEXT_DESC_PTR;
+       u32 START_ADDR;
+       ADI_DMA_CONFIG_REG CONFIG;
+} DMA_DESCRIPTOR;
+/* 10 bytes/struct in 12 bytes */
+
+typedef struct adi_ether_buffer {
+       DMA_DESCRIPTOR Dma[2];          /* first for the frame, second for the status */
+       ADI_ETHER_FRAME_BUFFER *FrmData;/* pointer to data */
+       struct adi_ether_buffer *pNext; /* next buffer */
+       struct adi_ether_buffer *pPrev; /* prev buffer */
+       u16 IPHdrChksum;                /* the IP header checksum */
+       u16 IPPayloadChksum;            /* the IP header and payload checksum */
+       volatile u32 StatusWord;        /* the frame status word */
+} ADI_ETHER_BUFFER;
+/* 40 bytes/struct in 44 bytes */
+
+void SetupMacAddr(u8 * MACaddr);
+
+void PollMdcDone(void);
+void WrPHYReg(u16 PHYAddr, u16 RegAddr, u16 Data);
+u16 RdPHYReg(u16 PHYAddr, u16 RegAddr);
+void SoftResetPHY(void);
+void DumpPHYRegs(void);
+
+int SetupSystemRegs(int *opmode);
+
+/**
+ * is_zero_ether_addr - Determine if give Ethernet address is all zeros.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is all zeroes.
+ */
+static inline int is_zero_ether_addr(const u8 * addr)
+{
+       return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
+}
+
+/**
+ * is_multicast_ether_addr - Determine if the Ethernet address is a multicast.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is a multicast address.
+ * By definition the broadcast address is also a multicast address.
+ */
+static inline int is_multicast_ether_addr(const u8 * addr)
+{
+       return (0x01 & addr[0]);
+}
+
+/**
+ * is_valid_ether_addr - Determine if the given Ethernet address is valid
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
+ * a multicast address, and is not FF:FF:FF:FF:FF:FF.
+ *
+ * Return true if the address is valid.
+ */
+static inline int is_valid_ether_addr(const u8 * addr)
+{
+       /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
+        * explicitly check for it here. */
+       return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
+}
diff --git a/board/bf537-stamp/flash-defines.h b/board/bf537-stamp/flash-defines.h
new file mode 100644 (file)
index 0000000..acc1e86
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * U-boot - flash-defines.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef __FLASHDEFINES_H__
+#define __FLASHDEFINES_H__
+
+#include <common.h>
+
+#define V_ULONG(a)             (*(volatile unsigned long *)( a ))
+#define V_BYTE(a)              (*(volatile unsigned char *)( a ))
+#define TRUE                   0x1
+#define FALSE                  0x0
+#define BUFFER_SIZE            0x80000
+#define NO_COMMAND             0
+#define GET_CODES              1
+#define RESET                  2
+#define WRITE                  3
+#define FILL                   4
+#define ERASE_ALL              5
+#define ERASE_SECT             6
+#define READ                   7
+#define GET_SECTNUM            8
+#define FLASH_START_L          0x0000
+#define FLASH_START_H          0x2000
+#define FLASH_MAN_ST           2
+#define RESET_VAL              0xF0
+
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+int get_codes(void);
+int poll_toggle_bit(long lOffset);
+void reset_flash(void);
+int erase_flash(void);
+int erase_block_flash(int);
+void unlock_flash(long lOffset);
+int write_data(long lStart, long lCount, uchar * pnData);
+int read_flash(long nOffset, int *pnValue);
+int write_flash(long nOffset, int nValue);
+void get_sector_number(long lOffset, int *pnSector);
+int GetSectorProtectionStatus(flash_info_t * info, int nSector);
+int GetOffset(int nBlock);
+int AFP_NumSectors = 71;
+long AFP_SectorSize2 = 0x10000;
+int AFP_SectorSize1 = 0x2000;
+
+#define NUM_SECTORS            71
+
+#define WRITESEQ1              0x0AAA
+#define WRITESEQ2              0x0554
+#define WRITESEQ3              0x0AAA
+#define WRITESEQ4              0x0AAA
+#define WRITESEQ5              0x0554
+#define WRITESEQ6              0x0AAA
+#define WRITEDATA1             0xaa
+#define WRITEDATA2             0x55
+#define WRITEDATA3             0x80
+#define WRITEDATA4             0xaa
+#define WRITEDATA5             0x55
+#define WRITEDATA6             0x10
+#define PriFlashABegin         0
+#define SecFlashABegin         8
+#define SecFlashBBegin         36
+#define PriFlashAOff           0x0
+#define PriFlashBOff           0x100000
+#define SecFlashAOff           0x10000
+#define SecFlashBOff           0x280000
+#define INVALIDLOCNSTART       0x20270000
+#define INVALIDLOCNEND         0x20280000
+#define BlockEraseVal          0x30
+#define UNLOCKDATA1            0xaa
+#define UNLOCKDATA2            0x55
+#define UNLOCKDATA3            0xa0
+#define GETCODEDATA1           0xaa
+#define GETCODEDATA2           0x55
+#define GETCODEDATA3           0x90
+#define SecFlashASec1Off       0x200000
+#define SecFlashASec2Off       0x204000
+#define SecFlashASec3Off       0x206000
+#define SecFlashASec4Off       0x208000
+#define SecFlashAEndOff                0x210000
+#define SecFlashBSec1Off       0x280000
+#define SecFlashBSec2Off       0x284000
+#define SecFlashBSec3Off       0x286000
+#define SecFlashBSec4Off       0x288000
+#define SecFlashBEndOff                0x290000
+
+#define SECT32                 32
+#define SECT33                 33
+#define SECT34                 34
+#define SECT35                 35
+#define SECT36                 36
+#define SECT37                 37
+#define SECT38                 38
+#define SECT39                 39
+
+#define FLASH_SUCCESS  0
+#define FLASH_FAIL     -1
+
+#endif
diff --git a/board/bf537-stamp/flash.c b/board/bf537-stamp/flash.c
new file mode 100644 (file)
index 0000000..ed85841
--- /dev/null
@@ -0,0 +1,403 @@
+/*
+ * U-boot - flash.c Flash driver for PSD4256GV
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ * This file is based on BF533EzFlash.c originally written by Analog Devices, Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <malloc.h>
+#include <config.h>
+#include <asm/io.h>
+#include "flash-defines.h"
+
+void flash_reset(void)
+{
+       reset_flash();
+}
+
+unsigned long flash_get_size(ulong baseaddr, flash_info_t * info, int bank_flag)
+{
+       int id = 0, i = 0;
+       static int FlagDev = 1;
+
+       id = get_codes();
+       if (FlagDev) {
+               FlagDev = 0;
+       }
+       info->flash_id = id;
+       switch (bank_flag) {
+       case 0:
+               for (i = PriFlashABegin; i < SecFlashABegin; i++)
+                       info->start[i] = (baseaddr + (i * AFP_SectorSize1));
+               for (i = SecFlashABegin; i < NUM_SECTORS; i++)
+                       info->start[i] =
+                           (baseaddr + SecFlashAOff +
+                            ((i - SecFlashABegin) * AFP_SectorSize2));
+               info->size = 0x400000;
+               info->sector_count = NUM_SECTORS;
+               break;
+       case 1:
+               info->start[0] = baseaddr + SecFlashASec1Off;
+               info->start[1] = baseaddr + SecFlashASec2Off;
+               info->start[2] = baseaddr + SecFlashASec3Off;
+               info->start[3] = baseaddr + SecFlashASec4Off;
+               info->size = 0x10000;
+               info->sector_count = 4;
+               break;
+       case 2:
+               info->start[0] = baseaddr + SecFlashBSec1Off;
+               info->start[1] = baseaddr + SecFlashBSec2Off;
+               info->start[2] = baseaddr + SecFlashBSec3Off;
+               info->start[3] = baseaddr + SecFlashBSec4Off;
+               info->size = 0x10000;
+               info->sector_count = 4;
+               break;
+       }
+       return (info->size);
+}
+
+unsigned long flash_init(void)
+{
+       unsigned long size_b;
+       int i;
+
+       size_b = 0;
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; ++i) {
+               flash_info[i].flash_id = FLASH_UNKNOWN;
+       }
+
+       size_b = flash_get_size(CFG_FLASH_BASE, &flash_info[0], 0);
+
+       if (flash_info[0].flash_id == FLASH_UNKNOWN || size_b == 0) {
+               printf("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
+                      size_b, size_b >> 20);
+       }
+
+       /* flash_protect (int flag, ulong from, ulong to, flash_info_t *info) */
+       (void)flash_protect(FLAG_PROTECT_SET, CFG_FLASH_BASE,
+                           (flash_info[0].start[2] - 1), &flash_info[0]);
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT)
+       (void)flash_protect(FLAG_PROTECT_SET, 0x203F0000, 0x203FFFFF,
+                           &flash_info[0]);
+#endif
+
+       return (size_b);
+}
+
+void flash_print_info(flash_info_t * info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf("missing or unknown FLASH type\n");
+               return;
+       }
+
+       switch (info->flash_id) {
+       case (STM_ID_29W320EB & 0xFFFF):
+       case (STM_ID_29W320DB & 0xFFFF):
+               printf("ST Microelectronics ");
+               break;
+       default:
+               printf("Unknown Vendor: (0x%08X) ", info->flash_id);
+               break;
+       }
+       for (i = 0; i < info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf("\n   ");
+               printf(" %08lX%s",
+                      info->start[i], info->protect[i] ? " (RO)" : "     ");
+       }
+       printf("\n");
+       return;
+}
+
+int flash_erase(flash_info_t * info, int s_first, int s_last)
+{
+       int cnt = 0, i;
+       int prot, sect;
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect])
+                       prot++;
+       }
+       if (prot)
+               printf("- Warning: %d protected sectors will not be erased!\n",
+                      prot);
+       else
+               printf("\n");
+
+       cnt = s_last - s_first + 1;
+
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT)
+       printf("Erasing Flash locations, Please Wait\n");
+       for (i = s_first; i <= s_last; i++) {
+               if (info->protect[i] == 0) {    /* not protected */
+                       if (erase_block_flash(i) < 0) {
+                               printf("Error Sector erasing \n");
+                               return FLASH_FAIL;
+                       }
+               }
+       }
+#elif (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+       if (cnt == FLASH_TOT_SECT) {
+               printf("Erasing flash, Please Wait \n");
+               if (erase_flash() < 0) {
+                       printf("Erasing flash failed \n");
+                       return FLASH_FAIL;
+               }
+       } else {
+               printf("Erasing Flash locations, Please Wait\n");
+               for (i = s_first; i <= s_last; i++) {
+                       if (info->protect[i] == 0) {    /* not protected */
+                               if (erase_block_flash(i) < 0) {
+                                       printf("Error Sector erasing \n");
+                                       return FLASH_FAIL;
+                               }
+                       }
+               }
+       }
+#endif
+       printf("\n");
+       return FLASH_SUCCESS;
+}
+
+int write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       int d;
+       if (addr % 2) {
+               read_flash(addr - 1 - CFG_FLASH_BASE, &d);
+               d = (int)((d & 0x00FF) | (*src++ << 8));
+               write_data(addr - 1, 2, (uchar *) & d);
+               write_data(addr + 1, cnt - 1, src);
+       } else
+               write_data(addr, cnt, src);
+       return FLASH_SUCCESS;
+}
+
+int write_data(long lStart, long lCount, uchar * pnData)
+{
+       long i = 0;
+       unsigned long ulOffset = lStart - CFG_FLASH_BASE;
+       int d;
+       int nSector = 0;
+       int flag = 0;
+
+       if (lCount % 2) {
+               flag = 1;
+               lCount = lCount - 1;
+       }
+
+       for (i = 0; i < lCount - 1; i += 2, ulOffset += 2) {
+               get_sector_number(ulOffset, &nSector);
+               read_flash(ulOffset, &d);
+               if (d != 0xffff) {
+                       printf
+                           ("Flash not erased at offset 0x%x Please erase to reprogram \n",
+                            ulOffset);
+                       return FLASH_FAIL;
+               }
+               unlock_flash(ulOffset);
+               d = (int)(pnData[i] | pnData[i + 1] << 8);
+               write_flash(ulOffset, d);
+               if (poll_toggle_bit(ulOffset) < 0) {
+                       printf("Error programming the flash \n");
+                       return FLASH_FAIL;
+               }
+               if ((i > 0) && (!(i % AFP_SectorSize2)))
+                       printf(".");
+       }
+       if (flag) {
+               get_sector_number(ulOffset, &nSector);
+               read_flash(ulOffset, &d);
+               if (d != 0xffff) {
+                       printf
+                           ("Flash not erased at offset 0x%x Please erase to reprogram \n",
+                            ulOffset);
+                       return FLASH_FAIL;
+               }
+               unlock_flash(ulOffset);
+               d = (int)(pnData[i] | (d & 0xFF00));
+               write_flash(ulOffset, d);
+               if (poll_toggle_bit(ulOffset) < 0) {
+                       printf("Error programming the flash \n");
+                       return FLASH_FAIL;
+               }
+       }
+       return FLASH_SUCCESS;
+}
+
+int write_flash(long nOffset, int nValue)
+{
+       long addr;
+
+       addr = (CFG_FLASH_BASE + nOffset);
+       *(unsigned volatile short *)addr = nValue;
+       sync();
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+       if (icache_status())
+               udelay(CONFIG_CCLK_HZ / 1000000);
+#endif
+       return FLASH_SUCCESS;
+}
+
+int read_flash(long nOffset, int *pnValue)
+{
+       unsigned short *pFlashAddr =
+           (unsigned short *)(CFG_FLASH_BASE + nOffset);
+
+       *pnValue = *pFlashAddr;
+
+       return TRUE;
+}
+
+int poll_toggle_bit(long lOffset)
+{
+       unsigned int u1, u2;
+       volatile unsigned long *FB =
+           (volatile unsigned long *)(CFG_FLASH_BASE + lOffset);
+       while (1) {
+               u1 = *(volatile unsigned short *)FB;
+               u2 = *(volatile unsigned short *)FB;
+               u1 ^= u2;
+               if (!(u1 & 0x0040))
+                       break;
+               if (!(u2 & 0x0020))
+                       continue;
+               else {
+                       u1 = *(volatile unsigned short *)FB;
+                       u2 = *(volatile unsigned short *)FB;
+                       u1 ^= u2;
+                       if (!(u1 & 0x0040))
+                               break;
+                       else {
+                               reset_flash();
+                               return FLASH_FAIL;
+                       }
+               }
+       }
+       return FLASH_SUCCESS;
+}
+
+void reset_flash(void)
+{
+       write_flash(WRITESEQ1, RESET_VAL);
+       /* Wait for 10 micro seconds */
+       udelay(10);
+}
+
+int erase_flash(void)
+{
+       write_flash(WRITESEQ1, WRITEDATA1);
+       write_flash(WRITESEQ2, WRITEDATA2);
+       write_flash(WRITESEQ3, WRITEDATA3);
+       write_flash(WRITESEQ4, WRITEDATA4);
+       write_flash(WRITESEQ5, WRITEDATA5);
+       write_flash(WRITESEQ6, WRITEDATA6);
+
+       if (poll_toggle_bit(0x0000) < 0)
+               return FLASH_FAIL;
+
+       return FLASH_SUCCESS;
+}
+
+int erase_block_flash(int nBlock)
+{
+       long ulSectorOff = 0x0;
+
+       if ((nBlock < 0) || (nBlock > AFP_NumSectors))
+               return FALSE;
+
+       /* figure out the offset of the block in flash */
+       if ((nBlock >= 0) && (nBlock < SecFlashABegin))
+               ulSectorOff = nBlock * AFP_SectorSize1;
+
+       else if ((nBlock >= SecFlashABegin) && (nBlock < NUM_SECTORS))
+               ulSectorOff =
+                   SecFlashAOff + (nBlock - SecFlashABegin) * AFP_SectorSize2;
+       /* no such sector */
+       else
+               return FLASH_FAIL;
+
+       write_flash((WRITESEQ1 | ulSectorOff), WRITEDATA1);
+       write_flash((WRITESEQ2 | ulSectorOff), WRITEDATA2);
+       write_flash((WRITESEQ3 | ulSectorOff), WRITEDATA3);
+       write_flash((WRITESEQ4 | ulSectorOff), WRITEDATA4);
+       write_flash((WRITESEQ5 | ulSectorOff), WRITEDATA5);
+
+       write_flash(ulSectorOff, BlockEraseVal);
+
+       if (poll_toggle_bit(ulSectorOff) < 0)
+               return FLASH_FAIL;
+       printf(".");
+
+       return FLASH_SUCCESS;
+}
+
+void unlock_flash(long ulOffset)
+{
+       unsigned long ulOffsetAddr = ulOffset;
+       ulOffsetAddr &= 0xFFFF0000;
+
+       write_flash((WRITESEQ1 | ulOffsetAddr), UNLOCKDATA1);
+       write_flash((WRITESEQ2 | ulOffsetAddr), UNLOCKDATA2);
+       write_flash((WRITESEQ3 | ulOffsetAddr), UNLOCKDATA3);
+}
+
+int get_codes()
+{
+       int dev_id = 0;
+
+       write_flash(WRITESEQ1, GETCODEDATA1);
+       write_flash(WRITESEQ2, GETCODEDATA2);
+       write_flash(WRITESEQ3, GETCODEDATA3);
+
+       read_flash(0x0402, &dev_id);
+       dev_id &= 0x0000FFFF;
+
+       reset_flash();
+
+       return dev_id;
+}
+
+void get_sector_number(long ulOffset, int *pnSector)
+{
+       int nSector = 0;
+       long lMainEnd = 0x400000;
+       long lBootEnd = 0x10000;
+
+       /* sector numbers for the FLASH A boot sectors */
+       if (ulOffset < lBootEnd) {
+               nSector = (int)ulOffset / AFP_SectorSize1;
+       }
+       /* sector numbers for the FLASH B boot sectors */
+       else if ((ulOffset >= lBootEnd) && (ulOffset < lMainEnd)) {
+               nSector = ((ulOffset / (AFP_SectorSize2)) + 7);
+       }
+       /* if it is a valid sector, set it */
+       if ((nSector >= 0) && (nSector < AFP_NumSectors))
+               *pnSector = nSector;
+
+}
diff --git a/board/bf537-stamp/nand.c b/board/bf537-stamp/nand.c
new file mode 100644 (file)
index 0000000..4d6e776
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * (C) Copyright 2006 Aubrey.Li, aubrey.li@analog.com
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/io.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_NAND)
+
+#include <nand.h>
+
+#define CONCAT(a,b,c,d) a ## b ## c ## d
+#define PORT(a,b)  CONCAT(pPORT,a,b,)
+
+#ifndef CONFIG_NAND_GPIO_PORT
+#define CONFIG_NAND_GPIO_PORT F
+#endif
+
+/*
+ * hardware specific access to control-lines
+ */
+static void bfin_hwcontrol(struct mtd_info *mtd, int cmd)
+{
+       register struct nand_chip *this = mtd->priv;
+
+       switch (cmd) {
+
+       case NAND_CTL_SETCLE:
+               this->IO_ADDR_W = CFG_NAND_BASE + BFIN_NAND_CLE;
+               break;
+       case NAND_CTL_CLRCLE:
+               this->IO_ADDR_W = CFG_NAND_BASE;
+               break;
+
+       case NAND_CTL_SETALE:
+               this->IO_ADDR_W = CFG_NAND_BASE + BFIN_NAND_ALE;
+               break;
+       case NAND_CTL_CLRALE:
+               this->IO_ADDR_W = CFG_NAND_BASE;
+               break;
+       case NAND_CTL_SETNCE:
+       case NAND_CTL_CLRNCE:
+               break;
+       }
+
+       this->IO_ADDR_R = this->IO_ADDR_W;
+
+       /* Drain the writebuffer */
+       sync();
+}
+
+int bfin_device_ready(struct mtd_info *mtd)
+{
+       int ret = (*PORT(CONFIG_NAND_GPIO_PORT, IO) & BFIN_NAND_READY) ? 1 : 0;
+       sync();
+       return ret;
+}
+
+/*
+ * Board-specific NAND initialization. The following members of the
+ * argument are board-specific (per include/linux/mtd/nand.h):
+ * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device
+ * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device
+ * - hwcontrol: hardwarespecific function for accesing control-lines
+ * - dev_ready: hardwarespecific function for  accesing device ready/busy line
+ * - enable_hwecc?: function to enable (reset)  hardware ecc generator. Must
+ *   only be provided if a hardware ECC is available
+ * - eccmode: mode of ecc, see defines
+ * - chip_delay: chip dependent delay for transfering data from array to
+ *   read regs (tR)
+ * - options: various chip options. They can partly be set to inform
+ *   nand_scan about special functionality. See the defines for further
+ *   explanation
+ * Members with a "?" were not set in the merged testing-NAND branch,
+ * so they are not set here either.
+ */
+void board_nand_init(struct nand_chip *nand)
+{
+       *PORT(CONFIG_NAND_GPIO_PORT, _FER) &= ~BFIN_NAND_READY;
+       *PORT(CONFIG_NAND_GPIO_PORT, IO_DIR) &= ~BFIN_NAND_READY;
+       *PORT(CONFIG_NAND_GPIO_PORT, IO_INEN) |= BFIN_NAND_READY;
+
+       nand->hwcontrol = bfin_hwcontrol;
+       nand->eccmode = NAND_ECC_SOFT;
+       nand->dev_ready = bfin_device_ready;
+       nand->chip_delay = 30;
+}
+#endif                         /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
diff --git a/board/bf537-stamp/post-memory.c b/board/bf537-stamp/post-memory.c
new file mode 100644 (file)
index 0000000..6039350
--- /dev/null
@@ -0,0 +1,322 @@
+#include <common.h>
+#include <asm/io.h>
+
+#ifdef CONFIG_POST
+
+#include <post.h>
+#include <watchdog.h>
+
+#if CONFIG_POST & CFG_POST_MEMORY
+#define CLKIN 25000000
+#define PATTERN1 0x5A5A5A5A
+#define PATTERN2 0xAAAAAAAA
+
+#define CCLK_NUM       4
+#define SCLK_NUM       3
+
+void post_out_buff(char *buff);
+int post_key_pressed(void);
+void post_init_pll(int mult, int div);
+int post_init_sdram(int sclk);
+void post_init_uart(int sclk);
+
+const int pll[CCLK_NUM][SCLK_NUM][2] = {
+       {{20, 4}, {20, 5}, {20, 10}},   /* CCLK = 500M */
+       {{16, 4}, {16, 5}, {16, 8}},    /* CCLK = 400M */
+       {{8, 2}, {8, 4}, {8, 5}},       /* CCLK = 200M */
+       {{4, 1}, {4, 2}, {4, 4}}        /* CCLK = 100M */
+};
+const char *const log[CCLK_NUM][SCLK_NUM] = {
+       {"CCLK-500Mhz SCLK-125Mhz:    Writing...\0",
+        "CCLK-500Mhz SCLK-100Mhz:    Writing...\0",
+        "CCLK-500Mhz SCLK- 50Mhz:    Writing...\0",},
+       {"CCLK-400Mhz SCLK-100Mhz:    Writing...\0",
+        "CCLK-400Mhz SCLK- 80Mhz:    Writing...\0",
+        "CCLK-400Mhz SCLK- 50Mhz:    Writing...\0",},
+       {"CCLK-200Mhz SCLK-100Mhz:    Writing...\0",
+        "CCLK-200Mhz SCLK- 50Mhz:    Writing...\0",
+        "CCLK-200Mhz SCLK- 40Mhz:    Writing...\0",},
+       {"CCLK-100Mhz SCLK-100Mhz:    Writing...\0",
+        "CCLK-100Mhz SCLK- 50Mhz:    Writing...\0",
+        "CCLK-100Mhz SCLK- 25Mhz:    Writing...\0",},
+};
+
+int memory_post_test(int flags)
+{
+       int addr;
+       int m, n;
+       int sclk, sclk_temp;
+       int ret = 1;
+
+       sclk_temp = CLKIN / 1000000;
+       sclk_temp = sclk_temp * CONFIG_VCO_MULT;
+       for (sclk = 0; sclk_temp > 0; sclk++)
+               sclk_temp -= CONFIG_SCLK_DIV;
+       sclk = sclk * 1000000;
+       post_init_uart(sclk);
+       if (post_key_pressed() == 0)
+               return 0;
+
+       for (m = 0; m < CCLK_NUM; m++) {
+               for (n = 0; n < SCLK_NUM; n++) {
+                       /* Calculate the sclk */
+                       sclk_temp = CLKIN / 1000000;
+                       sclk_temp = sclk_temp * pll[m][n][0];
+                       for (sclk = 0; sclk_temp > 0; sclk++)
+                               sclk_temp -= pll[m][n][1];
+                       sclk = sclk * 1000000;
+
+                       post_init_pll(pll[m][n][0], pll[m][n][1]);
+                       post_init_sdram(sclk);
+                       post_init_uart(sclk);
+                       post_out_buff("\n\r\0");
+                       post_out_buff(log[m][n]);
+                       for (addr = 0x0; addr < CFG_MAX_RAM_SIZE; addr += 4)
+                               *(unsigned long *)addr = PATTERN1;
+                       post_out_buff("Reading...\0");
+                       for (addr = 0x0; addr < CFG_MAX_RAM_SIZE; addr += 4) {
+                               if ((*(unsigned long *)addr) != PATTERN1) {
+                                       post_out_buff("Error\n\r\0");
+                                       ret = 0;
+                               }
+                       }
+                       post_out_buff("OK\n\r\0");
+               }
+       }
+       if (ret)
+               post_out_buff("memory POST passed\n\r\0");
+       else
+               post_out_buff("memory POST failed\n\r\0");
+
+       post_out_buff("\n\r\n\r\0");
+       return 1;
+}
+
+void post_init_uart(int sclk)
+{
+       int divisor;
+
+       for (divisor = 0; sclk > 0; divisor++)
+               sclk -= 57600 * 16;
+
+       *pPORTF_FER = 0x000F;
+       *pPORTH_FER = 0xFFFF;
+
+       *pUART_GCTL = 0x00;
+       *pUART_LCR = 0x83;
+       sync();
+       *pUART_DLL = (divisor & 0xFF);
+       sync();
+       *pUART_DLH = ((divisor >> 8) & 0xFF);
+       sync();
+       *pUART_LCR = 0x03;
+       sync();
+       *pUART_GCTL = 0x01;
+       sync();
+}
+
+void post_out_buff(char *buff)
+{
+
+       int i = 0;
+       for (i = 0; i < 0x80000; i++) ;
+       i = 0;
+       while ((buff[i] != '\0') && (i != 100)) {
+               while (!(*pUART_LSR & 0x20)) ;
+               *pUART_THR = buff[i];
+               sync();
+               i++;
+       }
+       for (i = 0; i < 0x80000; i++) ;
+}
+
+/* Using sw10-PF5 as the hotkey */
+#define KEY_LOOP 0x80000
+#define KEY_DELAY 0x80
+int post_key_pressed(void)
+{
+       int i, n;
+       unsigned short value;
+
+       *pPORTF_FER &= ~PF5;
+       *pPORTFIO_DIR &= ~PF5;
+       *pPORTFIO_INEN |= PF5;
+       sync();
+
+       post_out_buff("########Press SW10 to enter Memory POST########: 3\0");
+       for (i = 0; i < KEY_LOOP; i++) {
+               value = *pPORTFIO & PF5;
+               if (*pUART0_RBR == 0x0D) {
+                       value = 0;
+                       goto key_pressed;
+               }
+               if (value != 0) {
+                       goto key_pressed;
+               }
+               for (n = 0; n < KEY_DELAY; n++)
+                       asm("nop");
+       }
+       post_out_buff("\b2\0");
+
+       for (i = 0; i < KEY_LOOP; i++) {
+               value = *pPORTFIO & PF5;
+               if (*pUART0_RBR == 0x0D) {
+                       value = 0;
+                       goto key_pressed;
+               }
+               if (value != 0) {
+                       goto key_pressed;
+               }
+               for (n = 0; n < KEY_DELAY; n++)
+                       asm("nop");
+       }
+       post_out_buff("\b1\0");
+
+       for (i = 0; i < KEY_LOOP; i++) {
+               value = *pPORTFIO & PF5;
+               if (*pUART0_RBR == 0x0D) {
+                       value = 0;
+                       goto key_pressed;
+               }
+               if (value != 0) {
+                       goto key_pressed;
+               }
+               for (n = 0; n < KEY_DELAY; n++)
+                       asm("nop");
+       }
+      key_pressed:
+       post_out_buff("\b0");
+       post_out_buff("\n\r\0");
+       if (value == 0)
+               return 0;
+       post_out_buff("Hotkey has been pressed, Enter POST . . . . . .\n\r\0");
+       return 1;
+}
+
+void post_init_pll(int mult, int div)
+{
+
+       *pSIC_IWR = 0x01;
+       *pPLL_CTL = (mult << 9);
+       *pPLL_DIV = div;
+       asm("CLI R2;");
+       asm("IDLE;");
+       asm("STI R2;");
+       while (!(*pPLL_STAT & 0x20)) ;
+}
+
+int post_init_sdram(int sclk)
+{
+       int SDRAM_tRP, SDRAM_tRP_num, SDRAM_tRAS, SDRAM_tRAS_num, SDRAM_tRCD,
+           SDRAM_tWR;
+       int SDRAM_Tref, SDRAM_NRA, SDRAM_CL, SDRAM_SIZE, SDRAM_WIDTH,
+           mem_SDGCTL, mem_SDBCTL, mem_SDRRC;
+
+       if ((sclk > 119402985)) {
+               SDRAM_tRP = TRP_2;
+               SDRAM_tRP_num = 2;
+               SDRAM_tRAS = TRAS_7;
+               SDRAM_tRAS_num = 7;
+               SDRAM_tRCD = TRCD_2;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 104477612) && (sclk <= 119402985)) {
+               SDRAM_tRP = TRP_2;
+               SDRAM_tRP_num = 2;
+               SDRAM_tRAS = TRAS_6;
+               SDRAM_tRAS_num = 6;
+               SDRAM_tRCD = TRCD_2;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 89552239) && (sclk <= 104477612)) {
+               SDRAM_tRP = TRP_2;
+               SDRAM_tRP_num = 2;
+               SDRAM_tRAS = TRAS_5;
+               SDRAM_tRAS_num = 5;
+               SDRAM_tRCD = TRCD_2;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 74626866) && (sclk <= 89552239)) {
+               SDRAM_tRP = TRP_2;
+               SDRAM_tRP_num = 2;
+               SDRAM_tRAS = TRAS_4;
+               SDRAM_tRAS_num = 4;
+               SDRAM_tRCD = TRCD_2;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 66666667) && (sclk <= 74626866)) {
+               SDRAM_tRP = TRP_2;
+               SDRAM_tRP_num = 2;
+               SDRAM_tRAS = TRAS_3;
+               SDRAM_tRAS_num = 3;
+               SDRAM_tRCD = TRCD_2;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 59701493) && (sclk <= 66666667)) {
+               SDRAM_tRP = TRP_1;
+               SDRAM_tRP_num = 1;
+               SDRAM_tRAS = TRAS_4;
+               SDRAM_tRAS_num = 4;
+               SDRAM_tRCD = TRCD_1;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 44776119) && (sclk <= 59701493)) {
+               SDRAM_tRP = TRP_1;
+               SDRAM_tRP_num = 1;
+               SDRAM_tRAS = TRAS_3;
+               SDRAM_tRAS_num = 3;
+               SDRAM_tRCD = TRCD_1;
+               SDRAM_tWR = TWR_2;
+       } else if ((sclk > 29850746) && (sclk <= 44776119)) {
+               SDRAM_tRP = TRP_1;
+               SDRAM_tRP_num = 1;
+               SDRAM_tRAS = TRAS_2;
+               SDRAM_tRAS_num = 2;
+               SDRAM_tRCD = TRCD_1;
+               SDRAM_tWR = TWR_2;
+       } else if (sclk <= 29850746) {
+               SDRAM_tRP = TRP_1;
+               SDRAM_tRP_num = 1;
+               SDRAM_tRAS = TRAS_1;
+               SDRAM_tRAS_num = 1;
+               SDRAM_tRCD = TRCD_1;
+               SDRAM_tWR = TWR_2;
+       } else {
+               SDRAM_tRP = TRP_1;
+               SDRAM_tRP_num = 1;
+               SDRAM_tRAS = TRAS_1;
+               SDRAM_tRAS_num = 1;
+               SDRAM_tRCD = TRCD_1;
+               SDRAM_tWR = TWR_2;
+       }
+       /*SDRAM INFORMATION: */
+       SDRAM_Tref = 64;        /* Refresh period in milliseconds */
+       SDRAM_NRA = 4096;       /* Number of row addresses in SDRAM */
+       SDRAM_CL = CL_3;        /* 2 */
+
+       SDRAM_SIZE = EBSZ_64;
+       SDRAM_WIDTH = EBCAW_10;
+
+       mem_SDBCTL = SDRAM_WIDTH | SDRAM_SIZE | EBE;
+
+       /* Equation from section 17 (p17-46) of BF533 HRM */
+       mem_SDRRC =
+           (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) -
+           (SDRAM_tRAS_num + SDRAM_tRP_num);
+
+       /* Enable SCLK Out */
+       mem_SDGCTL =
+           (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR
+            | PSS);
+
+       sync();
+
+       *pEBIU_SDGCTL |= 0x1000000;
+       /* Set the SDRAM Refresh Rate control register based on SSCLK value */
+       *pEBIU_SDRRC = mem_SDRRC;
+
+       /* SDRAM Memory Bank Control Register */
+       *pEBIU_SDBCTL = mem_SDBCTL;
+
+       /* SDRAM Memory Global Control Register */
+       *pEBIU_SDGCTL = mem_SDGCTL;
+       sync();
+       return mem_SDRRC;
+}
+
+#endif                         /* CONFIG_POST & CFG_POST_MEMORY */
+#endif                         /* CONFIG_POST */
diff --git a/board/bf537-stamp/stm_m25p64.c b/board/bf537-stamp/stm_m25p64.c
new file mode 100644 (file)
index 0000000..7077e85
--- /dev/null
@@ -0,0 +1,515 @@
+/****************************************************************************
+ *  SPI flash driver for M25P64
+ ****************************************************************************/
+#include <common.h>
+#include <linux/ctype.h>
+#include <asm/io.h>
+
+#if defined(CONFIG_SPI)
+
+/* Application definitions */
+
+#define        NUM_SECTORS     128     /* number of sectors */
+#define SECTOR_SIZE    0x10000
+#define NOP_NUM                1000
+
+#define COMMON_SPI_SETTINGS (SPE|MSTR|CPHA|CPOL) /* Settings to the SPI_CTL */
+#define TIMOD01 (0x01) /* stes the SPI to work with core instructions */
+
+/* Flash commands */
+#define        SPI_WREN        (0x06)  /*Set Write Enable Latch */
+#define        SPI_WRDI        (0x04)  /*Reset Write Enable Latch */
+#define        SPI_RDSR        (0x05)  /*Read Status Register */
+#define        SPI_WRSR        (0x01)  /*Write Status Register */
+#define        SPI_READ        (0x03)  /*Read data from memory */
+#define        SPI_FAST_READ   (0x0B)  /*Read data from memory */
+#define        SPI_PP          (0x02)  /*Program Data into memory */
+#define        SPI_SE          (0xD8)  /*Erase one sector in memory */
+#define        SPI_BE          (0xC7)  /*Erase all memory */
+#define        WIP             (0x1)   /*Check the write in progress bit of the SPI status register */
+#define        WEL             (0x2)   /*Check the write enable bit of the SPI status register */
+
+#define        TIMEOUT         350000000
+
+typedef enum {
+       NO_ERR,
+       POLL_TIMEOUT,
+       INVALID_SECTOR,
+       INVALID_BLOCK,
+} ERROR_CODE;
+
+void spi_init_f(void);
+void spi_init_r(void);
+ssize_t spi_read(uchar *, int, uchar *, int);
+ssize_t spi_write(uchar *, int, uchar *, int);
+
+char ReadStatusRegister(void);
+void Wait_For_SPIF(void);
+void SetupSPI(const int spi_setting);
+void SPI_OFF(void);
+void SendSingleCommand(const int iCommand);
+
+ERROR_CODE GetSectorNumber(unsigned long ulOffset, int *pnSector);
+ERROR_CODE EraseBlock(int nBlock);
+ERROR_CODE ReadData(unsigned long ulStart, long lCount, int *pnData);
+ERROR_CODE WriteData(unsigned long ulStart, long lCount, int *pnData);
+ERROR_CODE Wait_For_Status(char Statusbit);
+ERROR_CODE Wait_For_WEL(void);
+
+/*
+ * Function:    spi_init_f
+ * Description: Init SPI-Controller (ROM part)
+ * return:      ---
+ */
+void spi_init_f(void)
+{
+}
+
+/*
+ * Function:    spi_init_r
+ * Description: Init SPI-Controller (RAM part) -
+ *              The malloc engine is ready and we can move our buffers to
+ *              normal RAM
+ *  return:      ---
+ */
+void spi_init_r(void)
+{
+       return;
+}
+
+/*
+ * Function:    spi_write
+ */
+ssize_t spi_write(uchar * addr, int alen, uchar * buffer, int len)
+{
+       unsigned long offset;
+       int start_block, end_block;
+       int start_byte, end_byte;
+       ERROR_CODE result = NO_ERR;
+       uchar temp[SECTOR_SIZE];
+       int i, num;
+
+       offset = addr[0] << 16 | addr[1] << 8 | addr[2];
+       /* Get the start block number */
+       result = GetSectorNumber(offset, &start_block);
+       if (result == INVALID_SECTOR) {
+               printf("Invalid sector! ");
+               return 0;
+       }
+       /* Get the end block number */
+       result = GetSectorNumber(offset + len - 1, &end_block);
+       if (result == INVALID_SECTOR) {
+               printf("Invalid sector! ");
+               return 0;
+       }
+
+       for (num = start_block; num <= end_block; num++) {
+               ReadData(num * SECTOR_SIZE, SECTOR_SIZE, (int *)temp);
+               start_byte = num * SECTOR_SIZE;
+               end_byte = (num + 1) * SECTOR_SIZE - 1;
+               if (start_byte < offset)
+                       start_byte = offset;
+               if (end_byte > (offset + len))
+                       end_byte = (offset + len - 1);
+               for (i = start_byte; i <= end_byte; i++)
+                       temp[i - num * SECTOR_SIZE] = buffer[i - offset];
+               EraseBlock(num);
+               result = WriteData(num * SECTOR_SIZE, SECTOR_SIZE, (int *)temp);
+               if (result != NO_ERR)
+                       return 0;
+               printf(".");
+       }
+       return len;
+}
+
+/*
+ * Function: spi_read
+ */
+ssize_t spi_read(uchar * addr, int alen, uchar * buffer, int len)
+{
+       unsigned long offset;
+       offset = addr[0] << 16 | addr[1] << 8 | addr[2];
+       ReadData(offset, len, (int *)buffer);
+       return len;
+}
+
+void SendSingleCommand(const int iCommand)
+{
+       unsigned short dummy;
+
+       /* turns on the SPI in single write mode */
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+       /* sends the actual command to the SPI TX register */
+       *pSPI_TDBR = iCommand;
+       sync();
+
+       /* The SPI status register will be polled to check the SPIF bit */
+       Wait_For_SPIF();
+
+       dummy = *pSPI_RDBR;
+
+       /* The SPI will be turned off */
+       SPI_OFF();
+
+}
+
+void SetupSPI(const int spi_setting)
+{
+
+       if (icache_status() || dcache_status())
+               udelay(CONFIG_CCLK_HZ / 50000000);
+       /*sets up the PF10 to be the slave select of the SPI */
+       *pPORTF_FER |= (PF10 | PF11 | PF12 | PF13);
+       *pSPI_FLG = 0xFF02;
+       *pSPI_BAUD = CONFIG_SPI_BAUD;
+       *pSPI_CTL = spi_setting;
+       sync();
+
+       *pSPI_FLG = 0xFD02;
+       sync();
+}
+
+void SPI_OFF(void)
+{
+
+       *pSPI_CTL = 0x0400;     /* disable SPI */
+       *pSPI_FLG = 0;
+       *pSPI_BAUD = 0;
+       sync();
+       udelay(CONFIG_CCLK_HZ / 50000000);
+
+}
+
+void Wait_For_SPIF(void)
+{
+       unsigned short dummyread;
+       while ((*pSPI_STAT & TXS)) ;
+       while (!(*pSPI_STAT & SPIF)) ;
+       while (!(*pSPI_STAT & RXS)) ;
+       /* Read dummy to empty the receive register */
+       dummyread = *pSPI_RDBR;
+}
+
+ERROR_CODE Wait_For_WEL(void)
+{
+       int i;
+       char status_register = 0;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       for (i = 0; i < TIMEOUT; i++) {
+               status_register = ReadStatusRegister();
+               if ((status_register & WEL)) {
+                       ErrorCode = NO_ERR;
+                       break;
+               }
+               ErrorCode = POLL_TIMEOUT;       /* Time out error */
+       };
+
+       return ErrorCode;
+}
+
+ERROR_CODE Wait_For_Status(char Statusbit)
+{
+       int i;
+       char status_register = 0xFF;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       for (i = 0; i < TIMEOUT; i++) {
+               status_register = ReadStatusRegister();
+               if (!(status_register & Statusbit)) {
+                       ErrorCode = NO_ERR;
+                       break;
+               }
+               ErrorCode = POLL_TIMEOUT;       /* Time out error */
+       };
+
+       return ErrorCode;
+}
+
+char ReadStatusRegister(void)
+{
+       char status_register = 0;
+
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));      /* Turn on the SPI */
+
+       *pSPI_TDBR = SPI_RDSR;  /* send instruction to read status register */
+       sync();
+       Wait_For_SPIF();        /*wait until the instruction has been sent */
+       *pSPI_TDBR = 0;         /*send dummy to receive the status register */
+       sync();
+       Wait_For_SPIF();        /*wait until the data has been sent */
+       status_register = *pSPI_RDBR;   /*read the status register */
+
+       SPI_OFF();              /* Turn off the SPI */
+
+       return status_register;
+}
+
+ERROR_CODE GetSectorNumber(unsigned long ulOffset, int *pnSector)
+{
+       int nSector = 0;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       if (ulOffset > (NUM_SECTORS * 0x10000 - 1)) {
+               ErrorCode = INVALID_SECTOR;
+               return ErrorCode;
+       }
+
+       nSector = (int)ulOffset / 0x10000;
+       *pnSector = nSector;
+
+       return ErrorCode;
+}
+
+ERROR_CODE EraseBlock(int nBlock)
+{
+       unsigned long ulSectorOff = 0x0, ShiftValue;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       /* if the block is invalid just return */
+       if ((nBlock < 0) || (nBlock > NUM_SECTORS)) {
+               ErrorCode = INVALID_BLOCK;
+               return ErrorCode;
+       }
+       /* figure out the offset of the block in flash */
+       if ((nBlock >= 0) && (nBlock < NUM_SECTORS)) {
+               ulSectorOff = (nBlock * SECTOR_SIZE);
+
+       } else {
+               ErrorCode = INVALID_BLOCK;
+               return ErrorCode;
+       }
+
+       /* A write enable instruction must previously have been executed */
+       SendSingleCommand(SPI_WREN);
+
+       /* The status register will be polled to check the write enable latch "WREN" */
+       ErrorCode = Wait_For_WEL();
+
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Erase block error\n");
+               return ErrorCode;
+       } else
+
+       /* Turn on the SPI to send single commands */
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+       /*
+        * Send the erase block command to the flash followed by the 24 address
+        * to point to the start of a sector
+        */
+       *pSPI_TDBR = SPI_SE;
+       sync();
+       Wait_For_SPIF();
+       /* Send the highest byte of the 24 bit address at first */
+       ShiftValue = (ulSectorOff >> 16);
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /* Send the middle byte of the 24 bit address  at second */
+       ShiftValue = (ulSectorOff >> 8);
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /* Send the lowest byte of the 24 bit address finally */
+       *pSPI_TDBR = ulSectorOff;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+
+       /* Turns off the SPI */
+       SPI_OFF();
+
+       /* Poll the status register to check the Write in Progress bit */
+       /* Sector erase takes time */
+       ErrorCode = Wait_For_Status(WIP);
+
+       /* block erase should be complete */
+       return ErrorCode;
+}
+
+/*
+ * ERROR_CODE ReadData()
+ * Read a value from flash for verify purpose
+ * Inputs:     unsigned long ulStart - holds the SPI start address
+ *                     int pnData - pointer to store value read from flash
+ *                     long lCount - number of elements to read
+ */
+ERROR_CODE ReadData(unsigned long ulStart, long lCount, int *pnData)
+{
+       unsigned long ShiftValue;
+       char *cnData;
+       int i;
+
+       /* Pointer cast to be able to increment byte wise */
+
+       cnData = (char *)pnData;
+       /* Start SPI interface */
+       SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+
+#ifdef CONFIG_SPI_FLASH_FAST_READ
+       /* Send the read command to SPI device */
+       *pSPI_TDBR = SPI_FAST_READ;
+#else
+       /* Send the read command to SPI device */
+       *pSPI_TDBR = SPI_READ;
+#endif
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /* Send the highest byte of the 24 bit address at first */
+       ShiftValue = (ulStart >> 16);
+       /* Send the byte to the SPI device */
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /* Send the middle byte of the 24 bit address  at second */
+       ShiftValue = (ulStart >> 8);
+       /* Send the byte to the SPI device */
+       *pSPI_TDBR = ShiftValue;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /* Send the lowest byte of the 24 bit address finally */
+       *pSPI_TDBR = ulStart;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+
+#ifdef CONFIG_SPI_FLASH_FAST_READ
+       /* Send dummy for FAST_READ */
+       *pSPI_TDBR = 0;
+       sync();
+       /* Wait until the instruction has been sent */
+       Wait_For_SPIF();
+#endif
+
+       /* After the SPI device address has been placed on the MOSI pin the data can be */
+       /* received on the MISO pin. */
+       for (i = 0; i < lCount; i++) {
+               *pSPI_TDBR = 0;
+               sync();
+               while (!(*pSPI_STAT & RXS)) ;
+               *cnData++ = *pSPI_RDBR;
+
+               if ((i >= SECTOR_SIZE) && (i % SECTOR_SIZE == 0))
+                       printf(".");
+       }
+
+       /* Turn off the SPI */
+       SPI_OFF();
+
+       return NO_ERR;
+}
+
+ERROR_CODE WriteFlash(unsigned long ulStartAddr, long lTransferCount,
+                     int *iDataSource, long *lWriteCount)
+{
+
+       unsigned long ulWAddr;
+       long lWTransferCount = 0;
+       int i;
+       char iData;
+       char *temp = (char *)iDataSource;
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       /* First, a Write Enable Command must be sent to the SPI. */
+       SendSingleCommand(SPI_WREN);
+
+       /*
+        * Second, the SPI Status Register will be tested whether the
+        * Write Enable Bit has been set
+        */
+       ErrorCode = Wait_For_WEL();
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Write Time Out\n");
+               return ErrorCode;
+       } else
+               /* Third, the 24 bit address will be shifted out
+                * the SPI MOSI bytewise.
+                * Turns the SPI on
+                */
+               SetupSPI((COMMON_SPI_SETTINGS | TIMOD01));
+       *pSPI_TDBR = SPI_PP;
+       sync();
+       /*wait until the instruction has been sent */
+       Wait_For_SPIF();
+       ulWAddr = (ulStartAddr >> 16);
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       /*wait until the instruction has been sent */
+       Wait_For_SPIF();
+       ulWAddr = (ulStartAddr >> 8);
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       /*wait until the instruction has been sent */
+       Wait_For_SPIF();
+       ulWAddr = ulStartAddr;
+       *pSPI_TDBR = ulWAddr;
+       sync();
+       /*wait until the instruction has been sent */
+       Wait_For_SPIF();
+       /*
+        * Fourth, maximum number of 256 bytes will be taken from the Buffer
+        * and sent to the SPI device.
+        */
+       for (i = 0; (i < lTransferCount) && (i < 256); i++, lWTransferCount++) {
+               iData = *temp;
+               *pSPI_TDBR = iData;
+               sync();
+               /*wait until the instruction has been sent */
+               Wait_For_SPIF();
+               temp++;
+       }
+
+       /* Turns the SPI off */
+       SPI_OFF();
+
+       /*
+        * Sixth, the SPI Write in Progress Bit must be toggled to ensure the
+        * programming is done before start of next transfer
+        */
+       ErrorCode = Wait_For_Status(WIP);
+
+       if (POLL_TIMEOUT == ErrorCode) {
+               printf("SPI Program Time out!\n");
+               return ErrorCode;
+       } else
+
+               *lWriteCount = lWTransferCount;
+
+       return ErrorCode;
+}
+
+ERROR_CODE WriteData(unsigned long ulStart, long lCount, int *pnData)
+{
+
+       unsigned long ulWStart = ulStart;
+       long lWCount = lCount, lWriteCount;
+       long *pnWriteCount = &lWriteCount;
+
+       ERROR_CODE ErrorCode = NO_ERR;
+
+       while (lWCount != 0) {
+               ErrorCode = WriteFlash(ulWStart, lWCount, pnData, pnWriteCount);
+
+               /*
+                * After each function call of WriteFlash the counter
+                * must be adjusted
+                */
+               lWCount -= *pnWriteCount;
+
+               /* Also, both address pointers must be recalculated. */
+               ulWStart += *pnWriteCount;
+               pnData += *pnWriteCount / 4;
+       }
+
+       /* return the appropriate error code */
+       return ErrorCode;
+}
+
+#endif                         /* CONFIG_SPI */
diff --git a/board/bf537-stamp/u-boot.lds.S b/board/bf537-stamp/u-boot.lds.S
new file mode 100644 (file)
index 0000000..3fb2d0c
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * U-boot - u-boot.lds.S
+ *
+ * Copyright (c) 2005-2007 Analog Device Inc.
+ *
+ * (C) Copyright 2000-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
+ */
+
+#include <config.h>
+
+OUTPUT_ARCH(bfin)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+MEMORY
+ {
+ ram :            ORIGIN = (CFG_MONITOR_BASE), LENGTH = (256 * 1024)
+ l1_code : ORIGIN = 0xFFA00000, LENGTH = 0xC000
+ l1_data : ORIGIN = 0xFF900000, LENGTH = 0x4000
+ }
+
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS; /*0x1000;*/
+  .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) }
+  . = CFG_MONITOR_BASE;
+  .text      :
+  {
+    /* WARNING - the following is hand-optimized to fit within */
+    /* the sector before the environment sector. If it throws  */
+    /* an error during compilation remove an object here to get        */
+    /* it linked after the configuration sector.               */
+
+    cpu/bf537/start.o          (.text)
+    cpu/bf537/start1.o         (.text)
+    cpu/bf537/traps.o          (.text)
+    cpu/bf537/interrupt.o      (.text)
+    cpu/bf537/serial.o         (.text)
+    common/dlmalloc.o          (.text)
+/*  lib_blackfin/bf533_string.o        (.text) */
+/*  lib_generic/vsprintf.o     (.text) */
+    lib_generic/crc32.o                (.text)
+/*  lib_generic/zlib.o         (.text) */
+/*  board/bf537-stamp/bf537-stamp.o            (.text) */
+
+    . = DEFINED(env_offset) ? env_offset : .;
+    common/environment.o       (.text)
+
+    *(EXCLUDE_FILE (board/bf537-stamp/post-memory.o) .text)
+    *(.fixup)
+    *(.got1)
+  }  > ram
+  _etext = .;
+  PROVIDE (etext = .);
+  .text_l1     :
+  {
+  . = ALIGN(4) ;
+  _text_l1 = .;
+  PROVIDE (text_l1 = .);
+  board/bf537-stamp/post-memory.o   (.text)
+  . = ALIGN(4) ;
+  _etext_l1 = .;
+  PROVIDE (etext_l1 = .);
+  } > l1_code AT > ram
+
+  .rodata :
+  {
+    . = ALIGN(4);
+    *(EXCLUDE_FILE (board/bf537-stamp/post-memory.o) .rodata)
+    *(EXCLUDE_FILE (board/bf537-stamp/post-memory.o) .rodata1)
+    *(EXCLUDE_FILE (board/bf537-stamp/post-memory.o) .rodata.str1.4)
+    *(.eh_frame)
+    . = ALIGN(4);
+  } > ram
+
+  . = ALIGN(4);
+  _erodata = .;
+  PROVIDE (erodata = .);
+  .rodata_l1 :
+ {
+   . = ALIGN(4) ;
+   _rodata_l1 = .;
+   PROVIDE (rodata_l1 = .);
+   board/bf537-stamp/post-memory.o (.rodata)
+   board/bf537-stamp/post-memory.o (.rodata1)
+   board/bf537-stamp/post-memory.o (.rodata.str1.4)
+   . = ALIGN(4) ;
+   _erodata_l1 = .;
+   PROVIDE(erodata_l1 = .);
+ } > l1_data AT > ram
+
+  .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
+  } > ram
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  ___u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) } > ram
+  ___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       :
+  {
+  __bss_start = .;
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  } > ram
+  _end = . ;
+  PROVIDE (end = .);
+}
diff --git a/board/bf561-ezkit/Makefile b/board/bf561-ezkit/Makefile
new file mode 100644 (file)
index 0000000..a3c2e5b
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Device Inc.
+#
+# (C) Copyright 2000-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
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS) u-boot.lds
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+u-boot.lds: u-boot.lds.S
+       $(CPP) $(CPPFLAGS) -P -Ubfin $^ > $@.tmp
+       mv -f $@.tmp $@
+
+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/bf561-ezkit/bf561-ezkit.c b/board/bf561-ezkit/bf561-ezkit.c
new file mode 100644 (file)
index 0000000..989b019
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * U-boot - ezkit561.c
+ *
+ * Copyright (c) 2005 Bas Vermeulen <bas@buyways.nl>
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/io.h>
+
+int checkboard(void)
+{
+       printf("CPU:   ADSP BF561\n");
+       printf("Board: ADI BF561 EZ-Kit Lite board\n");
+       printf("       Support: http://blackfin.uclinux.org/\n");
+       return 0;
+}
+
+long int initdram(int board_type)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+#ifdef DEBUG
+       int brate;
+       char *tmp = getenv("baudrate");
+       brate = simple_strtoul(tmp, NULL, 16);
+       printf("Serial Port initialized with Baud rate = %x\n", brate);
+       printf("SDRAM attributes:\n");
+       printf("tRCD %d SCLK Cycles,tRP %d SCLK Cycles,tRAS %d SCLK Cycles"
+              "tWR %d SCLK Cycles,CAS Latency %d SCLK cycles \n",
+              3, 3, 6, 2, 3);
+       printf("SDRAM Begin: 0x%x\n", CFG_SDRAM_BASE);
+       printf("Bank size = %d MB\n", CFG_MAX_RAM_SIZE >> 20);
+#endif
+       gd->bd->bi_memstart = CFG_SDRAM_BASE;
+       gd->bd->bi_memsize = CFG_MAX_RAM_SIZE;
+       return CFG_MAX_RAM_SIZE;
+}
+
+#if defined(CONFIG_MISC_INIT_R)
+/* miscellaneous platform dependent initialisations */
+int misc_init_r(void)
+{
+       /* Keep PF12 low to be able to drive the USB-LAN Extender */
+       *pFIO0_DIR = 0x0000;
+       *pFIO0_FLAG_C = 0x1000; /* Clear PF12 */
+       sync();
+       *pFIO0_POLAR = 0x0000;
+       sync();
+
+       return 0;
+}
+#endif
diff --git a/board/bf561-ezkit/config.mk b/board/bf561-ezkit/config.mk
new file mode 100644 (file)
index 0000000..a623c3d
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# TEXT_BASE should be defined as the MAX_SDRAM Address - 256k bytes
+#  256k is defined as CFG_MONITOR_LEN in ./include/configs/<board>.h
+TEXT_BASE = 0x03FC0000
diff --git a/board/bf561-ezkit/u-boot.lds.S b/board/bf561-ezkit/u-boot.lds.S
new file mode 100644 (file)
index 0000000..84df5fc
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * U-boot - u-boot.lds.S
+ *
+ * Copyright (c) 2005-2007 Analog Device Inc.
+ *
+ * (C) Copyright 2000-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
+ */
+
+#include <config.h>
+
+OUTPUT_ARCH(bfin)
+OUTPUT_ARCH(bfin)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+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) }
+  . = CFG_MONITOR_BASE;
+  .text      :
+  {
+    /* WARNING - the following is hand-optimized to fit within */
+    /* the sector before the environment sector. If it throws  */
+    /* an error during compilation remove an object here to get        */
+    /* it linked after the configuration sector.               */
+
+    cpu/bf561/start.o          (.text)
+    cpu/bf561/start1.o         (.text)
+    cpu/bf561/traps.o          (.text)
+    cpu/bf561/interrupt.o      (.text)
+    cpu/bf561/serial.o         (.text)
+    common/dlmalloc.o          (.text)
+/*  lib_blackfin/bf533_string.o        (.text) */
+/*  lib_generic/vsprintf.o     (.text) */
+    lib_generic/crc32.o                (.text)
+    lib_generic/zlib.o         (.text)
+    board/bf561-ezkit/bf561-ezkit.o            (.text)
+
+    . = DEFINED(env_offset) ? env_offset : .;
+    common/environment.o       (.text)
+
+    *(.text)
+    *(.fixup)
+    *(.got1)
+  }
+  _etext = .;
+  PROVIDE (etext = .);
+  .rodata    :
+  {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x00FF) & 0xFFFFFF00;
+  _erotext = .;
+  PROVIDE (erotext = .);
+  .reloc   :
+  {
+    *(.got)
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
+  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  ___u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  ___u_boot_cmd_end = .;
+
+
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(256);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(256);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
index a42904cf735e4b03aca54ffd192a4dcaee45b352..419232483606a9acd11628f9caa27e643569f044 100644 (file)
@@ -477,11 +477,14 @@ void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_ta
 static struct pci_config_table pci_mpc85xxcds_config_table[] = {
        {0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}},
        {0x1106, 0x0686, PCI_ANY_ID, 1, 2, 0, mpc85xx_config_via, {0,0,0}},
-       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1, mpc85xx_config_via_usbide, {0,0,0}},
+       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1,
+               mpc85xx_config_via_usbide, {0,0,0}},
        {0x1105, 0x3038, PCI_ANY_ID, 1, 2, 2, mpc85xx_config_via_usb, {0,0,0}},
        {0x1106, 0x3038, PCI_ANY_ID, 1, 2, 3, mpc85xx_config_via_usb2, {0,0,0}},
-       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5, mpc85xx_config_via_power, {0,0,0}},
-       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}}
+       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5,
+               mpc85xx_config_via_power, {0,0,0}},
+       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}},
+       {},
 };
 
 static struct pci_controller hose[] = {
index 1bea0074fa1c7b5da9bbf2a7139f8badd0ed7fa7..dc87a122a100621e88138fe34b5f1a709b96d524 100644 (file)
@@ -69,6 +69,7 @@ SECTIONS
     cpu/mpc85xx/interrupts.o (.text)
     cpu/mpc85xx/cpu_init.o (.text)
     cpu/mpc85xx/cpu.o (.text)
+    drivers/tsec.o (.text)
     cpu/mpc85xx/speed.o (.text)
     cpu/mpc85xx/pci.o (.text)
     common/dlmalloc.o (.text)
index 978bda5e4dc20d76312b4f97fee557f7299b70f5..d468f5b618a82c43c8855417b5b7d42ed7dd7ebf 100644 (file)
@@ -64,8 +64,9 @@ tlb1_entry:
        /*
         * Number of TLB0 and TLB1 entries in the following table
         */
-       .long 13
+       .long (2f-1f)/16
 
+1:
 #if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
        /*
         * TLB0         4K      Non-cacheable, guarded
@@ -134,7 +135,7 @@ tlb1_entry:
 
        /*
         * TLB 1:       256M    Non-cacheable, guarded
-        * 0x80000000   256M    PCI1 MEM First half
+        * 0x80000000   256M    PCI1 MEM
         */
        .long TLB1_MAS0(1, 1, 0)
        .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
@@ -143,40 +144,37 @@ tlb1_entry:
 
        /*
         * TLB 2:       256M    Non-cacheable, guarded
-        * 0x90000000   256M    PCI1 MEM Second half
+        * 0x90000000   256M    PCI2 MEM
         */
        .long TLB1_MAS0(1, 2, 0)
        .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
-       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE + 0x10000000),
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE),
                        0,0,0,0,1,0,1,0)
-       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE + 0x10000000),
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE),
                        0,0,0,0,0,1,0,1,0,1)
 
        /*
-        * TLB 3:       256M    Non-cacheable, guarded
-        * 0xa0000000   256M    PCI2 MEM First half
+        * TLB 3:       1GB     Non-cacheable, guarded
+        * 0xa0000000   256M    PEX MEM First half
+        * 0xb0000000   256M    PEX MEM Second half
+        * 0xc0000000   256M    Rapid IO MEM First half
+        * 0xd0000000   256M    Rapid IO MEM Second half
         */
        .long TLB1_MAS0(1, 3, 0)
-       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
-       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE), 0,0,0,0,1,0,1,0)
-       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1G)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PEX_MEM_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PEX_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
 
        /*
-        * TLB 4:       256M    Non-cacheable, guarded
-        * 0xb0000000   256M    PCI2 MEM Second half
+        * TLB 4:       Reserved for future usage
         */
-       .long TLB1_MAS0(1, 4, 0)
-       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
-       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE + 0x10000000),
-                       0,0,0,0,1,0,1,0)
-       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE + 0x10000000),
-                       0,0,0,0,0,1,0,1,0,1)
 
        /*
         * TLB 5:       64M     Non-cacheable, guarded
         * 0xe000_0000  1M      CCSRBAR
-        * 0xe200_0000  16M     PCI1 IO
-        * 0xe300_0000  16M     PCI2 IO
+        * 0xe200_0000  8M      PCI1 IO
+        * 0xe280_0000  8M      PCI2 IO
+        * 0xe300_0000  16M     PEX IO
         */
        .long TLB1_MAS0(1, 5, 0)
        .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
@@ -200,19 +198,22 @@ tlb1_entry:
        .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)
        .long TLB1_MAS2(E500_TLB_EPN(CADMUS_BASE_ADDR), 0,0,0,0,1,0,1,0)
        .long TLB1_MAS3(E500_TLB_RPN(CADMUS_BASE_ADDR), 0,0,0,0,0,1,0,1,0,1)
-
+2:
        entry_end
 
 /*
  * LAW(Local Access Window) configuration:
  *
  * 0x0000_0000     0x7fff_ffff     DDR                     2G
- * 0x8000_0000     0x9fff_ffff     PCI1 MEM                512M
- * 0xa000_0000     0xbfff_ffff     PCI2 MEM                512M
+ * 0x8000_0000     0x8fff_ffff     PCI1 MEM                256M
+ * 0x9000_0000     0x9fff_ffff     PCI2 MEM                256M
+ * 0xa000_0000     0xbfff_ffff     PEX MEM                 512M
+ * 0xc000_0000     0xdfff_ffff     RapidIO                 512M
  * 0xe000_0000     0xe000_ffff     CCSR                    1M
- * 0xe200_0000     0xe20f_ffff     PCI1 IO                 1M
- * 0xe210_0000     0xe21f_ffff     PCI2 IO                 1M
- * 0xf000_0000     0xf7ff_ffff     SDRAM                   128M
+ * 0xe200_0000     0xe27f_ffff     PCI1 IO                 8M
+ * 0xe280_0000     0xe2ff_ffff     PCI2 IO                 8M
+ * 0xe300_0000     0xe3ff_ffff     PEX IO                  16M
+ * 0xf000_0000     0xf3ff_ffff     SDRAM                   64M
  * 0xf800_0000     0xf80f_ffff     NVRAM/CADMUS (*)        1M
  * 0xff00_0000     0xff7f_ffff     FLASH (2nd bank)        8M
  * 0xff80_0000     0xffff_ffff     FLASH (boot bank)       8M
@@ -229,27 +230,39 @@ tlb1_entry:
 #define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN)
 
 #define LAWBAR1 ((CFG_PCI1_MEM_BASE>>12) & 0xfffff)
-#define LAWAR1         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M))
+#define LAWAR1         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_256M))
 
 #define LAWBAR2 ((CFG_PCI2_MEM_BASE>>12) & 0xfffff)
-#define LAWAR2         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M))
+#define LAWAR2         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_256M))
 
 #define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff)
-#define LAWAR3         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_1M))
+#define LAWAR3         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_8M))
 
 #define LAWBAR4 ((CFG_PCI2_IO_PHYS>>12) & 0xfffff)
-#define LAWAR4         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_1M))
+#define LAWAR4         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_8M))
 
 /* LBC window - maps 256M 0xf0000000 -> 0xffffffff */
 #define LAWBAR5 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff)
 #define LAWAR5         (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
 
+#define LAWBAR6 ((CFG_PEX_MEM_BASE>>12) & 0xfffff)
+#define LAWAR6         (LAWAR_EN | LAWAR_TRGT_IF_PEX | (LAWAR_SIZE & LAWAR_SIZE_512M))
+
+#define LAWBAR7 ((CFG_PEX_IO_PHYS>>12) & 0xfffff)
+#define LAWAR7         (LAWAR_EN | LAWAR_TRGT_IF_PEX | (LAWAR_SIZE & LAWAR_SIZE_16M))
+
+#define LAWBAR8 ((CFG_RIO_MEM_BASE>>12) & 0xfffff)
+#define LAWAR8  (LAWAR_EN | LAWAR_TRGT_IF_RIO | (LAWAR_SIZE & LAWAR_SIZE_512M))
+
        .section .bootpg, "ax"
        .globl  law_entry
 
 law_entry:
        entry_start
-       .long 6
+       .long (4f-3f)/8
+3:
        .long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2,LAWBAR3,LAWAR3
-       .long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5
+       .long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5,LAWBAR6,LAWAR6,LAWBAR7,LAWAR7
+       .long LAWBAR8,LAWAR8
+4:
        entry_end
index 7433ebf25bc7c96daa838817b07e15279d63efa2..929ff2e66292aca149e8308c8e278c995a54e919 100644 (file)
@@ -51,6 +51,7 @@ int checkboard (void)
 {
        volatile immap_t *immap = (immap_t *) CFG_CCSRBAR;
        volatile ccsr_gur_t *gur = &immap->im_gur;
+       volatile ccsr_local_ecm_t *ecm = &immap->im_local_ecm;
 
        /* PCI slot in USER bits CSR[6:7] by convention. */
        uint pci_slot = get_pci_slot ();
@@ -89,6 +90,12 @@ int checkboard (void)
         */
        local_bus_init ();
 
+       /*
+        * Fix CPU2 errata: A core hang possible while executing a
+        * msync instruction and a snoopable transaction from an I/O
+        * master tagged to make quick forward progress is present.
+        */
+       ecm->eebpcr |= (1 << 16);
 
        /*
         * Hack TSEC 3 and 4 IO voltages.
@@ -303,11 +310,14 @@ void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_ta
 static struct pci_config_table pci_mpc85xxcds_config_table[] = {
        {0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}},
        {0x1106, 0x0686, PCI_ANY_ID, 1, 2, 0, mpc85xx_config_via, {0,0,0}},
-       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1, mpc85xx_config_via_usbide, {0,0,0}},
+       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1,
+               mpc85xx_config_via_usbide, {0,0,0}},
        {0x1105, 0x3038, PCI_ANY_ID, 1, 2, 2, mpc85xx_config_via_usb, {0,0,0}},
        {0x1106, 0x3038, PCI_ANY_ID, 1, 2, 3, mpc85xx_config_via_usb2, {0,0,0}},
-       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5, mpc85xx_config_via_power, {0,0,0}},
-       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}}
+       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5,
+               mpc85xx_config_via_power, {0,0,0}},
+       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}},
+       {},
 };
 
 static struct pci_controller hose[] = {
index 2c8fe9603d9121882c49752a959458c5ee4fd6ea..c1f3495d7590f6e78f18dfa7782d6cf3930077bc 100644 (file)
@@ -69,6 +69,7 @@ SECTIONS
     cpu/mpc85xx/interrupts.o (.text)
     cpu/mpc85xx/cpu_init.o (.text)
     cpu/mpc85xx/cpu.o (.text)
+    drivers/tsec.o (.text)
     cpu/mpc85xx/speed.o (.text)
     cpu/mpc85xx/pci.o (.text)
     common/dlmalloc.o (.text)
index d980ea63102ada4fdd480016b569ed130848dd91..704bf03164a42d6800a952293a4852ff29c16f99 100644 (file)
@@ -474,11 +474,14 @@ void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_ta
 static struct pci_config_table pci_mpc85xxcds_config_table[] = {
        {0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}},
        {0x1106, 0x0686, PCI_ANY_ID, 1, 2, 0, mpc85xx_config_via, {0,0,0}},
-       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1, mpc85xx_config_via_usbide, {0,0,0}},
+       {0x1106, 0x0571, PCI_ANY_ID, 1, 2, 1,
+               mpc85xx_config_via_usbide, {0,0,0}},
        {0x1105, 0x3038, PCI_ANY_ID, 1, 2, 2, mpc85xx_config_via_usb, {0,0,0}},
        {0x1106, 0x3038, PCI_ANY_ID, 1, 2, 3, mpc85xx_config_via_usb2, {0,0,0}},
-       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5, mpc85xx_config_via_power, {0,0,0}},
-       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}}
+       {0x1106, 0x3058, PCI_ANY_ID, 1, 2, 5,
+               mpc85xx_config_via_power, {0,0,0}},
+       {0x1106, 0x3068, PCI_ANY_ID, 1, 2, 6, mpc85xx_config_via_ac97, {0,0,0}},
+       {},
 };
 
 
@@ -487,7 +490,7 @@ static struct pci_controller hose[] = {
        config_table: pci_mpc85xxcds_config_table,
        },
 #ifdef CONFIG_MPC85XX_PCI2
-       { }
+       {},
 #endif
 };
 
index 2aa2ad78fcd551b3e89fd8b1594b46eb2a37a04a..9285928dc428d89171745c1701628cb566dd0c7c 100644 (file)
@@ -69,6 +69,7 @@ SECTIONS
     cpu/mpc85xx/interrupts.o (.text)
     cpu/mpc85xx/cpu_init.o (.text)
     cpu/mpc85xx/cpu.o (.text)
+    drivers/tsec.o (.text)
     cpu/mpc85xx/speed.o (.text)
     cpu/mpc85xx/pci.o (.text)
     common/dlmalloc.o (.text)
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 dbed5971738324d24a63f9a750958c117533fb09..17e3568941006dfa6b539e196477dee5ec0b569a 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <74xx_7xx.h>
 #include "../../Marvell/include/memory.h"
 #include "../../Marvell/include/pci.h"
@@ -365,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;
                        }
                }
@@ -502,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;
 }
 
@@ -580,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;
@@ -855,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;
@@ -899,3 +900,22 @@ void board_prebootm_init ()
        flush_data_cache ();
        dcache_disable ();
 }
+
+
+int do_show_cfg(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int reset_sample_low;
+       unsigned int reset_sample_high;
+
+       GT_REG_READ(0x3c4, &reset_sample_low);
+       GT_REG_READ(0x3d4, &reset_sample_high);
+       printf("Reset configuration 0x%08x 0x%08x\n", reset_sample_low, reset_sample_high);
+
+       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 6bdfc1d1cc00e39386327ec2ad189f7d00447493..c094755351cdb831f346e359ba66cac68af87c44 100644 (file)
@@ -1504,6 +1504,8 @@ int setup_sdram (AUX_MEM_DIMM_INFO * info)
 
 /*     for (i = info->slot * 2; i < ((info->slot * 2) + info->banks); i++) */
        {
+               int l, l1;
+
                i = info->slot;
                DP (printf
                    ("\n*** Running a MRS cycle for bank %d ***\n", i));
@@ -1511,20 +1513,39 @@ int setup_sdram (AUX_MEM_DIMM_INFO * info)
                /* map the bank */
                memory_map_bank (i, 0, GB / 4);
 #if 1                          /* test only */
-               /* set SDRAM mode */ /* To_do check it */
+
+               tmp = GTREGREAD (SDRAM_MODE);
+               GT_REG_WRITE (EXTENDED_DRAM_MODE, 0x0);
+               GT_REG_WRITE (SDRAM_OPERATION, 0x4);
+               while (GTREGREAD (SDRAM_OPERATION) != 0) {
+                       DP (printf
+                           ("\n*** SDRAM_OPERATION 1418 after SDRAM_MODE: Module still busy ... please wait... ***\n"));
+               }
+
+               GT_REG_WRITE (SDRAM_MODE, tmp | 0x80);
                GT_REG_WRITE (SDRAM_OPERATION, 0x3);
-               check = GTREGREAD (SDRAM_OPERATION);
-               DP (printf
-                   ("\n*** SDRAM_OPERATION 1418 (0 = Normal Operation) = %08lx ***\n",
-                    check));
+               while (GTREGREAD (SDRAM_OPERATION) != 0) {
+                       DP (printf
+                           ("\n*** SDRAM_OPERATION 1418 after SDRAM_MODE: Module still busy ... please wait... ***\n"));
+               }
+               l1 = 0;
+               for (l=0;l<200;l++)
+                       l1 += GTREGREAD (SDRAM_OPERATION);
 
+               GT_REG_WRITE (SDRAM_MODE, tmp);
+               GT_REG_WRITE (SDRAM_OPERATION, 0x3);
+               while (GTREGREAD (SDRAM_OPERATION) != 0) {
+                       DP (printf
+                           ("\n*** SDRAM_OPERATION 1418 after SDRAM_MODE: Module still busy ... please wait... ***\n"));
+               }
 
                /* switch back to normal operation mode */
-               GT_REG_WRITE (SDRAM_OPERATION, 0);
-               check = GTREGREAD (SDRAM_OPERATION);
-               DP (printf
-                   ("\n*** SDRAM_OPERATION 1418 (0 = Normal Operation) = %08lx ***\n",
-                    check));
+               GT_REG_WRITE (SDRAM_OPERATION, 0x5);
+               while (GTREGREAD (SDRAM_OPERATION) != 0) {
+                       DP (printf
+                           ("\n*** SDRAM_OPERATION 1418 after SDRAM_MODE: Module still busy ... please wait... ***\n"));
+               }
+
 #endif /* test only */
                /* unmap the bank */
                memory_map_bank (i, 0, 0);
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;
similarity index 95%
rename from board/amcc/yellowstone/Makefile
rename to board/esd/mecp5200/Makefile
index 261e5d49cca695eb3542f293f8f6ac91fb1e6dde..45efdb0dec4c0176a4e2840363a08013394255f4 100644 (file)
@@ -1,5 +1,6 @@
+
 #
-# (C) Copyright 2002-2006
+# (C) Copyright 2003-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -26,13 +27,12 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(BOARD).a
 
 COBJS  = $(BOARD).o
-SOBJS  = init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
-$(LIB):        $(OBJS) $(SOBJS)
+$(LIB):        $(obj).depend $(OBJS)
        $(AR) $(ARFLAGS) $@ $(OBJS)
 
 clean:
diff --git a/board/esd/mecp5200/config.mk b/board/esd/mecp5200/config.mk
new file mode 100644 (file)
index 0000000..07b5de1
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# (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
+#
+
+#
+# IceCube board:
+#
+#      Valid values for TEXT_BASE are:
+#
+#      0xFFF00000   boot high (standard configuration)
+#      0xFF000000   boot low for 16 MiB boards
+#      0xFF800000   boot low for  8 MiB boards
+#      0x00100000   boot from RAM (for testing only)
+#
+
+sinclude $(TOPDIR)/board/$(BOARDDIR)/config.tmp
+
+ifndef TEXT_BASE
+## Standard: boot high
+TEXT_BASE = 0xFFF00000
+## For testing: boot from RAM
+# TEXT_BASE = 0x00100000
+endif
+
+PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)/board
diff --git a/board/esd/mecp5200/mecp5200.c b/board/esd/mecp5200/mecp5200.c
new file mode 100644 (file)
index 0000000..c4b91e9
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2004
+ * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * pf5200.c - main board support/init for the esd pf5200.
+ */
+
+#include <common.h>
+#include <mpc5xxx.h>
+#include <pci.h>
+#include <command.h>
+
+#include "mt46v16m16-75.h"
+
+void init_power_switch(void);
+
+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;
+       __asm__ volatile ("sync");
+
+       /* precharge all banks */
+       *(vu_long *) MPC5XXX_SDRAM_CTRL =
+           SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+       /* set mode register: extended mode */
+       *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
+       __asm__ volatile ("sync");
+
+       /* set mode register: reset DLL */
+       *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
+       __asm__ volatile ("sync");
+
+       /* precharge all banks */
+       *(vu_long *) MPC5XXX_SDRAM_CTRL =
+           SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+       /* auto refresh */
+       *(vu_long *) MPC5XXX_SDRAM_CTRL =
+           SDRAM_CONTROL | 0x80000004 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+       /* set mode register */
+       *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE;
+       __asm__ volatile ("sync");
+
+       /* normal operation */
+       *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
+       __asm__ volatile ("sync");
+}
+
+/*
+ * ATTENTION: Although partially referenced initdram does NOT make real use
+ *            use of CFG_SDRAM_BASE. The code does not work if CFG_SDRAM_BASE
+ *            is something else than 0x00000000.
+ */
+
+long int initdram(int board_type)
+{
+       ulong dramsize = 0;
+       ulong test1, test2;
+
+       /* setup SDRAM chip selects */
+       *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0x0000001e; /* 2G at 0x0 */
+       *(vu_long *) MPC5XXX_SDRAM_CS1CFG = 0x80000000; /* disabled */
+       __asm__ volatile ("sync");
+
+       /* setup config registers */
+       *(vu_long *) MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
+       *(vu_long *) MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
+       __asm__ volatile ("sync");
+
+       /* set tap delay */
+       *(vu_long *) MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY;
+       __asm__ volatile ("sync");
+
+       /* find RAM size using SDRAM CS0 only */
+       sdram_start(0);
+       test1 = get_ram_size(CFG_SDRAM_BASE, 0x80000000);
+       sdram_start(1);
+       test2 = get_ram_size(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;
+               /* let SDRAM CS1 start right after CS0 */
+               *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;      /* 2G */
+       } else {
+#if 0
+               *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0;  /* disabled */
+               /* let SDRAM CS1 start right after CS0 */
+               *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;      /* 2G */
+#else
+               *(vu_long *) MPC5XXX_SDRAM_CS0CFG =
+                   0x13 + __builtin_ffs(0x08000000 >> 20) - 1;
+               /* let SDRAM CS1 start right after CS0 */
+               *(vu_long *) MPC5XXX_SDRAM_CS1CFG = 0x08000000 + 0x0000001e;    /* 2G */
+#endif
+       }
+
+#if 0
+       /* find RAM size using SDRAM CS1 only */
+       sdram_start(0);
+       get_ram_size((ulong *) (CFG_SDRAM_BASE + dramsize), 0x80000000);
+       sdram_start(1);
+       get_ram_size((ulong *) (CFG_SDRAM_BASE + dramsize), 0x80000000);
+       sdram_start(0);
+#endif
+       /* set SDRAM CS1 size according to the amount of RAM found */
+
+       *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize;   /* disabled */
+
+       init_power_switch();
+       return (dramsize);
+}
+
+int checkboard(void)
+{
+       puts("Board: esd CPX CPU5200 (mecp5200)\n");
+       return 0;
+}
+
+void flash_preinit(void)
+{
+       /*
+        * Now, when we are in RAM, enable flash write
+        * access for detection process.
+        * Note that CS_BOOT cannot be cleared when
+        * executing in flash.
+        */
+       *(vu_long *) MPC5XXX_BOOTCS_CFG &= ~0x1;        /* clear RO */
+}
+
+void flash_afterinit(ulong size)
+{
+       if (size == CFG_FLASH_SIZE) {
+               /* adjust mapping */
+               *(vu_long *) MPC5XXX_BOOTCS_START =
+                   *(vu_long *) MPC5XXX_CS0_START =
+                   START_REG(CFG_BOOTCS_START | size);
+               *(vu_long *) MPC5XXX_BOOTCS_STOP =
+                   *(vu_long *) MPC5XXX_CS0_STOP =
+                   STOP_REG(CFG_BOOTCS_START | size, size);
+       }
+}
+
+#ifdef CONFIG_PCI
+static struct pci_controller hose;
+
+extern void pci_mpc5xxx_init(struct pci_controller *);
+
+void pci_init_board(void)
+{
+       pci_mpc5xxx_init(&hose);
+}
+#endif
+
+#if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
+
+#define GPIO_PSC1_4    0x01000000UL
+
+void init_ide_reset(void)
+{
+       debug("init_ide_reset\n");
+
+       /* Configure PSC1_4 as GPIO output for ATA reset */
+       *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4;
+       *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4;
+}
+
+void ide_set_reset(int idereset)
+{
+       debug("ide_reset(%d)\n", idereset);
+
+       if (idereset)
+               *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+       else
+               *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+}
+#endif                         /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+
+#define MPC5XXX_SIMPLEIO_GPIO_ENABLE       (MPC5XXX_GPIO + 0x0004)
+#define MPC5XXX_SIMPLEIO_GPIO_DIR          (MPC5XXX_GPIO + 0x000C)
+#define MPC5XXX_SIMPLEIO_GPIO_DATA_OUTPUT  (MPC5XXX_GPIO + 0x0010)
+#define MPC5XXX_SIMPLEIO_GPIO_DATA_INPUT   (MPC5XXX_GPIO + 0x0014)
+
+#define MPC5XXX_INTERRUPT_GPIO_ENABLE      (MPC5XXX_GPIO + 0x0020)
+#define MPC5XXX_INTERRUPT_GPIO_DIR         (MPC5XXX_GPIO + 0x0028)
+#define MPC5XXX_INTERRUPT_GPIO_DATA_OUTPUT (MPC5XXX_GPIO + 0x002C)
+#define MPC5XXX_INTERRUPT_GPIO_STATUS      (MPC5XXX_GPIO + 0x003C)
+
+#define GPIO_WU6       0x40000000UL
+#define GPIO_USB0       0x00010000UL
+#define GPIO_USB9       0x08000000UL
+#define GPIO_USB9S      0x00080000UL
+
+void init_power_switch(void)
+{
+       debug("init_power_switch\n");
+
+       /* Configure GPIO_WU6 as GPIO output for ATA reset */
+       *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WU6;
+       *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_WU6;
+       *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_WU6;
+       __asm__ volatile ("sync");
+
+       *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_DATA_OUTPUT &= ~GPIO_USB0;
+       *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_ENABLE |= GPIO_USB0;
+       *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_DIR |= GPIO_USB0;
+       __asm__ volatile ("sync");
+
+       *(vu_long *) MPC5XXX_INTERRUPT_GPIO_DATA_OUTPUT &= ~GPIO_USB9;
+       *(vu_long *) MPC5XXX_INTERRUPT_GPIO_ENABLE &= ~GPIO_USB9;
+       __asm__ volatile ("sync");
+
+       if ((*(vu_long *) MPC5XXX_INTERRUPT_GPIO_STATUS & GPIO_USB9S) == 0) {
+               *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_DATA_OUTPUT |= GPIO_USB0;
+               __asm__ volatile ("sync");
+       }
+}
diff --git a/board/esd/mecp5200/mt46v16m16-75.h b/board/esd/mecp5200/mt46v16m16-75.h
new file mode 100644 (file)
index 0000000..22d0a55
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * (C) Copyright 2004
+ * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#define SDRAM_DDR      1       /* is DDR */
+
+#if defined(CONFIG_MPC5200)
+/* Settings for XLB = 132 MHz */
+#define SDRAM_MODE     0x018D0000
+#define SDRAM_EMODE    0x40090000
+#define SDRAM_CONTROL  0x705f0f00
+#define SDRAM_CONFIG1  0x73722930
+#define SDRAM_CONFIG2  0x47770000
+#define SDRAM_TAPDELAY 0x10000000
+
+#else
+#error CONFIG_MPC5200 not defined
+#endif
diff --git a/board/esd/mecp5200/u-boot.lds b/board/esd/mecp5200/u-boot.lds
new file mode 100644 (file)
index 0000000..d999dd1
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * (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
+ */
+
+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
+{
+  /* 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)
+  }
+  .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 = .);
+}
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
+}
similarity index 60%
rename from board/mpc8641hpcn/pixis.c
rename to board/freescale/common/pixis.c
index 964a17ca0801ab8847c5c00864e3e5f2e6763111..af98157dfd724d51acedd911a5e74c6b2aacc616 100644 (file)
  */
 
 #include <common.h>
-#include <watchdog.h>
 #include <command.h>
+#include <watchdog.h>
 #include <asm/cache.h>
-#include <mpc86xx.h>
 
 #include "pixis.h"
 
 
+static ulong strfractoint(uchar *strptr);
+
+
+/*
+ * Simple board reset.
+ */
+void pixis_reset(void)
+{
+    out8(PIXIS_BASE + PIXIS_RST, 0);
+}
+
+
 /*
  * Per table 27, page 58 of MPC8641HPCN spec.
  */
@@ -235,7 +246,8 @@ void set_px_go_with_watchdog(void)
 }
 
 
-int disable_watchdog(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int pixis_disable_watchdog_cmd(cmd_tbl_t *cmdtp,
+                              int flag, int argc, char *argv[])
 {
        u8 tmp;
 
@@ -252,7 +264,7 @@ int disable_watchdog(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 }
 
 U_BOOT_CMD(
-          diswd, 1, 0, disable_watchdog,
+          diswd, 1, 0, pixis_disable_watchdog_cmd,
           "diswd       - Disable watchdog timer \n",
           NULL);
 
@@ -263,7 +275,7 @@ U_BOOT_CMD(
  * input: strptr i.e. argv[2]
  */
 
-ulong strfractoint(uchar *strptr)
+static ulong strfractoint(uchar *strptr)
 {
        int i, j, retval;
        int mulconst;
@@ -319,3 +331,142 @@ ulong strfractoint(uchar *strptr)
 
        return retval;
 }
+
+
+int
+pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       ulong val;
+       ulong corepll;
+
+       /*
+        * No args is a simple reset request.
+        */
+       if (argc <= 1) {
+               pixis_reset();
+               /* not reached */
+       }
+
+       if (strcmp(argv[1], "cf") == 0) {
+
+               /*
+                * Reset with frequency changed:
+                *    cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>
+                */
+               if (argc < 5) {
+                       puts(cmdtp->usage);
+                       return 1;
+               }
+
+               read_from_px_regs(0);
+
+               val = set_px_sysclk(simple_strtoul(argv[2], NULL, 10));
+
+               corepll = strfractoint(argv[3]);
+               val = val + set_px_corepll(corepll);
+               val = val + set_px_mpxpll(simple_strtoul(argv[4], NULL, 10));
+               if (val == 3) {
+                       puts("Setting registers VCFGEN0 and VCTL\n");
+                       read_from_px_regs(1);
+                       puts("Resetting board with values from ");
+                       puts("VSPEED0, VSPEED1, VCLKH, and VCLKL \n");
+                       set_px_go();
+               } else {
+                       puts(cmdtp->usage);
+                       return 1;
+               }
+
+               while (1) ;     /* Not reached */
+
+       } else if (strcmp(argv[1], "altbank") == 0) {
+
+               /*
+                * Reset using alternate flash bank:
+                */
+               if (argv[2] == 0) {
+                       /*
+                        * Reset from alternate bank without changing
+                        * frequency and without watchdog timer enabled.
+                        *      altbank
+                        */
+                       read_from_px_regs(0);
+                       read_from_px_regs_altbank(0);
+                       if (argc > 2) {
+                               puts(cmdtp->usage);
+                               return 1;
+                       }
+                       puts("Setting registers VCFGNE1, VBOOT, and VCTL\n");
+                       set_altbank();
+                       read_from_px_regs_altbank(1);
+                       puts("Resetting board to boot from the other bank.\n");
+                       set_px_go();
+
+               } else if (strcmp(argv[2], "cf") == 0) {
+                       /*
+                        * Reset with frequency changed
+                        *    altbank cf <SYSCLK freq> <COREPLL ratio>
+                        *                              <MPXPLL ratio>
+                        */
+                       read_from_px_regs(0);
+                       read_from_px_regs_altbank(0);
+                       val = set_px_sysclk(simple_strtoul(argv[3], NULL, 10));
+                       corepll = strfractoint(argv[4]);
+                       val = val + set_px_corepll(corepll);
+                       val = val + set_px_mpxpll(simple_strtoul(argv[5],
+                                                                NULL, 10));
+                       if (val == 3) {
+                               puts("Setting registers VCFGEN0, VCFGEN1, VBOOT, and VCTL\n");
+                               set_altbank();
+                               read_from_px_regs(1);
+                               read_from_px_regs_altbank(1);
+                               puts("Enabling watchdog timer on the FPGA\n");
+                               puts("Resetting board with values from ");
+                               puts("VSPEED0, VSPEED1, VCLKH and VCLKL ");
+                               puts("to boot from the other bank.\n");
+                               set_px_go_with_watchdog();
+                       } else {
+                               puts(cmdtp->usage);
+                               return 1;
+                       }
+
+                       while (1) ;     /* Not reached */
+
+               } else if (strcmp(argv[2], "wd") == 0) {
+                       /*
+                        * Reset from alternate bank without changing
+                        * frequencies but with watchdog timer enabled:
+                        *    altbank wd
+                        */
+                       read_from_px_regs(0);
+                       read_from_px_regs_altbank(0);
+                       puts("Setting registers VCFGEN1, VBOOT, and VCTL\n");
+                       set_altbank();
+                       read_from_px_regs_altbank(1);
+                       puts("Enabling watchdog timer on the FPGA\n");
+                       puts("Resetting board to boot from the other bank.\n");
+                       set_px_go_with_watchdog();
+                       while (1) ;     /* Not reached */
+
+               } else {
+                       puts(cmdtp->usage);
+                       return 1;
+               }
+
+       } else {
+               puts(cmdtp->usage);
+               return 1;
+       }
+
+       return 0;
+}
+
+
+U_BOOT_CMD(
+       pixis_reset, CFG_MAXARGS, 1, pixis_reset_cmd,
+       "pixis_reset - Reset the board using the FPGA sequencer\n",
+       "    pixis_reset\n"
+       "    pixis_reset [altbank]\n"
+       "    pixis_reset altbank wd\n"
+       "    pixis_reset altbank cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n"
+       "    pixis_reset cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n"
+       );
similarity index 89%
rename from board/mpc8641hpcn/pixis.h
rename to board/freescale/common/pixis.h
index cd9a45db87d2f4e24cbd00739935d12fc769d259..ff62a62c74f44b0b218bea27cb1e7a46212aa5f8 100644 (file)
@@ -20,6 +20,7 @@
  * MA 02111-1307 USA
  */
 
+extern void pixis_reset(void);
 extern int set_px_sysclk(ulong sysclk);
 extern int set_px_mpxpll(ulong mpxpll);
 extern int set_px_corepll(ulong corepll);
@@ -28,6 +29,3 @@ extern void read_from_px_regs_altbank(int set);
 extern void set_altbank(void);
 extern void set_px_go(void);
 extern void set_px_go_with_watchdog(void);
-extern int disable_watchdog(cmd_tbl_t *cmdtp,
-                           int flag, int argc, char *argv[]);
-extern ulong strfractoint(uchar *strptr);
diff --git a/board/freescale/mpc8544ds/Makefile b/board/freescale/mpc8544ds/Makefile
new file mode 100644 (file)
index 0000000..bec2168
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# Copyright 2007 Freescale Semiconductor, Inc.
+# (C) Copyright 2001-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
+
+# ifneq ($(OBJTREE),$(SRCTREE))
+# $(shell mkdir -p $(obj)./common)
+# endif
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o \
+          ../common/pixis.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) crv $@ $(OBJS)
+
+clean:
+       rm -f $(OBJS) $(SOBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/freescale/mpc8544ds/config.mk b/board/freescale/mpc8544ds/config.mk
new file mode 100644 (file)
index 0000000..85663ef
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# Copyright 2007 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.
+#
+# 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
+#
+
+#
+# mpc8544ds board
+#
+ifndef TEXT_BASE
+TEXT_BASE = 0xfff80000
+endif
+
+PLATFORM_CPPFLAGS += -DCONFIG_E500=1
+PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1
+PLATFORM_CPPFLAGS += -DCONFIG_MPC8544=1
diff --git a/board/freescale/mpc8544ds/init.S b/board/freescale/mpc8544ds/init.S
new file mode 100644 (file)
index 0000000..296fee5
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2007 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <config.h>
+#include <mpc85xx.h>
+
+#define LAWAR_TRGT_PCI1                0x00000000
+#define LAWAR_TRGT_PCIE1       0x00200000
+#define LAWAR_TRGT_PCIE2       0x00100000
+#define LAWAR_TRGT_PCIE3       0x00300000
+#define LAWAR_TRGT_LBC         0x00400000
+#define LAWAR_TRGT_DDR         0x00f00000
+
+/*
+ * TLB0 and TLB1 Entries
+ *
+ * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR.
+ * However, CCSRBAR is then relocated to CFG_CCSRBAR right after
+ * these TLB entries are established.
+ *
+ * The TLB entries for DDR are dynamically setup in spd_sdram()
+ * and use TLB1 Entries 8 through 15 as needed according to the
+ * size of DDR memory.
+ *
+ * MAS0: tlbsel, esel, nv
+ * MAS1: valid, iprot, tid, ts, tsize
+ * MAS2: epn, sharen, x0, x1, w, i, m, g, e
+ * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr
+ */
+
+#define        entry_start \
+       mflr    r1      ;       \
+       bl      0f      ;
+
+#define        entry_end \
+0:     mflr    r0      ;       \
+       mtlr    r1      ;       \
+       blr             ;
+
+
+       .section        .bootpg, "ax"
+       .globl  tlb1_entry
+tlb1_entry:
+       entry_start
+
+       /*
+        * Number of TLB0 and TLB1 entries in the following table
+        */
+       .long (2f-1f)/16
+1:
+       /*
+        * TLB0         4K      Non-cacheable, guarded
+        * 0xff700000   4K      Initial CCSRBAR mapping
+        *
+        * This ends up at a TLB0 Index==0 entry, and must not collide
+        * with other TLB0 Entries.
+        */
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB0         16K     Cacheable, guarded
+        * Temporary Global data for initialization
+        *
+        * Use four 4K TLB0 entries.  These entries must be cacheable
+        * as they provide the bootstrap memory before the memory
+        * controler and real memory have been configured.
+        *
+        * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c,
+        * and must not collide with other TLB0 entries.
+        */
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR),
+                       0,0,0,0,0,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024),
+                       0,0,0,0,0,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024),
+                       0,0,0,0,0,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 8 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024),
+                       0,0,0,0,0,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+
+       /*
+        * TLB 0:       64M     Non-cacheable, guarded
+        * 0xfc000000   64M     Covers FLASH at 0xFE800000 and 0xFF800000
+        * Out of reset this entry is only 4K.
+        */
+       .long TLB1_MAS0(1, 0, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_BOOT_BLOCK), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_BOOT_BLOCK), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 1:       1G      Non-cacheable, guarded
+        * 0x80000000   1G      PCIE  8,9,a,b
+        */
+       .long TLB1_MAS0(1, 1, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1G)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCIE_PHYS),
+               0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCIE_PHYS),
+               0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 2:       256M    Non-cacheable, guarded
+        */
+       .long TLB1_MAS0(1, 2, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI_PHYS),
+                       0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI_PHYS),     0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 3:       256M    Non-cacheable, guarded
+        */
+       .long TLB1_MAS0(1, 3, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI_PHYS + 0x10000000),
+                       0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI_PHYS + 0x10000000),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 4:       64M     Non-cacheable, guarded
+        * 0xe000_0000  1M      CCSRBAR
+        * 0xe100_0000  255M    PCI IO range
+        */
+       .long TLB1_MAS0(1, 4, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1)
+
+#ifdef CFG_LBC_CACHE_BASE
+       /*
+        * TLB 5:       64M     Cacheable, non-guarded
+        */
+       .long TLB1_MAS0(1, 5, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_CACHE_BASE), 0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_CACHE_BASE), 0,0,0,0,0,1,0,1,0,1)
+#endif
+       /*
+        * TLB 6:       64M     Non-cacheable, guarded
+        * 0xf8000000   64M     PIXIS 0xF8000000 - 0xFBFFFFFF
+        */
+       .long TLB1_MAS0(1, 6, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_NONCACHE_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_NONCACHE_BASE), 0,0,0,0,0,1,0,1,0,1)
+2:
+       entry_end
+
+/*
+ * LAW(Local Access Window) configuration:
+ *
+ *
+ * Notes:
+ *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window.
+ *    If flash is 8M at default position (last 8M), no LAW needed.
+ *
+ * LAW 0 is reserved for boot mapping
+ */
+
+       .section .bootpg, "ax"
+       .globl  law_entry
+law_entry:
+       entry_start
+
+       .long (4f-3f)/8
+3:
+       .long   0
+       .long   (LAWAR_TRGT_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN
+
+       .long   (CFG_PCI1_MEM_BASE>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M)
+
+       .long   (CFG_PCI1_IO_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_16M)
+
+       .long   (CFG_LBC_CACHE_BASE>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M)
+
+       .long   (CFG_PCIE1_MEM_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCIE1 | (LAWAR_SIZE & LAWAR_SIZE_256M)
+
+       /* To keep to 10 LAWs, PCIE1_IO_PHYS must use top of mem region  */
+
+       .long   (CFG_PCIE2_MEM_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCIE2 | (LAWAR_SIZE & LAWAR_SIZE_512M)
+
+       .long   (CFG_PCIE2_IO_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCIE2 | (LAWAR_SIZE & LAWAR_SIZE_16M)
+
+       .long   (CFG_PCIE3_MEM_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCIE3 | (LAWAR_SIZE & LAWAR_SIZE_256M)
+
+       .long   (CFG_PCIE3_IO_PHYS>>12) & 0xfffff
+       .long   LAWAR_EN | LAWAR_TRGT_PCIE3 | (LAWAR_SIZE & LAWAR_SIZE_16M)
+4:
+       entry_end
diff --git a/board/freescale/mpc8544ds/mpc8544ds.c b/board/freescale/mpc8544ds/mpc8544ds.c
new file mode 100644 (file)
index 0000000..4ff1da9
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2007 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.
+ *
+ * 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 <asm/processor.h>
+#include <asm/immap_85xx.h>
+#include <spd.h>
+#include <miiphy.h>
+
+#include "../common/pixis.h"
+
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+extern void ft_cpu_setup(void *blob, bd_t *bd);
+#endif
+
+#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+extern void ddr_enable_ecc(unsigned int dram_size);
+#endif
+
+extern long int spd_sdram(void);
+
+void sdram_init(void);
+
+int board_early_init_f (void)
+{
+       return 0;
+}
+
+int checkboard (void)
+{
+       volatile immap_t *immap = (immap_t *) CFG_CCSRBAR;
+       volatile ccsr_gur_t *gur = &immap->im_gur;
+
+       if ((uint)&gur->porpllsr != 0xe00e0000) {
+               printf("immap size error %x\n",&gur->porpllsr);
+       }
+       printf ("Board: MPC8544DS\n");
+
+       return 0;
+}
+
+long int
+initdram(int board_type)
+{
+       long dram_size = 0;
+
+       puts("Initializing\n");
+
+       dram_size = spd_sdram();
+
+#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+       /*
+        * Initialize and enable DDR ECC.
+        */
+       ddr_enable_ecc(dram_size);
+#endif
+       puts("    DDR: ");
+       return dram_size;
+}
+
+#if defined(CFG_DRAM_TEST)
+int
+testdram(void)
+{
+       uint *pstart = (uint *) CFG_MEMTEST_START;
+       uint *pend = (uint *) CFG_MEMTEST_END;
+       uint *p;
+
+       printf("Testing DRAM from 0x%08x to 0x%08x\n",
+              CFG_MEMTEST_START,
+              CFG_MEMTEST_END);
+
+       printf("DRAM test phase 1:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0xaaaaaaaa;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0xaaaaaaaa) {
+                       printf ("DRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("DRAM test phase 2:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0x55555555;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0x55555555) {
+                       printf ("DRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("DRAM test passed.\n");
+       return 0;
+}
+#endif
+
+int last_stage_init(void)
+{
+       return 0;
+}
+
+
+unsigned long
+get_board_sys_clk(ulong dummy)
+{
+       u8 i, go_bit, rd_clks;
+       ulong val = 0;
+
+       go_bit = in8(PIXIS_BASE + PIXIS_VCTL);
+       go_bit &= 0x01;
+
+       rd_clks = in8(PIXIS_BASE + PIXIS_VCFGEN0);
+       rd_clks &= 0x1C;
+
+       /*
+        * Only if both go bit and the SCLK bit in VCFGEN0 are set
+        * should we be using the AUX register. Remember, we also set the
+        * GO bit to boot from the alternate bank on the on-board flash
+        */
+
+       if (go_bit) {
+               if (rd_clks == 0x1c)
+                       i = in8(PIXIS_BASE + PIXIS_AUX);
+               else
+                       i = in8(PIXIS_BASE + PIXIS_SPD);
+       } else {
+               i = in8(PIXIS_BASE + PIXIS_SPD);
+       }
+
+       i &= 0x07;
+
+       switch (i) {
+       case 0:
+               val = 33333333;
+               break;
+       case 1:
+               val = 40000000;
+               break;
+       case 2:
+               val = 50000000;
+               break;
+       case 3:
+               val = 66666666;
+               break;
+       case 4:
+               val = 83000000;
+               break;
+       case 5:
+               val = 100000000;
+               break;
+       case 6:
+               val = 133333333;
+               break;
+       case 7:
+               val = 166666666;
+               break;
+       }
+
+       return val;
+}
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void
+ft_board_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+       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/freescale/mpc8544ds/u-boot.lds b/board/freescale/mpc8544ds/u-boot.lds
new file mode 100644 (file)
index 0000000..1a8aaa9
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2007 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+SECTIONS
+{
+  .resetvec 0xFFFFFFFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .bootpg 0xFFFFF000 :
+  {
+    cpu/mpc85xx/start.o        (.bootpg)
+    board/freescale/mpc8544ds/init.o (.bootpg)
+  } = 0xffff
+
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc85xx/start.o        (.text)
+    board/freescale/mpc8544ds/init.o (.text)
+    cpu/mpc85xx/traps.o (.text)
+    cpu/mpc85xx/interrupts.o (.text)
+    cpu/mpc85xx/cpu_init.o (.text)
+    cpu/mpc85xx/cpu.o (.text)
+    cpu/mpc85xx/speed.o (.text)
+    common/dlmalloc.o (.text)
+    lib_generic/crc32.o (.text)
+    lib_ppc/extable.o (.text)
+    lib_generic/zlib.o (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+   }
+    _etext = .;
+    PROVIDE (etext = .);
+    .rodata    :
+   {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.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 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 700c9d9323f3fb1bec9ad29b7515ae81829c1b37..296099843421a0e489e47ffd843b75840b4d07fe 100644 (file)
 #include "mt48lc16m16a2-75.h"
 # endif
 #endif
+
+#ifdef CONFIG_LITE5200B_PM
+/* u-boot part of low-power mode implementation */
+#define SAVED_ADDR (*(void **)0x00000000)
+#define PSC2_4 0x02
+
+void lite5200b_wakeup(void)
+{
+       unsigned char wakeup_pin;
+       void (*linux_wakeup)(void);
+
+       /* check PSC2_4, if it's down "QT" is signaling we have a wakeup
+        * from low power mode */
+       *(vu_char *)MPC5XXX_WU_GPIO_ENABLE = PSC2_4;
+       __asm__ volatile ("sync");
+
+       wakeup_pin = *(vu_char *)MPC5XXX_WU_GPIO_DATA_I;
+       if (wakeup_pin & PSC2_4)
+               return;
+
+       /* acknowledge to "QT"
+        * by holding pin at 1 for 10 uS */
+       *(vu_char *)MPC5XXX_WU_GPIO_DIR = PSC2_4;
+       __asm__ volatile ("sync");
+       *(vu_char *)MPC5XXX_WU_GPIO_DATA_O = PSC2_4;
+       __asm__ volatile ("sync");
+       udelay(10);
+
+       /* put ram out of self-refresh */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL |= 0x80000000;   /* mode_en */
+       __asm__ volatile ("sync");
+       *(vu_long *)MPC5XXX_SDRAM_CTRL |= 0x50000000;   /* cke ref_en */
+       __asm__ volatile ("sync");
+       *(vu_long *)MPC5XXX_SDRAM_CTRL &= ~0x80000000;  /* !mode_en */
+       __asm__ volatile ("sync");
+       udelay(10); /* wait a bit */
+
+       /* jump back to linux kernel code */
+       linux_wakeup = SAVED_ADDR;
+       printf("\n\nLooks like we just woke, transferring control to 0x%08lx\n",
+                       linux_wakeup);
+       linux_wakeup();
+}
+#else
+#define lite5200b_wakeup()
+#endif
+
 #ifndef CFG_RAMBOOT
 static void sdram_start (int hi_addr)
 {
@@ -208,6 +255,8 @@ long int initdram (int board_type)
                __asm__ volatile ("sync");
        }
 
+       lite5200b_wakeup();
+
        return dramsize + dramsize2;
 }
 
index d49c0e7e6d58837ddfc75b5939d57ecceadf2db5..ecff8d741566235a78bab67ed6fdc8a920c60e1a 100644 (file)
@@ -1,4 +1,2 @@
+#
 TEXT_BASE = 0x00f80000
-
-# include NPE ethernet driver
-BOARDLIBS = $(obj)cpu/ixp/npe/libnpe.a
similarity index 90%
rename from board/ezkit533/Makefile
rename to board/jupiter/Makefile
index 4f3c22321a844b69ceeec10477d527112fda3607..aed3af000f16bb3ef017ac598b7b89c73b0ecd39 100644 (file)
@@ -1,9 +1,6 @@
+
 #
-# U-boot - Makefile
-#
-# Copyright (c) 2005 blackfin.uclinux.org
-#
-# (C) Copyright 2000-2006
+# (C) Copyright 2003-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -29,7 +26,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  = $(BOARD).o flash.o ezkit533.o
+COBJS  := $(BOARD).o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
@@ -38,6 +35,12 @@ 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
diff --git a/board/jupiter/config.mk b/board/jupiter/config.mk
new file mode 100644 (file)
index 0000000..5f4da96
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# (C) Copyright 2007
+# Heiko Schocher, DENX Software Engineering, hs@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
+#
+
+#
+# Jupiter board:
+#
+#      Valid values for TEXT_BASE are:
+#
+#      0xFFF00000   boot high (standard configuration)
+#      0x00100000   boot from RAM (for testing only)
+#
+
+ifndef TEXT_BASE
+## Standard: boot high
+TEXT_BASE = 0xFFF00000
+## For testing: boot from RAM
+# TEXT_BASE = 0x00100000
+endif
+
+PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)/board
+#PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -DDEBUG -I$(TOPDIR)/board
diff --git a/board/jupiter/jupiter.c b/board/jupiter/jupiter.c
new file mode 100644 (file)
index 0000000..04fda4a
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * (C) Copyright 2007
+ * Heiko Schocher, DENX Software Engineering, hs@denx.de.
+ *
+ * (C) Copyright 2004
+ * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <mpc5xxx.h>
+#include <pci.h>
+#include <asm/processor.h>
+
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
+
+#define SDRAM_DDR      0
+#if 1
+/* Settings Icecube */
+#define SDRAM_MODE     0x00CD0000
+#define SDRAM_CONTROL  0x504F0000
+#define SDRAM_CONFIG1  0xD2322800
+#define SDRAM_CONFIG2  0x8AD70000
+#else
+/*Settings Jupiter UB 1.0.0 */
+#define SDRAM_MODE     0x008D0000
+#define SDRAM_CONTROL  0xD04F0000
+#define SDRAM_CONFIG1  0xf7277f00
+#define SDRAM_CONFIG2  0x88b70004
+#endif
+
+#ifndef CFG_RAMBOOT
+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;
+       __asm__ volatile ("sync");
+
+       /* precharge all banks */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+#if SDRAM_DDR
+       /* set mode register: extended mode */
+       *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
+       __asm__ volatile ("sync");
+
+       /* set mode register: reset DLL */
+       *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
+       __asm__ volatile ("sync");
+#endif
+
+       /* precharge all banks */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+       /* auto refresh */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit;
+       __asm__ volatile ("sync");
+
+       /* set mode register */
+       *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE;
+       __asm__ volatile ("sync");
+
+       /* normal operation */
+       *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
+       __asm__ volatile ("sync");
+}
+#endif
+
+/*
+ * ATTENTION: Although partially referenced initdram does NOT make real use
+ *            use of CFG_SDRAM_BASE. The code does not work if CFG_SDRAM_BASE
+ *            is something else than 0x00000000.
+ */
+
+long int initdram (int board_type)
+{
+       ulong dramsize = 0;
+       ulong dramsize2 = 0;
+       uint svr, pvr;
+
+#ifndef CFG_RAMBOOT
+       ulong test1, test2;
+
+       /* setup SDRAM chip selects */
+       *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001e;/* 2G at 0x0 */
+       *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x80000000;/* disabled */
+       __asm__ volatile ("sync");
+
+       /* setup config registers */
+       *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1;
+       *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2;
+       __asm__ volatile ("sync");
+
+#if SDRAM_DDR
+       /* set tap delay */
+       *(vu_long *)MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY;
+       __asm__ volatile ("sync");
+#endif
+
+       /* find RAM size using SDRAM CS0 only */
+       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 */
+       *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;/* 2G */
+
+       /* find RAM size using SDRAM CS1 only */
+       if (!dramsize)
+               sdram_start(0);
+       test2 = test1 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x80000000);
+       if (!dramsize) {
+               sdram_start(1);
+               test2 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x80000000);
+       }
+       if (test1 > test2) {
+               sdram_start(0);
+               dramsize2 = test1;
+       } else {
+               dramsize2 = test2;
+       }
+
+       /* memory smaller than 1MB is impossible */
+       if (dramsize2 < (1 << 20)) {
+               dramsize2 = 0;
+       }
+
+       /* set SDRAM CS1 size according to the amount of RAM found */
+       if (dramsize2 > 0) {
+               *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize
+                       | (0x13 + __builtin_ffs(dramsize2 >> 20) - 1);
+       } else {
+               *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */
+       }
+
+#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;
+       }
+
+       /* retrieve size of memory connected to SDRAM CS1 */
+       dramsize2 = *(vu_long *)MPC5XXX_SDRAM_CS1CFG & 0xFF;
+       if (dramsize2 >= 0x13) {
+               dramsize2 = (1 << (dramsize2 - 0x13)) << 20;
+       } else {
+               dramsize2 = 0;
+       }
+
+#endif /* CFG_RAMBOOT */
+
+       /*
+        * On MPC5200B we need to set the special configuration delay in the
+        * DDR controller. Please refer to Freescale's AN3221 "MPC5200B SDRAM
+        * Initialization and Configuration", 3.3.1 SDelay--MBAR + 0x0190:
+        *
+        * "The SDelay should be written to a value of 0x00000004. It is
+        * required to account for changes caused by normal wafer processing
+        * parameters."
+        */
+       svr = get_svr();
+       pvr = get_pvr();
+       if ((SVR_MJREV(svr) >= 2) &&
+           (PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) {
+
+               *(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04;
+               __asm__ volatile ("sync");
+       }
+
+       return dramsize + dramsize2;
+}
+
+int checkboard (void)
+{
+       puts ("Board: Sauter (Jupiter)\n");
+       return 0;
+}
+
+void flash_preinit(void)
+{
+       /*
+        * Now, when we are in RAM, enable flash write
+        * access for detection process.
+        * Note that CS_BOOT cannot be cleared when
+        * executing in flash.
+        */
+#if defined(CONFIG_MGT5100)
+       *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 25); /* disable CS_BOOT */
+       *(vu_long *)MPC5XXX_ADDECR |= (1 << 16); /* enable CS0 */
+#endif
+       *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
+}
+
+int board_early_init_r (void)
+{
+       flash_preinit ();
+       return 0;
+}
+
+void flash_afterinit(ulong size)
+{
+       if (size == 0x1000000) { /* adjust mapping */
+               *(vu_long *)MPC5XXX_BOOTCS_START = *(vu_long *)MPC5XXX_CS0_START =
+                       START_REG(CFG_BOOTCS_START | size);
+               *(vu_long *)MPC5XXX_BOOTCS_STOP = *(vu_long *)MPC5XXX_CS0_STOP =
+                       STOP_REG(CFG_BOOTCS_START | size, size);
+       }
+#if defined(CONFIG_MPC5200)
+       *(vu_long *)MPC5XXX_ADDECR &= ~(1 << 25); /* disable CS_BOOT */
+       *(vu_long *)MPC5XXX_ADDECR |= (1 << 16); /* enable CS0 */
+#endif
+}
+
+int update_flash_size (int flash_size)
+{
+       flash_afterinit (flash_size);
+       return 0;
+}
+
+int board_early_init_f (void)
+{
+       *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
+       return 0;
+}
+
+#ifdef CONFIG_PCI
+static struct pci_controller hose;
+
+extern void pci_mpc5xxx_init(struct pci_controller *);
+
+void pci_init_board(void)
+{
+       pci_mpc5xxx_init(&hose);
+}
+#endif
+
+#if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
+
+void init_ide_reset (void)
+{
+       debug ("init_ide_reset\n");
+
+       /* Configure PSC1_4 as GPIO output for ATA reset */
+       *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4;
+       *(vu_long *) MPC5XXX_WU_GPIO_DIR    |= GPIO_PSC1_4;
+       /* Deassert reset */
+       *(vu_long *) MPC5XXX_WU_GPIO_DATA_O   |= GPIO_PSC1_4;
+}
+
+void ide_set_reset (int idereset)
+{
+       debug ("ide_reset(%d)\n", idereset);
+
+       if (idereset) {
+               *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+               /* Make a delay. MPC5200 spec says 25 usec min */
+               udelay(500000);
+       } else {
+               *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |=  GPIO_PSC1_4;
+       }
+}
+#endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void
+ft_board_setup(void *blob, bd_t *bd)
+{
+       ft_cpu_setup(blob, bd);
+}
+#endif
diff --git a/board/jupiter/u-boot.lds b/board/jupiter/u-boot.lds
new file mode 100644 (file)
index 0000000..f23432e
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * (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
+ */
+
+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
+{
+  /* 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/lpc2292sodimm/Makefile b/board/lpc2292sodimm/Makefile
new file mode 100644 (file)
index 0000000..5a30198
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# (C) Copyright 2002
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.de>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   := lpc2292sodimm.o flash.o mmc.o spi.o mmc_hw.o eth.o
+SOBJS  := lowlevel_init.o iap_entry.o
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) crv $@ $(OBJS) $(SOBJS)
+
+# this MUST be compiled as thumb code!
+iap_entry.o:
+       arm-linux-gcc  -D__ASSEMBLY__ -g  -Os   -fno-strict-aliasing  \
+       -fno-common -ffixed-r8 -msoft-float  -D__KERNEL__ \
+       -DTEXT_BASE=0x81500000  -I/home/garyj/proj/LPC/u-boot/include \
+       -fno-builtin -ffreestanding -nostdinc -isystem \
+       /opt/eldk/arm/usr/bin/../lib/gcc/arm-linux/4.0.0/include -pipe  \
+       -DCONFIG_ARM -D__ARM__ -march=armv4t -mtune=arm7tdmi -mabi=apcs-gnu \
+       -c -o iap_entry.o iap_entry.S
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+-include .depend
+
+#########################################################################
diff --git a/board/lpc2292sodimm/config.mk b/board/lpc2292sodimm/config.mk
new file mode 100644 (file)
index 0000000..b28f418
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# (C) Copyright 2000
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.de>
+#
+# (C) Copyright 2000
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+#address where u-boot will be relocated
+#TEXT_BASE = 0x0
+TEXT_BASE = 0x81500000
diff --git a/board/lpc2292sodimm/eth.c b/board/lpc2292sodimm/eth.c
new file mode 100644 (file)
index 0000000..249ab04
--- /dev/null
@@ -0,0 +1,885 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <common.h>
+#include <net.h>
+#include <asm/arch/hardware.h>
+#include "spi.h"
+
+/*
+ * Control Registers in Bank 0
+ */
+
+#define CTL_REG_ERDPTL  0x00
+#define CTL_REG_ERDPTH  0x01
+#define CTL_REG_EWRPTL  0x02
+#define CTL_REG_EWRPTH  0x03
+#define CTL_REG_ETXSTL  0x04
+#define CTL_REG_ETXSTH  0x05
+#define CTL_REG_ETXNDL  0x06
+#define CTL_REG_ETXNDH  0x07
+#define CTL_REG_ERXSTL  0x08
+#define CTL_REG_ERXSTH  0x09
+#define CTL_REG_ERXNDL  0x0A
+#define CTL_REG_ERXNDA  0x0B
+#define CTL_REG_ERXRDPTL 0x0C
+#define CTL_REG_ERXRDPTH 0x0D
+#define CTL_REG_ERXWRPTL 0x0E
+#define CTL_REG_ERXWRPTH 0x0F
+#define CTL_REG_EDMASTL  0x10
+#define CTL_REG_EDMASTH  0x11
+#define CTL_REG_EDMANDL  0x12
+#define CTL_REG_EDMANDH  0x13
+#define CTL_REG_EDMADSTL 0x14
+#define CTL_REG_EDMADSTH 0x15
+#define CTL_REG_EDMACSL  0x16
+#define CTL_REG_EDMACSH  0x17
+/* these are common in all banks */
+#define CTL_REG_EIE     0x1B
+#define CTL_REG_EIR     0x1C
+#define CTL_REG_ESTAT   0x1D
+#define CTL_REG_ECON2   0x1E
+#define CTL_REG_ECON1   0x1F
+
+/*
+ * Control Registers in Bank 1
+ */
+
+#define CTL_REG_EHT0   0x00
+#define CTL_REG_EHT1   0x01
+#define CTL_REG_EHT2   0x02
+#define CTL_REG_EHT3   0x03
+#define CTL_REG_EHT4   0x04
+#define CTL_REG_EHT5   0x05
+#define CTL_REG_EHT6   0x06
+#define CTL_REG_EHT7   0x07
+#define CTL_REG_EPMM0  0x08
+#define CTL_REG_EPMM1  0x09
+#define CTL_REG_EPMM2  0x0A
+#define CTL_REG_EPMM3  0x0B
+#define CTL_REG_EPMM4  0x0C
+#define CTL_REG_EPMM5  0x0D
+#define CTL_REG_EPMM6  0x0E
+#define CTL_REG_EPMM7  0x0F
+#define CTL_REG_EPMCSL 0x10
+#define CTL_REG_EPMCSH 0x11
+#define CTL_REG_EPMOL  0x14
+#define CTL_REG_EPMOH  0x15
+#define CTL_REG_EWOLIE 0x16
+#define CTL_REG_EWOLIR 0x17
+#define CTL_REG_ERXFCON 0x18
+#define CTL_REG_EPKTCNT 0x19
+
+/*
+ * Control Registers in Bank 2
+ */
+
+#define CTL_REG_MACON1  0x00
+#define CTL_REG_MACON2  0x01
+#define CTL_REG_MACON3  0x02
+#define CTL_REG_MACON4  0x03
+#define CTL_REG_MABBIPG  0x04
+#define CTL_REG_MAIPGL  0x06
+#define CTL_REG_MAIPGH  0x07
+#define CTL_REG_MACLCON1 0x08
+#define CTL_REG_MACLCON2 0x09
+#define CTL_REG_MAMXFLL  0x0A
+#define CTL_REG_MAMXFLH  0x0B
+#define CTL_REG_MAPHSUP  0x0D
+#define CTL_REG_MICON   0x11
+#define CTL_REG_MICMD   0x12
+#define CTL_REG_MIREGADR 0x14
+#define CTL_REG_MIWRL   0x16
+#define CTL_REG_MIWRH   0x17
+#define CTL_REG_MIRDL   0x18
+#define CTL_REG_MIRDH   0x19
+
+/*
+ * Control Registers in Bank 3
+ */
+
+#define CTL_REG_MAADR1 0x00
+#define CTL_REG_MAADR0 0x01
+#define CTL_REG_MAADR3 0x02
+#define CTL_REG_MAADR2 0x03
+#define CTL_REG_MAADR5 0x04
+#define CTL_REG_MAADR4 0x05
+#define CTL_REG_EBSTSD 0x06
+#define CTL_REG_EBSTCON 0x07
+#define CTL_REG_EBSTCSL 0x08
+#define CTL_REG_EBSTCSH 0x09
+#define CTL_REG_MISTAT 0x0A
+#define CTL_REG_EREVID 0x12
+#define CTL_REG_ECOCON 0x15
+#define CTL_REG_EFLOCON 0x17
+#define CTL_REG_EPAUSL 0x18
+#define CTL_REG_EPAUSH 0x19
+
+
+/*
+ * PHY Register
+ */
+
+#define PHY_REG_PHID1 0x02
+#define PHY_REG_PHID2 0x03
+
+
+/*
+ * Receive Filter Register (ERXFCON) bits
+ */
+
+#define ENC_RFR_UCEN  0x80
+#define ENC_RFR_ANDOR 0x40
+#define ENC_RFR_CRCEN 0x20
+#define ENC_RFR_PMEN  0x10
+#define ENC_RFR_MPEN  0x08
+#define ENC_RFR_HTEN  0x04
+#define ENC_RFR_MCEN  0x02
+#define ENC_RFR_BCEN  0x01
+
+/*
+ * ECON1 Register Bits
+ */
+
+#define ENC_ECON1_TXRST  0x80
+#define ENC_ECON1_RXRST  0x40
+#define ENC_ECON1_DMAST  0x20
+#define ENC_ECON1_CSUMEN 0x10
+#define ENC_ECON1_TXRTS  0x08
+#define ENC_ECON1_RXEN  0x04
+#define ENC_ECON1_BSEL1  0x02
+#define ENC_ECON1_BSEL0  0x01
+
+/*
+ * ECON2 Register Bits
+ */
+#define ENC_ECON2_AUTOINC 0x80
+#define ENC_ECON2_PKTDEC  0x40
+#define ENC_ECON2_PWRSV   0x20
+#define ENC_ECON2_VRPS   0x08
+
+/*
+ * EIR Register Bits
+ */
+#define ENC_EIR_PKTIF  0x40
+#define ENC_EIR_DMAIF  0x20
+#define ENC_EIR_LINKIF 0x10
+#define ENC_EIR_TXIF   0x08
+#define ENC_EIR_WOLIF  0x04
+#define ENC_EIR_TXERIF 0x02
+#define ENC_EIR_RXERIF 0x01
+
+/*
+ * ESTAT Register Bits
+ */
+
+#define ENC_ESTAT_INT    0x80
+#define ENC_ESTAT_LATECOL 0x10
+#define ENC_ESTAT_RXBUSY  0x04
+#define ENC_ESTAT_TXABRT  0x02
+#define ENC_ESTAT_CLKRDY  0x01
+
+/*
+ * EIE Register Bits
+ */
+
+#define ENC_EIE_INTIE  0x80
+#define ENC_EIE_PKTIE  0x40
+#define ENC_EIE_DMAIE  0x20
+#define ENC_EIE_LINKIE 0x10
+#define ENC_EIE_TXIE   0x08
+#define ENC_EIE_WOLIE  0x04
+#define ENC_EIE_TXERIE 0x02
+#define ENC_EIE_RXERIE 0x01
+
+/*
+ * MACON1 Register Bits
+ */
+#define ENC_MACON1_LOOPBK  0x10
+#define ENC_MACON1_TXPAUS  0x08
+#define ENC_MACON1_RXPAUS  0x04
+#define ENC_MACON1_PASSALL 0x02
+#define ENC_MACON1_MARXEN  0x01
+
+
+/*
+ * MACON2 Register Bits
+ */
+#define ENC_MACON2_MARST   0x80
+#define ENC_MACON2_RNDRST  0x40
+#define ENC_MACON2_MARXRST 0x08
+#define ENC_MACON2_RFUNRST 0x04
+#define ENC_MACON2_MATXRST 0x02
+#define ENC_MACON2_TFUNRST 0x01
+
+/*
+ * MACON3 Register Bits
+ */
+#define ENC_MACON3_PADCFG2 0x80
+#define ENC_MACON3_PADCFG1 0x40
+#define ENC_MACON3_PADCFG0 0x20
+#define ENC_MACON3_TXCRCEN 0x10
+#define ENC_MACON3_PHDRLEN 0x08
+#define ENC_MACON3_HFRMEN  0x04
+#define ENC_MACON3_FRMLNEN 0x02
+#define ENC_MACON3_FULDPX  0x01
+
+/*
+ * MICMD Register Bits
+ */
+#define ENC_MICMD_MIISCAN 0x02
+#define ENC_MICMD_MIIRD   0x01
+
+/*
+ * MISTAT Register Bits
+ */
+#define ENC_MISTAT_NVALID 0x04
+#define ENC_MISTAT_SCAN   0x02
+#define ENC_MISTAT_BUSY   0x01
+
+/*
+ * PHID1 and PHID2 values
+ */
+#define ENC_PHID1_VALUE 0x0083
+#define ENC_PHID2_VALUE 0x1400
+#define ENC_PHID2_MASK 0xFC00
+
+
+#define ENC_SPI_SLAVE_CS 0x00010000    /* pin P1.16 */
+#define ENC_RESET       0x00020000     /* pin P1.17 */
+
+#define FAILSAFE_VALUE 5000
+
+/*
+ * Controller memory layout:
+ *
+ * 0x0000 - 0x17ff  6k bytes receive buffer
+ * 0x1800 - 0x1fff  2k bytes transmit buffer
+ */
+/* Use the lower memory for receiver buffer. See errata pt. 5 */
+#define ENC_RX_BUF_START 0x0000
+#define ENC_TX_BUF_START 0x1800
+
+/* maximum frame length */
+#define ENC_MAX_FRM_LEN 1518
+
+#define enc_enable() PUT32(IO1CLR, ENC_SPI_SLAVE_CS)
+#define enc_disable() PUT32(IO1SET, ENC_SPI_SLAVE_CS)
+#define enc_cfg_spi() spi_set_cfg(0, 0, 0); spi_set_clock(8);
+
+
+static unsigned char encReadReg (unsigned char regNo);
+static void encWriteReg (unsigned char regNo, unsigned char data);
+static void encWriteRegRetry (unsigned char regNo, unsigned char data, int c);
+static void encReadBuff (unsigned short length, unsigned char *pBuff);
+static void encWriteBuff (unsigned short length, unsigned char *pBuff);
+static void encBitSet (unsigned char regNo, unsigned char data);
+static void encBitClr (unsigned char regNo, unsigned char data);
+static void encReset (void);
+static void encInit (unsigned char *pEthAddr);
+static unsigned short phyRead (unsigned char addr);
+static void encPoll (void);
+static void encRx (void);
+
+#define m_nic_read(reg) encReadReg(reg)
+#define m_nic_write(reg, data) encWriteReg(reg, data)
+#define m_nic_write_retry(reg, data, count) encWriteRegRetry(reg, data, count)
+#define m_nic_read_data(len, buf) encReadBuff((len), (buf))
+#define m_nic_write_data(len, buf) encWriteBuff((len), (buf))
+
+/* bit field set */
+#define m_nic_bfs(reg, data) encBitSet(reg, data)
+
+/* bit field clear */
+#define m_nic_bfc(reg, data) encBitClr(reg, data)
+
+static unsigned char bank = 0; /* current bank in enc28j60 */
+static unsigned char next_pointer_lsb;
+static unsigned char next_pointer_msb;
+
+static unsigned char buffer[ENC_MAX_FRM_LEN];
+static int rxResetCounter = 0;
+
+#define RX_RESET_COUNTER 1000;
+
+/*-----------------------------------------------------------------------------
+ * Returns 0 when failes otherwize 1
+ */
+int eth_init (bd_t * bis)
+{
+       /* configure GPIO */
+       (*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS;
+       (*((volatile unsigned long *) IO1DIR)) |= ENC_RESET;
+
+       /* CS and RESET active low */
+       PUT32 (IO1SET, ENC_SPI_SLAVE_CS);
+       PUT32 (IO1SET, ENC_RESET);
+
+       spi_init ();
+
+       /* initialize controller */
+       encReset ();
+       encInit (bis->bi_enetaddr);
+
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* enable receive */
+
+       return 0;
+}
+
+int eth_send (volatile void *packet, int length)
+{
+       /* check frame length, etc. */
+       /* TODO: */
+
+       /* switch to bank 0 */
+       m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
+
+       /* set EWRPT */
+       m_nic_write (CTL_REG_EWRPTL, (ENC_TX_BUF_START & 0xff));
+       m_nic_write (CTL_REG_EWRPTH, (ENC_TX_BUF_START >> 8));
+
+       /* set ETXST */
+       m_nic_write (CTL_REG_ETXSTL, ENC_TX_BUF_START & 0xFF);
+       m_nic_write (CTL_REG_ETXSTH, ENC_TX_BUF_START >> 8);
+
+       /* write packet */
+       m_nic_write_data (length, (unsigned char *) packet);
+
+       /* set ETXND */
+       m_nic_write (CTL_REG_ETXNDL, (length + ENC_TX_BUF_START) & 0xFF);
+       m_nic_write (CTL_REG_ETXNDH, (length + ENC_TX_BUF_START) >> 8);
+
+       /* set ECON1.TXRTS */
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_TXRTS);
+
+       return 0;
+}
+
+
+/*****************************************************************************
+ * This function resets the receiver only. This function may be called from
+ * interrupt-context.
+ */
+static void encReceiverReset (void)
+{
+       unsigned char econ1;
+
+       econ1 = m_nic_read (CTL_REG_ECON1);
+       if ((econ1 & ENC_ECON1_RXRST) == 0) {
+               m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXRST);
+               rxResetCounter = RX_RESET_COUNTER;
+       }
+}
+
+/*****************************************************************************
+ * receiver reset timer
+ */
+static void encReceiverResetCallback (void)
+{
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_RXRST);
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* enable receive */
+}
+
+/*-----------------------------------------------------------------------------
+ * Check for received packets. Call NetReceive for each packet. The return
+ * value is ignored by the caller.
+ */
+int eth_rx (void)
+{
+       if (rxResetCounter > 0 && --rxResetCounter == 0) {
+               encReceiverResetCallback ();
+       }
+
+       encPoll ();
+
+       return 0;
+}
+
+void eth_halt (void)
+{
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_RXEN);      /* disable receive */
+}
+
+/*****************************************************************************/
+
+static void encPoll (void)
+{
+       unsigned char eir_reg;
+       volatile unsigned char estat_reg;
+       unsigned char pkt_cnt;
+
+       /* clear global interrupt enable bit in enc28j60 */
+       m_nic_bfc (CTL_REG_EIE, ENC_EIE_INTIE);
+       estat_reg = m_nic_read (CTL_REG_ESTAT);
+
+       eir_reg = m_nic_read (CTL_REG_EIR);
+
+       if (eir_reg & ENC_EIR_TXIF) {
+               /* clear TXIF bit in EIR */
+               m_nic_bfc (CTL_REG_EIR, ENC_EIR_TXIF);
+       }
+
+       /* We have to use pktcnt and not pktif bit, see errata pt. 6 */
+
+       /* move to bank 1 */
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
+
+       /* read pktcnt */
+       pkt_cnt = m_nic_read (CTL_REG_EPKTCNT);
+
+       if (pkt_cnt > 0) {
+               if ((eir_reg & ENC_EIR_PKTIF) == 0) {
+                       /*printf("encPoll: pkt cnt > 0, but pktif not set\n"); */
+               }
+               encRx ();
+               /* clear PKTIF bit in EIR, this should not need to be done but it
+                  seems like we get problems if we do not */
+               m_nic_bfc (CTL_REG_EIR, ENC_EIR_PKTIF);
+       }
+
+       if (eir_reg & ENC_EIR_RXERIF) {
+               printf ("encPoll: rx error\n");
+               m_nic_bfc (CTL_REG_EIR, ENC_EIR_RXERIF);
+       }
+       if (eir_reg & ENC_EIR_TXERIF) {
+               printf ("encPoll: tx error\n");
+               m_nic_bfc (CTL_REG_EIR, ENC_EIR_TXERIF);
+       }
+
+       /* set global interrupt enable bit in enc28j60 */
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
+}
+
+static void encRx (void)
+{
+       unsigned short pkt_len;
+       unsigned short copy_len;
+       unsigned short status;
+       unsigned char eir_reg;
+       unsigned char pkt_cnt = 0;
+
+       /* switch to bank 0 */
+       m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
+
+       m_nic_write (CTL_REG_ERDPTL, next_pointer_lsb);
+       m_nic_write (CTL_REG_ERDPTH, next_pointer_msb);
+
+       do {
+               m_nic_read_data (6, buffer);
+               next_pointer_lsb = buffer[0];
+               next_pointer_msb = buffer[1];
+               pkt_len = buffer[2];
+               pkt_len |= (unsigned short) buffer[3] << 8;
+               status = buffer[4];
+               status |= (unsigned short) buffer[5] << 8;
+
+               if (pkt_len <= ENC_MAX_FRM_LEN) {
+                       copy_len = pkt_len;
+               } else {
+                       copy_len = 0;
+                       /*      p_priv->stats.rx_dropped++; */
+                       /* we will drop this packet */
+               }
+
+               if ((status & (1L << 7)) == 0) {        /* check Received Ok bit */
+                       copy_len = 0;
+                       /*      p_priv->stats.rx_errors++; */
+               }
+
+               if (copy_len > 0) {
+                       m_nic_read_data (copy_len, buffer);
+               }
+
+               /* advance read pointer to next pointer */
+               m_nic_write (CTL_REG_ERDPTL, next_pointer_lsb);
+               m_nic_write (CTL_REG_ERDPTH, next_pointer_msb);
+
+               /* decrease packet counter */
+               m_nic_bfs (CTL_REG_ECON2, ENC_ECON2_PKTDEC);
+
+               /* move to bank 1 */
+               m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
+               m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
+
+               /* read pktcnt */
+               pkt_cnt = m_nic_read (CTL_REG_EPKTCNT);
+
+               /* switch to bank 0 */
+               m_nic_bfc (CTL_REG_ECON1,
+                          (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
+
+               if (copy_len == 0) {
+                       eir_reg = m_nic_read (CTL_REG_EIR);
+                       encReceiverReset ();
+                       printf ("eth_rx: copy_len=0\n");
+                       continue;
+               }
+
+               NetReceive ((unsigned char *) buffer, pkt_len);
+
+               eir_reg = m_nic_read (CTL_REG_EIR);
+       } while (pkt_cnt);      /* Use EPKTCNT not EIR.PKTIF flag, see errata pt. 6 */
+       m_nic_write (CTL_REG_ERXRDPTL, next_pointer_lsb);
+       m_nic_write (CTL_REG_ERXRDPTH, next_pointer_msb);
+}
+
+static void encWriteReg (unsigned char regNo, unsigned char data)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0x40 | regNo);       /* write in regNo */
+       spi_write (data);
+
+       enc_disable ();
+       enc_enable ();
+
+       spi_write (0x1f);       /* write reg 0x1f */
+
+       enc_disable ();
+       spi_unlock ();
+}
+
+static void encWriteRegRetry (unsigned char regNo, unsigned char data, int c)
+{
+       unsigned char readback;
+       int i;
+
+       spi_lock ();
+
+       for (i = 0; i < c; i++) {
+               enc_cfg_spi ();
+               enc_enable ();
+
+               spi_write (0x40 | regNo);       /* write in regNo */
+               spi_write (data);
+
+               enc_disable ();
+               enc_enable ();
+
+               spi_write (0x1f);       /* write reg 0x1f */
+
+               enc_disable ();
+
+               spi_unlock ();  /* we must unlock spi first */
+
+               readback = encReadReg (regNo);
+
+               spi_lock ();
+
+               if (readback == data)
+                       break;
+       }
+       spi_unlock ();
+
+       if (i == c) {
+               printf ("enc28j60: write reg %d failed\n", regNo);
+       }
+}
+
+static unsigned char encReadReg (unsigned char regNo)
+{
+       unsigned char rxByte;
+
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0x1f);       /* read reg 0x1f */
+
+       bank = spi_read () & 0x3;
+
+       enc_disable ();
+       enc_enable ();
+
+       spi_write (regNo);
+       rxByte = spi_read ();
+
+       /* check if MAC or MII register */
+       if (((bank == 2) && (regNo <= 0x1a)) ||
+           ((bank == 3) && (regNo <= 0x05 || regNo == 0x0a))) {
+               /* ignore first byte and read another byte */
+               rxByte = spi_read ();
+       }
+
+       enc_disable ();
+       spi_unlock ();
+
+       return rxByte;
+}
+
+static void encReadBuff (unsigned short length, unsigned char *pBuff)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0x20 | 0x1a);        /* read buffer memory */
+
+       while (length--) {
+               if (pBuff != NULL)
+                       *pBuff++ = spi_read ();
+               else
+                       spi_write (0);
+       }
+
+       enc_disable ();
+       spi_unlock ();
+}
+
+static void encWriteBuff (unsigned short length, unsigned char *pBuff)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0x60 | 0x1a);        /* write buffer memory */
+
+       spi_write (0x00);       /* control byte */
+
+       while (length--)
+               spi_write (*pBuff++);
+
+       enc_disable ();
+       spi_unlock ();
+}
+
+static void encBitSet (unsigned char regNo, unsigned char data)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0x80 | regNo);       /* bit field set */
+       spi_write (data);
+
+       enc_disable ();
+       spi_unlock ();
+}
+
+static void encBitClr (unsigned char regNo, unsigned char data)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0xA0 | regNo);       /* bit field clear */
+       spi_write (data);
+
+       enc_disable ();
+       spi_unlock ();
+}
+
+static void encReset (void)
+{
+       spi_lock ();
+       enc_cfg_spi ();
+       enc_enable ();
+
+       spi_write (0xff);       /* soft reset */
+
+       enc_disable ();
+       spi_unlock ();
+
+       /* sleep 1 ms. See errata pt. 2 */
+       udelay (1000);
+
+#if 0
+       (*((volatile unsigned long *) IO1CLR)) &= ENC_RESET;
+       mdelay (5);
+       (*((volatile unsigned long *) IO1SET)) &= ENC_RESET;
+#endif
+}
+
+static void encInit (unsigned char *pEthAddr)
+{
+       unsigned short phid1 = 0;
+       unsigned short phid2 = 0;
+
+       /* switch to bank 0 */
+       m_nic_bfc (CTL_REG_ECON1, (ENC_ECON1_BSEL1 | ENC_ECON1_BSEL0));
+
+       /*
+        * Setup the buffer space. The reset values are valid for the
+        * other pointers.
+        */
+#if 0
+       /* We shall not write to ERXST, see errata pt. 5. Instead we
+          have to make sure that ENC_RX_BUS_START is 0. */
+       m_nic_write_retry (CTL_REG_ERXSTL, (ENC_RX_BUF_START & 0xFF), 1);
+       m_nic_write_retry (CTL_REG_ERXSTH, (ENC_RX_BUF_START >> 8), 1);
+#endif
+       m_nic_write_retry (CTL_REG_ERDPTL, (ENC_RX_BUF_START & 0xFF), 1);
+       m_nic_write_retry (CTL_REG_ERDPTH, (ENC_RX_BUF_START >> 8), 1);
+
+       next_pointer_lsb = (ENC_RX_BUF_START & 0xFF);
+       next_pointer_msb = (ENC_RX_BUF_START >> 8);
+
+       /*
+        * For tracking purposes, the ERXRDPT registers should be programmed with
+        * the same value. This is the read pointer.
+        */
+       m_nic_write (CTL_REG_ERXRDPTL, (ENC_RX_BUF_START & 0xFF));
+       m_nic_write_retry (CTL_REG_ERXRDPTH, (ENC_RX_BUF_START >> 8), 1);
+
+       /* Setup receive filters. */
+
+       /* move to bank 1 */
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL1);
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL0);
+
+       /* OR-filtering, Unicast, CRC-check and broadcast */
+       m_nic_write_retry (CTL_REG_ERXFCON,
+                          (ENC_RFR_UCEN | ENC_RFR_CRCEN | ENC_RFR_BCEN), 1);
+
+       /* Wait for Oscillator Start-up Timer (OST). */
+       while ((m_nic_read (CTL_REG_ESTAT) & ENC_ESTAT_CLKRDY) == 0) {
+               static int cnt = 0;
+
+               if (cnt++ >= 1000) {
+                       cnt = 0;
+               }
+       }
+
+       /* verify identification */
+       phid1 = phyRead (PHY_REG_PHID1);
+       phid2 = phyRead (PHY_REG_PHID2);
+
+       if (phid1 != ENC_PHID1_VALUE
+           || (phid2 & ENC_PHID2_MASK) != ENC_PHID2_VALUE) {
+               printf ("ERROR: failed to identify controller\n");
+               printf ("phid1 = %x, phid2 = %x\n",
+                       phid1, (phid2 & ENC_PHID2_MASK));
+               printf ("should be phid1 = %x, phid2 = %x\n",
+                       ENC_PHID1_VALUE, ENC_PHID2_VALUE);
+       }
+
+       /*
+        * --- MAC Initialization ---
+        */
+
+       /* Pull MAC out of Reset */
+
+       /* switch to bank 2 */
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL1);
+       /* clear MAC reset bits */
+       m_nic_write_retry (CTL_REG_MACON2, 0, 1);
+
+       /* enable MAC to receive frames */
+       m_nic_write_retry (CTL_REG_MACON1, ENC_MACON1_MARXEN, 10);
+
+       /* configure pad, tx-crc and duplex */
+       /* TODO maybe enable FRMLNEN */
+       m_nic_write_retry (CTL_REG_MACON3,
+                          (ENC_MACON3_PADCFG0 | ENC_MACON3_TXCRCEN), 10);
+
+       /* set maximum frame length */
+       m_nic_write_retry (CTL_REG_MAMXFLL, (ENC_MAX_FRM_LEN & 0xff), 10);
+       m_nic_write_retry (CTL_REG_MAMXFLH, (ENC_MAX_FRM_LEN >> 8), 10);
+
+       /*
+        * Set MAC back-to-back inter-packet gap. Recommended 0x12 for half duplex
+        * and 0x15 for full duplex.
+        */
+       m_nic_write_retry (CTL_REG_MABBIPG, 0x12, 10);
+
+       /* Set (low byte) Non-Back-to_Back Inter-Packet Gap. Recommended 0x12 */
+       m_nic_write_retry (CTL_REG_MAIPGL, 0x12, 10);
+
+       /*
+        * Set (high byte) Non-Back-to_Back Inter-Packet Gap. Recommended
+        * 0x0c for half-duplex. Nothing for full-duplex
+        */
+       m_nic_write_retry (CTL_REG_MAIPGH, 0x0C, 10);
+
+       /* set MAC address */
+
+       /* switch to bank 3 */
+       m_nic_bfs (CTL_REG_ECON1, (ENC_ECON1_BSEL0 | ENC_ECON1_BSEL1));
+
+       m_nic_write_retry (CTL_REG_MAADR0, pEthAddr[5], 1);
+       m_nic_write_retry (CTL_REG_MAADR1, pEthAddr[4], 1);
+       m_nic_write_retry (CTL_REG_MAADR2, pEthAddr[3], 1);
+       m_nic_write_retry (CTL_REG_MAADR3, pEthAddr[2], 1);
+       m_nic_write_retry (CTL_REG_MAADR4, pEthAddr[1], 1);
+       m_nic_write_retry (CTL_REG_MAADR5, pEthAddr[0], 1);
+
+       /*
+        * Receive settings
+        */
+
+       /* auto-increment RX-pointer when reading a received packet */
+       m_nic_bfs (CTL_REG_ECON2, ENC_ECON2_AUTOINC);
+
+       /* enable interrupts */
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_PKTIE);
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXIE);
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_RXERIE);
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_TXERIE);
+       m_nic_bfs (CTL_REG_EIE, ENC_EIE_INTIE);
+}
+
+/*****************************************************************************
+ *
+ * Description:
+ *    Read PHY registers.
+ *
+ *    NOTE! This function will change to Bank 2.
+ *
+ * Params:
+ *    [in] addr address of the register to read
+ *
+ * Returns:
+ *    The value in the register
+ */
+static unsigned short phyRead (unsigned char addr)
+{
+       unsigned short ret = 0;
+
+       /* move to bank 2 */
+       m_nic_bfc (CTL_REG_ECON1, ENC_ECON1_BSEL0);
+       m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_BSEL1);
+
+       /* write address to MIREGADR */
+       m_nic_write (CTL_REG_MIREGADR, addr);
+
+       /* set MICMD.MIIRD */
+       m_nic_write (CTL_REG_MICMD, ENC_MICMD_MIIRD);
+
+       /* poll MISTAT.BUSY bit until operation is complete */
+       while ((m_nic_read (CTL_REG_MISTAT) & ENC_MISTAT_BUSY) != 0) {
+               static int cnt = 0;
+
+               if (cnt++ >= 1000) {
+                       /* GJ - this seems extremely dangerous! */
+                       /* printf("#"); */
+                       cnt = 0;
+               }
+       }
+
+       /* clear MICMD.MIIRD */
+       m_nic_write (CTL_REG_MICMD, 0);
+
+       ret = (m_nic_read (CTL_REG_MIRDH) << 8);
+       ret |= (m_nic_read (CTL_REG_MIRDL) & 0xFF);
+
+       return ret;
+}
diff --git a/board/lpc2292sodimm/flash.c b/board/lpc2292sodimm/flash.c
new file mode 100644 (file)
index 0000000..55aaabf
--- /dev/null
@@ -0,0 +1,476 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/arch/hardware.h>
+
+/* IAP commands use 32 bytes at the top of CPU internal sram, we
+   use 512 bytes below that */
+#define COPY_BUFFER_LOCATION 0x40003de0
+
+#define IAP_LOCATION 0x7ffffff1
+#define IAP_CMD_PREPARE 50
+#define IAP_CMD_COPY 51
+#define IAP_CMD_ERASE 52
+#define IAP_CMD_CHECK 53
+#define IAP_CMD_ID 54
+#define IAP_CMD_VERSION 55
+#define IAP_CMD_COMPARE 56
+
+#define IAP_RET_CMD_SUCCESS 0
+
+#define SST_BASEADDR 0x80000000
+#define SST_ADDR1 ((volatile ushort*)(SST_BASEADDR + (0x5555 << 1)))
+#define SST_ADDR2 ((volatile ushort*)(SST_BASEADDR + (0x2AAA << 1)))
+
+
+static unsigned long command[5];
+static unsigned long result[2];
+
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+extern void iap_entry(unsigned long * command, unsigned long * result);
+
+/*-----------------------------------------------------------------------
+ *
+ */
+int get_flash_sector(flash_info_t * info, ulong flash_addr)
+{
+       int i;
+
+       for(i=1; i < (info->sector_count); i++) {
+               if (flash_addr < (info->start[i]))
+                       break;
+       }
+
+       return (i-1);
+}
+
+/*-----------------------------------------------------------------------
+ * This function assumes that flash_addr is aligned on 512 bytes boundary
+ * in flash. This function also assumes that prepare have been called
+ * for the sector in question.
+ */
+int copy_buffer_to_flash(flash_info_t * info, ulong flash_addr)
+{
+       int first_sector;
+       int last_sector;
+
+       first_sector = get_flash_sector(info, flash_addr);
+       last_sector = get_flash_sector(info, flash_addr + 512 - 1);
+
+       /* prepare sectors for write */
+       command[0] = IAP_CMD_PREPARE;
+       command[1] = first_sector;
+       command[2] = last_sector;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP prepare failed\n");
+               return ERR_PROG_ERROR;
+       }
+
+       command[0] = IAP_CMD_COPY;
+       command[1] = flash_addr;
+       command[2] = COPY_BUFFER_LOCATION;
+       command[3] = 512;
+       command[4] = CFG_SYS_CLK_FREQ >> 10;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP copy failed\n");
+               return 1;
+       }
+
+       return 0;
+}
+
+/*-----------------------------------------------------------------------
+ *
+ */
+void write_word_sst(ulong addr, ushort data)
+{
+       ushort tmp;
+
+       *SST_ADDR1 = 0x00AA;
+       *SST_ADDR2 = 0x0055;
+       *SST_ADDR1 = 0x00A0;
+       *((volatile ushort*)addr) = data;
+       /* do data polling */
+       do {
+               tmp = *((volatile ushort*)addr);
+       } while (tmp != data);
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+ulong flash_init (void)
+{
+       int j, k;
+       ulong size = 0;
+       ulong flashbase = 0;
+
+       flash_info[0].flash_id = (PHILIPS_LPC2292 & FLASH_VENDMASK);
+       flash_info[0].size = 0x003E000; /* 256 - 8 KB */
+       flash_info[0].sector_count = 17;
+       memset (flash_info[0].protect, 0, 17);
+       flashbase = 0x00000000;
+       for (j = 0, k = 0; j < 8; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00002000;
+       }
+       for (j = 0; j < 2; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00010000;
+       }
+       for (j = 0; j < 7; j++, k++) {
+               flash_info[0].start[k] = flashbase;
+               flashbase += 0x00002000;
+       }
+       size += flash_info[0].size;
+
+       flash_info[1].flash_id = (SST_MANUFACT & FLASH_VENDMASK);
+       flash_info[1].size = 0x00200000; /* 2 MB */
+       flash_info[1].sector_count = 512;
+       memset (flash_info[1].protect, 0, 512);
+       flashbase = SST_BASEADDR;
+       for (j=0; j<512; j++) {
+               flash_info[1].start[j] = flashbase;
+               flashbase += 0x1000;    /* 4 KB sectors */
+       }
+       size += flash_info[1].size;
+
+       /* Protect monitor and environment sectors */
+       flash_protect (FLAG_PROTECT_SET,
+                0x0,
+                0x0 + monitor_flash_len - 1,
+                &flash_info[0]);
+
+       flash_protect (FLAG_PROTECT_SET,
+                CFG_ENV_ADDR,
+                CFG_ENV_ADDR + CFG_ENV_SIZE - 1,
+                &flash_info[0]);
+
+       return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+       int erased = 0;
+       unsigned long j;
+       unsigned long count;
+       unsigned char *p;
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case (SST_MANUFACT & FLASH_VENDMASK):
+               printf("SST: ");
+               break;
+       case (PHILIPS_LPC2292 & FLASH_VENDMASK):
+               printf("Philips: ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       printf ("  Size: %ld KB in %d Sectors\n",
+         info->size >> 10, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; i++) {
+               if ((i % 5) == 0) {
+                       printf ("\n   ");
+               }
+               if (i < (info->sector_count - 1)) {
+                       count = info->start[i+1] - info->start[i];
+               }
+               else {
+                       count = info->start[0] + info->size - info->start[i];
+               }
+               p = (unsigned char*)(info->start[i]);
+               erased = 1;
+               for (j = 0; j < count; j++) {
+                       if (*p != 0xFF) {
+                               erased = 0;
+                               break;
+                       }
+                       p++;
+               }
+               printf (" %08lX%s%s", info->start[i], info->protect[i] ? " RO" : "   ",
+                       erased ? " E" : "  ");
+       }
+       printf ("\n");
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+int flash_erase_philips (flash_info_t * info, int s_first, int s_last)
+{
+       int flag;
+       int prot;
+       int sect;
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+       if (prot)
+               return ERR_PROTECTED;
+
+
+       flag = disable_interrupts();
+
+       printf ("Erasing %d sectors starting at sector %2d.\n"
+       "This make take some time ... ",
+       s_last - s_first + 1, s_first);
+
+       command[0] = IAP_CMD_PREPARE;
+       command[1] = s_first;
+       command[2] = s_last;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP prepare failed\n");
+               return ERR_PROTECTED;
+       }
+
+       command[0] = IAP_CMD_ERASE;
+       command[1] = s_first;
+       command[2] = s_last;
+       command[3] = CFG_SYS_CLK_FREQ >> 10;
+       iap_entry(command, result);
+       if (result[0] != IAP_RET_CMD_SUCCESS) {
+               printf("IAP erase failed\n");
+               return ERR_PROTECTED;
+       }
+
+       if (flag)
+               enable_interrupts();
+
+       return ERR_OK;
+}
+
+int flash_erase_sst (flash_info_t * info, int s_first, int s_last)
+{
+       int i;
+
+       for (i = s_first; i <= s_last; i++) {
+               *SST_ADDR1 = 0x00AA;
+               *SST_ADDR2 = 0x0055;
+               *SST_ADDR1 = 0x0080;
+               *SST_ADDR1 = 0x00AA;
+               *SST_ADDR2 = 0x0055;
+               *((volatile ushort*)(info->start[i])) = 0x0030;
+               /* wait for erase to finish */
+               udelay(25000);
+       }
+
+       return ERR_OK;
+}
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       switch (info->flash_id & FLASH_VENDMASK) {
+               case (SST_MANUFACT & FLASH_VENDMASK):
+                       return flash_erase_sst(info, s_first, s_last);
+               case (PHILIPS_LPC2292 & FLASH_VENDMASK):
+                       return flash_erase_philips(info, s_first, s_last);
+               default:
+                       return ERR_PROTECTED;
+       }
+       return ERR_PROTECTED;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash.
+ *
+ * cnt is in bytes
+ */
+
+int write_buff_sst (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ushort tmp;
+       ulong i;
+       uchar* src_org;
+       uchar* dst_org;
+       ulong cnt_org = cnt;
+       int ret = ERR_OK;
+
+       src_org = src;
+       dst_org = (uchar*)addr;
+
+       if (addr & 1) {         /* if odd address */
+               tmp = *((uchar*)(addr - 1)); /* little endian */
+               tmp |= (*src << 8);
+               write_word_sst(addr - 1, tmp);
+               addr += 1;
+               cnt -= 1;
+               src++;
+       }
+       while (cnt > 1) {
+               tmp = ((*(src+1)) << 8) + (*src); /* little endian */
+               write_word_sst(addr, tmp);
+               addr += 2;
+               src += 2;
+               cnt -= 2;
+       }
+       if (cnt > 0) {
+               tmp = (*((uchar*)(addr + 1))) << 8;
+               tmp |= *src;
+               write_word_sst(addr, tmp);
+       }
+
+       for (i = 0; i < cnt_org; i++) {
+               if (*dst_org != *src_org) {
+                       printf("Write failed. Byte %lX differs\n", i);
+                       ret = ERR_PROG_ERROR;
+                       break;
+               }
+               dst_org++;
+               src_org++;
+       }
+
+       return ret;
+}
+
+int write_buff_philips (flash_info_t * info,
+                       uchar * src,
+                       ulong addr,
+                       ulong cnt)
+{
+       int first_copy_size;
+       int last_copy_size;
+       int first_block;
+       int last_block;
+       int nbr_mid_blocks;
+       uchar memmap_value;
+       ulong i;
+       uchar* src_org;
+       uchar* dst_org;
+       int ret = ERR_OK;
+
+       src_org = src;
+       dst_org = (uchar*)addr;
+
+       first_block = addr / 512;
+       last_block = (addr + cnt) / 512;
+       nbr_mid_blocks = last_block - first_block - 1;
+
+       first_copy_size = 512 - (addr % 512);
+       last_copy_size = (addr + cnt) % 512;
+
+#if 0
+       printf("\ncopy first block: (1) %lX -> %lX 0x200 bytes, "
+               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX 0x200 bytes\n",
+       (ulong)(first_block * 512),
+       (ulong)COPY_BUFFER_LOCATION,
+       (ulong)src,
+       (ulong)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
+       first_copy_size,
+       (ulong)COPY_BUFFER_LOCATION,
+       (ulong)(first_block * 512));
+#endif
+
+       /* copy first block */
+       memcpy((void*)COPY_BUFFER_LOCATION,
+               (void*)(first_block * 512), 512);
+       memcpy((void*)(COPY_BUFFER_LOCATION + 512 - first_copy_size),
+               src, first_copy_size);
+       copy_buffer_to_flash(info, first_block * 512);
+       src += first_copy_size;
+       addr += first_copy_size;
+
+       /* copy middle blocks */
+       for (i = 0; i < nbr_mid_blocks; i++) {
+#if 0
+               printf("copy middle block: %lX -> %lX 512 bytes, "
+               "%lX -> %lX 512 bytes\n",
+               (ulong)src,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)addr);
+#endif
+               memcpy((void*)COPY_BUFFER_LOCATION, src, 512);
+               copy_buffer_to_flash(info, addr);
+               src += 512;
+               addr += 512;
+       }
+
+
+       if (last_copy_size > 0) {
+#if 0
+               printf("copy last block: (1) %lX -> %lX 0x200 bytes, "
+               "(2) %lX -> %lX 0x%X bytes, (3) %lX -> %lX x200 bytes\n",
+               (ulong)(last_block * 512),
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)src,
+               (ulong)(COPY_BUFFER_LOCATION),
+               last_copy_size,
+               (ulong)COPY_BUFFER_LOCATION,
+               (ulong)addr);
+#endif
+               /* copy last block */
+               memcpy((void*)COPY_BUFFER_LOCATION,
+                       (void*)(last_block * 512), 512);
+               memcpy((void*)COPY_BUFFER_LOCATION,
+                       src, last_copy_size);
+               copy_buffer_to_flash(info, addr);
+       }
+
+       /* verify write */
+       memmap_value = GET8(MEMMAP);
+
+       disable_interrupts();
+
+       PUT8(MEMMAP, 01);               /* we must make sure that initial 64
+                                                          bytes are taken from flash when we
+                                                          do the compare */
+
+       for (i = 0; i < cnt; i++) {
+               if (*dst_org != *src_org){
+                       printf("Write failed. Byte %lX differs\n", i);
+                       ret = ERR_PROG_ERROR;
+                       break;
+               }
+               dst_org++;
+               src_org++;
+       }
+
+       PUT8(MEMMAP, memmap_value);
+       enable_interrupts();
+
+       return ret;
+}
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       switch (info->flash_id & FLASH_VENDMASK) {
+               case (SST_MANUFACT & FLASH_VENDMASK):
+                       return write_buff_sst(info, src, addr, cnt);
+               case (PHILIPS_LPC2292 & FLASH_VENDMASK):
+                       return write_buff_philips(info, src, addr, cnt);
+               default:
+                       return ERR_PROG_ERROR;
+       }
+       return ERR_PROG_ERROR;
+}
diff --git a/board/lpc2292sodimm/iap_entry.S b/board/lpc2292sodimm/iap_entry.S
new file mode 100644 (file)
index 0000000..c31d519
--- /dev/null
@@ -0,0 +1,7 @@
+IAP_ADDRESS:   .word   0x7FFFFFF1
+
+.globl iap_entry
+iap_entry:
+       ldr     r2, IAP_ADDRESS
+       bx      r2
+       mov     pc, lr
diff --git a/board/lpc2292sodimm/lowlevel_init.S b/board/lpc2292sodimm/lowlevel_init.S
new file mode 100644 (file)
index 0000000..a0e9747
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <version.h>
+#include <asm/arch/hardware.h>
+
+/* some parameters for the board */
+/* setting up the memory */
+#define        SRAM_START      0x40000000
+#define        SRAM_SIZE       0x00004000
+#define   BCFG0_VALUE 0x1000ffef
+#define   BCFG1_VALUE 0x10001C61
+
+_TEXT_BASE:
+       .word   TEXT_BASE
+MEMMAP_ADR:
+       .word   MEMMAP
+BCFG0_ADR:
+  .word BCFG0
+_BCFG0_VALUE:
+  .word BCFG0_VALUE
+BCFG1_ADR:
+       .word   BCFG1
+_BCFG1_VALUE:
+       .word   BCFG1_VALUE
+PINSEL2_ADR:
+       .word   PINSEL2
+PINSEL2_MASK:
+       .word   0x00000000
+PINSEL2_VALUE:
+       .word   0x0F800914
+
+.extern _start
+
+.globl lowlevel_init
+lowlevel_init:
+       /* set up memory control register for bank 0 */
+       ldr r0, _BCFG0_VALUE
+       ldr r1, BCFG0_ADR
+       str r0, [r1]
+
+       /* set up memory control register for bank 1 */
+       ldr     r0, _BCFG1_VALUE
+       ldr     r1, BCFG1_ADR
+       str     r0, [r1]
+
+       /* set up PINSEL2 for bus-pins */
+       ldr     r0, PINSEL2_ADR
+       ldr     r1, [r0]
+       ldr     r2, PINSEL2_MASK
+       ldr     r3, PINSEL2_VALUE
+       and     r1, r1, r2
+       orr     r1, r1, r3
+       str     r1, [r0]
+
+       /* move vectors to beginning of SRAM */
+       mov     r2, #SRAM_START
+       mov     r0, #0 /*_start*/
+       ldmneia r0!, {r3-r10}
+       stmneia r2!, {r3-r10}
+       ldmneia r0, {r3-r9}
+       stmneia r2, {r3-r9}
+
+       /* Set-up MEMMAP register, so vectors are taken from SRAM */
+       ldr     r0, MEMMAP_ADR
+       mov     r1, #0x02       /* vectors re-mapped to static RAM */
+       str     r1, [r0]
+
+       /* everything is fine now */
+       mov     pc, lr
diff --git a/board/lpc2292sodimm/lpc2292sodimm.c b/board/lpc2292sodimm/lpc2292sodimm.c
new file mode 100644 (file)
index 0000000..d212c63
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2005 Rowel Atienza <rowel@diwalabs.com>
+ * Armadillo board HT1070
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <clps7111.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /* Activate LED flasher */
+       IO_LEDFLSH = 0x40;
+
+       /* arch number MACH_TYPE_ARMADILLO - not official*/
+       gd->bd->bi_arch_number = 83;
+
+       /* location of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+
+       return 0;
+}
+
+int dram_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+       return (0);
+}
diff --git a/board/lpc2292sodimm/mmc.c b/board/lpc2292sodimm/mmc.c
new file mode 100644 (file)
index 0000000..1c0922f
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <common.h>
+#include <mmc.h>
+#include <asm/errno.h>
+#include <asm/arch/hardware.h>
+#include <part.h>
+#include <fat.h>
+#include "mmc_hw.h"
+#include "spi.h"
+
+#ifdef CONFIG_MMC
+
+#undef MMC_DEBUG
+
+static block_dev_desc_t mmc_dev;
+
+/* these are filled out by a call to mmc_hw_get_parameters */
+static int hw_size;            /* in kbytes */
+static int hw_nr_sects;
+static int hw_sect_size;       /* in bytes */
+
+block_dev_desc_t * mmc_get_dev(int dev)
+{
+       return (block_dev_desc_t *)(&mmc_dev);
+}
+
+unsigned long mmc_block_read(int dev,
+                            unsigned long start,
+                            lbaint_t blkcnt,
+                            unsigned long *buffer)
+{
+       unsigned long rc = 0;
+       unsigned char *p = (unsigned char *)buffer;
+       unsigned long i;
+       unsigned long addr = start;
+
+#ifdef MMC_DEBUG
+       printf("mmc_block_read: start=%lu, blkcnt=%lu\n", start,
+                (unsigned long)blkcnt);
+#endif
+
+       for(i = 0; i < (unsigned long)blkcnt; i++) {
+#ifdef MMC_DEBUG
+               printf("mmc_read_sector: addr=%lu, buffer=%p\n", addr, p);
+#endif
+               (void)mmc_read_sector(addr, p);
+               rc++;
+               addr++;
+               p += hw_sect_size;
+       }
+
+       return rc;
+}
+
+/*-----------------------------------------------------------------------------
+ * Read hardware paramterers (sector size, size, number of sectors)
+ */
+static int mmc_hw_get_parameters(void)
+{
+       unsigned char csddata[16];
+       unsigned int sizemult;
+       unsigned int size;
+
+       mmc_read_csd(csddata);
+       hw_sect_size = 1<<(csddata[5] & 0x0f);
+       size = ((csddata[6]&0x03)<<10)+(csddata[7]<<2)+(csddata[8]&0xc0);
+       sizemult = ((csddata[10] & 0x80)>>7)+((csddata[9] & 0x03)<<1);
+       hw_nr_sects = (size+1)*(1<<(sizemult+2));
+       hw_size = hw_nr_sects*hw_sect_size/1024;
+
+#ifdef MMC_DEBUG
+       printf("mmc_hw_get_parameters: hw_sect_size=%d, hw_nr_sects=%d, "
+                "hw_size=%d\n", hw_sect_size, hw_nr_sects, hw_size);
+#endif
+
+       return 0;
+}
+
+int mmc_init(int verbose)
+{
+       int ret = -ENODEV;
+
+       if (verbose)
+               printf("mmc_init\n");
+
+       spi_init();
+       mmc_hw_init();
+
+       mmc_hw_get_parameters();
+
+       mmc_dev.if_type = IF_TYPE_MMC;
+       mmc_dev.part_type = PART_TYPE_DOS;
+       mmc_dev.dev = 0;
+       mmc_dev.lun = 0;
+       mmc_dev.type = 0;
+       mmc_dev.blksz = hw_sect_size;
+       mmc_dev.lba = hw_nr_sects;
+       sprintf((char*)mmc_dev.vendor, "Unknown vendor");
+       sprintf((char*)mmc_dev.product, "Unknown product");
+       sprintf((char*)mmc_dev.revision, "N/A");
+       mmc_dev.removable = 0;  /* should be true??? */
+       mmc_dev.block_read = mmc_block_read;
+
+       fat_register_device(&mmc_dev, 1);
+
+       ret = 0;
+
+       return ret;
+}
+
+int mmc_write(uchar * src, ulong dst, int size)
+{
+#ifdef MMC_DEBUG
+       printf("mmc_write: src=%p, dst=%lu, size=%u\n", src, dst, size);
+#endif
+       /* Since mmc2info always returns 0 this function will never be called */
+       return 0;
+}
+
+int mmc_read(ulong src, uchar * dst, int size)
+{
+#ifdef MMC_DEBUG
+       printf("mmc_read: src=%lu, dst=%p, size=%u\n", src, dst, size);
+#endif
+       /* Since mmc2info always returns 0 this function will never be called */
+       return 0;
+}
+
+int mmc2info(ulong addr)
+{
+       /* This function is used by cmd_cp to determine if source or destination
+        address resides on MMC-card or not. We do not support copy to and from
+        MMC-card so we always return 0. */
+       return 0;
+}
+
+#endif /* CONFIG_MMC */
diff --git a/board/lpc2292sodimm/mmc_hw.c b/board/lpc2292sodimm/mmc_hw.c
new file mode 100644 (file)
index 0000000..31f2a79
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+    This code was original written by Ulrich Radig and modified by
+    Embedded Artists AB (www.embeddedartists.com).
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <config.h>
+#include <common.h>
+#include <asm/arch/hardware.h>
+#include "spi.h"
+
+#define MMC_Enable() PUT32(IO1CLR, 1l << 22)
+#define MMC_Disable() PUT32(IO1SET, 1l << 22)
+#define mmc_spi_cfg() spi_set_clock(8); spi_set_cfg(0, 1, 0);
+
+static unsigned char Write_Command_MMC (unsigned char *CMD);
+static void MMC_Read_Block(unsigned char *CMD, unsigned char *Buffer,
+                   unsigned short int Bytes);
+
+/* initialize the hardware */
+int mmc_hw_init(void)
+{
+       unsigned long a;
+       unsigned short int Timeout = 0;
+       unsigned char b;
+       unsigned char CMD[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95};
+
+       /* set-up GPIO and SPI */
+       (*((volatile unsigned long *)PINSEL2)) &= ~(1l << 3); /* clear bit 3 */
+       (*((volatile unsigned long *)IO1DIR)) |= (1l << 22); /* set bit 22 (output) */
+
+       MMC_Disable();
+
+       spi_lock();
+       spi_set_clock(248);
+       spi_set_cfg(0, 1, 0);
+       MMC_Enable();
+
+       /* waste some time */
+       for(a=0; a < 20000; a++)
+               asm("nop");
+
+       /* Put the MMC/SD-card into SPI-mode */
+       for (b = 0; b < 10; b++) /* Sends min 74+ clocks to the MMC/SD-card */
+               spi_write(0xff);
+
+       /* Sends command CMD0 to MMC/SD-card */
+       while (Write_Command_MMC(CMD) != 1) {
+               if (Timeout++ > 200) {
+                       MMC_Disable();
+                       spi_unlock();
+                       return(1); /* Abort with command 1 (return 1) */
+               }
+       }
+       /* Sends Command CMD1 an MMC/SD-card */
+       Timeout = 0;
+       CMD[0] = 0x41;/* Command 1 */
+       CMD[5] = 0xFF;
+
+       while (Write_Command_MMC(CMD) != 0) {
+               if (Timeout++ > 200) {
+                       MMC_Disable();
+                       spi_unlock();
+                       return (2); /* Abort with command 2 (return 2) */
+               }
+       }
+
+       MMC_Disable();
+       spi_unlock();
+
+       return 0;
+}
+
+/* ############################################################################
+   Sends a command to the MMC/SD-card
+   ######################################################################### */
+static unsigned char Write_Command_MMC (unsigned char *CMD)
+{
+       unsigned char a, tmp = 0xff;
+       unsigned short int Timeout = 0;
+
+       MMC_Disable();
+       spi_write(0xFF);
+       MMC_Enable();
+
+       for (a = 0; a < 0x06; a++)
+               spi_write(*CMD++);
+
+       while (tmp == 0xff) {
+               tmp = spi_read();
+               if (Timeout++ > 5000)
+                 break;
+       }
+
+       return (tmp);
+}
+
+/* ############################################################################
+   Routine to read the CID register from the MMC/SD-card (16 bytes)
+   ######################################################################### */
+void MMC_Read_Block(unsigned char *CMD, unsigned char *Buffer, unsigned short
+       int Bytes)
+{
+       unsigned short int a;
+
+       spi_lock();
+       mmc_spi_cfg();
+       MMC_Enable();
+
+       if (Write_Command_MMC(CMD) != 0) {
+               MMC_Disable();
+               spi_unlock();
+               return;
+       }
+
+       while (spi_read() != 0xfe) {};
+       for (a = 0; a < Bytes; a++)
+               *Buffer++ = spi_read();
+
+       /* Read the CRC-byte */
+       spi_read(); /* CRC - byte is discarded */
+       spi_read(); /* CRC - byte is discarded */
+       /* set MMC_Chip_Select to high (MMC/SD-card Inaktiv) */
+       MMC_Disable();
+       spi_unlock();
+
+       return;
+}
+
+/* ############################################################################
+   Routine to read a block (512 bytes) from the MMC/SD-card
+   ######################################################################### */
+unsigned char mmc_read_sector (unsigned long addr,unsigned char *Buffer)
+{
+       /* Command 16 to read aBlocks from the MMC/SD - caed */
+       unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
+
+       /* The addres on the MMC/SD-card is in bytes,
+       addr is transformed from blocks to bytes and the result is
+       placed into the command */
+
+       addr = addr << 9; /* addr = addr * 512 */
+
+       CMD[1] = ((addr & 0xFF000000) >> 24);
+       CMD[2] = ((addr & 0x00FF0000) >> 16);
+       CMD[3] = ((addr & 0x0000FF00) >> 8 );
+
+       MMC_Read_Block(CMD, Buffer, 512);
+
+       return (0);
+}
+
+/* ############################################################################
+   Routine to write a block (512 byte) to the MMC/SD-card
+   ######################################################################### */
+unsigned char mmc_write_sector (unsigned long addr,unsigned char *Buffer)
+{
+       unsigned char tmp, a;
+       unsigned short int b;
+       /* Command 24 to write a block to the MMC/SD - card */
+       unsigned char CMD[] = {0x58, 0x00, 0x00, 0x00, 0x00, 0xFF};
+
+       /* The addres on the MMC/SD-card is in bytes,
+       addr is transformed from blocks to bytes and the result is
+       placed into the command */
+
+       addr = addr << 9; /* addr = addr * 512 */
+
+       CMD[1] = ((addr & 0xFF000000) >> 24);
+       CMD[2] = ((addr & 0x00FF0000) >> 16);
+       CMD[3] = ((addr & 0x0000FF00) >> 8 );
+
+       spi_lock();
+       mmc_spi_cfg();
+       MMC_Enable();
+
+       /* Send command CMD24 to the MMC/SD-card (Write 1 Block/512 Bytes) */
+       tmp = Write_Command_MMC(CMD);
+       if (tmp != 0) {
+               MMC_Disable();
+               spi_unlock();
+               return(tmp);
+       }
+
+       /* Do a short delay and send a clock-pulse to the MMC/SD-card */
+       for (a = 0; a < 100; a++)
+               spi_read();
+
+       /* Send a start byte to the MMC/SD-card */
+       spi_write(0xFE);
+
+       /* Write the block (512 bytes) to the MMC/SD-card */
+       for (b = 0; b < 512; b++)
+               spi_write(*Buffer++);
+
+       /* write the CRC-Byte */
+       spi_write(0xFF); /* write a dummy CRC */
+       spi_write(0xFF); /* CRC code is not used */
+
+       /* Wait for MMC/SD-card busy */
+       while (spi_read() != 0xff) {};
+
+       /* set MMC_Chip_Select to high (MMC/SD-card inactive) */
+       MMC_Disable();
+       spi_unlock();
+       return (0);
+}
+
+/* #########################################################################
+   Routine to read the CSD register from the MMC/SD-card (16 bytes)
+   ######################################################################### */
+unsigned char mmc_read_csd (unsigned char *Buffer)
+{
+       /* Command to read the CSD register */
+       unsigned char CMD[] = {0x49, 0x00, 0x00, 0x00, 0x00, 0xFF};
+
+       MMC_Read_Block(CMD, Buffer, 16);
+
+       return (0);
+}
diff --git a/board/lpc2292sodimm/mmc_hw.h b/board/lpc2292sodimm/mmc_hw.h
new file mode 100644 (file)
index 0000000..3687dbf
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+    This module implements a linux character device driver for the 24c256 chip.
+    Copyright (C) 2006  Embedded Artists AB (www.embeddedartists.com)
+
+    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 _MMC_HW_
+#define _MMC_HW_
+
+unsigned char mmc_read_csd(unsigned char *Buffer);
+unsigned char mmc_read_sector (unsigned long addr,
+                              unsigned char *Buffer);
+unsigned char mmc_write_sector (unsigned long addr,unsigned char *Buffer);
+int mmc_hw_init(void);
+
+#endif /* _MMC_HW_ */
diff --git a/board/lpc2292sodimm/spi.c b/board/lpc2292sodimm/spi.c
new file mode 100644 (file)
index 0000000..4ba1468
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    This module implements an interface to the SPI on the lpc22xx.
+    Copyright (C) 2006  Embedded Artists AB (www.embeddedartists.com)
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <config.h>
+#include <common.h>
+#include <asm/errno.h>
+#include <asm/arch/hardware.h>
+#include "spi.h"
+
+unsigned long spi_flags;
+unsigned char spi_idle = 0x00;
+
+int spi_init(void)
+{
+       unsigned long pinsel0_value;
+
+       /* activate spi pins */
+       pinsel0_value = GET32(PINSEL0);
+       pinsel0_value &= ~(0xFFl << 8);
+       pinsel0_value |= (0x55l << 8);
+       PUT32(PINSEL0, pinsel0_value);
+
+       return 0;
+}
diff --git a/board/lpc2292sodimm/spi.h b/board/lpc2292sodimm/spi.h
new file mode 100644 (file)
index 0000000..6ae66e8
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+    This file defines the interface to the lpc22xx SPI module.
+    Copyright (C) 2006  Embedded Artists AB (www.embeddedartists.com)
+
+    This file may be included in software not adhering to the GPL.
+
+    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 SPI_H
+#define SPI_H
+
+#include <config.h>
+#include <common.h>
+#include <asm/errno.h>
+#include <asm/arch/hardware.h>
+
+#define SPIF 0x80
+
+#define spi_lock() disable_interrupts();
+#define spi_unlock() enable_interrupts();
+
+extern unsigned long spi_flags;
+extern unsigned char spi_idle;
+
+int spi_init(void);
+
+static inline unsigned char spi_read(void)
+{
+       unsigned char b;
+
+       PUT8(S0SPDR, spi_idle);
+       while (!(GET8(S0SPSR) & SPIF));
+       b = GET8(S0SPDR);
+
+       return b;
+}
+
+static inline void spi_write(unsigned char b)
+{
+       PUT8(S0SPDR, b);
+       while (!(GET8(S0SPSR) & SPIF));
+       GET8(S0SPDR);           /* this will clear the SPIF bit */
+}
+
+static inline void spi_set_clock(unsigned char clk_value)
+{
+       PUT8(S0SPCCR, clk_value);
+}
+
+static inline void spi_set_cfg(unsigned char phase,
+                              unsigned char polarity,
+                              unsigned char lsbf)
+{
+       unsigned char v = 0x20; /* master bit set */
+
+       if (phase)
+               v |= 0x08;                      /* set phase bit */
+       if (polarity) {
+               v |= 0x10;                      /* set polarity bit */
+               spi_idle = 0xFF;
+       } else {
+               spi_idle = 0x00;
+       }
+       if (lsbf)
+               v |= 0x40;                      /* set lsbf bit */
+
+       PUT8(S0SPCR, v);
+}
+#endif /* SPI_H */
diff --git a/board/lpc2292sodimm/u-boot.lds b/board/lpc2292sodimm/u-boot.lds
new file mode 100644 (file)
index 0000000..64d946c
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         cpu/arm720t/start.o   (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss : { *(.bss) }
+       _end = .;
+}
index 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..726366ddf0dccd4086efc033017a1c7a90f2ce5e 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
@@ -180,11 +180,32 @@ void lcd_enable (void)
                        break;
                udelay (PSOC_WAIT_TIME);
        }
-       if (!retries) {
-               printf ("%s Error: 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 */
index 40d304b7cc2087af0a216badb088a9f3b670a7b8..6eb5fe9cfc9950a914e9ebfad3d274a9cc701e6a 100644 (file)
@@ -164,11 +164,12 @@ long int initdram(int board_type)
                dramsize = 0;
 
        /* set SDRAM CS0 size according to the amount of RAM found */
-       if (dramsize > 0)
+       if (dramsize > 0) {
                *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x13 +
                        __builtin_ffs(dramsize >> 20) - 1;
-        else
+       } else {
                *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
+       }
 
        /* let SDRAM CS1 start right after CS0 and disable it */
        *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize;
diff --git a/board/mpc7448hpc2/Makefile b/board/mpc7448hpc2/Makefile
new file mode 100644 (file)
index 0000000..e3d757d
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# (C) Copyright 2000
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o tsi108_init.o
+SOBJS  := asm_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) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+.PHONY: distclean
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude ($obj).depend
+
+#########################################################################
diff --git a/board/mpc7448hpc2/asm_init.S b/board/mpc7448hpc2/asm_init.S
new file mode 100644 (file)
index 0000000..a7a40a1
--- /dev/null
@@ -0,0 +1,918 @@
+/*
+ * (C) Copyright 2004-05;  Tundra Semiconductor Corp.
+ *
+ * Added automatic detect of SDC settings
+ * Copyright (c) 2005 Freescale Semiconductor, Inc.
+ * Maintainer tie-fei.zang@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
+ * 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
+ */
+
+/*
+ * FILENAME: asm_init.s
+ *
+ * Originator: Alex Bounine
+ *
+ * DESCRIPTION:
+ * Initialization code for the Tundra Tsi108 bridge chip
+ *
+ */
+
+#include <config.h>
+#include <version.h>
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/processor.h>
+
+#include <tsi108.h>
+
+/*
+ * Build Configuration Options
+ */
+
+/* #define DISABLE_PBM         disables usage of PB Master */
+/* #define SDC_HARDCODED_INIT  config SDRAM controller with hardcoded values */
+/* #define SDC_AUTOPRECH_EN    enable SDRAM auto precharge */
+
+/*
+ * Hardcoded SDC settings
+ */
+
+#ifdef SDC_HARDCODED_INIT
+
+/* Micron MT9HTF6472AY-40EA1 : Unbuffered, 512MB, 400, CL3, Single Rank */
+
+#define VAL_SD_REFRESH (0x61A)
+#define VAL_SD_TIMING  (0x0308336b)
+#define VAL_SD_D0_CTRL (0x07100021)    /* auto-precharge disabled */
+#define VAL_SD_D0_BAR  (0x0FE00000)    /* 512MB @ 0x00000000 */
+#define VAL_SD_D1_CTRL (0x07100021)    /* auto-precharge disabled */
+#define VAL_SD_D1_BAR  (0x0FE00200)    /* 512MB @ 0x20000000 */
+
+#endif /* SDC_HARDCODED_INIT */
+
+/*
+ CPU Configuration:
+
+ CPU Address and Data Parity enables.
+
+#define CPU_AP
+#define CPU_DP
+*/
+
+/*
+ * Macros
+ * !!! Attention !!! Macros LOAD_PTR, LOAD_U32 and LOAD_MEM defined below are
+ * expected to work correctly for the CSR space within 32KB range.
+ *
+ * LOAD_PTR and LOAD_U32 - load specified register with a 32 bit constant.
+ * These macros are absolutely identical except their names. This difference
+ * is provided intentionally for better readable code.
+ */
+
+#define LOAD_PTR(reg,const32) \
+       addis reg,r0,const32@h; ori reg,reg,const32@l
+
+#define LOAD_U32(reg,const32) \
+       addis reg,r0,const32@h; ori reg,reg,const32@l
+
+/* LOADMEM initializes a register with the contents of a specified 32-bit
+ * memory location, usually a CSR value.
+ */
+
+#define LOAD_MEM(reg,addr32) \
+       addis reg,r0,addr32@ha; lwz reg,addr32@l(reg)
+
+#ifndef SDC_HARDCODED_INIT
+sdc_clk_sync:
+       /* MHz: 0,0,183,100,133,167,200,233 */
+       .long   0, 0, 6, 10, 8, 6, 5, 4         /* nSec */
+#endif
+
+/*
+ * board_asm_init() - early initialization function. Coded to be portable to
+ * dual-CPU configuration.
+ * Checks CPU number and performs board HW initialization if called for CPU0.
+ * Registers used: r3,r4,r5,r6,r19,r29
+ *
+ * NOTE: For dual-CPU configuration only CPU0 is allowed to configure Tsi108
+ * and the rest of the board. Current implementation demonstrates two
+ * possible ways to identify CPU number:
+ * - for MPC74xx platform: uses MSSCR0[ID] bit as defined in UM.
+ * - for PPC750FX/GX boards: uses WHO_AM_I bit reported by Tsi108.
+ */
+
+       .globl board_asm_init
+board_asm_init:
+       mflr    r19     /* Save LR to be able return later. */
+       bl      icache_enable   /* Enable icache to reduce reads from flash. */
+
+/* Initialize pointer to Tsi108 register space */
+
+       LOAD_PTR(r29,CFG_TSI108_CSR_RST_BASE)/* r29 - pointer to tsi108 CSR space */
+       ori r4,r29,TSI108_PB_REG_OFFSET
+
+/* Check Processor Version Number */
+
+       mfspr   r3, PVR
+       rlwinm  r3,r3,16,16,23  /* get ((Processor Version Number) & 0xFF00) */
+
+       cmpli   0,0,r3,0x8000   /* MPC74xx */
+       bne     cont_brd_init
+
+       /*
+        * For MPC744x/5x enable extended BATs[4-7]
+        * Sri: Set HIGH_BAT_EN and XBSEN, and SPD =1
+        * to disable prefetch
+        */
+
+       mfspr   r5, HID0
+       oris    r5, r5, 0x0080  /* Set HID0[HIGH_BAT_EN] bit #8 */
+       ori     r5, r5, 0x0380  /* Set SPD,XBSEN,SGE bits #22,23,24 */
+       mtspr   HID0, r5
+       isync
+       sync
+
+       /* Adding code to disable external interventions in MPX bus mode */
+       mfspr   r3, 1014
+       oris    r3, r3, 0x0100  /* Set the EIDIS bit in MSSCR0:  bit 7 */
+       mtspr   1014, r3
+       isync
+       sync
+
+       /* Sri: code to enable FP unit */
+       mfmsr   r3
+       ori     r3, r3, 0x2000
+       mtmsr   r3
+       isync
+       sync
+
+       /* def CONFIG_DUAL_CPU
+        * For MPC74xx processor, use MSSCR0[ID] bit to identify CPU number.
+        */
+#if(1)
+       mfspr   r3,1014         /* read MSSCR0 */
+       rlwinm. r3,r3,27,31,31  /* get processor ID number */
+       mtspr   SPRN_PIR,r3     /* Save CPU ID */
+       sync
+       bne     init_done
+       b       do_tsi108_init
+
+cont_brd_init:
+
+       /* An alternative method of checking the processor number (in addition
+        * to configuration using MSSCR0[ID] bit on MPC74xx).
+        * Good for IBM PPC750FX/GX.
+        */
+
+       lwz     r3,PB_BUS_MS_SELECT(r4) /* read PB_ID register */
+       rlwinm. r3,r3,24,31,31          /* get processor ID number */
+       bne init_done
+#else
+
+cont_brd_init:
+
+#endif /* CONFIG_DUAL_CPU */
+
+       /* Initialize Tsi108 chip */
+
+do_tsi108_init:
+
+       /*
+        * Adjust HLP/Flash parameters. By default after reset the HLP port is
+        * set to support slow devices. Better performance can be achived when
+        * an optimal parameters are used for specific EPROM device.
+        * NOTE: This should be performed ASAP for the emulation platform
+        * because it has 5MHz HLP clocking.
+        */
+
+#ifdef CONFIG_TSI108EMU
+       ori     r4,r29,TSI108_HLP_REG_OFFSET
+       LOAD_U32(r5,0x434422c0)
+       stw     r5,0x08(r4)     /* set HLP B0_CTRL0 */
+       sync
+       LOAD_U32(r5,0xd0012000)
+       stw     r5,0x0c(r4)             /* set HLP B0_CTRL1 */
+       sync
+#endif
+
+       /* Initialize PB interface. */
+
+       ori r4,r29,TSI108_PB_REG_OFFSET
+
+#if (CFG_TSI108_CSR_BASE != CFG_TSI108_CSR_RST_BASE)
+       /* Relocate (if required) Tsi108 registers. Set new value for
+        * PB_REG_BAR:
+        * Note we are in the 32-bit address mode.
+        */
+       LOAD_U32(r5,(CFG_TSI108_CSR_BASE | 0x01)) /* PB_REG_BAR: BA + EN */
+       stw     r5,PB_REG_BAR(r4)
+       andis.  r29,r5,0xFFFF
+       sync
+       ori     r4,r29,TSI108_PB_REG_OFFSET
+#endif
+
+       /* Set PB Slave configuration register */
+
+       LOAD_U32(r5,0x00002481) /* PB_SCR: TEA enabled,AACK delay = 1 */
+       lwz     r3, PB_RSR(r4)  /* get PB bus mode */
+       xori    r3,r3,0x0001    /* mask PB_BMODE: r3 -> (0 = 60X, 1 = MPX) */
+       rlwimi  r5,r3,14,17,17  /* for MPX: set DTI_MODE bit */
+       stw     r5,PB_SCR(r4)
+       sync
+
+       /* Configure PB Arbiter */
+
+       lwz     r5,PB_ARB_CTRL(r4)      /* Read PB Arbiter Control Register */
+       li      r3, 0x00F0              /* ARB_PIPELINE_DEP mask */
+#ifdef DISABLE_PBM
+       ori     r3,r3,0x1000    /* add PBM_EN to clear (enabled by default) */
+#endif
+       andc    r5,r5,r3        /* Clear the masked bit fields */
+       ori     r5,r5,0x0001    /* Set pipeline depth */
+       stw     r5,PB_ARB_CTRL(r4)
+
+#if (0)        /* currently using the default settings for PBM after reset */
+       LOAD_U32(r5,0x)         /* value for PB_MCR */
+       stw     r5,PB_MCR(r4)
+       sync
+
+       LOAD_U32(r5,0x)         /* value for PB_MCMD */
+       stw     r5,PB_MCMD(r4)
+       sync
+#endif
+
+       /* Disable or enable PVT based on processor bus frequency
+        * 1. Read CG_PWRUP_STATUS register field bits 18,17,16
+        * 2. See if the value is < or > 133mhz (18:16 = 100)
+        * 3. If > enable PVT
+        */
+
+       LOAD_U32(r3,0xC0002234)
+       lwz     r3,0(r3)
+       rlwinm  r3,r3,16,29,31
+
+       cmpi    0,0,r3,0x0004
+       bgt     sdc_init
+
+#ifndef CONFIG_TSI108EMU
+       /* FIXME: Disable PB calibration control for any real Tsi108 board */
+       li      r5,0x0101       /* disable calibration control */
+       stw     r5,PB_PVT_CTRL2(r4)
+       sync
+#endif
+
+       /* Initialize SDRAM controller. */
+
+sdc_init:
+
+#ifndef SDC_HARDCODED_INIT
+       /* get SDC clock prior doing sdram controller autoconfig */
+       ori     r4,r29,TSI108_CLK_REG_OFFSET    /* r4 - ptr to CG registers */
+       lwz     r3, CG_PWRUP_STATUS(r4)         /* get CG configuration */
+       rlwinm  r3,r3,12,29,31                  /* r3 - SD clk */
+       lis     r5,sdc_clk_sync@h
+       ori     r5,r5,sdc_clk_sync@l
+       /* Sri:  At this point check if r3 = 001. If yes,
+        * the memory frequency should be same as the
+        * MPX bus frequency
+        */
+       cmpi    0,0,r3,0x0001
+       bne     get_nsec
+       lwz     r6, CG_PWRUP_STATUS(r4)
+       rlwinm  r6,r6,16,29,31
+       mr      r3,r6
+
+get_nsec:
+       rlwinm  r3,r3,2,0,31
+       lwzx    r9,r5,r3        /* get SD clk rate in nSec */
+       /* ATTN: r9 will be used by SPD routine */
+#endif /* !SDC_HARDCODED_INIT */
+
+       ori     r4,r29,TSI108_SD_REG_OFFSET /* r4 - ptr to SDRAM registers */
+
+       /* Initialize SDRAM controller. SDRAM Size = 512MB, One DIMM. */
+
+       LOAD_U32(r5,0x00)
+       stw     r5,SD_INT_ENABLE(r4) /* Ensure that interrupts are disabled */
+#ifdef ENABLE_SDRAM_ECC
+       li      r5, 0x01
+#endif /* ENABLE_SDRAM_ECC */
+       stw     r5,SD_ECC_CTRL(r4)      /* Enable/Disable ECC */
+       sync
+
+#ifdef SDC_HARDCODED_INIT /* config sdram controller with hardcoded values */
+
+       /* First read the CG_PWRUP_STATUS register to get the
+        * memory speed from bits 22,21,20
+        */
+
+       LOAD_U32(r3,0xC0002234)
+       lwz     r3,0(r3)
+       rlwinm  r3,r3,12,29,31
+
+       /* Now first check for 166, then 200, or default */
+
+       cmpi    0,0,r3,0x0005
+       bne     check_for_200mhz
+
+       /* set values for 166 Mhz memory speed
+        * Set refresh rate and timing parameters
+        */
+       LOAD_U32(r5,0x00000515)
+       stw     r5,SD_REFRESH(r4)
+       LOAD_U32(r5,0x03073368)
+       stw     r5,SD_TIMING(r4)
+       sync
+
+       /* Initialize DIMM0 control and BAR registers */
+       LOAD_U32(r5,VAL_SD_D0_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001            /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D0_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D0_BAR)
+       stw     r5,SD_D0_BAR(r4)
+       sync
+
+       /* Initialize DIMM1 control and BAR registers
+        * (same as dimm 0, next 512MB, disabled)
+        */
+       LOAD_U32(r5,VAL_SD_D1_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001    /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D1_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D1_BAR)
+       stw     r5,SD_D1_BAR(r4)
+       sync
+
+       b       sdc_init_done
+
+check_for_200mhz:
+
+       cmpi    0,0,r3,0x0006
+       bne     set_default_values
+
+       /* set values for 200Mhz memory speed
+        * Set refresh rate and timing parameters
+        */
+       LOAD_U32(r5,0x0000061a)
+       stw     r5,SD_REFRESH(r4)
+       LOAD_U32(r5,0x03083348)
+       stw     r5,SD_TIMING(r4)
+       sync
+
+       /* Initialize DIMM0 control and BAR registers */
+       LOAD_U32(r5,VAL_SD_D0_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001            /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D0_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D0_BAR)
+       stw     r5,SD_D0_BAR(r4)
+       sync
+
+       /* Initialize DIMM1 control and BAR registers
+        * (same as dimm 0, next 512MB, disabled)
+        */
+       LOAD_U32(r5,VAL_SD_D1_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001            /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D1_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D1_BAR)
+       stw     r5,SD_D1_BAR(r4)
+       sync
+
+       b       sdc_init_done
+
+set_default_values:
+
+       /* Set refresh rate and timing parameters */
+       LOAD_U32(r5,VAL_SD_REFRESH)
+       stw     r5,SD_REFRESH(r4)
+       LOAD_U32(r5,VAL_SD_TIMING)
+       stw     r5,SD_TIMING(r4)
+       sync
+
+       /* Initialize DIMM0 control and BAR registers */
+       LOAD_U32(r5,VAL_SD_D0_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001            /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D0_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D0_BAR)
+       stw     r5,SD_D0_BAR(r4)
+       sync
+
+       /* Initialize DIMM1 control and BAR registers
+        * (same as dimm 0, next 512MB, disabled)
+        */
+       LOAD_U32(r5,VAL_SD_D1_CTRL)     /* auto-precharge disabled */
+#ifdef SDC_AUTOPRECH_EN
+       oris    r5,r5,0x0001            /* set auto precharge EN bit */
+#endif
+       stw     r5,SD_D1_CTRL(r4)
+       LOAD_U32(r5,VAL_SD_D1_BAR)
+       stw     r5,SD_D1_BAR(r4)
+       sync
+#else /* !SDC_HARDCODED_INIT */
+       bl      tsi108_sdram_spd        /* automatically detect SDC settings */
+#endif /* SDC_HARDCODED_INIT */
+
+sdc_init_done:
+
+#ifdef DISABLE_PBM
+       LOAD_U32(r5,0x00000030)         /* PB_EN + OCN_EN */
+#else
+       LOAD_U32(r5,0x00000230)         /* PB_EN + OCN_EN + PB/OCN=80/20 */
+#endif /* DISABLE_PBM */
+
+#ifdef CONFIG_TSI108EMU
+       oris    r5,r5,0x0010            /* set EMULATION_MODE bit */
+#endif
+
+       stw     r5,SD_CTRL(r4)
+       eieio
+       sync
+
+       /* Enable SDRAM access */
+
+       oris    r5,r5,0x8000            /* start SDC: set SD_CTRL[ENABLE] bit */
+       stw     r5,SD_CTRL(r4)
+       sync
+
+wait_init_complete:
+       lwz     r5,SD_STATUS(r4)
+       andi.   r5,r5,0x0001
+       /* wait until SDRAM initialization is complete */
+       beq     wait_init_complete
+
+       /* Map SDRAM into the processor bus address space */
+
+       ori     r4,r29,TSI108_PB_REG_OFFSET
+
+       /* Setup BARs associated with direct path PB<->SDRAM */
+
+       /* PB_SDRAM_BAR1:
+        * provides a direct path to the main system memory (cacheable SDRAM)
+        */
+
+       /* BA=0,Size=512MB, ENable, No Addr.Translation */
+       LOAD_U32(r5, 0x00000011)
+       stw     r5,PB_SDRAM_BAR1(r4)
+       sync
+
+       /* Make sure that PB_SDRAM_BAR1 decoder is set
+        * (to allow following immediate read from SDRAM)
+        */
+       lwz     r5,PB_SDRAM_BAR1(r4)
+       sync
+
+       /* PB_SDRAM_BAR2:
+        * provides non-cacheable alias (via the direct path) to main
+        * system memory.
+        * Size = 512MB, ENable, Addr.Translation - ON,
+        * BA = 0x0_40000000, TA = 0x0_00000000
+        */
+
+       LOAD_U32(r5, 0x40010011)
+       stw     r5,PB_SDRAM_BAR2(r4)
+       sync
+
+       /* Make sure that PB_SDRAM_BAR2 decoder is set
+        * (to allow following immediate read from SDRAM)
+        */
+       lwz     r5,PB_SDRAM_BAR2(r4)
+       sync
+
+init_done:
+
+       /* All done. Restore LR and return. */
+       mtlr    r19
+       blr
+
+#if (0)
+       /*
+        * init_cpu1
+        * This routine enables CPU1 on the dual-processor system.
+        * Now there is only one processor in the system
+        */
+
+       .global enable_cpu1
+enable_cpu1:
+
+       lis     r3,Tsi108_Base@ha       /* Get Grendel CSR Base Addr */
+       addi    r3,r3,Tsi108_Base@l
+       lwz     r3,0(r3)                /* R3 = CSR Base Addr */
+       ori     r4,r3,TSI108_PB_REG_OFFSET
+       lwz     r3,PB_ARB_CTRL(r4)      /* Read PB Arbiter Control Register */
+       ori     r3,r3,0x0200            /* Set M1_EN bit */
+       stw     r3,PB_ARB_CTRL(r4)
+
+       blr
+#endif
+
+       /*
+        * enable_EI
+        * Enable CPU core external interrupt
+        */
+
+       .global enable_EI
+enable_EI:
+       mfmsr   r3
+       ori     r3,r3,0x8000    /* set EE bit */
+       mtmsr   r3
+       blr
+
+       /*
+        * disable_EI
+        * Disable CPU core external interrupt
+        */
+
+       .global disable_EI
+disable_EI:
+       mfmsr   r3
+       li      r4,-32768       /* aka "li  r4,0x8000" */
+       andc    r3,r3,r4        /* clear EE bit */
+       mtmsr   r3
+       blr
+
+#ifdef ENABLE_SDRAM_ECC
+       /* enables SDRAM ECC  */
+
+       .global enable_ECC
+enable_ECC:
+       ori     r4,r29,TSI108_SD_REG_OFFSET
+       lwz     r3,SD_ECC_CTRL(r4)      /* Read SDRAM ECC Control Register */
+       ori     r3,r3,0x0001            /* Set ECC_EN bit */
+       stw     r3,SD_ECC_CTRL(r4)
+       blr
+
+       /*
+        * clear_ECC_err
+        * Clears all pending SDRAM ECC errors
+        * (normally after SDRAM scrubbing/initialization)
+        */
+
+       .global clear_ECC_err
+clear_ECC_err:
+       ori r4,r29,TSI108_SD_REG_OFFSET
+       ori r3,r0,0x0030        /* ECC_UE_INT + ECC_CE_INT bits */
+       stw r3,SD_INT_STATUS(r4)
+       blr
+
+#endif /* ENABLE_SDRAM_ECC */
+
+#ifndef SDC_HARDCODED_INIT
+
+       /* SDRAM SPD Support */
+#define        SD_I2C_CTRL1    (0x400)
+#define        SD_I2C_CTRL2    (0x404)
+#define SD_I2C_RD_DATA (0x408)
+#define SD_I2C_WR_DATA (0x40C)
+
+       /*
+        * SDRAM SPD Support Macros
+        */
+
+#define SPD_DIMM0      (0x00000100)
+#define SPD_DIMM1      (0x00000200)    /* SPD_DIMM1 was 0x00000000 */
+
+#define SPD_RDIMM                      (0x01)
+#define SPD_UDIMM                      (0x02)
+
+#define SPD_CAS_3                      0x8
+#define SPD_CAS_4                      0x10
+#define SPD_CAS_5                      0x20
+
+#define ERR_NO_DIMM_FOUND              (0xdb0)
+#define ERR_TRAS_FAIL                  (0xdb1)
+#define ERR_TRCD_FAIL                  (0xdb2)
+#define ERR_TRP_FAIL                   (0xdb3)
+#define ERR_TWR_FAIL                   (0xdb4)
+#define ERR_UNKNOWN_PART               (0xdb5)
+#define ERR_NRANK_INVALID              (0xdb6)
+#define ERR_DIMM_SIZE                  (0xdb7)
+#define ERR_ADDR_MODE                  (0xdb8)
+#define ERR_RFRSH_RATE                 (0xdb9)
+#define ERR_DIMM_TYPE                  (0xdba)
+#define ERR_CL_VALUE                   (0xdbb)
+#define ERR_TRFC_FAIL                  (0xdbc)
+
+/* READ_SPD requirements:
+ * byte - byte address in SPD device (0 - 255)
+ * r3 = will return data read from I2C Byte location
+ * r4 - unchanged (SDC base addr)
+ * r5 - clobbered in routine (I2C status)
+ * r10 - number of DDR slot where first SPD device is detected
+ */
+
+#define READ_SPD(byte_num)             \
+       addis   r3, 0, byte_num@l;      \
+       or      r3, r3, r10;            \
+       ori     r3, r3, 0x0A;           \
+       stw     r3, SD_I2C_CTRL1(r4);   \
+       li      r3, I2C_CNTRL2_START;   \
+       stw     r3, SD_I2C_CTRL2(r4);   \
+       eieio;                          \
+       sync;                           \
+       li      r3, 0x100;              \
+1:;                                    \
+       addic.  r3, r3, -1;             \
+       bne     1b;                     \
+2:;                                    \
+       lwz     r5, SD_I2C_CTRL2(r4);   \
+       rlwinm. r3,r5,0,23,23;          \
+       bne     2b;                     \
+       rlwinm. r3,r5,0,3,3;            \
+       lwz     r3,SD_I2C_RD_DATA(r4)
+
+#define SPD_MIN_RFRSH  (0x80)
+#define SPD_MAX_RFRSH  (0x85)
+
+refresh_rates: /* in nSec */
+       .long   15625   /* Normal (0x80) */
+       .long   3900    /* Reduced 0.25x (0x81) */
+       .long   7800    /* Reduced 0.5x (0x82) */
+       .long   31300   /* Extended 2x (0x83) */
+       .long   62500   /* Extended 4x (0x84) */
+       .long   125000  /* Extended 8x (0x85) */
+
+/*
+ * tsi108_sdram_spd
+ *
+ * Inittializes SDRAM Controller using DDR2 DIMM Serial Presence Detect data
+ * Uses registers: r4 - SDC base address (not changed)
+ *                                r9 - SDC clocking period in nSec
+ * Changes registers: r3,r5,r6,r7,r8,r10,r11
+ */
+
+tsi108_sdram_spd:
+
+       li      r10,SPD_DIMM0
+       xor     r11,r11,r11             /* DIMM Base Address: starts from 0 */
+
+do_first_dimm:
+
+       /* Program Refresh Rate Register */
+
+       READ_SPD(12)                    /* get Refresh Rate */
+       beq     check_next_slot
+       li      r5, ERR_RFRSH_RATE
+       cmpi    0,0,r3,SPD_MIN_RFRSH
+       ble     spd_fail
+       cmpi    0,0,r3,SPD_MAX_RFRSH
+       bgt     spd_fail
+       addi    r3,r3,-SPD_MIN_RFRSH
+       rlwinm  r3,r3,2,0,31
+       lis     r5,refresh_rates@h
+       ori     r5,r5,refresh_rates@l
+       lwzx    r5,r5,r3                /* get refresh rate in nSec */
+       divwu   r5,r5,r9                /* calculate # of SDC clocks */
+       stw     r5,SD_REFRESH(r4)       /* Set refresh rate */
+       sync
+
+       /* Program SD Timing Register */
+
+       li      r7, 0           /* clear r7 prior parameter collection */
+
+       READ_SPD(20)            /* get DIMM type: Registered or Unbuffered */
+       beq     spd_read_fail
+       li      r5, ERR_DIMM_TYPE
+       cmpi    0,0,r3,SPD_UDIMM
+       beq     do_cl
+       cmpi    0,0,r3,SPD_RDIMM
+       bne     spd_fail
+       oris    r7,r7,0x1000    /* set SD_TIMING[DIMM_TYPE] bit */
+
+do_cl:
+       READ_SPD(18)            /* Get CAS Latency */
+       beq     spd_read_fail
+       li      r5,ERR_CL_VALUE
+       andi.   r6,r3,SPD_CAS_3
+       beq     cl_4
+       li      r6,3
+       b       set_cl
+cl_4:
+       andi.   r6,r3,SPD_CAS_4
+       beq     cl_5
+       li      r6,4
+       b       set_cl
+cl_5:
+       andi.   r6,r3,SPD_CAS_5
+       beq     spd_fail
+       li      r6,5
+set_cl:
+       rlwimi  r7,r6,24,5,7
+
+       READ_SPD(30)            /* Get tRAS */
+       beq     spd_read_fail
+       divwu   r6,r3,r9
+       mullw   r8,r6,r9
+       subf.   r8,r8,r3
+       beq     set_tras
+       addi    r6,r6,1
+set_tras:
+       li r5,ERR_TRAS_FAIL
+       cmpi    0,0,r6,0x0F     /* max supported value */
+       bgt     spd_fail
+       rlwimi  r7,r6,16,12,15
+
+       READ_SPD(29)    /* Get tRCD */
+       beq     spd_read_fail
+       /* right shift tRCD by 2 bits as per DDR2 spec */
+       rlwinm  r3,r3,30,2,31
+       divwu   r6,r3,r9
+       mullw   r8,r6,r9
+       subf.   r8,r8,r3
+       beq     set_trcd
+       addi    r6,r6,1
+set_trcd:
+       li      r5,ERR_TRCD_FAIL
+       cmpi    0,0,r6,0x07     /* max supported value */
+       bgt     spd_fail
+       rlwimi  r7,r6,12,17,19
+
+       READ_SPD(27)    /* Get tRP value */
+       beq     spd_read_fail
+       rlwinm  r3,r3,30,2,31   /* right shift tRP by 2 bits as per DDR2 spec */
+       divwu   r6,r3,r9
+       mullw   r8,r6,r9
+       subf.   r8,r8,r3
+       beq     set_trp
+       addi    r6,r6,1
+set_trp:
+       li      r5,ERR_TRP_FAIL
+       cmpi    0,0,r6,0x07     /* max supported value */
+       bgt     spd_fail
+       rlwimi  r7,r6,8,21,23
+
+       READ_SPD(36)    /* Get tWR value */
+       beq     spd_read_fail
+       rlwinm  r3,r3,30,2,31   /* right shift tWR by 2 bits as per DDR2 spec */
+       divwu   r6,r3,r9
+       mullw   r8,r6,r9
+       subf.   r8,r8,r3
+       beq     set_twr
+       addi    r6,r6,1
+set_twr:
+       addi    r6,r6,-1        /* Tsi108 SDC always gives one extra clock */
+       li      r5,ERR_TWR_FAIL
+       cmpi    0,0,r6,0x07     /* max supported value */
+       bgt     spd_fail
+       rlwimi  r7,r6,5,24,26
+
+       READ_SPD(42)    /* Get tRFC */
+       beq     spd_read_fail
+       li      r5, ERR_TRFC_FAIL
+       /* Tsi108 spec: tRFC=(tRFC + 1)/2 */
+       addi    r3,r3,1
+       rlwinm. r3,r3,31,1,31   /* divide by 2 */
+       beq     spd_fail
+       divwu   r6,r3,r9
+       mullw   r8,r6,r9
+       subf.   r8,r8,r3
+       beq     set_trfc
+       addi    r6,r6,1
+set_trfc:
+       cmpi    0,0,r6,0x1F     /* max supported value */
+       bgt     spd_fail
+       rlwimi  r7,r6,0,27,31
+
+       stw     r7,SD_TIMING(r4)
+       sync
+
+       /*
+        * The following two registers are set on per-DIMM basis.
+        * The SD_REFRESH and SD_TIMING settings are common for both DIMMS
+        */
+
+do_each_dimm:
+
+       /* Program SDRAM DIMM Control Register */
+
+       li      r7, 0           /* clear r7 prior parameter collection */
+
+       READ_SPD(13)            /* Get Primary SDRAM Width */
+       beq     spd_read_fail
+       cmpi    0,0,r3,4        /* Check for 4-bit SDRAM */
+       beq     do_nbank
+       oris    r7,r7,0x0010    /* Set MEM_WIDTH bit */
+
+do_nbank:
+       READ_SPD(17)            /* Get Number of banks on SDRAM device */
+       beq     spd_read_fail
+       /* Grendel only distinguish betw. 4 or 8-bank memory parts */
+       li      r5,ERR_UNKNOWN_PART     /* non-supported memory part */
+       cmpi    0,0,r3,4
+       beq     do_nrank
+       cmpi    0,0,r3,8
+       bne     spd_fail
+       ori     r7,r7,0x1000
+
+do_nrank:
+       READ_SPD(5)             /* Get # of Ranks */
+       beq     spd_read_fail
+       li      r5,ERR_NRANK_INVALID
+       andi.   r6,r3,0x7       /* Use bits [2..0] only */
+       beq     do_addr_mode
+       cmpi    0,0,r6,1
+       bgt     spd_fail
+       rlwimi  r7,r6,8,23,23
+
+do_addr_mode:
+       READ_SPD(4)             /* Get # of Column Addresses */
+       beq     spd_read_fail
+       li      r5, ERR_ADDR_MODE
+       andi.   r3,r3,0x0f      /* cut off reserved bits */
+       cmpi    0,0,r3,8
+       ble     spd_fail
+       cmpi    0,0,r3,15
+       bgt     spd_fail
+       addi    r6,r3,-8        /* calculate ADDR_MODE parameter */
+       rlwimi  r7,r6,4,24,27   /* set ADDR_MODE field */
+
+set_dimm_ctrl:
+#ifdef SDC_AUTOPRECH_EN
+       oris    r7,r7,0x0001    /* set auto precharge EN bit */
+#endif
+       ori     r7,r7,1         /* set ENABLE bit */
+       cmpi    0,0,r10,SPD_DIMM0
+       bne     1f
+       stw     r7,SD_D0_CTRL(r4)
+       sync
+       b       set_dimm_bar
+1:
+       stw     r7,SD_D1_CTRL(r4)
+       sync
+
+
+       /* Program SDRAM DIMMx Base Address Register */
+
+set_dimm_bar:
+       READ_SPD(5)             /* get # of Ranks */
+       beq     spd_read_fail
+       andi.   r7,r3,0x7
+       addi    r7,r7,1
+       READ_SPD(31)            /* Read DIMM rank density */
+       beq     spd_read_fail
+       rlwinm  r5,r3,27,29,31
+       rlwinm  r6,r3,3,24,28
+       or      r5,r6,r5        /* r5 = Normalized Rank Density byte */
+       lis     r8, 0x0080      /* 128MB >> 4 */
+       mullw   r8,r8,r5        /* r8 = (rank_size >> 4) */
+       mullw   r8,r8,r7        /* r8 = (DIMM_size >> 4) */
+       neg     r7,r8
+       rlwinm  r7,r7,28,4,31
+       or      r7,r7,r11       /* set ADDR field */
+       rlwinm  r8,r8,12,20,31
+       add     r11,r11,r8      /* set Base Addr for next DIMM */
+
+       cmpi    0,0,r10,SPD_DIMM0
+       bne     set_dimm1_size
+       stw     r7,SD_D0_BAR(r4)
+       sync
+       li      r10,SPD_DIMM1
+       READ_SPD(0)
+       bne do_each_dimm
+       b spd_done
+
+set_dimm1_size:
+       stw     r7,SD_D1_BAR(r4)
+       sync
+spd_done:
+       blr
+
+check_next_slot:
+       cmpi    0,0,r10,SPD_DIMM1
+       beq     spd_read_fail
+       li      r10,SPD_DIMM1
+       b       do_first_dimm
+spd_read_fail:
+       ori     r3,r0,0xdead
+       b       err_hung
+spd_fail:
+       li      r3,0x0bad
+       sync
+err_hung:      /* hang here for debugging */
+       nop
+       nop
+       b       err_hung
+
+#endif /* !SDC_HARDCODED_INIT */
diff --git a/board/mpc7448hpc2/config.mk b/board/mpc7448hpc2/config.mk
new file mode 100644 (file)
index 0000000..2e58858
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2005 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.
+#
+# 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
+#
+
+# Flash address
+TEXT_BASE = 0xFF000000
+# RAM address
+#TEXT_BASE = 0x00400000
+
+PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -maltivec -mabi=altivec -msoft-float
diff --git a/board/mpc7448hpc2/mpc7448hpc2.c b/board/mpc7448hpc2/mpc7448hpc2.c
new file mode 100644 (file)
index 0000000..63c99de
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * (C) Copyright 2005 Freescale Semiconductor, Inc.
+ *
+ * Roy Zang <tie-fei.zang@freescale.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * modifications for the Tsi108 Emul Board by avb@Tundra
+ */
+
+/*
+ * board support/init functions for the
+ * Freescale MPC7448 HPC2 (High-Performance Computing 2 Platform).
+ */
+
+#include <common.h>
+#include <74xx_7xx.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+extern void ft_cpu_setup (void *blob, bd_t *bd);
+#endif
+
+#undef DEBUG
+
+extern void flush_data_cache (void);
+extern void invalidate_l1_instruction_cache (void);
+extern void tsi108_init_f (void);
+
+int display_mem_map (void);
+
+void after_reloc (ulong dest_addr)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       /*
+        * Jump to the main U-Boot board init code
+        */
+       board_init_r ((gd_t *) gd, dest_addr);
+       /* NOTREACHED */
+}
+
+/*
+ * Check Board Identity:
+ * report board type
+ */
+
+int checkboard (void)
+{
+       int l_type = 0;
+
+       printf ("BOARD: %s\n", CFG_BOARD_NAME);
+       return (l_type);
+}
+
+/*
+ * Read Processor ID:
+ *
+ * report calling processor number
+ */
+
+int read_pid (void)
+{
+       return 0;               /* we are on single CPU platform for a while */
+}
+
+long int dram_size (int board_type)
+{
+       return 0x20000000;      /* 256M bytes */
+}
+
+long int initdram (int board_type)
+{
+       return dram_size (board_type);
+}
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void
+ft_board_setup (void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+       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/mpc7448hpc2/tsi108_init.c b/board/mpc7448hpc2/tsi108_init.c
new file mode 100644 (file)
index 0000000..8a7efef
--- /dev/null
@@ -0,0 +1,665 @@
+/*****************************************************************************
+ * (C) Copyright 2003;  Tundra Semiconductor Corp.
+ *
+ * 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
+ *****************************************************************************/
+
+/*----------------------------------------------------------------------------
+ * FILENAME: tsi108_init.c
+ *
+ * Originator: Alex Bounine
+ *
+ * DESCRIPTION:
+ * Initialization code for the Tundra Tsi108 bridge chip
+ *---------------------------------------------------------------------------*/
+
+#include <common.h>
+#include <74xx_7xx.h>
+#include <config.h>
+#include <version.h>
+#include <asm/processor.h>
+#include <tsi108.h>
+
+extern void mpicInit (int verbose);
+
+/*
+ * Configuration Options
+ */
+
+typedef struct {
+       ulong upper;
+       ulong lower;
+} PB2OCN_LUT_ENTRY;
+
+PB2OCN_LUT_ENTRY pb2ocn_lut1[32] = {
+       /* 0 - 7 */
+       {0x00000000, 0x00000201}, /* PBA=0xE000_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE100_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE200_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE300_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE400_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE500_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE600_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE700_0000 -> PCI/X (Byte-Swap) */
+
+       /* 8 - 15 */
+       {0x00000000, 0x00000201}, /* PBA=0xE800_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xE900_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xEA00_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xEB00_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xEC00_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xED00_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xEE00_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xEF00_0000 -> PCI/X (Byte-Swap) */
+
+       /* 16 - 23 */
+       {0x00000000, 0x00000201}, /* PBA=0xF000_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF100_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF200_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF300_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF400_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF500_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF600_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF700_0000 -> PCI/X (Byte-Swap) */
+       /* 24 - 31 */
+       {0x00000000, 0x00000201}, /* PBA=0xF800_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xF900_0000 -> PCI/X (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xFA00_0000 -> PCI/X  PCI I/O (Byte-Swap) */
+       {0x00000000, 0x00000201}, /* PBA=0xFB00_0000 -> PCI/X  PCI Config (Byte-Swap) */
+
+       {0x00000000, 0x02000240}, /* PBA=0xFC00_0000 -> HLP */
+       {0x00000000, 0x01000240}, /* PBA=0xFD00_0000 -> HLP */
+       {0x00000000, 0x03000240}, /* PBA=0xFE00_0000 -> HLP */
+       {0x00000000, 0x00000240}  /* PBA=0xFF00_0000 -> HLP : (Translation Enabled + Byte-Swap)*/
+};
+
+#ifdef CFG_CLK_SPREAD
+typedef struct {
+       ulong ctrl0;
+       ulong ctrl1;
+} PLL_CTRL_SET;
+
+/*
+ * Clock Generator SPLL0 initialization values
+ * PLL0 configuration table for various PB_CLKO freq.
+ * Uses pre-calculated values for Fs = 30 kHz, D = 0.5%
+ * Fout depends on required PB_CLKO. Based on Fref = 33 MHz
+ */
+
+static PLL_CTRL_SET pll0_config[8] = {
+       {0x00000000, 0x00000000},       /* 0: bypass */
+       {0x00000000, 0x00000000},       /* 1: reserved */
+       {0x00430044, 0x00000043},       /* 2: CG_PB_CLKO = 183 MHz */
+       {0x005c0044, 0x00000039},       /* 3: CG_PB_CLKO = 100 MHz */
+       {0x005c0044, 0x00000039},       /* 4: CG_PB_CLKO = 133 MHz */
+       {0x004a0044, 0x00000040},       /* 5: CG_PB_CLKO = 167 MHz */
+       {0x005c0044, 0x00000039},       /* 6: CG_PB_CLKO = 200 MHz */
+       {0x004f0044, 0x0000003e}        /* 7: CG_PB_CLKO = 233 MHz */
+};
+#endif /* CFG_CLK_SPREAD */
+
+/*
+ * Prosessor Bus Clock (in MHz) defined by CG_PB_SELECT
+ * (based on recommended Tsi108 reference clock 33MHz)
+ */
+static int pb_clk_sel[8] = { 0, 0, 183, 100, 133, 167, 200, 233 };
+
+/*
+ * get_board_bus_clk ()
+ *
+ * returns the bus clock in Hz.
+ */
+unsigned long get_board_bus_clk (void)
+{
+       ulong i;
+
+       /* Detect PB clock freq. */
+       i = in32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
+       i = (i >> 16) & 0x07;   /* Get PB PLL multiplier */
+
+       return pb_clk_sel[i] * 1000000;
+}
+
+/*
+ * board_early_init_f ()
+ *
+ * board-specific initialization executed from flash
+ */
+
+int board_early_init_f (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       ulong i;
+
+       gd->mem_clk = 0;
+       i = in32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET +
+                       CG_PWRUP_STATUS);
+       i = (i >> 20) & 0x07;   /* Get GD PLL multiplier */
+       switch (i) {
+       case 0: /* external clock */
+               printf ("Using external clock\n");
+               break;
+       case 1: /* system clock */
+               gd->mem_clk = gd->bus_clk;
+               break;
+       case 4: /* 133 MHz */
+       case 5: /* 166 MHz */
+       case 6: /* 200 MHz */
+               gd->mem_clk = pb_clk_sel[i] * 1000000;
+               break;
+       default:
+               printf ("Invalid DDR2 clock setting\n");
+               return -1;
+       }
+       printf ("BUS: %d MHz\n", get_board_bus_clk() / 1000000);
+       printf ("MEM: %d MHz\n", gd->mem_clk / 1000000);
+       return 0;
+}
+
+/*
+ * board_early_init_r() - Tsi108 initialization function executed right after
+ * relocation. Contains code that cannot be executed from flash.
+ */
+
+int board_early_init_r (void)
+{
+       ulong temp, i;
+       ulong reg_val;
+       volatile ulong *reg_ptr;
+
+       reg_ptr =
+               (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x900);
+
+       for (i = 0; i < 32; i++) {
+               *reg_ptr++ = 0x00000201;        /* SWAP ENABLED */
+               *reg_ptr++ = 0x00;
+       }
+
+       __asm__ __volatile__ ("eieio");
+       __asm__ __volatile__ ("sync");
+
+       /* Setup PB_OCN_BAR2: size 256B + ENable @ 0x0_80000000 */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2,
+               0x80000001);
+       __asm__ __volatile__ ("sync");
+
+       /* Make sure that OCN_BAR2 decoder is set (to allow following immediate
+        * read from SDRAM)
+        */
+
+       temp = in32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2);
+       __asm__ __volatile__ ("sync");
+
+       /*
+        * Remap PB_OCN_BAR1 to accomodate PCI-bus aperture and EPROM into the
+        * processor bus address space. Immediately after reset LUT and address
+        * translation are disabled for this BAR. Now we have to initialize LUT
+        * and switch from the BOOT mode to the normal operation mode.
+        *
+        * The aperture defined by PB_OCN_BAR1 startes at address 0xE0000000
+        * and covers 512MB of address space. To allow larger aperture we also
+        * have to relocate register window of Tsi108
+        *
+        * Initialize LUT (32-entries) prior switching PB_OCN_BAR1 from BOOT
+        * mode.
+        *
+        * initialize pointer to LUT associated with PB_OCN_BAR1
+        */
+       reg_ptr =
+               (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x800);
+
+       for (i = 0; i < 32; i++) {
+               *reg_ptr++ = pb2ocn_lut1[i].lower;
+               *reg_ptr++ = pb2ocn_lut1[i].upper;
+       }
+
+       __asm__ __volatile__ ("sync");
+
+       /* Base addresses for CS0, CS1, CS2, CS3 */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_ADDR,
+               0x00000000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_ADDR,
+               0x00100000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_ADDR,
+               0x00200000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_ADDR,
+               0x00300000);
+       __asm__ __volatile__ ("sync");
+
+       /* Masks for HLP banks */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_MASK,
+               0xFFF00000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_MASK,
+               0xFFF00000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_MASK,
+               0xFFF00000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_MASK,
+               0xFFF00000);
+       __asm__ __volatile__ ("sync");
+
+       /* Set CTRL0 values for banks */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL0,
+               0x7FFC44C2);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL0,
+               0x7FFC44C0);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL0,
+               0x7FFC44C0);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL0,
+               0x7FFC44C2);
+       __asm__ __volatile__ ("sync");
+
+       /* Set banks to latched mode, enabled, and other default settings */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL1,
+               0x7C0F2000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL1,
+               0x7C0F2000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL1,
+               0x7C0F2000);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL1,
+               0x7C0F2000);
+       __asm__ __volatile__ ("sync");
+
+       /*
+        * Set new value for PB_OCN_BAR1: switch from BOOT to LUT mode.
+        * value for PB_OCN_BAR1: (BA-0xE000_0000 + size 512MB + ENable)
+        */
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1,
+               0xE0000011);
+       __asm__ __volatile__ ("sync");
+
+       /* Make sure that OCN_BAR2 decoder is set (to allow following
+        * immediate read from SDRAM)
+        */
+
+       temp = in32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1);
+       __asm__ __volatile__ ("sync");
+
+       /*
+        * SRI: At this point we have enabled the HLP banks. That means we can
+        * now read from the NVRAM and initialize the environment variables.
+        * We will over-ride the env_init called in board_init_f
+        * This is really a work-around because, the HLP bank 1
+        * where NVRAM resides is not visible during board_init_f
+        * (lib_ppc/board.c)
+        * Alternatively, we could use the I2C EEPROM at start-up to configure
+        * and enable all HLP banks and not just HLP 0 as is being done for
+        * Taiga Rev. 2.
+        */
+
+       env_init ();
+
+#ifndef DISABLE_PBM
+
+       /*
+        * For IBM processors we have to set Address-Only commands generated
+        * by PBM that are different from ones set after reset.
+        */
+
+       temp = get_cpu_type ();
+
+       if ((CPU_750FX == temp) || (CPU_750GX == temp))
+               out32 (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_MCMD,
+                       0x00009955);
+#endif /* DISABLE_PBM */
+
+#ifdef CONFIG_PCI
+       /*
+        * Initialize PCI/X block
+        */
+
+       /* Map PCI/X Configuration Space (16MB @ 0x0_FE000000) */
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
+               PCI_PFAB_BAR0_UPPER, 0);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_BAR0,
+               0xFB000001);
+       __asm__ __volatile__ ("sync");
+
+       /* Set Bus Number for the attached PCI/X bus (we will use 0 for NB) */
+
+       temp =  in32(CFG_TSI108_CSR_BASE +
+               TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT);
+
+       temp &= ~0xFF00;        /* Clear the BUS_NUM field */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT,
+               temp);
+
+       /* Map PCI/X IO Space (64KB @ 0x0_FD000000) takes one 16MB LUT entry */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO_UPPER,
+               0);
+       __asm__ __volatile__ ("sync");
+
+       /* This register is on the PCI side to interpret the address it receives
+        * and maps it as a IO address.
+        */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO,
+               0xFA000001);
+       __asm__ __volatile__ ("sync");
+
+       /*
+        * Map PCI/X Memory Space
+        *
+        * Transactions directed from OCM to PCI Memory Space are directed
+        * from PB to PCI
+        * unchanged (as defined by PB_OCN_BAR1,2 and LUT settings).
+        * If address remapping is required the corresponding PCI_PFAB_MEM32
+        * and PCI_PFAB_PFMx register groups have to be configured.
+        *
+        * Map the path from the PCI/X bus into the system memory
+        *
+        * The memory mapped window assotiated with PCI P2O_BAR2 provides
+        * access to the system memory without address remapping.
+        * All system memory is opened for accesses initiated by PCI/X bus
+        * masters.
+        *
+        * Initialize LUT associated with PCI P2O_BAR2
+        *
+        * set pointer to LUT associated with PCI P2O_BAR2
+        */
+
+       reg_ptr =
+               (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x500);
+
+#ifdef DISABLE_PBM
+
+       /* In case when PBM is disabled (no HW supported cache snoopng on PB)
+        * P2O_BAR2 is directly mapped into the system memory without address
+        * translation.
+        */
+
+       reg_val = 0x00000004;   /* SDRAM port + NO Addr_Translation */
+
+       for (i = 0; i < 32; i++) {
+               *reg_ptr++ = reg_val;   /* P2O_BAR2_LUTx */
+               *reg_ptr++ = 0;         /* P2O_BAR2_LUT_UPPERx */
+       }
+
+       /* value for PCI BAR2 (size = 512MB, Enabled, No Addr. Translation) */
+       reg_val = 0x00007500;
+#else
+
+       reg_val = 0x00000002;   /* Destination port = PBM */
+
+       for (i = 0; i < 32; i++) {
+               *reg_ptr++ = reg_val;   /* P2O_BAR2_LUTx */
+/* P2O_BAR2_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
+               *reg_ptr++ = 0x40000000;
+/* offset = 16MB, address translation is enabled to allow byte swapping */
+               reg_val += 0x01000000;
+       }
+
+/* value for PCI BAR2 (size = 512MB, Enabled, Address Translation Enabled) */
+       reg_val = 0x00007100;
+#endif
+
+       __asm__ __volatile__ ("eieio");
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
+               reg_val);
+       __asm__ __volatile__ ("sync");
+
+       /* Set 64-bit PCI bus address for system memory
+        * ( 0 is the best choice for easy mapping)
+        */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2,
+               0x00000000);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2_UPPER,
+               0x00000000);
+       __asm__ __volatile__ ("sync");
+
+#ifndef DISABLE_PBM
+       /*
+        *  The memory mapped window assotiated with PCI P2O_BAR3 provides
+        *  access to the system memory using SDRAM OCN port and address
+        *  translation. This is alternative way to access SDRAM from PCI
+        *  required for Tsi108 emulation testing.
+        *  All system memory is opened for accesses initiated by
+        *  PCI/X bus masters.
+        *
+        *  Initialize LUT associated with PCI P2O_BAR3
+        *
+        *  set pointer to LUT associated with PCI P2O_BAR3
+        */
+       reg_ptr =
+               (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x600);
+
+       reg_val = 0x00000004;   /* Destination port = SDC */
+
+       for (i = 0; i < 32; i++) {
+               *reg_ptr++ = reg_val;   /* P2O_BAR3_LUTx */
+
+/* P2O_BAR3_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
+               *reg_ptr++ = 0;
+
+/* offset = 16MB, address translation is enabled to allow byte swapping */
+               reg_val += 0x01000000;
+       }
+
+       __asm__ __volatile__ ("eieio");
+       __asm__ __volatile__ ("sync");
+
+       /* Configure PCI P2O_BAR3 (size = 512MB, Enabled) */
+
+       reg_val =
+               in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
+                PCI_P2O_PAGE_SIZES);
+       reg_val &= ~0x00FF;
+       reg_val |= 0x0071;
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
+               reg_val);
+       __asm__ __volatile__ ("sync");
+
+       /* Set 64-bit base PCI bus address for window (0x20000000) */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3_UPPER,
+               0x00000000);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3,
+               0x20000000);
+       __asm__ __volatile__ ("sync");
+
+#endif /* !DISABLE_PBM */
+
+#ifdef ENABLE_PCI_CSR_BAR
+       /* open if required access to Tsi108 CSRs from the PCI/X bus */
+       /* enable BAR0 on the PCI/X bus */
+       reg_val = in32(CFG_TSI108_CSR_BASE +
+               TSI108_PCI_REG_OFFSET + PCI_MISC_CSR);
+       reg_val |= 0x02;
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_MISC_CSR,
+               reg_val);
+       __asm__ __volatile__ ("sync");
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0_UPPER,
+               0x00000000);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0,
+               CFG_TSI108_CSR_BASE);
+       __asm__ __volatile__ ("sync");
+
+#endif
+
+       /*
+        * Finally enable PCI/X Bus Master and Memory Space access
+        */
+
+       reg_val = in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR);
+       reg_val |= 0x06;
+       out32 (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR, reg_val);
+       __asm__ __volatile__ ("sync");
+
+#endif /* CONFIG_PCI */
+
+       /*
+        * Initialize MPIC outputs (interrupt pins):
+        * Interrupt routing on the Grendel Emul. Board:
+        * PB_INT[0] -> INT (CPU0)
+        * PB_INT[1] -> INT (CPU1)
+        * PB_INT[2] -> MCP (CPU0)
+        * PB_INT[3] -> MCP (CPU1)
+        * Set interrupt controller outputs as Level_Sensitive/Active_Low
+        */
+       out32 (CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(0), 0x02);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(1), 0x02);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(2), 0x02);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(3), 0x02);
+       __asm__ __volatile__ ("sync");
+
+       /*
+        * Ensure that Machine Check exception is enabled
+        * We need it to support PCI Bus probing (configuration reads)
+        */
+
+       reg_val = mfmsr ();
+       mtmsr(reg_val | MSR_ME);
+
+       return 0;
+}
+
+/*
+ * Needed to print out L2 cache info
+ * used in the misc_init_r function
+ */
+
+unsigned long get_l2cr (void)
+{
+       unsigned long l2controlreg;
+       asm volatile ("mfspr %0, 1017":"=r" (l2controlreg):);
+       return l2controlreg;
+}
+
+/*
+ * misc_init_r()
+ *
+ * various things to do after relocation
+ *
+ */
+
+int misc_init_r (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+#ifdef CFG_CLK_SPREAD  /* Initialize Spread-Spectrum Clock generation */
+       ulong i;
+
+       /* Ensure that Spread-Spectrum is disabled */
+       out32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, 0);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0, 0);
+
+       /* Initialize PLL1: CG_PCI_CLK , internal OCN_CLK
+        * Uses pre-calculated value for Fout = 800 MHz, Fs = 30 kHz, D = 0.5%
+        */
+
+       out32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
+               0x002e0044);    /* D = 0.25% */
+       out32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL1,
+               0x00000039);    /* BWADJ */
+
+       /* Initialize PLL0: CG_PB_CLKO  */
+       /* Detect PB clock freq. */
+       i = in32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
+       i = (i >> 16) & 0x07;   /* Get PB PLL multiplier */
+
+       out32 (CFG_TSI108_CSR_BASE +
+               TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, pll0_config[i].ctrl0);
+       out32 (CFG_TSI108_CSR_BASE +
+               TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL1, pll0_config[i].ctrl1);
+
+       /* Wait and set SSEN for both PLL0 and 1 */
+       udelay (1000);
+       out32 (CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
+               0x802e0044);    /* D=0.25% */
+       out32 (CFG_TSI108_CSR_BASE +
+               TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0,
+               0x80000000 | pll0_config[i].ctrl0);
+#endif /* CFG_CLK_SPREAD */
+
+#ifdef CFG_L2
+       l2cache_enable ();
+#endif
+       printf ("BUS:   %d MHz\n", gd->bus_clk / 1000000);
+       printf ("MEM:   %d MHz\n", gd->mem_clk / 1000000);
+
+       /*
+        * All the information needed to print the cache details is avaiblable
+        * at this point i.e. above call to l2cache_enable is the very last
+        * thing done with regards to enabling diabling the cache.
+        * So this seems like a good place to print all this information
+        */
+
+       printf ("CACHE: ");
+       switch (get_cpu_type()) {
+       case CPU_7447A:
+               printf ("L1 Instruction cache - 32KB 8-way");
+               (get_hid0 () & (1 << 15)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               printf ("L1 Data cache - 32KB 8-way");
+               (get_hid0 () & (1 << 14)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               printf ("Unified L2 cache - 512KB 8-way");
+               (get_l2cr () & (1 << 31)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               printf ("\n");
+               break;
+
+       case CPU_7448:
+               printf ("L1 Instruction cache - 32KB 8-way");
+               (get_hid0 () & (1 << 15)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               printf ("L1 Data cache - 32KB 8-way");
+               (get_hid0 () & (1 << 14)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               printf ("Unified L2 cache - 1MB 8-way");
+               (get_l2cr () & (1 << 31)) ? printf (" ENABLED\n") :
+                       printf (" DISABLED\n");
+               break;
+       default:
+               break;
+       }
+       return 0;
+}
diff --git a/board/mpc7448hpc2/u-boot.lds b/board/mpc7448hpc2/u-boot.lds
new file mode 100644 (file)
index 0000000..8f24213
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * (C) Copyright 2001
+ * Josh Huber <huber@mclx.com>, Mission Critical Linux, 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
+ */
+
+/*
+ * u-boot.lds - linker script for U-Boot on mpc7448hpc2 Board.
+ */
+
+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
+{
+  /* 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/74xx_7xx/start.o       (.text)
+
+/* store the environment in a seperate sector in the boot flash */
+/*    . = env_offset; */
+/*    common/environment.o(.text) */
+
+    *(.text)
+    *(.fixup)
+    *(.got1)
+  }
+  _etext = .;
+  PROVIDE (etext = .);
+  .rodata    :
+  {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x00FF) & 0xFFFFFF00;
+  _erotext = .;
+  PROVIDE (erotext = .);
+  .reloc   :
+  {
+    *(.got)
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
+  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  . = .;
+  __u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  __u_boot_cmd_end = .;
+
+  . = .;
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(256);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(256);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
diff --git a/board/mpc8313erdb/Makefile b/board/mpc8313erdb/Makefile
new file mode 100644 (file)
index 0000000..a987e51
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o sdram.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/mpc8313erdb/config.mk b/board/mpc8313erdb/config.mk
new file mode 100644 (file)
index 0000000..f768264
--- /dev/null
@@ -0,0 +1 @@
+TEXT_BASE = 0xFE000000
diff --git a/board/mpc8313erdb/mpc8313erdb.c b/board/mpc8313erdb/mpc8313erdb.c
new file mode 100644 (file)
index 0000000..999fe9e
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <ft_build.h>
+#include <pci.h>
+#include <mpc83xx.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       volatile immap_t *im = (immap_t *)CFG_IMMR;
+
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               gd->flags |= GD_FLG_SILENT;
+#endif
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: Freescale MPC8313ERDB\n");
+       return 0;
+}
+
+static struct pci_region pci_regions[] = {
+       {
+               bus_start: CFG_PCI1_MEM_BASE,
+               phys_start: CFG_PCI1_MEM_PHYS,
+               size: CFG_PCI1_MEM_SIZE,
+               flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
+       },
+       {
+               bus_start: CFG_PCI1_MMIO_BASE,
+               phys_start: CFG_PCI1_MMIO_PHYS,
+               size: CFG_PCI1_MMIO_SIZE,
+               flags: PCI_REGION_MEM
+       },
+       {
+               bus_start: CFG_PCI1_IO_BASE,
+               phys_start: CFG_PCI1_IO_PHYS,
+               size: CFG_PCI1_IO_SIZE,
+               flags: PCI_REGION_IO
+       }
+};
+
+void pci_init_board(void)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
+       volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
+       struct pci_region *reg[] = { pci_regions };
+       int warmboot;
+
+       /* Enable all 3 PCI_CLK_OUTPUTs. */
+       clk->occr |= 0xe0000000;
+
+       /*
+        * Configure PCI Local Access Windows
+        */
+       pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB;
+
+       pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB;
+
+       warmboot = gd->bd->bi_bootflags & BOOTFLAG_WARM;
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       warmboot |= immr->pmc.pmccr1 & PMCCR1_POWER_OFF;
+#endif
+
+       mpc83xx_pci_init(1, reg, warmboot);
+}
+
+#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
+void ft_board_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
+#endif
+       ft_cpu_setup(blob, bd);
+
+       p = ft_get_prop(blob, "/memory/reg", &len);
+       if (p) {
+               *p++ = cpu_to_be32(bd->bi_memstart);
+               *p = cpu_to_be32(bd->bi_memsize);
+       }
+}
+#endif
diff --git a/board/mpc8313erdb/sdram.c b/board/mpc8313erdb/sdram.c
new file mode 100644 (file)
index 0000000..4b67788
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
+ *
+ * Authors: Nick.Spence@freescale.com
+ *          Wilson.Lo@freescale.com
+ *          scottwood@freescale.com
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <mpc83xx.h>
+#include <spd_sdram.h>
+
+#include <asm/bitops.h>
+#include <asm/io.h>
+
+#include <asm/processor.h>
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+static void resume_from_sleep(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       u32 magic = *(u32 *)0;
+
+       typedef void (*func_t)(void);
+       func_t resume = *(func_t *)4;
+
+       if (magic == 0xf5153ae5)
+               resume();
+
+       gd->flags &= ~GD_FLG_SILENT;
+       puts("\nResume from sleep failed: bad magic word\n");
+}
+#endif
+
+/* Fixed sdram init -- doesn't use serial presence detect.
+ *
+ * This is useful for faster booting in configs where the RAM is unlikely
+ * to be changed, or for things like NAND booting where space is tight.
+ */
+static long fixed_sdram(void)
+{
+       volatile immap_t *im = (volatile immap_t *)CFG_IMMR;
+       u32 msize = CFG_DDR_SIZE * 1024 * 1024;
+       u32 msize_log2 = __ilog2(msize);
+
+       im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12;
+       im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1);
+       im->sysconf.ddrcdr = CFG_DDRCDR_VALUE;
+
+       /*
+        * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg],
+        * or the DDR2 controller may fail to initialize correctly.
+        */
+       udelay(50000);
+
+       im->ddr.csbnds[0].csbnds = (msize - 1) >> 24;
+       im->ddr.cs_config[0] = CFG_DDR_CONFIG;
+
+       /* Currently we use only one CS, so disable the other bank. */
+       im->ddr.cs_config[1] = 0;
+
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               im->ddr.sdram_cfg = CFG_SDRAM_CFG | SDRAM_CFG_BI;
+       else
+#endif
+               im->ddr.sdram_cfg = CFG_SDRAM_CFG;
+
+       im->ddr.sdram_cfg2 = CFG_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE_2;
+
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       sync();
+
+       /* enable DDR controller */
+       im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
+
+       return msize;
+}
+
+long int initdram(int board_type)
+{
+       volatile immap_t *im = (volatile immap_t *)CFG_IMMR;
+       volatile lbus83xx_t *lbc = &im->lbus;
+       u32 msize;
+
+       if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
+               return -1;
+
+       puts("Initializing\n");
+
+       /* DDR SDRAM - Main SODIMM */
+       msize = fixed_sdram();
+
+       /* Local Bus setup lbcr and mrtpr */
+       lbc->lbcr = CFG_LBC_LBCR;
+       lbc->mrtpr = CFG_LBC_MRTPR;
+       sync();
+
+#ifndef CFG_8313ERDB_BROKEN_PMC
+       if (im->pmc.pmccr1 & PMCCR1_POWER_OFF)
+               resume_from_sleep();
+#endif
+
+       puts("   DDR RAM: ");
+       /* return total bus SDRAM size(bytes)  -- DDR */
+       return msize;
+}
diff --git a/board/mpc8313erdb/u-boot.lds b/board/mpc8313erdb/u-boot.lds
new file mode 100644 (file)
index 0000000..937c87a
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * (C) Copyright 2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc83xx/start.o        (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+    . = ALIGN(16);
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.eh_frame)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x0FFF) & 0xFFFFF000;
+  _erotext = .;
+  PROVIDE (erotext = .);
+  .reloc   :
+  {
+    *(.got)
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+  __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  . = .;
+  __u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  __u_boot_cmd_end = .;
+
+
+  . = .;
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(4096);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(4096);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
+ENTRY(_start)
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
+
+#########################################################################
similarity index 91%
rename from board/stamp/config.mk
rename to board/mpc832xemds/config.mk
index 0d0073032da367357da58f94fc0634c59200e7bc..6c3eca753410d568ad8f7c43554029d50f7c39d7 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2001
+# (C) Copyright 2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -21,5 +21,8 @@
 # MA 02111-1307 USA
 #
 
-TEXT_BASE = 0x07FC0000
-PLATFORM_CPPFLAGS += -I$(TOPDIR)
+#
+# 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..178b1d36fbf683faa44fefd6a4be57809b0f1022 100644 (file)
@@ -80,8 +80,7 @@ int fixed_sdram(void)
        im->ddr.sdram_interval =
            (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 <<
                                                       SDRAM_INTERVAL_BSTOPRE_SHIFT);
-       im->ddr.sdram_clk_cntl =
-           DDR_SDRAM_CLK_CNTL_SS_EN | DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05;
+       im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL;
 
        udelay(200);
 
@@ -134,88 +133,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 +160,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 +184,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 +204,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 +264,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 +274,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..562eb8b53af29deab02ed9f27a707e7f33c997a6 100644 (file)
 #if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
 #endif
+#if defined(CONFIG_OF_LIBFDT)
+#include <libfdt.h>
+#include <libfdt_env.h>
+#endif
 
 const qe_iop_conf_t qe_iop_conf_tab[] = {
        /* GETH1 */
@@ -90,11 +94,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 +169,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 +195,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;
 
@@ -636,22 +662,45 @@ U_BOOT_CMD(ecc, 4, 0, do_ecc,
           "  - disables injects\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)
+#if (defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)) \
+     && defined(CONFIG_OF_BOARD_SETUP)
+
+/*
+ * Prototypes of functions that we use.
+ */
+void ft_cpu_setup(void *blob, bd_t *bd);
+
+#ifdef CONFIG_PCI
+void ft_pci_setup(void *blob, bd_t *bd);
+#endif
+
 void
 ft_board_setup(void *blob, bd_t *bd)
 {
+#if defined(CONFIG_OF_LIBFDT)
+       int nodeoffset;
+       int tmp[2];
+
+       nodeoffset = fdt_path_offset (fdt, "/memory");
+       if (nodeoffset >= 0) {
+               tmp[0] = cpu_to_be32(bd->bi_memstart);
+               tmp[1] = cpu_to_be32(bd->bi_memsize);
+               fdt_setprop(fdt, nodeoffset, "reg", tmp, sizeof(tmp));
+       }
+#else
        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
+
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
+#endif
+       ft_cpu_setup(blob, bd);
+}
+#endif /* CONFIG_OF_x */
index 15a48dcf4071f9ab6779030bb9c6df32a8d1a726..158effe0a9f8befe116518a927c3ddabef439ca0 100644 (file)
 #include <common.h>
 #include <pci.h>
 #include <i2c.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+#include <libfdt.h>
+#include <libfdt_env.h>
+#endif
 
 #include <asm/fsl_i2c.h>
 
@@ -296,6 +303,22 @@ void pci_init_board(void)
 }
 #endif                         /* CONFIG_PCISLAVE */
 
+#if defined(CONFIG_OF_LIBFDT)
+void
+ft_pci_setup(void *blob, bd_t *bd)
+{
+       int nodeoffset;
+       int err;
+       int tmp[2];
+
+       nodeoffset = fdt_path_offset (fdt, "/" OF_SOC "/pci@8500");
+       if (nodeoffset >= 0) {
+               tmp[0] = cpu_to_be32(hose[0].first_busno);
+               tmp[1] = cpu_to_be32(hose[0].last_busno);
+               err = fdt_setprop(fdt, nodeoffset, "bus-range", tmp, sizeof(tmp));
+       }
+}
+#endif                         /* CONFIG_OF_LIBFDT */
 #ifdef CONFIG_OF_FLAT_TREE
 void
 ft_pci_setup(void *blob, bd_t *bd)
index 242cb9fbc1dafda157e4cf0a2254f7ef087ae5d0..544fde94c43461370fccd2083fc71fedee65acf3 100644 (file)
@@ -260,8 +260,8 @@ tlb1_entry:
 #define LAWBAR2 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff)
 #define LAWAR2 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
 
-#define LAWBAR3 ((CFG_PCI1_IO_BASE>>12) & 0xfffff)
-#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCIX | (LAWAR_SIZE & LAWAR_SIZE_16M))
+#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff)
+#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCIX | (LAWAR_SIZE & LAWAR_SIZE_1M))
 
 /*
  * Rapid IO at 0xc000_0000 for 512 M
index 242cb9fbc1dafda157e4cf0a2254f7ef087ae5d0..544fde94c43461370fccd2083fc71fedee65acf3 100644 (file)
@@ -260,8 +260,8 @@ tlb1_entry:
 #define LAWBAR2 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff)
 #define LAWAR2 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
 
-#define LAWBAR3 ((CFG_PCI1_IO_BASE>>12) & 0xfffff)
-#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCIX | (LAWAR_SIZE & LAWAR_SIZE_16M))
+#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff)
+#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCIX | (LAWAR_SIZE & LAWAR_SIZE_1M))
 
 /*
  * Rapid IO at 0xc000_0000 for 512 M
similarity index 56%
rename from board/stamp/Makefile
rename to board/mpc8568mds/Makefile
index ee52007b791fe7128219a28fbaef2f154e50a2ea..a799aa4cc58ec08b4f1b9aad51f6039040210575 100644 (file)
@@ -1,31 +1,5 @@
 #
-# U-boot - Makefile
-#
-# Copyright (c) 2005 blackfin.uclinux.org
-#
-# (C) Copyright 2000-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
-#
-
-#
+# Copyright 2004-2007 Freescale Semiconductor.
 # (C) Copyright 2001-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 #
 
 include $(TOPDIR)/config.mk
+ifneq ($(OBJTREE),$(SRCTREE))
+$(shell mkdir -p $(obj)../common)
+endif
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  = $(BOARD).o stamp.o
+COBJS  := $(BOARD).o \
+       bcsr.o \
+       ft_board.o
+
+SOBJS  := init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
-$(LIB):        $(obj).depend $(OBJS)
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
        $(AR) $(ARFLAGS) $@ $(OBJS)
 
+clean:
+       rm -f $(OBJS) $(SOBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
 #########################################################################
 
 # defines $(obj).depend target
diff --git a/board/mpc8568mds/bcsr.c b/board/mpc8568mds/bcsr.c
new file mode 100644 (file)
index 0000000..2e2e8cd
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2007 Freescale Semiconductor.
+ *
+ * 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 "bcsr.h"
+
+void enable_8568mds_duart()
+{
+       volatile uint* duart_mux        = (uint *)(CFG_CCSRBAR + 0xe0060);
+       volatile uint* devices          = (uint *)(CFG_CCSRBAR + 0xe0070);
+       volatile u8 *bcsr               = (u8 *)(CFG_BCSR);
+
+       *duart_mux = 0x80000000;        /* Set the mux to Duart on PMUXCR */
+       *devices  = 0;                  /* Enable all peripheral devices */
+       bcsr[5] |= 0x01;                /* Enable Duart in BCSR*/
+}
+
+void enable_8568mds_flash_write()
+{
+       volatile u8 *bcsr = (u8 *)(CFG_BCSR);
+
+       bcsr[9] |= 0x01;
+}
+
+void disable_8568mds_flash_write()
+{
+       volatile u8 *bcsr = (u8 *)(CFG_BCSR);
+
+       bcsr[9] &= ~(0x01);
+}
diff --git a/board/mpc8568mds/bcsr.h b/board/mpc8568mds/bcsr.h
new file mode 100644 (file)
index 0000000..8d4cb2f
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2007 Freescale Semiconductor.
+ *
+ * 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 __BCSR_H_
+#define __BCSR_H_
+
+#include <common.h>
+
+/* BCSR Bit definitions
+       * BCSR 0 *
+       0:3     ccb sys pll
+       4:6     cfg core pll
+       7       cfg boot seq
+
+       * BCSR 1 *
+       0:2     cfg rom lock
+       3:5     cfg host agent
+       6       PCI IO
+       7       cfg RIO size
+
+       * BCSR 2 *
+       0:4     QE PLL
+       5       QE clock
+       6       cfg PCI arbiter
+
+       * BCSR 3 *
+       0       TSEC1 reduce
+       1       TSEC2 reduce
+       2:3     TSEC1 protocol
+       4:5     TSEC2 protocol
+       6       PHY1 slave
+       7       PHY2 slave
+
+       * BCSR 4 *
+       4       clock enable
+       5       boot EPROM
+       6       GETH transactive reset
+       7       BRD write potect
+
+       * BCSR 5 *
+       1:3     Leds 1-3
+       4       UPC1 enable
+       5       UPC2 enable
+       6       UPC2 pos
+       7       RS232 enable
+
+       * BCSR 6 *
+       0       CFG ver 0
+       1       CFG ver 1
+       6       Register config led
+       7       Power on reset
+
+       * BCSR 7 *
+       2       board host mode indication
+       5       enable TSEC1 PHY
+       6       enable TSEC2 PHY
+
+       * BCSR 8 *
+       0       UCC GETH1 enable
+       1       UCC GMII enable
+       3       UCC TBI enable
+       5       UCC MII enable
+       7       Real time clock reset
+
+       * BCSR 9 *
+       0       UCC2 GETH enable
+       1       UCC2 GMII enable
+       3       UCC2 TBI enable
+       5       UCC2 MII enable
+       6       Ready only - indicate flash ready after burning
+       7       Flash write protect
+*/
+
+/*BCSR Utils functions*/
+
+void enable_8568mds_duart(void);
+void enable_8568mds_flash_write(void);
+void disable_8568mds_flash_write(void);
+
+#endif /* __BCSR_H_ */
diff --git a/board/mpc8568mds/config.mk b/board/mpc8568mds/config.mk
new file mode 100644 (file)
index 0000000..021522c
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# Copyright 2007 Freescale Semiconductor.
+#
+# 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
+#
+
+#
+# mpc8568mds board
+#
+TEXT_BASE = 0xfff80000
+
+PLATFORM_CPPFLAGS += -DCONFIG_E500=1
+PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1
+PLATFORM_CPPFLAGS += -DCONFIG_MPC8568=1
diff --git a/board/mpc8568mds/ft_board.c b/board/mpc8568mds/ft_board.c
new file mode 100644 (file)
index 0000000..36815cc
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2004-2007 Freescale Semiconductor.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+
+#include <ft_build.h>
+
+extern void ft_cpu_setup(void *blob, bd_t *bd);
+
+#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 /* CONFIG_OF_FLAT_TREE && CONFIG_OF_BOARD_SETUP */
diff --git a/board/mpc8568mds/init.S b/board/mpc8568mds/init.S
new file mode 100644 (file)
index 0000000..0d87982
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2004-2007 Freescale Semiconductor.
+ * Copyright 2002,2003, Motorola 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 <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <config.h>
+#include <mpc85xx.h>
+
+
+/*
+ * TLB0 and TLB1 Entries
+ *
+ * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR.
+ * However, CCSRBAR is then relocated to CFG_CCSRBAR right after
+ * these TLB entries are established.
+ *
+ * The TLB entries for DDR are dynamically setup in spd_sdram()
+ * and use TLB1 Entries 8 through 15 as needed according to the
+ * size of DDR memory.
+ *
+ * MAS0: tlbsel, esel, nv
+ * MAS1: valid, iprot, tid, ts, tsize
+ * MAS2: epn, sharen, x0, x1, w, i, m, g, e
+ * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr
+ */
+#define        entry_start \
+       mflr    r1      ;       \
+       bl      0f      ;
+
+#define        entry_end \
+0:     mflr    r0      ;       \
+       mtlr    r1      ;       \
+       blr             ;
+
+
+       .section        .bootpg, "ax"
+       .globl  tlb1_entry
+tlb1_entry:
+       entry_start
+
+       /*
+        * Number of TLB0 and TLB1 entries in the following table
+        */
+       .long (2f-1f)/16
+
+1:
+#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
+       /*
+        * TLB0         4K      Non-cacheable, guarded
+        * 0xff700000   4K      Initial CCSRBAR mapping
+        *
+        * This ends up at a TLB0 Index==0 entry, and must not collide
+        * with other TLB0 Entries.
+        */
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1)
+#else
+#error("Update the number of table entries in tlb1_entry")
+#endif
+
+       /*
+        * TLB0         16K     Cacheable, non-guarded
+        * 0xd001_0000  16K     Temporary Global data for initialization
+        *
+        * Use four 4K TLB0 entries.  These entries must be cacheable
+        * as they provide the bootstrap memory before the memory
+        * controler and real memory have been configured.
+        *
+        * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c,
+        * and must not collide with other TLB0 entries.
+        */
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR), 0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR), 0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024),
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024),
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024),
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       /* TLB 1 Initializations */
+       /*
+        * TLBe 0:      16M     Non-cacheable, guarded
+        * 0xff000000   16M     FLASH (upper half)
+        * Out of reset this entry is only 4K.
+        */
+       .long TLB1_MAS0(1, 0, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_FLASH_BASE + 0x1000000),
+                       0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_FLASH_BASE + 0x1000000),
+                       0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 1:      16M     Non-cacheable, guarded
+        * 0xfe000000   16M     FLASH (lower half)
+        */
+       .long TLB1_MAS0(1, 1, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_FLASH_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_FLASH_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 2:      256M    Non-cacheable, guarded
+        * 0x80000000   256M    PCI1 MEM
+        */
+       .long TLB1_MAS0(1, 2, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 3:      256M    Non-cacheable, guarded
+        * 0xa0000000   256M    PCIe Mem
+        */
+       .long TLB1_MAS0(1, 3, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PEX_MEM_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PEX_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 4:      Reserved for future usage
+        */
+
+       /*
+        * TLBe 5:      64M     Non-cacheable, guarded
+        * 0xe000_0000  1M      CCSRBAR
+        * 0xe200_0000  8M      PCI1 IO
+        * 0xe280_0000  8M      PCIe IO
+        */
+       .long TLB1_MAS0(1, 5, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 6:      64M     Cacheable, non-guarded
+        * 0xf000_0000  64M     LBC SDRAM
+        */
+       .long TLB1_MAS0(1, 6, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLBe 7:      256K    Non-cacheable, guarded
+        * 0xf8000000   32K BCSR
+        * 0xf8008000   32K PIB (CS4)
+        * 0xf8010000   32K PIB (CS5)
+        */
+       .long TLB1_MAS0(1, 7, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_BCSR_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_BCSR_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+2:
+       entry_end
+
+/*
+ * LAW(Local Access Window) configuration:
+ *
+ *0)   0x0000_0000   0x7fff_ffff     DDR                     2G
+ *1)   0x8000_0000   0x9fff_ffff     PCI1 MEM                256MB
+ *2)   0xa000_0000   0xbfff_ffff     PCIe MEM                256MB
+ *5)   0xc000_0000   0xdfff_ffff     SRIO                    256MB
+ *-)   0xe000_0000   0xe00f_ffff     CCSR                    1M
+ *3)   0xe200_0000   0xe27f_ffff     PCI1 I/O                8M
+ *4)   0xe280_0000   0xe2ff_ffff     PCIe I/0                8M
+ *6.a) 0xf000_0000   0xf3ff_ffff     SDRAM                   64MB
+ *6.b) 0xf800_0000   0xf800_7fff     BCSR                    32KB
+ *6.c) 0xf800_8000   0xf800_ffff     PIB (CS4)              32KB
+ *6.d) 0xf801_0000   0xf801_7fff     PIB (CS5)              32KB
+ *6.e) 0xfe00_0000   0xffff_ffff     Flash                   32MB
+ *
+ *Notes:
+ *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window.
+ *    If flash is 8M at default position (last 8M), no LAW needed.
+ *
+ * The defines below are 1-off of the actual LAWAR0 usage.
+ * So LAWAR3 define uses the LAWAR4 register in the ECM.
+ */
+
+#define LAWBAR0 0
+#define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN)
+
+#define LAWBAR1 ((CFG_PCI1_MEM_BASE>>12) & 0xfffff)
+#define LAWAR1 (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+#define LAWBAR2 ((CFG_PEX_MEM_BASE>>12) & 0xfffff)
+#define LAWAR2 (LAWAR_EN | LAWAR_TRGT_IF_PEX | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff)
+#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_8M))
+
+#define LAWBAR4 ((CFG_PEX_IO_PHYS>>12) & 0xfffff)
+#define LAWAR4  (LAWAR_EN | LAWAR_TRGT_IF_PEX | (LAWAR_SIZE & LAWAR_SIZE_16M))
+
+
+#define LAWBAR5 ((CFG_SRIO_MEM_BASE>>12) & 0xfffff)
+#define LAWAR5 (LAWAR_EN | LAWAR_TRGT_IF_RIO | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+/* LBC window - maps 256M.  That's SDRAM, BCSR, PIBs, and Flash */
+#define LAWBAR6 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff)
+#define LAWAR6 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+       .section .bootpg, "ax"
+       .globl  law_entry
+
+law_entry:
+       entry_start
+       .long (4f-3f)/8
+3:
+       .long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2,LAWBAR3,LAWAR3
+       .long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5,LAWBAR6,LAWAR6
+4:
+       entry_end
diff --git a/board/mpc8568mds/mpc8568mds.c b/board/mpc8568mds/mpc8568mds.c
new file mode 100644 (file)
index 0000000..9c7960d
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2007 Freescale Semiconductor.
+ *
+ * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <pci.h>
+#include <asm/processor.h>
+#include <asm/immap_85xx.h>
+#include <spd.h>
+
+#include "bcsr.h"
+
+
+#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+extern void ddr_enable_ecc(unsigned int dram_size);
+#endif
+
+extern long int spd_sdram(void);
+
+void local_bus_init(void);
+void sdram_init(void);
+
+int board_early_init_f (void)
+{
+       /*
+        * Initialize local bus.
+        */
+       local_bus_init ();
+
+       enable_8568mds_duart();
+       enable_8568mds_flash_write();
+
+       return 0;
+}
+
+int checkboard (void)
+{
+       printf ("Board: 8568 MDS\n");
+
+       return 0;
+}
+
+long int
+initdram(int board_type)
+{
+       long dram_size = 0;
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+
+       puts("Initializing\n");
+
+#if defined(CONFIG_DDR_DLL)
+       {
+               /*
+                * Work around to stabilize DDR DLL MSYNC_IN.
+                * Errata DDR9 seems to have been fixed.
+                * This is now the workaround for Errata DDR11:
+                *    Override DLL = 1, Course Adj = 1, Tap Select = 0
+                */
+
+               volatile ccsr_gur_t *gur= &immap->im_gur;
+
+               gur->ddrdllcr = 0x81000000;
+               asm("sync;isync;msync");
+               udelay(200);
+       }
+#endif
+       dram_size = spd_sdram();
+
+#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+       /*
+        * Initialize and enable DDR ECC.
+        */
+       ddr_enable_ecc(dram_size);
+#endif
+       /*
+        * SDRAM Initialization
+        */
+       sdram_init();
+
+       puts("    DDR: ");
+       return dram_size;
+}
+
+/*
+ * Initialize Local Bus
+ */
+void
+local_bus_init(void)
+{
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile ccsr_gur_t *gur = &immap->im_gur;
+       volatile ccsr_lbc_t *lbc = &immap->im_lbc;
+
+       uint clkdiv;
+       uint lbc_hz;
+       sys_info_t sysinfo;
+
+       get_sys_info(&sysinfo);
+       clkdiv = (lbc->lcrr & 0x0f) * 2;
+       lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv;
+
+       gur->lbiuiplldcr1 = 0x00078080;
+       if (clkdiv == 16) {
+               gur->lbiuiplldcr0 = 0x7c0f1bf0;
+       } else if (clkdiv == 8) {
+               gur->lbiuiplldcr0 = 0x6c0f1bf0;
+       } else if (clkdiv == 4) {
+               gur->lbiuiplldcr0 = 0x5c0f1bf0;
+       }
+
+       lbc->lcrr |= 0x00030000;
+
+       asm("sync;isync;msync");
+}
+
+/*
+ * Initialize SDRAM memory on the Local Bus.
+ */
+void
+sdram_init(void)
+{
+#if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM)
+
+       uint idx;
+       volatile immap_t *immap = (immap_t *)CFG_IMMR;
+       volatile ccsr_lbc_t *lbc = &immap->im_lbc;
+       uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE;
+       uint lsdmr_common;
+
+       puts("    SDRAM: ");
+
+       print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n");
+
+       /*
+        * Setup SDRAM Base and Option Registers
+        */
+       lbc->or2 = CFG_OR2_PRELIM;
+       asm("msync");
+
+       lbc->br2 = CFG_BR2_PRELIM;
+       asm("msync");
+
+       lbc->lbcr = CFG_LBC_LBCR;
+       asm("msync");
+
+
+       lbc->lsrt = CFG_LBC_LSRT;
+       lbc->mrtpr = CFG_LBC_MRTPR;
+       asm("msync");
+
+       /*
+        * MPC8568 uses "new" 15-16 style addressing.
+        */
+       lsdmr_common = CFG_LBC_LSDMR_COMMON;
+       lsdmr_common |= CFG_LBC_LSDMR_BSMA1516;
+
+       /*
+        * Issue PRECHARGE ALL command.
+        */
+       lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_PCHALL;
+       asm("sync;msync");
+       *sdram_addr = 0xff;
+       ppcDcbf((unsigned long) sdram_addr);
+       udelay(100);
+
+       /*
+        * Issue 8 AUTO REFRESH commands.
+        */
+       for (idx = 0; idx < 8; idx++) {
+               lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_ARFRSH;
+               asm("sync;msync");
+               *sdram_addr = 0xff;
+               ppcDcbf((unsigned long) sdram_addr);
+               udelay(100);
+       }
+
+       /*
+        * Issue 8 MODE-set command.
+        */
+       lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_MRW;
+       asm("sync;msync");
+       *sdram_addr = 0xff;
+       ppcDcbf((unsigned long) sdram_addr);
+       udelay(100);
+
+       /*
+        * Issue NORMAL OP command.
+        */
+       lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_NORMAL;
+       asm("sync;msync");
+       *sdram_addr = 0xff;
+       ppcDcbf((unsigned long) sdram_addr);
+       udelay(200);    /* Overkill. Must wait > 200 bus cycles */
+
+#endif /* enable SDRAM init */
+}
+
+#if defined(CFG_DRAM_TEST)
+int
+testdram(void)
+{
+       uint *pstart = (uint *) CFG_MEMTEST_START;
+       uint *pend = (uint *) CFG_MEMTEST_END;
+       uint *p;
+
+       printf("Testing DRAM from 0x%08x to 0x%08x\n",
+              CFG_MEMTEST_START,
+              CFG_MEMTEST_END);
+
+       printf("DRAM test phase 1:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0xaaaaaaaa;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0xaaaaaaaa) {
+                       printf ("DRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("DRAM test phase 2:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0x55555555;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0x55555555) {
+                       printf ("DRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("DRAM test passed.\n");
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_PCI)
+#ifndef CONFIG_PCI_PNP
+static struct pci_config_table pci_mpc8568mds_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_mpc8568mds_config_table,},
+#endif
+#ifdef CONFIG_MPC85XX_PCI2
+       {},
+#endif
+};
+
+#endif /* CONFIG_PCI */
+
+void
+pci_init_board(void)
+{
+#ifdef CONFIG_PCI
+       pci_mpc85xx_init(&hose);
+#endif
+}
diff --git a/board/mpc8568mds/u-boot.lds b/board/mpc8568mds/u-boot.lds
new file mode 100644 (file)
index 0000000..71099f6
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2004-2007 Freescale Semiconductor.
+ *
+ * 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
+{
+ /* ELIOR - From RAM:  From FLASH: 0xFFFFFFFC*/
+  .resetvec 0xFFFFFFFC:
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  /*(ELIOR - From RAM:  From FLASH: 0xFFFFF000*/
+  .bootpg 0xFFFFF000:
+  {
+       cpu/mpc85xx/start.o     (.bootpg)
+       board/mpc8568mds/init.o (.bootpg)
+  } = 0xffff
+
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc85xx/start.o        (.text)
+    board/mpc8568mds/init.o (.text)
+    cpu/mpc85xx/traps.o (.text)
+    cpu/mpc85xx/interrupts.o (.text)
+    cpu/mpc85xx/cpu_init.o (.text)
+    cpu/mpc85xx/cpu.o (.text)
+    cpu/mpc85xx/speed.o (.text)
+    cpu/mpc85xx/pci.o (.text)
+    common/dlmalloc.o (.text)
+    lib_generic/crc32.o (.text)
+    lib_ppc/extable.o (.text)
+    lib_generic/zlib.o (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+   }
+    _etext = .;
+    PROVIDE (etext = .);
+    .rodata    :
+   {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.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 4b68c36743f275a3f2a7b00d3d9e0e6f87dcf507..96252116690e2de20fdf899602decbe02ad399aa 100644 (file)
@@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  := $(BOARD).o pixis.o sys_eeprom.o
+COBJS  := $(BOARD).o sys_eeprom.o \
+               ../freescale/common/pixis.o
+
 SOBJS  := init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index 6b3e2d275de1dfde76fea7ff44c3f51b1c3d996a..cb21ba6a75ba0192e050b00239ca9c4c5c5659af 100644 (file)
@@ -59,7 +59,7 @@
 #define LAWAR2 (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M))
 
 #define LAWBAR3 ((CFG_PCI2_MEM_BASE>>12) & 0xffffff)
-#define LAWAR3 (~LAWAR_EN & (LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M)))
+#define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M))
 
 /*
  * This is not so much the SDRAM map as it is the whole localbus map.
 #define LAWBAR4 ((0xf8100000>>12) & 0xffffff)
 #define LAWAR4 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_2M))
 
-#define LAWBAR5 ((CFG_PCI1_IO_BASE>>12) & 0xffffff)
+#define LAWBAR5 ((CFG_PCI1_IO_PHYS>>12) & 0xffffff)
 #define LAWAR5 (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_16M))
 
-#define LAWBAR6 ((CFG_PCI2_IO_BASE>>12) & 0xffffff)
-#define LAWAR6 (~LAWAR_EN &( LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_16M)))
+#define LAWBAR6 ((CFG_PCI2_IO_PHYS>>12) & 0xffffff)
+#define LAWAR6 (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_16M))
 
 #define LAWBAR7 ((0xfe000000 >>12) & 0xffffff)
 #define LAWAR7 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_32M))
@@ -84,7 +84,7 @@
 #define LAWAR8  ((LAWAR_TRGT_IF_DDR2 | (LAWAR_SIZE & LAWAR_SIZE_512M)) & ~LAWAR_EN)
 #endif
 
-#define LAWBAR9 ((CFG_RIO_MEM_BASE>>12) & 0xfffff)
+#define LAWBAR9 ((CFG_RIO_MEM_PHYS>>12) & 0xfffff)
 #define LAWAR9  (LAWAR_EN | LAWAR_TRGT_IF_RIO | (LAWAR_SIZE & LAWAR_SIZE_512M))
 
        .section .bootpg, "ax"
index b2cf4a9566d5a65f38208a33d2be5e548b797782..7d7e2afad31cc1389e4a3dcdf404d42448dac0e4 100644 (file)
@@ -1,9 +1,5 @@
 /*
- * Copyright 2004 Freescale Semiconductor.
- * Jeff Brown
- * Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
- *
- * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
+ * Copyright 2006, 2007 Freescale Semiconductor.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  */
 
 #include <common.h>
-#include <command.h>
 #include <pci.h>
 #include <asm/processor.h>
 #include <asm/immap_86xx.h>
 #include <spd.h>
+#include <asm/io.h>
 
 #if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
 extern void ft_cpu_setup(void *blob, bd_t *bd);
 #endif
 
-#include "pixis.h"
+#include "../freescale/common/pixis.h"
 
 #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
 extern void ddr_enable_ecc(unsigned int dram_size);
@@ -258,109 +254,6 @@ ft_board_setup(void *blob, bd_t *bd)
 #endif
 
 
-void
-mpc8641_reset_board(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
-{
-       char cmd;
-       ulong val;
-       ulong corepll;
-
-       /*
-        * No args is a simple reset request.
-        */
-       if (argc <= 1) {
-               out8(PIXIS_BASE + PIXIS_RST, 0);
-               /* not reached */
-       }
-
-       cmd = argv[1][1];
-       switch (cmd) {
-       case 'f':               /* reset with frequency changed */
-               if (argc < 5)
-                       goto my_usage;
-               read_from_px_regs(0);
-
-               val = set_px_sysclk(simple_strtoul(argv[2], NULL, 10));
-
-               corepll = strfractoint(argv[3]);
-               val = val + set_px_corepll(corepll);
-               val = val + set_px_mpxpll(simple_strtoul(argv[4], NULL, 10));
-               if (val == 3) {
-                       puts("Setting registers VCFGEN0 and VCTL\n");
-                       read_from_px_regs(1);
-                       puts("Resetting board with values from VSPEED0, VSPEED1, VCLKH, and VCLKL ....\n");
-                       set_px_go();
-               } else
-                       goto my_usage;
-
-               while (1) ;     /* Not reached */
-
-       case 'l':
-               if (argv[2][1] == 'f') {
-                       read_from_px_regs(0);
-                       read_from_px_regs_altbank(0);
-                       /* reset with frequency changed */
-                       val = set_px_sysclk(simple_strtoul(argv[3], NULL, 10));
-
-                       corepll = strfractoint(argv[4]);
-                       val = val + set_px_corepll(corepll);
-                       val = val + set_px_mpxpll(simple_strtoul(argv[5],
-                                                                NULL, 10));
-                       if (val == 3) {
-                               puts("Setting registers VCFGEN0, VCFGEN1, VBOOT, and VCTL\n");
-                               set_altbank();
-                               read_from_px_regs(1);
-                               read_from_px_regs_altbank(1);
-                               puts("Enabling watchdog timer on the FPGA and resetting board with values from VSPEED0, VSPEED1, VCLKH, and VCLKL to boot from the other bank ....\n");
-                               set_px_go_with_watchdog();
-                       } else
-                               goto my_usage;
-
-                       while (1) ;     /* Not reached */
-
-               } else if (argv[2][1] == 'd') {
-                       /*
-                        * Reset from alternate bank without changing
-                        * frequencies but with watchdog timer enabled.
-                        */
-                       read_from_px_regs(0);
-                       read_from_px_regs_altbank(0);
-                       puts("Setting registers VCFGEN1, VBOOT, and VCTL\n");
-                       set_altbank();
-                       read_from_px_regs_altbank(1);
-                       puts("Enabling watchdog timer on the FPGA and resetting board to boot from the other bank....\n");
-                       set_px_go_with_watchdog();
-                       while (1) ;     /* Not reached */
-
-               } else {
-                       /*
-                        * Reset from next bank without changing
-                        * frequency and without watchdog timer enabled.
-                        */
-                       read_from_px_regs(0);
-                       read_from_px_regs_altbank(0);
-                       if (argc > 2)
-                               goto my_usage;
-                       puts("Setting registers VCFGNE1, VBOOT, and VCTL\n");
-                       set_altbank();
-                       read_from_px_regs_altbank(1);
-                       puts("Resetting board to boot from the other bank....\n");
-                       set_px_go();
-               }
-
-       default:
-               goto my_usage;
-       }
-
-my_usage:
-       puts("\nUsage: reset cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n");
-       puts("       reset altbank [cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>]\n");
-       puts("       reset altbank [wd]\n");
-       puts("For example:   reset cf 40 2.5 10\n");
-       puts("See MPC8641HPCN Design Workbook for valid values of command line parameters.\n");
-}
-
-
 /*
  * get_board_sys_clk
  *      Reads the FPGA on board for CONFIG_SYS_CLK_FREQ
index b34de8e0ac9483f17c28b73d482bb1d2622ba876..13c1acf803a1bd64a1514196968aedc2cf51a0d9 100644 (file)
@@ -120,10 +120,12 @@ SECTIONS
   _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 = .;
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
index 52c8ffe353a80642fe85d5c6969873c3f636f326..9d9b892600aeb41908928616640e88af06474bec 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2006 Detlev Zundel, dzu@denx.de
+# (C) Copyright 2006, 2007 Detlev Zundel, dzu@denx.de
 # (C) Copyright 2004
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
@@ -27,4 +27,3 @@
 #
 
 TEXT_BASE = 0x40700000
-BOARDLIBS = $(obj)drivers/nand/libnand.a
index 8a6b5b00a9cbf9b59e61a51299de540d0b86ab75..707e4b97d1713099d258cc732dc22c4beeac0560 100644 (file)
@@ -177,16 +177,14 @@ long int initdram (int board_type)
         *
         * try 8 column mode
         */
-       size8 = dram_size (CFG_MAMR_8COL, (ulong *) SDRAM_BASE3_PRELIM,
-                                          SDRAM_MAX_SIZE);
+       size8 = dram_size (CFG_MAMR_8COL, SDRAM_BASE3_PRELIM, SDRAM_MAX_SIZE);
 
        udelay (1000);
 
        /*
         * try 9 column mode
         */
-       size9 = dram_size (CFG_MAMR_9COL, (ulong *) SDRAM_BASE3_PRELIM,
-                                         SDRAM_MAX_SIZE);
+       size9 = dram_size (CFG_MAMR_9COL, SDRAM_BASE3_PRELIM, SDRAM_MAX_SIZE);
 
        udelay (1000);
 
similarity index 77%
rename from include/asm-microblaze/platform.h
rename to board/prodrive/p3mx/p3mx.h
index 2096cce45e442466bf2b6166afb9b62c8d0f56ae..1caae6b9c155018dbaad86d50e067cdbde2f54fe 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * (C) Copyright 2004 Atmark Techno, Inc.
+ * (C) Copyright 2005
  *
- * Yasushi SHOJI <yashi@atmark-techno.com>
+ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V. roel.loeffen@prodrive.nl
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  * MA 02111-1307 USA
  */
 
-#include <config.h>
+#ifndef __P3MX_H__
+#define __P3MX_H__
 
-#ifdef CONFIG_SUZAKU
-#include <asm/suzaku.h>
-#endif
+#define LED_OFF                1
+#define LED_GREEN      2
+#define LED_RED                3
+#define LED_ORANGE     4
+
+#endif /* __P3MX_H__ */
index 767075884a0fe1054b4de93561e87d7d7a54c853..51dee86ae5611a540db0d9d8f96074e03a8d9204 100644 (file)
@@ -1,4 +1,2 @@
+#
 TEXT_BASE = 0x01f00000
-
-# include NPE ethernet driver
-BOARDLIBS = $(obj)cpu/ixp/npe/libnpe.a
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 1b0b15fc6262ca8588536372400c0117e8e40877..4cc2b4171ca2c5a382a7756a8e67225a2c1c76cb 100644 (file)
 
 include $(TOPDIR)/config.mk
 
-LIB    = lib$(BOARD).a
+LIB    = $(obj)lib$(BOARD).a
 
-OBJS   = $(BOARD).o sc3nand.o
+COBJS  = $(BOARD).o sc3nand.o
 SOBJS  = init.o
 
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
 $(LIB):        $(OBJS) $(SOBJS)
-       $(AR) crv $@ $^
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
 
 clean:
        rm -f $(SOBJS) $(OBJS)
@@ -39,9 +43,9 @@ distclean:    clean
 
 #########################################################################
 
-.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
-               $(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
 
-sinclude .depend
+sinclude $(obj).depend
 
 #########################################################################
diff --git a/board/stxssa/Makefile b/board/stxssa/Makefile
new file mode 100644 (file)
index 0000000..344ecdf
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).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 $(OBJS) $(SOBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/stxssa/config.mk b/board/stxssa/config.mk
new file mode 100644 (file)
index 0000000..30f42c5
--- /dev/null
@@ -0,0 +1,34 @@
+# Modified by Xianghua Xiao, X.Xiao@motorola.com
+# (C) Copyright 2002,2003 Motorola Inc.
+#
+# Copied from ADS85xx for STx GP3 - Dan Malek
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+#
+# default CCARBAR is at 0xff700000
+# assume U-Boot is less than 0.5MB
+# U-Boot is less than 256K, so push
+# it further up into the flash
+#
+TEXT_BASE = 0xfffC0000
+
+PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1
+PLATFORM_CPPFLAGS += -DCONFIG_E500=1
diff --git a/board/stxssa/init.S b/board/stxssa/init.S
new file mode 100644 (file)
index 0000000..a1a8d9e
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2005 Embedded Alley Solutions, Inc.
+ * Dan Malek <dan@embeddedalley.com>
+ * Copied from STx GP3.
+ * Updates for Silicon Tx GP3 SSA.  We only support 32-bit flash
+ * and DDR with SPD EEPROM configuration.
+ *
+ * Copyright 2004 Freescale Semiconductor.
+ * Copyright (C) 2002,2003, Motorola Inc.
+ * Xianghua Xiao <X.Xiao@motorola.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <config.h>
+#include <mpc85xx.h>
+
+
+/*
+ * TLB0 and TLB1 Entries
+ *
+ * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR.
+ * However, CCSRBAR is then relocated to CFG_CCSRBAR right after
+ * these TLB entries are established.
+ *
+ * The TLB entries for DDR are dynamically setup in spd_sdram()
+ * and use TLB1 Entries 8 through 15 as needed according to the
+ * size of DDR memory.
+ *
+ * MAS0: tlbsel, esel, nv
+ * MAS1: valid, iprot, tid, ts, tsize
+ * MAS2: epn, sharen, x0, x1, w, i, m, g, e
+ * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr
+ */
+
+#define        entry_start \
+       mflr    r1      ;       \
+       bl      0f      ;
+
+#define        entry_end \
+0:     mflr    r0      ;       \
+       mtlr    r1      ;       \
+       blr             ;
+
+
+       .section        .bootpg, "ax"
+       .globl  tlb1_entry
+tlb1_entry:
+       entry_start
+
+       /*
+        * Number of TLB0 and TLB1 entries in the following table
+        */
+       .long 12
+
+#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
+       /*
+        * TLB0         4K      Non-cacheable, guarded
+        * 0xff700000   4K      Initial CCSRBAR mapping
+        *
+        * This ends up at a TLB0 Index==0 entry, and must not collide
+        * with other TLB0 Entries.
+        */
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1)
+#else
+#error("Update the number of table entries in tlb1_entry")
+#endif
+
+       /*
+        * TLB0         16K     Cacheable, non-guarded
+        * 0xd001_0000  16K     Temporary Global data for initialization
+        *
+        * Use four 4K TLB0 entries.  These entries must be cacheable
+        * as they provide the bootstrap memory before the memory
+        * controler and real memory have been configured.
+        *
+        * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c,
+        * and must not collide with other TLB0 entries.
+        */
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR), \
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024), \
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024), \
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 8 * 1024), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+       .long TLB1_MAS0(0, 0, 0)
+       .long TLB1_MAS1(1, 0, 0, 0, 0)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024), \
+                       0,0,0,0,0,0,0,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+
+       /*
+        * TLB 0:       64M     Non-cacheable, guarded
+        * 0xfc000000   6M4     FLASH
+        * Out of reset this entry is only 4K.
+        */
+       .long TLB1_MAS0(1, 0, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_FLASH_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_FLASH_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 1:       256M    Non-cacheable, guarded
+        * 0x80000000   256M    PCI1 MEM First half
+        */
+       .long TLB1_MAS0(1, 1, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 2:       256M    Non-cacheable, guarded
+        * 0x90000000   256M    PCI1 MEM Second half
+        */
+       .long TLB1_MAS0(1, 2, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE + 0x10000000), \
+                       0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE + 0x10000000), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 3:       256M    Non-cacheable, guarded
+        * 0xa0000000   256M    PCI2 MEM First half
+        */
+       .long TLB1_MAS0(1, 3, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 4:       256M    Non-cacheable, guarded
+        * 0xb0000000   256M    PCI2 MEM Second half
+        */
+       .long TLB1_MAS0(1, 4, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE + 0x10000000), \
+                       0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE + 0x10000000), \
+                       0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 5:       64M     Non-cacheable, guarded
+        * 0xe000_0000  1M      CCSRBAR
+        * 0xe200_0000  16M     PCI1 IO
+        * 0xe300_0000  16M     PCI2 IO
+        */
+       .long TLB1_MAS0(1, 5, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1)
+
+       /*
+        * TLB 6:       256M    Non-cacheable, guarded
+        * 0xf0000000           Local bus expansion option.
+        * 0xfb000000           Configuration Latch register (one word)
+        * 0xfc000000           Up to 64M flash
+        */
+       .long TLB1_MAS0(1, 7, 0)
+       .long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M)
+       .long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_OPTION_BASE), 0,0,0,0,1,0,1,0)
+       .long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_OPTION_BASE), 0,0,0,0,0,1,0,1,0,1)
+       entry_end
+
+/*
+ * LAW(Local Access Window) configuration:
+ *
+ * 0x0000_0000     0x7fff_ffff     DDR                     2G
+ * 0x8000_0000     0x9fff_ffff     PCI1 MEM                512M
+ * 0xa000_0000     0xbfff_ffff     PCI2 MEM                512M
+ * 0xe000_0000     0xe000_ffff     CCSR                    1M
+ * 0xe200_0000     0xe2ff_ffff     PCI1 IO                 16M
+ * 0xe300_0000     0xe3ff_ffff     PCI2 IO                 16M
+ * 0xf000_0000     0xfaff_ffff     Local bus               128M
+ * 0xfb00_0000     0xfb00_ffff     Config Latch            64K
+ * 0xfc00_0000     0xffff_ffff     FLASH (boot bank)       64M
+ *
+ * Notes:
+ *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window.
+ *    If flash is 8M at default position (last 8M), no LAW needed.
+ */
+
+#if !defined(CONFIG_SPD_EEPROM)
+#define LAWBAR0 ((CFG_DDR_SDRAM_BASE>>12) & 0xfffff)
+#define LAWAR0 (LAWAR_EN | LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M))
+#else
+#define LAWBAR0 0
+#define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN)
+#endif
+
+#define LAWBAR1 ((CFG_PCI1_MEM_BASE>>12) & 0xfffff)
+#define LAWAR1         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M))
+
+#define LAWBAR2 ((CFG_PCI2_MEM_BASE>>12) & 0xfffff)
+#define LAWAR2         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M))
+
+#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff)
+#define LAWAR3         (LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_16M))
+
+#define LAWBAR4 ((CFG_PCI2_IO_PHYS>>12) & 0xfffff)
+#define LAWAR4         (LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_16M))
+
+/* Map the whole localbus, including flash and reset latch.
+*/
+#define LAWBAR5 ((CFG_LBC_OPTION_BASE>>12) & 0xfffff)
+#define LAWAR5 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
+
+
+       .section .bootpg, "ax"
+       .globl  law_entry
+law_entry:
+       entry_start
+       .long 6
+       .long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2,LAWBAR3,LAWAR3
+       .long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5
+       entry_end
diff --git a/board/stxssa/stxssa.c b/board/stxssa/stxssa.c
new file mode 100644 (file)
index 0000000..0fb233d
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * (C) Copyright 2005, Embedded Alley Solutions, Inc.
+ * Dan Malek, <dan@embeddedalley.com>
+ * Copied from STx GP3.
+ * Updates for Silicon Tx GP3 SSA
+ *
+ * (C) Copyright 2003,Motorola Inc.
+ * Xianghua Xiao, (X.Xiao@motorola.com)
+ *
+ * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+
+extern long int spd_sdram (void);
+
+#include <common.h>
+#include <pci.h>
+#include <asm/processor.h>
+#include <asm/immap_85xx.h>
+#include <ioports.h>
+#include <asm/io.h>
+#include <spd.h>
+#include <miiphy.h>
+
+long int fixed_sdram (void);
+
+/*
+ * I/O Port configuration table
+ *
+ * if conf is 1, then that port pin will be configured at boot time
+ * according to the five values podr/pdir/ppar/psor/pdat for that entry
+ */
+
+const iop_conf_t iop_conf_tab[4][32] = {
+
+    /* Port A configuration */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PA31 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxENB */
+       /* PA30 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 TxClav   */
+       /* PA29 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxSOC  */
+       /* PA28 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 RxENB */
+       /* PA27 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxSOC */
+       /* PA26 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxClav */
+       /* PA25 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */
+       /* PA24 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */
+       /* PA23 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */
+       /* PA22 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */
+       /* PA21 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */
+       /* PA20 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */
+       /* PA19 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */
+       /* PA18 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */
+       /* PA17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[7] */
+       /* PA16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[6] */
+       /* PA15 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[5] */
+       /* PA14 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[4] */
+       /* PA13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[3] */
+       /* PA12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[2] */
+       /* PA11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[1] */
+       /* PA10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[0] */
+       /* PA9  */ {   0,   1,   1,   1,   0,   0   }, /* FCC1 L1TXD */
+       /* PA8  */ {   0,   1,   1,   0,   0,   0   }, /* FCC1 L1RXD */
+       /* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */
+       /* PA6  */ {   0,   1,   1,   1,   0,   0   }, /* TDM A1 L1RSYNC */
+       /* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */
+       /* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */
+       /* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */
+       /* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */
+       /* PA1  */ {   1,   0,   0,   0,   0,   0   }, /* FREERUN */
+       /* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */
+    },
+
+    /* Port B configuration */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */
+       /* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */
+       /* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */
+       /* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */
+       /* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */
+       /* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */
+       /* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */
+       /* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */
+       /* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */
+       /* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */
+       /* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */
+       /* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */
+       /* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */
+       /* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */
+       /* PB17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_DIV */
+       /* PB16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_ERR */
+       /* PB15 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_ERR */
+       /* PB14 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_EN */
+       /* PB13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:COL */
+       /* PB12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:CRS */
+       /* PB11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB9  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB8  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */
+       /* PB7  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB6  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB5  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB4  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */
+       /* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    },
+
+    /* Port C */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */
+       /* PC30 */ {   0,   0,   0,   1,   0,   0   }, /* PC30 */
+       /* PC29 */ {   0,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */
+       /* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */
+       /* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* UART Clock in */
+       /* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */
+       /* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */
+       /* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */
+       /* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */
+       /* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */
+       /* PC21 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */
+       /* PC20 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */
+       /* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK CLK13 */
+       /* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK14) */
+       /* PC17 */ {   0,   0,   0,   1,   0,   0   }, /* PC17 */
+       /* PC16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK16) */
+       /* PC15 */ {   0,   1,   0,   0,   0,   0   }, /* PC15 */
+       /* PC14 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */
+       /* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */
+       /* PC12 */ {   0,   1,   0,   1,   0,   0   }, /* PC12 */
+       /* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* LXT971 transmit control */
+       /* PC10 */ {   0,   0,   0,   1,   0,   0   }, /* FETHMDC */
+       /* PC9  */ {   0,   0,   0,   0,   0,   0   }, /* FETHMDIO */
+       /* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */
+       /* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */
+       /* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */
+       /* PC5  */ {   0,   0,   0,   1,   0,   0   }, /* PC5 */
+       /* PC4  */ {   0,   0,   0,   1,   0,   0   }, /* PC4 */
+       /* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */
+       /* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */
+       /* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */
+       /* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */
+    },
+
+    /* Port D */
+    {   /*            conf ppar psor pdir podr pdat */
+       /* PD31 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */
+       /* PD30 */ {   0,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */
+       /* PD29 */ {   0,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */
+       /* PD28 */ {   1,   1,   0,   0,   0,   0   }, /* SCC2 RxD */
+       /* PD27 */ {   1,   1,   0,   1,   0,   0   }, /* SCC2 TxD */
+       /* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */
+       /* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */
+       /* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */
+       /* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */
+       /* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */
+       /* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */
+       /* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */
+       /* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
+       /* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */
+       /* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */
+       /* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */
+       /* PD15 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SDA */
+       /* PD14 */ {   1,   1,   1,   0,   0,   0   }, /* I2C CLK */
+       /* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */
+       /* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */
+       /* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */
+       /* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */
+       /* PD9  */ {   0,   1,   0,   1,   0,   0   }, /* SMC1 TXD */
+       /* PD8  */ {   0,   1,   0,   0,   0,   0   }, /* SMC1 RXD */
+       /* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */
+       /* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */
+       /* PD5  */ {   0,   0,   0,   1,   0,   1   }, /* PD5 */
+       /* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */
+       /* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    }
+};
+
+static uint64_t        next_led_update;
+static uint            led_bit;
+
+void
+reset_phy(void)
+{
+       volatile uint *blatch;
+#if 0
+       int     i;
+#endif
+       blatch = (volatile uint *)CFG_LBC_CFGLATCH_BASE;
+
+       /* reset Giga bit Ethernet port if needed here */
+
+#if 1
+       *blatch &= ~0x000000c0;
+       udelay(100);
+#else
+       *blatch = 0;
+       asm("eieio");
+       for (i=0; i<1000; i++)
+               udelay(1000);
+#endif
+       *blatch = 0x000000c1;   /* Light one led, too */
+       udelay(1000);
+
+#if 0  /* This is the port we really want to use for debugging. */
+       /* reset the CPM FEC port */
+#if (CONFIG_ETHER_INDEX == 2)
+       bcsr->bcsr2 &= ~FETH2_RST;
+       udelay(2);
+       bcsr->bcsr2 |=  FETH2_RST;
+       udelay(1000);
+#elif (CONFIG_ETHER_INDEX == 3)
+       bcsr->bcsr3 &= ~FETH3_RST;
+       udelay(2);
+       bcsr->bcsr3 |=  FETH3_RST;
+       udelay(1000);
+#endif
+#if defined(CONFIG_MII) && defined(CONFIG_ETHER_ON_FCC)
+       /* reset PHY */
+       miiphy_reset("FCC1 ETHERNET", 0x0);
+
+       /* change PHY address to 0x02 */
+       bb_miiphy_write(NULL, 0, PHY_MIPSCR, 0xf028);
+
+       bb_miiphy_write(NULL, 0x02, PHY_BMCR,
+                       PHY_BMCR_AUTON | PHY_BMCR_RST_NEG);
+#endif /* CONFIG_MII */
+#endif
+}
+
+int
+board_early_init_f(void)
+{
+#if defined(CONFIG_PCI)
+    volatile immap_t *immr = (immap_t *)CFG_IMMR;
+    volatile ccsr_pcix_t *pci = &immr->im_pcix;
+
+    pci->peer &= 0xfffffffdf; /* disable master abort */
+#endif
+
+       /* Why is the phy reset done _after_ the ethernet
+        * initialization in lib_ppc/board.c?
+        * Do it here so it's done before the TSECs are used.
+        */
+       reset_phy();
+
+       return 0;
+}
+
+int
+checkboard(void)
+{
+       printf ("Board: Silicon Tx GPPP SSA Board\n");
+       return (0);
+}
+
+/* Blinkin' LEDS for Robert.
+*/
+void
+show_activity(int flag)
+{
+       volatile uint *blatch;
+
+       if (next_led_update > get_ticks())
+               return;
+
+       blatch = (volatile uint *)CFG_LBC_CFGLATCH_BASE;
+
+       led_bit >>= 1;
+       if (led_bit == 0)
+               led_bit = 0x08;
+       *blatch = (0xc0 | led_bit);
+       eieio();
+       next_led_update += (get_tbclk() / 4);
+}
+
+long int
+initdram (int board_type)
+{
+       long dram_size = 0;
+       extern long spd_sdram (void);
+
+#if defined(CONFIG_DDR_DLL)
+       {
+               volatile immap_t *immap = (immap_t *)CFG_IMMR;
+               volatile ccsr_gur_t *gur= &immap->im_gur;
+               uint temp_ddrdll = 0;
+
+               /* Work around to stabilize DDR DLL */
+               temp_ddrdll = gur->ddrdllcr;
+               gur->ddrdllcr = ((temp_ddrdll & 0xff) << 16) | 0x80000000;
+               asm("sync;isync;msync");
+       }
+#endif
+
+       dram_size = spd_sdram ();
+
+#if defined(CONFIG_DDR_ECC)
+       /* Initialize and enable DDR ECC.
+       */
+       ddr_enable_ecc(dram_size);
+#endif
+
+       return dram_size;
+}
+
+
+#if defined(CFG_DRAM_TEST)
+int testdram (void)
+{
+       uint *pstart = (uint *) CFG_MEMTEST_START;
+       uint *pend = (uint *) CFG_MEMTEST_END;
+       uint *p;
+
+       printf("SDRAM test phase 1:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0xaaaaaaaa;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0xaaaaaaaa) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("SDRAM test phase 2:\n");
+       for (p = pstart; p < pend; p++)
+               *p = 0x55555555;
+
+       for (p = pstart; p < pend; p++) {
+               if (*p != 0x55555555) {
+                       printf ("SDRAM test fails at: %08x\n", (uint) p);
+                       return 1;
+               }
+       }
+
+       printf("SDRAM test passed.\n");
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_PCI)
+
+/*
+ * Initialize PCI Devices, report devices found.
+ */
+
+#ifndef CONFIG_PCI_PNP
+static struct pci_config_table pci_stxgp3_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 hose = {
+#ifndef CONFIG_PCI_PNP
+       config_table: pci_stxgp3_config_table,
+#endif
+};
+
+#endif /* CONFIG_PCI */
+
+
+void
+pci_init_board(void)
+{
+#ifdef CONFIG_PCI
+       extern void pci_mpc85xx_init(struct pci_controller *hose);
+
+       pci_mpc85xx_init(&hose);
+#endif /* CONFIG_PCI */
+}
diff --git a/board/stxssa/u-boot.lds b/board/stxssa/u-boot.lds
new file mode 100644 (file)
index 0000000..95ecf66
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * (C) Copyright 2005 Embedded Alley Solutions, Inc.
+ * Dan Malek, <dan@embeddedalley.com>
+ * Copied from STx GP3.
+ * Updates for Silicon Tx GP3 SSA.
+ *
+ * (C) Copyright 2002,2003,Motorola,Inc.
+ * Xianghua Xiao, X.Xiao@motorola.com.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+SECTIONS
+{
+  .resetvec 0xFFFFFFFC :
+  {
+    *(.resetvec)
+  } = 0xffff
+
+  .bootpg 0xFFFFF000 :
+  {
+    cpu/mpc85xx/start.o        (.bootpg)
+    board/stxssa/init.o (.bootpg)
+  } = 0xffff
+
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc85xx/start.o        (.text)
+    board/stxssa/init.o (.text)
+    cpu/mpc85xx/commproc.o (.text)
+    cpu/mpc85xx/traps.o (.text)
+    cpu/mpc85xx/interrupts.o (.text)
+    cpu/mpc85xx/serial_scc.o (.text)
+    cpu/mpc85xx/ether_fcc.o (.text)
+    cpu/mpc85xx/cpu_init.o (.text)
+    cpu/mpc85xx/cpu.o (.text)
+    cpu/mpc85xx/speed.o (.text)
+    cpu/mpc85xx/spd_sdram.o (.text)
+    common/dlmalloc.o (.text)
+    lib_generic/crc32.o (.text)
+    lib_ppc/extable.o (.text)
+    lib_generic/zlib.o (.text)
+    *(.text)
+    *(.fixup)
+    *(.got1)
+   }
+    _etext = .;
+    PROVIDE (etext = .);
+    .rodata    :
+   {
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.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 8257c77502c75a08e258b9f678d74b21a4c6898f..70d1bb889f7d53993efba9470f909f87a2069a73 100644 (file)
@@ -768,7 +768,7 @@ int analyse_hwib (void)
        p +=1;
        p +=1;  /* connector */
        if (*p != '0') {
-               hw->eeprom = 0x100 << (*p - 'A');
+               hw->eeprom = 0x1000 << (*p - 'A');
        }
        p++;
 
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..f7265139653d81691dbd0958a40617da06d3397b 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;
@@ -221,6 +221,8 @@ long int initdram (int board_type)
 int checkboard (void)
 {
        puts ("Board: MAN UC101\n");
+       /* clear the Display */
+       *(char *)(CFG_DISP_CWORD) = 0x80;
        return 0;
 }
 
@@ -266,7 +268,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 +285,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 +310,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 +333,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;
 
diff --git a/board/xilinx/ml401/Makefile b/board/xilinx/ml401/Makefile
new file mode 100644 (file)
index 0000000..9ab5633
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# (C) Copyright 2000-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
+ifneq ($(OBJTREE),$(SRCTREE))
+$(shell mkdir -p $(obj)../common)
+$(shell mkdir -p $(obj)../xilinx_enet)
+endif
+
+INCS           := -I../common -I../xilinx_enet
+CFLAGS         += $(INCS)
+HOST_CFLAGS    += $(INCS)
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  = $(BOARD).o \
+         ../xilinx_enet/emac_adapter.o  ../xilinx_enet/xemac.o \
+         ../xilinx_enet/xemac_options.o ../xilinx_enet/xemac_polled.o \
+         ../xilinx_enet/xemac_intr.o ../xilinx_enet/xemac_g.o \
+         ../xilinx_enet/xemac_intr_dma.o ../common/xipif_v1_23_b.o \
+         ../common/xbasic_types.o ../common/xdma_channel.o \
+         ../common/xdma_channel_sg.o ../common/xpacket_fifo_v1_00_b.o \
+         ../common/xversion.o \
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $^
+
+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/xilinx/ml401/config.mk b/board/xilinx/ml401/config.mk
new file mode 100644 (file)
index 0000000..c75daaf
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# (C) Copyright 2007 Michal Simek
+#
+# Michal  SIMEK <monstr@monstr.eu>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# CAUTION: This file is automatically generated by libgen.
+# Version: Xilinx EDK 6.3 EDK_Gmm.12.3
+#
+
+TEXT_BASE = 0x29000000
+
+PLATFORM_CPPFLAGS += -mno-xl-soft-mul
+PLATFORM_CPPFLAGS += -mno-xl-soft-div
+PLATFORM_CPPFLAGS += -mxl-barrel-shift
diff --git a/board/xilinx/ml401/ml401.c b/board/xilinx/ml401/ml401.c
new file mode 100644 (file)
index 0000000..955936d
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* This is a board specific file.  It's OK to include board specific
+ * header files */
+
+#include <common.h>
+#include <config.h>
+#include <asm/microblaze_intc.h>
+#include <asm/asm.h>
+
+void do_reset (void)
+{
+#ifdef CFG_GPIO_0
+       *((unsigned long *)(CFG_GPIO_0_ADDR)) =
+           ++(*((unsigned long *)(CFG_GPIO_0_ADDR)));
+#endif
+#ifdef CFG_RESET_ADDRESS
+       puts ("Reseting board\n");
+       asm ("bra r0");
+#endif
+}
+
+int gpio_init (void)
+{
+#ifdef CFG_GPIO_0
+       *((unsigned long *)(CFG_GPIO_0_ADDR)) = 0xFFFFFFFF;
+#endif
+       return 0;
+}
+
+#ifdef CFG_FSL_2
+void fsl_isr2 (void *arg) {
+       volatile int num;
+       *((unsigned int *)(CFG_GPIO_0_ADDR + 0x4)) =
+           ++(*((unsigned int *)(CFG_GPIO_0_ADDR + 0x4)));
+       GET (num, 2);
+       NGET (num, 2);
+       puts("*");
+}
+
+void fsl_init2 (void) {
+       puts("fsl_init2\n");
+       install_interrupt_handler (FSL_INTR_2,\
+ fsl_isr2,\
+ NULL);
+}
+#endif
diff --git a/board/xilinx/ml401/u-boot.lds b/board/xilinx/ml401/u-boot.lds
new file mode 100644 (file)
index 0000000..cb90854
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * (C) Copyright 2004 Atmark Techno, Inc.
+ *
+ * Yasushi SHOJI <yashi@atmark-techno.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(microblaze)
+ENTRY(_start)
+
+SECTIONS
+{
+       .text ALIGN(0x4):
+       {
+               __text_start = .;
+               cpu/microblaze/start.o (.text)
+               *(.text)
+               __text_end = .;
+       }
+
+       .rodata ALIGN(0x4):
+       {
+               __rodata_start = .;
+               *(.rodata)
+               __rodata_end = .;
+       }
+
+       .data ALIGN(0x4):
+       {
+               __data_start = .;
+               *(.data)
+               __data_end = .;
+       }
+
+       .u_boot_cmd ALIGN(0x4):
+       {
+               . = .;
+               __u_boot_cmd_start = .;
+               *(.u_boot_cmd)
+               __u_boot_cmd_end = .;
+       }
+
+       .bss ALIGN(0x4):
+       {
+               __bss_start = .;
+               *(.bss)
+               __bss_end = .;
+       }
+       __end = . ;
+}
diff --git a/board/xilinx/ml401/xparameters.h b/board/xilinx/ml401/xparameters.h
new file mode 100755 (executable)
index 0000000..1a116ea
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * CAUTION: This file is automatically generated by libgen.
+ * Version: Xilinx EDK 8.2.02 EDK_Im_Sp2.4
+ */
+
+/* System Clock Frequency */
+#define XILINX_CLOCK_FREQ      100000000
+
+/* Microblaze is microblaze_0 */
+#define XILINX_USE_MSR_INSTR   1
+#define XILINX_FSL_NUMBER      3
+
+/* Interrupt controller is opb_intc_0 */
+#define XILINX_INTC_BASEADDR   0x41200000
+#define XILINX_INTC_NUM_INTR_INPUTS    6
+
+/* Timer pheriphery is opb_timer_1 */
+#define XILINX_TIMER_BASEADDR  0x41c00000
+#define XILINX_TIMER_IRQ       0
+
+/* Uart pheriphery is RS232_Uart */
+#define XILINX_UART_BASEADDR   0x40600000
+#define XILINX_UART_BAUDRATE   115200
+
+/* IIC pheriphery is IIC_EEPROM */
+#define XILINX_IIC_0_BASEADDR  0x40800000
+#define XILINX_IIC_0_FREQ      100000
+#define XILINX_IIC_0_BIT       0
+
+/* GPIO is LEDs_4Bit*/
+#define XILINX_GPIO_BASEADDR   0x40000000
+
+/* Flash Memory is FLASH_2Mx32 */
+#define XILINX_FLASH_START     0x2c000000
+#define XILINX_FLASH_SIZE      0x00800000
+
+/* Main Memory is DDR_SDRAM_64Mx32 */
+#define XILINX_RAM_START       0x28000000
+#define XILINX_RAM_SIZE        0x04000000
+
+/* Sysace Controller is SysACE_CompactFlash */
+#define XILINX_SYSACE_BASEADDR 0x41800000
+#define XILINX_SYSACE_HIGHADDR 0x4180ffff
+#define XILINX_SYSACE_MEM_WIDTH        16
+
+/* Ethernet controller is Ethernet_MAC */
+#define XPAR_XEMAC_NUM_INSTANCES       1
+#define XPAR_OPB_ETHERNET_0_DEVICE_ID  0
+#define XPAR_OPB_ETHERNET_0_BASEADDR   0x40c00000
+#define XPAR_OPB_ETHERNET_0_HIGHADDR   0x40c0ffff
+#define XPAR_OPB_ETHERNET_0_DMA_PRESENT        1
+#define XPAR_OPB_ETHERNET_0_ERR_COUNT_EXIST    1
+#define XPAR_OPB_ETHERNET_0_MII_EXIST  1
index b30e8976692211c55242938ed70296f90a5ab38d..d3403038e65e84a1375e68eed09f6ab109d4ea3f 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)
@@ -147,7 +147,11 @@ eth_rx(void)
        RecvFrameLength = PKTSIZE;
        Result = XEmac_PollRecv(&Emac, (u8 *) etherrxbuff, &RecvFrameLength);
        if (Result == XST_SUCCESS) {
+#ifndef CONFIG_EMACLITE
                NetReceive((uchar *)etherrxbuff, RecvFrameLength);
+#else
+               NetReceive(etherrxbuff, RecvFrameLength);
+#endif
                return (1);
        } else {
                return (0);
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>
diff --git a/board/xilinx/xupv2p/Makefile b/board/xilinx/xupv2p/Makefile
new file mode 100644 (file)
index 0000000..9ab5633
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# (C) Copyright 2000-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
+ifneq ($(OBJTREE),$(SRCTREE))
+$(shell mkdir -p $(obj)../common)
+$(shell mkdir -p $(obj)../xilinx_enet)
+endif
+
+INCS           := -I../common -I../xilinx_enet
+CFLAGS         += $(INCS)
+HOST_CFLAGS    += $(INCS)
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  = $(BOARD).o \
+         ../xilinx_enet/emac_adapter.o  ../xilinx_enet/xemac.o \
+         ../xilinx_enet/xemac_options.o ../xilinx_enet/xemac_polled.o \
+         ../xilinx_enet/xemac_intr.o ../xilinx_enet/xemac_g.o \
+         ../xilinx_enet/xemac_intr_dma.o ../common/xipif_v1_23_b.o \
+         ../common/xbasic_types.o ../common/xdma_channel.o \
+         ../common/xdma_channel_sg.o ../common/xpacket_fifo_v1_00_b.o \
+         ../common/xversion.o \
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $^
+
+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/xilinx/xupv2p/config.mk b/board/xilinx/xupv2p/config.mk
new file mode 100644 (file)
index 0000000..c07b0b3
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# (C) Copyright 2007 Michal Simek
+#
+# Michal  SIMEK <monstr@monstr.eu>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+# CAUTION: This file is automatically generated by libgen.
+# Version: Xilinx EDK 8.2.02 EDK_Im_Sp2.4
+#
+
+TEXT_BASE = 0x38000000
+
+PLATFORM_CPPFLAGS += -mno-xl-soft-mul
+PLATFORM_CPPFLAGS += -mno-xl-soft-div
+PLATFORM_CPPFLAGS += -mxl-barrel-shift
diff --git a/board/xilinx/xupv2p/u-boot.lds b/board/xilinx/xupv2p/u-boot.lds
new file mode 100644 (file)
index 0000000..cb90854
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * (C) Copyright 2004 Atmark Techno, Inc.
+ *
+ * Yasushi SHOJI <yashi@atmark-techno.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(microblaze)
+ENTRY(_start)
+
+SECTIONS
+{
+       .text ALIGN(0x4):
+       {
+               __text_start = .;
+               cpu/microblaze/start.o (.text)
+               *(.text)
+               __text_end = .;
+       }
+
+       .rodata ALIGN(0x4):
+       {
+               __rodata_start = .;
+               *(.rodata)
+               __rodata_end = .;
+       }
+
+       .data ALIGN(0x4):
+       {
+               __data_start = .;
+               *(.data)
+               __data_end = .;
+       }
+
+       .u_boot_cmd ALIGN(0x4):
+       {
+               . = .;
+               __u_boot_cmd_start = .;
+               *(.u_boot_cmd)
+               __u_boot_cmd_end = .;
+       }
+
+       .bss ALIGN(0x4):
+       {
+               __bss_start = .;
+               *(.bss)
+               __bss_end = .;
+       }
+       __end = . ;
+}
diff --git a/board/xilinx/xupv2p/xparameters.h b/board/xilinx/xupv2p/xparameters.h
new file mode 100644 (file)
index 0000000..a96c693
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ * CAUTION: This file is automatically generated by libgen.
+ * Version: Xilinx EDK 8.2.02 EDK_Im_Sp2.4
+ */
+
+/* System Clock Frequency */
+#define XILINX_CLOCK_FREQ      100000000
+
+/* Interrupt controller is opb_intc_0 */
+#define XILINX_INTC_BASEADDR   0x41200000
+#define XILINX_INTC_NUM_INTR_INPUTS    11
+
+/* Timer pheriphery is opb_timer_1 */
+#define XILINX_TIMER_BASEADDR  0x41c00000
+#define XILINX_TIMER_IRQ       1
+
+/* Uart pheriphery is RS232_Uart_1 */
+#define XILINX_UART_BASEADDR   0x40600000
+#define XILINX_UART_BAUDRATE   115200
+
+/* GPIO is LEDs_4Bit*/
+#define XILINX_GPIO_BASEADDR   0x40000000
+
+/* FLASH doesn't exist none */
+
+/* Main Memory is DDR_256MB_32MX64_rank1_row13_col10_cl2_5 */
+#define XILINX_RAM_START       0x30000000
+#define XILINX_RAM_SIZE        0x10000000
+
+/* Sysace Controller is SysACE_CompactFlash */
+#define XILINX_SYSACE_BASEADDR 0x41800000
+#define XILINX_SYSACE_HIGHADDR 0x4180ffff
+#define XILINX_SYSACE_MEM_WIDTH        16
+
+/* Ethernet controller is Ethernet_MAC */
+#define XPAR_XEMAC_NUM_INSTANCES       1
+#define XPAR_OPB_ETHERNET_0_DEVICE_ID  0
+#define XPAR_OPB_ETHERNET_0_BASEADDR   0x40c00000
+#define XPAR_OPB_ETHERNET_0_HIGHADDR   0x40c0ffff
+#define XPAR_OPB_ETHERNET_0_DMA_PRESENT        1
+#define XPAR_OPB_ETHERNET_0_ERR_COUNT_EXIST    1
+#define XPAR_OPB_ETHERNET_0_MII_EXIST  1
diff --git a/board/xilinx/xupv2p/xupv2p.c b/board/xilinx/xupv2p/xupv2p.c
new file mode 100644 (file)
index 0000000..b48103f
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* This is a board specific file.  It's OK to include board specific
+ * header files */
+
+#include <common.h>
+#include <config.h>
+
+void do_reset (void)
+{
+#ifdef CFG_GPIO_0
+       *((unsigned long *)(CFG_GPIO_0_ADDR)) =
+           ++(*((unsigned long *)(CFG_GPIO_0_ADDR)));
+#endif
+#ifdef CFG_RESET_ADDRESS
+       puts ("Reseting board\n");
+       asm ("bra r0");
+#endif
+}
+
+int gpio_init (void)
+{
+#ifdef CFG_GPIO_0
+       *((unsigned long *)(CFG_GPIO_0_ADDR)) = 0x0;
+#endif
+       return 0;
+}
index 0106088e242de968e1fddaff159bb66e8aae7dba..bc1f7145056ef618e783a6f955b15922a2af9468 100644 (file)
@@ -27,13 +27,12 @@ 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 \
          cmd_eeprom.o cmd_elf.o cmd_ext2.o \
-         cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o cmd_fpga.o \
+         cmd_fat.o cmd_fdc.o cmd_fdt.o cmd_fdos.o cmd_flash.o cmd_fpga.o \
          cmd_i2c.o cmd_ide.o cmd_immap.o cmd_itest.o cmd_jffs2.o \
          cmd_load.o cmd_log.o \
          cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o \
@@ -46,12 +45,12 @@ COBJS       = main.o ACEX1K.o altera.o bedbug.o circbuf.o \
          env_nand.o env_dataflash.o env_flash.o env_eeprom.o \
          env_nvram.o env_nowhere.o \
          exports.o \
-         flash.o fpga.o ft_build.o \
+         fdt_support.o flash.o fpga.o ft_build.o \
          hush.o kgdb.o lcd.o lists.o lynxkdi.o \
          memsize.o miiphybb.o miiphyutil.o \
          s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o spartan3.o \
          usb.o usb_kbd.o usb_storage.o \
-         virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o
+         virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o cmd_mfsl.o
 
 SRCS   := $(AOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(AOBJS) $(COBJS))
diff --git a/common/cmd_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 70de795deed136f0dd99aea2427350a2355b086e..d97c09e88ee4f9d213014d6b11b130a704efe148 100644 (file)
@@ -180,6 +180,32 @@ int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        return 0;
 }
+#elif defined(CONFIG_MICROBLAZE) /* ! PPC, which leaves Microblaze */
+
+int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       int i;
+       bd_t *bd = gd->bd;
+       print_num ("mem start      ",   (ulong)bd->bi_memstart);
+       print_num ("mem size       ",   (ulong)bd->bi_memsize);
+       print_num ("flash start    ",   (ulong)bd->bi_flashstart);
+       print_num ("flash size     ",   (ulong)bd->bi_flashsize);
+       print_num ("flash offset   ",   (ulong)bd->bi_flashoffset);
+#if defined(CFG_SRAM_BASE)
+       print_num ("sram start     ",   (ulong)bd->bi_sramstart);
+       print_num ("sram size      ",   (ulong)bd->bi_sramsize);
+#endif
+#if defined(CFG_CMD_NET)
+       puts ("ethaddr     =");
+       for (i=0; i<6; ++i) {
+               printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
+       }
+       puts ("\nip_addr     = ");
+       print_IPaddr (bd->bi_ip_addr);
+#endif
+       printf ("\nbaudrate    = %d bps\n", (ulong)bd->bi_baudrate);
+       return 0;
+}
 
 #else /* ! PPC, which leaves MIPS */
 
index 7aae8a6d1b0a2f9919a1219c5a7f067f87dc7564..a6499e8dd9bc3fc853606567c847d0a064f02e55 100644 (file)
 #include <environment.h>
 #include <asm/byteorder.h>
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_LIBFDT)
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#endif
+#if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
 #endif
 
@@ -242,26 +247,26 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        len_ptr = (ulong *)data;
 
-#if defined(__PPC__)
-       if (hdr->ih_arch != IH_CPU_PPC)
-#elif defined(__ARM__)
+#if defined(__ARM__)
        if (hdr->ih_arch != IH_CPU_ARM)
+#elif defined(__avr32__)
+       if (hdr->ih_arch != IH_CPU_AVR32)
+#elif defined(__bfin__)
+       if (hdr->ih_arch != IH_CPU_BLACKFIN)
 #elif defined(__I386__)
        if (hdr->ih_arch != IH_CPU_I386)
-#elif defined(__mips__)
-       if (hdr->ih_arch != IH_CPU_MIPS)
-#elif defined(__nios__)
-       if (hdr->ih_arch != IH_CPU_NIOS)
 #elif defined(__M68K__)
        if (hdr->ih_arch != IH_CPU_M68K)
 #elif defined(__microblaze__)
        if (hdr->ih_arch != IH_CPU_MICROBLAZE)
+#elif defined(__mips__)
+       if (hdr->ih_arch != IH_CPU_MIPS)
+#elif defined(__nios__)
+       if (hdr->ih_arch != IH_CPU_NIOS)
 #elif defined(__nios2__)
        if (hdr->ih_arch != IH_CPU_NIOS2)
-#elif defined(__blackfin__)
-       if (hdr->ih_arch != IH_CPU_BLACKFIN)
-#elif defined(__avr32__)
-       if (hdr->ih_arch != IH_CPU_AVR32)
+#elif defined(__PPC__)
+       if (hdr->ih_arch != IH_CPU_PPC)
 #else
 # error Unknown CPU type
 #endif
@@ -467,7 +472,7 @@ U_BOOT_CMD(
        "[addr [arg ...]]\n    - boot application image stored in memory\n"
        "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
        "\t'arg' can be the address of an initrd image\n"
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        "\tWhen booting a Linux kernel which requires a flat device-tree\n"
        "\ta third argument is required which is the address of the of the\n"
        "\tdevice-tree blob. To boot that kernel without an initrd image,\n"
@@ -529,7 +534,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        bd_t    *kbd;
        void    (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
        image_header_t *hdr = &header;
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        char    *of_flat_tree = NULL;
        ulong   of_data = 0;
 #endif
@@ -622,7 +627,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
         * Check if there is an initrd image
         */
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        /* Look for a '-' which indicates to ignore the ramdisk argument */
        if (argc >= 3 && strcmp(argv[2], "-") ==  0) {
                        debug ("Skipping initrd\n");
@@ -739,12 +744,15 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                len = data = 0;
        }
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        if(argc > 3) {
                of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);
                hdr = (image_header_t *)of_flat_tree;
-
-               if  (*(ulong *)of_flat_tree == OF_DT_HEADER) {
+#if defined(CONFIG_OF_LIBFDT)
+               if (fdt_check_header(of_flat_tree) == 0) {
+#else
+               if (*(ulong *)of_flat_tree == OF_DT_HEADER) {
+#endif
 #ifndef CFG_NO_FLASH
                        if (addr2info((ulong)of_flat_tree) != NULL)
                                of_data = (ulong)of_flat_tree;
@@ -771,9 +779,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 
                        checksum = ntohl(hdr->ih_dcrc);
                        addr = (ulong)((uchar *)(hdr) + sizeof(image_header_t));
-                       len = ntohl(hdr->ih_size);
 
-                       if(checksum != crc32(0, (uchar *)addr, len)) {
+                       if(checksum != crc32(0, (uchar *)addr, ntohl(hdr->ih_size))) {
                                printf("ERROR: Flat Device Tree checksum is invalid\n");
                                return;
                        }
@@ -787,7 +794,11 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                                printf("ERROR: uImage is not uncompressed\n");
                                return;
                        }
+#if defined(CONFIG_OF_LIBFDT)
+                       if (fdt_check_header(of_flat_tree + sizeof(image_header_t)) == 0) {
+#else
                        if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) {
+#endif
                                printf ("ERROR: uImage data is not a flat device tree\n");
                                return;
                        }
@@ -824,12 +835,20 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                        of_data += 4 - tail;
                }
 
+#if defined(CONFIG_OF_LIBFDT)
+               if (fdt_check_header((void *)of_data) != 0) {
+#else
                if (((struct boot_param_header *)of_data)->magic != OF_DT_HEADER) {
+#endif
                        printf ("ERROR: image is not a flat device tree\n");
                        return;
                }
 
+#if defined(CONFIG_OF_LIBFDT)
+               if (be32_to_cpu(fdt_totalsize(of_data)) !=  ntohl(len_ptr[2])) {
+#else
                if (((struct boot_param_header *)of_data)->totalsize != ntohl(len_ptr[2])) {
+#endif
                        printf ("ERROR: flat device tree size does not agree with image\n");
                        return;
                }
@@ -913,7 +932,52 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        unlock_ram_in_cache();
 #endif
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_LIBFDT)
+       /* move of_flat_tree if needed */
+       if (of_data) {
+               int err;
+               ulong of_start, of_len;
+
+               of_len = be32_to_cpu(fdt_totalsize(of_data));
+               /* position on a 4K boundary before the initrd/kbd */
+               if (initrd_start)
+                       of_start = initrd_start - of_len;
+               else
+                       of_start  = (ulong)kbd - of_len;
+               of_start &= ~(4096 - 1);        /* align on page */
+               debug ("## device tree at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",
+                       of_data, of_data + of_len - 1, of_len, of_len);
+
+               of_flat_tree = (char *)of_start;
+               printf ("   Loading Device Tree to %08lx, end %08lx ... ",
+                       of_start, of_start + of_len - 1);
+               err = fdt_open_into((void *)of_start, (void *)of_data, of_len);
+               if (err != 0) {
+                       printf ("libfdt: %s " __FILE__ " %d\n", fdt_strerror(err), __LINE__);
+               }
+               /*
+                * Add the chosen node if it doesn't exist, add the env and bd_t
+                * if the user wants it (the logic is in the subroutines).
+                */
+               if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) {
+                               printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree);
+                               return;
+               }
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
+               if (fdt_env(of_flat_tree) < 0) {
+                               printf("Failed creating the /u-boot-env node, aborting.\n");
+                               return;
+               }
+#endif
+#ifdef CONFIG_OF_HAS_BD_T
+               if (fdt_bd_t(of_flat_tree) < 0) {
+                               printf("Failed creating the /bd_t node, aborting.\n");
+                               return;
+               }
+#endif
+       }
+#endif
+#if defined(CONFIG_OF_FLAT_TREE)
        /* move of_flat_tree if needed */
        if (of_data) {
                ulong of_start, of_len;
@@ -942,13 +1006,13 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
         *   r6: Start of command line string
         *   r7: End   of command line string
         */
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        if (!of_flat_tree)      /* no device tree; boot old style */
 #endif
                (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
                /* does not return */
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
        /*
         * Linux Kernel Parameters (passing device tree):
         *   r3: ptr to OF flat tree, followed by the board info data
@@ -957,8 +1021,28 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
         *   r6: NULL
         *   r7: NULL
         */
+#if defined(CONFIG_OF_FLAT_TREE)
        ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
        /* ft_dump_blob(of_flat_tree); */
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+       if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) {
+               printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree);
+               return;
+       }
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
+       if (fdt_env(of_flat_tree) < 0) {
+               printf("Failed creating the /u-boot-env node, aborting.\n");
+               return;
+       }
+#endif
+#ifdef CONFIG_OF_HAS_BD_T
+       if (fdt_bd_t(of_flat_tree) < 0) {
+               printf("Failed creating the /bd_t node, aborting.\n");
+               return;
+       }
+#endif
+#endif /* if defined(CONFIG_OF_LIBFDT) */
 
        (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
 #endif
@@ -1354,19 +1438,20 @@ print_type (image_header_t *hdr)
        case IH_CPU_ALPHA:      arch = "Alpha";                 break;
        case IH_CPU_ARM:        arch = "ARM";                   break;
        case IH_CPU_AVR32:      arch = "AVR32";                 break;
+       case IH_CPU_BLACKFIN:   arch = "Blackfin";              break;
        case IH_CPU_I386:       arch = "Intel x86";             break;
        case IH_CPU_IA64:       arch = "IA64";                  break;
-       case IH_CPU_MIPS:       arch = "MIPS";                  break;
+       case IH_CPU_M68K:       arch = "M68K";                  break;
+       case IH_CPU_MICROBLAZE: arch = "Microblaze";            break;
        case IH_CPU_MIPS64:     arch = "MIPS 64 Bit";           break;
+       case IH_CPU_MIPS:       arch = "MIPS";                  break;
+       case IH_CPU_NIOS2:      arch = "Nios-II";               break;
+       case IH_CPU_NIOS:       arch = "Nios";                  break;
        case IH_CPU_PPC:        arch = "PowerPC";               break;
        case IH_CPU_S390:       arch = "IBM S390";              break;
        case IH_CPU_SH:         arch = "SuperH";                break;
-       case IH_CPU_SPARC:      arch = "SPARC";                 break;
        case IH_CPU_SPARC64:    arch = "SPARC 64 Bit";          break;
-       case IH_CPU_M68K:       arch = "M68K";                  break;
-       case IH_CPU_MICROBLAZE: arch = "Microblaze";            break;
-       case IH_CPU_NIOS:       arch = "Nios";                  break;
-       case IH_CPU_NIOS2:      arch = "Nios-II";               break;
+       case IH_CPU_SPARC:      arch = "SPARC";                 break;
        default:                arch = "Unknown Architecture";  break;
        }
 
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;
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
new file mode 100644 (file)
index 0000000..08fe351
--- /dev/null
@@ -0,0 +1,635 @@
+/*
+ * (C) Copyright 2007
+ * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
+ * Based on code written by:
+ *   Pantelis Antoniou <pantelis.antoniou@gmail.com> and
+ *   Matthew McClintock <msm@freescale.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <linux/ctype.h>
+#include <linux/types.h>
+
+#ifdef CONFIG_OF_LIBFDT
+
+#include <asm/global_data.h>
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+
+#define MAX_LEVEL      32              /* how deeply nested we will go */
+#define SCRATCHPAD     1024    /* bytes of scratchpad memory */
+
+/*
+ * Global data (for the gd->bd)
+ */
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Scratchpad memory.
+ */
+static char data[SCRATCHPAD];
+
+
+/*
+ * Function prototypes/declarations.
+ */
+static int fdt_valid(void);
+static void print_data(const void *data, int len);
+
+
+/*
+ * Flattened Device Tree command, see the help for parameter definitions.
+ */
+int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       char            op;
+
+       if (argc < 2) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       /*
+        * Figure out which subcommand was given
+        */
+       op = argv[1][0];
+       /********************************************************************
+        * Set the address of the fdt
+        ********************************************************************/
+       if (op == 'a') {
+               /*
+                * Set the address [and length] of the fdt.
+                */
+               fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
+
+               if (!fdt_valid()) {
+                       return 1;
+               }
+
+               if (argc >= 4) {
+                       int  len;
+                       int  err;
+                       /*
+                        * Optional new length
+                        */
+                       len =  simple_strtoul(argv[3], NULL, 16);
+                       if (len < fdt_totalsize(fdt)) {
+                               printf ("New length %d < existing length %d, ignoring.\n",
+                                       len, fdt_totalsize(fdt));
+                       } else {
+                               /*
+                                * Open in place with a new length.
+                                */
+                               err = fdt_open_into(fdt, fdt, len);
+                               if (err != 0) {
+                                       printf ("libfdt: %s\n", fdt_strerror(err));
+                               }
+                       }
+               }
+
+       /********************************************************************
+        * Move the fdt
+        ********************************************************************/
+       } else if (op == 'm') {
+               struct fdt_header *newaddr;
+               int  len;
+               int  err;
+
+               if (argc != 5) {
+                       printf ("Usage:\n%s\n", cmdtp->usage);
+                       return 1;
+               }
+
+               /*
+                * Set the address and length of the fdt.
+                */
+               fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
+               if (!fdt_valid()) {
+                       return 1;
+               }
+
+               newaddr = (struct fdt_header *)simple_strtoul(argv[3], NULL, 16);
+               len     =  simple_strtoul(argv[4], NULL, 16);
+               if (len < fdt_totalsize(fdt)) {
+                       printf ("New length %d < existing length %d, aborting.\n",
+                               len, fdt_totalsize(fdt));
+                       return 1;
+               }
+
+               /*
+                * Copy to the new location.
+                */
+               err = fdt_open_into(fdt, newaddr, len);
+               if (err != 0) {
+                       printf ("libfdt: %s\n", fdt_strerror(err));
+                       return 1;
+               }
+               fdt = newaddr;
+
+       /********************************************************************
+        * Set the value of a node in the fdt.
+        ********************************************************************/
+       } else if (op == 's') {
+               char *pathp;            /* path */
+               char *prop;                     /* property */
+               struct fdt_property *nodep;     /* node struct pointer */
+               char *newval;           /* value from the user (as a string) */
+               char *vp;                       /* temporary value pointer */
+               char *cp;                       /* temporary char pointer */
+               int  nodeoffset;        /* node offset from libfdt */
+               int  len;                       /* new length of the property */
+               int  oldlen;            /* original length of the property */
+               unsigned long tmp;      /* holds converted values */
+               int  ret;                       /* return value */
+
+               /*
+                * Parameters: Node path, property, value.
+                */
+               if (argc < 5) {
+                       printf ("Usage:\n%s\n", cmdtp->usage);
+                       return 1;
+               }
+
+               pathp  = argv[2];
+               prop   = argv[3];
+               newval = argv[4];
+
+               if (strcmp(pathp, "/") == 0) {
+                       nodeoffset = 0;
+               } else {
+                       nodeoffset = fdt_path_offset (fdt, pathp);
+                       if (nodeoffset < 0) {
+                               /*
+                                * Not found or something else bad happened.
+                                */
+                               printf ("libfdt: %s\n", fdt_strerror(nodeoffset));
+                               return 1;
+                       }
+               }
+               nodep = fdt_getprop (fdt, nodeoffset, prop, &oldlen);
+               if (oldlen < 0) {
+                       printf ("libfdt %s\n", fdt_strerror(oldlen));
+                       return 1;
+               } else if (oldlen == 0) {
+                       /*
+                        * The specified property has no value
+                        */
+                       printf("%s has no value, cannot set one (yet).\n", prop);
+                       return 1;
+               } else {
+                       /*
+                        * Convert the new property
+                        */
+                       vp = data;
+                       if (*newval == '<') {
+                               /*
+                                * Bigger values than bytes.
+                                */
+                               len = 0;
+                               newval++;
+                               while ((*newval != '>') && (*newval != '\0')) {
+                                       cp = newval;
+                                       tmp = simple_strtoul(cp, &newval, 16);
+                                       if ((newval - cp) <= 2) {
+                                               *vp = tmp & 0xFF;
+                                               vp  += 1;
+                                               len += 1;
+                                       } else if ((newval - cp) <= 4) {
+                                               *(uint16_t *)vp = __cpu_to_be16(tmp);
+                                               vp  += 2;
+                                               len += 2;
+                                       } else if ((newval - cp) <= 8) {
+                                               *(uint32_t *)vp = __cpu_to_be32(tmp);
+                                               vp  += 4;
+                                               len += 4;
+                                       } else {
+                                               printf("Sorry, I could not convert \"%s\"\n", cp);
+                                               return 1;
+                                       }
+                                       while (*newval == ' ')
+                                               newval++;
+                               }
+                               if (*newval != '>') {
+                                       printf("Unexpected character '%c'\n", *newval);
+                                       return 1;
+                               }
+                       } else if (*newval == '[') {
+                               /*
+                                * Byte stream.  Convert the values.
+                                */
+                               len = 0;
+                               newval++;
+                               while ((*newval != ']') && (*newval != '\0')) {
+                                       tmp = simple_strtoul(newval, &newval, 16);
+                                       *vp++ = tmp & 0xFF;
+                                       len++;
+                                       while (*newval == ' ')
+                                               newval++;
+                               }
+                               if (*newval != ']') {
+                                       printf("Unexpected character '%c'\n", *newval);
+                                       return 1;
+                               }
+                       } else {
+                               /*
+                                * Assume it is a string.  Copy it into our data area for
+                                * convenience (including the terminating '\0').
+                                */
+                               len = strlen(newval) + 1;
+                               strcpy(data, newval);
+                       }
+
+                       ret = fdt_setprop(fdt, nodeoffset, prop, data, len);
+                       if (ret < 0) {
+                               printf ("libfdt %s\n", fdt_strerror(ret));
+                               return 1;
+                       }
+               }
+
+       /********************************************************************
+        * Print (recursive) / List (single level)
+        ********************************************************************/
+       } else if ((op == 'p') || (op == 'l')) {
+               /*
+                * Recursively print (a portion of) the fdt.
+                */
+               static int offstack[MAX_LEVEL];
+               static char tabs[MAX_LEVEL+1] = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+               int depth = MAX_LEVEL;  /* how deep to print */
+               char *pathp;            /* path */
+               char *prop;                     /* property */
+               void *nodep;            /* property node pointer */
+               int  nodeoffset;        /* node offset from libfdt */
+               int  nextoffset;        /* next node offset from libfdt */
+               uint32_t tag;           /* tag */
+               int  len;                       /* length of the property */
+               int  level = 0;         /* keep track of nesting level */
+
+               /*
+                * list is an alias for print, but limited to 1 level
+                */
+               if (op == 'l') {
+                       depth = 1;
+               }
+
+               /*
+                * Get the starting path.  The root node is an oddball,
+                * the offset is zero and has no name.
+                */
+               pathp = argv[2];
+               if (argc > 3)
+                       prop = argv[3];
+               else
+                       prop = NULL;
+
+               if (strcmp(pathp, "/") == 0) {
+                       nodeoffset = 0;
+                       printf("/");
+               } else {
+                       nodeoffset = fdt_path_offset (fdt, pathp);
+                       if (nodeoffset < 0) {
+                               /*
+                                * Not found or something else bad happened.
+                                */
+                               printf ("libfdt %s\n", fdt_strerror(nodeoffset));
+                               return 1;
+                       }
+               }
+               /*
+                * The user passed in a property as well as node path.  Print only
+                * the given property and then return.
+                */
+               if (prop) {
+                       nodep = fdt_getprop (fdt, nodeoffset, prop, &len);
+                       if (len == 0) {
+                               printf("%s %s\n", pathp, prop); /* no property value */
+                               return 0;
+                       } else if (len > 0) {
+                               printf("%s=", prop);
+                               print_data (nodep, len);
+                               printf("\n");
+                               return 0;
+                       } else {
+                               printf ("libfdt %s\n", fdt_strerror(len));
+                               return 1;
+                       }
+               }
+
+               /*
+                * The user passed in a node path and no property, print the node
+                * and all subnodes.
+                */
+               offstack[0] = nodeoffset;
+
+               while(level >= 0) {
+                       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset, &pathp);
+                       switch(tag) {
+                       case FDT_BEGIN_NODE:
+                               if(level <= depth)
+                                       printf("%s%s {\n", &tabs[MAX_LEVEL - level], pathp);
+                               level++;
+                               offstack[level] = nodeoffset;
+                               if (level >= MAX_LEVEL) {
+                                       printf("Aaaiii <splat> nested too deep.\n");
+                                       return 1;
+                               }
+                               break;
+                       case FDT_END_NODE:
+                               level--;
+                               if(level <= depth)
+                                       printf("%s};\n", &tabs[MAX_LEVEL - level]);
+                               if (level == 0) {
+                                       level = -1;             /* exit the loop */
+                               }
+                               break;
+                       case FDT_PROP:
+                               nodep = fdt_getprop (fdt, offstack[level], pathp, &len);
+                               if (len < 0) {
+                                       printf ("libfdt %s\n", fdt_strerror(len));
+                                       return 1;
+                               } else if (len == 0) {
+                                       /* the property has no value */
+                                       if(level <= depth)
+                                               printf("%s%s;\n", &tabs[MAX_LEVEL - level], pathp);
+                               } else {
+                                       if(level <= depth) {
+                                               printf("%s%s=", &tabs[MAX_LEVEL - level], pathp);
+                                               print_data (nodep, len);
+                                               printf(";\n");
+                                       }
+                               }
+                               break;
+                       case FDT_NOP:
+                               break;
+                       case FDT_END:
+                               return 1;
+                       default:
+                               if(level <= depth)
+                                       printf("Unknown tag 0x%08X\n", tag);
+                               return 1;
+                       }
+                       nodeoffset = nextoffset;
+               }
+
+       /********************************************************************
+        * Remove a property/node
+        ********************************************************************/
+       } else if (op == 'r') {
+               int  nodeoffset;        /* node offset from libfdt */
+               int  err;
+
+               /*
+                * Get the path.  The root node is an oddball, the offset
+                * is zero and has no name.
+                */
+               if (strcmp(argv[2], "/") == 0) {
+                       nodeoffset = 0;
+               } else {
+                       nodeoffset = fdt_path_offset (fdt, argv[2]);
+                       if (nodeoffset < 0) {
+                               /*
+                                * Not found or something else bad happened.
+                                */
+                               printf ("libfdt %s\n", fdt_strerror(nodeoffset));
+                               return 1;
+                       }
+               }
+               /*
+                * Do the delete.  A fourth parameter means delete a property,
+                * otherwise delete the node.
+                */
+               if (argc > 3) {
+                       err = fdt_delprop(fdt, nodeoffset, argv[3]);
+                       if (err < 0) {
+                               printf("fdt_delprop libfdt: %s\n", fdt_strerror(err));
+                               return err;
+                       }
+               } else {
+                       err = fdt_del_node(fdt, nodeoffset);
+                       if (err < 0) {
+                               printf("fdt_del_node libfdt: %s\n", fdt_strerror(err));
+                               return err;
+                       }
+               }
+
+       /********************************************************************
+        * Create a chosen node
+        ********************************************************************/
+       } else if (op == 'c') {
+               fdt_chosen(fdt, 0, 0, 1);
+
+       /********************************************************************
+        * Create a u-boot-env node
+        ********************************************************************/
+       } else if (op == 'e') {
+               fdt_env(fdt);
+
+       /********************************************************************
+        * Create a bd_t node
+        ********************************************************************/
+       } else if (op == 'b') {
+               fdt_bd_t(fdt);
+
+       /********************************************************************
+        * Unrecognized command
+        ********************************************************************/
+       } else {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       return 0;
+}
+
+/********************************************************************/
+
+static int fdt_valid(void)
+{
+       int  err;
+
+       if (fdt == NULL) {
+               printf ("The address of the fdt is invalid (NULL).\n");
+               return 0;
+       }
+
+       err = fdt_check_header(fdt);
+       if (err == 0)
+               return 1;       /* valid */
+
+       if (err < 0) {
+               printf("libfdt: %s", fdt_strerror(err));
+               /*
+                * Be more informative on bad version.
+                */
+               if (err == -FDT_ERR_BADVERSION) {
+                       if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) {
+                               printf (" - too old, fdt $d < %d",
+                                       fdt_version(fdt), FDT_FIRST_SUPPORTED_VERSION);
+                               fdt = NULL;
+                       }
+                       if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) {
+                               printf (" - too new, fdt $d > %d",
+                                       fdt_version(fdt), FDT_LAST_SUPPORTED_VERSION);
+                               fdt = NULL;
+                       }
+                       return 0;
+               }
+               printf("\n");
+               return 0;
+       }
+       return 1;
+}
+
+/********************************************************************/
+
+/*
+ * OF flat tree handling
+ * Written by: Pantelis Antoniou <pantelis.antoniou@gmail.com>
+ * Updated by: Matthew McClintock <msm@freescale.com>
+ * Converted to libfdt by: Gerald Van Baren <vanbaren@cideas.com>
+ */
+
+static int is_printable_string(const void *data, int len)
+{
+       const char *s = data;
+
+       /* zero length is not */
+       if (len == 0)
+               return 0;
+
+       /* must terminate with zero */
+       if (s[len - 1] != '\0')
+               return 0;
+
+       /* printable or a null byte (concatenated strings) */
+       while (((*s == '\0') || isprint(*s)) && (len > 0)) {
+               /*
+                * If we see a null, there are three possibilities:
+                * 1) If len == 1, it is the end of the string, printable
+                * 2) Next character also a null, not printable.
+                * 3) Next character not a null, continue to check.
+                */
+               if (s[0] == '\0') {
+                       if (len == 1)
+                               return 1;
+                       if (s[1] == '\0')
+                               return 0;
+               }
+               s++;
+               len--;
+       }
+
+       /* Not the null termination, or not done yet: not printable */
+       if (*s != '\0' || (len != 0))
+               return 0;
+
+       return 1;
+}
+
+static void print_data(const void *data, int len)
+{
+       int j;
+       const u8 *s;
+
+       /* no data, don't print */
+       if (len == 0)
+               return;
+
+       /*
+        * It is a string, but it may have multiple strings (embedded '\0's).
+        */
+       if (is_printable_string(data, len)) {
+               puts("\"");
+               j = 0;
+               while (j < len) {
+                       if (j > 0)
+                               puts("\", \"");
+                       puts(data);
+                       j    += strlen(data) + 1;
+                       data += strlen(data) + 1;
+               }
+               puts("\"");
+               return;
+       }
+
+       switch (len) {
+       case 1:  /* byte */
+               printf("<%02x>", (*(u8 *) data) & 0xff);
+               break;
+       case 2:  /* half-word */
+               printf("<%04x>", be16_to_cpu(*(u16 *) data) & 0xffff);
+               break;
+       case 4:  /* word */
+               printf("<%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+               break;
+       case 8:  /* double-word */
+#if __WORDSIZE == 64
+               printf("<%016llx>", be64_to_cpu(*(uint64_t *) data));
+#else
+               printf("<%08x ", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+               data += 4;
+               printf("%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+#endif
+               break;
+       default:                /* anything else... hexdump */
+               printf("[");
+               for (j = 0, s = data; j < len; j++)
+                       printf("%02x%s", s[j], j < len - 1 ? " " : "");
+               printf("]");
+
+               break;
+       }
+}
+
+/********************************************************************/
+
+U_BOOT_CMD(
+       fdt,    5,      0,      do_fdt,
+       "fdt     - flattened device tree utility commands\n",
+           "addr   <addr> [<length>]        - Set the fdt location to <addr>\n"
+       "fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr>\n"
+       "fdt print  <path> [<prop>]          - Recursive print starting at <path>\n"
+       "fdt list   <path> [<prop>]          - Print one level starting at <path>\n"
+       "fdt set    <path> <prop> [<val>]    - Set <property> [to <val>]\n"
+       "fdt mknode <path> <node>            - Create a new node after <path>\n"
+       "fdt rm     <path> [<prop>]          - Delete the node or <property>\n"
+       "fdt chosen - Add/update the \"/chosen\" branch in the tree\n"
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
+       "fdt env    - Add/replace the \"/u-boot-env\" branch in the tree\n"
+#endif
+#ifdef CONFIG_OF_HAS_BD_T
+       "fdt bd_t   - Add/replace the \"/bd_t\" branch in the tree\n"
+#endif
+       "Hints:\n"
+       " * Set a larger length with the fdt addr command to add to the blob.\n"
+       " * If the property you are setting/printing has a '#' character,\n"
+       "     you MUST escape it with a \\ character or quote it with \" or\n"
+       "     it will be ignored as a comment.\n"
+       " * If the value has spaces in it, you MUST escape the spaces with\n"
+       "     \\ characters or quote it with \"\"\n"
+       "Examples: fdt print /               # print the whole tree\n"
+       "          fdt print /cpus \"#address-cells\"\n"
+       "          fdt set   /cpus \"#address-cells\" \"[00 00 00 01]\"\n"
+);
+
+#endif /* CONFIG_OF_LIBFDT */
index 45cfde2eb840aeb0585dc2abdf07ae03ea5c94de..755810d590419c4c5de528a1947a0111ca11d117 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 */
+);
+#endif /* CONFIG_I2C_CMD_TREE */
 U_BOOT_CMD(
        imd,    4,      1,      do_i2c_md,              \
        "imd     - i2c memory display\n",                               \
@@ -1003,25 +1025,4 @@ U_BOOT_CMD(
 );
 #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..ce99a41ab7db6eaaa76c5ac5ae700481fceabac1 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
 
 
@@ -417,7 +423,7 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                }
                part = simple_strtoul(++ep, NULL, 16);
        }
-       if (get_partition_info (ide_dev_desc, part, &info)) {
+       if (get_partition_info (&ide_dev_desc[dev], part, &info)) {
                SHOW_BOOT_PROGRESS (-1);
                return 1;
        }
@@ -507,9 +513,11 @@ void ide_init (void)
 #endif
        unsigned char c;
        int i, bus;
+#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
+       unsigned int ata_reset_time;
+#endif
 #ifdef CONFIG_AMIGAONEG3SE
        unsigned int max_bus_scan;
-       unsigned int ata_reset_time;
        char *s;
 #endif
 #ifdef CONFIG_IDE_8xx_PCCARD
@@ -611,10 +619,9 @@ void ide_init (void)
                udelay (100000);                /* 100 ms */
                ide_outb (dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
                udelay (100000);                /* 100 ms */
-#ifdef CONFIG_AMIGAONEG3SE
-               ata_reset_time = ATA_RESET_TIME;
-               s = getenv("ide_reset_timeout");
-               if (s) ata_reset_time = 2*simple_strtol(s, NULL, 10);
+#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
+               if ((s = getenv("ide_reset_timeout")) != NULL)
+                       ata_reset_time = simple_strtol(s, NULL, 10);
 #endif
                i = 0;
                do {
@@ -622,7 +629,7 @@ void ide_init (void)
 
                        c = ide_inb (dev, ATA_STATUS);
                        i++;
-#ifdef CONFIG_AMIGAONEG3SE
+#if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
                        if (i > (ata_reset_time * 100)) {
 #else
                        if (i > (ATA_RESET_TIME * 100)) {
@@ -697,7 +704,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 +1234,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;
@@ -1337,7 +1344,7 @@ ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
 
                ++n;
                ++blknr;
-               buffer += ATA_SECTORWORDS;
+               buffer += ATA_BLOCKSIZE;
        }
 IDE_READ_E:
        ide_led (DEVICE_LED(device), 0);        /* LED off      */
@@ -1347,7 +1354,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;
@@ -1421,7 +1428,7 @@ ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
                c = ide_inb (device, ATA_STATUS);       /* clear IRQ */
                ++n;
                ++blknr;
-               buffer += ATA_SECTORWORDS;
+               buffer += ATA_BLOCKSIZE;
        }
 WR_OUT:
        ide_led (DEVICE_LED(device), 0);        /* LED off      */
@@ -2009,7 +2016,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 */
@@ -2045,7 +2052,7 @@ ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)
                n+=cnt;
                blkcnt-=cnt;
                blknr+=cnt;
-               buffer+=cnt*(ATAPI_READ_BLOCK_SIZE/4); /* ulong blocksize in ulong */
+               buffer+=(cnt*ATAPI_READ_BLOCK_SIZE);
        } while (blkcnt > 0);
        return (n);
 }
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;
diff --git a/common/cmd_mfsl.c b/common/cmd_mfsl.c
new file mode 100644 (file)
index 0000000..ffa2666
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * Microblaze FSL support
+ */
+
+#include <common.h>
+#include <config.h>
+#include <command.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_MFSL)
+#include <asm/asm.h>
+
+int do_frd (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int fslnum;
+       unsigned int num;
+       unsigned int blocking;
+
+       if (argc < 2) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       blocking = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
+               puts ("Bad number of FSL\n");
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       switch (fslnum) {
+#if (XILINX_FSL_NUMBER > 0)
+       case 0:
+               switch (blocking) {
+               case 0: NGET (num, 0);
+                       break;
+               case 1: NCGET (num, 0);
+                       break;
+               case 2: GET (num, 0);
+                       break;
+               case 3: CGET (num, 0);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 1)
+       case 1:
+               switch (blocking) {
+               case 0: NGET (num, 1);
+                       break;
+               case 1: NCGET (num, 1);
+                       break;
+               case 2: GET (num, 1);
+                       break;
+               case 3: CGET (num, 1);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 2)
+       case 2:
+               switch (blocking) {
+               case 0: NGET (num, 2);
+                       break;
+               case 1: NCGET (num, 2);
+                       break;
+               case 2: GET (num, 2);
+                       break;
+               case 3: CGET (num, 2);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 3)
+       case 3:
+               switch (blocking) {
+               case 0: NGET (num, 3);
+                       break;
+               case 1: NCGET (num, 3);
+                       break;
+               case 2: GET (num, 3);
+                       break;
+               case 3: CGET (num, 3);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 4)
+       case 4:
+               switch (blocking) {
+               case 0: NGET (num, 4);
+                       break;
+               case 1: NCGET (num, 4);
+                       break;
+               case 2: GET (num, 4);
+                       break;
+               case 3: CGET (num, 4);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 5)
+       case 5:
+               switch (blocking) {
+               case 0: NGET (num, 5);
+                       break;
+               case 1: NCGET (num, 5);
+                       break;
+               case 2: GET (num, 5);
+                       break;
+               case 3: CGET (num, 5);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 6)
+       case 6:
+               switch (blocking) {
+               case 0: NGET (num, 6);
+                       break;
+               case 1: NCGET (num, 6);
+                       break;
+               case 2: GET (num, 6);
+                       break;
+               case 3: CGET (num, 6);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 7)
+       case 7:
+               switch (blocking) {
+               case 0: NGET (num, 7);
+                       break;
+               case 1: NCGET (num, 7);
+                       break;
+               case 2: GET (num, 7);
+                       break;
+               case 3: CGET (num, 7);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+       default:
+               return 1;
+       }
+
+       printf ("%01x: 0x%08lx - %s %s read\n", fslnum, num,
+               blocking < 2  ? "non blocking" : "blocking",
+               ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
+       return 0;
+}
+
+int do_fwr (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int fslnum;
+       unsigned int num;
+       unsigned int blocking;
+
+       if (argc < 3) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       num = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       blocking = (unsigned int)simple_strtoul (argv[3], NULL, 16);
+       if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
+               printf ("Bad number of FSL\nUsage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       switch (fslnum) {
+#if (XILINX_FSL_NUMBER > 0)
+       case 0:
+               switch (blocking) {
+               case 0: NPUT (num, 0);
+                       break;
+               case 1: NCPUT (num, 0);
+                       break;
+               case 2: PUT (num, 0);
+                       break;
+               case 3: CPUT (num, 0);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 1)
+       case 1:
+               switch (blocking) {
+               case 0: NPUT (num, 1);
+                       break;
+               case 1: NCPUT (num, 1);
+                       break;
+               case 2: PUT (num, 1);
+                       break;
+               case 3: CPUT (num, 1);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 2)
+       case 2:
+               switch (blocking) {
+               case 0: NPUT (num, 2);
+                       break;
+               case 1: NCPUT (num, 2);
+                       break;
+               case 2: PUT (num, 2);
+                       break;
+               case 3: CPUT (num, 2);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 3)
+       case 3:
+               switch (blocking) {
+               case 0: NPUT (num, 3);
+                       break;
+               case 1: NCPUT (num, 3);
+                       break;
+               case 2: PUT (num, 3);
+                       break;
+               case 3: CPUT (num, 3);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 4)
+       case 4:
+               switch (blocking) {
+               case 0: NPUT (num, 4);
+                       break;
+               case 1: NCPUT (num, 4);
+                       break;
+               case 2: PUT (num, 4);
+                       break;
+               case 3: CPUT (num, 4);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 5)
+       case 5:
+               switch (blocking) {
+               case 0: NPUT (num, 5);
+                       break;
+               case 1: NCPUT (num, 5);
+                       break;
+               case 2: PUT (num, 5);
+                       break;
+               case 3: CPUT (num, 5);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 6)
+       case 6:
+               switch (blocking) {
+               case 0: NPUT (num, 6);
+                       break;
+               case 1: NCPUT (num, 6);
+                       break;
+               case 2: PUT (num, 6);
+                       break;
+               case 3: CPUT (num, 6);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+#if (XILINX_FSL_NUMBER > 7)
+       case 7:
+               switch (blocking) {
+               case 0: NPUT (num, 7);
+                       break;
+               case 1: NCPUT (num, 7);
+                       break;
+               case 2: PUT (num, 7);
+                       break;
+               case 3: CPUT (num, 7);
+                       break;
+               default:
+                       return 2;
+               }
+               break;
+#endif
+       default:
+               return 1;
+       }
+
+       printf ("%01x: 0x%08lx - %s %s write\n", fslnum, num,
+               blocking < 2  ? "non blocking" : "blocking",
+               ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
+       return 0;
+
+}
+
+int do_rspr (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int reg = 0;
+       unsigned int val = 0;
+
+       reg = (unsigned int)simple_strtoul (argv[1], NULL, 16);
+       val = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+       if (argc < 1) {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+       switch (reg) {
+       case 0x1:
+               if (argc > 2) {
+                       MTS (val, rmsr);
+                       NOP;
+                       MFS (val, rmsr);
+
+               } else {
+                       MFS (val, rmsr);
+               }
+               puts ("MSR");
+               break;
+       case 0x3:
+               MFS (val, rear);
+               puts ("EAR");
+               break;
+       case 0x5:
+               MFS (val, resr);
+               puts ("ESR");
+               break;
+       default:
+               return 1;
+       }
+       printf (": 0x%08lx\n", val);
+       return 0;
+}
+
+/***************************************************/
+
+U_BOOT_CMD (frd, 3, 1, do_frd,
+               "frd     - read data from FSL\n",
+               "- [fslnum [0|1|2|3]]\n"
+               " 0 - non blocking data read\n"
+               " 1 - non blocking control read\n"
+               " 2 - blocking data read\n"
+               " 3 - blocking control read\n");
+
+
+U_BOOT_CMD (fwr, 4, 1, do_fwr,
+               "fwr     - write data to FSL\n",
+               "- [fslnum [0|1|2|3]]\n"
+               " 0 - non blocking data write\n"
+               " 1 - non blocking control write\n"
+               " 2 - blocking data write\n"
+               " 3 - blocking control write\n");
+
+U_BOOT_CMD (rspr, 3, 1, do_rspr,
+               "rmsr    - read/write special purpose register\n",
+               "- reg_num [write value] read/write special purpose register\n"
+               " 0 - MSR - Machine status register\n"
+               " 1 - EAR - Exception address register\n"
+               " 2 - ESR - Exception status register\n");
+
+#endif                         /* CONFIG_MICROBLAZE & CFG_CMD_MFSL */
index 9834ba65b7daa687d60128544a95dbb4136a1c3d..977ec5bae96153c390b37867546e6d5cb7b1c796 100644 (file)
@@ -391,7 +391,10 @@ int _do_setenv (int flag, int argc, char *argv[])
 void setenv (char *varname, char *varvalue)
 {
        char *argv[4] = { "setenv", varname, varvalue, NULL };
-       _do_setenv (0, 3, argv);
+       if (varvalue == NULL)
+               _do_setenv (0, 2, argv);
+       else
+               _do_setenv (0, 3, argv);
 }
 
 int do_setenv ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
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..00b84fad19acf315d260871bf2efac99290fcf16 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;
 }
 
 
@@ -248,7 +248,7 @@ int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                }
                part = simple_strtoul(++ep, NULL, 16);
        }
-       if (get_partition_info (scsi_dev_desc, part, &info)) {
+       if (get_partition_info (&scsi_dev_desc[dev], part, &info)) {
                printf("error reading partinfo\n");
                return 1;
        }
@@ -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 e9f23bec1820f178e3f4a67e3241182a0c65dc9d..d8a0cb6c7e8a1d43e43ad066514e23a72f88327e 100644 (file)
@@ -494,13 +494,7 @@ int console_init_r (void)
        /* suppress all output if splash screen is enabled and we have
           a bmp to display                                            */
        if (getenv("splashimage") != NULL)
-               outputdev = search_device (DEV_FLAGS_OUTPUT, "nulldev");
-#endif
-
-#ifdef CONFIG_SILENT_CONSOLE
-       /* Suppress all output if "silent" mode requested               */
-       if (gd->flags & GD_FLG_SILENT)
-               outputdev = search_device (DEV_FLAGS_OUTPUT, "nulldev");
+               gd->flags |= GD_FLG_SILENT;
 #endif
 
        /* Scan devices looking for input and output devices */
diff --git a/common/fdt_support.c b/common/fdt_support.c
new file mode 100644 (file)
index 0000000..69099c4
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * (C) Copyright 2007
+ * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <linux/ctype.h>
+#include <linux/types.h>
+
+#ifdef CONFIG_OF_LIBFDT
+
+#include <asm/global_data.h>
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+
+/*
+ * Global data (for the gd->bd)
+ */
+DECLARE_GLOBAL_DATA_PTR;
+
+
+/********************************************************************/
+
+int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
+{
+       bd_t *bd = gd->bd;
+       int   nodeoffset;
+       int   err;
+       u32   tmp;                      /* used to set 32 bit integer properties */
+       char  *str;                     /* used to set string properties */
+       ulong clock;
+
+       err = fdt_check_header(fdt);
+       if (err < 0) {
+               printf("libfdt: %s\n", fdt_strerror(err));
+               return err;
+       }
+
+       if (initrd_start && initrd_end) {
+               struct fdt_reserve_entry re;
+               int  used;
+               int  total;
+               int  j;
+
+               err = fdt_num_reservemap(fdt, &used, &total);
+               if (err < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(err));
+                       return err;
+               }
+               if (used >= total) {
+                       printf("fdt_chosen: no room in the reserved map (%d of %d)\n",
+                               used, total);
+                       return -1;
+               }
+               /*
+                * Look for an existing entry and update it.  If we don't find
+                * the entry, we will j be the next available slot.
+                */
+               for (j = 0; j < used; j++) {
+                       err = fdt_get_reservemap(fdt, j, &re);
+                       if (re.address == initrd_start) {
+                               break;
+                       }
+               }
+               err = fdt_replace_reservemap_entry(fdt, j,
+                       initrd_start, initrd_end - initrd_start + 1);
+               if (err < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(err));
+                       return err;
+               }
+       }
+
+       /*
+        * Find the "chosen" node.
+        */
+       nodeoffset = fdt_path_offset (fdt, "/chosen");
+
+       /*
+        * If we have a "chosen" node already the "force the writing"
+        * is not set, our job is done.
+        */
+       if ((nodeoffset >= 0) && !force)
+               return 0;
+
+       /*
+        * No "chosen" node in the blob: create it.
+        */
+       if (nodeoffset < 0) {
+               /*
+                * Create a new node "/chosen" (offset 0 is root level)
+                */
+               nodeoffset = fdt_add_subnode(fdt, 0, "chosen");
+               if (nodeoffset < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(nodeoffset));
+                       return nodeoffset;
+               }
+       }
+
+       /*
+        * Update pre-existing properties, create them if non-existant.
+        */
+       str = getenv("bootargs");
+       if (str != NULL) {
+               err = fdt_setprop(fdt, nodeoffset, "bootargs", str, strlen(str)+1);
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+       }
+       if (initrd_start && initrd_end) {
+               tmp = __cpu_to_be32(initrd_start);
+               err = fdt_setprop(fdt, nodeoffset, "linux,initrd-start", &tmp, sizeof(tmp));
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+               tmp = __cpu_to_be32(initrd_end);
+               err = fdt_setprop(fdt, nodeoffset, "linux,initrd-end", &tmp, sizeof(tmp));
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+       }
+#ifdef OF_STDOUT_PATH
+       err = fdt_setprop(fdt, nodeoffset, "linux,stdout-path", OF_STDOUT_PATH, strlen(OF_STDOUT_PATH)+1);
+       if (err < 0)
+               printf("libfdt: %s\n", fdt_strerror(err));
+#endif
+
+       nodeoffset = fdt_path_offset (fdt, "/cpus");
+       if (nodeoffset >= 0) {
+               clock = cpu_to_be32(bd->bi_intfreq);
+               err = fdt_setprop(fdt, nodeoffset, "clock-frequency", &clock, 4);
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+       }
+#ifdef OF_TBCLK
+       nodeoffset = fdt_path_offset (fdt, "/cpus/" OF_CPU "/timebase-frequency");
+       if (nodeoffset >= 0) {
+               clock = cpu_to_be32(OF_TBCLK);
+               err = fdt_setprop(fdt, nodeoffset, "clock-frequency", &clock, 4);
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+       }
+#endif
+       return err;
+}
+
+/********************************************************************/
+
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
+
+/* Function that returns a character from the environment */
+extern uchar(*env_get_char) (int);
+
+
+int fdt_env(void *fdt)
+{
+       int   nodeoffset;
+       int   err;
+       int   k, nxt;
+       int i;
+       static char tmpenv[256];
+
+       err = fdt_check_header(fdt);
+       if (err < 0) {
+               printf("libfdt: %s\n", fdt_strerror(err));
+               return err;
+       }
+
+       /*
+        * See if we already have a "u-boot-env" node, delete it if so.
+        * Then create a new empty node.
+        */
+       nodeoffset = fdt_path_offset (fdt, "/u-boot-env");
+       if (nodeoffset >= 0) {
+               err = fdt_del_node(fdt, nodeoffset);
+               if (err < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(err));
+                       return err;
+               }
+       }
+       /*
+        * Create a new node "/u-boot-env" (offset 0 is root level)
+        */
+       nodeoffset = fdt_add_subnode(fdt, 0, "u-boot-env");
+       if (nodeoffset < 0) {
+               printf("libfdt: %s\n", fdt_strerror(nodeoffset));
+               return nodeoffset;
+       }
+
+       for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
+               char *s, *lval, *rval;
+
+               /*
+                * Find the end of the name=definition
+                */
+               for (nxt = i; env_get_char(nxt) != '\0'; ++nxt)
+                       ;
+               s = tmpenv;
+               for (k = i; k < nxt && s < &tmpenv[sizeof(tmpenv) - 1]; ++k)
+                       *s++ = env_get_char(k);
+               *s++ = '\0';
+               lval = tmpenv;
+               /*
+                * Find the first '=': it separates the name from the value
+                */
+               s = strchr(tmpenv, '=');
+               if (s != NULL) {
+                       *s++ = '\0';
+                       rval = s;
+               } else
+                       continue;
+               err = fdt_setprop(fdt, nodeoffset, lval, rval, strlen(rval)+1);
+               if (err < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(err));
+                       return err;
+               }
+       }
+       return 0;
+}
+#endif /* ifdef CONFIG_OF_HAS_UBOOT_ENV */
+
+/********************************************************************/
+
+#ifdef CONFIG_OF_HAS_BD_T
+
+#define BDM(x) {       .name = #x, .offset = offsetof(bd_t, bi_ ##x ) }
+
+static const struct {
+       const char *name;
+       int offset;
+} bd_map[] = {
+       BDM(memstart),
+       BDM(memsize),
+       BDM(flashstart),
+       BDM(flashsize),
+       BDM(flashoffset),
+       BDM(sramstart),
+       BDM(sramsize),
+#if defined(CONFIG_5xx) || defined(CONFIG_8xx) || defined(CONFIG_8260) \
+       || defined(CONFIG_E500)
+       BDM(immr_base),
+#endif
+#if defined(CONFIG_MPC5xxx)
+       BDM(mbar_base),
+#endif
+#if defined(CONFIG_MPC83XX)
+       BDM(immrbar),
+#endif
+#if defined(CONFIG_MPC8220)
+       BDM(mbar_base),
+       BDM(inpfreq),
+       BDM(pcifreq),
+       BDM(pevfreq),
+       BDM(flbfreq),
+       BDM(vcofreq),
+#endif
+       BDM(bootflags),
+       BDM(ip_addr),
+       BDM(intfreq),
+       BDM(busfreq),
+#ifdef CONFIG_CPM2
+       BDM(cpmfreq),
+       BDM(brgfreq),
+       BDM(sccfreq),
+       BDM(vco),
+#endif
+#if defined(CONFIG_MPC5xxx)
+       BDM(ipbfreq),
+       BDM(pcifreq),
+#endif
+       BDM(baudrate),
+};
+
+
+int fdt_bd_t(void *fdt)
+{
+       bd_t *bd = gd->bd;
+       int   nodeoffset;
+       int   err;
+       u32   tmp;                      /* used to set 32 bit integer properties */
+       int i;
+
+       err = fdt_check_header(fdt);
+       if (err < 0) {
+               printf("libfdt: %s\n", fdt_strerror(err));
+               return err;
+       }
+
+       /*
+        * See if we already have a "bd_t" node, delete it if so.
+        * Then create a new empty node.
+        */
+       nodeoffset = fdt_path_offset (fdt, "/bd_t");
+       if (nodeoffset >= 0) {
+               err = fdt_del_node(fdt, nodeoffset);
+               if (err < 0) {
+                       printf("libfdt: %s\n", fdt_strerror(err));
+                       return err;
+               }
+       }
+       /*
+        * Create a new node "/bd_t" (offset 0 is root level)
+        */
+       nodeoffset = fdt_add_subnode(fdt, 0, "bd_t");
+       if (nodeoffset < 0) {
+               printf("libfdt: %s\n", fdt_strerror(nodeoffset));
+               return nodeoffset;
+       }
+       /*
+        * Use the string/pointer structure to create the entries...
+        */
+       for (i = 0; i < sizeof(bd_map)/sizeof(bd_map[0]); i++) {
+               tmp = cpu_to_be32(getenv("bootargs"));
+               err = fdt_setprop(fdt, nodeoffset, bd_map[i].name, &tmp, sizeof(tmp));
+               if (err < 0)
+                       printf("libfdt: %s\n", fdt_strerror(err));
+       }
+       /*
+        * Add a couple of oddball entries...
+        */
+       err = fdt_setprop(fdt, nodeoffset, "enetaddr", &bd->bi_enetaddr, 6);
+       if (err < 0)
+               printf("libfdt: %s\n", fdt_strerror(err));
+       err = fdt_setprop(fdt, nodeoffset, "ethspeed", &bd->bi_ethspeed, 4);
+       if (err < 0)
+               printf("libfdt: %s\n", fdt_strerror(err));
+
+       return 0;
+}
+#endif /* ifdef CONFIG_OF_HAS_BD_T */
+
+#endif /* CONFIG_OF_LIBFDT */
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 8f196a4828258c812ef7028c2d5ea873d7acac08..09ee64b81318f4e970a725a4b13b75ba3ea818ea 100644 (file)
@@ -112,14 +112,6 @@ static __inline__ int abortboot(int bootdelay)
        u_int presskey_max = 0;
        u_int i;
 
-#ifdef CONFIG_SILENT_CONSOLE
-       if (gd->flags & GD_FLG_SILENT) {
-               /* Restore serial console */
-               console_assign (stdout, "serial");
-               console_assign (stderr, "serial");
-       }
-#endif
-
 #  ifdef CONFIG_AUTOBOOT_PROMPT
        printf (CONFIG_AUTOBOOT_PROMPT, bootdelay);
 #  endif
@@ -199,14 +191,8 @@ static __inline__ int abortboot(int bootdelay)
 #  endif
 
 #ifdef CONFIG_SILENT_CONSOLE
-       if (abort) {
-               /* permanently enable normal console output */
-               gd->flags &= ~(GD_FLG_SILENT);
-       } else if (gd->flags & GD_FLG_SILENT) {
-               /* Restore silent console */
-               console_assign (stdout, "nulldev");
-               console_assign (stderr, "nulldev");
-       }
+       if (abort)
+               gd->flags &= ~GD_FLG_SILENT;
 #endif
 
        return abort;
@@ -222,14 +208,6 @@ static __inline__ int abortboot(int bootdelay)
 {
        int abort = 0;
 
-#ifdef CONFIG_SILENT_CONSOLE
-       if (gd->flags & GD_FLG_SILENT) {
-               /* Restore serial console */
-               console_assign (stdout, "serial");
-               console_assign (stderr, "serial");
-       }
-#endif
-
 #ifdef CONFIG_MENUPROMPT
        printf(CONFIG_MENUPROMPT, bootdelay);
 #else
@@ -245,7 +223,7 @@ static __inline__ int abortboot(int bootdelay)
                if (tstc()) {   /* we got a key press   */
                        (void) getc();  /* consume input        */
                        puts ("\b\b\b 0");
-                       abort = 1;      /* don't auto boot      */
+                       abort = 1;      /* don't auto boot      */
                }
        }
 #endif
@@ -275,14 +253,8 @@ static __inline__ int abortboot(int bootdelay)
        putc ('\n');
 
 #ifdef CONFIG_SILENT_CONSOLE
-       if (abort) {
-               /* permanently enable normal console output */
-               gd->flags &= ~(GD_FLG_SILENT);
-       } else if (gd->flags & GD_FLG_SILENT) {
-               /* Restore silent console */
-               console_assign (stdout, "nulldev");
-               console_assign (stderr, "nulldev");
-       }
+       if (abort)
+               gd->flags &= ~GD_FLG_SILENT;
 #endif
 
        return abort;
index 605d4e34be0a681d8d3eb535e3d067188e1c6205..13e9f30e414b7925d637c8084a2be99e69961449 100644 (file)
@@ -41,7 +41,7 @@ struct serial_device *default_serial_console (void)
    || defined(CONFIG_8xx_CONS_SCC3) || defined(CONFIG_8xx_CONS_SCC4)
        return &serial_scc_device;
 #elif defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_440) \
-   || defined(CONFIG_405EP) || defined(CONFIG_MPC5xxx)
+   || defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_MPC5xxx)
 #if defined(CONFIG_CONS_INDEX) && defined(CFG_NS16550_SERIAL)
 #if (CONFIG_CONS_INDEX==1)
        return &eserial1_device;
@@ -91,7 +91,7 @@ void serial_initialize (void)
 #endif
 
 #if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_440) \
- || defined(CONFIG_405EP) || defined(CONFIG_MPC5xxx)
+ || defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_MPC5xxx)
        serial_register(&serial0_device);
        serial_register(&serial1_device);
 #endif
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 6e280bc83487dc8b062be7b602de7b05839dc7bd..582df329a47b4e85bbbd2ae909c01d11cf71223d 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -70,7 +70,7 @@ endif
 endif
 
 ifeq ($(ARCH),blackfin)
-PLATFORM_CPPFLAGS+= -D__BLACKFIN__ -mno-underscore
+PLATFORM_CPPFLAGS+= -D__BLACKFIN__
 endif
 
 ifdef  ARCH
index f4e5fc504b3479f214944e0de6a07b697d5fc191..9c8998b604e1404469574f420bc514ecffdf0555 100644 (file)
 #include <74xx_7xx.h>
 #include <asm/cache.h>
 
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
 #ifdef CONFIG_AMIGAONEG3SE
 #include "../board/MAI/AmigaOneG3SE/via686.h"
 #include "../board/MAI/AmigaOneG3SE/memio.h"
@@ -101,6 +105,10 @@ get_cpu_type(void)
                type = CPU_7457;
                break;
 
+       case 0x8003:
+               type = CPU_7447A;
+               break;
+
        case 0x8004:
                type = CPU_7448;
                break;
@@ -156,6 +164,10 @@ int checkcpu (void)
                str = "MPC7410";
                break;
 
+       case CPU_7447A:
+               str = "MPC7447A";
+               break;
+
        case CPU_7448:
                str = "MPC7448";
                break;
@@ -264,20 +276,19 @@ do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 /*
  * For the 7400 the TB clock runs at 1/4 the cpu bus speed.
  */
-#ifdef CONFIG_AMIGAONEG3SE
+#if defined(CONFIG_AMIGAONEG3SE) || defined(CFG_CONFIG_BUS_CLK)
 unsigned long get_tbclk(void)
 {
        return (gd->bus_clk / 4);
 }
-#else  /* ! CONFIG_AMIGAONEG3SE */
+#else  /* ! CONFIG_AMIGAONEG3SE and !CFG_CONFIG_BUS_CLK*/
 
 unsigned long get_tbclk (void)
 {
        return CFG_BUS_HZ / 4;
 }
-#endif /* CONFIG_AMIGAONEG3SE */
+#endif /* CONFIG_AMIGAONEG3SE or CFG_CONFIG_BUS_CLK*/
 /* ------------------------------------------------------------------------- */
-
 #if defined(CONFIG_WATCHDOG)
 #if !defined(CONFIG_PCIPPC2) && !defined(CONFIG_BAB7xx)
 void
@@ -289,3 +300,30 @@ watchdog_reset(void)
 #endif /* CONFIG_WATCHDOG */
 
 /* ------------------------------------------------------------------------- */
+
+#ifdef CONFIG_OF_FLAT_TREE
+void
+ft_cpu_setup (void *blob, bd_t *bd)
+{
+       u32 *p;
+       ulong clock;
+       int len;
+
+       clock = bd->bi_busfreq;
+
+       p = ft_get_prop (blob, "/cpus/" OF_CPU "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32 (clock);
+
+#if defined(CONFIG_TSI108_ETH)
+       p = ft_get_prop (blob, "/" OF_TSI "/ethernet@6200/address", &len);
+               memcpy (p, bd->bi_enetaddr, 6);
+#endif
+
+#if defined(CONFIG_HAS_ETH1)
+       p = ft_get_prop (blob, "/" OF_TSI "/ethernet@6600/address", &len);
+               memcpy (p, bd->bi_enet1addr, 6);
+#endif
+}
+#endif
+/* ------------------------------------------------------------------------- */
index e02a4cc21cbc4484b92764c64601b8b2e0ed33a4..1dd1b2cd8426017b92aa47e2e08dd983f77f1ee7 100644 (file)
@@ -43,6 +43,7 @@ cpu_init_f (void)
        case CPU_7450:
        case CPU_7455:
        case CPU_7457:
+       case CPU_7447A:
        case CPU_7448:
                /* enable the timebase bit in HID0 */
                set_hid0(get_hid0() | 0x4000000);
index d1800ede05653803f57eeafb152d3a83bbfb428f..d8c40cea01ccb7f4675570515492dcd0574d85c2 100644 (file)
@@ -31,6 +31,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+extern unsigned long get_board_bus_clk (void);
+
 static const int hid1_multipliers_x_10[] = {
        25,     /* 0000 - 2.5x */
        75,     /* 0001 - 7.5x */
@@ -50,6 +52,42 @@ static const int hid1_multipliers_x_10[] = {
        0       /* 1111 - off */
 };
 
+/* PLL_CFG[0:4] table for cpu 7448/7447A/7455/7457 */
+static const int hid1_74xx_multipliers_x_10[] = {
+       115,    /* 00000 - 11.5x  */
+       170,    /* 00001 - 17x    */
+       75,     /* 00010 -  7.5x  */
+       150,    /* 00011 - 15x    */
+       70,     /* 00100 -  7x    */
+       180,    /* 00101 - 18x    */
+       10,     /* 00110 - bypass */
+       200,    /* 00111 - 20x    */
+       20,     /* 01000 -  2x    */
+       210,    /* 01001 - 21x    */
+       65,     /* 01010 -  6.5x  */
+       130,    /* 01011 - 13x    */
+       85,     /* 01100 -  8.5x  */
+       240,    /* 01101 - 24x    */
+       95,     /* 01110 -  9.5x  */
+       90,     /* 01111 -  9x    */
+       30,     /* 10000 -  3x    */
+       105,    /* 10001 - 10.5x  */
+       55,     /* 10010 -  5.5x  */
+       110,    /* 10011 - 11x    */
+       40,     /* 10100 -  4x    */
+       100,    /* 10101 - 10x    */
+       50,     /* 10110 -  5x    */
+       120,    /* 10111 - 12x    */
+       80,     /* 11000 -  8x    */
+       140,    /* 11001 - 14x    */
+       60,     /* 11010 -  6x    */
+       160,    /* 11011 - 16x    */
+       135,    /* 11100 - 13.5x  */
+       280,    /* 11101 - 28x    */
+       0,      /* 11110 - off    */
+       125     /* 11111 - 12.5x  */
+};
+
 static const int hid1_fx_multipliers_x_10[] = {
        00,     /* 0000 - off */
        00,     /* 0001 - off */
@@ -89,22 +127,30 @@ int get_clocks (void)
 {
        ulong clock = 0;
 
+#ifdef CFG_BUS_CLK
+       gd->bus_clk = CFG_BUS_CLK;      /* bus clock is a fixed frequency */
+#else
+       gd->bus_clk = get_board_bus_clk ();     /* bus clock is configurable */
+#endif
+
        /* calculate the clock frequency based upon the CPU type */
        switch (get_cpu_type()) {
+       case CPU_7447A:
        case CPU_7448:
        case CPU_7455:
        case CPU_7457:
                /*
-                * It is assumed that the PLL_EXT line is zero.
                 * Make sure division is done before multiplication to prevent 32-bit
                 * arithmetic overflows which will cause a negative number
                 */
-               clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF];
+               clock = (gd->bus_clk / 10) *
+                       hid1_74xx_multipliers_x_10[(get_hid1 () >> 12) & 0x1F];
                break;
 
        case CPU_750GX:
        case CPU_750FX:
-               clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
+               clock = gd->bus_clk *
+                       hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
                break;
 
        case CPU_7450:
@@ -121,7 +167,8 @@ int get_clocks (void)
                 * Make sure division is done before multiplication to prevent 32-bit
                 * arithmetic overflows which will cause a negative number
                 */
-               clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[get_hid1 () >> 28];
+               clock = (gd->bus_clk / 10) *
+                       hid1_multipliers_x_10[get_hid1 () >> 28];
                break;
 
        case CPU_UNKNOWN:
@@ -131,7 +178,6 @@ int get_clocks (void)
        }
 
        gd->cpu_clk = clock;
-       gd->bus_clk = CFG_BUS_CLK;
 
        return (0);
 }
index a5b6de7605525783eebe3608170f8cfa255cc2f8..60c1aa90b6b97d6f133b62a3e7820df47ff8af03 100644 (file)
@@ -73,7 +73,7 @@ int cleanup_before_linux (void)
        /* go to high speed */
        IO_SYSCON3 = (IO_SYSCON3 & ~CLKCTL) | CLKCTL_73;
 #endif
-#elif defined(CONFIG_NETARM) || defined(CONFIG_S3C4510B)
+#elif defined(CONFIG_NETARM) || defined(CONFIG_S3C4510B) || defined(CONFIG_LPC2292)
        disable_interrupts ();
        /* Nothing more needed */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
@@ -252,6 +252,7 @@ int dcache_status (void)
        void icache_enable (void)
        {
        }
+#elif defined(CONFIG_LPC2292) /* just to satisfy the compiler */
 #else
 #error No icache/dcache enable/disable functions defined for this CPU type
 #endif
index da62502d6144e21ae375a935e4216bf06c211cc7..8f32124d373f548c427f79ecfb01779f8726a02c 100644 (file)
 #define TIMER_LOAD_VAL 0xffff
 /* macro to read the 16 bit timer */
 #define READ_TIMER (IO_TC1D & 0xffff)
+
+#ifdef CONFIG_LPC2292
+#undef READ_TIMER
+#define READ_TIMER (0xFFFFFFFF - GET32(T0TC))
+#endif
+
 #else
 #define IRQEN  (*(volatile unsigned int *)(NETARM_GEN_MODULE_BASE + NETARM_GEN_INTR_ENABLE))
 #define TM2CTRL (*(volatile unsigned int *)(NETARM_GEN_MODULE_BASE + NETARM_GEN_TIMER2_CONTROL))
@@ -195,6 +201,13 @@ void do_irq (struct pt_regs *pt_regs)
        }
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
        /* No do_irq() for IntegratorAP/CM720T as yet */
+#elif defined(CONFIG_LPC2292)
+
+    void (*pfnct)(void);
+
+    pfnct = (void (*)(void))VICVectAddr;
+
+    (*pfnct)();
 #else
 #error do_irq() not defined for this CPU type
 #endif
@@ -293,6 +306,13 @@ int interrupt_init (void)
 
        /* Start timer */
        SET_REG( REG_TMOD, TM0_RUN);
+#elif defined(CONFIG_LPC2292)
+       PUT32(T0IR, 0);         /* disable all timer0 interrupts */
+       PUT32(T0TCR, 0);        /* disable timer0 */
+       PUT32(T0PR, CFG_SYS_CLK_FREQ / CFG_HZ);
+       PUT32(T0MCR, 0);
+       PUT32(T0TC, 0);
+       PUT32(T0TCR, 1);        /* enable timer0 */
 
 #else
 #error No interrupt_init() defined for this CPU type
@@ -309,7 +329,7 @@ int interrupt_init (void)
  */
 
 
-#if defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) || defined(CONFIG_NETARM) || defined(CONFIG_ARMADILLO)
+#if defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) || defined(CONFIG_NETARM) || defined(CONFIG_ARMADILLO) || defined(CONFIG_LPC2292)
 
 void reset_timer (void)
 {
@@ -337,7 +357,12 @@ void udelay (unsigned long usec)
        tmo += get_timer (0);
 
        while (get_timer_masked () < tmo)
+#ifdef CONFIG_LPC2292
+               /* GJ - not sure whether this is really needed or a misunderstanding */
+               __asm__ __volatile__(" nop");
+#else
                /*NOP*/;
+#endif
 }
 
 void reset_timer_masked (void)
index 054bab98112f194c62da23741887e0e1b9bfd502..15c54af08b789caa97fd2077aaadc325322c8c6f 100644 (file)
@@ -123,4 +123,80 @@ serial_puts (const char *s)
        }
 }
 
-#endif /* defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) */
+#elif defined(CONFIG_LPC2292)
+
+#include <asm/arch/hardware.h>
+
+void serial_setbrg (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       unsigned short divisor = 0;
+
+       switch (gd->baudrate) {
+       case   1200:    divisor = 3072; break;
+       case   9600:    divisor =  384; break;
+       case  19200:    divisor =  192; break;
+       case  38400:    divisor =   96; break;
+       case  57600:    divisor =   64; break;
+       case 115200:    divisor =   32; break;
+       default:        hang ();        break;
+       }
+
+       /* init serial UART0 */
+       PUT8(U0LCR, 0);
+       PUT8(U0IER, 0);
+       PUT8(U0LCR, 0x80);      /* DLAB=1 */
+       PUT8(U0DLL, (unsigned char)(divisor & 0x00FF));
+       PUT8(U0DLM, (unsigned char)(divisor >> 8));
+       PUT8(U0LCR, 0x03);      /* 8N1, DLAB=0  */
+       PUT8(U0FCR, 1);         /* Enable RX and TX FIFOs */
+}
+
+int serial_init (void)
+{
+       unsigned long pinsel0;
+
+       serial_setbrg ();
+
+       pinsel0 = GET32(PINSEL0);
+       pinsel0 &= ~(0x00000003);
+       pinsel0 |= 5;
+       PUT32(PINSEL0, pinsel0);
+
+       return (0);
+}
+
+void serial_putc (const char c)
+{
+       if (c == '\n')
+       {
+               while((GET8(U0LSR) & (1<<5)) == 0); /* Wait for empty U0THR */
+               PUT8(U0THR, '\r');
+       }
+
+       while((GET8(U0LSR) & (1<<5)) == 0); /* Wait for empty U0THR */
+       PUT8(U0THR, c);
+}
+
+int serial_getc (void)
+{
+       while((GET8(U0LSR) & 1) == 0);
+       return GET8(U0RBR);
+}
+
+void
+serial_puts (const char *s)
+{
+       while (*s) {
+               serial_putc (*s++);
+       }
+}
+
+/* Test if there is a byte to read */
+int serial_tstc (void)
+{
+       return (GET8(U0LSR) & 1);
+}
+
+#endif
index e66d109443a18f4260dd4c219e09083442d1cc9a..8423e4f68d2689167f3f6f17d30c378d17e34959 100644 (file)
@@ -43,7 +43,11 @@ _start: b    reset
        ldr     pc, _software_interrupt
        ldr     pc, _prefetch_abort
        ldr     pc, _data_abort
+#ifdef CONFIG_LPC2292
+       .word   0xB4405F76 /* 2's complement of the checksum of the vectors */
+#else
        ldr     pc, _not_used
+#endif
        ldr     pc, _irq
        ldr     pc, _fiq
 
@@ -123,6 +127,10 @@ reset:
        bl      cpu_init_crit
 #endif
 
+#ifdef CONFIG_LPC2292
+       bl      lowlevel_init
+#endif
+
 #ifndef CONFIG_SKIP_RELOCATE_UBOOT
 relocate:                              /* relocate U-Boot to RAM           */
        adr     r0, _start              /* r0 <- current position of code   */
@@ -131,6 +139,7 @@ relocate:                           /* relocate U-Boot to RAM           */
        beq     stack_setup
 
 #if TEXT_BASE
+#ifndef CONFIG_LPC2292 /* already done in lowlevel_init */
        ldr     r2, =0x0                /* Relocate the exception vectors   */
        cmp     r1, r2                  /* and associated data to address   */
        ldmneia r0!, {r3-r10}           /* 0x0. Do nothing if TEXT_BASE is  */
@@ -138,6 +147,7 @@ relocate:                           /* relocate U-Boot to RAM           */
        ldmneia r0, {r3-r9}
        stmneia r2, {r3-r9}
        adrne   r0, _start              /* restore r0                       */
+#endif /* !CONFIG_LPC2292 */
 #endif
 
        ldr     r2, _armboot_start
@@ -206,6 +216,14 @@ SYSCON3:   .word   0x80002200
 #define CLKCTL_49      0x4  /* 49.152 MHz */
 #define CLKCTL_73      0x6  /* 73.728 MHz */
 
+#elif defined(CONFIG_LPC2292)
+PLLCFG_ADR:    .word   PLLCFG
+PLLFEED_ADR:   .word   PLLFEED
+PLLCON_ADR:    .word   PLLCON
+PLLSTAT_ADR:   .word   PLLSTAT
+VPBDIV_ADR:    .word   VPBDIV
+MEMMAP_ADR:    .word   MEMMAP
+
 #endif
 
 cpu_init_crit:
@@ -306,6 +324,50 @@ cpu_init_crit:
 
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
        /* No specific initialisation for IntegratorAP/CM720T as yet */
+#elif defined(CONFIG_LPC2292)
+       /* Set-up PLL */
+       mov     r3, #0xAA
+       mov     r4, #0x55
+       /* First disconnect and disable the PLL */
+       ldr     r0, PLLCON_ADR
+       mov     r1, #0x00
+       str     r1, [r0]
+       ldr     r0, PLLFEED_ADR /* start feed sequence */
+       str     r3, [r0]
+       str     r4, [r0]        /* feed sequence done */
+       /* Set new M and P values */
+       ldr     r0, PLLCFG_ADR
+       mov     r1, #0x23       /* M=4 and P=2 */
+       str     r1, [r0]
+       ldr     r0, PLLFEED_ADR /* start feed sequence */
+       str     r3, [r0]
+       str     r4, [r0]        /* feed sequence done */
+       /* Then enable the PLL */
+       ldr     r0, PLLCON_ADR
+       mov     r1, #0x01       /* PLL enable bit */
+       str     r1, [r0]
+       ldr     r0, PLLFEED_ADR /* start feed sequence */
+       str     r3, [r0]
+       str     r4, [r0]        /* feed sequence done */
+       /* Wait for the lock */
+       ldr     r0, PLLSTAT_ADR
+       mov     r1, #0x400      /* lock bit */
+lock_loop:
+       ldr     r2, [r0]
+       and     r2, r1, r2
+       cmp     r2, #0
+       beq     lock_loop
+       /* And finally connect the PLL */
+       ldr     r0, PLLCON_ADR
+       mov     r1, #0x03       /* PLL enable bit and connect bit */
+       str     r1, [r0]
+       ldr     r0, PLLFEED_ADR /* start feed sequence */
+       str     r3, [r0]
+       str     r4, [r0]        /* feed sequence done */
+       /* Set-up VPBDIV register */
+       ldr     r0, VPBDIV_ADR
+       mov     r1, #0x01       /* VPB clock is same as process clock */
+       str     r1, [r0]
 #else
 #error No cpu_init_crit() defined for current CPU type
 #endif
@@ -321,6 +383,7 @@ cpu_init_crit:
        str     r1, [r0]
 #endif
 
+#ifndef CONFIG_LPC2292
        mov     ip, lr
        /*
         * before relocating, we have to setup RAM timing
@@ -329,6 +392,7 @@ cpu_init_crit:
         */
        bl      lowlevel_init
        mov     lr, ip
+#endif
 
        mov     pc, lr
 
@@ -537,6 +601,11 @@ reset_cpu:
  * on external peripherals such as watchdog timers, etc. */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
        /* No specific reset actions for IntegratorAP/CM720T as yet */
+#elif defined(CONFIG_LPC2292)
+       .align  5
+.globl reset_cpu
+reset_cpu:
+       mov     pc, r0
 #else
 #error No reset_cpu() defined for current CPU type
 #endif
index f62ec8bc9b2627d8cff712c2ffb51c01da7ec6a5..f69b1f3854665226d669a8b2a4aabcc98e73c78b 100644 (file)
@@ -30,7 +30,7 @@ LIB   := $(obj)lib$(CPU).a
 START  := start.o
 SOBJS  := entry.o
 COBJS  := cpu.o hsdramc.o exception.o cache.o
-COBJS  += interrupts.o device.o pm.o pio.o
+COBJS  += interrupts.o pio.o atmel_mci.o
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
 START  := $(addprefix $(obj),$(START))
index 2ed74d2508cd8f508f5bd839e3d193e4b7ce7e55..d2767121184acbe3b48127452e20695299065a40 100644 (file)
@@ -24,7 +24,7 @@ include $(TOPDIR)/config.mk
 
 LIB    := $(obj)lib$(SOC).a
 
-COBJS  := hebi.o devices.o
+COBJS  := gpio.o
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
 
diff --git a/cpu/at32ap/at32ap7000/devices.c b/cpu/at32ap/at32ap7000/devices.c
deleted file mode 100644 (file)
index 8b216e9..0000000
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright (C) 2006 Atmel Corporation
- *
- * 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/arch/memory-map.h>
-#include <asm/arch/platform.h>
-
-#include "../sm.h"
-
-#define ARRAY_SIZE(x)  (sizeof(x) / sizeof((x)[0]))
-
-const struct clock_domain chip_clock[] = {
-       [CLOCK_CPU] = {
-               .reg    = SM_PM_CPU_MASK,
-               .id     = CLOCK_CPU,
-               .bridge = NO_DEVICE,
-       },
-       [CLOCK_HSB] = {
-               .reg    = SM_PM_HSB_MASK,
-               .id     = CLOCK_HSB,
-               .bridge = NO_DEVICE,
-       },
-       [CLOCK_PBA] = {
-               .reg    = SM_PM_PBA_MASK,
-               .id     = CLOCK_PBA,
-               .bridge = DEVICE_PBA_BRIDGE,
-       },
-       [CLOCK_PBB] = {
-               .reg    = SM_PM_PBB_MASK,
-               .id     = CLOCK_PBB,
-               .bridge = DEVICE_PBB_BRIDGE,
-       },
-};
-
-static const struct resource hebi_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 0 },
-               },
-       }, {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 13 },
-               },
-       }, {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 14 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio   = { 27, DEVICE_PIOE, GPIO_FUNC_A, 0 },
-               },
-       },
-};
-static const struct resource pba_bridge_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 1 },
-               }
-       }, {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       /* HSB-HSB Bridge */
-                       .clock  = { CLOCK_HSB, 4 },
-               },
-       },
-};
-static const struct resource pbb_bridge_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 2 },
-               },
-       },
-};
-static const struct resource hramc_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 3 },
-               },
-       },
-};
-static const struct resource pioa_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 10 },
-               },
-       },
-};
-static const struct resource piob_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 11 },
-               },
-       },
-};
-static const struct resource pioc_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 12 },
-               },
-       },
-};
-static const struct resource piod_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 13 },
-               },
-       },
-};
-static const struct resource pioe_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 14 },
-               },
-       },
-};
-static const struct resource sm_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 0 },
-               },
-       },
-};
-static const struct resource intc_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock = { CLOCK_PBB, 1 },
-               },
-       },
-};
-static const struct resource hmatrix_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock = { CLOCK_PBB, 2 },
-               },
-       },
-};
-#if defined(CFG_HPDC)
-static const struct resource hpdc_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 16 },
-               },
-       },
-};
-#endif
-#if defined(CFG_MACB0)
-static const struct resource macb0_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 8 },
-               },
-       }, {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 6 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio   = { 19, DEVICE_PIOC, GPIO_FUNC_A, 0 },
-               },
-       },
-};
-#endif
-#if defined(CFG_MACB1)
-static const struct resource macb1_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 9 },
-               },
-       }, {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 7 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio   = { 12, DEVICE_PIOC, GPIO_FUNC_B, 19 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio   = { 14, DEVICE_PIOD, GPIO_FUNC_B, 2 },
-               },
-       },
-};
-#endif
-#if defined(CFG_LCDC)
-static const struct resource lcdc_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 7 },
-               },
-       },
-};
-#endif
-#if defined(CFG_USART0)
-static const struct resource usart0_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 3 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio = { 2, DEVICE_PIOA, GPIO_FUNC_B, 8 },
-               },
-       },
-};
-#endif
-#if defined(CFG_USART1)
-static const struct resource usart1_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 4 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio = { 2, DEVICE_PIOA, GPIO_FUNC_A, 17 },
-               },
-       },
-};
-#endif
-#if defined(CFG_USART2)
-static const struct resource usart2_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 5 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio = { 2, DEVICE_PIOB, GPIO_FUNC_B, 26 },
-               },
-       },
-};
-#endif
-#if defined(CFG_USART3)
-static const struct resource usart3_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBA, 6 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio = { 2, DEVICE_PIOB, GPIO_FUNC_B, 17 },
-               },
-       },
-};
-#endif
-#if defined(CFG_MMCI)
-static const struct resource mmci_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_PBB, 9 },
-               },
-       }, {
-               .type   = RESOURCE_GPIO,
-               .u      = {
-                       .gpio = { 6, DEVICE_PIOA, GPIO_FUNC_A, 10 },
-               },
-       },
-};
-#endif
-#if defined(CFG_DMAC)
-static const struct resource dmac_resource[] = {
-       {
-               .type   = RESOURCE_CLOCK,
-               .u      = {
-                       .clock  = { CLOCK_HSB, 10 },
-               },
-       },
-};
-#endif
-
-const struct device chip_device[] = {
-       [DEVICE_HEBI] = {
-               .regs           = (void *)HSMC_BASE,
-               .nr_resources   = ARRAY_SIZE(hebi_resource),
-               .resource       = hebi_resource,
-       },
-       [DEVICE_PBA_BRIDGE] = {
-               .nr_resources   = ARRAY_SIZE(pba_bridge_resource),
-               .resource       = pba_bridge_resource,
-       },
-       [DEVICE_PBB_BRIDGE] = {
-               .nr_resources   = ARRAY_SIZE(pbb_bridge_resource),
-               .resource       = pbb_bridge_resource,
-       },
-       [DEVICE_HRAMC] = {
-               .nr_resources   = ARRAY_SIZE(hramc_resource),
-               .resource       = hramc_resource,
-       },
-       [DEVICE_PIOA] = {
-               .regs           = (void *)PIOA_BASE,
-               .nr_resources   = ARRAY_SIZE(pioa_resource),
-               .resource       = pioa_resource,
-       },
-       [DEVICE_PIOB] = {
-               .regs           = (void *)PIOB_BASE,
-               .nr_resources   = ARRAY_SIZE(piob_resource),
-               .resource       = piob_resource,
-       },
-       [DEVICE_PIOC] = {
-               .regs           = (void *)PIOC_BASE,
-               .nr_resources   = ARRAY_SIZE(pioc_resource),
-               .resource       = pioc_resource,
-       },
-       [DEVICE_PIOD] = {
-               .regs           = (void *)PIOD_BASE,
-               .nr_resources   = ARRAY_SIZE(piod_resource),
-               .resource       = piod_resource,
-       },
-       [DEVICE_PIOE] = {
-               .regs           = (void *)PIOE_BASE,
-               .nr_resources   = ARRAY_SIZE(pioe_resource),
-               .resource       = pioe_resource,
-       },
-       [DEVICE_SM] = {
-               .regs           = (void *)SM_BASE,
-               .nr_resources   = ARRAY_SIZE(sm_resource),
-               .resource       = sm_resource,
-       },
-       [DEVICE_INTC] = {
-               .regs           = (void *)INTC_BASE,
-               .nr_resources   = ARRAY_SIZE(intc_resource),
-               .resource       = intc_resource,
-       },
-       [DEVICE_HMATRIX] = {
-               .regs           = (void *)HMATRIX_BASE,
-               .nr_resources   = ARRAY_SIZE(hmatrix_resource),
-               .resource       = hmatrix_resource,
-       },
-#if defined(CFG_HPDC)
-       [DEVICE_HPDC] = {
-               .nr_resources   = ARRAY_SIZE(hpdc_resource),
-               .resource       = hpdc_resource,
-       },
-#endif
-#if defined(CFG_MACB0)
-       [DEVICE_MACB0] = {
-               .regs           = (void *)MACB0_BASE,
-               .nr_resources   = ARRAY_SIZE(macb0_resource),
-               .resource       = macb0_resource,
-       },
-#endif
-#if defined(CFG_MACB1)
-       [DEVICE_MACB1] = {
-               .regs           = (void *)MACB1_BASE,
-               .nr_resources   = ARRAY_SIZE(macb1_resource),
-               .resource       = macb1_resource,
-       },
-#endif
-#if defined(CFG_LCDC)
-       [DEVICE_LCDC] = {
-               .nr_resources   = ARRAY_SIZE(lcdc_resource),
-               .resource       = lcdc_resource,
-       },
-#endif
-#if defined(CFG_USART0)
-       [DEVICE_USART0] = {
-               .regs           = (void *)USART0_BASE,
-               .nr_resources   = ARRAY_SIZE(usart0_resource),
-               .resource       = usart0_resource,
-       },
-#endif
-#if defined(CFG_USART1)
-       [DEVICE_USART1] = {
-               .regs           = (void *)USART1_BASE,
-               .nr_resources   = ARRAY_SIZE(usart1_resource),
-               .resource       = usart1_resource,
-       },
-#endif
-#if defined(CFG_USART2)
-       [DEVICE_USART2] = {
-               .regs           = (void *)USART2_BASE,
-               .nr_resources   = ARRAY_SIZE(usart2_resource),
-               .resource       = usart2_resource,
-       },
-#endif
-#if defined(CFG_USART3)
-       [DEVICE_USART3] = {
-               .regs           = (void *)USART3_BASE,
-               .nr_resources   = ARRAY_SIZE(usart3_resource),
-               .resource       = usart3_resource,
-       },
-#endif
-#if defined(CFG_MMCI)
-       [DEVICE_MMCI] = {
-               .regs           = (void *)MMCI_BASE,
-               .nr_resources   = ARRAY_SIZE(mmci_resource),
-               .resource       = mmci_resource,
-       },
-#endif
-#if defined(CFG_DMAC)
-       [DEVICE_DMAC] = {
-               .regs           = (void *)DMAC_BASE,
-               .nr_resources   = ARRAY_SIZE(dmac_resource),
-               .resource       = dmac_resource,
-       },
-#endif
-};
diff --git a/cpu/at32ap/at32ap7000/gpio.c b/cpu/at32ap/at32ap7000/gpio.c
new file mode 100644 (file)
index 0000000..52f5372
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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/arch/gpio.h>
+
+/*
+ * Lots of small functions here. We depend on --gc-sections getting
+ * rid of the ones we don't need.
+ */
+void gpio_enable_ebi(void)
+{
+#ifdef CFG_HSDRAMC
+#ifndef CFG_SDRAM_16BIT
+       gpio_select_periph_A(GPIO_PIN_PE0, 0);
+       gpio_select_periph_A(GPIO_PIN_PE1, 0);
+       gpio_select_periph_A(GPIO_PIN_PE2, 0);
+       gpio_select_periph_A(GPIO_PIN_PE3, 0);
+       gpio_select_periph_A(GPIO_PIN_PE4, 0);
+       gpio_select_periph_A(GPIO_PIN_PE5, 0);
+       gpio_select_periph_A(GPIO_PIN_PE6, 0);
+       gpio_select_periph_A(GPIO_PIN_PE7, 0);
+       gpio_select_periph_A(GPIO_PIN_PE8, 0);
+       gpio_select_periph_A(GPIO_PIN_PE9, 0);
+       gpio_select_periph_A(GPIO_PIN_PE10, 0);
+       gpio_select_periph_A(GPIO_PIN_PE11, 0);
+       gpio_select_periph_A(GPIO_PIN_PE12, 0);
+       gpio_select_periph_A(GPIO_PIN_PE13, 0);
+       gpio_select_periph_A(GPIO_PIN_PE14, 0);
+       gpio_select_periph_A(GPIO_PIN_PE15, 0);
+#endif
+       gpio_select_periph_A(GPIO_PIN_PE26, 0);
+#endif
+}
+
+void gpio_enable_usart0(void)
+{
+       gpio_select_periph_B(GPIO_PIN_PA8, 0);
+       gpio_select_periph_B(GPIO_PIN_PA9, 0);
+}
+
+void gpio_enable_usart1(void)
+{
+       gpio_select_periph_A(GPIO_PIN_PA17, 0);
+       gpio_select_periph_A(GPIO_PIN_PA18, 0);
+}
+
+void gpio_enable_usart2(void)
+{
+       gpio_select_periph_B(GPIO_PIN_PB26, 0);
+       gpio_select_periph_B(GPIO_PIN_PB27, 0);
+}
+
+void gpio_enable_usart3(void)
+{
+       gpio_select_periph_B(GPIO_PIN_PB18, 0);
+       gpio_select_periph_B(GPIO_PIN_PB19, 0);
+}
+
+void gpio_enable_macb0(void)
+{
+       gpio_select_periph_A(GPIO_PIN_PC3,  0); /* TXD0 */
+       gpio_select_periph_A(GPIO_PIN_PC4,  0); /* TXD1 */
+       gpio_select_periph_A(GPIO_PIN_PC7,  0); /* TXEN */
+       gpio_select_periph_A(GPIO_PIN_PC8,  0); /* TXCK */
+       gpio_select_periph_A(GPIO_PIN_PC9,  0); /* RXD0 */
+       gpio_select_periph_A(GPIO_PIN_PC10, 0); /* RXD1 */
+       gpio_select_periph_A(GPIO_PIN_PC13, 0); /* RXER */
+       gpio_select_periph_A(GPIO_PIN_PC15, 0); /* RXDV */
+       gpio_select_periph_A(GPIO_PIN_PC16, 0); /* MDC  */
+       gpio_select_periph_A(GPIO_PIN_PC17, 0); /* MDIO */
+#if !defined(CONFIG_RMII)
+       gpio_select_periph_A(GPIO_PIN_PC0,  0); /* COL  */
+       gpio_select_periph_A(GPIO_PIN_PC1,  0); /* CRS  */
+       gpio_select_periph_A(GPIO_PIN_PC2,  0); /* TXER */
+       gpio_select_periph_A(GPIO_PIN_PC5,  0); /* TXD2 */
+       gpio_select_periph_A(GPIO_PIN_PC6,  0); /* TXD3 */
+       gpio_select_periph_A(GPIO_PIN_PC11, 0); /* RXD2 */
+       gpio_select_periph_A(GPIO_PIN_PC12, 0); /* RXD3 */
+       gpio_select_periph_A(GPIO_PIN_PC14, 0); /* RXCK */
+       gpio_select_periph_A(GPIO_PIN_PC18, 0); /* SPD  */
+#endif
+}
+
+void gpio_enable_macb1(void)
+{
+       gpio_select_periph_B(GPIO_PIN_PD13, 0); /* TXD0 */
+       gpio_select_periph_B(GPIO_PIN_PD14, 0); /* TXD1 */
+       gpio_select_periph_B(GPIO_PIN_PD11, 0); /* TXEN */
+       gpio_select_periph_B(GPIO_PIN_PD12, 0); /* TXCK */
+       gpio_select_periph_B(GPIO_PIN_PD10, 0); /* RXD0 */
+       gpio_select_periph_B(GPIO_PIN_PD6,  0); /* RXD1 */
+       gpio_select_periph_B(GPIO_PIN_PD5,  0); /* RXER */
+       gpio_select_periph_B(GPIO_PIN_PD4,  0); /* RXDV */
+       gpio_select_periph_B(GPIO_PIN_PD3,  0); /* MDC  */
+       gpio_select_periph_B(GPIO_PIN_PD2,  0); /* MDIO */
+#if !defined(CONFIG_RMII)
+       gpio_select_periph_B(GPIO_PIN_PC19, 0); /* COL  */
+       gpio_select_periph_B(GPIO_PIN_PC23, 0); /* CRS  */
+       gpio_select_periph_B(GPIO_PIN_PC26, 0); /* TXER */
+       gpio_select_periph_B(GPIO_PIN_PC27, 0); /* TXD2 */
+       gpio_select_periph_B(GPIO_PIN_PC28, 0); /* TXD3 */
+       gpio_select_periph_B(GPIO_PIN_PC29, 0); /* RXD2 */
+       gpio_select_periph_B(GPIO_PIN_PC30, 0); /* RXD3 */
+       gpio_select_periph_B(GPIO_PIN_PC24, 0); /* RXCK */
+       gpio_select_periph_B(GPIO_PIN_PD15, 0); /* SPD  */
+#endif
+}
+
+void gpio_enable_mmci(void)
+{
+       gpio_select_periph_A(GPIO_PIN_PA10, 0); /* CLK   */
+       gpio_select_periph_A(GPIO_PIN_PA11, 0); /* CMD   */
+       gpio_select_periph_A(GPIO_PIN_PA12, 0); /* DATA0 */
+       gpio_select_periph_A(GPIO_PIN_PA13, 0); /* DATA1 */
+       gpio_select_periph_A(GPIO_PIN_PA14, 0); /* DATA2 */
+       gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */
+}
diff --git a/cpu/at32ap/atmel_mci.c b/cpu/at32ap/atmel_mci.c
new file mode 100644 (file)
index 0000000..9f62c0f
--- /dev/null
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * 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_MMC
+
+#include <part.h>
+#include <mmc.h>
+
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/byteorder.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/memory-map.h>
+
+#include "atmel_mci.h"
+
+#ifdef DEBUG
+#define pr_debug(fmt, args...) printf(fmt, ##args)
+#else
+#define pr_debug(...) do { } while(0)
+#endif
+
+#ifndef CFG_MMC_CLK_OD
+#define CFG_MMC_CLK_OD         150000
+#endif
+
+#ifndef CFG_MMC_CLK_PP
+#define CFG_MMC_CLK_PP         5000000
+#endif
+
+#ifndef CFG_MMC_OP_COND
+#define CFG_MMC_OP_COND                0x00100000
+#endif
+
+#define MMC_DEFAULT_BLKLEN     512
+#define MMC_DEFAULT_RCA                1
+
+static unsigned int mmc_rca;
+static block_dev_desc_t mmc_blkdev;
+
+block_dev_desc_t *mmc_get_dev(int dev)
+{
+       return &mmc_blkdev;
+}
+
+static void mci_set_mode(unsigned long hz, unsigned long blklen)
+{
+       unsigned long bus_hz;
+       unsigned long clkdiv;
+
+       bus_hz = get_mci_clk_rate();
+       clkdiv = (bus_hz / hz) / 2 - 1;
+
+       pr_debug("mmc: setting clock %lu Hz, block size %lu\n",
+                hz, blklen);
+
+       if (clkdiv & ~255UL) {
+               clkdiv = 255;
+               printf("mmc: clock %lu too low; setting CLKDIV to 255\n",
+                       hz);
+       }
+
+       blklen &= 0xfffc;
+       mmci_writel(MR, (MMCI_BF(CLKDIV, clkdiv)
+                        | MMCI_BF(BLKLEN, blklen)));
+}
+
+#define RESP_NO_CRC    1
+#define R1             MMCI_BF(RSPTYP, 1)
+#define R2             MMCI_BF(RSPTYP, 2)
+#define R3             (R1 | RESP_NO_CRC)
+#define R6             R1
+#define NID            MMCI_BF(MAXLAT, 0)
+#define NCR            MMCI_BF(MAXLAT, 1)
+#define TRCMD_START    MMCI_BF(TRCMD, 1)
+#define TRDIR_READ     MMCI_BF(TRDIR, 1)
+#define TRTYP_BLOCK    MMCI_BF(TRTYP, 0)
+#define INIT_CMD       MMCI_BF(SPCMD, 1)
+#define OPEN_DRAIN     MMCI_BF(OPDCMD, 1)
+
+#define ERROR_FLAGS    (MMCI_BIT(DTOE)                 \
+                        | MMCI_BIT(RDIRE)              \
+                        | MMCI_BIT(RENDE)              \
+                        | MMCI_BIT(RINDE)              \
+                        | MMCI_BIT(RTOE))
+
+static int
+mmc_cmd(unsigned long cmd, unsigned long arg,
+       void *resp, unsigned long flags)
+{
+       unsigned long *response = resp;
+       int i, response_words = 0;
+       unsigned long error_flags;
+       u32 status;
+
+       pr_debug("mmc: CMD%lu 0x%lx (flags 0x%lx)\n",
+                cmd, arg, flags);
+
+       error_flags = ERROR_FLAGS;
+       if (!(flags & RESP_NO_CRC))
+               error_flags |= MMCI_BIT(RCRCE);
+
+       flags &= ~MMCI_BF(CMDNB, ~0UL);
+
+       if (MMCI_BFEXT(RSPTYP, flags) == MMCI_RSPTYP_48_BIT_RESP)
+               response_words = 1;
+       else if (MMCI_BFEXT(RSPTYP, flags) == MMCI_RSPTYP_136_BIT_RESP)
+               response_words = 4;
+
+       mmci_writel(ARGR, arg);
+       mmci_writel(CMDR, cmd | flags);
+       do {
+               udelay(40);
+               status = mmci_readl(SR);
+       } while (!(status & MMCI_BIT(CMDRDY)));
+
+       pr_debug("mmc: status 0x%08lx\n", status);
+
+       if (status & ERROR_FLAGS) {
+               printf("mmc: command %lu failed (status: 0x%08lx)\n",
+                      cmd, status);
+               return -EIO;
+       }
+
+       if (response_words)
+               pr_debug("mmc: response:");
+
+       for (i = 0; i < response_words; i++) {
+               response[i] = mmci_readl(RSPR);
+               pr_debug(" %08lx", response[i]);
+       }
+       pr_debug("\n");
+
+       return 0;
+}
+
+static int mmc_acmd(unsigned long cmd, unsigned long arg,
+                   void *resp, unsigned long flags)
+{
+       unsigned long aresp[4];
+       int ret;
+
+       /*
+        * Seems like the APP_CMD part of an ACMD has 64 cycles max
+        * latency even though the ACMD part doesn't. This isn't
+        * entirely clear in the SD Card spec, but some cards refuse
+        * to work if we attempt to use 5 cycles max latency here...
+        */
+       ret = mmc_cmd(MMC_CMD_APP_CMD, 0, aresp,
+                     R1 | NCR | (flags & OPEN_DRAIN));
+       if (ret)
+               return ret;
+       if ((aresp[0] & (R1_ILLEGAL_COMMAND | R1_APP_CMD)) != R1_APP_CMD)
+               return -ENODEV;
+
+       ret = mmc_cmd(cmd, arg, resp, flags);
+       return ret;
+}
+
+static unsigned long
+mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
+         unsigned long *buffer)
+{
+       int ret, i = 0;
+       unsigned long resp[4];
+       unsigned long card_status, data;
+       unsigned long wordcount;
+       u32 status;
+
+       if (blkcnt == 0)
+               return 0;
+
+       pr_debug("mmc_bread: dev %d, start %lx, blkcnt %lx\n",
+                dev, start, blkcnt);
+
+       /* Put the device into Transfer state */
+       ret = mmc_cmd(MMC_CMD_SELECT_CARD, mmc_rca << 16, resp, R1 | NCR);
+       if (ret) goto fail;
+
+       /* Set block length */
+       ret = mmc_cmd(MMC_CMD_SET_BLOCKLEN, mmc_blkdev.blksz, resp, R1 | NCR);
+       if (ret) goto fail;
+
+       pr_debug("MCI_DTOR = %08lx\n", mmci_readl(DTOR));
+
+       for (i = 0; i < blkcnt; i++, start++) {
+               ret = mmc_cmd(MMC_CMD_READ_SINGLE_BLOCK,
+                             start * mmc_blkdev.blksz, resp,
+                             (R1 | NCR | TRCMD_START | TRDIR_READ
+                              | TRTYP_BLOCK));
+               if (ret) goto fail;
+
+               ret = -EIO;
+               wordcount = 0;
+               do {
+                       do {
+                               status = mmci_readl(SR);
+                               if (status & (ERROR_FLAGS | MMCI_BIT(OVRE)))
+                                       goto fail;
+                       } while (!(status & MMCI_BIT(RXRDY)));
+
+                       if (status & MMCI_BIT(RXRDY)) {
+                               data = mmci_readl(RDR);
+                               /* pr_debug("%x\n", data); */
+                               *buffer++ = data;
+                               wordcount++;
+                       }
+               } while(wordcount < (512 / 4));
+
+               pr_debug("mmc: read %u words, waiting for BLKE\n", wordcount);
+
+               do {
+                       status = mmci_readl(SR);
+               } while (!(status & MMCI_BIT(BLKE)));
+
+               putc('.');
+       }
+
+out:
+       /* Put the device back into Standby state */
+       mmc_cmd(MMC_CMD_SELECT_CARD, 0, resp, NCR);
+       return i;
+
+fail:
+       mmc_cmd(MMC_CMD_SEND_STATUS, mmc_rca << 16, &card_status, R1 | NCR);
+       printf("mmc: bread failed, card status = ", card_status);
+       goto out;
+}
+
+static void mmc_parse_cid(struct mmc_cid *cid, unsigned long *resp)
+{
+       cid->mid = resp[0] >> 24;
+       cid->oid = (resp[0] >> 8) & 0xffff;
+       cid->pnm[0] = resp[0];
+       cid->pnm[1] = resp[1] >> 24;
+       cid->pnm[2] = resp[1] >> 16;
+       cid->pnm[3] = resp[1] >> 8;
+       cid->pnm[4] = resp[1];
+       cid->pnm[5] = resp[2] >> 24;
+       cid->pnm[6] = 0;
+       cid->prv = resp[2] >> 16;
+       cid->psn = (resp[2] << 16) | (resp[3] >> 16);
+       cid->mdt = resp[3] >> 8;
+}
+
+static void sd_parse_cid(struct mmc_cid *cid, unsigned long *resp)
+{
+       cid->mid = resp[0] >> 24;
+       cid->oid = (resp[0] >> 8) & 0xffff;
+       cid->pnm[0] = resp[0];
+       cid->pnm[1] = resp[1] >> 24;
+       cid->pnm[2] = resp[1] >> 16;
+       cid->pnm[3] = resp[1] >> 8;
+       cid->pnm[4] = resp[1];
+       cid->pnm[5] = 0;
+       cid->pnm[6] = 0;
+       cid->prv = resp[2] >> 24;
+       cid->psn = (resp[2] << 8) | (resp[3] >> 24);
+       cid->mdt = (resp[3] >> 8) & 0x0fff;
+}
+
+static void mmc_dump_cid(const struct mmc_cid *cid)
+{
+       printf("Manufacturer ID:       %02lX\n", cid->mid);
+       printf("OEM/Application ID:    %04lX\n", cid->oid);
+       printf("Product name:          %s\n", cid->pnm);
+       printf("Product Revision:      %lu.%lu\n",
+              cid->prv >> 4, cid->prv & 0x0f);
+       printf("Product Serial Number: %lu\n", cid->psn);
+       printf("Manufacturing Date:    %02lu/%02lu\n",
+              cid->mdt >> 4, cid->mdt & 0x0f);
+}
+
+static void mmc_dump_csd(const struct mmc_csd *csd)
+{
+       unsigned long *csd_raw = (unsigned long *)csd;
+       printf("CSD data: %08lx %08lx %08lx %08lx\n",
+              csd_raw[0], csd_raw[1], csd_raw[2], csd_raw[3]);
+       printf("CSD structure version:   1.%u\n", csd->csd_structure);
+       printf("MMC System Spec version: %u\n", csd->spec_vers);
+       printf("Card command classes:    %03x\n", csd->ccc);
+       printf("Read block length:       %u\n", 1 << csd->read_bl_len);
+       if (csd->read_bl_partial)
+               puts("Supports partial reads\n");
+       else
+               puts("Does not support partial reads\n");
+       printf("Write block length:      %u\n", 1 << csd->write_bl_len);
+       if (csd->write_bl_partial)
+               puts("Supports partial writes\n");
+       else
+               puts("Does not support partial writes\n");
+       if (csd->wp_grp_enable)
+               printf("Supports group WP:      %u\n", csd->wp_grp_size + 1);
+       else
+               puts("Does not support group WP\n");
+       printf("Card capacity:          %u bytes\n",
+              (csd->c_size + 1) * (1 << (csd->c_size_mult + 2)) *
+              (1 << csd->read_bl_len));
+       printf("File format:            %u/%u\n",
+              csd->file_format_grp, csd->file_format);
+       puts("Write protection:        ");
+       if (csd->perm_write_protect)
+               puts(" permanent");
+       if (csd->tmp_write_protect)
+               puts(" temporary");
+       putc('\n');
+}
+
+static int mmc_idle_cards(void)
+{
+       int ret;
+
+       /* Reset and initialize all cards */
+       ret = mmc_cmd(MMC_CMD_GO_IDLE_STATE, 0, NULL, 0);
+       if (ret)
+               return ret;
+
+       /* Keep the bus idle for 74 clock cycles */
+       return mmc_cmd(0, 0, NULL, INIT_CMD);
+}
+
+static int sd_init_card(struct mmc_cid *cid, int verbose)
+{
+       unsigned long resp[4];
+       int i, ret = 0;
+
+       mmc_idle_cards();
+       for (i = 0; i < 1000; i++) {
+               ret = mmc_acmd(MMC_ACMD_SD_SEND_OP_COND, CFG_MMC_OP_COND,
+                              resp, R3 | NID);
+               if (ret || (resp[0] & 0x80000000))
+                       break;
+               ret = -ETIMEDOUT;
+       }
+
+       if (ret)
+               return ret;
+
+       ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID);
+       if (ret)
+               return ret;
+       sd_parse_cid(cid, resp);
+       if (verbose)
+               mmc_dump_cid(cid);
+
+       /* Get RCA of the card that responded */
+       ret = mmc_cmd(MMC_CMD_SD_SEND_RELATIVE_ADDR, 0, resp, R6 | NCR);
+       if (ret)
+               return ret;
+
+       mmc_rca = resp[0] >> 16;
+       if (verbose)
+               printf("SD Card detected (RCA %u)\n", mmc_rca);
+       return 0;
+}
+
+static int mmc_init_card(struct mmc_cid *cid, int verbose)
+{
+       unsigned long resp[4];
+       int i, ret = 0;
+
+       mmc_idle_cards();
+       for (i = 0; i < 1000; i++) {
+               ret = mmc_cmd(MMC_CMD_SEND_OP_COND, CFG_MMC_OP_COND, resp,
+                             R3 | NID | OPEN_DRAIN);
+               if (ret || (resp[0] & 0x80000000))
+                       break;
+               ret = -ETIMEDOUT;
+       }
+
+       if (ret)
+               return ret;
+
+       /* Get CID of all cards. FIXME: Support more than one card */
+       ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID | OPEN_DRAIN);
+       if (ret)
+               return ret;
+       mmc_parse_cid(cid, resp);
+       if (verbose)
+               mmc_dump_cid(cid);
+
+       /* Set Relative Address of the card that responded */
+       ret = mmc_cmd(MMC_CMD_SET_RELATIVE_ADDR, mmc_rca << 16, resp,
+                     R1 | NCR | OPEN_DRAIN);
+       return ret;
+}
+
+int mmc_init(int verbose)
+{
+       struct mmc_cid cid;
+       struct mmc_csd csd;
+       int ret;
+
+       /* Initialize controller */
+       mmci_writel(CR, MMCI_BIT(SWRST));
+       mmci_writel(CR, MMCI_BIT(MCIEN));
+       mmci_writel(DTOR, 0x5f);
+       mmci_writel(IDR, ~0UL);
+       mci_set_mode(CFG_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
+
+       ret = sd_init_card(&cid, verbose);
+       if (ret) {
+               mmc_rca = MMC_DEFAULT_RCA;
+               ret = mmc_init_card(&cid, verbose);
+       }
+       if (ret)
+               return ret;
+
+       /* Get CSD from the card */
+       ret = mmc_cmd(MMC_CMD_SEND_CSD, mmc_rca << 16, &csd, R2 | NCR);
+       if (ret)
+               return ret;
+       if (verbose)
+               mmc_dump_csd(&csd);
+
+       /* Initialize the blockdev structure */
+       mmc_blkdev.if_type = IF_TYPE_MMC;
+       mmc_blkdev.part_type = PART_TYPE_DOS;
+       mmc_blkdev.block_read = mmc_bread;
+       sprintf((char *)mmc_blkdev.vendor,
+               "Man %02x%04x Snr %08x",
+               cid.mid, cid.oid, cid.psn);
+       strncpy((char *)mmc_blkdev.product, cid.pnm,
+               sizeof(mmc_blkdev.product));
+       sprintf((char *)mmc_blkdev.revision, "%x %x",
+               cid.prv >> 4, cid.prv & 0x0f);
+       mmc_blkdev.blksz = 1 << csd.read_bl_len;
+       mmc_blkdev.lba = (csd.c_size + 1) * (1 << (csd.c_size_mult + 2));
+
+       mci_set_mode(CFG_MMC_CLK_PP, mmc_blkdev.blksz);
+
+#if 0
+       if (fat_register_device(&mmc_blkdev, 1))
+               printf("Could not register MMC fat device\n");
+#else
+       init_part(&mmc_blkdev);
+#endif
+
+       return 0;
+}
+
+int mmc_read(ulong src, uchar *dst, int size)
+{
+       return -ENOSYS;
+}
+
+int mmc_write(uchar *src, ulong dst, int size)
+{
+       return -ENOSYS;
+}
+
+int mmc2info(ulong addr)
+{
+       return 0;
+}
+
+#endif /* CONFIG_MMC */
diff --git a/cpu/at32ap/atmel_mci.h b/cpu/at32ap/atmel_mci.h
new file mode 100644 (file)
index 0000000..0ffbc4f
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2005-2006 Atmel Corporation
+ *
+ * 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_AT32AP_ATMEL_MCI_H__
+#define __CPU_AT32AP_ATMEL_MCI_H__
+
+/* Atmel MultiMedia Card Interface (MCI) registers */
+#define MMCI_CR                                        0x0000
+#define MMCI_MR                                        0x0004
+#define MMCI_DTOR                              0x0008
+#define MMCI_SDCR                              0x000c
+#define MMCI_ARGR                              0x0010
+#define MMCI_CMDR                              0x0014
+#define MMCI_RSPR                              0x0020
+#define MMCI_RSPR1                             0x0024
+#define MMCI_RSPR2                             0x0028
+#define MMCI_RSPR3                             0x002c
+#define MMCI_RDR                               0x0030
+#define MMCI_TDR                               0x0034
+#define MMCI_SR                                        0x0040
+#define MMCI_IER                               0x0044
+#define MMCI_IDR                               0x0048
+#define MMCI_IMR                               0x004c
+
+/* Bitfields in CR */
+#define MMCI_MCIEN_OFFSET                      0
+#define MMCI_MCIEN_SIZE                                1
+#define MMCI_MCIDIS_OFFSET                     1
+#define MMCI_MCIDIS_SIZE                       1
+#define MMCI_PWSEN_OFFSET                      2
+#define MMCI_PWSEN_SIZE                                1
+#define MMCI_PWSDIS_OFFSET                     3
+#define MMCI_PWSDIS_SIZE                       1
+#define MMCI_SWRST_OFFSET                      7
+#define MMCI_SWRST_SIZE                                1
+
+/* Bitfields in MR */
+#define MMCI_CLKDIV_OFFSET                     0
+#define MMCI_CLKDIV_SIZE                       8
+#define MMCI_PWSDIV_OFFSET                     8
+#define MMCI_PWSDIV_SIZE                       3
+#define MMCI_PDCPADV_OFFSET                    14
+#define MMCI_PDCPADV_SIZE                      1
+#define MMCI_PDCMODE_OFFSET                    15
+#define MMCI_PDCMODE_SIZE                      1
+#define MMCI_BLKLEN_OFFSET                     16
+#define MMCI_BLKLEN_SIZE                       16
+
+/* Bitfields in DTOR */
+#define MMCI_DTOCYC_OFFSET                     0
+#define MMCI_DTOCYC_SIZE                       4
+#define MMCI_DTOMUL_OFFSET                     4
+#define MMCI_DTOMUL_SIZE                       3
+
+/* Bitfields in SDCR */
+#define MMCI_SCDSEL_OFFSET                     0
+#define MMCI_SCDSEL_SIZE                       4
+#define MMCI_SCDBUS_OFFSET                     7
+#define MMCI_SCDBUS_SIZE                       1
+
+/* Bitfields in ARGR */
+#define MMCI_ARG_OFFSET                                0
+#define MMCI_ARG_SIZE                          32
+
+/* Bitfields in CMDR */
+#define MMCI_CMDNB_OFFSET                      0
+#define MMCI_CMDNB_SIZE                                6
+#define MMCI_RSPTYP_OFFSET                     6
+#define MMCI_RSPTYP_SIZE                       2
+#define MMCI_SPCMD_OFFSET                      8
+#define MMCI_SPCMD_SIZE                                3
+#define MMCI_OPDCMD_OFFSET                     11
+#define MMCI_OPDCMD_SIZE                       1
+#define MMCI_MAXLAT_OFFSET                     12
+#define MMCI_MAXLAT_SIZE                       1
+#define MMCI_TRCMD_OFFSET                      16
+#define MMCI_TRCMD_SIZE                                2
+#define MMCI_TRDIR_OFFSET                      18
+#define MMCI_TRDIR_SIZE                                1
+#define MMCI_TRTYP_OFFSET                      19
+#define MMCI_TRTYP_SIZE                                2
+
+/* Bitfields in RSPRx */
+#define MMCI_RSP_OFFSET                                0
+#define MMCI_RSP_SIZE                          32
+
+/* Bitfields in SR/IER/IDR/IMR */
+#define MMCI_CMDRDY_OFFSET                     0
+#define MMCI_CMDRDY_SIZE                       1
+#define MMCI_RXRDY_OFFSET                      1
+#define MMCI_RXRDY_SIZE                                1
+#define MMCI_TXRDY_OFFSET                      2
+#define MMCI_TXRDY_SIZE                                1
+#define MMCI_BLKE_OFFSET                       3
+#define MMCI_BLKE_SIZE                         1
+#define MMCI_DTIP_OFFSET                       4
+#define MMCI_DTIP_SIZE                         1
+#define MMCI_NOTBUSY_OFFSET                    5
+#define MMCI_NOTBUSY_SIZE                      1
+#define MMCI_ENDRX_OFFSET                      6
+#define MMCI_ENDRX_SIZE                                1
+#define MMCI_ENDTX_OFFSET                      7
+#define MMCI_ENDTX_SIZE                                1
+#define MMCI_RXBUFF_OFFSET                     14
+#define MMCI_RXBUFF_SIZE                       1
+#define MMCI_TXBUFE_OFFSET                     15
+#define MMCI_TXBUFE_SIZE                       1
+#define MMCI_RINDE_OFFSET                      16
+#define MMCI_RINDE_SIZE                                1
+#define MMCI_RDIRE_OFFSET                      17
+#define MMCI_RDIRE_SIZE                                1
+#define MMCI_RCRCE_OFFSET                      18
+#define MMCI_RCRCE_SIZE                                1
+#define MMCI_RENDE_OFFSET                      19
+#define MMCI_RENDE_SIZE                                1
+#define MMCI_RTOE_OFFSET                       20
+#define MMCI_RTOE_SIZE                         1
+#define MMCI_DCRCE_OFFSET                      21
+#define MMCI_DCRCE_SIZE                                1
+#define MMCI_DTOE_OFFSET                       22
+#define MMCI_DTOE_SIZE                         1
+#define MMCI_OVRE_OFFSET                       30
+#define MMCI_OVRE_SIZE                         1
+#define MMCI_UNRE_OFFSET                       31
+#define MMCI_UNRE_SIZE                         1
+
+/* Constants for DTOMUL */
+#define MMCI_DTOMUL_1_CYCLE                    0
+#define MMCI_DTOMUL_16_CYCLES                  1
+#define MMCI_DTOMUL_128_CYCLES                 2
+#define MMCI_DTOMUL_256_CYCLES                 3
+#define MMCI_DTOMUL_1024_CYCLES                        4
+#define MMCI_DTOMUL_4096_CYCLES                        5
+#define MMCI_DTOMUL_65536_CYCLES               6
+#define MMCI_DTOMUL_1048576_CYCLES             7
+
+/* Constants for RSPTYP */
+#define MMCI_RSPTYP_NO_RESP                    0
+#define MMCI_RSPTYP_48_BIT_RESP                        1
+#define MMCI_RSPTYP_136_BIT_RESP               2
+
+/* Constants for SPCMD */
+#define MMCI_SPCMD_NO_SPEC_CMD                 0
+#define MMCI_SPCMD_INIT_CMD                    1
+#define MMCI_SPCMD_SYNC_CMD                    2
+#define MMCI_SPCMD_INT_CMD                     4
+#define MMCI_SPCMD_INT_RESP                    5
+
+/* Constants for TRCMD */
+#define MMCI_TRCMD_NO_TRANS                    0
+#define MMCI_TRCMD_START_TRANS                 1
+#define MMCI_TRCMD_STOP_TRANS                  2
+
+/* Constants for TRTYP */
+#define MMCI_TRTYP_BLOCK                       0
+#define MMCI_TRTYP_MULTI_BLOCK                 1
+#define MMCI_TRTYP_STREAM                      2
+
+/* Bit manipulation macros */
+#define MMCI_BIT(name)                                 \
+       (1 << MMCI_##name##_OFFSET)
+#define MMCI_BF(name,value)                            \
+       (((value) & ((1 << MMCI_##name##_SIZE) - 1))    \
+        << MMCI_##name##_OFFSET)
+#define MMCI_BFEXT(name,value)                         \
+       (((value) >> MMCI_##name##_OFFSET)\
+        & ((1 << MMCI_##name##_SIZE) - 1))
+#define MMCI_BFINS(name,value,old)                     \
+       (((old) & ~(((1 << MMCI_##name##_SIZE) - 1)     \
+                   << MMCI_##name##_OFFSET))           \
+        | MMCI_BF(name,value))
+
+/* Register access macros */
+#define mmci_readl(reg)                                        \
+       readl((void *)MMCI_BASE + MMCI_##reg)
+#define mmci_writel(reg,value)                         \
+       writel((value), (void *)MMCI_BASE + MMCI_##reg)
+
+#endif /* __CPU_AT32AP_ATMEL_MCI_H__ */
index 37e3ea040be6a5e898801aefc2e7db3bf95da3e5..311466b781465ac45347bc5abb22f72a5b260c6c 100644 (file)
 #include <asm/sections.h>
 #include <asm/sysreg.h>
 
+#include <asm/arch/clk.h>
 #include <asm/arch/memory-map.h>
-#include <asm/arch/platform.h>
 
 #include "hsmc3.h"
+#include "sm.h"
+
+/* Sanity checks */
+#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB)          \
+       || (CFG_CLKDIV_HSB > CFG_CLKDIV_PBA)    \
+       || (CFG_CLKDIV_HSB > CFG_CLKDIV_PBB)
+# error Constraint fCPU >= fHSB >= fPB{A,B} violated
+#endif
+#if defined(CONFIG_PLL) && ((CFG_PLL0_MUL < 1) || (CFG_PLL0_DIV < 1))
+# error Invalid PLL multiplier and/or divider
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static void pm_init(void)
+{
+       uint32_t cksel;
+
+#ifdef CONFIG_PLL
+       /* Initialize the PLL */
+       sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES)
+                           | SM_BF(PLLMUL, CFG_PLL0_MUL - 1)
+                           | SM_BF(PLLDIV, CFG_PLL0_DIV - 1)
+                           | SM_BF(PLLOPT, CFG_PLL0_OPT)
+                           | SM_BF(PLLOSC, 0)
+                           | SM_BIT(PLLEN)));
+
+       /* Wait for lock */
+       while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ;
+#endif
+
+       /* Set up clocks for the CPU and all peripheral buses */
+       cksel = 0;
+       if (CFG_CLKDIV_CPU)
+               cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1);
+       if (CFG_CLKDIV_HSB)
+               cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1);
+       if (CFG_CLKDIV_PBA)
+               cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1);
+       if (CFG_CLKDIV_PBB)
+               cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1);
+       sm_writel(PM_CKSEL, cksel);
+
+       gd->cpu_hz = get_cpu_clk_rate();
+
+#ifdef CONFIG_PLL
+       /* Use PLL0 as main clock */
+       sm_writel(PM_MCCTRL, SM_BIT(PLLSEL));
+#endif
+}
+
 int cpu_init(void)
 {
-       const struct device *hebi;
        extern void _evba(void);
        char *p;
 
        gd->cpu_hz = CFG_OSC0_HZ;
 
-       /* fff03400: 00010001 04030402 00050005 10011103 */
-       hebi = get_device(DEVICE_HEBI);
-       hsmc3_writel(hebi, MODE0, 0x00031103);
-       hsmc3_writel(hebi, CYCLE0, 0x000c000d);
-       hsmc3_writel(hebi, PULSE0, 0x0b0a0906);
-       hsmc3_writel(hebi, SETUP0, 0x00010002);
+       /* TODO: Move somewhere else, but needs to be run before we
+        * increase the clock frequency. */
+       hsmc3_writel(MODE0, 0x00031103);
+       hsmc3_writel(CYCLE0, 0x000c000d);
+       hsmc3_writel(PULSE0, 0x0b0a0906);
+       hsmc3_writel(SETUP0, 0x00010002);
 
        pm_init();
 
        sysreg_write(EVBA, (unsigned long)&_evba);
        asm volatile("csrf      %0" : : "i"(SYSREG_EM_OFFSET));
-       gd->console_uart = get_device(CFG_CONSOLE_UART_DEV);
 
        /* Lock everything that mess with the flash in the icache */
        for (p = __flashprog_start; p <= (__flashprog_end + CFG_ICACHE_LINESZ);
diff --git a/cpu/at32ap/device.c b/cpu/at32ap/device.c
deleted file mode 100644 (file)
index 89914b6..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2006 Atmel Corporation
- *
- * 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/arch/platform.h>
-
-#include "sm.h"
-
-struct device_state {
-       int refcount;
-};
-
-static struct device_state device_state[NR_DEVICES];
-
-static int claim_resource(const struct resource *res)
-{
-       int ret = 0;
-
-       switch (res->type) {
-       case RESOURCE_GPIO:
-               ret = gpio_set_func(res->u.gpio.gpio_dev,
-                                   res->u.gpio.start,
-                                   res->u.gpio.nr_pins,
-                                   res->u.gpio.func);
-               break;
-       case RESOURCE_CLOCK:
-               ret = pm_enable_clock(res->u.clock.id, res->u.clock.index);
-               break;
-       }
-
-       return ret;
-}
-
-static void free_resource(const struct resource *res)
-{
-       switch (res->type) {
-       case RESOURCE_GPIO:
-               gpio_free(res->u.gpio.gpio_dev, res->u.gpio.start,
-                         res->u.gpio.nr_pins);
-               break;
-       case RESOURCE_CLOCK:
-               pm_disable_clock(res->u.clock.id, res->u.clock.index);
-               break;
-       }
-}
-
-static int init_dev(const struct device *dev)
-{
-       unsigned int i;
-       int ret = 0;
-
-       for (i = 0; i < dev->nr_resources; i++) {
-               ret = claim_resource(&dev->resource[i]);
-               if (ret)
-                       goto cleanup;
-       }
-
-       return 0;
-
-cleanup:
-       while (i--)
-               free_resource(&dev->resource[i]);
-
-       return ret;
-}
-
-const struct device *get_device(enum device_id devid)
-{
-       struct device_state *devstate;
-       const struct device *dev;
-       unsigned long flags;
-       int initialized = 0;
-       int ret = 0;
-
-       devstate = &device_state[devid];
-       dev = &chip_device[devid];
-
-       flags = disable_interrupts();
-       if (devstate->refcount++)
-               initialized = 1;
-       if (flags)
-               enable_interrupts();
-
-       if (!initialized)
-               ret = init_dev(dev);
-
-       return ret ? NULL : dev;
-}
-
-void put_device(const struct device *dev)
-{
-       struct device_state *devstate;
-       unsigned long devid, flags;
-
-       devid = (unsigned long)(dev - chip_device) / sizeof(struct device);
-       devstate = &device_state[devid];
-
-       flags = disable_interrupts();
-       devstate--;
-       if (!devstate) {
-               unsigned int i;
-               for (i = 0; i < dev->nr_resources; i++)
-                       free_resource(&dev->resource[i]);
-       }
-       if (flags)
-               enable_interrupts();
-}
index b52d798be3d7eecaf35c0800ac5cb5620d538b42..a6fc68867a8c04d764e3221bc971106f1245d770 100644 (file)
@@ -42,8 +42,7 @@ timer_interrupt_handler:
         * We're running at interrupt level 3, so we don't need to save
         * r8-r12 or lr to the stack.
         */
-       mov     r8, lo(timer_overflow)
-       orh     r8, hi(timer_overflow)
+       lda.w   r8, timer_overflow
        ld.w    r9, r8[0]
        mov     r10, -1
        mtsr    SYSREG_COMPARE, r10
index 4123c446167ad4bc93523445fb570ac3cea306ac..0672685cd024ba80e470dcd930b85b0d6f56e54f 100644 (file)
@@ -24,6 +24,8 @@
 #include <asm/sysreg.h>
 #include <asm/ptrace.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 static const char * const cpu_modes[8] = {
        "Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",
        "Interrupt level 2", "Interrupt level 3", "Exception", "NMI"
@@ -109,11 +111,10 @@ void do_unknown_exception(unsigned int ecr, struct pt_regs *regs)
        printf("CPU Mode: %s\n", cpu_modes[mode]);
 
        /* Avoid exception loops */
-       if (regs->sp >= CFG_INIT_SP_ADDR
-           || regs->sp < (CFG_INIT_SP_ADDR - CONFIG_STACKSIZE))
+       if (regs->sp < CFG_SDRAM_BASE || regs->sp >= gd->stack_end)
                printf("\nStack pointer seems bogus, won't do stack dump\n");
        else
-               dump_mem("\nStack: ", regs->sp, CFG_INIT_SP_ADDR);
+               dump_mem("\nStack: ", regs->sp, gd->stack_end);
 
        panic("Unhandled exception\n");
 }
index f36da354528daaa6fae939341cecc3126898105b..a936e03166c1d81de52c760962b642c933ee92f5 100644 (file)
 #include <asm/io.h>
 #include <asm/sdram.h>
 
-#include <asm/arch/platform.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/memory-map.h>
 
 #include "hsdramc1.h"
 
-struct hsdramc {
-       const struct device *hebi;
-       void *regs;
-};
-
-static struct hsdramc hsdramc;
-
 unsigned long sdram_init(const struct sdram_info *info)
 {
        unsigned long *sdram = (unsigned long *)uncached(info->phys_addr);
@@ -44,16 +38,6 @@ unsigned long sdram_init(const struct sdram_info *info)
        unsigned long bus_hz;
        unsigned int i;
 
-       hsdramc.hebi = get_device(DEVICE_HEBI);
-       if (!hsdramc.hebi)
-               return 0;
-
-       /* FIXME: Both of these lines are complete hacks */
-       hsdramc.regs = hsdramc.hebi->regs + 0x400;
-       bus_hz = pm_get_clock_freq(hsdramc.hebi->resource[0].u.clock.id);
-
-       cpu_enable_sdram();
-
        tmp = (HSDRAMC1_BF(NC, info->col_bits - 8)
               | HSDRAMC1_BF(NR, info->row_bits - 11)
               | HSDRAMC1_BF(NB, info->bank_bits - 1)
@@ -74,7 +58,7 @@ unsigned long sdram_init(const struct sdram_info *info)
                           + info->bank_bits + 2);
 #endif
 
-       hsdramc1_writel(&hsdramc, CR, tmp);
+       hsdramc1_writel(CR, tmp);
 
        /*
         * Initialization sequence for SDRAM, from the data sheet:
@@ -87,15 +71,15 @@ unsigned long sdram_init(const struct sdram_info *info)
        /*
         * 2. A Precharge All command is issued to the SDRAM
         */
-       hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_BANKS_PRECHARGE);
-       hsdramc1_readl(&hsdramc, MR);
+       hsdramc1_writel(MR, HSDRAMC1_MODE_BANKS_PRECHARGE);
+       hsdramc1_readl(MR);
        writel(0, sdram);
 
        /*
         * 3. Eight auto-refresh (CBR) cycles are provided
         */
-       hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_AUTO_REFRESH);
-       hsdramc1_readl(&hsdramc, MR);
+       hsdramc1_writel(MR, HSDRAMC1_MODE_AUTO_REFRESH);
+       hsdramc1_readl(MR);
        for (i = 0; i < 8; i++)
                writel(0, sdram);
 
@@ -106,8 +90,8 @@ unsigned long sdram_init(const struct sdram_info *info)
         *
         * CAS from info struct, burst length 1, serial burst type
         */
-       hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_LOAD_MODE);
-       hsdramc1_readl(&hsdramc, MR);
+       hsdramc1_writel(MR, HSDRAMC1_MODE_LOAD_MODE);
+       hsdramc1_readl(MR);
        writel(0, sdram + (info->cas << 4));
 
        /*
@@ -117,9 +101,9 @@ unsigned long sdram_init(const struct sdram_info *info)
         * From the timing diagram, it looks like tMRD is 3
         * cycles...try a dummy read from the peripheral bus.
         */
-       hsdramc1_readl(&hsdramc, MR);
-       hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_NORMAL);
-       hsdramc1_readl(&hsdramc, MR);
+       hsdramc1_readl(MR);
+       hsdramc1_writel(MR, HSDRAMC1_MODE_NORMAL);
+       hsdramc1_readl(MR);
        writel(0, sdram);
 
        /*
@@ -128,7 +112,8 @@ unsigned long sdram_init(const struct sdram_info *info)
         *
         * 15.6 us is a typical value for a burst of length one
         */
-       hsdramc1_writel(&hsdramc, TR, (156 * (bus_hz / 1000)) / 10000);
+       bus_hz = get_sdram_clk_rate();
+       hsdramc1_writel(TR, (156 * (bus_hz / 1000)) / 10000);
 
        printf("SDRAM: %u MB at address 0x%08lx\n",
               sdram_size >> 20, info->phys_addr);
index ce229bca1fbb834748734058d571d8c353611980..305d2cb5d39a6b9ebd9ccb1923636a1f533cdb00 100644 (file)
         | HSDRAMC1_BF(name,value))
 
 /* Register access macros */
-#define hsdramc1_readl(port,reg)                               \
-       readl((port)->regs + HSDRAMC1_##reg)
-#define hsdramc1_writel(port,reg,value)                                \
-       writel((value), (port)->regs + HSDRAMC1_##reg)
+#define hsdramc1_readl(reg)                                    \
+       readl((void *)HSDRAMC_BASE + HSDRAMC1_##reg)
+#define hsdramc1_writel(reg,value)                             \
+       writel((value), (void *)HSDRAMC_BASE + HSDRAMC1_##reg)
 
 #endif /* __ASM_AVR32_HSDRAMC1_H__ */
index ec78cee7147a571aa38935dc5eed2405a09da9a0..ca533b922edaa22e4d5bafd3a82f3dfa96d7115e 100644 (file)
         | HSMC3_BF(name,value))
 
 /* Register access macros */
-#define hsmc3_readl(port,reg)                                  \
-       readl((port)->regs + HSMC3_##reg)
-#define hsmc3_writel(port,reg,value)                           \
-       writel((value), (port)->regs + HSMC3_##reg)
+#define hsmc3_readl(reg)                                       \
+       readl((void *)HSMC_BASE + HSMC3_##reg)
+#define hsmc3_writel(reg,value)                                        \
+       writel((value), (void *)HSMC_BASE + HSMC3_##reg)
 
 #endif /* __CPU_AT32AP_HSMC3_H__ */
index d720cfa942b32edc9622326aa7ae5fa8421de009..c9e04993c777a1344147acf2d108ca5e02d2604a 100644 (file)
@@ -27,7 +27,7 @@
 #include <asm/processor.h>
 #include <asm/sysreg.h>
 
-#include <asm/arch/platform.h>
+#include <asm/arch/memory-map.h>
 
 #define HANDLER_MASK   0x00ffffff
 #define INTLEV_SHIFT   30
@@ -44,8 +44,6 @@ volatile unsigned long timer_overflow;
  */
 static unsigned long tb_factor;
 
-static const struct device *intc_dev;
-
 unsigned long get_tbclk(void)
 {
        return gd->cpu_hz;
@@ -117,16 +115,19 @@ void udelay(unsigned long usec)
 static int set_interrupt_handler(unsigned int nr, void (*handler)(void),
                                 unsigned int priority)
 {
+       extern void _evba(void);
        unsigned long intpr;
        unsigned long handler_addr = (unsigned long)handler;
 
+       handler_addr -= (unsigned long)&_evba;
+
        if ((handler_addr & HANDLER_MASK) != handler_addr
            || (priority & INTLEV_MASK) != priority)
                return -EINVAL;
 
        intpr = (handler_addr & HANDLER_MASK);
        intpr |= (priority & INTLEV_MASK) << INTLEV_SHIFT;
-       writel(intpr, intc_dev->regs + 4 * nr);
+       writel(intpr, (void *)INTC_BASE + 4 * nr);
 
        return 0;
 }
@@ -143,10 +144,7 @@ void timer_init(void)
        do_div(tmp, gd->cpu_hz);
        tb_factor = (u32)tmp;
 
-       intc_dev = get_device(DEVICE_INTC);
-
-       if (!intc_dev
-           || set_interrupt_handler(0, &timer_interrupt_handler, 3))
+       if (set_interrupt_handler(0, &timer_interrupt_handler, 3))
                return;
 
        /* For all practical purposes, this gives us an overflow interrupt */
index 8b6c3a35df505a6510d85445e1bbc74798cee318..9ba0b8ea8b26f189d1c39042908a7939dc570905 100644 (file)
  */
 #include <common.h>
 
-#include <asm/errno.h>
 #include <asm/io.h>
-#include <asm/arch/platform.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/memory-map.h>
 
 #include "pio2.h"
 
-struct pio_state {
-       const struct device *dev;
-       u32 alloc_mask;
-};
-
-static struct pio_state pio_state[CFG_NR_PIOS];
-
-int gpio_set_func(enum device_id gpio_devid, unsigned int start,
-                 unsigned int nr_pins, enum gpio_func func)
+void gpio_select_periph_A(unsigned int pin, int use_pullup)
 {
-       const struct device *gpio;
-       struct pio_state *state;
-       u32 mask;
-
-       state = &pio_state[gpio_devid - DEVICE_PIOA];
-
-       gpio = get_device(gpio_devid);
-       if (!gpio)
-               return -EBUSY;
-
-       state->dev = gpio;
-       mask = ((1 << nr_pins) - 1) << start;
-
-       if (mask & state->alloc_mask) {
-               put_device(gpio);
-               return -EBUSY;
-       }
-       state->alloc_mask |= mask;
-
-       switch (func) {
-       case GPIO_FUNC_GPIO:
-               /* TODO */
-               return -EINVAL;
-       case GPIO_FUNC_A:
-               pio2_writel(gpio, ASR, mask);
-               pio2_writel(gpio, PDR, mask);
-               pio2_writel(gpio, PUDR, mask);
-               break;
-       case GPIO_FUNC_B:
-               pio2_writel(gpio, BSR, mask);
-               pio2_writel(gpio, PDR, mask);
-               pio2_writel(gpio, PUDR, mask);
-               break;
-       }
-
-       return 0;
+       void *base = gpio_pin_to_addr(pin);
+       uint32_t mask = 1 << (pin & 0x1f);
+
+       if (!base)
+               panic("Invalid GPIO pin %u\n", pin);
+
+       pio2_writel(base, ASR, mask);
+       pio2_writel(base, PDR, mask);
+       if (use_pullup)
+               pio2_writel(base, PUER, mask);
+       else
+               pio2_writel(base, PUDR, mask);
 }
 
-void gpio_free(enum device_id gpio_devid, unsigned int start,
-              unsigned int nr_pins)
+void gpio_select_periph_B(unsigned int pin, int use_pullup)
 {
-       const struct device *gpio;
-       struct pio_state *state;
-       u32 mask;
-
-       state = &pio_state[gpio_devid - DEVICE_PIOA];
-       gpio = state->dev;
-       mask = ((1 << nr_pins) - 1) << start;
-
-       pio2_writel(gpio, ODR, mask);
-       pio2_writel(gpio, PER, mask);
-
-       state->alloc_mask &= ~mask;
-       put_device(gpio);
+       void *base = gpio_pin_to_addr(pin);
+       uint32_t mask = 1 << (pin & 0x1f);
+
+       if (!base)
+               panic("Invalid GPIO pin %u\n", pin);
+
+       pio2_writel(base, BSR, mask);
+       pio2_writel(base, PDR, mask);
+       if (use_pullup)
+               pio2_writel(base, PUER, mask);
+       else
+               pio2_writel(base, PUDR, mask);
 }
index 6b79de3c72bec3fa71f8bbd6599921aff3bff694..9719ea8c433557cb16c9096d4c3fb91912b008e1 100644 (file)
@@ -36,9 +36,9 @@
 #define PIO2_OWSR                              0x00a8
 
 /* Register access macros */
-#define pio2_readl(port,reg)                           \
-       readl((port)->regs + PIO2_##reg)
-#define pio2_writel(port,reg,value)                    \
-       writel((value), (port)->regs + PIO2_##reg)
+#define pio2_readl(base,reg)                           \
+       readl((void *)base + PIO2_##reg)
+#define pio2_writel(base,reg,value)                    \
+       writel((value), (void *)base + PIO2_##reg)
 
 #endif /* __CPU_AT32AP_PIO2_H__ */
index 01ac325ee8f60c372e87eacf24b927e7efa607e0..c78d547f85e00d06758dbdd7a5a819f141bf66b5 100644 (file)
 #include <asm/io.h>
 
 #include <asm/arch/memory-map.h>
-#include <asm/arch/platform.h>
 
 #include "sm.h"
 
-/* Sanity checks */
-#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB)          \
-       || (CFG_CLKDIV_HSB > CFG_CLKDIV_PBA)    \
-       || (CFG_CLKDIV_HSB > CFG_CLKDIV_PBB)
-# error Constraint fCPU >= fHSB >= fPB{A,B} violated
-#endif
-#if defined(CONFIG_PLL) && ((CFG_PLL0_MUL < 1) || (CFG_PLL0_DIV < 1))
-# error Invalid PLL multiplier and/or divider
-#endif
-
-DECLARE_GLOBAL_DATA_PTR;
-
-struct clock_domain_state {
-       const struct device *bridge;
-       unsigned long freq;
-       u32 mask;
-};
-static struct clock_domain_state ckd_state[NR_CLOCK_DOMAINS];
-
-int pm_enable_clock(enum clock_domain_id id, unsigned int index)
-{
-       const struct clock_domain *ckd = &chip_clock[id];
-       struct clock_domain_state *state = &ckd_state[id];
-
-       if (ckd->bridge != NO_DEVICE) {
-               state->bridge = get_device(ckd->bridge);
-               if (!state->bridge)
-                       return -EBUSY;
-       }
-
-       state->mask |= 1 << index;
-       if (gd->sm)
-               writel(state->mask, gd->sm->regs + ckd->reg);
-
-       return 0;
-}
-
-void pm_disable_clock(enum clock_domain_id id, unsigned int index)
-{
-       const struct clock_domain *ckd = &chip_clock[id];
-       struct clock_domain_state *state = &ckd_state[id];
-
-       state->mask &= ~(1 << index);
-       if (gd->sm)
-               writel(state->mask, gd->sm->regs + ckd->reg);
-
-       if (ckd->bridge)
-               put_device(state->bridge);
-}
-
-unsigned long pm_get_clock_freq(enum clock_domain_id domain)
-{
-       return ckd_state[domain].freq;
-}
-
-void pm_init(void)
-{
-       uint32_t cksel = 0;
-       unsigned long main_clock;
-
-       /* Make sure we don't disable any device we're already using */
-       get_device(DEVICE_HRAMC);
-       get_device(DEVICE_HEBI);
-
-       /* Enable the PICO as well */
-       ckd_state[CLOCK_CPU].mask |= 1;
-
-       gd->sm = get_device(DEVICE_SM);
-       if (!gd->sm)
-               panic("Unable to claim system manager device!\n");
-
-       /* Disable any devices that haven't been explicitly claimed */
-       sm_writel(gd->sm, PM_PBB_MASK, ckd_state[CLOCK_PBB].mask);
-       sm_writel(gd->sm, PM_PBA_MASK, ckd_state[CLOCK_PBA].mask);
-       sm_writel(gd->sm, PM_HSB_MASK, ckd_state[CLOCK_HSB].mask);
-       sm_writel(gd->sm, PM_CPU_MASK, ckd_state[CLOCK_CPU].mask);
 
 #ifdef CONFIG_PLL
-       /* Initialize the PLL */
-       main_clock = (CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL;
-
-       sm_writel(gd->sm, PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES)
-                                   | SM_BF(PLLMUL, CFG_PLL0_MUL - 1)
-                                   | SM_BF(PLLDIV, CFG_PLL0_DIV - 1)
-                                   | SM_BF(PLLOPT, CFG_PLL0_OPT)
-                                   | SM_BF(PLLOSC, 0)
-                                   | SM_BIT(PLLEN)));
-
-       /* Wait for lock */
-       while (!(sm_readl(gd->sm, PM_ISR) & SM_BIT(LOCK0))) ;
+#define MAIN_CLK_RATE ((CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL)
 #else
-       main_clock = CFG_OSC0_HZ;
+#define MAIN_CLK_RATE (CFG_OSC0_HZ)
 #endif
 
-       /* Set up clocks for the CPU and all peripheral buses */
-       if (CFG_CLKDIV_CPU) {
-               cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1);
-               ckd_state[CLOCK_CPU].freq = main_clock / (1 << CFG_CLKDIV_CPU);
-       } else {
-               ckd_state[CLOCK_CPU].freq = main_clock;
-       }
-       if (CFG_CLKDIV_HSB) {
-               cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1);
-               ckd_state[CLOCK_HSB].freq = main_clock / (1 << CFG_CLKDIV_HSB);
-       } else {
-               ckd_state[CLOCK_HSB].freq = main_clock;
-       }
-       if (CFG_CLKDIV_PBA) {
-               cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1);
-               ckd_state[CLOCK_PBA].freq = main_clock / (1 << CFG_CLKDIV_PBA);
-       } else {
-               ckd_state[CLOCK_PBA].freq = main_clock;
-       }
-       if (CFG_CLKDIV_PBB) {
-               cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1);
-               ckd_state[CLOCK_PBB].freq = main_clock / (1 << CFG_CLKDIV_PBB);
-       } else {
-               ckd_state[CLOCK_PBB].freq = main_clock;
-       }
-       sm_writel(gd->sm, PM_CKSEL, cksel);
-
-       /* CFG_HZ currently depends on cpu_hz */
-       gd->cpu_hz = ckd_state[CLOCK_CPU].freq;
+DECLARE_GLOBAL_DATA_PTR;
 
-#ifdef CONFIG_PLL
-       /* Use PLL0 as main clock */
-       sm_writel(gd->sm, PM_MCCTRL, SM_BIT(PLLSEL));
-#endif
-}
 
 #endif /* CFG_POWER_MANAGER */
index ce81ef0a4631b0bfc438852d5682f5d3439b96fc..6492c8e81d256c52443ab526fa41476bdd9c5222 100644 (file)
         | SM_BF(name,value))
 
 /* Register access macros */
-#define sm_readl(port,reg)                             \
-       readl((port)->regs + SM_##reg)
-#define sm_writel(port,reg,value)                      \
-       writel((value), (port)->regs + SM_##reg)
+#define sm_readl(reg)                                  \
+       readl((void *)SM_BASE + SM_##reg)
+#define sm_writel(reg,value)                           \
+       writel((value), (void *)SM_BASE + SM_##reg)
 
 #endif /* __CPU_AT32AP_SM_H__ */
index 79ee33b1fac0d028eabd118ad831d4cbbacd9e7d..ab8c2b73d8933737f67000119ee4f3412aa5a346 100644 (file)
@@ -70,32 +70,12 @@ _start:
 
 2:     lddpc   sp, sp_init
 
-       /*
-        * Relocate the data section and initialize .bss.  Everything
-        * is guaranteed to be at least doubleword aligned by the
-        * linker script.
-        */
-       lddpc   r12, .Ldata_vma
-       lddpc   r11, .Ldata_lma
-       lddpc   r10, .Ldata_end
-       sub     r10, r12
-4:     ld.d    r8, r11++
-       sub     r10, 8
-       st.d    r12++, r8
-       brne    4b
-
-       mov     r8, 0
-       mov     r9, 0
-       lddpc   r10, .Lbss_end
-       sub     r10, r12
-4:     sub     r10, 8
-       st.d    r12++, r8
-       brne    4b
-
        /* Initialize the GOT pointer */
        lddpc   r6, got_init
 3:     rsub    r6, pc
-       ld.w    pc, r6[start_u_boot@got]
+
+       /* Let's go */
+       rjmp    board_init_f
 
        .align  2
        .type   sp_init,@object
@@ -103,11 +83,82 @@ sp_init:
        .long   CFG_INIT_SP_ADDR
 got_init:
        .long   3b - _GLOBAL_OFFSET_TABLE_
-.Ldata_lma:
-       .long   __data_lma
-.Ldata_vma:
-       .long   _data
-.Ldata_end:
-       .long   _edata
-.Lbss_end:
-       .long   _end
+
+       /*
+        * void relocate_code(new_sp, new_gd, monitor_addr)
+        *
+        * Relocate the u-boot image into RAM and continue from there.
+        * Does not return.
+        */
+       .global relocate_code
+       .type   relocate_code,@function
+relocate_code:
+       mov     sp, r12         /* use new stack */
+       mov     r12, r11        /* save new_gd */
+       mov     r11, r10        /* save destination address */
+
+       /* copy .text section and flush the cache along the way */
+       lda.w   r8, _text
+       lda.w   r9, _etext
+       sub     lr, r10, r8     /* relocation offset */
+
+1:     ldm     r8++, r0-r3
+       stm     r10, r0-r3
+       sub     r10, -16
+       ldm     r8++, r0-r3
+       stm     r10, r0-r3
+       sub     r10, -16
+       cp.w    r8, r9
+       cache   r10[-4], 0x0d   /* dcache clean/invalidate */
+       cache   r10[-4], 0x01   /* icache invalidate */
+       brlt    1b
+
+       /* flush write buffer */
+       sync    0
+
+       /* copy data sections */
+       lda.w   r9, _edata
+1:     ld.d    r0, r8++
+       st.d    r10++, r0
+       cp.w    r8, r9
+       brlt    1b
+
+       /* zero out .bss */
+       mov     r0, 0
+       mov     r1, 0
+       lda.w   r9, _end
+       sub     r9, r8
+1:     st.d    r10++, r0
+       sub     r9, 8
+       brgt    1b
+
+       /* jump to RAM */
+       sub     r0, pc, . - in_ram
+       add     pc, r0, lr
+
+       .align  2
+in_ram:
+       /* find the new GOT and relocate it */
+       lddpc   r6, got_init_reloc
+3:     rsub    r6, pc
+       mov     r8, r6
+       lda.w   r9, _egot
+       lda.w   r10, _got
+       sub     r9, r10
+1:     ld.w    r0, r8[0]
+       add     r0, lr
+       st.w    r8++, r0
+       sub     r9, 4
+       brgt    1b
+
+       /* Move the exception handlers */
+       mfsr    r2, SYSREG_EVBA
+       add     r2, lr
+       mtsr    SYSREG_EVBA, r2
+
+       /* Do the rest of the initialization sequence */
+       call    board_init_r
+
+       .align  2
+got_init_reloc:
+       .long   3b - _GLOBAL_OFFSET_TABLE_
index 9f4a0d8014832dbb61306a024abe775cfa4511c0..dd4f299acd01d3483267264681d67112c1b920cc 100644 (file)
@@ -1,6 +1,6 @@
 # U-boot - Makefile
 #
-# Copyright (c) 2005 blackfin.uclinux.org
+# Copyright (c) 2005-2007 Analog Devices Inc.
 #
 # (C) Copyright 2000-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # 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
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
 #
 
 include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(CPU).a
 
-START  = start.o start1.o interrupt.o cache.o cplbhdlr.o cplbmgr.o flush.o
-COBJS  = cpu.o traps.o ints.o serial.o interrupts.o
+START  = start.o start1.o interrupt.o cache.o flush.o init_sdram.o
+COBJS  = cpu.o traps.o ints.o serial.o interrupts.o video.o
+
+EXTRA = init_sdram_bootrom_initblock.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
 START  := $(addprefix $(obj),$(START))
 
-all:   $(obj).depend $(START) $(LIB)
+all:   $(obj).depend $(START) $(LIB) $(obj).depend $(EXTRA)
 
 $(LIB):        $(OBJS)
        $(AR) $(ARFLAGS) $@ $(OBJS)
index d430e6cabd9da9cf0ae40558fdc30b7eb451d9c2..25b96a9f69338e7e509d7e9e27d41fedbf818e58 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - bf533_serial.h Serial Driver defines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver.
@@ -38,8 +38,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _Bf533_SERIAL_H
@@ -63,8 +63,7 @@ int serial_getc(void);
 void serial_puts(const char *s);
 static void local_put_char(char ch);
 
-extern int get_clock(void);
-int baud_table[5] = {9600, 19200, 38400, 57600, 115200};
+int baud_table[5] = { 9600, 19200, 38400, 57600, 115200 };
 
 struct {
        unsigned char dl_high;
index 8fac402740560c1fce058d935ef72143a71471df..03aebe4b4c596a828d70263280b62acecbbf0225 100644 (file)
@@ -1,12 +1,11 @@
-
-
 #define ASSEMBLY
 #include <asm/linkage.h>
-#include <asm/cpu/def_LPBlackfin.h>
+#include <config.h>
+#include <asm/blackfin.h>
 
 .text
 .align 2
-ENTRY(blackfin_icache_flush_range)
+ENTRY(_blackfin_icache_flush_range)
        R2 = -32;
        R2 = R0 & R2;
        P0 = R2;
@@ -20,7 +19,7 @@ ENTRY(blackfin_icache_flush_range)
        SSYNC;
        RTS;
 
-ENTRY(blackfin_dcache_flush_range)
+ENTRY(_blackfin_dcache_flush_range)
        R2 = -32;
        R2 = R0 & R2;
        P0 = R2;
@@ -35,19 +34,21 @@ ENTRY(blackfin_dcache_flush_range)
        RTS;
 
 ENTRY(_icache_invalidate)
-ENTRY(invalidate_entire_icache)
-       [--SP] = ( R7:5);
+ENTRY(_invalidate_entire_icache)
+       [--SP] = (R7:5);
 
        P0.L = (IMEM_CONTROL & 0xFFFF);
        P0.H = (IMEM_CONTROL >> 16);
-       R7 = [P0];
+       R7 =[P0];
 
-       /* Clear the IMC bit , All valid bits in the instruction
+       /*
+        * Clear the IMC bit , All valid bits in the instruction
         * cache are set to the invalid state
         */
-       BITCLR(R7,IMC_P);
+       BITCLR(R7, IMC_P);
        CLI R6;
-       SSYNC;          /* SSYNC required before invalidating cache. */
+       /* SSYNC required before invalidating cache. */
+       SSYNC;
        .align 8;
        [P0] = R7;
        SSYNC;
@@ -58,54 +59,55 @@ ENTRY(invalidate_entire_icache)
        R7 = R7 | R6;
 
        CLI R6;
-       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
+       SSYNC;
        .align 8;
        [P0] = R7;
        SSYNC;
        STI R6;
 
-       ( R7:5) = [SP++];
+       (R7:5) =[SP++];
        RTS;
 
-/* Invalidate the Entire Data cache by
+/*
+ * Invalidate the Entire Data cache by
  * clearing DMC[1:0] bits
  */
-ENTRY(invalidate_entire_dcache)
+ENTRY(_invalidate_entire_dcache)
 ENTRY(_dcache_invalidate)
-       [--SP] = ( R7:6);
+       [--SP] = (R7:6);
 
        P0.L = (DMEM_CONTROL & 0xFFFF);
        P0.H = (DMEM_CONTROL >> 16);
-       R7 = [P0];
+       R7 =[P0];
 
-       /* Clear the DMC[1:0] bits, All valid bits in the data
+       /*
+        * Clear the DMC[1:0] bits, All valid bits in the data
         * cache are set to the invalid state
         */
-       BITCLR(R7,DMC0_P);
-       BITCLR(R7,DMC1_P);
+       BITCLR(R7, DMC0_P);
+       BITCLR(R7, DMC1_P);
        CLI R6;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
+       SSYNC;
        .align 8;
        [P0] = R7;
        SSYNC;
        STI R6;
-
        /* Configures the data cache again */
 
        R6 = (ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
        R7 = R7 | R6;
 
        CLI R6;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
+       SSYNC;
        .align 8;
        [P0] = R7;
        SSYNC;
        STI R6;
 
-       ( R7:6) = [SP++];
+       (R7:6) =[SP++];
        RTS;
 
-ENTRY(blackfin_dcache_invalidate_range)
+ENTRY(_blackfin_dcache_invalidate_range)
        R2 = -32;
        R2 = R0 & R2;
        P0 = R2;
@@ -113,13 +115,14 @@ ENTRY(blackfin_dcache_invalidate_range)
        CSYNC;
 1:
        FLUSHINV[P0++];
-       CC = P0 < P1 (iu);
-       IF CC JUMP 1b (bp);
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
 
-       /* If the data crosses a cache line, then we'll be pointing to
-       ** the last cache line, but won't have flushed/invalidated it yet, so do
-       ** one more.
-       */
+       /*
+        * If the data crosses a cache line, then we'll be pointing to
+        * the last cache line, but won't have flushed/invalidated it yet, so do
+        * one more.
+        */
        FLUSHINV[P0];
        SSYNC;
        RTS;
index a9d529ecd88f2a87bac7239a281def15c57dcc93..6a713c3f51faaef9d60a859ecc9eb257cc87e66f 100644 (file)
@@ -1,6 +1,6 @@
 # U-boot - config.mk
 #
-# Copyright (c) 2005 blackfin.uclinux.org
+# Copyright (c) 2005-2007 Analog Devices Inc.
 #
 # (C) Copyright 2000-2004
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -20,8 +20,8 @@
 #
 # 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
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
 #
 
-PLATFORM_RELFLAGS += -ffixed-P5
+PLATFORM_RELFLAGS += -mcpu=bf533 -ffixed-P5
diff --git a/cpu/bf533/cplbhdlr.S b/cpu/bf533/cplbhdlr.S
deleted file mode 100644 (file)
index 61be5bb..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Copyright (C) 2003 Analog Devices, Inc. All Rights Reserved.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.
- *
- * Blackfin BF533/2.6 support : LG Soft India
- */
-
-
-/* Include an exception handler to invoke the CPLB manager
- */
-
-#include <asm-blackfin/linkage.h>
-#include <asm/cplb.h>
-#include <asm/entry.h>
-
-
-.text
-
-.globl _cplb_hdr;
-.type _cplb_hdr, STT_FUNC;
-.extern _cplb_mgr;
-.type _cplb_mgr, STT_FUNC;
-.extern __unknown_exception_occurred;
-.type __unknown_exception_occurred, STT_FUNC;
-.extern __cplb_miss_all_locked;
-.type __cplb_miss_all_locked, STT_FUNC;
-.extern __cplb_miss_without_replacement;
-.type __cplb_miss_without_replacement, STT_FUNC;
-.extern __cplb_protection_violation;
-.type __cplb_protection_violation, STT_FUNC;
-.extern panic_pv;
-
-.align 2;
-
-ENTRY(_cplb_hdr)
-       SSYNC;
-       [--SP] = ( R7:0, P5:0 );
-       [--SP] = ASTAT;
-       [--SP] = SEQSTAT;
-       [--SP] = I0;
-       [--SP] = I1;
-       [--SP] = I2;
-       [--SP] = I3;
-       [--SP] = LT0;
-       [--SP] = LB0;
-       [--SP] = LC0;
-       [--SP] = LT1;
-       [--SP] = LB1;
-       [--SP] = LC1;
-       R2 = SEQSTAT;
-
-       /*Mask the contents of SEQSTAT and leave only EXCAUSE in R2*/
-       R2 <<= 26;
-       R2 >>= 26;
-
-       R1 = 0x23; /* Data access CPLB protection violation */
-       CC = R2 == R1;
-       IF !CC JUMP not_data_write;
-       R0 = 2;         /* is a write to data space*/
-       JUMP is_icplb_miss;
-
-not_data_write:
-       R1 = 0x2C; /* CPLB miss on an instruction fetch */
-       CC = R2 == R1;
-       R0 = 0;         /* is_data_miss == False*/
-       IF CC JUMP is_icplb_miss;
-
-       R1 = 0x26;
-       CC = R2 == R1;
-       IF !CC JUMP unknown;
-
-       R0 = 1;         /* is_data_miss == True*/
-
-is_icplb_miss:
-
-#if ( defined (CONFIG_BLKFIN_CACHE) || defined (CONFIG_BLKFIN_DCACHE))
-#if ( defined (CONFIG_BLKFIN_CACHE) && !defined (CONFIG_BLKFIN_DCACHE))
-       R1 = CPLB_ENABLE_ICACHE;
-#endif
-#if ( !defined (CONFIG_BLKFIN_CACHE) && defined (CONFIG_BLKFIN_DCACHE))
-       R1 = CPLB_ENABLE_DCACHE;
-#endif
-#if ( defined (CONFIG_BLKFIN_CACHE) && defined (CONFIG_BLKFIN_DCACHE))
-       R1 = CPLB_ENABLE_DCACHE | CPLB_ENABLE_ICACHE;
-#endif
-#else
-       R1 = 0;
-#endif
-
-       [--SP] = RETS;
-       CALL _cplb_mgr;
-       RETS = [SP++];
-       CC = R0 == 0;
-       IF !CC JUMP not_replaced;
-       LC1 = [SP++];
-       LB1 = [SP++];
-       LT1 = [SP++];
-       LC0 = [SP++];
-       LB0 = [SP++];
-       LT0 = [SP++];
-       I3 = [SP++];
-       I2 = [SP++];
-       I1 = [SP++];
-       I0 = [SP++];
-       SEQSTAT = [SP++];
-       ASTAT = [SP++];
-       ( R7:0, P5:0 ) = [SP++];
-       RTS;
-
-unknown:
-       [--SP] = RETS;
-       CALL __unknown_exception_occurred;
-       RETS = [SP++];
-       JUMP unknown;
-not_replaced:
-       CC = R0 == CPLB_NO_UNLOCKED;
-       IF !CC JUMP next_check;
-       [--SP] = RETS;
-       CALL __cplb_miss_all_locked;
-       RETS = [SP++];
-next_check:
-       CC = R0 == CPLB_NO_ADDR_MATCH;
-       IF !CC JUMP next_check2;
-       [--SP] = RETS;
-       CALL __cplb_miss_without_replacement;
-       RETS = [SP++];
-       JUMP not_replaced;
-next_check2:
-       CC = R0 == CPLB_PROT_VIOL;
-       IF !CC JUMP strange_return_from_cplb_mgr;
-       [--SP] = RETS;
-       CALL __cplb_protection_violation;
-       RETS = [SP++];
-       JUMP not_replaced;
-strange_return_from_cplb_mgr:
-       IDLE;
-       CSYNC;
-       JUMP strange_return_from_cplb_mgr;
-
-/************************************
- * Diagnostic exception handlers
- */
-
-__cplb_miss_all_locked:
-       sp += -12;
-       R0 = CPLB_NO_UNLOCKED;
-       call panic_bfin;
-       SP += 12;
-       RTS;
-
- __cplb_miss_without_replacement:
-       sp += -12;
-       R0 = CPLB_NO_ADDR_MATCH;
-       call panic_bfin;
-       SP += 12;
-       RTS;
-
-__cplb_protection_violation:
-       sp += -12;
-       R0 = CPLB_PROT_VIOL;
-       call panic_bfin;
-       SP += 12;
-       RTS;
-
-__unknown_exception_occurred:
-
-       /* This function is invoked by the default exception
-        * handler, if it does not recognise the kind of
-        * exception that has occurred. In other words, the
-        * default handler only handles some of the system's
-        * exception types, and it does not expect any others
-        * to occur. If your application is going to be using
-        * other kinds of exceptions, you must replace the
-        * default handler with your own, that handles all the
-        * exceptions you will use.
-        *
-        * Since there's nothing we can do, we just loop here
-        * at what we hope is a suitably informative label.
-        */
-
-       IDLE;
-do_not_know_what_to_do:
-       CSYNC;
-       JUMP __unknown_exception_occurred;
-
-       RTS;
-.__unknown_exception_occurred.end:
-.global __unknown_exception_occurred;
-.type __unknown_exception_occurred, STT_FUNC;
-
-panic_bfin:
-       RTS;
diff --git a/cpu/bf533/cplbmgr.S b/cpu/bf533/cplbmgr.S
deleted file mode 100644 (file)
index 7a0b048..0000000
+++ /dev/null
@@ -1,601 +0,0 @@
-/*This file is subject to the terms and conditions of the GNU General Public
- * License.
- *
- * Blackfin BF533/2.6 support : LG Soft India
- * Modification: Dec 07 2004
- *     1. Correction in icheck_lock.  Valid lock entries were
- *        geting victimized, for instruction cplb replacement.
- *     2. Setup loop's are modified as now toolchain support's P Indexed
- *        addressing
- *        :LG Soft India
- *
- */
-
-/* Usage: int _cplb_mgr(is_data_miss,int enable_cache)
- * is_data_miss==2 => Mark as Dirty, write to the clean data page
- * is_data_miss==1 => Replace a data CPLB.
- * is_data_miss==0 => Replace an instruction CPLB.
- *
- * Returns:
- * CPLB_RELOADED       => Successfully updated CPLB table.
- * CPLB_NO_UNLOCKED    => All CPLBs are locked, so cannot be evicted.This indicates
- *                             that the CPLBs in the configuration tablei are badly
- *                             configured, as this should never occur.
- * CPLB_NO_ADDR_MATCH  => The address being accessed, that triggered the exception,
- *                             is not covered by any of the CPLBs in the configuration
- *                             table. The application isi presumably misbehaving.
- * CPLB_PROT_VIOL      => The address being accessed, that triggered thei exception,
- *                             was not a first-write to a clean Write Back Data page,
- *                             and so presumably is a genuine violation of the page's
- *                             protection attributes. The application is misbehaving.
- */
-#define ASSEMBLY
-
-#include <asm-blackfin/linkage.h>
-#include <asm-blackfin/blackfin.h>
-#include <asm-blackfin/cplbtab.h>
-#include <asm-blackfin/cplb.h>
-
-.text
-
-.align 2;
-ENTRY(_cplb_mgr)
-
-       [--SP]=( R7:0,P5:0 );
-
-       CC = R0 == 2;
-       IF CC JUMP dcplb_write;
-
-       CC = R0 == 0;
-       IF !CC JUMP dcplb_miss_compare;
-
-       /* ICPLB Miss Exception. We need to choose one of the
-       * currently-installed CPLBs, and replace it with one
-       * from the configuration table.
-       */
-
-       P4.L = (ICPLB_FAULT_ADDR & 0xFFFF);
-       P4.H = (ICPLB_FAULT_ADDR >> 16);
-
-       P1 = 16;
-       P5.L = page_size_table;
-       P5.H = page_size_table;
-
-       P0.L = (ICPLB_DATA0 & 0xFFFF);
-       P0.H = (ICPLB_DATA0 >> 16);
-       R4 = [P4];              /* Get faulting address*/
-       R6 = 64;                /* Advance past the fault address, which*/
-       R6 = R6 + R4;           /* we'll use if we find a match*/
-       R3 = ((16 << 8) | 2);   /* Extract mask, bits 16 and 17.*/
-
-       R5 = 0;
-isearch:
-
-       R1 = [P0-0x100];        /* Address for this CPLB */
-
-       R0 = [P0++];            /* Info for this CPLB*/
-       CC = BITTST(R0,0);      /* Is the CPLB valid?*/
-       IF !CC JUMP nomatch;    /* Skip it, if not.*/
-       CC = R4 < R1(IU);       /* If fault address less than page start*/
-       IF CC JUMP nomatch;     /* then skip this one.*/
-       R2 = EXTRACT(R0,R3.L) (Z);      /* Get page size*/
-       P1 = R2;
-       P1 = P5 + (P1<<2);      /* index into page-size table*/
-       R2 = [P1];              /* Get the page size*/
-       R1 = R1 + R2;           /* and add to page start, to get page end*/
-       CC = R4 < R1(IU);       /* and see whether fault addr is in page.*/
-       IF !CC R4 = R6;         /* If so, advance the address and finish loop.*/
-       IF !CC JUMP isearch_done;
-nomatch:
-       /* Go around again*/
-       R5 += 1;
-       CC = BITTST(R5, 4);     /* i.e CC = R5 >= 16*/
-       IF !CC JUMP isearch;
-
-isearch_done:
-       I0 = R4;                /* Fault address we'll search for*/
-
-       /* set up pointers */
-       P0.L = (ICPLB_DATA0 & 0xFFFF);
-       P0.H = (ICPLB_DATA0 >> 16);
-
-       /* The replacement procedure for ICPLBs */
-
-       P4.L = (IMEM_CONTROL & 0xFFFF);
-       P4.H = (IMEM_CONTROL >> 16);
-
-       /* disable cplbs */
-       R5 = [P4];              /* Control Register*/
-       BITCLR(R5,ENICPLB_P);
-       CLI R1;
-       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
-       .align 8;
-       [P4] = R5;
-       SSYNC;
-       STI R1;
-
-       R1 = -1;                /* end point comparison */
-       R3 = 16;                /* counter */
-
-       /* Search through CPLBs for first non-locked entry */
-       /* Overwrite it by moving everyone else up by 1 */
-icheck_lock:
-       R0 = [P0++];
-       R3 = R3 + R1;
-       CC = R3 == R1;
-       IF CC JUMP all_locked;
-       CC = BITTST(R0, 0);             /* an invalid entry is good */
-       IF !CC JUMP ifound_victim;
-       CC = BITTST(R0,1);              /* but a locked entry isn't */
-       IF CC JUMP icheck_lock;
-
-ifound_victim:
-#ifdef CONFIG_CPLB_INFO
-       R7 = [P0 - 0x104];
-       P2.L = ipdt_table;
-       P2.H = ipdt_table;
-       P3.L = ipdt_swapcount_table;
-       P3.H = ipdt_swapcount_table;
-       P3 += -4;
-icount:
-       R2 = [P2];      /* address from config table */
-       P2 += 8;
-       P3 += 8;
-       CC = R2==-1;
-       IF CC JUMP icount_done;
-       CC = R7==R2;
-       IF !CC JUMP icount;
-       R7 = [P3];
-       R7 += 1;
-       [P3] = R7;
-       CSYNC;
-icount_done:
-#endif
-       LC0=R3;
-       LSETUP(is_move,ie_move) LC0;
-is_move:
-       R0 = [P0];
-       [P0 - 4] = R0;
-       R0 = [P0 - 0x100];
-       [P0-0x104] = R0;
-ie_move:P0+=4;
-
-       /* We've made space in the ICPLB table, so that ICPLB15
-        * is now free to be overwritten. Next, we have to determine
-        * which CPLB we need to install, from the configuration
-        * table. This is a matter of getting the start-of-page
-        * addresses and page-lengths from the config table, and
-        * determining whether the fault address falls within that
-        * range.
-        */
-
-       P2.L = ipdt_table;
-       P2.H = ipdt_table;
-#ifdef CONFIG_CPLB_INFO
-       P3.L = ipdt_swapcount_table;
-       P3.H = ipdt_swapcount_table;
-       P3 += -8;
-#endif
-       P0.L = page_size_table;
-       P0.H = page_size_table;
-
-       /* Retrieve our fault address (which may have been advanced
-        * because the faulting instruction crossed a page boundary).
-        */
-
-       R0 = I0;
-
-       /* An extraction pattern, to get the page-size bits from
-        * the CPLB data entry. Bits 16-17, so two bits at posn 16.
-        */
-
-       R1 = ((16<<8)|2);
-inext: R4 = [P2++];    /* address from config table */
-       R2 = [P2++];    /* data from config table */
-#ifdef CONFIG_CPLB_INFO
-       P3 += 8;
-#endif
-
-       CC = R4 == -1;  /* End of config table*/
-       IF CC JUMP no_page_in_table;
-
-       /* See if failed address > start address */
-       CC = R4 <= R0(IU);
-       IF !CC JUMP inext;
-
-       /* extract page size (17:16)*/
-       R3 = EXTRACT(R2, R1.L) (Z);
-
-       /* add page size to addr to get range */
-
-       P5 = R3;
-       P5 = P0 + (P5 << 2);    /* scaled, for int access*/
-       R3 = [P5];
-       R3 = R3 + R4;
-
-       /* See if failed address < (start address + page size) */
-       CC = R0 < R3(IU);
-       IF !CC JUMP inext;
-
-       /* We've found a CPLB in the config table that covers
-        * the faulting address, so install this CPLB into the
-        * last entry of the table.
-        */
-
-       P1.L = (ICPLB_DATA15 & 0xFFFF);         /*ICPLB_DATA15*/
-       P1.H = (ICPLB_DATA15 >> 16);
-       [P1] = R2;
-       [P1-0x100] = R4;
-#ifdef CONFIG_CPLB_INFO
-       R3 = [P3];
-       R3 += 1;
-       [P3] = R3;
-#endif
-
-       /* P4 points to IMEM_CONTROL, and R5 contains its old
-        * value, after we disabled ICPLBS. Re-enable them.
-        */
-
-       BITSET(R5,ENICPLB_P);
-       CLI R2;
-       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
-       .align 8;
-       [P4] = R5;
-       SSYNC;
-       STI R2;
-
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_RELOADED;
-       RTS;
-
-/* FAILED CASES*/
-no_page_in_table:
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_NO_ADDR_MATCH;
-       RTS;
-all_locked:
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_NO_UNLOCKED;
-       RTS;
-prot_violation:
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_PROT_VIOL;
-       RTS;
-
-dcplb_write:
-
-       /* if a DCPLB is marked as write-back (CPLB_WT==0), and
-        * it is clean (CPLB_DIRTY==0), then a write to the
-        * CPLB's page triggers a protection violation. We have to
-        * mark the CPLB as dirty, to indicate that there are
-        * pending writes associated with the CPLB.
-        */
-
-       P4.L = (DCPLB_STATUS & 0xFFFF);
-       P4.H = (DCPLB_STATUS >> 16);
-       P3.L = (DCPLB_DATA0 & 0xFFFF);
-       P3.H = (DCPLB_DATA0 >> 16);
-       R5 = [P4];
-
-       /* A protection violation can be caused by more than just writes
-        * to a clean WB page, so we have to ensure that:
-        * - It's a write
-        * - to a clean WB page
-        * - and is allowed in the mode the access occurred.
-        */
-
-       CC = BITTST(R5, 16);    /* ensure it was a write*/
-       IF !CC JUMP prot_violation;
-
-       /* to check the rest, we have to retrieve the DCPLB.*/
-
-       /* The low half of DCPLB_STATUS is a bit mask*/
-
-       R2 = R5.L (Z);  /* indicating which CPLB triggered the event.*/
-       R3 = 30;        /* so we can use this to determine the offset*/
-       R2.L = SIGNBITS R2;
-       R2 = R2.L (Z);  /* into the DCPLB table.*/
-       R3 = R3 - R2;
-       P4 = R3;
-       P3 = P3 + (P4<<2);
-       R3 = [P3];      /* Retrieve the CPLB*/
-
-       /* Now we can check whether it's a clean WB page*/
-
-       CC = BITTST(R3, 14);    /* 0==WB, 1==WT*/
-       IF CC JUMP prot_violation;
-       CC = BITTST(R3, 7);     /* 0 == clean, 1 == dirty*/
-       IF CC JUMP prot_violation;
-
-       /* Check whether the write is allowed in the mode that was active.*/
-
-       R2 = 1<<3;              /* checking write in user mode*/
-       CC = BITTST(R5, 17);    /* 0==was user, 1==was super*/
-       R5 = CC;
-       R2 <<= R5;              /* if was super, check write in super mode*/
-       R2 = R3 & R2;
-       CC = R2 == 0;
-       IF CC JUMP prot_violation;
-
-       /* It's a genuine write-to-clean-page.*/
-
-       BITSET(R3, 7);          /* mark as dirty*/
-       [P3] = R3;              /* and write back.*/
-       CSYNC;
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_RELOADED;
-       RTS;
-
-dcplb_miss_compare:
-
-       /* Data CPLB Miss event. We need to choose a CPLB to
-        * evict, and then locate a new CPLB to install from the
-        * config table, that covers the faulting address.
-        */
-
-       P1.L = (DCPLB_DATA15 & 0xFFFF);
-       P1.H = (DCPLB_DATA15 >> 16);
-
-       P4.L = (DCPLB_FAULT_ADDR & 0xFFFF);
-       P4.H = (DCPLB_FAULT_ADDR >> 16);
-       R4 = [P4];
-       I0 = R4;
-
-       /* The replacement procedure for DCPLBs*/
-
-       R6 = R1;        /* Save for later*/
-
-       /* Turn off CPLBs while we work.*/
-       P4.L = (DMEM_CONTROL & 0xFFFF);
-       P4.H = (DMEM_CONTROL >> 16);
-       R5 = [P4];
-       BITCLR(R5,ENDCPLB_P);
-       CLI R0;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
-       .align 8;
-       [P4] = R5;
-       SSYNC;
-       STI R0;
-
-       /* Start looking for a CPLB to evict. Our order of preference
-        * is: invalid CPLBs, clean CPLBs, dirty CPLBs. Locked CPLBs
-        * are no good.
-        */
-
-       I1.L = (DCPLB_DATA0 & 0xFFFF);
-       I1.H = (DCPLB_DATA0 >> 16);
-       P1 = 3;
-       P2 = 16;
-       I2.L = dcplb_preference;
-       I2.H = dcplb_preference;
-       LSETUP(sdsearch1, edsearch1) LC0 = P1;
-sdsearch1:
-       R0 = [I2++];            /* Get the bits we're interested in*/
-       P0 = I1;                /* Go back to start of table*/
-       LSETUP (sdsearch2, edsearch2) LC1 = P2;
-sdsearch2:
-       R1 = [P0++];            /* Fetch each installed CPLB in turn*/
-       R2 = R1 & R0;           /* and test for interesting bits.*/
-       CC = R2 == 0;           /* If none are set, it'll do.*/
-       IF !CC JUMP skip_stack_check;
-
-       R2 = [P0 - 0x104];      /* R2 - PageStart */
-       P3.L = page_size_table; /* retrive end address */
-       P3.H = page_size_table; /* retrive end address */
-       R3 = 0x2;               /* 0th - position, 2 bits -length */
-       nop;                    /*Anamoly 05000209*/
-       R7 = EXTRACT(R1,R3.l);
-       R7 = R7 << 2;           /* Page size index offset */
-       P5 = R7;
-       P3 = P3 + P5;
-       R7 = [P3];              /* page size in 1K bytes */
-
-       R7 = R7 << 0xA;         /* in bytes * 1024*/
-       R7 = R2 + R7;           /* R7 - PageEnd */
-       R4 = SP;                /* Test SP is in range */
-
-       CC = R7 < R4;           /* if PageEnd < SP */
-       IF CC JUMP dfound_victim;
-       R3 = 0x284;             /* stack length from start of trap till the point */
-                               /* 20 stack locations for future modifications */
-       R4 = R4 + R3;
-       CC = R4 < R2;           /* if SP + stacklen < PageStart */
-       IF CC JUMP dfound_victim;
-skip_stack_check:
-
-edsearch2: NOP;
-edsearch1: NOP;
-
-       /* If we got here, we didn't find a DCPLB we considered
-        * replacable, which means all of them were locked.
-        */
-
-       JUMP all_locked;
-dfound_victim:
-
-#ifdef CONFIG_CPLB_INFO
-       R1 = [P0 - 0x104];
-       P2.L = dpdt_table;
-       P2.H = dpdt_table;
-       P3.L = dpdt_swapcount_table;
-       P3.H = dpdt_swapcount_table;
-       P3 += -4;
-dicount:
-       R2 = [P2];
-       P2 += 8;
-       P3 += 8;
-       CC = R2==-1;
-       IF CC JUMP dicount_done;
-       CC = R1==R2;
-       IF !CC JUMP dicount;
-       R1 = [P3];
-       R1 += 1;
-       [P3] = R1;
-       CSYNC;
-dicount_done:
-#endif
-
-       /* Clean down the hardware loops*/
-       R2 = 0;
-       LC1 = R2;
-       LC0 = R2;
-
-       /* There's a suitable victim in [P0-4] (because we've
-        * advanced already). If it's a valid dirty write-back
-        * CPLB, we need to flush the pending writes first.
-        */
-
-       CC = BITTST(R1, 0);     /* Is it valid?*/
-       IF !CC JUMP Ddoverwrite;/* nope.*/
-       CC = BITTST(R1, 7);     /* Is it dirty?*/
-       IF !CC JUMP Ddoverwrite (BP);   /* Nope.*/
-       CC = BITTST(R1, 14);    /* Is it Write-Through?*/
-       IF CC JUMP Ddoverwrite; /* Yep*/
-
-       /* This is a dirty page, so we need to flush all writes
-        * that are pending on the page.
-        */
-
-       /* Retrieve the page start address*/
-       R0 = [P0 - 0x104];
-       [--sp] = rets;
-       CALL dcplb_flush;       /* R0==CPLB addr, R1==CPLB data*/
-       rets = [sp++];
-Ddoverwrite:
-
-       /* [P0-4] is a suitable victim CPLB, so we want to
-        * overwrite it by moving all the following CPLBs
-        * one space closer to the start.
-        */
-
-       R1.L = ((DCPLB_DATA15+4) & 0xFFFF);             /*DCPLB_DATA15+4*/
-       R1.H = ((DCPLB_DATA15+4) >> 16);
-       R0 = P0;
-
-       /* If the victim happens to be in DCPLB15,
-        * we don't need to move anything.
-        */
-
-       CC = R1 == R0;
-       IF CC JUMP de_moved;
-       R1 = R1 - R0;
-       R1 >>= 2;
-       P1 = R1;
-       LSETUP(ds_move, de_move) LC0=P1;
-ds_move:
-        R0 = [P0++];   /* move data */
-       [P0 - 8] = R0;
-       R0 = [P0-0x104] /* move address */
-de_move: [P0-0x108] = R0;
-
-       /* We've now made space in DCPLB15 for the new CPLB to be
-        * installed. The next stage is to locate a CPLB in the
-        * config table that covers the faulting address.
-        */
-
-de_moved:NOP;
-       R0 = I0;                /* Our faulting address */
-
-       P2.L = dpdt_table;
-       P2.H = dpdt_table;
-#ifdef CONFIG_CPLB_INFO
-       P3.L = dpdt_swapcount_table;
-       P3.H = dpdt_swapcount_table;
-       P3 += -8;
-#endif
-
-       P1.L = page_size_table;
-       P1.H = page_size_table;
-
-       /* An extraction pattern, to retrieve bits 17:16.*/
-
-       R1 = (16<<8)|2;
-dnext: R4 = [P2++];    /* address */
-       R2 = [P2++];    /* data */
-#ifdef CONFIG_CPLB_INFO
-       P3 += 8;
-#endif
-
-       CC = R4 == -1;
-       IF CC JUMP no_page_in_table;
-
-       /* See if failed address > start address */
-       CC = R4 <= R0(IU);
-       IF !CC JUMP dnext;
-
-       /* extract page size (17:16)*/
-       R3 = EXTRACT(R2, R1.L) (Z);
-
-       /* add page size to addr to get range */
-
-       P5 = R3;
-       P5 = P1 + (P5 << 2);
-       R3 = [P5];
-       R3 = R3 + R4;
-
-       /* See if failed address < (start address + page size) */
-       CC = R0 < R3(IU);
-       IF !CC JUMP dnext;
-
-       /* We've found the CPLB that should be installed, so
-        * write it into CPLB15, masking off any caching bits
-        * if necessary.
-        */
-
-       P1.L = (DCPLB_DATA15 & 0xFFFF);
-       P1.H = (DCPLB_DATA15 >> 16);
-
-       /* If the DCPLB has cache bits set, but caching hasn't
-        * been enabled, then we want to mask off the cache-in-L1
-        * bit before installing. Moreover, if caching is off, we
-        * also want to ensure that the DCPLB has WT mode set, rather
-        * than WB, since WB pages still trigger first-write exceptions
-        * even when not caching is off, and the page isn't marked as
-        * cachable. Finally, we could mark the page as clean, not dirty,
-        * but we choose to leave that decision to the user; if the user
-        * chooses to have a CPLB pre-defined as dirty, then they always
-        * pay the cost of flushing during eviction, but don't pay the
-        * cost of first-write exceptions to mark the page as dirty.
-        */
-
-#ifdef CONFIG_BLKFIN_WT
-       BITSET(R6, 14);         /* Set WT*/
-#endif
-
-       [P1] = R2;
-       [P1-0x100] = R4;
-#ifdef CONFIG_CPLB_INFO
-       R3 = [P3];
-       R3 += 1;
-       [P3] = R3;
-#endif
-
-       /* We've installed the CPLB, so re-enable CPLBs. P4
-        * points to DMEM_CONTROL, and R5 is the value we
-        * last wrote to it, when we were disabling CPLBs.
-        */
-
-       BITSET(R5,ENDCPLB_P);
-       CLI R2;
-       .align 8;
-       [P4] = R5;
-       SSYNC;
-       STI R2;
-
-       ( R7:0,P5:0 ) = [SP++];
-       R0 = CPLB_RELOADED;
-       RTS;
-
-.data
-.align 4;
-page_size_table:
-.byte4 0x00000400;     /* 1K */
-.byte4 0x00001000;     /* 4K */
-.byte4 0x00100000;     /* 1M */
-.byte4 0x00400000;     /* 4M */
-
-.align 4;
-dcplb_preference:
-.byte4 0x00000001;     /* valid bit */
-.byte4 0x00000082;     /* dirty+lock bits */
-.byte4 0x00000002;     /* lock bit */
index 78e2b966bb4ecbc8ba3ad291f4f58bea0e241db7..8118861f8d86fe4b9f0421f67ccaede04b6663ba 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - cpu.c CPU specific functions
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <asm/blackfin.h>
 #include <command.h>
 #include <asm/entry.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
 
-#define SSYNC() asm("ssync;")
 #define CACHE_ON 1
 #define CACHE_OFF 0
 
-/* Data Attibutes*/
-
-#define SDRAM_IGENERIC         (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID)
-#define SDRAM_IKERNEL          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
-#define L1_IMEMORY             (PAGE_SIZE_1MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
-#define SDRAM_INON_CHBL                (PAGE_SIZE_4MB | CPLB_USER_RD | CPLB_VALID)
-
-#define ANOMALY_05000158               0x200
-#define SDRAM_DGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_RD | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
-#define SDRAM_DNON_CHBL         (PAGE_SIZE_4MB | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
-#define SDRAM_DKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | CPLB_LOCK | ANOMALY_05000158)
-#define L1_DMEMORY              (PAGE_SIZE_4KB | CPLB_L1_CHBL | CPLB_L1_AOW | CPLB_WT | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
-#define SDRAM_EBIU              (PAGE_SIZE_4MB | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_USER_WR | CPLB_SUPV_WR | CPLB_VALID | ANOMALY_05000158)
-
-static unsigned int icplb_table[16][2]={
-                       {0xFFA00000, L1_IMEMORY},
-                       {0x00000000, SDRAM_IKERNEL},    /*SDRAM_Page1*/
-                       {0x00400000, SDRAM_IKERNEL},    /*SDRAM_Page1*/
-                       {0x07C00000, SDRAM_IKERNEL},    /*SDRAM_Page14*/
-                       {0x00800000, SDRAM_IGENERIC},   /*SDRAM_Page2*/
-                       {0x00C00000, SDRAM_IGENERIC},   /*SDRAM_Page2*/
-                       {0x01000000, SDRAM_IGENERIC},   /*SDRAM_Page4*/
-                       {0x01400000, SDRAM_IGENERIC},   /*SDRAM_Page5*/
-                       {0x01800000, SDRAM_IGENERIC},   /*SDRAM_Page6*/
-                       {0x01C00000, SDRAM_IGENERIC},   /*SDRAM_Page7*/
-                       {0x02000000, SDRAM_IGENERIC},   /*SDRAM_Page8*/
-                       {0x02400000, SDRAM_IGENERIC},   /*SDRAM_Page9*/
-                       {0x02800000, SDRAM_IGENERIC},   /*SDRAM_Page10*/
-                       {0x02C00000, SDRAM_IGENERIC},   /*SDRAM_Page11*/
-                       {0x03000000, SDRAM_IGENERIC},   /*SDRAM_Page12*/
-                       {0x03400000, SDRAM_IGENERIC},   /*SDRAM_Page13*/
-};
-
-static unsigned int dcplb_table[16][2]={
-                       {0xFFA00000,L1_DMEMORY},
-                       {0x00000000,SDRAM_DKERNEL},     /*SDRAM_Page1*/
-                       {0x00400000,SDRAM_DKERNEL},     /*SDRAM_Page1*/
-                       {0x07C00000,SDRAM_DKERNEL},     /*SDRAM_Page15*/
-                       {0x00800000,SDRAM_DGENERIC},    /*SDRAM_Page2*/
-                       {0x00C00000,SDRAM_DGENERIC},    /*SDRAM_Page3*/
-                       {0x01000000,SDRAM_DGENERIC},    /*SDRAM_Page4*/
-                       {0x01400000,SDRAM_DGENERIC},    /*SDRAM_Page5*/
-                       {0x01800000,SDRAM_DGENERIC},    /*SDRAM_Page6*/
-                       {0x01C00000,SDRAM_DGENERIC},    /*SDRAM_Page7*/
-                       {0x02000000,SDRAM_DGENERIC},    /*SDRAM_Page8*/
-                       {0x02400000,SDRAM_DGENERIC},    /*SDRAM_Page9*/
-                       {0x02800000,SDRAM_DGENERIC},    /*SDRAM_Page10*/
-                       {0x02C00000,SDRAM_DGENERIC},    /*SDRAM_Page11*/
-                       {0x03000000,SDRAM_DGENERIC},    /*SDRAM_Page12*/
-                       {0x20000000,SDRAM_EBIU},        /*For Network */
-};
-
-int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
-       __asm__ __volatile__
-       ("cli r3;"
-       "P0 = %0;"
-       "JUMP (P0);"
-       :
-       : "r" (L1_ISRAM)
-       );
+       __asm__ __volatile__("cli r3;" "P0 = %0;" "JUMP (P0);"::"r"(L1_ISRAM)
+           );
 
        return 0;
 }
@@ -112,29 +59,62 @@ int cleanup_before_linux(void)
 
 void icache_enable(void)
 {
-       unsigned int *I0,*I1;
-       int i;
+       unsigned int *I0, *I1;
+       int i, j = 0;
 
+       /* Before enable icache, disable it first */
+       icache_disable();
        I0 = (unsigned int *)ICPLB_ADDR0;
        I1 = (unsigned int *)ICPLB_DATA0;
 
-       for(i=0;i<16;i++){
-               *I0++ = icplb_table[i][0];
-               *I1++ = icplb_table[i][1];
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & icplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & icplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
+               }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
                }
+
+       }
+
        cli();
-       SSYNC();
+       sync();
+       asm(" .align 8; ");
        *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
-       SSYNC();
+       sync();
        sti();
 }
 
 void icache_disable(void)
 {
        cli();
-       SSYNC();
+       sync();
+       asm(" .align 8; ");
        *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
-       SSYNC();
+       sync();
        sti();
 }
 
@@ -143,7 +123,7 @@ int icache_status(void)
        unsigned int value;
        value = *(unsigned int *)IMEM_CONTROL;
 
-       if( value & (IMC|ENICPLB) )
+       if (value & (IMC | ENICPLB))
                return CACHE_ON;
        else
                return CACHE_OFF;
@@ -151,38 +131,90 @@ int icache_status(void)
 
 void dcache_enable(void)
 {
-       unsigned int *I0,*I1;
+       unsigned int *I0, *I1;
        unsigned int temp;
-       int i;
+       int i, j = 0;
+
+       /* Before enable dcache, disable it first */
+       dcache_disable();
        I0 = (unsigned int *)DCPLB_ADDR0;
        I1 = (unsigned int *)DCPLB_DATA0;
 
-       for(i=0;i<16;i++){
-               *I0++ = dcplb_table[i][0];
-               *I1++ = dcplb_table[i][1];
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & dcplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+               } else {
+                       debug("skip   %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & dcplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
                }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
+               }
+       }
+
        cli();
        temp = *(unsigned int *)DMEM_CONTROL;
-       SSYNC();
-       *(unsigned int *)DMEM_CONTROL = ACACHE_BCACHE |ENDCPLB |PORT_PREF0|temp;
-       SSYNC();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL =
+           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | temp;
+       sync();
        sti();
 }
 
 void dcache_disable(void)
 {
+       unsigned int *I0, *I1;
+       int i;
+
        cli();
-       SSYNC();
-       *(unsigned int *)DMEM_CONTROL &= ~(ACACHE_BCACHE |ENDCPLB |PORT_PREF0);
-       SSYNC();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL &=
+           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+       sync();
        sti();
+
+       /* after disable dcache,
+        * clear it so we don't confuse the next application
+        */
+       I0 = (unsigned int *)DCPLB_ADDR0;
+       I1 = (unsigned int *)DCPLB_DATA0;
+
+       for (i = 0; i < 16; i++) {
+               *I0++ = 0x0;
+               *I1++ = 0x0;
+       }
 }
 
 int dcache_status(void)
 {
        unsigned int value;
        value = *(unsigned int *)DMEM_CONTROL;
-       ifvalue & (ENDCPLB))
+       if (value & (ENDCPLB))
                return CACHE_ON;
        else
                return CACHE_OFF;
index 7ec33878eaf2b89bc7b2ba0bae7d28d5eaf557a1..b6b73b1d8f9c0e8fd4bbc494d2a64b958bc05615 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  U-boot - cpu.h
  *
- *  Copyright (c) 2005 blackfin.uclinux.org
+ *  Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _CPU_H_
@@ -32,8 +32,8 @@
 #define DEF_INTERRUPT_FLAGS 1
 #define MAX_TIM_LOAD   0xFFFFFFFF
 
-void blackfin_irq_panic(int reason, struct pt_regs * reg);
-extern void dump(struct pt_regs * regs);
+void blackfin_irq_panic(int reason, struct pt_regs *reg);
+extern void dump(struct pt_regs *regs);
 void display_excp(void);
 asmlinkage void evt_nmi(void);
 asmlinkage void evt_exception(void);
@@ -50,16 +50,17 @@ asmlinkage void evt_evt12(void);
 asmlinkage void evt_evt13(void);
 asmlinkage void evt_soft_int1(void);
 asmlinkage void evt_system_call(void);
-void blackfin_irq_panic(int reason, struct pt_regs * regs);
+void blackfin_irq_panic(int reason, struct pt_regs *regs);
 void blackfin_free_irq(unsigned int irq, void *dev_id);
-void call_isr(int irq, struct pt_regs * fp);
+void call_isr(int irq, struct pt_regs *fp);
 void blackfin_do_irq(int vec, struct pt_regs *fp);
 void blackfin_init_IRQ(void);
 void blackfin_enable_irq(unsigned int irq);
 void blackfin_disable_irq(unsigned int irq);
-extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+extern int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
 int blackfin_request_irq(unsigned int irq,
-                    void (*handler)(int, void *, struct pt_regs *),
-                    unsigned long flags,const char *devname,void *dev_id);
+                        void (*handler) (int, void *, struct pt_regs *),
+                        unsigned long flags, const char *devname,
+                        void *dev_id);
 void timer_init(void);
 #endif
index 9fbdefc9db41cb675d3bafd7b089da2e1ef587df..62e3d65ae7f20c6240f0597235a8a42b32fb5cf8 100644 (file)
@@ -1,15 +1,14 @@
-/* Copyright (C) 2003 Analog Devices, Inc. All Rights Reserved.
- * Copyright (C) 2004 LG SOft India. All Rights Reserved.
+/* Copyright (C) 2003-2007 Analog Devices Inc.
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.
- *
- * Blackfin BF533/2.6 support : LG Soft India
  */
+
 #define ASSEMBLY
 
 #include <asm/linkage.h>
 #include <asm/cplb.h>
+#include <config.h>
 #include <asm/blackfin.h>
 
 .text
@@ -20,7 +19,7 @@
  * in the instruction cache.
  */
 
-ENTRY(flush_instruction_cache)
+ENTRY(_flush_instruction_cache)
        [--SP] = ( R7:6, P5:4 );
        LINK 12;
        SP += -12;
@@ -33,7 +32,7 @@ ENTRY(flush_instruction_cache)
 inext: R0 = [P5++];
        R1 = [P4++];
        [--SP] =  RETS;
-       CALL icplb_flush;       /* R0 = page, R1 = data*/
+       CALL _icplb_flush;      /* R0 = page, R1 = data*/
        RETS = [SP++];
 iskip: R6 += -1;
        CC = R6;
@@ -52,7 +51,7 @@ iskip:        R6 += -1;
  */
 
 .align 2
-ENTRY(icplb_flush)
+ENTRY(_icplb_flush)
        [--SP] = ( R7:0, P5:0 );
        [--SP] = LC0;
        [--SP] = LT0;
@@ -86,16 +85,17 @@ ENTRY(icplb_flush)
         */
 
        R3 = ((12<<8)|2);               /* Extraction pattern */
-       nop;                            /*Anamoly 05000209*/
-       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits*/
-       R3.H = R4.L << 0 ;              /* Save in extraction pattern for later deposit.*/
+       nop;                            /* Anamoly 05000209 */
+       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits */
 
+       /* Save in extraction pattern for later deposit. */
+       R3.H = R4.L << 0;
 
        /* So:
         * R0 = Page start
         * R1 = Page length (actually, offset into size/prefix tables)
         * R3 = sub-bank deposit values
-        *
+        *
         * The cache has 2 Ways, and 64 sets, so we iterate through
         * the sets, accessing the tag for each Way, for our Bank and
         * sub-bank, looking for dirty, valid tags that match our
@@ -180,8 +180,10 @@ iflush_whole_page:
        SSYNC;
        IFLUSH [P0++];          /* because CSYNC can't end loops.*/
        LSETUP (isall, ieall) LC0 = P1;
-isall:IFLUSH [P0++];
-ieall: NOP;
+isall:
+       IFLUSH [P0++];
+ieall:
+       NOP;
        SSYNC;
        JUMP ifinished;
 
@@ -191,7 +193,7 @@ ieall: NOP;
  * in the data cache.
  */
 
-ENTRY(flush_data_cache)
+ENTRY(_flush_data_cache)
        [--SP] = ( R7:6, P5:4 );
        LINK 12;
        SP += -12;
@@ -209,7 +211,7 @@ next:       R0 = [P5++];
        CC = R2;
        IF !CC JUMP skip;       /* If not, ignore it.*/
        [--SP] = RETS;
-       CALL dcplb_flush;       /* R0 = page, R1 = data*/
+       CALL _dcplb_flush;      /* R0 = page, R1 = data*/
        RETS = [SP++];
 skip:  R6 += -1;
        CC = R6;
@@ -228,7 +230,7 @@ skip:       R6 += -1;
  */
 
 .align 2
-ENTRY(dcplb_flush)
+ENTRY(_dcplb_flush)
        [--SP] = ( R7:0, P5:0 );
        [--SP] = LC0;
        [--SP] = LT0;
@@ -290,14 +292,15 @@ bank_chosen:
        R3 = ((12<<8)|2);               /* Extraction pattern */
        nop;                            /*Anamoly 05000209*/
        R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits*/
-       R3.H = R4.L << 0 ;              /* Save in extraction pattern for later deposit.*/
+       /* Save in extraction pattern for later deposit.*/
+       R3.H = R4.L << 0;
 
        /* So:
         * R0 = Page start
         * R1 = Page length (actually, offset into size/prefix tables)
         * R2 = Bank select mask
         * R3 = sub-bank deposit values
-        *
+        *
         * The cache has 2 Ways, and 64 sets, so we iterate through
         * the sets, accessing the tag for each Way, for our Bank and
         * sub-bank, looking for dirty, valid tags that match our
@@ -386,7 +389,7 @@ dflush_whole_page:
        CC = BITTST(R1, 16);    /* Whether 1K or 4K*/
        IF CC P1 = P2;
        P1 += -1;               /* Unroll one iteration*/
-    SSYNC;
+       SSYNC;
        FLUSHINV [P0++];        /* because CSYNC can't end loops.*/
        LSETUP (eall, eall) LC0 = P1;
 eall:  FLUSHINV [P0++];
diff --git a/cpu/bf533/init_sdram.S b/cpu/bf533/init_sdram.S
new file mode 100644 (file)
index 0000000..e1a8e2f
--- /dev/null
@@ -0,0 +1,179 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+#if (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+       p0.h = hi(SPI_BAUD);
+       p0.l = lo(SPI_BAUD);
+       r0.l = CONFIG_SPI_BAUD;
+       w[p0] = r0.l;
+       SSYNC;
+#endif
+
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier         */
+       r0 = r0 << 9;                   /* Shift it over,                  */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2?*/
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL?                 */
+       r1 = r1 << 8;                   /* Shift it over                   */
+       r0 = r1 | r0;                   /* add them all together           */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address                */
+       cli r2;                         /* Disable interrupts              */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value                   */
+       idle;                           /* Wait for the PLL to stablize    */
+       sti r2;                         /* Enable interrupts               */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        */
+
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
diff --git a/cpu/bf533/init_sdram_bootrom_initblock.S b/cpu/bf533/init_sdram_bootrom_initblock.S
new file mode 100644 (file)
index 0000000..99ed920
--- /dev/null
@@ -0,0 +1,179 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+#if (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+       p0.h = hi(SPI_BAUD);
+       p0.l = lo(SPI_BAUD);
+       r0.l = CONFIG_SPI_BAUD_INITBLOCK;
+       w[p0] = r0.l;
+       SSYNC;
+#endif
+
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier         */
+       r0 = r0 << 9;                   /* Shift it over,                  */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2?*/
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL?                 */
+       r1 = r1 << 8;                   /* Shift it over                   */
+       r0 = r1 | r0;                   /* add them all together           */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address                */
+       cli r2;                         /* Disable interrupts              */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value                   */
+       idle;                           /* Wait for the PLL to stablize    */
+       sti r2;                         /* Enable interrupts               */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        */
+
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
index e780dc6d6b0559fa48b3608dedec42e1c5526606..c356d53aa6122d37949ad2d07b842aa9fd7eb26d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - interrupt.S Processing of interrupts and exception handling
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #define ASSEMBLY
-
+#include <config.h>
+#include <asm/blackfin.h>
 #include <asm/hw_irq.h>
 #include <asm/entry.h>
 #include <asm/blackfin_defs.h>
-#include <asm/cpu/bf533_irq.h>
 
-.global blackfin_irq_panic;
+.global _blackfin_irq_panic;
 
 .text
 .align 2
 
 #ifndef CONFIG_KGDB
-.global evt_emulation
-evt_emulation:
+.global _evt_emulation
+_evt_emulation:
        SAVE_CONTEXT
        r0 = IRQ_EMU;
        r1 = seqstat;
        sp += -12;
-       call blackfin_irq_panic;
+       call _blackfin_irq_panic;
        sp += 12;
        rte;
 #endif
 
-.global evt_nmi
-evt_nmi:
+.global _evt_nmi
+_evt_nmi:
        SAVE_CONTEXT
        r0 = IRQ_NMI;
        r1 = RETN;
        sp += -12;
-       call blackfin_irq_panic;
+       call _blackfin_irq_panic;
        sp += 12;
 
 _evt_nmi_exit:
        rtn;
 
-.global trap
-trap:
-       [--sp] = r0;
-       [--sp] = r1;
-       [--sp] = p0;
-       [--sp] = p1;
-       [--sp] = astat;
-       r0 = seqstat;
-       R0 <<= 26;
-       R0 >>= 26;
-       p0 = r0;
-       p1.l = EVTABLE;
-       p1.h = EVTABLE;
-       p0 = p1 + (p0 << 1);
-       r1 = W[p0] (Z);
-       p1 = r1;
-       jump (pc + p1);
-
-.global _EVENT1
-_EVENT1:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT2
-_EVENT2:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT3
-_EVENT3:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT4
-_EVENT4:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT5
-_EVENT5:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT6
-_EVENT6:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT7
-_EVENT7:
-       RAISE 15;
-       JUMP.S _EXIT;
-
-.global _EVENT8
-_EVENT8:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT9
-_EVENT9:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT10
-_EVENT10:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT11
-_EVENT11:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT12
-_EVENT12:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT13
-_EVENT13:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT14
-_EVENT14:
-/*     RAISE 14;       */
-       CALL    _cplb_hdr;
-       JUMP.S _EXIT;
-
-.global _EVENT19
-_EVENT19:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT20
-_EVENT20:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EVENT21
-_EVENT21:
-       RAISE 14;
-       JUMP.S _EXIT;
-
-.global _EXIT
-_EXIT:
-       ASTAT = [sp++];
-       p1 = [sp++];
-       p0 = [sp++];
-       r1 = [sp++];
-       r0 = [sp++];
-       RTX;
-
-EVTABLE:
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x0000;
-       .byte2 0x003E;
-       .byte2 0x0042;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte4 0x0000;
-       .byte2 0x0000;
-       .byte2 0x001E;
-       .byte2 0x0022;
-       .byte2 0x0032;
-       .byte2 0x002e;
-       .byte2 0x0002;
-       .byte2 0x0036;
-       .byte2 0x002A;
-       .byte2 0x001A;
-       .byte2 0x0016;
-       .byte2 0x000A;
-       .byte2 0x000E;
-       .byte2 0x0012;
-       .byte2 0x0006;
-       .byte2 0x0026;
+.global _trap
+_trap:
+       SAVE_ALL_SYS
+       r0 = sp;        /* stack frame pt_regs pointer argument ==> r0 */
+       sp += -12;
+       call _trap_c
+       sp += 12;
+       RESTORE_ALL_SYS
+       rtx;
 
-.global evt_rst
-evt_rst:
+.global _evt_rst
+_evt_rst:
        SAVE_CONTEXT
        r0 = IRQ_RST;
        r1 = RETN;
        sp += -12;
-       call do_reset;
+       call _do_reset;
        sp += 12;
 
 _evt_rst_exit:
@@ -246,19 +101,19 @@ irq_panic:
        r0 = IRQ_EVX;
        r1 =  sp;
        sp += -12;
-       call blackfin_irq_panic;
+       call _blackfin_irq_panic;
        sp += 12;
 
-.global evt_ivhw
-evt_ivhw:
+.global _evt_ivhw
+_evt_ivhw:
        SAVE_CONTEXT
        RAISE 14;
 
 _evt_ivhw_exit:
         rti;
 
-.global evt_timer
-evt_timer:
+.global _evt_timer
+_evt_timer:
        SAVE_CONTEXT
        r0 = IRQ_CORETMR;
        sp += -12;
@@ -269,91 +124,91 @@ evt_timer:
        rti;
        nop;
 
-.global evt_evt7
-evt_evt7:
+.global _evt_evt7
+_evt_evt7:
        SAVE_CONTEXT
        r0 = 7;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt7_exit:
        RESTORE_CONTEXT
        rti;
 
-.global evt_evt8
-evt_evt8:
+.global _evt_evt8
+_evt_evt8:
        SAVE_CONTEXT
        r0 = 8;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt8_exit:
        RESTORE_CONTEXT
        rti;
 
-.global evt_evt9
-evt_evt9:
+.global _evt_evt9
+_evt_evt9:
        SAVE_CONTEXT
        r0 = 9;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt9_exit:
        RESTORE_CONTEXT
        rti;
 
-.global evt_evt10
-evt_evt10:
+.global _evt_evt10
+_evt_evt10:
        SAVE_CONTEXT
        r0 = 10;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt10_exit:
        RESTORE_CONTEXT
        rti;
 
-.global evt_evt11
-evt_evt11:
+.global _evt_evt11
+_evt_evt11:
        SAVE_CONTEXT
        r0 = 11;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt11_exit:
        RESTORE_CONTEXT
        rti;
 
-.global evt_evt12
-evt_evt12:
+.global _evt_evt12
+_evt_evt12:
        SAVE_CONTEXT
        r0 = 12;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 evt_evt12_exit:
         RESTORE_CONTEXT
         rti;
 
-.global evt_evt13
-evt_evt13:
+.global _evt_evt13
+_evt_evt13:
        SAVE_CONTEXT
        r0 = 13;
        sp += -12;
-       call process_int;
+       call _process_int;
        sp += 12;
 
 evt_evt13_exit:
         RESTORE_CONTEXT
         rti;
 
-.global evt_system_call
-evt_system_call:
+.global _evt_system_call
+_evt_system_call:
        [--sp] = r0;
        [--SP] = RETI;
        r0 = [sp++];
@@ -363,7 +218,7 @@ evt_system_call:
        r0 = [SP++];
        SAVE_CONTEXT
        sp += -12;
-       call display_excp;
+       call _exception_handle;
        sp += 12;
        RESTORE_CONTEXT
        RTI;
@@ -371,8 +226,8 @@ evt_system_call:
 evt_system_call_exit:
        rti;
 
-.global evt_soft_int1
-evt_soft_int1:
+.global _evt_soft_int1
+_evt_soft_int1:
        [--sp] = r0;
        [--SP] = RETI;
        r0 = [sp++];
@@ -382,7 +237,7 @@ evt_soft_int1:
        r0 = [SP++];
        SAVE_CONTEXT
        sp += -12;
-       call display_excp;
+       call _exception_handle;
        sp += 12;
        RESTORE_CONTEXT
        RTI;
index df1a25ec7559c2a733bad36b0996c0c7e565abee..14d06cf8dfa54c0740d8a99ab4ac07f8ef3c9d47 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - interrupts.c Interrupt related routines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on interrupts.c
  * Copyright 1996 Roman Zippel
@@ -10,7 +10,7 @@
  * Copyright 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca>
  * Copyright 2003 Metrowerks/Motorola
  * Copyright 2003 Bas Vermeulen <bas@buyways.nl>,
- *                     BuyWays B.V. (www.buyways.nl)
+ *                     BuyWays B.V. (www.buyways.nl)
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <asm/machdep.h>
 #include <asm/irq.h>
-#include <asm/cpu/defBF533.h>
+#include <config.h>
+#include <asm/blackfin.h>
 #include "cpu.h"
 
 static ulong timestamp;
 static ulong last_time;
 static int int_flag;
 
-int irq_flags; /* needed by asm-blackfin/system.h */
+int irq_flags;                 /* needed by asm-blackfin/system.h */
 
 /* Functions just to satisfy the linker */
 
@@ -61,7 +62,7 @@ unsigned long long get_ticks(void)
  * This function is derived from PowerPC code (timebase clock frequency).
  * On BF533 it returns the number of timer ticks per second.
  */
-ulong get_tbclk (void)
+ulong get_tbclk(void)
 {
        ulong tbclk;
 
@@ -91,22 +92,22 @@ void udelay(unsigned long usec)
        unsigned long cclk;
        cclk = (CONFIG_CCLK_HZ);
 
-       while ( usec > 1 ) {
-              /*
-               * how many clock ticks to delay?
-               *  - request(in useconds) * clock_ticks(Hz) / useconds/second
-               */
+       while (usec > 1) {
+               /*
+                * how many clock ticks to delay?
+                *  - request(in useconds) * clock_ticks(Hz) / useconds/second
+                */
                if (usec < 1000) {
-                       delay = (usec * (cclk/244)) >> 12 ;
+                       delay = (usec * (cclk / 244)) >> 12;
                        usec = 0;
                } else {
-                       delay = (1000 * (cclk/244)) >> 12 ;
+                       delay = (1000 * (cclk / 244)) >> 12;
                        usec -= 1000;
                }
 
-               asm volatile (" %0 = CYCLES;": "=g"(start));
+               asm volatile (" %0 = CYCLES;":"=r" (start));
                do {
-                       asm volatile (" %0 = CYCLES; ": "=g"(stop));
+                       asm volatile (" %0 = CYCLES; ":"=r" (stop));
                } while (stop - start < delay);
        }
 
@@ -117,7 +118,7 @@ void timer_init(void)
 {
        *pTCNTL = 0x1;
        *pTSCALE = 0x0;
-       *pTCOUNT  = MAX_TIM_LOAD;
+       *pTCOUNT = MAX_TIM_LOAD;
        *pTPERIOD = MAX_TIM_LOAD;
        *pTCNTL = 0x7;
        asm("CSYNC;");
@@ -146,20 +147,23 @@ ulong get_timer(ulong base)
        /* Number of clocks elapsed */
        ulong clocks = (MAX_TIM_LOAD - (*pTCOUNT));
 
-       /* Find if the TCOUNT is reset
-       timestamp gives the number of times
-       TCOUNT got reset */
-       if(clocks < last_time)
+       /**
+        * Find if the TCOUNT is reset
+        * timestamp gives the number of times
+        * TCOUNT got reset
+        */
+       if (clocks < last_time)
                timestamp++;
        last_time = clocks;
 
        /* Get the number of milliseconds */
-       milisec = clocks/(CONFIG_CCLK_HZ / 1000);
+       milisec = clocks / (CONFIG_CCLK_HZ / 1000);
 
-       /* Find the number of millisonds
-       that got elapsed before this TCOUNT
-       cycle */
-       milisec += timestamp * (MAX_TIM_LOAD/(CONFIG_CCLK_HZ / 1000));
+       /**
+        * Find the number of millisonds
+        * that got elapsed before this TCOUNT cycle
+        */
+       milisec += timestamp * (MAX_TIM_LOAD / (CONFIG_CCLK_HZ / 1000));
 
        return (milisec - base);
 }
index 859f4b2f0988aa9a7cd0355d45bcf42b8ce1d476..55866896a033ab863742ec51960c2996b7b69339 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - ints.c Interrupt related routines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on ints.c
  *
@@ -32,8 +32,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
@@ -51,9 +51,9 @@
 void blackfin_irq_panic(int reason, struct pt_regs *regs)
 {
        printf("\n\nException: IRQ 0x%x entered\n", reason);
-       printf("code=[0x%x], ", (unsigned int) (regs->seqstat & 0x3f));
-       printf("stack frame=0x%x, ", (unsigned int) regs);
-       printf("bad PC=0x%04x\n", (unsigned int) regs->pc);
+       printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+       printf("stack frame=0x%x, ", (unsigned int)regs);
+       printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
        dump(regs);
        printf("Unhandled IRQ or exceptions!\n");
        printf("Please reset the board \n");
@@ -61,46 +61,56 @@ void blackfin_irq_panic(int reason, struct pt_regs *regs)
 
 void blackfin_init_IRQ(void)
 {
-       *(unsigned volatile long *) (SIC_IMASK) = SIC_UNMASK_ALL;
+       *(unsigned volatile long *)(SIC_IMASK) = SIC_UNMASK_ALL;
        cli();
 #ifndef CONFIG_KGDB
-       *(unsigned volatile long *) (EVT_EMULATION_ADDR) = 0x0;
+       *(unsigned volatile long *)(EVT_EMULATION_ADDR) = 0x0;
 #endif
-       *(unsigned volatile long *) (EVT_NMI_ADDR) =
-               (unsigned volatile long) evt_nmi;
-       *(unsigned volatile long *) (EVT_EXCEPTION_ADDR) =
-               (unsigned volatile long) trap;
-       *(unsigned volatile long *) (EVT_HARDWARE_ERROR_ADDR) =
-               (unsigned volatile long) evt_ivhw;
-       *(unsigned volatile long *) (EVT_RESET_ADDR) =
-               (unsigned volatile long) evt_rst;
-       *(unsigned volatile long *) (EVT_TIMER_ADDR) =
-               (unsigned volatile long) evt_timer;
-       *(unsigned volatile long *) (EVT_IVG7_ADDR) =
-               (unsigned volatile long) evt_evt7;
-       *(unsigned volatile long *) (EVT_IVG8_ADDR) =
-               (unsigned volatile long) evt_evt8;
-       *(unsigned volatile long *) (EVT_IVG9_ADDR) =
-               (unsigned volatile long) evt_evt9;
-       *(unsigned volatile long *) (EVT_IVG10_ADDR) =
-               (unsigned volatile long) evt_evt10;
-       *(unsigned volatile long *) (EVT_IVG11_ADDR) =
-               (unsigned volatile long) evt_evt11;
-       *(unsigned volatile long *) (EVT_IVG12_ADDR) =
-               (unsigned volatile long) evt_evt12;
-       *(unsigned volatile long *) (EVT_IVG13_ADDR) =
-               (unsigned volatile long) evt_evt13;
-       *(unsigned volatile long *) (EVT_IVG14_ADDR) =
-               (unsigned volatile long) evt_system_call;
-       *(unsigned volatile long *) (EVT_IVG15_ADDR) =
-               (unsigned volatile long) evt_soft_int1;
-       *(volatile unsigned long *) ILAT = 0;
+       *(unsigned volatile long *)(EVT_NMI_ADDR) =
+           (unsigned volatile long)evt_nmi;
+       *(unsigned volatile long *)(EVT_EXCEPTION_ADDR) =
+           (unsigned volatile long)trap;
+       *(unsigned volatile long *)(EVT_HARDWARE_ERROR_ADDR) =
+           (unsigned volatile long)evt_ivhw;
+       *(unsigned volatile long *)(EVT_RESET_ADDR) =
+           (unsigned volatile long)evt_rst;
+       *(unsigned volatile long *)(EVT_TIMER_ADDR) =
+           (unsigned volatile long)evt_timer;
+       *(unsigned volatile long *)(EVT_IVG7_ADDR) =
+           (unsigned volatile long)evt_evt7;
+       *(unsigned volatile long *)(EVT_IVG8_ADDR) =
+           (unsigned volatile long)evt_evt8;
+       *(unsigned volatile long *)(EVT_IVG9_ADDR) =
+           (unsigned volatile long)evt_evt9;
+       *(unsigned volatile long *)(EVT_IVG10_ADDR) =
+           (unsigned volatile long)evt_evt10;
+       *(unsigned volatile long *)(EVT_IVG11_ADDR) =
+           (unsigned volatile long)evt_evt11;
+       *(unsigned volatile long *)(EVT_IVG12_ADDR) =
+           (unsigned volatile long)evt_evt12;
+       *(unsigned volatile long *)(EVT_IVG13_ADDR) =
+           (unsigned volatile long)evt_evt13;
+       *(unsigned volatile long *)(EVT_IVG14_ADDR) =
+           (unsigned volatile long)evt_system_call;
+       *(unsigned volatile long *)(EVT_IVG15_ADDR) =
+           (unsigned volatile long)evt_soft_int1;
+       *(volatile unsigned long *)ILAT = 0;
        asm("csync;");
        sti();
-       *(volatile unsigned long *) IMASK = 0xffbf;
+       *(volatile unsigned long *)IMASK = 0xffbf;
        asm("csync;");
 }
 
+void exception_handle(void)
+{
+#if defined (CONFIG_PANIC_HANG)
+       display_excp();
+#else
+       udelay(100000);         /* allow messages to go out */
+       do_reset(NULL, 0, 0, NULL);
+#endif
+}
+
 void display_excp(void)
 {
        printf("Exception!\n");
index 7b43ffd18816db04644a2f9cace6a932f3b554c4..6cab5daac79bdf9dcb5339bc21645b12c105539d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - serial.c Serial driver for BF533
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * bf533_serial.c: Serial driver for BlackFin BF533 DSP internal UART.
@@ -38,8 +38,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
@@ -49,6 +49,7 @@
 #include <asm/bitops.h>
 #include <asm/delay.h>
 #include <asm/uaccess.h>
+#include <asm/io.h>
 #include "bf533_serial.h"
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -58,15 +59,16 @@ unsigned long pll_div_fact;
 void calc_baud(void)
 {
        unsigned char i;
-       int     temp;
+       int temp;
+       u_long sclk = get_sclk();
 
-       for(i = 0; i < sizeof(baud_table)/sizeof(int); i++) {
-               temp =  CONFIG_SCLK_HZ/(baud_table[i]*8);
-               if ( temp && 0x1 == 1 ) {
+       for (i = 0; i < sizeof(baud_table) / sizeof(int); i++) {
+               temp = sclk / (baud_table[i] * 8);
+               if ((temp & 0x1) == 1) {
                        temp++;
                }
-               temp = temp/2;
-               hw_baud_table[i].dl_high = (temp >> 8)& 0xFF;
+               temp = temp / 2;
+               hw_baud_table[i].dl_high = (temp >> 8) & 0xFF;
                hw_baud_table[i].dl_low = (temp) & 0xFF;
        }
 }
@@ -74,6 +76,7 @@ void calc_baud(void)
 void serial_setbrg(void)
 {
        int i;
+       DECLARE_GLOBAL_DATA_PTR;
 
        calc_baud();
 
@@ -84,29 +87,29 @@ void serial_setbrg(void)
 
        /* Enable UART */
        *pUART_GCTL |= UART_GCTL_UCEN;
-       asm("ssync;");
+       sync();
 
        /* Set DLAB in LCR to Access DLL and DLH */
        ACCESS_LATCH;
-       asm("ssync;");
+       sync();
 
        *pUART_DLL = hw_baud_table[i].dl_low;
-       asm("ssync;");
+       sync();
        *pUART_DLH = hw_baud_table[i].dl_high;
-       asm("ssync;");
+       sync();
 
        /* Clear DLAB in LCR to Access THR RBR IER */
        ACCESS_PORT_IER;
-       asm("ssync;");
+       sync();
 
        /* Enable  ERBFI and ELSI interrupts
-       * to poll SIC_ISR register*/
+        * to poll SIC_ISR register*/
        *pUART_IER = UART_IER_ELSI | UART_IER_ERBFI | UART_IER_ETBEI;
-       asm("ssync;");
+       sync();
 
        /* Set LCR to Word Lengh 8-bit word select */
        *pUART_LCR = UART_LCR_WLS8;
-       asm("ssync;");
+       sync();
 
        return;
 }
@@ -119,8 +122,7 @@ int serial_init(void)
 
 void serial_putc(const char c)
 {
-       if ((*pUART_LSR) & UART_LSR_TEMT)
-       {
+       if ((*pUART_LSR) & UART_LSR_TEMT) {
                if (c == '\n')
                        serial_putc('\r');
 
@@ -148,17 +150,16 @@ int serial_getc(void)
        int ret;
 
        /* Poll for RX Interrupt */
-       while (!((isr_val = *(volatile unsigned long *)SIC_ISR) & IRQ_UART_RX_BIT));
+       while (!((isr_val =
+                 *(volatile unsigned long *)SIC_ISR) & IRQ_UART_RX_BIT)) ;
        asm("csync;");
 
        uart_lsr_val = *pUART_LSR;      /* Clear status bit */
        uart_rbr_val = *pUART_RBR;      /* getc() */
 
        if (isr_val & IRQ_UART_ERROR_BIT) {
-               ret =  -1;
-       }
-       else
-       {
+               ret = -1;
+       } else {
                ret = uart_rbr_val & 0xff;
        }
 
@@ -180,10 +181,10 @@ static void local_put_char(char ch)
        save_and_cli(flags);
 
        /* Poll for TX Interruput */
-       while (!((isr_val = *pSIC_ISR) & IRQ_UART_TX_BIT));
+       while (!((isr_val = *pSIC_ISR) & IRQ_UART_TX_BIT)) ;
        asm("csync;");
 
-       *pUART_THR = ch;                        /* putc() */
+       *pUART_THR = ch;        /* putc() */
 
        if (isr_val & IRQ_UART_ERROR_BIT) {
                printf("?");
@@ -191,5 +192,5 @@ static void local_put_char(char ch)
 
        restore_flags(flags);
 
-       return ;
+       return;
 }
index 6d585751abef37981cec69ece7c6085f97e7a685..67a60cf21e00f41c085a37ae5643af5b893bae51 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * U-boot - start.S Startup file of u-boot for BF533
+ * U-boot - start.S Startup file of u-boot for BF533/BF561
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on head.S
  * Copyright (c) 2003  Metrowerks/Motorola
@@ -26,8 +26,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /*
 #define ASSEMBLY
 
 #include <linux/config.h>
-#include <asm/blackfin.h>
 #include <config.h>
-#include <asm/mem_init.h>
+#include <asm/blackfin.h>
+
+.global _stext;
+.global __bss_start;
+.global start;
+.global _start;
+.global _rambase;
+.global _ramstart;
+.global _ramend;
+.global _bf533_data_dest;
+.global _bf533_data_size;
+.global edata;
+.global _initialize;
+.global _exit;
+.global flashdataend;
+.global init_sdram;
 
 #if (CONFIG_CCLK_DIV == 1)
 #define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
 #define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
 #endif
 
-.global _stext;
-.global __bss_start;
-.global start;
-.global _start;
-.global _rambase;
-.global _ramstart;
-.global _ramend;
-.global _bf533_data_dest;
-.global _bf533_data_size;
-.global edata;
-.global _initialize;
-.global _exit;
-.global flashdataend;
-
 .text
 _start:
 start:
 _stext:
 
-       R0 = 0x30;
+       R0 = 0x32;
        SYSCFG = R0;
        SSYNC;
 
@@ -120,8 +120,9 @@ _stext:
        /* Set loop counters to zero, to make sure that
         * hw loops are disabled.
         */
-       lc0 = 0;
-       lc1 = 0;
+       r0  = 0;
+       lc0 = r0;
+       lc1 = r0;
 
        SSYNC;
 
@@ -150,105 +151,40 @@ no_soft_reset:
        LSETUP(4,4) lc0 = p1;
        [ p0 ++ ] = r1;
 
-       /*
-        *  Set PLL_CTL
-        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
-        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
-        *   - [7]     = output delay (add 200ps of delay to mem signals)
-        *   - [6]     = input delay (add 200ps of input delay to mem signals)
-        *   - [5]     = PDWN      : 1=All Clocks off
-        *   - [3]     = STOPCK    : 1=Core Clock off
-        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
-        *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
-        *   all other bits set to zero
-        */
-
-       r0 = CONFIG_VCO_MULT;   /* Load the VCO multiplier */
-       r0 = r0 << 9;           /* Shift it over */
-       r1 =  CONFIG_CLKIN_HALF;        /* Do we need to divide CLKIN by 2? */
-       r0 = r1 | r0;
-       r1 = CONFIG_PLL_BYPASS; /* Bypass the PLL?                 */
-       r1 = r1 << 8;   /* Shift it over */
-       r0 = r1 | r0;   /* add them all together */
-
-       p0.h = (PLL_CTL >> 16);
-       p0.l = (PLL_CTL & 0xFFFF);      /* Load the address */
-       cli r2;                         /* Disable interrupts */
-       w[p0] = r0;                     /* Set the value */
-       idle;                           /* Wait for the PLL to stablize */
-       sti r2;                         /* Enable interrupts */
-       ssync;
-
-       /*
-        * Turn on the CYCLES COUNTER
-        */
-       r2 = SYSCFG;
-       BITSET (r2,1);
-       SYSCFG = r2;
-
-       /* Configure SCLK & CCLK Dividers */
-       r0 = CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV;
-       p0.h = (PLL_DIV >> 16);
-       p0.l = (PLL_DIV & 0xFFFF);
-       w[p0] = r0;
-       ssync;
-
-wait_for_pll_stab:
-       p0.h = (PLL_STAT >> 16);
-       p0.l = (PLL_STAT & 0xFFFF);
-       r0.l = w[p0];
-       cc = bittst(r0,5);
-       if !cc jump wait_for_pll_stab;
-
-       /* Configure SDRAM if SDRAM is already not enabled */
-       p0.l = (EBIU_SDSTAT & 0xFFFF);
-       p0.h = (EBIU_SDSTAT >> 16);
-       r0.l = w[p0];
-       cc = bittst(r0, 3);
-       if !cc jump skip_sdram_enable;
-
-       /* SDRAM initialization */
-       p0.l = (EBIU_SDGCTL & 0xFFFF);
-       p0.h = (EBIU_SDGCTL >> 16);     /* SDRAM Memory Global Control Register */
-       r0.h = (mem_SDGCTL >> 16);
-       r0.l = (mem_SDGCTL & 0xFFFF);
-       [p0] = r0;
-       ssync;
-
-       p0.l = (EBIU_SDBCTL & 0xFFFF);
-       p0.h = (EBIU_SDBCTL >> 16);     /* SDRAM Memory Bank Control Register */
-       r0 = mem_SDBCTL;
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
        w[p0] = r0.l;
-       ssync;
+       SSYNC;
 
-       p0.l = (EBIU_SDRRC & 0xFFFF);
-       p0.h = (EBIU_SDRRC >> 16);      /* SDRAM Refresh Rate Control Register */
-       r0 = mem_SDRRC;
-       w[p0] = r0.l;
-       ssync;
+       sp.l = (0xffb01000 & 0xFFFF);
+       sp.h = (0xffb01000 >> 16);
 
-skip_sdram_enable:
-       nop;
+       call init_sdram;
 
-#ifndef        CFG_NO_FLASH
        /* relocate into to RAM */
-       p1.l = (CFG_FLASH_BASE & 0xffff);
-       p1.h = (CFG_FLASH_BASE >> 16);
+       call get_pc;
+offset:
+       r2.l = offset;
+       r2.h = offset;
+       r3.l = start;
+       r3.h = start;
+       r1 = r2 - r3;
+
+       r0 = r0 - r1;
+       p1 = r0;
+
        p2.l = (CFG_MONITOR_BASE & 0xffff);
        p2.h = (CFG_MONITOR_BASE >> 16);
-       r0.l = (CFG_MONITOR_LEN & 0xffff);
-       r0.h = (CFG_MONITOR_LEN >> 16);
+
+       p3 = 0x04;
+       p4.l = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) & 0xffff);
+       p4.h = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) >> 16);
 loop1:
-       r1 = [p1];
-       [p2] = r1;
-       p3=0x4;
-       p1=p1+p3;
-       p2=p2+p3;
-       r2=0x4;
-       r0=r0-r2;
-       cc=r0==0x0;
+       r1 = [p1 ++ p3];
+       [p2 ++ p3] = r1;
+       cc=p2==p4;
        if !cc jump loop1;
-#endif
        /*
         * configure STACK
         */
@@ -273,7 +209,8 @@ loop1:
 
        p0.l = (IMASK & 0xFFFF);
        p0.h = (IMASK >> 16);
-       r0 = IVG15_POS;
+       r0.l = LO(IVG15_POS);
+       r0.h = HI(IVG15_POS);
        [p0] = r0;
        raise 15;
        p0.l = WAIT_HERE;
@@ -288,37 +225,10 @@ WAIT_HERE:
 _real_start:
        [ -- sp ] = reti;
 
-#ifdef CONFIG_EZKIT533
-       p0.l = (WDOG_CTL & 0xFFFF);
-       p0.h = (WDOG_CTL >> 16);
-       r0 = WATCHDOG_DISABLE(z);
-       w[p0] = r0;
-#endif
-
-       /* Code for initializing Async mem banks */
-       p2.h = (EBIU_AMBCTL1 >> 16);
-       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
-       r0.h = (AMBCTL1VAL >> 16);
-       r0.l = (AMBCTL1VAL & 0xFFFF);
-       [p2] = r0;
-       ssync;
-
-       p2.h = (EBIU_AMBCTL0 >> 16);
-       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
-       r0.h = (AMBCTL0VAL >> 16);
-       r0.l = (AMBCTL0VAL & 0xFFFF);
-       [p2] = r0;
-       ssync;
-
-       p2.h = (EBIU_AMGCTL >> 16);
-       p2.l = (EBIU_AMGCTL & 0xffff);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
        /* DMA reset code to Hi of L1 SRAM */
 copy:
-       P1.H = hi(SYSMMR_BASE); /* P1 Points to the beginning of SYSTEM MMR Space */
+       /* P1 Points to the beginning of SYSTEM MMR Space */
+       P1.H = hi(SYSMMR_BASE);
        P1.L = lo(SYSMMR_BASE);
 
        R0.H = reset_start;     /* Source Address (high) */
@@ -329,7 +239,8 @@ copy:
        R1.H = hi(L1_ISRAM);    /* Destination Address (high) */
        R1.L = lo(L1_ISRAM);    /* Destination Address (low) */
        R3.L = DMAEN;           /* Source DMAConfig Value (8-bit words) */
-       R4.L = (DI_EN | WNR | DMAEN);   /* Destination DMAConfig Value (8-bit words) */
+       /* Destination DMAConfig Value (8-bit words) */
+       R4.L = (DI_EN | WNR | DMAEN);
 
 DMA:
        R6 = 0x1 (Z);
@@ -342,57 +253,24 @@ DMA:
        Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
        W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
 
-       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
-       W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
-       /* Set Destination DMAConfig = DMA Enable,
-       Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
-       W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
-
-       IDLE;   /* Wait for DMA to Complete */
-
-       R0 = 0x1;
-       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
-
-       /* DMA reset code to DATA BANK A which uses this port
-        * to avoid following problem
-        * " Data from a Data Cache fill can be corrupoted after or during
-        *   instruction DMA if certain core stalls exist"
-        */
-
-copy_as_data:
-       R0.H = reset_start;     /* Source Address (high) */
-       R0.L = reset_start;     /* Source Address (low) */
-       R1.H = reset_end;
-       R1.L = reset_end;
-       R2 = R1 - R0;   /* Count */
-       R1.H = hi(DATA_BANKA_SRAM);     /* Destination Address (high) */
-       R1.L = lo(DATA_BANKA_SRAM);     /* Destination Address (low) */
-       R3.L = DMAEN;   /* Source DMAConfig Value (8-bit words) */
-       R4.L = (DI_EN | WNR | DMAEN);   /* Destination DMAConfig Value (8-bit words) */
-
-DMA_DATA:
-       R6 = 0x1 (Z);
-       W[P1+OFFSET_(MDMA_S0_X_MODIFY)] = R6;   /* Source Modify = 1 */
-       W[P1+OFFSET_(MDMA_D0_X_MODIFY)] = R6;   /* Destination Modify = 1 */
-
-       [P1+OFFSET_(MDMA_S0_START_ADDR)] = R0;  /* Set Source Base Address */
-       W[P1+OFFSET_(MDMA_S0_X_COUNT)] = R2;    /* Set Source Count */
-       /* Set Source      DMAConfig = DMA Enable,
-       Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
-       W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
-
-       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
+       /* Set Destination Base Address */
+       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;
        W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
        /* Set Destination DMAConfig = DMA Enable,
        Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
        W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
 
-       IDLE;   /* Wait for DMA to Complete */
+WAIT_DMA_DONE:
+       p0.h = hi(MDMA_D0_IRQ_STATUS);
+       p0.l = lo(MDMA_D0_IRQ_STATUS);
+       R0 = W[P0](Z);
+       CC = BITTST(R0, 0);
+       if ! CC jump WAIT_DMA_DONE
 
        R0 = 0x1;
-       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
 
-copy_end: nop;
+       /* Write 1 to clear DMA interrupt */
+       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0;
 
        /* Initialize BSS Section with 0 s */
        p1.l = __bss_start;
@@ -433,3 +311,6 @@ reset_end: nop;
 
 _exit:
        jump.s  _exit;
+get_pc:
+       r0 = rets;
+       rts;
index 6f4812405534f2c22b9002e2816f249f4d2e3618..6d4731b6962939230d7effaec1ad768f3dd0e99f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - start1.S Code running out of RAM after relocation
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #define ASSEMBLY
 #include <linux/config.h>
-#include <asm/blackfin.h>
 #include <config.h>
+#include <asm/blackfin.h>
 
 .global        start1;
 .global        _start1;
@@ -34,5 +34,5 @@
 _start1:
 start1:
        sp += -12;
-       call    board_init_f;
+       call    _board_init_f;
        sp += 12;
index 37470d583e21f58790403f727ef7bdef97c78fa4..19b1fde41d3f8675df85ed7a0f7c99d5876ee256 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - traps.c Routines related to interrupts and exceptions
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * No original Copyright holder listed,
@@ -29,8 +29,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <asm/irq.h>
 #include <asm/system.h>
 #include <asm/traps.h>
-#include <asm/page.h>
 #include <asm/machdep.h>
 #include "cpu.h"
+#include <asm/arch/anomaly.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
 
 void init_IRQ(void)
 {
@@ -51,23 +53,187 @@ void init_IRQ(void)
 
 void process_int(unsigned long vec, struct pt_regs *fp)
 {
+       printf("interrupt\n");
        return;
 }
 
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+unsigned long last_cplb_fault_retx;
+
+static unsigned int cplb_sizes[4] =
+    { 1024, 4 * 1024, 1024 * 1024, 4 * 1024 * 1024 };
+
+void trap_c(struct pt_regs *regs)
+{
+       unsigned int addr;
+       unsigned long trapnr = (regs->seqstat) & SEQSTAT_EXCAUSE;
+       unsigned int i, j, size, *I0, *I1;
+       unsigned short data = 0;
+
+       switch (trapnr) {
+       /* 0x26 - Data CPLB Miss */
+       case VEC_CPLB_M:
+
+#ifdef ANOMALY_05000261
+               /*
+                * Work around an anomaly: if we see a new DCPLB fault,
+                * return without doing anything. Then,
+                * if we get the same fault again, handle it.
+                */
+               addr = last_cplb_fault_retx;
+               last_cplb_fault_retx = regs->retx;
+               printf("this time, curr = 0x%08x last = 0x%08x\n",
+                      addr, last_cplb_fault_retx);
+               if (addr != last_cplb_fault_retx)
+                       goto trap_c_return;
+#endif
+               data = 1;
+
+       case VEC_CPLB_I_M:
+
+               if (data) {
+                       addr = *(unsigned int *)pDCPLB_FAULT_ADDR;
+               } else {
+                       addr = *(unsigned int *)pICPLB_FAULT_ADDR;
+               }
+               for (i = 0; i < page_descriptor_table_size; i++) {
+                       if (data) {
+                               size = cplb_sizes[dcplb_table[i][1] >> 16];
+                               j = dcplb_table[i][0];
+                       } else {
+                               size = cplb_sizes[icplb_table[i][1] >> 16];
+                               j = icplb_table[i][0];
+                       }
+                       if ((j <= addr) && ((j + size) > addr)) {
+                               debug("found %i 0x%08x\n", i, j);
+                               break;
+                       }
+               }
+               if (i == page_descriptor_table_size) {
+                       printf("something is really wrong\n");
+                       do_reset(NULL, 0, 0, NULL);
+               }
+
+               /* Turn the cache off */
+               if (data) {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL &=
+                           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
+                       sync();
+               }
+
+               if (data) {
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               j = 0;
+               while (*I1 & CPLB_LOCK) {
+                       debug("skipping %i %08p - %08x\n", j, I1, *I1);
+                       *I0++;
+                       *I1++;
+                       j++;
+               }
+
+               debug("remove %i 0x%08x  0x%08x\n", j, *I0, *I1);
+
+               for (; j < 15; j++) {
+                       debug("replace %i 0x%08x  0x%08x\n", j, I0, I0 + 1);
+                       *I0++ = *(I0 + 1);
+                       *I1++ = *(I1 + 1);
+               }
+
+               if (data) {
+                       *I0 = dcplb_table[i][0];
+                       *I1 = dcplb_table[i][1];
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       *I0 = icplb_table[i][0];
+                       *I1 = icplb_table[i][1];
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               for (j = 0; j < 16; j++) {
+                       debug("%i 0x%08x  0x%08x\n", j, *I0++, *I1++);
+               }
+
+               /* Turn the cache back on */
+               if (data) {
+                       j = *(unsigned int *)DMEM_CONTROL;
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL =
+                           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | j;
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
+                       sync();
+               }
+
+               break;
+       default:
+               /* All traps come here */
+               printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+               printf("stack frame=0x%x, ", (unsigned int)regs);
+               printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
+               dump(regs);
+               printf("\n\n");
+
+               printf("Unhandled IRQ or exceptions!\n");
+               printf("Please reset the board \n");
+               do_reset(NULL, 0, 0, NULL);
+       }
+
+       return;
+
+}
+
 void dump(struct pt_regs *fp)
 {
-       printf("PC: %08lx\n", fp->pc);
-       printf("SEQSTAT: %08lx    SP: %08lx\n", (long) fp->seqstat,
-               (long) fp);
-       printf("R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n",
-               fp->r0, fp->r1, fp->r2, fp->r3);
-       printf("R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n",
-               fp->r4, fp->r5, fp->r6, fp->r7);
-       printf("P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n",
-               fp->p0, fp->p1, fp->p2, fp->p3);
-       printf("P4: %08lx    P5: %08lx    FP: %08lx\n", fp->p4, fp->p5,
-               fp->fp);
-       printf("A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
-               fp->a0w, fp->a0x, fp->a1w, fp->a1x);
-       printf("\n");
+       debug("RETE:  %08lx  RETN: %08lx  RETX: %08lx  RETS: %08lx\n",
+                fp->rete, fp->retn, fp->retx, fp->rets);
+       debug("IPEND: %04lx  SYSCFG: %04lx\n", fp->ipend, fp->syscfg);
+       debug("SEQSTAT: %08lx    SP: %08lx\n", (long)fp->seqstat, (long)fp);
+       debug("R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n",
+                fp->r0, fp->r1, fp->r2, fp->r3);
+       debug("R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n",
+                fp->r4, fp->r5, fp->r6, fp->r7);
+       debug("P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n",
+                fp->p0, fp->p1, fp->p2, fp->p3);
+       debug("P4: %08lx    P5: %08lx    FP: %08lx\n",
+                fp->p4, fp->p5, fp->fp);
+       debug("A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
+                fp->a0w, fp->a0x, fp->a1w, fp->a1x);
+
+       debug("LB0: %08lx  LT0: %08lx  LC0: %08lx\n",
+                fp->lb0, fp->lt0, fp->lc0);
+       debug("LB1: %08lx  LT1: %08lx  LC1: %08lx\n",
+                fp->lb1, fp->lt1, fp->lc1);
+       debug("B0: %08lx  L0: %08lx  M0: %08lx  I0: %08lx\n",
+                fp->b0, fp->l0, fp->m0, fp->i0);
+       debug("B1: %08lx  L1: %08lx  M1: %08lx  I1: %08lx\n",
+                fp->b1, fp->l1, fp->m1, fp->i1);
+       debug("B2: %08lx  L2: %08lx  M2: %08lx  I2: %08lx\n",
+                fp->b2, fp->l2, fp->m2, fp->i2);
+       debug("B3: %08lx  L3: %08lx  M3: %08lx  I3: %08lx\n",
+                fp->b3, fp->l3, fp->m3, fp->i3);
+
+       debug("DCPLB_FAULT_ADDR=%p\n", *pDCPLB_FAULT_ADDR);
+       debug("ICPLB_FAULT_ADDR=%p\n", *pICPLB_FAULT_ADDR);
+
 }
diff --git a/cpu/bf533/video.c b/cpu/bf533/video.c
new file mode 100644 (file)
index 0000000..3ff0151
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * (C) Copyright 2000
+ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
+ * (C) Copyright 2002
+ * Wolfgang Denk, wd@denx.de
+ * (C) Copyright 2006
+ * Aubrey Li, aubrey.li@analog.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 <stdarg.h>
+#include <common.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <i2c.h>
+#include <linux/types.h>
+#include <devices.h>
+
+#ifdef CONFIG_VIDEO
+#define NTSC_FRAME_ADDR 0x06000000
+#include "video.h"
+
+/* NTSC OUTPUT SIZE  720 * 240 */
+#define VERTICAL       2
+#define HORIZONTAL     4
+
+int is_vblank_line(const int line)
+{
+       /*
+        *  This array contains a single bit for each line in
+        *  an NTSC frame.
+        */
+       if ((line <= 18) || (line >= 264 && line <= 281) || (line == 528))
+               return true;
+
+       return false;
+}
+
+int NTSC_framebuffer_init(char *base_address)
+{
+       const int NTSC_frames = 1;
+       const int NTSC_lines = 525;
+       char *dest = base_address;
+       int frame_num, line_num;
+
+       for (frame_num = 0; frame_num < NTSC_frames; ++frame_num) {
+               for (line_num = 1; line_num <= NTSC_lines; ++line_num) {
+                       unsigned int code;
+                       int offset = 0;
+                       int i;
+
+                       if (is_vblank_line(line_num))
+                               offset++;
+
+                       if (line_num > 266 || line_num < 3)
+                               offset += 2;
+
+                       /* Output EAV code */
+                       code = SystemCodeMap[offset].EAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output horizontal blanking */
+                       for (i = 0; i < 67 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+
+                       /* Output SAV */
+                       code = SystemCodeMap[offset].SAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output empty horizontal data */
+                       for (i = 0; i < 360 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+               }
+       }
+
+       return dest - base_address;
+}
+
+void fill_frame(char *Frame, int Value)
+{
+       int *OddPtr32;
+       int OddLine;
+       int *EvenPtr32;
+       int EvenLine;
+       int i;
+       int *data;
+       int m, n;
+
+       /* fill odd and even frames */
+       for (OddLine = 22, EvenLine = 285; OddLine < 263; OddLine++, EvenLine++) {
+               OddPtr32 = (int *)((Frame + (OddLine * 1716)) + 276);
+               EvenPtr32 = (int *)((Frame + (EvenLine * 1716)) + 276);
+               for (i = 0; i < 360; i++, OddPtr32++, EvenPtr32++) {
+                       *OddPtr32 = Value;
+                       *EvenPtr32 = Value;
+               }
+       }
+
+       for (m = 0; m < VERTICAL; m++) {
+               data = (int *)u_boot_logo.data;
+               for (OddLine = (22 + m), EvenLine = (285 + m);
+                    OddLine < (u_boot_logo.height * VERTICAL) + (22 + m);
+                    OddLine += VERTICAL, EvenLine += VERTICAL) {
+                       OddPtr32 = (int *)((Frame + ((OddLine) * 1716)) + 276);
+                       EvenPtr32 =
+                           (int *)((Frame + ((EvenLine) * 1716)) + 276);
+                       for (i = 0; i < u_boot_logo.width / 2; i++) {
+                               /* enlarge one pixel to m x n */
+                               for (n = 0; n < HORIZONTAL; n++) {
+                                       *OddPtr32++ = *data;
+                                       *EvenPtr32++ = *data;
+                               }
+                               data++;
+                       }
+               }
+       }
+}
+
+void video_putc(const char c)
+{
+}
+
+void video_puts(const char *s)
+{
+}
+
+static int video_init(void)
+{
+       char *NTSCFrame;
+       NTSCFrame = (char *)NTSC_FRAME_ADDR;
+       NTSC_framebuffer_init(NTSCFrame);
+       fill_frame(NTSCFrame, BLUE);
+
+       *pPPI_CONTROL = 0x0082;
+       *pPPI_FRAME = 0x020D;
+
+       *pDMA0_START_ADDR = NTSCFrame;
+       *pDMA0_X_COUNT = 0x035A;
+       *pDMA0_X_MODIFY = 0x0002;
+       *pDMA0_Y_COUNT = 0x020D;
+       *pDMA0_Y_MODIFY = 0x0002;
+       *pDMA0_CONFIG = 0x1015;
+       *pPPI_CONTROL = 0x0083;
+       return 0;
+}
+
+int drv_video_init(void)
+{
+       int error, devices = 1;
+
+       device_t videodev;
+
+       video_init();           /* Video initialization */
+
+       memset(&videodev, 0, sizeof(videodev));
+
+       strcpy(videodev.name, "video");
+       videodev.ext = DEV_EXT_VIDEO;   /* Video extensions */
+       videodev.flags = DEV_FLAGS_OUTPUT;      /* Output only */
+       videodev.putc = video_putc;     /* 'putc' function */
+       videodev.puts = video_puts;     /* 'puts' function */
+
+       error = device_register(&videodev);
+
+       return (error == 0) ? devices : error;
+}
+#endif
diff --git a/cpu/bf533/video.h b/cpu/bf533/video.h
new file mode 100644 (file)
index 0000000..d237f6a
--- /dev/null
@@ -0,0 +1,25 @@
+#include <video_logo.h>
+#define write_dest_byte(val) {*dest++=val;}
+#define BLACK   (0x01800180)   /* black pixel pattern  */
+#define BLUE    (0x296E29F0)   /* blue pixel pattern   */
+#define RED     (0x51F0515A)   /* red pixel pattern    */
+#define MAGENTA (0x6ADE6ACA)   /* magenta pixel pattern */
+#define GREEN   (0x91229136)   /* green pixel pattern  */
+#define CYAN    (0xAA10AAA6)   /* cyan pixel pattern   */
+#define YELLOW  (0xD292D210)   /* yellow pixel pattern */
+#define WHITE   (0xFE80FE80)   /* white pixel pattern  */
+
+#define true   1
+#define false  0
+
+typedef struct {
+       unsigned int SAV;
+       unsigned int EAV;
+} SystemCodeType;
+
+const SystemCodeType SystemCodeMap[4] = {
+       {0xFF000080, 0xFF00009D},
+       {0xFF0000AB, 0xFF0000B6},
+       {0xFF0000C7, 0xFF0000DA},
+       {0xFF0000EC, 0xFF0000F1}
+};
diff --git a/cpu/bf537/Makefile b/cpu/bf537/Makefile
new file mode 100644 (file)
index 0000000..8b0f9c0
--- /dev/null
@@ -0,0 +1,52 @@
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Devices Inc.
+#
+# (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(CPU).a
+
+START  = start.o start1.o interrupt.o cache.o flush.o init_sdram.o
+COBJS  = cpu.o traps.o ints.o serial.o interrupts.o video.o i2c.o
+
+EXTRA = init_sdram_bootrom_initblock.o
+
+SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
+START  := $(addprefix $(obj),$(START))
+
+all:   $(obj).depend $(START) $(LIB) $(obj).depend $(EXTRA)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/bf537/cache.S b/cpu/bf537/cache.S
new file mode 100644 (file)
index 0000000..5bda5bf
--- /dev/null
@@ -0,0 +1,128 @@
+#define ASSEMBLY
+#include <asm/linkage.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.text
+.align 2
+ENTRY(_blackfin_icache_flush_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+       1:
+       IFLUSH[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+       IFLUSH[P0];
+       SSYNC;
+       RTS;
+
+ENTRY(_blackfin_dcache_flush_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+1:
+       FLUSH[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+       FLUSH[P0];
+       SSYNC;
+       RTS;
+
+ENTRY(_icache_invalidate)
+ENTRY(_invalidate_entire_icache)
+       [--SP] = (R7:5);
+
+       P0.L = (IMEM_CONTROL & 0xFFFF);
+       P0.H = (IMEM_CONTROL >> 16);
+       R7 =[P0];
+
+       /*
+        * Clear the IMC bit , All valid bits in the instruction
+        * cache are set to the invalid state
+        */
+       BITCLR(R7, IMC_P);
+       CLI R6;
+       /* SSYNC required before invalidating cache. */
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       /* Configures the instruction cache agian */
+       R6 = (IMC | ENICPLB);
+       R7 = R7 | R6;
+
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       (R7:5) =[SP++];
+       RTS;
+
+/*
+ * Invalidate the Entire Data cache by
+ * clearing DMC[1:0] bits
+ */
+ENTRY(_invalidate_entire_dcache)
+ENTRY(_dcache_invalidate)
+       [--SP] = (R7:6);
+
+       P0.L = (DMEM_CONTROL & 0xFFFF);
+       P0.H = (DMEM_CONTROL >> 16);
+       R7 =[P0];
+
+       /*
+        * Clear the DMC[1:0] bits, All valid bits in the data
+        * cache are set to the invalid state
+        */
+       BITCLR(R7, DMC0_P);
+       BITCLR(R7, DMC1_P);
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+       /* Configures the data cache again */
+
+       R6 = (ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+       R7 = R7 | R6;
+
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       (R7:6) =[SP++];
+       RTS;
+
+ENTRY(_blackfin_dcache_invalidate_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+1:
+       FLUSHINV[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+
+       /*
+        * If the data crosses a cache line, then we'll be pointing to
+        * the last cache line, but won't have flushed/invalidated it yet, so do
+        * one more.
+        */
+       FLUSHINV[P0];
+       SSYNC;
+       RTS;
diff --git a/cpu/bf537/config.mk b/cpu/bf537/config.mk
new file mode 100644 (file)
index 0000000..8a35789
--- /dev/null
@@ -0,0 +1,27 @@
+# U-boot - config.mk
+#
+# Copyright (c) 2005-2007 Analog Devices Inc.
+#
+# (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+
+PLATFORM_RELFLAGS += -mcpu=bf537 -ffixed-P5
diff --git a/cpu/bf537/cpu.c b/cpu/bf537/cpu.c
new file mode 100644 (file)
index 0000000..62f603b
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * U-boot - cpu.c CPU specific functions
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/blackfin.h>
+#include <command.h>
+#include <asm/entry.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
+
+#define CACHE_ON 1
+#define CACHE_OFF 0
+
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       __asm__ __volatile__("cli r3;" "P0 = %0;" "JUMP (P0);"::"r"(L1_ISRAM)
+           );
+
+       return 0;
+}
+
+/* These functions are just used to satisfy the linker */
+int cpu_init(void)
+{
+       return 0;
+}
+
+int cleanup_before_linux(void)
+{
+       return 0;
+}
+
+void icache_enable(void)
+{
+       unsigned int *I0, *I1;
+       int i, j = 0;
+
+       if ((*pCHIPID >> 28) < 2)
+               return;
+
+       /* Before enable icache, disable it first */
+       icache_disable();
+       I0 = (unsigned int *)ICPLB_ADDR0;
+       I1 = (unsigned int *)ICPLB_DATA0;
+
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & icplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & icplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
+               }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
+               }
+
+       }
+
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
+       sync();
+       sti();
+}
+
+void icache_disable(void)
+{
+       if ((*pCHIPID >> 28) < 2)
+               return;
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
+       sync();
+       sti();
+}
+
+int icache_status(void)
+{
+       unsigned int value;
+       value = *(unsigned int *)IMEM_CONTROL;
+
+       if (value & (IMC | ENICPLB))
+               return CACHE_ON;
+       else
+               return CACHE_OFF;
+}
+
+void dcache_enable(void)
+{
+       unsigned int *I0, *I1;
+       unsigned int temp;
+       int i, j = 0;
+
+       /* Before enable dcache, disable it first */
+       dcache_disable();
+       I0 = (unsigned int *)DCPLB_ADDR0;
+       I1 = (unsigned int *)DCPLB_DATA0;
+
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & dcplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+               } else {
+                       debug("skip   %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & dcplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                                dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
+               }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
+               }
+       }
+
+       cli();
+       temp = *(unsigned int *)DMEM_CONTROL;
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL =
+           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | temp;
+       sync();
+       sti();
+}
+
+void dcache_disable(void)
+{
+       unsigned int *I0, *I1;
+       int i;
+
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL &=
+           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+       sync();
+       sti();
+
+       /* after disable dcache,
+        * clear it so we don't confuse the next application
+        */
+       I0 = (unsigned int *)DCPLB_ADDR0;
+       I1 = (unsigned int *)DCPLB_DATA0;
+
+       for (i = 0; i < 16; i++) {
+               *I0++ = 0x0;
+               *I1++ = 0x0;
+       }
+}
+
+int dcache_status(void)
+{
+       unsigned int value;
+       value = *(unsigned int *)DMEM_CONTROL;
+
+       if (value & (ENDCPLB))
+               return CACHE_ON;
+       else
+               return CACHE_OFF;
+}
diff --git a/cpu/bf537/cpu.h b/cpu/bf537/cpu.h
new file mode 100644 (file)
index 0000000..b6b73b1
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *  U-boot - cpu.h
+ *
+ *  Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _CPU_H_
+#define _CPU_H_
+
+#include <command.h>
+
+#define INTERNAL_IRQS (32)
+#define NUM_IRQ_NODES 16
+#define DEF_INTERRUPT_FLAGS 1
+#define MAX_TIM_LOAD   0xFFFFFFFF
+
+void blackfin_irq_panic(int reason, struct pt_regs *reg);
+extern void dump(struct pt_regs *regs);
+void display_excp(void);
+asmlinkage void evt_nmi(void);
+asmlinkage void evt_exception(void);
+asmlinkage void trap(void);
+asmlinkage void evt_ivhw(void);
+asmlinkage void evt_rst(void);
+asmlinkage void evt_timer(void);
+asmlinkage void evt_evt7(void);
+asmlinkage void evt_evt8(void);
+asmlinkage void evt_evt9(void);
+asmlinkage void evt_evt10(void);
+asmlinkage void evt_evt11(void);
+asmlinkage void evt_evt12(void);
+asmlinkage void evt_evt13(void);
+asmlinkage void evt_soft_int1(void);
+asmlinkage void evt_system_call(void);
+void blackfin_irq_panic(int reason, struct pt_regs *regs);
+void blackfin_free_irq(unsigned int irq, void *dev_id);
+void call_isr(int irq, struct pt_regs *fp);
+void blackfin_do_irq(int vec, struct pt_regs *fp);
+void blackfin_init_IRQ(void);
+void blackfin_enable_irq(unsigned int irq);
+void blackfin_disable_irq(unsigned int irq);
+extern int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
+int blackfin_request_irq(unsigned int irq,
+                        void (*handler) (int, void *, struct pt_regs *),
+                        unsigned long flags, const char *devname,
+                        void *dev_id);
+void timer_init(void);
+#endif
diff --git a/cpu/bf537/flush.S b/cpu/bf537/flush.S
new file mode 100644 (file)
index 0000000..fbd26cc
--- /dev/null
@@ -0,0 +1,403 @@
+/* Copyright (C) 2003-2007 Analog Devices Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+#include <asm/cplb.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.text
+
+/* This is an external function being called by the user
+ * application through __flush_cache_all. Currently this function
+ * serves the purpose of flushing all the pending writes in
+ * in the instruction cache.
+ */
+
+ENTRY(_flush_instruction_cache)
+       [--SP] = ( R7:6, P5:4 );
+       LINK 12;
+       SP += -12;
+       P5.H = (ICPLB_ADDR0 >> 16);
+       P5.L = (ICPLB_ADDR0 & 0xFFFF);
+       P4.H = (ICPLB_DATA0 >> 16);
+       P4.L = (ICPLB_DATA0 & 0xFFFF);
+       R7 = CPLB_VALID | CPLB_L1_CHBL;
+       R6 = 16;
+inext: R0 = [P5++];
+       R1 = [P4++];
+       [--SP] =  RETS;
+       CALL _icplb_flush;      /* R0 = page, R1 = data*/
+       RETS = [SP++];
+iskip: R6 += -1;
+       CC = R6;
+       IF CC JUMP inext;
+       SSYNC;
+       SP += 12;
+       UNLINK;
+       ( R7:6, P5:4 ) = [SP++];
+       RTS;
+
+/* This is an internal function to flush all pending
+ * writes in the cache associated with a particular ICPLB.
+ *
+ * R0 -  page's start address
+ * R1 -  CPLB's data field.
+ */
+
+.align 2
+ENTRY(_icplb_flush)
+       [--SP] = ( R7:0, P5:0 );
+       [--SP] = LC0;
+       [--SP] = LT0;
+       [--SP] = LB0;
+       [--SP] = LC1;
+       [--SP] = LT1;
+       [--SP] = LB1;
+
+       /* If it's a 1K or 4K page, then it's quickest to
+        * just systematically flush all the addresses in
+        * the page, regardless of whether they're in the
+        * cache, or dirty. If it's a 1M or 4M page, there
+        * are too many addresses, and we have to search the
+        * cache for lines corresponding to the page.
+        */
+
+       CC = BITTST(R1, 17);    /* 1MB or 4MB */
+       IF !CC JUMP iflush_whole_page;
+
+       /* We're only interested in the page's size, so extract
+        * this from the CPLB (bits 17:16), and scale to give an
+        * offset into the page_size and page_prefix tables.
+        */
+
+       R1 <<= 14;
+       R1 >>= 30;
+       R1 <<= 2;
+
+       /* We can also determine the sub-bank used, because this is
+        * taken from bits 13:12 of the address.
+        */
+
+       R3 = ((12<<8)|2);               /* Extraction pattern */
+       nop;                            /* Anamoly 05000209 */
+       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits */
+
+       /* Save in extraction pattern for later deposit. */
+       R3.H = R4.L << 0;
+
+       /* So:
+        * R0 = Page start
+        * R1 = Page length (actually, offset into size/prefix tables)
+        * R3 = sub-bank deposit values
+        *
+        * The cache has 2 Ways, and 64 sets, so we iterate through
+        * the sets, accessing the tag for each Way, for our Bank and
+        * sub-bank, looking for dirty, valid tags that match our
+        * address prefix.
+        */
+
+       P5.L = (ITEST_COMMAND & 0xFFFF);
+       P5.H = (ITEST_COMMAND >> 16);
+       P4.L = (ITEST_DATA0 & 0xFFFF);
+       P4.H = (ITEST_DATA0 >> 16);
+
+       P0.L = page_prefix_table;
+       P0.H = page_prefix_table;
+       P1 = R1;
+       R5 = 0;                 /* Set counter*/
+       P0 = P1 + P0;
+       R4 = [P0];              /* This is the address prefix*/
+
+       /* We're reading (bit 1==0) the tag (bit 2==0), and we
+        * don't care about which double-word, since we're only
+        * fetching tags, so we only have to set Set, Bank,
+        * Sub-bank and Way.
+        */
+
+       P2 = 4;
+       LSETUP (ifs1, ife1) LC1 = P2;
+ifs1:  P0 = 32;                /* iterate over all sets*/
+       LSETUP (ifs0, ife0) LC0 = P0;
+ifs0:  R6 = R5 << 5;           /* Combine set*/
+       R6.H = R3.H << 0 ;      /* and sub-bank*/
+       [P5] = R6;              /* Issue Command*/
+       SSYNC;                  /* CSYNC will not work here :(*/
+       R7 = [P4];              /* and read Tag.*/
+       CC = BITTST(R7, 0);     /* Check if valid*/
+       IF !CC JUMP ifskip;     /* and skip if not.*/
+
+       /* Compare against the page address. First, plant bits 13:12
+        * into the tag, since those aren't part of the returned data.
+        */
+
+       R7 = DEPOSIT(R7, R3);   /* set 13:12*/
+       R1 = R7 & R4;           /* Mask off lower bits*/
+       CC = R1 == R0;          /* Compare against page start.*/
+       IF !CC JUMP ifskip;     /* Skip it if it doesn't match.*/
+
+       /* Tag address matches against page, so this is an entry
+        * we must flush.
+        */
+
+       R7 >>= 10;              /* Mask off the non-address bits*/
+       R7 <<= 10;
+       P3 = R7;
+       IFLUSH [P3];            /* And flush the entry*/
+ifskip:
+ife0:  R5 += 1;                /* Advance to next Set*/
+ife1:  NOP;
+
+ifinished:
+       SSYNC;                  /* Ensure the data gets out to mem.*/
+
+       /*Finished. Restore context.*/
+       LB1 = [SP++];
+       LT1 = [SP++];
+       LC1 = [SP++];
+       LB0 = [SP++];
+       LT0 = [SP++];
+       LC0 = [SP++];
+       ( R7:0, P5:0 ) = [SP++];
+       RTS;
+
+iflush_whole_page:
+       /* It's a 1K or 4K page, so quicker to just flush the
+        * entire page.
+        */
+
+       P1 = 32;                /* For 1K pages*/
+       P2 = P1 << 2;           /* For 4K pages*/
+       P0 = R0;                /* Start of page*/
+       CC = BITTST(R1, 16);    /* Whether 1K or 4K*/
+       IF CC P1 = P2;
+       P1 += -1;               /* Unroll one iteration*/
+       SSYNC;
+       IFLUSH [P0++];          /* because CSYNC can't end loops.*/
+       LSETUP (isall, ieall) LC0 = P1;
+isall:IFLUSH [P0++];
+ieall: NOP;
+       SSYNC;
+       JUMP ifinished;
+
+/* This is an external function being called by the user
+ * application through __flush_cache_all. Currently this function
+ * serves the purpose of flushing all the pending writes in
+ * in the data cache.
+ */
+
+ENTRY(_flush_data_cache)
+       [--SP] = ( R7:6, P5:4 );
+       LINK 12;
+       SP += -12;
+       P5.H = (DCPLB_ADDR0 >> 16);
+       P5.L = (DCPLB_ADDR0 & 0xFFFF);
+       P4.H = (DCPLB_DATA0 >> 16);
+       P4.L = (DCPLB_DATA0 & 0xFFFF);
+       R7 = CPLB_VALID | CPLB_L1_CHBL | CPLB_DIRTY (Z);
+       R6 = 16;
+next:  R0 = [P5++];
+       R1 = [P4++];
+       CC = BITTST(R1, 14);    /* Is it write-through?*/
+       IF CC JUMP skip;        /* If so, ignore it.*/
+       R2 = R1 & R7;           /* Is it a dirty, cached page?*/
+       CC = R2;
+       IF !CC JUMP skip;       /* If not, ignore it.*/
+       [--SP] = RETS;
+       CALL _dcplb_flush;      /* R0 = page, R1 = data*/
+       RETS = [SP++];
+skip:  R6 += -1;
+       CC = R6;
+       IF CC JUMP next;
+       SSYNC;
+       SP += 12;
+       UNLINK;
+       ( R7:6, P5:4 ) = [SP++];
+       RTS;
+
+/* This is an internal function to flush all pending
+ * writes in the cache associated with a particular DCPLB.
+ *
+ * R0 -  page's start address
+ * R1 -  CPLB's data field.
+ */
+
+.align 2
+ENTRY(_dcplb_flush)
+       [--SP] = ( R7:0, P5:0 );
+       [--SP] = LC0;
+       [--SP] = LT0;
+       [--SP] = LB0;
+       [--SP] = LC1;
+       [--SP] = LT1;
+       [--SP] = LB1;
+
+       /* If it's a 1K or 4K page, then it's quickest to
+        * just systematically flush all the addresses in
+        * the page, regardless of whether they're in the
+        * cache, or dirty. If it's a 1M or 4M page, there
+        * are too many addresses, and we have to search the
+        * cache for lines corresponding to the page.
+        */
+
+       CC = BITTST(R1, 17);    /* 1MB or 4MB */
+       IF !CC JUMP dflush_whole_page;
+
+       /* We're only interested in the page's size, so extract
+        * this from the CPLB (bits 17:16), and scale to give an
+        * offset into the page_size and page_prefix tables.
+        */
+
+       R1 <<= 14;
+       R1 >>= 30;
+       R1 <<= 2;
+
+       /* The page could be mapped into Bank A or Bank B, depending
+        * on (a) whether both banks are configured as cache, and
+        * (b) on whether address bit A[x] is set. x is determined
+        * by DCBS in DMEM_CONTROL
+        */
+
+       R2 = 0;                 /* Default to Bank A (Bank B would be 1)*/
+
+       P0.L = (DMEM_CONTROL & 0xFFFF);
+       P0.H = (DMEM_CONTROL >> 16);
+
+       R3 = [P0];              /* If Bank B is not enabled as cache*/
+       CC = BITTST(R3, 2);     /* then Bank A is our only option.*/
+       IF CC JUMP bank_chosen;
+
+       R4 = 1<<14;             /* If DCBS==0, use A[14].*/
+       R5 = R4 << 7;           /* If DCBS==1, use A[23];*/
+       CC = BITTST(R3, 4);
+       IF CC R4 = R5;          /* R4 now has either bit 14 or bit 23 set.*/
+       R5 = R0 & R4;           /* Use it to test the Page address*/
+       CC = R5;                /* and if that bit is set, we use Bank B,*/
+       R2 = CC;                /* else we use Bank A.*/
+       R2 <<= 23;              /* The Bank selection's at posn 23.*/
+
+bank_chosen:
+
+       /* We can also determine the sub-bank used, because this is
+        * taken from bits 13:12 of the address.
+        */
+
+       R3 = ((12<<8)|2);               /* Extraction pattern */
+       nop;                            /*Anamoly 05000209*/
+       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits*/
+       /* Save in extraction pattern for later deposit.*/
+       R3.H = R4.L << 0;
+
+       /* So:
+        * R0 = Page start
+        * R1 = Page length (actually, offset into size/prefix tables)
+        * R2 = Bank select mask
+        * R3 = sub-bank deposit values
+        *
+        * The cache has 2 Ways, and 64 sets, so we iterate through
+        * the sets, accessing the tag for each Way, for our Bank and
+        * sub-bank, looking for dirty, valid tags that match our
+        * address prefix.
+        */
+
+       P5.L = (DTEST_COMMAND & 0xFFFF);
+       P5.H = (DTEST_COMMAND >> 16);
+       P4.L = (DTEST_DATA0 & 0xFFFF);
+       P4.H = (DTEST_DATA0 >> 16);
+
+       P0.L = page_prefix_table;
+       P0.H = page_prefix_table;
+       P1 = R1;
+       R5 = 0;                 /* Set counter*/
+       P0 = P1 + P0;
+       R4 = [P0];              /* This is the address prefix*/
+
+
+       /* We're reading (bit 1==0) the tag (bit 2==0), and we
+        * don't care about which double-word, since we're only
+        * fetching tags, so we only have to set Set, Bank,
+        * Sub-bank and Way.
+        */
+
+       P2 = 2;
+       LSETUP (fs1, fe1) LC1 = P2;
+fs1:   P0 = 64;                /* iterate over all sets*/
+       LSETUP (fs0, fe0) LC0 = P0;
+fs0:   R6 = R5 << 5;           /* Combine set*/
+       R6.H = R3.H << 0 ;      /* and sub-bank*/
+       R6 = R6 | R2;           /* and Bank. Leave Way==0 at first.*/
+       BITSET(R6,14);
+       [P5] = R6;              /* Issue Command*/
+       SSYNC;
+       R7 = [P4];              /* and read Tag.*/
+       CC = BITTST(R7, 0);     /* Check if valid*/
+       IF !CC JUMP fskip;      /* and skip if not.*/
+       CC = BITTST(R7, 1);     /* Check if dirty*/
+       IF !CC JUMP fskip;      /* and skip if not.*/
+
+       /* Compare against the page address. First, plant bits 13:12
+        * into the tag, since those aren't part of the returned data.
+        */
+
+       R7 = DEPOSIT(R7, R3);   /* set 13:12*/
+       R1 = R7 & R4;           /* Mask off lower bits*/
+       CC = R1 == R0;          /* Compare against page start.*/
+       IF !CC JUMP fskip;      /* Skip it if it doesn't match.*/
+
+       /* Tag address matches against page, so this is an entry
+        * we must flush.
+        */
+
+       R7 >>= 10;              /* Mask off the non-address bits*/
+       R7 <<= 10;
+       P3 = R7;
+       SSYNC;
+       FLUSHINV [P3];          /* And flush the entry*/
+fskip:
+fe0:   R5 += 1;                /* Advance to next Set*/
+fe1:   BITSET(R2, 26);         /* Go to next Way.*/
+
+dfinished:
+       SSYNC;                  /* Ensure the data gets out to mem.*/
+
+       /*Finished. Restore context.*/
+       LB1 = [SP++];
+       LT1 = [SP++];
+       LC1 = [SP++];
+       LB0 = [SP++];
+       LT0 = [SP++];
+       LC0 = [SP++];
+       ( R7:0, P5:0 ) = [SP++];
+       RTS;
+
+dflush_whole_page:
+
+       /* It's a 1K or 4K page, so quicker to just flush the
+        * entire page.
+        */
+
+       P1 = 32;                /* For 1K pages*/
+       P2 = P1 << 2;           /* For 4K pages*/
+       P0 = R0;                /* Start of page*/
+       CC = BITTST(R1, 16);    /* Whether 1K or 4K*/
+       IF CC P1 = P2;
+       P1 += -1;               /* Unroll one iteration*/
+       SSYNC;
+       FLUSHINV [P0++];        /* because CSYNC can't end loops.*/
+       LSETUP (eall, eall) LC0 = P1;
+eall:  FLUSHINV [P0++];
+       SSYNC;
+       JUMP dfinished;
+
+.align 4;
+page_prefix_table:
+.byte4         0xFFFFFC00;     /* 1K */
+.byte4 0xFFFFF000;     /* 4K */
+.byte4 0xFFF00000;     /* 1M */
+.byte4 0xFFC00000;     /* 4M */
+.page_prefix_table.end:
diff --git a/cpu/bf537/i2c.c b/cpu/bf537/i2c.c
new file mode 100644 (file)
index 0000000..3b0d026
--- /dev/null
@@ -0,0 +1,460 @@
+/****************************************************************
+ * $ID: i2c.c  24 Oct 2006 12:00:00 +0800 $                    *
+ *                                                             *
+ * Description:                                                        *
+ *                                                             *
+ * Maintainer:  sonicz  <sonic.zhang@analog.com>               *
+ *                                                             *
+ * CopyRight (c)  2006  Analog Device                          *
+ * All rights reserved.                                                *
+ *                                                             *
+ * This file is free software;                                 *
+ *     you are free to modify and/or redistribute it           *
+ *     under the terms of the GNU General Public Licence (GPL).*
+ *                                                             *
+ ****************************************************************/
+
+#include <common.h>
+
+#ifdef CONFIG_HARD_I2C
+
+#include <asm/blackfin.h>
+#include <i2c.h>
+#include <asm/io.h>
+
+#define bfin_read16(addr) ({ unsigned __v; \
+                       __asm__ __volatile__ (\
+                       "%0 = w[%1] (z);\n\t"\
+                       : "=d"(__v) : "a"(addr)); (unsigned short)__v; })
+
+#define bfin_write16(addr,val) ({\
+                       __asm__ __volatile__ (\
+                       "w[%0] = %1;\n\t"\
+                       : : "a"(addr) , "d"(val) : "memory");})
+
+/* Two-Wire Interface          (0xFFC01400 - 0xFFC014FF) */
+#define bfin_read_TWI_CLKDIV()         bfin_read16(TWI_CLKDIV)
+#define bfin_write_TWI_CLKDIV(val)     bfin_write16(TWI_CLKDIV,val)
+#define bfin_read_TWI_CONTROL()                bfin_read16(TWI_CONTROL)
+#define bfin_write_TWI_CONTROL(val)    bfin_write16(TWI_CONTROL,val)
+#define bfin_read_TWI_SLAVE_CTL()      bfin_read16(TWI_SLAVE_CTL)
+#define bfin_write_TWI_SLAVE_CTL(val)  bfin_write16(TWI_SLAVE_CTL,val)
+#define bfin_read_TWI_SLAVE_STAT()     bfin_read16(TWI_SLAVE_STAT)
+#define bfin_write_TWI_SLAVE_STAT(val) bfin_write16(TWI_SLAVE_STAT,val)
+#define bfin_read_TWI_SLAVE_ADDR()     bfin_read16(TWI_SLAVE_ADDR)
+#define bfin_write_TWI_SLAVE_ADDR(val) bfin_write16(TWI_SLAVE_ADDR,val)
+#define bfin_read_TWI_MASTER_CTL()     bfin_read16(TWI_MASTER_CTL)
+#define bfin_write_TWI_MASTER_CTL(val) bfin_write16(TWI_MASTER_CTL,val)
+#define bfin_read_TWI_MASTER_STAT()    bfin_read16(TWI_MASTER_STAT)
+#define bfin_write_TWI_MASTER_STAT(val)        bfin_write16(TWI_MASTER_STAT,val)
+#define bfin_read_TWI_MASTER_ADDR()    bfin_read16(TWI_MASTER_ADDR)
+#define bfin_write_TWI_MASTER_ADDR(val)        bfin_write16(TWI_MASTER_ADDR,val)
+#define bfin_read_TWI_INT_STAT()       bfin_read16(TWI_INT_STAT)
+#define bfin_write_TWI_INT_STAT(val)   bfin_write16(TWI_INT_STAT,val)
+#define bfin_read_TWI_INT_MASK()       bfin_read16(TWI_INT_MASK)
+#define bfin_write_TWI_INT_MASK(val)   bfin_write16(TWI_INT_MASK,val)
+#define bfin_read_TWI_FIFO_CTL()       bfin_read16(TWI_FIFO_CTL)
+#define bfin_write_TWI_FIFO_CTL(val)   bfin_write16(TWI_FIFO_CTL,val)
+#define bfin_read_TWI_FIFO_STAT()      bfin_read16(TWI_FIFO_STAT)
+#define bfin_write_TWI_FIFO_STAT(val)  bfin_write16(TWI_FIFO_STAT,val)
+#define bfin_read_TWI_XMT_DATA8()      bfin_read16(TWI_XMT_DATA8)
+#define bfin_write_TWI_XMT_DATA8(val)  bfin_write16(TWI_XMT_DATA8,val)
+#define bfin_read_TWI_XMT_DATA16()     bfin_read16(TWI_XMT_DATA16)
+#define bfin_write_TWI_XMT_DATA16(val) bfin_write16(TWI_XMT_DATA16,val)
+#define bfin_read_TWI_RCV_DATA8()      bfin_read16(TWI_RCV_DATA8)
+#define bfin_write_TWI_RCV_DATA8(val)  bfin_write16(TWI_RCV_DATA8,val)
+#define bfin_read_TWI_RCV_DATA16()     bfin_read16(TWI_RCV_DATA16)
+#define bfin_write_TWI_RCV_DATA16(val) bfin_write16(TWI_RCV_DATA16,val)
+
+#ifdef DEBUG_I2C
+#define PRINTD(fmt,args...)    do {    \
+       DECLARE_GLOBAL_DATA_PTR;        \
+       if (gd->have_console)           \
+               printf(fmt ,##args);    \
+       } while (0)
+#else
+#define PRINTD(fmt,args...)
+#endif
+
+#ifndef CONFIG_TWICLK_KHZ
+#define CONFIG_TWICLK_KHZ      50
+#endif
+
+/* All transfers are described by this data structure */
+struct i2c_msg {
+       u16 addr;               /* slave address */
+       u16 flags;
+#define I2C_M_STOP             0x2
+#define I2C_M_RD               0x1
+       u16 len;                /* msg length */
+       u8 *buf;                /* pointer to msg data */
+};
+
+/**
+ * i2c_reset: - reset the host controller
+ *
+ */
+
+static void i2c_reset(void)
+{
+       /* Disable TWI */
+       bfin_write_TWI_CONTROL(0);
+       sync();
+
+       /* Set TWI internal clock as 10MHz */
+       bfin_write_TWI_CONTROL(((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F);
+
+       /* Set Twi interface clock as specified */
+       if (CONFIG_TWICLK_KHZ > 400)
+               bfin_write_TWI_CLKDIV(((5 * 1024 / 400) << 8) | ((5 * 1024 /
+                                               400) & 0xFF));
+       else
+               bfin_write_TWI_CLKDIV(((5 * 1024 /
+                                       CONFIG_TWICLK_KHZ) << 8) | ((5 * 1024 /
+                                               CONFIG_TWICLK_KHZ)
+                                               & 0xFF));
+
+       /* Enable TWI */
+       bfin_write_TWI_CONTROL(bfin_read_TWI_CONTROL() | TWI_ENA);
+       sync();
+}
+
+int wait_for_completion(struct i2c_msg *msg, int timeout_count)
+{
+       unsigned short twi_int_stat;
+       unsigned short mast_stat;
+       int i;
+
+       for (i = 0; i < timeout_count; i++) {
+               twi_int_stat = bfin_read_TWI_INT_STAT();
+               mast_stat = bfin_read_TWI_MASTER_STAT();
+
+               if (XMTSERV & twi_int_stat) {
+                       /* Transmit next data */
+                       if (msg->len > 0) {
+                               bfin_write_TWI_XMT_DATA8(*(msg->buf++));
+                               msg->len--;
+                       } else if (msg->flags & I2C_M_STOP)
+                               bfin_write_TWI_MASTER_CTL
+                                   (bfin_read_TWI_MASTER_CTL() | STOP);
+                       sync();
+                       /* Clear status */
+                       bfin_write_TWI_INT_STAT(XMTSERV);
+                       sync();
+                       i = 0;
+               }
+               if (RCVSERV & twi_int_stat) {
+                       if (msg->len > 0) {
+                               /* Receive next data */
+                               *(msg->buf++) = bfin_read_TWI_RCV_DATA8();
+                               msg->len--;
+                       } else if (msg->flags & I2C_M_STOP) {
+                               bfin_write_TWI_MASTER_CTL
+                                   (bfin_read_TWI_MASTER_CTL() | STOP);
+                               sync();
+                       }
+                       /* Clear interrupt source */
+                       bfin_write_TWI_INT_STAT(RCVSERV);
+                       sync();
+                       i = 0;
+               }
+               if (MERR & twi_int_stat) {
+                       bfin_write_TWI_INT_STAT(MERR);
+                       bfin_write_TWI_INT_MASK(0);
+                       bfin_write_TWI_MASTER_STAT(0x3e);
+                       bfin_write_TWI_MASTER_CTL(0);
+                       sync();
+                       /*
+                        * if both err and complete int stats are set,
+                        * return proper results.
+                        */
+                       if (MCOMP & twi_int_stat) {
+                               bfin_write_TWI_INT_STAT(MCOMP);
+                               bfin_write_TWI_INT_MASK(0);
+                               bfin_write_TWI_MASTER_CTL(0);
+                               sync();
+                               /*
+                                * If it is a quick transfer,
+                                * only address bug no data, not an err.
+                                */
+                               if (msg->len == 0 && mast_stat & BUFRDERR)
+                                       return 0;
+                               /*
+                                * If address not acknowledged return -3,
+                                * else return 0.
+                                */
+                               else if (!(mast_stat & ANAK))
+                                       return 0;
+                               else
+                                       return -3;
+                       }
+                       return -1;
+               }
+               if (MCOMP & twi_int_stat) {
+                       bfin_write_TWI_INT_STAT(MCOMP);
+                       sync();
+                       bfin_write_TWI_INT_MASK(0);
+                       bfin_write_TWI_MASTER_CTL(0);
+                       sync();
+                       return 0;
+               }
+       }
+       if (msg->flags & I2C_M_RD)
+               return -4;
+       else
+               return -2;
+}
+
+/**
+ * i2c_transfer: - Transfer one byte over the i2c bus
+ *
+ * This function can tranfer a byte over the i2c bus in both directions.
+ * It is used by the public API functions.
+ *
+ * @return:     0: transfer successful
+ *             -1: transfer fail
+ *             -2: transmit timeout
+ *             -3: ACK missing
+ *             -4: receive timeout
+ *             -5: controller not ready
+ */
+int i2c_transfer(struct i2c_msg *msg)
+{
+       int ret = 0;
+       int timeout_count = 10000;
+       int len = msg->len;
+
+       if (!(bfin_read_TWI_CONTROL() & TWI_ENA)) {
+               ret = -5;
+               goto transfer_error;
+       }
+
+       while (bfin_read_TWI_MASTER_STAT() & BUSBUSY) ;
+
+       /* Set Transmit device address */
+       bfin_write_TWI_MASTER_ADDR(msg->addr);
+
+       /*
+        * FIFO Initiation.
+        * Data in FIFO should be discarded before start a new operation.
+        */
+       bfin_write_TWI_FIFO_CTL(0x3);
+       sync();
+       bfin_write_TWI_FIFO_CTL(0);
+       sync();
+
+       if (!(msg->flags & I2C_M_RD)) {
+               /* Transmit first data */
+               if (msg->len > 0) {
+                       PRINTD("1 in i2c_transfer: buf=%d, len=%d\n", *msg->buf,
+                              len);
+                       bfin_write_TWI_XMT_DATA8(*(msg->buf++));
+                       msg->len--;
+                       sync();
+               }
+       }
+
+       /* clear int stat */
+       bfin_write_TWI_INT_STAT(MERR | MCOMP | XMTSERV | RCVSERV);
+
+       /* Interrupt mask . Enable XMT, RCV interrupt */
+       bfin_write_TWI_INT_MASK(MCOMP | MERR |
+                       ((msg->flags & I2C_M_RD) ? RCVSERV : XMTSERV));
+       sync();
+
+       if (len > 0 && len <= 255)
+               bfin_write_TWI_MASTER_CTL((len << 6));
+       else if (msg->len > 255) {
+               bfin_write_TWI_MASTER_CTL((0xff << 6));
+               msg->flags &= I2C_M_STOP;
+       } else
+               bfin_write_TWI_MASTER_CTL(0);
+
+       /* Master enable */
+       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() | MEN |
+                       ((msg->flags & I2C_M_RD)
+                        ? MDIR : 0) | ((CONFIG_TWICLK_KHZ >
+                                        100) ? FAST : 0));
+       sync();
+
+       ret = wait_for_completion(msg, timeout_count);
+       PRINTD("3 in i2c_transfer: ret=%d\n", ret);
+
+transfer_error:
+       switch (ret) {
+       case 1:
+               PRINTD(("i2c_transfer: error: transfer fail\n"));
+               break;
+       case 2:
+               PRINTD(("i2c_transfer: error: transmit timeout\n"));
+               break;
+       case 3:
+               PRINTD(("i2c_transfer: error: ACK missing\n"));
+               break;
+       case 4:
+               PRINTD(("i2c_transfer: error: receive timeout\n"));
+               break;
+       case 5:
+               PRINTD(("i2c_transfer: error: controller not ready\n"));
+               i2c_reset();
+               break;
+       default:
+               break;
+       }
+       return ret;
+
+}
+
+/* ---------------------------------------------------------------------*/
+/* API Functions                                                       */
+/* ---------------------------------------------------------------------*/
+
+void i2c_init(int speed, int slaveaddr)
+{
+       i2c_reset();
+}
+
+/**
+ * i2c_probe: - Test if a chip answers for a given i2c address
+ *
+ * @chip:      address of the chip which is searched for
+ * @return:    0 if a chip was found, -1 otherwhise
+ */
+
+int i2c_probe(uchar chip)
+{
+       struct i2c_msg msg;
+       u8 probebuf;
+
+       i2c_reset();
+
+       probebuf = 0;
+       msg.addr = chip;
+       msg.flags = 0;
+       msg.len = 1;
+       msg.buf = &probebuf;
+       if (i2c_transfer(&msg))
+               return -1;
+
+       msg.addr = chip;
+       msg.flags = I2C_M_RD;
+       msg.len = 1;
+       msg.buf = &probebuf;
+       if (i2c_transfer(&msg))
+               return -1;
+
+       return 0;
+}
+
+/**
+ *   i2c_read: - Read multiple bytes from an i2c device
+ *
+ *   chip:    I2C chip address, range 0..127
+ *   addr:    Memory (register) address within the chip
+ *   alen:    Number of bytes to use for addr (typically 1, 2 for larger
+ *             memories, 0 for register type devices with only one
+ *             register)
+ *   buffer:  Where to read/write the data
+ *   len:     How many bytes to read/write
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+
+int i2c_read(uchar chip, uint addr, int alen, uchar * buffer, int len)
+{
+       struct i2c_msg msg;
+       u8 addr_bytes[3];       /* lowest...highest byte of data address */
+
+       PRINTD("i2c_read: chip=0x%x, addr=0x%x, alen=0x%x, len=0x%x\n", chip,
+                       addr, alen, len);
+
+       if (alen > 0) {
+               addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF);
+               addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF);
+               addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF);
+               msg.addr = chip;
+               msg.flags = 0;
+               msg.len = alen;
+               msg.buf = addr_bytes;
+               if (i2c_transfer(&msg))
+                       return -1;
+       }
+
+       /* start read sequence */
+       PRINTD(("i2c_read: start read sequence\n"));
+       msg.addr = chip;
+       msg.flags = I2C_M_RD;
+       msg.len = len;
+       msg.buf = buffer;
+       if (i2c_transfer(&msg))
+               return -1;
+
+       return 0;
+}
+
+/**
+ *   i2c_write: -  Write multiple bytes to an i2c device
+ *
+ *   chip:    I2C chip address, range 0..127
+ *   addr:    Memory (register) address within the chip
+ *   alen:    Number of bytes to use for addr (typically 1, 2 for larger
+ *             memories, 0 for register type devices with only one
+ *             register)
+ *   buffer:  Where to read/write the data
+ *   len:     How many bytes to read/write
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+
+int i2c_write(uchar chip, uint addr, int alen, uchar * buffer, int len)
+{
+       struct i2c_msg msg;
+       u8 addr_bytes[3];       /* lowest...highest byte of data address */
+
+       PRINTD
+               ("i2c_write: chip=0x%x, addr=0x%x, alen=0x%x, len=0x%x, buf0=0x%x\n",
+                chip, addr, alen, len, buffer[0]);
+
+       /* chip address write */
+       if (alen > 0) {
+               addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF);
+               addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF);
+               addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF);
+               msg.addr = chip;
+               msg.flags = 0;
+               msg.len = alen;
+               msg.buf = addr_bytes;
+               if (i2c_transfer(&msg))
+                       return -1;
+       }
+
+       /* start read sequence */
+       PRINTD(("i2c_write: start write sequence\n"));
+       msg.addr = chip;
+       msg.flags = 0;
+       msg.len = len;
+       msg.buf = buffer;
+       if (i2c_transfer(&msg))
+               return -1;
+
+       return 0;
+
+}
+
+uchar i2c_reg_read(uchar chip, uchar reg)
+{
+       uchar buf;
+
+       PRINTD("i2c_reg_read: chip=0x%02x, reg=0x%02x\n", chip, reg);
+       i2c_read(chip, reg, 0, &buf, 1);
+       return (buf);
+}
+
+void i2c_reg_write(uchar chip, uchar reg, uchar val)
+{
+       PRINTD("i2c_reg_write: chip=0x%02x, reg=0x%02x, val=0x%02x\n", chip,
+                       reg, val);
+       i2c_write(chip, reg, 0, &val, 1);
+}
+
+#endif                         /* CONFIG_HARD_I2C */
diff --git a/cpu/bf537/init_sdram.S b/cpu/bf537/init_sdram.S
new file mode 100644 (file)
index 0000000..897a589
--- /dev/null
@@ -0,0 +1,174 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+
+       p0.h = hi(SPI_BAUD);
+       p0.l = lo(SPI_BAUD);
+       r0.l = CONFIG_SPI_BAUD;
+       w[p0] = r0.l;
+       SSYNC;
+#endif
+
+#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
+
+#ifdef CONFIG_BF537
+       /* Enable PHY CLK buffer output */
+       p0.h = hi(VR_CTL);
+       p0.l = lo(VR_CTL);
+       r0.l = w[p0];
+       bitset(r0, 14);
+       w[p0] = r0.l;
+       ssync;
+#endif
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF     : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier */
+       r0 = r0 << 9;                   /* Shift it over */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2?*/
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL? */
+       r1 = r1 << 8;                   /* Shift it over */
+       r0 = r1 | r0;                   /* add them all together */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address */
+       cli r2;                         /* Disable interrupts */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value */
+       idle;                           /* Wait for the PLL to stablize */
+       sti r2;                         /* Enable interrupts */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+#endif
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
diff --git a/cpu/bf537/init_sdram_bootrom_initblock.S b/cpu/bf537/init_sdram_bootrom_initblock.S
new file mode 100644 (file)
index 0000000..f9adbb9
--- /dev/null
@@ -0,0 +1,199 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+
+       p0.h = hi(SPI_BAUD);
+       p0.l = lo(SPI_BAUD);
+       r0.l = CONFIG_SPI_BAUD_INITBLOCK;
+       w[p0] = r0.l;
+       SSYNC;
+#endif
+
+#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
+
+#ifdef CONFIG_BF537
+       /* Enable PHY CLK buffer output */
+       p0.h = hi(VR_CTL);
+       p0.l = lo(VR_CTL);
+       r0.l = w[p0];
+       bitset(r0, 14);
+       w[p0] = r0.l;
+       ssync;
+#endif
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF     : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier */
+       r0 = r0 << 9;                   /* Shift it over */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2?*/
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL? */
+       r1 = r1 << 8;                   /* Shift it over */
+       r0 = r1 | r0;                   /* add them all together */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address */
+       cli r2;                         /* Disable interrupts */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value */
+       idle;                           /* Wait for the PLL to stablize */
+       sti r2;                         /* Enable interrupts */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+#endif
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        */
+
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
diff --git a/cpu/bf537/interrupt.S b/cpu/bf537/interrupt.S
new file mode 100644 (file)
index 0000000..a71df55
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * U-boot - interrupt.S Processing of interrupts and exception handling
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * This file is based on interrupt.S
+ *
+ * Copyright (C) 2003  Metrowerks, Inc. <mwaddel@metrowerks.com>
+ * Copyright (C) 2002  Arcturus Networks Ltd. Ted Ma <mated@sympatico.ca>
+ * Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                     Kenneth Albanowski <kjahds@kjahds.com>,
+ *                     The Silver Hammer Group, Ltd.
+ *
+ * (c) 1995, Dionne & Associates
+ * (c) 1995, DKG Display Tech.
+ *
+ * This file is also based on exception.asm
+ * (C) Copyright 2001-2005 - Analog Devices, Inc.  All rights reserved.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#define ASSEMBLY
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/hw_irq.h>
+#include <asm/entry.h>
+#include <asm/blackfin_defs.h>
+
+.global _blackfin_irq_panic;
+
+.text
+.align 2
+
+#ifndef CONFIG_KGDB
+.global _evt_emulation
+_evt_emulation:
+       SAVE_CONTEXT
+       r0 = IRQ_EMU;
+       r1 = seqstat;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+       rte;
+#endif
+
+.global _evt_nmi
+_evt_nmi:
+       SAVE_CONTEXT
+       r0 = IRQ_NMI;
+       r1 = RETN;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+
+_evt_nmi_exit:
+       rtn;
+
+.global _trap
+_trap:
+       SAVE_ALL_SYS
+       r0 = sp;        /* stack frame pt_regs pointer argument ==> r0 */
+       sp += -12;
+       call _trap_c
+       sp += 12;
+       RESTORE_ALL_SYS
+       rtx;
+
+.global _evt_rst
+_evt_rst:
+       SAVE_CONTEXT
+       r0 = IRQ_RST;
+       r1 = RETN;
+       sp += -12;
+       call _do_reset;
+       sp += 12;
+
+_evt_rst_exit:
+       rtn;
+
+irq_panic:
+       r0 = IRQ_EVX;
+       r1 =  sp;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+
+.global _evt_ivhw
+_evt_ivhw:
+       SAVE_CONTEXT
+       RAISE 14;
+
+_evt_ivhw_exit:
+        rti;
+
+.global _evt_timer
+_evt_timer:
+       SAVE_CONTEXT
+       r0 = IRQ_CORETMR;
+       sp += -12;
+       /* Polling method used now. */
+       /* call timer_int; */
+       sp += 12;
+       RESTORE_CONTEXT
+       rti;
+       nop;
+
+.global _evt_evt7
+_evt_evt7:
+       SAVE_CONTEXT
+       r0 = 7;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt7_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt8
+_evt_evt8:
+       SAVE_CONTEXT
+       r0 = 8;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt8_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt9
+_evt_evt9:
+       SAVE_CONTEXT
+       r0 = 9;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt9_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt10
+_evt_evt10:
+       SAVE_CONTEXT
+       r0 = 10;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt10_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt11
+_evt_evt11:
+       SAVE_CONTEXT
+       r0 = 11;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt11_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt12
+_evt_evt12:
+       SAVE_CONTEXT
+       r0 = 12;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+evt_evt12_exit:
+        RESTORE_CONTEXT
+        rti;
+
+.global _evt_evt13
+_evt_evt13:
+       SAVE_CONTEXT
+       r0 = 13;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt13_exit:
+        RESTORE_CONTEXT
+        rti;
+
+.global _evt_system_call
+_evt_system_call:
+       [--sp] = r0;
+       [--SP] = RETI;
+       r0 = [sp++];
+       r0 += 2;
+       [--sp] = r0;
+       RETI = [SP++];
+       r0 = [SP++];
+       SAVE_CONTEXT
+       sp += -12;
+       call _exception_handle;
+       sp += 12;
+       RESTORE_CONTEXT
+       RTI;
+
+evt_system_call_exit:
+       rti;
+
+.global _evt_soft_int1
+_evt_soft_int1:
+       [--sp] = r0;
+       [--SP] = RETI;
+       r0 = [sp++];
+       r0 += 2;
+       [--sp] = r0;
+       RETI = [SP++];
+       r0 = [SP++];
+       SAVE_CONTEXT
+       sp += -12;
+       call _exception_handle;
+       sp += 12;
+       RESTORE_CONTEXT
+       RTI;
+
+evt_soft_int1_exit:
+       rti;
diff --git a/cpu/bf537/interrupts.c b/cpu/bf537/interrupts.c
new file mode 100644 (file)
index 0000000..d2213b1
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * U-boot - interrupts.c Interrupt related routines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on interrupts.c
+ * Copyright 1996 Roman Zippel
+ * Copyright 1999 D. Jeff Dionne <jeff@uclinux.org>
+ * Copyright 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca>
+ * Copyright 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca>
+ * Copyright 2003 Metrowerks/Motorola
+ * Copyright 2003 Bas Vermeulen <bas@buyways.nl>,
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/machdep.h>
+#include <asm/irq.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include "cpu.h"
+
+static ulong timestamp;
+static ulong last_time;
+static int int_flag;
+
+int irq_flags;                 /* needed by asm-blackfin/system.h */
+
+/* Functions just to satisfy the linker */
+
+/*
+ * This function is derived from PowerPC code (read timebase as long long).
+ * On BF533 it just returns the timer value.
+ */
+unsigned long long get_ticks(void)
+{
+       return get_timer(0);
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On BF533 it returns the number of timer ticks per second.
+ */
+ulong get_tbclk (void)
+{
+       ulong tbclk;
+
+       tbclk = CFG_HZ;
+       return tbclk;
+}
+
+void enable_interrupts(void)
+{
+       restore_flags(int_flag);
+}
+
+int disable_interrupts(void)
+{
+       save_and_cli(int_flag);
+       return 1;
+}
+
+int interrupt_init(void)
+{
+       return (0);
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned long delay, start, stop;
+       unsigned long cclk;
+       cclk = (CONFIG_CCLK_HZ);
+
+       while (usec > 1) {
+               /*
+                * how many clock ticks to delay?
+                *  - request(in useconds) * clock_ticks(Hz) / useconds/second
+                */
+               if (usec < 1000) {
+                       delay = (usec * (cclk / 244)) >> 12;
+                       usec = 0;
+               } else {
+                       delay = (1000 * (cclk / 244)) >> 12;
+                       usec -= 1000;
+               }
+
+               asm volatile (" %0 = CYCLES;":"=r" (start));
+               do {
+                       asm volatile (" %0 = CYCLES; ":"=r" (stop));
+               } while (stop - start < delay);
+       }
+
+       return;
+}
+
+void timer_init(void)
+{
+       *pTCNTL = 0x1;
+       *pTSCALE = 0x0;
+       *pTCOUNT = MAX_TIM_LOAD;
+       *pTPERIOD = MAX_TIM_LOAD;
+       *pTCNTL = 0x7;
+       asm("CSYNC;");
+
+       timestamp = 0;
+       last_time = 0;
+}
+
+/* Any network command or flash
+ * command is started get_timer shall
+ * be called before TCOUNT gets reset,
+ * to implement the accurate timeouts.
+ *
+ * How ever milliconds doesn't return
+ * the number that has been elapsed from
+ * the last reset.
+ *
+ *  As get_timer is used in the u-boot
+ *  only for timeouts this should be
+ *  sufficient
+ */
+ulong get_timer(ulong base)
+{
+       ulong milisec;
+
+       /* Number of clocks elapsed */
+       ulong clocks = (MAX_TIM_LOAD - (*pTCOUNT));
+
+       /**
+        * Find if the TCOUNT is reset
+        * timestamp gives the number of times
+        * TCOUNT got reset
+        */
+       if (clocks < last_time)
+               timestamp++;
+       last_time = clocks;
+
+       /* Get the number of milliseconds */
+       milisec = clocks / (CONFIG_CCLK_HZ / 1000);
+
+       /**
+        * Find the number of millisonds
+        * that got elapsed before this TCOUNT cycle
+        */
+       milisec += timestamp * (MAX_TIM_LOAD / (CONFIG_CCLK_HZ / 1000));
+
+       return (milisec - base);
+}
+
+void reset_timer (void)
+{
+       timestamp = 0;
+}
diff --git a/cpu/bf537/ints.c b/cpu/bf537/ints.c
new file mode 100644 (file)
index 0000000..5586689
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * U-boot - ints.c Interrupt related routines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on ints.c
+ *
+ * Apr18 2003, Changed by HuTao to support interrupt cascading for Blackfin
+ *             drivers
+ *
+ * Copyright 1996 Roman Zippel
+ * Copyright 1999 D. Jeff Dionne <jeff@uclinux.org>
+ * Copyright 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca>
+ * Copyright 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca>
+ * Copyright 2003 Metrowerks/Motorola
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <linux/stddef.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/traps.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/machdep.h>
+#include <asm/setup.h>
+#include <asm/blackfin.h>
+#include "cpu.h"
+
+void blackfin_irq_panic(int reason, struct pt_regs *regs)
+{
+       printf("\n\nException: IRQ 0x%x entered\n", reason);
+       printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+       printf("stack frame=0x%x, ", (unsigned int)regs);
+       printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
+       dump(regs);
+       printf("Unhandled IRQ or exceptions!\n");
+       printf("Please reset the board \n");
+}
+
+void blackfin_init_IRQ(void)
+{
+       *(unsigned volatile long *)(SIC_IMASK) = SIC_UNMASK_ALL;
+       cli();
+#ifndef CONFIG_KGDB
+       *(unsigned volatile long *)(EVT_EMULATION_ADDR) = 0x0;
+#endif
+       *(unsigned volatile long *)(EVT_NMI_ADDR) =
+           (unsigned volatile long)evt_nmi;
+       *(unsigned volatile long *)(EVT_EXCEPTION_ADDR) =
+           (unsigned volatile long)trap;
+       *(unsigned volatile long *)(EVT_HARDWARE_ERROR_ADDR) =
+           (unsigned volatile long)evt_ivhw;
+       *(unsigned volatile long *)(EVT_RESET_ADDR) =
+           (unsigned volatile long)evt_rst;
+       *(unsigned volatile long *)(EVT_TIMER_ADDR) =
+           (unsigned volatile long)evt_timer;
+       *(unsigned volatile long *)(EVT_IVG7_ADDR) =
+           (unsigned volatile long)evt_evt7;
+       *(unsigned volatile long *)(EVT_IVG8_ADDR) =
+           (unsigned volatile long)evt_evt8;
+       *(unsigned volatile long *)(EVT_IVG9_ADDR) =
+           (unsigned volatile long)evt_evt9;
+       *(unsigned volatile long *)(EVT_IVG10_ADDR) =
+           (unsigned volatile long)evt_evt10;
+       *(unsigned volatile long *)(EVT_IVG11_ADDR) =
+           (unsigned volatile long)evt_evt11;
+       *(unsigned volatile long *)(EVT_IVG12_ADDR) =
+           (unsigned volatile long)evt_evt12;
+       *(unsigned volatile long *)(EVT_IVG13_ADDR) =
+           (unsigned volatile long)evt_evt13;
+       *(unsigned volatile long *)(EVT_IVG14_ADDR) =
+           (unsigned volatile long)evt_system_call;
+       *(unsigned volatile long *)(EVT_IVG15_ADDR) =
+           (unsigned volatile long)evt_soft_int1;
+       *(volatile unsigned long *)ILAT = 0;
+       asm("csync;");
+       sti();
+       *(volatile unsigned long *)IMASK = 0xffbf;
+       asm("csync;");
+}
+
+void exception_handle(void)
+{
+#if defined (CONFIG_PANIC_HANG)
+       display_excp();
+#else
+       udelay(100000);         /* allow messages to go out */
+       do_reset(NULL, 0, 0, NULL);
+#endif
+}
+
+void display_excp(void)
+{
+       printf("Exception!\n");
+}
diff --git a/cpu/bf537/serial.c b/cpu/bf537/serial.c
new file mode 100644 (file)
index 0000000..e04d08a
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * U-boot - serial.c Serial driver for BF537
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * bf537_serial.c: Serial driver for BlackFin BF537 internal UART.
+ * Copyright (c) 2003  Bas Vermeulen <bas@buyways.nl>,
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * Based heavily on blkfinserial.c
+ * blkfinserial.c: Serial driver for BlackFin DSP internal USRTs.
+ * Copyright(c) 2003   Metrowerks      <mwaddel@metrowerks.com>
+ * Copyright(c)        2001    Tony Z. Kou     <tonyko@arcturusnetworks.com>
+ * Copyright(c)        2001-2002 Arcturus Networks Inc. <www.arcturusnetworks.com>
+ *
+ * Based on code from 68328 version serial driver imlpementation which was:
+ * Copyright (C) 1995       David S. Miller    <davem@caip.rutgers.edu>
+ * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
+ * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
+ * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/segment.h>
+#include <asm/bitops.h>
+#include <asm/delay.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+#include "serial.h"
+
+unsigned long pll_div_fact;
+
+void calc_baud(void)
+{
+       unsigned char i;
+       int temp;
+       u_long sclk = get_sclk();
+
+       for (i = 0; i < sizeof(baud_table) / sizeof(int); i++) {
+               temp = sclk / (baud_table[i] * 8);
+               if ((temp & 0x1) == 1) {
+                       temp++;
+               }
+               temp = temp / 2;
+               hw_baud_table[i].dl_high = (temp >> 8) & 0xFF;
+               hw_baud_table[i].dl_low = (temp) & 0xFF;
+       }
+}
+
+void serial_setbrg(void)
+{
+       int i;
+       DECLARE_GLOBAL_DATA_PTR;
+
+       calc_baud();
+
+       for (i = 0; i < sizeof(baud_table) / sizeof(int); i++) {
+               if (gd->baudrate == baud_table[i])
+                       break;
+       }
+
+       /* Enable UART */
+       *pUART_GCTL |= UART_GCTL_UCEN;
+       sync();
+
+       /* Set DLAB in LCR to Access DLL and DLH */
+       ACCESS_LATCH;
+       sync();
+
+       *pUART_DLL = hw_baud_table[i].dl_low;
+       sync();
+       *pUART_DLH = hw_baud_table[i].dl_high;
+       sync();
+
+       /* Clear DLAB in LCR to Access THR RBR IER */
+       ACCESS_PORT_IER;
+       sync();
+
+       /* Enable  ERBFI and ELSI interrupts
+        * to poll SIC_ISR register*/
+       *pUART_IER = UART_IER_ELSI | UART_IER_ERBFI | UART_IER_ETBEI;
+       sync();
+
+       /* Set LCR to Word Lengh 8-bit word select */
+       *pUART_LCR = UART_LCR_WLS8;
+       sync();
+
+       return;
+}
+
+int serial_init(void)
+{
+       serial_setbrg();
+       return (0);
+}
+
+void serial_putc(const char c)
+{
+       if ((*pUART_LSR) & UART_LSR_TEMT) {
+               if (c == '\n')
+                       serial_putc('\r');
+
+               local_put_char(c);
+       }
+
+       while (!((*pUART_LSR) & UART_LSR_TEMT))
+               SYNC_ALL;
+
+       return;
+}
+
+int serial_tstc(void)
+{
+       if (*pUART_LSR & UART_LSR_DR)
+               return 1;
+       else
+               return 0;
+}
+
+int serial_getc(void)
+{
+       unsigned short uart_lsr_val, uart_rbr_val;
+       unsigned long isr_val;
+       int ret;
+
+       /* Poll for RX Interrupt */
+       while (!((isr_val =
+                 *(volatile unsigned long *)SIC_ISR) & IRQ_UART_RX_BIT)) ;
+       asm("csync;");
+
+       uart_lsr_val = *pUART_LSR;      /* Clear status bit */
+       uart_rbr_val = *pUART_RBR;      /* getc() */
+
+       if (isr_val & IRQ_UART_ERROR_BIT) {
+               ret = -1;
+       } else {
+               ret = uart_rbr_val & 0xff;
+       }
+
+       return ret;
+}
+
+void serial_puts(const char *s)
+{
+       while (*s) {
+               serial_putc(*s++);
+       }
+}
+
+static void local_put_char(char ch)
+{
+       int flags = 0;
+       unsigned long isr_val;
+
+       save_and_cli(flags);
+
+       /* Poll for TX Interruput */
+       while (!((isr_val = *pSIC_ISR) & IRQ_UART_TX_BIT)) ;
+       asm("csync;");
+
+       *pUART_THR = ch;        /* putc() */
+
+       if (isr_val & IRQ_UART_ERROR_BIT) {
+               printf("?");
+       }
+
+       restore_flags(flags);
+
+       return;
+}
diff --git a/cpu/bf537/serial.h b/cpu/bf537/serial.h
new file mode 100644 (file)
index 0000000..76555c2
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * U-boot - bf537_serial.h Serial Driver defines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver.
+ * Copyright (C) 2003  Bas Vermeulen <bas@buyways.nl>
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * Based heavily on:
+ * blkfinserial.h: Definitions for the BlackFin DSP serial driver.
+ *
+ * Copyright (C) 2001  Tony Z. Kou     tonyko@arcturusnetworks.com
+ * Copyright (C) 2001   Arcturus Networks Inc. <www.arcturusnetworks.com>
+ *
+ * Based on code from 68328serial.c which was:
+ * Copyright (C) 1995       David S. Miller    <davem@caip.rutgers.edu>
+ * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
+ * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
+ * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _Bf537_SERIAL_H
+#define _Bf537_SERIAL_H
+
+#include <linux/config.h>
+#include <asm/blackfin.h>
+
+#define SYNC_ALL       __asm__ __volatile__ ("ssync;\n")
+#define ACCESS_LATCH   *pUART_LCR |= UART_LCR_DLAB;
+#define ACCESS_PORT_IER        *pUART_LCR &= (~UART_LCR_DLAB);
+
+void serial_setbrg(void);
+static void local_put_char(char ch);
+void calc_baud(void);
+void serial_setbrg(void);
+int serial_init(void);
+void serial_putc(const char c);
+int serial_tstc(void);
+int serial_getc(void);
+void serial_puts(const char *s);
+static void local_put_char(char ch);
+
+int baud_table[5] = { 9600, 19200, 38400, 57600, 115200 };
+
+struct {
+       unsigned char dl_high;
+       unsigned char dl_low;
+} hw_baud_table[5];
+
+#ifdef CONFIG_STAMP
+extern unsigned long pll_div_fact;
+#endif
+
+#endif
diff --git a/cpu/bf537/start.S b/cpu/bf537/start.S
new file mode 100644 (file)
index 0000000..4e02bcb
--- /dev/null
@@ -0,0 +1,579 @@
+/*
+ * U-boot - start.S Startup file of u-boot for BF537
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on head.S
+ * Copyright (c) 2003  Metrowerks/Motorola
+ * Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                     Kenneth Albanowski <kjahds@kjahds.com>,
+ *                     The Silver Hammer Group, Ltd.
+ * (c) 1995, Dionne & Associates
+ * (c) 1995, DKG Display Tech.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+/*
+ * Note: A change in this file subsequently requires a change in
+ *       board/$(board_name)/config.mk for a valid u-boot.bin
+ */
+
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.global _stext;
+.global __bss_start;
+.global start;
+.global _start;
+.global _rambase;
+.global _ramstart;
+.global _ramend;
+.global _bf533_data_dest;
+.global _bf533_data_size;
+.global edata;
+.global _initialize;
+.global _exit;
+.global flashdataend;
+.global init_sdram;
+.global _icache_enable;
+.global _dcache_enable;
+#if defined(CONFIG_BF537)&&defined(CONFIG_POST)
+.global _memory_post_test;
+.global _post_flag;
+#endif
+
+#if (BFIN_BOOT_MODE == BF537_UART_BOOT)
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+#endif
+
+.text
+_start:
+start:
+_stext:
+
+       R0 = 0x32;
+       SYSCFG = R0;
+       SSYNC;
+
+       /* As per HW reference manual DAG registers,
+        * DATA and Address resgister shall be zero'd
+        * in initialization, after a reset state
+        */
+       r1 = 0; /* Data registers zero'd */
+       r2 = 0;
+       r3 = 0;
+       r4 = 0;
+       r5 = 0;
+       r6 = 0;
+       r7 = 0;
+
+       p0 = 0; /* Address registers zero'd */
+       p1 = 0;
+       p2 = 0;
+       p3 = 0;
+       p4 = 0;
+       p5 = 0;
+
+       i0 = 0; /* DAG Registers zero'd */
+       i1 = 0;
+       i2 = 0;
+       i3 = 0;
+       m0 = 0;
+       m1 = 0;
+       m3 = 0;
+       m3 = 0;
+       l0 = 0;
+       l1 = 0;
+       l2 = 0;
+       l3 = 0;
+       b0 = 0;
+       b1 = 0;
+       b2 = 0;
+       b3 = 0;
+
+       /* Set loop counters to zero, to make sure that
+        * hw loops are disabled.
+        */
+       r0  = 0;
+       lc0 = r0;
+       lc1 = r0;
+
+       SSYNC;
+
+       /* Check soft reset status */
+       p0.h = SWRST >> 16;
+       p0.l = SWRST & 0xFFFF;
+       r0.l = w[p0];
+
+       cc = bittst(r0, 15);
+       if !cc jump no_soft_reset;
+
+       /* Clear Soft reset */
+       r0 = 0x0000;
+       w[p0] = r0;
+       ssync;
+
+no_soft_reset:
+       nop;
+
+       /* Clear EVT registers */
+       p0.h = (EVT_EMULATION_ADDR >> 16);
+       p0.l = (EVT_EMULATION_ADDR & 0xFFFF);
+       p0 += 8;
+       p1 = 14;
+       r1 = 0;
+       LSETUP(4,4) lc0 = p1;
+       [ p0 ++ ] = r1;
+
+#if (BFIN_BOOT_MODE != BF537_SPI_MASTER_BOOT)
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+#endif
+
+#if (BFIN_BOOT_MODE == BF537_UART_BOOT)
+
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+
+       /*
+       * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+       */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+       * Put SDRAM in self-refresh, incase anything is running
+       */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+       *  Set PLL_CTL with the value that we calculate in R0
+       *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+       *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+       *   - [7]     = output delay (add 200ps of delay to mem signals)
+       *   - [6]     = input delay (add 200ps of input delay to mem signals)
+       *   - [5]     = PDWN      : 1=All Clocks off
+       *   - [3]     = STOPCK    : 1=Core Clock off
+       *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+       *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+       *   all other bits set to zero
+       */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier         */
+       r0 = r0 << 9;                   /* Shift it over,                  */
+       r1 = CONFIG_CLKIN_HALF;        /* Do we need to divide CLKIN by 2?*/
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL?                 */
+       r1 = r1 << 8;                   /* Shift it over                   */
+       r0 = r1 | r0;                   /* add them all together           */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address                */
+       cli r2;                         /* Disable interrupts              */
+               ssync;
+       w[p0] = r0.l;                   /* Set the value                   */
+       idle;                           /* Wait for the PLL to stablize    */
+       sti r2;                         /* Enable interrupts               */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+#endif
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        * we need to read MAC address from FLASH
+        */
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+#if ((BFIN_BOOT_MODE != BF537_SPI_MASTER_BOOT) && (BFIN_BOOT_MODE != BF537_UART_BOOT))
+       sp.l = (0xffb01000 & 0xFFFF);
+       sp.h = (0xffb01000 >> 16);
+
+       call init_sdram;
+#endif
+
+
+#if defined(CONFIG_BF537)&&defined(CONFIG_POST)
+       /* DMA POST code to Hi of L1 SRAM */
+postcopy:
+       /* P1 Points to the beginning of SYSTEM MMR Space */
+       P1.H = hi(SYSMMR_BASE);
+       P1.L = lo(SYSMMR_BASE);
+
+       R0.H = _text_l1;
+       R0.L = _text_l1;
+       R1.H = _etext_l1;
+       R1.L = _etext_l1;
+       R2 = R1 - R0;           /* Count */
+       R0.H = _etext;
+       R0.L = _etext;
+       R1.H = (CFG_MONITOR_BASE >> 16);
+       R1.L = (CFG_MONITOR_BASE & 0xFFFF);
+       R0 = R0 - R1;
+       R1.H = (CFG_FLASH_BASE >> 16);
+       R1.L = (CFG_FLASH_BASE & 0xFFFF);
+       R0 = R0 + R1;           /* Source Address */
+       R1.H = hi(L1_ISRAM);    /* Destination Address (high) */
+       R1.L = lo(L1_ISRAM);    /* Destination Address (low) */
+       R3.L = DMAEN;           /* Source DMAConfig Value (8-bit words) */
+       /* Destination DMAConfig Value (8-bit words) */
+       R4.L = (DI_EN | WNR | DMAEN);
+
+       R6 = 0x1 (Z);
+       W[P1+OFFSET_(MDMA_S0_X_MODIFY)] = R6;   /* Source Modify = 1 */
+       W[P1+OFFSET_(MDMA_D0_X_MODIFY)] = R6;   /* Destination Modify = 1 */
+
+       [P1+OFFSET_(MDMA_S0_START_ADDR)] = R0;  /* Set Source Base Address */
+       W[P1+OFFSET_(MDMA_S0_X_COUNT)] = R2;    /* Set Source Count */
+       /* Set Source  DMAConfig = DMA Enable,
+       Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
+       W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
+
+       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
+       W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
+       /* Set Destination DMAConfig = DMA Enable,
+       Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
+       W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
+
+POST_DMA_DONE:
+       p0.h = hi(MDMA_D0_IRQ_STATUS);
+       p0.l = lo(MDMA_D0_IRQ_STATUS);
+       R0 = W[P0](Z);
+       CC = BITTST(R0, 0);
+       if ! CC jump POST_DMA_DONE
+
+       R0 = 0x1;
+       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
+
+       /* DMA POST data to Hi of L1 SRAM */
+       R0.H = _rodata_l1;
+       R0.L = _rodata_l1;
+       R1.H = _erodata_l1;
+       R1.L = _erodata_l1;
+       R2 = R1 - R0;           /* Count */
+       R0.H = _erodata;
+       R0.L = _erodata;
+       R1.H = (CFG_MONITOR_BASE >> 16);
+       R1.L = (CFG_MONITOR_BASE & 0xFFFF);
+       R0 = R0 - R1;
+       R1.H = (CFG_FLASH_BASE >> 16);
+       R1.L = (CFG_FLASH_BASE & 0xFFFF);
+       R0 = R0 + R1;           /* Source Address */
+       R1.H = hi(DATA_BANKB_SRAM);    /* Destination Address (high) */
+       R1.L = lo(DATA_BANKB_SRAM);    /* Destination Address (low) */
+       R3.L = DMAEN;           /* Source DMAConfig Value (8-bit words) */
+       R4.L = (DI_EN | WNR | DMAEN);   /* Destination DMAConfig Value (8-bit words) */
+
+       R6 = 0x1 (Z);
+       W[P1+OFFSET_(MDMA_S0_X_MODIFY)] = R6;   /* Source Modify = 1 */
+       W[P1+OFFSET_(MDMA_D0_X_MODIFY)] = R6;   /* Destination Modify = 1 */
+
+       [P1+OFFSET_(MDMA_S0_START_ADDR)] = R0;  /* Set Source Base Address */
+       W[P1+OFFSET_(MDMA_S0_X_COUNT)] = R2;    /* Set Source Count */
+       /* Set Source  DMAConfig = DMA Enable,
+       Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
+       W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
+
+       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
+       W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
+       /* Set Destination DMAConfig = DMA Enable,
+       Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
+       W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
+
+POST_DATA_DMA_DONE:
+       p0.h = hi(MDMA_D0_IRQ_STATUS);
+       p0.l = lo(MDMA_D0_IRQ_STATUS);
+       R0 = W[P0](Z);
+       CC = BITTST(R0, 0);
+       if ! CC jump POST_DATA_DMA_DONE
+
+       R0 = 0x1;
+       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
+
+       p0.l = _memory_post_test;
+       p0.h = _memory_post_test;
+       r0 = 0x0;
+       call (p0);
+       r7 = r0;                                /* save return value */
+
+       call init_sdram;
+#endif
+
+       /* relocate into to RAM */
+       call get_pc;
+offset:
+       r2.l = offset;
+       r2.h = offset;
+       r3.l = start;
+       r3.h = start;
+       r1 = r2 - r3;
+
+       r0 = r0 - r1;
+       p1 = r0;
+
+       p2.l = (CFG_MONITOR_BASE & 0xffff);
+       p2.h = (CFG_MONITOR_BASE >> 16);
+
+       p3 = 0x04;
+       p4.l = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) & 0xffff);
+       p4.h = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) >> 16);
+loop1:
+       r1 = [p1 ++ p3];
+       [p2 ++ p3] = r1;
+       cc=p2==p4;
+       if !cc jump loop1;
+       /*
+        * configure STACK
+        */
+       r0.h = (CONFIG_STACKBASE >> 16);
+       r0.l = (CONFIG_STACKBASE & 0xFFFF);
+       sp = r0;
+       fp = sp;
+
+       /*
+        * This next section keeps the processor in supervisor mode
+        * during kernel boot.  Switches to user mode at end of boot.
+        * See page 3-9 of Hardware Reference manual for documentation.
+        */
+
+       /* To keep ourselves in the supervisor mode */
+       p0.l = (EVT_IVG15_ADDR & 0xFFFF);
+       p0.h = (EVT_IVG15_ADDR >> 16);
+
+       p1.l = _real_start;
+       p1.h = _real_start;
+       [p0] = p1;
+
+       p0.l = (IMASK & 0xFFFF);
+       p0.h = (IMASK >> 16);
+       r0.l = LO(IVG15_POS);
+       r0.h = HI(IVG15_POS);
+       [p0] = r0;
+       raise 15;
+       p0.l = WAIT_HERE;
+       p0.h = WAIT_HERE;
+       reti = p0;
+       rti;
+
+WAIT_HERE:
+       jump WAIT_HERE;
+
+.global _real_start;
+_real_start:
+       [ -- sp ] = reti;
+
+#ifdef CONFIG_BF537
+/* Initialise General-Purpose I/O Modules on BF537
+ * Rev 0.0 Anomaly 05000212 - PORTx_FER,
+ * PORT_MUX Registers Do Not accept "writes" correctly
+ */
+       p0.h = hi(PORTF_FER);
+       p0.l = lo(PORTF_FER);
+       R0.L = W[P0]; /* Read */
+       nop;
+       nop;
+       nop;
+       ssync;
+       R0 = 0x000F(Z);
+       W[P0] = R0.L; /* Write */
+       nop;
+       nop;
+       nop;
+       ssync;
+       W[P0] = R0.L; /* Enable peripheral function of PORTF for UART0 and UART1 */
+       nop;
+       nop;
+       nop;
+       ssync;
+
+       p0.h = hi(PORTH_FER);
+       p0.l = lo(PORTH_FER);
+       R0.L = W[P0]; /* Read */
+       nop;
+       nop;
+       nop;
+       ssync;
+       R0 = 0xFFFF(Z);
+       W[P0] = R0.L; /* Write */
+       nop;
+       nop;
+       nop;
+       ssync;
+       W[P0] = R0.L; /* Enable peripheral function of PORTH for MAC */
+       nop;
+       nop;
+       nop;
+       ssync;
+
+#endif
+
+       /* DMA reset code to Hi of L1 SRAM */
+copy:
+       P1.H = hi(SYSMMR_BASE); /* P1 Points to the beginning of SYSTEM MMR Space */
+       P1.L = lo(SYSMMR_BASE);
+
+       R0.H = reset_start;     /* Source Address (high) */
+       R0.L = reset_start;     /* Source Address (low) */
+       R1.H = reset_end;
+       R1.L = reset_end;
+       R2 = R1 - R0;           /* Count */
+       R1.H = hi(L1_ISRAM);    /* Destination Address (high) */
+       R1.L = lo(L1_ISRAM);    /* Destination Address (low) */
+       R3.L = DMAEN;           /* Source DMAConfig Value (8-bit words) */
+       R4.L = (DI_EN | WNR | DMAEN);   /* Destination DMAConfig Value (8-bit words) */
+
+DMA:
+       R6 = 0x1 (Z);
+       W[P1+OFFSET_(MDMA_S0_X_MODIFY)] = R6;   /* Source Modify = 1 */
+       W[P1+OFFSET_(MDMA_D0_X_MODIFY)] = R6;   /* Destination Modify = 1 */
+
+       [P1+OFFSET_(MDMA_S0_START_ADDR)] = R0;  /* Set Source Base Address */
+       W[P1+OFFSET_(MDMA_S0_X_COUNT)] = R2;    /* Set Source Count */
+       /* Set Source  DMAConfig = DMA Enable,
+       Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
+       W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
+
+       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
+       W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
+       /* Set Destination DMAConfig = DMA Enable,
+       Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
+       W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
+
+WAIT_DMA_DONE:
+       p0.h = hi(MDMA_D0_IRQ_STATUS);
+       p0.l = lo(MDMA_D0_IRQ_STATUS);
+       R0 = W[P0](Z);
+       CC = BITTST(R0, 0);
+       if ! CC jump WAIT_DMA_DONE
+
+       R0 = 0x1;
+       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
+
+       /* Initialize BSS Section with 0 s */
+       p1.l = __bss_start;
+       p1.h = __bss_start;
+       p2.l = _end;
+       p2.h = _end;
+       r1 = p1;
+       r2 = p2;
+       r3 = r2 - r1;
+       r3 = r3 >> 2;
+       p3 = r3;
+       lsetup (_clear_bss, _clear_bss_end ) lc1 = p3;
+       CC = p2<=p1;
+       if CC jump _clear_bss_skip;
+       r0 = 0;
+_clear_bss:
+_clear_bss_end:
+       [p1++] = r0;
+_clear_bss_skip:
+
+#if defined(CONFIG_BF537)&&defined(CONFIG_POST)
+       p0.l = _post_flag;
+       p0.h = _post_flag;
+       r0   = r7;
+       [p0] = r0;
+#endif
+
+       p0.l = _start1;
+       p0.h = _start1;
+       jump (p0);
+
+reset_start:
+       p0.h = WDOG_CNT >> 16;
+       p0.l = WDOG_CNT & 0xffff;
+       r0 = 0x0010;
+       w[p0] = r0;
+       p0.h = WDOG_CTL >> 16;
+       p0.l = WDOG_CTL & 0xffff;
+       r0 = 0x0000;
+       w[p0] = r0;
+reset_wait:
+       jump reset_wait;
+
+reset_end:
+       nop;
+
+_exit:
+       jump.s  _exit;
+get_pc:
+       r0 = rets;
+       rts;
diff --git a/cpu/bf537/start1.S b/cpu/bf537/start1.S
new file mode 100644 (file)
index 0000000..6d4731b
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * U-boot - start1.S Code running out of RAM after relocation
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#define ASSEMBLY
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.global        start1;
+.global        _start1;
+
+.text
+_start1:
+start1:
+       sp += -12;
+       call    _board_init_f;
+       sp += 12;
diff --git a/cpu/bf537/traps.c b/cpu/bf537/traps.c
new file mode 100644 (file)
index 0000000..4e18e27
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * U-boot - traps.c Routines related to interrupts and exceptions
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * No original Copyright holder listed,
+ * Probabily original (C) Roman Zippel (assigned DJD, 1999)
+ *
+ * Copyright 2003 Metrowerks - for Blackfin
+ * Copyright 2000-2001 Lineo, Inc. D. Jeff Dionne <jeff@lineo.ca>
+ * Copyright 1999-2000 D. Jeff Dionne, <jeff@uclinux.org>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <linux/types.h>
+#include <asm/errno.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/traps.h>
+#include <asm/machdep.h>
+#include "cpu.h"
+#include <asm/arch/anomaly.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
+
+void init_IRQ(void)
+{
+       blackfin_init_IRQ();
+       return;
+}
+
+void process_int(unsigned long vec, struct pt_regs *fp)
+{
+       printf("interrupt\n");
+       return;
+}
+
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+unsigned long last_cplb_fault_retx;
+
+static unsigned int cplb_sizes[4] =
+    { 1024, 4 * 1024, 1024 * 1024, 4 * 1024 * 1024 };
+
+void trap_c(struct pt_regs *regs)
+{
+       unsigned int addr;
+       unsigned long trapnr = (regs->seqstat) & SEQSTAT_EXCAUSE;
+       unsigned int i, j, size, *I0, *I1;
+       unsigned short data = 0;
+
+       switch (trapnr) {
+               /* 0x26 - Data CPLB Miss */
+       case VEC_CPLB_M:
+
+#ifdef ANOMALY_05000261
+               /*
+                * Work around an anomaly: if we see a new DCPLB fault,
+                * return without doing anything. Then,
+                * if we get the same fault again, handle it.
+                */
+               addr = last_cplb_fault_retx;
+               last_cplb_fault_retx = regs->retx;
+               printf("this time, curr = 0x%08x last = 0x%08x\n",
+                      addr, last_cplb_fault_retx);
+               if (addr != last_cplb_fault_retx)
+                       goto trap_c_return;
+#endif
+               data = 1;
+
+       case VEC_CPLB_I_M:
+
+               if (data) {
+                       addr = *pDCPLB_FAULT_ADDR;
+               } else {
+                       addr = *pICPLB_FAULT_ADDR;
+               }
+               for (i = 0; i < page_descriptor_table_size; i++) {
+                       if (data) {
+                               size = cplb_sizes[dcplb_table[i][1] >> 16];
+                               j = dcplb_table[i][0];
+                       } else {
+                               size = cplb_sizes[icplb_table[i][1] >> 16];
+                               j = icplb_table[i][0];
+                       }
+                       if ((j <= addr) && ((j + size) > addr)) {
+                               debug("found %i 0x%08x\n", i, j);
+                               break;
+                       }
+               }
+               if (i == page_descriptor_table_size) {
+                       printf("something is really wrong\n");
+                       do_reset(NULL, 0, 0, NULL);
+               }
+
+               /* Turn the cache off */
+               if (data) {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL &=
+                           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
+                       sync();
+               }
+
+               if (data) {
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               j = 0;
+               while (*I1 & CPLB_LOCK) {
+                       debug("skipping %i %08p - %08x\n", j, I1, *I1);
+                       *I0++;
+                       *I1++;
+                       j++;
+               }
+
+               debug("remove %i 0x%08x  0x%08x\n", j, *I0, *I1);
+
+               for (; j < 15; j++) {
+                       debug("replace %i 0x%08x  0x%08x\n", j, I0, I0 + 1);
+                       *I0++ = *(I0 + 1);
+                       *I1++ = *(I1 + 1);
+               }
+
+               if (data) {
+                       *I0 = dcplb_table[i][0];
+                       *I1 = dcplb_table[i][1];
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       *I0 = icplb_table[i][0];
+                       *I1 = icplb_table[i][1];
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               for (j = 0; j < 16; j++) {
+                       debug("%i 0x%08x  0x%08x\n", j, *I0++, *I1++);
+               }
+
+               /* Turn the cache back on */
+               if (data) {
+                       j = *(unsigned int *)DMEM_CONTROL;
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL =
+                           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | j;
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
+                       sync();
+               }
+
+               break;
+       default:
+               /* All traps come here */
+               printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+               printf("stack frame=0x%x, ", (unsigned int)regs);
+               printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
+               dump(regs);
+               printf("\n\n");
+
+               printf("Unhandled IRQ or exceptions!\n");
+               printf("Please reset the board \n");
+               do_reset(NULL, 0, 0, NULL);
+       }
+
+trap_c_return:
+       return;
+
+}
+
+void dump(struct pt_regs *fp)
+{
+       debug("RETE:  %08lx  RETN: %08lx  RETX: %08lx  RETS: %08lx\n",
+                fp->rete, fp->retn, fp->retx, fp->rets);
+       debug("IPEND: %04lx  SYSCFG: %04lx\n", fp->ipend, fp->syscfg);
+       debug("SEQSTAT: %08lx    SP: %08lx\n", (long)fp->seqstat, (long)fp);
+       debug("R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n",
+                fp->r0, fp->r1, fp->r2, fp->r3);
+       debug("R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n",
+                fp->r4, fp->r5, fp->r6, fp->r7);
+       debug("P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n",
+                fp->p0, fp->p1, fp->p2, fp->p3);
+       debug("P4: %08lx    P5: %08lx    FP: %08lx\n",
+                fp->p4, fp->p5, fp->fp);
+       debug("A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
+                fp->a0w, fp->a0x, fp->a1w, fp->a1x);
+
+       debug("LB0: %08lx  LT0: %08lx  LC0: %08lx\n",
+                fp->lb0, fp->lt0, fp->lc0);
+       debug("LB1: %08lx  LT1: %08lx  LC1: %08lx\n",
+                fp->lb1, fp->lt1, fp->lc1);
+       debug("B0: %08lx  L0: %08lx  M0: %08lx  I0: %08lx\n",
+                fp->b0, fp->l0, fp->m0, fp->i0);
+       debug("B1: %08lx  L1: %08lx  M1: %08lx  I1: %08lx\n",
+                fp->b1, fp->l1, fp->m1, fp->i1);
+       debug("B2: %08lx  L2: %08lx  M2: %08lx  I2: %08lx\n",
+                fp->b2, fp->l2, fp->m2, fp->i2);
+       debug("B3: %08lx  L3: %08lx  M3: %08lx  I3: %08lx\n",
+                fp->b3, fp->l3, fp->m3, fp->i3);
+
+       debug("DCPLB_FAULT_ADDR=%p\n", *pDCPLB_FAULT_ADDR);
+       debug("ICPLB_FAULT_ADDR=%p\n", *pICPLB_FAULT_ADDR);
+
+}
diff --git a/cpu/bf537/video.c b/cpu/bf537/video.c
new file mode 100644 (file)
index 0000000..3ff0151
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * (C) Copyright 2000
+ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
+ * (C) Copyright 2002
+ * Wolfgang Denk, wd@denx.de
+ * (C) Copyright 2006
+ * Aubrey Li, aubrey.li@analog.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 <stdarg.h>
+#include <common.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <i2c.h>
+#include <linux/types.h>
+#include <devices.h>
+
+#ifdef CONFIG_VIDEO
+#define NTSC_FRAME_ADDR 0x06000000
+#include "video.h"
+
+/* NTSC OUTPUT SIZE  720 * 240 */
+#define VERTICAL       2
+#define HORIZONTAL     4
+
+int is_vblank_line(const int line)
+{
+       /*
+        *  This array contains a single bit for each line in
+        *  an NTSC frame.
+        */
+       if ((line <= 18) || (line >= 264 && line <= 281) || (line == 528))
+               return true;
+
+       return false;
+}
+
+int NTSC_framebuffer_init(char *base_address)
+{
+       const int NTSC_frames = 1;
+       const int NTSC_lines = 525;
+       char *dest = base_address;
+       int frame_num, line_num;
+
+       for (frame_num = 0; frame_num < NTSC_frames; ++frame_num) {
+               for (line_num = 1; line_num <= NTSC_lines; ++line_num) {
+                       unsigned int code;
+                       int offset = 0;
+                       int i;
+
+                       if (is_vblank_line(line_num))
+                               offset++;
+
+                       if (line_num > 266 || line_num < 3)
+                               offset += 2;
+
+                       /* Output EAV code */
+                       code = SystemCodeMap[offset].EAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output horizontal blanking */
+                       for (i = 0; i < 67 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+
+                       /* Output SAV */
+                       code = SystemCodeMap[offset].SAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output empty horizontal data */
+                       for (i = 0; i < 360 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+               }
+       }
+
+       return dest - base_address;
+}
+
+void fill_frame(char *Frame, int Value)
+{
+       int *OddPtr32;
+       int OddLine;
+       int *EvenPtr32;
+       int EvenLine;
+       int i;
+       int *data;
+       int m, n;
+
+       /* fill odd and even frames */
+       for (OddLine = 22, EvenLine = 285; OddLine < 263; OddLine++, EvenLine++) {
+               OddPtr32 = (int *)((Frame + (OddLine * 1716)) + 276);
+               EvenPtr32 = (int *)((Frame + (EvenLine * 1716)) + 276);
+               for (i = 0; i < 360; i++, OddPtr32++, EvenPtr32++) {
+                       *OddPtr32 = Value;
+                       *EvenPtr32 = Value;
+               }
+       }
+
+       for (m = 0; m < VERTICAL; m++) {
+               data = (int *)u_boot_logo.data;
+               for (OddLine = (22 + m), EvenLine = (285 + m);
+                    OddLine < (u_boot_logo.height * VERTICAL) + (22 + m);
+                    OddLine += VERTICAL, EvenLine += VERTICAL) {
+                       OddPtr32 = (int *)((Frame + ((OddLine) * 1716)) + 276);
+                       EvenPtr32 =
+                           (int *)((Frame + ((EvenLine) * 1716)) + 276);
+                       for (i = 0; i < u_boot_logo.width / 2; i++) {
+                               /* enlarge one pixel to m x n */
+                               for (n = 0; n < HORIZONTAL; n++) {
+                                       *OddPtr32++ = *data;
+                                       *EvenPtr32++ = *data;
+                               }
+                               data++;
+                       }
+               }
+       }
+}
+
+void video_putc(const char c)
+{
+}
+
+void video_puts(const char *s)
+{
+}
+
+static int video_init(void)
+{
+       char *NTSCFrame;
+       NTSCFrame = (char *)NTSC_FRAME_ADDR;
+       NTSC_framebuffer_init(NTSCFrame);
+       fill_frame(NTSCFrame, BLUE);
+
+       *pPPI_CONTROL = 0x0082;
+       *pPPI_FRAME = 0x020D;
+
+       *pDMA0_START_ADDR = NTSCFrame;
+       *pDMA0_X_COUNT = 0x035A;
+       *pDMA0_X_MODIFY = 0x0002;
+       *pDMA0_Y_COUNT = 0x020D;
+       *pDMA0_Y_MODIFY = 0x0002;
+       *pDMA0_CONFIG = 0x1015;
+       *pPPI_CONTROL = 0x0083;
+       return 0;
+}
+
+int drv_video_init(void)
+{
+       int error, devices = 1;
+
+       device_t videodev;
+
+       video_init();           /* Video initialization */
+
+       memset(&videodev, 0, sizeof(videodev));
+
+       strcpy(videodev.name, "video");
+       videodev.ext = DEV_EXT_VIDEO;   /* Video extensions */
+       videodev.flags = DEV_FLAGS_OUTPUT;      /* Output only */
+       videodev.putc = video_putc;     /* 'putc' function */
+       videodev.puts = video_puts;     /* 'puts' function */
+
+       error = device_register(&videodev);
+
+       return (error == 0) ? devices : error;
+}
+#endif
diff --git a/cpu/bf537/video.h b/cpu/bf537/video.h
new file mode 100644 (file)
index 0000000..a43553f
--- /dev/null
@@ -0,0 +1,25 @@
+#include <video_logo.h>
+#define write_dest_byte(val) {*dest++=val;}
+#define BLACK   (0x01800180)   /* black pixel pattern  */
+#define BLUE    (0x296E29F0)   /* blue pixel pattern   */
+#define RED     (0x51F0515A)   /* red pixel pattern    */
+#define MAGENTA (0x6ADE6ACA)   /* magenta pixel pattern*/
+#define GREEN   (0x91229136)   /* green pixel pattern  */
+#define CYAN    (0xAA10AAA6)   /* cyan pixel pattern   */
+#define YELLOW  (0xD292D210)   /* yellow pixel pattern */
+#define WHITE   (0xFE80FE80)   /* white pixel pattern  */
+
+#define true   1
+#define false  0
+
+typedef struct {
+       unsigned int SAV;
+       unsigned int EAV;
+} SystemCodeType;
+
+const SystemCodeType SystemCodeMap[4] = {
+       {0xFF000080, 0xFF00009D},
+       {0xFF0000AB, 0xFF0000B6},
+       {0xFF0000C7, 0xFF0000DA},
+       {0xFF0000EC, 0xFF0000F1}
+};
diff --git a/cpu/bf561/Makefile b/cpu/bf561/Makefile
new file mode 100644 (file)
index 0000000..2947169
--- /dev/null
@@ -0,0 +1,52 @@
+# U-boot - Makefile
+#
+# Copyright (c) 2005-2007 Analog Devices Inc.
+#
+# (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(CPU).a
+
+START  = start.o start1.o interrupt.o cache.o flush.o init_sdram.o
+COBJS  = cpu.o traps.o ints.o serial.o interrupts.o video.o
+
+EXTRA = init_sdram_bootrom_initblock.o
+
+SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
+START  := $(addprefix $(obj),$(START))
+
+all:   $(obj).depend $(START) $(LIB) $(obj).depend $(EXTRA)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/bf561/cache.S b/cpu/bf561/cache.S
new file mode 100644 (file)
index 0000000..5bda5bf
--- /dev/null
@@ -0,0 +1,128 @@
+#define ASSEMBLY
+#include <asm/linkage.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.text
+.align 2
+ENTRY(_blackfin_icache_flush_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+       1:
+       IFLUSH[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+       IFLUSH[P0];
+       SSYNC;
+       RTS;
+
+ENTRY(_blackfin_dcache_flush_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+1:
+       FLUSH[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+       FLUSH[P0];
+       SSYNC;
+       RTS;
+
+ENTRY(_icache_invalidate)
+ENTRY(_invalidate_entire_icache)
+       [--SP] = (R7:5);
+
+       P0.L = (IMEM_CONTROL & 0xFFFF);
+       P0.H = (IMEM_CONTROL >> 16);
+       R7 =[P0];
+
+       /*
+        * Clear the IMC bit , All valid bits in the instruction
+        * cache are set to the invalid state
+        */
+       BITCLR(R7, IMC_P);
+       CLI R6;
+       /* SSYNC required before invalidating cache. */
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       /* Configures the instruction cache agian */
+       R6 = (IMC | ENICPLB);
+       R7 = R7 | R6;
+
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       (R7:5) =[SP++];
+       RTS;
+
+/*
+ * Invalidate the Entire Data cache by
+ * clearing DMC[1:0] bits
+ */
+ENTRY(_invalidate_entire_dcache)
+ENTRY(_dcache_invalidate)
+       [--SP] = (R7:6);
+
+       P0.L = (DMEM_CONTROL & 0xFFFF);
+       P0.H = (DMEM_CONTROL >> 16);
+       R7 =[P0];
+
+       /*
+        * Clear the DMC[1:0] bits, All valid bits in the data
+        * cache are set to the invalid state
+        */
+       BITCLR(R7, DMC0_P);
+       BITCLR(R7, DMC1_P);
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+       /* Configures the data cache again */
+
+       R6 = (ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+       R7 = R7 | R6;
+
+       CLI R6;
+       SSYNC;
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       (R7:6) =[SP++];
+       RTS;
+
+ENTRY(_blackfin_dcache_invalidate_range)
+       R2 = -32;
+       R2 = R0 & R2;
+       P0 = R2;
+       P1 = R1;
+       CSYNC;
+1:
+       FLUSHINV[P0++];
+       CC = P0 < P1(iu);
+       IF CC JUMP 1b(bp);
+
+       /*
+        * If the data crosses a cache line, then we'll be pointing to
+        * the last cache line, but won't have flushed/invalidated it yet, so do
+        * one more.
+        */
+       FLUSHINV[P0];
+       SSYNC;
+       RTS;
diff --git a/cpu/bf561/config.mk b/cpu/bf561/config.mk
new file mode 100644 (file)
index 0000000..f4dc04b
--- /dev/null
@@ -0,0 +1,27 @@
+# U-boot - config.mk
+#
+# Copyright (c) 2005-2007 Analog Devices Inc.
+#
+# (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
+#
+
+PLATFORM_RELFLAGS += -mcpu=bf561 -ffixed-P5
diff --git a/cpu/bf561/cpu.c b/cpu/bf561/cpu.c
new file mode 100644 (file)
index 0000000..5b907cd
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * U-boot - cpu.c CPU specific functions
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/blackfin.h>
+#include <command.h>
+#include <asm/entry.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
+
+#define CACHE_ON 1
+#define CACHE_OFF 0
+
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       __asm__ __volatile__("cli r3;" "P0 = %0;" "JUMP (P0);"::"r"(L1_ISRAM)
+           );
+
+       return 0;
+}
+
+/* These functions are just used to satisfy the linker */
+int cpu_init(void)
+{
+       return 0;
+}
+
+int cleanup_before_linux(void)
+{
+       return 0;
+}
+
+void icache_enable(void)
+{
+       unsigned int *I0, *I1;
+       int i, j = 0;
+
+       /* Before enable icache, disable it first */
+       icache_disable();
+       I0 = (unsigned int *)ICPLB_ADDR0;
+       I1 = (unsigned int *)ICPLB_DATA0;
+
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & icplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                             icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & icplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                             icplb_table[i][0], icplb_table[i][1]);
+                       *I0++ = icplb_table[i][0];
+                       *I1++ = icplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
+               }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
+               }
+
+       }
+
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
+       sync();
+       sti();
+}
+
+void icache_disable(void)
+{
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
+       sync();
+       sti();
+}
+
+int icache_status(void)
+{
+       unsigned int value;
+       value = *(unsigned int *)IMEM_CONTROL;
+
+       if (value & (IMC | ENICPLB))
+               return CACHE_ON;
+       else
+               return CACHE_OFF;
+}
+
+void dcache_enable(void)
+{
+       unsigned int *I0, *I1;
+       unsigned int temp;
+       int i, j = 0;
+
+       /* Before enable dcache, disable it first */
+       dcache_disable();
+       I0 = (unsigned int *)DCPLB_ADDR0;
+       I1 = (unsigned int *)DCPLB_DATA0;
+
+       /* make sure the locked ones go in first */
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (CPLB_LOCK & dcplb_table[i][1]) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                             dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+               } else {
+                       debug("skip   %02i %02i 0x%08x 0x%08x\n", i, j,
+                             dcplb_table[i][0], dcplb_table[i][1]);
+               }
+       }
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               if (!(CPLB_LOCK & dcplb_table[i][1])) {
+                       debug("adding %02i %02i 0x%08x 0x%08x\n", i, j,
+                             dcplb_table[i][0], dcplb_table[i][1]);
+                       *I0++ = dcplb_table[i][0];
+                       *I1++ = dcplb_table[i][1];
+                       j++;
+                       if (j == 16) {
+                               break;
+                       }
+               }
+       }
+
+       /* Fill the rest with invalid entry */
+       if (j <= 15) {
+               for (; j < 16; j++) {
+                       debug("filling %i with 0", j);
+                       *I1++ = 0x0;
+               }
+       }
+
+       cli();
+       temp = *(unsigned int *)DMEM_CONTROL;
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL =
+           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | temp;
+       sync();
+       sti();
+}
+
+void dcache_disable(void)
+{
+
+       unsigned int *I0, *I1;
+       int i;
+
+       cli();
+       sync();
+       asm(" .align 8; ");
+       *(unsigned int *)DMEM_CONTROL &=
+           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+       sync();
+       sti();
+
+       /* after disable dcache, clear it so we don't confuse the next application */
+       I0 = (unsigned int *)DCPLB_ADDR0;
+       I1 = (unsigned int *)DCPLB_DATA0;
+
+       for (i = 0; i < 16; i++) {
+               *I0++ = 0x0;
+               *I1++ = 0x0;
+       }
+}
+
+int dcache_status(void)
+{
+       unsigned int value;
+       value = *(unsigned int *)DMEM_CONTROL;
+       if (value & (ENDCPLB))
+               return CACHE_ON;
+       else
+               return CACHE_OFF;
+}
diff --git a/cpu/bf561/cpu.h b/cpu/bf561/cpu.h
new file mode 100644 (file)
index 0000000..b6b73b1
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *  U-boot - cpu.h
+ *
+ *  Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _CPU_H_
+#define _CPU_H_
+
+#include <command.h>
+
+#define INTERNAL_IRQS (32)
+#define NUM_IRQ_NODES 16
+#define DEF_INTERRUPT_FLAGS 1
+#define MAX_TIM_LOAD   0xFFFFFFFF
+
+void blackfin_irq_panic(int reason, struct pt_regs *reg);
+extern void dump(struct pt_regs *regs);
+void display_excp(void);
+asmlinkage void evt_nmi(void);
+asmlinkage void evt_exception(void);
+asmlinkage void trap(void);
+asmlinkage void evt_ivhw(void);
+asmlinkage void evt_rst(void);
+asmlinkage void evt_timer(void);
+asmlinkage void evt_evt7(void);
+asmlinkage void evt_evt8(void);
+asmlinkage void evt_evt9(void);
+asmlinkage void evt_evt10(void);
+asmlinkage void evt_evt11(void);
+asmlinkage void evt_evt12(void);
+asmlinkage void evt_evt13(void);
+asmlinkage void evt_soft_int1(void);
+asmlinkage void evt_system_call(void);
+void blackfin_irq_panic(int reason, struct pt_regs *regs);
+void blackfin_free_irq(unsigned int irq, void *dev_id);
+void call_isr(int irq, struct pt_regs *fp);
+void blackfin_do_irq(int vec, struct pt_regs *fp);
+void blackfin_init_IRQ(void);
+void blackfin_enable_irq(unsigned int irq);
+void blackfin_disable_irq(unsigned int irq);
+extern int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
+int blackfin_request_irq(unsigned int irq,
+                        void (*handler) (int, void *, struct pt_regs *),
+                        unsigned long flags, const char *devname,
+                        void *dev_id);
+void timer_init(void);
+#endif
diff --git a/cpu/bf561/flush.S b/cpu/bf561/flush.S
new file mode 100644 (file)
index 0000000..0140a60
--- /dev/null
@@ -0,0 +1,402 @@
+/* Copyright (C) 2003-2007 Analog Devices Inc.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.
+ */
+
+#define ASSEMBLY
+
+#include <asm/linkage.h>
+#include <asm/cplb.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.text
+
+/* This is an external function being called by the user
+ * application through __flush_cache_all. Currently this function
+ * serves the purpose of flushing all the pending writes in
+ * in the instruction cache.
+ */
+
+ENTRY(_flush_instruction_cache)
+       [--SP] = ( R7:6, P5:4 );
+       LINK 12;
+       SP += -12;
+       P5.H = (ICPLB_ADDR0 >> 16);
+       P5.L = (ICPLB_ADDR0 & 0xFFFF);
+       P4.H = (ICPLB_DATA0 >> 16);
+       P4.L = (ICPLB_DATA0 & 0xFFFF);
+       R7 = CPLB_VALID | CPLB_L1_CHBL;
+       R6 = 16;
+inext: R0 = [P5++];
+       R1 = [P4++];
+       [--SP] =  RETS;
+       CALL _icplb_flush;      /* R0 = page, R1 = data*/
+       RETS = [SP++];
+iskip: R6 += -1;
+       CC = R6;
+       IF CC JUMP inext;
+       SSYNC;
+       SP += 12;
+       UNLINK;
+       ( R7:6, P5:4 ) = [SP++];
+       RTS;
+
+/* This is an internal function to flush all pending
+ * writes in the cache associated with a particular ICPLB.
+ *
+ * R0 -  page's start address
+ * R1 -  CPLB's data field.
+ */
+
+.align 2
+ENTRY(_icplb_flush)
+       [--SP] = ( R7:0, P5:0 );
+       [--SP] = LC0;
+       [--SP] = LT0;
+       [--SP] = LB0;
+       [--SP] = LC1;
+       [--SP] = LT1;
+       [--SP] = LB1;
+
+       /* If it's a 1K or 4K page, then it's quickest to
+        * just systematically flush all the addresses in
+        * the page, regardless of whether they're in the
+        * cache, or dirty. If it's a 1M or 4M page, there
+        * are too many addresses, and we have to search the
+        * cache for lines corresponding to the page.
+        */
+
+       CC = BITTST(R1, 17);    /* 1MB or 4MB */
+       IF !CC JUMP iflush_whole_page;
+
+       /* We're only interested in the page's size, so extract
+        * this from the CPLB (bits 17:16), and scale to give an
+        * offset into the page_size and page_prefix tables.
+        */
+
+       R1 <<= 14;
+       R1 >>= 30;
+       R1 <<= 2;
+
+       /* We can also determine the sub-bank used, because this is
+        * taken from bits 13:12 of the address.
+        */
+
+       R3 = ((12<<8)|2);               /* Extraction pattern */
+       nop;                            /*Anamoly 05000209*/
+       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits*/
+       R3.H = R4.L << 0 ;              /* Save in extraction pattern for later deposit.*/
+
+
+       /* So:
+        * R0 = Page start
+        * R1 = Page length (actually, offset into size/prefix tables)
+        * R3 = sub-bank deposit values
+        *
+        * The cache has 2 Ways, and 64 sets, so we iterate through
+        * the sets, accessing the tag for each Way, for our Bank and
+        * sub-bank, looking for dirty, valid tags that match our
+        * address prefix.
+        */
+
+       P5.L = (ITEST_COMMAND & 0xFFFF);
+       P5.H = (ITEST_COMMAND >> 16);
+       P4.L = (ITEST_DATA0 & 0xFFFF);
+       P4.H = (ITEST_DATA0 >> 16);
+
+       P0.L = page_prefix_table;
+       P0.H = page_prefix_table;
+       P1 = R1;
+       R5 = 0;                 /* Set counter*/
+       P0 = P1 + P0;
+       R4 = [P0];              /* This is the address prefix*/
+
+       /* We're reading (bit 1==0) the tag (bit 2==0), and we
+        * don't care about which double-word, since we're only
+        * fetching tags, so we only have to set Set, Bank,
+        * Sub-bank and Way.
+        */
+
+       P2 = 4;
+       LSETUP (ifs1, ife1) LC1 = P2;
+ifs1:  P0 = 32;                /* iterate over all sets*/
+       LSETUP (ifs0, ife0) LC0 = P0;
+ifs0:  R6 = R5 << 5;           /* Combine set*/
+       R6.H = R3.H << 0 ;      /* and sub-bank*/
+       [P5] = R6;              /* Issue Command*/
+       SSYNC;                  /* CSYNC will not work here :(*/
+       R7 = [P4];              /* and read Tag.*/
+       CC = BITTST(R7, 0);     /* Check if valid*/
+       IF !CC JUMP ifskip;     /* and skip if not.*/
+
+       /* Compare against the page address. First, plant bits 13:12
+        * into the tag, since those aren't part of the returned data.
+        */
+
+       R7 = DEPOSIT(R7, R3);   /* set 13:12*/
+       R1 = R7 & R4;           /* Mask off lower bits*/
+       CC = R1 == R0;          /* Compare against page start.*/
+       IF !CC JUMP ifskip;     /* Skip it if it doesn't match.*/
+
+       /* Tag address matches against page, so this is an entry
+        * we must flush.
+        */
+
+       R7 >>= 10;              /* Mask off the non-address bits*/
+       R7 <<= 10;
+       P3 = R7;
+       IFLUSH [P3];            /* And flush the entry*/
+ifskip:
+ife0:  R5 += 1;                /* Advance to next Set*/
+ife1:  NOP;
+
+ifinished:
+       SSYNC;                  /* Ensure the data gets out to mem.*/
+
+       /*Finished. Restore context.*/
+       LB1 = [SP++];
+       LT1 = [SP++];
+       LC1 = [SP++];
+       LB0 = [SP++];
+       LT0 = [SP++];
+       LC0 = [SP++];
+       ( R7:0, P5:0 ) = [SP++];
+       RTS;
+
+iflush_whole_page:
+       /* It's a 1K or 4K page, so quicker to just flush the
+        * entire page.
+        */
+
+       P1 = 32;                /* For 1K pages*/
+       P2 = P1 << 2;           /* For 4K pages*/
+       P0 = R0;                /* Start of page*/
+       CC = BITTST(R1, 16);    /* Whether 1K or 4K*/
+       IF CC P1 = P2;
+       P1 += -1;               /* Unroll one iteration*/
+       SSYNC;
+       IFLUSH [P0++];          /* because CSYNC can't end loops.*/
+       LSETUP (isall, ieall) LC0 = P1;
+isall:IFLUSH [P0++];
+ieall: NOP;
+       SSYNC;
+       JUMP ifinished;
+
+/* This is an external function being called by the user
+ * application through __flush_cache_all. Currently this function
+ * serves the purpose of flushing all the pending writes in
+ * in the data cache.
+ */
+
+ENTRY(_flush_data_cache)
+       [--SP] = ( R7:6, P5:4 );
+       LINK 12;
+       SP += -12;
+       P5.H = (DCPLB_ADDR0 >> 16);
+       P5.L = (DCPLB_ADDR0 & 0xFFFF);
+       P4.H = (DCPLB_DATA0 >> 16);
+       P4.L = (DCPLB_DATA0 & 0xFFFF);
+       R7 = CPLB_VALID | CPLB_L1_CHBL | CPLB_DIRTY (Z);
+       R6 = 16;
+next:  R0 = [P5++];
+       R1 = [P4++];
+       CC = BITTST(R1, 14);    /* Is it write-through?*/
+       IF CC JUMP skip;        /* If so, ignore it.*/
+       R2 = R1 & R7;           /* Is it a dirty, cached page?*/
+       CC = R2;
+       IF !CC JUMP skip;       /* If not, ignore it.*/
+       [--SP] = RETS;
+       CALL _dcplb_flush;      /* R0 = page, R1 = data*/
+       RETS = [SP++];
+skip:  R6 += -1;
+       CC = R6;
+       IF CC JUMP next;
+       SSYNC;
+       SP += 12;
+       UNLINK;
+       ( R7:6, P5:4 ) = [SP++];
+       RTS;
+
+/* This is an internal function to flush all pending
+ * writes in the cache associated with a particular DCPLB.
+ *
+ * R0 -  page's start address
+ * R1 -  CPLB's data field.
+ */
+
+.align 2
+ENTRY(_dcplb_flush)
+       [--SP] = ( R7:0, P5:0 );
+       [--SP] = LC0;
+       [--SP] = LT0;
+       [--SP] = LB0;
+       [--SP] = LC1;
+       [--SP] = LT1;
+       [--SP] = LB1;
+
+       /* If it's a 1K or 4K page, then it's quickest to
+        * just systematically flush all the addresses in
+        * the page, regardless of whether they're in the
+        * cache, or dirty. If it's a 1M or 4M page, there
+        * are too many addresses, and we have to search the
+        * cache for lines corresponding to the page.
+        */
+
+       CC = BITTST(R1, 17);    /* 1MB or 4MB */
+       IF !CC JUMP dflush_whole_page;
+
+       /* We're only interested in the page's size, so extract
+        * this from the CPLB (bits 17:16), and scale to give an
+        * offset into the page_size and page_prefix tables.
+        */
+
+       R1 <<= 14;
+       R1 >>= 30;
+       R1 <<= 2;
+
+       /* The page could be mapped into Bank A or Bank B, depending
+        * on (a) whether both banks are configured as cache, and
+        * (b) on whether address bit A[x] is set. x is determined
+        * by DCBS in DMEM_CONTROL
+        */
+
+       R2 = 0;                 /* Default to Bank A (Bank B would be 1)*/
+
+       P0.L = (DMEM_CONTROL & 0xFFFF);
+       P0.H = (DMEM_CONTROL >> 16);
+
+       R3 = [P0];              /* If Bank B is not enabled as cache*/
+       CC = BITTST(R3, 2);     /* then Bank A is our only option.*/
+       IF CC JUMP bank_chosen;
+
+       R4 = 1<<14;             /* If DCBS==0, use A[14].*/
+       R5 = R4 << 7;           /* If DCBS==1, use A[23];*/
+       CC = BITTST(R3, 4);
+       IF CC R4 = R5;          /* R4 now has either bit 14 or bit 23 set.*/
+       R5 = R0 & R4;           /* Use it to test the Page address*/
+       CC = R5;                /* and if that bit is set, we use Bank B,*/
+       R2 = CC;                /* else we use Bank A.*/
+       R2 <<= 23;              /* The Bank selection's at posn 23.*/
+
+bank_chosen:
+
+       /* We can also determine the sub-bank used, because this is
+        * taken from bits 13:12 of the address.
+        */
+
+       R3 = ((12<<8)|2);               /* Extraction pattern */
+       nop;                            /*Anamoly 05000209*/
+       R4 = EXTRACT(R0, R3.L) (Z);     /* Extract bits*/
+       /* Save in extraction pattern for later deposit.*/
+       R3.H = R4.L << 0;
+
+       /* So:
+        * R0 = Page start
+        * R1 = Page length (actually, offset into size/prefix tables)
+        * R2 = Bank select mask
+        * R3 = sub-bank deposit values
+        *
+        * The cache has 2 Ways, and 64 sets, so we iterate through
+        * the sets, accessing the tag for each Way, for our Bank and
+        * sub-bank, looking for dirty, valid tags that match our
+        * address prefix.
+        */
+
+       P5.L = (DTEST_COMMAND & 0xFFFF);
+       P5.H = (DTEST_COMMAND >> 16);
+       P4.L = (DTEST_DATA0 & 0xFFFF);
+       P4.H = (DTEST_DATA0 >> 16);
+
+       P0.L = page_prefix_table;
+       P0.H = page_prefix_table;
+       P1 = R1;
+       R5 = 0;                 /* Set counter*/
+       P0 = P1 + P0;
+       R4 = [P0];              /* This is the address prefix*/
+
+
+       /* We're reading (bit 1==0) the tag (bit 2==0), and we
+        * don't care about which double-word, since we're only
+        * fetching tags, so we only have to set Set, Bank,
+        * Sub-bank and Way.
+        */
+
+       P2 = 2;
+       LSETUP (fs1, fe1) LC1 = P2;
+fs1:   P0 = 64;                /* iterate over all sets*/
+       LSETUP (fs0, fe0) LC0 = P0;
+fs0:   R6 = R5 << 5;           /* Combine set*/
+       R6.H = R3.H << 0 ;      /* and sub-bank*/
+       R6 = R6 | R2;           /* and Bank. Leave Way==0 at first.*/
+       BITSET(R6,14);
+       [P5] = R6;              /* Issue Command*/
+       SSYNC;
+       R7 = [P4];              /* and read Tag.*/
+       CC = BITTST(R7, 0);     /* Check if valid*/
+       IF !CC JUMP fskip;      /* and skip if not.*/
+       CC = BITTST(R7, 1);     /* Check if dirty*/
+       IF !CC JUMP fskip;      /* and skip if not.*/
+
+       /* Compare against the page address. First, plant bits 13:12
+        * into the tag, since those aren't part of the returned data.
+        */
+
+       R7 = DEPOSIT(R7, R3);   /* set 13:12*/
+       R1 = R7 & R4;           /* Mask off lower bits*/
+       CC = R1 == R0;          /* Compare against page start.*/
+       IF !CC JUMP fskip;      /* Skip it if it doesn't match.*/
+
+       /* Tag address matches against page, so this is an entry
+        * we must flush.
+        */
+
+       R7 >>= 10;              /* Mask off the non-address bits*/
+       R7 <<= 10;
+       P3 = R7;
+       SSYNC;
+       FLUSHINV [P3];          /* And flush the entry*/
+fskip:
+fe0:   R5 += 1;                /* Advance to next Set*/
+fe1:   BITSET(R2, 26);         /* Go to next Way.*/
+
+dfinished:
+       SSYNC;                  /* Ensure the data gets out to mem.*/
+
+       /*Finished. Restore context.*/
+       LB1 = [SP++];
+       LT1 = [SP++];
+       LC1 = [SP++];
+       LB0 = [SP++];
+       LT0 = [SP++];
+       LC0 = [SP++];
+       ( R7:0, P5:0 ) = [SP++];
+       RTS;
+
+dflush_whole_page:
+
+       /* It's a 1K or 4K page, so quicker to just flush the
+        * entire page.
+        */
+
+       P1 = 32;                /* For 1K pages*/
+       P2 = P1 << 2;           /* For 4K pages*/
+       P0 = R0;                /* Start of page*/
+       CC = BITTST(R1, 16);    /* Whether 1K or 4K*/
+       IF CC P1 = P2;
+       P1 += -1;               /* Unroll one iteration*/
+       SSYNC;
+       FLUSHINV [P0++];        /* because CSYNC can't end loops.*/
+       LSETUP (eall, eall) LC0 = P1;
+eall:  FLUSHINV [P0++];
+       SSYNC;
+       JUMP dfinished;
+
+.align 4;
+page_prefix_table:
+.byte4         0xFFFFFC00;     /* 1K */
+.byte4 0xFFFFF000;     /* 4K */
+.byte4 0xFFF00000;     /* 1M */
+.byte4 0xFFC00000;     /* 4M */
+.page_prefix_table.end:
diff --git a/cpu/bf561/init_sdram.S b/cpu/bf561/init_sdram.S
new file mode 100644 (file)
index 0000000..d763f27
--- /dev/null
@@ -0,0 +1,171 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV   CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV   CONFIG_CCLK_DIV_not_defined_properly
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier */
+       r0 = r0 << 9;                   /* Shift it over, */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2? */
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL? */
+       r1 = r1 << 8;                   /* Shift it over */
+       r0 = r1 | r0;                   /* add them all together */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address */
+       cli r2;                         /* Disable interrupts */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value */
+       idle;                           /* Wait for the PLL to stablize */
+       sti r2;                         /* Enable interrupts */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        */
+
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
diff --git a/cpu/bf561/init_sdram_bootrom_initblock.S b/cpu/bf561/init_sdram_bootrom_initblock.S
new file mode 100644 (file)
index 0000000..5e3c88a
--- /dev/null
@@ -0,0 +1,185 @@
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/mem_init.h>
+.global init_sdram;
+
+#if (CONFIG_CCLK_DIV == 1)
+#define CONFIG_CCLK_ACT_DIV    CCLK_DIV1
+#endif
+#if (CONFIG_CCLK_DIV == 2)
+#define CONFIG_CCLK_ACT_DIV    CCLK_DIV2
+#endif
+#if (CONFIG_CCLK_DIV == 4)
+#define CONFIG_CCLK_ACT_DIV    CCLK_DIV4
+#endif
+#if (CONFIG_CCLK_DIV == 8)
+#define CONFIG_CCLK_ACT_DIV    CCLK_DIV8
+#endif
+#ifndef CONFIG_CCLK_ACT_DIV
+#define CONFIG_CCLK_ACT_DIV    CONFIG_CCLK_DIV_not_defined_properly
+#endif
+
+init_sdram:
+       [--SP] = ASTAT;
+       [--SP] = RETS;
+       [--SP] = (R7:0);
+       [--SP] = (P5:0);
+
+
+       p0.h = hi(SICA_IWR0);
+       p0.l = lo(SICA_IWR0);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+
+       p0.h = hi(SPI_BAUD);
+       p0.l = lo(SPI_BAUD);
+       r0.l = CONFIG_SPI_BAUD_INITBLOCK;
+       w[p0] = r0.l;
+       SSYNC;
+
+       /*
+        * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
+        */
+       p0.h = hi(PLL_LOCKCNT);
+       p0.l = lo(PLL_LOCKCNT);
+       r0 = 0x300(Z);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * Put SDRAM in self-refresh, incase anything is running
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITSET (R0, 24);
+       [P2] = R0;
+       SSYNC;
+
+       /*
+        *  Set PLL_CTL with the value that we calculate in R0
+        *   - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
+        *   - [8]     = BYPASS    : BYPASS the PLL, run CLKIN into CCLK/SCLK
+        *   - [7]     = output delay (add 200ps of delay to mem signals)
+        *   - [6]     = input delay (add 200ps of input delay to mem signals)
+        *   - [5]     = PDWN      : 1=All Clocks off
+        *   - [3]     = STOPCK    : 1=Core Clock off
+        *   - [1]     = PLL_OFF   : 1=Disable Power to PLL
+        *   - [0]     = DF        : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
+        *   all other bits set to zero
+        */
+
+       r0 = CONFIG_VCO_MULT & 63;      /* Load the VCO multiplier */
+       r0 = r0 << 9;                   /* Shift it over, */
+       r1 = CONFIG_CLKIN_HALF;         /* Do we need to divide CLKIN by 2? */
+       r0 = r1 | r0;
+       r1 = CONFIG_PLL_BYPASS;         /* Bypass the PLL? */
+       r1 = r1 << 8;                   /* Shift it over */
+       r0 = r1 | r0;                   /* add them all together */
+
+       p0.h = hi(PLL_CTL);
+       p0.l = lo(PLL_CTL);             /* Load the address */
+       cli r2;                         /* Disable interrupts */
+       ssync;
+       w[p0] = r0.l;                   /* Set the value */
+       idle;                           /* Wait for the PLL to stablize */
+       sti r2;                         /* Enable interrupts */
+
+check_again:
+       p0.h = hi(PLL_STAT);
+       p0.l = lo(PLL_STAT);
+       R0 = W[P0](Z);
+       CC = BITTST(R0,5);
+       if ! CC jump check_again;
+
+       /* Configure SCLK & CCLK Dividers */
+       r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+       p0.h = hi(PLL_DIV);
+       p0.l = lo(PLL_DIV);
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * We now are running at speed, time to set the Async mem bank wait states
+        * This will speed up execution, since we are normally running from FLASH.
+        */
+
+       p2.h = (EBIU_AMBCTL1 >> 16);
+       p2.l = (EBIU_AMBCTL1 & 0xFFFF);
+       r0.h = (AMBCTL1VAL >> 16);
+       r0.l = (AMBCTL1VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMBCTL0 >> 16);
+       p2.l = (EBIU_AMBCTL0 & 0xFFFF);
+       r0.h = (AMBCTL0VAL >> 16);
+       r0.l = (AMBCTL0VAL & 0xFFFF);
+       [p2] = r0;
+       ssync;
+
+       p2.h = (EBIU_AMGCTL >> 16);
+       p2.l = (EBIU_AMGCTL & 0xffff);
+       r0 = AMGCTLVAL;
+       w[p2] = r0;
+       ssync;
+
+       /*
+        * Now, Initialize the SDRAM,
+        * start with the SDRAM Refresh Rate Control Register
+        */
+       p0.l = lo(EBIU_SDRRC);
+       p0.h = hi(EBIU_SDRRC);
+       r0 = mem_SDRRC;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Memory Bank Control Register - bank specific parameters
+        */
+       p0.l = (EBIU_SDBCTL & 0xFFFF);
+       p0.h = (EBIU_SDBCTL >> 16);
+       r0 = mem_SDBCTL;
+       w[p0] = r0.l;
+       ssync;
+
+       /*
+        * SDRAM Global Control Register - global programmable parameters
+        * Disable self-refresh
+        */
+       P2.H = hi(EBIU_SDGCTL);
+       P2.L = lo(EBIU_SDGCTL);
+       R0 = [P2];
+       BITCLR (R0, 24);
+
+       /*
+        * Check if SDRAM is already powered up, if it is, enable self-refresh
+        */
+       p0.h = hi(EBIU_SDSTAT);
+       p0.l = lo(EBIU_SDSTAT);
+       r2.l = w[p0];
+       cc = bittst(r2,3);
+       if !cc jump skip;
+       NOP;
+       BITSET (R0, 23);
+skip:
+       [P2] = R0;
+       SSYNC;
+
+       /* Write in the new value in the register */
+       R0.L = lo(mem_SDGCTL);
+       R0.H = hi(mem_SDGCTL);
+       [P2] = R0;
+       SSYNC;
+       nop;
+
+
+       (P5:0) = [SP++];
+       (R7:0) = [SP++];
+       RETS   = [SP++];
+       ASTAT  = [SP++];
+       RTS;
diff --git a/cpu/bf561/interrupt.S b/cpu/bf561/interrupt.S
new file mode 100644 (file)
index 0000000..21839ce
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * U-boot - interrupt.S Processing of interrupts and exception handling
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * This file is based on interrupt.S
+ *
+ * Copyright (C) 2003  Metrowerks, Inc. <mwaddel@metrowerks.com>
+ * Copyright (C) 2002  Arcturus Networks Ltd. Ted Ma <mated@sympatico.ca>
+ * Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                     Kenneth Albanowski <kjahds@kjahds.com>,
+ *                     The Silver Hammer Group, Ltd.
+ *
+ * (c) 1995, Dionne & Associates
+ * (c) 1995, DKG Display Tech.
+ *
+ * This file is also based on exception.asm
+ * (C) Copyright 2001-2005 - Analog Devices, Inc.  All rights reserved.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#define ASSEMBLY
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/hw_irq.h>
+#include <asm/entry.h>
+#include <asm/blackfin_defs.h>
+
+.global _blackfin_irq_panic;
+
+.text
+.align 2
+
+#ifndef CONFIG_KGDB
+.global _evt_emulation
+_evt_emulation:
+       SAVE_CONTEXT
+       r0 = IRQ_EMU;
+       r1 = seqstat;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+       rte;
+#endif
+
+.global _evt_nmi
+_evt_nmi:
+       SAVE_CONTEXT
+       r0 = IRQ_NMI;
+       r1 = RETN;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+
+_evt_nmi_exit:
+       rtn;
+
+.global _trap
+_trap:
+       SAVE_ALL_SYS
+       r0 = sp;        /* stack frame pt_regs pointer argument ==> r0 */
+       sp += -12;
+       call _trap_c
+       sp += 12;
+       RESTORE_ALL_SYS
+       rtx;
+
+.global _evt_rst
+_evt_rst:
+       SAVE_CONTEXT
+       r0 = IRQ_RST;
+       r1 = RETN;
+       sp += -12;
+       call _do_reset;
+       sp += 12;
+
+_evt_rst_exit:
+       rtn;
+
+irq_panic:
+       r0 = IRQ_EVX;
+       r1 =  sp;
+       sp += -12;
+       call _blackfin_irq_panic;
+       sp += 12;
+
+.global _evt_ivhw
+_evt_ivhw:
+       SAVE_CONTEXT
+       RAISE 14;
+
+_evt_ivhw_exit:
+        rti;
+
+.global _evt_timer
+_evt_timer:
+       SAVE_CONTEXT
+       r0 = IRQ_CORETMR;
+       sp += -12;
+       /* Polling method used now. */
+       /* call timer_int; */
+       sp += 12;
+       RESTORE_CONTEXT
+       rti;
+       nop;
+
+.global _evt_evt7
+_evt_evt7:
+       SAVE_CONTEXT
+       r0 = 7;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt7_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt8
+_evt_evt8:
+       SAVE_CONTEXT
+       r0 = 8;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt8_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt9
+_evt_evt9:
+       SAVE_CONTEXT
+       r0 = 9;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt9_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt10
+_evt_evt10:
+       SAVE_CONTEXT
+       r0 = 10;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt10_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt11
+_evt_evt11:
+       SAVE_CONTEXT
+       r0 = 11;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt11_exit:
+       RESTORE_CONTEXT
+       rti;
+
+.global _evt_evt12
+_evt_evt12:
+       SAVE_CONTEXT
+       r0 = 12;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+evt_evt12_exit:
+        RESTORE_CONTEXT
+        rti;
+
+.global _evt_evt13
+_evt_evt13:
+       SAVE_CONTEXT
+       r0 = 13;
+       sp += -12;
+       call _process_int;
+       sp += 12;
+
+evt_evt13_exit:
+        RESTORE_CONTEXT
+        rti;
+
+.global _evt_system_call
+_evt_system_call:
+       [--sp] = r0;
+       [--SP] = RETI;
+       r0 = [sp++];
+       r0 += 2;
+       [--sp] = r0;
+       RETI = [SP++];
+       r0 = [SP++];
+       SAVE_CONTEXT
+       sp += -12;
+       call _exception_handle;
+       sp += 12;
+       RESTORE_CONTEXT
+       RTI;
+
+evt_system_call_exit:
+       rti;
+
+.global _evt_soft_int1
+_evt_soft_int1:
+       [--sp] = r0;
+       [--SP] = RETI;
+       r0 = [sp++];
+       r0 += 2;
+       [--sp] = r0;
+       RETI = [SP++];
+       r0 = [SP++];
+       SAVE_CONTEXT
+       sp += -12;
+       call _exception_handle;
+       sp += 12;
+       RESTORE_CONTEXT
+       RTI;
+
+evt_soft_int1_exit:
+       rti;
diff --git a/cpu/bf561/interrupts.c b/cpu/bf561/interrupts.c
new file mode 100644 (file)
index 0000000..ecbc6ad
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * U-boot - interrupts.c Interrupt related routines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on interrupts.c
+ * Copyright 1996 Roman Zippel
+ * Copyright 1999 D. Jeff Dionne <jeff@uclinux.org>
+ * Copyright 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca>
+ * Copyright 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca>
+ * Copyright 2003 Metrowerks/Motorola
+ * Copyright 2003 Bas Vermeulen <bas@buyways.nl>,
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/machdep.h>
+#include <asm/irq.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include "cpu.h"
+
+static ulong timestamp;
+static ulong last_time;
+static int int_flag;
+
+int irq_flags;                 /* needed by asm-blackfin/system.h */
+
+/* Functions just to satisfy the linker */
+
+/*
+ * This function is derived from PowerPC code (read timebase as long long).
+ * On BF561 it just returns the timer value.
+ */
+unsigned long long get_ticks(void)
+{
+       return get_timer(0);
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On BF561 it returns the number of timer ticks per second.
+ */
+ulong get_tbclk(void)
+{
+       ulong tbclk;
+
+       tbclk = CFG_HZ;
+       return tbclk;
+}
+
+void enable_interrupts(void)
+{
+       restore_flags(int_flag);
+}
+
+int disable_interrupts(void)
+{
+       save_and_cli(int_flag);
+       return 1;
+}
+
+int interrupt_init(void)
+{
+       return (0);
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned long delay, start, stop;
+       unsigned long cclk;
+       cclk = (CONFIG_CCLK_HZ);
+
+       while (usec > 1) {
+               /*
+                * how many clock ticks to delay?
+                *  - request(in useconds) * clock_ticks(Hz) / useconds/second
+                */
+               if (usec < 1000) {
+                       delay = (usec * (cclk / 244)) >> 12;
+                       usec = 0;
+               } else {
+                       delay = (1000 * (cclk / 244)) >> 12;
+                       usec -= 1000;
+               }
+
+               asm volatile (" %0 = CYCLES;":"=r" (start));
+               do {
+                       asm volatile (" %0 = CYCLES; ":"=r" (stop));
+               } while (stop - start < delay);
+       }
+
+       return;
+}
+
+void timer_init(void)
+{
+       *pTCNTL = 0x1;
+       *pTSCALE = 0x0;
+       *pTCOUNT = MAX_TIM_LOAD;
+       *pTPERIOD = MAX_TIM_LOAD;
+       *pTCNTL = 0x7;
+       asm("CSYNC;");
+
+       timestamp = 0;
+       last_time = 0;
+}
+
+/*
+ * Any network command or flash
+ * command is started get_timer shall
+ * be called before TCOUNT gets reset,
+ * to implement the accurate timeouts.
+ *
+ * How ever milliconds doesn't return
+ * the number that has been elapsed from
+ * the last reset.
+ *
+ * As get_timer is used in the u-boot
+ * only for timeouts this should be
+ * sufficient
+ */
+ulong get_timer(ulong base)
+{
+       ulong milisec;
+
+       /* Number of clocks elapsed */
+       ulong clocks = (MAX_TIM_LOAD - (*pTCOUNT));
+
+       /*
+        * Find if the TCOUNT is reset
+        * timestamp gives the number of times
+        * TCOUNT got reset
+        */
+       if (clocks < last_time)
+               timestamp++;
+       last_time = clocks;
+
+       /* Get the number of milliseconds */
+       milisec = clocks / (CONFIG_CCLK_HZ / 1000);
+
+       /*
+        * Find the number of millisonds
+        * that got elapsed before this TCOUNT
+        * cycle
+        */
+       milisec += timestamp * (MAX_TIM_LOAD / (CONFIG_CCLK_HZ / 1000));
+
+       return (milisec - base);
+}
diff --git a/cpu/bf561/ints.c b/cpu/bf561/ints.c
new file mode 100644 (file)
index 0000000..27a38a3
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * U-boot - ints.c Interrupt related routines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on ints.c
+ *
+ * Apr18 2003, Changed by HuTao to support interrupt cascading for Blackfin
+ *     drivers
+ *
+ * Copyright 1996 Roman Zippel
+ * Copyright 1999 D. Jeff Dionne <jeff@uclinux.org>
+ * Copyright 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca>
+ * Copyright 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca>
+ * Copyright 2003 Metrowerks/Motorola
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <linux/stddef.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/traps.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/machdep.h>
+#include <asm/setup.h>
+#include <asm/blackfin.h>
+#include "cpu.h"
+
+void blackfin_irq_panic(int reason, struct pt_regs *regs)
+{
+       printf("\n\nException: IRQ 0x%x entered\n", reason);
+       printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+       printf("stack frame=0x%x, ", (unsigned int)regs);
+       printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
+       dump(regs);
+       printf("Unhandled IRQ or exceptions!\n");
+       printf("Please reset the board \n");
+}
+
+void blackfin_init_IRQ(void)
+{
+       *(unsigned volatile long *)(SIC_IMASK) = SIC_UNMASK_ALL;
+       cli();
+#ifndef CONFIG_KGDB
+       *(unsigned volatile long *)(EVT_EMULATION_ADDR) = 0x0;
+#endif
+       *(unsigned volatile long *)(EVT_NMI_ADDR) =
+           (unsigned volatile long)evt_nmi;
+       *(unsigned volatile long *)(EVT_EXCEPTION_ADDR) =
+           (unsigned volatile long)trap;
+       *(unsigned volatile long *)(EVT_HARDWARE_ERROR_ADDR) =
+           (unsigned volatile long)evt_ivhw;
+       *(unsigned volatile long *)(EVT_RESET_ADDR) =
+           (unsigned volatile long)evt_rst;
+       *(unsigned volatile long *)(EVT_TIMER_ADDR) =
+           (unsigned volatile long)evt_timer;
+       *(unsigned volatile long *)(EVT_IVG7_ADDR) =
+           (unsigned volatile long)evt_evt7;
+       *(unsigned volatile long *)(EVT_IVG8_ADDR) =
+           (unsigned volatile long)evt_evt8;
+       *(unsigned volatile long *)(EVT_IVG9_ADDR) =
+           (unsigned volatile long)evt_evt9;
+       *(unsigned volatile long *)(EVT_IVG10_ADDR) =
+           (unsigned volatile long)evt_evt10;
+       *(unsigned volatile long *)(EVT_IVG11_ADDR) =
+           (unsigned volatile long)evt_evt11;
+       *(unsigned volatile long *)(EVT_IVG12_ADDR) =
+           (unsigned volatile long)evt_evt12;
+       *(unsigned volatile long *)(EVT_IVG13_ADDR) =
+           (unsigned volatile long)evt_evt13;
+       *(unsigned volatile long *)(EVT_IVG14_ADDR) =
+           (unsigned volatile long)evt_system_call;
+       *(unsigned volatile long *)(EVT_IVG15_ADDR) =
+           (unsigned volatile long)evt_soft_int1;
+       *(volatile unsigned long *)ILAT = 0;
+       asm("csync;");
+       sti();
+       *(volatile unsigned long *)IMASK = 0xffbf;
+       asm("csync;");
+}
+
+void exception_handle(void)
+{
+#if defined (CONFIG_PANIC_HANG)
+       display_excp();
+#else
+       udelay(100000);         /* allow messages to go out */
+       do_reset(NULL, 0, 0, NULL);
+#endif
+}
+
+void display_excp(void)
+{
+       printf("Exception!\n");
+}
diff --git a/cpu/bf561/serial.c b/cpu/bf561/serial.c
new file mode 100644 (file)
index 0000000..7f5c695
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * U-boot - serial.c Serial driver for BF561
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * bf533_serial.c: Serial driver for BlackFin BF533 DSP internal UART.
+ * Copyright (c) 2003  Bas Vermeulen <bas@buyways.nl>,
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * Based heavily on blkfinserial.c
+ * blkfinserial.c: Serial driver for BlackFin DSP internal USRTs.
+ * Copyright(c) 2003   Metrowerks      <mwaddel@metrowerks.com>
+ * Copyright(c)        2001    Tony Z. Kou     <tonyko@arcturusnetworks.com>
+ * Copyright(c)        2001-2002 Arcturus Networks Inc. <www.arcturusnetworks.com>
+ *
+ * Based on code from 68328 version serial driver imlpementation which was:
+ * Copyright (C) 1995       David S. Miller    <davem@caip.rutgers.edu>
+ * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
+ * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
+ * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/segment.h>
+#include <asm/bitops.h>
+#include <asm/delay.h>
+#include <asm/uaccess.h>
+#include "serial.h"
+#include <asm/io.h>
+
+unsigned long pll_div_fact;
+
+void calc_baud(void)
+{
+       unsigned char i;
+       int temp;
+       u_long sclk = get_sclk();
+
+       for (i = 0; i < sizeof(baud_table) / sizeof(int); i++) {
+               temp = sclk / (baud_table[i] * 8);
+               if ((temp & 0x1) == 1) {
+                       temp++;
+               }
+               temp = temp / 2;
+               hw_baud_table[i].dl_high = (temp >> 8) & 0xFF;
+               hw_baud_table[i].dl_low = (temp) & 0xFF;
+       }
+}
+
+void serial_setbrg(void)
+{
+       int i;
+       DECLARE_GLOBAL_DATA_PTR;
+
+       calc_baud();
+
+       for (i = 0; i < sizeof(baud_table) / sizeof(int); i++) {
+               if (gd->baudrate == baud_table[i])
+                       break;
+       }
+
+       /* Enable UART */
+       *pUART_GCTL |= UART_GCTL_UCEN;
+       sync();
+
+       /* Set DLAB in LCR to Access DLL and DLH */
+       ACCESS_LATCH;
+       sync();
+
+       *pUART_DLL = hw_baud_table[i].dl_low;
+       sync();
+       *pUART_DLH = hw_baud_table[i].dl_high;
+       sync();
+
+       /* Clear DLAB in LCR to Access THR RBR IER */
+       ACCESS_PORT_IER;
+       sync();
+
+       /*
+        * Enable  ERBFI and ELSI interrupts
+        * to poll SIC_ISR register
+        */
+       *pUART_IER = UART_IER_ELSI | UART_IER_ERBFI | UART_IER_ETBEI;
+       sync();
+
+       /* Set LCR to Word Lengh 8-bit word select */
+       *pUART_LCR = UART_LCR_WLS8;
+       sync();
+
+       return;
+}
+
+int serial_init(void)
+{
+       serial_setbrg();
+       return (0);
+}
+
+void serial_putc(const char c)
+{
+       if ((*pUART_LSR) & UART_LSR_TEMT) {
+               if (c == '\n')
+                       serial_putc('\r');
+
+               local_put_char(c);
+       }
+
+       while (!((*pUART_LSR) & UART_LSR_TEMT))
+               SYNC_ALL;
+
+       return;
+}
+
+int serial_tstc(void)
+{
+       if (*pUART_LSR & UART_LSR_DR)
+               return 1;
+       else
+               return 0;
+}
+
+int serial_getc(void)
+{
+       unsigned short uart_lsr_val, uart_rbr_val;
+       unsigned long isr_val;
+       int ret;
+
+       /* Poll for RX Interrupt */
+       while (!((isr_val =
+                 *(volatile unsigned long *)SIC_ISR) & IRQ_UART_RX_BIT)) ;
+       asm("csync;");
+
+       uart_lsr_val = *pUART_LSR;      /* Clear status bit */
+       uart_rbr_val = *pUART_RBR;      /* getc() */
+
+       if (isr_val & IRQ_UART_ERROR_BIT) {
+               ret = -1;
+       } else {
+               ret = uart_rbr_val & 0xff;
+       }
+
+       return ret;
+}
+
+void serial_puts(const char *s)
+{
+       while (*s) {
+               serial_putc(*s++);
+       }
+}
+
+static void local_put_char(char ch)
+{
+       int flags = 0;
+       unsigned long isr_val;
+
+       save_and_cli(flags);
+
+       /* Poll for TX Interruput */
+       while (!((isr_val = *pSIC_ISR) & IRQ_UART_TX_BIT)) ;
+       asm("csync;");
+
+       *pUART_THR = ch;        /* putc() */
+
+       if (isr_val & IRQ_UART_ERROR_BIT) {
+               printf("?");
+       }
+
+       restore_flags(flags);
+
+       return;
+}
diff --git a/cpu/bf561/serial.h b/cpu/bf561/serial.h
new file mode 100644 (file)
index 0000000..c1cbf36
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * U-boot - bf561_serial.h Serial Driver defines
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver.
+ * Copyright (C) 2003  Bas Vermeulen <bas@buyways.nl>
+ *                     BuyWays B.V. (www.buyways.nl)
+ *
+ * Based heavily on:
+ * blkfinserial.h: Definitions for the BlackFin DSP serial driver.
+ *
+ * Copyright (C) 2001  Tony Z. Kou     tonyko@arcturusnetworks.com
+ * Copyright (C) 2001   Arcturus Networks Inc. <www.arcturusnetworks.com>
+ *
+ * Based on code from 68328serial.c which was:
+ * Copyright (C) 1995       David S. Miller    <davem@caip.rutgers.edu>
+ * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
+ * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
+ * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _Bf561_SERIAL_H
+#define _Bf561_SERIAL_H
+
+#include <linux/config.h>
+#include <asm/blackfin.h>
+
+#define SYNC_ALL       __asm__ __volatile__ ("ssync;\n")
+#define ACCESS_LATCH   *pUART_LCR |= UART_LCR_DLAB;
+#define ACCESS_PORT_IER        *pUART_LCR &= (~UART_LCR_DLAB);
+
+void serial_setbrg(void);
+static void local_put_char(char ch);
+void calc_baud(void);
+void serial_setbrg(void);
+int serial_init(void);
+void serial_putc(const char c);
+int serial_tstc(void);
+int serial_getc(void);
+void serial_puts(const char *s);
+static void local_put_char(char ch);
+
+int baud_table[5] = { 9600, 19200, 38400, 57600, 115200 };
+
+struct {
+       unsigned char dl_high;
+       unsigned char dl_low;
+} hw_baud_table[5];
+
+#ifdef CONFIG_STAMP
+extern unsigned long pll_div_fact;
+#endif
+
+#endif
diff --git a/cpu/bf561/start.S b/cpu/bf561/start.S
new file mode 100644 (file)
index 0000000..bd26cf3
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * U-boot - start.S Startup file of u-boot for BF533/BF561
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on head.S
+ * Copyright (c) 2003  Metrowerks/Motorola
+ * Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                    Kenneth Albanowski <kjahds@kjahds.com>,
+ *                    The Silver Hammer Group, Ltd.
+ * (c) 1995, Dionne & Associates
+ * (c) 1995, DKG Display Tech.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+/*
+ * Note: A change in this file subsequently requires a change in
+ *       board/$(board_name)/config.mk for a valid u-boot.bin
+ */
+
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.global _stext;
+.global __bss_start;
+.global start;
+.global _start;
+.global _rambase;
+.global _ramstart;
+.global _ramend;
+.global edata;
+.global _initialize;
+.global _exit;
+.global flashdataend;
+.global init_sdram;
+
+.text
+_start:
+start:
+_stext:
+
+       R0 = 0x32;
+       SYSCFG = R0;
+       SSYNC;
+
+       /*
+        * As per HW reference manual DAG registers,
+        * DATA and Address resgister shall be zero'd
+        * in initialization, after a reset state
+        */
+       r1 = 0; /* Data registers zero'd */
+       r2 = 0;
+       r3 = 0;
+       r4 = 0;
+       r5 = 0;
+       r6 = 0;
+       r7 = 0;
+
+       p0 = 0; /* Address registers zero'd */
+       p1 = 0;
+       p2 = 0;
+       p3 = 0;
+       p4 = 0;
+       p5 = 0;
+
+       i0 = 0; /* DAG Registers zero'd */
+       i1 = 0;
+       i2 = 0;
+       i3 = 0;
+       m0 = 0;
+       m1 = 0;
+       m3 = 0;
+       m3 = 0;
+       l0 = 0;
+       l1 = 0;
+       l2 = 0;
+       l3 = 0;
+       b0 = 0;
+       b1 = 0;
+       b2 = 0;
+       b3 = 0;
+
+       /*
+        * Set loop counters to zero, to make sure that
+        * hw loops are disabled.
+        */
+       r0  = 0;
+       lc0 = r0;
+       lc1 = r0;
+
+       SSYNC;
+
+       /* Check soft reset status */
+       p0.h = SWRST >> 16;
+       p0.l = SWRST & 0xFFFF;
+       r0.l = w[p0];
+
+       cc = bittst(r0, 15);
+       if !cc jump no_soft_reset;
+
+       /* Clear Soft reset */
+       r0 = 0x0000;
+       w[p0] = r0;
+       ssync;
+
+no_soft_reset:
+       nop;
+
+       /* Clear EVT registers */
+       p0.h = (EVT_EMULATION_ADDR >> 16);
+       p0.l = (EVT_EMULATION_ADDR & 0xFFFF);
+       p0 += 8;
+       p1 = 14;
+       r1 = 0;
+       LSETUP(4,4) lc0 = p1;
+       [ p0 ++ ] = r1;
+
+       p0.h = hi(SIC_IWR);
+       p0.l = lo(SIC_IWR);
+       r0.l = 0x1;
+       w[p0] = r0.l;
+       SSYNC;
+
+       sp.l = (0xffb01000 & 0xFFFF);
+       sp.h = (0xffb01000 >> 16);
+
+       /*
+        * Check if the code is in SDRAM
+        * If the code is in SDRAM, skip SDRAM initializaiton
+        */
+       call get_pc;
+       r3.l = 0x0;
+       r3.h = 0x2000;
+       cc = r0 < r3 (iu);
+       if cc jump sdram_initialized;
+       call init_sdram;
+       /* relocate into to RAM */
+sdram_initialized:
+       call get_pc;
+offset:
+       r2.l = offset;
+       r2.h = offset;
+       r3.l = start;
+       r3.h = start;
+       r1 = r2 - r3;
+
+       r0 = r0 - r1;
+       p1 = r0;
+
+       p2.l = (CFG_MONITOR_BASE & 0xffff);
+       p2.h = (CFG_MONITOR_BASE >> 16);
+
+       p3 = 0x04;
+       p4.l = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) & 0xffff);
+       p4.h = ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) >> 16);
+loop1:
+       r1 = [p1 ++ p3];
+       [p2 ++ p3] = r1;
+       cc=p2==p4;
+       if !cc jump loop1;
+       /*
+        * configure STACK
+        */
+       r0.h = (CONFIG_STACKBASE >> 16);
+       r0.l = (CONFIG_STACKBASE & 0xFFFF);
+       sp = r0;
+       fp = sp;
+
+       /*
+        * This next section keeps the processor in supervisor mode
+        * during kernel boot.  Switches to user mode at end of boot.
+        * See page 3-9 of Hardware Reference manual for documentation.
+        */
+
+       /* To keep ourselves in the supervisor mode */
+       p0.l = (EVT_IVG15_ADDR & 0xFFFF);
+       p0.h = (EVT_IVG15_ADDR >> 16);
+
+       p1.l = _real_start;
+       p1.h = _real_start;
+       [p0] = p1;
+
+       p0.l = (IMASK & 0xFFFF);
+       p0.h = (IMASK >> 16);
+       r0.l = LO(IVG15_POS);
+       r0.h = HI(IVG15_POS);
+       [p0] = r0;
+       raise 15;
+       p0.l = WAIT_HERE;
+       p0.h = WAIT_HERE;
+       reti = p0;
+       rti;
+
+WAIT_HERE:
+       jump WAIT_HERE;
+
+.global _real_start;
+_real_start:
+       [ -- sp ] = reti;
+
+#ifdef CONFIG_EZKIT561
+       p0.l = (WDOG_CTL & 0xFFFF);
+       p0.h = (WDOG_CTL >> 16);
+       r0 = WATCHDOG_DISABLE(z);
+       w[p0] = r0;
+#endif
+
+       /* DMA reset code to Hi of L1 SRAM */
+copy:
+       P1.H = hi(SYSMMR_BASE); /* P1 Points to the beginning of SYSTEM MMR Space */
+       P1.L = lo(SYSMMR_BASE);
+
+       R0.H = reset_start;     /* Source Address (high) */
+       R0.L = reset_start;     /* Source Address (low) */
+       R1.H = reset_end;
+       R1.L = reset_end;
+       R2 = R1 - R0;           /* Count */
+       R1.H = hi(L1_ISRAM);    /* Destination Address (high) */
+       R1.L = lo(L1_ISRAM);    /* Destination Address (low) */
+       R3.L = DMAEN;           /* Source DMAConfig Value (8-bit words) */
+       R4.L = (DI_EN | WNR | DMAEN);   /* Destination DMAConfig Value (8-bit words) */
+
+DMA:
+       R6 = 0x1 (Z);
+       W[P1+OFFSET_(MDMA_S0_X_MODIFY)] = R6;   /* Source Modify = 1 */
+       W[P1+OFFSET_(MDMA_D0_X_MODIFY)] = R6;   /* Destination Modify = 1 */
+
+       [P1+OFFSET_(MDMA_S0_START_ADDR)] = R0;  /* Set Source Base Address */
+       W[P1+OFFSET_(MDMA_S0_X_COUNT)] = R2;    /* Set Source Count */
+       /* Set Source  DMAConfig = DMA Enable,
+       Memory Read,  8-Bit Transfers, 1-D DMA, Flow - Stop */
+       W[P1+OFFSET_(MDMA_S0_CONFIG)] = R3;
+
+       [P1+OFFSET_(MDMA_D0_START_ADDR)] = R1;  /* Set Destination Base Address */
+       W[P1+OFFSET_(MDMA_D0_X_COUNT)] = R2;    /* Set Destination Count */
+       /* Set Destination DMAConfig = DMA Enable,
+       Memory Write, 8-Bit Transfers, 1-D DMA, Flow - Stop, IOC */
+       W[P1+OFFSET_(MDMA_D0_CONFIG)] = R4;
+
+WAIT_DMA_DONE:
+       p0.h = hi(MDMA_D0_IRQ_STATUS);
+       p0.l = lo(MDMA_D0_IRQ_STATUS);
+       R0 = W[P0](Z);
+       CC = BITTST(R0, 0);
+       if ! CC jump WAIT_DMA_DONE
+
+       R0 = 0x1;
+       W[P1+OFFSET_(MDMA_D0_IRQ_STATUS)] = R0; /* Write 1 to clear DMA interrupt */
+
+       /* Initialize BSS Section with 0 s */
+       p1.l = __bss_start;
+       p1.h = __bss_start;
+       p2.l = _end;
+       p2.h = _end;
+       r1 = p1;
+       r2 = p2;
+       r3 = r2 - r1;
+       r3 = r3 >> 2;
+       p3 = r3;
+       lsetup (_clear_bss, _clear_bss_end ) lc1 = p3;
+       CC = p2<=p1;
+       if CC jump _clear_bss_skip;
+       r0 = 0;
+_clear_bss:
+_clear_bss_end:
+       [p1++] = r0;
+_clear_bss_skip:
+
+       p0.l = _start1;
+       p0.h = _start1;
+       jump (p0);
+
+reset_start:
+       p0.h = WDOG_CNT >> 16;
+       p0.l = WDOG_CNT & 0xffff;
+       r0 = 0x0010;
+       w[p0] = r0;
+       p0.h = WDOG_CTL >> 16;
+       p0.l = WDOG_CTL & 0xffff;
+       r0 = 0x0000;
+       w[p0] = r0;
+reset_wait:
+       jump reset_wait;
+
+reset_end: nop;
+
+_exit:
+       jump.s  _exit;
+get_pc:
+       r0 = rets;
+       rts;
diff --git a/cpu/bf561/start1.S b/cpu/bf561/start1.S
new file mode 100644 (file)
index 0000000..6d4731b
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * U-boot - start1.S Code running out of RAM after relocation
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#define ASSEMBLY
+#include <linux/config.h>
+#include <config.h>
+#include <asm/blackfin.h>
+
+.global        start1;
+.global        _start1;
+
+.text
+_start1:
+start1:
+       sp += -12;
+       call    _board_init_f;
+       sp += 12;
diff --git a/cpu/bf561/traps.c b/cpu/bf561/traps.c
new file mode 100644 (file)
index 0000000..7e2dcd1
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * U-boot - traps.c Routines related to interrupts and exceptions
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * No original Copyright holder listed,
+ * Probabily original (C) Roman Zippel (assigned DJD, 1999)
+ *
+ * Copyright 2003 Metrowerks - for Blackfin
+ * Copyright 2000-2001 Lineo, Inc. D. Jeff Dionne <jeff@lineo.ca>
+ * Copyright 1999-2000 D. Jeff Dionne, <jeff@uclinux.org>
+ *
+ * (C) Copyright 2000-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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <linux/types.h>
+#include <asm/errno.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/traps.h>
+#include <asm/machdep.h>
+#include "cpu.h"
+#include <asm/arch/anomaly.h>
+#include <asm/cplb.h>
+#include <asm/io.h>
+
+void init_IRQ(void)
+{
+       blackfin_init_IRQ();
+       return;
+}
+
+void process_int(unsigned long vec, struct pt_regs *fp)
+{
+       printf("interrupt\n");
+       return;
+}
+
+extern unsigned int icplb_table[page_descriptor_table_size][2];
+extern unsigned int dcplb_table[page_descriptor_table_size][2];
+
+unsigned long last_cplb_fault_retx;
+
+static unsigned int cplb_sizes[4] =
+    { 1024, 4 * 1024, 1024 * 1024, 4 * 1024 * 1024 };
+
+void trap_c(struct pt_regs *regs)
+{
+       unsigned int addr;
+       unsigned long trapnr = (regs->seqstat) & SEQSTAT_EXCAUSE;
+       unsigned int i, j, size, *I0, *I1;
+       unsigned short data = 0;
+
+       switch (trapnr) {
+               /* 0x26 - Data CPLB Miss */
+       case VEC_CPLB_M:
+
+#ifdef ANOMALY_05000261
+               /*
+                * Work around an anomaly: if we see a new DCPLB fault, return
+                * without doing anything.  Then, if we get the same fault again,
+                * handle it.
+                */
+               addr = last_cplb_fault_retx;
+               last_cplb_fault_retx = regs->retx;
+               printf("this time, curr = 0x%08x last = 0x%08x\n", addr,
+                      last_cplb_fault_retx);
+               if (addr != last_cplb_fault_retx)
+                       goto trap_c_return;
+#endif
+               data = 1;
+
+       case VEC_CPLB_I_M:
+
+               if (data)
+                       addr = *pDCPLB_FAULT_ADDR;
+               else
+                       addr = *pICPLB_FAULT_ADDR;
+
+               for (i = 0; i < page_descriptor_table_size; i++) {
+                       if (data) {
+                               size = cplb_sizes[dcplb_table[i][1] >> 16];
+                               j = dcplb_table[i][0];
+                       } else {
+                               size = cplb_sizes[icplb_table[i][1] >> 16];
+                               j = icplb_table[i][0];
+                       }
+                       if ((j <= addr) && ((j + size) > addr)) {
+                               debug("found %i 0x%08x\n", i, j);
+                               break;
+                       }
+               }
+               if (i == page_descriptor_table_size) {
+                       printf("something is really wrong\n");
+                       do_reset(NULL, 0, 0, NULL);
+               }
+
+               /* Turn the cache off */
+               if (data) {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL &=
+                           ~(ACACHE_BCACHE | ENDCPLB | PORT_PREF0);
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL &= ~(IMC | ENICPLB);
+                       sync();
+               }
+
+               if (data) {
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               j = 0;
+               while (*I1 & CPLB_LOCK) {
+                       debug("skipping %i %08p - %08x\n", j, I1, *I1);
+                       *I0++;
+                       *I1++;
+                       j++;
+               }
+
+               debug("remove %i 0x%08x  0x%08x\n", j, *I0, *I1);
+
+               for (; j < 15; j++) {
+                       debug("replace %i 0x%08x  0x%08x\n", j, I0, I0 + 1);
+                       *I0++ = *(I0 + 1);
+                       *I1++ = *(I1 + 1);
+               }
+
+               if (data) {
+                       *I0 = dcplb_table[i][0];
+                       *I1 = dcplb_table[i][1];
+                       I0 = (unsigned int *)DCPLB_ADDR0;
+                       I1 = (unsigned int *)DCPLB_DATA0;
+               } else {
+                       *I0 = icplb_table[i][0];
+                       *I1 = icplb_table[i][1];
+                       I0 = (unsigned int *)ICPLB_ADDR0;
+                       I1 = (unsigned int *)ICPLB_DATA0;
+               }
+
+               for (j = 0; j < 16; j++) {
+                       debug("%i 0x%08x  0x%08x\n", j, *I0++, *I1++);
+               }
+
+               /* Turn the cache back on */
+               if (data) {
+                       j = *(unsigned int *)DMEM_CONTROL;
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)DMEM_CONTROL =
+                           ACACHE_BCACHE | ENDCPLB | PORT_PREF0 | j;
+                       sync();
+               } else {
+                       sync();
+                       asm(" .align 8; ");
+                       *(unsigned int *)IMEM_CONTROL = IMC | ENICPLB;
+                       sync();
+               }
+
+               break;
+       default:
+               /* All traps come here */
+               printf("code=[0x%x], ", (unsigned int)(regs->seqstat & 0x3f));
+               printf("stack frame=0x%x, ", (unsigned int)regs);
+               printf("bad PC=0x%04x\n", (unsigned int)regs->pc);
+               dump(regs);
+               printf("\n\n");
+
+               printf("Unhandled IRQ or exceptions!\n");
+               printf("Please reset the board \n");
+               do_reset(NULL, 0, 0, NULL);
+       }
+
+trap_c_return:
+       return;
+
+}
+
+void dump(struct pt_regs *fp)
+{
+       debug("RETE:  %08lx  RETN: %08lx  RETX: %08lx  RETS: %08lx\n", fp->rete,
+             fp->retn, fp->retx, fp->rets);
+       debug("IPEND: %04lx  SYSCFG: %04lx\n", fp->ipend, fp->syscfg);
+       debug("SEQSTAT: %08lx    SP: %08lx\n", (long)fp->seqstat, (long)fp);
+       debug("R0: %08lx    R1: %08lx    R2: %08lx    R3: %08lx\n", fp->r0,
+             fp->r1, fp->r2, fp->r3);
+       debug("R4: %08lx    R5: %08lx    R6: %08lx    R7: %08lx\n", fp->r4,
+             fp->r5, fp->r6, fp->r7);
+       debug("P0: %08lx    P1: %08lx    P2: %08lx    P3: %08lx\n", fp->p0,
+             fp->p1, fp->p2, fp->p3);
+       debug("P4: %08lx    P5: %08lx    FP: %08lx\n", fp->p4, fp->p5, fp->fp);
+       debug("A0.w: %08lx    A0.x: %08lx    A1.w: %08lx    A1.x: %08lx\n",
+             fp->a0w, fp->a0x, fp->a1w, fp->a1x);
+
+       debug("LB0: %08lx  LT0: %08lx  LC0: %08lx\n", fp->lb0, fp->lt0,
+             fp->lc0);
+       debug("LB1: %08lx  LT1: %08lx  LC1: %08lx\n", fp->lb1, fp->lt1,
+             fp->lc1);
+       debug("B0: %08lx  L0: %08lx  M0: %08lx  I0: %08lx\n", fp->b0, fp->l0,
+             fp->m0, fp->i0);
+       debug("B1: %08lx  L1: %08lx  M1: %08lx  I1: %08lx\n", fp->b1, fp->l1,
+             fp->m1, fp->i1);
+       debug("B2: %08lx  L2: %08lx  M2: %08lx  I2: %08lx\n", fp->b2, fp->l2,
+             fp->m2, fp->i2);
+       debug("B3: %08lx  L3: %08lx  M3: %08lx  I3: %08lx\n", fp->b3, fp->l3,
+             fp->m3, fp->i3);
+
+       debug("DCPLB_FAULT_ADDR=%p\n", *pDCPLB_FAULT_ADDR);
+       debug("ICPLB_FAULT_ADDR=%p\n", *pICPLB_FAULT_ADDR);
+
+}
diff --git a/cpu/bf561/video.c b/cpu/bf561/video.c
new file mode 100644 (file)
index 0000000..3ff0151
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * (C) Copyright 2000
+ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
+ * (C) Copyright 2002
+ * Wolfgang Denk, wd@denx.de
+ * (C) Copyright 2006
+ * Aubrey Li, aubrey.li@analog.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 <stdarg.h>
+#include <common.h>
+#include <config.h>
+#include <asm/blackfin.h>
+#include <i2c.h>
+#include <linux/types.h>
+#include <devices.h>
+
+#ifdef CONFIG_VIDEO
+#define NTSC_FRAME_ADDR 0x06000000
+#include "video.h"
+
+/* NTSC OUTPUT SIZE  720 * 240 */
+#define VERTICAL       2
+#define HORIZONTAL     4
+
+int is_vblank_line(const int line)
+{
+       /*
+        *  This array contains a single bit for each line in
+        *  an NTSC frame.
+        */
+       if ((line <= 18) || (line >= 264 && line <= 281) || (line == 528))
+               return true;
+
+       return false;
+}
+
+int NTSC_framebuffer_init(char *base_address)
+{
+       const int NTSC_frames = 1;
+       const int NTSC_lines = 525;
+       char *dest = base_address;
+       int frame_num, line_num;
+
+       for (frame_num = 0; frame_num < NTSC_frames; ++frame_num) {
+               for (line_num = 1; line_num <= NTSC_lines; ++line_num) {
+                       unsigned int code;
+                       int offset = 0;
+                       int i;
+
+                       if (is_vblank_line(line_num))
+                               offset++;
+
+                       if (line_num > 266 || line_num < 3)
+                               offset += 2;
+
+                       /* Output EAV code */
+                       code = SystemCodeMap[offset].EAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output horizontal blanking */
+                       for (i = 0; i < 67 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+
+                       /* Output SAV */
+                       code = SystemCodeMap[offset].SAV;
+                       write_dest_byte((char)(code >> 24) & 0xff);
+                       write_dest_byte((char)(code >> 16) & 0xff);
+                       write_dest_byte((char)(code >> 8) & 0xff);
+                       write_dest_byte((char)(code) & 0xff);
+
+                       /* Output empty horizontal data */
+                       for (i = 0; i < 360 * 2; ++i) {
+                               write_dest_byte(0x80);
+                               write_dest_byte(0x10);
+                       }
+               }
+       }
+
+       return dest - base_address;
+}
+
+void fill_frame(char *Frame, int Value)
+{
+       int *OddPtr32;
+       int OddLine;
+       int *EvenPtr32;
+       int EvenLine;
+       int i;
+       int *data;
+       int m, n;
+
+       /* fill odd and even frames */
+       for (OddLine = 22, EvenLine = 285; OddLine < 263; OddLine++, EvenLine++) {
+               OddPtr32 = (int *)((Frame + (OddLine * 1716)) + 276);
+               EvenPtr32 = (int *)((Frame + (EvenLine * 1716)) + 276);
+               for (i = 0; i < 360; i++, OddPtr32++, EvenPtr32++) {
+                       *OddPtr32 = Value;
+                       *EvenPtr32 = Value;
+               }
+       }
+
+       for (m = 0; m < VERTICAL; m++) {
+               data = (int *)u_boot_logo.data;
+               for (OddLine = (22 + m), EvenLine = (285 + m);
+                    OddLine < (u_boot_logo.height * VERTICAL) + (22 + m);
+                    OddLine += VERTICAL, EvenLine += VERTICAL) {
+                       OddPtr32 = (int *)((Frame + ((OddLine) * 1716)) + 276);
+                       EvenPtr32 =
+                           (int *)((Frame + ((EvenLine) * 1716)) + 276);
+                       for (i = 0; i < u_boot_logo.width / 2; i++) {
+                               /* enlarge one pixel to m x n */
+                               for (n = 0; n < HORIZONTAL; n++) {
+                                       *OddPtr32++ = *data;
+                                       *EvenPtr32++ = *data;
+                               }
+                               data++;
+                       }
+               }
+       }
+}
+
+void video_putc(const char c)
+{
+}
+
+void video_puts(const char *s)
+{
+}
+
+static int video_init(void)
+{
+       char *NTSCFrame;
+       NTSCFrame = (char *)NTSC_FRAME_ADDR;
+       NTSC_framebuffer_init(NTSCFrame);
+       fill_frame(NTSCFrame, BLUE);
+
+       *pPPI_CONTROL = 0x0082;
+       *pPPI_FRAME = 0x020D;
+
+       *pDMA0_START_ADDR = NTSCFrame;
+       *pDMA0_X_COUNT = 0x035A;
+       *pDMA0_X_MODIFY = 0x0002;
+       *pDMA0_Y_COUNT = 0x020D;
+       *pDMA0_Y_MODIFY = 0x0002;
+       *pDMA0_CONFIG = 0x1015;
+       *pPPI_CONTROL = 0x0083;
+       return 0;
+}
+
+int drv_video_init(void)
+{
+       int error, devices = 1;
+
+       device_t videodev;
+
+       video_init();           /* Video initialization */
+
+       memset(&videodev, 0, sizeof(videodev));
+
+       strcpy(videodev.name, "video");
+       videodev.ext = DEV_EXT_VIDEO;   /* Video extensions */
+       videodev.flags = DEV_FLAGS_OUTPUT;      /* Output only */
+       videodev.putc = video_putc;     /* 'putc' function */
+       videodev.puts = video_puts;     /* 'puts' function */
+
+       error = device_register(&videodev);
+
+       return (error == 0) ? devices : error;
+}
+#endif
diff --git a/cpu/bf561/video.h b/cpu/bf561/video.h
new file mode 100644 (file)
index 0000000..d237f6a
--- /dev/null
@@ -0,0 +1,25 @@
+#include <video_logo.h>
+#define write_dest_byte(val) {*dest++=val;}
+#define BLACK   (0x01800180)   /* black pixel pattern  */
+#define BLUE    (0x296E29F0)   /* blue pixel pattern   */
+#define RED     (0x51F0515A)   /* red pixel pattern    */
+#define MAGENTA (0x6ADE6ACA)   /* magenta pixel pattern */
+#define GREEN   (0x91229136)   /* green pixel pattern  */
+#define CYAN    (0xAA10AAA6)   /* cyan pixel pattern   */
+#define YELLOW  (0xD292D210)   /* yellow pixel pattern */
+#define WHITE   (0xFE80FE80)   /* white pixel pattern  */
+
+#define true   1
+#define false  0
+
+typedef struct {
+       unsigned int SAV;
+       unsigned int EAV;
+} SystemCodeType;
+
+const SystemCodeType SystemCodeMap[4] = {
+       {0xFF000080, 0xFF00009D},
+       {0xFF0000AB, 0xFF0000B6},
+       {0xFF0000C7, 0xFF0000DA},
+       {0xFF0000EC, 0xFF0000F1}
+};
index 4de34fd5b9e395d87c5120ffd9bbaece005c8043..7f020b5d576d42c504af9782c3fa75c7d9621d29 100644 (file)
@@ -87,7 +87,7 @@ START := $(addprefix $(obj),$(START))
 
 all:   $(LIB)
 
-$(LIB):        $(obj).depend $(OBJS)
+$(LIB):        $(OBJS)
        $(AR) $(ARFLAGS) $@ $(OBJS)
 
 #########################################################################
index fd544254f041a8d3b560e0eb63e4160d03aaf627..9d542013ccc3660551451b37c1b1b875d439be9c 100644 (file)
@@ -26,7 +26,8 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(CPU).a
 
 START  = start.o
-COBJS  = cpu.o interrupts.o
+SOBJS  = irq.o
+COBJS  = cpu.o interrupts.o cache.o exception.o timer.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
diff --git a/cpu/microblaze/cache.c b/cpu/microblaze/cache.c
new file mode 100755 (executable)
index 0000000..4f36a84
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal SIMEK <moonstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/asm.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
+
+int dcache_status (void)
+{
+       int i = 0;
+       int mask = 0x80;
+       __asm__ __volatile__ ("mfs %0,rmsr"::"r" (i):"memory");
+       /* i&=0x80 */
+       __asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");
+       return i;
+}
+
+int icache_status (void)
+{
+       int i = 0;
+       int mask = 0x20;
+       __asm__ __volatile__ ("mfs %0,rmsr"::"r" (i):"memory");
+       /* i&=0x20 */
+       __asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");
+       return i;
+}
+
+void   icache_enable (void) {
+       MSRSET(0x20);
+}
+
+void   icache_disable(void) {
+       MSRCLR(0x20);
+}
+
+void   dcache_enable (void) {
+       MSRSET(0x80);
+}
+
+void   dcache_disable(void) {
+       MSRCLR(0x80);
+}
+#endif
diff --git a/cpu/microblaze/exception.c b/cpu/microblaze/exception.c
new file mode 100644 (file)
index 0000000..d76b05a
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/asm.h>
+
+void _hw_exception_handler (void)
+{
+       int address = 0;
+       int state = 0;
+       /* loading address of exception EAR */
+       MFS (address, rear);
+       /* loading excetpion state register ESR */
+       MFS (state, resr);
+       printf ("Hardware exception at 0x%x address\n", address);
+       switch (state & 0x1f) { /* mask on exception cause */
+       case 0x1:
+               puts ("Unaligned data access exception\n");
+               break;
+       case 0x2:
+               puts ("Illegal op-code exception\n");
+               break;
+       case 0x3:
+               puts ("Instruction bus error exception\n");
+               break;
+       case 0x4:
+               puts ("Data bus error exception\n");
+               break;
+       case 0x5:
+               puts ("Divide by zero exception\n");
+               break;
+#ifdef MICROBLAZE_V5
+       case 0x1000:
+               puts ("Exception in delay slot\n");
+               break;
+#endif
+       default:
+               puts ("Undefined cause\n");
+               break;
+       }
+       printf ("Unaligned %sword access\n", ((state & 0x800) ? "" : "half"));
+       printf ("Unaligned %s access\n", ((state & 0x400) ? "store" : "load"));
+       printf ("Register R%x\n", (state & 0x3E) >> 5);
+       hang ();
+}
+
+#ifdef CFG_USR_EXCEP
+void _exception_handler (void)
+{
+       puts ("User vector_exception\n");
+       hang ();
+}
+#endif
old mode 100644 (file)
new mode 100755 (executable)
index ccf67e1..b61153f
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2007 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <monstr@monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -13,7 +15,7 @@
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * MA 02111-1307 USA
  */
 
-void enable_interrupts(void)
+#include <common.h>
+#include <command.h>
+#include <asm/microblaze_intc.h>
+#include <asm/asm.h>
+
+#undef DEBUG_INT
+
+extern void microblaze_disable_interrupts (void);
+extern void microblaze_enable_interrupts (void);
+
+void enable_interrupts (void)
 {
+       MSRSET(0x2);
 }
 
-int disable_interrupts(void)
+int disable_interrupts (void)
 {
+       MSRCLR(0x2);
        return 0;
 }
+
+#ifdef CFG_INTC_0
+#ifdef CFG_TIMER_0
+extern void timer_init (void);
+#endif
+#ifdef CFG_FSL_2
+extern void fsl_init2 (void);
+#endif
+
+
+static struct irq_action vecs[CFG_INTC_0_NUM];
+
+/* mapping structure to interrupt controller */
+microblaze_intc_t *intc = (microblaze_intc_t *) (CFG_INTC_0_ADDR);
+
+/* default handler */
+void def_hdlr (void)
+{
+       puts ("def_hdlr\n");
+}
+
+void enable_one_interrupt (int irq)
+{
+       int mask;
+       int offset = 1;
+       offset <<= irq;
+       mask = intc->ier;
+       intc->ier = (mask | offset);
+#ifdef DEBUG_INT
+       printf ("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask,
+               intc->ier);
+       printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
+               intc->iar, intc->mer);
+#endif
+}
+
+void disable_one_interrupt (int irq)
+{
+       int mask;
+       int offset = 1;
+       offset <<= irq;
+       mask = intc->ier;
+       intc->ier = (mask & ~offset);
+#ifdef DEBUG_INT
+       printf ("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask,
+               intc->ier);
+       printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
+               intc->iar, intc->mer);
+#endif
+}
+
+/* adding new handler for interrupt */
+void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)
+{
+       struct irq_action *act;
+       /* irq out of range */
+       if ((irq < 0) || (irq > CFG_INTC_0_NUM)) {
+               puts ("IRQ out of range\n");
+               return;
+       }
+       act = &vecs[irq];
+       if (hdlr) {             /* enable */
+               act->handler = hdlr;
+               act->arg = arg;
+               act->count = 0;
+               enable_one_interrupt (irq);
+       } else {                /* disable */
+               act->handler = (interrupt_handler_t *) def_hdlr;
+               act->arg = (void *)irq;
+               disable_one_interrupt (irq);
+       }
+}
+
+/* initialization interrupt controller - hardware */
+void intc_init (void)
+{
+       intc->mer = 0;
+       intc->ier = 0;
+       intc->iar = 0xFFFFFFFF;
+       /* XIntc_Start - hw_interrupt enable and all interrupt enable */
+       intc->mer = 0x3;
+#ifdef DEBUG_INT
+       printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
+               intc->iar, intc->mer);
+#endif
+}
+
+int interrupts_init (void)
+{
+       int i;
+       /* initialize irq list */
+       for (i = 0; i < CFG_INTC_0_NUM; i++) {
+               vecs[i].handler = (interrupt_handler_t *) def_hdlr;
+               vecs[i].arg = (void *)i;
+               vecs[i].count = 0;
+       }
+       /* initialize intc controller */
+       intc_init ();
+#ifdef CFG_TIMER_0
+       timer_init ();
+#endif
+#ifdef CFG_FSL_2
+       fsl_init2 ();
+#endif
+       enable_interrupts ();
+       return 0;
+}
+
+void interrupt_handler (void)
+{
+       int irqs = (intc->isr & intc->ier);     /* find active interrupt */
+       int i = 1;
+#ifdef DEBUG_INT
+       int value;
+       printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
+               intc->iar, intc->mer);
+       R14(value);
+       printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
+#endif
+       struct irq_action *act = vecs;
+       while (irqs) {
+               if (irqs & 1) {
+#ifdef DEBUG_INT
+                       printf
+                           ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
+                            act->handler, act->count, act->arg);
+#endif
+                       act->handler (act->arg);
+                       act->count++;
+                       intc->iar = i;
+                       return;
+               }
+               irqs >>= 1;
+               act++;
+               i <<= 1;
+       }
+
+#ifdef DEBUG_INT
+       printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,
+               intc->ier, intc->iar, intc->mer);
+       R14(value);
+       printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
+#endif
+}
+#endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_IRQ)
+#ifdef CFG_INTC_0
+int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       int i;
+       struct irq_action *act = vecs;
+
+       puts ("\nInterrupt-Information:\n\n"
+             "Nr  Routine   Arg       Count\n"
+             "-----------------------------\n");
+
+       for (i = 0; i < CFG_INTC_0_NUM; i++) {
+               if (act->handler != (interrupt_handler_t*) def_hdlr) {
+                       printf ("%02d  %08lx  %08lx  %d\n", i,
+                               (int)act->handler, (int)act->arg, act->count);
+               }
+               act++;
+       }
+       puts ("\n");
+       return (0);
+}
+#else
+int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       puts ("Undefined interrupt controller\n");
+}
+#endif
+#endif                         /* CONFIG_COMMANDS & CFG_CMD_IRQ */
diff --git a/cpu/microblaze/irq.S b/cpu/microblaze/irq.S
new file mode 100755 (executable)
index 0000000..e1fc190
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <asm/asm.h>
+       .text
+       .global _interrupt_handler
+_interrupt_handler:
+       addi    r1, r1, -4
+       swi     r2, r1, 0
+       addi    r1, r1, -4
+       swi     r3, r1, 0
+       addi    r1, r1, -4
+       swi     r4, r1, 0
+       addi    r1, r1, -4
+       swi     r5, r1, 0
+       addi    r1, r1, -4
+       swi     r6, r1, 0
+       addi    r1, r1, -4
+       swi     r7, r1, 0
+       addi    r1, r1, -4
+       swi     r8, r1, 0
+       addi    r1, r1, -4
+       swi     r9, r1, 0
+       addi    r1, r1, -4
+       swi     r10, r1, 0
+       addi    r1, r1, -4
+       swi     r11, r1, 0
+       addi    r1, r1, -4
+       swi     r12, r1, 0
+       addi    r1, r1, -4
+       swi     r13, r1, 0
+       addi    r1, r1, -4
+       swi     r14, r1, 0
+       addi    r1, r1, -4
+       swi     r15, r1, 0
+       addi    r1, r1, -4
+       swi     r16, r1, 0
+       addi    r1, r1, -4
+       swi     r17, r1, 0
+       addi    r1, r1, -4
+       swi     r18, r1, 0
+       addi    r1, r1, -4
+       swi     r19, r1, 0
+       addi    r1, r1, -4
+       swi     r20, r1, 0
+       addi    r1, r1, -4
+       swi     r21, r1, 0
+       addi    r1, r1, -4
+       swi     r22, r1, 0
+       addi    r1, r1, -4
+       swi     r23, r1, 0
+       addi    r1, r1, -4
+       swi     r24, r1, 0
+       addi    r1, r1, -4
+       swi     r25, r1, 0
+       addi    r1, r1, -4
+       swi     r26, r1, 0
+       addi    r1, r1, -4
+       swi     r27, r1, 0
+       addi    r1, r1, -4
+       swi     r28, r1, 0
+       addi    r1, r1, -4
+       swi     r29, r1, 0
+       addi    r1, r1, -4
+       swi     r30, r1, 0
+       addi    r1, r1, -4
+       swi     r31, r1, 0
+       brlid   r15, interrupt_handler
+       nop
+       nop
+       lwi     r31, r1, 0
+       addi    r1, r1, 4
+       lwi     r30, r1, 0
+       addi    r1, r1, 4
+       lwi     r29, r1, 0
+       addi    r1, r1, 4
+       lwi     r28, r1, 0
+       addi    r1, r1, 4
+       lwi     r27, r1, 0
+       addi    r1, r1, 4
+       lwi     r26, r1, 0
+       addi    r1, r1, 4
+       lwi     r25, r1, 0
+       addi    r1, r1, 4
+       lwi     r24, r1, 0
+       addi    r1, r1, 4
+       lwi     r23, r1, 0
+       addi    r1, r1, 4
+       lwi     r22, r1, 0
+       addi    r1, r1, 4
+       lwi     r21, r1, 0
+       addi    r1, r1, 4
+       lwi     r20, r1, 0
+       addi    r1, r1, 4
+       lwi     r19, r1, 0
+       addi    r1, r1, 4
+       lwi     r18, r1, 0
+       addi    r1, r1, 4
+       lwi     r17, r1, 0
+       addi    r1, r1, 4
+       lwi     r16, r1, 0
+       addi    r1, r1, 4
+       lwi     r15, r1, 0
+       addi    r1, r1, 4
+       lwi     r14, r1, 0
+       addi    r1, r1, 4
+       lwi     r13, r1, 0
+       addi    r1, r1, 4
+       lwi     r12, r1, 0
+       addi    r1, r1, 4
+       lwi     r11, r1, 0
+       addi    r1, r1, 4
+       lwi     r10, r1, 0
+       addi    r1, r1, 4
+       lwi     r9, r1, 0
+       addi    r1, r1, 4
+       lwi     r8, r1, 0
+       addi    r1, r1, 4
+       lwi     r7, r1, 0
+       addi    r1, r1, 4
+       lwi     r6, r1, 0
+       addi    r1, r1, 4
+       lwi     r5, r1, 0
+       addi    r1, r1, 4
+       lwi     r4, r1, 0
+       addi    r1, r1, 4
+       lwi     r3, r1, 0
+       addi    r1, r1, 4
+       lwi     r2, r1, 0
+       addi    r1, r1, 4
+
+       /* enable_interrupt */
+#ifdef XILINX_USE_MSR_INSTR
+       msrset  r0, 2
+#else
+       /* FIXME unstable in stressed mode - two irqs */
+       nop
+       addi    r1, r1, -4
+       swi     r12, r1, 0
+       mfs     r12, rmsr
+       ori     r12, r12, 2
+       mts     rmsr, r12
+       lwi     r12, r1, 0
+       addi    r1, r1, 4
+       nop
+#endif
+       bra     r14
+       nop
+       nop
+       .size _interrupt_handler,.-_interrupt_handler
index 7efdbb0970c5a5b5675548f3539075618ceebcc0..3c027ff9bb1c21eced03fa62e606d5c1f624ba70 100644 (file)
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2007 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <monstr@monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -13,7 +15,7 @@
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
        .text
        .global _start
 _start:
+       mts     rmsr, r0        /* disable cache */
+       addi    r1, r0, CFG_INIT_SP_OFFSET
+       addi    r1, r1, -4      /* Decrement SP to top of memory */
+       /* add opcode instruction for 32bit jump - 2 instruction imm & brai*/
+       addi    r6, r0, 0xb000  /* hex b000 opcode imm */
+       bslli   r6, r6, 16      /* shift */
+       swi     r6, r0, 0x0     /* reset address */
+       swi     r6, r0, 0x8     /* user vector exception */
+       swi     r6, r0, 0x10    /* interrupt */
+       swi     r6, r0, 0x20    /* hardware exception */
 
-       addi    r1, r0, CFG_SDRAM_BASE  /* init stack pointer */
-       addi    r1, r1, CFG_SDRAM_SIZE  /* set sp to high up */
+       addi    r6, r0, 0xb808  /* hew b808 opcode brai*/
+       bslli   r6, r6, 16
+       swi     r6, r0, 0x4     /* reset address */
+       swi     r6, r0, 0xC     /* user vector exception */
+       swi     r6, r0, 0x14    /* interrupt */
+       swi     r6, r0, 0x24    /* hardware exception */
 
-       brai    board_init
+#ifdef CFG_RESET_ADDRESS
+       /* reset address */
+       addik   r6, r0, CFG_RESET_ADDRESS
+       sw      r6, r1, r0
+       lhu     r7, r1, r0
+       shi     r7, r0, 0x2
+       shi     r6, r0, 0x6
+/*
+ * Copy U-Boot code to TEXT_BASE
+ * solve problem with sbrk_base
+ */
+#if (CFG_RESET_ADDRESS != TEXT_BASE)
+       addi    r4, r0, __end
+       addi    r5, r0, __text_start
+       rsub    r4, r5, r4      /* size = __end - __text_start */
+       addi    r6, r0, CFG_RESET_ADDRESS       /* source address */
+       addi    r7, r0, 0       /* counter */
+4:
+       lw      r8, r6, r7
+       sw      r8, r5, r7
+       addi    r7, r7, 0x4
+       cmp     r8, r4, r7
+       blti    r8, 4b
+#endif
+#endif
+
+#ifdef CFG_USR_EXCEP
+       /* user_vector_exception */
+       addik   r6, r0, _exception_handler
+       sw      r6, r1, r0
+       lhu     r7, r1, r0
+       shi     r7, r0, 0xa
+       shi     r6, r0, 0xe
+#endif
 
+#ifdef CFG_INTC_0
+       /* interrupt_handler */
+       addik   r6, r0, _interrupt_handler
+       sw      r6, r1, r0
+       lhu     r7, r1, r0
+       shi     r7, r0, 0x12
+       shi     r6, r0, 0x16
+#endif
+
+       /* hardware exception */
+       addik   r6, r0, _hw_exception_handler
+       sw      r6, r1, r0
+       lhu     r7, r1, r0
+       shi     r7, r0, 0x22
+       shi     r6, r0, 0x26
+
+       /* enable instruction and data cache */
+       mfs     r12, rmsr
+       ori     r12, r12, 0xa0
+       mts     rmsr, r12
+
+clear_bss:
+       /* clear BSS segments */
+       addi    r5, r0, __bss_start
+       addi    r4, r0, __bss_end
+       cmp     r6, r5, r4
+       beqi    r6, 3f
+2:
+       swi     r0, r5, 0 /* write zero to loc */
+       addi    r5, r5, 4 /* increment to next loc */
+       cmp     r6, r5, r4 /* check if we have reach the end */
+       bnei    r6, 2b
+3:     /* jumping to board_init */
+       brai    board_init
 1:     bri     1b
+
+/*
+ * Read 16bit little endian
+ */
+       .text
+       .global in16
+       .ent    in16
+       .align  2
+in16:  lhu     r3, r0, r5
+       bslli   r4, r3, 8
+       bsrli   r3, r3, 8
+       andi    r4, r4, 0xffff
+       or      r3, r3, r4
+       rtsd    r15, 8
+       sext16  r3, r3
+       .end    in16
+
+/*
+ * Write 16bit little endian
+ * first parameter(r5) - address, second(r6) - short value
+ */
+       .text
+       .global out16
+       .ent    out16
+       .align  2
+out16: bslli   r3, r6, 8
+       bsrli   r6, r6, 8
+       andi    r3, r3, 0xffff
+       or      r3, r3, r6
+       sh      r3, r0, r5
+       rtsd    r15, 8
+       or      r0, r0, r0
+       .end    out16
diff --git a/cpu/microblaze/timer.c b/cpu/microblaze/timer.c
new file mode 100644 (file)
index 0000000..ab1cb12
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/microblaze_timer.h>
+#include <asm/microblaze_intc.h>
+
+volatile int timestamp = 0;
+
+void reset_timer (void)
+{
+       timestamp = 0;
+}
+
+ulong get_timer (ulong base)
+{
+       return (timestamp - base);
+}
+
+void set_timer (ulong t)
+{
+       timestamp = t;
+}
+
+#ifdef CFG_INTC_0
+#ifdef CFG_TIMER_0
+microblaze_timer_t *tmr = (microblaze_timer_t *) (CFG_TIMER_0_ADDR);
+
+void timer_isr (void *arg)
+{
+       timestamp++;
+       tmr->control = tmr->control | TIMER_INTERRUPT;
+}
+
+void timer_init (void)
+{
+       tmr->loadreg = CFG_TIMER_0_PRELOAD;
+       tmr->control = TIMER_INTERRUPT | TIMER_RESET;
+       tmr->control =
+           TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT;
+       reset_timer ();
+       install_interrupt_handler (CFG_TIMER_0_IRQ, timer_isr, (void *)tmr);
+}
+#endif
+#endif
index 813aa7935d168f78203bf0a01fe670e9df4e47c1..1eac2bbfbe10a2f1e64c4d5f0bb959630c366258 100644 (file)
@@ -53,12 +53,16 @@ int checkcpu (void)
 #else
        svr = get_svr();
        pvr = get_pvr();
-       switch (SVR_VER (svr)) {
-       case SVR_MPC5200:
-               printf ("MPC5200");
+
+       switch (pvr) {
+       case PVR_5200:
+               printf("MPC5200");
+               break;
+       case PVR_5200B:
+               printf("MPC5200B");
                break;
        default:
-               printf ("MPC52??  (SVR %08x)", svr);
+               printf("Unknown MPC5xxx");
                break;
        }
 
@@ -127,5 +131,9 @@ ft_cpu_setup(void *blob, bd_t *bd)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/mac-address", &len);
        if (p != NULL)
                memcpy(p, bd->bi_enetaddr, 6);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
 }
 #endif
index 62b5f4efdca09880bea6c9bce9efe31b6b1ed40c..813636655b2d10c607bdbaf1fdeadc4001c9cd54 100644 (file)
@@ -474,6 +474,10 @@ static int mpc5xxx_fec_init_phy(struct eth_device *dev, bd_t * bis)
                miiphy_write(dev->name, phyAddr, 0x0, 0x8000);
                udelay(1000);
 
+#if defined(CONFIG_UC101)
+               /* Set the LED configuration Register for the UC101 Board */
+               miiphy_write(dev->name, phyAddr, 0x14, 0x4122);
+#endif
                if (fec->xcv_type == MII10) {
                        /*
                         * Force 10Base-T, FDX operation
@@ -885,12 +889,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_MCC200)  || defined(CONFIG_MOTIONPRO)       || \
-    defined(CONFIG_O2DNT)   || defined(CONFIG_PM520)   || \
-    defined(CONFIG_TOP5200) || defined(CONFIG_TQM5200) || \
-    defined(CONFIG_UC101)   || defined(CONFIG_V38B)
+#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 7dcc94999dc19ec7410718f1bded93ebbb5a002e..380d7af13d3d6012743984a10578a46f61112f44 100644 (file)
@@ -129,9 +129,9 @@ void cpu_init_f (volatile immap_t * immr)
        /* BCR - Bus Configuration Register (4-25) */
 #if defined(CFG_BCR_60x) && (CFG_BCR_SINGLE)
        if (immr->im_siu_conf.sc_bcr & BCR_EBM) {
-               immr->im_siu_conf.sc_bcr = CFG_BCR_60x;
+               immr->im_siu_conf.sc_bcr = SET_VAL_MASK(immr->im_siu_conf.sc_bcr, CFG_BCR_60x, 0x80000010);
        } else {
-               immr->im_siu_conf.sc_bcr = CFG_BCR_SINGLE;
+               immr->im_siu_conf.sc_bcr = SET_VAL_MASK(immr->im_siu_conf.sc_bcr, CFG_BCR_SINGLE, 0x80000010);
        }
 #else
        immr->im_siu_conf.sc_bcr = CFG_BCR;
@@ -141,9 +141,9 @@ void cpu_init_f (volatile immap_t * immr)
 #if defined(CFG_SIUMCR_LOW) && (CFG_SIUMCR_HIGH)
        cpu_clk = board_get_cpu_clk_f ();
        if (cpu_clk >= 100000000) {
-               immr->im_siu_conf.sc_siumcr = CFG_SIUMCR_HIGH;
+               immr->im_siu_conf.sc_siumcr = SET_VAL_MASK(immr->im_siu_conf.sc_siumcr, CFG_SIUMCR_HIGH, 0x9f3cc000);
        } else {
-               immr->im_siu_conf.sc_siumcr = CFG_SIUMCR_LOW;
+               immr->im_siu_conf.sc_siumcr = SET_VAL_MASK(immr->im_siu_conf.sc_siumcr, CFG_SIUMCR_LOW, 0x9f3cc000);
        }
 #else
        immr->im_siu_conf.sc_siumcr = CFG_SIUMCR;
index 1edd6fb8ddd0ba138c462516d145f0ca2acd276a..75c6ab298566a7eef530940300081bcc9d963bca 100644 (file)
@@ -275,22 +275,7 @@ void pci_mpc8250_init (struct pci_controller *hose)
                                  | SIUMCR_BCTLC00
                                  | SIUMCR_MMR11;
 #elif defined(CONFIG_TQM8272)
-#if 0
-       immap->im_siu_conf.sc_siumcr = (immap->im_siu_conf.sc_siumcr &
-                                               ~SIUMCR_LBPC11 &
-                                               ~SIUMCR_CS10PC11 &
-                                               ~SIUMCR_LBPC11) |
-                                       SIUMCR_LBPC01 |
-                                       SIUMCR_CS10PC01 |
-                                       SIUMCR_APPC10;
-#else
-#if 0
-       immap->im_siu_conf.sc_siumcr = (immap->im_siu_conf.sc_siumcr |
-                                       SIUMCR_APPC10);
-#else
-       immap->im_siu_conf.sc_siumcr = 0x88000000;
-#endif
-#endif
+/* nothing to do for this Board here */
 #else
        /*
         * Setting required to enable IRQ1-IRQ7 (SIUMCR [DPPC]),
@@ -304,7 +289,6 @@ void pci_mpc8250_init (struct pci_controller *hose)
                                        SIUMCR_CS10PC01 |
                                        SIUMCR_APPC10;
 #endif
-printf("%s siumcr: %x\n", __FUNCTION__, immap->im_siu_conf.sc_siumcr);
 
        /* Make PCI lowest priority */
        /* Each 4 bits is a device bus request  and the MS 4bits
index 4b9dcc8180f240a1c4c9afd49eee2051a1df65ec..bb96f774fe4e3cc795c6aa1bd0742a458fd028a5 100644 (file)
@@ -29,7 +29,7 @@ LIB   = $(obj)lib$(CPU).a
 
 START  = start.o
 COBJS  = traps.o cpu.o cpu_init.o speed.o interrupts.o \
-         spd_sdram.o qe_io.o
+         spd_sdram.o qe_io.o pci.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
index 1b5107881ed9b3079845fea409c6153fa3aa40bb..e078f27a23d56e91dd8d8f59cf9e2b1552a8405a 100644 (file)
 #include <watchdog.h>
 #include <command.h>
 #include <mpc83xx.h>
-#include <ft_build.h>
 #include <asm/processor.h>
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+#if defined(CONFIG_OF_LIBFDT)
+#include <libfdt.h>
+#include <libfdt_env.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -46,62 +52,118 @@ int checkcpu(void)
 
        immr = (immap_t *)CFG_IMMR;
 
-       if ((pvr & 0xFFFF0000) != PVR_83xx) {
-               puts("Not MPC83xx Family!!!\n");
-               return -1;
+       puts("CPU:   ");
+
+       switch (pvr & 0xffff0000) {
+               case PVR_E300C1:
+                       printf("e300c1, ");
+                       break;
+
+               case PVR_E300C2:
+                       printf("e300c2, ");
+                       break;
+
+               case PVR_E300C3:
+                       printf("e300c3, ");
+                       break;
+
+               default:
+                       printf("Unknown core, ");
        }
 
        spridr = immr->sysconf.spridr;
-       puts("CPU: ");
        switch(spridr) {
        case SPR_8349E_REV10:
        case SPR_8349E_REV11:
+       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;
+       case SPR_8311_REV10:
+               puts("MPC8311, ");
+               break;
+       case SPR_8311E_REV10:
+               puts("MPC8311E, ");
+               break;
+       case SPR_8313_REV10:
+               puts("MPC8313, ");
+               break;
+       case SPR_8313E_REV10:
+               puts("MPC8313E, ");
+               break;
        default:
-               puts("Rev: Unknown\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", PVR_MAJ(pvr)<<4 | PVR_MIN(pvr), strmhz(buf, clock));
 #else
-       printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock));
+       printf("Rev: %02x at %s MHz", spridr & 0x0000FFFF, strmhz(buf, clock));
 #endif
+       printf(", CSB: %4d MHz\n", gd->csb_clk / 1000000);
+
        return 0;
 }
 
@@ -250,7 +312,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 +321,182 @@ void watchdog_reset (void)
 
        if (re_enable)
                enable_interrupts ();
-#else
-       hang();
+}
 #endif
+
+#if defined(CONFIG_OF_LIBFDT)
+
+/*
+ * "Setter" functions used to add/modify FDT entries.
+ */
+static int fdt_set_eth0(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+       /*
+        * Fix it up if it exists, don't create it if it doesn't exist.
+        */
+       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enetaddr, 6);
+       }
+       return -FDT_ERR_NOTFOUND;
+}
+#ifdef CONFIG_HAS_ETH1
+/* second onboard ethernet port */
+static int fdt_set_eth1(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+       /*
+        * Fix it up if it exists, don't create it if it doesn't exist.
+        */
+       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet1addr, 6);
+       }
+       return -FDT_ERR_NOTFOUND;
+}
+#endif
+#ifdef CONFIG_HAS_ETH2
+/* third onboard ethernet port */
+static int fdt_set_eth2(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+       /*
+        * Fix it up if it exists, don't create it if it doesn't exist.
+        */
+       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet2addr, 6);
+       }
+       return -FDT_ERR_NOTFOUND;
+}
+#endif
+#ifdef CONFIG_HAS_ETH3
+/* fourth onboard ethernet port */
+static int fdt_set_eth3(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+       /*
+        * Fix it up if it exists, don't create it if it doesn't exist.
+        */
+       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet3addr, 6);
+       }
+       return -FDT_ERR_NOTFOUND;
+}
+#endif
+
+static int fdt_set_busfreq(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+       u32  tmp;
+       /*
+        * Create or update the property.
+        */
+       tmp = cpu_to_be32(bd->bi_busfreq);
+       return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
+}
+
+/*
+ * Fixups to the fdt.  If "create" is TRUE, the node is created
+ * unconditionally.  If "create" is FALSE, the node is updated
+ * only if it already exists.
+ */
+static const struct {
+       char *node;
+       char *prop;
+       int (*set_fn)(void *fdt, int nodeoffset, const char *name, bd_t *bd);
+} fixup_props[] = {
+       {       "/cpus/" OF_CPU,
+                "bus-frequency",
+               fdt_set_busfreq
+       },
+       {       "/cpus/" OF_SOC,
+               "bus-frequency",
+               fdt_set_busfreq
+       },
+       {       "/" OF_SOC "/serial@4500/",
+               "clock-frequency",
+               fdt_set_busfreq
+       },
+       {       "/" OF_SOC "/serial@4600/",
+               "clock-frequency",
+               fdt_set_busfreq
+       },
+#ifdef CONFIG_MPC83XX_TSEC1
+       {       "/" OF_SOC "/ethernet@24000,
+               "mac-address",
+               fdt_set_eth0
+       },
+       {       "/" OF_SOC "/ethernet@24000,
+               "local-mac-address",
+               fdt_set_eth0
+       },
+#endif
+#ifdef CONFIG_MPC83XX_TSEC2
+       {       "/" OF_SOC "/ethernet@25000,
+               "mac-address",
+               fdt_set_eth1
+       },
+       {       "/" OF_SOC "/ethernet@25000,
+               "local-mac-address",
+               fdt_set_eth1
+       },
+#endif
+#ifdef CONFIG_UEC_ETH1
+#if CFG_UEC1_UCC_NUM == 0  /* UCC1 */
+       {       "/" OF_QE "/ucc@2000/mac-address",
+               "mac-address",
+               fdt_set_eth0
+       },
+       {       "/" OF_QE "/ucc@2000/mac-address",
+               "local-mac-address",
+               fdt_set_eth0
+       },
+#elif CFG_UEC1_UCC_NUM == 2  /* UCC3 */
+       {       "/" OF_QE "/ucc@2200/mac-address",
+               "mac-address",
+               fdt_set_eth0
+       },
+       {       "/" OF_QE "/ucc@2200/mac-address",
+               "local-mac-address",
+               fdt_set_eth0
+       },
+#endif
+#endif
+#ifdef CONFIG_UEC_ETH2
+#if CFG_UEC2_UCC_NUM == 1  /* UCC2 */
+       {       "/" OF_QE "/ucc@3000/mac-address",
+               "mac-address",
+               fdt_set_eth1
+       },
+       {       "/" OF_QE "/ucc@3000/mac-address",
+               "local-mac-address",
+               fdt_set_eth1
+       },
+#elif CFG_UEC1_UCC_NUM == 3  /* UCC4 */
+       {       "/" OF_QE "/ucc@3200/mac-address",
+               "mac-address",
+               fdt_set_eth1
+       },
+       {       "/" OF_QE "/ucc@3200/mac-address",
+               "local-mac-address",
+               fdt_set_eth1
+       },
+#endif
+#endif
+};
+
+void
+ft_cpu_setup(void *blob, bd_t *bd)
+{
+       int  nodeoffset;
+       int  err;
+       int  j;
+
+       for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) {
+               nodeoffset = fdt_path_offset(fdt, fixup_props[j].node);
+               if (nodeoffset >= 0) {
+                       err = (*fixup_props[j].set_fn)(blob, nodeoffset, fixup_props[j].prop, bd);
+                       if (err < 0)
+                               printf("set_fn/libfdt: %s %s returned %s\n",
+                                       fixup_props[j].node,
+                                       fixup_props[j].prop,
+                                       fdt_strerror(err));
+               }
+       }
 }
 #endif
 
@@ -292,14 +526,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
 }
 
diff --git a/cpu/mpc83xx/pci.c b/cpu/mpc83xx/pci.c
new file mode 100644 (file)
index 0000000..785d612
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2007
+ *
+ * Author: Scott Wood <scottwood@freescale.com>,
+ * with some bits from older board-specific PCI initialization.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <pci.h>
+#include <ft_build.h>
+#include <asm/mpc8349_pci.h>
+
+#ifdef CONFIG_83XX_GENERIC_PCI
+#define MAX_BUSES 2
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct pci_controller pci_hose[MAX_BUSES];
+static int pci_num_buses;
+
+static void pci_init_bus(int bus, struct pci_region *reg)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       volatile pot83xx_t *pot = immr->ios.pot;
+       volatile pcictrl83xx_t *pci_ctrl = &immr->pci_ctrl[bus];
+       struct pci_controller *hose = &pci_hose[bus];
+       u32 dev;
+       u16 reg16;
+       int i;
+
+       if (bus == 1)
+               pot += 3;
+
+       /* Setup outbound translation windows */
+       for (i = 0; i < 3; i++, reg++, pot++) {
+               if (reg->size == 0)
+                       break;
+
+               hose->regions[i] = *reg;
+               hose->region_count++;
+
+               pot->potar = reg->bus_start >> 12;
+               pot->pobar = reg->phys_start >> 12;
+               pot->pocmr = ~(reg->size - 1) >> 12;
+
+               if (reg->flags & PCI_REGION_IO)
+                       pot->pocmr |= POCMR_IO;
+#ifdef CONFIG_83XX_PCI_STREAMING
+               else if (reg->flags & PCI_REGION_PREFETCH)
+                       pot->pocmr |= POCMR_SE;
+#endif
+
+               if (bus == 1)
+                       pot->pocmr |= POCMR_DST;
+
+               pot->pocmr |= POCMR_EN;
+       }
+
+       /* Point inbound translation at RAM */
+       pci_ctrl->pitar1 = 0;
+       pci_ctrl->pibar1 = 0;
+       pci_ctrl->piebar1 = 0;
+       pci_ctrl->piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP |
+                          PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       i = hose->region_count++;
+       hose->regions[i].bus_start = 0;
+       hose->regions[i].phys_start = 0;
+       hose->regions[i].size = gd->ram_size;
+       hose->regions[i].flags = PCI_REGION_MEM | PCI_REGION_MEMORY;
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       pci_setup_indirect(hose, CFG_IMMR + 0x8300 + bus * 0x80,
+                                CFG_IMMR + 0x8304 + bus * 0x80);
+
+       pci_register_hose(hose);
+
+       /*
+        * Write to Command register
+        */
+       reg16 = 0xff;
+       dev = PCI_BDF(hose->first_busno, 0, 0);
+       pci_hose_read_config_word(hose, dev, PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
+       pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
+
+#ifdef CONFIG_PCI_SCAN_SHOW
+       printf("PCI:   Bus Dev VenId DevId Class Int\n");
+#endif
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+}
+
+/*
+ * The caller must have already set OCCR, and the PCI_LAW BARs
+ * must have been set to cover all of the requested regions.
+ *
+ * If fewer than three regions are requested, then the region
+ * list is terminated with a region of size 0.
+ */
+void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       int i;
+
+       if (num_buses > MAX_BUSES) {
+               printf("%d PCI buses requsted, %d supported\n",
+                      num_buses, MAX_BUSES);
+
+               num_buses = MAX_BUSES;
+       }
+
+       pci_num_buses = num_buses;
+
+       /*
+        * Release PCI RST Output signal.
+        * Power on to RST high must be at least 100 ms as per PCI spec.
+        * On warm boots only 1 ms is required.
+        */
+       udelay(warmboot ? 1000 : 100000);
+
+       for (i = 0; i < num_buses; i++)
+               immr->pci_ctrl[i].gcr = 1;
+
+       /*
+        * RST high to first config access must be at least 2^25 cycles
+        * as per PCI spec.  This could be cut in half if we know we're
+        * running at 66MHz.  This could be insufficiently long if we're
+        * running the PCI bus at significantly less than 33MHz.
+        */
+       udelay(1020000);
+
+       for (i = 0; i < num_buses; i++)
+               pci_init_bus(i, reg[i]);
+}
+
+#ifdef CONFIG_OF_FLAT_TREE
+void ft_pci_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+
+       if (pci_num_buses < 1)
+               return;
+
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
+       if (p) {
+               p[0] = pci_hose[0].first_busno;
+               p[1] = pci_hose[0].last_busno;
+       }
+
+       if (pci_num_buses < 2)
+               return;
+
+       p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len);
+       if (p) {
+               p[0] = pci_hose[1].first_busno;
+               p[1] = pci_hose[1].last_busno;
+       }
+}
+#endif /* CONFIG_OF_FLAT_TREE */
+
+#endif /* CONFIG_83XX_GENERIC_PCI */
index 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..647813f68d94e5ae020e60d5e749adbebe972f5b 100644 (file)
@@ -58,8 +58,8 @@ picos_to_clk(int picos)
        int clks;
 
        ddr_bus_clk = gd->ddr_clk >> 1;
-       clks = picos / ((1000000000 / ddr_bus_clk) * 1000);
-       if (picos % ((1000000000 / ddr_bus_clk) * 1000) != 0)
+       clks = picos / (1000000000 / (ddr_bus_clk / 1000));
+       if (picos % (1000000000 / (ddr_bus_clk / 1000)) != 0)
                clks++;
 
        return clks;
@@ -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.
         */
-       caslat_ctrl = (caslat + 1) & 0x07; /* see as above */
+       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.
+        */
+
+       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;
+               }
+       }
+
+       /*
+        * 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);
 
-       ddr->timing_cfg_2 = 0x00000800;
+               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,26 @@ long int spd_sdram()
        ddr->sdram_interval = ((refresh_clk & 0x3fff) << 16) | 0x100;
        debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval);
 
-       /* SS_EN = 0, source synchronous disable
-        * CLK_ADJST = 0, MCK/MCK# is launched aligned with addr/cmd
+       /*
+        * SDRAM Cfg 2
         */
-       ddr->sdram_clk_cntl = 0x00000000;
+       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;
+#endif
        debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl);
 
        asm("sync;isync");
@@ -458,11 +708,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..bf30616548e93812947f4a8c09d4c9c335bd621d 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <common.h>
 #include <mpc83xx.h>
+#include <command.h>
 #include <asm/processor.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -99,23 +100,29 @@ int get_clocks(void)
        u32 lcrr;
 
        u32 csb_clk;
-#if defined(CONFIG_MPC8349)
+#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        u32 tsec1_clk;
        u32 tsec2_clk;
-       u32 usbmph_clk;
        u32 usbdr_clk;
+#endif
+#ifdef CONFIG_MPC834X
+       u32 usbmph_clk;
 #endif
        u32 core_clk;
        u32 i2c1_clk;
+#if !defined(CONFIG_MPC832X)
        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 +146,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) || defined(CONFIG_MPC831X)
        switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {
        case 0:
                tsec1_clk = 0;
@@ -163,6 +170,26 @@ int get_clocks(void)
                return -4;
        }
 
+       switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) {
+       case 0:
+               usbdr_clk = 0;
+               break;
+       case 1:
+               usbdr_clk = csb_clk;
+               break;
+       case 2:
+               usbdr_clk = csb_clk / 2;
+               break;
+       case 3:
+               usbdr_clk = csb_clk / 3;
+               break;
+       default:
+               /* unkown SCCR_USBDRCM value */
+               return -8;
+       }
+#endif
+
+#if defined(CONFIG_MPC834X)
        switch ((sccr & SCCR_TSEC2CM) >> SCCR_TSEC2CM_SHIFT) {
        case 0:
                tsec2_clk = 0;
@@ -201,24 +228,6 @@ int get_clocks(void)
                return -7;
        }
 
-       switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) {
-       case 0:
-               usbdr_clk = 0;
-               break;
-       case 1:
-               usbdr_clk = csb_clk;
-               break;
-       case 2:
-               usbdr_clk = csb_clk / 2;
-               break;
-       case 3:
-               usbdr_clk = csb_clk / 3;
-               break;
-       default:
-               /* unkown SCCR_USBDRCM value */
-               return -8;
-       }
-
        if (usbmph_clk != 0 && usbdr_clk != 0 && usbmph_clk != usbdr_clk) {
                /* if USB MPH clock is not disabled and
                 * USB DR clock is not disabled then
@@ -226,11 +235,21 @@ int get_clocks(void)
                 */
                return -9;
        }
+#elif defined(CONFIG_MPC831X)
+       tsec2_clk = tsec1_clk;
+
+       if (!(sccr & SCCR_TSEC1ON))
+               tsec1_clk = 0;
+       if (!(sccr & SCCR_TSEC2ON))
+               tsec2_clk = 0;
 #endif
-#if defined (CONFIG_MPC8360)
+
+#if !defined(CONFIG_MPC834X)
        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 +268,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 +282,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,29 +319,35 @@ 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) || defined(CONFIG_MPC831X)
        gd->tsec1_clk = tsec1_clk;
        gd->tsec2_clk = tsec2_clk;
-       gd->usbmph_clk = usbmph_clk;
        gd->usbdr_clk = usbdr_clk;
+#endif
+#if defined(CONFIG_MPC834X)
+       gd->usbmph_clk = usbmph_clk;
 #endif
        gd->core_clk = core_clk;
        gd->i2c1_clk = i2c1_clk;
+#if !defined(CONFIG_MPC832X)
        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
@@ -347,28 +366,38 @@ ulong get_bus_freq(ulong dummy)
        return gd->csb_clk;
 }
 
-int print_clock_conf(void)
+int do_clocks (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
        printf("Clock configuration:\n");
-       printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);
        printf("  Core:                %4d MHz\n", gd->core_clk / 1000000);
-#if defined (CONFIG_MPC8360)
+       printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);
+#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)
        printf("  QE:                  %4d MHz\n", gd->qe_clk / 1000000);
+       printf("  BRG:                 %4d MHz\n", gd->brg_clk / 1000000);
 #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) || defined(CONFIG_MPC831X)
        printf("  TSEC1:               %4d MHz\n", gd->tsec1_clk / 1000000);
        printf("  TSEC2:               %4d MHz\n", gd->tsec2_clk / 1000000);
-       printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000);
        printf("  USB DR:              %4d MHz\n", gd->usbdr_clk / 1000000);
+#endif
+#if defined(CONFIG_MPC834X)
+       printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000);
 #endif
        return 0;
 }
+
+U_BOOT_CMD(clocks, 1, 0, do_clocks,
+       "clocks  - print clock configuration\n",
+       "    clocks\n"
+);
index 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
index 0507c47e6e74dc66d04adffe35631138be9dc302..7735a52ccf169262304601ed3191054746faa4b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004 Freescale Semiconductor.
+ * Copyright 2004,2007 Freescale Semiconductor, Inc.
  * (C) Copyright 2002, 2003 Motorola Inc.
  * Xianghua Xiao (X.Xiao@motorola.com)
  *
@@ -70,6 +70,15 @@ int checkcpu (void)
        case SVR_8548_E:
                puts("8548_E");
                break;
+       case SVR_8544:
+               puts("8544");
+               break;
+       case SVR_8544_E:
+               puts("8544_E");
+               break;
+       case SVR_8568_E:
+               puts("8568_E");
+               break;
        default:
                puts("Unknown");
                break;
@@ -112,7 +121,7 @@ int checkcpu (void)
 #endif
        clkdiv = lcrr & 0x0f;
        if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) {
-#ifdef CONFIG_MPC8548
+#if defined(CONFIG_MPC8548) || defined(CONFIG_MPC8544)
                /*
                 * Yes, the entire PQ38 family use the same
                 * bit-representation for twice the clock divider values.
@@ -140,16 +149,25 @@ int checkcpu (void)
 
 int do_reset (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
 {
+       uint pvr;
+       uint ver;
+       pvr = get_pvr();
+       ver = PVR_VER(pvr);
+       if (ver & 1){
+       /* e500 v2 core has reset control register */
+               volatile unsigned int * rstcr;
+               rstcr = (volatile unsigned int *)(CFG_IMMR + 0xE00B0);
+               *rstcr = 0x2;           /* HRESET_REQ */
+       }else{
        /*
         * Initiate hard reset in debug control register DBCR0
         * Make sure MSR[DE] = 1
         */
-       unsigned long val;
-
-       val = mfspr(DBCR0);
-       val |= 0x70000000;
-       mtspr(DBCR0,val);
-
+               unsigned long val;
+               val = mfspr(DBCR0);
+               val |= 0x70000000;
+               mtspr(DBCR0,val);
+       }
        return 1;
 }
 
@@ -183,9 +201,9 @@ reset_85xx_watchdog(void)
         * Clear TSR(WIS) bit by writing 1
         */
        unsigned long val;
-       val = mfspr(tsr);
-       val |= 0x40000000;
-       mtspr(tsr, val);
+       val = mfspr(SPRN_TSR);
+       val |= TSR_WIS;
+       mtspr(SPRN_TSR, val);
 }
 #endif /* CONFIG_WATCHDOG */
 
@@ -196,6 +214,7 @@ void dma_init(void) {
 
        dma->satr0 = 0x02c40000;
        dma->datr0 = 0x02c40000;
+       dma->sr0 = 0xfffffff; /* clear any errors */
        asm("sync; isync; msync");
        return;
 }
@@ -210,6 +229,10 @@ uint dma_check(void) {
                status = dma->sr0;
        }
 
+       /* clear MR0[CS] channel start bit */
+       dma->mr0 &= 0x00000001;
+       asm("sync;isync;msync");
+
        if (status != 0) {
                printf ("DMA Error: status = %x\n", status);
        }
@@ -245,6 +268,10 @@ ft_cpu_setup(void *blob, bd_t *bd)
        if (p != NULL)
                *p = cpu_to_be32(clock);
 
+       p = ft_get_prop(blob, "/qe@e0080000/" OF_CPU "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
        p = ft_get_prop(blob, "/" OF_SOC "/serial@4500/clock-frequency", &len);
        if (p != NULL)
                *p = cpu_to_be32(clock);
@@ -255,21 +282,41 @@ ft_cpu_setup(void *blob, bd_t *bd)
 
 #if defined(CONFIG_MPC85XX_TSEC1)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len);
+       if (p)
+               memcpy(p, bd->bi_enetaddr, 6);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len);
+       if (p)
                memcpy(p, bd->bi_enetaddr, 6);
 #endif
 
 #if defined(CONFIG_HAS_ETH1)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len);
+       if (p)
+               memcpy(p, bd->bi_enet1addr, 6);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len);
+       if (p)
                memcpy(p, bd->bi_enet1addr, 6);
 #endif
 
 #if defined(CONFIG_HAS_ETH2)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/mac-address", &len);
+       if (p)
+               memcpy(p, bd->bi_enet2addr, 6);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/local-mac-address", &len);
+       if (p)
                memcpy(p, bd->bi_enet2addr, 6);
 #endif
 
 #if defined(CONFIG_HAS_ETH3)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/mac-address", &len);
+       if (p)
+               memcpy(p, bd->bi_enet3addr, 6);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/local-mac-address", &len);
+       if (p)
                memcpy(p, bd->bi_enet3addr, 6);
 #endif
 
index 9f4d36c1ab45d744b6a224c6e0a6e6af419a8fa7..9517146ed23deeeb46708d60f27ec05a2b5673ea 100644 (file)
@@ -143,12 +143,10 @@ void cpu_init_f (void)
        memctl->br1 = CFG_BR1_PRELIM;
 #endif
 
-#if !defined(CONFIG_MPC85xx)
 #if defined(CFG_BR2_PRELIM) && defined(CFG_OR2_PRELIM)
        memctl->or2 = CFG_OR2_PRELIM;
        memctl->br2 = CFG_BR2_PRELIM;
 #endif
-#endif
 
 #if defined(CFG_BR3_PRELIM) && defined(CFG_OR3_PRELIM)
        memctl->or3 = CFG_OR3_PRELIM;
index 84f839ae1e4fee2cf6af1212c1830899bd30abc7..3c1a323aad2f625c6fa8f5b853de808de5e49953 100644 (file)
@@ -90,14 +90,14 @@ pci_mpc85xx_init(struct pci_controller *board_hose)
        pcix->powbar1  = (CFG_PCI1_MEM_PHYS >> 12) & 0x000fffff;
        pcix->powbear1 = 0x00000000;
        pcix->powar1 = (POWAR_EN | POWAR_MEM_READ |
-                       POWAR_MEM_WRITE | POWAR_MEM_512M);
+                       POWAR_MEM_WRITE | (__ilog2(CFG_PCI1_MEM_SIZE) - 1));
 
        pcix->potar2  = (CFG_PCI1_IO_BASE >> 12) & 0x000fffff;
        pcix->potear2  = 0x00000000;
        pcix->powbar2  = (CFG_PCI1_IO_PHYS >> 12) & 0x000fffff;
        pcix->powbear2 = 0x00000000;
        pcix->powar2 = (POWAR_EN | POWAR_IO_READ |
-                       POWAR_IO_WRITE | POWAR_IO_1M);
+                       POWAR_IO_WRITE | (__ilog2(CFG_PCI1_IO_SIZE) - 1));
 
        pcix->pitar1 = 0x00000000;
        pcix->piwbar1 = 0x00000000;
@@ -175,14 +175,14 @@ pci_mpc85xx_init(struct pci_controller *board_hose)
        pcix2->powbar1  = (CFG_PCI2_MEM_PHYS >> 12) & 0x000fffff;
        pcix2->powbear1 = 0x00000000;
        pcix2->powar1 = (POWAR_EN | POWAR_MEM_READ |
-                       POWAR_MEM_WRITE | POWAR_MEM_512M);
+                       POWAR_MEM_WRITE | (__ilog2(CFG_PCI2_MEM_SIZE) - 1));
 
        pcix2->potar2  = (CFG_PCI2_IO_BASE >> 12) & 0x000fffff;
        pcix2->potear2  = 0x00000000;
        pcix2->powbar2  = (CFG_PCI2_IO_PHYS >> 12) & 0x000fffff;
        pcix2->powbear2 = 0x00000000;
        pcix2->powar2 = (POWAR_EN | POWAR_IO_READ |
-                       POWAR_IO_WRITE | POWAR_IO_1M);
+                       POWAR_IO_WRITE | (__ilog2(CFG_PCI2_IO_SIZE) - 1));
 
        pcix2->pitar1 = 0x00000000;
        pcix2->piwbar1 = 0x00000000;
index 6da5367a706ce11f778a55b8fe0ac1638bd0a1ef..3777f49adcc5f899d79850241a738efde65b5817 100644 (file)
@@ -263,13 +263,14 @@ spd_sdram(void)
        }
 
        /*
-        * Adjust DDR II IO voltage biasing.  It just makes it work.
+        * Adjust DDR II IO voltage biasing.
+        * Only 8548 rev 1 needs the fix
         */
-       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
-               gur->ddrioovcr = (0
-                                 | 0x80000000          /* Enable */
-                                 | 0x10000000          /* VSEL to 1.8V */
-                                 );
+       if ((SVR_VER(get_svr()) == SVR_8548_E) &&
+                       (SVR_MJREV(get_svr()) == 1) &&
+                       (spd.mem_type == SPD_MEMTYPE_DDR2)) {
+               gur->ddrioovcr = (0x80000000    /* Enable */
+                                 | 0x10000000);/* VSEL to 1.8V */
        }
 
        /*
@@ -786,14 +787,17 @@ spd_sdram(void)
         * Is this an ECC DDR chip?
         * But don't mess with it if the DDR controller will init mem.
         */
-#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
+#ifdef CONFIG_DDR_ECC
        if (spd.config == 0x02) {
+#ifndef CONFIG_ECC_INIT_VIA_DDRCONTROLLER
                ddr->err_disable = 0x0000000d;
+#endif
                ddr->err_sbe = 0x00ff0000;
        }
+
        debug("DDR: err_disable = 0x%08x\n", ddr->err_disable);
        debug("DDR: err_sbe = 0x%08x\n", ddr->err_sbe);
-#endif
+#endif /* CONFIG_DDR_ECC */
 
        asm("sync;isync;msync");
        udelay(500);
@@ -991,17 +995,24 @@ setup_laws_and_tlbs(unsigned int memsize)
                break;
        case 256:
        case 512:
+               tlb_size = BOOKE_PAGESZ_256M;
+               break;
        case 1024:
        case 2048:
-               tlb_size = BOOKE_PAGESZ_256M;
+               if (PVR_VER(get_pvr()) > PVR_VER(PVR_85xx))
+                       tlb_size = BOOKE_PAGESZ_1G;
+               else
+                       tlb_size = BOOKE_PAGESZ_256M;
                break;
        default:
                puts("DDR: only 16M,32M,64M,128M,256M,512M,1G and 2G are supported.\n");
 
                /*
                 * The memory was not able to be mapped.
+                * Default to a small size.
                 */
-               return 0;
+               tlb_size = BOOKE_PAGESZ_64M;
+               memsize=64;
                break;
        }
 
index ca81ee73521a695cf19a7ae54fa457f29c288717..12359a2d64b0e7d40faae1d524c132aba2c2e9b2 100644 (file)
@@ -37,49 +37,21 @@ void get_sys_info (sys_info_t * sysInfo)
 {
        volatile immap_t    *immap = (immap_t *)CFG_IMMR;
        volatile ccsr_gur_t *gur = &immap->im_gur;
-       uint plat_ratio,e500_ratio;
+       uint plat_ratio,e500_ratio,half_freqSystemBus;
 
        plat_ratio = (gur->porpllsr) & 0x0000003e;
        plat_ratio >>= 1;
-       switch(plat_ratio) {
-       case 0x02:
-       case 0x03:
-       case 0x04:
-       case 0x05:
-       case 0x06:
-       case 0x08:
-       case 0x09:
-       case 0x0a:
-       case 0x0c:
-       case 0x10:
-               sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ;
-               break;
-       default:
-               sysInfo->freqSystemBus = 0;
-               break;
-       }
-
+       sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ;
        e500_ratio = (gur->porpllsr) & 0x003f0000;
        e500_ratio >>= 16;
-       switch(e500_ratio) {
-       case 0x04:
-               sysInfo->freqProcessor = 2*sysInfo->freqSystemBus;
-               break;
-       case 0x05:
-               sysInfo->freqProcessor = 5*sysInfo->freqSystemBus/2;
-               break;
-       case 0x06:
-               sysInfo->freqProcessor = 3*sysInfo->freqSystemBus;
-               break;
-       case 0x07:
-               sysInfo->freqProcessor = 7*sysInfo->freqSystemBus/2;
-               break;
-       default:
-               sysInfo->freqProcessor = 0;
-               break;
-       }
+
+       /* Divide before multiply to avoid integer
+        * overflow for processor speeds above 2GHz */
+       half_freqSystemBus = sysInfo->freqSystemBus/2;
+       sysInfo->freqProcessor = e500_ratio*half_freqSystemBus;
 }
 
+
 int get_clocks (void)
 {
        sys_info_t sys_info;
index f96a4c3f8b0dcd2d0cf9ef2ebb719b50fbbadb98..20c7ebc7238bee98e06fed91cd3ea60b1df3da03 100644 (file)
@@ -251,13 +251,10 @@ _start_e500:
         */
        bl      tlb1_entry
        mr      r5,r0
-       li      r1,0x0020       /* max 16 TLB1 plus some TLB0 entries */
-       mtctr   r1
        lwzu    r4,0(r5)        /* how many TLB1 entries we actually use */
+       mtctr   r4
 
-0:     cmpwi   r4,0
-       beq     1f
-       lwzu    r0,4(r5)
+0:     lwzu    r0,4(r5)
        lwzu    r1,4(r5)
        lwzu    r2,4(r5)
        lwzu    r3,4(r5)
@@ -269,7 +266,6 @@ _start_e500:
        msync
        tlbwe
        isync
-       addi    r4,r4,-1
        bdnz    0b
 
 1:
@@ -301,20 +297,16 @@ _start_e500:
 
        bl      law_entry
        mr      r6,r0
-       li      r1,0x0007       /* 8 LAWs, but reserve one for boot-over-rio-or-pci */
-       mtctr   r1
        lwzu    r5,0(r6)        /* how many windows we actually use */
+       mtctr   r5
 
        li      r2,0x0c28       /* the first pair is reserved for boot-over-rio-or-pci */
        li      r1,0x0c30
 
-0:     cmpwi   r5,0
-       beq     1f
-       lwzu    r4,4(r6)
+0:     lwzu    r4,4(r6)
        lwzu    r3,4(r6)
        stwx    r4,r7,r2
        stwx    r3,r7,r1
-       addi    r5,r5,-1
        addi    r2,r2,0x0020
        addi    r1,r1,0x0020
        bdnz    0b
index 551b243076fb0f3e0af7d03af4f9defaab3b2f1a..a33acfec4d3072ce8c240800a07a37fcd2a11090 100644 (file)
 #include <ft_build.h>
 #endif
 
-#ifdef CONFIG_MPC8641HPCN
-extern void mpc8641_reset_board(cmd_tbl_t *cmdtp, int flag,
-                               int argc, char *argv[]);
-#endif
-
-
 int
 checkcpu(void)
 {
@@ -185,7 +179,7 @@ do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 #else /* CONFIG_MPC8641HPCN */
 
-       mpc8641_reset_board(cmdtp, flag, argc, argv);
+       out8(PIXIS_BASE + PIXIS_RST, 0);
 
 #endif /* !CONFIG_MPC8641HPCN */
 
@@ -286,22 +280,38 @@ ft_cpu_setup(void *blob, bd_t *bd)
 
 #if defined(CONFIG_MPC86XX_TSEC1)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len);
-       memcpy(p, bd->bi_enetaddr, 6);
+       if (p != NULL)
+               memcpy(p, bd->bi_enetaddr, 6);
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len);
+       if (p)
+               memcpy(p, bd->bi_enetaddr, 6);
 #endif
 
 #if defined(CONFIG_MPC86XX_TSEC2)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len);
-       memcpy(p, bd->bi_enet1addr, 6);
+       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
 
 #if defined(CONFIG_MPC86XX_TSEC3)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/mac-address", &len);
-       memcpy(p, bd->bi_enet2addr, 6);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet2addr, 6);
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet2addr, 6);
 #endif
 
 #if defined(CONFIG_MPC86XX_TSEC4)
        p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/mac-address", &len);
-       memcpy(p, bd->bi_enet3addr, 6);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet3addr, 6);
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/local-mac-address", &len);
+       if (p != NULL)
+               memcpy(p, bd->bi_enet3addr, 6);
 #endif
 
 }
index 1df6cdc5b9373832053e8fd509bcd5a06b9b1bc8..49820bbd81138fdb0675d5c62bf6b8651d84ddf4 100644 (file)
@@ -80,6 +80,26 @@ int interrupt_init(void)
 {
        int ret;
 
+       /*
+        * The IRQ0 on Rev 2 is pulled high (low in Rev 1.x) to
+        * implement PEX10 errata.  As INT is active high, it
+        * will cause core to take 0x500 interrupt.
+        *
+        * Due to the PIC's default pass through mode, as soon
+        * as interrupts are enabled (MSR[EE] = 1), an interrupt
+        * will be taken and u-boot will hang.  This is due to a
+        * hardware change (per an errata fix) on new revisions
+        * of the board with Rev 2.x parts.
+        *
+        * Setting the PIC to mixed mode prevents the hang.
+        */
+       if ((get_svr() & 0xf0) == 0x20) {
+               volatile immap_t *immr = (immap_t *)CFG_IMMR;
+               immr->im_pic.gcr = MPC86xx_PICGCR_RST;
+               while (immr->im_pic.gcr & MPC86xx_PICGCR_RST);
+               immr->im_pic.gcr = MPC86xx_PICGCR_MODE;
+       }
+
        /* call cpu specific function from $(CPU)/interrupts.c */
        ret = interrupt_init_cpu(&decrementer_count);
 
index b18e8225defb3a0e3963a5f63279abc0126ba736..f37ab430b325bc2a2fc2c7df2a6859d36964baaf 100644 (file)
@@ -51,20 +51,32 @@ extern int dma_xfer(void *dest, uint count, void *src);
 #define CFG_SUPER_BANK_INTERLEAVING    0
 
 /*
- * Convert picoseconds into clock cycles (rounding up if needed).
+ * Convert picoseconds into DRAM clock cycles (rounding up if needed).
  */
 
-int
-picos_to_clk(int picos)
+static unsigned int
+picos_to_clk(unsigned int picos)
 {
-       int clks;
-
-       clks = picos / (2000000000 / (get_bus_freq(0) / 1000));
-       if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) {
+       /* use unsigned long long to avoid rounding errors */
+       const unsigned long long ULL_2e12 = 2000000000000ULL;
+       unsigned long long clks;
+       unsigned long long clks_temp;
+
+       if (! picos)
+           return 0;
+
+       clks = get_bus_freq(0) * (unsigned long long) picos;
+       clks_temp = clks;
+       clks = clks / ULL_2e12;
+       if (clks_temp % ULL_2e12) {
                clks++;
        }
 
-       return clks;
+       if (clks > 0xFFFFFFFFULL) {
+               clks = 0xFFFFFFFFULL;
+       }
+
+       return (unsigned int) clks;
 }
 
 
@@ -284,9 +296,9 @@ spd_init(unsigned char i2c_address, unsigned int ddr_num,
        }
 
        /*
-        * Adjust DDR II IO voltage biasing.  It just makes it work.
+        * Adjust DDR II IO voltage biasing.  Rev1 only
         */
-       if (spd.mem_type == SPD_MEMTYPE_DDR2) {
+       if (((get_svr() & 0xf0) == 0x10) && (spd.mem_type == SPD_MEMTYPE_DDR2)) {
                gur->ddrioovcr = (0
                                  | 0x80000000          /* Enable */
                                  | 0x10000000          /* VSEL to 1.8V */
index 7406fe2248b407fe26d7c5df6963154c26c6fe2b..67c56db1a37499d572c5190ea82fbbeffe9b60d2 100644 (file)
@@ -241,26 +241,40 @@ in_flash:
        bl      setup_ccsrbar
 #endif
 
-       /* Fix for SMP linux - Changing arbitration to round-robin */
-       lis     r3, CFG_CCSRBAR@h
-       ori     r3, r3, 0x1000
-       xor     r4, r4, r4
-       li      r4, 0x1000
-       stw     r4, 0(r3)
 
-       /* setup the law entries */
-       bl      law_entry
+       /* -- MPC8641 Rev 1.0 MCM Errata fixups -- */
+
+       /* skip fixups if not Rev 1.0 */
+       mfspr   r4, SVR
+       rlwinm  r4,r4,0,24,31
+       cmpwi   r4,0x10
+       bne     1f
+
+       lis     r3,MCM_ABCR@ha
+       lwz     r4,MCM_ABCR@l(r3)       /* ABCR -> r4 */
+
+       /* set ABCR[A_STRM_CNT] = 0 */
+       rlwinm  r4,r4,0,0,29
+
+       /* set ABCR[ARB_POLICY] to 0x1 (round-robin) */
+       addi    r0,r0,1
+       rlwimi  r4,r0,12,18,19
+
+       stw     r4,MCM_ABCR@l(r3)       /* r4 -> ABCR */
        sync
 
-       /* Don't use this feature due to bug in 8641D PD4 */
-       /* Disable ERD_DIS */
-       lis     r3, CFG_CCSRBAR@h
-       ori     r3, r3, 0x1008
-       lwz     r4, 0(r3)
+       /* Set DBCR[ERD_DIS] */
+       lis     r3,MCM_DBCR@ha
+       lwz     r4,MCM_DBCR@l(r3)
        oris    r4, r4, 0x4000
-       stw     r4, 0(r3)
+       stw     r4,MCM_DBCR@l(r3)
+       sync
+1:
+       /* setup the law entries */
+       bl      law_entry
        sync
 
+
 #if (EMULATOR_RUN == 1)
        /* On the emulator we want to adjust these ASAP */
        /* otherwise things are sloooow */
index 9d0fc6b4fa8cc0937568ab9f0fbe01c21b928119..ffc898c58769ff586499b8f35af9695233d1c275 100644 (file)
@@ -236,8 +236,7 @@ static int smc_init (void)
        im->im_ioport.iop_pdpar |= 0x800;
        im->im_ioport.iop_pddir &= ~0x800;
 
-       cp->cp_simode = 0x0000;
-       cp->cp_simode |= 0x7000;
+       cp->cp_simode = ((cp->cp_simode & ~0xf000) | 0x7000);
 #else
        /* Set up the baud rate generator */
        smc_setbrg ();
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 */
similarity index 77%
rename from cpu/ppc4xx/spd_sdram.c
rename to cpu/ppc4xx/44x_spd_ddr.c
index c24456bea845d0da7dcf9ecd6e8d21a7a94827a5..10b4c18978932305f7b1c2bc71f197f4a610deac 100644 (file)
@@ -1,4 +1,8 @@
 /*
+ * 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
  *
 #include <asm/processor.h>
 #include <i2c.h>
 #include <ppc4xx.h>
+#include <asm/mmu.h>
 
-#ifdef CONFIG_SPD_EEPROM
+#if defined(CONFIG_SPD_EEPROM) &&                                      \
+       (defined(CONFIG_440GP) || defined(CONFIG_440GX) ||              \
+        defined(CONFIG_440EP) || defined(CONFIG_440GR))
 
 /*
  * Set default values
 
 #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
   +-----------------------------------------------------------------------------*/
@@ -631,6 +230,22 @@ int spd_read(uint addr)
 #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},
@@ -661,6 +276,7 @@ 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);
 
@@ -779,6 +395,11 @@ long int spd_sdram(void) {
        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)
         */
@@ -1732,11 +1353,11 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                         */
                        cr |= SDRAM_BXCR_SDBE;
 
-                       for (i = 0; i < num_banks; i++) {
-                               bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
+                       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].cr = cr;
-                       }
+                               bank_parms[ctrl_bank_num[dimm_num]+i+dimm_num].cr = cr;
+                       }
                }
        }
 
@@ -1825,7 +1446,4 @@ void program_ecc (unsigned long    num_bytes)
                        SDRAM_CFG0_MCHK_CHK);
        }
 }
-
-#endif /* CONFIG_440 */
-
 #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..2ecd3e4
--- /dev/null
@@ -0,0 +1,3017 @@
+/*
+ * 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 NUMLOOPS       256             /* memory test loops */
+
+#undef 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)
+{
+       PPC440_SYS_INFO board_cfg;
+       u32 val;
+
+       if (is_ecc_enabled())
+               puts(" (ECC");
+       else
+               puts(" (ECC not");
+
+       get_sys_info(&board_cfg);
+
+       mfsdr(SDR0_DDR0, val);
+       val = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(val), 1);
+       printf(" enabled, %d MHz", (val * 2) / 1000000);
+
+       mfsdram(SDRAM_MMODE, val);
+       val = (val & SDRAM_MMODE_DCL_MASK) >> 4;
+       printf(", CL%d)", val);
+}
+#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);
+                       debug("cycle_time=%d [10 picoseconds]\n", cycle_time);
+
+                       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);
+       debug("sdram_freq=%d\n", sdram_freq);
+
+       /*------------------------------------------------------------------
+        * 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);
+                       debug("cas_bit[SPD byte 18]=%02x\n", cas_bit);
+
+                       /* 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);
+                               }
+                               debug("cas_index=%d: cycle_time_ns_x_100=%d\n", cas_index,
+                                     cycle_time_ns_x_100[cas_index]);
+                       }
+
+                       /* 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;
+       debug("cycle_3_0_clk=%d\n", cycle_3_0_clk);
+       debug("cycle_4_0_clk=%d\n", cycle_4_0_clk);
+       debug("cycle_5_0_clk=%d\n", cycle_5_0_clk);
+
+       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 */
+               debug("cas_3_0_available=%d\n", cas_3_0_available);
+               debug("cas_4_0_available=%d\n", cas_4_0_available);
+               debug("cas_5_0_available=%d\n", cas_5_0_available);
+               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;
+}
+
+static void blank_string(int size)
+{
+       int i;
+
+       for (i=0; i<size; i++)
+               putc('\b');
+       for (i=0; i<size; i++)
+               putc(' ');
+       for (i=0; i<size; i++)
+               putc('\b');
+}
+
+#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 -";
+       char slash[] = "\\|/-\\|/-";
+       int loop = 0;
+       int loopi = 0;
+
+       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;
+
+                               if ((loop++ % (2 << 20)) == 0) {
+                                       putc('\b');
+                                       putc(slash[loopi++ % 8]);
+                               }
+                       }
+
+               } else {
+                       /* ECC bit set method for cached memory */
+                       dcbz_area(start_address, num_bytes);
+                       dflush();
+               }
+
+               blank_string(strlen(str));
+
+               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 int 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} };
+       int l;
+
+       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 */
+
+                       /*------------------------------------------------------------------
+                        * Run the short memory test.
+                        *-----------------------------------------------------------------*/
+                       membase = (u32 *)(SDRAM_RXBAS_SDBA_DECODE(mfdcr_any(SDRAM_R0BAS+bxcr_num)));
+
+                       for (i = 0; i < NUMMEMTESTS; i++) {
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       membase[j] = test[i][j];
+                                       ppcDcbf((u32)&(membase[j]));
+                               }
+                               sync();
+                               for (l=0; l<NUMLOOPS; l++) {
+                                       for (j = 0; j < NUMMEMWORDS; j++) {
+                                               if (membase[j] != test[i][j]) {
+                                                       ppcDcbf((u32)&(membase[j]));
+                                                       return 0;
+                                               }
+                                               ppcDcbf((u32)&(membase[j]));
+                                       }
+                                       sync();
+                               }
+                       }
+               }       /* if bank enabled */
+       }               /* for bxcf_num */
+
+       return 1;
+}
+
+#ifndef HARD_CODED_DQS
+/*-----------------------------------------------------------------------------+
+ * DQS_calibration_process.
+ *-----------------------------------------------------------------------------*/
+static void DQS_calibration_process(void)
+{
+       unsigned long rfdc_reg;
+       unsigned long rffd;
+       unsigned long rqdc_reg;
+       unsigned long rqfd;
+       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;
+       u32 rqfd_start;
+       char str[] = "Auto calibration -";
+       char slash[] = "\\|/-\\|/-";
+       int loopi = 0;
+
+       /*------------------------------------------------------------------
+        * 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.
+        *-----------------------------------------------------------------*/
+
+       /* first fix RQDC[RQFD] to an average of 80 degre phase shift to find RFDC[RFFD] */
+       rqfd_start = 64; /* test-only: don't know if this is the _best_ start value */
+
+       puts(str);
+
+calibration_loop:
+       mfsdram(SDRAM_RQDC, rqdc_reg);
+       mtsdram(SDRAM_RQDC, (rqdc_reg & ~SDRAM_RQDC_RQFD_MASK) |
+               SDRAM_RQDC_RQFD_ENCODE(rqfd_start));
+
+       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;
+
+       /*
+        * 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));
+
+               /*------------------------------------------------------------------
+                * See if the rffd value passed.
+                *-----------------------------------------------------------------*/
+               if (short_mem_test()) {
+                       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));
+
+               /*------------------------------------------------------------------
+                * See if the rffd value passed.
+                *-----------------------------------------------------------------*/
+               if (short_mem_test()) {
+                       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;
+                       }
+               }
+       }
+
+       rqfd_average = ((max_start + max_end) >> 1);
+
+       /*------------------------------------------------------------------
+        * Make sure we found the valid read passing window.  Halt if not
+        *-----------------------------------------------------------------*/
+       if (window_found == FALSE) {
+               if (rqfd_start < SDRAM_RQDC_RQFD_MAX) {
+                       putc('\b');
+                       putc(slash[loopi++ % 8]);
+
+                       /* try again from with a different RQFD start value */
+                       rqfd_start++;
+                       goto calibration_loop;
+               }
+
+               printf("\nERROR: Cannot determine a common read delay for the "
+                      "DIMM(s) installed.\n");
+               debug("%s[%d] ERROR : \n", __FUNCTION__,__LINE__);
+               hang();
+       }
+
+       blank_string(strlen(str));
+
+       if (rqfd_average < 0)
+               rqfd_average = 0;
+
+       if (rqfd_average > SDRAM_RQDC_RQFD_MAX)
+               rqfd_average = SDRAM_RQDC_RQFD_MAX;
+
+       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 4f5558328a27ea8e334963ca82377814102150c5..1200d021af62a832477843e805a32caffdc8e0c6 100644 (file)
@@ -339,29 +339,41 @@ int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis)
 int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis)
 {
        unsigned long zmiifer=0x0;
+       unsigned long pfc1;
 
-       /*
-        * Right now only 2*RGMII is supported. Please extend when needed.
-        * sr - 2006-08-29
-        */
-       switch (1) {
-       case 0:
+       mfsdr(sdr_pfc1, pfc1);
+       pfc1 &= SDR0_PFC1_SELECT_MASK;
+
+       switch (pfc1) {
+       case SDR0_PFC1_SELECT_CONFIG_2:
                /* 1 x GMII port */
                out32 (ZMII_FER, 0x00);
                out32 (RGMII_FER, 0x00000037);
                bis->bi_phymode[0] = BI_PHYMODE_GMII;
                bis->bi_phymode[1] = BI_PHYMODE_NONE;
                break;
-       case 1:
+       case SDR0_PFC1_SELECT_CONFIG_4:
                /* 2 x RGMII ports */
                out32 (ZMII_FER, 0x00);
                out32 (RGMII_FER, 0x00000055);
                bis->bi_phymode[0] = BI_PHYMODE_RGMII;
                bis->bi_phymode[1] = BI_PHYMODE_RGMII;
                break;
-       case 2:
+       case SDR0_PFC1_SELECT_CONFIG_6:
                /* 2 x SMII ports */
-
+               out32 (ZMII_FER,
+                      ((ZMII_FER_SMII) << ZMII_FER_V(0)) |
+                      ((ZMII_FER_SMII) << ZMII_FER_V(1)));
+               out32 (RGMII_FER, 0x00000000);
+               bis->bi_phymode[0] = BI_PHYMODE_SMII;
+               bis->bi_phymode[1] = BI_PHYMODE_SMII;
+               break;
+       case SDR0_PFC1_SELECT_CONFIG_1_2:
+               /* only 1 x MII supported */
+               out32 (ZMII_FER, (ZMII_FER_MII) << ZMII_FER_V(0));
+               out32 (RGMII_FER, 0x00000000);
+               bis->bi_phymode[0] = BI_PHYMODE_MII;
+               bis->bi_phymode[1] = BI_PHYMODE_NONE;
                break;
        default:
                break;
@@ -1333,6 +1345,9 @@ int enetInt (struct eth_device *dev)
                        }
                }
                mtdcr (uicsr, MAL_UIC_DEF|EMAC_UIC_DEF|EMAC_UIC_DEF1);  /* Clear */
+#if defined(CONFIG_405EZ)
+               mtsdr (sdricintstat, SDR_ICRX_STAT | SDR_ICTX0_STAT | SDR_ICTX1_STAT);
+#endif /* defined(CONFIG_405EZ) */
        }
        while (serviced);
 
index baecf70352aca6bce11be1a2a0d1c292f4859c92..4068b53208f9842d3307d88039698cfbda4231bc 100644 (file)
@@ -29,9 +29,10 @@ START        = start.o resetvec.o kgdb.o
 SOBJS  = dcr.o
 COBJS  = 405gp_pci.o 4xx_enet.o \
          bedbug_405.o commproc.o \
-         cpu.o cpu_init.o i2c.o interrupts.o \
+         cpu.o cpu_init.o gpio.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 57a7e8d6e21810eba0ec432108b46f4d1065674f..8e6bc84db038e4141f079b345e24c16dc5d689a5 100644 (file)
@@ -47,6 +47,9 @@ void board_reset(void);
 
 #if defined(CONFIG_440)
 #define FREQ_EBC               (sys_info.freqEPB)
+#elif defined(CONFIG_405EZ)
+#define FREQ_EBC               ((CONFIG_SYS_CLK_FREQ * sys_info.pllFbkDiv) / \
+                                sys_info.pllExtBusDiv)
 #else
 #define FREQ_EBC               (sys_info.freqPLB / sys_info.pllExtBusDiv)
 #endif
@@ -88,14 +91,18 @@ int pci_arbiter_enabled(void)
        return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
 #endif
 
-#if defined(CONFIG_440GX) || \
-    defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
-    defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
-    defined(CONFIG_440SP) || defined(CONFIG_440SPE)
+#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
        unsigned long val;
 
-       mfsdr(sdr_sdstp1, val);
-       return (val & SDR0_SDSTP1_PAE_MASK);
+       mfsdr(sdr_xcr, val);
+       return (val & 0x80000000);
+#endif
+#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+       unsigned long val;
+
+       mfsdr(sdr_pci0, val);
+       return (val & 0x80000000);
 #endif
 }
 #endif
@@ -118,6 +125,7 @@ int i2c_bootrom_enabled(void)
        return (val & SDR0_SDCS_SDD);
 #endif
 }
+#endif
 
 #if defined(CONFIG_440GX)
 #define SDR0_PINSTP_SHIFT      29
@@ -171,16 +179,37 @@ static char *bootstrap_str[] = {
 };
 #endif
 
+#if defined(CONFIG_405EZ)
+#define SDR0_PINSTP_SHIFT      28
+static char *bootstrap_str[] = {
+       "EBC (8 bits)",
+       "SPI (fast)",
+       "NAND (512 page, 4 addr cycle)",
+       "I2C (Addr 0x50)",
+       "EBC (32 bits)",
+       "I2C (Addr 0x50)",
+       "NAND (2K page, 5 addr cycle)",
+       "I2C (Addr 0x50)",
+       "EBC (16 bits)",
+       "Reserved",
+       "NAND (2K page, 4 addr cycle)",
+       "I2C (Addr 0x50)",
+       "NAND (512 page, 3 addr cycle)",
+       "I2C (Addr 0x50)",
+       "SPI (slow)",
+       "I2C (Addr 0x50)",
+};
+#endif
+
 #if defined(SDR0_PINSTP_SHIFT)
 static int bootstrap_option(void)
 {
        unsigned long val;
 
-       mfsdr(sdr_pinstp, val);
-       return ((val & 0xe0000000) >> SDR0_PINSTP_SHIFT);
+       mfsdr(SDR_PINSTP, val);
+       return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
 }
 #endif /* SDR0_PINSTP_SHIFT */
-#endif
 
 
 #if defined(CONFIG_440)
@@ -205,7 +234,8 @@ int checkcpu (void)
 
        puts("AMCC PowerPC 4");
 
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
+    defined(CONFIG_405EP) || defined(CONFIG_405EZ)
        puts("05");
 #endif
 #if defined(CONFIG_440)
@@ -253,6 +283,10 @@ int checkcpu (void)
                puts("EP Rev. B");
                break;
 
+       case PVR_405EZ_RA:
+               puts("EZ Rev. A");
+               break;
+
 #if defined(CONFIG_440)
        case PVR_440GP_RB:
                puts("GP Rev. B");
@@ -312,25 +346,29 @@ int checkcpu (void)
 #endif /* CONFIG_440GR */
 #endif /* CONFIG_440 */
 
-       case PVR_440EPX1_RA:
+#ifdef CONFIG_440EPX
+       case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
                puts("EPx Rev. A");
                strcpy(addstr, "Security/Kasumi support");
                break;
 
-       case PVR_440EPX2_RA:
+       case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
                puts("EPx Rev. A");
                strcpy(addstr, "No Security/Kasumi support");
                break;
+#endif /* CONFIG_440EPX */
 
-       case PVR_440GRX1_RA:
+#ifdef CONFIG_440GRX
+       case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
                puts("GRx Rev. A");
                strcpy(addstr, "Security/Kasumi support");
                break;
 
-       case PVR_440GRX2_RA:
+       case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
                puts("GRx Rev. A");
                strcpy(addstr, "No Security/Kasumi support");
                break;
+#endif /* CONFIG_440GRX */
 
        case PVR_440SP_6_RAB:
                puts("SP Rev. A/B");
@@ -378,20 +416,20 @@ int checkcpu (void)
        }
 
        printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
-              sys_info.freqPLB / 1000000,
-              sys_info.freqPLB / sys_info.pllOpbDiv / 1000000,
-              FREQ_EBC / 1000000);
+               sys_info.freqPLB / 1000000,
+               get_OPB_freq() / 1000000,
+               FREQ_EBC / 1000000);
 
        if (addstr[0] != 0)
                printf("       %s\n", addstr);
 
 #if defined(I2C_BOOTROM)
        printf ("       I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
+#endif /* I2C_BOOTROM */
 #if defined(SDR0_PINSTP_SHIFT)
        printf ("       Bootstrap Option %c - ", (char)bootstrap_option() + 'A');
        printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
 #endif /* SDR0_PINSTP_SHIFT */
-#endif /* I2C_BOOTROM */
 
 #if defined(CONFIG_PCI)
        printf ("       Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
@@ -410,7 +448,7 @@ int checkcpu (void)
        putc('\n');
 #endif
 
-#if defined(CONFIG_405EP)
+#if defined(CONFIG_405EP) || defined(CONFIG_405EZ)
        printf ("       16 kB I-Cache 16 kB D-Cache");
 #elif defined(CONFIG_440)
        printf ("       32 kB I-Cache 32 kB D-Cache");
index ae245910872e9e6f212683d0fbe200da91ffdf90..66e86372603598a626166dbccc3edc91955e9ddf 100644 (file)
@@ -25,6 +25,7 @@
 #include <watchdog.h>
 #include <ppc4xx_enet.h>
 #include <asm/processor.h>
+#include <asm/gpio.h>
 #include <ppc4xx.h>
 
 #if defined(CONFIG_405GP)  || defined(CONFIG_405EP)
@@ -98,118 +99,6 @@ DECLARE_GLOBAL_DATA_PTR;
 # endif
 #endif /* CFG_INIT_DCACHE_CS */
 
-#if defined(CFG_440_GPIO_TABLE)
-gpio_param_s gpio_tab[GPIO_GROUP_MAX][GPIO_MAX] = CFG_440_GPIO_TABLE;
-
-void set_chip_gpio_configuration(gpio_param_s (*gpio_tab)[GPIO_GROUP_MAX][GPIO_MAX])
-{
-       unsigned char i=0, j=0, reg_offset = 0, gpio_core;
-       unsigned long gpio_reg, gpio_core_add;
-
-       for (gpio_core=0; gpio_core<GPIO_GROUP_MAX; gpio_core++) {
-               j = 0;
-               reg_offset = 0;
-               /* GPIO config of the GPIOs 0 to 31 */
-               for (i=0; i<GPIO_MAX; i++, j++) {
-                       if (i == GPIO_MAX/2) {
-                               reg_offset = 4;
-                               j = i-16;
-                       }
-
-                       gpio_core_add = (*gpio_tab)[gpio_core][i].add;
-
-                       if (((*gpio_tab)[gpio_core][i].in_out == GPIO_IN) ||
-                            ((*gpio_tab)[gpio_core][i].in_out == GPIO_BI)) {
-
-                               switch ((*gpio_tab)[gpio_core][i].alt_nb) {
-                               case GPIO_SEL:
-                                       break;
-
-                               case GPIO_ALT1:
-                                       gpio_reg = in32(GPIO_IS1(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
-                                       out32(GPIO_IS1(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-
-                               case GPIO_ALT2:
-                                       gpio_reg = in32(GPIO_IS2(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
-                                       out32(GPIO_IS2(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-
-                               case GPIO_ALT3:
-                                       gpio_reg = in32(GPIO_IS3(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_IN_SEL >> (j*2));
-                                       out32(GPIO_IS3(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-                               }
-                       }
-
-                       if (((*gpio_tab)[gpio_core][i].in_out == GPIO_OUT) ||
-                            ((*gpio_tab)[gpio_core][i].in_out == GPIO_BI)) {
-
-                               switch ((*gpio_tab)[gpio_core][i].alt_nb) {
-                               case GPIO_SEL:
-                                       if (gpio_core == GPIO0) {
-                                               gpio_reg = in32(GPIO0_TCR) | (0x80000000 >> (j));
-                                               out32(GPIO0_TCR, gpio_reg);
-                                       }
-
-                                       if (gpio_core == GPIO1) {
-                                               gpio_reg = in32(GPIO1_TCR) | (0x80000000 >> (j));
-                                               out32(GPIO1_TCR, gpio_reg);
-                                       }
-
-                                       gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
-                                       gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-
-                               case GPIO_ALT1:
-                                       gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
-                                       out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
-                                       gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT1_SEL >> (j*2));
-                                       out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-
-                               case GPIO_ALT2:
-                                       gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
-                                       out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
-                                       gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT2_SEL >> (j*2));
-                                       out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-
-                               case GPIO_ALT3:
-                                       gpio_reg = in32(GPIO_OS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
-                                       out32(GPIO_OS(gpio_core_add+reg_offset), gpio_reg);
-                                       gpio_reg = in32(GPIO_TS(gpio_core_add+reg_offset))
-                                               & ~(GPIO_MASK >> (j*2));
-                                       gpio_reg = gpio_reg | (GPIO_ALT3_SEL >> (j*2));
-                                       out32(GPIO_TS(gpio_core_add+reg_offset), gpio_reg);
-                                       break;
-                               }
-                       }
-               }
-       }
-}
-#endif /* CFG_440_GPIO_TABLE */
-
 /*
  * Breath some life into the CPU...
  *
@@ -248,7 +137,7 @@ cpu_init_f (void)
 #endif /* CONFIG_405EP */
 
 #if defined(CFG_440_GPIO_TABLE)
-       set_chip_gpio_configuration(&gpio_tab);
+       gpio_set_chip_configuration();
 #endif /* CFG_440_GPIO_TABLE */
 
        /*
@@ -256,7 +145,8 @@ cpu_init_f (void)
         */
 #if (defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))
 #if (defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
-     defined(CONFIG_405EP) || defined(CONFIG_405))
+     defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
+     defined(CONFIG_405))
        /*
         * Move the next instructions into icache, since these modify the flash
         * we are running from!
@@ -314,7 +204,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)
diff --git a/cpu/ppc4xx/gpio.c b/cpu/ppc4xx/gpio.c
new file mode 100644 (file)
index 0000000..dd84e58
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * (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 <asm/processor.h>
+#include <asm/io.h>
+#include <asm/gpio.h>
+
+#if defined(CFG_440_GPIO_TABLE)
+gpio_param_s gpio_tab[GPIO_GROUP_MAX][GPIO_MAX] = CFG_440_GPIO_TABLE;
+#endif
+
+#if defined(GPIO0_OSRL)
+/* Only some 4xx variants support alternate funtions on the GPIO's */
+void gpio_config(int pin, int in_out, int gpio_alt, int out_val)
+{
+       u32 mask;
+       u32 mask2;
+       u32 val;
+       u32 offs = 0;
+       u32 offs2 = 0;
+       int pin2 = pin << 1;
+
+       if (pin >= GPIO_MAX) {
+               offs = 0x100;
+               pin -= GPIO_MAX;
+       }
+
+       if (pin >= GPIO_MAX/2) {
+               offs2 = 0x100;
+               pin2 = (pin - GPIO_MAX/2) << 1;
+       }
+
+       mask = 0x80000000 >> pin;
+       mask2 = 0xc0000000 >> (pin2 << 1);
+
+       /* first set TCR to 0 */
+       out32(GPIO0_TCR + offs, in32(GPIO0_TCR + offs) & ~mask);
+
+       if (in_out == GPIO_OUT) {
+               val = in32(GPIO0_OSRL + offs + offs2) & ~mask2;
+               switch (gpio_alt) {
+               case GPIO_ALT1:
+                       val |= GPIO_ALT1_SEL >> pin2;
+                       break;
+               case GPIO_ALT2:
+                       val |= GPIO_ALT2_SEL >> pin2;
+                       break;
+               case GPIO_ALT3:
+                       val |= GPIO_ALT3_SEL >> pin2;
+                       break;
+               }
+               out32(GPIO0_OSRL + offs + offs2, val);
+
+               /* setup requested output value */
+               if (out_val == GPIO_OUT_0)
+                       out32(GPIO0_OR + offs, in32(GPIO0_OR + offs) & ~mask);
+               else if (out_val == GPIO_OUT_1)
+                       out32(GPIO0_OR + offs, in32(GPIO0_OR + offs) | mask);
+
+               /* now configure TCR to drive output if selected */
+               out32(GPIO0_TCR + offs, in32(GPIO0_TCR + offs) | mask);
+       } else {
+               val = in32(GPIO0_ISR1L + offs + offs2) & ~mask2;
+               val |= GPIO_IN_SEL >> pin2;
+               out32(GPIO0_ISR1L + offs + offs2, val);
+       }
+}
+#endif /* GPIO_OSRL */
+
+void gpio_write_bit(int pin, int val)
+{
+       u32 offs = 0;
+
+       if (pin >= GPIO_MAX) {
+               offs = 0x100;
+               pin -= GPIO_MAX;
+       }
+
+       if (val)
+               out32(GPIO0_OR + offs, in32(GPIO0_OR + offs) | GPIO_VAL(pin));
+       else
+               out32(GPIO0_OR + offs, in32(GPIO0_OR + offs) & ~GPIO_VAL(pin));
+}
+
+#if defined(CFG_440_GPIO_TABLE)
+void gpio_set_chip_configuration(void)
+{
+       unsigned char i=0, j=0, offs=0, gpio_core;
+       unsigned long reg, core_add;
+
+       for (gpio_core=0; gpio_core<GPIO_GROUP_MAX; gpio_core++) {
+               j = 0;
+               offs = 0;
+               /* GPIO config of the GPIOs 0 to 31 */
+               for (i=0; i<GPIO_MAX; i++, j++) {
+                       if (i == GPIO_MAX/2) {
+                               offs = 4;
+                               j = i-16;
+                       }
+
+                       core_add = gpio_tab[gpio_core][i].add;
+
+                       if ((gpio_tab[gpio_core][i].in_out == GPIO_IN) ||
+                           (gpio_tab[gpio_core][i].in_out == GPIO_BI)) {
+
+                               switch (gpio_tab[gpio_core][i].alt_nb) {
+                               case GPIO_SEL:
+                                       break;
+
+                               case GPIO_ALT1:
+                                       reg = in32(GPIO_IS1(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_IN_SEL >> (j*2));
+                                       out32(GPIO_IS1(core_add+offs), reg);
+                                       break;
+
+                               case GPIO_ALT2:
+                                       reg = in32(GPIO_IS2(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_IN_SEL >> (j*2));
+                                       out32(GPIO_IS2(core_add+offs), reg);
+                                       break;
+
+                               case GPIO_ALT3:
+                                       reg = in32(GPIO_IS3(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_IN_SEL >> (j*2));
+                                       out32(GPIO_IS3(core_add+offs), reg);
+                                       break;
+                               }
+                       }
+
+                       if ((gpio_tab[gpio_core][i].in_out == GPIO_OUT) ||
+                           (gpio_tab[gpio_core][i].in_out == GPIO_BI)) {
+
+                               switch (gpio_tab[gpio_core][i].alt_nb) {
+                               case GPIO_SEL:
+                                       if (gpio_core == GPIO0) {
+                                               reg = in32(GPIO0_TCR) | (0x80000000 >> (j));
+                                               out32(GPIO0_TCR, reg);
+                                       }
+
+                                       if (gpio_core == GPIO1) {
+                                               reg = in32(GPIO1_TCR) | (0x80000000 >> (j));
+                                               out32(GPIO1_TCR, reg);
+                                       }
+
+                                       reg = in32(GPIO_OS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       out32(GPIO_OS(core_add+offs), reg);
+                                       reg = in32(GPIO_TS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       out32(GPIO_TS(core_add+offs), reg);
+                                       break;
+
+                               case GPIO_ALT1:
+                                       reg = in32(GPIO_OS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT1_SEL >> (j*2));
+                                       out32(GPIO_OS(core_add+offs), reg);
+                                       reg = in32(GPIO_TS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT1_SEL >> (j*2));
+                                       out32(GPIO_TS(core_add+offs), reg);
+                                       break;
+
+                               case GPIO_ALT2:
+                                       reg = in32(GPIO_OS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT2_SEL >> (j*2));
+                                       out32(GPIO_OS(core_add+offs), reg);
+                                       reg = in32(GPIO_TS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT2_SEL >> (j*2));
+                                       out32(GPIO_TS(core_add+offs), reg);
+                                       break;
+
+                               case GPIO_ALT3:
+                                       reg = in32(GPIO_OS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT3_SEL >> (j*2));
+                                       out32(GPIO_OS(core_add+offs), reg);
+                                       reg = in32(GPIO_TS(core_add+offs))
+                                               & ~(GPIO_MASK >> (j*2));
+                                       reg = reg | (GPIO_ALT3_SEL >> (j*2));
+                                       out32(GPIO_TS(core_add+offs), reg);
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+#endif /* CFG_440_GPIO_TABLE */
index 7db1cd8046b3c29d7fd5693faaa35208c0242072..47c264e222c4aa4ea01f5703c727f6e7165ecada 100644 (file)
@@ -1,91 +1,99 @@
-/*****************************************************************************/
-/* 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 +102,99 @@ 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 */
+               freqOPB = get_OPB_freq();
+               /* 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 +204,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 +303,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 +339,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 +373,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 +384,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 +413,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 +429,7 @@ uchar i2c_reg_read(uchar i2c_addr, uchar reg)
 
        i2c_read(i2c_addr, reg, 1, &buf, 1);
 
-       return(buf);
+       return (buf);
 }
 
 /*-----------------------------------------------------------------------
@@ -443,4 +439,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 */
index b198ff46ceb4a6c50141c0084eeee962e24666e6..08dfc3295291cf0c602b3380f98d6c5741849bbd 100644 (file)
 
 #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY) && \
        (defined(CONFIG_440EP) || defined(CONFIG_440GR) ||           \
-        defined(CONFIG_440EPX) || defined(CONFIG_440GRX))
+        defined(CONFIG_440EPX) || defined(CONFIG_440GRX) ||         \
+        defined(CONFIG_405EZ))
 
 #include <nand.h>
 #include <linux/mtd/ndfc.h>
 #include <asm/processor.h>
-#include <ppc440.h>
+#include <ppc4xx.h>
 
 static u8 hwctl = 0;
 
@@ -176,8 +177,7 @@ int board_nand_init(struct nand_chip *nand)
        /*
         * Setup EBC (CS0 only right now)
         */
-       mtdcr(ebccfga, xbcfg);
-       mtdcr(ebccfgd, 0xb8400000);
+       mtebc(EBC0_CFG, 0xb8400000);
 
        mtebc(pb0cr, CFG_EBC_PB0CR);
        mtebc(pb0ap, CFG_EBC_PB0AP);
index fab0d9500630f403dd1f6f6f2b0f22bb2618dbff..e62dd9dac5155c23f6cf4b2ffdc0ed63c09c918a 100644 (file)
@@ -264,7 +264,8 @@ int serial_tstc ()
 #endif /* CONFIG_IOP480 */
 
 /*****************************************************************************/
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP) || \
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
+    defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
     defined(CONFIG_440)
 
 #if defined(CONFIG_440)
@@ -309,7 +310,7 @@ int serial_tstc ()
 #define MFREG(a, d)    mfsdr(a, d)
 #define MTREG(a, d)    mtsdr(a, d)
 #endif /* #if defined(CONFIG_440GP) */
-#elif defined(CONFIG_405EP)
+#elif defined(CONFIG_405EP) || defined(CONFIG_405EZ)
 #define UART0_BASE      0xef600300
 #define UART1_BASE      0xef600400
 #define UCR0_MASK       0x0000007f
@@ -392,47 +393,95 @@ volatile static serial_buffer_t buf_info;
 
 #if defined(CONFIG_440) && !defined(CFG_EXT_SERIAL_CLOCK)
 static void serial_divs (int baudrate, unsigned long *pudiv,
-                        unsigned short *pbdiv )
+                        unsigned short *pbdiv)
 {
-       sys_info_t      sysinfo;
+       sys_info_t sysinfo;
        unsigned long div;              /* total divisor udiv * bdiv */
        unsigned long umin;             /* minimum udiv */
-       unsigned short diff;    /* smallest diff */
-       unsigned long udiv;     /* best udiv */
-
-       unsigned short idiff;   /* current diff */
-       unsigned short ibdiv;   /* current bdiv */
+       unsigned short diff;            /* smallest diff */
+       unsigned long udiv;             /* best udiv */
+       unsigned short idiff;           /* current diff */
+       unsigned short ibdiv;           /* current bdiv */
        unsigned long i;
-       unsigned long est;      /* current estimate */
+       unsigned long est;              /* current estimate */
 
-       get_sys_info( &sysinfo );
+       get_sys_info(&sysinfo);
 
-       udiv = 32;     /* Assume lowest possible serial clk */
-       div = sysinfo.freqPLB/(16*baudrate); /* total divisor */
-       umin = sysinfo.pllOpbDiv<<1; /* 2 x OPB divisor */
-       diff = 32;      /* highest possible */
+       udiv = 32;                      /* Assume lowest possible serial clk */
+       div = sysinfo.freqPLB / (16 * baudrate); /* total divisor */
+       umin = sysinfo.pllOpbDiv << 1;  /* 2 x OPB divisor */
+       diff = 32;                      /* highest possible */
 
        /* i is the test udiv value -- start with the largest
         * possible (32) to minimize serial clock and constrain
         * search to umin.
         */
-       for( i = 32; i > umin; i-- ){
-               ibdiv = div/i;
+       for (i = 32; i > umin; i--) {
+               ibdiv = div / i;
                est = i * ibdiv;
                idiff = (est > div) ? (est-div) : (div-est);
-               if( idiff == 0 ){
+               if (idiff == 0) {
                        udiv = i;
                        break;      /* can't do better */
-               }
-               else if( idiff < diff ){
+               } else if (idiff < diff) {
                        udiv = i;       /* best so far */
                        diff = idiff;   /* update lowest diff*/
                }
        }
 
        *pudiv = udiv;
-       *pbdiv = div/udiv;
+       *pbdiv = div / udiv;
+}
+
+#elif defined(CONFIG_405EZ)
+
+static void serial_divs (int baudrate, unsigned long *pudiv,
+                        unsigned short *pbdiv)
+{
+       sys_info_t sysinfo;
+       unsigned long div;              /* total divisor udiv * bdiv */
+       unsigned long umin;             /* minimum udiv */
+       unsigned short diff;            /* smallest diff */
+       unsigned long udiv;             /* best udiv */
+       unsigned short idiff;           /* current diff */
+       unsigned short ibdiv;           /* current bdiv */
+       unsigned long i;
+       unsigned long est;              /* current estimate */
+       unsigned long plloutb;
+       u32 reg;
+
+       get_sys_info(&sysinfo);
 
+       plloutb = ((CONFIG_SYS_CLK_FREQ * sysinfo.pllFwdDiv * sysinfo.pllFbkDiv)
+                  / sysinfo.pllFwdDivB);
+       udiv = 256;                     /* Assume lowest possible serial clk */
+       div = plloutb / (16 * baudrate); /* total divisor */
+       umin = (plloutb / get_OPB_freq()) << 1; /* 2 x OPB divisor */
+       diff = 256;                     /* highest possible */
+
+       /* i is the test udiv value -- start with the largest
+        * possible (256) to minimize serial clock and constrain
+        * search to umin.
+        */
+       for (i = 256; i > umin; i--) {
+               ibdiv = div / i;
+               est = i * ibdiv;
+               idiff = (est > div) ? (est-div) : (div-est);
+               if (idiff == 0) {
+                       udiv = i;
+                       break;      /* can't do better */
+               } else if (idiff < diff) {
+                       udiv = i;       /* best so far */
+                       diff = idiff;   /* update lowest diff*/
+               }
+       }
+
+       *pudiv = udiv;
+       mfcpr(cprperd0, reg);
+       reg &= ~0x0000ffff;
+       reg |= ((udiv - 0) << 8) | (udiv - 0);
+       mtcpr(cprperd0, reg);
+       *pbdiv = div / udiv;
 }
 #endif /* defined(CONFIG_440) && !defined(CFG_EXT_SERIAL_CLK) */
 
@@ -518,6 +567,10 @@ int serial_init (void)
        unsigned short bdiv;
        volatile char val;
 
+#if defined(CONFIG_405EZ)
+       serial_divs(gd->baudrate, &udiv, &bdiv);
+       clk = tmp = reg = 0;
+#else
 #ifdef CONFIG_405EP
        reg = mfdcr(cpc0_ucr) & ~(UCR0_MASK | UCR1_MASK);
        clk = gd->cpu_clk;
@@ -548,9 +601,9 @@ int serial_init (void)
        reg |= (udiv - 1) << CR0_UDIV_POS;      /* set the UART divisor */
        mtdcr (cntrl0, reg);
 #endif /* CONFIG_405EP */
-
        tmp = gd->baudrate * udiv * 16;
        bdiv = (clk + tmp / 2) / tmp;
+#endif /* CONFIG_405EZ */
 
        out8(UART_BASE + UART_LCR, 0x80);       /* set DLAB bit */
        out8(UART_BASE + UART_DLL, bdiv);       /* set baudrate divisor */
index 2d16a83420a671051345252b39d4ea8bf1594221..028b11af892e11df49642a22f9cdb71e8716ddb7 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);
-
 }
 
 /*-------------------------------------------------------------------------+
@@ -768,11 +767,119 @@ ulong get_PCI_freq (void)
        return val;
 }
 
+#elif defined(CONFIG_405EZ)
+void get_sys_info (PPC405_SYS_INFO * sysInfo)
+{
+       unsigned long cpr_plld;
+       unsigned long cpr_primad;
+       unsigned long sysClkPeriodPs = ONE_BILLION / (CONFIG_SYS_CLK_FREQ/1000);
+       unsigned long primad_cpudv;
+       unsigned long m;
+
+       /*
+        * Read PLL Mode registers
+        */
+       mfcpr(cprplld, cpr_plld);
+
+       /*
+        * Determine forward divider A
+        */
+       sysInfo->pllFwdDiv = ((cpr_plld & PLLD_FWDVA_MASK) >> 16);
+
+       /*
+        * Determine forward divider B (should be equal to A)
+        */
+       sysInfo->pllFwdDivB = ((cpr_plld & PLLD_FWDVB_MASK) >> 8);
+       if (sysInfo->pllFwdDivB == 0) {
+               sysInfo->pllFwdDivB = 8;
+       }
+
+       /*
+        * Determine FBK_DIV.
+        */
+       sysInfo->pllFbkDiv = ((cpr_plld & PLLD_FBDV_MASK) >> 24);
+       if (sysInfo->pllFbkDiv == 0) {
+               sysInfo->pllFbkDiv = 256;
+       }
+
+       /*
+        * Read CPR_PRIMAD register
+        */
+       mfcpr(cprprimad, cpr_primad);
+       /*
+        * Determine PLB_DIV.
+        */
+       sysInfo->pllPlbDiv = ((cpr_primad & PRIMAD_PLBDV_MASK) >> 16);
+       if (sysInfo->pllPlbDiv == 0) {
+               sysInfo->pllPlbDiv = 16;
+       }
+
+       /*
+        * Determine EXTBUS_DIV.
+        */
+       sysInfo->pllExtBusDiv = (cpr_primad & PRIMAD_EBCDV_MASK);
+       if (sysInfo->pllExtBusDiv == 0) {
+               sysInfo->pllExtBusDiv = 16;
+       }
+
+       /*
+        * Determine OPB_DIV.
+        */
+       sysInfo->pllOpbDiv = ((cpr_primad & PRIMAD_OPBDV_MASK) >> 8);
+       if (sysInfo->pllOpbDiv == 0) {
+               sysInfo->pllOpbDiv = 16;
+       }
+
+       /*
+        * Determine the M factor
+        */
+       m = sysInfo->pllFbkDiv * sysInfo->pllFwdDivB;
+
+       /*
+        * Determine VCO clock frequency
+        */
+       sysInfo->freqVCOHz = (1000000000000LL * (unsigned long long)m) /
+               (unsigned long long)sysClkPeriodPs;
+
+       /*
+        * Determine CPU clock frequency
+        */
+       primad_cpudv = ((cpr_primad & PRIMAD_CPUDV_MASK) >> 24);
+       if (primad_cpudv == 0) {
+               primad_cpudv = 16;
+       }
+
+       sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv) / primad_cpudv;
+
+       /*
+        * Determine PLB clock frequency
+        */
+       sysInfo->freqPLB = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv) / sysInfo->pllPlbDiv;
+}
+
+/********************************************
+ * get_OPB_freq
+ * return OPB bus freq in Hz
+ *********************************************/
+ulong get_OPB_freq (void)
+{
+       ulong val = 0;
+
+       PPC405_SYS_INFO sys_info;
+
+       get_sys_info (&sys_info);
+       val = (CONFIG_SYS_CLK_FREQ * sys_info.pllFbkDiv) / sys_info.pllOpbDiv;
+
+       return val;
+}
+
 #endif
 
 int get_clocks (void)
 {
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_440) || defined(CONFIG_405) || defined(CONFIG_405EP)
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
+    defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
+    defined(CONFIG_440) || defined(CONFIG_405)
        sys_info_t sys_info;
 
        get_sys_info (&sys_info);
@@ -797,7 +904,9 @@ ulong get_bus_freq (ulong dummy)
 {
        ulong val;
 
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405) || defined(CONFIG_440) || defined(CONFIG_405EP)
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
+    defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
+    defined(CONFIG_440) || defined(CONFIG_405)
        sys_info_t sys_info;
 
        get_sys_info (&sys_info);
index 8e000d309240181e7b61319990f4fcadfd5cf02c..85660b40dcdf1212ed4d4ce9e7e55579a8361608 100644 (file)
@@ -2,6 +2,7 @@
  *  Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
  *  Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
  *  Copyright (C) 2000,2001,2002 Wolfgang Denk <wd@denx.de>
+ *  Copyright (C) 2007 Stefan Roese <sr@denx.de>, DENX Software Engineering
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -699,7 +700,9 @@ _start:
 #endif /* CONFIG_IOP480 */
 
 /*****************************************************************************/
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405) || defined(CONFIG_405EP)
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
+    defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
+    defined(CONFIG_405)
        /*----------------------------------------------------------------------- */
        /* Clear and set up some registers. */
        /*----------------------------------------------------------------------- */
@@ -727,13 +730,13 @@ _start:
        /*----------------------------------------------------------------------- */
        /* Enable two 128MB cachable regions. */
        /*----------------------------------------------------------------------- */
-       addis   r4,r0,0x8000
-       addi    r4,r4,0x0001
+       lis     r4,0x8000
+       ori     r4,r4,0x0001
        mticcr  r4                      /* instruction cache */
        isync
 
-       addis   r4,r0,0x0000
-       addi    r4,r4,0x0000
+       lis     r4,0x0000
+       ori     r4,r4,0x0000
        mtdccr  r4                      /* data cache */
 
 #if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))
@@ -755,6 +758,35 @@ _start:
 #endif /* CONFIG_405EP */
 
 #if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)
+#if defined(CONFIG_405EZ)
+       /********************************************************************
+        * Setup OCM - On Chip Memory - PPC405EZ uses OCM Controller V2
+        *******************************************************************/
+       /*
+        * We can map the OCM on the PLB3, so map it at
+        * CFG_OCM_DATA_ADDR + 0x8000
+        */
+       lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
+       ori     r3,r3,CFG_OCM_DATA_ADDR@l
+       ori     r3,r3,0x8270    /* 32K Offset, 16K for Bank 1, R/W/Enable */
+       mtdcr   ocmplb3cr1,r3           /* Set PLB Access */
+       ori     r3,r3,0x4000            /* Add 0x4000 for bank 2 */
+       mtdcr   ocmplb3cr2,r3           /* Set PLB Access */
+       isync
+
+       lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
+       ori     r3,r3,CFG_OCM_DATA_ADDR@l
+       ori     r3,r3,0x0270            /* 16K for Bank 1, R/W/Enable */
+       mtdcr   ocmdscr1, r3            /* Set Data Side */
+       mtdcr   ocmiscr1, r3            /* Set Instruction Side */
+       ori     r3,r3,0x4000            /* Add 0x4000 for bank 2 */
+       mtdcr   ocmdscr2, r3            /* Set Data Side */
+       mtdcr   ocmiscr2, r3            /* Set Instruction Side */
+       addis   r3,0,0x0800             /* OCM Data Parity Disable - 1 Wait State */
+       mtdcr   ocmdsisdpc,r3
+
+       isync
+#else /* CONFIG_405EZ */
        /********************************************************************
         * Setup OCM - On Chip Memory
         *******************************************************************/
@@ -762,18 +794,20 @@ _start:
        lis     r0, 0x7FFF
        ori     r0, r0, 0xFFFF
        mfdcr   r3, ocmiscntl           /* get instr-side IRAM config */
-       mfdcr   r4, ocmdscntl   /* get data-side IRAM config */
-       and     r3, r3, r0      /* disable data-side IRAM */
-       and     r4, r4, r0      /* disable data-side IRAM */
-       mtdcr   ocmiscntl, r3   /* set instr-side IRAM config */
-       mtdcr   ocmdscntl, r4   /* set data-side IRAM config */
+       mfdcr   r4, ocmdscntl           /* get data-side IRAM config */
+       and     r3, r3, r0              /* disable data-side IRAM */
+       and     r4, r4, r0              /* disable data-side IRAM */
+       mtdcr   ocmiscntl, r3           /* set instr-side IRAM config */
+       mtdcr   ocmdscntl, r4           /* set data-side IRAM config */
        isync
 
-       addis   r3, 0, CFG_OCM_DATA_ADDR@h /* OCM location */
+       lis     r3,CFG_OCM_DATA_ADDR@h  /* OCM location */
+       ori     r3,r3,CFG_OCM_DATA_ADDR@l
        mtdcr   ocmdsarc, r3
        addis   r4, 0, 0xC000           /* OCM data area enabled */
        mtdcr   ocmdscntl, r4
        isync
+#endif /* CONFIG_405EZ */
 #endif
 
        /*----------------------------------------------------------------------- */
@@ -1361,7 +1395,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 +1890,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 ab852c525cf73403483cf0159e1ff18e75324d0b..c71a6a9d85a7adabecaab0306b275e3c3c7b147d 100644 (file)
@@ -76,7 +76,7 @@
 #define m16_swap(x) swap_16(x)
 #define m32_swap(x) swap_32(x)
 
-#if defined(CONFIG_440EP) || defined(CONFIG_440EPX)
+#if defined(CONFIG_405EZ) || defined(CONFIG_440EP) || defined(CONFIG_440EPX)
 #define ohci_cpu_to_le16(x) (x)
 #define ohci_cpu_to_le32(x) (x)
 #else
@@ -1601,7 +1601,7 @@ int usb_lowlevel_init(void)
        gohci.irq = -1;
 #if defined(CONFIG_440EP)
        gohci.regs = (struct ohci_regs *)(CFG_PERIPHERAL_BASE | 0x1000);
-#elif defined(CONFIG_440EPX)
+#elif defined(CONFIG_440EPX) || defined(CFG_USB_HOST)
        gohci.regs = (struct ohci_regs *)(CFG_USB_HOST);
 #endif
 
@@ -1625,8 +1625,10 @@ int usb_lowlevel_init(void)
        ohci_inited = 1;
        urb_finished = 1;
 
+#if defined(CONFIG_440EP) || defined(CONFIG_440EPX)
        /* init the device driver */
        usb_dev_init();
+#endif
 
        return 0;
 }
index 685d48bcf647f77e74f0937e577e017ca3c90c1f..bddf9e5daa95191fc52ccfc5a882da3a3a678180 100644 (file)
 
 #else /* !defined(CONFIG_440) */
 
+#if defined(CONFIG_405EZ)
+#define VECNUM_D0              0       /* DMA channel 0                */
+#define VECNUM_D1              1       /* DMA channel 1                */
+#define VECNUM_D2              2       /* DMA channel 2                */
+#define VECNUM_D3              3       /* DMA channel 3                */
+#define VECNUM_1588            4       /* IEEE 1588 network synchronization */
+#define VECNUM_U0              5       /* UART0                        */
+#define VECNUM_U1              6       /* UART1                        */
+#define VECNUM_CAN0            7       /* CAN 0                        */
+#define VECNUM_CAN1            8       /* CAN 1                        */
+#define VECNUM_SPI             9       /* SPI                          */
+#define VECNUM_IIC0            10      /* I2C                          */
+#define VECNUM_CHT0            11      /* Chameleon timer high pri interrupt */
+#define VECNUM_CHT1            12      /* Chameleon timer high pri interrupt */
+#define VECNUM_USBH1           13      /* USB Host 1                   */
+#define VECNUM_USBH2           14      /* USB Host 2                   */
+#define VECNUM_USBDEV          15      /* USB Device                   */
+#define VECNUM_ETH0            16      /* 10/100 Ethernet interrupt status */
+#define VECNUM_EWU0            17      /* Ethernet wakeup sequence detected */
+
+#define VECNUM_MADMAL          18      /* Logical OR of following MadMAL int */
+#define VECNUM_MS              18      /*      MAL_SERR_INT            */
+#define VECNUM_TXDE            18      /*      MAL_TXDE_INT            */
+#define VECNUM_RXDE            18      /*      MAL_RXDE_INT            */
+
+#define VECNUM_MTE             19      /* MAL TXEOB                    */
+#define VECNUM_MTE1            20      /* MAL TXEOB1                   */
+#define VECNUM_MRE             21      /* MAL RXEOB                    */
+#define VECNUM_NAND            22      /* NAND Flash controller        */
+#define VECNUM_ADC             23      /* ADC                          */
+#define VECNUM_DAC             24      /* DAC                          */
+#define VECNUM_OPB2PLB         25      /* OPB to PLB bridge interrupt  */
+#define VECNUM_RESERVED0       26      /* Reserved                     */
+#define VECNUM_EIR0            27      /* External interrupt 0         */
+#define VECNUM_EIR1            28      /* External interrupt 1         */
+#define VECNUM_EIR2            29      /* External interrupt 2         */
+#define VECNUM_EIR3            30      /* External interrupt 3         */
+#define VECNUM_EIR4            31      /* External interrupt 4         */
+
+#else  /* !CONFIG_405EZ */
+
 #define VECNUM_U0           0           /* UART0                        */
 #define VECNUM_U1           1           /* UART1                        */
 #define VECNUM_D0           5           /* DMA channel 0                */
 #define VECNUM_EIR4         29          /* External interrupt 4         */
 #define VECNUM_EIR5         30          /* External interrupt 5         */
 #define VECNUM_EIR6         31          /* External interrupt 6         */
+#endif /* defined(CONFIG_405EZ) */
 
 #endif /* defined(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..acc1a748e44e524ea65848470188dca833f2df4d 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)   || \
@@ -126,6 +179,7 @@ void dev_print (block_dev_desc_t *dev_desc)
 #if ((CONFIG_COMMANDS & CFG_CMD_IDE)   || \
      (CONFIG_COMMANDS & CFG_CMD_SCSI)  || \
      (CONFIG_COMMANDS & CFG_CMD_USB)   || \
+     defined(CONFIG_MMC)               || \
      defined(CONFIG_SYSTEMACE)          )
 
 #if defined(CONFIG_MAC_PARTITION) || \
diff --git a/doc/README.Lite5200B_low_power b/doc/README.Lite5200B_low_power
new file mode 100644 (file)
index 0000000..5b04fbb
--- /dev/null
@@ -0,0 +1,22 @@
+Lite5200B wakeup from low-power mode (CONFIG_LITE5200B_PM)
+----------------------------------------------------------
+
+Low-power mode as described in Lite5200B User's Manual, means that
+with support of MC68HLC908QT1 microcontroller (refered to as QT),
+everything but the SDRAM can be powered down. This brings
+maximum power saving, while one can still restore previous state
+quickly.
+
+Quick overview where U-Boot comes into the picture:
+- OS saves device states
+- OS saves wakeup handler address to physical 0x0, puts SDRAM into
+  self-refresh and signals to QT, it should power down the board
+- / board is sleeping here /
+- someone presses SW4 (connected to QT)
+- U-Boot checks PSC2_4 pin, if QT drives it down, then we woke up,
+  so get SDRAM out of self-refresh and transfer control to OS
+  wakeup handler
+- OS restores device states
+
+This was tested on Linux with USB and Ethernet in use. Adding
+support for other devices is an OS issue.
index cc35a0a8ffe1148c91914b75bd3725e5533d0a2b..fea8e336466f42a277ff143b30cf6a7d89654360 100644 (file)
@@ -38,6 +38,11 @@ The script expects exactly one argument, which is interpreted as  the
 target IP address (or host name, assuming DNS is working). The script
 can be interrupted by pressing ^T (CTRL-T).
 
+Be aware that in some distributives (Fedora Core 5 at least)
+usage of nc has been changed and -l and -p options are considered
+as mutually exclusive. If nc complains about options provided,
+you can just remove the -p option from the script.
+
 It turns out that 'netcat' cannot be used to listen to broadcast
 packets. We developed our own tool 'ncb' (see tools directory) that
 listens to broadcast packets on a given port and dumps them to the
diff --git a/doc/README.mpc7448hpc2 b/doc/README.mpc7448hpc2
new file mode 100644 (file)
index 0000000..8659e83
--- /dev/null
@@ -0,0 +1,184 @@
+Freescale MPC7448hpc2 (Taiga) board
+===================================
+
+Created 08/11/2006 Roy Zang
+--------------------------
+MPC7448hpc2 (Taiga) board is a high-performance PowerPC server reference
+design, which is optimized for high speed throughput between the processor and
+the memory, disk drive and Ethernet port subsystems.
+
+MPC7448hpc2(Taiga) is designed to the micro-ATX chassis, allowing it to be
+used in 1U or 2U rack-mount chassis¡¯, as well as in standard ATX/Micro-ATX
+chassis.
+
+Building U-Boot
+------------------
+The mpc7448hpc2 code base is known to compile using:
+       Binutils 2.15, Gcc 3.4.3, Glibc 2.3.3
+
+       $ make mpc7448hpc2_config
+       Configuring for mpc7448hpc2 board...
+
+       $ make
+
+Memory Map
+----------
+
+The memory map is setup for Linux to operate properly.
+
+The mapping is:
+
+       Range Start     Range End       Definition                      Size
+
+       0x0000_0000     0x7fff_ffff     DDR                             2G
+       0xe000_0000     0xe7ff_ffff     PCI Memory                      128M
+       0xfa00_0000     0xfaff_ffff     PCI IO                          16M
+       0xfb00_0000     0xfbff_ffff     PCI Config                      16M
+       0xfc00_0000     0xfc0f_ffff     NVRAM/CADMUS                    1M
+       0xfe00_0000     0xfeff_ffff     PromJet                         16M
+       0xff00_0000     0xff80_0000     FLASH (boot flash)              8M
+       0xff80_0000     0xffff_ffff     FLASH (second half flash)       8M
+
+Using Flash
+-----------
+
+The MPC7448hpc2 board has two "banks" of flash, each 8MB in size
+(2^23 = 0x00800000).
+
+Note: the "bank" here refers to half of the flash. In fact, there is only one
+bank of flash, which is divided into low and high half. Each is controlled by
+the most significant bit of the address bus. The so called "bank" is only for
+convenience.
+
+There is a switch which allows the "bank" to be selected.  The switch
+settings for updating flash are given below.
+
+The u-boot commands for copying the boot-bank into the secondary bank are
+as follows:
+
+       erase ff800000 ff880000
+       cp.b ff000000 ff800000 80000
+
+U-boot commands for downloading an image via tftp and flashing
+it into the secondary bank:
+
+       tftp 10000 <u-boot.bin.image>
+       erase ff000000 ff080000
+       cp.b 10000 ff000000 80000
+
+After copying the image into the second bank of flash, be sure to toggle
+SW3[4] on board before resetting the board in order to set the
+secondary bank as the boot-bank.
+
+Board Switches
+----------------------
+
+Most switches on the board should not be changed.  The most frequent
+user-settable switches on the board are used to configure
+the flash banks and determining the PCI frequency.
+
+SW1[1-5]: Processor core voltage
+
+       12345           Core Voltage
+       -----
+       SW1=01111       1.000V.
+       SW1=01101       1.100V.
+       SW1=01011       1.200V.
+       SW1=01001       1.300V only for MPC7447A.
+
+
+SW2[1-6]: CPU core frequency
+
+               CPU Core Frequency (MHz)
+                       Bus Frequency
+       123456          100     133     167     200     Ratio
+
+       ------
+       SW2=101100      500     667     833     1000    5x
+       SW2=100100      550     733     917     1100    5.5x
+       SW2=110100      600     800     1000    1200    6x
+       SW2=010100      650     866     1083    1300    6.5x
+       SW2=001000      700     930     1167    1400    7x
+       SW2=000100      750     1000    1250    1500    7.5x
+       SW2=110000      800     1066    1333    1600    8x
+       SW2=011000      850     1333    1417    1700    8.5x only for MPC7447A
+       SW2=011110      900     1200    1500    1800    9x
+
+This table shows only a subset of available frequency options; see the CPU
+hardware specifications for more information.
+
+SW2[7-8]: Bus Protocol and CPU Reset Option
+
+       7
+       -
+       SW2=0           System bus uses MPX bus protocol
+       SW2=1           System bus uses 60x bus protocol
+
+       8
+       -
+       SW2=0           TSI108 can cause CPU reset
+       SW2=1           TSI108 can not cause CPU reset
+
+SW3[1-8] system options
+
+       123
+       ---
+       SW3=xxx         Connected to GPIO[0:2] on TSI108
+
+       4
+       -
+       SW3=0           CPU boots from low half of flash
+       SW3=1           CPU boots from high half of flash
+
+       5
+       -
+       SW3=0           SATA and slot2 connected to PCI bus
+       SW3=1           Only slot1 connected to PCI bus
+
+       6
+       -
+       SW3=0           USB connected to PCI bus
+       SW3=1           USB disconnected from PCI bus
+
+       7
+       -
+       SW3=0           Flash is write protected
+       SW3=1           Flash is NOT write protected
+
+       8
+       -
+       SW3=0           CPU will boot from flash
+       SW3=1           CPU will boot from PromJet
+
+SW4[1-3]: System bus frequency
+
+                       Bus Frequency (MHz)
+       ---
+       SW4=010                 183
+       SW4=011                 100
+       SW4=100                 133
+       SW4=101                 166 only for MPC7447A
+       SW4=110                 200 only for MPC7448
+       others                  reserved
+
+SW4[4-6]: DDR2 SDRAM frequency
+
+                       Bus Frequency (MHz)
+       ---
+       SW4=000         external clock
+       SW4=011         system clock
+       SW4=100         133
+       SW4=101         166
+       SW4=110         200
+       others          reserved
+
+SW4[7-8]: PCI/PCI-X frequency control
+       7
+       -
+       SW4=0           PCI/PCI-X bus operates normally
+       SW4=1           PCI bus forced to PCI-33 mode
+
+       8
+       -
+       SW4=0           PCI-X mode at 133 MHz allowed
+       SW4=1           PCI-X mode limited to 100 MHz
diff --git a/doc/README.mpc8313erdb b/doc/README.mpc8313erdb
new file mode 100644 (file)
index 0000000..7ad4cc7
--- /dev/null
@@ -0,0 +1,83 @@
+Freescale MPC8313ERDB Board
+-----------------------------------------
+
+1.     Board Switches and Jumpers
+
+       SW3 is used to set CFG_RESET_SOURCE.
+
+       To boot the image at 0xFE000000 in NOR flash, use these DIP
+       switche settings for SW3 SW4:
+
+       +------+        +------+
+       |      |        | **** |
+       | **** |        |      |
+       +------+ ON     +------+ ON
+         4321            4321
+       (where the '*' indicates the position of the tab of the switch.)
+
+2.     Memory Map
+       The memory map looks like this:
+
+       0x0000_0000     0x07ff_ffff     DDR              128M
+       0x8000_0000     0x8fff_ffff     PCI MEM          256M
+       0x9000_0000     0x9fff_ffff     PCI_MMIO         256M
+       0xe000_0000     0xe00f_ffff     IMMR             1M
+       0xe200_0000     0xe20f_ffff     PCI IO           16M
+       0xe280_0000     0xe280_7fff     NAND FLASH (CS1) 32K
+       0xf000_0000     0xf001_ffff     VSC7385 (CS2)    128K
+       0xfa00_0000     0xfa00_7fff     Board Status/    32K
+                                       LED Control (CS3)
+       0xfe00_0000     0xfe7f_ffff     NOR FLASH (CS0)  8M
+
+3.     Definitions
+
+3.1    Explanation of NEW definitions in:
+
+       include/configs/MPC8313ERDB.h
+
+       CONFIG_MPC83xx          MPC83xx family
+       CONFIG_MPC831x          MPC831x specific
+       CONFIG_MPC8313ERDB      MPC8313ERDB board specific
+
+4.     Compilation
+
+       Assuming you're using BASH (or similar) as your shell:
+
+       export CROSS_COMPILE=your-cross-compiler-prefix-
+       make distclean
+       make MPC8313ERDB_33_config
+       (or make MPC8313ERDB_66_config, depending on the speed of
+        the oscillator on your board)
+       make
+
+5.     Downloading and Flashing Images
+
+5.1    Reflash U-boot Image using U-boot
+
+       =>run tftpflash
+
+       You may want to try
+       =>tftpboot $loadaddr $uboot
+       first, to make sure that the TFTP load will succeed before it
+       goes ahead and wipes out your current firmware.  And of course,
+       have an alternate means of programming the flash available
+       if the new u-boot doesn't boot.
+
+5.2    Downloading and Booting Linux Kernel
+
+       Ensure that all networking-related environment variables are set
+       properly (including ipaddr, serverip, gatewayip (if needed),
+       netmask, ethaddr, eth1addr, rootpath (if using NFS root),
+       fdtfile, and bootfile).
+
+       Then, do one of the following, depending on whether you
+       want an NFS root or a ramdisk root:
+
+       =>run nfsboot
+       or
+       =>run ramboot
+
+6      Notes
+
+       Booting from NAND flash is not yet supported.
+       The console baudrate for MPC8313ERDB is 115200bps.
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.
index 4a650ce43c214c695f25b31c11b1ce8ae9f71518..3b88f8bc728ca5fc0a4f50f0a118b62e873655b9 100644 (file)
@@ -121,3 +121,37 @@ To Flash U-boot into the alternative bank (0xFF800000 - 0xFFBFFFFF):
        0xe300_0000     0xe3ff_ffff     PCI2/PEX2 IO    16M
        0xfe00_0000     0xfeff_ffff     Flash(alternate)16M
        0xff00_0000     0xffff_ffff     Flash(boot bank)16M
+
+5. pixis_reset command
+--------------------
+A new command, "pixis_reset", is introduced to reset mpc8641hpcn board
+using the FPGA sequencer.  When the board restarts, it has the option
+of using either the current or alternate flash bank as the boot
+image, with or without the watchdog timer enabled, and finally with
+or without frequency changes.
+
+Usage is;
+
+       pixis_reset
+       pixis_reset altbank
+       pixis_reset altbank wd
+       pixis_reset altbank cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>
+       pixis_reset cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>
+
+Examples;
+
+       /* reset to current bank, like "reset" command */
+       pixis_reset
+
+       /* reset board but use the to alternate flash bank */
+       pixis_reset altbank
+
+       /* reset board, use alternate flash bank with watchdog timer enabled*/
+       pixis_reset altbank wd
+
+       /* reset board to alternate bank with frequency changed.
+        * 40 is SYSCLK, 2.5 is COREPLL ratio, 10 is MPXPLL ratio
+        */
+       pixis-reset altbank cf 40 2.5 10
+
+Valid clock choices are in the 8641 Reference Manuals.
index b5171f4d407c6d602100bb9b15993754d6d0c921..5c31845a94c0a016f6c8a8021fea8a0639497650 100644 (file)
@@ -192,12 +192,7 @@ The old NAND handling code has been re-factored and is now confined
 to only board-specific files and - unfortunately - to the DoC code
 (see below). A new configuration variable has been introduced:
 CFG_NAND_LEGACY, which has to be defined in the board config file if
-that board uses legacy code. If CFG_NAND_LEGACY is defined, the board
-specific config.mk file should also have "BOARDLIBS =
-drivers/nand_legacy/libnand_legacy.a". For boards using the new NAND
-approach (PPChameleon and netstar at the moment) no variable is
-necessary, but the config.mk should have "BOARDLIBS =
-drivers/nand/libnand.a".
+that board uses legacy code.
 
 The necessary changes have been made to all affected boards, and no
 build breakage has been introduced, except for NETTA and NETTA_ISDN
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
diff --git a/doc/README.sbc8560 b/doc/README.sbc8560
deleted file mode 100644 (file)
index 52592e3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-The port was tested on Wind River System Sbc8560 board <www.windriver.com>.
-U-Boot was installed on the flash memory of the CPU card (no the SODIMM).
-
-NOTE: Please configure uboot compile to the proper PCI frequency and
-setup the appropriate DIP switch settings.
-
-SBC8560 board:
-
-Make sure boards switches are set to their appropriate conditions.
-Refer to the Engineering Reference Guide ERG-00300-002. Of particular
-importance are: 1)Tthe settings for JP4 (JP4 1-3 and 2-4), which
-select the on-board FLASH device (Intel 28F128Jx); 2) The settings
-for the Clock SW9 (33 MHz or 66 MHz).
-
-       Note:   SW9 Settings: 66 MHz
-               4:1 ratio CCB clocks:SYSCLK
-               3:1 ration e500 Core:CCB
-               pos1 - on, pos2 - on, pos3 - off, pos4 - on, pos5 - off, pos6 - on
-       Note:   SW9 Settings: 33 MHz
-               8:1 ratio CCB clocks:SYSCLK
-               3:1 ration e500 Core:CCB
-               pos1 - on, pos2 - on, pos3 - on, pos4 - off, pos5 - off, pos6 - on
-
-
-Flashing the FLASH device with the "Wind River ICE":
-
-1) Properly connect and configure the Wind River ICE to the
-   target JTAG port. This includes running the SBC8560 register script.
-   Make sure target memory can be read and written.
-
-2) Build the u-boot image:
-       make distclean
-       make SBC8560_66_config or SBC8560_33_config
-       make CROSS_COMPILE=.../ELDK3.0/ppc_8xx-/ all
-
-   Note: reference is made to the ELDK3.0 compiler but any 85xx cross-compiler
-        should suffice.
-
-3) Convert the uboot (.elf) file to a uboot.bin file (using visionClick converter).
-   The bin file should be converted from fffc0000 to ffffffff
-
-4) Setup the Flash Utility (tools menu) for:
-
-   Determine the clock speed of the PCI bus and set SW9 accordingly
-       Note: the speed of the PCI bus defaults to the slowest PCI card
-   PlayBack the "default" register file for the SBC8560
-   Select the uboot.bin file with zero bias
-   Select the initialize Target prior to programming
-   Select the V28F640Jx (8192 x 8) 1 device FLASH Algorithm
-   Select the erase base address from FFFC0000 to FFFFFFFF
-   Select the start address from 0 with size of 4000
-
-5) Erase and Program
index 5a369df2c418914c2e1245fafb57ddd21d10582f..d68cba682be295949d15c3635896a6c944849531 100644 (file)
@@ -32,7 +32,7 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          cs8900.o ct69000.o dataflash.o dc2114x.o dm9000x.o \
          e1000.o eepro100.o \
          i8042.o inca-ip_sw.o keyboard.o \
-         lan91c96.o \
+         lan91c96.o macb.o \
          natsemi.o ne2000.o netarm_eth.o netconsole.o \
          ns16550.o ns8382x.o ns87308.o ns7520_eth.o omap1510_i2c.o \
          omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o \
@@ -44,8 +44,9 @@ 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 \
+         tsi108_eth.o tsi108_i2c.o tsi108_pci.o \
          usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o \
          videomodes.o w83c553f.o \
          ks8695eth.o \
index 41c37683d7854fb09a5fbac0d9ec4cfbf65f74fe..f35b99730f786528de863802191a1f11e2cd3846 100644 (file)
 
 #ifdef CONFIG_ATMEL_USART
 #include <asm/io.h>
-#include <asm/arch/platform.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/memory-map.h>
+
+#if defined(CONFIG_USART0)
+# define USART_ID      0
+# define USART_BASE    USART0_BASE
+#elif defined(CONFIG_USART1)
+# define USART_ID      1
+# define USART_BASE    USART1_BASE
+#elif defined(CONFIG_USART2)
+# define USART_ID      2
+# define USART_BASE    USART2_BASE
+#elif defined(CONFIG_USART3)
+# define USART_ID      3
+# define USART_BASE    USART3_BASE
+#endif
 
 #include "atmel_usart.h"
 
@@ -35,26 +50,23 @@ void serial_setbrg(void)
         * Baud Rate = --------------
         *                16 * CD
         */
-       usart_hz = pm_get_clock_freq(gd->console_uart->resource[0].u.clock.id);
+       usart_hz = get_usart_clk_rate(USART_ID);
        divisor = (usart_hz / 16 + gd->baudrate / 2) / gd->baudrate;
-       usart3_writel(gd->console_uart, BRGR, USART3_BF(CD, divisor));
+       usart3_writel(BRGR, USART3_BF(CD, divisor));
 }
 
 int serial_init(void)
 {
-       usart3_writel(gd->console_uart, CR,
-                     USART3_BIT(RSTRX) | USART3_BIT(RSTTX));
+       usart3_writel(CR, USART3_BIT(RSTRX) | USART3_BIT(RSTTX));
 
        serial_setbrg();
 
-       usart3_writel(gd->console_uart, CR,
-                     USART3_BIT(RXEN) | USART3_BIT(TXEN));
-       usart3_writel(gd->console_uart, MR,
-                     USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL)
-                     | USART3_BF(USCLKS, USART3_USCLKS_MCK)
-                     | USART3_BF(CHRL, USART3_CHRL_8)
-                     | USART3_BF(PAR, USART3_PAR_NONE)
-                     | USART3_BF(NBSTOP, USART3_NBSTOP_1));
+       usart3_writel(CR, USART3_BIT(RXEN) | USART3_BIT(TXEN));
+       usart3_writel(MR, (USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL)
+                          | USART3_BF(USCLKS, USART3_USCLKS_MCK)
+                          | USART3_BF(CHRL, USART3_CHRL_8)
+                          | USART3_BF(PAR, USART3_PAR_NONE)
+                          | USART3_BF(NBSTOP, USART3_NBSTOP_1)));
 
        return 0;
 }
@@ -64,8 +76,8 @@ void serial_putc(char c)
        if (c == '\n')
                serial_putc('\r');
 
-       while (!(usart3_readl(gd->console_uart, CSR) & USART3_BIT(TXRDY))) ;
-       usart3_writel(gd->console_uart, THR, c);
+       while (!(usart3_readl(CSR) & USART3_BIT(TXRDY))) ;
+       usart3_writel(THR, c);
 }
 
 void serial_puts(const char *s)
@@ -76,13 +88,13 @@ void serial_puts(const char *s)
 
 int serial_getc(void)
 {
-       while (!(usart3_readl(gd->console_uart, CSR) & USART3_BIT(RXRDY))) ;
-       return usart3_readl(gd->console_uart, RHR);
+       while (!(usart3_readl(CSR) & USART3_BIT(RXRDY))) ;
+       return usart3_readl(RHR);
 }
 
 int serial_tstc(void)
 {
-       return (usart3_readl(gd->console_uart, CSR) & USART3_BIT(RXRDY)) != 0;
+       return (usart3_readl(CSR) & USART3_BIT(RXRDY)) != 0;
 }
 
 #endif /* CONFIG_ATMEL_USART */
index fad90a8116eb69639d7bb9ebd848b8db40b618fa..af3773a99f25fada8a9467c6503ca1ef833e1ba5 100644 (file)
         | USART3_BF(name,value))
 
 /* Register access macros */
-#define usart3_readl(port,reg)                         \
-       readl((port)->regs + USART3_##reg)
-#define usart3_writel(port,reg,value)                  \
-       writel((value), (port)->regs + USART3_##reg)
+#define usart3_readl(reg)                              \
+       readl((void *)USART_BASE + USART3_##reg)
+#define usart3_writel(reg,value)                       \
+       writel((value), (void *)USART_BASE + USART3_##reg)
 
 #endif /* __DRIVERS_ATMEL_USART_H__ */
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
diff --git a/drivers/macb.c b/drivers/macb.c
new file mode 100644 (file)
index 0000000..186ab19
--- /dev/null
@@ -0,0 +1,575 @@
+/*
+ * Copyright (C) 2005-2006 Atmel Corporation
+ *
+ * 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_MACB) && (CONFIG_COMMANDS & (CFG_CMD_NET | CFG_CMD_MII))
+
+/*
+ * The u-boot networking stack is a little weird.  It seems like the
+ * networking core allocates receive buffers up front without any
+ * regard to the hardware that's supposed to actually receive those
+ * packets.
+ *
+ * The MACB receives packets into 128-byte receive buffers, so the
+ * buffers allocated by the core isn't very practical to use.  We'll
+ * allocate our own, but we need one such buffer in case a packet
+ * wraps around the DMA ring so that we have to copy it.
+ *
+ * Therefore, define CFG_RX_ETH_BUFFER to 1 in the board-specific
+ * configuration header.  This way, the core allocates one RX buffer
+ * and one TX buffer, each of which can hold a ethernet packet of
+ * maximum size.
+ *
+ * For some reason, the networking core unconditionally specifies a
+ * 32-byte packet "alignment" (which really should be called
+ * "padding").  MACB shouldn't need that, but we'll refrain from any
+ * core modifications here...
+ */
+
+#include <net.h>
+#include <malloc.h>
+
+#include <linux/mii.h>
+#include <asm/io.h>
+#include <asm/dma-mapping.h>
+#include <asm/arch/clk.h>
+
+#include "macb.h"
+
+#define CFG_MACB_RX_BUFFER_SIZE                4096
+#define CFG_MACB_RX_RING_SIZE          (CFG_MACB_RX_BUFFER_SIZE / 128)
+#define CFG_MACB_TX_RING_SIZE          16
+#define CFG_MACB_TX_TIMEOUT            1000
+#define CFG_MACB_AUTONEG_TIMEOUT       5000000
+
+struct macb_dma_desc {
+       u32     addr;
+       u32     ctrl;
+};
+
+#define RXADDR_USED            0x00000001
+#define RXADDR_WRAP            0x00000002
+
+#define RXBUF_FRMLEN_MASK      0x00000fff
+#define RXBUF_FRAME_START      0x00004000
+#define RXBUF_FRAME_END                0x00008000
+#define RXBUF_TYPEID_MATCH     0x00400000
+#define RXBUF_ADDR4_MATCH      0x00800000
+#define RXBUF_ADDR3_MATCH      0x01000000
+#define RXBUF_ADDR2_MATCH      0x02000000
+#define RXBUF_ADDR1_MATCH      0x04000000
+#define RXBUF_BROADCAST                0x80000000
+
+#define TXBUF_FRMLEN_MASK      0x000007ff
+#define TXBUF_FRAME_END                0x00008000
+#define TXBUF_NOCRC            0x00010000
+#define TXBUF_EXHAUSTED                0x08000000
+#define TXBUF_UNDERRUN         0x10000000
+#define TXBUF_MAXRETRY         0x20000000
+#define TXBUF_WRAP             0x40000000
+#define TXBUF_USED             0x80000000
+
+struct macb_device {
+       void                    *regs;
+
+       unsigned int            rx_tail;
+       unsigned int            tx_head;
+       unsigned int            tx_tail;
+
+       void                    *rx_buffer;
+       void                    *tx_buffer;
+       struct macb_dma_desc    *rx_ring;
+       struct macb_dma_desc    *tx_ring;
+
+       unsigned long           rx_buffer_dma;
+       unsigned long           rx_ring_dma;
+       unsigned long           tx_ring_dma;
+
+       const struct device     *dev;
+       struct eth_device       netdev;
+       unsigned short          phy_addr;
+};
+#define to_macb(_nd) container_of(_nd, struct macb_device, netdev)
+
+static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
+{
+       unsigned long netctl;
+       unsigned long netstat;
+       unsigned long frame;
+
+       netctl = macb_readl(macb, NCR);
+       netctl |= MACB_BIT(MPE);
+       macb_writel(macb, NCR, netctl);
+
+       frame = (MACB_BF(SOF, 1)
+                | MACB_BF(RW, 1)
+                | MACB_BF(PHYA, macb->phy_addr)
+                | MACB_BF(REGA, reg)
+                | MACB_BF(CODE, 2)
+                | MACB_BF(DATA, value));
+       macb_writel(macb, MAN, frame);
+
+       do {
+               netstat = macb_readl(macb, NSR);
+       } while (!(netstat & MACB_BIT(IDLE)));
+
+       netctl = macb_readl(macb, NCR);
+       netctl &= ~MACB_BIT(MPE);
+       macb_writel(macb, NCR, netctl);
+}
+
+static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
+{
+       unsigned long netctl;
+       unsigned long netstat;
+       unsigned long frame;
+
+       netctl = macb_readl(macb, NCR);
+       netctl |= MACB_BIT(MPE);
+       macb_writel(macb, NCR, netctl);
+
+       frame = (MACB_BF(SOF, 1)
+                | MACB_BF(RW, 2)
+                | MACB_BF(PHYA, macb->phy_addr)
+                | MACB_BF(REGA, reg)
+                | MACB_BF(CODE, 2));
+       macb_writel(macb, MAN, frame);
+
+       do {
+               netstat = macb_readl(macb, NSR);
+       } while (!(netstat & MACB_BIT(IDLE)));
+
+       frame = macb_readl(macb, MAN);
+
+       netctl = macb_readl(macb, NCR);
+       netctl &= ~MACB_BIT(MPE);
+       macb_writel(macb, NCR, netctl);
+
+       return MACB_BFEXT(DATA, frame);
+}
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+
+static int macb_send(struct eth_device *netdev, volatile void *packet,
+                    int length)
+{
+       struct macb_device *macb = to_macb(netdev);
+       unsigned long paddr, ctrl;
+       unsigned int tx_head = macb->tx_head;
+       int i;
+
+       paddr = dma_map_single(packet, length, DMA_TO_DEVICE);
+
+       ctrl = length & TXBUF_FRMLEN_MASK;
+       ctrl |= TXBUF_FRAME_END;
+       if (tx_head == (CFG_MACB_TX_RING_SIZE - 1)) {
+               ctrl |= TXBUF_WRAP;
+               macb->tx_head = 0;
+       } else
+               macb->tx_head++;
+
+       macb->tx_ring[tx_head].ctrl = ctrl;
+       macb->tx_ring[tx_head].addr = paddr;
+       macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
+
+       /*
+        * I guess this is necessary because the networking core may
+        * re-use the transmit buffer as soon as we return...
+        */
+       i = 0;
+       while (!(macb->tx_ring[tx_head].ctrl & TXBUF_USED)) {
+               if (i > CFG_MACB_TX_TIMEOUT) {
+                       printf("%s: TX timeout\n", netdev->name);
+                       break;
+               }
+               udelay(1);
+               i++;
+       }
+
+       dma_unmap_single(packet, length, paddr);
+
+       if (i <= CFG_MACB_TX_TIMEOUT) {
+               ctrl = macb->tx_ring[tx_head].ctrl;
+               if (ctrl & TXBUF_UNDERRUN)
+                       printf("%s: TX underrun\n", netdev->name);
+               if (ctrl & TXBUF_EXHAUSTED)
+                       printf("%s: TX buffers exhausted in mid frame\n",
+                              netdev->name);
+       }
+
+       /* No one cares anyway */
+       return 0;
+}
+
+static void reclaim_rx_buffers(struct macb_device *macb,
+                              unsigned int new_tail)
+{
+       unsigned int i;
+
+       i = macb->rx_tail;
+       while (i > new_tail) {
+               macb->rx_ring[i].addr &= ~RXADDR_USED;
+               i++;
+               if (i > CFG_MACB_RX_RING_SIZE)
+                       i = 0;
+       }
+
+       while (i < new_tail) {
+               macb->rx_ring[i].addr &= ~RXADDR_USED;
+               i++;
+       }
+
+       macb->rx_tail = new_tail;
+}
+
+static int macb_recv(struct eth_device *netdev)
+{
+       struct macb_device *macb = to_macb(netdev);
+       unsigned int rx_tail = macb->rx_tail;
+       void *buffer;
+       int length;
+       int wrapped = 0;
+       u32 status;
+
+       for (;;) {
+               if (!(macb->rx_ring[rx_tail].addr & RXADDR_USED))
+                       return -1;
+
+               status = macb->rx_ring[rx_tail].ctrl;
+               if (status & RXBUF_FRAME_START) {
+                       if (rx_tail != macb->rx_tail)
+                               reclaim_rx_buffers(macb, rx_tail);
+                       wrapped = 0;
+               }
+
+               if (status & RXBUF_FRAME_END) {
+                       buffer = macb->rx_buffer + 128 * macb->rx_tail;
+                       length = status & RXBUF_FRMLEN_MASK;
+                       if (wrapped) {
+                               unsigned int headlen, taillen;
+
+                               headlen = 128 * (CFG_MACB_RX_RING_SIZE
+                                                - macb->rx_tail);
+                               taillen = length - headlen;
+                               memcpy((void *)NetRxPackets[0],
+                                      buffer, headlen);
+                               memcpy((void *)NetRxPackets[0] + headlen,
+                                      macb->rx_buffer, taillen);
+                               buffer = (void *)NetRxPackets[0];
+                       }
+
+                       NetReceive(buffer, length);
+                       if (++rx_tail >= CFG_MACB_RX_RING_SIZE)
+                               rx_tail = 0;
+                       reclaim_rx_buffers(macb, rx_tail);
+               } else {
+                       if (++rx_tail >= CFG_MACB_RX_RING_SIZE) {
+                               wrapped = 1;
+                               rx_tail = 0;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int macb_phy_init(struct macb_device *macb)
+{
+       struct eth_device *netdev = &macb->netdev;
+       u32 ncfgr;
+       u16 phy_id, status, adv, lpa;
+       int media, speed, duplex;
+       int i;
+
+       /* Check if the PHY is up to snuff... */
+       phy_id = macb_mdio_read(macb, MII_PHYSID1);
+       if (phy_id == 0xffff) {
+               printf("%s: No PHY present\n", netdev->name);
+               return 0;
+       }
+
+       adv = ADVERTISE_CSMA | ADVERTISE_ALL;
+       macb_mdio_write(macb, MII_ADVERTISE, adv);
+       printf("%s: Starting autonegotiation...\n", netdev->name);
+       macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE
+                                        | BMCR_ANRESTART));
+
+#if 0
+       for (i = 0; i < 9; i++)
+               printf("mii%d: 0x%04x\n", i, macb_mdio_read(macb, i));
+#endif
+
+       for (i = 0; i < CFG_MACB_AUTONEG_TIMEOUT / 100; i++) {
+               status = macb_mdio_read(macb, MII_BMSR);
+               if (status & BMSR_ANEGCOMPLETE)
+                       break;
+               udelay(100);
+       }
+
+       if (status & BMSR_ANEGCOMPLETE)
+               printf("%s: Autonegotiation complete\n", netdev->name);
+       else
+               printf("%s: Autonegotiation timed out (status=0x%04x)\n",
+                      netdev->name, status);
+
+       if (!(status & BMSR_LSTATUS)) {
+               for (i = 0; i < CFG_MACB_AUTONEG_TIMEOUT / 100; i++) {
+                       udelay(100);
+                       status = macb_mdio_read(macb, MII_BMSR);
+                       if (status & BMSR_LSTATUS)
+                               break;
+               }
+       }
+
+       if (!(status & BMSR_LSTATUS)) {
+               printf("%s: link down (status: 0x%04x)\n",
+                      netdev->name, status);
+               return 0;
+       } else {
+               lpa = macb_mdio_read(macb, MII_LPA);
+               media = mii_nway_result(lpa & adv);
+               speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
+                        ? 1 : 0);
+               duplex = (media & ADVERTISE_FULL) ? 1 : 0;
+               printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n",
+                      netdev->name,
+                      speed ? "100" : "10",
+                      duplex ? "full" : "half",
+                      lpa);
+
+               ncfgr = macb_readl(macb, NCFGR);
+               ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
+               if (speed)
+                       ncfgr |= MACB_BIT(SPD);
+               if (duplex)
+                       ncfgr |= MACB_BIT(FD);
+               macb_writel(macb, NCFGR, ncfgr);
+               return 1;
+       }
+}
+
+static int macb_init(struct eth_device *netdev, bd_t *bd)
+{
+       struct macb_device *macb = to_macb(netdev);
+       unsigned long paddr;
+       u32 hwaddr_bottom;
+       u16 hwaddr_top;
+       int i;
+
+       /*
+        * macb_halt should have been called at some point before now,
+        * so we'll assume the controller is idle.
+        */
+
+       /* initialize DMA descriptors */
+       paddr = macb->rx_buffer_dma;
+       for (i = 0; i < CFG_MACB_RX_RING_SIZE; i++) {
+               if (i == (CFG_MACB_RX_RING_SIZE - 1))
+                       paddr |= RXADDR_WRAP;
+               macb->rx_ring[i].addr = paddr;
+               macb->rx_ring[i].ctrl = 0;
+               paddr += 128;
+       }
+       for (i = 0; i < CFG_MACB_TX_RING_SIZE; i++) {
+               macb->tx_ring[i].addr = 0;
+               if (i == (CFG_MACB_TX_RING_SIZE - 1))
+                       macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP;
+               else
+                       macb->tx_ring[i].ctrl = TXBUF_USED;
+       }
+       macb->rx_tail = macb->tx_head = macb->tx_tail = 0;
+
+       macb_writel(macb, RBQP, macb->rx_ring_dma);
+       macb_writel(macb, TBQP, macb->tx_ring_dma);
+
+       /* set hardware address */
+       hwaddr_bottom = cpu_to_le32(*((u32 *)netdev->enetaddr));
+       macb_writel(macb, SA1B, hwaddr_bottom);
+       hwaddr_top = cpu_to_le16(*((u16 *)(netdev->enetaddr + 4)));
+       macb_writel(macb, SA1T, hwaddr_top);
+
+       /* choose RMII or MII mode. This depends on the board */
+#ifdef CONFIG_RMII
+       macb_writel(macb, USRIO, 0);
+#else
+       macb_writel(macb, USRIO, MACB_BIT(MII));
+#endif
+
+       if (!macb_phy_init(macb))
+               return 0;
+
+       /* Enable TX and RX */
+       macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE));
+
+       return 1;
+}
+
+static void macb_halt(struct eth_device *netdev)
+{
+       struct macb_device *macb = to_macb(netdev);
+       u32 ncr, tsr;
+
+       /* Halt the controller and wait for any ongoing transmission to end. */
+       ncr = macb_readl(macb, NCR);
+       ncr |= MACB_BIT(THALT);
+       macb_writel(macb, NCR, ncr);
+
+       do {
+               tsr = macb_readl(macb, TSR);
+       } while (tsr & MACB_BIT(TGO));
+
+       /* Disable TX and RX, and clear statistics */
+       macb_writel(macb, NCR, MACB_BIT(CLRSTAT));
+}
+
+int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
+{
+       struct macb_device *macb;
+       struct eth_device *netdev;
+       unsigned long macb_hz;
+       u32 ncfgr;
+
+       macb = malloc(sizeof(struct macb_device));
+       if (!macb) {
+               printf("Error: Failed to allocate memory for MACB%d\n", id);
+               return -1;
+       }
+       memset(macb, 0, sizeof(struct macb_device));
+
+       netdev = &macb->netdev;
+
+       macb->rx_buffer = dma_alloc_coherent(CFG_MACB_RX_BUFFER_SIZE,
+                                            &macb->rx_buffer_dma);
+       macb->rx_ring = dma_alloc_coherent(CFG_MACB_RX_RING_SIZE
+                                          * sizeof(struct macb_dma_desc),
+                                          &macb->rx_ring_dma);
+       macb->tx_ring = dma_alloc_coherent(CFG_MACB_TX_RING_SIZE
+                                          * sizeof(struct macb_dma_desc),
+                                          &macb->tx_ring_dma);
+
+       macb->regs = regs;
+       macb->phy_addr = phy_addr;
+
+       sprintf(netdev->name, "macb%d", id);
+       netdev->init = macb_init;
+       netdev->halt = macb_halt;
+       netdev->send = macb_send;
+       netdev->recv = macb_recv;
+
+       /*
+        * Do some basic initialization so that we at least can talk
+        * to the PHY
+        */
+       macb_hz = get_macb_pclk_rate(id);
+       if (macb_hz < 20000000)
+               ncfgr = MACB_BF(CLK, MACB_CLK_DIV8);
+       else if (macb_hz < 40000000)
+               ncfgr = MACB_BF(CLK, MACB_CLK_DIV16);
+       else if (macb_hz < 80000000)
+               ncfgr = MACB_BF(CLK, MACB_CLK_DIV32);
+       else
+               ncfgr = MACB_BF(CLK, MACB_CLK_DIV64);
+
+       macb_writel(macb, NCFGR, ncfgr);
+
+       eth_register(netdev);
+
+       return 0;
+}
+
+#endif /* (CONFIG_COMMANDS & CFG_CMD_NET) */
+
+#if (CONFIG_COMMANDS & CFG_CMD_MII)
+
+int miiphy_read(unsigned char addr, unsigned char reg, unsigned short *value)
+{
+       unsigned long netctl;
+       unsigned long netstat;
+       unsigned long frame;
+       int iflag;
+
+       iflag = disable_interrupts();
+       netctl = macb_readl(&macb, EMACB_NCR);
+       netctl |= MACB_BIT(MPE);
+       macb_writel(&macb, EMACB_NCR, netctl);
+       if (iflag)
+               enable_interrupts();
+
+       frame = (MACB_BF(SOF, 1)
+                | MACB_BF(RW, 2)
+                | MACB_BF(PHYA, addr)
+                | MACB_BF(REGA, reg)
+                | MACB_BF(CODE, 2));
+       macb_writel(&macb, EMACB_MAN, frame);
+
+       do {
+               netstat = macb_readl(&macb, EMACB_NSR);
+       } while (!(netstat & MACB_BIT(IDLE)));
+
+       frame = macb_readl(&macb, EMACB_MAN);
+       *value = MACB_BFEXT(DATA, frame);
+
+       iflag = disable_interrupts();
+       netctl = macb_readl(&macb, EMACB_NCR);
+       netctl &= ~MACB_BIT(MPE);
+       macb_writel(&macb, EMACB_NCR, netctl);
+       if (iflag)
+               enable_interrupts();
+
+       return 0;
+}
+
+int miiphy_write(unsigned char addr, unsigned char reg, unsigned short value)
+{
+       unsigned long netctl;
+       unsigned long netstat;
+       unsigned long frame;
+       int iflag;
+
+       iflag = disable_interrupts();
+       netctl = macb_readl(&macb, EMACB_NCR);
+       netctl |= MACB_BIT(MPE);
+       macb_writel(&macb, EMACB_NCR, netctl);
+       if (iflag)
+               enable_interrupts();
+
+       frame = (MACB_BF(SOF, 1)
+                | MACB_BF(RW, 1)
+                | MACB_BF(PHYA, addr)
+                | MACB_BF(REGA, reg)
+                | MACB_BF(CODE, 2)
+                | MACB_BF(DATA, value));
+       macb_writel(&macb, EMACB_MAN, frame);
+
+       do {
+               netstat = macb_readl(&macb, EMACB_NSR);
+       } while (!(netstat & MACB_BIT(IDLE)));
+
+       iflag = disable_interrupts();
+       netctl = macb_readl(&macb, EMACB_NCR);
+       netctl &= ~MACB_BIT(MPE);
+       macb_writel(&macb, EMACB_NCR, netctl);
+       if (iflag)
+               enable_interrupts();
+
+       return 0;
+}
+
+#endif /* (CONFIG_COMMANDS & CFG_CMD_MII) */
+
+#endif /* CONFIG_MACB */
diff --git a/drivers/macb.h b/drivers/macb.h
new file mode 100644 (file)
index 0000000..c778e4e
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2005-2006 Atmel Corporation
+ *
+ * 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 __DRIVERS_MACB_H__
+#define __DRIVERS_MACB_H__
+
+/* MACB register offsets */
+#define MACB_NCR                               0x0000
+#define MACB_NCFGR                             0x0004
+#define MACB_NSR                               0x0008
+#define MACB_TSR                               0x0014
+#define MACB_RBQP                              0x0018
+#define MACB_TBQP                              0x001c
+#define MACB_RSR                               0x0020
+#define MACB_ISR                               0x0024
+#define MACB_IER                               0x0028
+#define MACB_IDR                               0x002c
+#define MACB_IMR                               0x0030
+#define MACB_MAN                               0x0034
+#define MACB_PTR                               0x0038
+#define MACB_PFR                               0x003c
+#define MACB_FTO                               0x0040
+#define MACB_SCF                               0x0044
+#define MACB_MCF                               0x0048
+#define MACB_FRO                               0x004c
+#define MACB_FCSE                              0x0050
+#define MACB_ALE                               0x0054
+#define MACB_DTF                               0x0058
+#define MACB_LCOL                              0x005c
+#define MACB_EXCOL                             0x0060
+#define MACB_TUND                              0x0064
+#define MACB_CSE                               0x0068
+#define MACB_RRE                               0x006c
+#define MACB_ROVR                              0x0070
+#define MACB_RSE                               0x0074
+#define MACB_ELE                               0x0078
+#define MACB_RJA                               0x007c
+#define MACB_USF                               0x0080
+#define MACB_STE                               0x0084
+#define MACB_RLE                               0x0088
+#define MACB_TPF                               0x008c
+#define MACB_HRB                               0x0090
+#define MACB_HRT                               0x0094
+#define MACB_SA1B                              0x0098
+#define MACB_SA1T                              0x009c
+#define MACB_SA2B                              0x00a0
+#define MACB_SA2T                              0x00a4
+#define MACB_SA3B                              0x00a8
+#define MACB_SA3T                              0x00ac
+#define MACB_SA4B                              0x00b0
+#define MACB_SA4T                              0x00b4
+#define MACB_TID                               0x00b8
+#define MACB_TPQ                               0x00bc
+#define MACB_USRIO                             0x00c0
+#define MACB_WOL                               0x00c4
+
+/* Bitfields in NCR */
+#define MACB_LB_OFFSET                         0
+#define MACB_LB_SIZE                           1
+#define MACB_LLB_OFFSET                                1
+#define MACB_LLB_SIZE                          1
+#define MACB_RE_OFFSET                         2
+#define MACB_RE_SIZE                           1
+#define MACB_TE_OFFSET                         3
+#define MACB_TE_SIZE                           1
+#define MACB_MPE_OFFSET                                4
+#define MACB_MPE_SIZE                          1
+#define MACB_CLRSTAT_OFFSET                    5
+#define MACB_CLRSTAT_SIZE                      1
+#define MACB_INCSTAT_OFFSET                    6
+#define MACB_INCSTAT_SIZE                      1
+#define MACB_WESTAT_OFFSET                     7
+#define MACB_WESTAT_SIZE                       1
+#define MACB_BP_OFFSET                         8
+#define MACB_BP_SIZE                           1
+#define MACB_TSTART_OFFSET                     9
+#define MACB_TSTART_SIZE                       1
+#define MACB_THALT_OFFSET                      10
+#define MACB_THALT_SIZE                                1
+#define MACB_NCR_TPF_OFFSET                    11
+#define MACB_NCR_TPF_SIZE                      1
+#define MACB_TZQ_OFFSET                                12
+#define MACB_TZQ_SIZE                          1
+
+/* Bitfields in NCFGR */
+#define MACB_SPD_OFFSET                                0
+#define MACB_SPD_SIZE                          1
+#define MACB_FD_OFFSET                         1
+#define MACB_FD_SIZE                           1
+#define MACB_BIT_RATE_OFFSET                   2
+#define MACB_BIT_RATE_SIZE                     1
+#define MACB_JFRAME_OFFSET                     3
+#define MACB_JFRAME_SIZE                       1
+#define MACB_CAF_OFFSET                                4
+#define MACB_CAF_SIZE                          1
+#define MACB_NBC_OFFSET                                5
+#define MACB_NBC_SIZE                          1
+#define MACB_NCFGR_MTI_OFFSET                  6
+#define MACB_NCFGR_MTI_SIZE                    1
+#define MACB_UNI_OFFSET                                7
+#define MACB_UNI_SIZE                          1
+#define MACB_BIG_OFFSET                                8
+#define MACB_BIG_SIZE                          1
+#define MACB_EAE_OFFSET                                9
+#define MACB_EAE_SIZE                          1
+#define MACB_CLK_OFFSET                                10
+#define MACB_CLK_SIZE                          2
+#define MACB_RTY_OFFSET                                12
+#define MACB_RTY_SIZE                          1
+#define MACB_PAE_OFFSET                                13
+#define MACB_PAE_SIZE                          1
+#define MACB_RBOF_OFFSET                       14
+#define MACB_RBOF_SIZE                         2
+#define MACB_RLCE_OFFSET                       16
+#define MACB_RLCE_SIZE                         1
+#define MACB_DRFCS_OFFSET                      17
+#define MACB_DRFCS_SIZE                                1
+#define MACB_EFRHD_OFFSET                      18
+#define MACB_EFRHD_SIZE                                1
+#define MACB_IRXFCS_OFFSET                     19
+#define MACB_IRXFCS_SIZE                       1
+
+/* Bitfields in NSR */
+#define MACB_NSR_LINK_OFFSET                   0
+#define MACB_NSR_LINK_SIZE                     1
+#define MACB_MDIO_OFFSET                       1
+#define MACB_MDIO_SIZE                         1
+#define MACB_IDLE_OFFSET                       2
+#define MACB_IDLE_SIZE                         1
+
+/* Bitfields in TSR */
+#define MACB_UBR_OFFSET                                0
+#define MACB_UBR_SIZE                          1
+#define MACB_COL_OFFSET                                1
+#define MACB_COL_SIZE                          1
+#define MACB_TSR_RLE_OFFSET                    2
+#define MACB_TSR_RLE_SIZE                      1
+#define MACB_TGO_OFFSET                                3
+#define MACB_TGO_SIZE                          1
+#define MACB_BEX_OFFSET                                4
+#define MACB_BEX_SIZE                          1
+#define MACB_COMP_OFFSET                       5
+#define MACB_COMP_SIZE                         1
+#define MACB_UND_OFFSET                                6
+#define MACB_UND_SIZE                          1
+
+/* Bitfields in RSR */
+#define MACB_BNA_OFFSET                                0
+#define MACB_BNA_SIZE                          1
+#define MACB_REC_OFFSET                                1
+#define MACB_REC_SIZE                          1
+#define MACB_OVR_OFFSET                                2
+#define MACB_OVR_SIZE                          1
+
+/* Bitfields in ISR/IER/IDR/IMR */
+#define MACB_MFD_OFFSET                                0
+#define MACB_MFD_SIZE                          1
+#define MACB_RCOMP_OFFSET                      1
+#define MACB_RCOMP_SIZE                                1
+#define MACB_RXUBR_OFFSET                      2
+#define MACB_RXUBR_SIZE                                1
+#define MACB_TXUBR_OFFSET                      3
+#define MACB_TXUBR_SIZE                                1
+#define MACB_ISR_TUND_OFFSET                   4
+#define MACB_ISR_TUND_SIZE                     1
+#define MACB_ISR_RLE_OFFSET                    5
+#define MACB_ISR_RLE_SIZE                      1
+#define MACB_TXERR_OFFSET                      6
+#define MACB_TXERR_SIZE                                1
+#define MACB_TCOMP_OFFSET                      7
+#define MACB_TCOMP_SIZE                                1
+#define MACB_ISR_LINK_OFFSET                   9
+#define MACB_ISR_LINK_SIZE                     1
+#define MACB_ISR_ROVR_OFFSET                   10
+#define MACB_ISR_ROVR_SIZE                     1
+#define MACB_HRESP_OFFSET                      11
+#define MACB_HRESP_SIZE                                1
+#define MACB_PFR_OFFSET                                12
+#define MACB_PFR_SIZE                          1
+#define MACB_PTZ_OFFSET                                13
+#define MACB_PTZ_SIZE                          1
+
+/* Bitfields in MAN */
+#define MACB_DATA_OFFSET                       0
+#define MACB_DATA_SIZE                         16
+#define MACB_CODE_OFFSET                       16
+#define MACB_CODE_SIZE                         2
+#define MACB_REGA_OFFSET                       18
+#define MACB_REGA_SIZE                         5
+#define MACB_PHYA_OFFSET                       23
+#define MACB_PHYA_SIZE                         5
+#define MACB_RW_OFFSET                         28
+#define MACB_RW_SIZE                           2
+#define MACB_SOF_OFFSET                                30
+#define MACB_SOF_SIZE                          2
+
+/* Bitfields in USRIO */
+#define MACB_MII_OFFSET                                0
+#define MACB_MII_SIZE                          1
+#define MACB_EAM_OFFSET                                1
+#define MACB_EAM_SIZE                          1
+#define MACB_TX_PAUSE_OFFSET                   2
+#define MACB_TX_PAUSE_SIZE                     1
+#define MACB_TX_PAUSE_ZERO_OFFSET              3
+#define MACB_TX_PAUSE_ZERO_SIZE                        1
+
+/* Bitfields in WOL */
+#define MACB_IP_OFFSET                         0
+#define MACB_IP_SIZE                           16
+#define MACB_MAG_OFFSET                                16
+#define MACB_MAG_SIZE                          1
+#define MACB_ARP_OFFSET                                17
+#define MACB_ARP_SIZE                          1
+#define MACB_SA1_OFFSET                                18
+#define MACB_SA1_SIZE                          1
+#define MACB_WOL_MTI_OFFSET                    19
+#define MACB_WOL_MTI_SIZE                      1
+
+/* Constants for CLK */
+#define MACB_CLK_DIV8                          0
+#define MACB_CLK_DIV16                         1
+#define MACB_CLK_DIV32                         2
+#define MACB_CLK_DIV64                         3
+
+/* Constants for MAN register */
+#define MACB_MAN_SOF                           1
+#define MACB_MAN_WRITE                         1
+#define MACB_MAN_READ                          2
+#define MACB_MAN_CODE                          2
+
+/* Bit manipulation macros */
+#define MACB_BIT(name)                                 \
+       (1 << MACB_##name##_OFFSET)
+#define MACB_BF(name,value)                            \
+       (((value) & ((1 << MACB_##name##_SIZE) - 1))    \
+        << MACB_##name##_OFFSET)
+#define MACB_BFEXT(name,value)\
+       (((value) >> MACB_##name##_OFFSET)              \
+        & ((1 << MACB_##name##_SIZE) - 1))
+#define MACB_BFINS(name,value,old)                     \
+       (((old) & ~(((1 << MACB_##name##_SIZE) - 1)     \
+                   << MACB_##name##_OFFSET))           \
+        | MACB_BF(name,value))
+
+/* Register access macros */
+#define macb_readl(port,reg)                           \
+       readl((port)->regs + MACB_##reg)
+#define macb_writel(port,reg,value)                    \
+       writel((value), (port)->regs + MACB_##reg)
+
+#endif /* __DRIVERS_MACB_H__ */
index 8495829900c4a179642d80ddadbbe04ad748fad7..c6fee18222b494297066c89ae1db1e2f330c93f1 100644 (file)
@@ -427,8 +427,9 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
        struct nand_chip *this = mtd->priv;
        u16 bad;
 
+       page = (int)(ofs >> this->page_shift) & this->pagemask;
+
        if (getchip) {
-               page = (int)(ofs >> this->page_shift);
                chipnr = (int)(ofs >> this->chip_shift);
 
                /* Grab the lock and see if the device is available */
@@ -436,18 +437,17 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
 
                /* Select the NAND device */
                this->select_chip(mtd, chipnr);
-       } else
-               page = (int) ofs;
+       }
 
        if (this->options & NAND_BUSWIDTH_16) {
-               this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, page & this->pagemask);
+               this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, page);
                bad = cpu_to_le16(this->read_word(mtd));
                if (this->badblockpos & 0x1)
                        bad >>= 1;
                if ((bad & 0xFF) != 0xff)
                        res = 1;
        } else {
-               this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos, page & this->pagemask);
+               this->cmdfunc (mtd, NAND_CMD_READOOB, this->badblockpos, page);
                if (this->read_byte(mtd) != 0xff)
                        res = 1;
        }
index 969167555ea27369008b7c5b53dc76f75bc9a46f..f170c2db89e066420771a5fbb813385905c9baf2 100644 (file)
 
 void pciauto_region_init(struct pci_region* res)
 {
-       res->bus_lower = res->bus_start;
+       /*
+        * Avoid allocating PCI resources from address 0 -- this is illegal
+        * according to PCI 2.1 and moreover, this is known to cause Linux IDE
+        * drivers to fail. Use a reasonable starting value of 0x1000 instead.
+        */
+       res->bus_lower = res->bus_start ? res->bus_start : 0x1000;
 }
 
 void pciauto_region_align(struct pci_region *res, unsigned long size)
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;
 
index f91e4b984369fca9c75138be33a808134e779610..8061f12979dbbbf5317079d49a932f6c48794cb7 100644 (file)
@@ -1538,9 +1538,9 @@ int eth_send(volatile void *packet, int length) {
 int smc_get_ethaddr (bd_t * bd)
 {
        int env_size, rom_valid, env_present = 0, reg;
-       char *s = NULL, *e, *v_mac, es[] = "11:22:33:44:55:66";
+       char *s = NULL, *e, es[] = "11:22:33:44:55:66";
        char s_env_mac[64];
-       uchar v_env_mac[6], v_rom_mac[6];
+       uchar v_env_mac[6], v_rom_mac[6], *v_mac;
 
        env_size = getenv_r ("ethaddr", s_env_mac, sizeof (s_env_mac));
        if ((env_size > 0) && (env_size < sizeof (es))) {       /* exit if env is bad */
@@ -1563,7 +1563,7 @@ int smc_get_ethaddr (bd_t * bd)
 
        if (!env_present) {     /* if NO env */
                if (rom_valid) {        /* but ROM is valid */
-                       v_mac = (char *)v_rom_mac;
+                       v_mac = v_rom_mac;
                        sprintf (s_env_mac, "%02X:%02X:%02X:%02X:%02X:%02X",
                                 v_mac[0], v_mac[1], v_mac[2], v_mac[3],
                                 v_mac[4], v_mac[5]);
@@ -1573,7 +1573,7 @@ int smc_get_ethaddr (bd_t * bd)
                        return (-1);
                }
        } else {                /* good env, don't care ROM */
-               v_mac = (char *)v_env_mac;      /* always use a good env over a ROM */
+               v_mac = v_env_mac;      /* always use a good env over a ROM */
        }
 
        if (env_present && rom_valid) { /* if both env and ROM are good */
diff --git a/drivers/systemace.c b/drivers/systemace.c
new file mode 100644 (file)
index 0000000..7d82c27
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * 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);
+
+/*
+ * For FPGA configuration via SystemACE is reset unacceptable
+ * CFGDONE bit in STATUSREG is not set to 1.
+ */
+#ifndef SYSTEMACE_CONFIG_FPGA
+               /* Reset the configruation controller */
+               val = ace_readw(0x18);
+               val |= 0x0080;
+               ace_writew(val, 0x18);
+#endif
+
+               retry = trans * 16;
+               while (retry > 0) {
+                       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..b4187739cb01a341a0c7551f982b64a815e39560 100644 (file)
@@ -5,7 +5,7 @@
  * terms of the GNU Public License, Version 2, incorporated
  * herein by reference.
  *
- * Copyright 2004 Freescale Semiconductor.
+ * Copyright 2004, 2007 Freescale Semiconductor, Inc.
  * (C) Copyright 2003, Motorola, Inc.
  * author Andy Fleming
  *
@@ -66,7 +66,11 @@ struct tsec_info_struct {
  */
 static struct tsec_info_struct tsec_info[] = {
 #if defined(CONFIG_MPC85XX_TSEC1) || defined(CONFIG_MPC83XX_TSEC1)
+#if defined(CONFIG_MPC8544DS)
+       {TSEC1_PHY_ADDR, TSEC_GIGABIT | TSEC_REDUCED, TSEC1_PHYIDX},
+#else
        {TSEC1_PHY_ADDR, TSEC_GIGABIT, TSEC1_PHYIDX},
+#endif
 #elif defined(CONFIG_MPC86XX_TSEC1)
        {TSEC1_PHY_ADDR, TSEC_GIGABIT | TSEC_REDUCED, TSEC1_PHYIDX},
 #else
@@ -381,6 +385,131 @@ uint mii_parse_sr(uint mii_reg, struct tsec_private * priv)
        return 0;
 }
 
+/* Generic function which updates the speed and duplex.  If
+ * autonegotiation is enabled, it uses the AND of the link
+ * partner's advertised capabilities and our advertised
+ * capabilities.  If autonegotiation is disabled, we use the
+ * appropriate bits in the control register.
+ *
+ * Stolen from Linux's mii.c and phy_device.c
+ */
+uint mii_parse_link(uint mii_reg, struct tsec_private *priv)
+{
+       /* We're using autonegotiation */
+       if (mii_reg & PHY_BMSR_AUTN_ABLE) {
+               uint lpa = 0;
+               uint gblpa = 0;
+
+               /* Check for gigabit capability */
+               if (mii_reg & PHY_BMSR_EXT) {
+                       /* We want a list of states supported by
+                        * both PHYs in the link
+                        */
+                       gblpa = read_phy_reg(priv, PHY_1000BTSR);
+                       gblpa &= read_phy_reg(priv, PHY_1000BTCR) << 2;
+               }
+
+               /* Set the baseline so we only have to set them
+                * if they're different
+                */
+               priv->speed = 10;
+               priv->duplexity = 0;
+
+               /* Check the gigabit fields */
+               if (gblpa & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) {
+                       priv->speed = 1000;
+
+                       if (gblpa & PHY_1000BTSR_1000FD)
+                               priv->duplexity = 1;
+
+                       /* We're done! */
+                       return 0;
+               }
+
+               lpa = read_phy_reg(priv, PHY_ANAR);
+               lpa &= read_phy_reg(priv, PHY_ANLPAR);
+
+               if (lpa & (PHY_ANLPAR_TXFD | PHY_ANLPAR_TX)) {
+                       priv->speed = 100;
+
+                       if (lpa & PHY_ANLPAR_TXFD)
+                               priv->duplexity = 1;
+
+               } else if (lpa & PHY_ANLPAR_10FD)
+                       priv->duplexity = 1;
+       } else {
+               uint bmcr = read_phy_reg(priv, PHY_BMCR);
+
+               priv->speed = 10;
+               priv->duplexity = 0;
+
+               if (bmcr & PHY_BMCR_DPLX)
+                       priv->duplexity = 1;
+
+               if (bmcr & PHY_BMCR_1000_MBPS)
+                       priv->speed = 1000;
+               else if (bmcr & PHY_BMCR_100_MBPS)
+                       priv->speed = 100;
+       }
+
+       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
  */
@@ -663,6 +792,7 @@ static void startup_tsec(struct eth_device *dev)
        /* Start up the PHY */
        if(priv->phyinfo)
                phy_run_commands(priv, priv->phyinfo->startup);
+
        adjust_link(dev);
 
        /* Enable Transmit and Receive */
@@ -770,6 +900,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",
@@ -1005,6 +1163,27 @@ struct phy_info phy_info_dm9161 = {
                           {miim_end,}
                           },
 };
+/* a generic flavor.  */
+struct phy_info phy_info_generic =  {
+       0,
+       "Unknown/Generic PHY",
+       32,
+       (struct phy_cmd[]) { /* config */
+               {PHY_BMCR, PHY_BMCR_RESET, NULL},
+               {PHY_BMCR, PHY_BMCR_AUTON|PHY_BMCR_RST_NEG, NULL},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* startup */
+               {PHY_BMSR, miim_read, NULL},
+               {PHY_BMSR, miim_read, &mii_parse_sr},
+               {PHY_BMSR, miim_read, &mii_parse_link},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* shutdown */
+               {miim_end,}
+       }
+};
+
 
 uint mii_parse_lxt971_sr2(uint mii_reg, struct tsec_private *priv)
 {
@@ -1112,6 +1291,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,
@@ -1119,6 +1299,7 @@ struct phy_info *phy_info[] = {
        &phy_info_lxt971,
        &phy_info_VSC8244,
        &phy_info_dp83865,
+       &phy_info_generic,
        NULL
 };
 
index cee30037db03dee0fb30b4c4f36605ecf55ac1d5..7bf3dee2b6859ae67860c0b12a69ab1791ccfea3 100644 (file)
@@ -7,7 +7,7 @@
  *  terms of the GNU Public License, Version 2, incorporated
  *  herein by reference.
  *
- * Copyright 2004 Freescale Semiconductor.
+ * Copyright 2004, 2007 Freescale Semiconductor, Inc.
  * (C) Copyright 2003, Motorola, Inc.
  * maintained by Xianghua Xiao (x.xiao@motorola.com)
  * author Andy Fleming
@@ -65,6 +65,7 @@
 #define ECNTRL_INIT_SETTINGS   0x00001000
 #define ECNTRL_TBI_MODE         0x00000020
 #define ECNTRL_R100            0x00000008
+#define ECNTRL_SGMII_MODE      0x00000002
 
 #define miim_end -2
 #define miim_read -1
 #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
diff --git a/drivers/tsi108_eth.c b/drivers/tsi108_eth.c
new file mode 100644 (file)
index 0000000..47341be
--- /dev/null
@@ -0,0 +1,1036 @@
+/***********************************************************************
+ *
+ * Copyright (c) 2005 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.
+ *
+ * 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
+ *
+ * Description:
+ *   Ethernet interface for Tundra TSI108 bridge chip
+ *
+ ***********************************************************************/
+
+#include <config.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI) \
+       && defined(CONFIG_TSI108_ETH)
+
+#if !defined(CONFIG_TSI108_ETH_NUM_PORTS) || (CONFIG_TSI108_ETH_NUM_PORTS > 2)
+#error "CONFIG_TSI108_ETH_NUM_PORTS must be defined as 1 or 2"
+#endif
+
+#include <common.h>
+#include <malloc.h>
+#include <net.h>
+#include <asm/cache.h>
+
+#ifdef DEBUG
+#define TSI108_ETH_DEBUG 7
+#else
+#define TSI108_ETH_DEBUG 0
+#endif
+
+#if TSI108_ETH_DEBUG > 0
+#define debug_lev(lev, fmt, args...) \
+if (lev <= TSI108_ETH_DEBUG) \
+printf ("%s %d: " fmt, __FUNCTION__, __LINE__, ##args)
+#else
+#define debug_lev(lev, fmt, args...) do{}while(0)
+#endif
+
+#define RX_PRINT_ERRORS
+#define TX_PRINT_ERRORS
+
+#define ETH_BASE       (CFG_TSI108_CSR_BASE + 0x6000)
+
+#define ETH_PORT_OFFSET        0x400
+
+#define __REG32(base, offset) (*((volatile u32 *)((char *)(base) + (offset))))
+
+#define reg_MAC_CONFIG_1(base)         __REG32(base, 0x00000000)
+#define MAC_CONFIG_1_TX_ENABLE         (0x00000001)
+#define MAC_CONFIG_1_SYNC_TX_ENABLE    (0x00000002)
+#define MAC_CONFIG_1_RX_ENABLE         (0x00000004)
+#define MAC_CONFIG_1_SYNC_RX_ENABLE    (0x00000008)
+#define MAC_CONFIG_1_TX_FLOW_CONTROL   (0x00000010)
+#define MAC_CONFIG_1_RX_FLOW_CONTROL   (0x00000020)
+#define MAC_CONFIG_1_LOOP_BACK         (0x00000100)
+#define MAC_CONFIG_1_RESET_TX_FUNCTION (0x00010000)
+#define MAC_CONFIG_1_RESET_RX_FUNCTION (0x00020000)
+#define MAC_CONFIG_1_RESET_TX_MAC      (0x00040000)
+#define MAC_CONFIG_1_RESET_RX_MAC      (0x00080000)
+#define MAC_CONFIG_1_SIM_RESET         (0x40000000)
+#define MAC_CONFIG_1_SOFT_RESET                (0x80000000)
+
+#define reg_MAC_CONFIG_2(base)         __REG32(base, 0x00000004)
+#define MAC_CONFIG_2_FULL_DUPLEX       (0x00000001)
+#define MAC_CONFIG_2_CRC_ENABLE                (0x00000002)
+#define MAC_CONFIG_2_PAD_CRC           (0x00000004)
+#define MAC_CONFIG_2_LENGTH_CHECK      (0x00000010)
+#define MAC_CONFIG_2_HUGE_FRAME                (0x00000020)
+#define MAC_CONFIG_2_INTERFACE_MODE(val)       (((val) & 0x3) << 8)
+#define MAC_CONFIG_2_PREAMBLE_LENGTH(val)      (((val) & 0xf) << 12)
+#define INTERFACE_MODE_NIBBLE          1       /* 10/100 Mb/s MII) */
+#define INTERFACE_MODE_BYTE            2       /* 1000 Mb/s GMII/TBI */
+
+#define reg_MAXIMUM_FRAME_LENGTH(base)         __REG32(base, 0x00000010)
+
+#define reg_MII_MGMT_CONFIG(base)              __REG32(base, 0x00000020)
+#define MII_MGMT_CONFIG_MGMT_CLOCK_SELECT(val) ((val) & 0x7)
+#define MII_MGMT_CONFIG_NO_PREAMBLE            (0x00000010)
+#define MII_MGMT_CONFIG_SCAN_INCREMENT         (0x00000020)
+#define MII_MGMT_CONFIG_RESET_MGMT             (0x80000000)
+
+#define reg_MII_MGMT_COMMAND(base)             __REG32(base, 0x00000024)
+#define MII_MGMT_COMMAND_READ_CYCLE            (0x00000001)
+#define MII_MGMT_COMMAND_SCAN_CYCLE            (0x00000002)
+
+#define reg_MII_MGMT_ADDRESS(base)             __REG32(base, 0x00000028)
+#define reg_MII_MGMT_CONTROL(base)             __REG32(base, 0x0000002c)
+#define reg_MII_MGMT_STATUS(base)              __REG32(base, 0x00000030)
+
+#define reg_MII_MGMT_INDICATORS(base)          __REG32(base, 0x00000034)
+#define MII_MGMT_INDICATORS_BUSY               (0x00000001)
+#define MII_MGMT_INDICATORS_SCAN               (0x00000002)
+#define MII_MGMT_INDICATORS_NOT_VALID          (0x00000004)
+
+#define reg_INTERFACE_STATUS(base)             __REG32(base, 0x0000003c)
+#define INTERFACE_STATUS_LINK_FAIL             (0x00000008)
+#define INTERFACE_STATUS_EXCESS_DEFER          (0x00000200)
+
+#define reg_STATION_ADDRESS_1(base)            __REG32(base, 0x00000040)
+#define reg_STATION_ADDRESS_2(base)            __REG32(base, 0x00000044)
+
+#define reg_PORT_CONTROL(base)                 __REG32(base, 0x00000200)
+#define PORT_CONTROL_PRI               (0x00000001)
+#define PORT_CONTROL_BPT               (0x00010000)
+#define PORT_CONTROL_SPD               (0x00040000)
+#define PORT_CONTROL_RBC               (0x00080000)
+#define PORT_CONTROL_PRB               (0x00200000)
+#define PORT_CONTROL_DIS               (0x00400000)
+#define PORT_CONTROL_TBI               (0x00800000)
+#define PORT_CONTROL_STE               (0x10000000)
+#define PORT_CONTROL_ZOR               (0x20000000)
+#define PORT_CONTROL_CLR               (0x40000000)
+#define PORT_CONTROL_SRT               (0x80000000)
+
+#define reg_TX_CONFIG(base)            __REG32(base, 0x00000220)
+#define TX_CONFIG_START_Q              (0x00000003)
+#define TX_CONFIG_EHP                  (0x00400000)
+#define TX_CONFIG_CHP                  (0x00800000)
+#define TX_CONFIG_RST                  (0x80000000)
+
+#define reg_TX_CONTROL(base)           __REG32(base, 0x00000224)
+#define TX_CONTROL_GO                  (0x00008000)
+#define TX_CONTROL_MP                  (0x01000000)
+#define TX_CONTROL_EAI                 (0x20000000)
+#define TX_CONTROL_ABT                 (0x40000000)
+#define TX_CONTROL_EII                 (0x80000000)
+
+#define reg_TX_STATUS(base)            __REG32(base, 0x00000228)
+#define TX_STATUS_QUEUE_USABLE         (0x0000000f)
+#define TX_STATUS_CURR_Q               (0x00000300)
+#define TX_STATUS_ACT                  (0x00008000)
+#define TX_STATUS_QUEUE_IDLE           (0x000f0000)
+#define TX_STATUS_EOQ_PENDING          (0x0f000000)
+
+#define reg_TX_EXTENDED_STATUS(base)           __REG32(base, 0x0000022c)
+#define TX_EXTENDED_STATUS_END_OF_QUEUE_CONDITION              (0x0000000f)
+#define TX_EXTENDED_STATUS_END_OF_FRAME_CONDITION              (0x00000f00)
+#define TX_EXTENDED_STATUS_DESCRIPTOR_INTERRUPT_CONDITION      (0x000f0000)
+#define TX_EXTENDED_STATUS_ERROR_FLAG                          (0x0f000000)
+
+#define reg_TX_THRESHOLDS(base)                        __REG32(base, 0x00000230)
+
+#define reg_TX_DIAGNOSTIC_ADDR(base)           __REG32(base, 0x00000270)
+#define TX_DIAGNOSTIC_ADDR_INDEX               (0x0000007f)
+#define TX_DIAGNOSTIC_ADDR_DFR                 (0x40000000)
+#define TX_DIAGNOSTIC_ADDR_AI                  (0x80000000)
+
+#define reg_TX_DIAGNOSTIC_DATA(base)           __REG32(base, 0x00000274)
+
+#define reg_TX_ERROR_STATUS(base)              __REG32(base, 0x00000278)
+#define TX_ERROR_STATUS                                (0x00000278)
+#define TX_ERROR_STATUS_QUEUE_0_ERROR_RESPONSE (0x0000000f)
+#define TX_ERROR_STATUS_TEA_ON_QUEUE_0         (0x00000010)
+#define TX_ERROR_STATUS_RER_ON_QUEUE_0         (0x00000020)
+#define TX_ERROR_STATUS_TER_ON_QUEUE_0         (0x00000040)
+#define TX_ERROR_STATUS_DER_ON_QUEUE_0         (0x00000080)
+#define TX_ERROR_STATUS_QUEUE_1_ERROR_RESPONSE (0x00000f00)
+#define TX_ERROR_STATUS_TEA_ON_QUEUE_1         (0x00001000)
+#define TX_ERROR_STATUS_RER_ON_QUEUE_1         (0x00002000)
+#define TX_ERROR_STATUS_TER_ON_QUEUE_1         (0x00004000)
+#define TX_ERROR_STATUS_DER_ON_QUEUE_1         (0x00008000)
+#define TX_ERROR_STATUS_QUEUE_2_ERROR_RESPONSE (0x000f0000)
+#define TX_ERROR_STATUS_TEA_ON_QUEUE_2         (0x00100000)
+#define TX_ERROR_STATUS_RER_ON_QUEUE_2         (0x00200000)
+#define TX_ERROR_STATUS_TER_ON_QUEUE_2         (0x00400000)
+#define TX_ERROR_STATUS_DER_ON_QUEUE_2         (0x00800000)
+#define TX_ERROR_STATUS_QUEUE_3_ERROR_RESPONSE (0x0f000000)
+#define TX_ERROR_STATUS_TEA_ON_QUEUE_3         (0x10000000)
+#define TX_ERROR_STATUS_RER_ON_QUEUE_3         (0x20000000)
+#define TX_ERROR_STATUS_TER_ON_QUEUE_3         (0x40000000)
+#define TX_ERROR_STATUS_DER_ON_QUEUE_3         (0x80000000)
+
+#define reg_TX_QUEUE_0_CONFIG(base)            __REG32(base, 0x00000280)
+#define TX_QUEUE_0_CONFIG_OCN_PORT             (0x0000003f)
+#define TX_QUEUE_0_CONFIG_BSWP                 (0x00000400)
+#define TX_QUEUE_0_CONFIG_WSWP                 (0x00000800)
+#define TX_QUEUE_0_CONFIG_AM                   (0x00004000)
+#define TX_QUEUE_0_CONFIG_GVI                  (0x00008000)
+#define TX_QUEUE_0_CONFIG_EEI                  (0x00010000)
+#define TX_QUEUE_0_CONFIG_ELI                  (0x00020000)
+#define TX_QUEUE_0_CONFIG_ENI                  (0x00040000)
+#define TX_QUEUE_0_CONFIG_ESI                  (0x00080000)
+#define TX_QUEUE_0_CONFIG_EDI                  (0x00100000)
+
+#define reg_TX_QUEUE_0_BUF_CONFIG(base)                __REG32(base, 0x00000284)
+#define TX_QUEUE_0_BUF_CONFIG_OCN_PORT         (0x0000003f)
+#define TX_QUEUE_0_BUF_CONFIG_BURST            (0x00000300)
+#define TX_QUEUE_0_BUF_CONFIG_BSWP             (0x00000400)
+#define TX_QUEUE_0_BUF_CONFIG_WSWP             (0x00000800)
+
+#define OCN_PORT_HLP                   0       /* HLP Interface */
+#define OCN_PORT_PCI_X                 1       /* PCI-X Interface */
+#define OCN_PORT_PROCESSOR_MASTER      2       /* Processor Interface (master) */
+#define OCN_PORT_PROCESSOR_SLAVE       3       /* Processor Interface (slave) */
+#define OCN_PORT_MEMORY                        4       /* Memory Controller */
+#define OCN_PORT_DMA                   5       /* DMA Controller */
+#define OCN_PORT_ETHERNET              6       /* Ethernet Controller */
+#define OCN_PORT_PRINT                 7       /* Print Engine Interface */
+
+#define reg_TX_QUEUE_0_PTR_LOW(base)           __REG32(base, 0x00000288)
+
+#define reg_TX_QUEUE_0_PTR_HIGH(base)          __REG32(base, 0x0000028c)
+#define TX_QUEUE_0_PTR_HIGH_VALID              (0x80000000)
+
+#define reg_RX_CONFIG(base)                    __REG32(base, 0x00000320)
+#define RX_CONFIG_DEF_Q                                (0x00000003)
+#define RX_CONFIG_EMF                          (0x00000100)
+#define RX_CONFIG_EUF                          (0x00000200)
+#define RX_CONFIG_BFE                          (0x00000400)
+#define RX_CONFIG_MFE                          (0x00000800)
+#define RX_CONFIG_UFE                          (0x00001000)
+#define RX_CONFIG_SE                           (0x00002000)
+#define RX_CONFIG_ABF                          (0x00200000)
+#define RX_CONFIG_APE                          (0x00400000)
+#define RX_CONFIG_CHP                          (0x00800000)
+#define RX_CONFIG_RST                          (0x80000000)
+
+#define reg_RX_CONTROL(base)                   __REG32(base, 0x00000324)
+#define GE_E0_RX_CONTROL_QUEUE_ENABLES         (0x0000000f)
+#define GE_E0_RX_CONTROL_GO                    (0x00008000)
+#define GE_E0_RX_CONTROL_EAI                   (0x20000000)
+#define GE_E0_RX_CONTROL_ABT                   (0x40000000)
+#define GE_E0_RX_CONTROL_EII                   (0x80000000)
+
+#define reg_RX_EXTENDED_STATUS(base)           __REG32(base, 0x0000032c)
+#define RX_EXTENDED_STATUS                     (0x0000032c)
+#define RX_EXTENDED_STATUS_EOQ                 (0x0000000f)
+#define RX_EXTENDED_STATUS_EOQ_0               (0x00000001)
+#define RX_EXTENDED_STATUS_EOF                 (0x00000f00)
+#define RX_EXTENDED_STATUS_DESCRIPTOR_INTERRUPT_CONDITION      (0x000f0000)
+#define RX_EXTENDED_STATUS_ERROR_FLAG                          (0x0f000000)
+
+#define reg_RX_THRESHOLDS(base)                        __REG32(base, 0x00000330)
+
+#define reg_RX_DIAGNOSTIC_ADDR(base)           __REG32(base, 0x00000370)
+#define RX_DIAGNOSTIC_ADDR_INDEX               (0x0000007f)
+#define RX_DIAGNOSTIC_ADDR_DFR                 (0x40000000)
+#define RX_DIAGNOSTIC_ADDR_AI                  (0x80000000)
+
+#define reg_RX_DIAGNOSTIC_DATA(base)           __REG32(base, 0x00000374)
+
+#define reg_RX_QUEUE_0_CONFIG(base)            __REG32(base, 0x00000380)
+#define RX_QUEUE_0_CONFIG_OCN_PORT             (0x0000003f)
+#define RX_QUEUE_0_CONFIG_BSWP                 (0x00000400)
+#define RX_QUEUE_0_CONFIG_WSWP                 (0x00000800)
+#define RX_QUEUE_0_CONFIG_AM                   (0x00004000)
+#define RX_QUEUE_0_CONFIG_EEI                  (0x00010000)
+#define RX_QUEUE_0_CONFIG_ELI                  (0x00020000)
+#define RX_QUEUE_0_CONFIG_ENI                  (0x00040000)
+#define RX_QUEUE_0_CONFIG_ESI                  (0x00080000)
+#define RX_QUEUE_0_CONFIG_EDI                  (0x00100000)
+
+#define reg_RX_QUEUE_0_BUF_CONFIG(base)                __REG32(base, 0x00000384)
+#define RX_QUEUE_0_BUF_CONFIG_OCN_PORT         (0x0000003f)
+#define RX_QUEUE_0_BUF_CONFIG_BURST            (0x00000300)
+#define RX_QUEUE_0_BUF_CONFIG_BSWP             (0x00000400)
+#define RX_QUEUE_0_BUF_CONFIG_WSWP             (0x00000800)
+
+#define reg_RX_QUEUE_0_PTR_LOW(base)           __REG32(base, 0x00000388)
+
+#define reg_RX_QUEUE_0_PTR_HIGH(base)          __REG32(base, 0x0000038c)
+#define RX_QUEUE_0_PTR_HIGH_VALID              (0x80000000)
+
+/*
+ *  PHY register definitions
+ */
+/* the first 15 PHY registers are standard. */
+#define PHY_CTRL_REG           0       /* Control Register */
+#define PHY_STATUS_REG         1       /* Status Regiser */
+#define PHY_ID1_REG            2       /* Phy Id Reg (word 1) */
+#define PHY_ID2_REG            3       /* Phy Id Reg (word 2) */
+#define PHY_AN_ADV_REG         4       /* Autoneg Advertisement */
+#define PHY_LP_ABILITY_REG     5       /* Link Partner Ability (Base Page) */
+#define PHY_AUTONEG_EXP_REG    6       /* Autoneg Expansion Reg */
+#define PHY_NEXT_PAGE_TX_REG   7       /* Next Page TX */
+#define PHY_LP_NEXT_PAGE_REG   8       /* Link Partner Next Page */
+#define PHY_1000T_CTRL_REG     9       /* 1000Base-T Control Reg */
+#define PHY_1000T_STATUS_REG   10      /* 1000Base-T Status Reg */
+#define PHY_EXT_STATUS_REG     11      /* Extended Status Reg */
+
+/*
+ * PHY Register bit masks.
+ */
+#define PHY_CTRL_RESET         (1 << 15)
+#define PHY_CTRL_LOOPBACK      (1 << 14)
+#define PHY_CTRL_SPEED0                (1 << 13)
+#define PHY_CTRL_AN_EN         (1 << 12)
+#define PHY_CTRL_PWR_DN                (1 << 11)
+#define PHY_CTRL_ISOLATE       (1 << 10)
+#define PHY_CTRL_RESTART_AN    (1 << 9)
+#define PHY_CTRL_FULL_DUPLEX   (1 << 8)
+#define PHY_CTRL_CT_EN         (1 << 7)
+#define PHY_CTRL_SPEED1                (1 << 6)
+
+#define PHY_STAT_100BASE_T4    (1 << 15)
+#define PHY_STAT_100BASE_X_FD  (1 << 14)
+#define PHY_STAT_100BASE_X_HD  (1 << 13)
+#define PHY_STAT_10BASE_T_FD   (1 << 12)
+#define PHY_STAT_10BASE_T_HD   (1 << 11)
+#define PHY_STAT_100BASE_T2_FD (1 << 10)
+#define PHY_STAT_100BASE_T2_HD (1 << 9)
+#define PHY_STAT_EXT_STAT      (1 << 8)
+#define PHY_STAT_RESERVED      (1 << 7)
+#define PHY_STAT_MFPS          (1 << 6)        /* Management Frames Preamble Suppression */
+#define PHY_STAT_AN_COMPLETE   (1 << 5)
+#define PHY_STAT_REM_FAULT     (1 << 4)
+#define PHY_STAT_AN_CAP                (1 << 3)
+#define PHY_STAT_LINK_UP       (1 << 2)
+#define PHY_STAT_JABBER                (1 << 1)
+#define PHY_STAT_EXT_CAP       (1 << 0)
+
+#define TBI_CONTROL_2                                  0x11
+#define TBI_CONTROL_2_ENABLE_COMMA_DETECT              0x0001
+#define TBI_CONTROL_2_ENABLE_WRAP                      0x0002
+#define TBI_CONTROL_2_G_MII_MODE                       0x0010
+#define TBI_CONTROL_2_RECEIVE_CLOCK_SELECT             0x0020
+#define TBI_CONTROL_2_AUTO_NEGOTIATION_SENSE           0x0100
+#define TBI_CONTROL_2_DISABLE_TRANSMIT_RUNNING_DISPARITY       0x1000
+#define TBI_CONTROL_2_DISABLE_RECEIVE_RUNNING_DISPARITY                0x2000
+#define TBI_CONTROL_2_SHORTCUT_LINK_TIMER                      0x4000
+#define TBI_CONTROL_2_SOFT_RESET                               0x8000
+
+/* marvel specific */
+#define MV1111_EXT_CTRL1_REG   16      /* PHY Specific Control Reg */
+#define MV1111_SPEC_STAT_REG   17      /* PHY Specific Status Reg */
+#define MV1111_EXT_CTRL2_REG   20      /* Extended PHY Specific Control Reg */
+
+/*
+ * MARVELL 88E1111 PHY register bit masks
+ */
+/* PHY Specific Status Register (MV1111_EXT_CTRL1_REG) */
+
+#define SPEC_STAT_SPEED_MASK   (3 << 14)
+#define SPEC_STAT_FULL_DUP     (1 << 13)
+#define SPEC_STAT_PAGE_RCVD    (1 << 12)
+#define SPEC_STAT_RESOLVED     (1 << 11)       /* Speed and Duplex Resolved */
+#define SPEC_STAT_LINK_UP      (1 << 10)
+#define SPEC_STAT_CABLE_LEN_MASK       (7 << 7)/* Cable Length (100/1000 modes only) */
+#define SPEC_STAT_MDIX         (1 << 6)
+#define SPEC_STAT_POLARITY     (1 << 1)
+#define SPEC_STAT_JABBER       (1 << 0)
+
+#define SPEED_1000             (2 << 14)
+#define SPEED_100              (1 << 14)
+#define SPEED_10               (0 << 14)
+
+#define TBI_ADDR       0x1E    /* Ten Bit Interface address */
+
+/* negotiated link parameters */
+#define LINK_SPEED_UNKNOWN     0
+#define LINK_SPEED_10          1
+#define LINK_SPEED_100         2
+#define LINK_SPEED_1000                3
+
+#define LINK_DUPLEX_UNKNOWN    0
+#define LINK_DUPLEX_HALF       1
+#define LINK_DUPLEX_FULL       2
+
+static unsigned int phy_address[] = { 8, 9 };
+
+#define vuint32 volatile u32
+
+/* TX/RX buffer descriptors. MUST be cache line aligned in memory. (32 byte)
+ * This structure is accessed by the ethernet DMA engine which means it
+ * MUST be in LITTLE ENDIAN format */
+struct dma_descriptor {
+       vuint32 start_addr0;    /* buffer address, least significant bytes. */
+       vuint32 start_addr1;    /* buffer address, most significant bytes. */
+       vuint32 next_descr_addr0;/* next descriptor address, least significant bytes.  Must be 64-bit aligned. */
+       vuint32 next_descr_addr1;/* next descriptor address, most significant bytes. */
+       vuint32 vlan_byte_count;/* VLAN tag(top 2 bytes) and byte countt (bottom 2 bytes). */
+       vuint32 config_status;  /* Configuration/Status. */
+       vuint32 reserved1;      /* reserved to make the descriptor cache line aligned. */
+       vuint32 reserved2;      /* reserved to make the descriptor cache line aligned. */
+};
+
+/* last next descriptor address flag */
+#define DMA_DESCR_LAST         (1 << 31)
+
+/* TX DMA descriptor config status bits */
+#define DMA_DESCR_TX_EOF       (1 <<  0)       /* end of frame */
+#define DMA_DESCR_TX_SOF       (1 <<  1)       /* start of frame */
+#define DMA_DESCR_TX_PFVLAN    (1 <<  2)
+#define DMA_DESCR_TX_HUGE      (1 <<  3)
+#define DMA_DESCR_TX_PAD       (1 <<  4)
+#define DMA_DESCR_TX_CRC       (1 <<  5)
+#define DMA_DESCR_TX_DESCR_INT (1 << 14)
+#define DMA_DESCR_TX_RETRY_COUNT       0x000F0000
+#define DMA_DESCR_TX_ONE_COLLISION     (1 << 20)
+#define DMA_DESCR_TX_LATE_COLLISION    (1 << 24)
+#define DMA_DESCR_TX_UNDERRUN          (1 << 25)
+#define DMA_DESCR_TX_RETRY_LIMIT       (1 << 26)
+#define DMA_DESCR_TX_OK                        (1 << 30)
+#define DMA_DESCR_TX_OWNER             (1 << 31)
+
+/* RX DMA descriptor status bits */
+#define DMA_DESCR_RX_EOF               (1 <<  0)
+#define DMA_DESCR_RX_SOF               (1 <<  1)
+#define DMA_DESCR_RX_VTF               (1 <<  2)
+#define DMA_DESCR_RX_FRAME_IS_TYPE     (1 <<  3)
+#define DMA_DESCR_RX_SHORT_FRAME       (1 <<  4)
+#define DMA_DESCR_RX_HASH_MATCH                (1 <<  7)
+#define DMA_DESCR_RX_BAD_FRAME         (1 <<  8)
+#define DMA_DESCR_RX_OVERRUN           (1 <<  9)
+#define DMA_DESCR_RX_MAX_FRAME_LEN     (1 << 11)
+#define DMA_DESCR_RX_CRC_ERROR         (1 << 12)
+#define DMA_DESCR_RX_DESCR_INT         (1 << 13)
+#define DMA_DESCR_RX_OWNER             (1 << 15)
+
+#define RX_BUFFER_SIZE PKTSIZE
+#define NUM_RX_DESC    PKTBUFSRX
+
+static struct dma_descriptor tx_descriptor __attribute__ ((aligned(32)));
+
+static struct dma_descriptor rx_descr_array[NUM_RX_DESC]
+       __attribute__ ((aligned(32)));
+
+static struct dma_descriptor *rx_descr_current;
+
+static int tsi108_eth_probe (struct eth_device *dev, bd_t * bis);
+static int tsi108_eth_send (struct eth_device *dev,
+                          volatile void *packet, int length);
+static int tsi108_eth_recv (struct eth_device *dev);
+static void tsi108_eth_halt (struct eth_device *dev);
+static unsigned int read_phy (unsigned int base,
+                            unsigned int phy_addr, unsigned int phy_reg);
+static void write_phy (unsigned int base,
+                     unsigned int phy_addr,
+                     unsigned int phy_reg, unsigned int phy_data);
+
+#if TSI108_ETH_DEBUG > 100
+/*
+ * print phy debug infomation
+ */
+static void dump_phy_regs (unsigned int phy_addr)
+{
+       int i;
+
+       printf ("PHY %d registers\n", phy_addr);
+       for (i = 0; i <= 30; i++) {
+               printf ("%2d  0x%04x\n", i, read_phy (ETH_BASE, phy_addr, i));
+       }
+       printf ("\n");
+
+}
+#else
+#define dump_phy_regs(base) do{}while(0)
+#endif
+
+#if TSI108_ETH_DEBUG > 100
+/*
+ * print debug infomation
+ */
+static void tx_diag_regs (unsigned int base)
+{
+       int i;
+       unsigned long dummy;
+
+       printf ("TX diagnostics registers\n");
+       reg_TX_DIAGNOSTIC_ADDR(base) = 0x00 | TX_DIAGNOSTIC_ADDR_AI;
+       udelay (1000);
+       dummy = reg_TX_DIAGNOSTIC_DATA(base);
+       for (i = 0x00; i <= 0x05; i++) {
+               udelay (1000);
+               printf ("0x%02x  0x%08x\n", i, reg_TX_DIAGNOSTIC_DATA(base));
+       }
+       reg_TX_DIAGNOSTIC_ADDR(base) = 0x40 | TX_DIAGNOSTIC_ADDR_AI;
+       udelay (1000);
+       dummy = reg_TX_DIAGNOSTIC_DATA(base);
+       for (i = 0x40; i <= 0x47; i++) {
+               udelay (1000);
+               printf ("0x%02x  0x%08x\n", i, reg_TX_DIAGNOSTIC_DATA(base));
+       }
+       printf ("\n");
+
+}
+#else
+#define tx_diag_regs(base) do{}while(0)
+#endif
+
+#if TSI108_ETH_DEBUG > 100
+/*
+ * print debug infomation
+ */
+static void rx_diag_regs (unsigned int base)
+{
+       int i;
+       unsigned long dummy;
+
+       printf ("RX diagnostics registers\n");
+       reg_RX_DIAGNOSTIC_ADDR(base) = 0x00 | RX_DIAGNOSTIC_ADDR_AI;
+       udelay (1000);
+       dummy = reg_RX_DIAGNOSTIC_DATA(base);
+       for (i = 0x00; i <= 0x05; i++) {
+               udelay (1000);
+               printf ("0x%02x  0x%08x\n", i, reg_RX_DIAGNOSTIC_DATA(base));
+       }
+       reg_RX_DIAGNOSTIC_ADDR(base) = 0x40 | RX_DIAGNOSTIC_ADDR_AI;
+       udelay (1000);
+       dummy = reg_RX_DIAGNOSTIC_DATA(base);
+       for (i = 0x08; i <= 0x0a; i++) {
+               udelay (1000);
+               printf ("0x%02x  0x%08x\n", i, reg_RX_DIAGNOSTIC_DATA(base));
+       }
+       printf ("\n");
+
+}
+#else
+#define rx_diag_regs(base) do{}while(0)
+#endif
+
+#if TSI108_ETH_DEBUG > 100
+/*
+ * print debug infomation
+ */
+static void debug_mii_regs (unsigned int base)
+{
+       printf ("MII_MGMT_CONFIG     0x%08x\n", reg_MII_MGMT_CONFIG(base));
+       printf ("MII_MGMT_COMMAND    0x%08x\n", reg_MII_MGMT_COMMAND(base));
+       printf ("MII_MGMT_ADDRESS    0x%08x\n", reg_MII_MGMT_ADDRESS(base));
+       printf ("MII_MGMT_CONTROL    0x%08x\n", reg_MII_MGMT_CONTROL(base));
+       printf ("MII_MGMT_STATUS     0x%08x\n", reg_MII_MGMT_STATUS(base));
+       printf ("MII_MGMT_INDICATORS 0x%08x\n", reg_MII_MGMT_INDICATORS(base));
+       printf ("\n");
+
+}
+#else
+#define debug_mii_regs(base) do{}while(0)
+#endif
+
+/*
+ * Wait until the phy bus is non-busy
+ */
+static void phy_wait (unsigned int base, unsigned int condition)
+{
+       int timeout;
+
+       timeout = 0;
+       while (reg_MII_MGMT_INDICATORS(base) & condition) {
+               udelay (10);
+               if (++timeout > 10000) {
+                       printf ("ERROR: timeout waiting for phy bus (%d)\n",
+                              condition);
+                       break;
+               }
+       }
+}
+
+/*
+ * read phy register
+ */
+static unsigned int read_phy (unsigned int base,
+                            unsigned int phy_addr, unsigned int phy_reg)
+{
+       unsigned int value;
+
+       phy_wait (base, MII_MGMT_INDICATORS_BUSY);
+
+       reg_MII_MGMT_ADDRESS(base) = (phy_addr << 8) | phy_reg;
+
+       /* Ensure that the Read Cycle bit is cleared prior to next read cycle */
+       reg_MII_MGMT_COMMAND(base) = 0;
+
+       /* start the read */
+       reg_MII_MGMT_COMMAND(base) = MII_MGMT_COMMAND_READ_CYCLE;
+
+       /* wait for the read to complete */
+       phy_wait (base,
+                MII_MGMT_INDICATORS_NOT_VALID | MII_MGMT_INDICATORS_BUSY);
+
+       value = reg_MII_MGMT_STATUS(base);
+
+       reg_MII_MGMT_COMMAND(base) = 0;
+
+       return value;
+}
+
+/*
+ * write phy register
+ */
+static void write_phy (unsigned int base,
+                     unsigned int phy_addr,
+                     unsigned int phy_reg, unsigned int phy_data)
+{
+       phy_wait (base, MII_MGMT_INDICATORS_BUSY);
+
+       reg_MII_MGMT_ADDRESS(base) = (phy_addr << 8) | phy_reg;
+
+       /* Ensure that the Read Cycle bit is cleared prior to next cycle */
+       reg_MII_MGMT_COMMAND(base) = 0;
+
+       /* start the write */
+       reg_MII_MGMT_CONTROL(base) = phy_data;
+}
+
+/*
+ * configure the marvell 88e1111 phy
+ */
+static int marvell_88e_phy_config (struct eth_device *dev, int *speed,
+                                 int *duplex)
+{
+       unsigned long base;
+       unsigned long phy_addr;
+       unsigned int phy_status;
+       unsigned int phy_spec_status;
+       int timeout;
+       int phy_speed;
+       int phy_duplex;
+       unsigned int value;
+
+       phy_speed = LINK_SPEED_UNKNOWN;
+       phy_duplex = LINK_DUPLEX_UNKNOWN;
+
+       base = dev->iobase;
+       phy_addr = (unsigned long)dev->priv;
+
+       /* Take the PHY out of reset. */
+       write_phy (ETH_BASE, phy_addr, PHY_CTRL_REG, PHY_CTRL_RESET);
+
+       /* Wait for the reset process to complete. */
+       udelay (10);
+       timeout = 0;
+       while ((phy_status =
+               read_phy (ETH_BASE, phy_addr, PHY_CTRL_REG)) & PHY_CTRL_RESET) {
+               udelay (10);
+               if (++timeout > 10000) {
+                       printf ("ERROR: timeout waiting for phy reset\n");
+                       break;
+               }
+       }
+
+       /* TBI Configuration. */
+       write_phy (base, TBI_ADDR, TBI_CONTROL_2, TBI_CONTROL_2_G_MII_MODE |
+                 TBI_CONTROL_2_RECEIVE_CLOCK_SELECT);
+       /* Wait for the link to be established. */
+       timeout = 0;
+       do {
+               udelay (20000);
+               phy_status = read_phy (ETH_BASE, phy_addr, PHY_STATUS_REG);
+               if (++timeout > 100) {
+                       debug_lev(1, "ERROR: unable to establish link!!!\n");
+                       break;
+               }
+       } while ((phy_status & PHY_STAT_LINK_UP) == 0);
+
+       if ((phy_status & PHY_STAT_LINK_UP) == 0)
+               return 0;
+
+       value = 0;
+       phy_spec_status = read_phy (ETH_BASE, phy_addr, MV1111_SPEC_STAT_REG);
+       if (phy_spec_status & SPEC_STAT_RESOLVED) {
+               switch (phy_spec_status & SPEC_STAT_SPEED_MASK) {
+               case SPEED_1000:
+                       phy_speed = LINK_SPEED_1000;
+                       value |= PHY_CTRL_SPEED1;
+                       break;
+               case SPEED_100:
+                       phy_speed = LINK_SPEED_100;
+                       value |= PHY_CTRL_SPEED0;
+                       break;
+               case SPEED_10:
+                       phy_speed = LINK_SPEED_10;
+                       break;
+               }
+               if (phy_spec_status & SPEC_STAT_FULL_DUP) {
+                       phy_duplex = LINK_DUPLEX_FULL;
+                       value |= PHY_CTRL_FULL_DUPLEX;
+               } else
+                       phy_duplex = LINK_DUPLEX_HALF;
+       }
+       /* set TBI speed */
+       write_phy (base, TBI_ADDR, PHY_CTRL_REG, value);
+       write_phy (base, TBI_ADDR, PHY_AN_ADV_REG, 0x0060);
+
+#if TSI108_ETH_DEBUG > 0
+       printf ("%s link is up", dev->name);
+       phy_spec_status = read_phy (ETH_BASE, phy_addr, MV1111_SPEC_STAT_REG);
+       if (phy_spec_status & SPEC_STAT_RESOLVED) {
+               switch (phy_speed) {
+               case LINK_SPEED_1000:
+                       printf (", 1000 Mbps");
+                       break;
+               case LINK_SPEED_100:
+                       printf (", 100 Mbps");
+                       break;
+               case LINK_SPEED_10:
+                       printf (", 10 Mbps");
+                       break;
+               }
+               if (phy_duplex == LINK_DUPLEX_FULL)
+                       printf (", Full duplex");
+               else
+                       printf (", Half duplex");
+       }
+       printf ("\n");
+#endif
+
+       dump_phy_regs (TBI_ADDR);
+       if (speed)
+               *speed = phy_speed;
+       if (duplex)
+               *duplex = phy_duplex;
+
+       return 1;
+}
+
+/*
+ * External interface
+ *
+ * register the tsi108 ethernet controllers with the multi-ethernet system
+ */
+int tsi108_eth_initialize (bd_t * bis)
+{
+       struct eth_device *dev;
+       int index;
+
+       for (index = 0; index < CONFIG_TSI108_ETH_NUM_PORTS; index++) {
+               dev = (struct eth_device *)malloc(sizeof(struct eth_device));
+
+               sprintf (dev->name, "TSI108_eth%d", index);
+
+               dev->iobase = ETH_BASE + (index * ETH_PORT_OFFSET);
+               dev->priv = (void *)(phy_address[index]);
+               dev->init = tsi108_eth_probe;
+               dev->halt = tsi108_eth_halt;
+               dev->send = tsi108_eth_send;
+               dev->recv = tsi108_eth_recv;
+
+               eth_register(dev);
+       }
+       return index;
+}
+
+/*
+ * probe for and initialize a single ethernet interface
+ */
+static int tsi108_eth_probe (struct eth_device *dev, bd_t * bis)
+{
+       unsigned long base;
+       unsigned long value;
+       int index;
+       struct dma_descriptor *tx_descr;
+       struct dma_descriptor *rx_descr;
+       int speed;
+       int duplex;
+
+       base = dev->iobase;
+
+       reg_PORT_CONTROL(base) = PORT_CONTROL_STE | PORT_CONTROL_BPT;
+
+       /* Bring DMA/FIFO out of reset. */
+       reg_TX_CONFIG(base) = 0x00000000;
+       reg_RX_CONFIG(base) = 0x00000000;
+
+       reg_TX_THRESHOLDS(base) = (192 << 16) | 192;
+       reg_RX_THRESHOLDS(base) = (192 << 16) | 112;
+
+       /* Bring MAC out of reset. */
+       reg_MAC_CONFIG_1(base) = 0x00000000;
+
+       /* DMA MAC configuration. */
+       reg_MAC_CONFIG_1(base) =
+           MAC_CONFIG_1_RX_ENABLE | MAC_CONFIG_1_TX_ENABLE;
+
+       reg_MII_MGMT_CONFIG(base) = MII_MGMT_CONFIG_NO_PREAMBLE;
+       reg_MAXIMUM_FRAME_LENGTH(base) = RX_BUFFER_SIZE;
+
+       /* Note: Early tsi108 manual did not have correct byte order
+        * for the station address.*/
+       reg_STATION_ADDRESS_1(base) = (dev->enetaddr[5] << 24) |
+           (dev->enetaddr[4] << 16) |
+           (dev->enetaddr[3] << 8) | (dev->enetaddr[2] << 0);
+
+       reg_STATION_ADDRESS_2(base) = (dev->enetaddr[1] << 24) |
+           (dev->enetaddr[0] << 16);
+
+       if (marvell_88e_phy_config(dev, &speed, &duplex) == 0)
+               return 0;
+
+       value =
+           MAC_CONFIG_2_PREAMBLE_LENGTH(7) | MAC_CONFIG_2_PAD_CRC |
+           MAC_CONFIG_2_CRC_ENABLE;
+       if (speed == LINK_SPEED_1000)
+               value |= MAC_CONFIG_2_INTERFACE_MODE(INTERFACE_MODE_BYTE);
+       else {
+               value |= MAC_CONFIG_2_INTERFACE_MODE(INTERFACE_MODE_NIBBLE);
+               reg_PORT_CONTROL(base) |= PORT_CONTROL_SPD;
+       }
+       if (duplex == LINK_DUPLEX_FULL) {
+               value |= MAC_CONFIG_2_FULL_DUPLEX;
+               reg_PORT_CONTROL(base) &= ~PORT_CONTROL_BPT;
+       } else
+               reg_PORT_CONTROL(base) |= PORT_CONTROL_BPT;
+       reg_MAC_CONFIG_2(base) = value;
+
+       reg_RX_CONFIG(base) = RX_CONFIG_SE;
+       reg_RX_QUEUE_0_CONFIG(base) = OCN_PORT_MEMORY;
+       reg_RX_QUEUE_0_BUF_CONFIG(base) = OCN_PORT_MEMORY;
+
+       /* initialize the RX DMA descriptors */
+       rx_descr = &rx_descr_array[0];
+       rx_descr_current = rx_descr;
+       for (index = 0; index < NUM_RX_DESC; index++) {
+               /* make sure the receive buffers are not in cache */
+               invalidate_dcache_range((unsigned long)NetRxPackets[index],
+                                       (unsigned long)NetRxPackets[index] +
+                                       RX_BUFFER_SIZE);
+               rx_descr->start_addr0 =
+                   cpu_to_le32((vuint32) NetRxPackets[index]);
+               rx_descr->start_addr1 = 0;
+               rx_descr->next_descr_addr0 =
+                   cpu_to_le32((vuint32) (rx_descr + 1));
+               rx_descr->next_descr_addr1 = 0;
+               rx_descr->vlan_byte_count = 0;
+               rx_descr->config_status = cpu_to_le32((RX_BUFFER_SIZE << 16) |
+                                                     DMA_DESCR_RX_OWNER);
+               rx_descr++;
+       }
+       rx_descr--;
+       rx_descr->next_descr_addr0 = 0;
+       rx_descr->next_descr_addr1 = cpu_to_le32(DMA_DESCR_LAST);
+       /* Push the descriptors to RAM so the ethernet DMA can see them */
+       invalidate_dcache_range((unsigned long)rx_descr_array,
+                               (unsigned long)rx_descr_array +
+                               sizeof(rx_descr_array));
+
+       /* enable RX queue */
+       reg_RX_CONTROL(base) = TX_CONTROL_GO | 0x01;
+       reg_RX_QUEUE_0_PTR_LOW(base) = (u32) rx_descr_current;
+       /* enable receive DMA */
+       reg_RX_QUEUE_0_PTR_HIGH(base) = RX_QUEUE_0_PTR_HIGH_VALID;
+
+       reg_TX_QUEUE_0_CONFIG(base) = OCN_PORT_MEMORY;
+       reg_TX_QUEUE_0_BUF_CONFIG(base) = OCN_PORT_MEMORY;
+
+       /* initialize the TX DMA descriptor */
+       tx_descr = &tx_descriptor;
+
+       tx_descr->start_addr0 = 0;
+       tx_descr->start_addr1 = 0;
+       tx_descr->next_descr_addr0 = 0;
+       tx_descr->next_descr_addr1 = cpu_to_le32(DMA_DESCR_LAST);
+       tx_descr->vlan_byte_count = 0;
+       tx_descr->config_status = cpu_to_le32(DMA_DESCR_TX_OK |
+                                             DMA_DESCR_TX_SOF |
+                                             DMA_DESCR_TX_EOF);
+       /* enable TX queue */
+       reg_TX_CONTROL(base) = TX_CONTROL_GO | 0x01;
+
+       return 1;
+}
+
+/*
+ * send a packet
+ */
+static int tsi108_eth_send (struct eth_device *dev,
+                          volatile void *packet, int length)
+{
+       unsigned long base;
+       int timeout;
+       struct dma_descriptor *tx_descr;
+       unsigned long status;
+
+       base = dev->iobase;
+       tx_descr = &tx_descriptor;
+
+       /* Wait until the last packet has been transmitted. */
+       timeout = 0;
+       do {
+               /* make sure we see the changes made by the DMA engine */
+               invalidate_dcache_range((unsigned long)tx_descr,
+                                       (unsigned long)tx_descr +
+                                       sizeof(struct dma_descriptor));
+
+               if (timeout != 0)
+                       udelay (15);
+               if (++timeout > 10000) {
+                       tx_diag_regs(base);
+                       debug_lev(1,
+                                 "ERROR: timeout waiting for last transmit packet to be sent\n");
+                       return 0;
+               }
+       } while (tx_descr->config_status & cpu_to_le32(DMA_DESCR_TX_OWNER));
+
+       status = le32_to_cpu(tx_descr->config_status);
+       if ((status & DMA_DESCR_TX_OK) == 0) {
+#ifdef TX_PRINT_ERRORS
+               printf ("TX packet error: 0x%08x\n    %s%s%s%s\n", status,
+                      status & DMA_DESCR_TX_OK ? "tx error, " : "",
+                      status & DMA_DESCR_TX_RETRY_LIMIT ?
+                      "retry limit reached, " : "",
+                      status & DMA_DESCR_TX_UNDERRUN ? "underrun, " : "",
+                      status & DMA_DESCR_TX_LATE_COLLISION ? "late collision, "
+                      : "");
+#endif
+       }
+
+       debug_lev (9, "sending packet %d\n", length);
+       tx_descr->start_addr0 = cpu_to_le32((vuint32) packet);
+       tx_descr->start_addr1 = 0;
+       tx_descr->next_descr_addr0 = 0;
+       tx_descr->next_descr_addr1 = cpu_to_le32(DMA_DESCR_LAST);
+       tx_descr->vlan_byte_count = cpu_to_le32(length);
+       tx_descr->config_status = cpu_to_le32(DMA_DESCR_TX_OWNER |
+                                             DMA_DESCR_TX_CRC |
+                                             DMA_DESCR_TX_PAD |
+                                             DMA_DESCR_TX_SOF |
+                                             DMA_DESCR_TX_EOF);
+
+       invalidate_dcache_range((unsigned long)tx_descr,
+                               (unsigned long)tx_descr +
+                               sizeof(struct dma_descriptor));
+
+       invalidate_dcache_range((unsigned long)packet,
+                               (unsigned long)packet + length);
+
+       reg_TX_QUEUE_0_PTR_LOW(base) = (u32) tx_descr;
+       reg_TX_QUEUE_0_PTR_HIGH(base) = TX_QUEUE_0_PTR_HIGH_VALID;
+
+       return length;
+}
+
+/*
+ * Check for received packets and send them up the protocal stack
+ */
+static int tsi108_eth_recv (struct eth_device *dev)
+{
+       struct dma_descriptor *rx_descr;
+       unsigned long base;
+       int length = 0;
+       unsigned long status;
+       volatile uchar *buffer;
+
+       base = dev->iobase;
+
+       /* make sure we see the changes made by the DMA engine */
+       invalidate_dcache_range ((unsigned long)rx_descr_array,
+                               (unsigned long)rx_descr_array +
+                               sizeof(rx_descr_array));
+
+       /* process all of the received packets */
+       rx_descr = rx_descr_current;
+       while ((rx_descr->config_status & cpu_to_le32(DMA_DESCR_RX_OWNER)) == 0) {
+               /* check for error */
+               status = le32_to_cpu(rx_descr->config_status);
+               if (status & DMA_DESCR_RX_BAD_FRAME) {
+#ifdef RX_PRINT_ERRORS
+                       printf ("RX packet error: 0x%08x\n    %s%s%s%s%s%s\n",
+                              status,
+                              status & DMA_DESCR_RX_FRAME_IS_TYPE ? "too big, "
+                              : "",
+                              status & DMA_DESCR_RX_SHORT_FRAME ? "too short, "
+                              : "",
+                              status & DMA_DESCR_RX_BAD_FRAME ? "bad frame, " :
+                              "",
+                              status & DMA_DESCR_RX_OVERRUN ? "overrun, " : "",
+                              status & DMA_DESCR_RX_MAX_FRAME_LEN ?
+                              "max length, " : "",
+                              status & DMA_DESCR_RX_CRC_ERROR ? "CRC error, " :
+                              "");
+#endif
+               } else {
+                       length =
+                           le32_to_cpu(rx_descr->vlan_byte_count) & 0xFFFF;
+
+                       /*** process packet ***/
+                       buffer =
+                           (volatile uchar
+                            *)(le32_to_cpu (rx_descr->start_addr0));
+                       NetReceive (buffer, length);
+
+                       invalidate_dcache_range ((unsigned long)buffer,
+                                               (unsigned long)buffer +
+                                               RX_BUFFER_SIZE);
+               }
+               /* Give this buffer back to the DMA engine */
+               rx_descr->vlan_byte_count = 0;
+               rx_descr->config_status = cpu_to_le32 ((RX_BUFFER_SIZE << 16) |
+                                                     DMA_DESCR_RX_OWNER);
+               /* move descriptor pointer forward */
+               rx_descr =
+                   (struct dma_descriptor
+                    *)(le32_to_cpu (rx_descr->next_descr_addr0));
+               if (rx_descr == 0)
+                       rx_descr = &rx_descr_array[0];
+       }
+       /* remember where we are for next time */
+       rx_descr_current = rx_descr;
+
+       /* If the DMA engine has reached the end of the queue
+        * start over at the begining */
+       if (reg_RX_EXTENDED_STATUS(base) & RX_EXTENDED_STATUS_EOQ_0) {
+
+               reg_RX_EXTENDED_STATUS(base) = RX_EXTENDED_STATUS_EOQ_0;
+               reg_RX_QUEUE_0_PTR_LOW(base) = (u32) & rx_descr_array[0];
+               reg_RX_QUEUE_0_PTR_HIGH(base) = RX_QUEUE_0_PTR_HIGH_VALID;
+       }
+
+       return length;
+}
+
+/*
+ * disable an ethernet interface
+ */
+static void tsi108_eth_halt (struct eth_device *dev)
+{
+       unsigned long base;
+
+       base = dev->iobase;
+
+       /* Put DMA/FIFO into reset state. */
+       reg_TX_CONFIG(base) = TX_CONFIG_RST;
+       reg_RX_CONFIG(base) = RX_CONFIG_RST;
+
+       /* Put MAC into reset state. */
+       reg_MAC_CONFIG_1(base) = MAC_CONFIG_1_SOFT_RESET;
+}
+
+#endif
diff --git a/drivers/tsi108_i2c.c b/drivers/tsi108_i2c.c
new file mode 100644 (file)
index 0000000..eb52cb6
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * (C) Copyright 2004 Tundra Semiconductor Corp.
+ * Author: Alex Bounine
+ *
+ * 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>
+#include <common.h>
+
+#ifdef CONFIG_TSI108_I2C
+#include <tsi108.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_I2C)
+
+#define I2C_DELAY      100000
+#undef  DEBUG_I2C
+
+#ifdef DEBUG_I2C
+#define DPRINT(x) printf (x)
+#else
+#define DPRINT(x)
+#endif
+
+/* All functions assume that Tsi108 I2C block is the only master on the bus */
+/* I2C read helper function */
+
+static int i2c_read_byte (
+               uint i2c_chan,  /* I2C channel number: 0 - main, 1 - SDC SPD */
+               uchar chip_addr,/* I2C device address on the bus */
+               uint byte_addr, /* Byte address within I2C device */
+               uchar * buffer  /* pointer to data buffer */
+               )
+{
+       u32 temp;
+       u32 to_count = I2C_DELAY;
+       u32 op_status = TSI108_I2C_TIMEOUT_ERR;
+       u32 chan_offset = TSI108_I2C_OFFSET;
+
+       DPRINT (("I2C read_byte() %d 0x%02x 0x%02x\n",
+               i2c_chan, chip_addr, byte_addr));
+
+       if (0 != i2c_chan)
+               chan_offset = TSI108_I2C_SDRAM_OFFSET;
+
+       /* Check if I2C operation is in progress */
+       temp = *(u32 *) (CFG_TSI108_CSR_BASE + chan_offset + I2C_CNTRL2);
+
+       if (0 == (temp & (I2C_CNTRL2_RD_STATUS | I2C_CNTRL2_WR_STATUS |
+                         I2C_CNTRL2_START))) {
+               /* Set device address and operation (read = 0) */
+               temp = (byte_addr << 16) | ((chip_addr & 0x07) << 8) |
+                   ((chip_addr >> 3) & 0x0F);
+               *(u32 *) (CFG_TSI108_CSR_BASE + chan_offset + I2C_CNTRL1) =
+                   temp;
+
+               /* Issue the read command
+                * (at this moment all other parameters are 0
+                * (size = 1 byte, lane = 0)
+                */
+
+               *(u32 *) (CFG_TSI108_CSR_BASE + chan_offset + I2C_CNTRL2) =
+                   (I2C_CNTRL2_START);
+
+               /* Wait until operation completed */
+               do {
+                       /* Read I2C operation status */
+                       temp = *(u32 *) (CFG_TSI108_CSR_BASE + chan_offset + I2C_CNTRL2);
+
+                       if (0 == (temp & (I2C_CNTRL2_RD_STATUS | I2C_CNTRL2_START))) {
+                               if (0 == (temp &
+                                    (I2C_CNTRL2_I2C_CFGERR |
+                                     I2C_CNTRL2_I2C_TO_ERR))
+                                   ) {
+                                       op_status = TSI108_I2C_SUCCESS;
+
+                                       temp = *(u32 *) (CFG_TSI108_CSR_BASE +
+                                                        chan_offset +
+                                                        I2C_RD_DATA);
+
+                                       *buffer = (u8) (temp & 0xFF);
+                               } else {
+                                       /* report HW error */
+                                       op_status = TSI108_I2C_IF_ERROR;
+
+                                       DPRINT (("I2C HW error reported: 0x%02x\n", temp));
+                               }
+
+                               break;
+                       }
+               } while (to_count--);
+       } else {
+               op_status = TSI108_I2C_IF_BUSY;
+
+               DPRINT (("I2C Transaction start failed: 0x%02x\n", temp));
+       }
+
+       DPRINT (("I2C read_byte() status: 0x%02x\n", op_status));
+       return op_status;
+}
+
+/*
+ * I2C Read interface as defined in "include/i2c.h" :
+ *   chip_addr: I2C chip address, range 0..127
+ *                  (to read from SPD channel EEPROM use (0xD0 ... 0xD7)
+ *              NOTE: The bit 7 in the chip_addr serves as a channel select.
+ *              This hack is for enabling "isdram" command on Tsi108 boards
+ *              without changes to common code. Used for I2C reads only.
+ *   byte_addr: Memory or register address within the chip
+ *   alen:      Number of bytes to use for addr (typically 1, 2 for larger
+ *              memories, 0 for register type devices with only one
+ *              register)
+ *   buffer:    Pointer to destination buffer for data to be read
+ *   len:       How many bytes to read
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+
+int i2c_read (uchar chip_addr, uint byte_addr, int alen,
+               uchar * buffer, int len)
+{
+       u32 op_status = TSI108_I2C_PARAM_ERR;
+       u32 i2c_if = 0;
+
+       /* Hack to support second (SPD) I2C controller (SPD EEPROM read only).*/
+       if (0xD0 == (chip_addr & ~0x07)) {
+               i2c_if = 1;
+               chip_addr &= 0x7F;
+       }
+       /* Check for valid I2C address */
+       if (chip_addr <= 0x7F && (byte_addr + len) <= (0x01 << (alen * 8))) {
+               while (len--) {
+                       op_status = i2c_read_byte(i2c_if, chip_addr, byte_addr++, buffer++);
+
+                       if (TSI108_I2C_SUCCESS != op_status) {
+                               DPRINT (("I2C read_byte() failed: 0x%02x (%d left)\n", op_status, len));
+
+                               break;
+                       }
+               }
+       }
+
+       DPRINT (("I2C read() status: 0x%02x\n", op_status));
+       return op_status;
+}
+
+/* I2C write helper function */
+
+static int i2c_write_byte (uchar chip_addr,/* I2C device address on the bus */
+                         uint byte_addr, /* Byte address within I2C device */
+                         uchar * buffer  /*  pointer to data buffer */
+                         )
+{
+       u32 temp;
+       u32 to_count = I2C_DELAY;
+       u32 op_status = TSI108_I2C_TIMEOUT_ERR;
+
+       /* Check if I2C operation is in progress */
+       temp = *(u32 *) (CFG_TSI108_CSR_BASE + TSI108_I2C_OFFSET + I2C_CNTRL2);
+
+       if (0 == (temp & (I2C_CNTRL2_RD_STATUS | I2C_CNTRL2_WR_STATUS | I2C_CNTRL2_START))) {
+               /* Place data into the I2C Tx Register */
+               *(u32 *) (CFG_TSI108_CSR_BASE + TSI108_I2C_OFFSET +
+                         I2C_TX_DATA) = (u32) * buffer;
+
+               /* Set device address and operation  */
+               temp =
+                   I2C_CNTRL1_I2CWRITE | (byte_addr << 16) |
+                   ((chip_addr & 0x07) << 8) | ((chip_addr >> 3) & 0x0F);
+               *(u32 *) (CFG_TSI108_CSR_BASE + TSI108_I2C_OFFSET +
+                         I2C_CNTRL1) = temp;
+
+               /* Issue the write command (at this moment all other parameters
+                * are 0 (size = 1 byte, lane = 0)
+                */
+
+               *(u32 *) (CFG_TSI108_CSR_BASE + TSI108_I2C_OFFSET +
+                         I2C_CNTRL2) = (I2C_CNTRL2_START);
+
+               op_status = TSI108_I2C_TIMEOUT_ERR;
+
+               /* Wait until operation completed */
+               do {
+                       /* Read I2C operation status */
+                       temp = *(u32 *) (CFG_TSI108_CSR_BASE + TSI108_I2C_OFFSET + I2C_CNTRL2);
+
+                       if (0 == (temp & (I2C_CNTRL2_WR_STATUS | I2C_CNTRL2_START))) {
+                               if (0 == (temp &
+                                    (I2C_CNTRL2_I2C_CFGERR |
+                                     I2C_CNTRL2_I2C_TO_ERR))) {
+                                       op_status = TSI108_I2C_SUCCESS;
+                               } else {
+                                       /* report detected HW error */
+                                       op_status = TSI108_I2C_IF_ERROR;
+
+                                       DPRINT (("I2C HW error reported: 0x%02x\n", temp));
+                               }
+
+                               break;
+                       }
+
+               } while (to_count--);
+       } else {
+               op_status = TSI108_I2C_IF_BUSY;
+
+               DPRINT (("I2C Transaction start failed: 0x%02x\n", temp));
+       }
+
+       return op_status;
+}
+
+/*
+ * I2C Write interface as defined in "include/i2c.h" :
+ *   chip_addr: I2C chip address, range 0..127
+ *   byte_addr: Memory or register address within the chip
+ *   alen:      Number of bytes to use for addr (typically 1, 2 for larger
+ *              memories, 0 for register type devices with only one
+ *              register)
+ *   buffer:    Pointer to data to be written
+ *   len:       How many bytes to write
+ *
+ *   Returns: 0 on success, not 0 on failure
+ */
+
+int i2c_write (uchar chip_addr, uint byte_addr, int alen, uchar * buffer,
+             int len)
+{
+       u32 op_status = TSI108_I2C_PARAM_ERR;
+
+       /* Check for valid I2C address */
+       if (chip_addr <= 0x7F && (byte_addr + len) <= (0x01 << (alen * 8))) {
+               while (len--) {
+                       op_status =
+                           i2c_write_byte (chip_addr, byte_addr++, buffer++);
+
+                       if (TSI108_I2C_SUCCESS != op_status) {
+                               DPRINT (("I2C write_byte() failed: 0x%02x (%d left)\n", op_status, len));
+
+                               break;
+                       }
+               }
+       }
+
+       return op_status;
+}
+
+/*
+ * I2C interface function as defined in "include/i2c.h".
+ * Probe the given I2C chip address by reading single byte from offset 0.
+ * Returns 0 if a chip responded, not 0 on failure.
+ */
+
+int i2c_probe (uchar chip)
+{
+       u32 tmp;
+
+       /*
+        * Try to read the first location of the chip.
+        * The Tsi108 HW doesn't support sending just the chip address
+        * and checkong for an <ACK> back.
+        */
+       return i2c_read (chip, 0, 1, (char *)&tmp, 1);
+}
+
+#endif /* (CONFIG_COMMANDS & CFG_CMD_I2C) */
+#endif /* CONFIG_TSI108_I2C */
diff --git a/drivers/tsi108_pci.c b/drivers/tsi108_pci.c
new file mode 100644 (file)
index 0000000..9f606df
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * (C) Copyright 2004 Tundra Semiconductor Corp.
+ * Alex Bounine <alexandreb@tundra.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
+ */
+
+/*
+ * PCI initialisation for the Tsi108 EMU board.
+ */
+
+#include <config.h>
+
+#ifdef CONFIG_TSI108_PCI
+
+#include <common.h>
+#include <pci.h>
+#include <asm/io.h>
+#include <tsi108.h>
+
+struct pci_controller local_hose;
+
+void tsi108_clear_pci_error (void)
+{
+       u32 err_stat, err_addr, pci_stat;
+
+       /*
+        * Quietly clear errors signalled as result of PCI/X configuration read
+        * requests.
+        */
+       /* Read PB Error Log Registers */
+       err_stat = *(volatile u32 *)(CFG_TSI108_CSR_BASE +
+                                    TSI108_PB_REG_OFFSET + PB_ERRCS);
+       err_addr = *(volatile u32 *)(CFG_TSI108_CSR_BASE +
+                                    TSI108_PB_REG_OFFSET + PB_AERR);
+       if (err_stat & PB_ERRCS_ES) {
+               /* Clear PCI/X bus errors if applicable */
+               if ((err_addr & 0xFF000000) == CFG_PCI_CFG_BASE) {
+                       /* Clear error flag */
+                       *(u32 *) (CFG_TSI108_CSR_BASE +
+                                 TSI108_PB_REG_OFFSET + PB_ERRCS) =
+                           PB_ERRCS_ES;
+
+                       /* Clear read error reported in PB_ISR */
+                       *(u32 *) (CFG_TSI108_CSR_BASE +
+                                 TSI108_PB_REG_OFFSET + PB_ISR) =
+                           PB_ISR_PBS_RD_ERR;
+
+               /* Clear errors reported by PCI CSR (Normally Master Abort) */
+                       pci_stat = *(volatile u32 *)(CFG_TSI108_CSR_BASE +
+                                                    TSI108_PCI_REG_OFFSET +
+                                                    PCI_CSR);
+                       *(volatile u32 *)(CFG_TSI108_CSR_BASE +
+                                         TSI108_PCI_REG_OFFSET + PCI_CSR) =
+                           pci_stat;
+
+                       *(volatile u32 *)(CFG_TSI108_CSR_BASE +
+                                         TSI108_PCI_REG_OFFSET +
+                                         PCI_IRP_STAT) = PCI_IRP_STAT_P_CSR;
+               }
+       }
+
+       return;
+}
+
+unsigned int __get_pci_config_dword (u32 addr)
+{
+       unsigned int retval;
+
+       __asm__ __volatile__ ("       lwbrx %0,0,%1\n"
+                            "1:     eieio\n"
+                            "2:\n"
+                            ".section .fixup,\"ax\"\n"
+                            "3:     li %0,-1\n"
+                            "       b 2b\n"
+                            ".section __ex_table,\"a\"\n"
+                            "       .align 2\n"
+                            "       .long 1b,3b\n"
+                            ".text":"=r"(retval):"r"(addr));
+
+       return (retval);
+}
+
+static int tsi108_read_config_dword (struct pci_controller *hose,
+                                   pci_dev_t dev, int offset, u32 * value)
+{
+       dev &= (CFG_PCI_CFG_SIZE - 1);
+       dev |= (CFG_PCI_CFG_BASE | (offset & 0xfc));
+       *value = __get_pci_config_dword(dev);
+       if (0xFFFFFFFF == *value)
+               tsi108_clear_pci_error ();
+       return 0;
+}
+
+static int tsi108_write_config_dword (struct pci_controller *hose,
+                                    pci_dev_t dev, int offset, u32 value)
+{
+       dev &= (CFG_PCI_CFG_SIZE - 1);
+       dev |= (CFG_PCI_CFG_BASE | (offset & 0xfc));
+
+       out_le32 ((volatile unsigned *)dev, value);
+
+       return 0;
+}
+
+void pci_init_board (void)
+{
+       struct pci_controller *hose = (struct pci_controller *)&local_hose;
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       pci_set_region (hose->regions + 0,
+                      CFG_PCI_MEMORY_BUS,
+                      CFG_PCI_MEMORY_PHYS,
+                      CFG_PCI_MEMORY_SIZE, PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       /* PCI memory space */
+       pci_set_region (hose->regions + 1,
+                      CFG_PCI_MEM_BUS,
+                      CFG_PCI_MEM_PHYS, CFG_PCI_MEM_SIZE, PCI_REGION_MEM);
+
+       /* PCI I/O space */
+       pci_set_region (hose->regions + 2,
+                      CFG_PCI_IO_BUS,
+                      CFG_PCI_IO_PHYS, CFG_PCI_IO_SIZE, PCI_REGION_IO);
+
+       hose->region_count = 3;
+
+       pci_set_ops (hose,
+                   pci_hose_read_config_byte_via_dword,
+                   pci_hose_read_config_word_via_dword,
+                   tsi108_read_config_dword,
+                   pci_hose_write_config_byte_via_dword,
+                   pci_hose_write_config_word_via_dword,
+                   tsi108_write_config_dword);
+
+       pci_register_hose (hose);
+
+       hose->last_busno = pci_hose_scan (hose);
+
+       debug ("Done PCI initialization\n");
+       return;
+}
+
+#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_TSI "/pci@1000/bus-range", &len);
+       if (p != NULL) {
+               p[0] = local_hose.first_busno;
+               p[1] = local_hose.last_busno;
+       }
+
+}
+#endif
+
+#endif /* CONFIG_TSI108_PCI */
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);
index 423a79b2dd5a547c1a2e5db5d780e277aa86895f..e9b4974be4923120f0aa86db28b7db10c4bd7157 100644 (file)
@@ -86,10 +86,14 @@ BIN += sched.bin
 endif
 
 ifeq ($(ARCH),blackfin)
+ifneq ($(BOARD),bf537-stamp)
+ifneq ($(BOARD),bf537-pnav)
 ELF    += smc91111_eeprom
 SREC   += smc91111_eeprom.srec
 BIN    += smc91111_eeprom.bin
 endif
+endif
+endif
 
 # The following example is pretty 8xx specific...
 ifeq ($(CPU),mpc8xx)
index ffd314e6b35c9985799b7ca8b5489484ec85d9fc..26df6e06a15ea58d8853fbbcd30ce3b14002581e 100644 (file)
@@ -132,7 +132,7 @@ gd_t *global_data;
  */
 #define EXPORT_FUNC(x)                 \
        asm volatile (                  \
-"       .globl " #x "\n"               \
+"       .globl _" #x "\n_"             \
 #x ":\n"                               \
 "      P0 = [P5 + %0]\n"               \
 "      P0 = [P0 + %1]\n"               \
index 1b35585eee59232ea2d2375e8a3dc801941a42a8..d88d0f8f36e349db35317f84bb118a282735bd15 100644 (file)
@@ -45,7 +45,7 @@
 long zlib_decompress(unsigned char *data_in, unsigned char *cpage_out,
                      __u32 srclen, __u32 destlen)
 {
-    return (decompress_block(cpage_out, data_in + 2, ldr_memcpy));
+    return (decompress_block(cpage_out, data_in + 2, (void *) ldr_memcpy));
 
 }
 
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 33e396a066c8ad0387f07a48d0ef9eccf91012df..ba73bae9e5f8470f979c01490c978d2491b9a144 100644 (file)
@@ -111,7 +111,7 @@ typedef enum __cpu_t {
        CPU_750CX, CPU_750FX, CPU_750GX,
        CPU_7400,
        CPU_7410,
-       CPU_7448,
+       CPU_7447A, CPU_7448,
        CPU_7450, CPU_7455, CPU_7457,
        CPU_UNKNOWN} cpu_t;
 
index 3056ca7f673ad919f170e6083eb5026122853e25..1e9cd41169d437b830525d8e4e5a2ff14eb81823 100644 (file)
@@ -36,6 +36,8 @@
 /* include armadillo specific hardware file if there was one */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
 /* include IntegratorCP/CM720T specific hardware file if there was one */
+#elif defined(CONFIG_LPC2292)
+#include <asm-arm/arch-arm720t/lpc2292_registers.h>
 #else
 #error No hardware file defined for this configuration
 #endif
diff --git a/include/asm-arm/arch-arm720t/lpc2292_registers.h b/include/asm-arm/arch-arm720t/lpc2292_registers.h
new file mode 100644 (file)
index 0000000..5715f3e
--- /dev/null
@@ -0,0 +1,225 @@
+#ifndef __LPC2292_REGISTERS_H
+#define __LPC2292_REGISTERS_H
+
+#include <config.h>
+
+/* Macros for reading/writing registers */
+#define PUT8(reg, value) (*(volatile unsigned char*)(reg) = (value))
+#define PUT16(reg, value) (*(volatile unsigned short*)(reg) = (value))
+#define PUT32(reg, value) (*(volatile unsigned int*)(reg) = (value))
+#define GET8(reg) (*(volatile unsigned char*)(reg))
+#define GET16(reg) (*(volatile unsigned short*)(reg))
+#define GET32(reg) (*(volatile unsigned int*)(reg))
+
+/* External Memory Controller */
+
+#define BCFG0 0xFFE00000       /* 32-bits */
+#define BCFG1 0xFFE00004       /* 32-bits */
+#define BCFG2 0xFFE00008       /* 32-bits */
+#define BCFG3 0xFFE0000c       /* 32-bits */
+
+/* System Control Block */
+
+#define EXTINT   0xE01FC140
+#define EXTWAKE  0xE01FC144
+#define EXTMODE  0xE01FC148
+#define EXTPOLAR 0xE01FC14C
+#define MEMMAP   0xE01FC040
+#define PLLCON   0xE01FC080
+#define PLLCFG   0xE01FC084
+#define PLLSTAT  0xE01FC088
+#define PLLFEED  0xE01FC08C
+#define PCON     0xE01FC0C0
+#define PCONP    0xE01FC0C4
+#define VPBDIV   0xE01FC100
+
+/* Memory Acceleration Module */
+
+#define MAMCR  0xE01FC000
+#define MAMTIM 0xE01FC004
+
+/* Vectored Interrupt Controller */
+
+#define VICIRQStatus    0xFFFFF000
+#define VICFIQStatus    0xFFFFF004
+#define VICRawIntr      0xFFFFF008
+#define VICIntSelect    0xFFFFF00C
+#define VICIntEnable    0xFFFFF010
+#define VICIntEnClr     0xFFFFF014
+#define VICSoftInt      0xFFFFF018
+#define VICSoftIntClear 0xFFFFF01C
+#define VICProtection   0xFFFFF020
+#define VICVectAddr     0xFFFFF030
+#define VICDefVectAddr  0xFFFFF034
+#define VICVectAddr0    0xFFFFF100
+#define VICVectAddr1    0xFFFFF104
+#define VICVectAddr2    0xFFFFF108
+#define VICVectAddr3    0xFFFFF10C
+#define VICVectAddr4    0xFFFFF110
+#define VICVectAddr5    0xFFFFF114
+#define VICVectAddr6    0xFFFFF118
+#define VICVectAddr7    0xFFFFF11C
+#define VICVectAddr8    0xFFFFF120
+#define VICVectAddr9    0xFFFFF124
+#define VICVectAddr10   0xFFFFF128
+#define VICVectAddr11   0xFFFFF12C
+#define VICVectAddr12   0xFFFFF130
+#define VICVectAddr13   0xFFFFF134
+#define VICVectAddr14   0xFFFFF138
+#define VICVectAddr15   0xFFFFF13C
+#define VICVectCntl0    0xFFFFF200
+#define VICVectCntl1   0xFFFFF204
+#define VICVectCntl2   0xFFFFF208
+#define VICVectCntl3   0xFFFFF20C
+#define VICVectCntl4   0xFFFFF210
+#define VICVectCntl5   0xFFFFF214
+#define VICVectCntl6   0xFFFFF218
+#define VICVectCntl7   0xFFFFF21C
+#define VICVectCntl8   0xFFFFF220
+#define VICVectCntl9   0xFFFFF224
+#define VICVectCntl10  0xFFFFF228
+#define VICVectCntl11  0xFFFFF22C
+#define VICVectCntl12  0xFFFFF230
+#define VICVectCntl13  0xFFFFF234
+#define VICVectCntl14  0xFFFFF238
+#define VICVectCntl15  0xFFFFF23C
+
+/* Pin connect block */
+
+#define PINSEL0 0xE002C000     /* 32 bits */
+#define PINSEL1 0xE002C004     /* 32 bits */
+#define PINSEL2 0xE002C014     /* 32 bits */
+
+/* GPIO */
+
+#define IO0PIN 0xE0028000
+#define IO0SET 0xE0028004
+#define IO0DIR 0xE0028008
+#define IO0CLR 0xE002800C
+#define IO1PIN 0xE0028010
+#define IO1SET 0xE0028014
+#define IO1DIR 0xE0028018
+#define IO1CLR 0xE002801C
+#define IO2PIN 0xE0028020
+#define IO2SET 0xE0028024
+#define IO2DIR 0xE0028028
+#define IO2CLR 0xE002802C
+#define IO3PIN 0xE0028030
+#define IO3SET 0xE0028034
+#define IO3DIR 0xE0028038
+#define IO3CLR 0xE002803C
+
+/* Uarts */
+
+#define U0RBR 0xE000C000
+#define U0THR 0xE000C000
+#define U0IER 0xE000C004
+#define U0IIR 0xE000C008
+#define U0FCR 0xE000C008
+#define U0LCR 0xE000C00C
+#define U0LSR 0xE000C014
+#define U0SCR 0xE000C01C
+#define U0DLL 0xE000C000
+#define U0DLM 0xE000C004
+
+#define U1RBR 0xE0010000
+#define U1THR 0xE0010000
+#define U1IER 0xE0010004
+#define U1IIR 0xE0010008
+#define U1FCR 0xE0010008
+#define U1LCR 0xE001000C
+#define U1MCR 0xE0010010
+#define U1LSR 0xE0010014
+#define U1MSR 0xE0010018
+#define U1SCR 0xE001001C
+#define U1DLL 0xE0010000
+#define U1DLM 0xE0010004
+
+/* I2C */
+
+#define I2CONSET 0xE001C000
+#define I2STAT   0xE001C004
+#define I2DAT    0xE001C008
+#define I2ADR    0xE001C00C
+#define I2SCLH   0xE001C010
+#define I2SCLL   0xE001C014
+#define I2CONCLR 0xE001C018
+
+/* SPI */
+
+#define S0SPCR  0xE0020000
+#define S0SPSR  0xE0020004
+#define S0SPDR  0xE0020008
+#define S0SPCCR 0xE002000C
+#define S0SPINT 0xE002001C
+
+#define S1SPCR  0xE0030000
+#define S1SPSR  0xE0030004
+#define S1SPDR  0xE0030008
+#define S1SPCCR 0xE003000C
+#define S1SPINT 0xE003001C
+
+/* CAN controller */
+
+/* skip for now */
+
+/* Timers */
+
+#define T0IR  0xE0004000
+#define T0TCR 0xE0004004
+#define T0TC  0xE0004008
+#define T0PR  0xE000400C
+#define T0PC  0xE0004010
+#define T0MCR 0xE0004014
+#define T0MR0 0xE0004018
+#define T0MR1 0xE000401C
+#define T0MR2 0xE0004020
+#define T0MR3 0xE0004024
+#define T0CCR 0xE0004028
+#define T0CR0 0xE000402C
+#define T0CR1 0xE0004030
+#define T0CR2 0xE0004034
+#define T0CR3 0xE0004038
+#define T0EMR 0xE000403C
+
+#define T1IR  0xE0008000
+#define T1TCR 0xE0008004
+#define T1TC  0xE0008008
+#define T1PR  0xE000800C
+#define T1PC  0xE0008010
+#define T1MCR 0xE0008014
+#define T1MR0 0xE0008018
+#define T1MR1 0xE000801C
+#define T1MR2 0xE0008020
+#define T1MR3 0xE0008024
+#define T1CCR 0xE0008028
+#define T1CR0 0xE000802C
+#define T1CR1 0xE0008030
+#define T1CR2 0xE0008034
+#define T1CR3 0xE0008038
+#define T1EMR 0xE000803C
+
+/* PWM */
+
+/* skip for now */
+
+/* A/D converter */
+
+/* skip for now */
+
+/* Real Time Clock */
+
+/* skip for now */
+
+/* Watchdog */
+
+#define WDMOD  0xE0000000
+#define WDTC   0xE0000004
+#define WDFEED 0xE0000008
+#define WDTV   0xE000000C
+
+/* EmbeddedICE LOGIC */
+
+/* skip for now */
+
+#endif
similarity index 71%
rename from include/asm-microblaze/suzaku.h
rename to include/asm-arm/arch-arm720t/mmc.h
index c57a144d3afe7dcb0782d3811bd3afabf97c62a5..e664a5f6789cb5e539ddb8c00f7d598df5b1ac15 100644 (file)
@@ -1,10 +1,6 @@
 /*
- * (C) Copyright 2004 Atmark Techno, Inc.
- *
- * Yasushi SHOJI <yashi@atmark-techno.com>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
+ * A dummy header file for use with the LPC2292 port to keep the
+ * compiler happy.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -21,7 +17,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-
-/* System Register (GPIO) */
-#define MICROBLAZE_SYSREG_BASE_ADDR 0xFFFFA000
-#define MICROBLAZE_SYSREG_RECONFIGURE (1 << 0)
+#ifndef _MMC_ARM_TDM_H_
+#define _MMC_ARM_TDM_H_
+#endif /* _MMC_ARM_TDM_H_ */
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
diff --git a/include/asm-avr32/arch-at32ap7000/clk.h b/include/asm-avr32/arch-at32ap7000/clk.h
new file mode 100644 (file)
index 0000000..7e20d97
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_ARCH_CLK_H__
+#define __ASM_AVR32_ARCH_CLK_H__
+
+#ifdef CONFIG_PLL
+#define MAIN_CLK_RATE ((CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL)
+#else
+#define MAIN_CLK_RATE (CFG_OSC0_HZ)
+#endif
+
+static inline unsigned long get_cpu_clk_rate(void)
+{
+       return MAIN_CLK_RATE >> CFG_CLKDIV_CPU;
+}
+static inline unsigned long get_hsb_clk_rate(void)
+{
+       return MAIN_CLK_RATE >> CFG_CLKDIV_HSB;
+}
+static inline unsigned long get_pba_clk_rate(void)
+{
+       return MAIN_CLK_RATE >> CFG_CLKDIV_PBA;
+}
+static inline unsigned long get_pbb_clk_rate(void)
+{
+       return MAIN_CLK_RATE >> CFG_CLKDIV_PBB;
+}
+
+/* Accessors for specific devices. More will be added as needed. */
+static inline unsigned long get_sdram_clk_rate(void)
+{
+       return get_hsb_clk_rate();
+}
+static inline unsigned long get_usart_clk_rate(unsigned int dev_id)
+{
+       return get_pba_clk_rate();
+}
+static inline unsigned long get_macb_pclk_rate(unsigned int dev_id)
+{
+       return get_pbb_clk_rate();
+}
+static inline unsigned long get_macb_hclk_rate(unsigned int dev_id)
+{
+       return get_hsb_clk_rate();
+}
+static inline unsigned long get_mci_clk_rate(void)
+{
+       return get_pbb_clk_rate();
+}
+
+#endif /* __ASM_AVR32_ARCH_CLK_H__ */
diff --git a/include/asm-avr32/arch-at32ap7000/gpio.h b/include/asm-avr32/arch-at32ap7000/gpio.h
new file mode 100644 (file)
index 0000000..e4812d4
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_ARCH_GPIO_H__
+#define __ASM_AVR32_ARCH_GPIO_H__
+
+#include <asm/arch/memory-map.h>
+
+#define NR_GPIO_CONTROLLERS    5
+
+/*
+ * Pin numbers identifying specific GPIO pins on the chip.
+ */
+#define GPIO_PIOA_BASE (0)
+#define GPIO_PIN_PA0   (GPIO_PIOA_BASE +  0)
+#define GPIO_PIN_PA1   (GPIO_PIOA_BASE +  1)
+#define GPIO_PIN_PA2   (GPIO_PIOA_BASE +  2)
+#define GPIO_PIN_PA3   (GPIO_PIOA_BASE +  3)
+#define GPIO_PIN_PA4   (GPIO_PIOA_BASE +  4)
+#define GPIO_PIN_PA5   (GPIO_PIOA_BASE +  5)
+#define GPIO_PIN_PA6   (GPIO_PIOA_BASE +  6)
+#define GPIO_PIN_PA7   (GPIO_PIOA_BASE +  7)
+#define GPIO_PIN_PA8   (GPIO_PIOA_BASE +  8)
+#define GPIO_PIN_PA9   (GPIO_PIOA_BASE +  9)
+#define GPIO_PIN_PA10  (GPIO_PIOA_BASE + 10)
+#define GPIO_PIN_PA11  (GPIO_PIOA_BASE + 11)
+#define GPIO_PIN_PA12  (GPIO_PIOA_BASE + 12)
+#define GPIO_PIN_PA13  (GPIO_PIOA_BASE + 13)
+#define GPIO_PIN_PA14  (GPIO_PIOA_BASE + 14)
+#define GPIO_PIN_PA15  (GPIO_PIOA_BASE + 15)
+#define GPIO_PIN_PA16  (GPIO_PIOA_BASE + 16)
+#define GPIO_PIN_PA17  (GPIO_PIOA_BASE + 17)
+#define GPIO_PIN_PA18  (GPIO_PIOA_BASE + 18)
+#define GPIO_PIN_PA19  (GPIO_PIOA_BASE + 19)
+#define GPIO_PIN_PA20  (GPIO_PIOA_BASE + 20)
+#define GPIO_PIN_PA21  (GPIO_PIOA_BASE + 21)
+#define GPIO_PIN_PA22  (GPIO_PIOA_BASE + 22)
+#define GPIO_PIN_PA23  (GPIO_PIOA_BASE + 23)
+#define GPIO_PIN_PA24  (GPIO_PIOA_BASE + 24)
+#define GPIO_PIN_PA25  (GPIO_PIOA_BASE + 25)
+#define GPIO_PIN_PA26  (GPIO_PIOA_BASE + 26)
+#define GPIO_PIN_PA27  (GPIO_PIOA_BASE + 27)
+#define GPIO_PIN_PA28  (GPIO_PIOA_BASE + 28)
+#define GPIO_PIN_PA29  (GPIO_PIOA_BASE + 29)
+#define GPIO_PIN_PA30  (GPIO_PIOA_BASE + 30)
+#define GPIO_PIN_PA31  (GPIO_PIOA_BASE + 31)
+
+#define GPIO_PIOB_BASE (GPIO_PIOA_BASE + 32)
+#define GPIO_PIN_PB0   (GPIO_PIOB_BASE +  0)
+#define GPIO_PIN_PB1   (GPIO_PIOB_BASE +  1)
+#define GPIO_PIN_PB2   (GPIO_PIOB_BASE +  2)
+#define GPIO_PIN_PB3   (GPIO_PIOB_BASE +  3)
+#define GPIO_PIN_PB4   (GPIO_PIOB_BASE +  4)
+#define GPIO_PIN_PB5   (GPIO_PIOB_BASE +  5)
+#define GPIO_PIN_PB6   (GPIO_PIOB_BASE +  6)
+#define GPIO_PIN_PB7   (GPIO_PIOB_BASE +  7)
+#define GPIO_PIN_PB8   (GPIO_PIOB_BASE +  8)
+#define GPIO_PIN_PB9   (GPIO_PIOB_BASE +  9)
+#define GPIO_PIN_PB10  (GPIO_PIOB_BASE + 10)
+#define GPIO_PIN_PB11  (GPIO_PIOB_BASE + 11)
+#define GPIO_PIN_PB12  (GPIO_PIOB_BASE + 12)
+#define GPIO_PIN_PB13  (GPIO_PIOB_BASE + 13)
+#define GPIO_PIN_PB14  (GPIO_PIOB_BASE + 14)
+#define GPIO_PIN_PB15  (GPIO_PIOB_BASE + 15)
+#define GPIO_PIN_PB16  (GPIO_PIOB_BASE + 16)
+#define GPIO_PIN_PB17  (GPIO_PIOB_BASE + 17)
+#define GPIO_PIN_PB18  (GPIO_PIOB_BASE + 18)
+#define GPIO_PIN_PB19  (GPIO_PIOB_BASE + 19)
+#define GPIO_PIN_PB20  (GPIO_PIOB_BASE + 20)
+#define GPIO_PIN_PB21  (GPIO_PIOB_BASE + 21)
+#define GPIO_PIN_PB22  (GPIO_PIOB_BASE + 22)
+#define GPIO_PIN_PB23  (GPIO_PIOB_BASE + 23)
+#define GPIO_PIN_PB24  (GPIO_PIOB_BASE + 24)
+#define GPIO_PIN_PB25  (GPIO_PIOB_BASE + 25)
+#define GPIO_PIN_PB26  (GPIO_PIOB_BASE + 26)
+#define GPIO_PIN_PB27  (GPIO_PIOB_BASE + 27)
+#define GPIO_PIN_PB28  (GPIO_PIOB_BASE + 28)
+#define GPIO_PIN_PB29  (GPIO_PIOB_BASE + 29)
+#define GPIO_PIN_PB30  (GPIO_PIOB_BASE + 30)
+
+#define GPIO_PIOC_BASE (GPIO_PIOB_BASE + 32)
+#define GPIO_PIN_PC0   (GPIO_PIOC_BASE +  0)
+#define GPIO_PIN_PC1   (GPIO_PIOC_BASE +  1)
+#define GPIO_PIN_PC2   (GPIO_PIOC_BASE +  2)
+#define GPIO_PIN_PC3   (GPIO_PIOC_BASE +  3)
+#define GPIO_PIN_PC4   (GPIO_PIOC_BASE +  4)
+#define GPIO_PIN_PC5   (GPIO_PIOC_BASE +  5)
+#define GPIO_PIN_PC6   (GPIO_PIOC_BASE +  6)
+#define GPIO_PIN_PC7   (GPIO_PIOC_BASE +  7)
+#define GPIO_PIN_PC8   (GPIO_PIOC_BASE +  8)
+#define GPIO_PIN_PC9   (GPIO_PIOC_BASE +  9)
+#define GPIO_PIN_PC10  (GPIO_PIOC_BASE + 10)
+#define GPIO_PIN_PC11  (GPIO_PIOC_BASE + 11)
+#define GPIO_PIN_PC12  (GPIO_PIOC_BASE + 12)
+#define GPIO_PIN_PC13  (GPIO_PIOC_BASE + 13)
+#define GPIO_PIN_PC14  (GPIO_PIOC_BASE + 14)
+#define GPIO_PIN_PC15  (GPIO_PIOC_BASE + 15)
+#define GPIO_PIN_PC16  (GPIO_PIOC_BASE + 16)
+#define GPIO_PIN_PC17  (GPIO_PIOC_BASE + 17)
+#define GPIO_PIN_PC18  (GPIO_PIOC_BASE + 18)
+#define GPIO_PIN_PC19  (GPIO_PIOC_BASE + 19)
+#define GPIO_PIN_PC20  (GPIO_PIOC_BASE + 20)
+#define GPIO_PIN_PC21  (GPIO_PIOC_BASE + 21)
+#define GPIO_PIN_PC22  (GPIO_PIOC_BASE + 22)
+#define GPIO_PIN_PC23  (GPIO_PIOC_BASE + 23)
+#define GPIO_PIN_PC24  (GPIO_PIOC_BASE + 24)
+#define GPIO_PIN_PC25  (GPIO_PIOC_BASE + 25)
+#define GPIO_PIN_PC26  (GPIO_PIOC_BASE + 26)
+#define GPIO_PIN_PC27  (GPIO_PIOC_BASE + 27)
+#define GPIO_PIN_PC28  (GPIO_PIOC_BASE + 28)
+#define GPIO_PIN_PC29  (GPIO_PIOC_BASE + 29)
+#define GPIO_PIN_PC30  (GPIO_PIOC_BASE + 30)
+#define GPIO_PIN_PC31  (GPIO_PIOC_BASE + 31)
+
+#define GPIO_PIOD_BASE (GPIO_PIOC_BASE + 32)
+#define GPIO_PIN_PD0   (GPIO_PIOD_BASE +  0)
+#define GPIO_PIN_PD1   (GPIO_PIOD_BASE +  1)
+#define GPIO_PIN_PD2   (GPIO_PIOD_BASE +  2)
+#define GPIO_PIN_PD3   (GPIO_PIOD_BASE +  3)
+#define GPIO_PIN_PD4   (GPIO_PIOD_BASE +  4)
+#define GPIO_PIN_PD5   (GPIO_PIOD_BASE +  5)
+#define GPIO_PIN_PD6   (GPIO_PIOD_BASE +  6)
+#define GPIO_PIN_PD7   (GPIO_PIOD_BASE +  7)
+#define GPIO_PIN_PD8   (GPIO_PIOD_BASE +  8)
+#define GPIO_PIN_PD9   (GPIO_PIOD_BASE +  9)
+#define GPIO_PIN_PD10  (GPIO_PIOD_BASE + 10)
+#define GPIO_PIN_PD11  (GPIO_PIOD_BASE + 11)
+#define GPIO_PIN_PD12  (GPIO_PIOD_BASE + 12)
+#define GPIO_PIN_PD13  (GPIO_PIOD_BASE + 13)
+#define GPIO_PIN_PD14  (GPIO_PIOD_BASE + 14)
+#define GPIO_PIN_PD15  (GPIO_PIOD_BASE + 15)
+#define GPIO_PIN_PD16  (GPIO_PIOD_BASE + 16)
+#define GPIO_PIN_PD17  (GPIO_PIOD_BASE + 17)
+
+#define GPIO_PIOE_BASE (GPIO_PIOD_BASE + 32)
+#define GPIO_PIN_PE0   (GPIO_PIOE_BASE +  0)
+#define GPIO_PIN_PE1   (GPIO_PIOE_BASE +  1)
+#define GPIO_PIN_PE2   (GPIO_PIOE_BASE +  2)
+#define GPIO_PIN_PE3   (GPIO_PIOE_BASE +  3)
+#define GPIO_PIN_PE4   (GPIO_PIOE_BASE +  4)
+#define GPIO_PIN_PE5   (GPIO_PIOE_BASE +  5)
+#define GPIO_PIN_PE6   (GPIO_PIOE_BASE +  6)
+#define GPIO_PIN_PE7   (GPIO_PIOE_BASE +  7)
+#define GPIO_PIN_PE8   (GPIO_PIOE_BASE +  8)
+#define GPIO_PIN_PE9   (GPIO_PIOE_BASE +  9)
+#define GPIO_PIN_PE10  (GPIO_PIOE_BASE + 10)
+#define GPIO_PIN_PE11  (GPIO_PIOE_BASE + 11)
+#define GPIO_PIN_PE12  (GPIO_PIOE_BASE + 12)
+#define GPIO_PIN_PE13  (GPIO_PIOE_BASE + 13)
+#define GPIO_PIN_PE14  (GPIO_PIOE_BASE + 14)
+#define GPIO_PIN_PE15  (GPIO_PIOE_BASE + 15)
+#define GPIO_PIN_PE16  (GPIO_PIOE_BASE + 16)
+#define GPIO_PIN_PE17  (GPIO_PIOE_BASE + 17)
+#define GPIO_PIN_PE18  (GPIO_PIOE_BASE + 18)
+#define GPIO_PIN_PE19  (GPIO_PIOE_BASE + 19)
+#define GPIO_PIN_PE20  (GPIO_PIOE_BASE + 20)
+#define GPIO_PIN_PE21  (GPIO_PIOE_BASE + 21)
+#define GPIO_PIN_PE22  (GPIO_PIOE_BASE + 22)
+#define GPIO_PIN_PE23  (GPIO_PIOE_BASE + 23)
+#define GPIO_PIN_PE24  (GPIO_PIOE_BASE + 24)
+#define GPIO_PIN_PE25  (GPIO_PIOE_BASE + 25)
+#define GPIO_PIN_PE26  (GPIO_PIOE_BASE + 26)
+
+static inline void *gpio_pin_to_addr(unsigned int pin)
+{
+       switch (pin >> 5) {
+       case 0:
+               return (void *)PIOA_BASE;
+       case 1:
+               return (void *)PIOB_BASE;
+       case 2:
+               return (void *)PIOC_BASE;
+       case 3:
+               return (void *)PIOD_BASE;
+       case 4:
+               return (void *)PIOE_BASE;
+       default:
+               return NULL;
+       }
+}
+
+void gpio_select_periph_A(unsigned int pin, int use_pullup);
+void gpio_select_periph_B(unsigned int pin, int use_pullup);
+
+void gpio_enable_ebi(void);
+void gpio_enable_usart0(void);
+void gpio_enable_usart1(void);
+void gpio_enable_usart2(void);
+void gpio_enable_usart3(void);
+void gpio_enable_macb0(void);
+void gpio_enable_macb1(void);
+void gpio_enable_mmci(void);
+
+#endif /* __ASM_AVR32_ARCH_GPIO_H__ */
index e6df4b7fe33a33bcb83787d64fb2235a7ededf30..b0e787a92f9888f4ec50610ae9ad567dedb0cad1 100644 (file)
         | HMATRIX2_BF(name,value))
 
 /* Register access macros */
-#define hmatrix2_readl(port,reg)                               \
-       readl((port)->regs + HMATRIX2_##reg)
-#define hmatrix2_writel(port,reg,value)                                \
-       writel((value), (port)->regs + HMATRIX2_##reg)
+#define hmatrix2_readl(reg)                                    \
+       readl((void *)HMATRIX_BASE + HMATRIX2_##reg)
+#define hmatrix2_writel(reg,value)                             \
+       writel((value), (void *)HMATRIX_BASE + HMATRIX2_##reg)
 
 #endif /* __ASM_AVR32_HMATRIX2_H__ */
index 8ffe851c89e7181a7b42bbe917f8f5a6c89a7aff..5513e88e7b030001ca7eea9fddab14cda779c8bf 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
  */
-#ifndef __ASM_AVR32_PART_MEMORY_MAP_H__
-#define __ASM_AVR32_PART_MEMORY_MAP_H__
+#ifndef __AT32AP7000_MEMORY_MAP_H__
+#define __AT32AP7000_MEMORY_MAP_H__
 
-#define AUDIOC_BASE                             0xFFF02800
-#define DAC_BASE                                0xFFF02000
-#define DMAC_BASE                               0xFF200000
-#define ECC_BASE                                0xFFF03C00
-#define HISI_BASE                               0xFFF02C00
-#define HMATRIX_BASE                            0xFFF00800
-#define HSDRAMC_BASE                            0xFFF03800
-#define HSMC_BASE                               0xFFF03400
-#define LCDC_BASE                               0xFF000000
-#define MACB0_BASE                              0xFFF01800
-#define MACB1_BASE                              0xFFF01C00
-#define MMCI_BASE                               0xFFF02400
-#define PIOA_BASE                               0xFFE02800
-#define PIOB_BASE                               0xFFE02C00
-#define PIOC_BASE                               0xFFE03000
-#define PIOD_BASE                               0xFFE03400
-#define PIOE_BASE                               0xFFE03800
-#define PSIF_BASE                               0xFFE03C00
-#define PWM_BASE                                0xFFF01400
-#define SM_BASE                                 0xFFF00000
-#define INTC_BASE                              0XFFF00400
-#define SPI0_BASE                               0xFFE00000
-#define SPI1_BASE                               0xFFE00400
-#define SSC0_BASE                               0xFFE01C00
-#define SSC1_BASE                               0xFFE02000
-#define SSC2_BASE                               0xFFE02400
-#define TIMER0_BASE                             0xFFF00C00
-#define TIMER1_BASE                             0xFFF01000
-#define TWI_BASE                                0xFFE00800
-#define USART0_BASE                             0xFFE00C00
-#define USART1_BASE                             0xFFE01000
-#define USART2_BASE                             0xFFE01400
-#define USART3_BASE                             0xFFE01800
-#define USB_FIFO                                0xFF300000
-#define USB_BASE                                0xFFF03000
+/* Devices on the High Speed Bus (HSB) */
+#define LCDC_BASE                              0xFF000000
+#define DMAC_BASE                              0xFF200000
+#define USB_FIFO                               0xFF300000
 
-#endif /* __ASM_AVR32_PART_MEMORY_MAP_H__ */
+/* Devices on Peripheral Bus A (PBA) */
+#define SPI0_BASE                              0xFFE00000
+#define SPI1_BASE                              0xFFE00400
+#define TWI_BASE                               0xFFE00800
+#define USART0_BASE                            0xFFE00C00
+#define USART1_BASE                            0xFFE01000
+#define USART2_BASE                            0xFFE01400
+#define USART3_BASE                            0xFFE01800
+#define SSC0_BASE                              0xFFE01C00
+#define SSC1_BASE                              0xFFE02000
+#define SSC2_BASE                              0xFFE02400
+#define PIOA_BASE                              0xFFE02800
+#define PIOB_BASE                              0xFFE02C00
+#define PIOC_BASE                              0xFFE03000
+#define PIOD_BASE                              0xFFE03400
+#define PIOE_BASE                              0xFFE03800
+#define PSIF_BASE                              0xFFE03C00
+
+/* Devices on Peripheral Bus B (PBB) */
+#define SM_BASE                                        0xFFF00000
+#define INTC_BASE                              0xFFF00400
+#define HMATRIX_BASE                           0xFFF00800
+#define TIMER0_BASE                            0xFFF00C00
+#define TIMER1_BASE                            0xFFF01000
+#define PWM_BASE                               0xFFF01400
+#define MACB0_BASE                             0xFFF01800
+#define MACB1_BASE                             0xFFF01C00
+#define DAC_BASE                               0xFFF02000
+#define MMCI_BASE                              0xFFF02400
+#define AUDIOC_BASE                            0xFFF02800
+#define HISI_BASE                              0xFFF02C00
+#define USB_BASE                               0xFFF03000
+#define HSMC_BASE                              0xFFF03400
+#define HSDRAMC_BASE                           0xFFF03800
+#define ECC_BASE                               0xFFF03C00
+
+#endif /* __AT32AP7000_MEMORY_MAP_H__ */
diff --git a/include/asm-avr32/arch-at32ap7000/mmc.h b/include/asm-avr32/arch-at32ap7000/mmc.h
new file mode 100644 (file)
index 0000000..fcfbbb3
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_MMC_H
+#define __ASM_AVR32_MMC_H
+
+struct mmc_cid {
+       unsigned long psn;
+       unsigned short oid;
+       unsigned char mid;
+       unsigned char prv;
+       unsigned char mdt;
+       char pnm[7];
+};
+
+struct mmc_csd
+{
+       u8      csd_structure:2,
+               spec_vers:4,
+               rsvd1:2;
+       u8      taac;
+       u8      nsac;
+       u8      tran_speed;
+       u16     ccc:12,
+               read_bl_len:4;
+       u64     read_bl_partial:1,
+               write_blk_misalign:1,
+               read_blk_misalign:1,
+               dsr_imp:1,
+               rsvd2:2,
+               c_size:12,
+               vdd_r_curr_min:3,
+               vdd_r_curr_max:3,
+               vdd_w_curr_min:3,
+               vdd_w_curr_max:3,
+               c_size_mult:3,
+               sector_size:5,
+               erase_grp_size:5,
+               wp_grp_size:5,
+               wp_grp_enable:1,
+               default_ecc:2,
+               r2w_factor:3,
+               write_bl_len:4,
+               write_bl_partial:1,
+               rsvd3:5;
+       u8      file_format_grp:1,
+               copy:1,
+               perm_write_protect:1,
+               tmp_write_protect:1,
+               file_format:2,
+               ecc:2;
+       u8      crc:7;
+       u8      one:1;
+};
+
+/* MMC Command numbers */
+#define MMC_CMD_GO_IDLE_STATE          0
+#define MMC_CMD_SEND_OP_COND           1
+#define MMC_CMD_ALL_SEND_CID           2
+#define MMC_CMD_SET_RELATIVE_ADDR      3
+#define MMC_CMD_SD_SEND_RELATIVE_ADDR  3
+#define MMC_CMD_SET_DSR                        4
+#define MMC_CMD_SELECT_CARD            7
+#define MMC_CMD_SEND_CSD               9
+#define MMC_CMD_SEND_CID               10
+#define MMC_CMD_SEND_STATUS            13
+#define MMC_CMD_SET_BLOCKLEN           16
+#define MMC_CMD_READ_SINGLE_BLOCK      17
+#define MMC_CMD_READ_MULTIPLE_BLOCK    18
+#define MMC_CMD_WRITE_BLOCK            24
+#define MMC_CMD_APP_CMD                        55
+
+#define MMC_ACMD_SD_SEND_OP_COND       41
+
+#define R1_ILLEGAL_COMMAND             (1 << 22)
+#define R1_APP_CMD                     (1 << 5)
+
+#endif /* __ASM_AVR32_MMC_H */
diff --git a/include/asm-avr32/arch-at32ap7000/platform.h b/include/asm-avr32/arch-at32ap7000/platform.h
deleted file mode 100644 (file)
index 7590501..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2005-2006 Atmel Corporation
- *
- * 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 _ASM_AVR32_ARCH_PM_H
-#define _ASM_AVR32_ARCH_PM_H
-
-#include <config.h>
-
-enum clock_domain_id {
-       CLOCK_CPU,
-       CLOCK_HSB,
-       CLOCK_PBA,
-       CLOCK_PBB,
-       NR_CLOCK_DOMAINS,
-};
-
-enum resource_type {
-       RESOURCE_GPIO,
-       RESOURCE_CLOCK,
-};
-
-enum gpio_func {
-       GPIO_FUNC_GPIO,
-       GPIO_FUNC_A,
-       GPIO_FUNC_B,
-};
-
-enum device_id {
-       DEVICE_HEBI,
-       DEVICE_PBA_BRIDGE,
-       DEVICE_PBB_BRIDGE,
-       DEVICE_HRAMC,
-       /* GPIO controllers must be kept together */
-       DEVICE_PIOA,
-       DEVICE_PIOB,
-       DEVICE_PIOC,
-       DEVICE_PIOD,
-       DEVICE_PIOE,
-       DEVICE_SM,
-       DEVICE_INTC,
-       DEVICE_HMATRIX,
-#if defined(CFG_HPDC)
-       DEVICE_HPDC,
-#endif
-#if defined(CFG_MACB0)
-       DEVICE_MACB0,
-#endif
-#if defined(CFG_MACB1)
-       DEVICE_MACB1,
-#endif
-#if defined(CFG_LCDC)
-       DEVICE_LCDC,
-#endif
-#if defined(CFG_USART0)
-       DEVICE_USART0,
-#endif
-#if defined(CFG_USART1)
-       DEVICE_USART1,
-#endif
-#if defined(CFG_USART2)
-       DEVICE_USART2,
-#endif
-#if defined(CFG_USART3)
-       DEVICE_USART3,
-#endif
-#if defined(CFG_MMCI)
-       DEVICE_MMCI,
-#endif
-#if defined(CFG_DMAC)
-       DEVICE_DMAC,
-#endif
-       NR_DEVICES,
-       NO_DEVICE = -1,
-};
-
-struct resource {
-       enum resource_type type;
-       union {
-               struct {
-                       unsigned long base;
-               } iomem;
-               struct {
-                       unsigned char nr_pins;
-                       enum device_id gpio_dev;
-                       enum gpio_func func;
-                       unsigned short start;
-               } gpio;
-               struct {
-                       enum clock_domain_id id;
-                       unsigned char index;
-               } clock;
-       } u;
-};
-
-struct device {
-       void *regs;
-       unsigned int nr_resources;
-       const struct resource *resource;
-};
-
-struct clock_domain {
-       unsigned short reg;
-       enum clock_domain_id id;
-       enum device_id bridge;
-};
-
-extern const struct device chip_device[NR_DEVICES];
-extern const struct clock_domain chip_clock[NR_CLOCK_DOMAINS];
-
-/**
- * Set up PIO, clock management and I/O memory for a device.
- */
-const struct device *get_device(enum device_id devid);
-void put_device(const struct device *dev);
-
-int gpio_set_func(enum device_id gpio_devid, unsigned int start,
-                 unsigned int nr_pins, enum gpio_func func);
-void gpio_free(enum device_id gpio_devid, unsigned int start,
-              unsigned int nr_pins);
-
-void pm_init(void);
-int pm_enable_clock(enum clock_domain_id id, unsigned int index);
-void pm_disable_clock(enum clock_domain_id id, unsigned int index);
-unsigned long pm_get_clock_freq(enum clock_domain_id domain);
-
-void cpu_enable_sdram(void);
-
-#endif /* _ASM_AVR32_ARCH_PM_H */
index 01d836c6395a07d7922eb44a19b1f0e4dbc0428e..681c514ccf45d962abd5e5a10c44a8b282581673 100644 (file)
 typedef        struct  global_data {
        bd_t            *bd;
        unsigned long   flags;
-       const struct device     *console_uart;
-       const struct device     *sm;
        unsigned long   baudrate;
-       unsigned long   sdram_size;
+       unsigned long   stack_end;      /* highest stack address */
        unsigned long   have_console;   /* serial_init() was called */
        unsigned long   reloc_off;      /* Relocation Offset */
        unsigned long   env_addr;       /* Address of env struct */
index 7ba25cde53e2316d14b8f204441edeccce7ae96f..583e5dc1010415a29991df3925b9baaba97b47c0 100644 (file)
@@ -26,8 +26,6 @@
 
 extern int cpu_init(void);
 extern int timer_init(void);
-extern void board_init_memories(void);
-extern void board_init_pio(void);
 extern void board_init_info(void);
 
 #endif /* __ASM_AVR32_INITCALLS_H__ */
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 */
diff --git a/include/asm-blackfin/arch-bf533/anomaly.h b/include/asm-blackfin/arch-bf533/anomaly.h
new file mode 100644 (file)
index 0000000..4fe425c
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * File:         include/asm-blackfin/arch-bf533/anomaly.h
+ * Based on:
+ * Author:
+ *
+ * Created:
+ * Description:
+ *
+ * Rev:
+ *
+ * Modified:
+ *
+ *
+ * Bugs:         Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, 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; see the file COPYING.
+ * If not, write to the Free Software Foundation,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* This file shoule be up to date with:
+ *  - Revision U, May 17, 2006; ADSP-BF533 Blackfin Processor Anomaly List
+ *  - Revision Y, May 17, 2006; ADSP-BF532 Blackfin Processor Anomaly List
+ *  - Revision T, May 17, 2006; ADSP-BF531 Blackfin Processor Anomaly List
+ */
+
+#ifndef _MACH_ANOMALY_H_
+#define _MACH_ANOMALY_H_
+
+/* We do not support 0.1 or 0.2 silicon - sorry */
+#if (defined(CONFIG_BF_REV_0_1) || defined(CONFIG_BF_REV_0_2))
+#error Kernel will not work on BF533 Version 0.1 or 0.2
+#endif
+
+/* Issues that are common to 0.5, 0.4, and 0.3 silicon */
+#if  (defined(CONFIG_BF_REV_0_5) || defined(CONFIG_BF_REV_0_4) || defined(CONFIG_BF_REV_0_3))
+#define ANOMALY_05000074 /* A multi issue instruction with dsp32shiftimm in
+                           slot1 and store of a P register in slot 2 is not
+                           supported */
+#define ANOMALY_05000105 /* Watchpoint Status Register (WPSTAT) bits are set on
+                           every corresponding match */
+#define ANOMALY_05000119 /* DMA_RUN bit is not valid after a Peripheral Receive
+                           Channel DMA stops */
+#define ANOMALY_05000122 /* Rx.H can not be used to access 16-bit System MMR
+                           registers. */
+#define ANOMALY_05000166 /* PPI Data Lengths Between 8 and 16 do not zero out
+                           upper bits*/
+#define ANOMALY_05000167 /* Turning Serial Ports on With External Frame Syncs */
+#define ANOMALY_05000180 /* PPI_DELAY not functional in PPI modes with 0 frame
+                           syncs */
+#define ANOMALY_05000208 /* VSTAT status bit in PLL_STAT register is not
+                           functional */
+#define ANOMALY_05000219 /* NMI event at boot time results in unpredictable
+                           state */
+#define ANOMALY_05000229 /* SPI Slave Boot Mode modifies registers */
+#define ANOMALY_05000272 /* Certain data cache write through modes fail for
+                           VDDint <=0.9V */
+#define ANOMALY_05000273 /* Writes to Synchronous SDRAM memory may be lost */
+#define ANOMALY_05000277 /* Writes to a flag data register one SCLK cycle after
+                           an edge is detected may clear interrupt */
+#define ANOMALY_05000278 /* Disabling Peripherals with DMA running may cause
+                           DMA system instability */
+#define ANOMALY_05000281 /* False Hardware Error Exception when ISR context is
+                           not restored */
+#define ANOMALY_05000282 /* Memory DMA corruption with 32-bit data and traffic
+                           control */
+#define ANOMALY_05000283 /* A system MMR write is stalled indefinitely when
+                           killed in a particular stage*/
+#endif
+
+/* These issues only occur on 0.3 or 0.4 BF533 */
+#if (defined(CONFIG_BF_REV_0_4) || defined(CONFIG_BF_REV_0_3))
+#define ANOMALY_05000099 /* UART Line Status Register (UART_LSR) bits are not
+                           updated at the same time. */
+#define ANOMALY_05000158 /* Boot fails when data cache enabled: Data from a Data
+                           Cache Fill can be corrupted after or during
+                           Instruction DMA if certain core stalls exist */
+#define ANOMALY_05000179 /* PPI_COUNT cannot be programmed to 0 in General
+                           Purpose TX or RX modes */
+#define ANOMALY_05000198 /* Failing SYSTEM MMR accesses when stalled by
+                           preceding memory read */
+#define ANOMALY_05000200 /* SPORT TFS and DT are incorrectly driven during
+                           inactive channels in certain conditions */
+#define ANOMALY_05000202 /* Possible infinite stall with specific dual dag
+                           situation */
+#define ANOMALY_05000215 /* UART TX Interrupt masked erroneously */
+#define ANOMALY_05000225 /* Incorrect pulse-width of UART start-bit */
+#define ANOMALY_05000227 /* Scratchpad memory bank reads may return incorrect
+                           data*/
+#define ANOMALY_05000230 /* UART Receiver is less robust against Baudrate
+                           Differences in certain Conditions */
+#define ANOMALY_05000231 /* UART STB bit incorrectly affects receiver setting */
+#define ANOMALY_05000242 /* DF bit in PLL_CTL register does not respond to
+                           hardware reset */
+#define ANOMALY_05000244 /* With instruction cache enabled, a CSYNC or SSYNC or
+                           IDLE around a Change of Control causes
+                           unpredictable results */
+#define ANOMALY_05000245 /* Spurious Hardware Error from an access in the
+                           shadow of a conditional branch */
+#define ANOMALY_05000246 /* Data CPLB's should prevent spurious hardware
+                           errors */
+#define ANOMALY_05000253 /* Maximum external clock speed for Timers */
+#define ANOMALY_05000255 /* Entering Hibernate Mode with RTC Seconds event
+                           interrupt not functional */
+#define ANOMALY_05000257 /* An interrupt or exception during short Hardware
+                           loops may cause the instruction fetch unit to
+                           malfunction */
+#define ANOMALY_05000258 /* Instruction Cache is corrupted when bit 9 and 12 of
+                           the ICPLB Data registers differ */
+#define ANOMALY_05000260 /* ICPLB_STATUS MMR register may be corrupted */
+#define ANOMALY_05000261 /* DCPLB_FAULT_ADDR MMR register may be corrupted */
+#define ANOMALY_05000262 /* Stores to data cache may be lost */
+#define ANOMALY_05000263 /* Hardware loop corrupted when taking an ICPLB exception */
+#define ANOMALY_05000264 /* A Sync instruction (CSYNC, SSYNC) or an IDLE
+                           instruction will cause an infinite stall in the
+                           second to last instruction in a hardware loop */
+#define ANOMALY_05000265 /* Sensitivity to noise with slow input edge rates on
+                           SPORT external receive and transmit clocks. */
+#define ANOMALY_05000269 /* High I/O activity causes the output voltage of the
+                           internal voltage regulator (VDDint) to increase. */
+#define ANOMALY_05000270 /* High I/O activity causes the output voltage of the
+                           internal voltage regulator (VDDint) to decrease */
+#endif
+
+/* These issues are only on 0.4 silicon */
+#if (defined(CONFIG_BF_REV_0_4))
+#define ANOMALY_05000234 /* Incorrect Revision Number in DSPID Register */
+#define ANOMALY_05000250 /* Incorrect Bit-Shift of Data Word in Multichannel
+                           (TDM) */
+#endif
+
+/* These issues are only on 0.3 silicon */
+#if defined(CONFIG_BF_REV_0_3)
+#define ANOMALY_05000183 /* Timer Pin limitations for PPI TX Modes with
+                           External Frame Syncs */
+#define ANOMALY_05000189 /* False Protection Exceptions caused by Speculative
+                           Instruction or Data Fetches, or by Fetches at the
+                           boundary of reserved memory space */
+#define ANOMALY_05000193 /* False Flag Pin Interrupts on Edge Sensitive Inputs
+                           when polarity setting is changed */
+#define ANOMALY_05000194 /* Sport Restarting in specific modes may cause data
+                           corruption */
+#define ANOMALY_05000199 /* DMA current address shows wrong value during carry
+                           fix */
+#define ANOMALY_05000201 /* Receive frame sync not ignored during active
+                           frames in sport MCM */
+#define ANOMALY_05000203 /* Specific sequence that can cause DMA error or DMA
+                           stopping */
+#if defined(CONFIG_BF533)
+#define ANOMALY_05000204 /* Incorrect data read with write-through cache and
+                           allocate cache lines on reads only mode */
+#endif /* CONFIG_BF533 */
+#define ANOMALY_05000207 /* Recovery from "brown-out" condition */
+#define ANOMALY_05000209 /* Speed-Path in computational unit affects certain
+                           instructions */
+#define ANOMALY_05000233 /* PPI_FS3 is not driven in 2 or 3 internal Frame
+                           Sync Transmit Mode */
+#define ANOMALY_05000271 /* Spontaneous reset of Internal Voltage Regulator */
+#endif
+
+#endif /*  _MACH_ANOMALY_H_ */
similarity index 94%
rename from include/asm-blackfin/cpu/bf533_serial.h
rename to include/asm-blackfin/arch-bf533/bf533_serial.h
index d5e162a8f94d36a0377f887ac70e9d0b45d70578..65749ee458cdd899e57d2310db5a83a549ebcbec 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot bf533_serial.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
-
 #ifndef _BF533_SERIAL_H_
 #define _BF533_SERIAL_H_
 
similarity index 90%
rename from include/asm-blackfin/cpu/bf533_rtc.h
rename to include/asm-blackfin/arch-bf533/bf5xx_rtc.h
index bc09922a5eafc16924262d4f0efbda8d7c58b324..f4440a8d474b1d2c96487f23abd1a71b0e272f1d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - bf533_rtc.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BF533_RTC_H_
similarity index 93%
rename from include/asm-blackfin/cpu/cdefBF531.h
rename to include/asm-blackfin/arch-bf533/cdefBF531.h
index 68d841d1855d6b43012316d4e02474ff1372529c..3877db89e22677f64105e5dfd5aba3bc3b5cee77 100644 (file)
@@ -19,6 +19,6 @@
 #ifndef _CDEFBF531_H
 #define _CDEFBF531_H
 
-#include <cdefBF532.h>
+#include <asm/arch-bf533/cdefBF532.h>
 
 #endif /* _CDEFBF531_H */
similarity index 99%
rename from include/asm-blackfin/cpu/cdefBF532.h
rename to include/asm-blackfin/arch-bf533/cdefBF532.h
index a4d422f765d85f691f13579acda4e3fd3b6d1e3f..bca1ed1ac18faba5b109f820fa4c0166edd7909d 100644 (file)
  */
 
 /* include all Core registers and bit definitions */
-#include <asm/cpu/defBF532.h>
+#include <asm/arch-bf533/defBF532.h>
 
 /* include core specific register pointer definitions */
-#include <asm/cpu/cdef_LPBlackfin.h>
+#include <asm/arch-common/cdef_LPBlackfin.h>
 
 /* Clock and System Control (0xFFC0 0400-0xFFC0 07FF) */
 #define pPLL_CTL ((volatile unsigned short *)PLL_CTL)
similarity index 93%
rename from include/asm-blackfin/cpu/cdefBF533.h
rename to include/asm-blackfin/arch-bf533/cdefBF533.h
index 8c751e6073f2f90bd1f0d334df2463d569d80b4e..c72bac91e0d091c0c3968b42086ccb467832a23a 100644 (file)
@@ -19,6 +19,6 @@
 #ifndef _CDEFBF533_H
 #define _CDEFBF533_H
 
-#include <asm/cpu/cdefBF532.h>
+#include <asm/arch-bf533/cdefBF532.h>
 
 #endif /* _CDEFBF533_H */
similarity index 93%
rename from include/asm-blackfin/cpu/defBF532.h
rename to include/asm-blackfin/arch-bf533/defBF532.h
index 26a5fe6442ec640e92376cebfaf99169bbdf46cd..25a74e68466f2918ca036dc4c70e6b9a37474d34 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 /* include all Core registers and bit definitions */
-#include <asm/cpu/def_LPBlackfin.h>
+#include <asm/arch-common/def_LPBlackfin.h>
 
 /* Helper macros
  * usage:
@@ -51,7 +51,7 @@
 #define VR_CTL                 0xFFC00008      /* Voltage Regulator Control Register (16-bit) */
 #define PLL_STAT               0xFFC0000C      /* PLL Status register (16-bit) */
 #define PLL_LOCKCNT            0xFFC00010      /* PLL Lock Count register (16-bit) */
-#define        CHIPID                  0xFFC00014      /* Chip ID register (32-bit)    */
+#define        CHIPID                  0xFFC00014      /* Chip ID register (32-bit)    */
 #define SWRST                  0xFFC00100      /* Software Reset Register (16-bit) */
 #define SYSCR                  0xFFC00104      /* System Configuration register */
 
@@ -88,7 +88,7 @@
 #define UART_LCR               0xFFC0040C      /* Line Control Register */
 #define UART_MCR               0xFFC00410      /* Modem Control Register */
 #define UART_LSR               0xFFC00414      /* Line Status Register */
-/* #define UART_MSR 0xFFC00418 */      /* Modem Status Register (UNUSED in ADSP-BF532) */
+/* #define UART_MSR 0xFFC00418 */              /* Modem Status Register (UNUSED in ADSP-BF532) */
 #define UART_SCR               0xFFC0041C      /* SCR Scratch Register */
 #define UART_GCTL              0xFFC00424      /* Global Control Register */
 
 #define BYPASS                 0x00000100      /* Bypass the PLL */
 
 /* PLL_DIV Masks */
-#define SCLK_DIV(x)            (x)             /* SCLK = VCO / x */
+#define SCLK_DIV(x)            (x)     /* SCLK = VCO / x */
 
 #define CCLK_DIV1              0x00000000      /* CCLK = VCO / 1 */
 #define CCLK_DIV2              0x00000010      /* CCLK = VCO / 2 */
  */
 
 /* SIC_IAR0 Masks */
-#define P0_IVG(x)              ((x)-7)         /* Peripheral #0 assigned IVG #x */
+#define P0_IVG(x)              ((x)-7) /* Peripheral #0 assigned IVG #x */
 #define P1_IVG(x)              ((x)-7) << 0x4  /* Peripheral #1 assigned IVG #x */
 #define P2_IVG(x)              ((x)-7) << 0x8  /* Peripheral #2 assigned IVG #x */
 #define P3_IVG(x)              ((x)-7) << 0xC  /* Peripheral #3 assigned IVG #x */
 #define P7_IVG(x)              ((x)-7) << 0x1C /* Peripheral #7 assigned IVG #x */
 
 /* SIC_IAR1 Masks */
-#define P8_IVG(x)              ((x)-7)         /* Peripheral #8 assigned IVG #x */
+#define P8_IVG(x)              ((x)-7) /* Peripheral #8 assigned IVG #x */
 #define P9_IVG(x)              ((x)-7) << 0x4  /* Peripheral #9 assigned IVG #x */
 #define P10_IVG(x)             ((x)-7) << 0x8  /* Peripheral #10 assigned IVG #x */
 #define P11_IVG(x)             ((x)-7) << 0xC  /* Peripheral #11 assigned IVG #x */
 #define P15_IVG(x)             ((x)-7) << 0x1C /* Peripheral #15 assigned IVG #x */
 
 /* SIC_IAR2 Masks */
-#define P16_IVG(x)             ((x)-7)         /* Peripheral #16 assigned IVG #x */
+#define P16_IVG(x)             ((x)-7) /* Peripheral #16 assigned IVG #x */
 #define P17_IVG(x)             ((x)-7) << 0x4  /* Peripheral #17 assigned IVG #x */
 #define P18_IVG(x)             ((x)-7) << 0x8  /* Peripheral #18 assigned IVG #x */
 #define P19_IVG(x)             ((x)-7) << 0xC  /* Peripheral #19 assigned IVG #x */
 #define        RTDAY                   0xFFFE0000      /* Real-Time Clock Days */
 
 /* RTC_ICTL register */
-#define        SWIE                    0x0001          /* Stopwatch Interrupt Enable */
-#define        AIE                     0x0002          /* Alarm Interrupt Enable */
-#define        SIE                     0x0004          /* Seconds (1 Hz) Interrupt Enable */
-#define        MIE                     0x0008          /* Minutes Interrupt Enable */
-#define        HIE                     0x0010          /* Hours Interrupt Enable */
-#define        DIE                     0x0020          /* 24 Hours (Days) Interrupt Enable */
-#define        DAIE                    0x0040          /* Day Alarm (Day, Hour, Minute, Second) Interrupt Enable */
-#define        WCIE                    0x8000          /* Write Complete Interrupt Enable */
+#define        SWIE                    0x0001  /* Stopwatch Interrupt Enable */
+#define        AIE                     0x0002  /* Alarm Interrupt Enable */
+#define        SIE                     0x0004  /* Seconds (1 Hz) Interrupt Enable */
+#define        MIE                     0x0008  /* Minutes Interrupt Enable */
+#define        HIE                     0x0010  /* Hours Interrupt Enable */
+#define        DIE                     0x0020  /* 24 Hours (Days) Interrupt Enable */
+#define        DAIE                    0x0040  /* Day Alarm (Day, Hour, Minute, Second) Interrupt Enable */
+#define        WCIE                    0x8000  /* Write Complete Interrupt Enable */
 
 /* RTC_ISTAT register */
-#define        SWEF                    0x0001          /* Stopwatch Event Flag */
-#define        AEF                     0x0002          /* Alarm Event Flag */
-#define        SEF                     0x0004          /* Seconds (1 Hz) Event Flag */
-#define        MEF                     0x0008          /* Minutes Event Flag */
-#define        HEF                     0x0010          /* Hours Event Flag */
-#define        DEF                     0x0020          /* 24 Hours (Days) Event Flag */
-#define        DAEF                    0x0040          /* Day Alarm (Day, Hour, Minute, Second) Event Flag */
-#define        WPS                     0x4000          /* Write Pending Status (RO) */
-#define        WCOM                    0x8000          /* Write Complete */
+#define        SWEF                    0x0001  /* Stopwatch Event Flag */
+#define        AEF                     0x0002  /* Alarm Event Flag */
+#define        SEF                     0x0004  /* Seconds (1 Hz) Event Flag */
+#define        MEF                     0x0008  /* Minutes Event Flag */
+#define        HEF                     0x0010  /* Hours Event Flag */
+#define        DEF                     0x0020  /* 24 Hours (Days) Event Flag */
+#define        DAEF                    0x0040  /* Day Alarm (Day, Hour, Minute, Second) Event Flag */
+#define        WPS                     0x4000  /* Write Pending Status (RO) */
+#define        WCOM                    0x8000  /* Write Complete */
 
 /* RTC_FAST Mask (RTC_PREN Mask) */
 #define ENABLE_PRESCALE                0x00000001      /* Enable prescaler so RTC runs at 1 Hz */
  * SERIAL PORT MASKS
  */
 /* SPORTx_TCR1 Masks */
-#define TSPEN                  0x0001          /* TX enable */
-#define ITCLK                  0x0002          /* Internal TX Clock Select */
-#define TDTYPE                 0x000C          /* TX Data Formatting Select */
-#define TLSBIT                 0x0010          /* TX Bit Order */
-#define ITFS                   0x0200          /* Internal TX Frame Sync Select */
-#define TFSR                   0x0400          /* TX Frame Sync Required Select */
-#define DITFS                  0x0800          /* Data Independent TX Frame Sync Select */
-#define LTFS                   0x1000          /* Low TX Frame Sync Select */
-#define LATFS                  0x2000          /* Late TX Frame Sync Select */
-#define TCKFE                  0x4000          /* TX Clock Falling Edge Select */
+#define TSPEN                  0x0001  /* TX enable */
+#define ITCLK                  0x0002  /* Internal TX Clock Select */
+#define TDTYPE                 0x000C  /* TX Data Formatting Select */
+#define TLSBIT                 0x0010  /* TX Bit Order */
+#define ITFS                   0x0200  /* Internal TX Frame Sync Select */
+#define TFSR                   0x0400  /* TX Frame Sync Required Select */
+#define DITFS                  0x0800  /* Data Independent TX Frame Sync Select */
+#define LTFS                   0x1000  /* Low TX Frame Sync Select */
+#define LATFS                  0x2000  /* Late TX Frame Sync Select */
+#define TCKFE                  0x4000  /* TX Clock Falling Edge Select */
 
 /* SPORTx_TCR2 Masks */
-#define SLEN                   0x001F          /*TX Word Length */
-#define TXSE                   0x0100          /*TX Secondary Enable */
-#define TSFSE                  0x0200          /*TX Stereo Frame Sync Enable */
-#define TRFST                  0x0400          /*TX Right-First Data Order */
+#define SLEN                   0x001F  /*TX Word Length */
+#define TXSE                   0x0100  /*TX Secondary Enable */
+#define TSFSE                  0x0200  /*TX Stereo Frame Sync Enable */
+#define TRFST                  0x0400  /*TX Right-First Data Order */
 
 /* SPORTx_RCR1 Masks */
-#define RSPEN                  0x0001          /* RX enable */
-#define IRCLK                  0x0002          /* Internal RX Clock Select */
-#define RDTYPE                 0x000C          /* RX Data Formatting Select */
-#define RULAW                  0x0008          /* u-Law enable */
-#define RALAW                  0x000C          /* A-Law enable */
-#define RLSBIT                 0x0010          /* RX Bit Order */
-#define IRFS                   0x0200          /* Internal RX Frame Sync Select */
-#define RFSR                   0x0400          /* RX Frame Sync Required Select */
-#define LRFS                   0x1000          /* Low RX Frame Sync Select */
-#define LARFS                  0x2000          /* Late RX Frame Sync Select */
-#define RCKFE                  0x4000          /* RX Clock Falling Edge Select */
+#define RSPEN                  0x0001  /* RX enable */
+#define IRCLK                  0x0002  /* Internal RX Clock Select */
+#define RDTYPE                 0x000C  /* RX Data Formatting Select */
+#define RULAW                  0x0008  /* u-Law enable */
+#define RALAW                  0x000C  /* A-Law enable */
+#define RLSBIT                 0x0010  /* RX Bit Order */
+#define IRFS                   0x0200  /* Internal RX Frame Sync Select */
+#define RFSR                   0x0400  /* RX Frame Sync Required Select */
+#define LRFS                   0x1000  /* Low RX Frame Sync Select */
+#define LARFS                  0x2000  /* Late RX Frame Sync Select */
+#define RCKFE                  0x4000  /* RX Clock Falling Edge Select */
 
 /* SPORTx_RCR2 Masks */
-#define SLEN                   0x001F          /* RX Word Length */
-#define RXSE                   0x0100          /* RX Secondary Enable */
-#define RSFSE                  0x0200          /* RX Stereo Frame Sync Enable */
-#define RRFST                  0x0400          /* Right-First Data Order */
+#define SLEN                   0x001F  /* RX Word Length */
+#define RXSE                   0x0100  /* RX Secondary Enable */
+#define RSFSE                  0x0200  /* RX Stereo Frame Sync Enable */
+#define RRFST                  0x0400  /* Right-First Data Order */
 
 /* SPORTx_STAT Masks */
-#define RXNE                   0x0001          /* RX FIFO Not Empty Status */
-#define RUVF                   0x0002          /* RX Underflow Status */
-#define ROVF                   0x0004          /* RX Overflow Status */
-#define TXF                    0x0008          /* TX FIFO Full Status */
-#define TUVF                   0x0010          /* TX Underflow Status */
-#define TOVF                   0x0020          /* TX Overflow Status */
-#define TXHRE                  0x0040          /* TX Hold Register Empty */
+#define RXNE                   0x0001  /* RX FIFO Not Empty Status */
+#define RUVF                   0x0002  /* RX Underflow Status */
+#define ROVF                   0x0004  /* RX Overflow Status */
+#define TXF                    0x0008  /* TX FIFO Full Status */
+#define TUVF                   0x0010  /* TX Underflow Status */
+#define TOVF                   0x0020  /* TX Overflow Status */
+#define TXHRE                  0x0040  /* TX Hold Register Empty */
 
 /* SPORTx_MCMC1 Masks */
 #define WSIZE                  0x0000F000      /* Multichannel Window Size Field */
 #define SKIP_EN                        0x00000200      /* PPI Skip Element Enable */
 #define SKIP_EO                        0x00000400      /* PPI Skip Even/Odd Elements */
 #define DLENGTH                        0x00003800      /* PPI Data Length */
-#define DLEN_8                 0x0             /* PPI Data Length mask for DLEN=8 */
+#define DLEN_8                 0x0     /* PPI Data Length mask for DLEN=8 */
 #define DLEN(x)                        (((x-9) & 0x07) << 11)  /* PPI Data Length (only works for x=10-->x=16) */
 #define POL                    0x0000C000      /* PPI Signal Polarities */
 
 #define NDSIZE                 0x00000900      /* Next Descriptor Size */
 #define FLOW                   0x00007000      /* Flow Control */
 
-#define DMAEN_P                        0               /* Channel Enable */
-#define WNR_P                  1               /* Channel Direction (W/R*) */
-#define DMA2D_P                        4               /* 2D/1D* Mode */
-#define RESTART_P              5               /* Restart */
-#define DI_SEL_P               6               /* Data Interrupt Select */
-#define DI_EN_P                        7               /* Data Interrupt Enable */
+#define DMAEN_P                        0       /* Channel Enable */
+#define WNR_P                  1       /* Channel Direction (W/R*) */
+#define DMA2D_P                        4       /* 2D/1D* Mode */
+#define RESTART_P              5       /* Restart */
+#define DI_SEL_P               6       /* Data Interrupt Select */
+#define DI_EN_P                        7       /* Data Interrupt Enable */
 
 /* DMAx_IRQ_STATUS, MDMA_yy_IRQ_STATUS Masks */
 #define DMA_DONE               0x00000001      /* DMA Done Indicator */
 #define DFETCH                 0x00000004      /* Descriptor Fetch Indicator */
 #define DMA_RUN                        0x00000008      /* DMA Running Indicator */
 
-#define DMA_DONE_P             0               /* DMA Done Indicator */
-#define DMA_ERR_P              1               /* DMA Error Indicator */
-#define DFETCH_P               2               /* Descriptor Fetch Indicator */
-#define DMA_RUN_P              3               /* DMA Running Indicator */
+#define DMA_DONE_P             0       /* DMA Done Indicator */
+#define DMA_ERR_P              1       /* DMA Error Indicator */
+#define DFETCH_P               2       /* Descriptor Fetch Indicator */
+#define DMA_RUN_P              3       /* DMA Running Indicator */
 
 /* DMAx_PERIPHERAL_MAP, MDMA_yy_PERIPHERAL_MAP Masks */
 #define CTYPE                  0x00000040      /* DMA Channel Type Indicator */
-#define CTYPE_P                        6               /* DMA Channel Type Indicator BIT POSITION */
+#define CTYPE_P                        6       /* DMA Channel Type Indicator BIT POSITION */
 #define PCAP8                  0x00000080      /* DMA 8-bit Operation Indicator */
 #define PCAP16                 0x00000100      /* DMA 16-bit Operation Indicator */
 #define PCAP32                 0x00000200      /* DMA 32-bit Operation Indicator */
 #define SDEASE                 0x00000010      /* SDRAM EAB sticky error status - W1C */
 #define BGSTAT                 0x00000020      /* Bus granted */
 
-#endif /* _DEF_BF532_H */
+#endif /* _DEF_BF532_H */
similarity index 95%
rename from include/asm-blackfin/cpu/defBF533_extn.h
rename to include/asm-blackfin/arch-bf533/defBF533_extn.h
index a9a1c7ccbd66128fbf193a355e99eadd24a93014..045e8e49f8519d952bdcad731c77682395bfb77f 100644 (file)
 #ifndef _DEF_BF533_EXTN_H
 #define _DEF_BF533_EXTN_H
 
-#define OFFSET_( x )           ((x) & 0x0000FFFF) /* define macro for offset */
+/* define macro for offset */
+#define OFFSET_( x )           ((x) & 0x0000FFFF)
 /* Delay inserted for PLL transition */
-#define DELAY                  0x1000
+#define PLL_DELAY                      0x1000
 
 #define L1_ISRAM               0xFFA00000
 #define L1_ISRAM_END           0xFFA10000
similarity index 97%
rename from include/asm-blackfin/cpu/bf533_irq.h
rename to include/asm-blackfin/arch-bf533/irq.h
index 9c5230db414cce6867d419cc4cdb9a4bc6a0804e..323574590bfbd6afb00d0778968d494ec5b0dab6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot bf533_irq.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * linux/arch/$(ARCH)/platform/$(PLATFORM)/irq.c
@@ -33,8 +33,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BF533_IRQ_H_
diff --git a/include/asm-blackfin/arch-bf537/anomaly.h b/include/asm-blackfin/arch-bf537/anomaly.h
new file mode 100644 (file)
index 0000000..50b44da
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * File: include/asm-blackfin/arch-bf537/anomaly.h
+ * Based on:
+ * Author:
+ *
+ * Created:
+ * Description:
+ *
+ * Rev:
+ *
+ * Modified:
+ *
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, 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; see the file COPYING.
+ * If not, write to the Free Software Foundation,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* This file shoule be up to date with:
+ *  - Revision J, June 1, 2006; ADSP-BF537 Blackfin Processor Anomaly List
+ *  - Revision I, June 1, 2006; ADSP-BF536 Blackfin Processor Anomaly List
+ *  - Revision J, June 1, 2006; ADSP-BF534 Blackfin Processor Anomaly List
+ */
+
+#ifndef _MACH_ANOMALY_H_
+#define _MACH_ANOMALY_H_
+
+/* We do not support 0.1 silicon - sorry */
+#if (defined(CONFIG_BF_REV_0_1))
+#error Kernel will not work on BF537/6/4 Version 0.1
+#endif
+
+#if (defined(CONFIG_BF_REV_0_3) || defined(CONFIG_BF_REV_0_2))
+#define ANOMALY_05000074       /* A multi issue instruction with dsp32shiftimm in
+                                  slot1 and store of a P register in slot 2 is not
+                                  supported */
+#define ANOMALY_05000119       /* DMA_RUN bit is not valid after a Peripheral Receive
+                                  Channel DMA stops */
+#define ANOMALY_05000122       /* Rx.H can not be used to access 16-bit System MMR
+                                  registers. */
+#define ANOMALY_05000166       /* PPI Data Lengths Between 8 and 16 do not zero out
+                                  upper bits */
+#define ANOMALY_05000180       /* PPI_DELAY not functional in PPI modes with 0 frame
+                                  syncs */
+#if (defined(CONFIG_BF537) || defined(CONFIG_BF536))
+#define ANOMALY_05000247       /* CLKIN Buffer Output Enable Reset Behavior Is
+                                  Changed */
+#endif
+#define ANOMALY_05000265       /* Sensitivity to noise with slow input edge rates on
+                                  SPORT external receive and transmit clocks. */
+#define ANOMALY_05000272       /* Certain data cache write through modes fail for
+                                  VDDint <=0.9V */
+#define ANOMALY_05000273       /* Writes to Synchronous SDRAM memory may be lost */
+#define ANOMALY_05000277       /* Writes to a flag data register one SCLK cycle after
+                                  an edge is detected may clear interrupt */
+#define ANOMALY_05000281       /* False Hardware Error Exception when ISR context is
+                                  not restored */
+#define ANOMALY_05000282       /* Memory DMA corruption with 32-bit data and traffic
+                                  control */
+#define ANOMALY_05000283       /* A system MMR write is stalled indefinitely when
+                                  killed in a particular stage */
+#endif
+
+#if defined(CONFIG_BF_REV_0_2)
+#define ANOMALY_05000244       /* With instruction cache enabled, a CSYNC or SSYNC or
+                                  IDLE around a Change of Control causes
+                                  unpredictable results */
+#define ANOMALY_05000250       /* Incorrect Bit-Shift of Data Word in Multichannel
+                                  (TDM) */
+#if (defined(CONFIG_BF537) || defined(CONFIG_BF536))
+#define ANOMALY_05000252       /* EMAC Tx DMA error after an early frame abort */
+#endif
+#define ANOMALY_05000253       /* Maximum external clock speed for Timers */
+#define ANOMALY_05000255       /* Entering Hibernate Mode with RTC Seconds event
+                                  interrupt not functional */
+#if (defined(CONFIG_BF537) || defined(CONFIG_BF536))
+#define ANOMALY_05000256       /* EMAC MDIO input latched on wrong MDC edge */
+#endif
+#define ANOMALY_05000257       /* An interrupt or exception during short Hardware
+                                  loops may cause the instruction fetch unit to
+                                  malfunction */
+#define ANOMALY_05000258       /* Instruction Cache is corrupted when bit 9 and 12 of
+                                  the ICPLB Data registers differ */
+#define ANOMALY_05000260       /* ICPLB_STATUS MMR register may be corrupted */
+#define ANOMALY_05000261       /* DCPLB_FAULT_ADDR MMR register may be corrupted */
+#define ANOMALY_05000262       /* Stores to data cache may be lost */
+#define ANOMALY_05000263       /* Hardware loop corrupted when taking an ICPLB exception */
+#define ANOMALY_05000264       /* A Sync instruction (CSYNC, SSYNC) or an IDLE
+                                  instruction will cause an infinite stall in the
+                                  second to last instruction in a hardware loop */
+#define ANOMALY_05000268       /* Memory DMA error when peripheral DMA is running
+                                  and non-zero DEB_TRAFFIC_PERIOD value */
+#define ANOMALY_05000270       /* High I/O activity causes the output voltage of the
+                                  internal voltage regulator (VDDint) to decrease */
+#define ANOMALY_05000277       /* Writes to a flag data register one SCLK cycle after
+                                  an edge is detected may clear interrupt */
+#define ANOMALY_05000278       /* Disabling Peripherals with DMA running may cause
+                                  DMA system instability */
+#define ANOMALY_05000280       /* SPI Master boot mode does not work well with
+                                  Atmel Dataflash devices */
+
+#endif                         /* CONFIG_BF_REV_0_2 */
+
+#endif                         /* _MACH_ANOMALY_H_ */
diff --git a/include/asm-blackfin/arch-bf537/bf537_serial.h b/include/asm-blackfin/arch-bf537/bf537_serial.h
new file mode 100644 (file)
index 0000000..64088f2
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * U-boot bf537_serial.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _BF537_SERIAL_H_
+#define _BF537_SERIAL_H_
+
+#define BYTE_REF(addr)         (*((volatile char*)addr))
+#define HALFWORD_REF(addr)     (*((volatile short*)addr))
+#define WORD_REF(addr)         (*((volatile long*)addr))
+
+#define UART_THR_LO            HALFWORD_REF(UART_THR)
+#define UART_RBR_LO            HALFWORD_REF(UART_RBR)
+#define UART_DLL_LO            HALFWORD_REF(UART_DLL)
+#define UART_IER_LO            HALFWORD_REF(UART_IER)
+#define UART_IER_ERBFI         0x01
+#define UART_IER_ETBEI         0x02
+#define UART_IER_ELSI          0x04
+#define UART_IER_EDDSI         0x08
+
+#define UART_DLH_LO            HALFWORD_REF(UART_DLH)
+#define UART_IIR_LO            HALFWORD_REF(UART_IIR)
+#define UART_IIR_NOINT         0x01
+#define UART_IIR_STATUS                0x06
+#define UART_IIR_LSR           0x06
+#define UART_IIR_RBR           0x04
+#define UART_IIR_THR           0x02
+#define UART_IIR_MSR           0x00
+
+#define UART_LCR_LO            HALFWORD_REF(UART_LCR)
+#define UART_LCR_WLS5          0
+#define UART_LCR_WLS6          0x01
+#define UART_LCR_WLS7          0x02
+#define UART_LCR_WLS8          0x03
+#define UART_LCR_STB           0x04
+#define UART_LCR_PEN           0x08
+#define UART_LCR_EPS           0x10
+#define UART_LCR_SP            0x20
+#define UART_LCR_SB            0x40
+#define UART_LCR_DLAB          0x80
+
+#define UART_MCR_LO            HALFWORD_REF(UART_MCR)
+
+#define UART_LSR_LO            HALFWORD_REF(UART_LSR)
+#define UART_LSR_DR            0x01
+#define UART_LSR_OE            0x02
+#define UART_LSR_PE            0x04
+#define UART_LSR_FE            0x08
+#define UART_LSR_BI            0x10
+#define UART_LSR_THRE          0x20
+#define UART_LSR_TEMT          0x40
+
+#define UART_MSR_LO            HALFWORD_REF(UART_MSR)
+#define UART_SCR_LO            HALFWORD_REF(UART_SCR)
+#define UART_GCTL_LO           HALFWORD_REF(UART_GCTL)
+#define UART_GCTL_UCEN         0x01
+
+#endif
diff --git a/include/asm-blackfin/arch-bf537/bf5xx_rtc.h b/include/asm-blackfin/arch-bf537/bf5xx_rtc.h
new file mode 100644 (file)
index 0000000..db5cc6f
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * U-boot - bf537_rtc.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _BF537_RTC_H_
+#define _BF537_RTC_H_
+
+void rtc_init(void);
+void wait_for_complete(void);
+void rtc_reset(void);
+
+#define MIN_TO_SECS(_x_)       (60 * _x_)
+#define HRS_TO_SECS(_x_)       (60 * 60 * _x_)
+#define DAYS_TO_SECS(_x_)      (24 * 60 * 60 * _x_)
+
+#define NUM_SECS_IN_DAY                (24 * 3600)
+#define NUM_SECS_IN_HOUR       (3600)
+#define NUM_SECS_IN_MIN                (60)
+
+/* Shift values for RTC_STAT register */
+#define DAY_BITS_OFF           17
+#define HOUR_BITS_OFF          12
+#define MIN_BITS_OFF           6
+#define SEC_BITS_OFF           0
+
+#endif
diff --git a/include/asm-blackfin/arch-bf537/cdefBF534.h b/include/asm-blackfin/arch-bf537/cdefBF534.h
new file mode 100644 (file)
index 0000000..5a89e92
--- /dev/null
@@ -0,0 +1,1009 @@
+/*
+ * Copyright (C) 2005 Analog Devices Inc., All Rights Reserved.
+ *
+ ***********************************************************************************
+ *
+ * This include file contains a list of macro "defines" to enable the programmer
+ * to use symbolic names for register-access.
+ *
+ *   ----------------------------
+ *   revision 0.1
+ *   date: 2005/01/27 14:31:01;  author: joeb
+ *   Initial revision
+ */
+
+/*
+ * System MMR Register Map
+ */
+
+#ifndef _CDEF_BF534_H
+#define _CDEF_BF534_H
+
+/* Include all Core registers and bit definitions */
+#include <asm/arch-bf537/defBF534.h>
+
+/* Include core specific register pointer definitions */
+#include <asm/arch-common/cdef_LPBlackfin.h>
+
+#define pCHIPID ((volatile unsigned long *)CHIPID)
+
+/* Clock and System Control    (0xFFC00000 - 0xFFC000FF) */
+#define pPLL_CTL               ((volatile unsigned short *)PLL_CTL)
+#define pPLL_DIV               ((volatile unsigned short *)PLL_DIV)
+#define pVR_CTL                ((volatile unsigned short *)VR_CTL)
+#define pPLL_STAT              ((volatile unsigned short *)PLL_STAT)
+#define pPLL_LOCKCNT           ((volatile unsigned short *)PLL_LOCKCNT)
+
+/* System Interrupt Controller (0xFFC00100 - 0xFFC001FF) */
+#define pSWRST                         ((volatile unsigned short *)SWRST)
+#define pSYSCR                         ((volatile unsigned short *)SYSCR)
+#define        pSIC_RVECT              ((void * volatile *)SIC_RVECT)
+#define pSIC_IMASK             ((volatile unsigned long  *)SIC_IMASK)
+#define pSIC_IAR0              ((volatile unsigned long  *)SIC_IAR0)
+#define pSIC_IAR1              ((volatile unsigned long  *)SIC_IAR1)
+#define pSIC_IAR2              ((volatile unsigned long  *)SIC_IAR2)
+#define pSIC_IAR3              ((volatile unsigned long  *)SIC_IAR3)
+#define pSIC_ISR               ((volatile unsigned long  *)SIC_ISR)
+#define pSIC_IWR               ((volatile unsigned long  *)SIC_IWR)
+
+/* Watchdog Timer              (0xFFC00200 - 0xFFC002FF) */
+#define pWDOG_CTL              ((volatile unsigned short *)WDOG_CTL)
+#define pWDOG_CNT              ((volatile unsigned long  *)WDOG_CNT)
+#define pWDOG_STAT             ((volatile unsigned long  *)WDOG_STAT)
+
+/* Real Time Clock             (0xFFC00300 - 0xFFC003FF) */
+#define pRTC_STAT              ((volatile unsigned long  *)RTC_STAT)
+#define pRTC_ICTL              ((volatile unsigned short *)RTC_ICTL)
+#define pRTC_ISTAT             ((volatile unsigned short *)RTC_ISTAT)
+#define pRTC_SWCNT             ((volatile unsigned short *)RTC_SWCNT)
+#define pRTC_ALARM             ((volatile unsigned long  *)RTC_ALARM)
+#define pRTC_FAST              ((volatile unsigned short *)RTC_FAST)
+#define pRTC_PREN              ((volatile unsigned short *)RTC_PREN)
+
+/* UART0 Controller            (0xFFC00400 - 0xFFC004FF) */
+#define pUART0_THR             ((volatile unsigned short *)UART0_THR)
+#define pUART0_RBR             ((volatile unsigned short *)UART0_RBR)
+#define pUART0_DLL             ((volatile unsigned short *)UART0_DLL)
+#define pUART0_IER             ((volatile unsigned short *)UART0_IER)
+#define pUART0_DLH             ((volatile unsigned short *)UART0_DLH)
+#define pUART0_IIR             ((volatile unsigned short *)UART0_IIR)
+#define pUART0_LCR             ((volatile unsigned short *)UART0_LCR)
+#define pUART0_MCR             ((volatile unsigned short *)UART0_MCR)
+#define pUART0_LSR             ((volatile unsigned short *)UART0_LSR)
+#define pUART0_MSR             ((volatile unsigned short *)UART0_LSR)
+#define pUART0_SCR             ((volatile unsigned short *)UART0_SCR)
+#define pUART0_GCTL            ((volatile unsigned short *)UART0_GCTL)
+
+/* SPI Controller              (0xFFC00500 - 0xFFC005FF) */
+#define pSPI_CTL               ((volatile unsigned short *)SPI_CTL)
+#define pSPI_FLG               ((volatile unsigned short *)SPI_FLG)
+#define pSPI_STAT              ((volatile unsigned short *)SPI_STAT)
+#define pSPI_TDBR              ((volatile unsigned short *)SPI_TDBR)
+#define pSPI_RDBR              ((volatile unsigned short *)SPI_RDBR)
+#define pSPI_BAUD              ((volatile unsigned short *)SPI_BAUD)
+#define pSPI_SHADOW            ((volatile unsigned short *)SPI_SHADOW)
+
+/* TIMER0-7 Registers          (0xFFC00600 - 0xFFC006FF) */
+#define pTIMER0_CONFIG                 ((volatile unsigned short *)TIMER0_CONFIG)
+#define pTIMER0_COUNTER        ((volatile unsigned long  *)TIMER0_COUNTER)
+#define pTIMER0_PERIOD                 ((volatile unsigned long  *)TIMER0_PERIOD)
+#define pTIMER0_WIDTH          ((volatile unsigned long  *)TIMER0_WIDTH)
+
+#define pTIMER1_CONFIG                 ((volatile unsigned short *)TIMER1_CONFIG)
+#define pTIMER1_COUNTER        ((volatile unsigned long  *)TIMER1_COUNTER)
+#define pTIMER1_PERIOD                 ((volatile unsigned long  *)TIMER1_PERIOD)
+#define pTIMER1_WIDTH          ((volatile unsigned long  *)TIMER1_WIDTH)
+
+#define pTIMER2_CONFIG                 ((volatile unsigned short *)TIMER2_CONFIG)
+#define pTIMER2_COUNTER        ((volatile unsigned long  *)TIMER2_COUNTER)
+#define pTIMER2_PERIOD                 ((volatile unsigned long  *)TIMER2_PERIOD)
+#define pTIMER2_WIDTH          ((volatile unsigned long  *)TIMER2_WIDTH)
+
+#define pTIMER3_CONFIG                 ((volatile unsigned short *)TIMER3_CONFIG)
+#define pTIMER3_COUNTER        ((volatile unsigned long  *)TIMER3_COUNTER)
+#define pTIMER3_PERIOD                 ((volatile unsigned long  *)TIMER3_PERIOD)
+#define pTIMER3_WIDTH          ((volatile unsigned long  *)TIMER3_WIDTH)
+
+#define pTIMER4_CONFIG                 ((volatile unsigned short *)TIMER4_CONFIG)
+#define pTIMER4_COUNTER        ((volatile unsigned long  *)TIMER4_COUNTER)
+#define pTIMER4_PERIOD                 ((volatile unsigned long  *)TIMER4_PERIOD)
+#define pTIMER4_WIDTH          ((volatile unsigned long  *)TIMER4_WIDTH)
+
+#define pTIMER5_CONFIG                 ((volatile unsigned short *)TIMER5_CONFIG)
+#define pTIMER5_COUNTER        ((volatile unsigned long  *)TIMER5_COUNTER)
+#define pTIMER5_PERIOD                 ((volatile unsigned long  *)TIMER5_PERIOD)
+#define pTIMER5_WIDTH          ((volatile unsigned long  *)TIMER5_WIDTH)
+
+#define pTIMER6_CONFIG                 ((volatile unsigned short *)TIMER6_CONFIG)
+#define pTIMER6_COUNTER        ((volatile unsigned long  *)TIMER6_COUNTER)
+#define pTIMER6_PERIOD                 ((volatile unsigned long  *)TIMER6_PERIOD)
+#define pTIMER6_WIDTH          ((volatile unsigned long  *)TIMER6_WIDTH)
+
+#define pTIMER7_CONFIG                 ((volatile unsigned short *)TIMER7_CONFIG)
+#define pTIMER7_COUNTER        ((volatile unsigned long  *)TIMER7_COUNTER)
+#define pTIMER7_PERIOD                 ((volatile unsigned long  *)TIMER7_PERIOD)
+#define pTIMER7_WIDTH          ((volatile unsigned long  *)TIMER7_WIDTH)
+
+#define pTIMER_ENABLE          ((volatile unsigned short *)TIMER_ENABLE)
+#define pTIMER_DISABLE                 ((volatile unsigned short *)TIMER_DISABLE)
+#define pTIMER_STATUS          ((volatile unsigned long  *)TIMER_STATUS)
+
+/* General Purpose I/O Port F (0xFFC00700 - 0xFFC007FF) */
+#define pPORTFIO               ((volatile unsigned short *)PORTFIO)
+#define pPORTFIO_CLEAR         ((volatile unsigned short *)PORTFIO_CLEAR)
+#define pPORTFIO_SET           ((volatile unsigned short *)PORTFIO_SET)
+#define pPORTFIO_TOGGLE        ((volatile unsigned short *)PORTFIO_TOGGLE)
+#define pPORTFIO_MASKA         ((volatile unsigned short *)PORTFIO_MASKA)
+#define pPORTFIO_MASKA_CLEAR   ((volatile unsigned short *)PORTFIO_MASKA_CLEAR)
+#define pPORTFIO_MASKA_SET     ((volatile unsigned short *)PORTFIO_MASKA_SET)
+#define pPORTFIO_MASKA_TOGGLE  ((volatile unsigned short *)PORTFIO_MASKA_TOGGLE)
+#define pPORTFIO_MASKB         ((volatile unsigned short *)PORTFIO_MASKB)
+#define pPORTFIO_MASKB_CLEAR   ((volatile unsigned short *)PORTFIO_MASKB_CLEAR)
+#define pPORTFIO_MASKB_SET     ((volatile unsigned short *)PORTFIO_MASKB_SET)
+#define pPORTFIO_MASKB_TOGGLE  ((volatile unsigned short *)PORTFIO_MASKB_TOGGLE)
+#define pPORTFIO_DIR           ((volatile unsigned short *)PORTFIO_DIR)
+#define pPORTFIO_POLAR         ((volatile unsigned short *)PORTFIO_POLAR)
+#define pPORTFIO_EDGE          ((volatile unsigned short *)PORTFIO_EDGE)
+#define pPORTFIO_BOTH          ((volatile unsigned short *)PORTFIO_BOTH)
+#define pPORTFIO_INEN          ((volatile unsigned short *)PORTFIO_INEN)
+
+#define pFIO_DIR               pPORTFIO_DIR
+#define pFIO_FLAG_C            pPORTFIO_CLEAR
+#define pFIO_FLAG_S            pPORTFIO_SET
+#define pFIO_INEN              pPORTFIO_INEN
+#define pFIO_FLAG_D            pPORTFIO
+
+/* SPORT0 Controller           (0xFFC00800 - 0xFFC008FF) */
+#define pSPORT0_TCR1           ((volatile unsigned short *)SPORT0_TCR1)
+#define pSPORT0_TCR2           ((volatile unsigned short *)SPORT0_TCR2)
+#define pSPORT0_TCLKDIV                ((volatile unsigned short *)SPORT0_TCLKDIV)
+#define pSPORT0_TFSDIV         ((volatile unsigned short *)SPORT0_TFSDIV)
+#define pSPORT0_TX             ((volatile unsigned long  *)SPORT0_TX)
+#define pSPORT0_RX             ((volatile unsigned long  *)SPORT0_RX)
+#define pSPORT0_TX32           ((volatile unsigned long  *)SPORT0_TX)
+#define pSPORT0_RX32           ((volatile unsigned long  *)SPORT0_RX)
+#define pSPORT0_TX16           ((volatile unsigned short *)SPORT0_TX)
+#define pSPORT0_RX16           ((volatile unsigned short *)SPORT0_RX)
+#define pSPORT0_RCR1           ((volatile unsigned short *)SPORT0_RCR1)
+#define pSPORT0_RCR2           ((volatile unsigned short *)SPORT0_RCR2)
+#define pSPORT0_RCLKDIV                ((volatile unsigned short *)SPORT0_RCLKDIV)
+#define pSPORT0_RFSDIV         ((volatile unsigned short *)SPORT0_RFSDIV)
+#define pSPORT0_STAT           ((volatile unsigned short *)SPORT0_STAT)
+#define pSPORT0_CHNL           ((volatile unsigned short *)SPORT0_CHNL)
+#define pSPORT0_MCMC1          ((volatile unsigned short *)SPORT0_MCMC1)
+#define pSPORT0_MCMC2          ((volatile unsigned short *)SPORT0_MCMC2)
+#define pSPORT0_MTCS0          ((volatile unsigned long  *)SPORT0_MTCS0)
+#define pSPORT0_MTCS1          ((volatile unsigned long  *)SPORT0_MTCS1)
+#define pSPORT0_MTCS2          ((volatile unsigned long  *)SPORT0_MTCS2)
+#define pSPORT0_MTCS3          ((volatile unsigned long  *)SPORT0_MTCS3)
+#define pSPORT0_MRCS0          ((volatile unsigned long  *)SPORT0_MRCS0)
+#define pSPORT0_MRCS1          ((volatile unsigned long  *)SPORT0_MRCS1)
+#define pSPORT0_MRCS2          ((volatile unsigned long  *)SPORT0_MRCS2)
+#define pSPORT0_MRCS3          ((volatile unsigned long  *)SPORT0_MRCS3)
+
+/* SPORT1 Controller           (0xFFC00900 - 0xFFC009FF) */
+#define pSPORT1_TCR1           ((volatile unsigned short *)SPORT1_TCR1)
+#define pSPORT1_TCR2           ((volatile unsigned short *)SPORT1_TCR2)
+#define pSPORT1_TCLKDIV                ((volatile unsigned short *)SPORT1_TCLKDIV)
+#define pSPORT1_TFSDIV         ((volatile unsigned short *)SPORT1_TFSDIV)
+#define pSPORT1_TX             ((volatile unsigned long  *)SPORT1_TX)
+#define pSPORT1_RX             ((volatile unsigned long  *)SPORT1_RX)
+#define pSPORT1_TX32           ((volatile unsigned long  *)SPORT1_TX)
+#define pSPORT1_RX32           ((volatile unsigned long  *)SPORT1_RX)
+#define pSPORT1_TX16           ((volatile unsigned short *)SPORT1_TX)
+#define pSPORT1_RX16           ((volatile unsigned short *)SPORT1_RX)
+#define pSPORT1_RCR1           ((volatile unsigned short *)SPORT1_RCR1)
+#define pSPORT1_RCR2           ((volatile unsigned short *)SPORT1_RCR2)
+#define pSPORT1_RCLKDIV                ((volatile unsigned short *)SPORT1_RCLKDIV)
+#define pSPORT1_RFSDIV         ((volatile unsigned short *)SPORT1_RFSDIV)
+#define pSPORT1_STAT           ((volatile unsigned short *)SPORT1_STAT)
+#define pSPORT1_CHNL           ((volatile unsigned short *)SPORT1_CHNL)
+#define pSPORT1_MCMC1          ((volatile unsigned short *)SPORT1_MCMC1)
+#define pSPORT1_MCMC2          ((volatile unsigned short *)SPORT1_MCMC2)
+#define pSPORT1_MTCS0          ((volatile unsigned long  *)SPORT1_MTCS0)
+#define pSPORT1_MTCS1          ((volatile unsigned long  *)SPORT1_MTCS1)
+#define pSPORT1_MTCS2          ((volatile unsigned long  *)SPORT1_MTCS2)
+#define pSPORT1_MTCS3          ((volatile unsigned long  *)SPORT1_MTCS3)
+#define pSPORT1_MRCS0          ((volatile unsigned long  *)SPORT1_MRCS0)
+#define pSPORT1_MRCS1          ((volatile unsigned long  *)SPORT1_MRCS1)
+#define pSPORT1_MRCS2          ((volatile unsigned long  *)SPORT1_MRCS2)
+#define pSPORT1_MRCS3          ((volatile unsigned long  *)SPORT1_MRCS3)
+
+/* External Bus Interface Unit (0xFFC00A00 - 0xFFC00AFF) */
+#define pEBIU_AMGCTL           ((volatile unsigned short *)EBIU_AMGCTL)
+#define pEBIU_AMBCTL0          ((volatile unsigned long  *)EBIU_AMBCTL0)
+#define pEBIU_AMBCTL1          ((volatile unsigned long  *)EBIU_AMBCTL1)
+#define pEBIU_SDGCTL           ((volatile unsigned long  *)EBIU_SDGCTL)
+#define pEBIU_SDBCTL           ((volatile unsigned short *)EBIU_SDBCTL)
+#define pEBIU_SDRRC            ((volatile unsigned short *)EBIU_SDRRC)
+#define pEBIU_SDSTAT           ((volatile unsigned short *)EBIU_SDSTAT)
+
+/* DMA Traffic Control Registers */
+#define        pDMA_TCPER              ((volatile unsigned short *)DMA_TCPER)
+#define        pDMA_TCCNT              ((volatile unsigned short *)DMA_TCCNT)
+
+/* DMA Controller */
+#define pDMA0_CONFIG           ((volatile unsigned short *)DMA0_CONFIG)
+#define pDMA0_NEXT_DESC_PTR    ((void * volatile *)DMA0_NEXT_DESC_PTR)
+#define pDMA0_START_ADDR       ((void * volatile *)DMA0_START_ADDR)
+#define pDMA0_X_COUNT          ((volatile unsigned short *)DMA0_X_COUNT)
+#define pDMA0_Y_COUNT          ((volatile unsigned short *)DMA0_Y_COUNT)
+#define pDMA0_X_MODIFY         ((volatile signed   short *)DMA0_X_MODIFY)
+#define pDMA0_Y_MODIFY         ((volatile signed   short *)DMA0_Y_MODIFY)
+#define pDMA0_CURR_DESC_PTR    ((void * volatile *)DMA0_CURR_DESC_PTR)
+#define pDMA0_CURR_ADDR                ((void * volatile *)DMA0_CURR_ADDR)
+#define pDMA0_CURR_X_COUNT     ((volatile unsigned short *)DMA0_CURR_X_COUNT)
+#define pDMA0_CURR_Y_COUNT     ((volatile unsigned short *)DMA0_CURR_Y_COUNT)
+#define pDMA0_IRQ_STATUS       ((volatile unsigned short *)DMA0_IRQ_STATUS)
+#define pDMA0_PERIPHERAL_MAP   ((volatile unsigned short *)DMA0_PERIPHERAL_MAP)
+
+#define pDMA1_CONFIG           ((volatile unsigned short *)DMA1_CONFIG)
+#define pDMA1_NEXT_DESC_PTR    ((void * volatile *)DMA1_NEXT_DESC_PTR)
+#define pDMA1_START_ADDR       ((void * volatile *)DMA1_START_ADDR)
+#define pDMA1_X_COUNT          ((volatile unsigned short *)DMA1_X_COUNT)
+#define pDMA1_Y_COUNT          ((volatile unsigned short *)DMA1_Y_COUNT)
+#define pDMA1_X_MODIFY         ((volatile signed   short *)DMA1_X_MODIFY)
+#define pDMA1_Y_MODIFY         ((volatile signed   short *)DMA1_Y_MODIFY)
+#define pDMA1_CURR_DESC_PTR    ((void * volatile *)DMA1_CURR_DESC_PTR)
+#define pDMA1_CURR_ADDR                ((void * volatile *)DMA1_CURR_ADDR)
+#define pDMA1_CURR_X_COUNT     ((volatile unsigned short *)DMA1_CURR_X_COUNT)
+#define pDMA1_CURR_Y_COUNT     ((volatile unsigned short *)DMA1_CURR_Y_COUNT)
+#define pDMA1_IRQ_STATUS       ((volatile unsigned short *)DMA1_IRQ_STATUS)
+#define pDMA1_PERIPHERAL_MAP   ((volatile unsigned short *)DMA1_PERIPHERAL_MAP)
+
+#define pDMA2_CONFIG           ((volatile unsigned short *)DMA2_CONFIG)
+#define pDMA2_NEXT_DESC_PTR    ((void * volatile *)DMA2_NEXT_DESC_PTR)
+#define pDMA2_START_ADDR       ((void * volatile *)DMA2_START_ADDR)
+#define pDMA2_X_COUNT          ((volatile unsigned short *)DMA2_X_COUNT)
+#define pDMA2_Y_COUNT          ((volatile unsigned short *)DMA2_Y_COUNT)
+#define pDMA2_X_MODIFY         ((volatile signed   short *)DMA2_X_MODIFY)
+#define pDMA2_Y_MODIFY         ((volatile signed   short *)DMA2_Y_MODIFY)
+#define pDMA2_CURR_DESC_PTR    ((void * volatile *)DMA2_CURR_DESC_PTR)
+#define pDMA2_CURR_ADDR                ((void * volatile *)DMA2_CURR_ADDR)
+#define pDMA2_CURR_X_COUNT     ((volatile unsigned short *)DMA2_CURR_X_COUNT)
+#define pDMA2_CURR_Y_COUNT     ((volatile unsigned short *)DMA2_CURR_Y_COUNT)
+#define pDMA2_IRQ_STATUS       ((volatile unsigned short *)DMA2_IRQ_STATUS)
+#define pDMA2_PERIPHERAL_MAP   ((volatile unsigned short *)DMA2_PERIPHERAL_MAP)
+
+#define pDMA3_CONFIG           ((volatile unsigned short *)DMA3_CONFIG)
+#define pDMA3_NEXT_DESC_PTR    ((void * volatile *)DMA3_NEXT_DESC_PTR)
+#define pDMA3_START_ADDR       ((void * volatile *)DMA3_START_ADDR)
+#define pDMA3_X_COUNT          ((volatile unsigned short *)DMA3_X_COUNT)
+#define pDMA3_Y_COUNT          ((volatile unsigned short *)DMA3_Y_COUNT)
+#define pDMA3_X_MODIFY         ((volatile signed   short *)DMA3_X_MODIFY)
+#define pDMA3_Y_MODIFY         ((volatile signed   short *)DMA3_Y_MODIFY)
+#define pDMA3_CURR_DESC_PTR    ((void * volatile *)DMA3_CURR_DESC_PTR)
+#define pDMA3_CURR_ADDR                ((void * volatile *)DMA3_CURR_ADDR)
+#define pDMA3_CURR_X_COUNT     ((volatile unsigned short *)DMA3_CURR_X_COUNT)
+#define pDMA3_CURR_Y_COUNT     ((volatile unsigned short *)DMA3_CURR_Y_COUNT)
+#define pDMA3_IRQ_STATUS       ((volatile unsigned short *)DMA3_IRQ_STATUS)
+#define pDMA3_PERIPHERAL_MAP   ((volatile unsigned short *)DMA3_PERIPHERAL_MAP)
+
+#define pDMA4_CONFIG           ((volatile unsigned short *)DMA4_CONFIG)
+#define pDMA4_NEXT_DESC_PTR    ((void * volatile *)DMA4_NEXT_DESC_PTR)
+#define pDMA4_START_ADDR       ((void * volatile *)DMA4_START_ADDR)
+#define pDMA4_X_COUNT          ((volatile unsigned short *)DMA4_X_COUNT)
+#define pDMA4_Y_COUNT          ((volatile unsigned short *)DMA4_Y_COUNT)
+#define pDMA4_X_MODIFY         ((volatile signed   short *)DMA4_X_MODIFY)
+#define pDMA4_Y_MODIFY         ((volatile signed   short *)DMA4_Y_MODIFY)
+#define pDMA4_CURR_DESC_PTR    ((void * volatile *)DMA4_CURR_DESC_PTR)
+#define pDMA4_CURR_ADDR        ((void * volatile *)DMA4_CURR_ADDR)
+#define pDMA4_CURR_X_COUNT     ((volatile unsigned short *)DMA4_CURR_X_COUNT)
+#define pDMA4_CURR_Y_COUNT     ((volatile unsigned short *)DMA4_CURR_Y_COUNT)
+#define pDMA4_IRQ_STATUS       ((volatile unsigned short *)DMA4_IRQ_STATUS)
+#define pDMA4_PERIPHERAL_MAP   ((volatile unsigned short *)DMA4_PERIPHERAL_MAP)
+
+#define pDMA5_CONFIG           ((volatile unsigned short *)DMA5_CONFIG)
+#define pDMA5_NEXT_DESC_PTR    ((void * volatile *)DMA5_NEXT_DESC_PTR)
+#define pDMA5_START_ADDR       ((void * volatile *)DMA5_START_ADDR)
+#define pDMA5_X_COUNT          ((volatile unsigned short *)DMA5_X_COUNT)
+#define pDMA5_Y_COUNT          ((volatile unsigned short *)DMA5_Y_COUNT)
+#define pDMA5_X_MODIFY         ((volatile signed   short *)DMA5_X_MODIFY)
+#define pDMA5_Y_MODIFY         ((volatile signed   short *)DMA5_Y_MODIFY)
+#define pDMA5_CURR_DESC_PTR    ((void * volatile *)DMA5_CURR_DESC_PTR)
+#define pDMA5_CURR_ADDR                ((void * volatile *)DMA5_CURR_ADDR)
+#define pDMA5_CURR_X_COUNT     ((volatile unsigned short *)DMA5_CURR_X_COUNT)
+#define pDMA5_CURR_Y_COUNT     ((volatile unsigned short *)DMA5_CURR_Y_COUNT)
+#define pDMA5_IRQ_STATUS       ((volatile unsigned short *)DMA5_IRQ_STATUS)
+#define pDMA5_PERIPHERAL_MAP   ((volatile unsigned short *)DMA5_PERIPHERAL_MAP)
+
+#define pDMA6_CONFIG           ((volatile unsigned short *)DMA6_CONFIG)
+#define pDMA6_NEXT_DESC_PTR    ((void * volatile *)DMA6_NEXT_DESC_PTR)
+#define pDMA6_START_ADDR       ((void * volatile *)DMA6_START_ADDR)
+#define pDMA6_X_COUNT          ((volatile unsigned short *)DMA6_X_COUNT)
+#define pDMA6_Y_COUNT          ((volatile unsigned short *)DMA6_Y_COUNT)
+#define pDMA6_X_MODIFY         ((volatile signed   short *)DMA6_X_MODIFY)
+#define pDMA6_Y_MODIFY         ((volatile signed   short *)DMA6_Y_MODIFY)
+#define pDMA6_CURR_DESC_PTR    ((void * volatile *)DMA6_CURR_DESC_PTR)
+#define pDMA6_CURR_ADDR                ((void * volatile *)DMA6_CURR_ADDR)
+#define pDMA6_CURR_X_COUNT     ((volatile unsigned short *)DMA6_CURR_X_COUNT)
+#define pDMA6_CURR_Y_COUNT     ((volatile unsigned short *)DMA6_CURR_Y_COUNT)
+#define pDMA6_IRQ_STATUS       ((volatile unsigned short *)DMA6_IRQ_STATUS)
+#define pDMA6_PERIPHERAL_MAP   ((volatile unsigned short *)DMA6_PERIPHERAL_MAP)
+
+#define pDMA7_CONFIG           ((volatile unsigned short *)DMA7_CONFIG)
+#define pDMA7_NEXT_DESC_PTR    ((void * volatile *)DMA7_NEXT_DESC_PTR)
+#define pDMA7_START_ADDR       ((void * volatile *)DMA7_START_ADDR)
+#define pDMA7_X_COUNT          ((volatile unsigned short *)DMA7_X_COUNT)
+#define pDMA7_Y_COUNT          ((volatile unsigned short *)DMA7_Y_COUNT)
+#define pDMA7_X_MODIFY         ((volatile signed   short *)DMA7_X_MODIFY)
+#define pDMA7_Y_MODIFY         ((volatile signed   short *)DMA7_Y_MODIFY)
+#define pDMA7_CURR_DESC_PTR    ((void * volatile *)DMA7_CURR_DESC_PTR)
+#define pDMA7_CURR_ADDR                ((void * volatile *)DMA7_CURR_ADDR)
+#define pDMA7_CURR_X_COUNT     ((volatile unsigned short *)DMA7_CURR_X_COUNT)
+#define pDMA7_CURR_Y_COUNT     ((volatile unsigned short *)DMA7_CURR_Y_COUNT)
+#define pDMA7_IRQ_STATUS       ((volatile unsigned short *)DMA7_IRQ_STATUS)
+#define pDMA7_PERIPHERAL_MAP   ((volatile unsigned short *)DMA7_PERIPHERAL_MAP)
+
+#define pDMA8_CONFIG           ((volatile unsigned short *)DMA8_CONFIG)
+#define pDMA8_NEXT_DESC_PTR    ((void * volatile *)DMA8_NEXT_DESC_PTR)
+#define pDMA8_START_ADDR       ((void * volatile *)DMA8_START_ADDR)
+#define pDMA8_X_COUNT          ((volatile unsigned short *)DMA8_X_COUNT)
+#define pDMA8_Y_COUNT          ((volatile unsigned short *)DMA8_Y_COUNT)
+#define pDMA8_X_MODIFY         ((volatile signed   short *)DMA8_X_MODIFY)
+#define pDMA8_Y_MODIFY         ((volatile signed   short *)DMA8_Y_MODIFY)
+#define pDMA8_CURR_DESC_PTR    ((void * volatile *)DMA8_CURR_DESC_PTR)
+#define pDMA8_CURR_ADDR                ((void * volatile *)DMA8_CURR_ADDR)
+#define pDMA8_CURR_X_COUNT     ((volatile unsigned short *)DMA8_CURR_X_COUNT)
+#define pDMA8_CURR_Y_COUNT     ((volatile unsigned short *)DMA8_CURR_Y_COUNT)
+#define pDMA8_IRQ_STATUS       ((volatile unsigned short *)DMA8_IRQ_STATUS)
+#define pDMA8_PERIPHERAL_MAP   ((volatile unsigned short *)DMA8_PERIPHERAL_MAP)
+
+#define pDMA9_CONFIG           ((volatile unsigned short *)DMA9_CONFIG)
+#define pDMA9_NEXT_DESC_PTR    ((void * volatile *)DMA9_NEXT_DESC_PTR)
+#define pDMA9_START_ADDR       ((void * volatile *)DMA9_START_ADDR)
+#define pDMA9_X_COUNT          ((volatile unsigned short *)DMA9_X_COUNT)
+#define pDMA9_Y_COUNT          ((volatile unsigned short *)DMA9_Y_COUNT)
+#define pDMA9_X_MODIFY         ((volatile signed   short *)DMA9_X_MODIFY)
+#define pDMA9_Y_MODIFY         ((volatile signed   short *)DMA9_Y_MODIFY)
+#define pDMA9_CURR_DESC_PTR    ((void * volatile *)DMA9_CURR_DESC_PTR)
+#define pDMA9_CURR_ADDR                ((void * volatile *)DMA9_CURR_ADDR)
+#define pDMA9_CURR_X_COUNT     ((volatile unsigned short *)DMA9_CURR_X_COUNT)
+#define pDMA9_CURR_Y_COUNT     ((volatile unsigned short *)DMA9_CURR_Y_COUNT)
+#define pDMA9_IRQ_STATUS       ((volatile unsigned short *)DMA9_IRQ_STATUS)
+#define pDMA9_PERIPHERAL_MAP   ((volatile unsigned short *)DMA9_PERIPHERAL_MAP)
+
+#define pDMA10_CONFIG          ((volatile unsigned short *)DMA10_CONFIG)
+#define pDMA10_NEXT_DESC_PTR   ((void * volatile *)DMA10_NEXT_DESC_PTR)
+#define pDMA10_START_ADDR      ((void * volatile *)DMA10_START_ADDR)
+#define pDMA10_X_COUNT         ((volatile unsigned short *)DMA10_X_COUNT)
+#define pDMA10_Y_COUNT         ((volatile unsigned short *)DMA10_Y_COUNT)
+#define pDMA10_X_MODIFY                ((volatile signed   short *)DMA10_X_MODIFY)
+#define pDMA10_Y_MODIFY                ((volatile signed   short *)DMA10_Y_MODIFY)
+#define pDMA10_CURR_DESC_PTR   ((void * volatile *)DMA10_CURR_DESC_PTR)
+#define pDMA10_CURR_ADDR       ((void * volatile *)DMA10_CURR_ADDR)
+#define pDMA10_CURR_X_COUNT    ((volatile unsigned short *)DMA10_CURR_X_COUNT)
+#define pDMA10_CURR_Y_COUNT    ((volatile unsigned short *)DMA10_CURR_Y_COUNT)
+#define pDMA10_IRQ_STATUS      ((volatile unsigned short *)DMA10_IRQ_STATUS)
+#define pDMA10_PERIPHERAL_MAP  ((volatile unsigned short *)DMA10_PERIPHERAL_MAP)
+
+#define pDMA11_CONFIG          ((volatile unsigned short *)DMA11_CONFIG)
+#define pDMA11_NEXT_DESC_PTR   ((void * volatile *)DMA11_NEXT_DESC_PTR)
+#define pDMA11_START_ADDR      ((void * volatile *)DMA11_START_ADDR)
+#define pDMA11_X_COUNT         ((volatile unsigned short *)DMA11_X_COUNT)
+#define pDMA11_Y_COUNT         ((volatile unsigned short *)DMA11_Y_COUNT)
+#define pDMA11_X_MODIFY                ((volatile signed   short *)DMA11_X_MODIFY)
+#define pDMA11_Y_MODIFY                ((volatile signed   short *)DMA11_Y_MODIFY)
+#define pDMA11_CURR_DESC_PTR   ((void * volatile *)DMA11_CURR_DESC_PTR)
+#define pDMA11_CURR_ADDR       ((void * volatile *)DMA11_CURR_ADDR)
+#define pDMA11_CURR_X_COUNT    ((volatile unsigned short *)DMA11_CURR_X_COUNT)
+#define pDMA11_CURR_Y_COUNT    ((volatile unsigned short *)DMA11_CURR_Y_COUNT)
+#define pDMA11_IRQ_STATUS      ((volatile unsigned short *)DMA11_IRQ_STATUS)
+#define pDMA11_PERIPHERAL_MAP  ((volatile unsigned short *)DMA11_PERIPHERAL_MAP)
+
+#define pMDMA_D0_CONFIG                ((volatile unsigned short *)MDMA_D0_CONFIG)
+#define pMDMA_D0_NEXT_DESC_PTR ((void * volatile *)MDMA_D0_NEXT_DESC_PTR)
+#define pMDMA_D0_START_ADDR    ((void * volatile *)MDMA_D0_START_ADDR)
+#define pMDMA_D0_X_COUNT       ((volatile unsigned short *)MDMA_D0_X_COUNT)
+#define pMDMA_D0_Y_COUNT       ((volatile unsigned short *)MDMA_D0_Y_COUNT)
+#define pMDMA_D0_X_MODIFY      ((volatile signed   short *)MDMA_D0_X_MODIFY)
+#define pMDMA_D0_Y_MODIFY      ((volatile signed   short *)MDMA_D0_Y_MODIFY)
+#define pMDMA_D0_CURR_DESC_PTR ((void * volatile *)MDMA_D0_CURR_DESC_PTR)
+#define pMDMA_D0_CURR_ADDR     ((void * volatile *)MDMA_D0_CURR_ADDR)
+#define pMDMA_D0_CURR_X_COUNT  ((volatile unsigned short *)MDMA_D0_CURR_X_COUNT)
+#define pMDMA_D0_CURR_Y_COUNT  ((volatile unsigned short *)MDMA_D0_CURR_Y_COUNT)
+#define pMDMA_D0_IRQ_STATUS    ((volatile unsigned short *)MDMA_D0_IRQ_STATUS)
+#define pMDMA_D0_PERIPHERAL_MAP ((volatile unsigned short *)MDMA_D0_PERIPHERAL_MAP)
+
+#define pMDMA_S0_CONFIG                ((volatile unsigned short *)MDMA_S0_CONFIG)
+#define pMDMA_S0_NEXT_DESC_PTR ((void * volatile *)MDMA_S0_NEXT_DESC_PTR)
+#define pMDMA_S0_START_ADDR    ((void * volatile *)MDMA_S0_START_ADDR)
+#define pMDMA_S0_X_COUNT       ((volatile unsigned short *)MDMA_S0_X_COUNT)
+#define pMDMA_S0_Y_COUNT       ((volatile unsigned short *)MDMA_S0_Y_COUNT)
+#define pMDMA_S0_X_MODIFY      ((volatile signed   short *)MDMA_S0_X_MODIFY)
+#define pMDMA_S0_Y_MODIFY      ((volatile signed   short *)MDMA_S0_Y_MODIFY)
+#define pMDMA_S0_CURR_DESC_PTR ((void * volatile *)MDMA_S0_CURR_DESC_PTR)
+#define pMDMA_S0_CURR_ADDR     ((void * volatile *)MDMA_S0_CURR_ADDR)
+#define pMDMA_S0_CURR_X_COUNT  ((volatile unsigned short *)MDMA_S0_CURR_X_COUNT)
+#define pMDMA_S0_CURR_Y_COUNT  ((volatile unsigned short *)MDMA_S0_CURR_Y_COUNT)
+#define pMDMA_S0_IRQ_STATUS    ((volatile unsigned short *)MDMA_S0_IRQ_STATUS)
+#define pMDMA_S0_PERIPHERAL_MAP        ((volatile unsigned short *)MDMA_S0_PERIPHERAL_MAP)
+
+#define pMDMA_D1_CONFIG                ((volatile unsigned short *)MDMA_D1_CONFIG)
+#define pMDMA_D1_NEXT_DESC_PTR ((void * volatile *)MDMA_D1_NEXT_DESC_PTR)
+#define pMDMA_D1_START_ADDR    ((void * volatile *)MDMA_D1_START_ADDR)
+#define pMDMA_D1_X_COUNT       ((volatile unsigned short *)MDMA_D1_X_COUNT)
+#define pMDMA_D1_Y_COUNT       ((volatile unsigned short *)MDMA_D1_Y_COUNT)
+#define pMDMA_D1_X_MODIFY      ((volatile signed   short *)MDMA_D1_X_MODIFY)
+#define pMDMA_D1_Y_MODIFY      ((volatile signed   short *)MDMA_D1_Y_MODIFY)
+#define pMDMA_D1_CURR_DESC_PTR ((void * volatile *)MDMA_D1_CURR_DESC_PTR)
+#define pMDMA_D1_CURR_ADDR     ((void * volatile *)MDMA_D1_CURR_ADDR)
+#define pMDMA_D1_CURR_X_COUNT  ((volatile unsigned short *)MDMA_D1_CURR_X_COUNT)
+#define pMDMA_D1_CURR_Y_COUNT  ((volatile unsigned short *)MDMA_D1_CURR_Y_COUNT)
+#define pMDMA_D1_IRQ_STATUS    ((volatile unsigned short *)MDMA_D1_IRQ_STATUS)
+#define pMDMA_D1_PERIPHERAL_MAP        ((volatile unsigned short *)MDMA_D1_PERIPHERAL_MAP)
+
+#define pMDMA_S1_CONFIG                ((volatile unsigned short *)MDMA_S1_CONFIG)
+#define pMDMA_S1_NEXT_DESC_PTR ((void * volatile *)MDMA_S1_NEXT_DESC_PTR)
+#define pMDMA_S1_START_ADDR    ((void * volatile *)MDMA_S1_START_ADDR)
+#define pMDMA_S1_X_COUNT       ((volatile unsigned short *)MDMA_S1_X_COUNT)
+#define pMDMA_S1_Y_COUNT       ((volatile unsigned short *)MDMA_S1_Y_COUNT)
+#define pMDMA_S1_X_MODIFY      ((volatile signed   short *)MDMA_S1_X_MODIFY)
+#define pMDMA_S1_Y_MODIFY      ((volatile signed   short *)MDMA_S1_Y_MODIFY)
+#define pMDMA_S1_CURR_DESC_PTR ((void * volatile *)MDMA_S1_CURR_DESC_PTR)
+#define pMDMA_S1_CURR_ADDR     ((void * volatile *)MDMA_S1_CURR_ADDR)
+#define pMDMA_S1_CURR_X_COUNT  ((volatile unsigned short *)MDMA_S1_CURR_X_COUNT)
+#define pMDMA_S1_CURR_Y_COUNT  ((volatile unsigned short *)MDMA_S1_CURR_Y_COUNT)
+#define pMDMA_S1_IRQ_STATUS    ((volatile unsigned short *)MDMA_S1_IRQ_STATUS)
+#define pMDMA_S1_PERIPHERAL_MAP        ((volatile unsigned short *)MDMA_S1_PERIPHERAL_MAP)
+
+/* Parallel Peripheral Interface (0xFFC01000 - 0xFFC010FF) */
+#define pPPI_CONTROL           ((volatile unsigned short *)PPI_CONTROL)
+#define pPPI_STATUS            ((volatile unsigned short *)PPI_STATUS)
+#define pPPI_DELAY             ((volatile unsigned short *)PPI_DELAY)
+#define pPPI_COUNT             ((volatile unsigned short *)PPI_COUNT)
+#define pPPI_FRAME             ((volatile unsigned short *)PPI_FRAME)
+
+/* Two-Wire Interface          (0xFFC01400 - 0xFFC014FF) */
+#define pTWI_CLKDIV            ((volatile unsigned short *)TWI_CLKDIV)
+#define pTWI_CONTROL           ((volatile unsigned short *)TWI_CONTROL)
+#define pTWI_SLAVE_CTL         ((volatile unsigned short *)TWI_SLAVE_CTL)
+#define pTWI_SLAVE_STAT                ((volatile unsigned short *)TWI_SLAVE_STAT)
+#define pTWI_SLAVE_ADDR                ((volatile unsigned short *)TWI_SLAVE_ADDR)
+#define pTWI_MASTER_CTL                ((volatile unsigned short *)TWI_MASTER_CTL)
+#define pTWI_MASTER_STAT       ((volatile unsigned short *)TWI_MASTER_STAT)
+#define pTWI_MASTER_ADDR       ((volatile unsigned short *)TWI_MASTER_ADDR)
+#define pTWI_INT_STAT          ((volatile unsigned short *)TWI_INT_STAT)
+#define pTWI_INT_MASK          ((volatile unsigned short *)TWI_INT_MASK)
+#define pTWI_FIFO_CTL          ((volatile unsigned short *)TWI_FIFO_CTL)
+#define pTWI_FIFO_STAT         ((volatile unsigned short *)TWI_FIFO_STAT)
+#define pTWI_XMT_DATA8         ((volatile unsigned short *)TWI_XMT_DATA8)
+#define pTWI_XMT_DATA16                ((volatile unsigned short *)TWI_XMT_DATA16)
+#define pTWI_RCV_DATA8         ((volatile unsigned short *)TWI_RCV_DATA8)
+#define pTWI_RCV_DATA16                ((volatile unsigned short *)TWI_RCV_DATA16)
+
+/* General Purpose I/O Port G (0xFFC01500 - 0xFFC015FF) */
+#define pPORTGIO               ((volatile unsigned short *)PORTGIO)
+#define pPORTGIO_CLEAR         ((volatile unsigned short *)PORTGIO_CLEAR)
+#define pPORTGIO_SET           ((volatile unsigned short *)PORTGIO_SET)
+#define pPORTGIO_TOGGLE        ((volatile unsigned short *)PORTGIO_TOGGLE)
+#define pPORTGIO_MASKA         ((volatile unsigned short *)PORTGIO_MASKA)
+#define pPORTGIO_MASKA_CLEAR   ((volatile unsigned short *)PORTGIO_MASKA_CLEAR)
+#define pPORTGIO_MASKA_SET     ((volatile unsigned short *)PORTGIO_MASKA_SET)
+#define pPORTGIO_MASKA_TOGGLE  ((volatile unsigned short *)PORTGIO_MASKA_TOGGLE)
+#define pPORTGIO_MASKB         ((volatile unsigned short *)PORTGIO_MASKB)
+#define pPORTGIO_MASKB_CLEAR   ((volatile unsigned short *)PORTGIO_MASKB_CLEAR)
+#define pPORTGIO_MASKB_SET     ((volatile unsigned short *)PORTGIO_MASKB_SET)
+#define pPORTGIO_MASKB_TOGGLE  ((volatile unsigned short *)PORTGIO_MASKB_TOGGLE)
+#define pPORTGIO_DIR           ((volatile unsigned short *)PORTGIO_DIR)
+#define pPORTGIO_POLAR         ((volatile unsigned short *)PORTGIO_POLAR)
+#define pPORTGIO_EDGE          ((volatile unsigned short *)PORTGIO_EDGE)
+#define pPORTGIO_BOTH          ((volatile unsigned short *)PORTGIO_BOTH)
+#define pPORTGIO_INEN          ((volatile unsigned short *)PORTGIO_INEN)
+
+/* General Purpose I/O Port H (0xFFC01700 - 0xFFC017FF) */
+#define pPORTHIO               ((volatile unsigned short *)PORTHIO)
+#define pPORTHIO_CLEAR         ((volatile unsigned short *)PORTHIO_CLEAR)
+#define pPORTHIO_SET           ((volatile unsigned short *)PORTHIO_SET)
+#define pPORTHIO_TOGGLE                ((volatile unsigned short *)PORTHIO_TOGGLE)
+#define pPORTHIO_MASKA         ((volatile unsigned short *)PORTHIO_MASKA)
+#define pPORTHIO_MASKA_CLEAR   ((volatile unsigned short *)PORTHIO_MASKA_CLEAR)
+#define pPORTHIO_MASKA_SET     ((volatile unsigned short *)PORTHIO_MASKA_SET)
+#define pPORTHIO_MASKA_TOGGLE  ((volatile unsigned short *)PORTHIO_MASKA_TOGGLE)
+#define pPORTHIO_MASKB         ((volatile unsigned short *)PORTHIO_MASKB)
+#define pPORTHIO_MASKB_CLEAR   ((volatile unsigned short *)PORTHIO_MASKB_CLEAR)
+#define pPORTHIO_MASKB_SET     ((volatile unsigned short *)PORTHIO_MASKB_SET)
+#define pPORTHIO_MASKB_TOGGLE  ((volatile unsigned short *)PORTHIO_MASKB_TOGGLE)
+#define pPORTHIO_DIR           ((volatile unsigned short *)PORTHIO_DIR)
+#define pPORTHIO_POLAR         ((volatile unsigned short *)PORTHIO_POLAR)
+#define pPORTHIO_EDGE          ((volatile unsigned short *)PORTHIO_EDGE)
+#define pPORTHIO_BOTH          ((volatile unsigned short *)PORTHIO_BOTH)
+#define pPORTHIO_INEN          ((volatile unsigned short *)PORTHIO_INEN)
+
+/* UART1 Controller            (0xFFC02000 - 0xFFC020FF) */
+#define pUART1_THR             ((volatile unsigned short *)UART1_THR)
+#define pUART1_RBR             ((volatile unsigned short *)UART1_RBR)
+#define pUART1_DLL             ((volatile unsigned short *)UART1_DLL)
+#define pUART1_IER             ((volatile unsigned short *)UART1_IER)
+#define pUART1_DLH             ((volatile unsigned short *)UART1_DLH)
+#define pUART1_IIR             ((volatile unsigned short *)UART1_IIR)
+#define pUART1_LCR             ((volatile unsigned short *)UART1_LCR)
+#define pUART1_MCR             ((volatile unsigned short *)UART1_MCR)
+#define pUART1_LSR             ((volatile unsigned short *)UART1_LSR)
+#define pUART1_MSR             ((volatile unsigned short *)UART1_LSR)
+#define pUART1_SCR             ((volatile unsigned short *)UART1_SCR)
+#define pUART1_GCTL            ((volatile unsigned short *)UART1_GCTL)
+
+/* default UART controller */
+#if (CONFIG_UART_CONSOLE==1)
+
+#define pUART_THR              pUART1_THR
+#define pUART_RBR              pUART1_RBR
+#define pUART_DLL              pUART1_DLL
+#define pUART_IER              pUART1_IER
+#define pUART_DLH              pUART1_DLH
+#define pUART_IIR              pUART1_IIR
+#define pUART_LCR              pUART1_LCR
+#define pUART_MCR              pUART1_MCR
+#define pUART_LSR              pUART1_LSR
+#define pUART_MSR              pUART1_MSR
+#define pUART_SCR              pUART1_SCR
+#define pUART_GCTL             pUART1_GCTL
+
+#else
+
+#define pUART_THR              pUART0_THR
+#define pUART_RBR              pUART0_RBR
+#define pUART_DLL              pUART0_DLL
+#define pUART_IER              pUART0_IER
+#define pUART_DLH              pUART0_DLH
+#define pUART_IIR              pUART0_IIR
+#define pUART_LCR              pUART0_LCR
+#define pUART_MCR              pUART0_MCR
+#define pUART_LSR              pUART0_LSR
+#define pUART_MSR              pUART0_MSR
+#define pUART_SCR              pUART0_SCR
+#define pUART_GCTL             pUART0_GCTL
+
+#endif
+
+/* CAN Controller              (0xFFC02A00 - 0xFFC02FFF) */
+/* For Mailboxes 0-15 */
+#define pCAN_MC1               ((volatile unsigned short *)CAN_MC1)
+#define pCAN_MD1               ((volatile unsigned short *)CAN_MD1)
+#define pCAN_TRS1              ((volatile unsigned short *)CAN_TRS1)
+#define pCAN_TRR1              ((volatile unsigned short *)CAN_TRR1)
+#define pCAN_TA1               ((volatile unsigned short *)CAN_TA1)
+#define pCAN_AA1               ((volatile unsigned short *)CAN_AA1)
+#define pCAN_RMP1              ((volatile unsigned short *)CAN_RMP1)
+#define pCAN_RML1              ((volatile unsigned short *)CAN_RML1)
+#define pCAN_MBTIF1            ((volatile unsigned short *)CAN_MBTIF1)
+#define pCAN_MBRIF1            ((volatile unsigned short *)CAN_MBRIF1)
+#define pCAN_MBIM1             ((volatile unsigned short *)CAN_MBIM1)
+#define pCAN_RFH1              ((volatile unsigned short *)CAN_RFH1)
+#define pCAN_OPSS1             ((volatile unsigned short *)CAN_OPSS1)
+
+/* For Mailboxes 16-31 */
+#define pCAN_MC2               ((volatile unsigned short *)CAN_MC2)
+#define pCAN_MD2               ((volatile unsigned short *)CAN_MD2)
+#define pCAN_TRS2              ((volatile unsigned short *)CAN_TRS2)
+#define pCAN_TRR2              ((volatile unsigned short *)CAN_TRR2)
+#define pCAN_TA2               ((volatile unsigned short *)CAN_TA2)
+#define pCAN_AA2               ((volatile unsigned short *)CAN_AA2)
+#define pCAN_RMP2              ((volatile unsigned short *)CAN_RMP2)
+#define pCAN_RML2              ((volatile unsigned short *)CAN_RML2)
+#define pCAN_MBTIF2            ((volatile unsigned short *)CAN_MBTIF2)
+#define pCAN_MBRIF2            ((volatile unsigned short *)CAN_MBRIF2)
+#define pCAN_MBIM2             ((volatile unsigned short *)CAN_MBIM2)
+#define pCAN_RFH2              ((volatile unsigned short *)CAN_RFH2)
+#define pCAN_OPSS2             ((volatile unsigned short *)CAN_OPSS2)
+
+#define pCAN_CLOCK             ((volatile unsigned short *)CAN_CLOCK)
+#define pCAN_TIMING            ((volatile unsigned short *)CAN_TIMING)
+#define pCAN_DEBUG             ((volatile unsigned short *)CAN_DEBUG)
+#define pCAN_STATUS            ((volatile unsigned short *)CAN_STATUS)
+#define pCAN_CEC               ((volatile unsigned short *)CAN_CEC)
+#define pCAN_GIS               ((volatile unsigned short *)CAN_GIS)
+#define pCAN_GIM               ((volatile unsigned short *)CAN_GIM)
+#define pCAN_GIF               ((volatile unsigned short *)CAN_GIF)
+#define pCAN_CONTROL           ((volatile unsigned short *)CAN_CONTROL)
+#define pCAN_INTR              ((volatile unsigned short *)CAN_INTR)
+#define pCAN_SFCMVER           ((volatile unsigned short *)CAN_SFCMVER)
+#define pCAN_MBTD              ((volatile unsigned short *)CAN_MBTD)
+#define pCAN_EWR               ((volatile unsigned short *)CAN_EWR)
+#define pCAN_ESR               ((volatile unsigned short *)CAN_ESR)
+#define pCAN_UCREG             ((volatile unsigned short *)CAN_UCREG)
+#define pCAN_UCCNT             ((volatile unsigned short *)CAN_UCCNT)
+#define pCAN_UCRC              ((volatile unsigned short *)CAN_UCRC)
+#define pCAN_UCCNF             ((volatile unsigned short *)CAN_UCCNF)
+#define pCAN_SFCMVER2          ((volatile unsigned short *)CAN_SFCMVER2)
+
+/* Mailbox Acceptance Masks */
+#define pCAN_AM00L             ((volatile unsigned short *)CAN_AM00L)
+#define pCAN_AM00H             ((volatile unsigned short *)CAN_AM00H)
+#define pCAN_AM01L             ((volatile unsigned short *)CAN_AM01L)
+#define pCAN_AM01H             ((volatile unsigned short *)CAN_AM01H)
+#define pCAN_AM02L             ((volatile unsigned short *)CAN_AM02L)
+#define pCAN_AM02H             ((volatile unsigned short *)CAN_AM02H)
+#define pCAN_AM03L             ((volatile unsigned short *)CAN_AM03L)
+#define pCAN_AM03H             ((volatile unsigned short *)CAN_AM03H)
+#define pCAN_AM04L             ((volatile unsigned short *)CAN_AM04L)
+#define pCAN_AM04H             ((volatile unsigned short *)CAN_AM04H)
+#define pCAN_AM05L             ((volatile unsigned short *)CAN_AM05L)
+#define pCAN_AM05H             ((volatile unsigned short *)CAN_AM05H)
+#define pCAN_AM06L             ((volatile unsigned short *)CAN_AM06L)
+#define pCAN_AM06H             ((volatile unsigned short *)CAN_AM06H)
+#define pCAN_AM07L             ((volatile unsigned short *)CAN_AM07L)
+#define pCAN_AM07H             ((volatile unsigned short *)CAN_AM07H)
+#define pCAN_AM08L             ((volatile unsigned short *)CAN_AM08L)
+#define pCAN_AM08H             ((volatile unsigned short *)CAN_AM08H)
+#define pCAN_AM09L             ((volatile unsigned short *)CAN_AM09L)
+#define pCAN_AM09H             ((volatile unsigned short *)CAN_AM09H)
+#define pCAN_AM10L             ((volatile unsigned short *)CAN_AM10L)
+#define pCAN_AM10H             ((volatile unsigned short *)CAN_AM10H)
+#define pCAN_AM11L             ((volatile unsigned short *)CAN_AM11L)
+#define pCAN_AM11H             ((volatile unsigned short *)CAN_AM11H)
+#define pCAN_AM12L             ((volatile unsigned short *)CAN_AM12L)
+#define pCAN_AM12H             ((volatile unsigned short *)CAN_AM12H)
+#define pCAN_AM13L             ((volatile unsigned short *)CAN_AM13L)
+#define pCAN_AM13H             ((volatile unsigned short *)CAN_AM13H)
+#define pCAN_AM14L             ((volatile unsigned short *)CAN_AM14L)
+#define pCAN_AM14H             ((volatile unsigned short *)CAN_AM14H)
+#define pCAN_AM15L             ((volatile unsigned short *)CAN_AM15L)
+#define pCAN_AM15H             ((volatile unsigned short *)CAN_AM15H)
+
+#define pCAN_AM16L             ((volatile unsigned short *)CAN_AM16L)
+#define pCAN_AM16H             ((volatile unsigned short *)CAN_AM16H)
+#define pCAN_AM17L             ((volatile unsigned short *)CAN_AM17L)
+#define pCAN_AM17H             ((volatile unsigned short *)CAN_AM17H)
+#define pCAN_AM18L             ((volatile unsigned short *)CAN_AM18L)
+#define pCAN_AM18H             ((volatile unsigned short *)CAN_AM18H)
+#define pCAN_AM19L             ((volatile unsigned short *)CAN_AM19L)
+#define pCAN_AM19H             ((volatile unsigned short *)CAN_AM19H)
+#define pCAN_AM20L             ((volatile unsigned short *)CAN_AM20L)
+#define pCAN_AM20H             ((volatile unsigned short *)CAN_AM20H)
+#define pCAN_AM21L             ((volatile unsigned short *)CAN_AM21L)
+#define pCAN_AM21H             ((volatile unsigned short *)CAN_AM21H)
+#define pCAN_AM22L             ((volatile unsigned short *)CAN_AM22L)
+#define pCAN_AM22H             ((volatile unsigned short *)CAN_AM22H)
+#define pCAN_AM23L             ((volatile unsigned short *)CAN_AM23L)
+#define pCAN_AM23H             ((volatile unsigned short *)CAN_AM23H)
+#define pCAN_AM24L             ((volatile unsigned short *)CAN_AM24L)
+#define pCAN_AM24H             ((volatile unsigned short *)CAN_AM24H)
+#define pCAN_AM25L             ((volatile unsigned short *)CAN_AM25L)
+#define pCAN_AM25H             ((volatile unsigned short *)CAN_AM25H)
+#define pCAN_AM26L             ((volatile unsigned short *)CAN_AM26L)
+#define pCAN_AM26H             ((volatile unsigned short *)CAN_AM26H)
+#define pCAN_AM27L             ((volatile unsigned short *)CAN_AM27L)
+#define pCAN_AM27H             ((volatile unsigned short *)CAN_AM27H)
+#define pCAN_AM28L             ((volatile unsigned short *)CAN_AM28L)
+#define pCAN_AM28H             ((volatile unsigned short *)CAN_AM28H)
+#define pCAN_AM29L             ((volatile unsigned short *)CAN_AM29L)
+#define pCAN_AM29H             ((volatile unsigned short *)CAN_AM29H)
+#define pCAN_AM30L             ((volatile unsigned short *)CAN_AM30L)
+#define pCAN_AM30H             ((volatile unsigned short *)CAN_AM30H)
+#define pCAN_AM31L             ((volatile unsigned short *)CAN_AM31L)
+#define pCAN_AM31H             ((volatile unsigned short *)CAN_AM31H)
+
+/* CAN Acceptance Mask Area Macros */
+#define pCAN_AM_L(x)           ((volatile unsigned short *)CAN_AM_L(x))
+#define pCAN_AM_H(x)           ((volatile unsigned short *)CAN_AM_H(x))
+
+/* Mailbox Registers */
+#define pCAN_MB00_ID1          ((volatile unsigned short *)CAN_MB00_ID1)
+#define pCAN_MB00_ID0          ((volatile unsigned short *)CAN_MB00_ID0)
+#define pCAN_MB00_TIMESTAMP    ((volatile unsigned short *)CAN_MB00_TIMESTAMP)
+#define pCAN_MB00_LENGTH       ((volatile unsigned short *)CAN_MB00_LENGTH)
+#define pCAN_MB00_DATA3                ((volatile unsigned short *)CAN_MB00_DATA3)
+#define pCAN_MB00_DATA2                ((volatile unsigned short *)CAN_MB00_DATA2)
+#define pCAN_MB00_DATA1                ((volatile unsigned short *)CAN_MB00_DATA1)
+#define pCAN_MB00_DATA0                ((volatile unsigned short *)CAN_MB00_DATA0)
+
+#define pCAN_MB01_ID1          ((volatile unsigned short *)CAN_MB01_ID1)
+#define pCAN_MB01_ID0          ((volatile unsigned short *)CAN_MB01_ID0)
+#define pCAN_MB01_TIMESTAMP    ((volatile unsigned short *)CAN_MB01_TIMESTAMP)
+#define pCAN_MB01_LENGTH       ((volatile unsigned short *)CAN_MB01_LENGTH)
+#define pCAN_MB01_DATA3                ((volatile unsigned short *)CAN_MB01_DATA3)
+#define pCAN_MB01_DATA2                ((volatile unsigned short *)CAN_MB01_DATA2)
+#define pCAN_MB01_DATA1                ((volatile unsigned short *)CAN_MB01_DATA1)
+#define pCAN_MB01_DATA0                ((volatile unsigned short *)CAN_MB01_DATA0)
+
+#define pCAN_MB02_ID1          ((volatile unsigned short *)CAN_MB02_ID1)
+#define pCAN_MB02_ID0          ((volatile unsigned short *)CAN_MB02_ID0)
+#define pCAN_MB02_TIMESTAMP    ((volatile unsigned short *)CAN_MB02_TIMESTAMP)
+#define pCAN_MB02_LENGTH       ((volatile unsigned short *)CAN_MB02_LENGTH)
+#define pCAN_MB02_DATA3                ((volatile unsigned short *)CAN_MB02_DATA3)
+#define pCAN_MB02_DATA2                ((volatile unsigned short *)CAN_MB02_DATA2)
+#define pCAN_MB02_DATA1                ((volatile unsigned short *)CAN_MB02_DATA1)
+#define pCAN_MB02_DATA0                ((volatile unsigned short *)CAN_MB02_DATA0)
+
+#define pCAN_MB03_ID1          ((volatile unsigned short *)CAN_MB03_ID1)
+#define pCAN_MB03_ID0          ((volatile unsigned short *)CAN_MB03_ID0)
+#define pCAN_MB03_TIMESTAMP    ((volatile unsigned short *)CAN_MB03_TIMESTAMP)
+#define pCAN_MB03_LENGTH       ((volatile unsigned short *)CAN_MB03_LENGTH)
+#define pCAN_MB03_DATA3                ((volatile unsigned short *)CAN_MB03_DATA3)
+#define pCAN_MB03_DATA2                ((volatile unsigned short *)CAN_MB03_DATA2)
+#define pCAN_MB03_DATA1                ((volatile unsigned short *)CAN_MB03_DATA1)
+#define pCAN_MB03_DATA0                ((volatile unsigned short *)CAN_MB03_DATA0)
+
+#define pCAN_MB04_ID1          ((volatile unsigned short *)CAN_MB04_ID1)
+#define pCAN_MB04_ID0          ((volatile unsigned short *)CAN_MB04_ID0)
+#define pCAN_MB04_TIMESTAMP    ((volatile unsigned short *)CAN_MB04_TIMESTAMP)
+#define pCAN_MB04_LENGTH       ((volatile unsigned short *)CAN_MB04_LENGTH)
+#define pCAN_MB04_DATA3                ((volatile unsigned short *)CAN_MB04_DATA3)
+#define pCAN_MB04_DATA2                ((volatile unsigned short *)CAN_MB04_DATA2)
+#define pCAN_MB04_DATA1                ((volatile unsigned short *)CAN_MB04_DATA1)
+#define pCAN_MB04_DATA0                ((volatile unsigned short *)CAN_MB04_DATA0)
+
+#define pCAN_MB05_ID1          ((volatile unsigned short *)CAN_MB05_ID1)
+#define pCAN_MB05_ID0          ((volatile unsigned short *)CAN_MB05_ID0)
+#define pCAN_MB05_TIMESTAMP    ((volatile unsigned short *)CAN_MB05_TIMESTAMP)
+#define pCAN_MB05_LENGTH       ((volatile unsigned short *)CAN_MB05_LENGTH)
+#define pCAN_MB05_DATA3                ((volatile unsigned short *)CAN_MB05_DATA3)
+#define pCAN_MB05_DATA2                ((volatile unsigned short *)CAN_MB05_DATA2)
+#define pCAN_MB05_DATA1                ((volatile unsigned short *)CAN_MB05_DATA1)
+#define pCAN_MB05_DATA0                ((volatile unsigned short *)CAN_MB05_DATA0)
+
+#define pCAN_MB06_ID1          ((volatile unsigned short *)CAN_MB06_ID1)
+#define pCAN_MB06_ID0          ((volatile unsigned short *)CAN_MB06_ID0)
+#define pCAN_MB06_TIMESTAMP    ((volatile unsigned short *)CAN_MB06_TIMESTAMP)
+#define pCAN_MB06_LENGTH       ((volatile unsigned short *)CAN_MB06_LENGTH)
+#define pCAN_MB06_DATA3                ((volatile unsigned short *)CAN_MB06_DATA3)
+#define pCAN_MB06_DATA2                ((volatile unsigned short *)CAN_MB06_DATA2)
+#define pCAN_MB06_DATA1                ((volatile unsigned short *)CAN_MB06_DATA1)
+#define pCAN_MB06_DATA0                ((volatile unsigned short *)CAN_MB06_DATA0)
+
+#define pCAN_MB07_ID1          ((volatile unsigned short *)CAN_MB07_ID1)
+#define pCAN_MB07_ID0          ((volatile unsigned short *)CAN_MB07_ID0)
+#define pCAN_MB07_TIMESTAMP    ((volatile unsigned short *)CAN_MB07_TIMESTAMP)
+#define pCAN_MB07_LENGTH       ((volatile unsigned short *)CAN_MB07_LENGTH)
+#define pCAN_MB07_DATA3                ((volatile unsigned short *)CAN_MB07_DATA3)
+#define pCAN_MB07_DATA2                ((volatile unsigned short *)CAN_MB07_DATA2)
+#define pCAN_MB07_DATA1                ((volatile unsigned short *)CAN_MB07_DATA1)
+#define pCAN_MB07_DATA0                ((volatile unsigned short *)CAN_MB07_DATA0)
+
+#define pCAN_MB08_ID1          ((volatile unsigned short *)CAN_MB08_ID1)
+#define pCAN_MB08_ID0          ((volatile unsigned short *)CAN_MB08_ID0)
+#define pCAN_MB08_TIMESTAMP    ((volatile unsigned short *)CAN_MB08_TIMESTAMP)
+#define pCAN_MB08_LENGTH       ((volatile unsigned short *)CAN_MB08_LENGTH)
+#define pCAN_MB08_DATA3                ((volatile unsigned short *)CAN_MB08_DATA3)
+#define pCAN_MB08_DATA2                ((volatile unsigned short *)CAN_MB08_DATA2)
+#define pCAN_MB08_DATA1                ((volatile unsigned short *)CAN_MB08_DATA1)
+#define pCAN_MB08_DATA0                ((volatile unsigned short *)CAN_MB08_DATA0)
+
+#define pCAN_MB09_ID1          ((volatile unsigned short *)CAN_MB09_ID1)
+#define pCAN_MB09_ID0          ((volatile unsigned short *)CAN_MB09_ID0)
+#define pCAN_MB09_TIMESTAMP    ((volatile unsigned short *)CAN_MB09_TIMESTAMP)
+#define pCAN_MB09_LENGTH       ((volatile unsigned short *)CAN_MB09_LENGTH)
+#define pCAN_MB09_DATA3                ((volatile unsigned short *)CAN_MB09_DATA3)
+#define pCAN_MB09_DATA2                ((volatile unsigned short *)CAN_MB09_DATA2)
+#define pCAN_MB09_DATA1                ((volatile unsigned short *)CAN_MB09_DATA1)
+#define pCAN_MB09_DATA0                ((volatile unsigned short *)CAN_MB09_DATA0)
+
+#define pCAN_MB10_ID1          ((volatile unsigned short *)CAN_MB10_ID1)
+#define pCAN_MB10_ID0          ((volatile unsigned short *)CAN_MB10_ID0)
+#define pCAN_MB10_TIMESTAMP    ((volatile unsigned short *)CAN_MB10_TIMESTAMP)
+#define pCAN_MB10_LENGTH       ((volatile unsigned short *)CAN_MB10_LENGTH)
+#define pCAN_MB10_DATA3                ((volatile unsigned short *)CAN_MB10_DATA3)
+#define pCAN_MB10_DATA2                ((volatile unsigned short *)CAN_MB10_DATA2)
+#define pCAN_MB10_DATA1                ((volatile unsigned short *)CAN_MB10_DATA1)
+#define pCAN_MB10_DATA0                ((volatile unsigned short *)CAN_MB10_DATA0)
+
+#define pCAN_MB11_ID1          ((volatile unsigned short *)CAN_MB11_ID1)
+#define pCAN_MB11_ID0          ((volatile unsigned short *)CAN_MB11_ID0)
+#define pCAN_MB11_TIMESTAMP    ((volatile unsigned short *)CAN_MB11_TIMESTAMP)
+#define pCAN_MB11_LENGTH       ((volatile unsigned short *)CAN_MB11_LENGTH)
+#define pCAN_MB11_DATA3                ((volatile unsigned short *)CAN_MB11_DATA3)
+#define pCAN_MB11_DATA2                ((volatile unsigned short *)CAN_MB11_DATA2)
+#define pCAN_MB11_DATA1                ((volatile unsigned short *)CAN_MB11_DATA1)
+#define pCAN_MB11_DATA0                ((volatile unsigned short *)CAN_MB11_DATA0)
+
+#define pCAN_MB12_ID1          ((volatile unsigned short *)CAN_MB12_ID1)
+#define pCAN_MB12_ID0          ((volatile unsigned short *)CAN_MB12_ID0)
+#define pCAN_MB12_TIMESTAMP    ((volatile unsigned short *)CAN_MB12_TIMESTAMP)
+#define pCAN_MB12_LENGTH       ((volatile unsigned short *)CAN_MB12_LENGTH)
+#define pCAN_MB12_DATA3                ((volatile unsigned short *)CAN_MB12_DATA3)
+#define pCAN_MB12_DATA2                ((volatile unsigned short *)CAN_MB12_DATA2)
+#define pCAN_MB12_DATA1                ((volatile unsigned short *)CAN_MB12_DATA1)
+#define pCAN_MB12_DATA0                ((volatile unsigned short *)CAN_MB12_DATA0)
+
+#define pCAN_MB13_ID1          ((volatile unsigned short *)CAN_MB13_ID1)
+#define pCAN_MB13_ID0          ((volatile unsigned short *)CAN_MB13_ID0)
+#define pCAN_MB13_TIMESTAMP    ((volatile unsigned short *)CAN_MB13_TIMESTAMP)
+#define pCAN_MB13_LENGTH       ((volatile unsigned short *)CAN_MB13_LENGTH)
+#define pCAN_MB13_DATA3                ((volatile unsigned short *)CAN_MB13_DATA3)
+#define pCAN_MB13_DATA2                ((volatile unsigned short *)CAN_MB13_DATA2)
+#define pCAN_MB13_DATA1                ((volatile unsigned short *)CAN_MB13_DATA1)
+#define pCAN_MB13_DATA0                ((volatile unsigned short *)CAN_MB13_DATA0)
+
+#define pCAN_MB14_ID1          ((volatile unsigned short *)CAN_MB14_ID1)
+#define pCAN_MB14_ID0          ((volatile unsigned short *)CAN_MB14_ID0)
+#define pCAN_MB14_TIMESTAMP    ((volatile unsigned short *)CAN_MB14_TIMESTAMP)
+#define pCAN_MB14_LENGTH       ((volatile unsigned short *)CAN_MB14_LENGTH)
+#define pCAN_MB14_DATA3                ((volatile unsigned short *)CAN_MB14_DATA3)
+#define pCAN_MB14_DATA2                ((volatile unsigned short *)CAN_MB14_DATA2)
+#define pCAN_MB14_DATA1                ((volatile unsigned short *)CAN_MB14_DATA1)
+#define pCAN_MB14_DATA0                ((volatile unsigned short *)CAN_MB14_DATA0)
+
+#define pCAN_MB15_ID1          ((volatile unsigned short *)CAN_MB15_ID1)
+#define pCAN_MB15_ID0          ((volatile unsigned short *)CAN_MB15_ID0)
+#define pCAN_MB15_TIMESTAMP    ((volatile unsigned short *)CAN_MB15_TIMESTAMP)
+#define pCAN_MB15_LENGTH       ((volatile unsigned short *)CAN_MB15_LENGTH)
+#define pCAN_MB15_DATA3                ((volatile unsigned short *)CAN_MB15_DATA3)
+#define pCAN_MB15_DATA2                ((volatile unsigned short *)CAN_MB15_DATA2)
+#define pCAN_MB15_DATA1                ((volatile unsigned short *)CAN_MB15_DATA1)
+#define pCAN_MB15_DATA0                ((volatile unsigned short *)CAN_MB15_DATA0)
+
+#define pCAN_MB16_ID1          ((volatile unsigned short *)CAN_MB16_ID1)
+#define pCAN_MB16_ID0          ((volatile unsigned short *)CAN_MB16_ID0)
+#define pCAN_MB16_TIMESTAMP    ((volatile unsigned short *)CAN_MB16_TIMESTAMP)
+#define pCAN_MB16_LENGTH       ((volatile unsigned short *)CAN_MB16_LENGTH)
+#define pCAN_MB16_DATA3                ((volatile unsigned short *)CAN_MB16_DATA3)
+#define pCAN_MB16_DATA2                ((volatile unsigned short *)CAN_MB16_DATA2)
+#define pCAN_MB16_DATA1                ((volatile unsigned short *)CAN_MB16_DATA1)
+#define pCAN_MB16_DATA0                ((volatile unsigned short *)CAN_MB16_DATA0)
+
+#define pCAN_MB17_ID1          ((volatile unsigned short *)CAN_MB17_ID1)
+#define pCAN_MB17_ID0          ((volatile unsigned short *)CAN_MB17_ID0)
+#define pCAN_MB17_TIMESTAMP    ((volatile unsigned short *)CAN_MB17_TIMESTAMP)
+#define pCAN_MB17_LENGTH       ((volatile unsigned short *)CAN_MB17_LENGTH)
+#define pCAN_MB17_DATA3                ((volatile unsigned short *)CAN_MB17_DATA3)
+#define pCAN_MB17_DATA2                ((volatile unsigned short *)CAN_MB17_DATA2)
+#define pCAN_MB17_DATA1                ((volatile unsigned short *)CAN_MB17_DATA1)
+#define pCAN_MB17_DATA0                ((volatile unsigned short *)CAN_MB17_DATA0)
+
+#define pCAN_MB18_ID1          ((volatile unsigned short *)CAN_MB18_ID1)
+#define pCAN_MB18_ID0          ((volatile unsigned short *)CAN_MB18_ID0)
+#define pCAN_MB18_TIMESTAMP    ((volatile unsigned short *)CAN_MB18_TIMESTAMP)
+#define pCAN_MB18_LENGTH       ((volatile unsigned short *)CAN_MB18_LENGTH)
+#define pCAN_MB18_DATA3                ((volatile unsigned short *)CAN_MB18_DATA3)
+#define pCAN_MB18_DATA2                ((volatile unsigned short *)CAN_MB18_DATA2)
+#define pCAN_MB18_DATA1                ((volatile unsigned short *)CAN_MB18_DATA1)
+#define pCAN_MB18_DATA0                ((volatile unsigned short *)CAN_MB18_DATA0)
+
+#define pCAN_MB19_ID1          ((volatile unsigned short *)CAN_MB19_ID1)
+#define pCAN_MB19_ID0          ((volatile unsigned short *)CAN_MB19_ID0)
+#define pCAN_MB19_TIMESTAMP    ((volatile unsigned short *)CAN_MB19_TIMESTAMP)
+#define pCAN_MB19_LENGTH       ((volatile unsigned short *)CAN_MB19_LENGTH)
+#define pCAN_MB19_DATA3                ((volatile unsigned short *)CAN_MB19_DATA3)
+#define pCAN_MB19_DATA2                ((volatile unsigned short *)CAN_MB19_DATA2)
+#define pCAN_MB19_DATA1                ((volatile unsigned short *)CAN_MB19_DATA1)
+#define pCAN_MB19_DATA0                ((volatile unsigned short *)CAN_MB19_DATA0)
+
+#define pCAN_MB20_ID1          ((volatile unsigned short *)CAN_MB20_ID1)
+#define pCAN_MB20_ID0          ((volatile unsigned short *)CAN_MB20_ID0)
+#define pCAN_MB20_TIMESTAMP    ((volatile unsigned short *)CAN_MB20_TIMESTAMP)
+#define pCAN_MB20_LENGTH       ((volatile unsigned short *)CAN_MB20_LENGTH)
+#define pCAN_MB20_DATA3                ((volatile unsigned short *)CAN_MB20_DATA3)
+#define pCAN_MB20_DATA2                ((volatile unsigned short *)CAN_MB20_DATA2)
+#define pCAN_MB20_DATA1                ((volatile unsigned short *)CAN_MB20_DATA1)
+#define pCAN_MB20_DATA0                ((volatile unsigned short *)CAN_MB20_DATA0)
+
+#define pCAN_MB21_ID1          ((volatile unsigned short *)CAN_MB21_ID1)
+#define pCAN_MB21_ID0          ((volatile unsigned short *)CAN_MB21_ID0)
+#define pCAN_MB21_TIMESTAMP    ((volatile unsigned short *)CAN_MB21_TIMESTAMP)
+#define pCAN_MB21_LENGTH       ((volatile unsigned short *)CAN_MB21_LENGTH)
+#define pCAN_MB21_DATA3                ((volatile unsigned short *)CAN_MB21_DATA3)
+#define pCAN_MB21_DATA2                ((volatile unsigned short *)CAN_MB21_DATA2)
+#define pCAN_MB21_DATA1                ((volatile unsigned short *)CAN_MB21_DATA1)
+#define pCAN_MB21_DATA0                ((volatile unsigned short *)CAN_MB21_DATA0)
+
+#define pCAN_MB22_ID1          ((volatile unsigned short *)CAN_MB22_ID1)
+#define pCAN_MB22_ID0          ((volatile unsigned short *)CAN_MB22_ID0)
+#define pCAN_MB22_TIMESTAMP    ((volatile unsigned short *)CAN_MB22_TIMESTAMP)
+#define pCAN_MB22_LENGTH       ((volatile unsigned short *)CAN_MB22_LENGTH)
+#define pCAN_MB22_DATA3                ((volatile unsigned short *)CAN_MB22_DATA3)
+#define pCAN_MB22_DATA2                ((volatile unsigned short *)CAN_MB22_DATA2)
+#define pCAN_MB22_DATA1                ((volatile unsigned short *)CAN_MB22_DATA1)
+#define pCAN_MB22_DATA0                ((volatile unsigned short *)CAN_MB22_DATA0)
+
+#define pCAN_MB23_ID1          ((volatile unsigned short *)CAN_MB23_ID1)
+#define pCAN_MB23_ID0          ((volatile unsigned short *)CAN_MB23_ID0)
+#define pCAN_MB23_TIMESTAMP    ((volatile unsigned short *)CAN_MB23_TIMESTAMP)
+#define pCAN_MB23_LENGTH       ((volatile unsigned short *)CAN_MB23_LENGTH)
+#define pCAN_MB23_DATA3                ((volatile unsigned short *)CAN_MB23_DATA3)
+#define pCAN_MB23_DATA2                ((volatile unsigned short *)CAN_MB23_DATA2)
+#define pCAN_MB23_DATA1                ((volatile unsigned short *)CAN_MB23_DATA1)
+#define pCAN_MB23_DATA0                ((volatile unsigned short *)CAN_MB23_DATA0)
+
+#define pCAN_MB24_ID1          ((volatile unsigned short *)CAN_MB24_ID1)
+#define pCAN_MB24_ID0          ((volatile unsigned short *)CAN_MB24_ID0)
+#define pCAN_MB24_TIMESTAMP    ((volatile unsigned short *)CAN_MB24_TIMESTAMP)
+#define pCAN_MB24_LENGTH       ((volatile unsigned short *)CAN_MB24_LENGTH)
+#define pCAN_MB24_DATA3                ((volatile unsigned short *)CAN_MB24_DATA3)
+#define pCAN_MB24_DATA2                ((volatile unsigned short *)CAN_MB24_DATA2)
+#define pCAN_MB24_DATA1                ((volatile unsigned short *)CAN_MB24_DATA1)
+#define pCAN_MB24_DATA0                ((volatile unsigned short *)CAN_MB24_DATA0)
+
+#define pCAN_MB25_ID1          ((volatile unsigned short *)CAN_MB25_ID1)
+#define pCAN_MB25_ID0          ((volatile unsigned short *)CAN_MB25_ID0)
+#define pCAN_MB25_TIMESTAMP    ((volatile unsigned short *)CAN_MB25_TIMESTAMP)
+#define pCAN_MB25_LENGTH       ((volatile unsigned short *)CAN_MB25_LENGTH)
+#define pCAN_MB25_DATA3                ((volatile unsigned short *)CAN_MB25_DATA3)
+#define pCAN_MB25_DATA2                ((volatile unsigned short *)CAN_MB25_DATA2)
+#define pCAN_MB25_DATA1                ((volatile unsigned short *)CAN_MB25_DATA1)
+#define pCAN_MB25_DATA0                ((volatile unsigned short *)CAN_MB25_DATA0)
+
+#define pCAN_MB26_ID1          ((volatile unsigned short *)CAN_MB26_ID1)
+#define pCAN_MB26_ID0          ((volatile unsigned short *)CAN_MB26_ID0)
+#define pCAN_MB26_TIMESTAMP    ((volatile unsigned short *)CAN_MB26_TIMESTAMP)
+#define pCAN_MB26_LENGTH       ((volatile unsigned short *)CAN_MB26_LENGTH)
+#define pCAN_MB26_DATA3                ((volatile unsigned short *)CAN_MB26_DATA3)
+#define pCAN_MB26_DATA2                ((volatile unsigned short *)CAN_MB26_DATA2)
+#define pCAN_MB26_DATA1                ((volatile unsigned short *)CAN_MB26_DATA1)
+#define pCAN_MB26_DATA0                ((volatile unsigned short *)CAN_MB26_DATA0)
+
+#define pCAN_MB27_ID1          ((volatile unsigned short *)CAN_MB27_ID1)
+#define pCAN_MB27_ID0          ((volatile unsigned short *)CAN_MB27_ID0)
+#define pCAN_MB27_TIMESTAMP    ((volatile unsigned short *)CAN_MB27_TIMESTAMP)
+#define pCAN_MB27_LENGTH       ((volatile unsigned short *)CAN_MB27_LENGTH)
+#define pCAN_MB27_DATA3                ((volatile unsigned short *)CAN_MB27_DATA3)
+#define pCAN_MB27_DATA2                ((volatile unsigned short *)CAN_MB27_DATA2)
+#define pCAN_MB27_DATA1                ((volatile unsigned short *)CAN_MB27_DATA1)
+#define pCAN_MB27_DATA0                ((volatile unsigned short *)CAN_MB27_DATA0)
+
+#define pCAN_MB28_ID1          ((volatile unsigned short *)CAN_MB28_ID1)
+#define pCAN_MB28_ID0          ((volatile unsigned short *)CAN_MB28_ID0)
+#define pCAN_MB28_TIMESTAMP    ((volatile unsigned short *)CAN_MB28_TIMESTAMP)
+#define pCAN_MB28_LENGTH       ((volatile unsigned short *)CAN_MB28_LENGTH)
+#define pCAN_MB28_DATA3                ((volatile unsigned short *)CAN_MB28_DATA3)
+#define pCAN_MB28_DATA2                ((volatile unsigned short *)CAN_MB28_DATA2)
+#define pCAN_MB28_DATA1                ((volatile unsigned short *)CAN_MB28_DATA1)
+#define pCAN_MB28_DATA0                ((volatile unsigned short *)CAN_MB28_DATA0)
+
+#define pCAN_MB29_ID1          ((volatile unsigned short *)CAN_MB29_ID1)
+#define pCAN_MB29_ID0          ((volatile unsigned short *)CAN_MB29_ID0)
+#define pCAN_MB29_TIMESTAMP    ((volatile unsigned short *)CAN_MB29_TIMESTAMP)
+#define pCAN_MB29_LENGTH       ((volatile unsigned short *)CAN_MB29_LENGTH)
+#define pCAN_MB29_DATA3                ((volatile unsigned short *)CAN_MB29_DATA3)
+#define pCAN_MB29_DATA2                ((volatile unsigned short *)CAN_MB29_DATA2)
+#define pCAN_MB29_DATA1                ((volatile unsigned short *)CAN_MB29_DATA1)
+#define pCAN_MB29_DATA0                ((volatile unsigned short *)CAN_MB29_DATA0)
+
+#define pCAN_MB30_ID1          ((volatile unsigned short *)CAN_MB30_ID1)
+#define pCAN_MB30_ID0          ((volatile unsigned short *)CAN_MB30_ID0)
+#define pCAN_MB30_TIMESTAMP    ((volatile unsigned short *)CAN_MB30_TIMESTAMP)
+#define pCAN_MB30_LENGTH       ((volatile unsigned short *)CAN_MB30_LENGTH)
+#define pCAN_MB30_DATA3                ((volatile unsigned short *)CAN_MB30_DATA3)
+#define pCAN_MB30_DATA2                ((volatile unsigned short *)CAN_MB30_DATA2)
+#define pCAN_MB30_DATA1                ((volatile unsigned short *)CAN_MB30_DATA1)
+#define pCAN_MB30_DATA0                ((volatile unsigned short *)CAN_MB30_DATA0)
+
+#define pCAN_MB31_ID1          ((volatile unsigned short *)CAN_MB31_ID1)
+#define pCAN_MB31_ID0          ((volatile unsigned short *)CAN_MB31_ID0)
+#define pCAN_MB31_TIMESTAMP    ((volatile unsigned short *)CAN_MB31_TIMESTAMP)
+#define pCAN_MB31_LENGTH       ((volatile unsigned short *)CAN_MB31_LENGTH)
+#define pCAN_MB31_DATA3                ((volatile unsigned short *)CAN_MB31_DATA3)
+#define pCAN_MB31_DATA2                ((volatile unsigned short *)CAN_MB31_DATA2)
+#define pCAN_MB31_DATA1                ((volatile unsigned short *)CAN_MB31_DATA1)
+#define pCAN_MB31_DATA0                ((volatile unsigned short *)CAN_MB31_DATA0)
+
+/* CAN Mailbox Area Macros */
+#define pCAN_MB_ID1(x)         ((volatile unsigned short *)CAN_MB_ID1(x))
+#define pCAN_MB_ID0(x)         ((volatile unsigned short *)CAN_MB_ID0(x))
+#define pCAN_MB_TIMESTAMP(x)   ((volatile unsigned short *)CAN_MB_TIMESTAMP(x))
+#define pCAN_MB_LENGTH(x)      ((volatile unsigned short *)CAN_MB_LENGTH(x))
+#define pCAN_MB_DATA3(x)       ((volatile unsigned short *)CAN_MB_DATA3(x))
+#define pCAN_MB_DATA2(x)       ((volatile unsigned short *)CAN_MB_DATA2(x))
+#define pCAN_MB_DATA1(x)       ((volatile unsigned short *)CAN_MB_DATA1(x))
+#define pCAN_MB_DATA0(x)       ((volatile unsigned short *)CAN_MB_DATA0(x))
+
+/* Pin Control Registers       (0xFFC03200 - 0xFFC032FF) */
+#define pPORTF_FER             ((volatile unsigned short *)PORTF_FER)
+#define pPORTG_FER             ((volatile unsigned short *)PORTG_FER)
+#define pPORTH_FER             ((volatile unsigned short *)PORTH_FER)
+#define pPORT_MUX              ((volatile unsigned short *)PORT_MUX)
+
+#define PORTF_UART0_TX         0x0001
+#define PORTF_UART0_RX         0x0002
+
+#define PORT_MUX_PFDE          0x0040  /* 0: Enable UART0 RX, UART0 TX; 1: Enable DMAR0, DMAr1 */
+
+/* Handshake MDMA Registers    (0xFFC03300 - 0xFFC033FF) */
+#define pHMDMA0_CONTROL                ((volatile unsigned short *)HMDMA0_CONTROL)
+#define pHMDMA0_ECINIT         ((volatile unsigned short *)HMDMA0_ECINIT)
+#define pHMDMA0_BCINIT         ((volatile unsigned short *)HMDMA0_BCINIT)
+#define pHMDMA0_ECURGENT       ((volatile unsigned short *)HMDMA0_ECURGENT)
+#define pHMDMA0_ECOVERFLOW     ((volatile unsigned short *)HMDMA0_ECOVERFLOW)
+#define pHMDMA0_ECOUNT         ((volatile unsigned short *)HMDMA0_ECOUNT)
+#define pHMDMA0_BCOUNT         ((volatile unsigned short *)HMDMA0_BCOUNT)
+
+#define pHMDMA1_CONTROL                ((volatile unsigned short *)HMDMA1_CONTROL)
+#define pHMDMA1_ECINIT         ((volatile unsigned short *)HMDMA1_ECINIT)
+#define pHMDMA1_BCINIT         ((volatile unsigned short *)HMDMA1_BCINIT)
+#define pHMDMA1_ECURGENT       ((volatile unsigned short *)HMDMA1_ECURGENT)
+#define pHMDMA1_ECOVERFLOW     ((volatile unsigned short *)HMDMA1_ECOVERFLOW)
+#define pHMDMA1_ECOUNT         ((volatile unsigned short *)HMDMA1_ECOUNT)
+#define pHMDMA1_BCOUNT         ((volatile unsigned short *)HMDMA1_BCOUNT)
+
+#endif                         /* _CDEF_BF534_H */
diff --git a/include/asm-blackfin/arch-bf537/cdefBF537.h b/include/asm-blackfin/arch-bf537/cdefBF537.h
new file mode 100644 (file)
index 0000000..3de1d93
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2004 Analog Devices Inc., All Rights Reserved.
+ *
+ ***********************************************************************************
+ *
+ * This include file contains a list of macro "defines" to enable the programmer
+ * to use symbolic names for register-access.
+ *
+ *   ----------------------------
+ *   revision 0.1
+ *   date: 2004/03/01 21:23:01;  author: joeb
+ *   Initial revision
+ *
+ *   ----------------------------
+ *   revision 0.2
+ *   date: 2004/05/15 16:30:00;  author: joeb
+ *   comments: removed I2C/IIC references to TWI, changed GPIO sections
+ *
+ *   ----------------------------
+ *   revision 0.3
+ *   date: 2004/06/08 12:25:00;  author: joeb
+ *   comments: renamed some TWI and GPIO registers
+ *
+ *   ----------------------------
+ *   revision 0.4
+ *   date: 2004/06/09 14:25:00;  author: joeb
+ *   comments: changed Timer status register to 32-bit, renamed EMAC count registers
+ *
+ *   ----------------------------
+ *   revision 0.5
+ *   date: 2004/08/10 10:25:00;  author: joeb
+ *   comments: Renamed EMAC wake-up registers, changed bit-names in EMAC registers
+ *
+ *   ----------------------------
+ *   revision 0.6
+ *   date: 2004/08/17 16:25:00;  author: joeb
+ *   comments: Renamed TWI_INT_ENABLE to TWI_INT_MASK
+ *
+ *   ----------------------------
+ *   revision 0.7
+ *   date: 2004/08/18 13:21:00;  author: joeb
+ *   comments: Renamed GPIO registers to remove _D, _S, _C, _T suffixes
+ *
+ *   ----------------------------
+ *   revision 0.8
+ *   date: 2004/08/20 10:27:00;  author: joeb
+ *   comments: Renamed External DMA to Handshake DMA
+ *
+ *   ----------------------------
+ *   revision 0.9
+ *   date: 2004/08/23 13:42:00;  author: joeb
+ *   comments: Renamed Handshake DMA Register Set
+ *
+ *   ----------------------------
+ *   revision 0.10
+ *   date: 2004/10/28 15:40:00;  author: joeb
+ *   comments: Shortened EMAC Count Register Names
+ *
+ *   ----------------------------
+ *   revision 0.11
+ *   date: 2004/12/13 11:05:00;  author: joeb
+ *   comments: Fixed address pointers - (volatile void **) to (void * volatile *)
+ *
+ *   ----------------------------
+ *   revision 0.12
+ *   date: 2004/12/17 14:25:00;  author: joeb
+ *   comments: Replaced C++ Single-Line Comments w/C-standard Comments
+ *                             Changed EMAC EQ1024 TX/RX References to GE1024
+ *
+ *   ----------------------------
+ *   revision 0.13
+ *   date: 2005/01/05 10:50:00;  author: joeb
+ *   comments: Removed excess white space in CAN_AM section
+ *                             Added support for CAN Macros to Index AM and Mailbox Areas
+ *
+ *   ----------------------------
+ *   revision 0.14
+ *   date: 2005/01/26 14:10:00;  author: joeb
+ *   comments: Fixed Typo In EMAC_RXC_PAUSE register
+ *
+ *   ----------------------------
+ *   revision 0.15
+ *   date: 2005/01/27 14:41:00;  author: joeb
+ *   comments: Moved Common MMRs to cdefBF534.h
+ */
+
+/*
+ * System MMR Register Map
+ */
+
+#ifndef _CDEF_BF537_H
+#define _CDEF_BF537_H
+
+/* Include MMRs Common to BF534 */
+#include <asm/arch-bf537/cdefBF534.h>
+
+/* Include all Core registers and bit definitions */
+#include <asm/arch-bf537/defBF537.h>
+
+/* Include Macro "Defines" For EMAC (Unique to BF536/BF537 */
+/* 10/100 Ethernet Controller  (0xFFC03000 - 0xFFC031FF) */
+#define        pEMAC_OPMODE            ((volatile unsigned long  *)EMAC_OPMODE)
+#define pEMAC_ADDRLO           ((volatile unsigned long  *)EMAC_ADDRLO)
+#define pEMAC_ADDRHI           ((volatile unsigned long  *)EMAC_ADDRHI)
+#define pEMAC_HASHLO           ((volatile unsigned long  *)EMAC_HASHLO)
+#define pEMAC_HASHHI           ((volatile unsigned long  *)EMAC_HASHHI)
+#define pEMAC_STAADD           ((volatile unsigned long  *)EMAC_STAADD)
+#define pEMAC_STADAT           ((volatile unsigned long  *)EMAC_STADAT)
+#define pEMAC_FLC              ((volatile unsigned long  *)EMAC_FLC)
+#define pEMAC_VLAN1            ((volatile unsigned long  *)EMAC_VLAN1)
+#define pEMAC_VLAN2            ((volatile unsigned long  *)EMAC_VLAN2)
+#define pEMAC_WKUP_CTL         ((volatile unsigned long  *)EMAC_WKUP_CTL)
+#define pEMAC_WKUP_FFMSK0      ((volatile unsigned long  *)EMAC_WKUP_FFMSK0)
+#define pEMAC_WKUP_FFMSK1      ((volatile unsigned long  *)EMAC_WKUP_FFMSK1)
+#define pEMAC_WKUP_FFMSK2      ((volatile unsigned long  *)EMAC_WKUP_FFMSK2)
+#define pEMAC_WKUP_FFMSK3      ((volatile unsigned long  *)EMAC_WKUP_FFMSK3)
+#define pEMAC_WKUP_FFCMD       ((volatile unsigned long  *)EMAC_WKUP_FFCMD)
+#define pEMAC_WKUP_FFOFF       ((volatile unsigned long  *)EMAC_WKUP_FFOFF)
+#define pEMAC_WKUP_FFCRC0      ((volatile unsigned long  *)EMAC_WKUP_FFCRC0)
+#define pEMAC_WKUP_FFCRC1      ((volatile unsigned long  *)EMAC_WKUP_FFCRC1)
+
+#define        pEMAC_SYSCTL            ((volatile unsigned long  *)EMAC_SYSCTL)
+#define pEMAC_SYSTAT           ((volatile unsigned long  *)EMAC_SYSTAT)
+#define pEMAC_RX_STAT          ((volatile unsigned long  *)EMAC_RX_STAT)
+#define pEMAC_RX_STKY          ((volatile unsigned long  *)EMAC_RX_STKY)
+#define pEMAC_RX_IRQE          ((volatile unsigned long  *)EMAC_RX_IRQE)
+#define pEMAC_TX_STAT          ((volatile unsigned long  *)EMAC_TX_STAT)
+#define pEMAC_TX_STKY          ((volatile unsigned long  *)EMAC_TX_STKY)
+#define pEMAC_TX_IRQE          ((volatile unsigned long  *)EMAC_TX_IRQE)
+
+#define pEMAC_MMC_CTL          ((volatile unsigned long  *)EMAC_MMC_CTL)
+#define pEMAC_MMC_RIRQS                ((volatile unsigned long  *)EMAC_MMC_RIRQS)
+#define pEMAC_MMC_RIRQE                ((volatile unsigned long  *)EMAC_MMC_RIRQE)
+#define pEMAC_MMC_TIRQS                ((volatile unsigned long  *)EMAC_MMC_TIRQS)
+#define pEMAC_MMC_TIRQE                ((volatile unsigned long  *)EMAC_MMC_TIRQE)
+
+#define pEMAC_RXC_OK           ((volatile unsigned long  *)EMAC_RXC_OK)
+#define pEMAC_RXC_FCS          ((volatile unsigned long  *)EMAC_RXC_FCS)
+#define pEMAC_RXC_ALIGN                ((volatile unsigned long  *)EMAC_RXC_ALIGN)
+#define pEMAC_RXC_OCTET                ((volatile unsigned long  *)EMAC_RXC_OCTET)
+#define pEMAC_RXC_DMAOVF       ((volatile unsigned long  *)EMAC_RXC_DMAOVF)
+#define pEMAC_RXC_UNICST       ((volatile unsigned long  *)EMAC_RXC_UNICST)
+#define pEMAC_RXC_MULTI                ((volatile unsigned long  *)EMAC_RXC_MULTI)
+#define pEMAC_RXC_BROAD                ((volatile unsigned long  *)EMAC_RXC_BROAD)
+#define pEMAC_RXC_LNERRI       ((volatile unsigned long  *)EMAC_RXC_LNERRI)
+#define pEMAC_RXC_LNERRO       ((volatile unsigned long  *)EMAC_RXC_LNERRO)
+#define pEMAC_RXC_LONG         ((volatile unsigned long  *)EMAC_RXC_LONG)
+#define pEMAC_RXC_MACCTL       ((volatile unsigned long  *)EMAC_RXC_MACCTL)
+#define pEMAC_RXC_OPCODE       ((volatile unsigned long  *)EMAC_RXC_OPCODE)
+#define pEMAC_RXC_PAUSE                ((volatile unsigned long  *)EMAC_RXC_PAUSE)
+#define pEMAC_RXC_ALLFRM       ((volatile unsigned long  *)EMAC_RXC_ALLFRM)
+#define pEMAC_RXC_ALLOCT       ((volatile unsigned long  *)EMAC_RXC_ALLOCT)
+#define pEMAC_RXC_TYPED                ((volatile unsigned long  *)EMAC_RXC_TYPED)
+#define pEMAC_RXC_SHORT                ((volatile unsigned long  *)EMAC_RXC_SHORT)
+#define pEMAC_RXC_EQ64         ((volatile unsigned long  *)EMAC_RXC_EQ64)
+#define        pEMAC_RXC_LT128         ((volatile unsigned long  *)EMAC_RXC_LT128)
+#define pEMAC_RXC_LT256                ((volatile unsigned long  *)EMAC_RXC_LT256)
+#define pEMAC_RXC_LT512                ((volatile unsigned long  *)EMAC_RXC_LT512)
+#define pEMAC_RXC_LT1024       ((volatile unsigned long  *)EMAC_RXC_LT1024)
+#define pEMAC_RXC_GE1024       ((volatile unsigned long  *)EMAC_RXC_GE1024)
+
+#define pEMAC_TXC_OK           ((volatile unsigned long  *)EMAC_TXC_OK)
+#define pEMAC_TXC_1COL         ((volatile unsigned long  *)EMAC_TXC_1COL)
+#define pEMAC_TXC_GT1COL       ((volatile unsigned long  *)EMAC_TXC_GT1COL)
+#define pEMAC_TXC_OCTET                ((volatile unsigned long  *)EMAC_TXC_OCTET)
+#define pEMAC_TXC_DEFER                ((volatile unsigned long  *)EMAC_TXC_DEFER)
+#define pEMAC_TXC_LATECL       ((volatile unsigned long  *)EMAC_TXC_LATECL)
+#define pEMAC_TXC_XS_COL       ((volatile unsigned long  *)EMAC_TXC_XS_COL)
+#define pEMAC_TXC_DMAUND       ((volatile unsigned long  *)EMAC_TXC_DMAUND)
+#define pEMAC_TXC_CRSERR       ((volatile unsigned long  *)EMAC_TXC_CRSERR)
+#define pEMAC_TXC_UNICST       ((volatile unsigned long  *)EMAC_TXC_UNICST)
+#define pEMAC_TXC_MULTI                ((volatile unsigned long  *)EMAC_TXC_MULTI)
+#define pEMAC_TXC_BROAD                ((volatile unsigned long  *)EMAC_TXC_BROAD)
+#define pEMAC_TXC_XS_DFR       ((volatile unsigned long  *)EMAC_TXC_XS_DFR)
+#define pEMAC_TXC_MACCTL       ((volatile unsigned long  *)EMAC_TXC_MACCTL)
+#define pEMAC_TXC_ALLFRM       ((volatile unsigned long  *)EMAC_TXC_ALLFRM)
+#define pEMAC_TXC_ALLOCT       ((volatile unsigned long  *)EMAC_TXC_ALLOCT)
+#define pEMAC_TXC_EQ64         ((volatile unsigned long  *)EMAC_TXC_EQ64)
+#define pEMAC_TXC_LT128                ((volatile unsigned long  *)EMAC_TXC_LT128)
+#define pEMAC_TXC_LT256                ((volatile unsigned long  *)EMAC_TXC_LT256)
+#define pEMAC_TXC_LT512                ((volatile unsigned long  *)EMAC_TXC_LT512)
+#define pEMAC_TXC_LT1024       ((volatile unsigned long  *)EMAC_TXC_LT1024)
+#define pEMAC_TXC_GE1024       ((volatile unsigned long  *)EMAC_TXC_GE1024)
+#define pEMAC_TXC_ABORT                ((volatile unsigned long  *)EMAC_TXC_ABORT)
+
+#endif                         /* _CDEF_BF537_H */
diff --git a/include/asm-blackfin/arch-bf537/defBF534.h b/include/asm-blackfin/arch-bf537/defBF534.h
new file mode 100644 (file)
index 0000000..c603d44
--- /dev/null
@@ -0,0 +1,2627 @@
+/*
+ * Copyright (C) 2004 Analog Devices Inc., All Rights Reserved.
+ *
+ ***********************************************************************************
+ *
+ * This include file contains a list of macro "defines" to enable the programmer
+ * to use symbolic names for register-access and bit-manipulation.
+ *
+ *   ----------------------------
+ *   revision 0.1
+ *   date: 2004/03/01 21:23:01;  author: joeb
+ *   Initial revision
+ *
+ */
+#ifndef _DEF_BF534_H
+#define _DEF_BF534_H
+
+/* Include all Core registers and bit definitions */
+#include <asm/arch-common/def_LPBlackfin.h>
+
+#define LO(con32)              ((con32) & 0xFFFF)
+#define lo(con32)              ((con32) & 0xFFFF)
+#define HI(con32)              (((con32) >> 16) & 0xFFFF)
+#define hi(con32)              (((con32) >> 16) & 0xFFFF)
+
+/*
+ * System MMR Register Map
+ */
+/* Clock and System Control    (0xFFC00000 - 0xFFC000FF)*/
+#define PLL_CTL                        0xFFC00000      /* PLL Control Register */
+#define PLL_DIV                        0xFFC00004      /* PLL Divide Register */
+#define VR_CTL                 0xFFC00008      /* Voltage Regulator Control Register */
+#define CHIPID                 0xFFC00014      /* Chip ID register (32-bit) */
+#define PLL_STAT               0xFFC0000C      /* PLL Status Register */
+#define PLL_LOCKCNT            0xFFC00010      /* PLL Lock Count Register */
+
+/* System Interrupt Controller (0xFFC00100 - 0xFFC001FF) */
+#define SWRST                  0xFFC00100      /* Software Reset Register */
+#define SYSCR                  0xFFC00104      /* System Configuration Register */
+#define SIC_RVECT              0xFFC00108      /* Interrupt Reset Vector Address Register */
+#define SIC_IMASK              0xFFC0010C      /* Interrupt Mask Register */
+#define SIC_IAR0               0xFFC00110      /* Interrupt Assignment Register 0 */
+#define SIC_IAR1               0xFFC00114      /* Interrupt Assignment Register 1 */
+#define SIC_IAR2               0xFFC00118      /* Interrupt Assignment Register 2 */
+#define SIC_IAR3               0xFFC0011C      /* Interrupt Assignment Register 3 */
+#define SIC_ISR                        0xFFC00120      /* Interrupt Status Register */
+#define SIC_IWR                        0xFFC00124      /* Interrupt Wakeup Register */
+
+/* Watchdog Timer              (0xFFC00200 - 0xFFC002FF) */
+#define WDOG_CTL               0xFFC00200      /* Watchdog Control Register */
+#define WDOG_CNT               0xFFC00204      /* Watchdog Count Register */
+#define WDOG_STAT              0xFFC00208      /* Watchdog Status Register */
+
+/* Real Time Clock             (0xFFC00300 - 0xFFC003FF) */
+#define RTC_STAT               0xFFC00300      /* RTC Status Register */
+#define RTC_ICTL               0xFFC00304      /* RTC Interrupt Control Register */
+#define RTC_ISTAT              0xFFC00308      /* RTC Interrupt Status Register */
+#define RTC_SWCNT              0xFFC0030C      /* RTC Stopwatch Count Register */
+#define RTC_ALARM              0xFFC00310      /* RTC Alarm Time Register */
+#define RTC_FAST               0xFFC00314      /* RTC Prescaler Enable Register */
+#define RTC_PREN               0xFFC00314      /* RTC Prescaler Enable Alternate Macro */
+
+/* UART0 Controller            (0xFFC00400 - 0xFFC004FF) */
+#define UART0_THR              0xFFC00400      /* Transmit Holding register */
+#define UART0_RBR              0xFFC00400      /* Receive Buffer register */
+#define UART0_DLL              0xFFC00400      /* Divisor Latch (Low-Byte) */
+#define UART0_IER              0xFFC00404      /* Interrupt Enable Register */
+#define UART0_DLH              0xFFC00404      /* Divisor Latch (High-Byte) */
+#define UART0_IIR              0xFFC00408      /* Interrupt Identification Register */
+#define UART0_LCR              0xFFC0040C      /* Line Control Register */
+#define UART0_MCR              0xFFC00410      /* Modem Control Register */
+#define UART0_LSR              0xFFC00414      /* Line Status Register */
+#define UART0_MSR              0xFFC00418      /* Modem Status Register */
+#define UART0_SCR              0xFFC0041C      /* SCR Scratch Register */
+#define UART0_GCTL             0xFFC00424      /* Global Control Register */
+
+/* SPI Controller              (0xFFC00500 - 0xFFC005FF) */
+#define SPI_CTL                        0xFFC00500      /* SPI Control Register */
+#define SPI_FLG                        0xFFC00504      /* SPI Flag register */
+#define SPI_STAT               0xFFC00508      /* SPI Status register */
+#define SPI_TDBR               0xFFC0050C      /* SPI Transmit Data Buffer Register */
+#define SPI_RDBR               0xFFC00510      /* SPI Receive Data Buffer Register */
+#define SPI_BAUD               0xFFC00514      /* SPI Baud rate Register */
+#define SPI_SHADOW             0xFFC00518      /* SPI_RDBR Shadow Register */
+
+/* TIMER0-7 Registers          (0xFFC00600 - 0xFFC006FF) */
+#define TIMER0_CONFIG          0xFFC00600      /* Timer 0 Configuration Register */
+#define TIMER0_COUNTER         0xFFC00604      /* Timer 0 Counter Register */
+#define TIMER0_PERIOD          0xFFC00608      /* Timer 0 Period Register */
+#define TIMER0_WIDTH           0xFFC0060C      /* Timer 0 Width Register */
+
+#define TIMER1_CONFIG          0xFFC00610      /* Timer 1 Configuration Register */
+#define TIMER1_COUNTER         0xFFC00614      /* Timer 1 Counter Register */
+#define TIMER1_PERIOD          0xFFC00618      /* Timer 1 Period Register */
+#define TIMER1_WIDTH           0xFFC0061C      /* Timer 1 Width Register */
+
+#define TIMER2_CONFIG          0xFFC00620      /* Timer 2 Configuration Register */
+#define TIMER2_COUNTER         0xFFC00624      /* Timer 2 Counter Register */
+#define TIMER2_PERIOD          0xFFC00628      /* Timer 2 Period Register */
+#define TIMER2_WIDTH           0xFFC0062C      /* Timer 2 Width Register */
+
+#define TIMER3_CONFIG          0xFFC00630      /* Timer 3 Configuration Register */
+#define TIMER3_COUNTER         0xFFC00634      /* Timer 3 Counter Register */
+#define TIMER3_PERIOD          0xFFC00638      /* Timer 3 Period Register */
+#define TIMER3_WIDTH           0xFFC0063C      /* Timer 3 Width Register */
+
+#define TIMER4_CONFIG          0xFFC00640      /* Timer 4 Configuration Register */
+#define TIMER4_COUNTER         0xFFC00644      /* Timer 4 Counter Register */
+#define TIMER4_PERIOD          0xFFC00648      /* Timer 4 Period Register */
+#define TIMER4_WIDTH           0xFFC0064C      /* Timer 4 Width Register */
+
+#define TIMER5_CONFIG          0xFFC00650      /* Timer 5 Configuration Register */
+#define TIMER5_COUNTER         0xFFC00654      /* Timer 5 Counter Register */
+#define TIMER5_PERIOD          0xFFC00658      /* Timer 5 Period Register */
+#define TIMER5_WIDTH           0xFFC0065C      /* Timer 5 Width Register */
+
+#define TIMER6_CONFIG          0xFFC00660      /* Timer 6 Configuration Register */
+#define TIMER6_COUNTER         0xFFC00664      /* Timer 6 Counter Register */
+#define TIMER6_PERIOD          0xFFC00668      /* Timer 6 Period Register */
+#define TIMER6_WIDTH           0xFFC0066C      /* Timer 6 Width Register */
+
+#define TIMER7_CONFIG          0xFFC00670      /* Timer 7 Configuration Register */
+#define TIMER7_COUNTER         0xFFC00674      /* Timer 7 Counter Register */
+#define TIMER7_PERIOD          0xFFC00678      /* Timer 7 Period Register */
+#define TIMER7_WIDTH           0xFFC0067C      /* Timer 7 Width Register */
+
+#define TIMER_ENABLE           0xFFC00680      /* Timer Enable Register */
+#define TIMER_DISABLE          0xFFC00684      /* Timer Disable Register */
+#define TIMER_STATUS           0xFFC00688      /* Timer Status Register */
+
+/* General Purpose I/O Port F (0xFFC00700 - 0xFFC007FF) */
+#define PORTFIO                        0xFFC00700      /* Port F I/O Pin State Specify Register */
+#define PORTFIO_CLEAR          0xFFC00704      /* Port F I/O Peripheral Interrupt Clear Register */
+#define PORTFIO_SET            0xFFC00708      /* Port F I/O Peripheral Interrupt Set Register */
+#define PORTFIO_TOGGLE         0xFFC0070C      /* Port F I/O Pin State Toggle Register */
+#define PORTFIO_MASKA          0xFFC00710      /* Port F I/O Mask State Specify Interrupt A Register */
+#define PORTFIO_MASKA_CLEAR    0xFFC00714      /* Port F I/O Mask Disable Interrupt A Register */
+#define PORTFIO_MASKA_SET      0xFFC00718      /* Port F I/O Mask Enable Interrupt A Register */
+#define PORTFIO_MASKA_TOGGLE   0xFFC0071C      /* Port F I/O Mask Toggle Enable Interrupt A Register */
+#define PORTFIO_MASKB          0xFFC00720      /* Port F I/O Mask State Specify Interrupt B Register */
+#define PORTFIO_MASKB_CLEAR    0xFFC00724      /* Port F I/O Mask Disable Interrupt B Register */
+#define PORTFIO_MASKB_SET      0xFFC00728      /* Port F I/O Mask Enable Interrupt B Register */
+#define PORTFIO_MASKB_TOGGLE   0xFFC0072C      /* Port F I/O Mask Toggle Enable Interrupt B Register */
+#define PORTFIO_DIR            0xFFC00730      /* Port F I/O Direction Register */
+#define PORTFIO_POLAR          0xFFC00734      /* Port F I/O Source Polarity Register */
+#define PORTFIO_EDGE           0xFFC00738      /* Port F I/O Source Sensitivity Register */
+#define PORTFIO_BOTH           0xFFC0073C      /* Port F I/O Set on BOTH Edges Register */
+#define PORTFIO_INEN           0xFFC00740      /* Port F I/O Input Enable Register */
+
+/* SPORT0 Controller           (0xFFC00800 - 0xFFC008FF) */
+#define SPORT0_TCR1            0xFFC00800      /* SPORT0 Transmit Configuration 1 Register */
+#define SPORT0_TCR2            0xFFC00804      /* SPORT0 Transmit Configuration 2 Register */
+#define SPORT0_TCLKDIV         0xFFC00808      /* SPORT0 Transmit Clock Divider */
+#define SPORT0_TFSDIV          0xFFC0080C      /* SPORT0 Transmit Frame Sync Divider */
+#define SPORT0_TX              0xFFC00810      /* SPORT0 TX Data Register */
+#define SPORT0_RX              0xFFC00818      /* SPORT0 RX Data Register */
+#define SPORT0_RCR1            0xFFC00820      /* SPORT0 Transmit Configuration 1 Register */
+#define SPORT0_RCR2            0xFFC00824      /* SPORT0 Transmit Configuration 2 Register */
+#define SPORT0_RCLKDIV         0xFFC00828      /* SPORT0 Receive Clock Divider */
+#define SPORT0_RFSDIV          0xFFC0082C      /* SPORT0 Receive Frame Sync Divider */
+#define SPORT0_STAT            0xFFC00830      /* SPORT0 Status Register */
+#define SPORT0_CHNL            0xFFC00834      /* SPORT0 Current Channel Register */
+#define SPORT0_MCMC1           0xFFC00838      /* SPORT0 Multi-Channel Configuration Register 1 */
+#define SPORT0_MCMC2           0xFFC0083C      /* SPORT0 Multi-Channel Configuration Register 2 */
+#define SPORT0_MTCS0           0xFFC00840      /* SPORT0 Multi-Channel Transmit Select Register 0 */
+#define SPORT0_MTCS1           0xFFC00844      /* SPORT0 Multi-Channel Transmit Select Register 1 */
+#define SPORT0_MTCS2           0xFFC00848      /* SPORT0 Multi-Channel Transmit Select Register 2 */
+#define SPORT0_MTCS3           0xFFC0084C      /* SPORT0 Multi-Channel Transmit Select Register 3 */
+#define SPORT0_MRCS0           0xFFC00850      /* SPORT0 Multi-Channel Receive Select Register 0 */
+#define SPORT0_MRCS1           0xFFC00854      /* SPORT0 Multi-Channel Receive Select Register 1 */
+#define SPORT0_MRCS2           0xFFC00858      /* SPORT0 Multi-Channel Receive Select Register 2 */
+#define SPORT0_MRCS3           0xFFC0085C      /* SPORT0 Multi-Channel Receive Select Register 3 */
+
+/* SPORT1 Controller           (0xFFC00900 - 0xFFC009FF) */
+#define SPORT1_TCR1            0xFFC00900      /* SPORT1 Transmit Configuration 1 Register */
+#define SPORT1_TCR2            0xFFC00904      /* SPORT1 Transmit Configuration 2 Register */
+#define SPORT1_TCLKDIV         0xFFC00908      /* SPORT1 Transmit Clock Divider */
+#define SPORT1_TFSDIV          0xFFC0090C      /* SPORT1 Transmit Frame Sync Divider */
+#define SPORT1_TX              0xFFC00910      /* SPORT1 TX Data Register */
+#define SPORT1_RX              0xFFC00918      /* SPORT1 RX Data Register */
+#define SPORT1_RCR1            0xFFC00920      /* SPORT1 Transmit Configuration 1 Register */
+#define SPORT1_RCR2            0xFFC00924      /* SPORT1 Transmit Configuration 2 Register */
+#define SPORT1_RCLKDIV         0xFFC00928      /* SPORT1 Receive Clock Divider */
+#define SPORT1_RFSDIV          0xFFC0092C      /* SPORT1 Receive Frame Sync Divider */
+#define SPORT1_STAT            0xFFC00930      /* SPORT1 Status Register */
+#define SPORT1_CHNL            0xFFC00934      /* SPORT1 Current Channel Register */
+#define SPORT1_MCMC1           0xFFC00938      /* SPORT1 Multi-Channel Configuration Register 1 */
+#define SPORT1_MCMC2           0xFFC0093C      /* SPORT1 Multi-Channel Configuration Register 2 */
+#define SPORT1_MTCS0           0xFFC00940      /* SPORT1 Multi-Channel Transmit Select Register 0 */
+#define SPORT1_MTCS1           0xFFC00944      /* SPORT1 Multi-Channel Transmit Select Register 1 */
+#define SPORT1_MTCS2           0xFFC00948      /* SPORT1 Multi-Channel Transmit Select Register 2 */
+#define SPORT1_MTCS3           0xFFC0094C      /* SPORT1 Multi-Channel Transmit Select Register 3 */
+#define SPORT1_MRCS0           0xFFC00950      /* SPORT1 Multi-Channel Receive Select Register 0 */
+#define SPORT1_MRCS1           0xFFC00954      /* SPORT1 Multi-Channel Receive Select Register 1 */
+#define SPORT1_MRCS2           0xFFC00958      /* SPORT1 Multi-Channel Receive Select Register 2 */
+#define SPORT1_MRCS3           0xFFC0095C      /* SPORT1 Multi-Channel Receive Select Register 3 */
+
+/* External Bus Interface Unit (0xFFC00A00 - 0xFFC00AFF) */
+#define EBIU_AMGCTL            0xFFC00A00      /* Asynchronous Memory Global Control Register */
+#define EBIU_AMBCTL0           0xFFC00A04      /* Asynchronous Memory Bank Control Register 0 */
+#define EBIU_AMBCTL1           0xFFC00A08      /* Asynchronous Memory Bank Control Register 1 */
+#define EBIU_SDGCTL            0xFFC00A10      /* SDRAM Global Control Register */
+#define EBIU_SDBCTL            0xFFC00A14      /* SDRAM Bank Control Register */
+#define EBIU_SDRRC             0xFFC00A18      /* SDRAM Refresh Rate Control Register */
+#define EBIU_SDSTAT            0xFFC00A1C      /* SDRAM Status Register */
+
+/* DMA Traffic Control Registers */
+#define DMA_TCPER              0xFFC00B0C      /* Traffic Control Periods Register */
+#define DMA_TCCNT              0xFFC00B10      /* Traffic Control Current Counts Register */
+
+/* DMA Controller (0xFFC00C00 - 0xFFC00FFF) */
+#define DMA0_NEXT_DESC_PTR     0xFFC00C00      /* DMA Channel 0 Next Descriptor Pointer Register */
+#define DMA0_START_ADDR                0xFFC00C04      /* DMA Channel 0 Start Address Register */
+#define DMA0_CONFIG            0xFFC00C08      /* DMA Channel 0 Configuration Register */
+#define DMA0_X_COUNT           0xFFC00C10      /* DMA Channel 0 X Count Register */
+#define DMA0_X_MODIFY          0xFFC00C14      /* DMA Channel 0 X Modify Register */
+#define DMA0_Y_COUNT           0xFFC00C18      /* DMA Channel 0 Y Count Register */
+#define DMA0_Y_MODIFY          0xFFC00C1C      /* DMA Channel 0 Y Modify Register */
+#define DMA0_CURR_DESC_PTR     0xFFC00C20      /* DMA Channel 0 Current Descriptor Pointer Register */
+#define DMA0_CURR_ADDR         0xFFC00C24      /* DMA Channel 0 Current Address Register */
+#define DMA0_IRQ_STATUS                0xFFC00C28      /* DMA Channel 0 Interrupt/Status Register */
+#define DMA0_PERIPHERAL_MAP    0xFFC00C2C      /* DMA Channel 0 Peripheral Map Register */
+#define DMA0_CURR_X_COUNT      0xFFC00C30      /* DMA Channel 0 Current X Count Register */
+#define DMA0_CURR_Y_COUNT      0xFFC00C38      /* DMA Channel 0 Current Y Count Register */
+
+#define DMA1_NEXT_DESC_PTR     0xFFC00C40      /* DMA Channel 1 Next Descriptor Pointer Register */
+#define DMA1_START_ADDR                0xFFC00C44      /* DMA Channel 1 Start Address Register */
+#define DMA1_CONFIG            0xFFC00C48      /* DMA Channel 1 Configuration Register */
+#define DMA1_X_COUNT           0xFFC00C50      /* DMA Channel 1 X Count Register */
+#define DMA1_X_MODIFY          0xFFC00C54      /* DMA Channel 1 X Modify Register */
+#define DMA1_Y_COUNT           0xFFC00C58      /* DMA Channel 1 Y Count Register */
+#define DMA1_Y_MODIFY          0xFFC00C5C      /* DMA Channel 1 Y Modify Register */
+#define DMA1_CURR_DESC_PTR     0xFFC00C60      /* DMA Channel 1 Current Descriptor Pointer Register */
+#define DMA1_CURR_ADDR         0xFFC00C64      /* DMA Channel 1 Current Address Register */
+#define DMA1_IRQ_STATUS                0xFFC00C68      /* DMA Channel 1 Interrupt/Status Register */
+#define DMA1_PERIPHERAL_MAP    0xFFC00C6C      /* DMA Channel 1 Peripheral Map Register */
+#define DMA1_CURR_X_COUNT      0xFFC00C70      /* DMA Channel 1 Current X Count Register */
+#define DMA1_CURR_Y_COUNT      0xFFC00C78      /* DMA Channel 1 Current Y Count Register */
+
+#define DMA2_NEXT_DESC_PTR     0xFFC00C80      /* DMA Channel 2 Next Descriptor Pointer Register */
+#define DMA2_START_ADDR                0xFFC00C84      /* DMA Channel 2 Start Address Register */
+#define DMA2_CONFIG            0xFFC00C88      /* DMA Channel 2 Configuration Register */
+#define DMA2_X_COUNT           0xFFC00C90      /* DMA Channel 2 X Count Register */
+#define DMA2_X_MODIFY          0xFFC00C94      /* DMA Channel 2 X Modify Register */
+#define DMA2_Y_COUNT           0xFFC00C98      /* DMA Channel 2 Y Count Register */
+#define DMA2_Y_MODIFY          0xFFC00C9C      /* DMA Channel 2 Y Modify Register */
+#define DMA2_CURR_DESC_PTR     0xFFC00CA0      /* DMA Channel 2 Current Descriptor Pointer Register */
+#define DMA2_CURR_ADDR         0xFFC00CA4      /* DMA Channel 2 Current Address Register */
+#define DMA2_IRQ_STATUS                0xFFC00CA8      /* DMA Channel 2 Interrupt/Status Register */
+#define DMA2_PERIPHERAL_MAP    0xFFC00CAC      /* DMA Channel 2 Peripheral Map Register */
+#define DMA2_CURR_X_COUNT      0xFFC00CB0      /* DMA Channel 2 Current X Count Register */
+#define DMA2_CURR_Y_COUNT      0xFFC00CB8      /* DMA Channel 2 Current Y Count Register */
+
+#define DMA3_NEXT_DESC_PTR     0xFFC00CC0      /* DMA Channel 3 Next Descriptor Pointer Register */
+#define DMA3_START_ADDR                0xFFC00CC4      /* DMA Channel 3 Start Address Register */
+#define DMA3_CONFIG            0xFFC00CC8      /* DMA Channel 3 Configuration Register */
+#define DMA3_X_COUNT           0xFFC00CD0      /* DMA Channel 3 X Count Register */
+#define DMA3_X_MODIFY          0xFFC00CD4      /* DMA Channel 3 X Modify Register */
+#define DMA3_Y_COUNT           0xFFC00CD8      /* DMA Channel 3 Y Count Register */
+#define DMA3_Y_MODIFY          0xFFC00CDC      /* DMA Channel 3 Y Modify Register */
+#define DMA3_CURR_DESC_PTR     0xFFC00CE0      /* DMA Channel 3 Current Descriptor Pointer Register */
+#define DMA3_CURR_ADDR         0xFFC00CE4      /* DMA Channel 3 Current Address Register */
+#define DMA3_IRQ_STATUS                0xFFC00CE8      /* DMA Channel 3 Interrupt/Status Register */
+#define DMA3_PERIPHERAL_MAP    0xFFC00CEC      /* DMA Channel 3 Peripheral Map Register */
+#define DMA3_CURR_X_COUNT      0xFFC00CF0      /* DMA Channel 3 Current X Count Register */
+#define DMA3_CURR_Y_COUNT      0xFFC00CF8      /* DMA Channel 3 Current Y Count Register */
+
+#define DMA4_NEXT_DESC_PTR     0xFFC00D00      /* DMA Channel 4 Next Descriptor Pointer Register */
+#define DMA4_START_ADDR                0xFFC00D04      /* DMA Channel 4 Start Address Register */
+#define DMA4_CONFIG            0xFFC00D08      /* DMA Channel 4 Configuration Register */
+#define DMA4_X_COUNT           0xFFC00D10      /* DMA Channel 4 X Count Register */
+#define DMA4_X_MODIFY          0xFFC00D14      /* DMA Channel 4 X Modify Register */
+#define DMA4_Y_COUNT           0xFFC00D18      /* DMA Channel 4 Y Count Register */
+#define DMA4_Y_MODIFY          0xFFC00D1C      /* DMA Channel 4 Y Modify Register */
+#define DMA4_CURR_DESC_PTR     0xFFC00D20      /* DMA Channel 4 Current Descriptor Pointer Register */
+#define DMA4_CURR_ADDR         0xFFC00D24      /* DMA Channel 4 Current Address Register */
+#define DMA4_IRQ_STATUS                0xFFC00D28      /* DMA Channel 4 Interrupt/Status Register */
+#define DMA4_PERIPHERAL_MAP    0xFFC00D2C      /* DMA Channel 4 Peripheral Map Register */
+#define DMA4_CURR_X_COUNT      0xFFC00D30      /* DMA Channel 4 Current X Count Register */
+#define DMA4_CURR_Y_COUNT      0xFFC00D38      /* DMA Channel 4 Current Y Count Register */
+
+#define DMA5_NEXT_DESC_PTR     0xFFC00D40      /* DMA Channel 5 Next Descriptor Pointer Register */
+#define DMA5_START_ADDR                0xFFC00D44      /* DMA Channel 5 Start Address Register */
+#define DMA5_CONFIG            0xFFC00D48      /* DMA Channel 5 Configuration Register */
+#define DMA5_X_COUNT           0xFFC00D50      /* DMA Channel 5 X Count Register */
+#define DMA5_X_MODIFY          0xFFC00D54      /* DMA Channel 5 X Modify Register */
+#define DMA5_Y_COUNT           0xFFC00D58      /* DMA Channel 5 Y Count Register */
+#define DMA5_Y_MODIFY          0xFFC00D5C      /* DMA Channel 5 Y Modify Register */
+#define DMA5_CURR_DESC_PTR     0xFFC00D60      /* DMA Channel 5 Current Descriptor Pointer Register */
+#define DMA5_CURR_ADDR         0xFFC00D64      /* DMA Channel 5 Current Address Register */
+#define DMA5_IRQ_STATUS                0xFFC00D68      /* DMA Channel 5 Interrupt/Status Register */
+#define DMA5_PERIPHERAL_MAP    0xFFC00D6C      /* DMA Channel 5 Peripheral Map Register */
+#define DMA5_CURR_X_COUNT      0xFFC00D70      /* DMA Channel 5 Current X Count Register */
+#define DMA5_CURR_Y_COUNT      0xFFC00D78      /* DMA Channel 5 Current Y Count Register */
+
+#define DMA6_NEXT_DESC_PTR     0xFFC00D80      /* DMA Channel 6 Next Descriptor Pointer Register */
+#define DMA6_START_ADDR                0xFFC00D84      /* DMA Channel 6 Start Address Register */
+#define DMA6_CONFIG            0xFFC00D88      /* DMA Channel 6 Configuration Register */
+#define DMA6_X_COUNT           0xFFC00D90      /* DMA Channel 6 X Count Register */
+#define DMA6_X_MODIFY          0xFFC00D94      /* DMA Channel 6 X Modify Register */
+#define DMA6_Y_COUNT           0xFFC00D98      /* DMA Channel 6 Y Count Register */
+#define DMA6_Y_MODIFY          0xFFC00D9C      /* DMA Channel 6 Y Modify Register */
+#define DMA6_CURR_DESC_PTR     0xFFC00DA0      /* DMA Channel 6 Current Descriptor Pointer Register */
+#define DMA6_CURR_ADDR         0xFFC00DA4      /* DMA Channel 6 Current Address Register */
+#define DMA6_IRQ_STATUS                0xFFC00DA8      /* DMA Channel 6 Interrupt/Status Register */
+#define DMA6_PERIPHERAL_MAP    0xFFC00DAC      /* DMA Channel 6 Peripheral Map Register */
+#define DMA6_CURR_X_COUNT      0xFFC00DB0      /* DMA Channel 6 Current X Count Register */
+#define DMA6_CURR_Y_COUNT      0xFFC00DB8      /* DMA Channel 6 Current Y Count Register */
+
+#define DMA7_NEXT_DESC_PTR     0xFFC00DC0      /* DMA Channel 7 Next Descriptor Pointer Register */
+#define DMA7_START_ADDR                0xFFC00DC4      /* DMA Channel 7 Start Address Register */
+#define DMA7_CONFIG            0xFFC00DC8      /* DMA Channel 7 Configuration Register */
+#define DMA7_X_COUNT           0xFFC00DD0      /* DMA Channel 7 X Count Register */
+#define DMA7_X_MODIFY          0xFFC00DD4      /* DMA Channel 7 X Modify Register */
+#define DMA7_Y_COUNT           0xFFC00DD8      /* DMA Channel 7 Y Count Register */
+#define DMA7_Y_MODIFY          0xFFC00DDC      /* DMA Channel 7 Y Modify Register */
+#define DMA7_CURR_DESC_PTR     0xFFC00DE0      /* DMA Channel 7 Current Descriptor Pointer Register */
+#define DMA7_CURR_ADDR         0xFFC00DE4      /* DMA Channel 7 Current Address Register */
+#define DMA7_IRQ_STATUS                0xFFC00DE8      /* DMA Channel 7 Interrupt/Status Register */
+#define DMA7_PERIPHERAL_MAP    0xFFC00DEC      /* DMA Channel 7 Peripheral Map Register */
+#define DMA7_CURR_X_COUNT      0xFFC00DF0      /* DMA Channel 7 Current X Count Register */
+#define DMA7_CURR_Y_COUNT      0xFFC00DF8      /* DMA Channel 7 Current Y Count Register */
+
+#define DMA8_NEXT_DESC_PTR     0xFFC00E00      /* DMA Channel 8 Next Descriptor Pointer Register */
+#define DMA8_START_ADDR                0xFFC00E04      /* DMA Channel 8 Start Address Register */
+#define DMA8_CONFIG            0xFFC00E08      /* DMA Channel 8 Configuration Register */
+#define DMA8_X_COUNT           0xFFC00E10      /* DMA Channel 8 X Count Register */
+#define DMA8_X_MODIFY          0xFFC00E14      /* DMA Channel 8 X Modify Register */
+#define DMA8_Y_COUNT           0xFFC00E18      /* DMA Channel 8 Y Count Register */
+#define DMA8_Y_MODIFY          0xFFC00E1C      /* DMA Channel 8 Y Modify Register */
+#define DMA8_CURR_DESC_PTR     0xFFC00E20      /* DMA Channel 8 Current Descriptor Pointer Register */
+#define DMA8_CURR_ADDR         0xFFC00E24      /* DMA Channel 8 Current Address Register */
+#define DMA8_IRQ_STATUS                0xFFC00E28      /* DMA Channel 8 Interrupt/Status Register */
+#define DMA8_PERIPHERAL_MAP    0xFFC00E2C      /* DMA Channel 8 Peripheral Map Register */
+#define DMA8_CURR_X_COUNT      0xFFC00E30      /* DMA Channel 8 Current X Count Register */
+#define DMA8_CURR_Y_COUNT      0xFFC00E38      /* DMA Channel 8 Current Y Count Register */
+
+#define DMA9_NEXT_DESC_PTR     0xFFC00E40      /* DMA Channel 9 Next Descriptor Pointer Register */
+#define DMA9_START_ADDR                0xFFC00E44      /* DMA Channel 9 Start Address Register */
+#define DMA9_CONFIG            0xFFC00E48      /* DMA Channel 9 Configuration Register */
+#define DMA9_X_COUNT           0xFFC00E50      /* DMA Channel 9 X Count Register */
+#define DMA9_X_MODIFY          0xFFC00E54      /* DMA Channel 9 X Modify Register */
+#define DMA9_Y_COUNT           0xFFC00E58      /* DMA Channel 9 Y Count Register */
+#define DMA9_Y_MODIFY          0xFFC00E5C      /* DMA Channel 9 Y Modify Register */
+#define DMA9_CURR_DESC_PTR     0xFFC00E60      /* DMA Channel 9 Current Descriptor Pointer Register */
+#define DMA9_CURR_ADDR         0xFFC00E64      /* DMA Channel 9 Current Address Register */
+#define DMA9_IRQ_STATUS                0xFFC00E68      /* DMA Channel 9 Interrupt/Status Register */
+#define DMA9_PERIPHERAL_MAP    0xFFC00E6C      /* DMA Channel 9 Peripheral Map Register */
+#define DMA9_CURR_X_COUNT      0xFFC00E70      /* DMA Channel 9 Current X Count Register */
+#define DMA9_CURR_Y_COUNT      0xFFC00E78      /* DMA Channel 9 Current Y Count Register */
+
+#define DMA10_NEXT_DESC_PTR    0xFFC00E80      /* DMA Channel 10 Next Descriptor Pointer Register */
+#define DMA10_START_ADDR       0xFFC00E84      /* DMA Channel 10 Start Address Register */
+#define DMA10_CONFIG           0xFFC00E88      /* DMA Channel 10 Configuration Register */
+#define DMA10_X_COUNT          0xFFC00E90      /* DMA Channel 10 X Count Register */
+#define DMA10_X_MODIFY         0xFFC00E94      /* DMA Channel 10 X Modify Register */
+#define DMA10_Y_COUNT          0xFFC00E98      /* DMA Channel 10 Y Count Register */
+#define DMA10_Y_MODIFY         0xFFC00E9C      /* DMA Channel 10 Y Modify Register */
+#define DMA10_CURR_DESC_PTR    0xFFC00EA0      /* DMA Channel 10 Current Descriptor Pointer Register */
+#define DMA10_CURR_ADDR                0xFFC00EA4      /* DMA Channel 10 Current Address Register */
+#define DMA10_IRQ_STATUS       0xFFC00EA8      /* DMA Channel 10 Interrupt/Status Register */
+#define DMA10_PERIPHERAL_MAP   0xFFC00EAC      /* DMA Channel 10 Peripheral Map Register */
+#define DMA10_CURR_X_COUNT     0xFFC00EB0      /* DMA Channel 10 Current X Count Register */
+#define DMA10_CURR_Y_COUNT     0xFFC00EB8      /* DMA Channel 10 Current Y Count Register */
+
+#define DMA11_NEXT_DESC_PTR    0xFFC00EC0      /* DMA Channel 11 Next Descriptor Pointer Register */
+#define DMA11_START_ADDR       0xFFC00EC4      /* DMA Channel 11 Start Address Register */
+#define DMA11_CONFIG           0xFFC00EC8      /* DMA Channel 11 Configuration Register */
+#define DMA11_X_COUNT          0xFFC00ED0      /* DMA Channel 11 X Count Register */
+#define DMA11_X_MODIFY         0xFFC00ED4      /* DMA Channel 11 X Modify Register */
+#define DMA11_Y_COUNT          0xFFC00ED8      /* DMA Channel 11 Y Count Register */
+#define DMA11_Y_MODIFY         0xFFC00EDC      /* DMA Channel 11 Y Modify Register */
+#define DMA11_CURR_DESC_PTR    0xFFC00EE0      /* DMA Channel 11 Current Descriptor Pointer Register */
+#define DMA11_CURR_ADDR                0xFFC00EE4      /* DMA Channel 11 Current Address Register */
+#define DMA11_IRQ_STATUS       0xFFC00EE8      /* DMA Channel 11 Interrupt/Status Register */
+#define DMA11_PERIPHERAL_MAP   0xFFC00EEC      /* DMA Channel 11 Peripheral Map Register */
+#define DMA11_CURR_X_COUNT     0xFFC00EF0      /* DMA Channel 11 Current X Count Register */
+#define DMA11_CURR_Y_COUNT     0xFFC00EF8      /* DMA Channel 11 Current Y Count Register */
+
+#define MDMA_D0_NEXT_DESC_PTR  0xFFC00F00      /* MemDMA Stream 0 Destination Next Descriptor Pointer Register */
+#define MDMA_D0_START_ADDR     0xFFC00F04      /* MemDMA Stream 0 Destination Start Address Register */
+#define MDMA_D0_CONFIG         0xFFC00F08      /* MemDMA Stream 0 Destination Configuration Register */
+#define MDMA_D0_X_COUNT                0xFFC00F10      /* MemDMA Stream 0 Destination X Count Register */
+#define MDMA_D0_X_MODIFY       0xFFC00F14      /* MemDMA Stream 0 Destination X Modify Register */
+#define MDMA_D0_Y_COUNT                0xFFC00F18      /* MemDMA Stream 0 Destination Y Count Register */
+#define MDMA_D0_Y_MODIFY       0xFFC00F1C      /* MemDMA Stream 0 Destination Y Modify Register */
+#define MDMA_D0_CURR_DESC_PTR  0xFFC00F20      /* MemDMA Stream 0 Destination Current Descriptor Pointer Register */
+#define MDMA_D0_CURR_ADDR      0xFFC00F24      /* MemDMA Stream 0 Destination Current Address Register */
+#define MDMA_D0_IRQ_STATUS     0xFFC00F28      /* MemDMA Stream 0 Destination Interrupt/Status Register */
+#define MDMA_D0_PERIPHERAL_MAP 0xFFC00F2C      /* MemDMA Stream 0 Destination Peripheral Map Register */
+#define MDMA_D0_CURR_X_COUNT   0xFFC00F30      /* MemDMA Stream 0 Destination Current X Count Register */
+#define MDMA_D0_CURR_Y_COUNT   0xFFC00F38      /* MemDMA Stream 0 Destination Current Y Count Register */
+
+#define MDMA_S0_NEXT_DESC_PTR  0xFFC00F40      /* MemDMA Stream 0 Source Next Descriptor Pointer Register */
+#define MDMA_S0_START_ADDR     0xFFC00F44      /* MemDMA Stream 0 Source Start Address Register */
+#define MDMA_S0_CONFIG         0xFFC00F48      /* MemDMA Stream 0 Source Configuration Register */
+#define MDMA_S0_X_COUNT                0xFFC00F50      /* MemDMA Stream 0 Source X Count Register */
+#define MDMA_S0_X_MODIFY       0xFFC00F54      /* MemDMA Stream 0 Source X Modify Register */
+#define MDMA_S0_Y_COUNT                0xFFC00F58      /* MemDMA Stream 0 Source Y Count Register */
+#define MDMA_S0_Y_MODIFY       0xFFC00F5C      /* MemDMA Stream 0 Source Y Modify Register */
+#define MDMA_S0_CURR_DESC_PTR  0xFFC00F60      /* MemDMA Stream 0 Source Current Descriptor Pointer Register */
+#define MDMA_S0_CURR_ADDR      0xFFC00F64      /* MemDMA Stream 0 Source Current Address Register */
+#define MDMA_S0_IRQ_STATUS     0xFFC00F68      /* MemDMA Stream 0 Source Interrupt/Status Register */
+#define MDMA_S0_PERIPHERAL_MAP 0xFFC00F6C      /* MemDMA Stream 0 Source Peripheral Map Register */
+#define MDMA_S0_CURR_X_COUNT   0xFFC00F70      /* MemDMA Stream 0 Source Current X Count Register */
+#define MDMA_S0_CURR_Y_COUNT   0xFFC00F78      /* MemDMA Stream 0 Source Current Y Count Register */
+
+#define MDMA_D1_NEXT_DESC_PTR  0xFFC00F80      /* MemDMA Stream 1 Destination Next Descriptor Pointer Register */
+#define MDMA_D1_START_ADDR     0xFFC00F84      /* MemDMA Stream 1 Destination Start Address Register */
+#define MDMA_D1_CONFIG         0xFFC00F88      /* MemDMA Stream 1 Destination Configuration Register */
+#define MDMA_D1_X_COUNT                0xFFC00F90      /* MemDMA Stream 1 Destination X Count Register */
+#define MDMA_D1_X_MODIFY       0xFFC00F94      /* MemDMA Stream 1 Destination X Modify Register */
+#define MDMA_D1_Y_COUNT                0xFFC00F98      /* MemDMA Stream 1 Destination Y Count Register */
+#define MDMA_D1_Y_MODIFY       0xFFC00F9C      /* MemDMA Stream 1 Destination Y Modify Register */
+#define MDMA_D1_CURR_DESC_PTR  0xFFC00FA0      /* MemDMA Stream 1 Destination Current Descriptor Pointer Register */
+#define MDMA_D1_CURR_ADDR      0xFFC00FA4      /* MemDMA Stream 1 Destination Current Address Register */
+#define MDMA_D1_IRQ_STATUS     0xFFC00FA8      /* MemDMA Stream 1 Destination Interrupt/Status Register */
+#define MDMA_D1_PERIPHERAL_MAP 0xFFC00FAC      /* MemDMA Stream 1 Destination Peripheral Map Register */
+#define MDMA_D1_CURR_X_COUNT   0xFFC00FB0      /* MemDMA Stream 1 Destination Current X Count Register */
+#define MDMA_D1_CURR_Y_COUNT   0xFFC00FB8      /* MemDMA Stream 1 Destination Current Y Count Register */
+
+#define MDMA_S1_NEXT_DESC_PTR  0xFFC00FC0      /* MemDMA Stream 1 Source Next Descriptor Pointer Register */
+#define MDMA_S1_START_ADDR     0xFFC00FC4      /* MemDMA Stream 1 Source Start Address Register */
+#define MDMA_S1_CONFIG         0xFFC00FC8      /* MemDMA Stream 1 Source Configuration Register */
+#define MDMA_S1_X_COUNT                0xFFC00FD0      /* MemDMA Stream 1 Source X Count Register */
+#define MDMA_S1_X_MODIFY       0xFFC00FD4      /* MemDMA Stream 1 Source X Modify Register */
+#define MDMA_S1_Y_COUNT                0xFFC00FD8      /* MemDMA Stream 1 Source Y Count Register */
+#define MDMA_S1_Y_MODIFY       0xFFC00FDC      /* MemDMA Stream 1 Source Y Modify Register */
+#define MDMA_S1_CURR_DESC_PTR  0xFFC00FE0      /* MemDMA Stream 1 Source Current Descriptor Pointer Register */
+#define MDMA_S1_CURR_ADDR      0xFFC00FE4      /* MemDMA Stream 1 Source Current Address Register */
+#define MDMA_S1_IRQ_STATUS     0xFFC00FE8      /* MemDMA Stream 1 Source Interrupt/Status Register */
+#define MDMA_S1_PERIPHERAL_MAP 0xFFC00FEC      /* MemDMA Stream 1 Source Peripheral Map Register */
+#define MDMA_S1_CURR_X_COUNT   0xFFC00FF0      /* MemDMA Stream 1 Source Current X Count Register */
+#define MDMA_S1_CURR_Y_COUNT   0xFFC00FF8      /* MemDMA Stream 1 Source Current Y Count Register */
+
+/* Parallel Peripheral Interface (0xFFC01000 - 0xFFC010FF) */
+#define PPI_CONTROL            0xFFC01000      /* PPI Control Register */
+#define PPI_STATUS             0xFFC01004      /* PPI Status Register */
+#define PPI_COUNT              0xFFC01008      /* PPI Transfer Count Register */
+#define PPI_DELAY              0xFFC0100C      /* PPI Delay Count Register */
+#define PPI_FRAME              0xFFC01010      /* PPI Frame Length Register */
+
+/* Two-Wire Interface          (0xFFC01400 - 0xFFC014FF) */
+#define TWI_CLKDIV             0xFFC01400      /* Serial Clock Divider Register */
+#define TWI_CONTROL            0xFFC01404      /* TWI Control Register */
+#define TWI_SLAVE_CTL          0xFFC01408      /* Slave Mode Control Register */
+#define TWI_SLAVE_STAT         0xFFC0140C      /* Slave Mode Status Register */
+#define TWI_SLAVE_ADDR         0xFFC01410      /* Slave Mode Address Register */
+#define TWI_MASTER_CTL         0xFFC01414      /* Master Mode Control Register */
+#define TWI_MASTER_STAT                0xFFC01418      /* Master Mode Status Register */
+#define TWI_MASTER_ADDR                0xFFC0141C      /* Master Mode Address Register */
+#define TWI_INT_STAT           0xFFC01420      /* TWI Interrupt Status Register */
+#define TWI_INT_MASK           0xFFC01424      /* TWI Master Interrupt Mask Register */
+#define TWI_FIFO_CTL           0xFFC01428      /* FIFO Control Register */
+#define TWI_FIFO_STAT          0xFFC0142C      /* FIFO Status Register */
+#define TWI_XMT_DATA8          0xFFC01480      /* FIFO Transmit Data Single Byte Register */
+#define TWI_XMT_DATA16         0xFFC01484      /* FIFO Transmit Data Double Byte Register */
+#define TWI_RCV_DATA8          0xFFC01488      /* FIFO Receive Data Single Byte Register */
+#define TWI_RCV_DATA16         0xFFC0148C      /* FIFO Receive Data Double Byte Register */
+
+/* General Purpose I/O Port G (0xFFC01500 - 0xFFC015FF) */
+#define PORTGIO                        0xFFC01500      /* Port G I/O Pin State Specify Register */
+#define PORTGIO_CLEAR          0xFFC01504      /* Port G I/O Peripheral Interrupt Clear Register */
+#define PORTGIO_SET            0xFFC01508      /* Port G I/O Peripheral Interrupt Set Register */
+#define PORTGIO_TOGGLE         0xFFC0150C      /* Port G I/O Pin State Toggle Register */
+#define PORTGIO_MASKA          0xFFC01510      /* Port G I/O Mask State Specify Interrupt A Register */
+#define PORTGIO_MASKA_CLEAR    0xFFC01514      /* Port G I/O Mask Disable Interrupt A Register */
+#define PORTGIO_MASKA_SET      0xFFC01518      /* Port G I/O Mask Enable Interrupt A Register */
+#define PORTGIO_MASKA_TOGGLE   0xFFC0151C      /* Port G I/O Mask Toggle Enable Interrupt A Register */
+#define PORTGIO_MASKB          0xFFC01520      /* Port G I/O Mask State Specify Interrupt B Register */
+#define PORTGIO_MASKB_CLEAR    0xFFC01524      /* Port G I/O Mask Disable Interrupt B Register */
+#define PORTGIO_MASKB_SET      0xFFC01528      /* Port G I/O Mask Enable Interrupt B Register */
+#define PORTGIO_MASKB_TOGGLE   0xFFC0152C      /* Port G I/O Mask Toggle Enable Interrupt B Register */
+#define PORTGIO_DIR            0xFFC01530      /* Port G I/O Direction Register */
+#define PORTGIO_POLAR          0xFFC01534      /* Port G I/O Source Polarity Register */
+#define PORTGIO_EDGE           0xFFC01538      /* Port G I/O Source Sensitivity Register */
+#define PORTGIO_BOTH           0xFFC0153C      /* Port G I/O Set on BOTH Edges Register */
+#define PORTGIO_INEN           0xFFC01540      /* Port G I/O Input Enable Register */
+
+/* General Purpose I/O Port H (0xFFC01700 - 0xFFC017FF) */
+#define PORTHIO                        0xFFC01700      /* Port H I/O Pin State Specify Register */
+#define PORTHIO_CLEAR          0xFFC01704      /* Port H I/O Peripheral Interrupt Clear Register */
+#define PORTHIO_SET            0xFFC01708      /* Port H I/O Peripheral Interrupt Set Register */
+#define PORTHIO_TOGGLE         0xFFC0170C      /* Port H I/O Pin State Toggle Register */
+#define PORTHIO_MASKA          0xFFC01710      /* Port H I/O Mask State Specify Interrupt A Register */
+#define PORTHIO_MASKA_CLEAR    0xFFC01714      /* Port H I/O Mask Disable Interrupt A Register */
+#define PORTHIO_MASKA_SET      0xFFC01718      /* Port H I/O Mask Enable Interrupt A Register */
+#define PORTHIO_MASKA_TOGGLE   0xFFC0171C      /* Port H I/O Mask Toggle Enable Interrupt A Register */
+#define PORTHIO_MASKB          0xFFC01720      /* Port H I/O Mask State Specify Interrupt B Register */
+#define PORTHIO_MASKB_CLEAR    0xFFC01724      /* Port H I/O Mask Disable Interrupt B Register */
+#define PORTHIO_MASKB_SET      0xFFC01728      /* Port H I/O Mask Enable Interrupt B Register */
+#define PORTHIO_MASKB_TOGGLE   0xFFC0172C      /* Port H I/O Mask Toggle Enable Interrupt B Register */
+#define PORTHIO_DIR            0xFFC01730      /* Port H I/O Direction Register */
+#define PORTHIO_POLAR          0xFFC01734      /* Port H I/O Source Polarity Register */
+#define PORTHIO_EDGE           0xFFC01738      /* Port H I/O Source Sensitivity Register */
+#define PORTHIO_BOTH           0xFFC0173C      /* Port H I/O Set on BOTH Edges Register */
+#define PORTHIO_INEN           0xFFC01740      /* Port H I/O Input Enable Register */
+
+/* UART1 Controller            (0xFFC02000 - 0xFFC020FF) */
+#define UART1_THR              0xFFC02000      /* Transmit Holding register */
+#define UART1_RBR              0xFFC02000      /* Receive Buffer register */
+#define UART1_DLL              0xFFC02000      /* Divisor Latch (Low-Byte) */
+#define UART1_IER              0xFFC02004      /* Interrupt Enable Register */
+#define UART1_DLH              0xFFC02004      /* Divisor Latch (High-Byte) */
+#define UART1_IIR              0xFFC02008      /* Interrupt Identification Register */
+#define UART1_LCR              0xFFC0200C      /* Line Control Register */
+#define UART1_MCR              0xFFC02010      /* Modem Control Register */
+#define UART1_LSR              0xFFC02014      /* Line Status Register */
+#define UART1_MSR              0xFFC02018      /* Modem Status Register */
+#define UART1_SCR              0xFFC0201C      /* SCR Scratch Register */
+#define UART1_GCTL             0xFFC02024      /* Global Control Register */
+
+/* CAN Controller              (0xFFC02A00 - 0xFFC02FFF) */
+/* For Mailboxes 0-15 */
+#define CAN_MC1                        0xFFC02A00      /* Mailbox config reg 1 */
+#define CAN_MD1                        0xFFC02A04      /* Mailbox direction reg 1 */
+#define CAN_TRS1               0xFFC02A08      /* Transmit Request Set reg 1 */
+#define CAN_TRR1               0xFFC02A0C      /* Transmit Request Reset reg 1 */
+#define CAN_TA1                        0xFFC02A10      /* Transmit Acknowledge reg 1 */
+#define CAN_AA1                        0xFFC02A14      /* Transmit Abort Acknowledge reg 1 */
+#define CAN_RMP1               0xFFC02A18      /* Receive Message Pending reg 1 */
+#define CAN_RML1               0xFFC02A1C      /* Receive Message Lost reg 1 */
+#define CAN_MBTIF1             0xFFC02A20      /* Mailbox Transmit Interrupt Flag reg 1 */
+#define CAN_MBRIF1             0xFFC02A24      /* Mailbox Receive  Interrupt Flag reg 1 */
+#define CAN_MBIM1              0xFFC02A28      /* Mailbox Interrupt Mask reg 1 */
+#define CAN_RFH1               0xFFC02A2C      /* Remote Frame Handling reg 1 */
+#define CAN_OPSS1              0xFFC02A30      /* Overwrite Protection Single Shot Xmit reg 1 */
+
+/* For Mailboxes 16-31 */
+#define CAN_MC2                        0xFFC02A40      /* Mailbox config reg 2 */
+#define CAN_MD2                        0xFFC02A44      /* Mailbox direction reg 2 */
+#define CAN_TRS2               0xFFC02A48      /* Transmit Request Set reg 2 */
+#define CAN_TRR2               0xFFC02A4C      /* Transmit Request Reset reg 2 */
+#define CAN_TA2                        0xFFC02A50      /* Transmit Acknowledge reg 2 */
+#define CAN_AA2                        0xFFC02A54      /* Transmit Abort Acknowledge reg 2 */
+#define CAN_RMP2               0xFFC02A58      /* Receive Message Pending reg 2 */
+#define CAN_RML2               0xFFC02A5C      /* Receive Message Lost reg 2 */
+#define CAN_MBTIF2             0xFFC02A60      /* Mailbox Transmit Interrupt Flag reg 2 */
+#define CAN_MBRIF2             0xFFC02A64      /* Mailbox Receive  Interrupt Flag reg 2 */
+#define CAN_MBIM2              0xFFC02A68      /* Mailbox Interrupt Mask reg 2 */
+#define CAN_RFH2               0xFFC02A6C      /* Remote Frame Handling reg 2 */
+#define CAN_OPSS2              0xFFC02A70      /* Overwrite Protection Single Shot Xmit reg 2 */
+
+/* CAN Configuration, Control, and Status Registers */
+#define CAN_CLOCK              0xFFC02A80      /* Bit Timing Configuration register 0 */
+#define CAN_TIMING             0xFFC02A84      /* Bit Timing Configuration register 1 */
+#define CAN_DEBUG              0xFFC02A88      /* Debug Register */
+#define CAN_STATUS             0xFFC02A8C      /* Global Status Register */
+#define CAN_CEC                        0xFFC02A90      /* Error Counter Register */
+#define CAN_GIS                        0xFFC02A94      /* Global Interrupt Status Register */
+#define CAN_GIM                        0xFFC02A98      /* Global Interrupt Mask Register */
+#define CAN_GIF                        0xFFC02A9C      /* Global Interrupt Flag Register */
+#define CAN_CONTROL            0xFFC02AA0      /* Master Control Register */
+#define CAN_INTR               0xFFC02AA4      /* Interrupt Pending Register */
+#define CAN_SFCMVER            0xFFC02AA8      /* Version Code Register */
+#define CAN_MBTD               0xFFC02AAC      /* Mailbox Temporary Disable Feature */
+#define CAN_EWR                        0xFFC02AB0      /* Programmable Warning Level */
+#define CAN_ESR                        0xFFC02AB4      /* Error Status Register */
+#define CAN_UCREG              0xFFC02AC0      /* Universal Counter Register/Capture Register */
+#define CAN_UCCNT              0xFFC02AC4      /* Universal Counter */
+#define CAN_UCRC               0xFFC02AC8      /* Universal Counter Force Reload Register */
+#define CAN_UCCNF              0xFFC02ACC      /* Universal Counter Configuration Register */
+
+/* Mailbox Acceptance Masks */
+#define CAN_AM00L              0xFFC02B00      /* Mailbox 0 Low Acceptance Mask */
+#define CAN_AM00H              0xFFC02B04      /* Mailbox 0 High Acceptance Mask */
+#define CAN_AM01L              0xFFC02B08      /* Mailbox 1 Low Acceptance Mask */
+#define CAN_AM01H              0xFFC02B0C      /* Mailbox 1 High Acceptance Mask */
+#define CAN_AM02L              0xFFC02B10      /* Mailbox 2 Low Acceptance Mask */
+#define CAN_AM02H              0xFFC02B14      /* Mailbox 2 High Acceptance Mask */
+#define CAN_AM03L              0xFFC02B18      /* Mailbox 3 Low Acceptance Mask */
+#define CAN_AM03H              0xFFC02B1C      /* Mailbox 3 High Acceptance Mask */
+#define CAN_AM04L              0xFFC02B20      /* Mailbox 4 Low Acceptance Mask */
+#define CAN_AM04H              0xFFC02B24      /* Mailbox 4 High Acceptance Mask */
+#define CAN_AM05L              0xFFC02B28      /* Mailbox 5 Low Acceptance Mask */
+#define CAN_AM05H              0xFFC02B2C      /* Mailbox 5 High Acceptance Mask */
+#define CAN_AM06L              0xFFC02B30      /* Mailbox 6 Low Acceptance Mask */
+#define CAN_AM06H              0xFFC02B34      /* Mailbox 6 High Acceptance Mask */
+#define CAN_AM07L              0xFFC02B38      /* Mailbox 7 Low Acceptance Mask */
+#define CAN_AM07H              0xFFC02B3C      /* Mailbox 7 High Acceptance Mask */
+#define CAN_AM08L              0xFFC02B40      /* Mailbox 8 Low Acceptance Mask */
+#define CAN_AM08H              0xFFC02B44      /* Mailbox 8 High Acceptance Mask */
+#define CAN_AM09L              0xFFC02B48      /* Mailbox 9 Low Acceptance Mask */
+#define CAN_AM09H              0xFFC02B4C      /* Mailbox 9 High Acceptance Mask */
+#define CAN_AM10L              0xFFC02B50      /* Mailbox 10 Low Acceptance Mask */
+#define CAN_AM10H              0xFFC02B54      /* Mailbox 10 High Acceptance Mask */
+#define CAN_AM11L              0xFFC02B58      /* Mailbox 11 Low Acceptance Mask */
+#define CAN_AM11H              0xFFC02B5C      /* Mailbox 11 High Acceptance Mask */
+#define CAN_AM12L              0xFFC02B60      /* Mailbox 12 Low Acceptance Mask */
+#define CAN_AM12H              0xFFC02B64      /* Mailbox 12 High Acceptance Mask */
+#define CAN_AM13L              0xFFC02B68      /* Mailbox 13 Low Acceptance Mask */
+#define CAN_AM13H              0xFFC02B6C      /* Mailbox 13 High Acceptance Mask */
+#define CAN_AM14L              0xFFC02B70      /* Mailbox 14 Low Acceptance Mask */
+#define CAN_AM14H              0xFFC02B74      /* Mailbox 14 High Acceptance Mask */
+#define CAN_AM15L              0xFFC02B78      /* Mailbox 15 Low Acceptance Mask */
+#define CAN_AM15H              0xFFC02B7C      /* Mailbox 15 High Acceptance Mask */
+
+#define CAN_AM16L              0xFFC02B80      /* Mailbox 16 Low Acceptance Mask */
+#define CAN_AM16H              0xFFC02B84      /* Mailbox 16 High Acceptance Mask */
+#define CAN_AM17L              0xFFC02B88      /* Mailbox 17 Low Acceptance Mask */
+#define CAN_AM17H              0xFFC02B8C      /* Mailbox 17 High Acceptance Mask */
+#define CAN_AM18L              0xFFC02B90      /* Mailbox 18 Low Acceptance Mask */
+#define CAN_AM18H              0xFFC02B94      /* Mailbox 18 High Acceptance Mask */
+#define CAN_AM19L              0xFFC02B98      /* Mailbox 19 Low Acceptance Mask */
+#define CAN_AM19H              0xFFC02B9C      /* Mailbox 19 High Acceptance Mask */
+#define CAN_AM20L              0xFFC02BA0      /* Mailbox 20 Low Acceptance Mask */
+#define CAN_AM20H              0xFFC02BA4      /* Mailbox 20 High Acceptance Mask */
+#define CAN_AM21L              0xFFC02BA8      /* Mailbox 21 Low Acceptance Mask */
+#define CAN_AM21H              0xFFC02BAC      /* Mailbox 21 High Acceptance Mask */
+#define CAN_AM22L              0xFFC02BB0      /* Mailbox 22 Low Acceptance Mask */
+#define CAN_AM22H              0xFFC02BB4      /* Mailbox 22 High Acceptance Mask */
+#define CAN_AM23L              0xFFC02BB8      /* Mailbox 23 Low Acceptance Mask */
+#define CAN_AM23H              0xFFC02BBC      /* Mailbox 23 High Acceptance Mask */
+#define CAN_AM24L              0xFFC02BC0      /* Mailbox 24 Low Acceptance Mask */
+#define CAN_AM24H              0xFFC02BC4      /* Mailbox 24 High Acceptance Mask */
+#define CAN_AM25L              0xFFC02BC8      /* Mailbox 25 Low Acceptance Mask */
+#define CAN_AM25H              0xFFC02BCC      /* Mailbox 25 High Acceptance Mask */
+#define CAN_AM26L              0xFFC02BD0      /* Mailbox 26 Low Acceptance Mask */
+#define CAN_AM26H              0xFFC02BD4      /* Mailbox 26 High Acceptance Mask */
+#define CAN_AM27L              0xFFC02BD8      /* Mailbox 27 Low Acceptance Mask */
+#define CAN_AM27H              0xFFC02BDC      /* Mailbox 27 High Acceptance Mask */
+#define CAN_AM28L              0xFFC02BE0      /* Mailbox 28 Low Acceptance Mask */
+#define CAN_AM28H              0xFFC02BE4      /* Mailbox 28 High Acceptance Mask */
+#define CAN_AM29L              0xFFC02BE8      /* Mailbox 29 Low Acceptance Mask */
+#define CAN_AM29H              0xFFC02BEC      /* Mailbox 29 High Acceptance Mask */
+#define CAN_AM30L              0xFFC02BF0      /* Mailbox 30 Low Acceptance Mask */
+#define CAN_AM30H              0xFFC02BF4      /* Mailbox 30 High Acceptance Mask */
+#define CAN_AM31L              0xFFC02BF8      /* Mailbox 31 Low Acceptance Mask */
+#define CAN_AM31H              0xFFC02BFC      /* Mailbox 31 High Acceptance Mask */
+
+/* CAN Acceptance Mask Macros */
+#define CAN_AM_L(x)            (CAN_AM00L+((x)*0x8))
+#define CAN_AM_H(x)            (CAN_AM00H+((x)*0x8))
+
+/* Mailbox Registers */
+#define CAN_MB00_DATA0         0xFFC02C00      /* Mailbox 0 Data Word 0 [15:0] Register */
+#define CAN_MB00_DATA1         0xFFC02C04      /* Mailbox 0 Data Word 1 [31:16] Register */
+#define CAN_MB00_DATA2         0xFFC02C08      /* Mailbox 0 Data Word 2 [47:32] Register */
+#define CAN_MB00_DATA3         0xFFC02C0C      /* Mailbox 0 Data Word 3 [63:48] Register */
+#define CAN_MB00_LENGTH                0xFFC02C10      /* Mailbox 0 Data Length Code Register */
+#define CAN_MB00_TIMESTAMP     0xFFC02C14      /* Mailbox 0 Time Stamp Value Register */
+#define CAN_MB00_ID0           0xFFC02C18      /* Mailbox 0 Identifier Low Register */
+#define CAN_MB00_ID1           0xFFC02C1C      /* Mailbox 0 Identifier High Register */
+
+#define CAN_MB01_DATA0         0xFFC02C20      /* Mailbox 1 Data Word 0 [15:0] Register */
+#define CAN_MB01_DATA1         0xFFC02C24      /* Mailbox 1 Data Word 1 [31:16] Register */
+#define CAN_MB01_DATA2         0xFFC02C28      /* Mailbox 1 Data Word 2 [47:32] Register */
+#define CAN_MB01_DATA3         0xFFC02C2C      /* Mailbox 1 Data Word 3 [63:48] Register */
+#define CAN_MB01_LENGTH                0xFFC02C30      /* Mailbox 1 Data Length Code Register */
+#define CAN_MB01_TIMESTAMP     0xFFC02C34      /* Mailbox 1 Time Stamp Value Register */
+#define CAN_MB01_ID0           0xFFC02C38      /* Mailbox 1 Identifier Low Register */
+#define CAN_MB01_ID1           0xFFC02C3C      /* Mailbox 1 Identifier High Register */
+
+#define CAN_MB02_DATA0         0xFFC02C40      /* Mailbox 2 Data Word 0 [15:0] Register */
+#define CAN_MB02_DATA1         0xFFC02C44      /* Mailbox 2 Data Word 1 [31:16] Register */
+#define CAN_MB02_DATA2         0xFFC02C48      /* Mailbox 2 Data Word 2 [47:32] Register */
+#define CAN_MB02_DATA3         0xFFC02C4C      /* Mailbox 2 Data Word 3 [63:48] Register */
+#define CAN_MB02_LENGTH                0xFFC02C50      /* Mailbox 2 Data Length Code Register */
+#define CAN_MB02_TIMESTAMP     0xFFC02C54      /* Mailbox 2 Time Stamp Value Register */
+#define CAN_MB02_ID0           0xFFC02C58      /* Mailbox 2 Identifier Low Register */
+#define CAN_MB02_ID1           0xFFC02C5C      /* Mailbox 2 Identifier High Register */
+
+#define CAN_MB03_DATA0         0xFFC02C60      /* Mailbox 3 Data Word 0 [15:0] Register */
+#define CAN_MB03_DATA1         0xFFC02C64      /* Mailbox 3 Data Word 1 [31:16] Register */
+#define CAN_MB03_DATA2         0xFFC02C68      /* Mailbox 3 Data Word 2 [47:32] Register */
+#define CAN_MB03_DATA3         0xFFC02C6C      /* Mailbox 3 Data Word 3 [63:48] Register */
+#define CAN_MB03_LENGTH                0xFFC02C70      /* Mailbox 3 Data Length Code Register */
+#define CAN_MB03_TIMESTAMP     0xFFC02C74      /* Mailbox 3 Time Stamp Value Register */
+#define CAN_MB03_ID0           0xFFC02C78      /* Mailbox 3 Identifier Low Register */
+#define CAN_MB03_ID1           0xFFC02C7C      /* Mailbox 3 Identifier High Register */
+
+#define CAN_MB04_DATA0         0xFFC02C80      /* Mailbox 4 Data Word 0 [15:0] Register */
+#define CAN_MB04_DATA1         0xFFC02C84      /* Mailbox 4 Data Word 1 [31:16] Register */
+#define CAN_MB04_DATA2         0xFFC02C88      /* Mailbox 4 Data Word 2 [47:32] Register */
+#define CAN_MB04_DATA3         0xFFC02C8C      /* Mailbox 4 Data Word 3 [63:48] Register */
+#define CAN_MB04_LENGTH                0xFFC02C90      /* Mailbox 4 Data Length Code Register */
+#define CAN_MB04_TIMESTAMP     0xFFC02C94      /* Mailbox 4 Time Stamp Value Register */
+#define CAN_MB04_ID0           0xFFC02C98      /* Mailbox 4 Identifier Low Register */
+#define CAN_MB04_ID1           0xFFC02C9C      /* Mailbox 4 Identifier High Register */
+
+#define CAN_MB05_DATA0         0xFFC02CA0      /* Mailbox 5 Data Word 0 [15:0] Register */
+#define CAN_MB05_DATA1         0xFFC02CA4      /* Mailbox 5 Data Word 1 [31:16] Register */
+#define CAN_MB05_DATA2         0xFFC02CA8      /* Mailbox 5 Data Word 2 [47:32] Register */
+#define CAN_MB05_DATA3         0xFFC02CAC      /* Mailbox 5 Data Word 3 [63:48] Register */
+#define CAN_MB05_LENGTH                0xFFC02CB0      /* Mailbox 5 Data Length Code Register */
+#define CAN_MB05_TIMESTAMP     0xFFC02CB4      /* Mailbox 5 Time Stamp Value Register */
+#define CAN_MB05_ID0           0xFFC02CB8      /* Mailbox 5 Identifier Low Register */
+#define CAN_MB05_ID1           0xFFC02CBC      /* Mailbox 5 Identifier High Register */
+
+#define CAN_MB06_DATA0         0xFFC02CC0      /* Mailbox 6 Data Word 0 [15:0] Register */
+#define CAN_MB06_DATA1         0xFFC02CC4      /* Mailbox 6 Data Word 1 [31:16] Register */
+#define CAN_MB06_DATA2         0xFFC02CC8      /* Mailbox 6 Data Word 2 [47:32] Register */
+#define CAN_MB06_DATA3         0xFFC02CCC      /* Mailbox 6 Data Word 3 [63:48] Register */
+#define CAN_MB06_LENGTH                0xFFC02CD0      /* Mailbox 6 Data Length Code Register */
+#define CAN_MB06_TIMESTAMP     0xFFC02CD4      /* Mailbox 6 Time Stamp Value Register */
+#define CAN_MB06_ID0           0xFFC02CD8      /* Mailbox 6 Identifier Low Register */
+#define CAN_MB06_ID1           0xFFC02CDC      /* Mailbox 6 Identifier High Register */
+
+#define CAN_MB07_DATA0         0xFFC02CE0      /* Mailbox 7 Data Word 0 [15:0] Register */
+#define CAN_MB07_DATA1         0xFFC02CE4      /* Mailbox 7 Data Word 1 [31:16] Register */
+#define CAN_MB07_DATA2         0xFFC02CE8      /* Mailbox 7 Data Word 2 [47:32] Register */
+#define CAN_MB07_DATA3         0xFFC02CEC      /* Mailbox 7 Data Word 3 [63:48] Register */
+#define CAN_MB07_LENGTH                0xFFC02CF0      /* Mailbox 7 Data Length Code Register */
+#define CAN_MB07_TIMESTAMP     0xFFC02CF4      /* Mailbox 7 Time Stamp Value Register */
+#define CAN_MB07_ID0           0xFFC02CF8      /* Mailbox 7 Identifier Low Register */
+#define CAN_MB07_ID1           0xFFC02CFC      /* Mailbox 7 Identifier High Register */
+
+#define CAN_MB08_DATA0         0xFFC02D00      /* Mailbox 8 Data Word 0 [15:0] Register */
+#define CAN_MB08_DATA1         0xFFC02D04      /* Mailbox 8 Data Word 1 [31:16] Register */
+#define CAN_MB08_DATA2         0xFFC02D08      /* Mailbox 8 Data Word 2 [47:32] Register */
+#define CAN_MB08_DATA3         0xFFC02D0C      /* Mailbox 8 Data Word 3 [63:48] Register */
+#define CAN_MB08_LENGTH                0xFFC02D10      /* Mailbox 8 Data Length Code Register */
+#define CAN_MB08_TIMESTAMP     0xFFC02D14      /* Mailbox 8 Time Stamp Value Register */
+#define CAN_MB08_ID0           0xFFC02D18      /* Mailbox 8 Identifier Low Register */
+#define CAN_MB08_ID1           0xFFC02D1C      /* Mailbox 8 Identifier High Register */
+
+#define CAN_MB09_DATA0         0xFFC02D20      /* Mailbox 9 Data Word 0 [15:0] Register */
+#define CAN_MB09_DATA1         0xFFC02D24      /* Mailbox 9 Data Word 1 [31:16] Register */
+#define CAN_MB09_DATA2         0xFFC02D28      /* Mailbox 9 Data Word 2 [47:32] Register */
+#define CAN_MB09_DATA3         0xFFC02D2C      /* Mailbox 9 Data Word 3 [63:48] Register */
+#define CAN_MB09_LENGTH                0xFFC02D30      /* Mailbox 9 Data Length Code Register */
+#define CAN_MB09_TIMESTAMP     0xFFC02D34      /* Mailbox 9 Time Stamp Value Register */
+#define CAN_MB09_ID0           0xFFC02D38      /* Mailbox 9 Identifier Low Register */
+#define CAN_MB09_ID1           0xFFC02D3C      /* Mailbox 9 Identifier High Register */
+
+#define CAN_MB10_DATA0         0xFFC02D40      /* Mailbox 10 Data Word 0 [15:0] Register */
+#define CAN_MB10_DATA1         0xFFC02D44      /* Mailbox 10 Data Word 1 [31:16] Register */
+#define CAN_MB10_DATA2         0xFFC02D48      /* Mailbox 10 Data Word 2 [47:32] Register */
+#define CAN_MB10_DATA3         0xFFC02D4C      /* Mailbox 10 Data Word 3 [63:48] Register */
+#define CAN_MB10_LENGTH                0xFFC02D50      /* Mailbox 10 Data Length Code Register */
+#define CAN_MB10_TIMESTAMP     0xFFC02D54      /* Mailbox 10 Time Stamp Value Register */
+#define CAN_MB10_ID0           0xFFC02D58      /* Mailbox 10 Identifier Low Register */
+#define CAN_MB10_ID1           0xFFC02D5C      /* Mailbox 10 Identifier High Register */
+
+#define CAN_MB11_DATA0         0xFFC02D60      /* Mailbox 11 Data Word 0 [15:0] Register */
+#define CAN_MB11_DATA1         0xFFC02D64      /* Mailbox 11 Data Word 1 [31:16] Register */
+#define CAN_MB11_DATA2         0xFFC02D68      /* Mailbox 11 Data Word 2 [47:32] Register */
+#define CAN_MB11_DATA3         0xFFC02D6C      /* Mailbox 11 Data Word 3 [63:48] Register */
+#define CAN_MB11_LENGTH                0xFFC02D70      /* Mailbox 11 Data Length Code Register */
+#define CAN_MB11_TIMESTAMP     0xFFC02D74      /* Mailbox 11 Time Stamp Value Register */
+#define CAN_MB11_ID0           0xFFC02D78      /* Mailbox 11 Identifier Low Register */
+#define CAN_MB11_ID1           0xFFC02D7C      /* Mailbox 11 Identifier High Register */
+
+#define CAN_MB12_DATA0         0xFFC02D80      /* Mailbox 12 Data Word 0 [15:0] Register */
+#define CAN_MB12_DATA1         0xFFC02D84      /* Mailbox 12 Data Word 1 [31:16] Register */
+#define CAN_MB12_DATA2         0xFFC02D88      /* Mailbox 12 Data Word 2 [47:32] Register */
+#define CAN_MB12_DATA3         0xFFC02D8C      /* Mailbox 12 Data Word 3 [63:48] Register */
+#define CAN_MB12_LENGTH                0xFFC02D90      /* Mailbox 12 Data Length Code Register */
+#define CAN_MB12_TIMESTAMP     0xFFC02D94      /* Mailbox 12 Time Stamp Value Register */
+#define CAN_MB12_ID0           0xFFC02D98      /* Mailbox 12 Identifier Low Register */
+#define CAN_MB12_ID1           0xFFC02D9C      /* Mailbox 12 Identifier High Register */
+
+#define CAN_MB13_DATA0         0xFFC02DA0      /* Mailbox 13 Data Word 0 [15:0] Register */
+#define CAN_MB13_DATA1         0xFFC02DA4      /* Mailbox 13 Data Word 1 [31:16] Register */
+#define CAN_MB13_DATA2         0xFFC02DA8      /* Mailbox 13 Data Word 2 [47:32] Register */
+#define CAN_MB13_DATA3         0xFFC02DAC      /* Mailbox 13 Data Word 3 [63:48] Register */
+#define CAN_MB13_LENGTH                0xFFC02DB0      /* Mailbox 13 Data Length Code Register */
+#define CAN_MB13_TIMESTAMP     0xFFC02DB4      /* Mailbox 13 Time Stamp Value Register */
+#define CAN_MB13_ID0           0xFFC02DB8      /* Mailbox 13 Identifier Low Register */
+#define CAN_MB13_ID1           0xFFC02DBC      /* Mailbox 13 Identifier High Register */
+
+#define CAN_MB14_DATA0         0xFFC02DC0      /* Mailbox 14 Data Word 0 [15:0] Register */
+#define CAN_MB14_DATA1         0xFFC02DC4      /* Mailbox 14 Data Word 1 [31:16] Register */
+#define CAN_MB14_DATA2         0xFFC02DC8      /* Mailbox 14 Data Word 2 [47:32] Register */
+#define CAN_MB14_DATA3         0xFFC02DCC      /* Mailbox 14 Data Word 3 [63:48] Register */
+#define CAN_MB14_LENGTH                0xFFC02DD0      /* Mailbox 14 Data Length Code Register */
+#define CAN_MB14_TIMESTAMP     0xFFC02DD4      /* Mailbox 14 Time Stamp Value Register */
+#define CAN_MB14_ID0           0xFFC02DD8      /* Mailbox 14 Identifier Low Register */
+#define CAN_MB14_ID1           0xFFC02DDC      /* Mailbox 14 Identifier High Register */
+
+#define CAN_MB15_DATA0         0xFFC02DE0      /* Mailbox 15 Data Word 0 [15:0] Register */
+#define CAN_MB15_DATA1         0xFFC02DE4      /* Mailbox 15 Data Word 1 [31:16] Register */
+#define CAN_MB15_DATA2         0xFFC02DE8      /* Mailbox 15 Data Word 2 [47:32] Register */
+#define CAN_MB15_DATA3         0xFFC02DEC      /* Mailbox 15 Data Word 3 [63:48] Register */
+#define CAN_MB15_LENGTH                0xFFC02DF0      /* Mailbox 15 Data Length Code Register */
+#define CAN_MB15_TIMESTAMP     0xFFC02DF4      /* Mailbox 15 Time Stamp Value Register */
+#define CAN_MB15_ID0           0xFFC02DF8      /* Mailbox 15 Identifier Low Register */
+#define CAN_MB15_ID1           0xFFC02DFC      /* Mailbox 15 Identifier High Register */
+
+#define CAN_MB16_DATA0         0xFFC02E00      /* Mailbox 16 Data Word 0 [15:0] Register */
+#define CAN_MB16_DATA1         0xFFC02E04      /* Mailbox 16 Data Word 1 [31:16] Register */
+#define CAN_MB16_DATA2         0xFFC02E08      /* Mailbox 16 Data Word 2 [47:32] Register */
+#define CAN_MB16_DATA3         0xFFC02E0C      /* Mailbox 16 Data Word 3 [63:48] Register */
+#define CAN_MB16_LENGTH                0xFFC02E10      /* Mailbox 16 Data Length Code Register */
+#define CAN_MB16_TIMESTAMP     0xFFC02E14      /* Mailbox 16 Time Stamp Value Register */
+#define CAN_MB16_ID0           0xFFC02E18      /* Mailbox 16 Identifier Low Register */
+#define CAN_MB16_ID1           0xFFC02E1C      /* Mailbox 16 Identifier High Register */
+
+#define CAN_MB17_DATA0         0xFFC02E20      /* Mailbox 17 Data Word 0 [15:0] Register */
+#define CAN_MB17_DATA1         0xFFC02E24      /* Mailbox 17 Data Word 1 [31:16] Register */
+#define CAN_MB17_DATA2         0xFFC02E28      /* Mailbox 17 Data Word 2 [47:32] Register */
+#define CAN_MB17_DATA3         0xFFC02E2C      /* Mailbox 17 Data Word 3 [63:48] Register */
+#define CAN_MB17_LENGTH                0xFFC02E30      /* Mailbox 17 Data Length Code Register */
+#define CAN_MB17_TIMESTAMP     0xFFC02E34      /* Mailbox 17 Time Stamp Value Register */
+#define CAN_MB17_ID0           0xFFC02E38      /* Mailbox 17 Identifier Low Register */
+#define CAN_MB17_ID1           0xFFC02E3C      /* Mailbox 17 Identifier High Register */
+
+#define CAN_MB18_DATA0         0xFFC02E40      /* Mailbox 18 Data Word 0 [15:0] Register */
+#define CAN_MB18_DATA1         0xFFC02E44      /* Mailbox 18 Data Word 1 [31:16] Register */
+#define CAN_MB18_DATA2         0xFFC02E48      /* Mailbox 18 Data Word 2 [47:32] Register */
+#define CAN_MB18_DATA3         0xFFC02E4C      /* Mailbox 18 Data Word 3 [63:48] Register */
+#define CAN_MB18_LENGTH                0xFFC02E50      /* Mailbox 18 Data Length Code Register */
+#define CAN_MB18_TIMESTAMP     0xFFC02E54      /* Mailbox 18 Time Stamp Value Register */
+#define CAN_MB18_ID0           0xFFC02E58      /* Mailbox 18 Identifier Low Register */
+#define CAN_MB18_ID1           0xFFC02E5C      /* Mailbox 18 Identifier High Register */
+
+#define CAN_MB19_DATA0         0xFFC02E60      /* Mailbox 19 Data Word 0 [15:0] Register */
+#define CAN_MB19_DATA1         0xFFC02E64      /* Mailbox 19 Data Word 1 [31:16] Register */
+#define CAN_MB19_DATA2         0xFFC02E68      /* Mailbox 19 Data Word 2 [47:32] Register */
+#define CAN_MB19_DATA3         0xFFC02E6C      /* Mailbox 19 Data Word 3 [63:48] Register */
+#define CAN_MB19_LENGTH                0xFFC02E70      /* Mailbox 19 Data Length Code Register */
+#define CAN_MB19_TIMESTAMP     0xFFC02E74      /* Mailbox 19 Time Stamp Value Register */
+#define CAN_MB19_ID0           0xFFC02E78      /* Mailbox 19 Identifier Low Register */
+#define CAN_MB19_ID1           0xFFC02E7C      /* Mailbox 19 Identifier High Register */
+
+#define CAN_MB20_DATA0         0xFFC02E80      /* Mailbox 20 Data Word 0 [15:0] Register */
+#define CAN_MB20_DATA1         0xFFC02E84      /* Mailbox 20 Data Word 1 [31:16] Register */
+#define CAN_MB20_DATA2         0xFFC02E88      /* Mailbox 20 Data Word 2 [47:32] Register */
+#define CAN_MB20_DATA3         0xFFC02E8C      /* Mailbox 20 Data Word 3 [63:48] Register */
+#define CAN_MB20_LENGTH                0xFFC02E90      /* Mailbox 20 Data Length Code Register */
+#define CAN_MB20_TIMESTAMP     0xFFC02E94      /* Mailbox 20 Time Stamp Value Register */
+#define CAN_MB20_ID0           0xFFC02E98      /* Mailbox 20 Identifier Low Register */
+#define CAN_MB20_ID1           0xFFC02E9C      /* Mailbox 20 Identifier High Register */
+
+#define CAN_MB21_DATA0         0xFFC02EA0      /* Mailbox 21 Data Word 0 [15:0] Register */
+#define CAN_MB21_DATA1         0xFFC02EA4      /* Mailbox 21 Data Word 1 [31:16] Register */
+#define CAN_MB21_DATA2         0xFFC02EA8      /* Mailbox 21 Data Word 2 [47:32] Register */
+#define CAN_MB21_DATA3         0xFFC02EAC      /* Mailbox 21 Data Word 3 [63:48] Register */
+#define CAN_MB21_LENGTH                0xFFC02EB0      /* Mailbox 21 Data Length Code Register */
+#define CAN_MB21_TIMESTAMP     0xFFC02EB4      /* Mailbox 21 Time Stamp Value Register */
+#define CAN_MB21_ID0           0xFFC02EB8      /* Mailbox 21 Identifier Low Register */
+#define CAN_MB21_ID1           0xFFC02EBC      /* Mailbox 21 Identifier High Register */
+
+#define CAN_MB22_DATA0         0xFFC02EC0      /* Mailbox 22 Data Word 0 [15:0] Register */
+#define CAN_MB22_DATA1         0xFFC02EC4      /* Mailbox 22 Data Word 1 [31:16] Register */
+#define CAN_MB22_DATA2         0xFFC02EC8      /* Mailbox 22 Data Word 2 [47:32] Register */
+#define CAN_MB22_DATA3         0xFFC02ECC      /* Mailbox 22 Data Word 3 [63:48] Register */
+#define CAN_MB22_LENGTH                0xFFC02ED0      /* Mailbox 22 Data Length Code Register */
+#define CAN_MB22_TIMESTAMP     0xFFC02ED4      /* Mailbox 22 Time Stamp Value Register */
+#define CAN_MB22_ID0           0xFFC02ED8      /* Mailbox 22 Identifier Low Register */
+#define CAN_MB22_ID1           0xFFC02EDC      /* Mailbox 22 Identifier High Register */
+
+#define CAN_MB23_DATA0         0xFFC02EE0      /* Mailbox 23 Data Word 0 [15:0] Register */
+#define CAN_MB23_DATA1         0xFFC02EE4      /* Mailbox 23 Data Word 1 [31:16] Register */
+#define CAN_MB23_DATA2         0xFFC02EE8      /* Mailbox 23 Data Word 2 [47:32] Register */
+#define CAN_MB23_DATA3         0xFFC02EEC      /* Mailbox 23 Data Word 3 [63:48] Register */
+#define CAN_MB23_LENGTH                0xFFC02EF0      /* Mailbox 23 Data Length Code Register */
+#define CAN_MB23_TIMESTAMP     0xFFC02EF4      /* Mailbox 23 Time Stamp Value Register */
+#define CAN_MB23_ID0           0xFFC02EF8      /* Mailbox 23 Identifier Low Register */
+#define CAN_MB23_ID1           0xFFC02EFC      /* Mailbox 23 Identifier High Register */
+
+#define CAN_MB24_DATA0         0xFFC02F00      /* Mailbox 24 Data Word 0 [15:0] Register */
+#define CAN_MB24_DATA1         0xFFC02F04      /* Mailbox 24 Data Word 1 [31:16] Register */
+#define CAN_MB24_DATA2         0xFFC02F08      /* Mailbox 24 Data Word 2 [47:32] Register */
+#define CAN_MB24_DATA3         0xFFC02F0C      /* Mailbox 24 Data Word 3 [63:48] Register */
+#define CAN_MB24_LENGTH                0xFFC02F10      /* Mailbox 24 Data Length Code Register */
+#define CAN_MB24_TIMESTAMP     0xFFC02F14      /* Mailbox 24 Time Stamp Value Register */
+#define CAN_MB24_ID0           0xFFC02F18      /* Mailbox 24 Identifier Low Register */
+#define CAN_MB24_ID1           0xFFC02F1C      /* Mailbox 24 Identifier High Register */
+
+#define CAN_MB25_DATA0         0xFFC02F20      /* Mailbox 25 Data Word 0 [15:0] Register */
+#define CAN_MB25_DATA1         0xFFC02F24      /* Mailbox 25 Data Word 1 [31:16] Register */
+#define CAN_MB25_DATA2         0xFFC02F28      /* Mailbox 25 Data Word 2 [47:32] Register */
+#define CAN_MB25_DATA3         0xFFC02F2C      /* Mailbox 25 Data Word 3 [63:48] Register */
+#define CAN_MB25_LENGTH                0xFFC02F30      /* Mailbox 25 Data Length Code Register */
+#define CAN_MB25_TIMESTAMP     0xFFC02F34      /* Mailbox 25 Time Stamp Value Register */
+#define CAN_MB25_ID0           0xFFC02F38      /* Mailbox 25 Identifier Low Register */
+#define CAN_MB25_ID1           0xFFC02F3C      /* Mailbox 25 Identifier High Register */
+
+#define CAN_MB26_DATA0         0xFFC02F40      /* Mailbox 26 Data Word 0 [15:0] Register */
+#define CAN_MB26_DATA1         0xFFC02F44      /* Mailbox 26 Data Word 1 [31:16] Register */
+#define CAN_MB26_DATA2         0xFFC02F48      /* Mailbox 26 Data Word 2 [47:32] Register */
+#define CAN_MB26_DATA3         0xFFC02F4C      /* Mailbox 26 Data Word 3 [63:48] Register */
+#define CAN_MB26_LENGTH                0xFFC02F50      /* Mailbox 26 Data Length Code Register */
+#define CAN_MB26_TIMESTAMP     0xFFC02F54      /* Mailbox 26 Time Stamp Value Register */
+#define CAN_MB26_ID0           0xFFC02F58      /* Mailbox 26 Identifier Low Register */
+#define CAN_MB26_ID1           0xFFC02F5C      /* Mailbox 26 Identifier High Register */
+
+#define CAN_MB27_DATA0         0xFFC02F60      /* Mailbox 27 Data Word 0 [15:0] Register */
+#define CAN_MB27_DATA1         0xFFC02F64      /* Mailbox 27 Data Word 1 [31:16] Register */
+#define CAN_MB27_DATA2         0xFFC02F68      /* Mailbox 27 Data Word 2 [47:32] Register */
+#define CAN_MB27_DATA3         0xFFC02F6C      /* Mailbox 27 Data Word 3 [63:48] Register */
+#define CAN_MB27_LENGTH                0xFFC02F70      /* Mailbox 27 Data Length Code Register */
+#define CAN_MB27_TIMESTAMP     0xFFC02F74      /* Mailbox 27 Time Stamp Value Register */
+#define CAN_MB27_ID0           0xFFC02F78      /* Mailbox 27 Identifier Low Register */
+#define CAN_MB27_ID1           0xFFC02F7C      /* Mailbox 27 Identifier High Register */
+
+#define CAN_MB28_DATA0         0xFFC02F80      /* Mailbox 28 Data Word 0 [15:0] Register */
+#define CAN_MB28_DATA1         0xFFC02F84      /* Mailbox 28 Data Word 1 [31:16] Register */
+#define CAN_MB28_DATA2         0xFFC02F88      /* Mailbox 28 Data Word 2 [47:32] Register */
+#define CAN_MB28_DATA3         0xFFC02F8C      /* Mailbox 28 Data Word 3 [63:48] Register */
+#define CAN_MB28_LENGTH                0xFFC02F90      /* Mailbox 28 Data Length Code Register */
+#define CAN_MB28_TIMESTAMP     0xFFC02F94      /* Mailbox 28 Time Stamp Value Register */
+#define CAN_MB28_ID0           0xFFC02F98      /* Mailbox 28 Identifier Low Register */
+#define CAN_MB28_ID1           0xFFC02F9C      /* Mailbox 28 Identifier High Register */
+
+#define CAN_MB29_DATA0         0xFFC02FA0      /* Mailbox 29 Data Word 0 [15:0] Register */
+#define CAN_MB29_DATA1         0xFFC02FA4      /* Mailbox 29 Data Word 1 [31:16] Register */
+#define CAN_MB29_DATA2         0xFFC02FA8      /* Mailbox 29 Data Word 2 [47:32] Register */
+#define CAN_MB29_DATA3         0xFFC02FAC      /* Mailbox 29 Data Word 3 [63:48] Register */
+#define CAN_MB29_LENGTH                0xFFC02FB0      /* Mailbox 29 Data Length Code Register */
+#define CAN_MB29_TIMESTAMP     0xFFC02FB4      /* Mailbox 29 Time Stamp Value Register */
+#define CAN_MB29_ID0           0xFFC02FB8      /* Mailbox 29 Identifier Low Register */
+#define CAN_MB29_ID1           0xFFC02FBC      /* Mailbox 29 Identifier High Register */
+
+#define CAN_MB30_DATA0         0xFFC02FC0      /* Mailbox 30 Data Word 0 [15:0] Register */
+#define CAN_MB30_DATA1         0xFFC02FC4      /* Mailbox 30 Data Word 1 [31:16] Register */
+#define CAN_MB30_DATA2         0xFFC02FC8      /* Mailbox 30 Data Word 2 [47:32] Register */
+#define CAN_MB30_DATA3         0xFFC02FCC      /* Mailbox 30 Data Word 3 [63:48] Register */
+#define CAN_MB30_LENGTH                0xFFC02FD0      /* Mailbox 30 Data Length Code Register */
+#define CAN_MB30_TIMESTAMP     0xFFC02FD4      /* Mailbox 30 Time Stamp Value Register */
+#define CAN_MB30_ID0           0xFFC02FD8      /* Mailbox 30 Identifier Low Register */
+#define CAN_MB30_ID1           0xFFC02FDC      /* Mailbox 30 Identifier High Register */
+
+#define CAN_MB31_DATA0         0xFFC02FE0      /* Mailbox 31 Data Word 0 [15:0] Register */
+#define CAN_MB31_DATA1         0xFFC02FE4      /* Mailbox 31 Data Word 1 [31:16] Register */
+#define CAN_MB31_DATA2         0xFFC02FE8      /* Mailbox 31 Data Word 2 [47:32] Register */
+#define CAN_MB31_DATA3         0xFFC02FEC      /* Mailbox 31 Data Word 3 [63:48] Register */
+#define CAN_MB31_LENGTH                0xFFC02FF0      /* Mailbox 31 Data Length Code Register */
+#define CAN_MB31_TIMESTAMP     0xFFC02FF4      /* Mailbox 31 Time Stamp Value Register */
+#define CAN_MB31_ID0           0xFFC02FF8      /* Mailbox 31 Identifier Low Register */
+#define CAN_MB31_ID1           0xFFC02FFC      /* Mailbox 31 Identifier High Register */
+
+/* CAN Mailbox Area Macros */
+#define CAN_MB_ID1(x)          (CAN_MB00_ID1+((x)*0x20))
+#define CAN_MB_ID0(x)          (CAN_MB00_ID0+((x)*0x20))
+#define CAN_MB_TIMESTAMP(x)    (CAN_MB00_TIMESTAMP+((x)*0x20))
+#define CAN_MB_LENGTH(x)       (CAN_MB00_LENGTH+((x)*0x20))
+#define CAN_MB_DATA3(x)                (CAN_MB00_DATA3+((x)*0x20))
+#define CAN_MB_DATA2(x)                (CAN_MB00_DATA2+((x)*0x20))
+#define CAN_MB_DATA1(x)                (CAN_MB00_DATA1+((x)*0x20))
+#define CAN_MB_DATA0(x)                (CAN_MB00_DATA0+((x)*0x20))
+
+/* Pin Control Registers       (0xFFC03200 - 0xFFC032FF) */
+#define PORTF_FER              0xFFC03200      /* Port F Function Enable Register (Alternate/Flag*) */
+#define PORTG_FER              0xFFC03204      /* Port G Function Enable Register (Alternate/Flag*) */
+#define PORTH_FER              0xFFC03208      /* Port H Function Enable Register (Alternate/Flag*) */
+#define PORT_MUX               0xFFC0320C      /* Port Multiplexer Control Register */
+
+/* Handshake MDMA Registers    (0xFFC03300 - 0xFFC033FF) */
+#define HMDMA0_CONTROL         0xFFC03300      /* Handshake MDMA0 Control Register */
+#define HMDMA0_ECINIT          0xFFC03304      /* HMDMA0 Initial Edge Count Register */
+#define HMDMA0_BCINIT          0xFFC03308      /* HMDMA0 Initial Block Count Register */
+#define HMDMA0_ECURGENT                0xFFC0330C      /* HMDMA0 Urgent Edge Count Threshhold Register */
+#define HMDMA0_ECOVERFLOW      0xFFC03310      /* HMDMA0 Edge Count Overflow Interrupt Register */
+#define HMDMA0_ECOUNT          0xFFC03314      /* HMDMA0 Current Edge Count Register */
+#define HMDMA0_BCOUNT          0xFFC03318      /* HMDMA0 Current Block Count Register */
+
+#define HMDMA1_CONTROL         0xFFC03340      /* Handshake MDMA1 Control Register */
+#define HMDMA1_ECINIT          0xFFC03344      /* HMDMA1 Initial Edge Count Register */
+#define HMDMA1_BCINIT          0xFFC03348      /* HMDMA1 Initial Block Count Register */
+#define HMDMA1_ECURGENT                0xFFC0334C      /* HMDMA1 Urgent Edge Count Threshhold Register */
+#define HMDMA1_ECOVERFLOW      0xFFC03350      /* HMDMA1 Edge Count Overflow Interrupt Register */
+#define HMDMA1_ECOUNT          0xFFC03354      /* HMDMA1 Current Edge Count Register */
+#define HMDMA1_BCOUNT          0xFFC03358      /* HMDMA1 Current Block Count Register */
+
+/*
+ * System MMR Register Bits And Macros
+ *
+ * Disclaimer: All macros are intended to make C and Assembly code more readable.
+ *     Use these macros carefully, as any that do left shifts for field
+ *     depositing will result in the lower order bits being destroyed.  Any
+ *     macro that shifts left to properly position the bit-field should be
+ *     used as part of an OR to initialize a register and NOT as a dynamic
+ *     modifier UNLESS the lower order bits are saved and ORed back in when
+ *     the macro is used.
+ */
+/*
+ * PLL AND RESET MASKS
+ * PLL_CTL Masks
+ */
+#define DF                     0x0001          /* 0: PLL = CLKIN, 1: PLL = CLKIN/2 */
+#define PLL_OFF                        0x0002          /* PLL Not Powered */
+#define STOPCK                 0x0008          /* Core Clock Off */
+#define PDWN                   0x0020          /* Enter Deep Sleep Mode */
+#define        IN_DELAY                0x0040          /* Add 200ps Delay To EBIU Input Latches */
+#define        OUT_DELAY               0x0080          /* Add 200ps Delay To EBIU Output Signals */
+#define BYPASS                 0x0100          /* Bypass the PLL */
+#define        MSEL                    0x7E00          /* Multiplier Select For CCLK/VCO Factors */
+/* PLL_CTL Macros (Only Use With Logic OR While Setting Lower Order Bits) */
+#define        SET_MSEL(x)             (((x)&0x3F) << 0x9) /* Set MSEL = 0-63 --> VCO = CLKIN*MSEL */
+
+/* PLL_DIV Masks */
+#define SSEL                   0x000F          /* System Select */
+#define        CSEL                    0x0030          /* Core Select */
+#define CSEL_DIV1              0x0000          /* CCLK = VCO / 1 */
+#define CSEL_DIV2              0x0010          /* CCLK = VCO / 2 */
+#define        CSEL_DIV4               0x0020          /* CCLK = VCO / 4 */
+#define        CSEL_DIV8               0x0030          /* CCLK = VCO / 8 */
+
+#define CCLK_DIV1              CSEL_DIV1
+#define CCLK_DIV2              CSEL_DIV2
+#define CCLK_DIV4              CSEL_DIV4
+#define CCLK_DIV8              CSEL_DIV8
+/* PLL_DIV Macros */
+#define SET_SSEL(x)            ((x)&0xF)       /* Set SSEL = 0-15 --> SCLK = VCO/SSEL */
+
+/* VR_CTL Masks */
+#define        FREQ                    0x0003          /* Switching Oscillator Frequency For Regulator */
+#define        HIBERNATE               0x0000          /* Powerdown/Bypass On-Board Regulation */
+#define        FREQ_333                0x0001          /* Switching Frequency Is 333 kHz */
+#define        FREQ_667                0x0002          /* Switching Frequency Is 667 kHz */
+#define        FREQ_1000               0x0003          /* Switching Frequency Is 1 MHz */
+
+#define GAIN                   0x000C          /* Voltage Level Gain */
+#define        GAIN_5                  0x0000          /* GAIN = 5 */
+#define        GAIN_10                 0x0004          /* GAIN = 10 */
+#define        GAIN_20                 0x0008          /* GAIN = 20 */
+#define        GAIN_50                 0x000C          /* GAIN = 50 */
+
+#define        VLEV                    0x00F0          /* Internal Voltage Level */
+#define        VLEV_085                0x0060          /* VLEV = 0.85 V (-5% - +10% Accuracy) */
+#define        VLEV_090                0x0070          /* VLEV = 0.90 V (-5% - +10% Accuracy) */
+#define        VLEV_095                0x0080          /* VLEV = 0.95 V (-5% - +10% Accuracy) */
+#define        VLEV_100                0x0090          /* VLEV = 1.00 V (-5% - +10% Accuracy) */
+#define        VLEV_105                0x00A0          /* VLEV = 1.05 V (-5% - +10% Accuracy) */
+#define        VLEV_110                0x00B0          /* VLEV = 1.10 V (-5% - +10% Accuracy) */
+#define        VLEV_115                0x00C0          /* VLEV = 1.15 V (-5% - +10% Accuracy) */
+#define        VLEV_120                0x00D0          /* VLEV = 1.20 V (-5% - +10% Accuracy) */
+#define        VLEV_125                0x00E0          /* VLEV = 1.25 V (-5% - +10% Accuracy) */
+#define        VLEV_130                0x00F0          /* VLEV = 1.30 V (-5% - +10% Accuracy) */
+
+#define        WAKE                    0x0100          /* Enable RTC/Reset Wakeup From Hibernate */
+#define        CANWE                   0x0200          /* Enable CAN Wakeup From Hibernate */
+#define        PHYWE                   0x0400          /* Enable PHY Wakeup From Hibernate */
+#define        CLKBUFOE                0x4000          /* CLKIN Buffer Output Enable */
+#define        PHYCLKOE                CLKBUFOE        /* Alternative legacy name for the above */
+#define        CKELOW                  0x8000          /* Enable Drive CKE Low During Reset */
+
+/* PLL_STAT Masks */
+#define ACTIVE_PLLENABLED      0x0001          /* Processor In Active Mode With PLL Enabled */
+#define        FULL_ON                 0x0002          /* Processor In Full On Mode */
+#define ACTIVE_PLLDISABLED     0x0004          /* Processor In Active Mode With PLL Disabled */
+#define        PLL_LOCKED              0x0020          /* PLL_LOCKCNT Has Been Reached */
+
+/* SWRST Masks */
+#define SYSTEM_RESET           0x0007          /* Initiates A System Software Reset */
+#define        DOUBLE_FAULT            0x0008          /* Core Double Fault Causes Reset */
+#define RESET_DOUBLE           0x2000          /* SW Reset Generated By Core Double-Fault */
+#define RESET_WDOG             0x4000          /* SW Reset Generated By Watchdog Timer */
+#define RESET_SOFTWARE         0x8000          /* SW Reset Occurred Since Last Read Of SWRST */
+
+/* SYSCR Masks */
+#define BMODE                  0x0007          /* Boot Mode - Latched During HW Reset From Mode Pins */
+#define        NOBOOT                  0x0010          /* Execute From L1 or ASYNC Bank 0 When BMODE = 0 */
+
+/*
+ * SYSTEM INTERRUPT CONTROLLER MASKS
+ */
+/* Peripheral Masks For SIC_ISR, SIC_IWR, SIC_IMASK */
+#define IRQ_PLL_WAKEUP         0x00000001      /* PLL Wakeup Interrupt */
+#define IRQ_ERROR1             0x00000002      /* Error Interrupt (DMA, DMARx Block, DMARx Overflow) */
+#define IRQ_ERROR2             0x00000004      /* Error Interrupt (CAN, Ethernet, SPORTx, PPI, SPI, UARTx) */
+#define IRQ_RTC                        0x00000008      /* Real Time Clock Interrupt */
+#define IRQ_DMA0               0x00000010      /* DMA Channel 0 (PPI) Interrupt */
+#define IRQ_DMA3               0x00000020      /* DMA Channel 3 (SPORT0 RX) Interrupt */
+#define IRQ_DMA4               0x00000040      /* DMA Channel 4 (SPORT0 TX) Interrupt */
+#define IRQ_DMA5               0x00000080      /* DMA Channel 5 (SPORT1 RX) Interrupt */
+
+#define IRQ_DMA6               0x00000100      /* DMA Channel 6 (SPORT1 TX) Interrupt */
+#define IRQ_TWI                        0x00000200      /* TWI Interrupt */
+#define IRQ_DMA7               0x00000400      /* DMA Channel 7 (SPI) Interrupt */
+#define IRQ_DMA8               0x00000800      /* DMA Channel 8 (UART0 RX) Interrupt */
+#define IRQ_DMA9               0x00001000      /* DMA Channel 9 (UART0 TX) Interrupt */
+#define IRQ_DMA10              0x00002000      /* DMA Channel 10 (UART1 RX) Interrupt */
+#define IRQ_DMA11              0x00004000      /* DMA Channel 11 (UART1 TX) Interrupt */
+#define IRQ_CAN_RX             0x00008000      /* CAN Receive Interrupt */
+
+#define IRQ_CAN_TX             0x00010000      /* CAN Transmit Interrupt */
+#define IRQ_DMA1               0x00020000      /* DMA Channel 1 (Ethernet RX) Interrupt */
+#define IRQ_PFA_PORTH          0x00020000      /* PF Port H (PF47:32) Interrupt A */
+#define IRQ_DMA2               0x00040000      /* DMA Channel 2 (Ethernet TX) Interrupt */
+#define IRQ_PFB_PORTH          0x00040000      /* PF Port H (PF47:32) Interrupt B */
+#define IRQ_TIMER0             0x00080000      /* Timer 0 Interrupt */
+#define IRQ_TIMER1             0x00100000      /* Timer 1 Interrupt */
+#define IRQ_TIMER2             0x00200000      /* Timer 2 Interrupt */
+#define IRQ_TIMER3             0x00400000      /* Timer 3 Interrupt */
+#define IRQ_TIMER4             0x00800000      /* Timer 4 Interrupt */
+
+#define IRQ_TIMER5             0x01000000      /* Timer 5 Interrupt */
+#define IRQ_TIMER6             0x02000000      /* Timer 6 Interrupt */
+#define IRQ_TIMER7             0x04000000      /* Timer 7 Interrupt */
+#define IRQ_PFA_PORTFG         0x08000000      /* PF Ports F&G (PF31:0) Interrupt A */
+#define IRQ_PFB_PORTF          0x80000000      /* PF Port F (PF15:0) Interrupt B */
+#define IRQ_DMA12              0x20000000      /* DMA Channels 12 (MDMA1 Source) RX Interrupt */
+#define IRQ_DMA13              0x20000000      /* DMA Channels 13 (MDMA1 Destination) TX Interrupt */
+#define IRQ_DMA14              0x40000000      /* DMA Channels 14 (MDMA0 Source) RX Interrupt */
+#define IRQ_DMA15              0x40000000      /* DMA Channels 15 (MDMA0 Destination) TX Interrupt */
+#define IRQ_WDOG               0x80000000      /* Software Watchdog Timer Interrupt */
+#define IRQ_PFB_PORTG          0x10000000      /* PF Port G (PF31:16) Interrupt B */
+
+/* SIC_IAR0 Macros */
+#define P0_IVG(x)              (((x)&0xF)-7)           /* Peripheral #0 assigned IVG #x */
+#define P1_IVG(x)              (((x)&0xF)-7) << 0x4    /* Peripheral #1 assigned IVG #x */
+#define P2_IVG(x)              (((x)&0xF)-7) << 0x8    /* Peripheral #2 assigned IVG #x */
+#define P3_IVG(x)              (((x)&0xF)-7) << 0xC    /* Peripheral #3 assigned IVG #x */
+#define P4_IVG(x)              (((x)&0xF)-7) << 0x10   /* Peripheral #4 assigned IVG #x */
+#define P5_IVG(x)              (((x)&0xF)-7) << 0x14   /* Peripheral #5 assigned IVG #x */
+#define P6_IVG(x)              (((x)&0xF)-7) << 0x18   /* Peripheral #6 assigned IVG #x */
+#define P7_IVG(x)              (((x)&0xF)-7) << 0x1C   /* Peripheral #7 assigned IVG #x */
+
+/* SIC_IAR1 Macros */
+#define P8_IVG(x)              (((x)&0xF)-7)           /* Peripheral #8 assigned IVG #x */
+#define P9_IVG(x)              (((x)&0xF)-7) << 0x4    /* Peripheral #9 assigned IVG #x */
+#define P10_IVG(x)             (((x)&0xF)-7) << 0x8    /* Peripheral #10 assigned IVG #x */
+#define P11_IVG(x)             (((x)&0xF)-7) << 0xC    /* Peripheral #11 assigned IVG #x */
+#define P12_IVG(x)             (((x)&0xF)-7) << 0x10   /* Peripheral #12 assigned IVG #x */
+#define P13_IVG(x)             (((x)&0xF)-7) << 0x14   /* Peripheral #13 assigned IVG #x */
+#define P14_IVG(x)             (((x)&0xF)-7) << 0x18   /* Peripheral #14 assigned IVG #x */
+#define P15_IVG(x)             (((x)&0xF)-7) << 0x1C   /* Peripheral #15 assigned IVG #x */
+
+/* SIC_IAR2 Macros */
+#define P16_IVG(x)             (((x)&0xF)-7)           /* Peripheral #16 assigned IVG #x */
+#define P17_IVG(x)             (((x)&0xF)-7) << 0x4    /* Peripheral #17 assigned IVG #x */
+#define P18_IVG(x)             (((x)&0xF)-7) << 0x8    /* Peripheral #18 assigned IVG #x */
+#define P19_IVG(x)             (((x)&0xF)-7) << 0xC    /* Peripheral #19 assigned IVG #x */
+#define P20_IVG(x)             (((x)&0xF)-7) << 0x10   /* Peripheral #20 assigned IVG #x */
+#define P21_IVG(x)             (((x)&0xF)-7) << 0x14   /* Peripheral #21 assigned IVG #x */
+#define P22_IVG(x)             (((x)&0xF)-7) << 0x18   /* Peripheral #22 assigned IVG #x */
+#define P23_IVG(x)             (((x)&0xF)-7) << 0x1C   /* Peripheral #23 assigned IVG #x */
+
+/* SIC_IAR3 Macros */
+#define P24_IVG(x)             (((x)&0xF)-7)           /* Peripheral #24 assigned IVG #x */
+#define P25_IVG(x)             (((x)&0xF)-7) << 0x4    /* Peripheral #25 assigned IVG #x */
+#define P26_IVG(x)             (((x)&0xF)-7) << 0x8    /* Peripheral #26 assigned IVG #x */
+#define P27_IVG(x)             (((x)&0xF)-7) << 0xC    /* Peripheral #27 assigned IVG #x */
+#define P28_IVG(x)             (((x)&0xF)-7) << 0x10   /* Peripheral #28 assigned IVG #x */
+#define P29_IVG(x)             (((x)&0xF)-7) << 0x14   /* Peripheral #29 assigned IVG #x */
+#define P30_IVG(x)             (((x)&0xF)-7) << 0x18   /* Peripheral #30 assigned IVG #x */
+#define P31_IVG(x)             (((x)&0xF)-7) << 0x1C   /* Peripheral #31 assigned IVG #x */
+
+/* SIC_IMASK Masks */
+#define SIC_UNMASK_ALL         0x00000000              /* Unmask all peripheral interrupts */
+#define SIC_MASK_ALL           0xFFFFFFFF              /* Mask all peripheral interrupts */
+#define SIC_MASK(x)            (1 << ((x)&0x1F))       /* Mask Peripheral #x interrupt */
+#define SIC_UNMASK(x)          (0xFFFFFFFF ^ (1 << ((x)&0x1F))) /* Unmask Peripheral #x interrupt */
+
+/* SIC_IWR Masks */
+#define IWR_DISABLE_ALL                0x00000000              /* Wakeup Disable all peripherals */
+#define IWR_ENABLE_ALL         0xFFFFFFFF              /* Wakeup Enable all peripherals */
+#define IWR_ENABLE(x)          (1 << ((x)&0x1F))       /* Wakeup Enable Peripheral #x */
+#define IWR_DISABLE(x)         (0xFFFFFFFF ^ (1 << ((x)&0x1F))) /* Wakeup Disable Peripheral #x */
+
+/* ********* WATCHDOG TIMER MASKS ******************** */
+
+/* Watchdog Timer WDOG_CTL Register Masks */
+
+#define WDEV(x)                        ((x<<1) & 0x0006)       /* event generated on roll over */
+#define WDEV_RESET             0x0000                  /* generate reset event on roll over */
+#define WDEV_NMI               0x0002                  /* generate NMI event on roll over */
+#define WDEV_GPI               0x0004                  /* generate GP IRQ on roll over */
+#define WDEV_NONE              0x0006                  /* no event on roll over */
+#define WDEN                   0x0FF0                  /* enable watchdog */
+#define WDDIS                  0x0AD0                  /* disable watchdog */
+#define WDRO                   0x8000                  /* watchdog rolled over latch */
+
+/* depreciated WDOG_CTL Register Masks for legacy code */
+
+#define ICTL WDEV
+#define ENABLE_RESET WDEV_RESET
+#define WDOG_RESET WDEV_RESET
+#define ENABLE_NMI WDEV_NMI
+#define WDOG_NMI WDEV_NMI
+#define ENABLE_GPI WDEV_GPI
+#define WDOG_GPI WDEV_GPI
+#define DISABLE_EVT WDEV_NONE
+#define WDOG_NONE WDEV_NONE
+
+#define TMR_EN WDEN
+#define TMR_DIS WDDIS
+#define TRO WDRO
+#define ICTL_P0 0x01
+#define ICTL_P1 0x02
+#define TRO_P 0x0F
+
+/*
+ * REAL TIME CLOCK MASKS
+ */
+/* RTC_STAT and RTC_ALARM Masks */
+#define        RTC_SEC                 0x0000003F      /* Real-Time Clock Seconds */
+#define        RTC_MIN                 0x00000FC0      /* Real-Time Clock Minutes */
+#define        RTC_HR                  0x0001F000      /* Real-Time Clock Hours */
+#define        RTC_DAY                 0xFFFE0000      /* Real-Time Clock Days */
+
+/*
+ * RTC_ALARM Macro
+ * z=day       y=hr    x=min   w=sec
+ */
+#define SET_ALARM(z,y,x,w)     ((((z)&0x7FFF)<<0x11)|(((y)&0x1F)<<0xC)|(((x)&0x3F)<<0x6)|((w)&0x3F))
+
+/* RTC_ICTL and RTC_ISTAT Masks */
+#define        STOPWATCH               0x0001  /* Stopwatch Interrupt Enable */
+#define        ALARM                   0x0002  /* Alarm Interrupt Enable */
+#define        SECOND                  0x0004  /* Seconds (1 Hz) Interrupt Enable */
+#define        MINUTE                  0x0008  /* Minutes Interrupt Enable */
+#define        HOUR                    0x0010  /* Hours Interrupt Enable */
+#define        DAY                     0x0020  /* 24 Hours (Days) Interrupt Enable */
+#define        DAY_ALARM               0x0040  /* Day Alarm (Day, Hour, Minute, Second) Interrupt Enable */
+#define        WRITE_PENDING           0x4000  /* Write Pending Status */
+#define        WRITE_COMPLETE          0x8000  /* Write Complete Interrupt Enable */
+
+/* RTC_FAST / RTC_PREN Mask */
+#define PREN                   0x0001  /* Enable Prescaler, RTC Runs @1 Hz */
+
+/*
+ * UART CONTROLLER MASKS
+ */
+/* UARTx_LCR Masks */
+#define WLS(x)                 ((((x)&0x3)-5) & 0x03)  /* Word Length Select */
+#define STB                    0x04    /* Stop Bits */
+#define PEN                    0x08    /* Parity Enable */
+#define EPS                    0x10    /* Even Parity Select */
+#define STP                    0x20    /* Stick Parity */
+#define SB                     0x40    /* Set Break */
+#define DLAB                   0x80    /* Divisor Latch Access */
+
+/* UARTx_MCR Mask */
+#define LOOP                   0x10    /* Loopback Mode Enable */
+
+/* UARTx_LSR Masks */
+#define DR                     0x01    /* Data Ready */
+#define OE                     0x02    /* Overrun Error */
+#define PE                     0x04    /* Parity Error */
+#define FE                     0x08    /* Framing Error */
+#define BI                     0x10    /* Break Interrupt */
+#define THRE                   0x20    /* THR Empty */
+#define TEMT                   0x40    /* TSR and UART_THR Empty */
+
+/* UARTx_IER Masks */
+#define ERBFI                  0x01    /* Enable Receive Buffer Full Interrupt */
+#define ETBEI                  0x02    /* Enable Transmit Buffer Empty Interrupt */
+#define ELSI                   0x04    /* Enable RX Status Interrupt */
+
+/* UARTx_IIR Masks */
+#define NINT                   0x01    /* Pending Interrupt */
+#define STATUS                 0x06    /* Highest Priority Pending Interrupt */
+
+/* UARTx_GCTL Masks */
+#define UCEN                   0x01    /* Enable UARTx Clocks */
+#define IREN                   0x02    /* Enable IrDA Mode */
+#define TPOLC                  0x04    /* IrDA TX Polarity Change */
+#define RPOLC                  0x08    /* IrDA RX Polarity Change */
+#define FPE                    0x10    /* Force Parity Error On Transmit */
+#define FFE                    0x20    /* Force Framing Error On Transmit */
+
+/*
+ * SERIAL PERIPHERAL INTERFACE (SPI) MASKS
+ */
+/* SPI_CTL Masks */
+#define        TIMOD                   0x0003  /* Transfer Initiate Mode */
+#define RDBR_CORE              0x0000  /* RDBR Read Initiates, IRQ When RDBR Full */
+#define        TDBR_CORE               0x0001  /* TDBR Write Initiates, IRQ When TDBR Empty */
+#define RDBR_DMA               0x0002  /* DMA Read, DMA Until FIFO Empty */
+#define TDBR_DMA               0x0003  /* DMA Write, DMA Until FIFO Full */
+#define SZ                     0x0004  /* Send Zero (When TDBR Empty, Send Zero/Last*) */
+#define GM                     0x0008  /* Get More (When RDBR Full, Overwrite/Discard*) */
+#define PSSE                   0x0010  /* Slave-Select Input Enable */
+#define EMISO                  0x0020  /* Enable MISO As Output */
+#define SIZE                   0x0100  /* Size of Words (16/8* Bits) */
+#define LSBF                   0x0200  /* LSB First */
+#define CPHA                   0x0400  /* Clock Phase */
+#define CPOL                   0x0800  /* Clock Polarity */
+#define MSTR                   0x1000  /* Master/Slave* */
+#define WOM                    0x2000  /* Write Open Drain Master */
+#define SPE                    0x4000  /* SPI Enable */
+
+/* SPI_FLG Masks */
+#define FLS1                   0x0002  /* Enables SPI_FLOUT1 as SPI Slave-Select Output */
+#define FLS2                   0x0004  /* Enables SPI_FLOUT2 as SPI Slave-Select Output */
+#define FLS3                   0x0008  /* Enables SPI_FLOUT3 as SPI Slave-Select Output */
+#define FLS4                   0x0010  /* Enables SPI_FLOUT4 as SPI Slave-Select Output */
+#define FLS5                   0x0020  /* Enables SPI_FLOUT5 as SPI Slave-Select Output */
+#define FLS6                   0x0040  /* Enables SPI_FLOUT6 as SPI Slave-Select Output */
+#define FLS7                   0x0080  /* Enables SPI_FLOUT7 as SPI Slave-Select Output */
+#define FLG1                   0xFDFF  /* Activates SPI_FLOUT1 */
+#define FLG2                   0xFBFF  /* Activates SPI_FLOUT2 */
+#define FLG3                   0xF7FF  /* Activates SPI_FLOUT3 */
+#define FLG4                   0xEFFF  /* Activates SPI_FLOUT4 */
+#define FLG5                   0xDFFF  /* Activates SPI_FLOUT5 */
+#define FLG6                   0xBFFF  /* Activates SPI_FLOUT6 */
+#define FLG7                   0x7FFF  /* Activates SPI_FLOUT7 */
+
+/* SPI_STAT Masks */
+#define SPIF                   0x0001  /* SPI Finished (Single-Word Transfer Complete) */
+#define MODF                   0x0002  /* Mode Fault Error (Another Device Tried To Become Master) */
+#define TXE                    0x0004  /* Transmission Error (Data Sent With No New Data In TDBR) */
+#define TXS                    0x0008  /* SPI_TDBR Data Buffer Status (Full/Empty*) */
+#define RBSY                   0x0010  /* Receive Error (Data Received With RDBR Full) */
+#define RXS                    0x0020  /* SPI_RDBR Data Buffer Status (Full/Empty*) */
+#define TXCOL                  0x0040  /* Transmit Collision Error (Corrupt Data May Have Been Sent) */
+
+/*
+ * GENERAL PURPOSE TIMER MASKS
+ */
+/* TIMER_ENABLE Masks */
+#define TIMEN0                 0x0001  /* Enable Timer 0 */
+#define TIMEN1                 0x0002  /* Enable Timer 1 */
+#define TIMEN2                 0x0004  /* Enable Timer 2 */
+#define TIMEN3                 0x0008  /* Enable Timer 3 */
+#define TIMEN4                 0x0010  /* Enable Timer 4 */
+#define TIMEN5                 0x0020  /* Enable Timer 5 */
+#define TIMEN6                 0x0040  /* Enable Timer 6 */
+#define TIMEN7                 0x0080  /* Enable Timer 7 */
+
+/* TIMER_DISABLE Masks */
+#define TIMDIS0                        TIMEN0  /* Disable Timer 0 */
+#define TIMDIS1                        TIMEN1  /* Disable Timer 1 */
+#define TIMDIS2                        TIMEN2  /* Disable Timer 2 */
+#define TIMDIS3                        TIMEN3  /* Disable Timer 3 */
+#define TIMDIS4                        TIMEN4  /* Disable Timer 4 */
+#define TIMDIS5                        TIMEN5  /* Disable Timer 5 */
+#define TIMDIS6                        TIMEN6  /* Disable Timer 6 */
+#define TIMDIS7                        TIMEN7  /* Disable Timer 7 */
+
+/* TIMER_STATUS Masks */
+#define TIMIL0                 0x00000001      /* Timer 0 Interrupt */
+#define TIMIL1                 0x00000002      /* Timer 1 Interrupt */
+#define TIMIL2                 0x00000004      /* Timer 2 Interrupt */
+#define TIMIL3                 0x00000008      /* Timer 3 Interrupt */
+#define TOVF_ERR0              0x00000010      /* Timer 0 Counter Overflow */
+#define TOVF_ERR1              0x00000020      /* Timer 1 Counter Overflow */
+#define TOVF_ERR2              0x00000040      /* Timer 2 Counter Overflow */
+#define TOVF_ERR3              0x00000080      /* Timer 3 Counter Overflow */
+#define TRUN0                  0x00001000      /* Timer 0 Slave Enable Status */
+#define TRUN1                  0x00002000      /* Timer 1 Slave Enable Status */
+#define TRUN2                  0x00004000      /* Timer 2 Slave Enable Status */
+#define TRUN3                  0x00008000      /* Timer 3 Slave Enable Status */
+#define TIMIL4                 0x00010000      /* Timer 4 Interrupt */
+#define TIMIL5                 0x00020000      /* Timer 5 Interrupt */
+#define TIMIL6                 0x00040000      /* Timer 6 Interrupt */
+#define TIMIL7                 0x00080000      /* Timer 7 Interrupt */
+#define TOVF_ERR4              0x00100000      /* Timer 4 Counter Overflow */
+#define TOVF_ERR5              0x00200000      /* Timer 5 Counter Overflow */
+#define TOVF_ERR6              0x00400000      /* Timer 6 Counter Overflow */
+#define TOVF_ERR7              0x00800000      /* Timer 7 Counter Overflow */
+#define TRUN4                  0x10000000      /* Timer 4 Slave Enable Status */
+#define TRUN5                  0x20000000      /* Timer 5 Slave Enable Status */
+#define TRUN6                  0x40000000      /* Timer 6 Slave Enable Status */
+#define TRUN7                  0x80000000      /* Timer 7 Slave Enable Status */
+
+/* Alternate Deprecated Macros Provided For Backwards Code Compatibility */
+#define TOVL_ERR0 TOVF_ERR0
+#define TOVL_ERR1 TOVF_ERR1
+#define TOVL_ERR2 TOVF_ERR2
+#define TOVL_ERR3 TOVF_ERR3
+#define TOVL_ERR4 TOVF_ERR4
+#define TOVL_ERR5 TOVF_ERR5
+#define TOVL_ERR6 TOVF_ERR6
+#define TOVL_ERR7 TOVF_ERR7
+
+/* TIMERx_CONFIG Masks */
+#define PWM_OUT                        0x0001  /* Pulse-Width Modulation Output Mode */
+#define WDTH_CAP               0x0002  /* Width Capture Input Mode */
+#define EXT_CLK                        0x0003  /* External Clock Mode */
+#define PULSE_HI               0x0004  /* Action Pulse (Positive/Negative*) */
+#define PERIOD_CNT             0x0008  /* Period Count */
+#define IRQ_ENA                        0x0010  /* Interrupt Request Enable */
+#define TIN_SEL                        0x0020  /* Timer Input Select */
+#define OUT_DIS                        0x0040  /* Output Pad Disable */
+#define CLK_SEL                        0x0080  /* Timer Clock Select */
+#define TOGGLE_HI              0x0100  /* PWM_OUT PULSE_HI Toggle Mode */
+#define EMU_RUN                        0x0200  /* Emulation Behavior Select */
+#define ERR_TYP                        0xC000  /* Error Type */
+
+/*
+ * GPIO PORTS F, G, H MASKS
+ * General Purpose IO (0xFFC00700 - 0xFFC007FF)  Masks
+ */
+/* Port F Masks */
+#define PF0                    0x0001
+#define PF1                    0x0002
+#define PF2                    0x0004
+#define PF3                    0x0008
+#define PF4                    0x0010
+#define PF5                    0x0020
+#define PF6                    0x0040
+#define PF7                    0x0080
+#define PF8                    0x0100
+#define PF9                    0x0200
+#define PF10                   0x0400
+#define PF11                   0x0800
+#define PF12                   0x1000
+#define PF13                   0x2000
+#define PF14                   0x4000
+#define PF15                   0x8000
+
+/* Port G Masks */
+#define PG0                    0x0001
+#define PG1                    0x0002
+#define PG2                    0x0004
+#define PG3                    0x0008
+#define PG4                    0x0010
+#define PG5                    0x0020
+#define PG6                    0x0040
+#define PG7                    0x0080
+#define PG8                    0x0100
+#define PG9                    0x0200
+#define PG10                   0x0400
+#define PG11                   0x0800
+#define PG12                   0x1000
+#define PG13                   0x2000
+#define PG14                   0x4000
+#define PG15                   0x8000
+
+/* Port H Masks */
+#define PH0                    0x0001
+#define PH1                    0x0002
+#define PH2                    0x0004
+#define PH3                    0x0008
+#define PH4                    0x0010
+#define PH5                    0x0020
+#define PH6                    0x0040
+#define PH7                    0x0080
+#define PH8                    0x0100
+#define PH9                    0x0200
+#define PH10                   0x0400
+#define PH11                   0x0800
+#define PH12                   0x1000
+#define PH13                   0x2000
+#define PH14                   0x4000
+#define PH15                   0x8000
+
+/*
+ * SERIAL PORT MASKS
+ */
+/* SPORTx_TCR1 Masks */
+#define TSPEN                  0x0001  /* Transmit Enable */
+#define ITCLK                  0x0002  /* Internal Transmit Clock Select */
+#define DTYPE_NORM             0x0004  /* Data Format Normal */
+#define DTYPE_ULAW             0x0008  /* Compand Using u-Law */
+#define DTYPE_ALAW             0x000C  /* Compand Using A-Law */
+#define TLSBIT                 0x0010  /* Transmit Bit Order */
+#define ITFS                   0x0200  /* Internal Transmit Frame Sync Select */
+#define TFSR                   0x0400  /* Transmit Frame Sync Required Select */
+#define DITFS                  0x0800  /* Data-Independent Transmit Frame Sync Select */
+#define LTFS                   0x1000  /* Low Transmit Frame Sync Select */
+#define LATFS                  0x2000  /* Late Transmit Frame Sync Select */
+#define TCKFE                  0x4000  /* Clock Falling Edge Select */
+
+/* SPORTx_TCR2 Masks and Macro */
+#define SLEN(x)                        ((x)&0x1F) /* SPORT TX Word Length (2 - 31) */
+#define TXSE                   0x0100  /* TX Secondary Enable */
+#define TSFSE                  0x0200  /* Transmit Stereo Frame Sync Enable */
+#define TRFST                  0x0400  /* Left/Right Order (1 = Right Channel 1st) */
+
+/* SPORTx_RCR1 Masks */
+#define RSPEN                  0x0001  /* Receive Enable */
+#define IRCLK                  0x0002  /* Internal Receive Clock Select */
+#define DTYPE_NORM             0x0004  /* Data Format Normal */
+#define DTYPE_ULAW             0x0008  /* Compand Using u-Law */
+#define DTYPE_ALAW             0x000C  /* Compand Using A-Law */
+#define RLSBIT                 0x0010  /* Receive Bit Order */
+#define IRFS                   0x0200  /* Internal Receive Frame Sync Select */
+#define RFSR                   0x0400  /* Receive Frame Sync Required Select */
+#define LRFS                   0x1000  /* Low Receive Frame Sync Select */
+#define LARFS                  0x2000  /* Late Receive Frame Sync Select */
+#define RCKFE                  0x4000  /* Clock Falling Edge Select */
+
+/* SPORTx_RCR2 Masks */
+#define SLEN(x)                        ((x)&0x1F) /* SPORT RX Word Length (2 - 31) */
+#define RXSE                   0x0100  /* RX Secondary Enable */
+#define RSFSE                  0x0200  /* RX Stereo Frame Sync Enable */
+#define RRFST                  0x0400  /* Right-First Data Order */
+
+/* SPORTx_STAT Masks */
+#define RXNE                   0x0001  /* Receive FIFO Not Empty Status */
+#define RUVF                   0x0002  /* Sticky Receive Underflow Status */
+#define ROVF                   0x0004  /* Sticky Receive Overflow Status */
+#define TXF                    0x0008  /* Transmit FIFO Full Status */
+#define TUVF                   0x0010  /* Sticky Transmit Underflow Status */
+#define TOVF                   0x0020  /* Sticky Transmit Overflow Status */
+#define TXHRE                  0x0040  /* Transmit Hold Register Empty */
+
+/* SPORTx_MCMC1 Macros */
+#define WOFF(x)                        ((x) & 0x3FF)   /* Multichannel Window Offset Field */
+
+/* Only use WSIZE Macro With Logic OR While Setting Lower Order Bits */
+#define WSIZE(x)               (((((x)>>0x3)-1)&0xF) << 0xC)   /* Multichannel Window Size = (x/8)-1 */
+
+/* SPORTx_MCMC2 Masks */
+#define REC_BYPASS             0x0000  /* Bypass Mode (No Clock Recovery) */
+#define REC_2FROM4             0x0002  /* Recover 2 MHz Clock from 4 MHz Clock */
+#define REC_8FROM16            0x0003  /* Recover 8 MHz Clock from 16 MHz Clock */
+#define MCDTXPE                        0x0004  /* Multichannel DMA Transmit Packing */
+#define MCDRXPE                        0x0008  /* Multichannel DMA Receive Packing */
+#define MCMEN                  0x0010  /* Multichannel Frame Mode Enable */
+#define FSDR                   0x0080  /* Multichannel Frame Sync to Data Relationship */
+#define MFD_0                  0x0000  /* Multichannel Frame Delay = 0 */
+#define MFD_1                  0x1000  /* Multichannel Frame Delay = 1 */
+#define MFD_2                  0x2000  /* Multichannel Frame Delay = 2 */
+#define MFD_3                  0x3000  /* Multichannel Frame Delay = 3 */
+#define MFD_4                  0x4000  /* Multichannel Frame Delay = 4 */
+#define MFD_5                  0x5000  /* Multichannel Frame Delay = 5 */
+#define MFD_6                  0x6000  /* Multichannel Frame Delay = 6 */
+#define MFD_7                  0x7000  /* Multichannel Frame Delay = 7 */
+#define MFD_8                  0x8000  /* Multichannel Frame Delay = 8 */
+#define MFD_9                  0x9000  /* Multichannel Frame Delay = 9 */
+#define MFD_10                 0xA000  /* Multichannel Frame Delay = 10 */
+#define MFD_11                 0xB000  /* Multichannel Frame Delay = 11 */
+#define MFD_12                 0xC000  /* Multichannel Frame Delay = 12 */
+#define MFD_13                 0xD000  /* Multichannel Frame Delay = 13 */
+#define MFD_14                 0xE000  /* Multichannel Frame Delay = 14 */
+#define MFD_15                 0xF000  /* Multichannel Frame Delay = 15 */
+
+/*
+ * ASYNCHRONOUS MEMORY CONTROLLER MASKS
+ */
+/* EBIU_AMGCTL Masks */
+#define AMCKEN                 0x0001  /* Enable CLKOUT */
+#define        AMBEN_NONE              0x0000  /* All Banks Disabled */
+#define AMBEN_B0               0x0002  /* Enable Async Memory Bank 0 only */
+#define AMBEN_B0_B1            0x0004  /* Enable Async Memory Banks 0 & 1 only */
+#define AMBEN_B0_B1_B2         0x0006  /* Enable Async Memory Banks 0, 1, and 2 */
+#define AMBEN_ALL              0x0008  /* Enable Async Memory Banks (all) 0, 1, 2, and 3 */
+
+/* EBIU_AMBCTL0 Masks */
+#define B0RDYEN                        0x00000001      /* Bank 0 (B0) RDY Enable */
+#define B0RDYPOL               0x00000002      /* B0 RDY Active High */
+#define B0TT_1                 0x00000004      /* B0 Transition Time (Read to Write) = 1 cycle */
+#define B0TT_2                 0x00000008      /* B0 Transition Time (Read to Write) = 2 cycles */
+#define B0TT_3                 0x0000000C      /* B0 Transition Time (Read to Write) = 3 cycles */
+#define B0TT_4                 0x00000000      /* B0 Transition Time (Read to Write) = 4 cycles */
+#define B0ST_1                 0x00000010      /* B0 Setup Time (AOE to Read/Write) = 1 cycle */
+#define B0ST_2                 0x00000020      /* B0 Setup Time (AOE to Read/Write) = 2 cycles */
+#define B0ST_3                 0x00000030      /* B0 Setup Time (AOE to Read/Write) = 3 cycles */
+#define B0ST_4                 0x00000000      /* B0 Setup Time (AOE to Read/Write) = 4 cycles */
+#define B0HT_1                 0x00000040      /* B0 Hold Time (~Read/Write to ~AOE) = 1 cycle */
+#define B0HT_2                 0x00000080      /* B0 Hold Time (~Read/Write to ~AOE) = 2 cycles */
+#define B0HT_3                 0x000000C0      /* B0 Hold Time (~Read/Write to ~AOE) = 3 cycles */
+#define B0HT_0                 0x00000000      /* B0 Hold Time (~Read/Write to ~AOE) = 0 cycles */
+#define B0RAT_1                        0x00000100      /* B0 Read Access Time = 1 cycle */
+#define B0RAT_2                        0x00000200      /* B0 Read Access Time = 2 cycles */
+#define B0RAT_3                        0x00000300      /* B0 Read Access Time = 3 cycles */
+#define B0RAT_4                        0x00000400      /* B0 Read Access Time = 4 cycles */
+#define B0RAT_5                        0x00000500      /* B0 Read Access Time = 5 cycles */
+#define B0RAT_6                        0x00000600      /* B0 Read Access Time = 6 cycles */
+#define B0RAT_7                        0x00000700      /* B0 Read Access Time = 7 cycles */
+#define B0RAT_8                        0x00000800      /* B0 Read Access Time = 8 cycles */
+#define B0RAT_9                        0x00000900      /* B0 Read Access Time = 9 cycles */
+#define B0RAT_10               0x00000A00      /* B0 Read Access Time = 10 cycles */
+#define B0RAT_11               0x00000B00      /* B0 Read Access Time = 11 cycles */
+#define B0RAT_12               0x00000C00      /* B0 Read Access Time = 12 cycles */
+#define B0RAT_13               0x00000D00      /* B0 Read Access Time = 13 cycles */
+#define B0RAT_14               0x00000E00      /* B0 Read Access Time = 14 cycles */
+#define B0RAT_15               0x00000F00      /* B0 Read Access Time = 15 cycles */
+#define B0WAT_1                        0x00001000      /* B0 Write Access Time = 1 cycle */
+#define B0WAT_2                        0x00002000      /* B0 Write Access Time = 2 cycles */
+#define B0WAT_3                        0x00003000      /* B0 Write Access Time = 3 cycles */
+#define B0WAT_4                        0x00004000      /* B0 Write Access Time = 4 cycles */
+#define B0WAT_5                        0x00005000      /* B0 Write Access Time = 5 cycles */
+#define B0WAT_6                        0x00006000      /* B0 Write Access Time = 6 cycles */
+#define B0WAT_7                        0x00007000      /* B0 Write Access Time = 7 cycles */
+#define B0WAT_8                        0x00008000      /* B0 Write Access Time = 8 cycles */
+#define B0WAT_9                        0x00009000      /* B0 Write Access Time = 9 cycles */
+#define B0WAT_10               0x0000A000      /* B0 Write Access Time = 10 cycles */
+#define B0WAT_11               0x0000B000      /* B0 Write Access Time = 11 cycles */
+#define B0WAT_12               0x0000C000      /* B0 Write Access Time = 12 cycles */
+#define B0WAT_13               0x0000D000      /* B0 Write Access Time = 13 cycles */
+#define B0WAT_14               0x0000E000      /* B0 Write Access Time = 14 cycles */
+#define B0WAT_15               0x0000F000      /* B0 Write Access Time = 15 cycles */
+
+#define B1RDYEN                        0x00010000      /* Bank 1 (B1) RDY Enable */
+#define B1RDYPOL               0x00020000      /* B1 RDY Active High */
+#define B1TT_1                 0x00040000      /* B1 Transition Time (Read to Write) = 1 cycle */
+#define B1TT_2                 0x00080000      /* B1 Transition Time (Read to Write) = 2 cycles */
+#define B1TT_3                 0x000C0000      /* B1 Transition Time (Read to Write) = 3 cycles */
+#define B1TT_4                 0x00000000      /* B1 Transition Time (Read to Write) = 4 cycles */
+#define B1ST_1                 0x00100000      /* B1 Setup Time (AOE to Read/Write) = 1 cycle */
+#define B1ST_2                 0x00200000      /* B1 Setup Time (AOE to Read/Write) = 2 cycles */
+#define B1ST_3                 0x00300000      /* B1 Setup Time (AOE to Read/Write) = 3 cycles */
+#define B1ST_4                 0x00000000      /* B1 Setup Time (AOE to Read/Write) = 4 cycles */
+#define B1HT_1                 0x00400000      /* B1 Hold Time (~Read/Write to ~AOE) = 1 cycle */
+#define B1HT_2                 0x00800000      /* B1 Hold Time (~Read/Write to ~AOE) = 2 cycles */
+#define B1HT_3                 0x00C00000      /* B1 Hold Time (~Read/Write to ~AOE) = 3 cycles */
+#define B1HT_0                 0x00000000      /* B1 Hold Time (~Read/Write to ~AOE) = 0 cycles */
+#define B1RAT_1                        0x01000000      /* B1 Read Access Time = 1 cycle */
+#define B1RAT_2                        0x02000000      /* B1 Read Access Time = 2 cycles */
+#define B1RAT_3                        0x03000000      /* B1 Read Access Time = 3 cycles */
+#define B1RAT_4                        0x04000000      /* B1 Read Access Time = 4 cycles */
+#define B1RAT_5                        0x05000000      /* B1 Read Access Time = 5 cycles */
+#define B1RAT_6                        0x06000000      /* B1 Read Access Time = 6 cycles */
+#define B1RAT_7                        0x07000000      /* B1 Read Access Time = 7 cycles */
+#define B1RAT_8                        0x08000000      /* B1 Read Access Time = 8 cycles */
+#define B1RAT_9                        0x09000000      /* B1 Read Access Time = 9 cycles */
+#define B1RAT_10               0x0A000000      /* B1 Read Access Time = 10 cycles */
+#define B1RAT_11               0x0B000000      /* B1 Read Access Time = 11 cycles */
+#define B1RAT_12               0x0C000000      /* B1 Read Access Time = 12 cycles */
+#define B1RAT_13               0x0D000000      /* B1 Read Access Time = 13 cycles */
+#define B1RAT_14               0x0E000000      /* B1 Read Access Time = 14 cycles */
+#define B1RAT_15               0x0F000000      /* B1 Read Access Time = 15 cycles */
+#define B1WAT_1                        0x10000000      /* B1 Write Access Time = 1 cycle */
+#define B1WAT_2                        0x20000000      /* B1 Write Access Time = 2 cycles */
+#define B1WAT_3                        0x30000000      /* B1 Write Access Time = 3 cycles */
+#define B1WAT_4                        0x40000000      /* B1 Write Access Time = 4 cycles */
+#define B1WAT_5                        0x50000000      /* B1 Write Access Time = 5 cycles */
+#define B1WAT_6                        0x60000000      /* B1 Write Access Time = 6 cycles */
+#define B1WAT_7                        0x70000000      /* B1 Write Access Time = 7 cycles */
+#define B1WAT_8                        0x80000000      /* B1 Write Access Time = 8 cycles */
+#define B1WAT_9                        0x90000000      /* B1 Write Access Time = 9 cycles */
+#define B1WAT_10               0xA0000000      /* B1 Write Access Time = 10 cycles */
+#define B1WAT_11               0xB0000000      /* B1 Write Access Time = 11 cycles */
+#define B1WAT_12               0xC0000000      /* B1 Write Access Time = 12 cycles */
+#define B1WAT_13               0xD0000000      /* B1 Write Access Time = 13 cycles */
+#define B1WAT_14               0xE0000000      /* B1 Write Access Time = 14 cycles */
+#define B1WAT_15               0xF0000000      /* B1 Write Access Time = 15 cycles */
+
+/* EBIU_AMBCTL1 Masks */
+#define B2RDYEN                        0x00000001      /* Bank 2 (B2) RDY Enable */
+#define B2RDYPOL               0x00000002      /* B2 RDY Active High */
+#define B2TT_1                 0x00000004      /* B2 Transition Time (Read to Write) = 1 cycle */
+#define B2TT_2                 0x00000008      /* B2 Transition Time (Read to Write) = 2 cycles */
+#define B2TT_3                 0x0000000C      /* B2 Transition Time (Read to Write) = 3 cycles */
+#define B2TT_4                 0x00000000      /* B2 Transition Time (Read to Write) = 4 cycles */
+#define B2ST_1                 0x00000010      /* B2 Setup Time (AOE to Read/Write) = 1 cycle */
+#define B2ST_2                 0x00000020      /* B2 Setup Time (AOE to Read/Write) = 2 cycles */
+#define B2ST_3                 0x00000030      /* B2 Setup Time (AOE to Read/Write) = 3 cycles */
+#define B2ST_4                 0x00000000      /* B2 Setup Time (AOE to Read/Write) = 4 cycles */
+#define B2HT_1                 0x00000040      /* B2 Hold Time (~Read/Write to ~AOE) = 1 cycle */
+#define B2HT_2                 0x00000080      /* B2 Hold Time (~Read/Write to ~AOE) = 2 cycles */
+#define B2HT_3                 0x000000C0      /* B2 Hold Time (~Read/Write to ~AOE) = 3 cycles */
+#define B2HT_0                 0x00000000      /* B2 Hold Time (~Read/Write to ~AOE) = 0 cycles */
+#define B2RAT_1                        0x00000100      /* B2 Read Access Time = 1 cycle */
+#define B2RAT_2                        0x00000200      /* B2 Read Access Time = 2 cycles */
+#define B2RAT_3                        0x00000300      /* B2 Read Access Time = 3 cycles */
+#define B2RAT_4                        0x00000400      /* B2 Read Access Time = 4 cycles */
+#define B2RAT_5                        0x00000500      /* B2 Read Access Time = 5 cycles */
+#define B2RAT_6                        0x00000600      /* B2 Read Access Time = 6 cycles */
+#define B2RAT_7                        0x00000700      /* B2 Read Access Time = 7 cycles */
+#define B2RAT_8                        0x00000800      /* B2 Read Access Time = 8 cycles */
+#define B2RAT_9                        0x00000900      /* B2 Read Access Time = 9 cycles */
+#define B2RAT_10               0x00000A00      /* B2 Read Access Time = 10 cycles */
+#define B2RAT_11               0x00000B00      /* B2 Read Access Time = 11 cycles */
+#define B2RAT_12               0x00000C00      /* B2 Read Access Time = 12 cycles */
+#define B2RAT_13               0x00000D00      /* B2 Read Access Time = 13 cycles */
+#define B2RAT_14               0x00000E00      /* B2 Read Access Time = 14 cycles */
+#define B2RAT_15               0x00000F00      /* B2 Read Access Time = 15 cycles */
+#define B2WAT_1                        0x00001000      /* B2 Write Access Time = 1 cycle */
+#define B2WAT_2                        0x00002000      /* B2 Write Access Time = 2 cycles */
+#define B2WAT_3                        0x00003000      /* B2 Write Access Time = 3 cycles */
+#define B2WAT_4                        0x00004000      /* B2 Write Access Time = 4 cycles */
+#define B2WAT_5                        0x00005000      /* B2 Write Access Time = 5 cycles */
+#define B2WAT_6                        0x00006000      /* B2 Write Access Time = 6 cycles */
+#define B2WAT_7                        0x00007000      /* B2 Write Access Time = 7 cycles */
+#define B2WAT_8                        0x00008000      /* B2 Write Access Time = 8 cycles */
+#define B2WAT_9                        0x00009000      /* B2 Write Access Time = 9 cycles */
+#define B2WAT_10               0x0000A000      /* B2 Write Access Time = 10 cycles */
+#define B2WAT_11               0x0000B000      /* B2 Write Access Time = 11 cycles */
+#define B2WAT_12               0x0000C000      /* B2 Write Access Time = 12 cycles */
+#define B2WAT_13               0x0000D000      /* B2 Write Access Time = 13 cycles */
+#define B2WAT_14               0x0000E000      /* B2 Write Access Time = 14 cycles */
+#define B2WAT_15               0x0000F000      /* B2 Write Access Time = 15 cycles */
+
+#define B3RDYEN                        0x00010000      /* Bank 3 (B3) RDY Enable */
+#define B3RDYPOL               0x00020000      /* B3 RDY Active High */
+#define B3TT_1                 0x00040000      /* B3 Transition Time (Read to Write) = 1 cycle */
+#define B3TT_2                 0x00080000      /* B3 Transition Time (Read to Write) = 2 cycles */
+#define B3TT_3                 0x000C0000      /* B3 Transition Time (Read to Write) = 3 cycles */
+#define B3TT_4                 0x00000000      /* B3 Transition Time (Read to Write) = 4 cycles */
+#define B3ST_1                 0x00100000      /* B3 Setup Time (AOE to Read/Write) = 1 cycle */
+#define B3ST_2                 0x00200000      /* B3 Setup Time (AOE to Read/Write) = 2 cycles */
+#define B3ST_3                 0x00300000      /* B3 Setup Time (AOE to Read/Write) = 3 cycles */
+#define B3ST_4                 0x00000000      /* B3 Setup Time (AOE to Read/Write) = 4 cycles */
+#define B3HT_1                 0x00400000      /* B3 Hold Time (~Read/Write to ~AOE) = 1 cycle */
+#define B3HT_2                 0x00800000      /* B3 Hold Time (~Read/Write to ~AOE) = 2 cycles */
+#define B3HT_3                 0x00C00000      /* B3 Hold Time (~Read/Write to ~AOE) = 3 cycles */
+#define B3HT_0                 0x00000000      /* B3 Hold Time (~Read/Write to ~AOE) = 0 cycles */
+#define B3RAT_1                        0x01000000      /* B3 Read Access Time = 1 cycle */
+#define B3RAT_2                        0x02000000      /* B3 Read Access Time = 2 cycles */
+#define B3RAT_3                        0x03000000      /* B3 Read Access Time = 3 cycles */
+#define B3RAT_4                        0x04000000      /* B3 Read Access Time = 4 cycles */
+#define B3RAT_5                        0x05000000      /* B3 Read Access Time = 5 cycles */
+#define B3RAT_6                        0x06000000      /* B3 Read Access Time = 6 cycles */
+#define B3RAT_7                        0x07000000      /* B3 Read Access Time = 7 cycles */
+#define B3RAT_8                        0x08000000      /* B3 Read Access Time = 8 cycles */
+#define B3RAT_9                        0x09000000      /* B3 Read Access Time = 9 cycles */
+#define B3RAT_10               0x0A000000      /* B3 Read Access Time = 10 cycles */
+#define B3RAT_11               0x0B000000      /* B3 Read Access Time = 11 cycles */
+#define B3RAT_12               0x0C000000      /* B3 Read Access Time = 12 cycles */
+#define B3RAT_13               0x0D000000      /* B3 Read Access Time = 13 cycles */
+#define B3RAT_14               0x0E000000      /* B3 Read Access Time = 14 cycles */
+#define B3RAT_15               0x0F000000      /* B3 Read Access Time = 15 cycles */
+#define B3WAT_1                        0x10000000      /* B3 Write Access Time = 1 cycle */
+#define B3WAT_2                        0x20000000      /* B3 Write Access Time = 2 cycles */
+#define B3WAT_3                        0x30000000      /* B3 Write Access Time = 3 cycles */
+#define B3WAT_4                        0x40000000      /* B3 Write Access Time = 4 cycles */
+#define B3WAT_5                        0x50000000      /* B3 Write Access Time = 5 cycles */
+#define B3WAT_6                        0x60000000      /* B3 Write Access Time = 6 cycles */
+#define B3WAT_7                        0x70000000      /* B3 Write Access Time = 7 cycles */
+#define B3WAT_8                        0x80000000      /* B3 Write Access Time = 8 cycles */
+#define B3WAT_9                        0x90000000      /* B3 Write Access Time = 9 cycles */
+#define B3WAT_10               0xA0000000      /* B3 Write Access Time = 10 cycles */
+#define B3WAT_11               0xB0000000      /* B3 Write Access Time = 11 cycles */
+#define B3WAT_12               0xC0000000      /* B3 Write Access Time = 12 cycles */
+#define B3WAT_13               0xD0000000      /* B3 Write Access Time = 13 cycles */
+#define B3WAT_14               0xE0000000      /* B3 Write Access Time = 14 cycles */
+#define B3WAT_15               0xF0000000      /* B3 Write Access Time = 15 cycles */
+
+/*
+ * SDRAM CONTROLLER MASKS
+ */
+/* EBIU_SDGCTL Masks */
+#define SCTLE                  0x00000001      /* Enable SDRAM Signals */
+#define CL_2                   0x00000008      /* SDRAM CAS Latency = 2 cycles */
+#define CL_3                   0x0000000C      /* SDRAM CAS Latency = 3 cycles */
+#define PASR_ALL               0x00000000      /* All 4 SDRAM Banks Refreshed In Self-Refresh */
+#define PASR_B0_B1             0x00000010      /* SDRAM Banks 0 and 1 Are Refreshed In Self-Refresh */
+#define PASR_B0                        0x00000020      /* Only SDRAM Bank 0 Is Refreshed In Self-Refresh */
+#define TRAS_1                 0x00000040      /* SDRAM tRAS = 1 cycle */
+#define TRAS_2                 0x00000080      /* SDRAM tRAS = 2 cycles */
+#define TRAS_3                 0x000000C0      /* SDRAM tRAS = 3 cycles */
+#define TRAS_4                 0x00000100      /* SDRAM tRAS = 4 cycles */
+#define TRAS_5                 0x00000140      /* SDRAM tRAS = 5 cycles */
+#define TRAS_6                 0x00000180      /* SDRAM tRAS = 6 cycles */
+#define TRAS_7                 0x000001C0      /* SDRAM tRAS = 7 cycles */
+#define TRAS_8                 0x00000200      /* SDRAM tRAS = 8 cycles */
+#define TRAS_9                 0x00000240      /* SDRAM tRAS = 9 cycles */
+#define TRAS_10                        0x00000280      /* SDRAM tRAS = 10 cycles */
+#define TRAS_11                        0x000002C0      /* SDRAM tRAS = 11 cycles */
+#define TRAS_12                        0x00000300      /* SDRAM tRAS = 12 cycles */
+#define TRAS_13                        0x00000340      /* SDRAM tRAS = 13 cycles */
+#define TRAS_14                        0x00000380      /* SDRAM tRAS = 14 cycles */
+#define TRAS_15                        0x000003C0      /* SDRAM tRAS = 15 cycles */
+#define TRP_1                  0x00000800      /* SDRAM tRP = 1 cycle */
+#define TRP_2                  0x00001000      /* SDRAM tRP = 2 cycles */
+#define TRP_3                  0x00001800      /* SDRAM tRP = 3 cycles */
+#define TRP_4                  0x00002000      /* SDRAM tRP = 4 cycles */
+#define TRP_5                  0x00002800      /* SDRAM tRP = 5 cycles */
+#define TRP_6                  0x00003000      /* SDRAM tRP = 6 cycles */
+#define TRP_7                  0x00003800      /* SDRAM tRP = 7 cycles */
+#define TRCD_1                 0x00008000      /* SDRAM tRCD = 1 cycle */
+#define TRCD_2                 0x00010000      /* SDRAM tRCD = 2 cycles */
+#define TRCD_3                 0x00018000      /* SDRAM tRCD = 3 cycles */
+#define TRCD_4                 0x00020000      /* SDRAM tRCD = 4 cycles */
+#define TRCD_5                 0x00028000      /* SDRAM tRCD = 5 cycles */
+#define TRCD_6                 0x00030000      /* SDRAM tRCD = 6 cycles */
+#define TRCD_7                 0x00038000      /* SDRAM tRCD = 7 cycles */
+#define TWR_1                  0x00080000      /* SDRAM tWR = 1 cycle */
+#define TWR_2                  0x00100000      /* SDRAM tWR = 2 cycles */
+#define TWR_3                  0x00180000      /* SDRAM tWR = 3 cycles */
+#define PUPSD                  0x00200000      /* Power-Up Start Delay (15 SCLK Cycles Delay) */
+#define PSM                    0x00400000      /* Power-Up Sequence (Mode Register Before/After* Refresh) */
+#define PSS                    0x00800000      /* Enable Power-Up Sequence on Next SDRAM Access */
+#define SRFS                   0x01000000      /* Enable SDRAM Self-Refresh Mode */
+#define EBUFE                  0x02000000      /* Enable External Buffering Timing */
+#define FBBRW                  0x04000000      /* Enable Fast Back-To-Back Read To Write */
+#define EMREN                  0x10000000      /* Extended Mode Register Enable */
+#define TCSR                   0x20000000      /* Temp-Compensated Self-Refresh Value (85/45* Deg C) */
+#define CDDBG                  0x40000000      /* Tristate SDRAM Controls During Bus Grant */
+
+/* EBIU_SDBCTL Masks */
+#define EBE                    0x0001  /* Enable SDRAM External Bank */
+#define EBSZ_16                        0x0000  /* SDRAM External Bank Size = 16MB */
+#define EBSZ_32                        0x0002  /* SDRAM External Bank Size = 32MB */
+#define EBSZ_64                        0x0004  /* SDRAM External Bank Size = 64MB */
+#define EBSZ_128               0x0006  /* SDRAM External Bank Size = 128MB */
+#define EBCAW_8                        0x0000  /* SDRAM External Bank Column Address Width = 8 Bits */
+#define EBCAW_9                        0x0010  /* SDRAM External Bank Column Address Width = 9 Bits */
+#define EBCAW_10               0x0020  /* SDRAM External Bank Column Address Width = 10 Bits */
+#define EBCAW_11               0x0030  /* SDRAM External Bank Column Address Width = 11 Bits */
+
+/* EBIU_SDSTAT Masks */
+#define SDCI                   0x0001  /* SDRAM Controller Idle */
+#define SDSRA                  0x0002  /* SDRAM Self-Refresh Active */
+#define SDPUA                  0x0004  /* SDRAM Power-Up Active */
+#define SDRS                   0x0008  /* SDRAM Will Power-Up On Next Access */
+#define SDEASE                 0x0010  /* SDRAM EAB Sticky Error Status */
+#define BGSTAT                 0x0020  /* Bus Grant Status */
+
+/*
+ * DMA CONTROLLER MASKS
+ */
+/* DMAx_CONFIG, MDMA_yy_CONFIG Masks */
+#define DMAEN                  0x0001  /* DMA Channel Enable */
+#define WNR                    0x0002  /* Channel Direction (W/R*) */
+#define WDSIZE_8               0x0000  /* Transfer Word Size = 8 */
+#define WDSIZE_16              0x0004  /* Transfer Word Size = 16 */
+#define WDSIZE_32              0x0008  /* Transfer Word Size = 32 */
+#define DMA2D                  0x0010  /* DMA Mode (2D/1D*) */
+#define RESTART                        0x0020  /* DMA Buffer Clear */
+#define DI_SEL                 0x0040  /* Data Interrupt Timing Select */
+#define DI_EN                  0x0080  /* Data Interrupt Enable */
+#define NDSIZE_0               0x0000  /* Next Descriptor Size = 0 (Stop/Autobuffer) */
+#define NDSIZE_1               0x0100  /* Next Descriptor Size = 1 */
+#define NDSIZE_2               0x0200  /* Next Descriptor Size = 2 */
+#define NDSIZE_3               0x0300  /* Next Descriptor Size = 3 */
+#define NDSIZE_4               0x0400  /* Next Descriptor Size = 4 */
+#define NDSIZE_5               0x0500  /* Next Descriptor Size = 5 */
+#define NDSIZE_6               0x0600  /* Next Descriptor Size = 6 */
+#define NDSIZE_7               0x0700  /* Next Descriptor Size = 7 */
+#define NDSIZE_8               0x0800  /* Next Descriptor Size = 8 */
+#define NDSIZE_9               0x0900  /* Next Descriptor Size = 9 */
+#define FLOW_STOP              0x0000  /* Stop Mode */
+#define FLOW_AUTO              0x1000  /* Autobuffer Mode */
+#define FLOW_ARRAY             0x4000  /* Descriptor Array Mode */
+#define FLOW_SMALL             0x6000  /* Small Model Descriptor List Mode */
+#define FLOW_LARGE             0x7000  /* Large Model Descriptor List Mode */
+
+/* DMAx_PERIPHERAL_MAP, MDMA_yy_PERIPHERAL_MAP Masks */
+#define CTYPE                  0x0040  /* DMA Channel Type Indicator (Memory/Peripheral*) */
+#define PMAP                   0xF000  /* Peripheral Mapped To This Channel */
+#define PMAP_PPI               0x0000  /* PPI Port DMA */
+#define        PMAP_EMACRX             0x1000  /* Ethernet Receive DMA */
+#define PMAP_EMACTX            0x2000  /* Ethernet Transmit DMA */
+#define PMAP_SPORT0RX          0x3000  /* SPORT0 Receive DMA */
+#define PMAP_SPORT0TX          0x4000  /* SPORT0 Transmit DMA */
+#define PMAP_SPORT1RX          0x5000  /* SPORT1 Receive DMA */
+#define PMAP_SPORT1TX          0x6000  /* SPORT1 Transmit DMA */
+#define PMAP_SPI               0x7000  /* SPI Port DMA */
+#define PMAP_UART0RX           0x8000  /* UART0 Port Receive DMA */
+#define PMAP_UART0TX           0x9000  /* UART0 Port Transmit DMA */
+#define        PMAP_UART1RX            0xA000  /* UART1 Port Receive DMA */
+#define        PMAP_UART1TX            0xB000  /* UART1 Port Transmit DMA */
+
+/* DMAx_IRQ_STATUS, MDMA_yy_IRQ_STATUS Masks */
+#define DMA_DONE               0x0001  /* DMA Completion Interrupt Status */
+#define DMA_ERR                        0x0002  /* DMA Error Interrupt Status */
+#define DFETCH                 0x0004  /* DMA Descriptor Fetch Indicator */
+#define DMA_RUN                        0x0008  /* DMA Channel Running Indicator */
+
+/*
+ * PARALLEL PERIPHERAL INTERFACE (PPI) MASKS
+ */
+/* PPI_CONTROL Masks */
+#define PORT_EN                        0x0001  /* PPI Port Enable */
+#define PORT_DIR               0x0002  /* PPI Port Direction */
+#define XFR_TYPE               0x000C  /* PPI Transfer Type */
+#define PORT_CFG               0x0030  /* PPI Port Configuration */
+#define FLD_SEL                        0x0040  /* PPI Active Field Select */
+#define PACK_EN                        0x0080  /* PPI Packing Mode */
+#define DMA32                  0x0100  /* PPI 32-bit DMA Enable */
+#define SKIP_EN                        0x0200  /* PPI Skip Element Enable */
+#define SKIP_EO                        0x0400  /* PPI Skip Even/Odd Elements */
+#define DLEN_8                 0x0000  /* Data Length = 8 Bits */
+#define DLEN_10                        0x0800  /* Data Length = 10 Bits */
+#define DLEN_11                        0x1000  /* Data Length = 11 Bits */
+#define DLEN_12                        0x1800  /* Data Length = 12 Bits */
+#define DLEN_13                        0x2000  /* Data Length = 13 Bits */
+#define DLEN_14                        0x2800  /* Data Length = 14 Bits */
+#define DLEN_15                        0x3000  /* Data Length = 15 Bits */
+#define DLEN_16                        0x3800  /* Data Length = 16 Bits */
+#define POLC                   0x4000  /* PPI Clock Polarity */
+#define POLS                   0x8000  /* PPI Frame Sync Polarity */
+
+/* PPI_STATUS Masks */
+#define FLD                    0x0400  /* Field Indicator */
+#define FT_ERR                 0x0800  /* Frame Track Error */
+#define OVR                    0x1000  /* FIFO Overflow Error */
+#define UNDR                   0x2000  /* FIFO Underrun Error */
+#define ERR_DET                        0x4000  /* Error Detected Indicator */
+#define ERR_NCOR               0x8000  /* Error Not Corrected Indicator */
+
+/*
+ * TWO-WIRE INTERFACE (TWI) MASKS
+ */
+/* TWI_CLKDIV Macros (Use: *pTWI_CLKDIV = CLKLOW(x)|CLKHI(y); ) */
+#define        CLKLOW(x)               ((x) & 0xFF)            /* Periods Clock Is Held Low */
+#define CLKHI(y)               (((y)&0xFF)<<0x8)       /* Periods Before New Clock Low */
+
+/* TWI_PRESCALE Masks */
+#define        PRESCALE                0x007F  /* SCLKs Per Internal Time Reference (10MHz) */
+#define        TWI_ENA                 0x0080  /* TWI Enable */
+#define        SCCB                    0x0200  /* SCCB Compatibility Enable */
+
+/* TWI_SLAVE_CTRL Masks */
+#define        SEN                     0x0001  /* Slave Enable */
+#define        SADD_LEN                0x0002  /* Slave Address Length */
+#define        STDVAL                  0x0004  /* Slave Transmit Data Valid */
+#define        TSC_NAK                 0x0008  /* NAK/ACK* Generated At Conclusion Of Transfer */
+#define        GEN                     0x0010  /* General Call Adrress Matching Enabled */
+
+/* TWI_SLAVE_STAT Masks */
+#define        SDIR                    0x0001  /* Slave Transfer Direction (Transmit/Receive*) */
+#define GCALL                  0x0002  /* General Call Indicator */
+
+/* TWI_MASTER_CTRL Masks */
+#define        MEN                     0x0001  /* Master Mode Enable */
+#define        MADD_LEN                0x0002  /* Master Address Length */
+#define        MDIR                    0x0004  /* Master Transmit Direction (RX/TX*) */
+#define        FAST                    0x0008  /* Use Fast Mode Timing Specs */
+#define        STOP                    0x0010  /* Issue Stop Condition */
+#define        RSTART                  0x0020  /* Repeat Start or Stop* At End Of Transfer */
+#define        DCNT                    0x3FC0  /* Data Bytes To Transfer */
+#define        SDAOVR                  0x4000  /* Serial Data Override */
+#define        SCLOVR                  0x8000  /* Serial Clock Override */
+
+/* TWI_MASTER_STAT Masks */
+#define        MPROG                   0x0001  /* Master Transfer In Progress */
+#define        LOSTARB                 0x0002  /* Lost Arbitration Indicator (Xfer Aborted) */
+#define        ANAK                    0x0004  /* Address Not Acknowledged */
+#define        DNAK                    0x0008  /* Data Not Acknowledged */
+#define        BUFRDERR                0x0010  /* Buffer Read Error */
+#define        BUFWRERR                0x0020  /* Buffer Write Error */
+#define        SDASEN                  0x0040  /* Serial Data Sense */
+#define        SCLSEN                  0x0080  /* Serial Clock Sense */
+#define        BUSBUSY                 0x0100  /* Bus Busy Indicator */
+
+/* TWI_INT_SRC and TWI_INT_ENABLE Masks */
+#define        SINIT                   0x0001  /* Slave Transfer Initiated */
+#define        SCOMP                   0x0002  /* Slave Transfer Complete */
+#define        SERR                    0x0004  /* Slave Transfer Error */
+#define        SOVF                    0x0008  /* Slave Overflow */
+#define        MCOMP                   0x0010  /* Master Transfer Complete */
+#define        MERR                    0x0020  /* Master Transfer Error */
+#define        XMTSERV                 0x0040  /* Transmit FIFO Service */
+#define        RCVSERV                 0x0080  /* Receive FIFO Service */
+
+/* TWI_FIFO_CTRL Masks */
+#define        XMTFLUSH                0x0001  /* Transmit Buffer Flush */
+#define        RCVFLUSH                0x0002  /* Receive Buffer Flush */
+#define        XMTINTLEN               0x0004  /* Transmit Buffer Interrupt Length */
+#define        RCVINTLEN               0x0008  /* Receive Buffer Interrupt Length */
+
+/* TWI_FIFO_STAT Masks */
+#define        XMTSTAT                 0x0003  /* Transmit FIFO Status */
+#define        XMT_EMPTY               0x0000  /* Transmit FIFO Empty */
+#define        XMT_HALF                0x0001  /* Transmit FIFO Has 1 Byte To Write */
+#define        XMT_FULL                0x0003  /* Transmit FIFO Full (2 Bytes To Write) */
+
+#define        RCVSTAT                 0x000C  /* Receive FIFO Status */
+#define        RCV_EMPTY               0x0000  /* Receive FIFO Empty */
+#define        RCV_HALF                0x0004  /* Receive FIFO Has 1 Byte To Read */
+#define        RCV_FULL                0x000C  /* Receive FIFO Full (2 Bytes To Read) */
+
+/*
+ * CONTROLLER AREA NETWORK (CAN) MASKS
+ */
+/* CAN_CONTROL Masks */
+#define        SRS                     0x0001  /* Software Reset */
+#define        DNM                     0x0002  /* Device Net Mode */
+#define        ABO                     0x0004  /* Auto-Bus On Enable */
+#define        TXPRIO                  0x0008  /* TX Priority (Priority/Mailbox*) */
+#define        WBA                     0x0010  /* Wake-Up On CAN Bus Activity Enable */
+#define        SMR                     0x0020  /* Sleep Mode Request */
+#define        CSR                     0x0040  /* CAN Suspend Mode Request */
+#define        CCR                     0x0080  /* CAN Configuration Mode Request */
+
+/* CAN_STATUS Masks */
+#define        WT                      0x0001  /* TX Warning Flag */
+#define        WR                      0x0002  /* RX Warning Flag */
+#define        EP                      0x0004  /* Error Passive Mode */
+#define        EBO                     0x0008  /* Error Bus Off Mode */
+#define        SMA                     0x0020  /* Sleep Mode Acknowledge */
+#define        CSA                     0x0040  /* Suspend Mode Acknowledge */
+#define        CCA                     0x0080  /* Configuration Mode Acknowledge */
+#define        MBPTR                   0x1F00  /* Mailbox Pointer */
+#define        TRM                     0x4000  /* Transmit Mode */
+#define        REC                     0x8000  /* Receive Mode */
+
+/* CAN_CLOCK Masks */
+#define        BRP                     0x03FF  /* Bit-Rate Pre-Scaler */
+
+/* CAN_TIMING Masks */
+#define        TSEG1                   0x000F  /* Time Segment 1 */
+#define        TSEG2                   0x0070  /* Time Segment 2 */
+#define        SAM                     0x0080  /* Sampling */
+#define        SJW                     0x0300  /* Synchronization Jump Width */
+
+/* CAN_DEBUG Masks */
+#define        DEC                     0x0001  /* Disable CAN Error Counters */
+#define        DRI                     0x0002  /* Disable CAN RX Input */
+#define        DTO                     0x0004  /* Disable CAN TX Output */
+#define        DIL                     0x0008  /* Disable CAN Internal Loop */
+#define        MAA                     0x0010  /* Mode Auto-Acknowledge Enable */
+#define        MRB                     0x0020  /* Mode Read Back Enable */
+#define        CDE                     0x8000  /* CAN Debug Enable */
+
+/* CAN_CEC Masks */
+#define        RXECNT                  0x00FF  /* Receive Error Counter */
+#define        TXECNT                  0xFF00  /* Transmit Error Counter */
+
+/* CAN_INTR Masks */
+#define        MBRIF                   0x0001  /* Mailbox Receive Interrupt */
+#define        MBTIF                   0x0002  /* Mailbox Transmit Interrupt */
+#define        GIRQ                    0x0004  /* Global Interrupt */
+#define        SMACK                   0x0008  /* Sleep Mode Acknowledge */
+#define        CANTX                   0x0040  /* CAN TX Bus Value */
+#define        CANRX                   0x0080  /* CAN RX Bus Value */
+
+/* CAN_MBxx_ID1 and CAN_MBxx_ID0 Masks */
+#define DFC                    0xFFFF  /* Data Filtering Code (If Enabled) (ID0) */
+#define        EXTID_LO                0xFFFF  /* Lower 16 Bits of Extended Identifier (ID0) */
+#define        EXTID_HI                0x0003  /* Upper 2 Bits of Extended Identifier (ID1) */
+#define        BASEID                  0x1FFC  /* Base Identifier */
+#define        IDE                     0x2000  /* Identifier Extension */
+#define        RTR                     0x4000  /* Remote Frame Transmission Request */
+#define        AME                     0x8000  /* Acceptance Mask Enable */
+
+/* CAN_MBxx_TIMESTAMP Masks */
+#define TSV                    0xFFFF  /* Timestamp */
+
+/* CAN_MBxx_LENGTH Masks */
+#define DLC                    0x000F  /* Data Length Code */
+
+/* CAN_AMxxH and CAN_AMxxL Masks */
+#define DFM                    0xFFFF  /* Data Field Mask (If Enabled) (CAN_AMxxL) */
+#define        EXTID_LO                0xFFFF  /* Lower 16 Bits of Extended Identifier (CAN_AMxxL) */
+#define        EXTID_HI                0x0003  /* Upper 2 Bits of Extended Identifier (CAN_AMxxH) */
+#define        BASEID                  0x1FFC  /* Base Identifier */
+#define        AMIDE                   0x2000  /* Acceptance Mask ID Extension Enable */
+#define        FMD                     0x4000  /* Full Mask Data Field Enable */
+#define        FDF                     0x8000  /* Filter On Data Field Enable */
+
+/* CAN_MC1 Masks */
+#define        MC0                     0x0001  /* Enable Mailbox 0 */
+#define        MC1                     0x0002  /* Enable Mailbox 1 */
+#define        MC2                     0x0004  /* Enable Mailbox 2 */
+#define        MC3                     0x0008  /* Enable Mailbox 3 */
+#define        MC4                     0x0010  /* Enable Mailbox 4 */
+#define        MC5                     0x0020  /* Enable Mailbox 5 */
+#define        MC6                     0x0040  /* Enable Mailbox 6 */
+#define        MC7                     0x0080  /* Enable Mailbox 7 */
+#define        MC8                     0x0100  /* Enable Mailbox 8 */
+#define        MC9                     0x0200  /* Enable Mailbox 9 */
+#define        MC10                    0x0400  /* Enable Mailbox 10 */
+#define        MC11                    0x0800  /* Enable Mailbox 11 */
+#define        MC12                    0x1000  /* Enable Mailbox 12 */
+#define        MC13                    0x2000  /* Enable Mailbox 13 */
+#define        MC14                    0x4000  /* Enable Mailbox 14 */
+#define        MC15                    0x8000  /* Enable Mailbox 15 */
+
+/* CAN_MC2 Masks */
+#define        MC16                    0x0001  /* Enable Mailbox 16 */
+#define        MC17                    0x0002  /* Enable Mailbox 17 */
+#define        MC18                    0x0004  /* Enable Mailbox 18 */
+#define        MC19                    0x0008  /* Enable Mailbox 19 */
+#define        MC20                    0x0010  /* Enable Mailbox 20 */
+#define        MC21                    0x0020  /* Enable Mailbox 21 */
+#define        MC22                    0x0040  /* Enable Mailbox 22 */
+#define        MC23                    0x0080  /* Enable Mailbox 23 */
+#define        MC24                    0x0100  /* Enable Mailbox 24 */
+#define        MC25                    0x0200  /* Enable Mailbox 25 */
+#define        MC26                    0x0400  /* Enable Mailbox 26 */
+#define        MC27                    0x0800  /* Enable Mailbox 27 */
+#define        MC28                    0x1000  /* Enable Mailbox 28 */
+#define        MC29                    0x2000  /* Enable Mailbox 29 */
+#define        MC30                    0x4000  /* Enable Mailbox 30 */
+#define        MC31                    0x8000  /* Enable Mailbox 31 */
+
+/* CAN_MD1 Masks */
+#define        MD0                     0x0001  /* Enable Mailbox 0 For Receive */
+#define        MD1                     0x0002  /* Enable Mailbox 1 For Receive */
+#define        MD2                     0x0004  /* Enable Mailbox 2 For Receive */
+#define        MD3                     0x0008  /* Enable Mailbox 3 For Receive */
+#define        MD4                     0x0010  /* Enable Mailbox 4 For Receive */
+#define        MD5                     0x0020  /* Enable Mailbox 5 For Receive */
+#define        MD6                     0x0040  /* Enable Mailbox 6 For Receive */
+#define        MD7                     0x0080  /* Enable Mailbox 7 For Receive */
+#define        MD8                     0x0100  /* Enable Mailbox 8 For Receive */
+#define        MD9                     0x0200  /* Enable Mailbox 9 For Receive */
+#define        MD10                    0x0400  /* Enable Mailbox 10 For Receive */
+#define        MD11                    0x0800  /* Enable Mailbox 11 For Receive */
+#define        MD12                    0x1000  /* Enable Mailbox 12 For Receive */
+#define        MD13                    0x2000  /* Enable Mailbox 13 For Receive */
+#define        MD14                    0x4000  /* Enable Mailbox 14 For Receive */
+#define        MD15                    0x8000  /* Enable Mailbox 15 For Receive */
+
+/* CAN_MD2 Masks */
+#define        MD16                    0x0001  /* Enable Mailbox 16 For Receive */
+#define        MD17                    0x0002  /* Enable Mailbox 17 For Receive */
+#define        MD18                    0x0004  /* Enable Mailbox 18 For Receive */
+#define        MD19                    0x0008  /* Enable Mailbox 19 For Receive */
+#define        MD20                    0x0010  /* Enable Mailbox 20 For Receive */
+#define        MD21                    0x0020  /* Enable Mailbox 21 For Receive */
+#define        MD22                    0x0040  /* Enable Mailbox 22 For Receive */
+#define        MD23                    0x0080  /* Enable Mailbox 23 For Receive */
+#define        MD24                    0x0100  /* Enable Mailbox 24 For Receive */
+#define        MD25                    0x0200  /* Enable Mailbox 25 For Receive */
+#define        MD26                    0x0400  /* Enable Mailbox 26 For Receive */
+#define        MD27                    0x0800  /* Enable Mailbox 27 For Receive */
+#define        MD28                    0x1000  /* Enable Mailbox 28 For Receive */
+#define        MD29                    0x2000  /* Enable Mailbox 29 For Receive */
+#define        MD30                    0x4000  /* Enable Mailbox 30 For Receive */
+#define        MD31                    0x8000  /* Enable Mailbox 31 For Receive */
+
+/* CAN_RMP1 Masks */
+#define        RMP0                    0x0001  /* RX Message Pending In Mailbox 0 */
+#define        RMP1                    0x0002  /* RX Message Pending In Mailbox 1 */
+#define        RMP2                    0x0004  /* RX Message Pending In Mailbox 2 */
+#define        RMP3                    0x0008  /* RX Message Pending In Mailbox 3 */
+#define        RMP4                    0x0010  /* RX Message Pending In Mailbox 4 */
+#define        RMP5                    0x0020  /* RX Message Pending In Mailbox 5 */
+#define        RMP6                    0x0040  /* RX Message Pending In Mailbox 6 */
+#define        RMP7                    0x0080  /* RX Message Pending In Mailbox 7 */
+#define        RMP8                    0x0100  /* RX Message Pending In Mailbox 8 */
+#define        RMP9                    0x0200  /* RX Message Pending In Mailbox 9 */
+#define        RMP10                   0x0400  /* RX Message Pending In Mailbox 10 */
+#define        RMP11                   0x0800  /* RX Message Pending In Mailbox 11 */
+#define        RMP12                   0x1000  /* RX Message Pending In Mailbox 12 */
+#define        RMP13                   0x2000  /* RX Message Pending In Mailbox 13 */
+#define        RMP14                   0x4000  /* RX Message Pending In Mailbox 14 */
+#define        RMP15                   0x8000  /* RX Message Pending In Mailbox 15 */
+
+/* CAN_RMP2 Masks */
+#define        RMP16                   0x0001  /* RX Message Pending In Mailbox 16 */
+#define        RMP17                   0x0002  /* RX Message Pending In Mailbox 17 */
+#define        RMP18                   0x0004  /* RX Message Pending In Mailbox 18 */
+#define        RMP19                   0x0008  /* RX Message Pending In Mailbox 19 */
+#define        RMP20                   0x0010  /* RX Message Pending In Mailbox 20 */
+#define        RMP21                   0x0020  /* RX Message Pending In Mailbox 21 */
+#define        RMP22                   0x0040  /* RX Message Pending In Mailbox 22 */
+#define        RMP23                   0x0080  /* RX Message Pending In Mailbox 23 */
+#define        RMP24                   0x0100  /* RX Message Pending In Mailbox 24 */
+#define        RMP25                   0x0200  /* RX Message Pending In Mailbox 25 */
+#define        RMP26                   0x0400  /* RX Message Pending In Mailbox 26 */
+#define        RMP27                   0x0800  /* RX Message Pending In Mailbox 27 */
+#define        RMP28                   0x1000  /* RX Message Pending In Mailbox 28 */
+#define        RMP29                   0x2000  /* RX Message Pending In Mailbox 29 */
+#define        RMP30                   0x4000  /* RX Message Pending In Mailbox 30 */
+#define        RMP31                   0x8000  /* RX Message Pending In Mailbox 31 */
+
+/* CAN_RML1 Masks */
+#define        RML0                    0x0001  /* RX Message Lost In Mailbox 0 */
+#define        RML1                    0x0002  /* RX Message Lost In Mailbox 1 */
+#define        RML2                    0x0004  /* RX Message Lost In Mailbox 2 */
+#define        RML3                    0x0008  /* RX Message Lost In Mailbox 3 */
+#define        RML4                    0x0010  /* RX Message Lost In Mailbox 4 */
+#define        RML5                    0x0020  /* RX Message Lost In Mailbox 5 */
+#define        RML6                    0x0040  /* RX Message Lost In Mailbox 6 */
+#define        RML7                    0x0080  /* RX Message Lost In Mailbox 7 */
+#define        RML8                    0x0100  /* RX Message Lost In Mailbox 8 */
+#define        RML9                    0x0200  /* RX Message Lost In Mailbox 9 */
+#define        RML10                   0x0400  /* RX Message Lost In Mailbox 10 */
+#define        RML11                   0x0800  /* RX Message Lost In Mailbox 11 */
+#define        RML12                   0x1000  /* RX Message Lost In Mailbox 12 */
+#define        RML13                   0x2000  /* RX Message Lost In Mailbox 13 */
+#define        RML14                   0x4000  /* RX Message Lost In Mailbox 14 */
+#define        RML15                   0x8000  /* RX Message Lost In Mailbox 15 */
+
+/* CAN_RML2 Masks */
+#define        RML16                   0x0001  /* RX Message Lost In Mailbox 16 */
+#define        RML17                   0x0002  /* RX Message Lost In Mailbox 17 */
+#define        RML18                   0x0004  /* RX Message Lost In Mailbox 18 */
+#define        RML19                   0x0008  /* RX Message Lost In Mailbox 19 */
+#define        RML20                   0x0010  /* RX Message Lost In Mailbox 20 */
+#define        RML21                   0x0020  /* RX Message Lost In Mailbox 21 */
+#define        RML22                   0x0040  /* RX Message Lost In Mailbox 22 */
+#define        RML23                   0x0080  /* RX Message Lost In Mailbox 23 */
+#define        RML24                   0x0100  /* RX Message Lost In Mailbox 24 */
+#define        RML25                   0x0200  /* RX Message Lost In Mailbox 25 */
+#define        RML26                   0x0400  /* RX Message Lost In Mailbox 26 */
+#define        RML27                   0x0800  /* RX Message Lost In Mailbox 27 */
+#define        RML28                   0x1000  /* RX Message Lost In Mailbox 28 */
+#define        RML29                   0x2000  /* RX Message Lost In Mailbox 29 */
+#define        RML30                   0x4000  /* RX Message Lost In Mailbox 30 */
+#define        RML31                   0x8000  /* RX Message Lost In Mailbox 31 */
+
+/* CAN_OPSS1 Masks */
+#define        OPSS0                   0x0001  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 0 */
+#define        OPSS1                   0x0002  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 1 */
+#define        OPSS2                   0x0004  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 2 */
+#define        OPSS3                   0x0008  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 3 */
+#define        OPSS4                   0x0010  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 4 */
+#define        OPSS5                   0x0020  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 5 */
+#define        OPSS6                   0x0040  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 6 */
+#define        OPSS7                   0x0080  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 7 */
+#define        OPSS8                   0x0100  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 8 */
+#define        OPSS9                   0x0200  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 9 */
+#define        OPSS10                  0x0400  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 10 */
+#define        OPSS11                  0x0800  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 11 */
+#define        OPSS12                  0x1000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 12 */
+#define        OPSS13                  0x2000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 13 */
+#define        OPSS14                  0x4000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 14 */
+#define        OPSS15                  0x8000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 15 */
+
+/* CAN_OPSS2 Masks */
+#define        OPSS16                  0x0001  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 16 */
+#define        OPSS17                  0x0002  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 17 */
+#define        OPSS18                  0x0004  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 18 */
+#define        OPSS19                  0x0008  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 19 */
+#define        OPSS20                  0x0010  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 20 */
+#define        OPSS21                  0x0020  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 21 */
+#define        OPSS22                  0x0040  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 22 */
+#define        OPSS23                  0x0080  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 23 */
+#define        OPSS24                  0x0100  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 24 */
+#define        OPSS25                  0x0200  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 25 */
+#define        OPSS26                  0x0400  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 26 */
+#define        OPSS27                  0x0800  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 27 */
+#define        OPSS28                  0x1000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 28 */
+#define        OPSS29                  0x2000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 29 */
+#define        OPSS30                  0x4000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 30 */
+#define        OPSS31                  0x8000  /* Enable RX Overwrite Protection or TX Single-Shot For Mailbox 31 */
+
+/* CAN_TRR1 Masks */
+#define        TRR0                    0x0001  /* Deny But Don't Lock Access To Mailbox 0 */
+#define        TRR1                    0x0002  /* Deny But Don't Lock Access To Mailbox 1 */
+#define        TRR2                    0x0004  /* Deny But Don't Lock Access To Mailbox 2 */
+#define        TRR3                    0x0008  /* Deny But Don't Lock Access To Mailbox 3 */
+#define        TRR4                    0x0010  /* Deny But Don't Lock Access To Mailbox 4 */
+#define        TRR5                    0x0020  /* Deny But Don't Lock Access To Mailbox 5 */
+#define        TRR6                    0x0040  /* Deny But Don't Lock Access To Mailbox 6 */
+#define        TRR7                    0x0080  /* Deny But Don't Lock Access To Mailbox 7 */
+#define        TRR8                    0x0100  /* Deny But Don't Lock Access To Mailbox 8 */
+#define        TRR9                    0x0200  /* Deny But Don't Lock Access To Mailbox 9 */
+#define        TRR10                   0x0400  /* Deny But Don't Lock Access To Mailbox 10 */
+#define        TRR11                   0x0800  /* Deny But Don't Lock Access To Mailbox 11 */
+#define        TRR12                   0x1000  /* Deny But Don't Lock Access To Mailbox 12 */
+#define        TRR13                   0x2000  /* Deny But Don't Lock Access To Mailbox 13 */
+#define        TRR14                   0x4000  /* Deny But Don't Lock Access To Mailbox 14 */
+#define        TRR15                   0x8000  /* Deny But Don't Lock Access To Mailbox 15 */
+
+/* CAN_TRR2 Masks */
+#define        TRR16                   0x0001  /* Deny But Don't Lock Access To Mailbox 16 */
+#define        TRR17                   0x0002  /* Deny But Don't Lock Access To Mailbox 17 */
+#define        TRR18                   0x0004  /* Deny But Don't Lock Access To Mailbox 18 */
+#define        TRR19                   0x0008  /* Deny But Don't Lock Access To Mailbox 19 */
+#define        TRR20                   0x0010  /* Deny But Don't Lock Access To Mailbox 20 */
+#define        TRR21                   0x0020  /* Deny But Don't Lock Access To Mailbox 21 */
+#define        TRR22                   0x0040  /* Deny But Don't Lock Access To Mailbox 22 */
+#define        TRR23                   0x0080  /* Deny But Don't Lock Access To Mailbox 23 */
+#define        TRR24                   0x0100  /* Deny But Don't Lock Access To Mailbox 24 */
+#define        TRR25                   0x0200  /* Deny But Don't Lock Access To Mailbox 25 */
+#define        TRR26                   0x0400  /* Deny But Don't Lock Access To Mailbox 26 */
+#define        TRR27                   0x0800  /* Deny But Don't Lock Access To Mailbox 27 */
+#define        TRR28                   0x1000  /* Deny But Don't Lock Access To Mailbox 28 */
+#define        TRR29                   0x2000  /* Deny But Don't Lock Access To Mailbox 29 */
+#define        TRR30                   0x4000  /* Deny But Don't Lock Access To Mailbox 30 */
+#define        TRR31                   0x8000  /* Deny But Don't Lock Access To Mailbox 31 */
+
+/* CAN_TRS1 Masks */
+#define        TRS0                    0x0001  /* Remote Frame Request For Mailbox 0 */
+#define        TRS1                    0x0002  /* Remote Frame Request For Mailbox 1 */
+#define        TRS2                    0x0004  /* Remote Frame Request For Mailbox 2 */
+#define        TRS3                    0x0008  /* Remote Frame Request For Mailbox 3 */
+#define        TRS4                    0x0010  /* Remote Frame Request For Mailbox 4 */
+#define        TRS5                    0x0020  /* Remote Frame Request For Mailbox 5 */
+#define        TRS6                    0x0040  /* Remote Frame Request For Mailbox 6 */
+#define        TRS7                    0x0080  /* Remote Frame Request For Mailbox 7 */
+#define        TRS8                    0x0100  /* Remote Frame Request For Mailbox 8 */
+#define        TRS9                    0x0200  /* Remote Frame Request For Mailbox 9 */
+#define        TRS10                   0x0400  /* Remote Frame Request For Mailbox 10 */
+#define        TRS11                   0x0800  /* Remote Frame Request For Mailbox 11 */
+#define        TRS12                   0x1000  /* Remote Frame Request For Mailbox 12 */
+#define        TRS13                   0x2000  /* Remote Frame Request For Mailbox 13 */
+#define        TRS14                   0x4000  /* Remote Frame Request For Mailbox 14 */
+#define        TRS15                   0x8000  /* Remote Frame Request For Mailbox 15 */
+
+/* CAN_TRS2 Masks */
+#define        TRS16                   0x0001  /* Remote Frame Request For Mailbox 16 */
+#define        TRS17                   0x0002  /* Remote Frame Request For Mailbox 17 */
+#define        TRS18                   0x0004  /* Remote Frame Request For Mailbox 18 */
+#define        TRS19                   0x0008  /* Remote Frame Request For Mailbox 19 */
+#define        TRS20                   0x0010  /* Remote Frame Request For Mailbox 20 */
+#define        TRS21                   0x0020  /* Remote Frame Request For Mailbox 21 */
+#define        TRS22                   0x0040  /* Remote Frame Request For Mailbox 22 */
+#define        TRS23                   0x0080  /* Remote Frame Request For Mailbox 23 */
+#define        TRS24                   0x0100  /* Remote Frame Request For Mailbox 24 */
+#define        TRS25                   0x0200  /* Remote Frame Request For Mailbox 25 */
+#define        TRS26                   0x0400  /* Remote Frame Request For Mailbox 26 */
+#define        TRS27                   0x0800  /* Remote Frame Request For Mailbox 27 */
+#define        TRS28                   0x1000  /* Remote Frame Request For Mailbox 28 */
+#define        TRS29                   0x2000  /* Remote Frame Request For Mailbox 29 */
+#define        TRS30                   0x4000  /* Remote Frame Request For Mailbox 30 */
+#define        TRS31                   0x8000  /* Remote Frame Request For Mailbox 31 */
+
+/* CAN_AA1 Masks */
+#define        AA0                     0x0001  /* Aborted Message In Mailbox 0 */
+#define        AA1                     0x0002  /* Aborted Message In Mailbox 1 */
+#define        AA2                     0x0004  /* Aborted Message In Mailbox 2 */
+#define        AA3                     0x0008  /* Aborted Message In Mailbox 3 */
+#define        AA4                     0x0010  /* Aborted Message In Mailbox 4 */
+#define        AA5                     0x0020  /* Aborted Message In Mailbox 5 */
+#define        AA6                     0x0040  /* Aborted Message In Mailbox 6 */
+#define        AA7                     0x0080  /* Aborted Message In Mailbox 7 */
+#define        AA8                     0x0100  /* Aborted Message In Mailbox 8 */
+#define        AA9                     0x0200  /* Aborted Message In Mailbox 9 */
+#define        AA10                    0x0400  /* Aborted Message In Mailbox 10 */
+#define        AA11                    0x0800  /* Aborted Message In Mailbox 11 */
+#define        AA12                    0x1000  /* Aborted Message In Mailbox 12 */
+#define        AA13                    0x2000  /* Aborted Message In Mailbox 13 */
+#define        AA14                    0x4000  /* Aborted Message In Mailbox 14 */
+#define        AA15                    0x8000  /* Aborted Message In Mailbox 15 */
+
+/* CAN_AA2 Masks */
+#define        AA16                    0x0001  /* Aborted Message In Mailbox 16 */
+#define        AA17                    0x0002  /* Aborted Message In Mailbox 17 */
+#define        AA18                    0x0004  /* Aborted Message In Mailbox 18 */
+#define        AA19                    0x0008  /* Aborted Message In Mailbox 19 */
+#define        AA20                    0x0010  /* Aborted Message In Mailbox 20 */
+#define        AA21                    0x0020  /* Aborted Message In Mailbox 21 */
+#define        AA22                    0x0040  /* Aborted Message In Mailbox 22 */
+#define        AA23                    0x0080  /* Aborted Message In Mailbox 23 */
+#define        AA24                    0x0100  /* Aborted Message In Mailbox 24 */
+#define        AA25                    0x0200  /* Aborted Message In Mailbox 25 */
+#define        AA26                    0x0400  /* Aborted Message In Mailbox 26 */
+#define        AA27                    0x0800  /* Aborted Message In Mailbox 27 */
+#define        AA28                    0x1000  /* Aborted Message In Mailbox 28 */
+#define        AA29                    0x2000  /* Aborted Message In Mailbox 29 */
+#define        AA30                    0x4000  /* Aborted Message In Mailbox 30 */
+#define        AA31                    0x8000  /* Aborted Message In Mailbox 31 */
+
+/* CAN_TA1 Masks */
+#define        TA0                     0x0001  /* Transmit Successful From Mailbox 0 */
+#define        TA1                     0x0002  /* Transmit Successful From Mailbox 1 */
+#define        TA2                     0x0004  /* Transmit Successful From Mailbox 2 */
+#define        TA3                     0x0008  /* Transmit Successful From Mailbox 3 */
+#define        TA4                     0x0010  /* Transmit Successful From Mailbox 4 */
+#define        TA5                     0x0020  /* Transmit Successful From Mailbox 5 */
+#define        TA6                     0x0040  /* Transmit Successful From Mailbox 6 */
+#define        TA7                     0x0080  /* Transmit Successful From Mailbox 7 */
+#define        TA8                     0x0100  /* Transmit Successful From Mailbox 8 */
+#define        TA9                     0x0200  /* Transmit Successful From Mailbox 9 */
+#define        TA10                    0x0400  /* Transmit Successful From Mailbox 10 */
+#define        TA11                    0x0800  /* Transmit Successful From Mailbox 11 */
+#define        TA12                    0x1000  /* Transmit Successful From Mailbox 12 */
+#define        TA13                    0x2000  /* Transmit Successful From Mailbox 13 */
+#define        TA14                    0x4000  /* Transmit Successful From Mailbox 14 */
+#define        TA15                    0x8000  /* Transmit Successful From Mailbox 15 */
+
+/* CAN_TA2 Masks */
+#define        TA16                    0x0001  /* Transmit Successful From Mailbox 16 */
+#define        TA17                    0x0002  /* Transmit Successful From Mailbox 17 */
+#define        TA18                    0x0004  /* Transmit Successful From Mailbox 18 */
+#define        TA19                    0x0008  /* Transmit Successful From Mailbox 19 */
+#define        TA20                    0x0010  /* Transmit Successful From Mailbox 20 */
+#define        TA21                    0x0020  /* Transmit Successful From Mailbox 21 */
+#define        TA22                    0x0040  /* Transmit Successful From Mailbox 22 */
+#define        TA23                    0x0080  /* Transmit Successful From Mailbox 23 */
+#define        TA24                    0x0100  /* Transmit Successful From Mailbox 24 */
+#define        TA25                    0x0200  /* Transmit Successful From Mailbox 25 */
+#define        TA26                    0x0400  /* Transmit Successful From Mailbox 26 */
+#define        TA27                    0x0800  /* Transmit Successful From Mailbox 27 */
+#define        TA28                    0x1000  /* Transmit Successful From Mailbox 28 */
+#define        TA29                    0x2000  /* Transmit Successful From Mailbox 29 */
+#define        TA30                    0x4000  /* Transmit Successful From Mailbox 30 */
+#define        TA31                    0x8000  /* Transmit Successful From Mailbox 31 */
+
+/* CAN_MBTD Masks */
+#define TDPTR                  0x001F  /* Mailbox To Temporarily Disable */
+#define        TDA                     0x0040  /* Temporary Disable Acknowledge */
+#define        TDR                     0x0080  /* Temporary Disable Request */
+
+/* CAN_RFH1 Masks */
+#define        RFH0                    0x0001  /* Enable Automatic Remote Frame Handling For Mailbox 0 */
+#define        RFH1                    0x0002  /* Enable Automatic Remote Frame Handling For Mailbox 1 */
+#define        RFH2                    0x0004  /* Enable Automatic Remote Frame Handling For Mailbox 2 */
+#define        RFH3                    0x0008  /* Enable Automatic Remote Frame Handling For Mailbox 3 */
+#define        RFH4                    0x0010  /* Enable Automatic Remote Frame Handling For Mailbox 4 */
+#define        RFH5                    0x0020  /* Enable Automatic Remote Frame Handling For Mailbox 5 */
+#define        RFH6                    0x0040  /* Enable Automatic Remote Frame Handling For Mailbox 6 */
+#define        RFH7                    0x0080  /* Enable Automatic Remote Frame Handling For Mailbox 7 */
+#define        RFH8                    0x0100  /* Enable Automatic Remote Frame Handling For Mailbox 8 */
+#define        RFH9                    0x0200  /* Enable Automatic Remote Frame Handling For Mailbox 9 */
+#define        RFH10                   0x0400  /* Enable Automatic Remote Frame Handling For Mailbox 10 */
+#define        RFH11                   0x0800  /* Enable Automatic Remote Frame Handling For Mailbox 11 */
+#define        RFH12                   0x1000  /* Enable Automatic Remote Frame Handling For Mailbox 12 */
+#define        RFH13                   0x2000  /* Enable Automatic Remote Frame Handling For Mailbox 13 */
+#define        RFH14                   0x4000  /* Enable Automatic Remote Frame Handling For Mailbox 14 */
+#define        RFH15                   0x8000  /* Enable Automatic Remote Frame Handling For Mailbox 15 */
+
+/* CAN_RFH2 Masks */
+#define        RFH16                   0x0001  /* Enable Automatic Remote Frame Handling For Mailbox 16 */
+#define        RFH17                   0x0002  /* Enable Automatic Remote Frame Handling For Mailbox 17 */
+#define        RFH18                   0x0004  /* Enable Automatic Remote Frame Handling For Mailbox 18 */
+#define        RFH19                   0x0008  /* Enable Automatic Remote Frame Handling For Mailbox 19 */
+#define        RFH20                   0x0010  /* Enable Automatic Remote Frame Handling For Mailbox 20 */
+#define        RFH21                   0x0020  /* Enable Automatic Remote Frame Handling For Mailbox 21 */
+#define        RFH22                   0x0040  /* Enable Automatic Remote Frame Handling For Mailbox 22 */
+#define        RFH23                   0x0080  /* Enable Automatic Remote Frame Handling For Mailbox 23 */
+#define        RFH24                   0x0100  /* Enable Automatic Remote Frame Handling For Mailbox 24 */
+#define        RFH25                   0x0200  /* Enable Automatic Remote Frame Handling For Mailbox 25 */
+#define        RFH26                   0x0400  /* Enable Automatic Remote Frame Handling For Mailbox 26 */
+#define        RFH27                   0x0800  /* Enable Automatic Remote Frame Handling For Mailbox 27 */
+#define        RFH28                   0x1000  /* Enable Automatic Remote Frame Handling For Mailbox 28 */
+#define        RFH29                   0x2000  /* Enable Automatic Remote Frame Handling For Mailbox 29 */
+#define        RFH30                   0x4000  /* Enable Automatic Remote Frame Handling For Mailbox 30 */
+#define        RFH31                   0x8000  /* Enable Automatic Remote Frame Handling For Mailbox 31 */
+
+/* CAN_MBTIF1 Masks */
+#define        MBTIF0                  0x0001  /* TX Interrupt Active In Mailbox 0 */
+#define        MBTIF1                  0x0002  /* TX Interrupt Active In Mailbox 1 */
+#define        MBTIF2                  0x0004  /* TX Interrupt Active In Mailbox 2 */
+#define        MBTIF3                  0x0008  /* TX Interrupt Active In Mailbox 3 */
+#define        MBTIF4                  0x0010  /* TX Interrupt Active In Mailbox 4 */
+#define        MBTIF5                  0x0020  /* TX Interrupt Active In Mailbox 5 */
+#define        MBTIF6                  0x0040  /* TX Interrupt Active In Mailbox 6 */
+#define        MBTIF7                  0x0080  /* TX Interrupt Active In Mailbox 7 */
+#define        MBTIF8                  0x0100  /* TX Interrupt Active In Mailbox 8 */
+#define        MBTIF9                  0x0200  /* TX Interrupt Active In Mailbox 9 */
+#define        MBTIF10                 0x0400  /* TX Interrupt Active In Mailbox 10 */
+#define        MBTIF11                 0x0800  /* TX Interrupt Active In Mailbox 11 */
+#define        MBTIF12                 0x1000  /* TX Interrupt Active In Mailbox 12 */
+#define        MBTIF13                 0x2000  /* TX Interrupt Active In Mailbox 13 */
+#define        MBTIF14                 0x4000  /* TX Interrupt Active In Mailbox 14 */
+#define        MBTIF15                 0x8000  /* TX Interrupt Active In Mailbox 15 */
+
+/* CAN_MBTIF2 Masks */
+#define        MBTIF16                 0x0001  /* TX Interrupt Active In Mailbox 16 */
+#define        MBTIF17                 0x0002  /* TX Interrupt Active In Mailbox 17 */
+#define        MBTIF18                 0x0004  /* TX Interrupt Active In Mailbox 18 */
+#define        MBTIF19                 0x0008  /* TX Interrupt Active In Mailbox 19 */
+#define        MBTIF20                 0x0010  /* TX Interrupt Active In Mailbox 20 */
+#define        MBTIF21                 0x0020  /* TX Interrupt Active In Mailbox 21 */
+#define        MBTIF22                 0x0040  /* TX Interrupt Active In Mailbox 22 */
+#define        MBTIF23                 0x0080  /* TX Interrupt Active In Mailbox 23 */
+#define        MBTIF24                 0x0100  /* TX Interrupt Active In Mailbox 24 */
+#define        MBTIF25                 0x0200  /* TX Interrupt Active In Mailbox 25 */
+#define        MBTIF26                 0x0400  /* TX Interrupt Active In Mailbox 26 */
+#define        MBTIF27                 0x0800  /* TX Interrupt Active In Mailbox 27 */
+#define        MBTIF28                 0x1000  /* TX Interrupt Active In Mailbox 28 */
+#define        MBTIF29                 0x2000  /* TX Interrupt Active In Mailbox 29 */
+#define        MBTIF30                 0x4000  /* TX Interrupt Active In Mailbox 30 */
+#define        MBTIF31                 0x8000  /* TX Interrupt Active In Mailbox 31 */
+
+/* CAN_MBRIF1 Masks */
+#define        MBRIF0                  0x0001  /* RX Interrupt Active In Mailbox 0 */
+#define        MBRIF1                  0x0002  /* RX Interrupt Active In Mailbox 1 */
+#define        MBRIF2                  0x0004  /* RX Interrupt Active In Mailbox 2 */
+#define        MBRIF3                  0x0008  /* RX Interrupt Active In Mailbox 3 */
+#define        MBRIF4                  0x0010  /* RX Interrupt Active In Mailbox 4 */
+#define        MBRIF5                  0x0020  /* RX Interrupt Active In Mailbox 5 */
+#define        MBRIF6                  0x0040  /* RX Interrupt Active In Mailbox 6 */
+#define        MBRIF7                  0x0080  /* RX Interrupt Active In Mailbox 7 */
+#define        MBRIF8                  0x0100  /* RX Interrupt Active In Mailbox 8 */
+#define        MBRIF9                  0x0200  /* RX Interrupt Active In Mailbox 9 */
+#define        MBRIF10                 0x0400  /* RX Interrupt Active In Mailbox 10 */
+#define        MBRIF11                 0x0800  /* RX Interrupt Active In Mailbox 11 */
+#define        MBRIF12                 0x1000  /* RX Interrupt Active In Mailbox 12 */
+#define        MBRIF13                 0x2000  /* RX Interrupt Active In Mailbox 13 */
+#define        MBRIF14                 0x4000  /* RX Interrupt Active In Mailbox 14 */
+#define        MBRIF15                 0x8000  /* RX Interrupt Active In Mailbox 15 */
+
+/* CAN_MBRIF2 Masks */
+#define        MBRIF16                 0x0001  /* RX Interrupt Active In Mailbox 16 */
+#define        MBRIF17                 0x0002  /* RX Interrupt Active In Mailbox 17 */
+#define        MBRIF18                 0x0004  /* RX Interrupt Active In Mailbox 18 */
+#define        MBRIF19                 0x0008  /* RX Interrupt Active In Mailbox 19 */
+#define        MBRIF20                 0x0010  /* RX Interrupt Active In Mailbox 20 */
+#define        MBRIF21                 0x0020  /* RX Interrupt Active In Mailbox 21 */
+#define        MBRIF22                 0x0040  /* RX Interrupt Active In Mailbox 22 */
+#define        MBRIF23                 0x0080  /* RX Interrupt Active In Mailbox 23 */
+#define        MBRIF24                 0x0100  /* RX Interrupt Active In Mailbox 24 */
+#define        MBRIF25                 0x0200  /* RX Interrupt Active In Mailbox 25 */
+#define        MBRIF26                 0x0400  /* RX Interrupt Active In Mailbox 26 */
+#define        MBRIF27                 0x0800  /* RX Interrupt Active In Mailbox 27 */
+#define        MBRIF28                 0x1000  /* RX Interrupt Active In Mailbox 28 */
+#define        MBRIF29                 0x2000  /* RX Interrupt Active In Mailbox 29 */
+#define        MBRIF30                 0x4000  /* RX Interrupt Active In Mailbox 30 */
+#define        MBRIF31                 0x8000  /* RX Interrupt Active In Mailbox 31 */
+
+/* CAN_MBIM1 Masks */
+#define        MBIM0                   0x0001  /* Enable Interrupt For Mailbox 0 */
+#define        MBIM1                   0x0002  /* Enable Interrupt For Mailbox 1 */
+#define        MBIM2                   0x0004  /* Enable Interrupt For Mailbox 2 */
+#define        MBIM3                   0x0008  /* Enable Interrupt For Mailbox 3 */
+#define        MBIM4                   0x0010  /* Enable Interrupt For Mailbox 4 */
+#define        MBIM5                   0x0020  /* Enable Interrupt For Mailbox 5 */
+#define        MBIM6                   0x0040  /* Enable Interrupt For Mailbox 6 */
+#define        MBIM7                   0x0080  /* Enable Interrupt For Mailbox 7 */
+#define        MBIM8                   0x0100  /* Enable Interrupt For Mailbox 8 */
+#define        MBIM9                   0x0200  /* Enable Interrupt For Mailbox 9 */
+#define        MBIM10                  0x0400  /* Enable Interrupt For Mailbox 10 */
+#define        MBIM11                  0x0800  /* Enable Interrupt For Mailbox 11 */
+#define        MBIM12                  0x1000  /* Enable Interrupt For Mailbox 12 */
+#define        MBIM13                  0x2000  /* Enable Interrupt For Mailbox 13 */
+#define        MBIM14                  0x4000  /* Enable Interrupt For Mailbox 14 */
+#define        MBIM15                  0x8000  /* Enable Interrupt For Mailbox 15 */
+
+/* CAN_MBIM2 Masks */
+#define        MBIM16                  0x0001  /* Enable Interrupt For Mailbox 16 */
+#define        MBIM17                  0x0002  /* Enable Interrupt For Mailbox 17 */
+#define        MBIM18                  0x0004  /* Enable Interrupt For Mailbox 18 */
+#define        MBIM19                  0x0008  /* Enable Interrupt For Mailbox 19 */
+#define        MBIM20                  0x0010  /* Enable Interrupt For Mailbox 20 */
+#define        MBIM21                  0x0020  /* Enable Interrupt For Mailbox 21 */
+#define        MBIM22                  0x0040  /* Enable Interrupt For Mailbox 22 */
+#define        MBIM23                  0x0080  /* Enable Interrupt For Mailbox 23 */
+#define        MBIM24                  0x0100  /* Enable Interrupt For Mailbox 24 */
+#define        MBIM25                  0x0200  /* Enable Interrupt For Mailbox 25 */
+#define        MBIM26                  0x0400  /* Enable Interrupt For Mailbox 26 */
+#define        MBIM27                  0x0800  /* Enable Interrupt For Mailbox 27 */
+#define        MBIM28                  0x1000  /* Enable Interrupt For Mailbox 28 */
+#define        MBIM29                  0x2000  /* Enable Interrupt For Mailbox 29 */
+#define        MBIM30                  0x4000  /* Enable Interrupt For Mailbox 30 */
+#define        MBIM31                  0x8000  /* Enable Interrupt For Mailbox 31 */
+
+/* CAN_GIM Masks */
+#define        EWTIM                   0x0001  /* Enable TX Error Count Interrupt */
+#define        EWRIM                   0x0002  /* Enable RX Error Count Interrupt */
+#define        EPIM                    0x0004  /* Enable Error-Passive Mode Interrupt */
+#define        BOIM                    0x0008  /* Enable Bus Off Interrupt */
+#define        WUIM                    0x0010  /* Enable Wake-Up Interrupt */
+#define        UIAIM                   0x0020  /* Enable Access To Unimplemented Address Interrupt */
+#define        AAIM                    0x0040  /* Enable Abort Acknowledge Interrupt */
+#define        RMLIM                   0x0080  /* Enable RX Message Lost Interrupt */
+#define        UCEIM                   0x0100  /* Enable Universal Counter Overflow Interrupt */
+#define        EXTIM                   0x0200  /* Enable External Trigger Output Interrupt */
+#define        ADIM                    0x0400  /* Enable Access Denied Interrupt */
+
+/* CAN_GIS Masks */
+#define        EWTIS                   0x0001  /* TX Error Count IRQ Status */
+#define        EWRIS                   0x0002  /* RX Error Count IRQ Status */
+#define        EPIS                    0x0004  /* Error-Passive Mode IRQ Status */
+#define        BOIS                    0x0008  /* Bus Off IRQ Status */
+#define        WUIS                    0x0010  /* Wake-Up IRQ Status */
+#define        UIAIS                   0x0020  /* Access To Unimplemented Address IRQ Status */
+#define        AAIS                    0x0040  /* Abort Acknowledge IRQ Status */
+#define        RMLIS                   0x0080  /* RX Message Lost IRQ Status */
+#define        UCEIS                   0x0100  /* Universal Counter Overflow IRQ Status */
+#define        EXTIS                   0x0200  /* External Trigger Output IRQ Status */
+#define        ADIS                    0x0400  /* Access Denied IRQ Status */
+
+/* CAN_GIF Masks */
+#define        EWTIF                   0x0001  /* TX Error Count IRQ Flag */
+#define        EWRIF                   0x0002  /* RX Error Count IRQ Flag */
+#define        EPIF                    0x0004  /* Error-Passive Mode IRQ Flag */
+#define        BOIF                    0x0008  /* Bus Off IRQ Flag */
+#define        WUIF                    0x0010  /* Wake-Up IRQ Flag */
+#define        UIAIF                   0x0020  /* Access To Unimplemented Address IRQ Flag */
+#define        AAIF                    0x0040  /* Abort Acknowledge IRQ Flag */
+#define        RMLIF                   0x0080  /* RX Message Lost IRQ Flag */
+#define        UCEIF                   0x0100  /* Universal Counter Overflow IRQ Flag */
+#define        EXTIF                   0x0200  /* External Trigger Output IRQ Flag */
+#define        ADIF                    0x0400  /* Access Denied IRQ Flag */
+
+/* CAN_UCCNF Masks */
+#define        UCCNF                   0x000F  /* Universal Counter Mode */
+#define UC_STAMP               0x0001  /* Timestamp Mode */
+#define UC_WDOG                        0x0002  /* Watchdog Mode */
+#define UC_AUTOTX              0x0003  /* Auto-Transmit Mode */
+#define UC_ERROR               0x0006  /* CAN Error Frame Count */
+#define UC_OVER                        0x0007  /* CAN Overload Frame Count */
+#define UC_LOST                        0x0008  /* Arbitration Lost During TX Count */
+#define UC_AA                  0x0009  /* TX Abort Count */
+#define UC_TA                  0x000A  /* TX Successful Count */
+#define UC_REJECT              0x000B  /* RX Message Rejected Count */
+#define UC_RML                 0x000C  /* RX Message Lost Count */
+#define UC_RX                  0x000D  /* Total Successful RX Messages Count */
+#define UC_RMP                 0x000E  /* Successful RX W/Matching ID Count */
+#define UC_ALL                 0x000F  /* Correct Message On CAN Bus Line Count */
+#define        UCRC                    0x0020  /* Universal Counter Reload/Clear */
+#define        UCCT                    0x0040  /* Universal Counter CAN Trigger */
+#define        UCE                     0x0080  /* Universal Counter Enable */
+
+/* CAN_ESR Masks */
+#define        ACKE                    0x0004  /* Acknowledge Error */
+#define        SER                     0x0008  /* Stuff Error */
+#define        CRCE                    0x0010  /* CRC Error */
+#define        SA0                     0x0020  /* Stuck At Dominant Error */
+#define        BEF                     0x0040  /* Bit Error Flag */
+#define        FER                     0x0080  /* Form Error Flag */
+
+/* CAN_EWR Masks */
+#define        EWLREC                  0x00FF  /* RX Error Count Limit (For EWRIS) */
+#define        EWLTEC                  0xFF00  /* TX Error Count Limit (For EWTIS) */
+
+/*
+ * PIN CONTROL REGISTER MASKS
+ */
+/* PORT_MUX Masks */
+#define        PJSE                    0x0001  /* Port J SPI/SPORT Enable */
+#define        PJSE_SPORT              0x0000  /* Enable TFS0/DT0PRI */
+#define        PJSE_SPI                0x0001  /* Enable SPI_SSEL3:2 */
+
+#define        PJCE(x)                 (((x)&0x3)<<1)  /* Port J CAN/SPI/SPORT Enable */
+#define        PJCE_SPORT              0x0000  /* Enable DR0SEC/DT0SEC */
+#define        PJCE_CAN                0x0002  /* Enable CAN RX/TX */
+#define        PJCE_SPI                0x0004  /* Enable SPI_SSEL7 */
+
+#define        PFDE                    0x0008  /* Port F DMA Request Enable */
+#define        PGDE_UART               0x0000  /* Enable UART0 RX/TX */
+#define        PGDE_DMA                0x0008  /* Enable DMAR1:0 */
+
+#define        PFTE                    0x0010  /* Port F Timer Enable */
+#define        PFTE_UART               0x0000  /* Enable UART1 RX/TX */
+#define        PFTE_TIMER              0x0010  /* Enable TMR7:6 */
+
+#define        PFS6E                   0x0020  /* Port F SPI SSEL 6 Enable */
+#define        PFS6E_TIMER             0x0000  /* Enable TMR5 */
+#define        PFS6E_SPI               0x0020  /* Enable SPI_SSEL6 */
+
+#define        PFS5E                   0x0040  /* Port F SPI SSEL 5 Enable */
+#define        PFS5E_TIMER             0x0000  /* Enable TMR4 */
+#define        PFS5E_SPI               0x0040  /* Enable SPI_SSEL5 */
+
+#define        PFS4E                   0x0080  /* Port F SPI SSEL 4 Enable */
+#define        PFS4E_TIMER             0x0000  /* Enable TMR3 */
+#define        PFS4E_SPI               0x0080  /* Enable SPI_SSEL4 */
+
+#define        PFFE                    0x0100  /* Port F PPI Frame Sync Enable */
+#define        PFFE_TIMER              0x0000  /* Enable TMR2 */
+#define        PFFE_PPI                0x0100  /* Enable PPI FS3 */
+
+#define        PGSE                    0x0200  /* Port G SPORT1 Secondary Enable */
+#define        PGSE_PPI                0x0000  /* Enable PPI D9:8 */
+#define        PGSE_SPORT              0x0200  /* Enable DR1SEC/DT1SEC */
+
+#define        PGRE                    0x0400  /* Port G SPORT1 Receive Enable */
+#define        PGRE_PPI                0x0000  /* Enable PPI D12:10 */
+#define        PGRE_SPORT              0x0400  /* Enable DR1PRI/RFS1/RSCLK1 */
+
+#define        PGTE                    0x0800  /* Port G SPORT1 Transmit Enable */
+#define        PGTE_PPI                0x0000  /* Enable PPI D15:13 */
+#define        PGTE_SPORT              0x0800  /* Enable DT1PRI/TFS1/TSCLK1 */
+
+/*
+ * HANDSHAKE DMA (HDMA) MASKS
+ */
+/* HDMAx_CTL Masks */
+#define        HMDMAEN                 0x0001  /* Enable Handshake DMA 0/1 */
+#define        REP                     0x0002  /* HDMA Request Polarity */
+#define        UTE                     0x0004  /* Urgency Threshold Enable */
+#define        OIE                     0x0010  /* Overflow Interrupt Enable */
+#define        BDIE                    0x0020  /* Block Done Interrupt Enable */
+#define        MBDI                    0x0040  /* Mask Block Done IRQ If Pending ECNT */
+#define        DRQ                     0x0300  /* HDMA Request Type */
+#define        DRQ_NONE                0x0000  /* No Request */
+#define        DRQ_SINGLE              0x0100  /* Channels Request Single */
+#define        DRQ_MULTI               0x0200  /* Channels Request Multi (Default) */
+#define        DRQ_URGENT              0x0300  /* Channels Request Multi Urgent */
+#define        RBC                     0x1000  /* Reload BCNT With IBCNT */
+#define        PS                      0x2000  /* HDMA Pin Status */
+#define        OI                      0x4000  /* Overflow Interrupt Generated */
+#define        BDI                     0x8000  /* Block Done Interrupt Generated */
+
+/* entry addresses of the user-callable Boot ROM functions */
+
+#define _BOOTROM_RESET 0xEF000000
+#define _BOOTROM_FINAL_INIT 0xEF000002
+#define _BOOTROM_DO_MEMORY_DMA 0xEF000006
+#define _BOOTROM_BOOT_DXE_FLASH 0xEF000008
+#define _BOOTROM_BOOT_DXE_SPI 0xEF00000A
+#define _BOOTROM_BOOT_DXE_TWI 0xEF00000C
+#define _BOOTROM_GET_DXE_ADDRESS_FLASH 0xEF000010
+#define _BOOTROM_GET_DXE_ADDRESS_SPI 0xEF000012
+#define _BOOTROM_GET_DXE_ADDRESS_TWI 0xEF000014
+
+#endif                         /* _DEF_BF534_H */
diff --git a/include/asm-blackfin/arch-bf537/defBF537.h b/include/asm-blackfin/arch-bf537/defBF537.h
new file mode 100644 (file)
index 0000000..8d16c37
--- /dev/null
@@ -0,0 +1,488 @@
+/*
+ * Copyright (C) 2004-2005 Analog Devices Inc., All Rights Reserved.
+ *
+ ***********************************************************************************
+ *
+ * This include file contains a list of macro "defines" to enable the programmer
+ * to use symbolic names for register-access and bit-manipulation.
+ *
+ *   ----------------------------
+ *   revision 0.1
+ *   date: 2004/03/01 21:23:01;  author: joeb
+ *   Initial revision
+ *
+ *   ----------------------------
+ *   revision 0.2
+ *   date: 2004/05/15 16:30:00;  author: joeb
+ *   comments: removed I2C/IIC references, changed GPIO sections
+ *
+ *   ----------------------------
+ *   revision 0.3
+ *   date: 2004/06/08 12:25:00;  author: joeb
+ *   comments: fixed mis-mapped TIMER registers, changed TWI register names, fixed
+ *             FLAG references in GPIO register names
+ *
+ *   ----------------------------
+ *   revision 0.4
+ *   date: 2004/06/09 2:25:00;  author: joeb
+ *   comments: fixed bit-defines for EMAC section, renamed EMAC count registers,
+ *             combined 2 Timer status registers into one
+ *
+ *   ----------------------------
+ *   revision 0.5
+ *   date: 2004/08/10 10:25:00;  author: joeb
+ *   comments: Renamed EMAC wake-up registers, changed bit-names in EMAC registers
+ *
+ *   ----------------------------
+ *   revision 0.6
+ *   date: 2004/08/17 16:25:00;  author: joeb
+ *   comments: Renamed TWI_INT_ENABLE to TWI_INT_MASK
+ *
+ *   ----------------------------
+ *   revision 0.7
+ *   date: 2004/08/18 13:21:00;  author: joeb
+ *   comments: Renamed GPIO registers to remove _D, _S, _C, _T suffixes
+ *
+ *   ----------------------------
+ *   revision 0.8
+ *   date: 2004/08/20 10:24:00;  author: joeb
+ *   comments: Renamed External DMA to Handshake MDMA
+ *
+ *   ----------------------------
+ *   revision 0.9
+ *   date: 2004/08/23 13:42:00;  author: joeb
+ *   comments: Renamed Handshake DMA Register Set
+ *
+ *   ----------------------------
+ *   revision 0.10
+ *   date: 2004/09/07 11:21:00;  author: joeb
+ *   comments: Fixed EMAC TX/RX DMA Priority (DMA and SIC Bit Names)
+ *
+ *   ----------------------------
+ *   revision 0.11
+ *   date: 2004/09/28 15:14:00;  author: joeb
+ *   comments: Fixed CAN Mailbox Area
+ *
+ *   ----------------------------
+ *   revision 0.12
+ *   date: 2004/10/27 13:18:00;  author: joeb
+ *   comments: Added IEEE EMAC Register Support
+ *
+ *   ----------------------------
+ *   revision 0.13
+ *   date: 2004/10/28 15:40:00;  author: joeb
+ *   comments: Shortened EMAC Count Register Names
+ *
+ *   ----------------------------
+ *   revision 0.14
+ *   date: 2004/11/09 10:45:00;  author: joeb
+ *   comments: Fixed WDSIZE macros
+ *
+ *   ----------------------------
+ *   revision 0.15
+ *   date: 2004/11/18 07:45:00;  author: joeb
+ *   comments: Fixed TIMER_STATUS register, added EMAC macros
+ *
+ *   ----------------------------
+ *   revision 0.16
+ *   date: 2004/12/13 11:05:00;  author: joeb
+ *   comments: Removed HI/LO macros (now Assembler mnemonics)
+ *                             Renamed enable bit for HMDMA from EN to HMDMAEN
+ *
+ *   ----------------------------
+ *   revision 0.17
+ *   date: 2004/12/17 14:25:00;  author: joeb
+ *   comments: Replaced C++ Single-Line Comments w/C-standard Comments
+ *                             Changed EMAC EQ1024 TX/RX References to GE1024
+ *
+ *   ----------------------------
+ *   revision 0.18
+ *   date: 2005/01/05 10:50:00;  author: joeb
+ *   comments: Added CAN Macros To Index Mailbox Area and Acceptance Masks
+ *                             Added mask values for field deposit protection
+ *
+ *   ----------------------------
+ *   revision 0.19
+ *   date: 2005/01/10 10:30:00;  author: joeb
+ *   comments: Made all Macro argument syntax compliant to MISRA-C 2004 rule 19.10.
+ *
+ *   ----------------------------
+ *   revision 0.20
+ *   date: 2005/01/27 14:25:15;  author: joeb
+ *   comments: Moved MMRs common to BF534 to BF534 header.
+ */
+#ifndef _DEF_BF537_H
+#define _DEF_BF537_H
+
+/* Include all Core registers and bit definitions */
+#include <asm/arch-common/def_LPBlackfin.h>
+
+/* Include all MMR and bit defines common to BF534 */
+#include <asm/arch-bf537/defBF534.h>
+
+/*
+ * Define EMAC Section Unique to BF536/BF537
+ */
+
+/* 10/100 Ethernet Controller  (0xFFC03000 - 0xFFC031FF) */
+#define        EMAC_OPMODE             0xFFC03000      /* Operating Mode Register */
+#define EMAC_ADDRLO            0xFFC03004      /* Address Low (32 LSBs) Register */
+#define EMAC_ADDRHI            0xFFC03008      /* Address High (16 MSBs) Register */
+#define EMAC_HASHLO            0xFFC0300C      /* Multicast Hash Table Low (Bins 31-0) Register */
+#define EMAC_HASHHI            0xFFC03010      /* Multicast Hash Table High (Bins 63-32) Register */
+#define EMAC_STAADD            0xFFC03014      /* Station Management Address Register */
+#define EMAC_STADAT            0xFFC03018      /* Station Management Data Register */
+#define EMAC_FLC               0xFFC0301C      /* Flow Control Register */
+#define EMAC_VLAN1             0xFFC03020      /* VLAN1 Tag Register */
+#define EMAC_VLAN2             0xFFC03024      /* VLAN2 Tag Register */
+#define EMAC_WKUP_CTL          0xFFC0302C      /* Wake-Up Control/Status Register */
+#define EMAC_WKUP_FFMSK0       0xFFC03030      /* Wake-Up Frame Filter 0 Byte Mask Register */
+#define EMAC_WKUP_FFMSK1       0xFFC03034      /* Wake-Up Frame Filter 1 Byte Mask Register */
+#define EMAC_WKUP_FFMSK2       0xFFC03038      /* Wake-Up Frame Filter 2 Byte Mask Register */
+#define EMAC_WKUP_FFMSK3       0xFFC0303C      /* Wake-Up Frame Filter 3 Byte Mask Register */
+#define EMAC_WKUP_FFCMD                0xFFC03040      /* Wake-Up Frame Filter Commands Register */
+#define EMAC_WKUP_FFOFF                0xFFC03044      /* Wake-Up Frame Filter Offsets Register */
+#define EMAC_WKUP_FFCRC0       0xFFC03048      /* Wake-Up Frame Filter 0,1 CRC-16 Register */
+#define EMAC_WKUP_FFCRC1       0xFFC0304C      /* Wake-Up Frame Filter 2,3 CRC-16 Register */
+
+#define        EMAC_SYSCTL             0xFFC03060      /* EMAC System Control Register */
+#define EMAC_SYSTAT            0xFFC03064      /* EMAC System Status Register */
+#define EMAC_RX_STAT           0xFFC03068      /* RX Current Frame Status Register */
+#define EMAC_RX_STKY           0xFFC0306C      /* RX Sticky Frame Status Register */
+#define EMAC_RX_IRQE           0xFFC03070      /* RX Frame Status Interrupt Enables Register */
+#define EMAC_TX_STAT           0xFFC03074      /* TX Current Frame Status Register */
+#define EMAC_TX_STKY           0xFFC03078      /* TX Sticky Frame Status Register */
+#define EMAC_TX_IRQE           0xFFC0307C      /* TX Frame Status Interrupt Enables Register */
+
+#define EMAC_MMC_CTL           0xFFC03080      /* MMC Counter Control Register */
+#define EMAC_MMC_RIRQS         0xFFC03084      /* MMC RX Interrupt Status Register */
+#define EMAC_MMC_RIRQE         0xFFC03088      /* MMC RX Interrupt Enables Register */
+#define EMAC_MMC_TIRQS         0xFFC0308C      /* MMC TX Interrupt Status Register */
+#define EMAC_MMC_TIRQE         0xFFC03090      /* MMC TX Interrupt Enables Register */
+
+#define EMAC_RXC_OK            0xFFC03100      /* RX Frame Successful Count */
+#define EMAC_RXC_FCS           0xFFC03104      /* RX Frame FCS Failure Count */
+#define EMAC_RXC_ALIGN         0xFFC03108      /* RX Alignment Error Count */
+#define EMAC_RXC_OCTET         0xFFC0310C      /* RX Octets Successfully Received Count */
+#define EMAC_RXC_DMAOVF                0xFFC03110      /* Internal MAC Sublayer Error RX Frame Count */
+#define EMAC_RXC_UNICST                0xFFC03114      /* Unicast RX Frame Count */
+#define EMAC_RXC_MULTI         0xFFC03118      /* Multicast RX Frame Count */
+#define EMAC_RXC_BROAD         0xFFC0311C      /* Broadcast RX Frame Count */
+#define EMAC_RXC_LNERRI                0xFFC03120      /* RX Frame In Range Error Count */
+#define EMAC_RXC_LNERRO                0xFFC03124      /* RX Frame Out Of Range Error Count */
+#define EMAC_RXC_LONG          0xFFC03128      /* RX Frame Too Long Count */
+#define EMAC_RXC_MACCTL                0xFFC0312C      /* MAC Control RX Frame Count */
+#define EMAC_RXC_OPCODE                0xFFC03130      /* Unsupported Op-Code RX Frame Count */
+#define EMAC_RXC_PAUSE         0xFFC03134      /* MAC Control Pause RX Frame Count */
+#define EMAC_RXC_ALLFRM                0xFFC03138      /* Overall RX Frame Count */
+#define EMAC_RXC_ALLOCT                0xFFC0313C      /* Overall RX Octet Count */
+#define EMAC_RXC_TYPED         0xFFC03140      /* Type/Length Consistent RX Frame Count */
+#define EMAC_RXC_SHORT         0xFFC03144      /* RX Frame Fragment Count - Byte Count x < 64 */
+#define EMAC_RXC_EQ64          0xFFC03148      /* Good RX Frame Count - Byte Count x = 64 */
+#define EMAC_RXC_LT128         0xFFC0314C      /* Good RX Frame Count - Byte Count  64 <= x < 128 */
+#define EMAC_RXC_LT256         0xFFC03150      /* Good RX Frame Count - Byte Count 128 <= x < 256 */
+#define EMAC_RXC_LT512         0xFFC03154      /* Good RX Frame Count - Byte Count 256 <= x < 512 */
+#define EMAC_RXC_LT1024                0xFFC03158      /* Good RX Frame Count - Byte Count 512 <= x < 1024 */
+#define EMAC_RXC_GE1024                0xFFC0315C      /* Good RX Frame Count - Byte Count x >= 1024 */
+
+#define EMAC_TXC_OK            0xFFC03180      /* TX Frame Successful Count */
+#define EMAC_TXC_1COL          0xFFC03184      /* TX Frames Successful After Single Collision Count */
+#define EMAC_TXC_GT1COL                0xFFC03188      /* TX Frames Successful After Multiple Collisions Count */
+#define EMAC_TXC_OCTET         0xFFC0318C      /* TX Octets Successfully Received Count */
+#define EMAC_TXC_DEFER         0xFFC03190      /* TX Frame Delayed Due To Busy Count */
+#define EMAC_TXC_LATECL                0xFFC03194      /* Late TX Collisions Count */
+#define EMAC_TXC_XS_COL                0xFFC03198      /* TX Frame Failed Due To Excessive Collisions Count */
+#define EMAC_TXC_DMAUND                0xFFC0319C      /* Internal MAC Sublayer Error TX Frame Count */
+#define EMAC_TXC_CRSERR                0xFFC031A0      /* Carrier Sense Deasserted During TX Frame Count */
+#define EMAC_TXC_UNICST                0xFFC031A4      /* Unicast TX Frame Count */
+#define EMAC_TXC_MULTI         0xFFC031A8      /* Multicast TX Frame Count */
+#define EMAC_TXC_BROAD         0xFFC031AC      /* Broadcast TX Frame Count */
+#define EMAC_TXC_XS_DFR                0xFFC031B0      /* TX Frames With Excessive Deferral Count */
+#define EMAC_TXC_MACCTL                0xFFC031B4      /* MAC Control TX Frame Count */
+#define EMAC_TXC_ALLFRM                0xFFC031B8      /* Overall TX Frame Count */
+#define EMAC_TXC_ALLOCT                0xFFC031BC      /* Overall TX Octet Count */
+#define EMAC_TXC_EQ64          0xFFC031C0      /* Good TX Frame Count - Byte Count x = 64 */
+#define EMAC_TXC_LT128         0xFFC031C4      /* Good TX Frame Count - Byte Count  64 <= x < 128 */
+#define EMAC_TXC_LT256         0xFFC031C8      /* Good TX Frame Count - Byte Count 128 <= x < 256 */
+#define EMAC_TXC_LT512         0xFFC031CC      /* Good TX Frame Count - Byte Count 256 <= x < 512 */
+#define EMAC_TXC_LT1024                0xFFC031D0      /* Good TX Frame Count - Byte Count 512 <= x < 1024 */
+#define EMAC_TXC_GE1024                0xFFC031D4      /* Good TX Frame Count - Byte Count x >= 1024 */
+#define EMAC_TXC_ABORT         0xFFC031D8      /* Total TX Frames Aborted Count */
+
+/* Listing for IEEE-Supported Count Registers */
+#define FramesReceivedOK               EMAC_RXC_OK     /* RX Frame Successful Count */
+#define FrameCheckSequenceErrors       EMAC_RXC_FCS    /* RX Frame FCS Failure Count */
+#define AlignmentErrors                        EMAC_RXC_ALIGN  /* RX Alignment Error Count */
+#define OctetsReceivedOK               EMAC_RXC_OCTET  /* RX Octets Successfully Received Count */
+#define FramesLostDueToIntMACRcvError  EMAC_RXC_DMAOVF /* Internal MAC Sublayer Error RX Frame Count */
+#define UnicastFramesReceivedOK                EMAC_RXC_UNICST /* Unicast RX Frame Count */
+#define MulticastFramesReceivedOK      EMAC_RXC_MULTI  /* Multicast RX Frame Count */
+#define BroadcastFramesReceivedOK      EMAC_RXC_BROAD  /* Broadcast RX Frame Count */
+#define InRangeLengthErrors            EMAC_RXC_LNERRI /* RX Frame In Range Error Count */
+#define OutOfRangeLengthField          EMAC_RXC_LNERRO /* RX Frame Out Of Range Error Count */
+#define FrameTooLongErrors             EMAC_RXC_LONG   /* RX Frame Too Long Count */
+#define MACControlFramesReceived       EMAC_RXC_MACCTL /* MAC Control RX Frame Count */
+#define UnsupportedOpcodesReceived     EMAC_RXC_OPCODE /* Unsupported Op-Code RX Frame Count */
+#define PAUSEMACCtrlFramesReceived     EMAC_RXC_PAUSE  /* MAC Control Pause RX Frame Count */
+#define FramesReceivedAll              EMAC_RXC_ALLFRM /* Overall RX Frame Count */
+#define OctetsReceivedAll              EMAC_RXC_ALLOCT /* Overall RX Octet Count */
+#define TypedFramesReceived            EMAC_RXC_TYPED  /* Type/Length Consistent RX Frame Count */
+#define FramesLenLt64Received          EMAC_RXC_SHORT  /* RX Frame Fragment Count - Byte Count x < 64 */
+#define FramesLenEq64Received          EMAC_RXC_EQ64   /* Good RX Frame Count - Byte Count x = 64 */
+#define FramesLen65_127Received                EMAC_RXC_LT128  /* Good RX Frame Count - Byte Count  64 <= x < 128 */
+#define FramesLen128_255Received       EMAC_RXC_LT256  /* Good RX Frame Count - Byte Count 128 <= x < 256 */
+#define FramesLen256_511Received       EMAC_RXC_LT512  /* Good RX Frame Count - Byte Count 256 <= x < 512 */
+#define FramesLen512_1023Received      EMAC_RXC_LT1024 /* Good RX Frame Count - Byte Count 512 <= x < 1024 */
+#define FramesLen1024_MaxReceived      EMAC_RXC_GE1024 /* Good RX Frame Count - Byte Count x >= 1024 */
+
+#define FramesTransmittedOK            EMAC_TXC_OK     /* TX Frame Successful Count */
+#define SingleCollisionFrames          EMAC_TXC_1COL   /* TX Frames Successful After Single Collision Count */
+#define MultipleCollisionFrames                EMAC_TXC_GT1COL /* TX Frames Successful After Multiple Collisions Count */
+#define OctetsTransmittedOK            EMAC_TXC_OCTET  /* TX Octets Successfully Received Count */
+#define FramesWithDeferredXmissions    EMAC_TXC_DEFER  /* TX Frame Delayed Due To Busy Count */
+#define LateCollisions                 EMAC_TXC_LATECL /* Late TX Collisions Count */
+#define FramesAbortedDueToXSColls      EMAC_TXC_XS_COL /* TX Frame Failed Due To Excessive Collisions Count */
+#define FramesLostDueToIntMacXmitError EMAC_TXC_DMAUND /* Internal MAC Sublayer Error TX Frame Count */
+#define CarrierSenseErrors             EMAC_TXC_CRSERR /* Carrier Sense Deasserted During TX Frame Count */
+#define UnicastFramesXmittedOK         EMAC_TXC_UNICST /* Unicast TX Frame Count */
+#define MulticastFramesXmittedOK       EMAC_TXC_MULTI  /* Multicast TX Frame Count */
+#define BroadcastFramesXmittedOK       EMAC_TXC_BROAD  /* Broadcast TX Frame Count */
+#define FramesWithExcessiveDeferral    EMAC_TXC_XS_DFR /* TX Frames With Excessive Deferral Count */
+#define MACControlFramesTransmitted    EMAC_TXC_MACCTL /* MAC Control TX Frame Count */
+#define FramesTransmittedAll           EMAC_TXC_ALLFRM /* Overall TX Frame Count */
+#define OctetsTransmittedAll           EMAC_TXC_ALLOCT /* Overall TX Octet Count */
+#define FramesLenEq64Transmitted       EMAC_TXC_EQ64   /* Good TX Frame Count - Byte Count x = 64 */
+#define FramesLen65_127Transmitted     EMAC_TXC_LT128  /* Good TX Frame Count - Byte Count  64 <= x < 128 */
+#define FramesLen128_255Transmitted    EMAC_TXC_LT256  /* Good TX Frame Count - Byte Count 128 <= x < 256 */
+#define FramesLen256_511Transmitted    EMAC_TXC_LT512  /* Good TX Frame Count - Byte Count 256 <= x < 512 */
+#define FramesLen512_1023Transmitted   EMAC_TXC_LT1024 /* Good TX Frame Count - Byte Count 512 <= x < 1024 */
+#define FramesLen1024_MaxTransmitted   EMAC_TXC_GE1024 /* Good TX Frame Count - Byte Count x >= 1024 */
+#define TxAbortedFrames                        EMAC_TXC_ABORT  /* Total TX Frames Aborted Count */
+
+/*
+ * System MMR Register Bits And Macros
+ *
+ * Disclaimer: All macros are intended to make C and Assembly code more readable.
+ *             Use these macros carefully, as any that do left shifts for field
+ *             depositing will result in the lower order bits being destroyed.  Any
+ *             macro that shifts left to properly position the bit-field should be
+ *             used as part of an OR to initialize a register and NOT as a dynamic
+ *             modifier UNLESS the lower order bits are saved and ORed back in when
+ *             the macro is used.
+ */
+/*
+ * ETHERNET 10/100 CONTROLLER MASKS
+ */
+/* EMAC_OPMODE Masks */
+#define        RE              0x00000001      /* Receiver Enable */
+#define        ASTP            0x00000002      /* Enable Automatic Pad Stripping On RX Frames */
+#define        HU              0x00000010      /* Hash Filter Unicast Address */
+#define        HM              0x00000020      /* Hash Filter Multicast Address */
+#define        PAM             0x00000040      /* Pass-All-Multicast Mode Enable */
+#define        PR              0x00000080      /* Promiscuous Mode Enable */
+#define        IFE             0x00000100      /* Inverse Filtering Enable */
+#define        DBF             0x00000200      /* Disable Broadcast Frame Reception */
+#define        PBF             0x00000400      /* Pass Bad Frames Enable */
+#define        PSF             0x00000800      /* Pass Short Frames Enable */
+#define        RAF             0x00001000      /* Receive-All Mode */
+#define        TE              0x00010000      /* Transmitter Enable */
+#define        DTXPAD          0x00020000      /* Disable Automatic TX Padding */
+#define        DTXCRC          0x00040000      /* Disable Automatic TX CRC Generation */
+#define        DC              0x00080000      /* Deferral Check */
+#define        BOLMT           0x00300000      /* Back-Off Limit */
+#define        BOLMT_10        0x00000000      /* 10-bit range */
+#define        BOLMT_8         0x00100000      /* 8-bit range */
+#define        BOLMT_4         0x00200000      /* 4-bit range */
+#define        BOLMT_1         0x00300000      /* 1-bit range */
+#define        DRTY            0x00400000      /* Disable TX Retry On Collision */
+#define        LCTRE           0x00800000      /* Enable TX Retry On Late Collision */
+#define        RMII            0x01000000      /* RMII/MII* Mode */
+#define        RMII_10         0x02000000      /* Speed Select for RMII Port (10MBit/100MBit*) */
+#define        FDMODE          0x04000000      /* Duplex Mode Enable (Full/Half*) */
+#define        LB              0x08000000      /* Internal Loopback Enable */
+#define        DRO             0x10000000      /* Disable Receive Own Frames (Half-Duplex Mode) */
+
+/* EMAC_STAADD Masks */
+#define        STABUSY         0x00000001      /* Initiate Station Mgt Reg Access / STA Busy Stat */
+#define        STAOP           0x00000002      /* Station Management Operation Code (Write/Read*) */
+#define        STADISPRE       0x00000004      /* Disable Preamble Generation */
+#define        STAIE           0x00000008      /* Station Mgt. Transfer Done Interrupt Enable */
+#define        REGAD           0x000007C0      /* STA Register Address */
+#define        PHYAD           0x0000F800      /* PHY Device Address */
+
+#define        SET_REGAD(x)    (((x)&0x1F)<<  6 )      /* Set STA Register Address */
+#define        SET_PHYAD(x)    (((x)&0x1F)<< 11 )      /* Set PHY Device Address */
+
+/* EMAC_STADAT Mask */
+#define        STADATA         0x0000FFFF      /* Station Management Data */
+
+/* EMAC_FLC Masks */
+#define        FLCBUSY         0x00000001      /* Send Flow Ctrl Frame / Flow Ctrl Busy Status */
+#define        FLCE            0x00000002      /* Flow Control Enable */
+#define        PCF             0x00000004      /* Pass Control Frames */
+#define        BKPRSEN         0x00000008      /* Enable Backpressure */
+#define        FLCPAUSE        0xFFFF0000      /* Pause Time */
+
+#define        SET_FLCPAUSE(x) (((x)&0xFFFF)<< 16)     /* Set Pause Time */
+
+/* EMAC_WKUP_CTL Masks */
+#define        CAPWKFRM        0x00000001      /* Capture Wake-Up Frames */
+#define        MPKE            0x00000002      /* Magic Packet Enable */
+#define        RWKE            0x00000004      /* Remote Wake-Up Frame Enable */
+#define        GUWKE           0x00000008      /* Global Unicast Wake Enable */
+#define        MPKS            0x00000020      /* Magic Packet Received Status */
+#define        RWKS            0x00000F00      /* Wake-Up Frame Received Status, Filters 3:0 */
+
+/* EMAC_WKUP_FFCMD Masks */
+#define        WF0_E           0x00000001      /* Enable Wake-Up Filter 0 */
+#define        WF0_T           0x00000008      /* Wake-Up Filter 0 Addr Type (Multicast/Unicast*) */
+#define        WF1_E           0x00000100      /* Enable Wake-Up Filter 1 */
+#define        WF1_T           0x00000800      /* Wake-Up Filter 1 Addr Type (Multicast/Unicast*) */
+#define        WF2_E           0x00010000      /* Enable Wake-Up Filter 2 */
+#define        WF2_T           0x00080000      /* Wake-Up Filter 2 Addr Type (Multicast/Unicast*) */
+#define        WF3_E           0x01000000      /* Enable Wake-Up Filter 3 */
+#define        WF3_T           0x08000000      /* Wake-Up Filter 3 Addr Type (Multicast/Unicast*) */
+
+/* EMAC_WKUP_FFOFF Masks */
+#define        WF0_OFF         0x000000FF      /* Wake-Up Filter 0 Pattern Offset */
+#define        WF1_OFF         0x0000FF00      /* Wake-Up Filter 1 Pattern Offset */
+#define        WF2_OFF         0x00FF0000      /* Wake-Up Filter 2 Pattern Offset */
+#define        WF3_OFF         0xFF000000      /* Wake-Up Filter 3 Pattern Offset */
+
+#define        SET_WF0_OFF(x)  (((x)&0xFF)<<  0 )      /* Set Wake-Up Filter 0 Byte Offset */
+#define        SET_WF1_OFF(x)  (((x)&0xFF)<<  8 )      /* Set Wake-Up Filter 1 Byte Offset */
+#define        SET_WF2_OFF(x)  (((x)&0xFF)<< 16 )      /* Set Wake-Up Filter 2 Byte Offset */
+#define        SET_WF3_OFF(x)  (((x)&0xFF)<< 24 )      /* Set Wake-Up Filter 3 Byte Offset */
+/* Set ALL Offsets */
+#define        SET_WF_OFFS(x0,x1,x2,x3)        (SET_WF0_OFF((x0))|SET_WF1_OFF((x1))|SET_WF2_OFF((x2))|SET_WF3_OFF((x3)))
+
+/* EMAC_WKUP_FFCRC0 Masks */
+#define        WF0_CRC         0x0000FFFF      /* Wake-Up Filter 0 Pattern CRC */
+#define        WF1_CRC         0xFFFF0000      /* Wake-Up Filter 1 Pattern CRC */
+
+#define        SET_WF0_CRC(x)  (((x)&0xFFFF)<< 0)      /* Set Wake-Up Filter 0 Target CRC */
+#define        SET_WF1_CRC(x)  (((x)&0xFFFF)<< 16)     /* Set Wake-Up Filter 1 Target CRC */
+
+/* EMAC_WKUP_FFCRC1 Masks */
+#define        WF2_CRC         0x0000FFFF      /* Wake-Up Filter 2 Pattern CRC */
+#define        WF3_CRC         0xFFFF0000      /* Wake-Up Filter 3 Pattern CRC */
+
+#define        SET_WF2_CRC(x)  (((x)&0xFFFF)<< 0)      /* Set Wake-Up Filter 2 Target CRC */
+#define        SET_WF3_CRC(x)  (((x)&0xFFFF)<< 16)     /* Set Wake-Up Filter 3 Target CRC */
+
+/* EMAC_SYSCTL Masks */
+#define        PHYIE           0x00000001      /* PHY_INT Interrupt Enable */
+#define        RXDWA           0x00000002      /* Receive Frame DMA Word Alignment (Odd/Even*) */
+#define        RXCKS           0x00000004      /* Enable RX Frame TCP/UDP Checksum Computation */
+#define        MDCDIV          0x00003F00      /* SCLK:MDC Clock Divisor [MDC=SCLK/(2*(N+1))] */
+
+#define        SET_MDCDIV(x)   (((x)&0x3F)<< 8)        /* Set MDC Clock Divisor */
+
+/* EMAC_SYSTAT Masks */
+#define        PHYINT          0x00000001      /* PHY_INT Interrupt Status */
+#define        MMCINT          0x00000002      /* MMC Counter Interrupt Status */
+#define        RXFSINT         0x00000004      /* RX Frame-Status Interrupt Status */
+#define        TXFSINT         0x00000008      /* TX Frame-Status Interrupt Status */
+#define        WAKEDET         0x00000010      /* Wake-Up Detected Status */
+#define        RXDMAERR        0x00000020      /* RX DMA Direction Error Status */
+#define        TXDMAERR        0x00000040      /* TX DMA Direction Error Status */
+#define        STMDONE         0x00000080      /* Station Mgt. Transfer Done Interrupt Status */
+
+/* EMAC_RX_STAT, EMAC_RX_STKY, and EMAC_RX_IRQE Masks */
+#define        RX_FRLEN        0x000007FF      /* Frame Length In Bytes */
+#define        RX_COMP         0x00001000      /* RX Frame Complete */
+#define        RX_OK           0x00002000      /* RX Frame Received With No Errors */
+#define        RX_LONG         0x00004000      /* RX Frame Too Long Error */
+#define        RX_ALIGN        0x00008000      /* RX Frame Alignment Error */
+#define        RX_CRC          0x00010000      /* RX Frame CRC Error */
+#define        RX_LEN          0x00020000      /* RX Frame Length Error */
+#define        RX_FRAG         0x00040000      /* RX Frame Fragment Error */
+#define        RX_ADDR         0x00080000      /* RX Frame Address Filter Failed Error */
+#define        RX_DMAO         0x00100000      /* RX Frame DMA Overrun Error */
+#define        RX_PHY          0x00200000      /* RX Frame PHY Error */
+#define        RX_LATE         0x00400000      /* RX Frame Late Collision Error */
+#define        RX_RANGE        0x00800000      /* RX Frame Length Field Out of Range Error */
+#define        RX_MULTI        0x01000000      /* RX Multicast Frame Indicator */
+#define        RX_BROAD        0x02000000      /* RX Broadcast Frame Indicator */
+#define        RX_CTL          0x04000000      /* RX Control Frame Indicator */
+#define        RX_UCTL         0x08000000      /* Unsupported RX Control Frame Indicator */
+#define        RX_TYPE         0x10000000      /* RX Typed Frame Indicator */
+#define        RX_VLAN1        0x20000000      /* RX VLAN1 Frame Indicator */
+#define        RX_VLAN2        0x40000000      /* RX VLAN2 Frame Indicator */
+#define        RX_ACCEPT       0x80000000      /* RX Frame Accepted Indicator */
+
+/*  EMAC_TX_STAT, EMAC_TX_STKY, and EMAC_TX_IRQE Masks */
+#define        TX_COMP         0x00000001      /* TX Frame Complete */
+#define        TX_OK           0x00000002      /* TX Frame Sent With No Errors */
+#define        TX_ECOLL        0x00000004      /* TX Frame Excessive Collision Error */
+#define        TX_LATE         0x00000008      /* TX Frame Late Collision Error */
+#define        TX_DMAU         0x00000010      /* TX Frame DMA Underrun Error (STAT) */
+#define        TX_MACE         0x00000010      /* Internal MAC Error Detected (STKY and IRQE) */
+#define        TX_EDEFER       0x00000020      /* TX Frame Excessive Deferral Error */
+#define        TX_BROAD        0x00000040      /* TX Broadcast Frame Indicator */
+#define        TX_MULTI        0x00000080      /* TX Multicast Frame Indicator */
+#define        TX_CCNT         0x00000F00      /* TX Frame Collision Count */
+#define        TX_DEFER        0x00001000      /* TX Frame Deferred Indicator */
+#define        TX_CRS          0x00002000      /* TX Frame Carrier Sense Not Asserted Error */
+#define        TX_LOSS         0x00004000      /* TX Frame Carrier Lost During TX Error */
+#define        TX_RETRY        0x00008000      /* TX Frame Successful After Retry */
+#define        TX_FRLEN        0x07FF0000      /* TX Frame Length (Bytes) */
+
+/* EMAC_MMC_CTL Masks */
+#define        RSTC            0x00000001      /* Reset All Counters */
+#define        CROLL           0x00000002      /* Counter Roll-Over Enable */
+#define        CCOR            0x00000004      /* Counter Clear-On-Read Mode Enable */
+#define        MMCE            0x00000008      /* Enable MMC Counter Operation */
+
+/* EMAC_MMC_RIRQS and EMAC_MMC_RIRQE Masks */
+#define        RX_OK_CNT       0x00000001      /* RX Frames Received With No Errors */
+#define        RX_FCS_CNT      0x00000002      /* RX Frames W/Frame Check Sequence Errors */
+#define        RX_ALIGN_CNT    0x00000004      /* RX Frames With Alignment Errors */
+#define        RX_OCTET_CNT    0x00000008      /* RX Octets Received OK */
+#define        RX_LOST_CNT     0x00000010      /* RX Frames Lost Due To Internal MAC RX Error */
+#define        RX_UNI_CNT      0x00000020      /* Unicast RX Frames Received OK */
+#define        RX_MULTI_CNT    0x00000040      /* Multicast RX Frames Received OK */
+#define        RX_BROAD_CNT    0x00000080      /* Broadcast RX Frames Received OK */
+#define        RX_IRL_CNT      0x00000100      /* RX Frames With In-Range Length Errors */
+#define        RX_ORL_CNT      0x00000200      /* RX Frames With Out-Of-Range Length Errors */
+#define        RX_LONG_CNT     0x00000400      /* RX Frames With Frame Too Long Errors */
+#define        RX_MACCTL_CNT   0x00000800      /* MAC Control RX Frames Received */
+#define        RX_OPCODE_CTL   0x00001000      /* Unsupported Op-Code RX Frames Received */
+#define        RX_PAUSE_CNT    0x00002000      /* PAUSEMAC Control RX Frames Received */
+#define        RX_ALLF_CNT     0x00004000      /* All RX Frames Received */
+#define        RX_ALLO_CNT     0x00008000      /* All RX Octets Received */
+#define        RX_TYPED_CNT    0x00010000      /* Typed RX Frames Received */
+#define        RX_SHORT_CNT    0x00020000      /* RX Frame Fragments (< 64 Bytes) Received */
+#define        RX_EQ64_CNT     0x00040000      /* 64-Byte RX Frames Received */
+#define        RX_LT128_CNT    0x00080000      /* 65-127-Byte RX Frames Received */
+#define        RX_LT256_CNT    0x00100000      /* 128-255-Byte RX Frames Received */
+#define        RX_LT512_CNT    0x00200000      /* 256-511-Byte RX Frames Received */
+#define        RX_LT1024_CNT   0x00400000      /* 512-1023-Byte RX Frames Received */
+#define        RX_GE1024_CNT   0x00800000      /* 1024-Max-Byte RX Frames Received */
+
+/* EMAC_MMC_TIRQS and EMAC_MMC_TIRQE Masks */
+#define        TX_OK_CNT       0x00000001      /* TX Frames Sent OK */
+#define        TX_SCOLL_CNT    0x00000002      /* TX Frames With Single Collisions */
+#define        TX_MCOLL_CNT    0x00000004      /* TX Frames With Multiple Collisions */
+#define        TX_OCTET_CNT    0x00000008      /* TX Octets Sent OK */
+#define        TX_DEFER_CNT    0x00000010      /* TX Frames With Deferred Transmission */
+#define        TX_LATE_CNT     0x00000020      /* TX Frames With Late Collisions */
+#define        TX_ABORTC_CNT   0x00000040      /* TX Frames Aborted Due To Excess Collisions */
+#define        TX_LOST_CNT     0x00000080      /* TX Frames Lost Due To Internal MAC TX Error */
+#define        TX_CRS_CNT      0x00000100      /* TX Frames With Carrier Sense Errors */
+#define        TX_UNI_CNT      0x00000200      /* Unicast TX Frames Sent */
+#define        TX_MULTI_CNT    0x00000400      /* Multicast TX Frames Sent */
+#define        TX_BROAD_CNT    0x00000800      /* Broadcast TX Frames Sent */
+#define        TX_EXDEF_CTL    0x00001000      /* TX Frames With Excessive Deferral */
+#define        TX_MACCTL_CNT   0x00002000      /* MAC Control TX Frames Sent */
+#define        TX_ALLF_CNT     0x00004000      /* All TX Frames Sent */
+#define        TX_ALLO_CNT     0x00008000      /* All TX Octets Sent */
+#define        TX_EQ64_CNT     0x00010000      /* 64-Byte TX Frames Sent */
+#define        TX_LT128_CNT    0x00020000      /* 65-127-Byte TX Frames Sent */
+#define        TX_LT256_CNT    0x00040000      /* 128-255-Byte TX Frames Sent */
+#define        TX_LT512_CNT    0x00080000      /* 256-511-Byte TX Frames Sent */
+#define        TX_LT1024_CNT   0x00100000      /* 512-1023-Byte TX Frames Sent */
+#define        TX_GE1024_CNT   0x00200000      /* 1024-Max-Byte TX Frames Sent */
+#define        TX_ABORT_CNT    0x00400000      /* TX Frames Aborted */
+
+#endif                         /* _DEF_BF537_H */
diff --git a/include/asm-blackfin/arch-bf537/defBF537_extn.h b/include/asm-blackfin/arch-bf537/defBF537_extn.h
new file mode 100644 (file)
index 0000000..8090da6
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * defBF537_extn.h
+ *
+ * This file is subject to the terms and conditions of the GNU Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Non-GPL License also available as part of VisualDSP++
+ *
+ * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html
+ *
+ * (c) Copyright 2001-2005 Analog Devices, Inc. All rights reserved
+ *
+ * This file under source code control, please send bugs or changes to:
+ * dsptools.support@analog.com
+ *
+ */
+
+#ifndef _DEF_BF537_EXTN_H
+#define _DEF_BF537_EXTN_H
+
+#define OFFSET_( x )           ((x) & 0x0000FFFF)      /* define macro for offset */
+/* Delay inserted for PLL transition */
+#define PLL_DELAY              0x1000
+
+#define L1_ISRAM               0xFFA00000
+#define L1_ISRAM_END           0xFFA10000
+#define DATA_BANKA_SRAM                0xFF800000
+#define DATA_BANKA_SRAM_END    0xFF808000
+#define DATA_BANKB_SRAM                0xFF900000
+#define DATA_BANKB_SRAM_END    0xFF908000
+#define SYSMMR_BASE            0xFFC00000
+#define WDSIZE16               0x00000004
+
+/* Event Vector Table Address */
+#define EVT_EMULATION_ADDR     0xffe02000
+#define EVT_RESET_ADDR         0xffe02004
+#define EVT_NMI_ADDR           0xffe02008
+#define EVT_EXCEPTION_ADDR     0xffe0200c
+#define EVT_GLOBAL_INT_ENB_ADDR        0xffe02010
+#define EVT_HARDWARE_ERROR_ADDR        0xffe02014
+#define EVT_TIMER_ADDR         0xffe02018
+#define EVT_IVG7_ADDR          0xffe0201c
+#define EVT_IVG8_ADDR          0xffe02020
+#define EVT_IVG9_ADDR          0xffe02024
+#define EVT_IVG10_ADDR         0xffe02028
+#define EVT_IVG11_ADDR         0xffe0202c
+#define EVT_IVG12_ADDR         0xffe02030
+#define EVT_IVG13_ADDR         0xffe02034
+#define EVT_IVG14_ADDR         0xffe02038
+#define EVT_IVG15_ADDR         0xffe0203c
+#define EVT_OVERRIDE_ADDR      0xffe02100
+
+/* IMASK Bit values */
+#define IVG15_POS              0x00008000
+#define IVG14_POS              0x00004000
+#define IVG13_POS              0x00002000
+#define IVG12_POS              0x00001000
+#define IVG11_POS              0x00000800
+#define IVG10_POS              0x00000400
+#define IVG9_POS               0x00000200
+#define IVG8_POS               0x00000100
+#define IVG7_POS               0x00000080
+#define IVGTMR_POS             0x00000040
+#define IVGHW_POS              0x00000020
+
+#define WDOG_TMR_DISABLE       (0xAD << 4)
+#define ICTL_RST               0x00000000
+#define ICTL_NMI               0x00000002
+#define ICTL_GP                        0x00000004
+#define ICTL_DISABLE           0x00000003
+
+/* Watch Dog timer values setup */
+#define WATCHDOG_DISABLE       WDOG_TMR_DISABLE | ICTL_DISABLE
+
+#endif                         /* _DEF_BF537_EXTN_H */
diff --git a/include/asm-blackfin/arch-bf537/irq.h b/include/asm-blackfin/arch-bf537/irq.h
new file mode 100644 (file)
index 0000000..527d8a2
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * U-boot bf537_irq.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * This file is based on
+ * linux/arch/$(ARCH)/platform/$(PLATFORM)/irq.c
+ * Changed by HuTao Apr18, 2003
+ *
+ * Copyright was missing when I got the code so took from MIPS arch ...MaTed---
+ * Copyright (C) 1994 by Waldorf GMBH, written by Ralf Baechle
+ * Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001 by Ralf Baechle
+ *
+ * Adapted for BlackFin (ADI) by Ted Ma <mated@sympatico.ca>
+ * Copyright (c) 2002 Arcturus Networks Inc. (www.arcturusnetworks.com)
+ * Copyright (c) 2002 Lineo, Inc. <mattw@lineo.com>
+ *
+ * Adapted for BlackFin BF537 by Bas Vermeulen <bas@buyways.nl>
+ * Copyright (c) 2003 BuyWays B.V. (www.buyways.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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _BF537_IRQ_H_
+#define _BF537_IRQ_H_
+
+/*
+ * Interrupt source definitions
+ * Event Source                        Core Event Name         Number
+ *                             EMU                     0
+ * Reset                       RST                     1
+ * NMI                         NMI                     2
+ * Exception                   EVX                     3
+ * Reserved                    --                      4
+ * Hardware Error              IVHW                    5
+ * Core Timer                  IVTMR                   6
+ * PLL Wakeup Interrupt                IVG7                    7
+ * DMA Error (generic)         IVG7                    8
+ * PPI Error Interrupt         IVG7                    9
+ * SPORT0 Error Interrupt      IVG7                    10
+ * SPORT1 Error Interrupt      IVG7                    11
+ * SPI Error Interrupt         IVG7                    12
+ * UART Error Interrupt                IVG7                    13
+ * RTC Interrupt               IVG8                    14
+ * DMA0 Interrupt (PPI)                IVG8                    15
+ * DMA1 (SPORT0 RX)            IVG9                    16
+ * DMA2 (SPORT0 TX)            IVG9                    17
+ * DMA3 (SPORT1 RX)            IVG9                    18
+ * DMA4 (SPORT1 TX)            IVG9                    19
+ * DMA5 (PPI)                  IVG10                   20
+ * DMA6 (UART RX)              IVG10                   21
+ * DMA7 (UART TX)              IVG10                   22
+ * Timer0                      IVG11                   23
+ * Timer1                      IVG11                   24
+ * Timer2                      IVG11                   25
+ * PF Interrupt A              IVG12                   26
+ * PF Interrupt B              IVG12                   27
+ * DMA8/9 Interrupt            IVG13                   28
+ * DMA10/11 Interrupt          IVG13                   29
+ * Watchdog Timer              IVG13                   30
+ * Software Interrupt 1                IVG14                   31
+ * Software Interrupt 2                --
+ * (lowest priority)           IVG15                   32
+ */
+
+#define IRQ_EMU                        0       /* Emulation */
+#define IRQ_RST                        1       /* reset */
+#define IRQ_NMI                        2       /* Non Maskable */
+#define IRQ_EVX                        3       /* Exception */
+#define IRQ_UNUSED             4       /*  - unused interrupt */
+#define IRQ_HWERR              5       /* Hardware Error */
+#define IRQ_CORETMR            6       /* Core timer */
+
+#define IRQ_UART_RX_BIT                0x0800
+#define IRQ_UART_TX_BIT                0x1000
+#define IRQ_UART_ERROR_BIT     0x40
+
+#endif
diff --git a/include/asm-blackfin/arch-bf561/anomaly.h b/include/asm-blackfin/arch-bf561/anomaly.h
new file mode 100644 (file)
index 0000000..467649b
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * File:       include/asm-blackfin/arch-bf561/anomaly.h
+ * Based on:
+ * Author:
+ *
+ * Created:
+ * Description:
+ *
+ * Rev:
+ *
+ * Modified:
+ *
+ * Bugs:       Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, 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; see the file COPYING.
+ * If not, write to the Free Software Foundation,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * This file shoule be up to date with:
+ *  - Revision L, 10Aug2006; ADSP-BF561 Silicon Anomaly List
+ */
+
+#ifndef _MACH_ANOMALY_H_
+#define _MACH_ANOMALY_H_
+
+/* We do not support 0.1 or 0.4 silicon - sorry */
+#if (defined(CONFIG_BF_REV_0_1) || defined(CONFIG_BF_REV_0_2) || defined(CONFIG_BF_REV_0_4))
+#error Kernel will not work on BF561 Version 0.1, 0.2, or 0.4
+#endif
+
+/* Issues that are common to 0.5 and  0.3 silicon */
+#if  (defined(CONFIG_BF_REV_0_5) || defined(CONFIG_BF_REV_0_3))
+#define ANOMALY_05000074       /* A multi issue instruction with dsp32shiftimm in
+                                  slot1 and store of a P register in slot 2 is not
+                                  supported */
+#define ANOMALY_05000099       /* UART Line Status Register (UART_LSR) bits are not
+                                  updated at the same time. */
+#define ANOMALY_05000120       /* Testset instructions restricted to 32-bit aligned
+                                  memory locations */
+#define ANOMALY_05000122       /* Rx.H cannot be used to access 16-bit System MMR
+                                  registers */
+#define ANOMALY_05000127       /* Signbits instruction not functional under certain
+                                  conditions */
+#define ANOMALY_05000149       /* IMDMA S1/D1 channel may stall */
+#define ANOMALY_05000166       /* PPI Data Lengths Between 8 and 16 do not zero out
+                                  upper bits */
+#define ANOMALY_05000167       /* Turning Serial Ports on With External Frame Syncs */
+#define ANOMALY_05000180       /* PPI_DELAY not functional in PPI modes with 0 frame
+                                  syncs */
+#define ANOMALY_05000182       /* IMDMA does not operate to full speed for 600MHz
+                                  and higher devices */
+#define ANOMALY_05000187       /* IMDMA Corrupted Data after a Halt */
+#define ANOMALY_05000190       /* PPI not functional at core voltage < 1Volt */
+#define ANOMALY_05000208       /* VSTAT status bit in PLL_STAT register is not
+                                  functional */
+#define ANOMALY_05000245       /* Spurious Hardware Error from an access in the
+                                  shadow of a conditional branch */
+#define ANOMALY_05000257       /* Interrupt/Exception during short hardware loop
+                                  may cause bad instruction fetches */
+#define ANOMALY_05000265       /* Sensitivity to noise with slow input edge rates on
+                                  external SPORT TX and RX clocks */
+#define ANOMALY_05000267       /* IMDMA may corrupt data under certain conditions */
+#define ANOMALY_05000269       /* High I/O activity causes output voltage of internal
+                                  voltage regulator (VDDint) to increase */
+#define ANOMALY_05000270       /* High I/O activity causes output voltage of internal
+                                  voltage regulator (VDDint) to decrease */
+#define ANOMALY_05000272       /* Certain data cache write through modes fail for
+                                  VDDint <=0.9V */
+#define ANOMALY_05000274       /* Data cache write back to external synchronous memory
+                                  may be lost */
+#define ANOMALY_05000275       /* PPI Timing and sampling informaton updates */
+#endif                         /*  (defined(CONFIG_BF_REV_0_5) || defined(CONFIG_BF_REV_0_3)) */
+
+#if  (defined(CONFIG_BF_REV_0_5))
+#define ANOMALY_05000254       /* Incorrect Timer Pulse Width in Single-Shot PWM_OUT
+                                  mode with external clock */
+#define ANOMALY_05000266       /* IMDMA destination IRQ status must be read prior to
+                                  using IMDMA */
+#endif
+
+#if  (defined(CONFIG_BF_REV_0_3))
+#define ANOMALY_05000156       /* Timers in PWM-Out Mode with PPI GP Receive (Input)
+                                  Mode with 0 Frame Syncs */
+#define ANOMALY_05000168       /* SDRAM auto-refresh and subsequent Power Ups */
+#define ANOMALY_05000169       /* DATA CPLB page miss can result in lost write-through
+                                  cache data writes */
+#define ANOMALY_05000171       /* Boot-ROM code modifies SICA_IWRx wakeup registers */
+#define ANOMALY_05000174       /* Cache Fill Buffer Data lost */
+#define ANOMALY_05000175       /* Overlapping Sequencer and Memory Stalls */
+#define ANOMALY_05000176       /* Multiplication of (-1) by (-1) followed by an
+                                  accumulator saturation */
+#define ANOMALY_05000179       /* PPI_COUNT cannot be programmed to 0 in General
+                                  Purpose TX or RX modes */
+#define ANOMALY_05000181       /* Disabling the PPI resets the PPI configuration
+                                  registers */
+#define ANOMALY_05000184       /* Timer Pin limitations for PPI TX Modes with
+                                  External Frame Syncs */
+#define ANOMALY_05000185       /* PPI TX Mode with 2 External Frame Syncs */
+#define ANOMALY_05000186       /* PPI packing with Data Length greater than 8 bits
+                                  (not a meaningful mode) */
+#define ANOMALY_05000188       /* IMDMA Restrictions on Descriptor and Buffer
+                                  Placement in Memory */
+#define ANOMALY_05000189       /* False Protection Exception */
+#define ANOMALY_05000193       /* False Flag Pin Interrupts on Edge Sensitive Inputs
+                                  when polarity setting is changed */
+#define ANOMALY_05000194       /* Restarting SPORT in specific modes may cause data
+                                  corruption */
+#define ANOMALY_05000198       /* Failing MMR accesses when stalled by preceding
+                                  memory read */
+#define ANOMALY_05000199       /* DMA current address shows wrong value during carry
+                                  fix */
+#define ANOMALY_05000200       /* SPORT TFS and DT are incorrectly driven during
+                                  inactive channels in certain conditions */
+#define ANOMALY_05000202       /* Possible infinite stall with specific dual-DAG
+                                  situation */
+#define ANOMALY_05000204       /* Incorrect data read with write-through cache and
+                                  allocate cache lines on reads only mode */
+#define ANOMALY_05000205       /* Specific sequence that can cause DMA error or DMA
+                                  stopping */
+#define ANOMALY_05000207       /* Recovery from "brown-out" condition */
+#define ANOMALY_05000209       /* Speed-Path in computational unit affects certain
+                                  instructions */
+#define ANOMALY_05000215       /* UART TX Interrupt masked erroneously */
+#define ANOMALY_05000219       /* NMI event at boot time results in unpredictable
+                                  state */
+#define ANOMALY_05000220       /* Data Corruption with Cached External Memory and
+                                  Non-Cached On-Chip L2 Memory */
+#define ANOMALY_05000225       /* Incorrect pulse-width of UART start-bit */
+#define ANOMALY_05000227       /* Scratchpad memory bank reads may return incorrect
+                                  data */
+#define ANOMALY_05000230       /* UART Receiver is less robust against Baudrate
+                                  Differences in certain Conditions */
+#define ANOMALY_05000231       /* UART STB bit incorrectly affects receiver setting */
+#define ANOMALY_05000232       /* SPORT data transmit lines are incorrectly driven in
+                                  multichannel mode */
+#define ANOMALY_05000242       /* DF bit in PLL_CTL register does not respond to
+                                  hardware reset */
+#define ANOMALY_05000244       /* If i-cache is on, CSYNC/SSYNC/IDLE around Change of
+                                  Control causes failures */
+#define ANOMALY_05000248       /* TESTSET operation forces stall on the other core */
+#define ANOMALY_05000250       /* Incorrect Bit-Shift of Data Word in Multichannel
+                                  (TDM) mode in certain conditions */
+#define ANOMALY_05000251       /* Exception not generated for MMR accesses in
+                                  reserved region */
+#define ANOMALY_05000253       /* Maximum external clock speed for Timers */
+#define ANOMALY_05000258       /* Instruction Cache is corrupted when bits 9 and 12
+                                  of the ICPLB Data registers differ */
+#define ANOMALY_05000260       /* ICPLB_STATUS MMR register may be corrupted */
+#define ANOMALY_05000261       /* DCPLB_FAULT_ADDR MMR register may be corrupted */
+#define ANOMALY_05000262       /* Stores to data cache may be lost */
+#define ANOMALY_05000263       /* Hardware loop corrupted when taking an ICPLB
+                                  exception */
+#define ANOMALY_05000264       /* CSYNC/SSYNC/IDLE causes infinite stall in second
+                                  to last instruction in hardware loop */
+#define ANOMALY_05000276       /* Timing requirements change for External Frame
+                                  Sync PPI Modes with non-zero PPI_DELAY */
+#define ANOMALY_05000278       /* Disabling Peripherals with DMA running may cause
+                                  DMA system instability */
+#define ANOMALY_05000281       /* False Hardware Error Exception when ISR context is
+                                  not restored */
+#define ANOMALY_05000283       /* An MMR write is stalled indefinitely when killed
+                                  in a particular stage */
+#define ANOMALY_05000287       /* A read will receive incorrect data under certain
+                                  conditions */
+#define ANOMALY_05000288       /* SPORTs may receive bad data if FIFOs fill up */
+#endif
+
+#endif                         /* _MACH_ANOMALY_H_ */
diff --git a/include/asm-blackfin/arch-bf561/bf561_serial.h b/include/asm-blackfin/arch-bf561/bf561_serial.h
new file mode 100644 (file)
index 0000000..eb01ca2
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * U-boot bf561_serial.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _BF561_SERIAL_H_
+#define _BF561_SERIAL_H_
+
+#define BYTE_REF(addr)         (*((volatile char*)addr))
+#define HALFWORD_REF(addr)     (*((volatile short*)addr))
+#define WORD_REF(addr)         (*((volatile long*)addr))
+
+#define UART_THR_LO            HALFWORD_REF(UART_THR)
+#define UART_RBR_LO            HALFWORD_REF(UART_RBR)
+#define UART_DLL_LO            HALFWORD_REF(UART_DLL)
+#define UART_IER_LO            HALFWORD_REF(UART_IER)
+#define UART_IER_ERBFI         0x01
+#define UART_IER_ETBEI         0x02
+#define UART_IER_ELSI          0x04
+#define UART_IER_EDDSI         0x08
+
+#define UART_DLH_LO            HALFWORD_REF(UART_DLH)
+#define UART_IIR_LO            HALFWORD_REF(UART_IIR)
+#define UART_IIR_NOINT         0x01
+#define UART_IIR_STATUS                0x06
+#define UART_IIR_LSR           0x06
+#define UART_IIR_RBR           0x04
+#define UART_IIR_THR           0x02
+#define UART_IIR_MSR           0x00
+
+#define UART_LCR_LO            HALFWORD_REF(UART_LCR)
+#define UART_LCR_WLS5          0
+#define UART_LCR_WLS6          0x01
+#define UART_LCR_WLS7          0x02
+#define UART_LCR_WLS8          0x03
+#define UART_LCR_STB           0x04
+#define UART_LCR_PEN           0x08
+#define UART_LCR_EPS           0x10
+#define UART_LCR_SP            0x20
+#define UART_LCR_SB            0x40
+#define UART_LCR_DLAB          0x80
+
+#define UART_MCR_LO            HALFWORD_REF(UART_MCR)
+
+#define UART_LSR_LO            HALFWORD_REF(UART_LSR)
+#define UART_LSR_DR            0x01
+#define UART_LSR_OE            0x02
+#define UART_LSR_PE            0x04
+#define UART_LSR_FE            0x08
+#define UART_LSR_BI            0x10
+#define UART_LSR_THRE          0x20
+#define UART_LSR_TEMT          0x40
+
+#define UART_MSR_LO            HALFWORD_REF(UART_MSR)
+#define UART_SCR_LO            HALFWORD_REF(UART_SCR)
+#define UART_GCTL_LO           HALFWORD_REF(UART_GCTL)
+#define UART_GCTL_UCEN         0x01
+
+#endif
diff --git a/include/asm-blackfin/arch-bf561/cdefBF561.h b/include/asm-blackfin/arch-bf561/cdefBF561.h
new file mode 100644 (file)
index 0000000..f217ba7
--- /dev/null
@@ -0,0 +1,998 @@
+/*
+ * cdefBF561.h
+ *
+ * (c) Copyright 2001-2004 Analog Devices, Inc.  All rights reserved.
+ *
+ */
+
+/* C POINTERS TO SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 */
+
+#ifndef _CDEF_BF561_H
+#define _CDEF_BF561_H
+
+/*
+ * #if !defined(__ADSPBF561__)
+ * #warning cdefBF561.h should only be included for BF561 chip.
+ * #endif
+ */
+
+/* include all Core registers and bit definitions */
+#include <asm/arch-bf561/defBF561.h>
+#include <asm/arch-common/cdef_LPBlackfin.h>
+
+/*
+ * System MMR Register Map
+ */
+
+/* Clock and System Control (0xFFC00000 - 0xFFC000FF) */
+#define pPLL_CTL               (volatile unsigned short *)PLL_CTL
+#define pPLL_DIV               (volatile unsigned short *)PLL_DIV
+#define pVR_CTL                        (volatile unsigned short *)VR_CTL
+#define pPLL_STAT              (volatile unsigned short *)PLL_STAT
+#define pPLL_LOCKCNT           (volatile unsigned short *)PLL_LOCKCNT
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * core A (0xFFC0 0100-0xFFC0 01FF)
+ */
+#define pSICA_SWRST            (volatile unsigned short *)SICA_SWRST
+#define pSICA_SYSCR            (volatile unsigned short *)SICA_SYSCR
+#define pSICA_RVECT            (volatile unsigned short *)SICA_RVECT
+#define pSICA_IMASK            (volatile unsigned long *)SICA_IMASK
+#define pSICA_IMASK0           (volatile unsigned long *)SICA_IMASK0
+#define pSICA_IMASK1           (volatile unsigned long *)SICA_IMASK1
+#define pSICA_IAR0             (volatile unsigned long *)SICA_IAR0
+#define pSICA_IAR1             (volatile unsigned long *)SICA_IAR1
+#define pSICA_IAR2             (volatile unsigned long *)SICA_IAR2
+#define pSICA_IAR3             (volatile unsigned long *)SICA_IAR3
+#define pSICA_IAR4             (volatile unsigned long *)SICA_IAR4
+#define pSICA_IAR5             (volatile unsigned long *)SICA_IAR5
+#define pSICA_IAR6             (volatile unsigned long *)SICA_IAR6
+#define pSICA_IAR7             (volatile unsigned long *)SICA_IAR7
+#define pSICA_ISR0             (volatile unsigned long *)SICA_ISR0
+#define pSICA_ISR1             (volatile unsigned long *)SICA_ISR1
+#define pSICA_IWR0             (volatile unsigned long *)SICA_IWR0
+#define pSICA_IWR1             (volatile unsigned long *)SICA_IWR1
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * Core B (0xFFC0 1100-0xFFC0 11FF)
+ */
+#define pSICB_SWRST            (volatile unsigned short *)SICB_SWRST
+#define pSICB_SYSCR            (volatile unsigned short *)SICB_SYSCR
+#define pSICB_RVECT            (volatile unsigned short *)SICB_RVECT
+#define pSICB_IMASK0           (volatile unsigned long *)SICB_IMASK0
+#define pSICB_IMASK1           (volatile unsigned long *)SICB_IMASK1
+#define pSICB_IAR0             (volatile unsigned long *)SICB_IAR0
+#define pSICB_IAR1             (volatile unsigned long *)SICB_IAR1
+#define pSICB_IAR2             (volatile unsigned long *)SICB_IAR2
+#define pSICB_IAR3             (volatile unsigned long *)SICB_IAR3
+#define pSICB_IAR4             (volatile unsigned long *)SICB_IAR4
+#define pSICB_IAR5             (volatile unsigned long *)SICB_IAR5
+#define pSICB_IAR6             (volatile unsigned long *)SICB_IAR6
+#define pSICB_IAR7             (volatile unsigned long *)SICB_IAR7
+#define pSICB_ISR0             (volatile unsigned long *)SICB_ISR0
+#define pSICB_ISR1             (volatile unsigned long *)SICB_ISR1
+#define pSICB_IWR0             (volatile unsigned long *)SICB_IWR0
+#define pSICB_IWR1             (volatile unsigned long *)SICB_IWR1
+
+/* Watchdog Timer registers for Core A (0xFFC0 0200-0xFFC0 02FF) */
+#define pWDOGA_CTL             (volatile unsigned short *)WDOGA_CTL
+#define pWDOGA_CNT             (volatile unsigned long *)WDOGA_CNT
+#define pWDOGA_STAT            (volatile unsigned long *)WDOGA_STAT
+
+/* Watchdog Timer registers for Core B (0xFFC0 1200-0xFFC0 12FF) */
+#define pWDOGB_CTL             (volatile unsigned short *)WDOGB_CTL
+#define pWDOGB_CNT             (volatile unsigned long *)WDOGB_CNT
+#define pWDOGB_STAT            (volatile unsigned long *)WDOGB_STAT
+
+/* UART Controller (0xFFC00400 - 0xFFC004FF) */
+#define pUART_THR              (volatile unsigned short *)UART_THR
+#define pUART_RBR              (volatile unsigned short *)UART_RBR
+#define pUART_DLL              (volatile unsigned short *)UART_DLL
+#define pUART_IER              (volatile unsigned short *)UART_IER
+#define pUART_DLH              (volatile unsigned short *)UART_DLH
+#define pUART_IIR              (volatile unsigned short *)UART_IIR
+#define pUART_LCR              (volatile unsigned short *)UART_LCR
+#define pUART_MCR              (volatile unsigned short *)UART_MCR
+#define pUART_LSR              (volatile unsigned short *)UART_LSR
+#define pUART_MSR              (volatile unsigned short *)UART_MSR
+#define pUART_SCR              (volatile unsigned short *)UART_SCR
+#define pUART_GCTL             (volatile unsigned short *)UART_GCTL
+
+/* SPI Controller (0xFFC00500 - 0xFFC005FF) */
+#define pSPI_CTL               (volatile unsigned short *)SPI_CTL
+#define pSPI_FLG               (volatile unsigned short *)SPI_FLG
+#define pSPI_STAT              (volatile unsigned short *)SPI_STAT
+#define pSPI_TDBR              (volatile unsigned short *)SPI_TDBR
+#define pSPI_RDBR              (volatile unsigned short *)SPI_RDBR
+#define pSPI_BAUD              (volatile unsigned short *)SPI_BAUD
+#define pSPI_SHADOW            (volatile unsigned short *)SPI_SHADOW
+
+/* Timer 0-7 registers (0xFFC0 0600-0xFFC0 06FF) */
+#define pTIMER0_CONFIG         (volatile unsigned short *)TIMER0_CONFIG
+#define pTIMER0_COUNTER                (volatile unsigned long *)TIMER0_COUNTER
+#define pTIMER0_PERIOD         (volatile unsigned long *)TIMER0_PERIOD
+#define pTIMER0_WIDTH          (volatile unsigned long *)TIMER0_WIDTH
+#define pTIMER1_CONFIG         (volatile unsigned short *)TIMER1_CONFIG
+#define pTIMER1_COUNTER                (volatile unsigned long *)TIMER1_COUNTER
+#define pTIMER1_PERIOD         (volatile unsigned long *)TIMER1_PERIOD
+#define pTIMER1_WIDTH          (volatile unsigned long *)TIMER1_WIDTH
+#define pTIMER2_CONFIG         (volatile unsigned short *)TIMER2_CONFIG
+#define pTIMER2_COUNTER                (volatile unsigned long *)TIMER2_COUNTER
+#define pTIMER2_PERIOD         (volatile unsigned long *)TIMER2_PERIOD
+#define pTIMER2_WIDTH          (volatile unsigned long *)TIMER2_WIDTH
+#define pTIMER3_CONFIG         (volatile unsigned short *)TIMER3_CONFIG
+#define pTIMER3_COUNTER                (volatile unsigned long *)TIMER3_COUNTER
+#define pTIMER3_PERIOD         (volatile unsigned long *)TIMER3_PERIOD
+#define pTIMER3_WIDTH          (volatile unsigned long *)TIMER3_WIDTH
+#define pTIMER4_CONFIG         (volatile unsigned short *)TIMER4_CONFIG
+#define pTIMER4_COUNTER                (volatile unsigned long *)TIMER4_COUNTER
+#define pTIMER4_PERIOD         (volatile unsigned long *)TIMER4_PERIOD
+#define pTIMER4_WIDTH          (volatile unsigned long *)TIMER4_WIDTH
+#define pTIMER5_CONFIG         (volatile unsigned short *)TIMER5_CONFIG
+#define pTIMER5_COUNTER                (volatile unsigned long *)TIMER5_COUNTER
+#define pTIMER5_PERIOD         (volatile unsigned long *)TIMER5_PERIOD
+#define pTIMER5_WIDTH          (volatile unsigned long *)TIMER5_WIDTH
+#define pTIMER6_CONFIG         (volatile unsigned short *)TIMER6_CONFIG
+#define pTIMER6_COUNTER                (volatile unsigned long *)TIMER6_COUNTER
+#define pTIMER6_PERIOD         (volatile unsigned long *)TIMER6_PERIOD
+#define pTIMER6_WIDTH          (volatile unsigned long *)TIMER6_WIDTH
+#define pTIMER7_CONFIG         (volatile unsigned short *)TIMER7_CONFIG
+#define pTIMER7_COUNTER                (volatile unsigned long *)TIMER7_COUNTER
+#define pTIMER7_PERIOD         (volatile unsigned long *)TIMER7_PERIOD
+#define pTIMER7_WIDTH          (volatile unsigned long *)TIMER7_WIDTH
+
+/* Timer registers 8-11 (0xFFC0 1600-0xFFC0 16FF) */
+#define pTMRS8_ENABLE          (volatile unsigned short *)TMRS8_ENABLE
+#define pTMRS8_DISABLE         (volatile unsigned short *)TMRS8_DISABLE
+#define pTMRS8_STATUS          (volatile unsigned long *)TMRS8_STATUS
+#define pTIMER8_CONFIG         (volatile unsigned short *)TIMER8_CONFIG
+#define pTIMER8_COUNTER                (volatile unsigned long *)TIMER8_COUNTER
+#define pTIMER8_PERIOD         (volatile unsigned long *)TIMER8_PERIOD
+#define pTIMER8_WIDTH          (volatile unsigned long *)TIMER8_WIDTH
+#define pTIMER9_CONFIG         (volatile unsigned short *)TIMER9_CONFIG
+#define pTIMER9_COUNTER                (volatile unsigned long *)TIMER9_COUNTER
+#define pTIMER9_PERIOD         (volatile unsigned long *)TIMER9_PERIOD
+#define pTIMER9_WIDTH          (volatile unsigned long *)TIMER9_WIDTH
+#define pTIMER10_CONFIG                (volatile unsigned short *)TIMER10_CONFIG
+#define pTIMER10_COUNTER       (volatile unsigned long *)TIMER10_COUNTER
+#define pTIMER10_PERIOD                (volatile unsigned long *)TIMER10_PERIOD
+#define pTIMER10_WIDTH         (volatile unsigned long *)TIMER10_WIDTH
+#define pTIMER11_CONFIG                (volatile unsigned short *)TIMER11_CONFIG
+#define pTIMER11_COUNTER       (volatile unsigned long *)TIMER11_COUNTER
+#define pTIMER11_PERIOD                (volatile unsigned long *)TIMER11_PERIOD
+#define pTIMER11_WIDTH         (volatile unsigned long *)TIMER11_WIDTH
+#define pTMRS4_ENABLE          (volatile unsigned short *)TMRS4_ENABLE
+#define pTMRS4_DISABLE         (volatile unsigned short *)TMRS4_DISABLE
+#define pTMRS4_STATUS          (volatile unsigned long *)TMRS4_STATUS
+
+/* Programmable Flag 0 registers (0xFFC0 0700-0xFFC0 07FF) */
+#define pFIO0_FLAG_D           (volatile unsigned short *)FIO0_FLAG_D
+#define pFIO0_FLAG_C           (volatile unsigned short *)FIO0_FLAG_C
+#define pFIO0_FLAG_S           (volatile unsigned short *)FIO0_FLAG_S
+#define pFIO0_FLAG_T           (volatile unsigned short *)FIO0_FLAG_T
+#define pFIO0_MASKA_D          (volatile unsigned short *)FIO0_MASKA_D
+#define pFIO0_MASKA_C          (volatile unsigned short *)FIO0_MASKA_C
+#define pFIO0_MASKA_S          (volatile unsigned short *)FIO0_MASKA_S
+#define pFIO0_MASKA_T          (volatile unsigned short *)FIO0_MASKA_T
+#define pFIO0_MASKB_D          (volatile unsigned short *)FIO0_MASKB_D
+#define pFIO0_MASKB_C          (volatile unsigned short *)FIO0_MASKB_C
+#define pFIO0_MASKB_S          (volatile unsigned short *)FIO0_MASKB_S
+#define pFIO0_MASKB_T          (volatile unsigned short *)FIO0_MASKB_T
+#define pFIO0_DIR              (volatile unsigned short *)FIO0_DIR
+#define pFIO0_POLAR            (volatile unsigned short *)FIO0_POLAR
+#define pFIO0_EDGE             (volatile unsigned short *)FIO0_EDGE
+#define pFIO0_BOTH             (volatile unsigned short *)FIO0_BOTH
+#define pFIO0_INEN             (volatile unsigned short *)FIO0_INEN
+
+/* Programmable Flag 1 registers (0xFFC0 1500-0xFFC0 15FF) */
+#define pFIO1_FLAG_D           (volatile unsigned short *)FIO1_FLAG_D
+#define pFIO1_FLAG_C           (volatile unsigned short *)FIO1_FLAG_C
+#define pFIO1_FLAG_S           (volatile unsigned short *)FIO1_FLAG_S
+#define pFIO1_FLAG_T           (volatile unsigned short *)FIO1_FLAG_T
+#define pFIO1_MASKA_D          (volatile unsigned short *)FIO1_MASKA_D
+#define pFIO1_MASKA_C          (volatile unsigned short *)FIO1_MASKA_C
+#define pFIO1_MASKA_S          (volatile unsigned short *)FIO1_MASKA_S
+#define pFIO1_MASKA_T          (volatile unsigned short *)FIO1_MASKA_T
+#define pFIO1_MASKB_D          (volatile unsigned short *)FIO1_MASKB_D
+#define pFIO1_MASKB_C          (volatile unsigned short *)FIO1_MASKB_C
+#define pFIO1_MASKB_S          (volatile unsigned short *)FIO1_MASKB_S
+#define pFIO1_MASKB_T          (volatile unsigned short *)FIO1_MASKB_T
+#define pFIO1_DIR              (volatile unsigned short *)FIO1_DIR
+#define pFIO1_POLAR            (volatile unsigned short *)FIO1_POLAR
+#define pFIO1_EDGE             (volatile unsigned short *)FIO1_EDGE
+#define pFIO1_BOTH             (volatile unsigned short *)FIO1_BOTH
+#define pFIO1_INEN             (volatile unsigned short *)FIO1_INEN
+
+/* Programmable Flag registers (0xFFC0 1700-0xFFC0 17FF) */
+#define pFIO2_FLAG_D           (volatile unsigned short *)FIO2_FLAG_D
+#define pFIO2_FLAG_C           (volatile unsigned short *)FIO2_FLAG_C
+#define pFIO2_FLAG_S           (volatile unsigned short *)FIO2_FLAG_S
+#define pFIO2_FLAG_T           (volatile unsigned short *)FIO2_FLAG_T
+#define pFIO2_MASKA_D          (volatile unsigned short *)FIO2_MASKA_D
+#define pFIO2_MASKA_C          (volatile unsigned short *)FIO2_MASKA_C
+#define pFIO2_MASKA_S          (volatile unsigned short *)FIO2_MASKA_S
+#define pFIO2_MASKA_T          (volatile unsigned short *)FIO2_MASKA_T
+#define pFIO2_MASKB_D          (volatile unsigned short *)FIO2_MASKB_D
+#define pFIO2_MASKB_C          (volatile unsigned short *)FIO2_MASKB_C
+#define pFIO2_MASKB_S          (volatile unsigned short *)FIO2_MASKB_S
+#define pFIO2_MASKB_T          (volatile unsigned short *)FIO2_MASKB_T
+#define pFIO2_DIR              (volatile unsigned short *)FIO2_DIR
+#define pFIO2_POLAR            (volatile unsigned short *)FIO2_POLAR
+#define pFIO2_EDGE             (volatile unsigned short *)FIO2_EDGE
+#define pFIO2_BOTH             (volatile unsigned short *)FIO2_BOTH
+#define pFIO2_INEN             (volatile unsigned short *)FIO2_INEN
+
+/* SPORT0 Controller (0xFFC00800 - 0xFFC008FF) */
+#define pSPORT0_TCR1           (volatile unsigned short *)SPORT0_TCR1
+#define pSPORT0_TCR2           (volatile unsigned short *)SPORT0_TCR2
+#define pSPORT0_TCLKDIV                (volatile unsigned short *)SPORT0_TCLKDIV
+#define pSPORT0_TFSDIV         (volatile unsigned short *)SPORT0_TFSDIV
+#define pSPORT0_TX             (volatile unsigned long *)SPORT0_TX
+#define pSPORT0_RX             (volatile unsigned long *)SPORT0_RX
+#define pSPORT0_TX32           ((volatile long *)SPORT0_TX)
+#define pSPORT0_RX32           ((volatile long *)SPORT0_RX)
+#define pSPORT0_TX16           ((volatile unsigned short *)SPORT0_TX)
+#define pSPORT0_RX16           ((volatile unsigned short *)SPORT0_RX)
+#define pSPORT0_RCR1           (volatile unsigned short *)SPORT0_RCR1
+#define pSPORT0_RCR2           (volatile unsigned short *)SPORT0_RCR2
+#define pSPORT0_RCLKDIV                (volatile unsigned short *)SPORT0_RCLKDIV
+#define pSPORT0_RFSDIV         (volatile unsigned short *)SPORT0_RFSDIV
+#define pSPORT0_STAT           (volatile unsigned short *)SPORT0_STAT
+#define pSPORT0_CHNL           (volatile unsigned short *)SPORT0_CHNL
+#define pSPORT0_MCMC1          (volatile unsigned short *)SPORT0_MCMC1
+#define pSPORT0_MCMC2          (volatile unsigned short *)SPORT0_MCMC2
+#define pSPORT0_MTCS0          (volatile unsigned long *)SPORT0_MTCS0
+#define pSPORT0_MTCS1          (volatile unsigned long *)SPORT0_MTCS1
+#define pSPORT0_MTCS2          (volatile unsigned long *)SPORT0_MTCS2
+#define pSPORT0_MTCS3          (volatile unsigned long *)SPORT0_MTCS3
+#define pSPORT0_MRCS0          (volatile unsigned long *)SPORT0_MRCS0
+#define pSPORT0_MRCS1          (volatile unsigned long *)SPORT0_MRCS1
+#define pSPORT0_MRCS2          (volatile unsigned long *)SPORT0_MRCS2
+#define pSPORT0_MRCS3          (volatile unsigned long *)SPORT0_MRCS3
+
+/* SPORT1 Controller (0xFFC00900 - 0xFFC009FF) */
+#define pSPORT1_TCR1           (volatile unsigned short *)SPORT1_TCR1
+#define pSPORT1_TCR2           (volatile unsigned short *)SPORT1_TCR2
+#define pSPORT1_TCLKDIV                (volatile unsigned short *)SPORT1_TCLKDIV
+#define pSPORT1_TFSDIV         (volatile unsigned short *)SPORT1_TFSDIV
+#define pSPORT1_TX             (volatile unsigned long *)SPORT1_TX
+#define pSPORT1_RX             (volatile unsigned long *)SPORT1_RX
+#define pSPORT1_TX32           ((volatile long *)SPORT1_TX)
+#define pSPORT1_RX32           ((volatile long *)SPORT1_RX)
+#define pSPORT1_TX16           ((volatile unsigned short *)SPORT1_TX)
+#define pSPORT1_RX16           ((volatile unsigned short *)SPORT1_RX)
+#define pSPORT1_RCR1           (volatile unsigned short *)SPORT1_RCR1
+#define pSPORT1_RCR2           (volatile unsigned short *)SPORT1_RCR2
+#define pSPORT1_RCLKDIV                (volatile unsigned short *)SPORT1_RCLKDIV
+#define pSPORT1_RFSDIV         (volatile unsigned short *)SPORT1_RFSDIV
+#define pSPORT1_STAT           (volatile unsigned short *)SPORT1_STAT
+#define pSPORT1_CHNL           (volatile unsigned short *)SPORT1_CHNL
+#define pSPORT1_MCMC1          (volatile unsigned short *)SPORT1_MCMC1
+#define pSPORT1_MCMC2          (volatile unsigned short *)SPORT1_MCMC2
+#define pSPORT1_MTCS0          (volatile unsigned long *)SPORT1_MTCS0
+#define pSPORT1_MTCS1          (volatile unsigned long *)SPORT1_MTCS1
+#define pSPORT1_MTCS2          (volatile unsigned long *)SPORT1_MTCS2
+#define pSPORT1_MTCS3          (volatile unsigned long *)SPORT1_MTCS3
+#define pSPORT1_MRCS0          (volatile unsigned long *)SPORT1_MRCS0
+#define pSPORT1_MRCS1          (volatile unsigned long *)SPORT1_MRCS1
+#define pSPORT1_MRCS2          (volatile unsigned long *)SPORT1_MRCS2
+#define pSPORT1_MRCS3          (volatile unsigned long *)SPORT1_MRCS3
+
+/* Asynchronous Memory Controller - External Bus Interface Unit */
+#define pEBIU_AMGCTL           (volatile unsigned short *)EBIU_AMGCTL
+#define pEBIU_AMBCTL0          (volatile unsigned long *)EBIU_AMBCTL0
+#define pEBIU_AMBCTL1          (volatile unsigned long *)EBIU_AMBCTL1
+
+/* SDRAM Controller External Bus Interface Unit (0xFFC00A00 - 0xFFC00AFF) */
+#define pEBIU_SDGCTL           (volatile unsigned long *)EBIU_SDGCTL
+#define pEBIU_SDBCTL           (volatile unsigned long *)EBIU_SDBCTL
+#define pEBIU_SDRRC            (volatile unsigned short *)EBIU_SDRRC
+#define pEBIU_SDSTAT           (volatile unsigned short *)EBIU_SDSTAT
+
+/* Parallel Peripheral Interface (PPI) 0 registers (0xFFC0 1000-0xFFC0 10FF)*/
+#define pPPI0_CONTROL          (volatile unsigned short *)PPI0_CONTROL
+#define pPPI0_STATUS           (volatile unsigned short *)PPI0_STATUS
+#define pPPI0_COUNT            (volatile unsigned short *)PPI0_COUNT
+#define pPPI0_DELAY            (volatile unsigned short *)PPI0_DELAY
+#define pPPI0_FRAME            (volatile unsigned short *)PPI0_FRAME
+
+/* Parallel Peripheral Interface (PPI) 1 registers (0xFFC0 1300-0xFFC0 13FF)*/
+#define pPPI1_CONTROL          (volatile unsigned short *)PPI1_CONTROL
+#define pPPI1_STATUS           (volatile unsigned short *)PPI1_STATUS
+#define pPPI1_COUNT            (volatile unsigned short *)PPI1_COUNT
+#define pPPI1_DELAY            (volatile unsigned short *)PPI1_DELAY
+#define pPPI1_FRAME            (volatile unsigned short *)PPI1_FRAME
+
+/*DMA Traffic controls*/
+#define pDMA_TCPER             ((volatile unsigned short *)DMA_TCPER)
+#define pDMA_TCCNT             ((volatile unsigned short *)DMA_TCCNT)
+#define pDMA_TC_PER            ((volatile unsigned short *)DMA_TC_PER)
+#define pDMA_TC_CNT            ((volatile unsigned short *)DMA_TC_CNT)
+
+/* DMA1 Controller registers (0xFFC0 1C00-0xFFC0 1FFF) */
+#define pDMA1_0_CONFIG         (volatile unsigned short *)DMA1_0_CONFIG
+#define pDMA1_0_NEXT_DESC_PTR  (volatile void **)DMA1_0_NEXT_DESC_PTR
+#define pDMA1_0_START_ADDR     (volatile void **)DMA1_0_START_ADDR
+#define pDMA1_0_X_COUNT                (volatile unsigned short *)DMA1_0_X_COUNT
+#define pDMA1_0_Y_COUNT                (volatile unsigned short *)DMA1_0_Y_COUNT
+#define pDMA1_0_X_MODIFY       (volatile unsigned short *)DMA1_0_X_MODIFY
+#define pDMA1_0_Y_MODIFY       (volatile unsigned short *)DMA1_0_Y_MODIFY
+#define pDMA1_0_CURR_DESC_PTR  (volatile void **)DMA1_0_CURR_DESC_PTR
+#define pDMA1_0_CURR_ADDR      (volatile void **)DMA1_0_CURR_ADDR
+#define pDMA1_0_CURR_X_COUNT   (volatile unsigned short *)DMA1_0_CURR_X_COUNT
+#define pDMA1_0_CURR_Y_COUNT   (volatile unsigned short *)DMA1_0_CURR_Y_COUNT
+#define pDMA1_0_IRQ_STATUS     (volatile unsigned short *)DMA1_0_IRQ_STATUS
+#define pDMA1_0_PERIPHERAL_MAP (volatile unsigned short *)DMA1_0_PERIPHERAL_MAP
+#define pDMA1_1_CONFIG         (volatile unsigned short *)DMA1_1_CONFIG
+#define pDMA1_1_NEXT_DESC_PTR  (volatile void **)DMA1_1_NEXT_DESC_PTR
+#define pDMA1_1_START_ADDR     (volatile void **)DMA1_1_START_ADDR
+#define pDMA1_1_X_COUNT                (volatile unsigned short *)DMA1_1_X_COUNT
+#define pDMA1_1_Y_COUNT                (volatile unsigned short *)DMA1_1_Y_COUNT
+#define pDMA1_1_X_MODIFY       (volatile unsigned short *)DMA1_1_X_MODIFY
+#define pDMA1_1_Y_MODIFY       (volatile unsigned short *)DMA1_1_Y_MODIFY
+#define pDMA1_1_CURR_DESC_PTR  (volatile void **)DMA1_1_CURR_DESC_PTR
+#define pDMA1_1_CURR_ADDR      (volatile void **)DMA1_1_CURR_ADDR
+#define pDMA1_1_CURR_X_COUNT   (volatile unsigned short *)DMA1_1_CURR_X_COUNT
+#define pDMA1_1_CURR_Y_COUNT   (volatile unsigned short *)DMA1_1_CURR_Y_COUNT
+#define pDMA1_1_IRQ_STATUS     (volatile unsigned short *)DMA1_1_IRQ_STATUS
+#define pDMA1_1_PERIPHERAL_MAP (volatile unsigned short *)DMA1_1_PERIPHERAL_MAP
+#define pDMA1_2_CONFIG         (volatile unsigned short *)DMA1_2_CONFIG
+#define pDMA1_2_NEXT_DESC_PTR  (volatile void **)DMA1_2_NEXT_DESC_PTR
+#define pDMA1_2_START_ADDR     (volatile void **)DMA1_2_START_ADDR
+#define pDMA1_2_X_COUNT                (volatile unsigned short *)DMA1_2_X_COUNT
+#define pDMA1_2_Y_COUNT                (volatile unsigned short *)DMA1_2_Y_COUNT
+#define pDMA1_2_X_MODIFY       (volatile unsigned short *)DMA1_2_X_MODIFY
+#define pDMA1_2_Y_MODIFY       (volatile unsigned short *)DMA1_2_Y_MODIFY
+#define pDMA1_2_CURR_DESC_PTR  (volatile void **)DMA1_2_CURR_DESC_PTR
+#define pDMA1_2_CURR_ADDR      (volatile void **)DMA1_2_CURR_ADDR
+#define pDMA1_2_CURR_X_COUNT   (volatile unsigned short *)DMA1_2_CURR_X_COUNT
+#define pDMA1_2_CURR_Y_COUNT   (volatile unsigned short *)DMA1_2_CURR_Y_COUNT
+#define pDMA1_2_IRQ_STATUS     (volatile unsigned short *)DMA1_2_IRQ_STATUS
+#define pDMA1_2_PERIPHERAL_MAP (volatile unsigned short *)DMA1_2_PERIPHERAL_MAP
+#define pDMA1_3_CONFIG         (volatile unsigned short *)DMA1_3_CONFIG
+#define pDMA1_3_NEXT_DESC_PTR  (volatile void **)DMA1_3_NEXT_DESC_PTR
+#define pDMA1_3_START_ADDR     (volatile void **)DMA1_3_START_ADDR
+#define pDMA1_3_X_COUNT                (volatile unsigned short *)DMA1_3_X_COUNT
+#define pDMA1_3_Y_COUNT                (volatile unsigned short *)DMA1_3_Y_COUNT
+#define pDMA1_3_X_MODIFY       (volatile unsigned short *)DMA1_3_X_MODIFY
+#define pDMA1_3_Y_MODIFY       (volatile unsigned short *)DMA1_3_Y_MODIFY
+#define pDMA1_3_CURR_DESC_PTR  (volatile void **)DMA1_3_CURR_DESC_PTR
+#define pDMA1_3_CURR_ADDR      (volatile void **)DMA1_3_CURR_ADDR
+#define pDMA1_3_CURR_X_COUNT   (volatile unsigned short *)DMA1_3_CURR_X_COUNT
+#define pDMA1_3_CURR_Y_COUNT   (volatile unsigned short *)DMA1_3_CURR_Y_COUNT
+#define pDMA1_3_IRQ_STATUS     (volatile unsigned short *)DMA1_3_IRQ_STATUS
+#define pDMA1_3_PERIPHERAL_MAP (volatile unsigned short *)DMA1_3_PERIPHERAL_MAP
+#define pDMA1_4_CONFIG         (volatile unsigned short *)DMA1_4_CONFIG
+#define pDMA1_4_NEXT_DESC_PTR  (volatile void **)DMA1_4_NEXT_DESC_PTR
+#define pDMA1_4_START_ADDR     (volatile void **)DMA1_4_START_ADDR
+#define pDMA1_4_X_COUNT                (volatile unsigned short *)DMA1_4_X_COUNT
+#define pDMA1_4_Y_COUNT                (volatile unsigned short *)DMA1_4_Y_COUNT
+#define pDMA1_4_X_MODIFY       (volatile unsigned short *)DMA1_4_X_MODIFY
+#define pDMA1_4_Y_MODIFY       (volatile unsigned short *)DMA1_4_Y_MODIFY
+#define pDMA1_4_CURR_DESC_PTR  (volatile void **)DMA1_4_CURR_DESC_PTR
+#define pDMA1_4_CURR_ADDR      (volatile void **)DMA1_4_CURR_ADDR
+#define pDMA1_4_CURR_X_COUNT   (volatile unsigned short *)DMA1_4_CURR_X_COUNT
+#define pDMA1_4_CURR_Y_COUNT   (volatile unsigned short *)DMA1_4_CURR_Y_COUNT
+#define pDMA1_4_IRQ_STATUS     (volatile unsigned short *)DMA1_4_IRQ_STATUS
+#define pDMA1_4_PERIPHERAL_MAP (volatile unsigned short *)DMA1_4_PERIPHERAL_MAP
+#define pDMA1_5_CONFIG         (volatile unsigned short *)DMA1_5_CONFIG
+#define pDMA1_5_NEXT_DESC_PTR  (volatile void **)DMA1_5_NEXT_DESC_PTR
+#define pDMA1_5_START_ADDR     (volatile void **)DMA1_5_START_ADDR
+#define pDMA1_5_X_COUNT                (volatile unsigned short *)DMA1_5_X_COUNT
+#define pDMA1_5_Y_COUNT                (volatile unsigned short *)DMA1_5_Y_COUNT
+#define pDMA1_5_X_MODIFY       (volatile unsigned short *)DMA1_5_X_MODIFY
+#define pDMA1_5_Y_MODIFY       (volatile unsigned short *)DMA1_5_Y_MODIFY
+#define pDMA1_5_CURR_DESC_PTR  (volatile void **)DMA1_5_CURR_DESC_PTR
+#define pDMA1_5_CURR_ADDR      (volatile void **)DMA1_5_CURR_ADDR
+#define pDMA1_5_CURR_X_COUNT   (volatile unsigned short *)DMA1_5_CURR_X_COUNT
+#define pDMA1_5_CURR_Y_COUNT   (volatile unsigned short *)DMA1_5_CURR_Y_COUNT
+#define pDMA1_5_IRQ_STATUS     (volatile unsigned short *)DMA1_5_IRQ_STATUS
+#define pDMA1_5_PERIPHERAL_MAP (volatile unsigned short *)DMA1_5_PERIPHERAL_MAP
+#define pDMA1_6_CONFIG         (volatile unsigned short *)DMA1_6_CONFIG
+#define pDMA1_6_NEXT_DESC_PTR  (volatile void **)DMA1_6_NEXT_DESC_PTR
+#define pDMA1_6_START_ADDR     (volatile void **)DMA1_6_START_ADDR
+#define pDMA1_6_X_COUNT                (volatile unsigned short *)DMA1_6_X_COUNT
+#define pDMA1_6_Y_COUNT                (volatile unsigned short *)DMA1_6_Y_COUNT
+#define pDMA1_6_X_MODIFY       (volatile unsigned short *)DMA1_6_X_MODIFY
+#define pDMA1_6_Y_MODIFY       (volatile unsigned short *)DMA1_6_Y_MODIFY
+#define pDMA1_6_CURR_DESC_PTR  (volatile void **)DMA1_6_CURR_DESC_PTR
+#define pDMA1_6_CURR_ADDR      (volatile void **)DMA1_6_CURR_ADDR
+#define pDMA1_6_CURR_X_COUNT   (volatile unsigned short *)DMA1_6_CURR_X_COUNT
+#define pDMA1_6_CURR_Y_COUNT   (volatile unsigned short *)DMA1_6_CURR_Y_COUNT
+#define pDMA1_6_IRQ_STATUS     (volatile unsigned short *)DMA1_6_IRQ_STATUS
+#define pDMA1_6_PERIPHERAL_MAP (volatile unsigned short *)DMA1_6_PERIPHERAL_MAP
+#define pDMA1_7_CONFIG         (volatile unsigned short *)DMA1_7_CONFIG
+#define pDMA1_7_NEXT_DESC_PTR  (volatile void **)DMA1_7_NEXT_DESC_PTR
+#define pDMA1_7_START_ADDR     (volatile void **)DMA1_7_START_ADDR
+#define pDMA1_7_X_COUNT                (volatile unsigned short *)DMA1_7_X_COUNT
+#define pDMA1_7_Y_COUNT                (volatile unsigned short *)DMA1_7_Y_COUNT
+#define pDMA1_7_X_MODIFY       (volatile unsigned short *)DMA1_7_X_MODIFY
+#define pDMA1_7_Y_MODIFY       (volatile unsigned short *)DMA1_7_Y_MODIFY
+#define pDMA1_7_CURR_DESC_PTR  (volatile void **)DMA1_7_CURR_DESC_PTR
+#define pDMA1_7_CURR_ADDR      (volatile void **)DMA1_7_CURR_ADDR
+#define pDMA1_7_CURR_X_COUNT   (volatile unsigned short *)DMA1_7_CURR_X_COUNT
+#define pDMA1_7_CURR_Y_COUNT   (volatile unsigned short *)DMA1_7_CURR_Y_COUNT
+#define pDMA1_7_IRQ_STATUS     (volatile unsigned short *)DMA1_7_IRQ_STATUS
+#define pDMA1_7_PERIPHERAL_MAP (volatile unsigned short *)DMA1_7_PERIPHERAL_MAP
+#define pDMA1_8_CONFIG         (volatile unsigned short *)DMA1_8_CONFIG
+#define pDMA1_8_NEXT_DESC_PTR  (volatile void **)DMA1_8_NEXT_DESC_PTR
+#define pDMA1_8_START_ADDR     (volatile void **)DMA1_8_START_ADDR
+#define pDMA1_8_X_COUNT                (volatile unsigned short *)DMA1_8_X_COUNT
+#define pDMA1_8_Y_COUNT                (volatile unsigned short *)DMA1_8_Y_COUNT
+#define pDMA1_8_X_MODIFY       (volatile unsigned short *)DMA1_8_X_MODIFY
+#define pDMA1_8_Y_MODIFY       (volatile unsigned short *)DMA1_8_Y_MODIFY
+#define pDMA1_8_CURR_DESC_PTR  (volatile void **)DMA1_8_CURR_DESC_PTR
+#define pDMA1_8_CURR_ADDR      (volatile void **)DMA1_8_CURR_ADDR
+#define pDMA1_8_CURR_X_COUNT   (volatile unsigned short *)DMA1_8_CURR_X_COUNT
+#define pDMA1_8_CURR_Y_COUNT   (volatile unsigned short *)DMA1_8_CURR_Y_COUNT
+#define pDMA1_8_IRQ_STATUS     (volatile unsigned short *)DMA1_8_IRQ_STATUS
+#define pDMA1_8_PERIPHERAL_MAP (volatile unsigned short *)DMA1_8_PERIPHERAL_MAP
+#define pDMA1_9_CONFIG         (volatile unsigned short *)DMA1_9_CONFIG
+#define pDMA1_9_NEXT_DESC_PTR  (volatile void **)DMA1_9_NEXT_DESC_PTR
+#define pDMA1_9_START_ADDR     (volatile void **)DMA1_9_START_ADDR
+#define pDMA1_9_X_COUNT                (volatile unsigned short *)DMA1_9_X_COUNT
+#define pDMA1_9_Y_COUNT                (volatile unsigned short *)DMA1_9_Y_COUNT
+#define pDMA1_9_X_MODIFY       (volatile unsigned short *)DMA1_9_X_MODIFY
+#define pDMA1_9_Y_MODIFY       (volatile unsigned short *)DMA1_9_Y_MODIFY
+#define pDMA1_9_CURR_DESC_PTR  (volatile void **)DMA1_9_CURR_DESC_PTR
+#define pDMA1_9_CURR_ADDR      (volatile void **)DMA1_9_CURR_ADDR
+#define pDMA1_9_CURR_X_COUNT   (volatile unsigned short *)DMA1_9_CURR_X_COUNT
+#define pDMA1_9_CURR_Y_COUNT   (volatile unsigned short *)DMA1_9_CURR_Y_COUNT
+#define pDMA1_9_IRQ_STATUS     (volatile unsigned short *)DMA1_9_IRQ_STATUS
+#define pDMA1_9_PERIPHERAL_MAP (volatile unsigned short *)DMA1_9_PERIPHERAL_MAP
+#define pDMA1_10_CONFIG                (volatile unsigned short *)DMA1_10_CONFIG
+#define pDMA1_10_NEXT_DESC_PTR (volatile void **)DMA1_10_NEXT_DESC_PTR
+#define pDMA1_10_START_ADDR    (volatile void **)DMA1_10_START_ADDR
+#define pDMA1_10_X_COUNT       (volatile unsigned short *)DMA1_10_X_COUNT
+#define pDMA1_10_Y_COUNT       (volatile unsigned short *)DMA1_10_Y_COUNT
+#define pDMA1_10_X_MODIFY      (volatile unsigned short *)DMA1_10_X_MODIFY
+#define pDMA1_10_Y_MODIFY      (volatile unsigned short *)DMA1_10_Y_MODIFY
+#define pDMA1_10_CURR_DESC_PTR (volatile void **)DMA1_10_CURR_DESC_PTR
+#define pDMA1_10_CURR_ADDR     (volatile void **)DMA1_10_CURR_ADDR
+#define pDMA1_10_CURR_X_COUNT  (volatile unsigned short *)DMA1_10_CURR_X_COUNT
+#define pDMA1_10_CURR_Y_COUNT  (volatile unsigned short *)DMA1_10_CURR_Y_COUNT
+#define pDMA1_10_IRQ_STATUS    (volatile unsigned short *)DMA1_10_IRQ_STATUS
+#define pDMA1_10_PERIPHERAL_MAP (volatile unsigned short *)DMA1_10_PERIPHERAL_MAP
+#define pDMA1_11_CONFIG                (volatile unsigned short *)DMA1_11_CONFIG
+#define pDMA1_11_NEXT_DESC_PTR (volatile void **)DMA1_11_NEXT_DESC_PTR
+#define pDMA1_11_START_ADDR    (volatile void **)DMA1_11_START_ADDR
+#define pDMA1_11_X_COUNT       (volatile unsigned short *)DMA1_11_X_COUNT
+#define pDMA1_11_Y_COUNT       (volatile unsigned short *)DMA1_11_Y_COUNT
+#define pDMA1_11_X_MODIFY      (volatile signed short *)DMA1_11_X_MODIFY
+#define pDMA1_11_Y_MODIFY      (volatile signed short *)DMA1_11_Y_MODIFY
+#define pDMA1_11_CURR_DESC_PTR (volatile void **)DMA1_11_CURR_DESC_PTR
+#define pDMA1_11_CURR_ADDR     (volatile void **)DMA1_11_CURR_ADDR
+#define pDMA1_11_CURR_X_COUNT  (volatile unsigned short *)DMA1_11_CURR_X_COUNT
+#define pDMA1_11_CURR_Y_COUNT  (volatile unsigned short *)DMA1_11_CURR_Y_COUNT
+#define pDMA1_11_IRQ_STATUS    (volatile unsigned short *)DMA1_11_IRQ_STATUS
+#define pDMA1_11_PERIPHERAL_MAP (volatile unsigned short *)DMA1_11_PERIPHERAL_MAP
+
+/* Memory DMA1 Controller registers (0xFFC0 1E80-0xFFC0 1FFF)*/
+#define pMDMA1_D0_CONFIG       (volatile unsigned short *)MDMA1_D0_CONFIG
+#define pMDMA1_D0_NEXT_DESC_PTR (volatile void **)MDMA1_D0_NEXT_DESC_PTR
+#define pMDMA1_D0_START_ADDR   (volatile void **)MDMA1_D0_START_ADDR
+#define pMDMA1_D0_X_COUNT      (volatile unsigned short *)MDMA1_D0_X_COUNT
+#define pMDMA1_D0_Y_COUNT      (volatile unsigned short *)MDMA1_D0_Y_COUNT
+#define pMDMA1_D0_X_MODIFY     (volatile signed short *)MDMA1_D0_X_MODIFY
+#define pMDMA1_D0_Y_MODIFY     (volatile signed short *)MDMA1_D0_Y_MODIFY
+#define pMDMA1_D0_CURR_DESC_PTR (volatile void **)MDMA1_D0_CURR_DESC_PTR
+#define pMDMA1_D0_CURR_ADDR    (volatile void **)MDMA1_D0_CURR_ADDR
+#define pMDMA1_D0_CURR_X_COUNT (volatile unsigned short *)MDMA1_D0_CURR_X_COUNT
+#define pMDMA1_D0_CURR_Y_COUNT (volatile unsigned short *)MDMA1_D0_CURR_Y_COUNT
+#define pMDMA1_D0_IRQ_STATUS   (volatile unsigned short *)MDMA1_D0_IRQ_STATUS
+#define pMDMA1_D0_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_D0_PERIPHERAL_MAP
+#define pMDMA1_S0_CONFIG       (volatile unsigned short *)MDMA1_S0_CONFIG
+#define pMDMA1_S0_NEXT_DESC_PTR (volatile void **)MDMA1_S0_NEXT_DESC_PTR
+#define pMDMA1_S0_START_ADDR   (volatile void **)MDMA1_S0_START_ADDR
+#define pMDMA1_S0_X_COUNT      (volatile unsigned short *)MDMA1_S0_X_COUNT
+#define pMDMA1_S0_Y_COUNT      (volatile unsigned short *)MDMA1_S0_Y_COUNT
+#define pMDMA1_S0_X_MODIFY     (volatile signed short *)MDMA1_S0_X_MODIFY
+#define pMDMA1_S0_Y_MODIFY     (volatile signed short *)MDMA1_S0_Y_MODIFY
+#define pMDMA1_S0_CURR_DESC_PTR (volatile void **)MDMA1_S0_CURR_DESC_PTR
+#define pMDMA1_S0_CURR_ADDR    (volatile void **)MDMA1_S0_CURR_ADDR
+#define pMDMA1_S0_CURR_X_COUNT (volatile unsigned short *)MDMA1_S0_CURR_X_COUNT
+#define pMDMA1_S0_CURR_Y_COUNT (volatile unsigned short *)MDMA1_S0_CURR_Y_COUNT
+#define pMDMA1_S0_IRQ_STATUS   (volatile unsigned short *)MDMA1_S0_IRQ_STATUS
+#define pMDMA1_S0_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_S0_PERIPHERAL_MAP
+#define pMDMA1_D1_CONFIG       (volatile unsigned short *)MDMA1_D1_CONFIG
+#define pMDMA1_D1_NEXT_DESC_PTR (volatile void **)MDMA1_D1_NEXT_DESC_PTR
+#define pMDMA1_D1_START_ADDR   (volatile void **)MDMA1_D1_START_ADDR
+#define pMDMA1_D1_X_COUNT      (volatile unsigned short *)MDMA1_D1_X_COUNT
+#define pMDMA1_D1_Y_COUNT      (volatile unsigned short *)MDMA1_D1_Y_COUNT
+#define pMDMA1_D1_X_MODIFY     (volatile signed short *)MDMA1_D1_X_MODIFY
+#define pMDMA1_D1_Y_MODIFY     (volatile signed short *)MDMA1_D1_Y_MODIFY
+#define pMDMA1_D1_CURR_DESC_PTR (volatile void **)MDMA1_D1_CURR_DESC_PTR
+#define pMDMA1_D1_CURR_ADDR    (volatile void **)MDMA1_D1_CURR_ADDR
+#define pMDMA1_D1_CURR_X_COUNT (volatile unsigned short *)MDMA1_D1_CURR_X_COUNT
+#define pMDMA1_D1_CURR_Y_COUNT (volatile unsigned short *)MDMA1_D1_CURR_Y_COUNT
+#define pMDMA1_D1_IRQ_STATUS   (volatile unsigned short *)MDMA1_D1_IRQ_STATUS
+#define pMDMA1_D1_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_D1_PERIPHERAL_MAP
+#define pMDMA1_S1_CONFIG       (volatile unsigned short *)MDMA1_S1_CONFIG
+#define pMDMA1_S1_NEXT_DESC_PTR (volatile void **)MDMA1_S1_NEXT_DESC_PTR
+#define pMDMA1_S1_START_ADDR   (volatile void **)MDMA1_S1_START_ADDR
+#define pMDMA1_S1_X_COUNT      (volatile unsigned short *)MDMA1_S1_X_COUNT
+#define pMDMA1_S1_Y_COUNT      (volatile unsigned short *)MDMA1_S1_Y_COUNT
+#define pMDMA1_S1_X_MODIFY     (volatile signed short *)MDMA1_S1_X_MODIFY
+#define pMDMA1_S1_Y_MODIFY     (volatile signed short *)MDMA1_S1_Y_MODIFY
+#define pMDMA1_S1_CURR_DESC_PTR (volatile void **)MDMA1_S1_CURR_DESC_PTR
+#define pMDMA1_S1_CURR_ADDR    (volatile void **)MDMA1_S1_CURR_ADDR
+#define pMDMA1_S1_CURR_X_COUNT (volatile unsigned short *)MDMA1_S1_CURR_X_COUNT
+#define pMDMA1_S1_CURR_Y_COUNT (volatile unsigned short *)MDMA1_S1_CURR_Y_COUNT
+#define pMDMA1_S1_IRQ_STATUS   (volatile unsigned short *)MDMA1_S1_IRQ_STATUS
+#define pMDMA1_S1_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_S1_PERIPHERAL_MAP
+
+/* DMA2 Controller registers (0xFFC0 0C00-0xFFC0 0DFF) */
+#define pDMA2_0_CONFIG         (volatile unsigned short *)DMA2_0_CONFIG
+#define pDMA2_0_NEXT_DESC_PTR  (volatile void **)DMA2_0_NEXT_DESC_PTR
+#define pDMA2_0_START_ADDR     (volatile void **)DMA2_0_START_ADDR
+#define pDMA2_0_X_COUNT                (volatile unsigned short *)DMA2_0_X_COUNT
+#define pDMA2_0_Y_COUNT                (volatile unsigned short *)DMA2_0_Y_COUNT
+#define pDMA2_0_X_MODIFY       (volatile signed short *)DMA2_0_X_MODIFY
+#define pDMA2_0_Y_MODIFY       (volatile signed short *)DMA2_0_Y_MODIFY
+#define pDMA2_0_CURR_DESC_PTR  (volatile void **)DMA2_0_CURR_DESC_PTR
+#define pDMA2_0_CURR_ADDR      (volatile void **)DMA2_0_CURR_ADDR
+#define pDMA2_0_CURR_X_COUNT   (volatile unsigned short *)DMA2_0_CURR_X_COUNT
+#define pDMA2_0_CURR_Y_COUNT   (volatile unsigned short *)DMA2_0_CURR_Y_COUNT
+#define pDMA2_0_IRQ_STATUS     (volatile unsigned short *)DMA2_0_IRQ_STATUS
+#define pDMA2_0_PERIPHERAL_MAP (volatile unsigned short *)DMA2_0_PERIPHERAL_MAP
+#define pDMA2_1_CONFIG         (volatile unsigned short *)DMA2_1_CONFIG
+#define pDMA2_1_NEXT_DESC_PTR  (volatile void **)DMA2_1_NEXT_DESC_PTR
+#define pDMA2_1_START_ADDR     (volatile void **)DMA2_1_START_ADDR
+#define pDMA2_1_X_COUNT                (volatile unsigned short *)DMA2_1_X_COUNT
+#define pDMA2_1_Y_COUNT                (volatile unsigned short *)DMA2_1_Y_COUNT
+#define pDMA2_1_X_MODIFY       (volatile signed short *)DMA2_1_X_MODIFY
+#define pDMA2_1_Y_MODIFY       (volatile signed short *)DMA2_1_Y_MODIFY
+#define pDMA2_1_CURR_DESC_PTR  (volatile void **)DMA2_1_CURR_DESC_PTR
+#define pDMA2_1_CURR_ADDR      (volatile void **)DMA2_1_CURR_ADDR
+#define pDMA2_1_CURR_X_COUNT   (volatile unsigned short *)DMA2_1_CURR_X_COUNT
+#define pDMA2_1_CURR_Y_COUNT   (volatile unsigned short *)DMA2_1_CURR_Y_COUNT
+#define pDMA2_1_IRQ_STATUS     (volatile unsigned short *)DMA2_1_IRQ_STATUS
+#define pDMA2_1_PERIPHERAL_MAP (volatile unsigned short *)DMA2_1_PERIPHERAL_MAP
+#define pDMA2_2_CONFIG         (volatile unsigned short *)DMA2_2_CONFIG
+#define pDMA2_2_NEXT_DESC_PTR  (volatile void **)DMA2_2_NEXT_DESC_PTR
+#define pDMA2_2_START_ADDR     (volatile void **)DMA2_2_START_ADDR
+#define pDMA2_2_X_COUNT                (volatile unsigned short *)DMA2_2_X_COUNT
+#define pDMA2_2_Y_COUNT                (volatile unsigned short *)DMA2_2_Y_COUNT
+#define pDMA2_2_X_MODIFY       (volatile signed short *)DMA2_2_X_MODIFY
+#define pDMA2_2_Y_MODIFY       (volatile signed short *)DMA2_2_Y_MODIFY
+#define pDMA2_2_CURR_DESC_PTR  (volatile void **)DMA2_2_CURR_DESC_PTR
+#define pDMA2_2_CURR_ADDR      (volatile void **)DMA2_2_CURR_ADDR
+#define pDMA2_2_CURR_X_COUNT   (volatile unsigned short *)DMA2_2_CURR_X_COUNT
+#define pDMA2_2_CURR_Y_COUNT   (volatile unsigned short *)DMA2_2_CURR_Y_COUNT
+#define pDMA2_2_IRQ_STATUS     (volatile unsigned short *)DMA2_2_IRQ_STATUS
+#define pDMA2_2_PERIPHERAL_MAP (volatile unsigned short *)DMA2_2_PERIPHERAL_MAP
+#define pDMA2_3_CONFIG         (volatile unsigned short *)DMA2_3_CONFIG
+#define pDMA2_3_NEXT_DESC_PTR  (volatile void **)DMA2_3_NEXT_DESC_PTR
+#define pDMA2_3_START_ADDR     (volatile void **)DMA2_3_START_ADDR
+#define pDMA2_3_X_COUNT                (volatile unsigned short *)DMA2_3_X_COUNT
+#define pDMA2_3_Y_COUNT                (volatile unsigned short *)DMA2_3_Y_COUNT
+#define pDMA2_3_X_MODIFY       (volatile signed short *)DMA2_3_X_MODIFY
+#define pDMA2_3_Y_MODIFY       (volatile signed short *)DMA2_3_Y_MODIFY
+#define pDMA2_3_CURR_DESC_PTR  (volatile void **)DMA2_3_CURR_DESC_PTR
+#define pDMA2_3_CURR_ADDR      (volatile void **)DMA2_3_CURR_ADDR
+#define pDMA2_3_CURR_X_COUNT   (volatile unsigned short *)DMA2_3_CURR_X_COUNT
+#define pDMA2_3_CURR_Y_COUNT   (volatile unsigned short *)DMA2_3_CURR_Y_COUNT
+#define pDMA2_3_IRQ_STATUS     (volatile unsigned short *)DMA2_3_IRQ_STATUS
+#define pDMA2_3_PERIPHERAL_MAP (volatile unsigned short *)DMA2_3_PERIPHERAL_MAP
+#define pDMA2_4_CONFIG         (volatile unsigned short *)DMA2_4_CONFIG
+#define pDMA2_4_NEXT_DESC_PTR  (volatile void **)DMA2_4_NEXT_DESC_PTR
+#define pDMA2_4_START_ADDR     (volatile void **)DMA2_4_START_ADDR
+#define pDMA2_4_X_COUNT                (volatile unsigned short *)DMA2_4_X_COUNT
+#define pDMA2_4_Y_COUNT                (volatile unsigned short *)DMA2_4_Y_COUNT
+#define pDMA2_4_X_MODIFY       (volatile signed short *)DMA2_4_X_MODIFY
+#define pDMA2_4_Y_MODIFY       (volatile signed short *)DMA2_4_Y_MODIFY
+#define pDMA2_4_CURR_DESC_PTR  (volatile void **)DMA2_4_CURR_DESC_PTR
+#define pDMA2_4_CURR_ADDR      (volatile void **)DMA2_4_CURR_ADDR
+#define pDMA2_4_CURR_X_COUNT   (volatile unsigned short *)DMA2_4_CURR_X_COUNT
+#define pDMA2_4_CURR_Y_COUNT   (volatile unsigned short *)DMA2_4_CURR_Y_COUNT
+#define pDMA2_4_IRQ_STATUS     (volatile unsigned short *)DMA2_4_IRQ_STATUS
+#define pDMA2_4_PERIPHERAL_MAP (volatile unsigned short *)DMA2_4_PERIPHERAL_MAP
+#define pDMA2_5_CONFIG         (volatile unsigned short *)DMA2_5_CONFIG
+#define pDMA2_5_NEXT_DESC_PTR  (volatile void **)DMA2_5_NEXT_DESC_PTR
+#define pDMA2_5_START_ADDR     (volatile void **)DMA2_5_START_ADDR
+#define pDMA2_5_X_COUNT                (volatile unsigned short *)DMA2_5_X_COUNT
+#define pDMA2_5_Y_COUNT                (volatile unsigned short *)DMA2_5_Y_COUNT
+#define pDMA2_5_X_MODIFY       (volatile signed short *)DMA2_5_X_MODIFY
+#define pDMA2_5_Y_MODIFY       (volatile signed short *)DMA2_5_Y_MODIFY
+#define pDMA2_5_CURR_DESC_PTR  (volatile void **)DMA2_5_CURR_DESC_PTR
+#define pDMA2_5_CURR_ADDR      (volatile void **)DMA2_5_CURR_ADDR
+#define pDMA2_5_CURR_X_COUNT   (volatile unsigned short *)DMA2_5_CURR_X_COUNT
+#define pDMA2_5_CURR_Y_COUNT   (volatile unsigned short *)DMA2_5_CURR_Y_COUNT
+#define pDMA2_5_IRQ_STATUS     (volatile unsigned short *)DMA2_5_IRQ_STATUS
+#define pDMA2_5_PERIPHERAL_MAP (volatile unsigned short *)DMA2_5_PERIPHERAL_MAP
+#define pDMA2_6_CONFIG         (volatile unsigned short *)DMA2_6_CONFIG
+#define pDMA2_6_NEXT_DESC_PTR  (volatile void **)DMA2_6_NEXT_DESC_PTR
+#define pDMA2_6_START_ADDR     (volatile void **)DMA2_6_START_ADDR
+#define pDMA2_6_X_COUNT                (volatile unsigned short *)DMA2_6_X_COUNT
+#define pDMA2_6_Y_COUNT                (volatile unsigned short *)DMA2_6_Y_COUNT
+#define pDMA2_6_X_MODIFY       (volatile signed short *)DMA2_6_X_MODIFY
+#define pDMA2_6_Y_MODIFY       (volatile signed short *)DMA2_6_Y_MODIFY
+#define pDMA2_6_CURR_DESC_PTR  (volatile void **)DMA2_6_CURR_DESC_PTR
+#define pDMA2_6_CURR_ADDR      (volatile void **)DMA2_6_CURR_ADDR
+#define pDMA2_6_CURR_X_COUNT   (volatile unsigned short *)DMA2_6_CURR_X_COUNT
+#define pDMA2_6_CURR_Y_COUNT   (volatile unsigned short *)DMA2_6_CURR_Y_COUNT
+#define pDMA2_6_IRQ_STATUS     (volatile unsigned short *)DMA2_6_IRQ_STATUS
+#define pDMA2_6_PERIPHERAL_MAP (volatile unsigned short *)DMA2_6_PERIPHERAL_MAP
+#define pDMA2_7_CONFIG         (volatile unsigned short *)DMA2_7_CONFIG
+#define pDMA2_7_NEXT_DESC_PTR  (volatile void **)DMA2_7_NEXT_DESC_PTR
+#define pDMA2_7_START_ADDR     (volatile void **)DMA2_7_START_ADDR
+#define pDMA2_7_X_COUNT                (volatile unsigned short *)DMA2_7_X_COUNT
+#define pDMA2_7_Y_COUNT                (volatile unsigned short *)DMA2_7_Y_COUNT
+#define pDMA2_7_X_MODIFY       (volatile signed short *)DMA2_7_X_MODIFY
+#define pDMA2_7_Y_MODIFY       (volatile signed short *)DMA2_7_Y_MODIFY
+#define pDMA2_7_CURR_DESC_PTR  (volatile void **)DMA2_7_CURR_DESC_PTR
+#define pDMA2_7_CURR_ADDR      (volatile void **)DMA2_7_CURR_ADDR
+#define pDMA2_7_CURR_X_COUNT   (volatile unsigned short *)DMA2_7_CURR_X_COUNT
+#define pDMA2_7_CURR_Y_COUNT   (volatile unsigned short *)DMA2_7_CURR_Y_COUNT
+#define pDMA2_7_IRQ_STATUS     (volatile unsigned short *)DMA2_7_IRQ_STATUS
+#define pDMA2_7_PERIPHERAL_MAP (volatile unsigned short *)DMA2_7_PERIPHERAL_MAP
+#define pDMA2_8_CONFIG         (volatile unsigned short *)DMA2_8_CONFIG
+#define pDMA2_8_NEXT_DESC_PTR  (volatile void **)DMA2_8_NEXT_DESC_PTR
+#define pDMA2_8_START_ADDR     (volatile void **)DMA2_8_START_ADDR
+#define pDMA2_8_X_COUNT                (volatile unsigned short *)DMA2_8_X_COUNT
+#define pDMA2_8_Y_COUNT                (volatile unsigned short *)DMA2_8_Y_COUNT
+#define pDMA2_8_X_MODIFY       (volatile signed short *)DMA2_8_X_MODIFY
+#define pDMA2_8_Y_MODIFY       (volatile signed short *)DMA2_8_Y_MODIFY
+#define pDMA2_8_CURR_DESC_PTR  (volatile void **)DMA2_8_CURR_DESC_PTR
+#define pDMA2_8_CURR_ADDR      (volatile void **)DMA2_8_CURR_ADDR
+#define pDMA2_8_CURR_X_COUNT   (volatile unsigned short *)DMA2_8_CURR_X_COUNT
+#define pDMA2_8_CURR_Y_COUNT   (volatile unsigned short *)DMA2_8_CURR_Y_COUNT
+#define pDMA2_8_IRQ_STATUS     (volatile unsigned short *)DMA2_8_IRQ_STATUS
+#define pDMA2_8_PERIPHERAL_MAP (volatile unsigned short *)DMA2_8_PERIPHERAL_MAP
+#define pDMA2_9_CONFIG         (volatile unsigned short *)DMA2_9_CONFIG
+#define pDMA2_9_NEXT_DESC_PTR  (volatile void **)DMA2_9_NEXT_DESC_PTR
+#define pDMA2_9_START_ADDR     (volatile void **)DMA2_9_START_ADDR
+#define pDMA2_9_X_COUNT                (volatile unsigned short *)DMA2_9_X_COUNT
+#define pDMA2_9_Y_COUNT                (volatile unsigned short *)DMA2_9_Y_COUNT
+#define pDMA2_9_X_MODIFY       (volatile signed short *)DMA2_9_X_MODIFY
+#define pDMA2_9_Y_MODIFY       (volatile signed short *)DMA2_9_Y_MODIFY
+#define pDMA2_9_CURR_DESC_PTR  (volatile void **)DMA2_9_CURR_DESC_PTR
+#define pDMA2_9_CURR_ADDR      (volatile void **)DMA2_9_CURR_ADDR
+#define pDMA2_9_CURR_X_COUNT   (volatile unsigned short *)DMA2_9_CURR_X_COUNT
+#define pDMA2_9_CURR_Y_COUNT   (volatile unsigned short *)DMA2_9_CURR_Y_COUNT
+#define pDMA2_9_IRQ_STATUS     (volatile unsigned short *)DMA2_9_IRQ_STATUS
+#define pDMA2_9_PERIPHERAL_MAP (volatile unsigned short *)DMA2_9_PERIPHERAL_MAP
+#define pDMA2_10_CONFIG                (volatile unsigned short *)DMA2_10_CONFIG
+#define pDMA2_10_NEXT_DESC_PTR (volatile void **)DMA2_10_NEXT_DESC_PTR
+#define pDMA2_10_START_ADDR    (volatile void **)DMA2_10_START_ADDR
+#define pDMA2_10_X_COUNT       (volatile unsigned short *)DMA2_10_X_COUNT
+#define pDMA2_10_Y_COUNT       (volatile unsigned short *)DMA2_10_Y_COUNT
+#define pDMA2_10_X_MODIFY      (volatile signed short *)DMA2_10_X_MODIFY
+#define pDMA2_10_Y_MODIFY      (volatile signed short *)DMA2_10_Y_MODIFY
+#define pDMA2_10_CURR_DESC_PTR (volatile void **)DMA2_10_CURR_DESC_PTR
+#define pDMA2_10_CURR_ADDR     (volatile void **)DMA2_10_CURR_ADDR
+#define pDMA2_10_CURR_X_COUNT  (volatile unsigned short *)DMA2_10_CURR_X_COUNT
+#define pDMA2_10_CURR_Y_COUNT  (volatile unsigned short *)DMA2_10_CURR_Y_COUNT
+#define pDMA2_10_IRQ_STATUS    (volatile unsigned short *)DMA2_10_IRQ_STATUS
+#define pDMA2_10_PERIPHERAL_MAP (volatile unsigned short *)DMA2_10_PERIPHERAL_MAP
+#define pDMA2_11_CONFIG                (volatile unsigned short *)DMA2_11_CONFIG
+#define pDMA2_11_NEXT_DESC_PTR (volatile void **)DMA2_11_NEXT_DESC_PTR
+#define pDMA2_11_START_ADDR    (volatile void **)DMA2_11_START_ADDR
+#define pDMA2_11_X_COUNT       (volatile unsigned short *)DMA2_11_X_COUNT
+#define pDMA2_11_Y_COUNT       (volatile unsigned short *)DMA2_11_Y_COUNT
+#define pDMA2_11_X_MODIFY      (volatile signed short *)DMA2_11_X_MODIFY
+#define pDMA2_11_Y_MODIFY      (volatile signed short *)DMA2_11_Y_MODIFY
+#define pDMA2_11_CURR_DESC_PTR (volatile void **)DMA2_11_CURR_DESC_PTR
+#define pDMA2_11_CURR_ADDR     (volatile void **)DMA2_11_CURR_ADDR
+#define pDMA2_11_CURR_X_COUNT  (volatile unsigned short *)DMA2_11_CURR_X_COUNT
+#define pDMA2_11_CURR_Y_COUNT  (volatile unsigned short *)DMA2_11_CURR_Y_COUNT
+#define pDMA2_11_IRQ_STATUS    (volatile unsigned short *)DMA2_11_IRQ_STATUS
+#define pDMA2_11_PERIPHERAL_MAP (volatile unsigned short *)DMA2_11_PERIPHERAL_MAP
+
+/* Memory DMA2 Controller registers (0xFFC0 0E80-0xFFC0 0FFF) */
+#define pMDMA2_D0_CONFIG       (volatile unsigned short *)MDMA2_D0_CONFIG
+#define pMDMA2_D0_NEXT_DESC_PTR (volatile void **)MDMA2_D0_NEXT_DESC_PTR
+#define pMDMA2_D0_START_ADDR   (volatile void **)MDMA2_D0_START_ADDR
+#define pMDMA2_D0_X_COUNT      (volatile unsigned short *)MDMA2_D0_X_COUNT
+#define pMDMA2_D0_Y_COUNT      (volatile unsigned short *)MDMA2_D0_Y_COUNT
+#define pMDMA2_D0_X_MODIFY     (volatile signed short *)MDMA2_D0_X_MODIFY
+#define pMDMA2_D0_Y_MODIFY     (volatile signed short *)MDMA2_D0_Y_MODIFY
+#define pMDMA2_D0_CURR_DESC_PTR (volatile void **)MDMA2_D0_CURR_DESC_PTR
+#define pMDMA2_D0_CURR_ADDR    (volatile void **)MDMA2_D0_CURR_ADDR
+#define pMDMA2_D0_CURR_X_COUNT (volatile unsigned short *)MDMA2_D0_CURR_X_COUNT
+#define pMDMA2_D0_CURR_Y_COUNT (volatile unsigned short *)MDMA2_D0_CURR_Y_COUNT
+#define pMDMA2_D0_IRQ_STATUS   (volatile unsigned short *)MDMA2_D0_IRQ_STATUS
+#define pMDMA2_D0_PERIPHERAL_MAP (volatile unsigned short *)MDMA2_D0_PERIPHERAL_MAP
+#define pMDMA2_S0_CONFIG       (volatile unsigned short *)MDMA2_S0_CONFIG
+#define pMDMA2_S0_NEXT_DESC_PTR (volatile void **)MDMA2_S0_NEXT_DESC_PTR
+#define pMDMA2_S0_START_ADDR   (volatile void **)MDMA2_S0_START_ADDR
+#define pMDMA2_S0_X_COUNT      (volatile unsigned short *)MDMA2_S0_X_COUNT
+#define pMDMA2_S0_Y_COUNT      (volatile unsigned short *)MDMA2_S0_Y_COUNT
+#define pMDMA2_S0_X_MODIFY     (volatile signed short *)MDMA2_S0_X_MODIFY
+#define pMDMA2_S0_Y_MODIFY     (volatile signed short *)MDMA2_S0_Y_MODIFY
+#define pMDMA2_S0_CURR_DESC_PTR (volatile void **)MDMA2_S0_CURR_DESC_PTR
+#define pMDMA2_S0_CURR_ADDR    (volatile void **)MDMA2_S0_CURR_ADDR
+#define pMDMA2_S0_CURR_X_COUNT (volatile unsigned short *)MDMA2_S0_CURR_X_COUNT
+#define pMDMA2_S0_CURR_Y_COUNT (volatile unsigned short *)MDMA2_S0_CURR_Y_COUNT
+#define pMDMA2_S0_IRQ_STATUS   (volatile unsigned short *)MDMA2_S0_IRQ_STATUS
+#define pMDMA2_S0_PERIPHERAL_MAP (volatile unsigned short *)MDMA2_S0_PERIPHERAL_MAP
+#define pMDMA2_D1_CONFIG       (volatile unsigned short *)MDMA2_D1_CONFIG
+#define pMDMA2_D1_NEXT_DESC_PTR (volatile void **)MDMA2_D1_NEXT_DESC_PTR
+#define pMDMA2_D1_START_ADDR   (volatile void **)MDMA2_D1_START_ADDR
+#define pMDMA2_D1_X_COUNT      (volatile unsigned short *)MDMA2_D1_X_COUNT
+#define pMDMA2_D1_Y_COUNT      (volatile unsigned short *)MDMA2_D1_Y_COUNT
+#define pMDMA2_D1_X_MODIFY     (volatile signed short *)MDMA2_D1_X_MODIFY
+#define pMDMA2_D1_Y_MODIFY     (volatile signed short *)MDMA2_D1_Y_MODIFY
+#define pMDMA2_D1_CURR_DESC_PTR (volatile void **)MDMA2_D1_CURR_DESC_PTR
+#define pMDMA2_D1_CURR_ADDR    (volatile void **)MDMA2_D1_CURR_ADDR
+#define pMDMA2_D1_CURR_X_COUNT (volatile unsigned short *)MDMA2_D1_CURR_X_COUNT
+#define pMDMA2_D1_CURR_Y_COUNT (volatile unsigned short *)MDMA2_D1_CURR_Y_COUNT
+#define pMDMA2_D1_IRQ_STATUS   (volatile unsigned short *)MDMA2_D1_IRQ_STATUS
+#define pMDMA2_D1_PERIPHERAL_MAP (volatile unsigned short *)MDMA2_D1_PERIPHERAL_MAP
+#define pMDMA2_S1_CONFIG       (volatile unsigned short *)MDMA2_S1_CONFIG
+#define pMDMA2_S1_NEXT_DESC_PTR (volatile void **)MDMA2_S1_NEXT_DESC_PTR
+#define pMDMA2_S1_START_ADDR   (volatile void **)MDMA2_S1_START_ADDR
+#define pMDMA2_S1_X_COUNT      (volatile unsigned short *)MDMA2_S1_X_COUNT
+#define pMDMA2_S1_Y_COUNT      (volatile unsigned short *)MDMA2_S1_Y_COUNT
+#define pMDMA2_S1_X_MODIFY     (volatile signed short *)MDMA2_S1_X_MODIFY
+#define pMDMA2_S1_Y_MODIFY     (volatile signed short *)MDMA2_S1_Y_MODIFY
+#define pMDMA2_S1_CURR_DESC_PTR (volatile void **)MDMA2_S1_CURR_DESC_PTR
+#define pMDMA2_S1_CURR_ADDR    (volatile void **)MDMA2_S1_CURR_ADDR
+#define pMDMA2_S1_CURR_X_COUNT (volatile unsigned short *)MDMA2_S1_CURR_X_COUNT
+#define pMDMA2_S1_CURR_Y_COUNT (volatile unsigned short *)MDMA2_S1_CURR_Y_COUNT
+#define pMDMA2_S1_IRQ_STATUS   (volatile unsigned short *)MDMA2_S1_IRQ_STATUS
+#define pMDMA2_S1_PERIPHERAL_MAP (volatile unsigned short *)MDMA2_S1_PERIPHERAL_MAP
+
+/* Internal Memory DMA Registers (0xFFC0_1800 - 0xFFC0_19FF) */
+#define pIMDMA_D0_CONFIG       (volatile unsigned short *)IMDMA_D0_CONFIG
+#define pIMDMA_D0_NEXT_DESC_PTR (volatile void **)IMDMA_D0_NEXT_DESC_PTR
+#define pIMDMA_D0_START_ADDR   (volatile void **)IMDMA_D0_START_ADDR
+#define pIMDMA_D0_X_COUNT      (volatile unsigned short *)IMDMA_D0_X_COUNT
+#define pIMDMA_D0_Y_COUNT      (volatile unsigned short *)IMDMA_D0_Y_COUNT
+#define pIMDMA_D0_X_MODIFY     (volatile signed short *)IMDMA_D0_X_MODIFY
+#define pIMDMA_D0_Y_MODIFY     (volatile signed short *)IMDMA_D0_Y_MODIFY
+#define pIMDMA_D0_CURR_DESC_PTR (volatile void **)IMDMA_D0_CURR_DESC_PTR
+#define pIMDMA_D0_CURR_ADDR    (volatile void **)IMDMA_D0_CURR_ADDR
+#define pIMDMA_D0_CURR_X_COUNT (volatile unsigned short *)IMDMA_D0_CURR_X_COUNT
+#define pIMDMA_D0_CURR_Y_COUNT (volatile unsigned short *)IMDMA_D0_CURR_Y_COUNT
+#define pIMDMA_D0_IRQ_STATUS   (volatile unsigned short *)IMDMA_D0_IRQ_STATUS
+#define pIMDMA_S0_CONFIG       (volatile unsigned short *)IMDMA_S0_CONFIG
+#define pIMDMA_S0_NEXT_DESC_PTR (volatile void **)IMDMA_S0_NEXT_DESC_PTR
+#define pIMDMA_S0_START_ADDR   (volatile void **)IMDMA_S0_START_ADDR
+#define pIMDMA_S0_X_COUNT      (volatile unsigned short *)IMDMA_S0_X_COUNT
+#define pIMDMA_S0_Y_COUNT      (volatile unsigned short *)IMDMA_S0_Y_COUNT
+#define pIMDMA_S0_X_MODIFY     (volatile signed short *)IMDMA_S0_X_MODIFY
+#define pIMDMA_S0_Y_MODIFY     (volatile signed short *)IMDMA_S0_Y_MODIFY
+#define pIMDMA_S0_CURR_DESC_PTR (volatile void **)IMDMA_S0_CURR_DESC_PTR
+#define pIMDMA_S0_CURR_ADDR    (volatile void **)IMDMA_S0_CURR_ADDR
+#define pIMDMA_S0_CURR_X_COUNT (volatile unsigned short *)IMDMA_S0_CURR_X_COUNT
+#define pIMDMA_S0_CURR_Y_COUNT (volatile unsigned short *)IMDMA_S0_CURR_Y_COUNT
+#define pIMDMA_S0_IRQ_STATUS   (volatile unsigned short *)IMDMA_S0_IRQ_STATUS
+#define pIMDMA_D1_CONFIG       (volatile unsigned short *)IMDMA_D1_CONFIG
+#define pIMDMA_D1_NEXT_DESC_PTR (volatile void **)IMDMA_D1_NEXT_DESC_PTR
+#define pIMDMA_D1_START_ADDR   (volatile void **)IMDMA_D1_START_ADDR
+#define pIMDMA_D1_X_COUNT      (volatile unsigned short *)IMDMA_D1_X_COUNT
+#define pIMDMA_D1_Y_COUNT      (volatile unsigned short *)IMDMA_D1_Y_COUNT
+#define pIMDMA_D1_X_MODIFY     (volatile signed short *)IMDMA_D1_X_MODIFY
+#define pIMDMA_D1_Y_MODIFY     (volatile signed short *)IMDMA_D1_Y_MODIFY
+#define pIMDMA_D1_CURR_DESC_PTR (volatile void **)IMDMA_D1_CURR_DESC_PTR
+#define pIMDMA_D1_CURR_ADDR    (volatile void **)IMDMA_D1_CURR_ADDR
+#define pIMDMA_D1_CURR_X_COUNT (volatile unsigned short *)IMDMA_D1_CURR_X_COUNT
+#define pIMDMA_D1_CURR_Y_COUNT (volatile unsigned short *)IMDMA_D1_CURR_Y_COUNT
+#define pIMDMA_D1_IRQ_STATUS   (volatile unsigned short *)IMDMA_D1_IRQ_STATUS
+#define pIMDMA_S1_CONFIG       (volatile unsigned short *)IMDMA_S1_CONFIG
+#define pIMDMA_S1_NEXT_DESC_PTR (volatile void **)IMDMA_S1_NEXT_DESC_PTR
+#define pIMDMA_S1_START_ADDR   (volatile void **)IMDMA_S1_START_ADDR
+#define pIMDMA_S1_X_COUNT      (volatile unsigned short *)IMDMA_S1_X_COUNT
+#define pIMDMA_S1_Y_COUNT      (volatile unsigned short *)IMDMA_S1_Y_COUNT
+#define pIMDMA_S1_X_MODIFY     (volatile signed short *)IMDMA_S1_X_MODIFY
+#define pIMDMA_S1_Y_MODIFY     (volatile signed short *)IMDMA_S1_Y_MODIFY
+#define pIMDMA_S1_CURR_DESC_PTR (volatile void **)IMDMA_S1_CURR_DESC_PTR
+#define pIMDMA_S1_CURR_ADDR    (volatile void **)IMDMA_S1_CURR_ADDR
+#define pIMDMA_S1_CURR_X_COUNT (volatile unsigned short *)IMDMA_S1_CURR_X_COUNT
+#define pIMDMA_S1_CURR_Y_COUNT (volatile unsigned short *)IMDMA_S1_CURR_Y_COUNT
+#define pIMDMA_S1_IRQ_STATUS   (volatile unsigned short *)IMDMA_S1_IRQ_STATUS
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * core A (0xFFC0 0100-0xFFC0 01FF)
+ */
+#define pSWRST                 (volatile unsigned short *)SICA_SWRST
+#define pSYSCR                 (volatile unsigned short *)SICA_SYSCR
+#define pRVECT                 (volatile unsigned short *)SICA_RVECT
+#define pSIC_SWRST             (volatile unsigned short *)SICA_SWRST
+#define pSIC_SYSCR             (volatile unsigned short *)SICA_SYSCR
+#define pSIC_RVECT             (volatile unsigned short *)SICA_RVECT
+#define pSIC_IMASK             (volatile unsigned long *)SICA_IMASK
+#define pSIC_IAR0              ((volatile unsigned long *)SICA_IAR0)
+#define pSIC_IAR1              (volatile unsigned long *)SICA_IAR1
+#define pSIC_IAR2              (volatile unsigned long *)SICA_IAR2
+#define pSIC_ISR               (volatile unsigned long *)SICA_ISR0
+#define pSIC_IWR               (volatile unsigned long *)SICA_IWR0
+
+/* Watchdog Timer registers for Core A (0xFFC0 0200-0xFFC0 02FF) */
+#define pWDOG_CTL              (volatile unsigned short *)WDOGA_CTL
+#define pWDOG_CNT              (volatile unsigned long *)WDOGA_CNT
+#define pWDOG_STAT             (volatile unsigned long *)WDOGA_STAT
+
+/* Programmable Flag 0 registers (0xFFC0 0700-0xFFC0 07FF) */
+#define pFIO_FLAG_D            (volatile unsigned short *)FIO0_FLAG_D
+#define pFIO_FLAG_C            (volatile unsigned short *)FIO0_FLAG_C
+#define pFIO_FLAG_S            (volatile unsigned short *)FIO0_FLAG_S
+#define pFIO_FLAG_T            (volatile unsigned short *)FIO0_FLAG_T
+#define pFIO_MASKA_D           (volatile unsigned short *)FIO0_MASKA_D
+#define pFIO_MASKA_C           (volatile unsigned short *)FIO0_MASKA_C
+#define pFIO_MASKA_S           (volatile unsigned short *)FIO0_MASKA_S
+#define pFIO_MASKA_T           (volatile unsigned short *)FIO0_MASKA_T
+#define pFIO_MASKB_D           (volatile unsigned short *)FIO0_MASKB_D
+#define pFIO_MASKB_C           (volatile unsigned short *)FIO0_MASKB_C
+#define pFIO_MASKB_S           (volatile unsigned short *)FIO0_MASKB_S
+#define pFIO_MASKB_T           (volatile unsigned short *)FIO0_MASKB_T
+#define pFIO_DIR               (volatile unsigned short *)FIO0_DIR
+#define pFIO_POLAR             (volatile unsigned short *)FIO0_POLAR
+#define pFIO_EDGE              (volatile unsigned short *)FIO0_EDGE
+#define pFIO_BOTH              (volatile unsigned short *)FIO0_BOTH
+#define pFIO_INEN              (volatile unsigned short *)FIO0_INEN
+
+/* Parallel Peripheral Interface (PPI) 0 registers (0xFFC0 1000-0xFFC0 10FF)*/
+#define pPPI_CONTROL           (volatile unsigned short *)PPI0_CONTROL
+#define pPPI_STATUS            (volatile unsigned short *)PPI0_STATUS
+#define pPPI_COUNT             (volatile unsigned short *)PPI0_COUNT
+#define pPPI_DELAY             (volatile unsigned short *)PPI0_DELAY
+#define pPPI_FRAME             (volatile unsigned short *)PPI0_FRAME
+
+/* DMA1 Controller registers (0xFFC0 1C00-0xFFC0 1FFF) */
+#define pDMA0_CONFIG           (volatile unsigned short *)DMA1_0_CONFIG
+#define pDMA0_NEXT_DESC_PTR    (volatile void **)DMA1_0_NEXT_DESC_PTR
+#define pDMA0_START_ADDR       (volatile void **)DMA1_0_START_ADDR
+#define pDMA0_X_COUNT          (volatile unsigned short *)DMA1_0_X_COUNT
+#define pDMA0_Y_COUNT          (volatile unsigned short *)DMA1_0_Y_COUNT
+#define pDMA0_X_MODIFY         (volatile unsigned short *)DMA1_0_X_MODIFY
+#define pDMA0_Y_MODIFY         (volatile unsigned short *)DMA1_0_Y_MODIFY
+#define pDMA0_CURR_DESC_PTR    (volatile void **)DMA1_0_CURR_DESC_PTR
+#define pDMA0_CURR_ADDR                (volatile void **)DMA1_0_CURR_ADDR
+#define pDMA0_CURR_X_COUNT     (volatile unsigned short *)DMA1_0_CURR_X_COUNT
+#define pDMA0_CURR_Y_COUNT     (volatile unsigned short *)DMA1_0_CURR_Y_COUNT
+#define pDMA0_IRQ_STATUS       (volatile unsigned short *)DMA1_0_IRQ_STATUS
+#define pDMA0_PERIPHERAL_MAP   (volatile unsigned short *)DMA1_0_PERIPHERAL_MAP
+
+/* Memory DMA1 Controller registers (0xFFC0 1E80-0xFFC0 1FFF) */
+#define pMDMA_D0_CONFIG                (volatile unsigned short *)MDMA1_D0_CONFIG
+#define pMDMA_D0_NEXT_DESC_PTR (volatile void **)MDMA1_D0_NEXT_DESC_PTR
+#define pMDMA_D0_START_ADDR    (volatile void **)MDMA1_D0_START_ADDR
+#define pMDMA_D0_X_COUNT       (volatile unsigned short *)MDMA1_D0_X_COUNT
+#define pMDMA_D0_Y_COUNT       (volatile unsigned short *)MDMA1_D0_Y_COUNT
+#define pMDMA_D0_X_MODIFY      (volatile unsigned short *)MDMA1_D0_X_MODIFY
+#define pMDMA_D0_Y_MODIFY      (volatile unsigned short *)MDMA1_D0_Y_MODIFY
+#define pMDMA_D0_CURR_DESC_PTR (volatile void **)MDMA1_D0_CURR_DESC_PTR
+#define pMDMA_D0_CURR_ADDR     (volatile void **)MDMA1_D0_CURR_ADDR
+#define pMDMA_D0_CURR_X_COUNT  (volatile unsigned short *)MDMA1_D0_CURR_X_COUNT
+#define pMDMA_D0_CURR_Y_COUNT  (volatile unsigned short *)MDMA1_D0_CURR_Y_COUNT
+#define pMDMA_D0_IRQ_STATUS    (volatile unsigned short *)MDMA1_D0_IRQ_STATUS
+#define pMDMA_D0_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_D0_PERIPHERAL_MAP
+#define pMDMA_S0_CONFIG                (volatile unsigned short *)MDMA1_S0_CONFIG
+#define pMDMA_S0_NEXT_DESC_PTR (volatile void **)MDMA1_S0_NEXT_DESC_PTR
+#define pMDMA_S0_START_ADDR    (volatile void **)MDMA1_S0_START_ADDR
+#define pMDMA_S0_X_COUNT       (volatile unsigned short *)MDMA1_S0_X_COUNT
+#define pMDMA_S0_Y_COUNT       (volatile unsigned short *)MDMA1_S0_Y_COUNT
+#define pMDMA_S0_X_MODIFY      (volatile unsigned short *)MDMA1_S0_X_MODIFY
+#define pMDMA_S0_Y_MODIFY      (volatile unsigned short *)MDMA1_S0_Y_MODIFY
+#define pMDMA_S0_CURR_DESC_PTR (volatile void **)MDMA1_S0_CURR_DESC_PTR
+#define pMDMA_S0_CURR_ADDR     (volatile void **)MDMA1_S0_CURR_ADDR
+#define pMDMA_S0_CURR_X_COUNT  (volatile unsigned short *)MDMA1_S0_CURR_X_COUNT
+#define pMDMA_S0_CURR_Y_COUNT  (volatile unsigned short *)MDMA1_S0_CURR_Y_COUNT
+#define pMDMA_S0_IRQ_STATUS    (volatile unsigned short *)MDMA1_S0_IRQ_STATUS
+#define pMDMA_S0_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_S0_PERIPHERAL_MAP
+#define pMDMA_D1_CONFIG                (volatile unsigned short *)MDMA1_D1_CONFIG
+#define pMDMA_D1_NEXT_DESC_PTR (volatile void **)MDMA1_D1_NEXT_DESC_PTR
+#define pMDMA_D1_START_ADDR    (volatile void **)MDMA1_D1_START_ADDR
+#define pMDMA_D1_X_COUNT       (volatile unsigned short *)MDMA1_D1_X_COUNT
+#define pMDMA_D1_Y_COUNT       (volatile unsigned short *)MDMA1_D1_Y_COUNT
+#define pMDMA_D1_X_MODIFY      (volatile unsigned short *)MDMA1_D1_X_MODIFY
+#define pMDMA_D1_Y_MODIFY      (volatile unsigned short *)MDMA1_D1_Y_MODIFY
+#define pMDMA_D1_CURR_DESC_PTR (volatile void **)MDMA1_D1_CURR_DESC_PTR
+#define pMDMA_D1_CURR_ADDR     (volatile void **)MDMA1_D1_CURR_ADDR
+#define pMDMA_D1_CURR_X_COUNT  (volatile unsigned short *)MDMA1_D1_CURR_X_COUNT
+#define pMDMA_D1_CURR_Y_COUNT  (volatile unsigned short *)MDMA1_D1_CURR_Y_COUNT
+#define pMDMA_D1_IRQ_STATUS    (volatile unsigned short *)MDMA1_D1_IRQ_STATUS
+#define pMDMA_D1_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_D1_PERIPHERAL_MAP
+#define pMDMA_S1_CONFIG                (volatile unsigned short *)MDMA1_S1_CONFIG
+#define pMDMA_S1_NEXT_DESC_PTR (volatile void **)MDMA1_S1_NEXT_DESC_PTR
+#define pMDMA_S1_START_ADDR    (volatile void **)MDMA1_S1_START_ADDR
+#define pMDMA_S1_X_COUNT       (volatile unsigned short *)MDMA1_S1_X_COUNT
+#define pMDMA_S1_Y_COUNT       (volatile unsigned short *)MDMA1_S1_Y_COUNT
+#define pMDMA_S1_X_MODIFY      (volatile unsigned short *)MDMA1_S1_X_MODIFY
+#define pMDMA_S1_Y_MODIFY      (volatile unsigned short *)MDMA1_S1_Y_MODIFY
+#define pMDMA_S1_CURR_DESC_PTR (volatile void **)MDMA1_S1_CURR_DESC_PTR
+#define pMDMA_S1_CURR_ADDR     (volatile void **)MDMA1_S1_CURR_ADDR
+#define pMDMA_S1_CURR_X_COUNT  (volatile unsigned short *)MDMA1_S1_CURR_X_COUNT
+#define pMDMA_S1_CURR_Y_COUNT  (volatile unsigned short *)MDMA1_S1_CURR_Y_COUNT
+#define pMDMA_S1_IRQ_STATUS    (volatile unsigned short *)MDMA1_S1_IRQ_STATUS
+#define pMDMA_S1_PERIPHERAL_MAP (volatile unsigned short *)MDMA1_S1_PERIPHERAL_MAP
+
+/* DMA2 Controller registers (0xFFC0 0C00-0xFFC0 0DFF) */
+#define pDMA1_CONFIG           (volatile unsigned short *)DMA2_0_CONFIG
+#define pDMA1_NEXT_DESC_PTR    (volatile void **)DMA2_0_NEXT_DESC_PTR
+#define pDMA1_START_ADDR       (volatile void **)DMA2_0_START_ADDR
+#define pDMA1_X_COUNT          (volatile unsigned short *)DMA2_0_X_COUNT
+#define pDMA1_Y_COUNT          (volatile unsigned short *)DMA2_0_Y_COUNT
+#define pDMA1_X_MODIFY         (volatile unsigned short *)DMA2_0_X_MODIFY
+#define pDMA1_Y_MODIFY         (volatile unsigned short *)DMA2_0_Y_MODIFY
+#define pDMA1_CURR_DESC_PTR    (volatile void **)DMA2_0_CURR_DESC_PTR
+#define pDMA1_CURR_ADDR                (volatile void **)DMA2_0_CURR_ADDR
+#define pDMA1_CURR_X_COUNT     (volatile unsigned short *)DMA2_0_CURR_X_COUNT
+#define pDMA1_CURR_Y_COUNT     (volatile unsigned short *)DMA2_0_CURR_Y_COUNT
+#define pDMA1_IRQ_STATUS       (volatile unsigned short *)DMA2_0_IRQ_STATUS
+#define pDMA1_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_0_PERIPHERAL_MAP
+#define pDMA2_CONFIG           (volatile unsigned short *)DMA2_1_CONFIG
+#define pDMA2_NEXT_DESC_PTR    (volatile void **)DMA2_1_NEXT_DESC_PTR
+#define pDMA2_START_ADDR       (volatile void **)DMA2_1_START_ADDR
+#define pDMA2_X_COUNT          (volatile unsigned short *)DMA2_1_X_COUNT
+#define pDMA2_Y_COUNT          (volatile unsigned short *)DMA2_1_Y_COUNT
+#define pDMA2_X_MODIFY         (volatile unsigned short *)DMA2_1_X_MODIFY
+#define pDMA2_Y_MODIFY         (volatile unsigned short *)DMA2_1_Y_MODIFY
+#define pDMA2_CURR_DESC_PTR    (volatile void **)DMA2_1_CURR_DESC_PTR
+#define pDMA2_CURR_ADDR                (volatile void **)DMA2_1_CURR_ADDR
+#define pDMA2_CURR_X_COUNT     (volatile unsigned short *)DMA2_1_CURR_X_COUNT
+#define pDMA2_CURR_Y_COUNT     (volatile unsigned short *)DMA2_1_CURR_Y_COUNT
+#define pDMA2_IRQ_STATUS       (volatile unsigned short *)DMA2_1_IRQ_STATUS
+#define pDMA2_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_1_PERIPHERAL_MAP
+#define pDMA3_CONFIG           (volatile unsigned short *)DMA2_2_CONFIG
+#define pDMA3_NEXT_DESC_PTR    (volatile void **)DMA2_2_NEXT_DESC_PTR
+#define pDMA3_START_ADDR       (volatile void **)DMA2_2_START_ADDR
+#define pDMA3_X_COUNT          (volatile unsigned short *)DMA2_2_X_COUNT
+#define pDMA3_Y_COUNT          (volatile unsigned short *)DMA2_2_Y_COUNT
+#define pDMA3_X_MODIFY         (volatile unsigned short *)DMA2_2_X_MODIFY
+#define pDMA3_Y_MODIFY         (volatile unsigned short *)DMA2_2_Y_MODIFY
+#define pDMA3_CURR_DESC_PTR    (volatile void **)DMA2_2_CURR_DESC_PTR
+#define pDMA3_CURR_ADDR                (volatile void **)DMA2_2_CURR_ADDR
+#define pDMA3_CURR_X_COUNT     (volatile unsigned short *)DMA2_2_CURR_X_COUNT
+#define pDMA3_CURR_Y_COUNT     (volatile unsigned short *)DMA2_2_CURR_Y_COUNT
+#define pDMA3_IRQ_STATUS       (volatile unsigned short *)DMA2_2_IRQ_STATUS
+#define pDMA3_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_2_PERIPHERAL_MAP
+#define pDMA4_CONFIG           (volatile unsigned short *)DMA2_3_CONFIG
+#define pDMA4_NEXT_DESC_PTR    (volatile void **)DMA2_3_NEXT_DESC_PTR
+#define pDMA4_START_ADDR       (volatile void **)DMA2_3_START_ADDR
+#define pDMA4_X_COUNT          (volatile unsigned short *)DMA2_3_X_COUNT
+#define pDMA4_Y_COUNT          (volatile unsigned short *)DMA2_3_Y_COUNT
+#define pDMA4_X_MODIFY         (volatile unsigned short *)DMA2_3_X_MODIFY
+#define pDMA4_Y_MODIFY         (volatile unsigned short *)DMA2_3_Y_MODIFY
+#define pDMA4_CURR_DESC_PTR    (volatile void **)DMA2_3_CURR_DESC_PTR
+#define pDMA4_CURR_ADDR                (volatile void **)DMA2_3_CURR_ADDR
+#define pDMA4_CURR_X_COUNT     (volatile unsigned short *)DMA2_3_CURR_X_COUNT
+#define pDMA4_CURR_Y_COUNT     (volatile unsigned short *)DMA2_3_CURR_Y_COUNT
+#define pDMA4_IRQ_STATUS       (volatile unsigned short *)DMA2_3_IRQ_STATUS
+#define pDMA4_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_3_PERIPHERAL_MAP
+#define pDMA5_CONFIG           (volatile unsigned short *)DMA2_4_CONFIG
+#define pDMA5_NEXT_DESC_PTR    (volatile void **)DMA2_4_NEXT_DESC_PTR
+#define pDMA5_START_ADDR       (volatile void **)DMA2_4_START_ADDR
+#define pDMA5_X_COUNT          (volatile unsigned short *)DMA2_4_X_COUNT
+#define pDMA5_Y_COUNT          (volatile unsigned short *)DMA2_4_Y_COUNT
+#define pDMA5_X_MODIFY         (volatile unsigned short *)DMA2_4_X_MODIFY
+#define pDMA5_Y_MODIFY         (volatile unsigned short *)DMA2_4_Y_MODIFY
+#define pDMA5_CURR_DESC_PTR    (volatile void **)DMA2_4_CURR_DESC_PTR
+#define pDMA5_CURR_ADDR                (volatile void **)DMA2_4_CURR_ADDR
+#define pDMA5_CURR_X_COUNT     (volatile unsigned short *)DMA2_4_CURR_X_COUNT
+#define pDMA5_CURR_Y_COUNT     (volatile unsigned short *)DMA2_4_CURR_Y_COUNT
+#define pDMA5_IRQ_STATUS       (volatile unsigned short *)DMA2_4_IRQ_STATUS
+#define pDMA5_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_4_PERIPHERAL_MAP
+#define pDMA6_CONFIG           (volatile unsigned short *)DMA2_5_CONFIG
+#define pDMA6_NEXT_DESC_PTR    (volatile void **)DMA2_5_NEXT_DESC_PTR
+#define pDMA6_START_ADDR       (volatile void **)DMA2_5_START_ADDR
+#define pDMA6_X_COUNT          (volatile unsigned short *)DMA2_5_X_COUNT
+#define pDMA6_Y_COUNT          (volatile unsigned short *)DMA2_5_Y_COUNT
+#define pDMA6_X_MODIFY         (volatile unsigned short *)DMA2_5_X_MODIFY
+#define pDMA6_Y_MODIFY         (volatile unsigned short *)DMA2_5_Y_MODIFY
+#define pDMA6_CURR_DESC_PTR    (volatile void **)DMA2_5_CURR_DESC_PTR
+#define pDMA6_CURR_ADDR                (volatile void **)DMA2_5_CURR_ADDR
+#define pDMA6_CURR_X_COUNT     (volatile unsigned short *)DMA2_5_CURR_X_COUNT
+#define pDMA6_CURR_Y_COUNT     (volatile unsigned short *)DMA2_5_CURR_Y_COUNT
+#define pDMA6_IRQ_STATUS       (volatile unsigned short *)DMA2_5_IRQ_STATUS
+#define pDMA6_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_5_PERIPHERAL_MAP
+#define pDMA7_CONFIG           (volatile unsigned short *)DMA2_6_CONFIG
+#define pDMA7_NEXT_DESC_PTR    (volatile void **)DMA2_6_NEXT_DESC_PTR
+#define pDMA7_START_ADDR       (volatile void **)DMA2_6_START_ADDR
+#define pDMA7_X_COUNT          (volatile unsigned short *)DMA2_6_X_COUNT
+#define pDMA7_Y_COUNT          (volatile unsigned short *)DMA2_6_Y_COUNT
+#define pDMA7_X_MODIFY         (volatile unsigned short *)DMA2_6_X_MODIFY
+#define pDMA7_Y_MODIFY         (volatile unsigned short *)DMA2_6_Y_MODIFY
+#define pDMA7_CURR_DESC_PTR    (volatile void **)DMA2_6_CURR_DESC_PTR
+#define pDMA7_CURR_ADDR                (volatile void **)DMA2_6_CURR_ADDR
+#define pDMA7_CURR_X_COUNT     (volatile unsigned short *)DMA2_6_CURR_X_COUNT
+#define pDMA7_CURR_Y_COUNT     (volatile unsigned short *)DMA2_6_CURR_Y_COUNT
+#define pDMA7_IRQ_STATUS       (volatile unsigned short *)DMA2_6_IRQ_STATUS
+#define pDMA7_PERIPHERAL_MAP   (volatile unsigned short *)DMA2_6_PERIPHERAL_MAP
+
+#endif                         /* _CDEF_BF561_H */
diff --git a/include/asm-blackfin/arch-bf561/defBF561.h b/include/asm-blackfin/arch-bf561/defBF561.h
new file mode 100644 (file)
index 0000000..c6e3de5
--- /dev/null
@@ -0,0 +1,1941 @@
+/*
+ * defBF561.h
+ *
+ * (c) Copyright 2001-2003 Analog Devices, Inc.  All rights reserved.
+ *
+ */
+
+/* SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 */
+
+#ifndef _DEF_BF561_H
+#define _DEF_BF561_H
+
+/*
+ * #if !defined(__ADSPBF561__)
+ * #warning defBF561.h should only be included for BF561 chip.
+ * #endif
+ */
+
+/* include all Core registers and bit definitions */
+#include <asm/arch-common/def_LPBlackfin.h>
+
+/*
+ * Helper macros
+ * usage:
+ * P0.H = HI(UART_THR);
+ * P0.L = LO(UART_THR);
+ */
+
+#define LO(con32) ((con32) & 0xFFFF)
+#define lo(con32) ((con32) & 0xFFFF)
+#define HI(con32) (((con32) >> 16) & 0xFFFF)
+#define hi(con32) (((con32) >> 16) & 0xFFFF)
+
+/*
+ * System MMR Register Map
+ */
+
+/* Clock and System Control (0xFFC00000 - 0xFFC000FF) */
+#define PLL_CTL                        0xFFC00000      /* PLL Control register */
+#define PLL_DIV                        0xFFC00004      /* PLL Divide Register */
+#define VR_CTL                 0xFFC00008      /* Voltage Regulator Control Register */
+#define PLL_STAT               0xFFC0000C      /* PLL Status register */
+#define PLL_LOCKCNT            0xFFC00010      /* PLL Lock Count register */
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * core A (0xFFC0 0100-0xFFC0 01FF)
+ */
+#define SICA_SWRST             0xFFC00100      /* Software Reset register */
+#define SICA_SYSCR             0xFFC00104      /* System Reset Configuration register */
+#define SICA_RVECT             0xFFC00108      /* SIC Reset Vector Address Register */
+#define SICA_IMASK             0xFFC0010C      /* SIC Interrupt Mask register 0 */
+#define SICA_IMASK0            0xFFC0010C      /* SIC Interrupt Mask register 0 */
+#define SICA_IMASK1            0xFFC00110      /* SIC Interrupt Mask register 1 */
+#define SICA_IAR0              0xFFC00124      /* SIC Interrupt Assignment Register 0 */
+#define SICA_IAR1              0xFFC00128      /* SIC Interrupt Assignment Register 1 */
+#define SICA_IAR2              0xFFC0012C      /* SIC Interrupt Assignment Register 2 */
+#define SICA_IAR3              0xFFC00130      /* SIC Interrupt Assignment Register 3 */
+#define SICA_IAR4              0xFFC00134      /* SIC Interrupt Assignment Register 4 */
+#define SICA_IAR5              0xFFC00138      /* SIC Interrupt Assignment Register 5 */
+#define SICA_IAR6              0xFFC0013C      /* SIC Interrupt Assignment Register 6 */
+#define SICA_IAR7              0xFFC00140      /* SIC Interrupt Assignment Register 7 */
+#define SICA_ISR0              0xFFC00114      /* SIC Interrupt Status register 0 */
+#define SICA_ISR1              0xFFC00118      /* SIC Interrupt Status register 1 */
+#define SICA_IWR0              0xFFC0011C      /* SIC Interrupt Wakeup-Enable register 0 */
+#define SICA_IWR1              0xFFC00120      /* SIC Interrupt Wakeup-Enable register 1 */
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * Core B (0xFFC0 1100-0xFFC0 11FF)
+ */
+#define SICB_SWRST             0xFFC01100      /* reserved */
+#define SICB_SYSCR             0xFFC01104      /* reserved */
+#define SICB_RVECT             0xFFC01108      /* SIC Reset Vector Address Register */
+#define SICB_IMASK0            0xFFC0110C      /* SIC Interrupt Mask register 0 */
+#define SICB_IMASK1            0xFFC01110      /* SIC Interrupt Mask register 1 */
+#define SICB_IAR0              0xFFC01124      /* SIC Interrupt Assignment Register 0 */
+#define SICB_IAR1              0xFFC01128      /* SIC Interrupt Assignment Register 1 */
+#define SICB_IAR2              0xFFC0112C      /* SIC Interrupt Assignment Register 2 */
+#define SICB_IAR3              0xFFC01130      /* SIC Interrupt Assignment Register 3 */
+#define SICB_IAR4              0xFFC01134      /* SIC Interrupt Assignment Register 4 */
+#define SICB_IAR5              0xFFC01138      /* SIC Interrupt Assignment Register 5 */
+#define SICB_IAR6              0xFFC0113C      /* SIC Interrupt Assignment Register 6 */
+#define SICB_IAR7              0xFFC01140      /* SIC Interrupt Assignment Register 7 */
+#define SICB_ISR0              0xFFC01114      /* SIC Interrupt Status register 0 */
+#define SICB_ISR1              0xFFC01118      /* SIC Interrupt Status register 1 */
+#define SICB_IWR0              0xFFC0111C      /* SIC Interrupt Wakeup-Enable register 0 */
+#define SICB_IWR1              0xFFC01120      /* SIC Interrupt Wakeup-Enable register 1 */
+
+/* Watchdog Timer registers for Core A (0xFFC0 0200-0xFFC0 02FF) */
+#define WDOGA_CTL              0xFFC00200      /* Watchdog Control register */
+#define WDOGA_CNT              0xFFC00204      /* Watchdog Count register */
+#define WDOGA_STAT             0xFFC00208      /* Watchdog Status register */
+
+/* Watchdog Timer registers for Core B (0xFFC0 1200-0xFFC0 12FF) */
+#define WDOGB_CTL              0xFFC01200      /* Watchdog Control register */
+#define WDOGB_CNT              0xFFC01204      /* Watchdog Count register */
+#define WDOGB_STAT             0xFFC01208      /* Watchdog Status register */
+
+/* UART Controller (0xFFC00400 - 0xFFC004FF) */
+#define UART_THR               0xFFC00400      /* Transmit Holding register */
+#define UART_RBR               0xFFC00400      /* Receive Buffer register */
+#define UART_DLL               0xFFC00400      /* Divisor Latch (Low-Byte) */
+#define UART_IER               0xFFC00404      /* Interrupt Enable Register */
+#define UART_DLH               0xFFC00404      /* Divisor Latch (High-Byte) */
+#define UART_IIR               0xFFC00408      /* Interrupt Identification Register */
+#define UART_LCR               0xFFC0040C      /* Line Control Register */
+#define UART_MCR               0xFFC00410      /* Modem Control Register */
+#define UART_LSR               0xFFC00414      /* Line Status Register */
+#define UART_MSR               0xFFC00418      /* Modem Status Register */
+#define UART_SCR               0xFFC0041C      /* SCR Scratch Register */
+#define UART_GCTL              0xFFC00424      /* Global Control Register */
+
+/* SPI Controller (0xFFC00500 - 0xFFC005FF) */
+#define SPI_CTL                        0xFFC00500      /* SPI Control Register */
+#define SPI_FLG                        0xFFC00504      /* SPI Flag register */
+#define SPI_STAT               0xFFC00508      /* SPI Status register */
+#define SPI_TDBR               0xFFC0050C      /* SPI Transmit Data Buffer Register */
+#define SPI_RDBR               0xFFC00510      /* SPI Receive Data Buffer Register */
+#define SPI_BAUD               0xFFC00514      /* SPI Baud rate Register */
+#define SPI_SHADOW             0xFFC00518      /* SPI_RDBR Shadow Register */
+
+/* Timer 0-7 registers (0xFFC0 0600-0xFFC0 06FF) */
+#define TIMER0_CONFIG          0xFFC00600      /* Timer0 Configuration register */
+#define TIMER0_COUNTER         0xFFC00604      /* Timer0 Counter register */
+#define TIMER0_PERIOD          0xFFC00608      /* Timer0 Period register */
+#define TIMER0_WIDTH           0xFFC0060C      /* Timer0 Width register */
+#define TIMER1_CONFIG          0xFFC00610      /* Timer1 Configuration register */
+#define TIMER1_COUNTER         0xFFC00614      /* Timer1 Counter register */
+#define TIMER1_PERIOD          0xFFC00618      /* Timer1 Period register */
+#define TIMER1_WIDTH           0xFFC0061C      /* Timer1 Width register */
+#define TIMER2_CONFIG          0xFFC00620      /* Timer2 Configuration register */
+#define TIMER2_COUNTER         0xFFC00624      /* Timer2 Counter register */
+#define TIMER2_PERIOD          0xFFC00628      /* Timer2 Period register */
+#define TIMER2_WIDTH           0xFFC0062C      /* Timer2 Width register */
+#define TIMER3_CONFIG          0xFFC00630      /* Timer3 Configuration register */
+#define TIMER3_COUNTER         0xFFC00634      /* Timer3 Counter register */
+#define TIMER3_PERIOD          0xFFC00638      /* Timer3 Period register */
+#define TIMER3_WIDTH           0xFFC0063C      /* Timer3 Width register */
+#define TIMER4_CONFIG          0xFFC00640      /* Timer4 Configuration register */
+#define TIMER4_COUNTER         0xFFC00644      /* Timer4 Counter register */
+#define TIMER4_PERIOD          0xFFC00648      /* Timer4 Period register */
+#define TIMER4_WIDTH           0xFFC0064C      /* Timer4 Width register */
+#define TIMER5_CONFIG          0xFFC00650      /* Timer5 Configuration register */
+#define TIMER5_COUNTER         0xFFC00654      /* Timer5 Counter register */
+#define TIMER5_PERIOD          0xFFC00658      /* Timer5 Period register */
+#define TIMER5_WIDTH           0xFFC0065C      /* Timer5 Width register */
+#define TIMER6_CONFIG          0xFFC00660      /* Timer6 Configuration register */
+#define TIMER6_COUNTER         0xFFC00664      /* Timer6 Counter register */
+#define TIMER6_PERIOD          0xFFC00668      /* Timer6 Period register */
+#define TIMER6_WIDTH           0xFFC0066C      /* Timer6 Width register */
+#define TIMER7_CONFIG          0xFFC00670      /* Timer7 Configuration register */
+#define TIMER7_COUNTER         0xFFC00674      /* Timer7 Counter register */
+#define TIMER7_PERIOD          0xFFC00678      /* Timer7 Period register */
+#define TIMER7_WIDTH           0xFFC0067C      /* Timer7 Width register */
+#define TMRS8_ENABLE           0xFFC00680      /* Timer Enable Register */
+#define TMRS8_DISABLE          0xFFC00684      /* Timer Disable register */
+#define TMRS8_STATUS           0xFFC00688      /* Timer Status register */
+
+/* Timer registers 8-11 (0xFFC0 1600-0xFFC0 16FF) */
+#define TIMER8_CONFIG          0xFFC01600      /* Timer8 Configuration register */
+#define TIMER8_COUNTER         0xFFC01604      /* Timer8 Counter register */
+#define TIMER8_PERIOD          0xFFC01608      /* Timer8 Period register */
+#define TIMER8_WIDTH           0xFFC0160C      /* Timer8 Width register */
+#define TIMER9_CONFIG          0xFFC01610      /* Timer9 Configuration register */
+#define TIMER9_COUNTER         0xFFC01614      /* Timer9 Counter register */
+#define TIMER9_PERIOD          0xFFC01618      /* Timer9 Period register */
+#define TIMER9_WIDTH           0xFFC0161C      /* Timer9 Width register */
+#define TIMER10_CONFIG         0xFFC01620      /* Timer10 Configuration register */
+#define TIMER10_COUNTER                0xFFC01624      /* Timer10 Counter register */
+#define TIMER10_PERIOD         0xFFC01628      /* Timer10 Period register */
+#define TIMER10_WIDTH          0xFFC0162C      /* Timer10 Width register */
+#define TIMER11_CONFIG         0xFFC01630      /* Timer11 Configuration register */
+#define TIMER11_COUNTER                0xFFC01634      /* Timer11 Counter register */
+#define TIMER11_PERIOD         0xFFC01638      /* Timer11 Period register */
+#define TIMER11_WIDTH          0xFFC0163C      /* Timer11 Width register */
+#define TMRS4_ENABLE           0xFFC01640      /* Timer Enable Register */
+#define TMRS4_DISABLE          0xFFC01644      /* Timer Disable register */
+#define TMRS4_STATUS           0xFFC01648      /* Timer Status register */
+
+/* Programmable Flag 0 registers (0xFFC0 0700-0xFFC0 07FF) */
+#define FIO0_FLAG_D            0xFFC00700      /* Flag Data register */
+#define FIO0_FLAG_C            0xFFC00704      /* Flag Clear register */
+#define FIO0_FLAG_S            0xFFC00708      /* Flag Set register */
+#define FIO0_FLAG_T            0xFFC0070C      /* Flag Toggle register */
+#define FIO0_MASKA_D           0xFFC00710      /* Flag Mask Interrupt A Data register */
+#define FIO0_MASKA_C           0xFFC00714      /* Flag Mask Interrupt A Clear register */
+#define FIO0_MASKA_S           0xFFC00718      /* Flag Mask Interrupt A Set register */
+#define FIO0_MASKA_T           0xFFC0071C      /* Flag Mask Interrupt A Toggle register */
+#define FIO0_MASKB_D           0xFFC00720      /* Flag Mask Interrupt B Data register */
+#define FIO0_MASKB_C           0xFFC00724      /* Flag Mask Interrupt B Clear register */
+#define FIO0_MASKB_S           0xFFC00728      /* Flag Mask Interrupt B Set register */
+#define FIO0_MASKB_T           0xFFC0072C      /* Flag Mask Interrupt B Toggle register */
+#define FIO0_DIR               0xFFC00730      /* Flag Direction  register */
+#define FIO0_POLAR             0xFFC00734      /* Flag Polarity register */
+#define FIO0_EDGE              0xFFC00738      /* Flag Interrupt Sensitivity register */
+#define FIO0_BOTH              0xFFC0073C      /* Flag Set on Both Edges register */
+#define FIO0_INEN              0xFFC00740      /* Flag Input Enable register */
+
+/* Programmable Flag 1 registers (0xFFC0 1500-0xFFC0 15FF) */
+#define FIO1_FLAG_D            0xFFC01500      /* Flag Data register */
+#define FIO1_FLAG_C            0xFFC01504      /* Flag Clear register */
+#define FIO1_FLAG_S            0xFFC01508      /* Flag Set register */
+#define FIO1_FLAG_T            0xFFC0150C      /* Flag Toggle register */
+#define FIO1_MASKA_D           0xFFC01510      /* Flag Mask Interrupt A Data register */
+#define FIO1_MASKA_C           0xFFC01514      /* Flag Mask Interrupt A Clear register */
+#define FIO1_MASKA_S           0xFFC01518      /* Flag Mask Interrupt A Set register */
+#define FIO1_MASKA_T           0xFFC0151C      /* Flag Mask Interrupt A Toggle register */
+#define FIO1_MASKB_D           0xFFC01520      /* Flag Mask Interrupt B Data register */
+#define FIO1_MASKB_C           0xFFC01524      /* Flag Mask Interrupt B Clear register */
+#define FIO1_MASKB_S           0xFFC01528      /* Flag Mask Interrupt B Set register */
+#define FIO1_MASKB_T           0xFFC0152C      /* Flag Mask Interrupt B Toggle register */
+#define FIO1_DIR               0xFFC01530      /* Flag Direction register */
+#define FIO1_POLAR             0xFFC01534      /* Flag Polarity register */
+#define FIO1_EDGE              0xFFC01538      /* Flag  Interrupt Sensitivity register */
+#define FIO1_BOTH              0xFFC0153C      /* Flag Set on Both Edges register */
+#define FIO1_INEN              0xFFC01540      /* Flag Input Enable register */
+
+/* Programmable Flag registers (0xFFC0 1700-0xFFC0 17FF) */
+#define FIO2_FLAG_D            0xFFC01700      /* Flag Data register */
+#define FIO2_FLAG_C            0xFFC01704      /* Flag Clear register */
+#define FIO2_FLAG_S            0xFFC01708      /* Flag Set register */
+#define FIO2_FLAG_T            0xFFC0170C      /* Flag Toggle register */
+#define FIO2_MASKA_D           0xFFC01710      /* Flag Mask Interrupt A Data register */
+#define FIO2_MASKA_C           0xFFC01714      /* Flag Mask Interrupt A Clear register */
+#define FIO2_MASKA_S           0xFFC01718      /* Flag Mask Interrupt A Set register */
+#define FIO2_MASKA_T           0xFFC0171C      /* Flag Mask Interrupt A Toggle register */
+#define FIO2_MASKB_D           0xFFC01720      /* Flag Mask Interrupt B Data register */
+#define FIO2_MASKB_C           0xFFC01724      /* Flag Mask Interrupt B Clear register */
+#define FIO2_MASKB_S           0xFFC01728      /* Flag Mask Interrupt B Set register */
+#define FIO2_MASKB_T           0xFFC0172C      /* Flag Mask Interrupt B Toggle register */
+#define FIO2_DIR               0xFFC01730      /* Flag Direction register */
+#define FIO2_POLAR             0xFFC01734      /* Flag Polarity register */
+#define FIO2_EDGE              0xFFC01738      /* Flag Interrupt Sensitivity register */
+#define FIO2_BOTH              0xFFC0173C      /* Flag Set on Both Edges register */
+#define FIO2_INEN              0xFFC01740      /* Flag Input Enable register */
+
+/* SPORT0 Controller (0xFFC00800 - 0xFFC008FF) */
+#define SPORT0_TCR1            0xFFC00800      /* SPORT0 Transmit Configuration 1 Register */
+#define SPORT0_TCR2            0xFFC00804      /* SPORT0 Transmit Configuration 2 Register */
+#define SPORT0_TCLKDIV         0xFFC00808      /* SPORT0 Transmit Clock Divider */
+#define SPORT0_TFSDIV          0xFFC0080C      /* SPORT0 Transmit Frame Sync Divider */
+#define SPORT0_TX              0xFFC00810      /* SPORT0 TX Data Register */
+#define SPORT0_RX              0xFFC00818      /* SPORT0 RX Data Register */
+#define SPORT0_RCR1            0xFFC00820      /* SPORT0 Transmit Configuration 1 Register */
+#define SPORT0_RCR2            0xFFC00824      /* SPORT0 Transmit Configuration 2 Register */
+#define SPORT0_RCLKDIV         0xFFC00828      /* SPORT0 Receive Clock Divider */
+#define SPORT0_RFSDIV          0xFFC0082C      /* SPORT0 Receive Frame Sync Divider */
+#define SPORT0_STAT            0xFFC00830      /* SPORT0 Status Register */
+#define SPORT0_CHNL            0xFFC00834      /* SPORT0 Current Channel Register */
+#define SPORT0_MCMC1           0xFFC00838      /* SPORT0 Multi-Channel Configuration Register 1 */
+#define SPORT0_MCMC2           0xFFC0083C      /* SPORT0 Multi-Channel Configuration Register 2 */
+#define SPORT0_MTCS0           0xFFC00840      /* SPORT0 Multi-Channel Transmit Select Register 0 */
+#define SPORT0_MTCS1           0xFFC00844      /* SPORT0 Multi-Channel Transmit Select Register 1 */
+#define SPORT0_MTCS2           0xFFC00848      /* SPORT0 Multi-Channel Transmit Select Register 2 */
+#define SPORT0_MTCS3           0xFFC0084C      /* SPORT0 Multi-Channel Transmit Select Register 3 */
+#define SPORT0_MRCS0           0xFFC00850      /* SPORT0 Multi-Channel Receive Select Register 0 */
+#define SPORT0_MRCS1           0xFFC00854      /* SPORT0 Multi-Channel Receive Select Register 1 */
+#define SPORT0_MRCS2           0xFFC00858      /* SPORT0 Multi-Channel Receive Select Register 2 */
+#define SPORT0_MRCS3           0xFFC0085C      /* SPORT0 Multi-Channel Receive Select Register 3 */
+
+/* SPORT1 Controller (0xFFC00900 - 0xFFC009FF) */
+#define SPORT1_TCR1            0xFFC00900      /* SPORT1 Transmit Configuration 1 Register */
+#define SPORT1_TCR2            0xFFC00904      /* SPORT1 Transmit Configuration 2 Register */
+#define SPORT1_TCLKDIV         0xFFC00908      /* SPORT1 Transmit Clock Divider */
+#define SPORT1_TFSDIV          0xFFC0090C      /* SPORT1 Transmit Frame Sync Divider */
+#define SPORT1_TX              0xFFC00910      /* SPORT1 TX Data Register */
+#define SPORT1_RX              0xFFC00918      /* SPORT1 RX Data Register */
+#define SPORT1_RCR1            0xFFC00920      /* SPORT1 Transmit Configuration 1 Register */
+#define SPORT1_RCR2            0xFFC00924      /* SPORT1 Transmit Configuration 2 Register */
+#define SPORT1_RCLKDIV         0xFFC00928      /* SPORT1 Receive Clock Divider */
+#define SPORT1_RFSDIV          0xFFC0092C      /* SPORT1 Receive Frame Sync Divider */
+#define SPORT1_STAT            0xFFC00930      /* SPORT1 Status Register */
+#define SPORT1_CHNL            0xFFC00934      /* SPORT1 Current Channel Register */
+#define SPORT1_MCMC1           0xFFC00938      /* SPORT1 Multi-Channel Configuration Register 1 */
+#define SPORT1_MCMC2           0xFFC0093C      /* SPORT1 Multi-Channel Configuration Register 2 */
+#define SPORT1_MTCS0           0xFFC00940      /* SPORT1 Multi-Channel Transmit Select Register 0 */
+#define SPORT1_MTCS1           0xFFC00944      /* SPORT1 Multi-Channel Transmit Select Register 1 */
+#define SPORT1_MTCS2           0xFFC00948      /* SPORT1 Multi-Channel Transmit Select Register 2 */
+#define SPORT1_MTCS3           0xFFC0094C      /* SPORT1 Multi-Channel Transmit Select Register 3 */
+#define SPORT1_MRCS0           0xFFC00950      /* SPORT1 Multi-Channel Receive Select Register 0 */
+#define SPORT1_MRCS1           0xFFC00954      /* SPORT1 Multi-Channel Receive Select Register 1 */
+#define SPORT1_MRCS2           0xFFC00958      /* SPORT1 Multi-Channel Receive Select Register 2 */
+#define SPORT1_MRCS3           0xFFC0095C      /* SPORT1 Multi-Channel Receive Select Register 3 */
+
+/* Asynchronous Memory Controller - External Bus Interface Unit */
+#define EBIU_AMGCTL            0xFFC00A00      /* Asynchronous Memory Global Control Register */
+#define EBIU_AMBCTL0           0xFFC00A04      /* Asynchronous Memory Bank Control Register 0 */
+#define EBIU_AMBCTL1           0xFFC00A08      /* Asynchronous Memory Bank Control Register 1 */
+
+/* SDRAM Controller External Bus Interface Unit (0xFFC00A00 - 0xFFC00AFF) */
+#define EBIU_SDGCTL            0xFFC00A10      /* SDRAM Global Control Register */
+#define EBIU_SDBCTL            0xFFC00A14      /* SDRAM Bank Control Register */
+#define EBIU_SDRRC             0xFFC00A18      /* SDRAM Refresh Rate Control Register */
+#define EBIU_SDSTAT            0xFFC00A1C      /* SDRAM Status Register */
+
+/* Parallel Peripheral Interface (PPI) 0 registers (0xFFC0 1000-0xFFC0 10FF) */
+#define PPI0_CONTROL           0xFFC01000      /* PPI0 Control register */
+#define PPI0_STATUS            0xFFC01004      /* PPI0 Status register */
+#define PPI0_COUNT             0xFFC01008      /* PPI0 Transfer Count register */
+#define PPI0_DELAY             0xFFC0100C      /* PPI0 Delay Count register */
+#define PPI0_FRAME             0xFFC01010      /* PPI0 Frame Length register */
+
+/* Parallel Peripheral Interface (PPI) 1 registers (0xFFC0 1300-0xFFC0 13FF) */
+#define PPI1_CONTROL           0xFFC01300      /* PPI1 Control register */
+#define PPI1_STATUS            0xFFC01304      /* PPI1 Status register */
+#define PPI1_COUNT             0xFFC01308      /* PPI1 Transfer Count register */
+#define PPI1_DELAY             0xFFC0130C      /* PPI1 Delay Count register */
+#define PPI1_FRAME             0xFFC01310      /* PPI1 Frame Length register */
+
+/* DMA Traffic controls */
+#define DMA_TCPER              0xFFC00B0C      /* Traffic Control Periods Register */
+#define DMA_TCCNT              0xFFC00B10      /* Traffic Control Current Counts Register */
+#define DMA_TC_PER             0xFFC00B0C      /* Traffic Control Periods Register */
+#define DMA_TC_CNT             0xFFC00B10      /* Traffic Control Current Counts Register */
+
+/* DMA1 Controller registers (0xFFC0 1C00-0xFFC0 1FFF) */
+#define DMA1_0_CONFIG          0xFFC01C08      /* DMA1 Channel 0 Configuration register */
+#define DMA1_0_NEXT_DESC_PTR   0xFFC01C00      /* DMA1 Channel 0 Next Descripter Ptr Reg */
+#define DMA1_0_START_ADDR      0xFFC01C04      /* DMA1 Channel 0 Start Address */
+#define DMA1_0_X_COUNT         0xFFC01C10      /* DMA1 Channel 0 Inner Loop Count */
+#define DMA1_0_Y_COUNT         0xFFC01C18      /* DMA1 Channel 0 Outer Loop Count */
+#define DMA1_0_X_MODIFY                0xFFC01C14      /* DMA1 Channel 0 Inner Loop Addr Increment */
+#define DMA1_0_Y_MODIFY                0xFFC01C1C      /* DMA1 Channel 0 Outer Loop Addr Increment */
+#define DMA1_0_CURR_DESC_PTR   0xFFC01C20      /* DMA1 Channel 0 Current Descriptor Pointer */
+#define DMA1_0_CURR_ADDR       0xFFC01C24      /* DMA1 Channel 0 Current Address Pointer */
+#define DMA1_0_CURR_X_COUNT    0xFFC01C30      /* DMA1 Channel 0 Current Inner Loop Count */
+#define DMA1_0_CURR_Y_COUNT    0xFFC01C38      /* DMA1 Channel 0 Current Outer Loop Count */
+#define DMA1_0_IRQ_STATUS      0xFFC01C28      /* DMA1 Channel 0 Interrupt Status Register */
+#define DMA1_0_PERIPHERAL_MAP  0xFFC01C2C      /* DMA1 Channel 0 Peripheral Map Register */
+
+#define DMA1_1_CONFIG          0xFFC01C48      /* DMA1 Channel 1 Configuration register */
+#define DMA1_1_NEXT_DESC_PTR   0xFFC01C40      /* DMA1 Channel 1 Next Descripter Ptr Reg */
+#define DMA1_1_START_ADDR      0xFFC01C44      /* DMA1 Channel 1 Start Address */
+#define DMA1_1_X_COUNT         0xFFC01C50      /* DMA1 Channel 1 Inner Loop Count */
+#define DMA1_1_Y_COUNT         0xFFC01C58      /* DMA1 Channel 1 Outer Loop Count */
+#define DMA1_1_X_MODIFY                0xFFC01C54      /* DMA1 Channel 1 Inner Loop Addr Increment */
+#define DMA1_1_Y_MODIFY                0xFFC01C5C      /* DMA1 Channel 1 Outer Loop Addr Increment */
+#define DMA1_1_CURR_DESC_PTR   0xFFC01C60      /* DMA1 Channel 1 Current Descriptor Pointer */
+#define DMA1_1_CURR_ADDR       0xFFC01C64      /* DMA1 Channel 1 Current Address Pointer */
+#define DMA1_1_CURR_X_COUNT    0xFFC01C70      /* DMA1 Channel 1 Current Inner Loop Count */
+#define DMA1_1_CURR_Y_COUNT    0xFFC01C78      /* DMA1 Channel 1 Current Outer Loop Count */
+#define DMA1_1_IRQ_STATUS      0xFFC01C68      /* DMA1 Channel 1 Interrupt Status Register */
+#define DMA1_1_PERIPHERAL_MAP  0xFFC01C6C      /* DMA1 Channel 1 Peripheral Map Register */
+
+#define DMA1_2_CONFIG          0xFFC01C88      /* DMA1 Channel 2 Configuration register */
+#define DMA1_2_NEXT_DESC_PTR   0xFFC01C80      /* DMA1 Channel 2 Next Descripter Ptr Reg */
+#define DMA1_2_START_ADDR      0xFFC01C84      /* DMA1 Channel 2 Start Address */
+#define DMA1_2_X_COUNT         0xFFC01C90      /* DMA1 Channel 2 Inner Loop Count */
+#define DMA1_2_Y_COUNT         0xFFC01C98      /* DMA1 Channel 2 Outer Loop Count */
+#define DMA1_2_X_MODIFY                0xFFC01C94      /* DMA1 Channel 2 Inner Loop Addr Increment */
+#define DMA1_2_Y_MODIFY                0xFFC01C9C      /* DMA1 Channel 2 Outer Loop Addr Increment */
+#define DMA1_2_CURR_DESC_PTR   0xFFC01CA0      /* DMA1 Channel 2 Current Descriptor Pointer */
+#define DMA1_2_CURR_ADDR       0xFFC01CA4      /* DMA1 Channel 2 Current Address Pointer */
+#define DMA1_2_CURR_X_COUNT    0xFFC01CB0      /* DMA1 Channel 2 Current Inner Loop Count */
+#define DMA1_2_CURR_Y_COUNT    0xFFC01CB8      /* DMA1 Channel 2 Current Outer Loop Count */
+#define DMA1_2_IRQ_STATUS      0xFFC01CA8      /* DMA1 Channel 2 Interrupt Status Register */
+#define DMA1_2_PERIPHERAL_MAP  0xFFC01CAC      /* DMA1 Channel 2 Peripheral Map Register */
+
+#define DMA1_3_CONFIG          0xFFC01CC8      /* DMA1 Channel 3 Configuration register */
+#define DMA1_3_NEXT_DESC_PTR   0xFFC01CC0      /* DMA1 Channel 3 Next Descripter Ptr Reg */
+#define DMA1_3_START_ADDR      0xFFC01CC4      /* DMA1 Channel 3 Start Address */
+#define DMA1_3_X_COUNT         0xFFC01CD0      /* DMA1 Channel 3 Inner Loop Count */
+#define DMA1_3_Y_COUNT         0xFFC01CD8      /* DMA1 Channel 3 Outer Loop Count */
+#define DMA1_3_X_MODIFY                0xFFC01CD4      /* DMA1 Channel 3 Inner Loop Addr Increment */
+#define DMA1_3_Y_MODIFY                0xFFC01CDC      /* DMA1 Channel 3 Outer Loop Addr Increment */
+#define DMA1_3_CURR_DESC_PTR   0xFFC01CE0      /* DMA1 Channel 3 Current Descriptor Pointer */
+#define DMA1_3_CURR_ADDR       0xFFC01CE4      /* DMA1 Channel 3 Current Address Pointer */
+#define DMA1_3_CURR_X_COUNT    0xFFC01CF0      /* DMA1 Channel 3 Current Inner Loop Count */
+#define DMA1_3_CURR_Y_COUNT    0xFFC01CF8      /* DMA1 Channel 3 Current Outer Loop Count */
+#define DMA1_3_IRQ_STATUS      0xFFC01CE8      /* DMA1 Channel 3 Interrupt Status Register */
+#define DMA1_3_PERIPHERAL_MAP  0xFFC01CEC      /* DMA1 Channel 3 Peripheral Map Register */
+
+#define DMA1_4_CONFIG          0xFFC01D08      /* DMA1 Channel 4 Configuration register */
+#define DMA1_4_NEXT_DESC_PTR   0xFFC01D00      /* DMA1 Channel 4 Next Descripter Ptr Reg */
+#define DMA1_4_START_ADDR      0xFFC01D04      /* DMA1 Channel 4 Start Address */
+#define DMA1_4_X_COUNT         0xFFC01D10      /* DMA1 Channel 4 Inner Loop Count */
+#define DMA1_4_Y_COUNT         0xFFC01D18      /* DMA1 Channel 4 Outer Loop Count */
+#define DMA1_4_X_MODIFY                0xFFC01D14      /* DMA1 Channel 4 Inner Loop Addr Increment */
+#define DMA1_4_Y_MODIFY                0xFFC01D1C      /* DMA1 Channel 4 Outer Loop Addr Increment */
+#define DMA1_4_CURR_DESC_PTR   0xFFC01D20      /* DMA1 Channel 4 Current Descriptor Pointer */
+#define DMA1_4_CURR_ADDR       0xFFC01D24      /* DMA1 Channel 4 Current Address Pointer */
+#define DMA1_4_CURR_X_COUNT    0xFFC01D30      /* DMA1 Channel 4 Current Inner Loop Count */
+#define DMA1_4_CURR_Y_COUNT    0xFFC01D38      /* DMA1 Channel 4 Current Outer Loop Count */
+#define DMA1_4_IRQ_STATUS      0xFFC01D28      /* DMA1 Channel 4 Interrupt Status Register */
+#define DMA1_4_PERIPHERAL_MAP  0xFFC01D2C      /* DMA1 Channel 4 Peripheral Map Register */
+
+#define DMA1_5_CONFIG          0xFFC01D48      /* DMA1 Channel 5 Configuration register */
+#define DMA1_5_NEXT_DESC_PTR   0xFFC01D40      /* DMA1 Channel 5 Next Descripter Ptr Reg */
+#define DMA1_5_START_ADDR      0xFFC01D44      /* DMA1 Channel 5 Start Address */
+#define DMA1_5_X_COUNT         0xFFC01D50      /* DMA1 Channel 5 Inner Loop Count */
+#define DMA1_5_Y_COUNT         0xFFC01D58      /* DMA1 Channel 5 Outer Loop Count */
+#define DMA1_5_X_MODIFY                0xFFC01D54      /* DMA1 Channel 5 Inner Loop Addr Increment */
+#define DMA1_5_Y_MODIFY                0xFFC01D5C      /* DMA1 Channel 5 Outer Loop Addr Increment */
+#define DMA1_5_CURR_DESC_PTR   0xFFC01D60      /* DMA1 Channel 5 Current Descriptor Pointer */
+#define DMA1_5_CURR_ADDR       0xFFC01D64      /* DMA1 Channel 5 Current Address Pointer */
+#define DMA1_5_CURR_X_COUNT    0xFFC01D70      /* DMA1 Channel 5 Current Inner Loop Count */
+#define DMA1_5_CURR_Y_COUNT    0xFFC01D78      /* DMA1 Channel 5 Current Outer Loop Count */
+#define DMA1_5_IRQ_STATUS      0xFFC01D68      /* DMA1 Channel 5 Interrupt Status Register */
+#define DMA1_5_PERIPHERAL_MAP  0xFFC01D6C      /* DMA1 Channel 5 Peripheral Map Register */
+
+#define DMA1_6_CONFIG          0xFFC01D88      /* DMA1 Channel 6 Configuration register */
+#define DMA1_6_NEXT_DESC_PTR   0xFFC01D80      /* DMA1 Channel 6 Next Descripter Ptr Reg */
+#define DMA1_6_START_ADDR      0xFFC01D84      /* DMA1 Channel 6 Start Address */
+#define DMA1_6_X_COUNT         0xFFC01D90      /* DMA1 Channel 6 Inner Loop Count */
+#define DMA1_6_Y_COUNT         0xFFC01D98      /* DMA1 Channel 6 Outer Loop Count */
+#define DMA1_6_X_MODIFY                0xFFC01D94      /* DMA1 Channel 6 Inner Loop Addr Increment */
+#define DMA1_6_Y_MODIFY                0xFFC01D9C      /* DMA1 Channel 6 Outer Loop Addr Increment */
+#define DMA1_6_CURR_DESC_PTR   0xFFC01DA0      /* DMA1 Channel 6 Current Descriptor Pointer */
+#define DMA1_6_CURR_ADDR       0xFFC01DA4      /* DMA1 Channel 6 Current Address Pointer */
+#define DMA1_6_CURR_X_COUNT    0xFFC01DB0      /* DMA1 Channel 6 Current Inner Loop Count */
+#define DMA1_6_CURR_Y_COUNT    0xFFC01DB8      /* DMA1 Channel 6 Current Outer Loop Count */
+#define DMA1_6_IRQ_STATUS      0xFFC01DA8      /* DMA1 Channel 6 Interrupt Status Register */
+#define DMA1_6_PERIPHERAL_MAP  0xFFC01DAC      /* DMA1 Channel 6 Peripheral Map Register */
+
+#define DMA1_7_CONFIG          0xFFC01DC8      /* DMA1 Channel 7 Configuration register */
+#define DMA1_7_NEXT_DESC_PTR   0xFFC01DC0      /* DMA1 Channel 7 Next Descripter Ptr Reg */
+#define DMA1_7_START_ADDR      0xFFC01DC4      /* DMA1 Channel 7 Start Address */
+#define DMA1_7_X_COUNT         0xFFC01DD0      /* DMA1 Channel 7 Inner Loop Count */
+#define DMA1_7_Y_COUNT         0xFFC01DD8      /* DMA1 Channel 7 Outer Loop Count */
+#define DMA1_7_X_MODIFY                0xFFC01DD4      /* DMA1 Channel 7 Inner Loop Addr Increment */
+#define DMA1_7_Y_MODIFY                0xFFC01DDC      /* DMA1 Channel 7 Outer Loop Addr Increment */
+#define DMA1_7_CURR_DESC_PTR   0xFFC01DE0      /* DMA1 Channel 7 Current Descriptor Pointer */
+#define DMA1_7_CURR_ADDR       0xFFC01DE4      /* DMA1 Channel 7 Current Address Pointer */
+#define DMA1_7_CURR_X_COUNT    0xFFC01DF0      /* DMA1 Channel 7 Current Inner Loop Count */
+#define DMA1_7_CURR_Y_COUNT    0xFFC01DF8      /* DMA1 Channel 7 Current Outer Loop Count */
+#define DMA1_7_IRQ_STATUS      0xFFC01DE8      /* DMA1 Channel 7 Interrupt Status Register */
+#define DMA1_7_PERIPHERAL_MAP  0xFFC01DEC      /* DMA1 Channel 7 Peripheral Map Register */
+
+#define DMA1_8_CONFIG          0xFFC01E08      /* DMA1 Channel 8 Configuration register */
+#define DMA1_8_NEXT_DESC_PTR   0xFFC01E00      /* DMA1 Channel 8 Next Descripter Ptr Reg */
+#define DMA1_8_START_ADDR      0xFFC01E04      /* DMA1 Channel 8 Start Address */
+#define DMA1_8_X_COUNT         0xFFC01E10      /* DMA1 Channel 8 Inner Loop Count */
+#define DMA1_8_Y_COUNT         0xFFC01E18      /* DMA1 Channel 8 Outer Loop Count */
+#define DMA1_8_X_MODIFY                0xFFC01E14      /* DMA1 Channel 8 Inner Loop Addr Increment */
+#define DMA1_8_Y_MODIFY                0xFFC01E1C      /* DMA1 Channel 8 Outer Loop Addr Increment */
+#define DMA1_8_CURR_DESC_PTR   0xFFC01E20      /* DMA1 Channel 8 Current Descriptor Pointer */
+#define DMA1_8_CURR_ADDR       0xFFC01E24      /* DMA1 Channel 8 Current Address Pointer */
+#define DMA1_8_CURR_X_COUNT    0xFFC01E30      /* DMA1 Channel 8 Current Inner Loop Count */
+#define DMA1_8_CURR_Y_COUNT    0xFFC01E38      /* DMA1 Channel 8 Current Outer Loop Count */
+#define DMA1_8_IRQ_STATUS      0xFFC01E28      /* DMA1 Channel 8 Interrupt Status Register */
+#define DMA1_8_PERIPHERAL_MAP  0xFFC01E2C      /* DMA1 Channel 8 Peripheral Map Register */
+
+#define DMA1_9_CONFIG          0xFFC01E48      /* DMA1 Channel 9 Configuration register */
+#define DMA1_9_NEXT_DESC_PTR   0xFFC01E40      /* DMA1 Channel 9 Next Descripter Ptr Reg */
+#define DMA1_9_START_ADDR      0xFFC01E44      /* DMA1 Channel 9 Start Address */
+#define DMA1_9_X_COUNT         0xFFC01E50      /* DMA1 Channel 9 Inner Loop Count */
+#define DMA1_9_Y_COUNT         0xFFC01E58      /* DMA1 Channel 9 Outer Loop Count */
+#define DMA1_9_X_MODIFY                0xFFC01E54      /* DMA1 Channel 9 Inner Loop Addr Increment */
+#define DMA1_9_Y_MODIFY                0xFFC01E5C      /* DMA1 Channel 9 Outer Loop Addr Increment */
+#define DMA1_9_CURR_DESC_PTR   0xFFC01E60      /* DMA1 Channel 9 Current Descriptor Pointer */
+#define DMA1_9_CURR_ADDR       0xFFC01E64      /* DMA1 Channel 9 Current Address Pointer */
+#define DMA1_9_CURR_X_COUNT    0xFFC01E70      /* DMA1 Channel 9 Current Inner Loop Count */
+#define DMA1_9_CURR_Y_COUNT    0xFFC01E78      /* DMA1 Channel 9 Current Outer Loop Count */
+#define DMA1_9_IRQ_STATUS      0xFFC01E68      /* DMA1 Channel 9 Interrupt Status Register */
+#define DMA1_9_PERIPHERAL_MAP  0xFFC01E6C      /* DMA1 Channel 9 Peripheral Map Register */
+
+#define DMA1_10_CONFIG         0xFFC01E88      /* DMA1 Channel 10 Configuration register */
+#define DMA1_10_NEXT_DESC_PTR  0xFFC01E80      /* DMA1 Channel 10 Next Descripter Ptr Reg */
+#define DMA1_10_START_ADDR     0xFFC01E84      /* DMA1 Channel 10 Start Address */
+#define DMA1_10_X_COUNT                0xFFC01E90      /* DMA1 Channel 10 Inner Loop Count */
+#define DMA1_10_Y_COUNT                0xFFC01E98      /* DMA1 Channel 10 Outer Loop Count */
+#define DMA1_10_X_MODIFY       0xFFC01E94      /* DMA1 Channel 10 Inner Loop Addr Increment */
+#define DMA1_10_Y_MODIFY       0xFFC01E9C      /* DMA1 Channel 10 Outer Loop Addr Increment */
+#define DMA1_10_CURR_DESC_PTR  0xFFC01EA0      /* DMA1 Channel 10 Current Descriptor Pointer */
+#define DMA1_10_CURR_ADDR      0xFFC01EA4      /* DMA1 Channel 10 Current Address Pointer */
+#define DMA1_10_CURR_X_COUNT   0xFFC01EB0      /* DMA1 Channel 10 Current Inner Loop Count */
+#define DMA1_10_CURR_Y_COUNT   0xFFC01EB8      /* DMA1 Channel 10 Current Outer Loop Count */
+#define DMA1_10_IRQ_STATUS     0xFFC01EA8      /* DMA1 Channel 10 Interrupt Status Register */
+#define DMA1_10_PERIPHERAL_MAP 0xFFC01EAC      /* DMA1 Channel 10 Peripheral Map Register */
+
+#define DMA1_11_CONFIG         0xFFC01EC8      /* DMA1 Channel 11 Configuration register */
+#define DMA1_11_NEXT_DESC_PTR  0xFFC01EC0      /* DMA1 Channel 11 Next Descripter Ptr Reg */
+#define DMA1_11_START_ADDR     0xFFC01EC4      /* DMA1 Channel 11 Start Address */
+#define DMA1_11_X_COUNT                0xFFC01ED0      /* DMA1 Channel 11 Inner Loop Count */
+#define DMA1_11_Y_COUNT                0xFFC01ED8      /* DMA1 Channel 11 Outer Loop Count */
+#define DMA1_11_X_MODIFY       0xFFC01ED4      /* DMA1 Channel 11 Inner Loop Addr Increment */
+#define DMA1_11_Y_MODIFY       0xFFC01EDC      /* DMA1 Channel 11 Outer Loop Addr Increment */
+#define DMA1_11_CURR_DESC_PTR  0xFFC01EE0      /* DMA1 Channel 11 Current Descriptor Pointer */
+#define DMA1_11_CURR_ADDR      0xFFC01EE4      /* DMA1 Channel 11 Current Address Pointer */
+#define DMA1_11_CURR_X_COUNT   0xFFC01EF0      /* DMA1 Channel 11 Current Inner Loop Count */
+#define DMA1_11_CURR_Y_COUNT   0xFFC01EF8      /* DMA1 Channel 11 Current Outer Loop Count */
+#define DMA1_11_IRQ_STATUS     0xFFC01EE8      /* DMA1 Channel 11 Interrupt Status Register */
+#define DMA1_11_PERIPHERAL_MAP 0xFFC01EEC      /* DMA1 Channel 11 Peripheral Map Register */
+
+/* Memory DMA1 Controller registers (0xFFC0 1E80-0xFFC0 1FFF) */
+#define MDMA1_D0_CONFIG                0xFFC01F08      /* MemDMA1 Stream 0 Destination Configuration */
+#define MDMA1_D0_NEXT_DESC_PTR 0xFFC01F00      /* MemDMA1 Stream 0 Destination Next Descriptor Ptr Reg */
+#define MDMA1_D0_START_ADDR    0xFFC01F04      /* MemDMA1 Stream 0 Destination Start Address */
+#define MDMA1_D0_X_COUNT       0xFFC01F10      /* MemDMA1 Stream 0 Destination Inner-Loop Count */
+#define MDMA1_D0_Y_COUNT       0xFFC01F18      /* MemDMA1 Stream 0 Destination Outer-Loop Count */
+#define MDMA1_D0_X_MODIFY      0xFFC01F14      /* MemDMA1 Stream 0 Dest Inner-Loop Address-Increment */
+#define MDMA1_D0_Y_MODIFY      0xFFC01F1C      /* MemDMA1 Stream 0 Dest Outer-Loop Address-Increment */
+#define MDMA1_D0_CURR_DESC_PTR 0xFFC01F20      /* MemDMA1 Stream 0 Dest Current Descriptor Ptr reg */
+#define MDMA1_D0_CURR_ADDR     0xFFC01F24      /* MemDMA1 Stream 0 Destination Current Address */
+#define MDMA1_D0_CURR_X_COUNT  0xFFC01F30      /* MemDMA1 Stream 0 Dest Current Inner-Loop Count */
+#define MDMA1_D0_CURR_Y_COUNT  0xFFC01F38      /* MemDMA1 Stream 0 Dest Current Outer-Loop Count */
+#define MDMA1_D0_IRQ_STATUS    0xFFC01F28      /* MemDMA1 Stream 0 Destination Interrupt/Status */
+#define MDMA1_D0_PERIPHERAL_MAP        0xFFC01F2C      /* MemDMA1 Stream 0 Destination Peripheral Map */
+
+#define MDMA1_S0_CONFIG                0xFFC01F48      /* MemDMA1 Stream 0 Source Configuration */
+#define MDMA1_S0_NEXT_DESC_PTR 0xFFC01F40      /* MemDMA1 Stream 0 Source Next Descriptor Ptr Reg */
+#define MDMA1_S0_START_ADDR    0xFFC01F44      /* MemDMA1 Stream 0 Source Start Address */
+#define MDMA1_S0_X_COUNT       0xFFC01F50      /* MemDMA1 Stream 0 Source Inner-Loop Count */
+#define MDMA1_S0_Y_COUNT       0xFFC01F58      /* MemDMA1 Stream 0 Source Outer-Loop Count */
+#define MDMA1_S0_X_MODIFY      0xFFC01F54      /* MemDMA1 Stream 0 Source Inner-Loop Address-Increment */
+#define MDMA1_S0_Y_MODIFY      0xFFC01F5C      /* MemDMA1 Stream 0 Source Outer-Loop Address-Increment */
+#define MDMA1_S0_CURR_DESC_PTR 0xFFC01F60      /* MemDMA1 Stream 0 Source Current Descriptor Ptr reg */
+#define MDMA1_S0_CURR_ADDR     0xFFC01F64      /* MemDMA1 Stream 0 Source Current Address */
+#define MDMA1_S0_CURR_X_COUNT  0xFFC01F70      /* MemDMA1 Stream 0 Source Current Inner-Loop Count */
+#define MDMA1_S0_CURR_Y_COUNT `        0xFFC01F78      /* MemDMA1 Stream 0 Source Current Outer-Loop Count */
+#define MDMA1_S0_IRQ_STATUS    0xFFC01F68      /* MemDMA1 Stream 0 Source Interrupt/Status */
+#define MDMA1_S0_PERIPHERAL_MAP 0xFFC01F6C     /* MemDMA1 Stream 0 Source Peripheral Map */
+
+#define MDMA1_D1_CONFIG                0xFFC01F88      /* MemDMA1 Stream 1 Destination Configuration */
+#define MDMA1_D1_NEXT_DESC_PTR 0xFFC01F80      /* MemDMA1 Stream 1 Destination Next Descriptor Ptr Reg */
+#define MDMA1_D1_START_ADDR    0xFFC01F84      /* MemDMA1 Stream 1 Destination Start Address */
+#define MDMA1_D1_X_COUNT       0xFFC01F90      /* MemDMA1 Stream 1 Destination Inner-Loop Count */
+#define MDMA1_D1_Y_COUNT       0xFFC01F98      /* MemDMA1 Stream 1 Destination Outer-Loop Count */
+#define MDMA1_D1_X_MODIFY      0xFFC01F94      /* MemDMA1 Stream 1 Dest Inner-Loop Address-Increment */
+#define MDMA1_D1_Y_MODIFY      0xFFC01F9C      /* MemDMA1 Stream 1 Dest Outer-Loop Address-Increment */
+#define MDMA1_D1_CURR_DESC_PTR 0xFFC01FA0      /* MemDMA1 Stream 1 Dest Current Descriptor Ptr reg */
+#define MDMA1_D1_CURR_ADDR     0xFFC01FA4      /* MemDMA1 Stream 1 Dest Current Address */
+#define MDMA1_D1_CURR_X_COUNT  0xFFC01FB0      /* MemDMA1 Stream 1 Dest Current Inner-Loop Count */
+#define MDMA1_D1_CURR_Y_COUNT  0xFFC01FB8      /* MemDMA1 Stream 1 Dest Current Outer-Loop Count */
+#define MDMA1_D1_IRQ_STATUS    0xFFC01FA8      /* MemDMA1 Stream 1 Dest Interrupt/Status */
+#define MDMA1_D1_PERIPHERAL_MAP 0xFFC01FAC     /* MemDMA1 Stream 1 Dest Peripheral Map */
+
+#define MDMA1_S1_CONFIG                0xFFC01FC8      /* MemDMA1 Stream 1 Source Configuration */
+#define MDMA1_S1_NEXT_DESC_PTR 0xFFC01FC0      /* MemDMA1 Stream 1 Source Next Descriptor Ptr Reg */
+#define MDMA1_S1_START_ADDR    0xFFC01FC4      /* MemDMA1 Stream 1 Source Start Address */
+#define MDMA1_S1_X_COUNT       0xFFC01FD0      /* MemDMA1 Stream 1 Source Inner-Loop Count */
+#define MDMA1_S1_Y_COUNT       0xFFC01FD8      /* MemDMA1 Stream 1 Source Outer-Loop Count */
+#define MDMA1_S1_X_MODIFY      0xFFC01FD4      /* MemDMA1 Stream 1 Source Inner-Loop Address-Increment */
+#define MDMA1_S1_Y_MODIFY      0xFFC01FDC      /* MemDMA1 Stream 1 Source Outer-Loop Address-Increment */
+#define MDMA1_S1_CURR_DESC_PTR 0xFFC01FE0      /* MemDMA1 Stream 1 Source Current Descriptor Ptr reg */
+#define MDMA1_S1_CURR_ADDR     0xFFC01FE4      /* MemDMA1 Stream 1 Source Current Address */
+#define MDMA1_S1_CURR_X_COUNT  0xFFC01FF0      /* MemDMA1 Stream 1 Source Current Inner-Loop Count */
+#define MDMA1_S1_CURR_Y_COUNT  0xFFC01FF8      /* MemDMA1 Stream 1 Source Current Outer-Loop Count */
+#define MDMA1_S1_IRQ_STATUS    0xFFC01FE8      /* MemDMA1 Stream 1 Source Interrupt/Status */
+#define MDMA1_S1_PERIPHERAL_MAP 0xFFC01FEC     /* MemDMA1 Stream 1 Source Peripheral Map */
+
+/* DMA2 Controller registers (0xFFC0 0C00-0xFFC0 0DFF) */
+#define DMA2_0_CONFIG          0xFFC00C08      /* DMA2 Channel 0 Configuration register */
+#define DMA2_0_NEXT_DESC_PTR   0xFFC00C00      /* DMA2 Channel 0 Next Descripter Ptr Reg */
+#define DMA2_0_START_ADDR      0xFFC00C04      /* DMA2 Channel 0 Start Address */
+#define DMA2_0_X_COUNT         0xFFC00C10      /* DMA2 Channel 0 Inner Loop Count */
+#define DMA2_0_Y_COUNT         0xFFC00C18      /* DMA2 Channel 0 Outer Loop Count */
+#define DMA2_0_X_MODIFY                0xFFC00C14      /* DMA2 Channel 0 Inner Loop Addr Increment */
+#define DMA2_0_Y_MODIFY                0xFFC00C1C      /* DMA2 Channel 0 Outer Loop Addr Increment */
+#define DMA2_0_CURR_DESC_PTR   0xFFC00C20      /* DMA2 Channel 0 Current Descriptor Pointer */
+#define DMA2_0_CURR_ADDR       0xFFC00C24      /* DMA2 Channel 0 Current Address Pointer */
+#define DMA2_0_CURR_X_COUNT    0xFFC00C30      /* DMA2 Channel 0 Current Inner Loop Count */
+#define DMA2_0_CURR_Y_COUNT    0xFFC00C38      /* DMA2 Channel 0 Current Outer Loop Count */
+#define DMA2_0_IRQ_STATUS      0xFFC00C28      /* DMA2 Channel 0 Interrupt Status Register */
+#define DMA2_0_PERIPHERAL_MAP  0xFFC00C2C      /* DMA2 Channel 0 Peripheral Map Register */
+
+#define DMA2_1_CONFIG          0xFFC00C48      /* DMA2 Channel 1 Configuration register */
+#define DMA2_1_NEXT_DESC_PTR   0xFFC00C40      /* DMA2 Channel 1 Next Descripter Ptr Reg */
+#define DMA2_1_START_ADDR      0xFFC00C44      /* DMA2 Channel 1 Start Address */
+#define DMA2_1_X_COUNT         0xFFC00C50      /* DMA2 Channel 1 Inner Loop Count */
+#define DMA2_1_Y_COUNT         0xFFC00C58      /* DMA2 Channel 1 Outer Loop Count */
+#define DMA2_1_X_MODIFY                0xFFC00C54      /* DMA2 Channel 1 Inner Loop Addr Increment */
+#define DMA2_1_Y_MODIFY                0xFFC00C5C      /* DMA2 Channel 1 Outer Loop Addr Increment */
+#define DMA2_1_CURR_DESC_PTR   0xFFC00C60      /* DMA2 Channel 1 Current Descriptor Pointer */
+#define DMA2_1_CURR_ADDR       0xFFC00C64      /* DMA2 Channel 1 Current Address Pointer */
+#define DMA2_1_CURR_X_COUNT    0xFFC00C70      /* DMA2 Channel 1 Current Inner Loop Count */
+#define DMA2_1_CURR_Y_COUNT    0xFFC00C78      /* DMA2 Channel 1 Current Outer Loop Count */
+#define DMA2_1_IRQ_STATUS      0xFFC00C68      /* DMA2 Channel 1 Interrupt Status Register */
+#define DMA2_1_PERIPHERAL_MAP  0xFFC00C6C      /* DMA2 Channel 1 Peripheral Map Register */
+
+#define DMA2_2_CONFIG          0xFFC00C88      /* DMA2 Channel 2 Configuration register */
+#define DMA2_2_NEXT_DESC_PTR   0xFFC00C80      /* DMA2 Channel 2 Next Descripter Ptr Reg */
+#define DMA2_2_START_ADDR      0xFFC00C84      /* DMA2 Channel 2 Start Address */
+#define DMA2_2_X_COUNT         0xFFC00C90      /* DMA2 Channel 2 Inner Loop Count */
+#define DMA2_2_Y_COUNT         0xFFC00C98      /* DMA2 Channel 2 Outer Loop Count */
+#define DMA2_2_X_MODIFY                0xFFC00C94      /* DMA2 Channel 2 Inner Loop Addr Increment */
+#define DMA2_2_Y_MODIFY                0xFFC00C9C      /* DMA2 Channel 2 Outer Loop Addr Increment */
+#define DMA2_2_CURR_DESC_PTR   0xFFC00CA0      /* DMA2 Channel 2 Current Descriptor Pointer */
+#define DMA2_2_CURR_ADDR       0xFFC00CA4      /* DMA2 Channel 2 Current Address Pointer */
+#define DMA2_2_CURR_X_COUNT    0xFFC00CB0      /* DMA2 Channel 2 Current Inner Loop Count */
+#define DMA2_2_CURR_Y_COUNT    0xFFC00CB8      /* DMA2 Channel 2 Current Outer Loop Count */
+#define DMA2_2_IRQ_STATUS      0xFFC00CA8      /* DMA2 Channel 2 Interrupt Status Register */
+#define DMA2_2_PERIPHERAL_MAP  0xFFC00CAC      /* DMA2 Channel 2 Peripheral Map Register */
+
+#define DMA2_3_CONFIG          0xFFC00CC8      /* DMA2 Channel 3 Configuration register */
+#define DMA2_3_NEXT_DESC_PTR   0xFFC00CC0      /* DMA2 Channel 3 Next Descripter Ptr Reg */
+#define DMA2_3_START_ADDR      0xFFC00CC4      /* DMA2 Channel 3 Start Address */
+#define DMA2_3_X_COUNT         0xFFC00CD0      /* DMA2 Channel 3 Inner Loop Count */
+#define DMA2_3_Y_COUNT         0xFFC00CD8      /* DMA2 Channel 3 Outer Loop Count */
+#define DMA2_3_X_MODIFY                0xFFC00CD4      /* DMA2 Channel 3 Inner Loop Addr Increment */
+#define DMA2_3_Y_MODIFY                0xFFC00CDC      /* DMA2 Channel 3 Outer Loop Addr Increment */
+#define DMA2_3_CURR_DESC_PTR   0xFFC00CE0      /* DMA2 Channel 3 Current Descriptor Pointer */
+#define DMA2_3_CURR_ADDR       0xFFC00CE4      /* DMA2 Channel 3 Current Address Pointer */
+#define DMA2_3_CURR_X_COUNT    0xFFC00CF0      /* DMA2 Channel 3 Current Inner Loop Count */
+#define DMA2_3_CURR_Y_COUNT    0xFFC00CF8      /* DMA2 Channel 3 Current Outer Loop Count */
+#define DMA2_3_IRQ_STATUS      0xFFC00CE8      /* DMA2 Channel 3 Interrupt Status Register */
+#define DMA2_3_PERIPHERAL_MAP  0xFFC00CEC      /* DMA2 Channel 3 Peripheral Map Register */
+
+#define DMA2_4_CONFIG          0xFFC00D08      /* DMA2 Channel 4 Configuration register */
+#define DMA2_4_NEXT_DESC_PTR   0xFFC00D00      /* DMA2 Channel 4 Next Descripter Ptr Reg */
+#define DMA2_4_START_ADDR      0xFFC00D04      /* DMA2 Channel 4 Start Address */
+#define DMA2_4_X_COUNT         0xFFC00D10      /* DMA2 Channel 4 Inner Loop Count */
+#define DMA2_4_Y_COUNT         0xFFC00D18      /* DMA2 Channel 4 Outer Loop Count */
+#define DMA2_4_X_MODIFY                0xFFC00D14      /* DMA2 Channel 4 Inner Loop Addr Increment */
+#define DMA2_4_Y_MODIFY                0xFFC00D1C      /* DMA2 Channel 4 Outer Loop Addr Increment */
+#define DMA2_4_CURR_DESC_PTR   0xFFC00D20      /* DMA2 Channel 4 Current Descriptor Pointer */
+#define DMA2_4_CURR_ADDR       0xFFC00D24      /* DMA2 Channel 4 Current Address Pointer */
+#define DMA2_4_CURR_X_COUNT    0xFFC00D30      /* DMA2 Channel 4 Current Inner Loop Count */
+#define DMA2_4_CURR_Y_COUNT    0xFFC00D38      /* DMA2 Channel 4 Current Outer Loop Count */
+#define DMA2_4_IRQ_STATUS      0xFFC00D28      /* DMA2 Channel 4 Interrupt Status Register */
+#define DMA2_4_PERIPHERAL_MAP  0xFFC00D2C      /* DMA2 Channel 4 Peripheral Map Register */
+
+#define DMA2_5_CONFIG          0xFFC00D48      /* DMA2 Channel 5 Configuration register */
+#define DMA2_5_NEXT_DESC_PTR   0xFFC00D40      /* DMA2 Channel 5 Next Descripter Ptr Reg */
+#define DMA2_5_START_ADDR      0xFFC00D44      /* DMA2 Channel 5 Start Address */
+#define DMA2_5_X_COUNT         0xFFC00D50      /* DMA2 Channel 5 Inner Loop Count */
+#define DMA2_5_Y_COUNT         0xFFC00D58      /* DMA2 Channel 5 Outer Loop Count */
+#define DMA2_5_X_MODIFY                0xFFC00D54      /* DMA2 Channel 5 Inner Loop Addr Increment */
+#define DMA2_5_Y_MODIFY                0xFFC00D5C      /* DMA2 Channel 5 Outer Loop Addr Increment */
+#define DMA2_5_CURR_DESC_PTR   0xFFC00D60      /* DMA2 Channel 5 Current Descriptor Pointer */
+#define DMA2_5_CURR_ADDR       0xFFC00D64      /* DMA2 Channel 5 Current Address Pointer */
+#define DMA2_5_CURR_X_COUNT    0xFFC00D70      /* DMA2 Channel 5 Current Inner Loop Count */
+#define DMA2_5_CURR_Y_COUNT    0xFFC00D78      /* DMA2 Channel 5 Current Outer Loop Count */
+#define DMA2_5_IRQ_STATUS      0xFFC00D68      /* DMA2 Channel 5 Interrupt Status Register */
+#define DMA2_5_PERIPHERAL_MAP  0xFFC00D6C      /* DMA2 Channel 5 Peripheral Map Register */
+
+#define DMA2_6_CONFIG          0xFFC00D88      /* DMA2 Channel 6 Configuration register */
+#define DMA2_6_NEXT_DESC_PTR   0xFFC00D80      /* DMA2 Channel 6 Next Descripter Ptr Reg */
+#define DMA2_6_START_ADDR      0xFFC00D84      /* DMA2 Channel 6 Start Address */
+#define DMA2_6_X_COUNT         0xFFC00D90      /* DMA2 Channel 6 Inner Loop Count */
+#define DMA2_6_Y_COUNT         0xFFC00D98      /* DMA2 Channel 6 Outer Loop Count */
+#define DMA2_6_X_MODIFY                0xFFC00D94      /* DMA2 Channel 6 Inner Loop Addr Increment */
+#define DMA2_6_Y_MODIFY                0xFFC00D9C      /* DMA2 Channel 6 Outer Loop Addr Increment */
+#define DMA2_6_CURR_DESC_PTR   0xFFC00DA0      /* DMA2 Channel 6 Current Descriptor Pointer */
+#define DMA2_6_CURR_ADDR       0xFFC00DA4      /* DMA2 Channel 6 Current Address Pointer */
+#define DMA2_6_CURR_X_COUNT    0xFFC00DB0      /* DMA2 Channel 6 Current Inner Loop Count */
+#define DMA2_6_CURR_Y_COUNT    0xFFC00DB8      /* DMA2 Channel 6 Current Outer Loop Count */
+#define DMA2_6_IRQ_STATUS      0xFFC00DA8      /* DMA2 Channel 6 Interrupt Status Register */
+#define DMA2_6_PERIPHERAL_MAP  0xFFC00DAC      /* DMA2 Channel 6 Peripheral Map Register */
+
+#define DMA2_7_CONFIG          0xFFC00DC8      /* DMA2 Channel 7 Configuration register */
+#define DMA2_7_NEXT_DESC_PTR   0xFFC00DC0      /* DMA2 Channel 7 Next Descripter Ptr Reg */
+#define DMA2_7_START_ADDR      0xFFC00DC4      /* DMA2 Channel 7 Start Address */
+#define DMA2_7_X_COUNT         0xFFC00DD0      /* DMA2 Channel 7 Inner Loop Count */
+#define DMA2_7_Y_COUNT         0xFFC00DD8      /* DMA2 Channel 7 Outer Loop Count */
+#define DMA2_7_X_MODIFY                0xFFC00DD4      /* DMA2 Channel 7 Inner Loop Addr Increment */
+#define DMA2_7_Y_MODIFY                0xFFC00DDC      /* DMA2 Channel 7 Outer Loop Addr Increment */
+#define DMA2_7_CURR_DESC_PTR   0xFFC00DE0      /* DMA2 Channel 7 Current Descriptor Pointer */
+#define DMA2_7_CURR_ADDR       0xFFC00DE4      /* DMA2 Channel 7 Current Address Pointer */
+#define DMA2_7_CURR_X_COUNT    0xFFC00DF0      /* DMA2 Channel 7 Current Inner Loop Count */
+#define DMA2_7_CURR_Y_COUNT    0xFFC00DF8      /* DMA2 Channel 7 Current Outer Loop Count */
+#define DMA2_7_IRQ_STATUS      0xFFC00DE8      /* DMA2 Channel 7 Interrupt Status Register */
+#define DMA2_7_PERIPHERAL_MAP  0xFFC00DEC      /* DMA2 Channel 7 Peripheral Map Register */
+
+#define DMA2_8_CONFIG          0xFFC00E08      /* DMA2 Channel 8 Configuration register */
+#define DMA2_8_NEXT_DESC_PTR   0xFFC00E00      /* DMA2 Channel 8 Next Descripter Ptr Reg */
+#define DMA2_8_START_ADDR      0xFFC00E04      /* DMA2 Channel 8 Start Address */
+#define DMA2_8_X_COUNT         0xFFC00E10      /* DMA2 Channel 8 Inner Loop Count */
+#define DMA2_8_Y_COUNT         0xFFC00E18      /* DMA2 Channel 8 Outer Loop Count */
+#define DMA2_8_X_MODIFY                0xFFC00E14      /* DMA2 Channel 8 Inner Loop Addr Increment */
+#define DMA2_8_Y_MODIFY                0xFFC00E1C      /* DMA2 Channel 8 Outer Loop Addr Increment */
+#define DMA2_8_CURR_DESC_PTR   0xFFC00E20      /* DMA2 Channel 8 Current Descriptor Pointer */
+#define DMA2_8_CURR_ADDR       0xFFC00E24      /* DMA2 Channel 8 Current Address Pointer */
+#define DMA2_8_CURR_X_COUNT    0xFFC00E30      /* DMA2 Channel 8 Current Inner Loop Count */
+#define DMA2_8_CURR_Y_COUNT    0xFFC00E38      /* DMA2 Channel 8 Current Outer Loop Count */
+#define DMA2_8_IRQ_STATUS      0xFFC00E28      /* DMA2 Channel 8 Interrupt Status Register */
+#define DMA2_8_PERIPHERAL_MAP  0xFFC00E2C      /* DMA2 Channel 8 Peripheral Map Register */
+
+#define DMA2_9_CONFIG          0xFFC00E48      /* DMA2 Channel 9 Configuration register */
+#define DMA2_9_NEXT_DESC_PTR   0xFFC00E40      /* DMA2 Channel 9 Next Descripter Ptr Reg */
+#define DMA2_9_START_ADDR      0xFFC00E44      /* DMA2 Channel 9 Start Address */
+#define DMA2_9_X_COUNT         0xFFC00E50      /* DMA2 Channel 9 Inner Loop Count */
+#define DMA2_9_Y_COUNT         0xFFC00E58      /* DMA2 Channel 9 Outer Loop Count */
+#define DMA2_9_X_MODIFY                0xFFC00E54      /* DMA2 Channel 9 Inner Loop Addr Increment */
+#define DMA2_9_Y_MODIFY                0xFFC00E5C      /* DMA2 Channel 9 Outer Loop Addr Increment */
+#define DMA2_9_CURR_DESC_PTR   0xFFC00E60      /* DMA2 Channel 9 Current Descriptor Pointer */
+#define DMA2_9_CURR_ADDR       0xFFC00E64      /* DMA2 Channel 9 Current Address Pointer */
+#define DMA2_9_CURR_X_COUNT    0xFFC00E70      /* DMA2 Channel 9 Current Inner Loop Count */
+#define DMA2_9_CURR_Y_COUNT    0xFFC00E78      /* DMA2 Channel 9 Current Outer Loop Count */
+#define DMA2_9_IRQ_STATUS      0xFFC00E68      /* DMA2 Channel 9 Interrupt Status Register */
+#define DMA2_9_PERIPHERAL_MAP  0xFFC00E6C      /* DMA2 Channel 9 Peripheral Map Register */
+
+#define DMA2_10_CONFIG         0xFFC00E88      /* DMA2 Channel 10 Configuration register */
+#define DMA2_10_NEXT_DESC_PTR  0xFFC00E80      /* DMA2 Channel 10 Next Descripter Ptr Reg */
+#define DMA2_10_START_ADDR     0xFFC00E84      /* DMA2 Channel 10 Start Address */
+#define DMA2_10_X_COUNT                0xFFC00E90      /* DMA2 Channel 10 Inner Loop Count */
+#define DMA2_10_Y_COUNT                0xFFC00E98      /* DMA2 Channel 10 Outer Loop Count */
+#define DMA2_10_X_MODIFY       0xFFC00E94      /* DMA2 Channel 10 Inner Loop Addr Increment */
+#define DMA2_10_Y_MODIFY       0xFFC00E9C      /* DMA2 Channel 10 Outer Loop Addr Increment */
+#define DMA2_10_CURR_DESC_PTR  0xFFC00EA0      /* DMA2 Channel 10 Current Descriptor Pointer */
+#define DMA2_10_CURR_ADDR      0xFFC00EA4      /* DMA2 Channel 10 Current Address Pointer */
+#define DMA2_10_CURR_X_COUNT   0xFFC00EB0      /* DMA2 Channel 10 Current Inner Loop Count */
+#define DMA2_10_CURR_Y_COUNT   0xFFC00EB8      /* DMA2 Channel 10 Current Outer Loop Count */
+#define DMA2_10_IRQ_STATUS     0xFFC00EA8      /* DMA2 Channel 10 Interrupt Status Register */
+#define DMA2_10_PERIPHERAL_MAP 0xFFC00EAC      /* DMA2 Channel 10 Peripheral Map Register */
+
+#define DMA2_11_CONFIG         0xFFC00EC8      /* DMA2 Channel 11 Configuration register */
+#define DMA2_11_NEXT_DESC_PTR  0xFFC00EC0      /* DMA2 Channel 11 Next Descripter Ptr Reg */
+#define DMA2_11_START_ADDR     0xFFC00EC4      /* DMA2 Channel 11 Start Address */
+#define DMA2_11_X_COUNT                0xFFC00ED0      /* DMA2 Channel 11 Inner Loop Count */
+#define DMA2_11_Y_COUNT                0xFFC00ED8      /* DMA2 Channel 11 Outer Loop Count */
+#define DMA2_11_X_MODIFY       0xFFC00ED4      /* DMA2 Channel 11 Inner Loop Addr Increment */
+#define DMA2_11_Y_MODIFY       0xFFC00EDC      /* DMA2 Channel 11 Outer Loop Addr Increment */
+#define DMA2_11_CURR_DESC_PTR  0xFFC00EE0      /* DMA2 Channel 11 Current Descriptor Pointer */
+#define DMA2_11_CURR_ADDR      0xFFC00EE4      /* DMA2 Channel 11 Current Address Pointer */
+#define DMA2_11_CURR_X_COUNT   0xFFC00EF0      /* DMA2 Channel 11 Current Inner Loop Count */
+#define DMA2_11_CURR_Y_COUNT   0xFFC00EF8      /* DMA2 Channel 11 Current Outer Loop Count */
+#define DMA2_11_IRQ_STATUS     0xFFC00EE8      /* DMA2 Channel 11 Interrupt Status Register */
+#define DMA2_11_PERIPHERAL_MAP 0xFFC00EEC      /* DMA2 Channel 11 Peripheral Map Register */
+
+/* Memory DMA2 Controller registers (0xFFC0 0E80-0xFFC0 0FFF) */
+#define MDMA2_D0_CONFIG                0xFFC00F08      /* MemDMA2 Stream 0 Destination Configuration register */
+#define MDMA2_D0_NEXT_DESC_PTR 0xFFC00F00      /* MemDMA2 Stream 0 Destination Next Descriptor Ptr Reg */
+#define MDMA2_D0_START_ADDR    0xFFC00F04      /* MemDMA2 Stream 0 Destination Start Address */
+#define MDMA2_D0_X_COUNT       0xFFC00F10      /* MemDMA2 Stream 0 Dest Inner-Loop Count register */
+#define MDMA2_D0_Y_COUNT       0xFFC00F18      /* MemDMA2 Stream 0 Dest Outer-Loop Count register */
+#define MDMA2_D0_X_MODIFY      0xFFC00F14      /* MemDMA2 Stream 0 Dest Inner-Loop Address-Increment */
+#define MDMA2_D0_Y_MODIFY      0xFFC00F1C      /* MemDMA2 Stream 0 Dest Outer-Loop Address-Increment */
+#define MDMA2_D0_CURR_DESC_PTR 0xFFC00F20      /* MemDMA2 Stream 0 Dest Current Descriptor Ptr reg */
+#define MDMA2_D0_CURR_ADDR     0xFFC00F24      /* MemDMA2 Stream 0 Destination Current Address */
+#define MDMA2_D0_CURR_X_COUNT  0xFFC00F30      /* MemDMA2 Stream 0 Dest Current Inner-Loop Count reg */
+#define MDMA2_D0_CURR_Y_COUNT  0xFFC00F38      /* MemDMA2 Stream 0 Dest Current Outer-Loop Count reg */
+#define MDMA2_D0_IRQ_STATUS    0xFFC00F28      /* MemDMA2 Stream 0 Dest Interrupt/Status Register */
+#define MDMA2_D0_PERIPHERAL_MAP 0xFFC00F2C     /* MemDMA2 Stream 0 Destination Peripheral Map register */
+
+#define MDMA2_S0_CONFIG                0xFFC00F48      /* MemDMA2 Stream 0 Source Configuration register */
+#define MDMA2_S0_NEXT_DESC_PTR 0xFFC00F40      /* MemDMA2 Stream 0 Source Next Descriptor Ptr Reg */
+#define MDMA2_S0_START_ADDR    0xFFC00F44      /* MemDMA2 Stream 0 Source Start Address */
+#define MDMA2_S0_X_COUNT       0xFFC00F50      /* MemDMA2 Stream 0 Source Inner-Loop Count register */
+#define MDMA2_S0_Y_COUNT       0xFFC00F58      /* MemDMA2 Stream 0 Source Outer-Loop Count register */
+#define MDMA2_S0_X_MODIFY      0xFFC00F54      /* MemDMA2 Stream 0 Src Inner-Loop Addr-Increment reg */
+#define MDMA2_S0_Y_MODIFY      0xFFC00F5C      /* MemDMA2 Stream 0 Src Outer-Loop Addr-Increment reg */
+#define MDMA2_S0_CURR_DESC_PTR 0xFFC00F60      /* MemDMA2 Stream 0 Source Current Descriptor Ptr reg */
+#define MDMA2_S0_CURR_ADDR     0xFFC00F64      /* MemDMA2 Stream 0 Source Current Address */
+#define MDMA2_S0_CURR_X_COUNT  0xFFC00F70      /* MemDMA2 Stream 0 Src Current Inner-Loop Count reg */
+#define MDMA2_S0_CURR_Y_COUNT  0xFFC00F78      /* MemDMA2 Stream 0 Src Current Outer-Loop Count reg */
+#define MDMA2_S0_IRQ_STATUS    0xFFC00F68      /* MemDMA2 Stream 0 Source Interrupt/Status Register */
+#define MDMA2_S0_PERIPHERAL_MAP        0xFFC00F6C      /* MemDMA2 Stream 0 Source Peripheral Map register */
+
+#define MDMA2_D1_CONFIG                0xFFC00F88      /* MemDMA2 Stream 1 Destination Configuration register */
+#define MDMA2_D1_NEXT_DESC_PTR 0xFFC00F80      /* MemDMA2 Stream 1 Destination Next Descriptor Ptr Reg */
+#define MDMA2_D1_START_ADDR    0xFFC00F84      /* MemDMA2 Stream 1 Destination Start Address */
+#define MDMA2_D1_X_COUNT       0xFFC00F90      /* MemDMA2 Stream 1 Dest Inner-Loop Count register */
+#define MDMA2_D1_Y_COUNT       0xFFC00F98      /* MemDMA2 Stream 1 Dest Outer-Loop Count register */
+#define MDMA2_D1_X_MODIFY      0xFFC00F94      /* MemDMA2 Stream 1 Dest Inner-Loop Address-Increment */
+#define MDMA2_D1_Y_MODIFY      0xFFC00F9C      /* MemDMA2 Stream 1 Dest Outer-Loop Address-Increment */
+#define MDMA2_D1_CURR_DESC_PTR 0xFFC00FA0      /* MemDMA2 Stream 1 Destination Current Descriptor Ptr */
+#define MDMA2_D1_CURR_ADDR     0xFFC00FA4      /* MemDMA2 Stream 1 Destination Current Address reg */
+#define MDMA2_D1_CURR_X_COUNT  0xFFC00FB0      /* MemDMA2 Stream 1 Dest Current Inner-Loop Count reg */
+#define MDMA2_D1_CURR_Y_COUNT  0xFFC00FB8      /* MemDMA2 Stream 1 Dest Current Outer-Loop Count reg */
+#define MDMA2_D1_IRQ_STATUS    0xFFC00FA8      /* MemDMA2 Stream 1 Destination Interrupt/Status Reg */
+#define MDMA2_D1_PERIPHERAL_MAP 0xFFC00FAC     /* MemDMA2 Stream 1 Destination Peripheral Map register */
+
+#define MDMA2_S1_CONFIG                0xFFC00FC8      /* MemDMA2 Stream 1 Source Configuration register */
+#define MDMA2_S1_NEXT_DESC_PTR 0xFFC00FC0      /* MemDMA2 Stream 1 Source Next Descriptor Ptr Reg */
+#define MDMA2_S1_START_ADDR    0xFFC00FC4      /* MemDMA2 Stream 1 Source Start Address */
+#define MDMA2_S1_X_COUNT       0xFFC00FD0      /* MemDMA2 Stream 1 Source Inner-Loop Count register */
+#define MDMA2_S1_Y_COUNT       0xFFC00FD8      /* MemDMA2 Stream 1 Source Outer-Loop Count register */
+#define MDMA2_S1_X_MODIFY      0xFFC00FD4      /* MemDMA2 Stream 1 Src Inner-Loop Address-Increment */
+#define MDMA2_S1_Y_MODIFY      0xFFC00FDC      /* MemDMA2 Stream 1 Source Outer-Loop Address-Increment */
+#define MDMA2_S1_CURR_DESC_PTR 0xFFC00FE0      /* MemDMA2 Stream 1 Source Current Descriptor Ptr reg */
+#define MDMA2_S1_CURR_ADDR     0xFFC00FE4      /* MemDMA2 Stream 1 Source Current Address */
+#define MDMA2_S1_CURR_X_COUNT  0xFFC00FF0      /* MemDMA2 Stream 1 Source Current Inner-Loop Count */
+#define MDMA2_S1_CURR_Y_COUNT  0xFFC00FF8      /* MemDMA2 Stream 1 Source Current Outer-Loop Count */
+#define MDMA2_S1_IRQ_STATUS    0xFFC00FE8      /* MemDMA2 Stream 1 Source Interrupt/Status Register */
+#define MDMA2_S1_PERIPHERAL_MAP        0xFFC00FEC      /* MemDMA2 Stream 1 Source Peripheral Map register */
+
+/* Internal Memory DMA Registers (0xFFC0_1800 - 0xFFC0_19FF) */
+#define IMDMA_D0_CONFIG                0xFFC01808      /* IMDMA Stream 0 Destination Configuration */
+#define IMDMA_D0_NEXT_DESC_PTR 0xFFC01800      /* IMDMA Stream 0 Destination Next Descriptor Ptr Reg */
+#define IMDMA_D0_START_ADDR    0xFFC01804      /* IMDMA Stream 0 Destination Start Address */
+#define IMDMA_D0_X_COUNT       0xFFC01810      /* IMDMA Stream 0 Destination Inner-Loop Count */
+#define IMDMA_D0_Y_COUNT       0xFFC01818      /* IMDMA Stream 0 Destination Outer-Loop Count */
+#define IMDMA_D0_X_MODIFY      0xFFC01814      /* IMDMA Stream 0 Dest Inner-Loop Address-Increment */
+#define IMDMA_D0_Y_MODIFY      0xFFC0181C      /* IMDMA Stream 0 Dest Outer-Loop Address-Increment */
+#define IMDMA_D0_CURR_DESC_PTR 0xFFC01820      /* IMDMA Stream 0 Destination Current Descriptor Ptr */
+#define IMDMA_D0_CURR_ADDR     0xFFC01824      /* IMDMA Stream 0 Destination Current Address */
+#define IMDMA_D0_CURR_X_COUNT  0xFFC01830      /* IMDMA Stream 0 Destination Current Inner-Loop Count */
+#define IMDMA_D0_CURR_Y_COUNT  0xFFC01838      /* IMDMA Stream 0 Destination Current Outer-Loop Count */
+#define IMDMA_D0_IRQ_STATUS    0xFFC01828      /* IMDMA Stream 0 Destination Interrupt/Status */
+
+#define IMDMA_S0_CONFIG                0xFFC01848      /* IMDMA Stream 0 Source Configuration */
+#define IMDMA_S0_NEXT_DESC_PTR 0xFFC01840      /* IMDMA Stream 0 Source Next Descriptor Ptr Reg */
+#define IMDMA_S0_START_ADDR    0xFFC01844      /* IMDMA Stream 0 Source Start Address */
+#define IMDMA_S0_X_COUNT       0xFFC01850      /* IMDMA Stream 0 Source Inner-Loop Count */
+#define IMDMA_S0_Y_COUNT       0xFFC01858      /* IMDMA Stream 0 Source Outer-Loop Count */
+#define IMDMA_S0_X_MODIFY      0xFFC01854      /* IMDMA Stream 0 Source Inner-Loop Address-Increment */
+#define IMDMA_S0_Y_MODIFY      0xFFC0185C      /* IMDMA Stream 0 Source Outer-Loop Address-Increment */
+#define IMDMA_S0_CURR_DESC_PTR 0xFFC01860      /* IMDMA Stream 0 Source Current Descriptor Ptr reg */
+#define IMDMA_S0_CURR_ADDR     0xFFC01864      /* IMDMA Stream 0 Source Current Address */
+#define IMDMA_S0_CURR_X_COUNT  0xFFC01870      /* IMDMA Stream 0 Source Current Inner-Loop Count */
+#define IMDMA_S0_CURR_Y_COUNT  0xFFC01878      /* IMDMA Stream 0 Source Current Outer-Loop Count */
+#define IMDMA_S0_IRQ_STATUS    0xFFC01868      /* IMDMA Stream 0 Source Interrupt/Status */
+
+#define IMDMA_D1_CONFIG                0xFFC01888      /* IMDMA Stream 1 Destination Configuration */
+#define IMDMA_D1_NEXT_DESC_PTR 0xFFC01880      /* IMDMA Stream 1 Destination Next Descriptor Ptr Reg */
+#define IMDMA_D1_START_ADDR    0xFFC01884      /* IMDMA Stream 1 Destination Start Address */
+#define IMDMA_D1_X_COUNT       0xFFC01890      /* IMDMA Stream 1 Destination Inner-Loop Count */
+#define IMDMA_D1_Y_COUNT       0xFFC01898      /* IMDMA Stream 1 Destination Outer-Loop Count */
+#define IMDMA_D1_X_MODIFY      0xFFC01894      /* IMDMA Stream 1 Dest Inner-Loop Address-Increment */
+#define IMDMA_D1_Y_MODIFY      0xFFC0189C      /* IMDMA Stream 1 Dest Outer-Loop Address-Increment */
+#define IMDMA_D1_CURR_DESC_PTR 0xFFC018A0      /* IMDMA Stream 1 Destination Current Descriptor Ptr */
+#define IMDMA_D1_CURR_ADDR     0xFFC018A4      /* IMDMA Stream 1 Destination Current Address */
+#define IMDMA_D1_CURR_X_COUNT  0xFFC018B0      /* IMDMA Stream 1 Destination Current Inner-Loop Count */
+#define IMDMA_D1_CURR_Y_COUNT  0xFFC018B8      /* IMDMA Stream 1 Destination Current Outer-Loop Count */
+#define IMDMA_D1_IRQ_STATUS    0xFFC018A8      /* IMDMA Stream 1 Destination Interrupt/Status */
+
+#define IMDMA_S1_CONFIG                0xFFC018C8      /* IMDMA Stream 1 Source Configuration */
+#define IMDMA_S1_NEXT_DESC_PTR 0xFFC018C0      /* IMDMA Stream 1 Source Next Descriptor Ptr Reg */
+#define IMDMA_S1_START_ADDR    0xFFC018C4      /* IMDMA Stream 1 Source Start Address */
+#define IMDMA_S1_X_COUNT       0xFFC018D0      /* IMDMA Stream 1 Source Inner-Loop Count */
+#define IMDMA_S1_Y_COUNT       0xFFC018D8      /* IMDMA Stream 1 Source Outer-Loop Count */
+#define IMDMA_S1_X_MODIFY      0xFFC018D4      /* IMDMA Stream 1 Source Inner-Loop Address-Increment */
+#define IMDMA_S1_Y_MODIFY      0xFFC018DC      /* IMDMA Stream 1 Source Outer-Loop Address-Increment */
+#define IMDMA_S1_CURR_DESC_PTR 0xFFC018E0      /* IMDMA Stream 1 Source Current Descriptor Ptr reg */
+#define IMDMA_S1_CURR_ADDR     0xFFC018E4      /* IMDMA Stream 1 Source Current Address */
+#define IMDMA_S1_CURR_X_COUNT  0xFFC018F0      /* IMDMA Stream 1 Source Current Inner-Loop Count */
+#define IMDMA_S1_CURR_Y_COUNT  0xFFC018F8      /* IMDMA Stream 1 Source Current Outer-Loop Count */
+#define IMDMA_S1_IRQ_STATUS    0xFFC018E8      /* IMDMA Stream 1 Source Interrupt/Status */
+
+/*
+ * System MMR Register Bits
+ */
+
+/* PLL AND RESET MASKS */
+
+/* PLL_CTL Masks */
+#define PLL_CLKIN              0x00000000      /* Pass CLKIN to PLL */
+#define PLL_CLKIN_DIV2         0x00000001      /* Pass CLKIN/2 to PLL */
+#define PLL_OFF                        0x00000002      /* Shut off PLL clocks */
+#define STOPCK_OFF             0x00000008      /* Core clock off */
+#define PDWN                   0x00000020      /* Put the PLL in a Deep Sleep state */
+#define BYPASS                 0x00000100      /* Bypass the PLL */
+
+/* PLL_DIV Masks */
+
+#define SCLK_DIV(x)            (x)             /* SCLK = VCO / x */
+
+#define CCLK_DIV1              0x00000000      /* CCLK = VCO / 1 */
+#define CCLK_DIV2              0x00000010      /* CCLK = VCO / 2 */
+#define CCLK_DIV4              0x00000020      /* CCLK = VCO / 4 */
+#define CCLK_DIV8              0x00000030      /* CCLK = VCO / 8 */
+
+/* SWRST Mask */
+#define SYSTEM_RESET           0x00000007      /* Initiates a system software reset */
+#define SWRST_DBL_FAULT_B      0x00000800      /* SWRST Core B Double Fault */
+#define SWRST_DBL_FAULT_A      0x00001000      /* SWRST Core A Double Fault */
+#define SWRST_WDT_B            0x00002000      /* SWRST Watchdog B */
+#define SWRST_WDT_A            0x00004000      /* SWRST Watchdog A */
+#define SWRST_OCCURRED         0x00008000      /* SWRST Status */
+
+/*
+ * SYSTEM INTERRUPT CONTROLLER MASKS
+ * SICu_IARv Masks
+ * u = A or B
+ * v = 0 to 7
+ * w = 0 or 1
+
+ * Per_number = 0 to 63
+ * IVG_number = 7 to 15
+ * Peripheral #Per_number assigned IVG #IVG_number
+ * Usage:
+ *      r0.l = lo(Peripheral_IVG(62, 10));
+ *      r0.h = hi(Peripheral_IVG(62, 10));
+ */
+#define Peripheral_IVG(Per_number, IVG_number)    \
+                               ( (IVG_number) -7) << ( ((Per_number)%8) *4)
+
+/* SICx_IMASKw Masks */
+/* masks are 32 bit wide, so two writes reguired for "64 bit" wide registers */
+#define SIC_UNMASK_ALL         0x00000000      /* Unmask all peripheral interrupts */
+#define SIC_MASK_ALL           0xFFFFFFFF      /* Mask all peripheral interrupts */
+#define SIC_MASK(x)            (1 << (x))      /* Mask Peripheral #x interrupt */
+#define SIC_UNMASK(x)          (0xFFFFFFFF ^ (1 << (x)))/* Unmask Peripheral #x interrupt */
+
+/* SIC_IWR Masks */
+#define IWR_DISABLE_ALL                0x00000000      /* Wakeup Disable all peripherals */
+#define IWR_ENABLE_ALL         0xFFFFFFFF      /* Wakeup Enable all peripherals */
+/* x = pos 0 to 31, for 32-63 use value-32 */
+#define IWR_ENABLE(x)          (1 << (x))      /* Wakeup Enable Peripheral #x */
+/* Wakeup Disable Peripheral #x */
+#define IWR_DISABLE(x)         (0xFFFFFFFF ^ (1 << (x)))
+
+/*
+ * WATCHDOG TIMER MASKS
+ */
+
+/* Watchdog Timer WDOG_CTL Register */
+#define        WDOGA_CTL               0xFFC00200
+#define        WDOGA_CNT               0xFFC00204
+#define        WDOGA_STAT              0xFFC00208
+#define        WDOGB_CTL               0xFFC01200
+#define        WDOGB_CNT               0xFFC01204
+#define        WDOGB_STAT              0xFFC01208
+#define ICTL(x)                        ((x<<1) & 0x0006)
+#define ENABLE_RESET           0x00000000      /* Set Watchdog Timer to generate reset */
+#define ENABLE_NMI             0x00000002      /* Set Watchdog Timer to generate non-maskable interrupt */
+#define ENABLE_GPI             0x00000004      /* Set Watchdog Timer to generate general-purpose interrupt */
+#define DISABLE_EVT            0x00000006      /* Disable Watchdog Timer interrupts */
+
+#define TMR_EN                 0x0000
+#define TMR_DIS                        0x0AD0
+#define TRO                    0x8000
+
+#define ICTL_P0                        0x01
+#define ICTL_P1                        0x02
+#define TRO_P                  0x0F
+
+/*
+ * UART CONTROLLER MASKS
+ */
+
+/* UART_LCR Register */
+
+#define DLAB                   0x80
+#define SB                     0x40
+#define STP                    0x20
+#define EPS                    0x10
+#define PEN                    0x08
+#define STB                    0x04
+#define WLS(x)                 ((x-5) & 0x03)
+
+#define DLAB_P                 0x07
+#define SB_P                   0x06
+#define STP_P                  0x05
+#define EPS_P                  0x04
+#define PEN_P                  0x03
+#define STB_P                  0x02
+#define WLS_P1                 0x01
+#define WLS_P0                 0x00
+
+/* UART_MCR Register */
+#define LOOP_ENA               0x10
+#define LOOP_ENA_P             0x04
+
+/* UART_LSR Register */
+#define TEMT                   0x40
+#define THRE                   0x20
+#define BI                     0x10
+#define FE                     0x08
+#define PE                     0x04
+#define OE                     0x02
+#define DR                     0x01
+
+#define TEMP_P                 0x06
+#define THRE_P                 0x05
+#define BI_P                   0x04
+#define FE_P                   0x03
+#define PE_P                   0x02
+#define OE_P                   0x01
+#define DR_P                   0x00
+
+/* UART_IER Register */
+#define ELSI                   0x04
+#define ETBEI                  0x02
+#define ERBFI                  0x01
+
+#define ELSI_P                 0x02
+#define ETBEI_P                        0x01
+#define ERBFI_P                        0x00
+
+/* UART_IIR Register */
+#define STATUS(x)              ((x << 1) & 0x06)
+#define NINT                   0x01
+#define STATUS_P1              0x02
+#define STATUS_P0              0x01
+#define NINT_P                 0x00
+
+/* UART_GCTL Register */
+#define FFE                    0x20
+#define FPE                    0x10
+#define RPOLC                  0x08
+#define TPOLC                  0x04
+#define IREN                   0x02
+#define UCEN                   0x01
+
+#define FFE_P                  0x05
+#define FPE_P                  0x04
+#define RPOLC_P                        0x03
+#define TPOLC_P                        0x02
+#define IREN_P                 0x01
+#define UCEN_P                 0x00
+
+/*
+ * SERIAL PORT MASKS
+ */
+
+/* SPORTx_TCR1 Masks */
+#define TSPEN                  0x0001  /* TX enable */
+#define ITCLK                  0x0002  /* Internal TX Clock Select */
+#define TDTYPE                 0x000C  /* TX Data Formatting Select */
+#define TLSBIT                 0x0010  /* TX Bit Order */
+#define ITFS                   0x0200  /* Internal TX Frame Sync Select */
+#define TFSR                   0x0400  /* TX Frame Sync Required Select */
+#define DITFS                  0x0800  /* Data Independent TX Frame Sync Select */
+#define LTFS                   0x1000  /* Low TX Frame Sync Select */
+#define LATFS                  0x2000  /* Late TX Frame Sync Select */
+#define TCKFE                  0x4000  /* TX Clock Falling Edge Select */
+
+/* SPORTx_TCR2 Masks */
+#define SLEN                   0x001F  /* TX Word Length */
+#define TXSE                   0x0100  /* TX Secondary Enable */
+#define TSFSE                  0x0200  /* TX Stereo Frame Sync Enable */
+#define TRFST                  0x0400  /* TX Right-First Data Order */
+
+/* SPORTx_RCR1 Masks */
+#define RSPEN                  0x0001  /* RX enable */
+#define IRCLK                  0x0002  /* Internal RX Clock Select */
+#define RDTYPE                 0x000C  /* RX Data Formatting Select */
+#define RULAW                  0x0008  /* u-Law enable */
+#define RALAW                  0x000C  /* A-Law enable */
+#define RLSBIT                 0x0010  /* RX Bit Order */
+#define IRFS                   0x0200  /* Internal RX Frame Sync Select */
+#define RFSR                   0x0400  /* RX Frame Sync Required Select */
+#define LRFS                   0x1000  /* Low RX Frame Sync Select */
+#define LARFS                  0x2000  /* Late RX Frame Sync Select */
+#define RCKFE                  0x4000  /* RX Clock Falling Edge Select */
+
+/* SPORTx_RCR2 Masks */
+#define SLEN                   0x001F  /* RX Word Length */
+#define RXSE                   0x0100  /* RX Secondary Enable */
+#define RSFSE                  0x0200  /* RX Stereo Frame Sync Enable */
+#define RRFST                  0x0400  /* Right-First Data Order */
+
+/* SPORTx_STAT Masks */
+#define RXNE                   0x0001  /* RX FIFO Not Empty Status */
+#define RUVF                   0x0002  /* RX Underflow Status */
+#define ROVF                   0x0004  /* RX Overflow Status */
+#define TXF                    0x0008  /* TX FIFO Full Status */
+#define TUVF                   0x0010  /* TX Underflow Status */
+#define TOVF                   0x0020  /* TX Overflow Status */
+#define TXHRE                  0x0040  /* TX Hold Register Empty */
+
+/* SPORTx_MCMC1 Masks */
+#define WSIZE                  0x0000F000      /* Multichannel Window Size Field */
+#define WOFF                   0x000003FF      /* Multichannel Window Offset Field */
+
+/* SPORTx_MCMC2 Masks */
+#define MCCRM                  0x00000003      /* Multichannel Clock Recovery Mode */
+#define MCDTXPE                        0x00000004      /* Multichannel DMA Transmit Packing */
+#define MCDRXPE                        0x00000008      /* Multichannel DMA Receive Packing */
+#define MCMEN                  0x00000010      /* Multichannel Frame Mode Enable */
+#define FSDR                   0x00000080      /* Multichannel Frame Sync to Data Relationship */
+#define MFD                    0x0000F000      /* Multichannel Frame Delay */
+
+/*
+ * PARALLEL PERIPHERAL INTERFACE (PPI) MASKS
+ */
+
+/* PPI_CONTROL Masks */
+#define PORT_EN                        0x00000001      /* PPI Port Enable */
+#define PORT_DIR               0x00000002      /* PPI Port Direction */
+#define XFR_TYPE               0x0000000C      /* PPI Transfer Type */
+#define PORT_CFG               0x00000030      /* PPI Port Configuration */
+#define FLD_SEL                        0x00000040      /* PPI Active Field Select */
+#define PACK_EN                        0x00000080      /* PPI Packing Mode */
+#define DMA32                  0x00000100      /* PPI 32-bit DMA Enable */
+#define SKIP_EN                        0x00000200      /* PPI Skip Element Enable */
+#define SKIP_EO                        0x00000400      /* PPI Skip Even/Odd Elements */
+#define DLENGTH                        0x00003800      /* PPI Data Length */
+#define DLEN_8                 0x0             /* PPI Data Length mask for DLEN=8 */
+#define DLEN(x)                        (((x-9) & 0x07) << 11)  /* PPI Data Length (only works for x=10-->x=16) */
+#define POL                    0x0000C000      /* PPI Signal Polarities */
+
+/* PPI_STATUS Masks */
+#define FLD                    0x00000400      /* Field Indicator */
+#define FT_ERR                 0x00000800      /* Frame Track Error */
+#define OVR                    0x00001000      /* FIFO Overflow Error */
+#define UNDR                   0x00002000      /* FIFO Underrun Error */
+#define ERR_DET                        0x00004000      /* Error Detected Indicator */
+#define ERR_NCOR               0x00008000      /* Error Not Corrected Indicator */
+
+/*
+ * DMA CONTROLLER MASKS
+ */
+
+/* DMAx_CONFIG, MDMA_yy_CONFIG, IMDMA_yy_CONFIG Masks */
+#define DMAEN                  0x00000001      /* Channel Enable */
+#define WNR                    0x00000002      /* Channel Direction (W/R*) */
+#define WDSIZE_8               0x00000000      /* Word Size 8 bits */
+#define WDSIZE_16              0x00000004      /* Word Size 16 bits */
+#define WDSIZE_32              0x00000008      /* Word Size 32 bits */
+#define DMA2D                  0x00000010      /* 2D/1D* Mode */
+#define RESTART                        0x00000020      /* Restart */
+#define DI_SEL                 0x00000040      /* Data Interrupt Select */
+#define DI_EN                  0x00000080      /* Data Interrupt Enable */
+#define NDSIZE                 0x00000900      /* Next Descriptor Size */
+#define FLOW                   0x00007000      /* Flow Control */
+
+#define DMAEN_P                        0               /* Channel Enable */
+#define WNR_P                  1               /* Channel Direction (W/R*) */
+#define DMA2D_P                        4               /* 2D/1D* Mode */
+#define RESTART_P              5               /* Restart */
+#define DI_SEL_P               6               /* Data Interrupt Select */
+#define DI_EN_P                        7               /* Data Interrupt Enable */
+
+/* DMAx_IRQ_STATUS, MDMA_yy_IRQ_STATUS, IMDMA_yy_IRQ_STATUS Masks */
+
+#define DMA_DONE               0x00000001      /* DMA Done Indicator */
+#define DMA_ERR                        0x00000002      /* DMA Error Indicator */
+#define DFETCH                 0x00000004      /* Descriptor Fetch Indicator */
+#define DMA_RUN                        0x00000008      /* DMA Running Indicator */
+
+#define DMA_DONE_P             0               /* DMA Done Indicator */
+#define DMA_ERR_P              1               /* DMA Error Indicator */
+#define DFETCH_P               2               /* Descriptor Fetch Indicator */
+#define DMA_RUN_P              3               /* DMA Running Indicator */
+
+/* DMAx_PERIPHERAL_MAP, MDMA_yy_PERIPHERAL_MAP, IMDMA_yy_PERIPHERAL_MAP Masks */
+
+#define CTYPE                  0x00000040      /* DMA Channel Type Indicator */
+#define CTYPE_P                        6               /* DMA Channel Type Indicator BIT POSITION */
+#define PCAP8                  0x00000080      /* DMA 8-bit Operation Indicator */
+#define PCAP16                 0x00000100      /* DMA 16-bit Operation Indicator */
+#define PCAP32                 0x00000200      /* DMA 32-bit Operation Indicator */
+#define PCAPWR                 0x00000400      /* DMA Write Operation Indicator */
+#define PCAPRD                 0x00000800      /* DMA Read Operation Indicator */
+#define PMAP                   0x00007000      /* DMA Peripheral Map Field */
+
+/*
+ * GENERAL PURPOSE TIMER MASKS
+ */
+
+/* PWM Timer bit definitions */
+
+/* TIMER_ENABLE Register */
+#define TIMEN0                 0x0001
+#define TIMEN1                 0x0002
+#define TIMEN2                 0x0004
+#define TIMEN3                 0x0008
+#define TIMEN4                 0x0010
+#define TIMEN5                 0x0020
+#define TIMEN6                 0x0040
+#define TIMEN7                 0x0080
+#define TIMEN8                 0x0001
+#define TIMEN9                 0x0002
+#define TIMEN10                        0x0004
+#define TIMEN11                        0x0008
+
+#define TIMEN0_P               0x00
+#define TIMEN1_P               0x01
+#define TIMEN2_P               0x02
+#define TIMEN3_P               0x03
+#define TIMEN4_P               0x04
+#define TIMEN5_P               0x05
+#define TIMEN6_P               0x06
+#define TIMEN7_P               0x07
+#define TIMEN8_P               0x00
+#define TIMEN9_P               0x01
+#define TIMEN10_P              0x02
+#define TIMEN11_P              0x03
+
+/* TIMER_DISABLE Register */
+#define TIMDIS0                        0x0001
+#define TIMDIS1                        0x0002
+#define TIMDIS2                        0x0004
+#define TIMDIS3                        0x0008
+#define TIMDIS4                        0x0010
+#define TIMDIS5                        0x0020
+#define TIMDIS6                        0x0040
+#define TIMDIS7                        0x0080
+#define TIMDIS8                        0x0001
+#define TIMDIS9                        0x0002
+#define TIMDIS10               0x0004
+#define TIMDIS11               0x0008
+
+#define TIMDIS0_P              0x00
+#define TIMDIS1_P              0x01
+#define TIMDIS2_P              0x02
+#define TIMDIS3_P              0x03
+#define TIMDIS4_P              0x04
+#define TIMDIS5_P              0x05
+#define TIMDIS6_P              0x06
+#define TIMDIS7_P              0x07
+#define TIMDIS8_P              0x00
+#define TIMDIS9_P              0x01
+#define TIMDIS10_P             0x02
+#define TIMDIS11_P             0x03
+
+/* TIMER_STATUS Register */
+#define TIMIL0                 0x00000001
+#define TIMIL1                 0x00000002
+#define TIMIL2                 0x00000004
+#define TIMIL3                 0x00000008
+#define TIMIL4                 0x00010000
+#define TIMIL5                 0x00020000
+#define TIMIL6                 0x00040000
+#define TIMIL7                 0x00080000
+#define TIMIL8                 0x0001
+#define TIMIL9                 0x0002
+#define TIMIL10                        0x0004
+#define TIMIL11                        0x0008
+#define TOVL_ERR0              0x00000010
+#define TOVL_ERR1              0x00000020
+#define TOVL_ERR2              0x00000040
+#define TOVL_ERR3              0x00000080
+#define TOVL_ERR4              0x00100000
+#define TOVL_ERR5              0x00200000
+#define TOVL_ERR6              0x00400000
+#define TOVL_ERR7              0x00800000
+#define TOVL_ERR8              0x0010
+#define TOVL_ERR9              0x0020
+#define TOVL_ERR10             0x0040
+#define TOVL_ERR11             0x0080
+#define TRUN0                  0x00001000
+#define TRUN1                  0x00002000
+#define TRUN2                  0x00004000
+#define TRUN3                  0x00008000
+#define TRUN4                  0x10000000
+#define TRUN5                  0x20000000
+#define TRUN6                  0x40000000
+#define TRUN7                  0x80000000
+#define TRUN8                  0x1000
+#define TRUN9                  0x2000
+#define TRUN10                 0x4000
+#define TRUN11                 0x8000
+
+#define TIMIL0_P               0x00
+#define TIMIL1_P               0x01
+#define TIMIL2_P               0x02
+#define TIMIL3_P               0x03
+#define TIMIL4_P               0x10
+#define TIMIL5_P               0x11
+#define TIMIL6_P               0x12
+#define TIMIL7_P               0x13
+#define TIMIL8_P               0x00
+#define TIMIL9_P               0x01
+#define TIMIL10_P              0x02
+#define TIMIL11_P              0x03
+#define TOVL_ERR0_P            0x04
+#define TOVL_ERR1_P            0x05
+#define TOVL_ERR2_P            0x06
+#define TOVL_ERR3_P            0x07
+#define TOVL_ERR4_P            0x14
+#define TOVL_ERR5_P            0x15
+#define TOVL_ERR6_P            0x16
+#define TOVL_ERR7_P            0x17
+#define TOVL_ERR8_P            0x04
+#define TOVL_ERR9_P            0x05
+#define TOVL_ERR10_P           0x06
+#define TOVL_ERR11_P           0x07
+#define TRUN0_P                        0x0C
+#define TRUN1_P                        0x0D
+#define TRUN2_P                        0x0E
+#define TRUN3_P                        0x0F
+#define TRUN4_P                        0x1C
+#define TRUN5_P                        0x1D
+#define TRUN6_P                        0x1E
+#define TRUN7_P                        0x1F
+#define TRUN8_P                        0x0C
+#define TRUN9_P                        0x0D
+#define TRUN10_P               0x0E
+#define TRUN11_P               0x0F
+
+/* TIMERx_CONFIG Registers */
+#define PWM_OUT                        0x0001
+#define WDTH_CAP               0x0002
+#define EXT_CLK                        0x0003
+#define PULSE_HI               0x0004
+#define PERIOD_CNT             0x0008
+#define IRQ_ENA                        0x0010
+#define TIN_SEL                        0x0020
+#define OUT_DIS                        0x0040
+#define CLK_SEL                        0x0080
+#define TOGGLE_HI              0x0100
+#define EMU_RUN                        0x0200
+#define ERR_TYP(x)             ((x & 0x03) << 14)
+
+#define TMODE_P0               0x00
+#define TMODE_P1               0x01
+#define PULSE_HI_P             0x02
+#define PERIOD_CNT_P           0x03
+#define IRQ_ENA_P              0x04
+#define TIN_SEL_P              0x05
+#define OUT_DIS_P              0x06
+#define CLK_SEL_P              0x07
+#define TOGGLE_HI_P            0x08
+#define EMU_RUN_P              0x09
+#define ERR_TYP_P0             0x0E
+#define ERR_TYP_P1             0x0F
+
+/*
+ * PROGRAMMABLE FLAG MASKS
+ */
+
+/* General Purpose IO (0xFFC00700 - 0xFFC007FF)  Masks */
+#define PF0                    0x0001
+#define PF1                    0x0002
+#define PF2                    0x0004
+#define PF3                    0x0008
+#define PF4                    0x0010
+#define PF5                    0x0020
+#define PF6                    0x0040
+#define PF7                    0x0080
+#define PF8                    0x0100
+#define PF9                    0x0200
+#define PF10                   0x0400
+#define PF11                   0x0800
+#define PF12                   0x1000
+#define PF13                   0x2000
+#define PF14                   0x4000
+#define PF15                   0x8000
+
+/* General Purpose IO (0xFFC00700 - 0xFFC007FF)  BIT POSITIONS */
+#define PF0_P                  0
+#define PF1_P                  1
+#define PF2_P                  2
+#define PF3_P                  3
+#define PF4_P                  4
+#define PF5_P                  5
+#define PF6_P                  6
+#define PF7_P                  7
+#define PF8_P                  8
+#define PF9_P                  9
+#define PF10_P                 10
+#define PF11_P                 11
+#define PF12_P                 12
+#define PF13_P                 13
+#define PF14_P                 14
+#define PF15_P                 15
+
+/*
+ * SERIAL PERIPHERAL INTERFACE (SPI) MASKS
+ */
+
+/* SPI_CTL Masks */
+#define TIMOD          0x00000003      /* Transfer initiation mode and interrupt generation */
+#define SZ             0x00000004      /* Send Zero (=0) or last (=1) word when TDBR empty. */
+#define GM             0x00000008      /* When RDBR full, get more (=1) data or discard (=0) incoming Data */
+#define PSSE           0x00000010      /* Enable (=1) Slave-Select input for Master. */
+#define EMISO          0x00000020      /* Enable (=1) MISO pin as an output. */
+#define SIZE           0x00000100      /* Word length (0 => 8 bits, 1 => 16 bits) */
+#define LSBF           0x00000200      /* Data format (0 => MSB sent/received first 1 => LSB sent/received first) */
+
+/* Clock phase (0 => SPICLK starts toggling in middle of xfer, 1 => SPICLK toggles at the beginning of xfer.*/
+#define CPHA           0x00000400
+#define CPOL           0x00000800      /* Clock polarity (0 => active-high, 1 => active-low) */
+#define MSTR           0x00001000      /* Configures SPI as master (=1) or slave (=0) */
+#define WOM            0x00002000      /* Open drain (=1) data output enable (for MOSI and MISO) */
+#define SPE            0x00004000      /* SPI module enable (=1), disable (=0) */
+
+/* SPI_FLG Masks */
+#define FLS1           0x00000002      /* Enables (=1) SPI_FLOUT1 as flag output for SPI Slave-select */
+#define FLS2           0x00000004      /* Enables (=1) SPI_FLOUT2 as flag output for SPI Slave-select */
+#define FLS3           0x00000008      /* Enables (=1) SPI_FLOUT3 as flag output for SPI Slave-select */
+#define FLS4           0x00000010      /* Enables (=1) SPI_FLOUT4 as flag output for SPI Slave-select */
+#define FLS5           0x00000020      /* Enables (=1) SPI_FLOUT5 as flag output for SPI Slave-select */
+#define FLS6           0x00000040      /* Enables (=1) SPI_FLOUT6 as flag output for SPI Slave-select */
+#define FLS7           0x00000080      /* Enables (=1) SPI_FLOUT7 as flag output for SPI Slave-select */
+#define FLG1           0x00000200      /* Activates (=0) SPI_FLOUT1 as flag output for SPI Slave-select */
+#define FLG2           0x00000400      /* Activates (=0) SPI_FLOUT2 as flag output for SPI Slave-select */
+#define FLG3           0x00000800      /* Activates (=0) SPI_FLOUT3 as flag output for SPI Slave-select */
+#define FLG4           0x00001000      /* Activates (=0) SPI_FLOUT4 as flag output for SPI Slave-select */
+#define FLG5           0x00002000      /* Activates (=0) SPI_FLOUT5 as flag output for SPI Slave-select */
+#define FLG6           0x00004000      /* Activates (=0) SPI_FLOUT6 as flag output for SPI Slave-select */
+#define FLG7           0x00008000      /* Activates (=0) SPI_FLOUT7 as flag output for SPI Slave-select */
+
+/* SPI_FLG Bit Positions */
+#define FLS1_P         0x00000001      /* Enables (=1) SPI_FLOUT1 as flag output for SPI Slave-select */
+#define FLS2_P         0x00000002      /* Enables (=1) SPI_FLOUT2 as flag output for SPI Slave-select */
+#define FLS3_P         0x00000003      /* Enables (=1) SPI_FLOUT3 as flag output for SPI Slave-select */
+#define FLS4_P         0x00000004      /* Enables (=1) SPI_FLOUT4 as flag output for SPI Slave-select */
+#define FLS5_P         0x00000005      /* Enables (=1) SPI_FLOUT5 as flag output for SPI Slave-select */
+#define FLS6_P         0x00000006      /* Enables (=1) SPI_FLOUT6 as flag output for SPI Slave-select */
+#define FLS7_P         0x00000007      /* Enables (=1) SPI_FLOUT7 as flag output for SPI Slave-select */
+#define FLG1_P         0x00000009      /* Activates (=0) SPI_FLOUT1 as flag output for SPI Slave-select */
+#define FLG2_P         0x0000000A      /* Activates (=0) SPI_FLOUT2 as flag output for SPI Slave-select */
+#define FLG3_P         0x0000000B      /* Activates (=0) SPI_FLOUT3 as flag output for SPI Slave-select */
+#define FLG4_P         0x0000000C      /* Activates (=0) SPI_FLOUT4 as flag output for SPI Slave-select */
+#define FLG5_P         0x0000000D      /* Activates (=0) SPI_FLOUT5 as flag output for SPI Slave-select */
+#define FLG6_P         0x0000000E      /* Activates (=0) SPI_FLOUT6 as flag output for SPI Slave-select */
+#define FLG7_P         0x0000000F      /* Activates (=0) SPI_FLOUT7 as flag output for SPI Slave-select */
+
+/* SPI_STAT Masks */
+#define SPIF           0x00000001      /* Set (=1) when SPI single-word transfer complete */
+#define MODF           0x00000002      /* Set (=1) in a master device when some other device tries to become master */
+#define TXE            0x00000004      /* Set (=1) when transmission occurs with no new data in SPI_TDBR */
+#define TXS            0x00000008      /* SPI_TDBR Data Buffer Status (0=Empty, 1=Full) */
+#define RBSY           0x00000010      /* Set (=1) when data is received with RDBR full */
+#define RXS            0x00000020      /* SPI_RDBR Data Buffer Status (0=Empty, 1=Full) */
+#define TXCOL          0x00000040      /* When set (=1), corrupt data may have been transmitted */
+
+/*
+ * ASYNCHRONOUS MEMORY CONTROLLER MASKS
+ */
+
+/* AMGCTL Masks */
+#define AMCKEN         0x0001          /* Enable CLKOUT */
+#define AMBEN_B0       0x0002          /* Enable Asynchronous Memory Bank 0 only */
+#define AMBEN_B0_B1    0x0004          /* Enable Asynchronous Memory Banks 0 & 1 only */
+#define AMBEN_B0_B1_B2 0x0006          /* Enable Asynchronous Memory Banks 0,/ 1, and 2 */
+#define AMBEN_ALL      0x0008          /* Enable Asynchronous Memory Banks (all) 0, 1, 2, and 3 */
+#define B0_PEN         0x0010          /* Enable 16-bit packing Bank 0 */
+#define B1_PEN         0x0020          /* Enable 16-bit packing Bank 1 */
+#define B2_PEN         0x0040          /* Enable 16-bit packing Bank 2 */
+#define B3_PEN         0x0080          /* Enable 16-bit packing Bank 3 */
+
+/* AMGCTL Bit Positions */
+#define AMCKEN_P       0x00000000      /* Enable CLKOUT */
+#define AMBEN_P0       0x00000001      /* Asynchronous Memory Enable, 000 - banks 0-3 disabled, 001 - Bank 0 enabled */
+#define AMBEN_P1       0x00000002      /* Asynchronous Memory Enable, 010 - banks 0&1 enabled, 011 - banks 0-3 enabled */
+#define AMBEN_P2       0x00000003      /* Asynchronous Memory Enable, 1xx - All banks (bank 0, 1, 2, and 3) enabled */
+#define B0_PEN_P       0x004           /* Enable 16-bit packing Bank 0 */
+#define B1_PEN_P       0x005           /* Enable 16-bit packing Bank 1 */
+#define B2_PEN_P       0x006           /* Enable 16-bit packing Bank 2 */
+#define B3_PEN_P       0x007           /* Enable 16-bit packing Bank 3 */
+
+/* AMBCTL0 Masks */
+#define B0RDYEN                0x00000001      /* Bank 0 RDY Enable, 0=disable, 1=enable */
+#define B0RDYPOL       0x00000002      /* Bank 0 RDY Active high, 0=active low, 1=active high */
+#define B0TT_1         0x00000004      /* Bank 0 Transition Time from Read to Write = 1 cycle */
+#define B0TT_2         0x00000008      /* Bank 0 Transition Time from Read to Write = 2 cycles */
+#define B0TT_3         0x0000000C      /* Bank 0 Transition Time from Read to Write = 3 cycles */
+#define B0TT_4         0x00000000      /* Bank 0 Transition Time from Read to Write = 4 cycles */
+#define B0ST_1         0x00000010      /* Bank 0 Setup Time from AOE asserted to Read/Write asserted=1 cycle */
+#define B0ST_2         0x00000020      /* Bank 0 Setup Time from AOE asserted to Read/Write asserted=2 cycles */
+#define B0ST_3         0x00000030      /* Bank 0 Setup Time from AOE asserted to Read/Write asserted=3 cycles */
+#define B0ST_4         0x00000000      /* Bank 0 Setup Time from AOE asserted to Read/Write asserted=4 cycles */
+#define B0HT_1         0x00000040      /* Bank 0 Hold Time from Read/Write deasserted to AOE deasserted = 1 cycle */
+#define B0HT_2         0x00000080      /* Bank 0 Hold Time from Read/Write deasserted to AOE deasserted = 2 cycles */
+#define B0HT_3         0x000000C0      /* Bank 0 Hold Time from Read/Write deasserted to AOE deasserted = 3 cycles */
+#define B0HT_0         0x00000000      /* Bank 0 Hold Time from Read/Write deasserted to AOE deasserted = 0 cycles */
+#define B0RAT_1                0x00000100      /* Bank 0 Read Access Time = 1 cycle */
+#define B0RAT_2                0x00000200      /* Bank 0 Read Access Time = 2 cycles */
+#define B0RAT_3                0x00000300      /* Bank 0 Read Access Time = 3 cycles */
+#define B0RAT_4                0x00000400      /* Bank 0 Read Access Time = 4 cycles */
+#define B0RAT_5                0x00000500      /* Bank 0 Read Access Time = 5 cycles */
+#define B0RAT_6                0x00000600      /* Bank 0 Read Access Time = 6 cycles */
+#define B0RAT_7                0x00000700      /* Bank 0 Read Access Time = 7 cycles */
+#define B0RAT_8                0x00000800      /* Bank 0 Read Access Time = 8 cycles */
+#define B0RAT_9                0x00000900      /* Bank 0 Read Access Time = 9 cycles */
+#define B0RAT_10       0x00000A00      /* Bank 0 Read Access Time = 10 cycles */
+#define B0RAT_11       0x00000B00      /* Bank 0 Read Access Time = 11 cycles */
+#define B0RAT_12       0x00000C00      /* Bank 0 Read Access Time = 12 cycles */
+#define B0RAT_13       0x00000D00      /* Bank 0 Read Access Time = 13 cycles */
+#define B0RAT_14       0x00000E00      /* Bank 0 Read Access Time = 14 cycles */
+#define B0RAT_15       0x00000F00      /* Bank 0 Read Access Time = 15 cycles */
+#define B0WAT_1                0x00001000      /* Bank 0 Write Access Time = 1 cycle */
+#define B0WAT_2                0x00002000      /* Bank 0 Write Access Time = 2 cycles */
+#define B0WAT_3                0x00003000      /* Bank 0 Write Access Time = 3 cycles */
+#define B0WAT_4                0x00004000      /* Bank 0 Write Access Time = 4 cycles */
+#define B0WAT_5                0x00005000      /* Bank 0 Write Access Time = 5 cycles */
+#define B0WAT_6                0x00006000      /* Bank 0 Write Access Time = 6 cycles */
+#define B0WAT_7                0x00007000      /* Bank 0 Write Access Time = 7 cycles */
+#define B0WAT_8                0x00008000      /* Bank 0 Write Access Time = 8 cycles */
+#define B0WAT_9                0x00009000      /* Bank 0 Write Access Time = 9 cycles */
+#define B0WAT_10       0x0000A000      /* Bank 0 Write Access Time = 10 cycles */
+#define B0WAT_11       0x0000B000      /* Bank 0 Write Access Time = 11 cycles */
+#define B0WAT_12       0x0000C000      /* Bank 0 Write Access Time = 12 cycles */
+#define B0WAT_13       0x0000D000      /* Bank 0 Write Access Time = 13 cycles */
+#define B0WAT_14       0x0000E000      /* Bank 0 Write Access Time = 14 cycles */
+#define B0WAT_15       0x0000F000      /* Bank 0 Write Access Time = 15 cycles */
+#define B1RDYEN                0x00010000      /* Bank 1 RDY enable, 0=disable, 1=enable */
+#define B1RDYPOL       0x00020000      /* Bank 1 RDY Active high, 0=active low, 1=active high */
+#define B1TT_1         0x00040000      /* Bank 1 Transition Time from Read to Write = 1 cycle */
+#define B1TT_2         0x00080000      /* Bank 1 Transition Time from Read to Write = 2 cycles */
+#define B1TT_3         0x000C0000      /* Bank 1 Transition Time from Read to Write = 3 cycles */
+#define B1TT_4         0x00000000      /* Bank 1 Transition Time from Read to Write = 4 cycles */
+#define B1ST_1         0x00100000      /* Bank 1 Setup Time from AOE asserted to Read or Write asserted = 1 cycle */
+#define B1ST_2         0x00200000      /* Bank 1 Setup Time from AOE asserted to Read or Write asserted = 2 cycles */
+#define B1ST_3         0x00300000      /* Bank 1 Setup Time from AOE asserted to Read or Write asserted = 3 cycles */
+#define B1ST_4         0x00000000      /* Bank 1 Setup Time from AOE asserted to Read or Write asserted = 4 cycles */
+#define B1HT_1         0x00400000      /* Bank 1 Hold Time from Read or Write deasserted to AOE deasserted = 1 cycle */
+#define B1HT_2         0x00800000      /* Bank 1 Hold Time from Read or Write deasserted to AOE deasserted = 2 cycles */
+#define B1HT_3         0x00C00000      /* Bank 1 Hold Time from Read or Write deasserted to AOE deasserted = 3 cycles */
+#define B1HT_0         0x00000000      /* Bank 1 Hold Time from Read or Write deasserted to AOE deasserted = 0 cycles */
+#define B1RAT_1                0x01000000      /* Bank 1 Read Access Time = 1 cycle */
+#define B1RAT_2                0x02000000      /* Bank 1 Read Access Time = 2 cycles */
+#define B1RAT_3                0x03000000      /* Bank 1 Read Access Time = 3 cycles */
+#define B1RAT_4                0x04000000      /* Bank 1 Read Access Time = 4 cycles */
+#define B1RAT_5                0x05000000      /* Bank 1 Read Access Time = 5 cycles */
+#define B1RAT_6                0x06000000      /* Bank 1 Read Access Time = 6 cycles */
+#define B1RAT_7                0x07000000      /* Bank 1 Read Access Time = 7 cycles */
+#define B1RAT_8                0x08000000      /* Bank 1 Read Access Time = 8 cycles */
+#define B1RAT_9                0x09000000      /* Bank 1 Read Access Time = 9 cycles */
+#define B1RAT_10       0x0A000000      /* Bank 1 Read Access Time = 10 cycles */
+#define B1RAT_11       0x0B000000      /* Bank 1 Read Access Time = 11 cycles */
+#define B1RAT_12       0x0C000000      /* Bank 1 Read Access Time = 12 cycles */
+#define B1RAT_13       0x0D000000      /* Bank 1 Read Access Time = 13 cycles */
+#define B1RAT_14       0x0E000000      /* Bank 1 Read Access Time = 14 cycles */
+#define B1RAT_15       0x0F000000      /* Bank 1 Read Access Time = 15 cycles */
+#define B1WAT_1                0x10000000      /* Bank 1 Write Access Time = 1 cycle */
+#define B1WAT_2                0x20000000      /* Bank 1 Write Access Time = 2 cycles */
+#define B1WAT_3                0x30000000      /* Bank 1 Write Access Time = 3 cycles */
+#define B1WAT_4                0x40000000      /* Bank 1 Write Access Time = 4 cycles */
+#define B1WAT_5                0x50000000      /* Bank 1 Write Access Time = 5 cycles */
+#define B1WAT_6                0x60000000      /* Bank 1 Write Access Time = 6 cycles */
+#define B1WAT_7                0x70000000      /* Bank 1 Write Access Time = 7 cycles */
+#define B1WAT_8                0x80000000      /* Bank 1 Write Access Time = 8 cycles */
+#define B1WAT_9                0x90000000      /* Bank 1 Write Access Time = 9 cycles */
+#define B1WAT_10       0xA0000000      /* Bank 1 Write Access Time = 10 cycles */
+#define B1WAT_11       0xB0000000      /* Bank 1 Write Access Time = 11 cycles */
+#define B1WAT_12       0xC0000000      /* Bank 1 Write Access Time = 12 cycles */
+#define B1WAT_13       0xD0000000      /* Bank 1 Write Access Time = 13 cycles */
+#define B1WAT_14       0xE0000000      /* Bank 1 Write Access Time = 14 cycles */
+#define B1WAT_15       0xF0000000      /* Bank 1 Write Access Time = 15 cycles */
+
+/* AMBCTL1 Masks */
+#define B2RDYEN                0x00000001      /* Bank 2 RDY Enable, 0=disable, 1=enable */
+#define B2RDYPOL       0x00000002      /* Bank 2 RDY Active high, 0=active low, 1=active high */
+#define B2TT_1         0x00000004      /* Bank 2 Transition Time from Read to Write = 1 cycle */
+#define B2TT_2         0x00000008      /* Bank 2 Transition Time from Read to Write = 2 cycles */
+#define B2TT_3         0x0000000C      /* Bank 2 Transition Time from Read to Write = 3 cycles */
+#define B2TT_4         0x00000000      /* Bank 2 Transition Time from Read to Write = 4 cycles */
+#define B2ST_1         0x00000010      /* Bank 2 Setup Time from AOE asserted to Read or Write asserted = 1 cycle */
+#define B2ST_2         0x00000020      /* Bank 2 Setup Time from AOE asserted to Read or Write asserted = 2 cycles */
+#define B2ST_3         0x00000030      /* Bank 2 Setup Time from AOE asserted to Read or Write asserted = 3 cycles */
+#define B2ST_4         0x00000000      /* Bank 2 Setup Time from AOE asserted to Read or Write asserted = 4 cycles */
+#define B2HT_1         0x00000040      /* Bank 2 Hold Time from Read or Write deasserted to AOE deasserted = 1 cycle */
+#define B2HT_2         0x00000080      /* Bank 2 Hold Time from Read or Write deasserted to AOE deasserted = 2 cycles */
+#define B2HT_3         0x000000C0      /* Bank 2 Hold Time from Read or Write deasserted to AOE deasserted = 3 cycles */
+#define B2HT_0         0x00000000      /* Bank 2 Hold Time from Read or Write deasserted to AOE deasserted = 0 cycles */
+#define B2RAT_1                0x00000100      /* Bank 2 Read Access Time = 1 cycle */
+#define B2RAT_2                0x00000200      /* Bank 2 Read Access Time = 2 cycles */
+#define B2RAT_3                0x00000300      /* Bank 2 Read Access Time = 3 cycles */
+#define B2RAT_4                0x00000400      /* Bank 2 Read Access Time = 4 cycles */
+#define B2RAT_5                0x00000500      /* Bank 2 Read Access Time = 5 cycles */
+#define B2RAT_6                0x00000600      /* Bank 2 Read Access Time = 6 cycles */
+#define B2RAT_7                0x00000700      /* Bank 2 Read Access Time = 7 cycles */
+#define B2RAT_8                0x00000800      /* Bank 2 Read Access Time = 8 cycles */
+#define B2RAT_9                0x00000900      /* Bank 2 Read Access Time = 9 cycles */
+#define B2RAT_10       0x00000A00      /* Bank 2 Read Access Time = 10 cycles */
+#define B2RAT_11       0x00000B00      /* Bank 2 Read Access Time = 11 cycles */
+#define B2RAT_12       0x00000C00      /* Bank 2 Read Access Time = 12 cycles */
+#define B2RAT_13       0x00000D00      /* Bank 2 Read Access Time = 13 cycles */
+#define B2RAT_14       0x00000E00      /* Bank 2 Read Access Time = 14 cycles */
+#define B2RAT_15       0x00000F00      /* Bank 2 Read Access Time = 15 cycles */
+#define B2WAT_1                0x00001000      /* Bank 2 Write Access Time = 1 cycle */
+#define B2WAT_2                0x00002000      /* Bank 2 Write Access Time = 2 cycles */
+#define B2WAT_3                0x00003000      /* Bank 2 Write Access Time = 3 cycles */
+#define B2WAT_4                0x00004000      /* Bank 2 Write Access Time = 4 cycles */
+#define B2WAT_5                0x00005000      /* Bank 2 Write Access Time = 5 cycles */
+#define B2WAT_6                0x00006000      /* Bank 2 Write Access Time = 6 cycles */
+#define B2WAT_7                0x00007000      /* Bank 2 Write Access Time = 7 cycles */
+#define B2WAT_8                0x00008000      /* Bank 2 Write Access Time = 8 cycles */
+#define B2WAT_9                0x00009000      /* Bank 2 Write Access Time = 9 cycles */
+#define B2WAT_10       0x0000A000      /* Bank 2 Write Access Time = 10 cycles */
+#define B2WAT_11       0x0000B000      /* Bank 2 Write Access Time = 11 cycles */
+#define B2WAT_12       0x0000C000      /* Bank 2 Write Access Time = 12 cycles */
+#define B2WAT_13       0x0000D000      /* Bank 2 Write Access Time = 13 cycles */
+#define B2WAT_14       0x0000E000      /* Bank 2 Write Access Time = 14 cycles */
+#define B2WAT_15       0x0000F000      /* Bank 2 Write Access Time = 15 cycles */
+#define B3RDYEN                0x00010000      /* Bank 3 RDY enable, 0=disable, 1=enable */
+#define B3RDYPOL       0x00020000      /* Bank 3 RDY Active high, 0=active low, 1=active high */
+#define B3TT_1         0x00040000      /* Bank 3 Transition Time from Read to Write = 1 cycle */
+#define B3TT_2         0x00080000      /* Bank 3 Transition Time from Read to Write = 2 cycles */
+#define B3TT_3         0x000C0000      /* Bank 3 Transition Time from Read to Write = 3 cycles */
+#define B3TT_4         0x00000000      /* Bank 3 Transition Time from Read to Write = 4 cycles */
+#define B3ST_1         0x00100000      /* Bank 3 Setup Time from AOE asserted to Read or Write asserted = 1 cycle */
+#define B3ST_2         0x00200000      /* Bank 3 Setup Time from AOE asserted to Read or Write asserted = 2 cycles */
+#define B3ST_3         0x00300000      /* Bank 3 Setup Time from AOE asserted to Read or Write asserted = 3 cycles */
+#define B3ST_4         0x00000000      /* Bank 3 Setup Time from AOE asserted to Read or Write asserted = 4 cycles */
+#define B3HT_1         0x00400000      /* Bank 3 Hold Time from Read or Write deasserted to AOE deasserted = 1 cycle */
+#define B3HT_2         0x00800000      /* Bank 3 Hold Time from Read or Write deasserted to AOE deasserted = 2 cycles */
+#define B3HT_3         0x00C00000      /* Bank 3 Hold Time from Read or Write deasserted to AOE deasserted = 3 cycles */
+#define B3HT_0         0x00000000      /* Bank 3 Hold Time from Read or Write deasserted to AOE deasserted = 0 cycles */
+#define B3RAT_1                0x01000000      /* Bank 3 Read Access Time = 1 cycle */
+#define B3RAT_2                0x02000000      /* Bank 3 Read Access Time = 2 cycles */
+#define B3RAT_3                0x03000000      /* Bank 3 Read Access Time = 3 cycles */
+#define B3RAT_4                0x04000000      /* Bank 3 Read Access Time = 4 cycles */
+#define B3RAT_5                0x05000000      /* Bank 3 Read Access Time = 5 cycles */
+#define B3RAT_6                0x06000000      /* Bank 3 Read Access Time = 6 cycles */
+#define B3RAT_7                0x07000000      /* Bank 3 Read Access Time = 7 cycles */
+#define B3RAT_8                0x08000000      /* Bank 3 Read Access Time = 8 cycles */
+#define B3RAT_9                0x09000000      /* Bank 3 Read Access Time = 9 cycles */
+#define B3RAT_10       0x0A000000      /* Bank 3 Read Access Time = 10 cycles */
+#define B3RAT_11       0x0B000000      /* Bank 3 Read Access Time = 11 cycles */
+#define B3RAT_12       0x0C000000      /* Bank 3 Read Access Time = 12 cycles */
+#define B3RAT_13       0x0D000000      /* Bank 3 Read Access Time = 13 cycles */
+#define B3RAT_14       0x0E000000      /* Bank 3 Read Access Time = 14 cycles */
+#define B3RAT_15       0x0F000000      /* Bank 3 Read Access Time = 15 cycles */
+#define B3WAT_1                0x10000000      /* Bank 3 Write Access Time = 1 cycle */
+#define B3WAT_2                0x20000000      /* Bank 3 Write Access Time = 2 cycles */
+#define B3WAT_3                0x30000000      /* Bank 3 Write Access Time = 3 cycles */
+#define B3WAT_4                0x40000000      /* Bank 3 Write Access Time = 4 cycles */
+#define B3WAT_5                0x50000000      /* Bank 3 Write Access Time = 5 cycles */
+#define B3WAT_6                0x60000000      /* Bank 3 Write Access Time = 6 cycles */
+#define B3WAT_7                0x70000000      /* Bank 3 Write Access Time = 7 cycles */
+#define B3WAT_8                0x80000000      /* Bank 3 Write Access Time = 8 cycles */
+#define B3WAT_9                0x90000000      /* Bank 3 Write Access Time = 9 cycles */
+#define B3WAT_10       0xA0000000      /* Bank 3 Write Access Time = 10 cycles */
+#define B3WAT_11       0xB0000000      /* Bank 3 Write Access Time = 11 cycles */
+#define B3WAT_12       0xC0000000      /* Bank 3 Write Access Time = 12 cycles */
+#define B3WAT_13       0xD0000000      /* Bank 3 Write Access Time = 13 cycles */
+#define B3WAT_14       0xE0000000      /* Bank 3 Write Access Time = 14 cycles */
+#define B3WAT_15       0xF0000000      /* Bank 3 Write Access Time = 15 cycles */
+
+/*
+ * SDRAM CONTROLLER MASKS
+ */
+
+/* EBIU_SDGCTL Masks */
+#define SCTLE          0x00000001      /* Enable SCLK[0], /SRAS, /SCAS, /SWE, SDQM[3:0] */
+#define CL_2           0x00000008      /* SDRAM CAS latency = 2 cycles */
+#define CL_3           0x0000000C      /* SDRAM CAS latency = 3 cycles */
+#define PFE            0x00000010      /* Enable SDRAM prefetch */
+#define PFP            0x00000020      /* Prefetch has priority over AMC requests */
+#define TRAS_1         0x00000040      /* SDRAM tRAS = 1 cycle */
+#define TRAS_2         0x00000080      /* SDRAM tRAS = 2 cycles */
+#define TRAS_3         0x000000C0      /* SDRAM tRAS = 3 cycles */
+#define TRAS_4         0x00000100      /* SDRAM tRAS = 4 cycles */
+#define TRAS_5         0x00000140      /* SDRAM tRAS = 5 cycles */
+#define TRAS_6         0x00000180      /* SDRAM tRAS = 6 cycles */
+#define TRAS_7         0x000001C0      /* SDRAM tRAS = 7 cycles */
+#define TRAS_8         0x00000200      /* SDRAM tRAS = 8 cycles */
+#define TRAS_9         0x00000240      /* SDRAM tRAS = 9 cycles */
+#define TRAS_10                0x00000280      /* SDRAM tRAS = 10 cycles */
+#define TRAS_11                0x000002C0      /* SDRAM tRAS = 11 cycles */
+#define TRAS_12                0x00000300      /* SDRAM tRAS = 12 cycles */
+#define TRAS_13                0x00000340      /* SDRAM tRAS = 13 cycles */
+#define TRAS_14                0x00000380      /* SDRAM tRAS = 14 cycles */
+#define TRAS_15                0x000003C0      /* SDRAM tRAS = 15 cycles */
+#define TRP_1          0x00000800      /* SDRAM tRP = 1 cycle */
+#define TRP_2          0x00001000      /* SDRAM tRP = 2 cycles */
+#define TRP_3          0x00001800      /* SDRAM tRP = 3 cycles */
+#define TRP_4          0x00002000      /* SDRAM tRP = 4 cycles */
+#define TRP_5          0x00002800      /* SDRAM tRP = 5 cycles */
+#define TRP_6          0x00003000      /* SDRAM tRP = 6 cycles */
+#define TRP_7          0x00003800      /* SDRAM tRP = 7 cycles */
+#define TRCD_1         0x00008000      /* SDRAM tRCD = 1 cycle */
+#define TRCD_2         0x00010000      /* SDRAM tRCD = 2 cycles */
+#define TRCD_3         0x00018000      /* SDRAM tRCD = 3 cycles */
+#define TRCD_4         0x00020000      /* SDRAM tRCD = 4 cycles */
+#define TRCD_5         0x00028000      /* SDRAM tRCD = 5 cycles */
+#define TRCD_6         0x00030000      /* SDRAM tRCD = 6 cycles */
+#define TRCD_7         0x00038000      /* SDRAM tRCD = 7 cycles */
+#define TWR_1          0x00080000      /* SDRAM tWR = 1 cycle */
+#define TWR_2          0x00100000      /* SDRAM tWR = 2 cycles */
+#define TWR_3          0x00180000      /* SDRAM tWR = 3 cycles */
+#define PUPSD          0x00200000      /* Power-up start delay */
+#define PSM            0x00400000      /* SDRAM power-up sequence = Precharge, mode register set, 8 CBR refresh cycles */
+#define PSS            0x00800000      /* enable SDRAM power-up sequence on next SDRAM access */
+#define SRFS           0x01000000      /* Start SDRAM self-refresh mode */
+#define EBUFE          0x02000000      /* Enable external buffering timing */
+#define FBBRW          0x04000000      /* Fast back-to-back read write enable */
+#define EMREN          0x10000000      /* Extended mode register enable */
+#define TCSR           0x20000000      /* Temp compensated self refresh value 85 deg C */
+#define CDDBG          0x40000000      /* Tristate SDRAM controls during bus grant */
+
+/* EBIU_SDBCTL Masks */
+#define EB0_E          0x00000001      /* Enable SDRAM external bank 0 */
+#define EB0_SZ_16      0x00000000      /* SDRAM external bank size = 16MB */
+#define EB0_SZ_32      0x00000002      /* SDRAM external bank size = 32MB */
+#define EB0_SZ_64      0x00000004      /* SDRAM external bank size = 64MB */
+#define EB0_SZ_128     0x00000006      /* SDRAM external bank size = 128MB */
+#define EB0_CAW_8      0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EB0_CAW_9      0x00000010      /* SDRAM external bank column address width = 9 bits */
+#define EB0_CAW_10     0x00000020      /* SDRAM external bank column address width = 9 bits */
+#define EB0_CAW_11     0x00000030      /* SDRAM external bank column address width = 9 bits */
+
+#define EB1_E          0x00000100      /* Enable SDRAM external bank 1 */
+#define EB1__SZ_16     0x00000000      /* SDRAM external bank size = 16MB */
+#define EB1__SZ_32     0x00000200      /* SDRAM external bank size = 32MB */
+#define EB1__SZ_64     0x00000400      /* SDRAM external bank size = 64MB */
+#define EB1__SZ_128    0x00000600      /* SDRAM external bank size = 128MB */
+#define EB1__CAW_8     0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EB1__CAW_9     0x00001000      /* SDRAM external bank column address width = 9 bits */
+#define EB1__CAW_10    0x00002000      /* SDRAM external bank column address width = 9 bits */
+#define EB1__CAW_11    0x00003000      /* SDRAM external bank column address width = 9 bits */
+
+#define EB2__E         0x00010000      /* Enable SDRAM external bank 2 */
+#define EB2__SZ_16     0x00000000      /* SDRAM external bank size = 16MB */
+#define EB2__SZ_32     0x00020000      /* SDRAM external bank size = 32MB */
+#define EB2__SZ_64     0x00040000      /* SDRAM external bank size = 64MB */
+#define EB2__SZ_128    0x00060000      /* SDRAM external bank size = 128MB */
+#define EB2__CAW_8     0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EB2__CAW_9     0x00100000      /* SDRAM external bank column address width = 9 bits */
+#define EB2__CAW_10    0x00200000      /* SDRAM external bank column address width = 9 bits */
+#define EB2__CAW_11    0x00300000      /* SDRAM external bank column address width = 9 bits */
+
+#define EB3__E         0x01000000      /* Enable SDRAM external bank 3 */
+#define EB3__SZ_16     0x00000000      /* SDRAM external bank size = 16MB */
+#define EB3__SZ_32     0x02000000      /* SDRAM external bank size = 32MB */
+#define EB3__SZ_64     0x04000000      /* SDRAM external bank size = 64MB */
+#define EB3__SZ_128    0x06000000      /* SDRAM external bank size = 128MB */
+#define EB3__CAW_8     0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EB3__CAW_9     0x10000000      /* SDRAM external bank column address width = 9 bits */
+#define EB3__CAW_10    0x20000000      /* SDRAM external bank column address width = 9 bits */
+#define EB3__CAW_11    0x30000000      /* SDRAM external bank column address width = 9 bits */
+
+/* EBIU_SDSTAT Masks */
+#define SDCI           0x00000001      /* SDRAM controller is idle */
+#define SDSRA          0x00000002      /* SDRAM SDRAM self refresh is active */
+#define SDPUA          0x00000004      /* SDRAM power up active */
+#define SDRS           0x00000008      /* SDRAM is in reset state */
+#define SDEASE         0x00000010      /* SDRAM EAB sticky error status - W1C */
+#define BGSTAT         0x00000020      /* Bus granted */
+
+#define COREMMR_BASE   0xFFE00000      /* Core MMRs */
+#define SYSMMR_BASE    0xFFC00000      /* System MMRs */
+
+/* Watchdog Timer registers for Core A (0xFFC0 0200-0xFFC0 02FF) */
+#define WDOG_CTL       0xFFC00200      /* Watchdog Control register */
+#define WDOG_CNT       0xFFC00204      /* Watchdog Count register */
+#define WDOG_STAT      0xFFC00208      /* Watchdog Status register */
+
+/* Programmable Flag 0 registers (0xFFC0 0700-0xFFC0 07FF) */
+#define FIO_FLAG_D     0xFFC00700      /* Flag Data register */
+#define FIO_FLAG_C     0xFFC00704      /* Flag Clear register */
+#define FIO_FLAG_S     0xFFC00708      /* Flag Set register */
+#define FIO_FLAG_T     0xFFC0070C      /* Flag Toggle register */
+#define FIO_MASKA_D    0xFFC00710      /* Flag Mask Interrupt A Data register */
+#define FIO_MASKA_C    0xFFC00714      /* Flag Mask Interrupt A Clear register */
+#define FIO_MASKA_S    0xFFC00718      /* Flag Mask Interrupt A Set register */
+#define FIO_MASKA_T    0xFFC0071C      /* Flag Mask Interrupt A Toggle register */
+#define FIO_MASKB_D    0xFFC00720      /* Flag Mask Interrupt B Data register */
+#define FIO_MASKB_C    0xFFC00724      /* Flag Mask Interrupt B Clear register */
+#define FIO_MASKB_S    0xFFC00728      /* Flag Mask Interrupt B Set register */
+#define FIO_MASKB_T    0xFFC0072C      /* Flag Mask Interrupt B Toggle register */
+#define FIO_DIR        0xFFC00730      /* Flag Direction  register */
+#define FIO_POLAR      0xFFC00734      /* Flag Polarity register */
+#define FIO_EDGE       0xFFC00738      /* Flag Interrupt Sensitivity register */
+#define FIO_BOTH       0xFFC0073C      /* Flag Set on Both Edges register */
+#define FIO_INEN       0xFFC00740      /* Flag Input Enable register */
+
+/* Parallel Peripheral Interface (PPI) 0 registers (0xFFC0 1000-0xFFC0 10FF) */
+#define PPI_CONTROL    0xFFC01000      /* PPI0 Control register */
+#define PPI_STATUS     0xFFC01004      /* PPI0 Status register */
+#define PPI_COUNT      0xFFC01008      /* PPI0 Transfer Count register */
+#define PPI_DELAY      0xFFC0100C      /* PPI0 Delay Count register */
+#define PPI_FRAME      0xFFC01010      /* PPI0 Frame Length register */
+
+/*
+ * System Reset and Interrupt Controller registers for
+ * core A (0xFFC0 0100-0xFFC0 01FF)
+ */
+#define SWRST          0xFFC00100      /* Software Reset register */
+#define SYSCR          0xFFC00104      /* System Reset Configuration register */
+#define RVECT          0xFFC00108      /* SIC Reset Vector Address Register */
+#define SIC_SWRST      0xFFC00100      /* Software Reset register */
+#define SIC_SYSCR      0xFFC00104      /* System Reset Configuration register */
+#define SIC_RVECT      0xFFC00108      /* SIC Reset Vector Address Register */
+#define SIC_IMASK      0xFFC0010C      /* SIC Interrupt Mask register 0 - hack to fix old tests */
+#define SIC_IAR                0xFFC00124      /* SIC Interrupt Assignment Register 0 */
+#define SIC_IAR1       0xFFC00128      /* SIC Interrupt Assignment Register 1 */
+#define SIC_IAR2       0xFFC0012C      /* SIC Interrupt Assignment Register 2 */
+#define SIC_ISR                0xFFC00114      /* SIC Interrupt Status register 0 */
+#define SIC_IWR                0xFFC0011C      /* SIC Interrupt Wakeup-Enable register 0 */
+
+/* EBIU_SDBCTL Masks */
+#define EB_E           0x00000001      /* Enable SDRAM external bank 0 */
+#define EB_SZ_16       0x00000000      /* SDRAM external bank size = 16MB */
+#define EB_SZ_32       0x00000002      /* SDRAM external bank size = 32MB */
+#define EB_SZ_64       0x00000004      /* SDRAM external bank size = 64MB */
+#define EB_SZ_128      0x00000006      /* SDRAM external bank size = 128MB */
+#define EB_CAW_8       0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EB_CAW_9       0x00000010      /* SDRAM external bank column address width = 9 bits */
+#define EB_CAW_10      0x00000020      /* SDRAM external bank column address width = 9 bits */
+#define EB_CAW_11      0x00000030      /* SDRAM external bank column address width = 9 bits */
+
+/* EBIU_SDBCTL Masks */
+#define EBE            0x00000001      /* Enable SDRAM external bank 0 */
+#define EBSZ_16                0x00000000      /* SDRAM external bank size = 16MB */
+#define EBSZ_32                0x00000002      /* SDRAM external bank size = 32MB */
+#define EBSZ_64                0x00000004      /* SDRAM external bank size = 64MB */
+#define EBSZ_128       0x00000006      /* SDRAM external bank size = 128MB */
+#define EBCAW_8                0x00000000      /* SDRAM external bank column address width = 8 bits */
+#define EBCAW_9                0x00000010      /* SDRAM external bank column address width = 9 bits */
+#define EBCAW_10       0x00000020      /* SDRAM external bank column address width = 9 bits */
+#define EBCAW_11       0x00000030      /* SDRAM external bank column address width = 9 bits */
+
+/* Memory DMA1 Controller registers (0xFFC0 1E80-0xFFC0 1FFF) */
+#define MDMA_D0_CONFIG         0xFFC01F08      /* MemDMA1 Stream 0 Destination Configuration */
+#define MDMA_D0_NEXT_DESC_PTR  0xFFC01F00      /* MemDMA1 Stream 0 Destination Next Descriptor Ptr Reg */
+#define MDMA_D0_START_ADDR     0xFFC01F04      /* MemDMA1 Stream 0 Destination Start Address */
+#define MDMA_D0_X_COUNT                0xFFC01F10      /* MemDMA1 Stream 0 Destination Inner-Loop Count */
+#define MDMA_D0_Y_COUNT                0xFFC01F18      /* MemDMA1 Stream 0 Destination Outer-Loop Count */
+#define MDMA_D0_X_MODIFY       0xFFC01F14      /* MemDMA1 Stream 0 Dest Inner-Loop Address-Increment */
+#define MDMA_D0_Y_MODIFY       0xFFC01F1C      /* MemDMA1 Stream 0 Dest Outer-Loop Address-Increment */
+#define MDMA_D0_CURR_DESC_PTR  0xFFC01F20      /* MemDMA1 Stream 0 Dest Current Descriptor Ptr reg */
+#define MDMA_D0_CURR_ADDR      0xFFC01F24      /* MemDMA1 Stream 0 Destination Current Address */
+#define MDMA_D0_CURR_X_COUNT   0xFFC01F30      /* MemDMA1 Stream 0 Dest Current Inner-Loop Count */
+#define MDMA_D0_CURR_Y_COUNT   0xFFC01F38      /* MemDMA1 Stream 0 Dest Current Outer-Loop Count */
+#define MDMA_D0_IRQ_STATUS     0xFFC01F28      /* MemDMA1 Stream 0 Destination Interrupt/Status */
+#define MDMA_D0_PERIPHERAL_MAP 0xFFC01F2C      /* MemDMA1 Stream 0 Destination Peripheral Map */
+
+#define MDMA_S0_CONFIG         0xFFC01F48      /* MemDMA1 Stream 0 Source Configuration */
+#define MDMA_S0_NEXT_DESC_PTR  0xFFC01F40      /* MemDMA1 Stream 0 Source Next Descriptor Ptr Reg */
+#define MDMA_S0_START_ADDR     0xFFC01F44      /* MemDMA1 Stream 0 Source Start Address */
+#define MDMA_S0_X_COUNT                0xFFC01F50      /* MemDMA1 Stream 0 Source Inner-Loop Count */
+#define MDMA_S0_Y_COUNT                0xFFC01F58      /* MemDMA1 Stream 0 Source Outer-Loop Count */
+#define MDMA_S0_X_MODIFY       0xFFC01F54      /* MemDMA1 Stream 0 Source Inner-Loop Address-Increment */
+#define MDMA_S0_Y_MODIFY       0xFFC01F5C      /* MemDMA1 Stream 0 Source Outer-Loop Address-Increment */
+#define MDMA_S0_CURR_DESC_PTR  0xFFC01F60      /* MemDMA1 Stream 0 Source Current Descriptor Ptr reg */
+#define MDMA_S0_CURR_ADDR      0xFFC01F64      /* MemDMA1 Stream 0 Source Current Address */
+#define MDMA_S0_CURR_X_COUNT   0xFFC01F70      /* MemDMA1 Stream 0 Source Current Inner-Loop Count */
+#define MDMA_S0_CURR_Y_COUNT ` 0xFFC01F78      /* MemDMA1 Stream 0 Source Current Outer-Loop Count */
+#define MDMA_S0_IRQ_STATUS     0xFFC01F68      /* MemDMA1 Stream 0 Source Interrupt/Status */
+#define MDMA_S0_PERIPHERAL_MAP 0xFFC01F6C      /* MemDMA1 Stream 0 Source Peripheral Map */
+
+#define MDMA_D1_CONFIG         0xFFC01F88      /* MemDMA1 Stream 1 Destination Configuration */
+#define MDMA_D1_NEXT_DESC_PTR  0xFFC01F80      /* MemDMA1 Stream 1 Destination Next Descriptor Ptr Reg */
+#define MDMA_D1_START_ADDR     0xFFC01F84      /* MemDMA1 Stream 1 Destination Start Address */
+#define MDMA_D1_X_COUNT                0xFFC01F90      /* MemDMA1 Stream 1 Destination Inner-Loop Count */
+#define MDMA_D1_Y_COUNT                0xFFC01F98      /* MemDMA1 Stream 1 Destination Outer-Loop Count */
+#define MDMA_D1_X_MODIFY       0xFFC01F94      /* MemDMA1 Stream 1 Dest Inner-Loop Address-Increment */
+#define MDMA_D1_Y_MODIFY       0xFFC01F9C      /* MemDMA1 Stream 1 Dest Outer-Loop Address-Increment */
+#define MDMA_D1_CURR_DESC_PTR  0xFFC01FA0      /* MemDMA1 Stream 1 Dest Current Descriptor Ptr reg */
+#define MDMA_D1_CURR_ADDR      0xFFC01FA4      /* MemDMA1 Stream 1 Dest Current Address */
+#define MDMA_D1_CURR_X_COUNT   0xFFC01FB0      /* MemDMA1 Stream 1 Dest Current Inner-Loop Count */
+#define MDMA_D1_CURR_Y_COUNT   0xFFC01FB8      /* MemDMA1 Stream 1 Dest Current Outer-Loop Count */
+#define MDMA_D1_IRQ_STATUS     0xFFC01FA8      /* MemDMA1 Stream 1 Dest Interrupt/Status */
+#define MDMA_D1_PERIPHERAL_MAP 0xFFC01FAC      /* MemDMA1 Stream 1 Dest Peripheral Map */
+
+#define MDMA_S1_CONFIG         0xFFC01FC8      /* MemDMA1 Stream 1 Source Configuration */
+#define MDMA_S1_NEXT_DESC_PTR  0xFFC01FC0      /* MemDMA1 Stream 1 Source Next Descriptor Ptr Reg */
+#define MDMA_S1_START_ADDR     0xFFC01FC4      /* MemDMA1 Stream 1 Source Start Address */
+#define MDMA_S1_X_COUNT                0xFFC01FD0      /* MemDMA1 Stream 1 Source Inner-Loop Count */
+#define MDMA_S1_Y_COUNT                0xFFC01FD8      /* MemDMA1 Stream 1 Source Outer-Loop Count */
+#define MDMA_S1_X_MODIFY       0xFFC01FD4      /* MemDMA1 Stream 1 Source Inner-Loop Address-Increment */
+#define MDMA_S1_Y_MODIFY       0xFFC01FDC      /* MemDMA1 Stream 1 Source Outer-Loop Address-Increment */
+#define MDMA_S1_CURR_DESC_PTR  0xFFC01FE0      /* MemDMA1 Stream 1 Source Current Descriptor Ptr reg */
+#define MDMA_S1_CURR_ADDR      0xFFC01FE4      /* MemDMA1 Stream 1 Source Current Address */
+#define MDMA_S1_CURR_X_COUNT   0xFFC01FF0      /* MemDMA1 Stream 1 Source Current Inner-Loop Count */
+#define MDMA_S1_CURR_Y_COUNT   0xFFC01FF8      /* MemDMA1 Stream 1 Source Current Outer-Loop Count */
+#define MDMA_S1_IRQ_STATUS     0xFFC01FE8      /* MemDMA1 Stream 1 Source Interrupt/Status */
+#define MDMA_S1_PERIPHERAL_MAP 0xFFC01FEC      /* MemDMA1 Stream 1 Source Peripheral Map */
+
+#define DMA0_CONFIG            0xFFC01C08      /* DMA1 Channel 0 Configuration register */
+#define DMA0_NEXT_DESC_PTR     0xFFC01C00      /* DMA1 Channel 0 Next Descripter Ptr Reg */
+#define DMA0_START_ADDR                0xFFC01C04      /* DMA1 Channel 0 Start Address */
+#define DMA0_X_COUNT           0xFFC01C10      /* DMA1 Channel 0 Inner Loop Count */
+#define DMA0_Y_COUNT           0xFFC01C18      /* DMA1 Channel 0 Outer Loop Count */
+#define DMA0_X_MODIFY          0xFFC01C14      /* DMA1 Channel 0 Inner Loop Addr Increment */
+#define DMA0_Y_MODIFY          0xFFC01C1C      /* DMA1 Channel 0 Outer Loop Addr Increment */
+#define DMA0_CURR_DESC_PTR     0xFFC01C20      /* DMA1 Channel 0 Current Descriptor Pointer */
+#define DMA0_CURR_ADDR         0xFFC01C24      /* DMA1 Channel 0 Current Address Pointer */
+#define DMA0_CURR_X_COUNT      0xFFC01C30      /* DMA1 Channel 0 Current Inner Loop Count */
+#define DMA0_CURR_Y_COUNT      0xFFC01C38      /* DMA1 Channel 0 Current Outer Loop Count */
+#define DMA0_IRQ_STATUS                0xFFC01C28      /* DMA1 Channel 0 Interrupt Status Register */
+#define DMA0_PERIPHERAL_MAP    0xFFC01C2C      /* DMA1 Channel 0 Peripheral Map Register */
+
+#define DMA1_CONFIG            0xFFC00C08      /* DMA2 Channel 0 Configuration register */
+#define DMA1_NEXT_DESC_PTR     0xFFC00C00      /* DMA2 Channel 0 Next Descripter Ptr Reg */
+#define DMA1_START_ADDR                0xFFC00C04      /* DMA2 Channel 0 Start Address */
+#define DMA1_X_COUNT           0xFFC00C10      /* DMA2 Channel 0 Inner Loop Count */
+#define DMA1_Y_COUNT           0xFFC00C18      /* DMA2 Channel 0 Outer Loop Count */
+#define DMA1_X_MODIFY          0xFFC00C14      /* DMA2 Channel 0 Inner Loop Addr Increment */
+#define DMA1_Y_MODIFY          0xFFC00C1C      /* DMA2 Channel 0 Outer Loop Addr Increment */
+#define DMA1_CURR_DESC_PTR     0xFFC00C20      /* DMA2 Channel 0 Current Descriptor Pointer */
+#define DMA1_CURR_ADDR         0xFFC00C24      /* DMA2 Channel 0 Current Address Pointer */
+#define DMA1_CURR_X_COUNT      0xFFC00C30      /* DMA2 Channel 0 Current Inner Loop Count */
+#define DMA1_CURR_Y_COUNT      0xFFC00C38      /* DMA2 Channel 0 Current Outer Loop Count */
+#define DMA1_IRQ_STATUS                0xFFC00C28      /* DMA2 Channel 0 Interrupt /Status Register */
+#define DMA1_PERIPHERAL_MAP    0xFFC00C2C      /* DMA2 Channel 0 Peripheral Map Register */
+
+#define DMA2_CONFIG            0xFFC00C48      /* DMA2 Channel 1 Configuration register */
+#define DMA2_NEXT_DESC_PTR     0xFFC00C40      /* DMA2 Channel 1 Next Descripter Ptr Reg */
+#define DMA2_START_ADDR                0xFFC00C44      /* DMA2 Channel 1 Start Address */
+#define DMA2_X_COUNT           0xFFC00C50      /* DMA2 Channel 1 Inner Loop Count */
+#define DMA2_Y_COUNT           0xFFC00C58      /* DMA2 Channel 1 Outer Loop Count */
+#define DMA2_X_MODIFY          0xFFC00C54      /* DMA2 Channel 1 Inner Loop Addr Increment */
+#define DMA2_Y_MODIFY          0xFFC00C5C      /* DMA2 Channel 1 Outer Loop Addr Increment */
+#define DMA2_CURR_DESC_PTR     0xFFC00C60      /* DMA2 Channel 1 Current Descriptor Pointer */
+#define DMA2_CURR_ADDR         0xFFC00C64      /* DMA2 Channel 1 Current Address Pointer */
+#define DMA2_CURR_X_COUNT      0xFFC00C70      /* DMA2 Channel 1 Current Inner Loop Count */
+#define DMA2_CURR_Y_COUNT      0xFFC00C78      /* DMA2 Channel 1 Current Outer Loop Count */
+#define DMA2_IRQ_STATUS                0xFFC00C68      /* DMA2 Channel 1 Interrupt /Status Register */
+#define DMA2_PERIPHERAL_MAP    0xFFC00C6C      /* DMA2 Channel 1 Peripheral Map Register */
+
+#define DMA3_CONFIG            0xFFC00C88      /* DMA2 Channel 2 Configuration register */
+#define DMA3_NEXT_DESC_PTR     0xFFC00C80      /* DMA2 Channel 2 Next Descripter Ptr Reg */
+#define DMA3_START_ADDR                0xFFC00C84      /* DMA2 Channel 2 Start Address */
+#define DMA3_X_COUNT           0xFFC00C90      /* DMA2 Channel 2 Inner Loop Count */
+#define DMA3_Y_COUNT           0xFFC00C98      /* DMA2 Channel 2 Outer Loop Count */
+#define DMA3_X_MODIFY          0xFFC00C94      /* DMA2 Channel 2 Inner Loop Addr Increment */
+#define DMA3_Y_MODIFY          0xFFC00C9C      /* DMA2 Channel 2 Outer Loop Addr Increment */
+#define DMA3_CURR_DESC_PTR     0xFFC00CA0      /* DMA2 Channel 2 Current Descriptor Pointer */
+#define DMA3_CURR_ADDR         0xFFC00CA4      /* DMA2 Channel 2 Current Address Pointer */
+#define DMA3_CURR_X_COUNT      0xFFC00CB0      /* DMA2 Channel 2 Current Inner Loop Count */
+#define DMA3_CURR_Y_COUNT      0xFFC00CB8      /* DMA2 Channel 2 Current Outer Loop Count */
+#define DMA3_IRQ_STATUS                0xFFC00CA8      /* DMA2 Channel 2 Interrupt /Status Register */
+#define DMA3_PERIPHERAL_MAP    0xFFC00CAC      /* DMA2 Channel 2 Peripheral Map Register */
+
+#define DMA4_CONFIG            0xFFC00CC8      /* DMA2 Channel 3 Configuration register */
+#define DMA4_NEXT_DESC_PTR     0xFFC00CC0      /* DMA2 Channel 3 Next Descripter Ptr Reg */
+#define DMA4_START_ADDR                0xFFC00CC4      /* DMA2 Channel 3 Start Address */
+#define DMA4_X_COUNT           0xFFC00CD0      /* DMA2 Channel 3 Inner Loop Count */
+#define DMA4_Y_COUNT           0xFFC00CD8      /* DMA2 Channel 3 Outer Loop Count */
+#define DMA4_X_MODIFY          0xFFC00CD4      /* DMA2 Channel 3 Inner Loop Addr Increment */
+#define DMA4_Y_MODIFY          0xFFC00CDC      /* DMA2 Channel 3 Outer Loop Addr Increment */
+#define DMA4_CURR_DESC_PTR     0xFFC00CE0      /* DMA2 Channel 3 Current Descriptor Pointer */
+#define DMA4_CURR_ADDR         0xFFC00CE4      /* DMA2 Channel 3 Current Address Pointer */
+#define DMA4_CURR_X_COUNT      0xFFC00CF0      /* DMA2 Channel 3 Current Inner Loop Count */
+#define DMA4_CURR_Y_COUNT      0xFFC00CF8      /* DMA2 Channel 3 Current Outer Loop Count */
+#define DMA4_IRQ_STATUS                0xFFC00CE8      /* DMA2 Channel 3 Interrupt /Status Register */
+#define DMA4_PERIPHERAL_MAP    0xFFC00CEC      /* DMA2 Channel 3 Peripheral Map Register */
+
+#define DMA5_CONFIG            0xFFC00D08      /* DMA2 Channel 4 Configuration register */
+#define DMA5_NEXT_DESC_PTR     0xFFC00D00      /* DMA2 Channel 4 Next Descripter Ptr Reg */
+#define DMA5_START_ADDR                0xFFC00D04      /* DMA2 Channel 4 Start Address */
+#define DMA5_X_COUNT           0xFFC00D10      /* DMA2 Channel 4 Inner Loop Count */
+#define DMA5_Y_COUNT           0xFFC00D18      /* DMA2 Channel 4 Outer Loop Count */
+#define DMA5_X_MODIFY          0xFFC00D14      /* DMA2 Channel 4 Inner Loop Addr Increment */
+#define DMA5_Y_MODIFY          0xFFC00D1C      /* DMA2 Channel 4 Outer Loop Addr Increment */
+#define DMA5_CURR_DESC_PTR     0xFFC00D20      /* DMA2 Channel 4 Current Descriptor Pointer */
+#define DMA5_CURR_ADDR         0xFFC00D24      /* DMA2 Channel 4 Current Address Pointer */
+#define DMA5_CURR_X_COUNT      0xFFC00D30      /* DMA2 Channel 4 Current Inner Loop Count */
+#define DMA5_CURR_Y_COUNT      0xFFC00D38      /* DMA2 Channel 4 Current Outer Loop Count */
+#define DMA5_IRQ_STATUS                0xFFC00D28      /* DMA2 Channel 4 Interrupt /Status Register */
+#define DMA5_PERIPHERAL_MAP    0xFFC00D2C      /* DMA2 Channel 4 Peripheral Map Register */
+
+#define DMA6_CONFIG            0xFFC00D48      /* DMA2 Channel 5 Configuration register */
+#define DMA6_NEXT_DESC_PTR     0xFFC00D40      /* DMA2 Channel 5 Next Descripter Ptr Reg */
+#define DMA6_START_ADDR                0xFFC00D44      /* DMA2 Channel 5 Start Address */
+#define DMA6_X_COUNT           0xFFC00D50      /* DMA2 Channel 5 Inner Loop Count */
+#define DMA6_Y_COUNT           0xFFC00D58      /* DMA2 Channel 5 Outer Loop Count */
+#define DMA6_X_MODIFY          0xFFC00D54      /* DMA2 Channel 5 Inner Loop Addr Increment */
+#define DMA6_Y_MODIFY          0xFFC00D5C      /* DMA2 Channel 5 Outer Loop Addr Increment */
+#define DMA6_CURR_DESC_PTR     0xFFC00D60      /* DMA2 Channel 5 Current Descriptor Pointer */
+#define DMA6_CURR_ADDR         0xFFC00D64      /* DMA2 Channel 5 Current Address Pointer */
+#define DMA6_CURR_X_COUNT      0xFFC00D70      /* DMA2 Channel 5 Current Inner Loop Count */
+#define DMA6_CURR_Y_COUNT      0xFFC00D78      /* DMA2 Channel 5 Current Outer Loop Count */
+#define DMA6_IRQ_STATUS                0xFFC00D68      /* DMA2 Channel 5 Interrupt /Status Register */
+#define DMA6_PERIPHERAL_MAP    0xFFC00D6C      /* DMA2 Channel 5 Peripheral Map Register */
+
+#define DMA7_CONFIG            0xFFC00D88      /* DMA2 Channel 6 Configuration register */
+#define DMA7_NEXT_DESC_PTR     0xFFC00D80      /* DMA2 Channel 6 Next Descripter Ptr Reg */
+#define DMA7_START_ADDR                0xFFC00D84      /* DMA2 Channel 6 Start Address */
+#define DMA7_X_COUNT           0xFFC00D90      /* DMA2 Channel 6 Inner Loop Count */
+#define DMA7_Y_COUNT           0xFFC00D98      /* DMA2 Channel 6 Outer Loop Count */
+#define DMA7_X_MODIFY          0xFFC00D94      /* DMA2 Channel 6 Inner Loop Addr Increment */
+#define DMA7_Y_MODIFY          0xFFC00D9C      /* DMA2 Channel 6 Outer Loop Addr Increment */
+#define DMA7_CURR_DESC_PTR     0xFFC00DA0      /* DMA2 Channel 6 Current Descriptor Pointer */
+#define DMA7_CURR_ADDR         0xFFC00DA4      /* DMA2 Channel 6 Current Address Pointer */
+#define DMA7_CURR_X_COUNT      0xFFC00DB0      /* DMA2 Channel 6 Current Inner Loop Count */
+#define DMA7_CURR_Y_COUNT      0xFFC00DB8      /* DMA2 Channel 6 Current Outer Loop Count */
+#define DMA7_IRQ_STATUS                0xFFC00DA8      /* DMA2 Channel 6 Interrupt /Status Register */
+#define DMA7_PERIPHERAL_MAP    0xFFC00DAC      /* DMA2 Channel 6 Peripheral Map Register */
+
+#define TIMER_ENABLE           0xFFC00680      /* Timer Enable Register */
+#define TIMER_DISABLE          0xFFC00684      /* Timer Disable register */
+#define TIMER_STATUS           0xFFC00688      /* Timer Status register */
+
+/* DMAx_CONFIG, MDMA_yy_CONFIG, IMDMA_yy_CONFIG Masks */
+#define WDSIZE8                        0x00000000      /* Word Size 8 bits */
+#define WDSIZE16               0x00000004      /* Word Size 16 bits */
+#define WDSIZE32               0x00000008      /* Word Size 32 bits */
+
+#endif                         /* _DEF_BF561_H */
diff --git a/include/asm-blackfin/arch-bf561/defBF561_extn.h b/include/asm-blackfin/arch-bf561/defBF561_extn.h
new file mode 100644 (file)
index 0000000..b309b74
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * defBF561_extn.h
+ *
+ * This file is subject to the terms and conditions of the GNU Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Non-GPL License also available as part of VisualDSP++
+ *
+ * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html
+ *
+ * (c) Copyright 2001-2005 Analog Devices, Inc. All rights reserved
+ *
+ * This file under source code control, please send bugs or changes to:
+ * dsptools.support@analog.com
+ *
+ */
+
+#ifndef _DEF_BF561_EXTN_H
+#define _DEF_BF561_EXTN_H
+
+#define OFFSET_( x )           ((x) & 0x0000FFFF) /* define macro for offset */
+/* Delay inserted for PLL transition */
+#define PLL_DELAY              0x1000
+
+#define L1_ISRAM               0xFFA00000
+#define L1_ISRAM_END           0xFFA10000
+#define DATA_BANKA_SRAM                0xFF800000
+#define DATA_BANKA_SRAM_END    0xFF808000
+#define DATA_BANKB_SRAM                0xFF900000
+#define DATA_BANKB_SRAM_END    0xFF908000
+#define SYSMMR_BASE            0xFFC00000
+#define WDSIZE16               0x00000004
+
+/* Event Vector Table Address */
+#define EVT_EMULATION_ADDR     0xffe02000
+#define EVT_RESET_ADDR         0xffe02004
+#define EVT_NMI_ADDR           0xffe02008
+#define EVT_EXCEPTION_ADDR     0xffe0200c
+#define EVT_GLOBAL_INT_ENB_ADDR        0xffe02010
+#define EVT_HARDWARE_ERROR_ADDR        0xffe02014
+#define EVT_TIMER_ADDR         0xffe02018
+#define EVT_IVG7_ADDR          0xffe0201c
+#define EVT_IVG8_ADDR          0xffe02020
+#define EVT_IVG9_ADDR          0xffe02024
+#define EVT_IVG10_ADDR         0xffe02028
+#define EVT_IVG11_ADDR         0xffe0202c
+#define EVT_IVG12_ADDR         0xffe02030
+#define EVT_IVG13_ADDR         0xffe02034
+#define EVT_IVG14_ADDR         0xffe02038
+#define EVT_IVG15_ADDR         0xffe0203c
+#define EVT_OVERRIDE_ADDR      0xffe02100
+
+/* IMASK Bit values */
+#define IVG15_POS              0x00008000
+#define IVG14_POS              0x00004000
+#define IVG13_POS              0x00002000
+#define IVG12_POS              0x00001000
+#define IVG11_POS              0x00000800
+#define IVG10_POS              0x00000400
+#define IVG9_POS               0x00000200
+#define IVG8_POS               0x00000100
+#define IVG7_POS               0x00000080
+#define IVGTMR_POS             0x00000040
+#define IVGHW_POS              0x00000020
+
+#define WDOG_TMR_DISABLE       (0xAD << 4)
+#define ICTL_RST               0x00000000
+#define ICTL_NMI               0x00000002
+#define ICTL_GP                        0x00000004
+#define ICTL_DISABLE           0x00000003
+
+/* Watch Dog timer values setup */
+#define WATCHDOG_DISABLE       WDOG_TMR_DISABLE | ICTL_DISABLE
+
+#endif /* _DEF_BF561_EXTN_H */
diff --git a/include/asm-blackfin/arch-bf561/irq.h b/include/asm-blackfin/arch-bf561/irq.h
new file mode 100644 (file)
index 0000000..2f7dd99
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * linux/arch/$(ARCH)/platform/$(PLATFORM)/irq.c
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ *
+ * Changed by HuTao Apr18, 2003
+ *
+ * Copyright was missing when I got the code so took from MIPS arch ...MaTed---
+ * Copyright (C) 1994 by Waldorf GMBH, written by Ralf Baechle
+ * Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001 by Ralf Baechle
+ *
+ * Adapted for BlackFin (ADI) by Ted Ma <mated@sympatico.ca>
+ * Copyright (c) 2002 Arcturus Networks Inc. (www.arcturusnetworks.com)
+ * Copyright (c) 2002 Lineo, Inc. <mattw@lineo.com>
+ *
+ * Adapted for BlackFin BF533 by Bas Vermeulen <bas@buyways.nl>
+ * Copyright (c) 2003 BuyWays B.V. (www.buyways.nl)
+ * Copyright (c) 2004 LG Soft India.
+ * Copyright (c) 2004 HHTech.
+ *
+ * Adapted for BlackFin BF561 by Bas Vermeulen <bas@buyways.nl>
+ * Copyright (c) 2005 BuyWays B.V. (www.buyways.nl)
+ */
+
+#ifndef _BF561_IRQ_H_
+#define _BF561_IRQ_H_
+
+/*
+ * Interrupt source definitions:
+ *     Event Source            Core Event Name     IRQ No
+ *     Emulation Events                EMU             0
+ *     Reset                           RST             1
+ *     NMI                             NMI             2
+ *     Exception                       EVX             3
+ *     Reserved                        --              4
+ *     Hardware Error                  IVHW            5
+ *     Core Timer                      IVTMR           6
+ *
+ *     PLL Wakeup Interrupt            IVG7            7
+ *     DMA1 Error (generic)            IVG7            8
+ *     DMA2 Error (generic)            IVG7            9
+ *     IMDMA Error (generic)           IVG7            10
+ *     PPI1 Error Interrupt            IVG7            11
+ *     PPI2 Error Interrupt            IVG7            12
+ *     SPORT0 Error Interrupt          IVG7            13
+ *     SPORT1 Error Interrupt          IVG7            14
+ *     SPI Error Interrupt             IVG7            15
+ *     UART Error Interrupt            IVG7            16
+ *     Reserved Interrupt              IVG7            17
+ *
+ *     DMA1 0  Interrupt(PPI1)         IVG8            18
+ *     DMA1 1  Interrupt(PPI2)         IVG8            19
+ *     DMA1 2  Interrupt               IVG8            20
+ *     DMA1 3  Interrupt               IVG8            21
+ *     DMA1 4  Interrupt               IVG8            22
+ *     DMA1 5  Interrupt               IVG8            23
+ *     DMA1 6  Interrupt               IVG8            24
+ *     DMA1 7  Interrupt               IVG8            25
+ *     DMA1 8  Interrupt               IVG8            26
+ *     DMA1 9  Interrupt               IVG8            27
+ *     DMA1 10 Interrupt               IVG8            28
+ *     DMA1 11 Interrupt               IVG8            29
+ *
+ *     DMA2 0  (SPORT0 RX)             IVG9            30
+ *     DMA2 1  (SPORT0 TX)             IVG9            31
+ *     DMA2 2  (SPORT1 RX)             IVG9            32
+ *     DMA2 3  (SPORT2 TX)             IVG9            33
+ *     DMA2 4  (SPI)                   IVG9            34
+ *     DMA2 5  (UART RX)               IVG9            35
+ *     DMA2 6  (UART TX)               IVG9            36
+ *     DMA2 7  Interrupt               IVG9            37
+ *     DMA2 8  Interrupt               IVG9            38
+ *     DMA2 9  Interrupt               IVG9            39
+ *     DMA2 10 Interrupt               IVG9            40
+ *     DMA2 11 Interrupt               IVG9            41
+ *
+ *     TIMER 0  Interrupt              IVG10           42
+ *     TIMER 1  Interrupt              IVG10           43
+ *     TIMER 2  Interrupt              IVG10           44
+ *     TIMER 3  Interrupt              IVG10           45
+ *     TIMER 4  Interrupt              IVG10           46
+ *     TIMER 5  Interrupt              IVG10           47
+ *     TIMER 6  Interrupt              IVG10           48
+ *     TIMER 7  Interrupt              IVG10           49
+ *     TIMER 8  Interrupt              IVG10           50
+ *     TIMER 9  Interrupt              IVG10           51
+ *     TIMER 10 Interrupt              IVG10           52
+ *     TIMER 11 Interrupt              IVG10           53
+ *
+ *     Programmable Flags0 A (8)       IVG11           54
+ *     Programmable Flags0 B (8)       IVG11           55
+ *     Programmable Flags1 A (8)       IVG11           56
+ *     Programmable Flags1 B (8)       IVG11           57
+ *     Programmable Flags2 A (8)       IVG11           58
+ *     Programmable Flags2 B (8)       IVG11           59
+ *
+ *     MDMA1 0 write/read INT          IVG8            60
+ *     MDMA1 1 write/read INT          IVG8            61
+ *
+ *     MDMA2 0 write/read INT          IVG9            62
+ *     MDMA2 1 write/read INT          IVG9            63
+ *
+ *     IMDMA 0 write/read INT          IVG12           64
+ *     IMDMA 1 write/read INT          IVG12           65
+ *
+ *     Watch Dog Timer                 IVG13           66
+ *
+ *     Reserved interrupt              IVG7            67
+ *     Reserved interrupt              IVG7            68
+ *     Supplemental interrupt 0        IVG7            69
+ *     supplemental interrupt 1        IVG7            70
+ *
+ *     Software Interrupt 1            IVG14           71
+ *     Software Interrupt 2            IVG15           72
+ */
+
+/*
+ * The ABSTRACT IRQ definitions
+ *  the first seven of the following are fixed,
+ *  the rest you change if you need to.
+ */
+/* IVG 0-6 */
+#define        IRQ_EMU                 0       /* Emulation */
+#define        IRQ_RST                 1       /* Reset */
+#define        IRQ_NMI                 2       /* Non Maskable Interrupt */
+#define        IRQ_EVX                 3       /* Exception */
+#define        IRQ_UNUSED              4       /* Reserved interrupt */
+#define        IRQ_HWERR               5       /* Hardware Error */
+#define        IRQ_CORETMR             6       /* Core timer */
+
+#define        IRQ_UART_RX_BIT         0x10000000
+#define        IRQ_UART_TX_BIT         0x20000000
+#define        IRQ_UART_ERROR_BIT      0x200
+
+#endif                         /* _BF561_IRQ_H_ */
diff --git a/include/asm-blackfin/arch-common/bf53x_rtc.h b/include/asm-blackfin/arch-common/bf53x_rtc.h
new file mode 100644 (file)
index 0000000..f4440a8
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * U-boot - bf533_rtc.h
+ *
+ * Copyright (c) 2005-2007 Analog Devices 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., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#ifndef _BF533_RTC_H_
+#define _BF533_RTC_H_
+
+void rtc_init(void);
+void wait_for_complete(void);
+void rtc_reset(void);
+
+#define MIN_TO_SECS(_x_)       (60 * _x_)
+#define HRS_TO_SECS(_x_)       (60 * 60 * _x_)
+#define DAYS_TO_SECS(_x_)      (24 * 60 * 60 * _x_)
+
+#define NUM_SECS_IN_DAY                (24 * 3600)
+#define NUM_SECS_IN_HOUR       (3600)
+#define NUM_SECS_IN_MIN                (60)
+
+/* Shift values for RTC_STAT register */
+#define DAY_BITS_OFF           17
+#define HOUR_BITS_OFF          12
+#define MIN_BITS_OFF           6
+#define SEC_BITS_OFF           0
+
+#endif
diff --git a/include/asm-blackfin/arch-common/cdefBF5xx.h b/include/asm-blackfin/arch-common/cdefBF5xx.h
new file mode 100644 (file)
index 0000000..aec70ce
--- /dev/null
@@ -0,0 +1,40 @@
+/************************************************************************
+ *
+ * cdefBF53x.h
+ *
+ * (c) Copyright 2002-2003 Analog Devices, Inc.  All rights reserved.
+ *
+ ************************************************************************/
+
+#ifndef _CDEFBF53x_H
+#define _CDEFBF53x_H
+
+#if defined(__ADSPBF531__)
+       #include <asm/arch-bf533/cdefBF531.h>
+#elif defined(__ADSPBF532__)
+       #include <asm/arch-bf533/cdefBF532.h>
+#elif defined(__ADSPBF533__)
+       #include <asm/arch-bf533/cdefBF533.h>
+       #include <asm/arch-bf533/defBF533_extn.h>
+       #include <asm/arch-bf533/bf533_serial.h>
+#elif defined(__ADSPBF537__)
+       #include <asm/arch-bf537/cdefBF537.h>
+       #include <asm/arch-bf537/defBF537_extn.h>
+       #include <asm/arch-bf537/bf537_serial.h>
+#elif defined(__ADSPBF561__)
+       #include <asm/arch-bf561/cdefBF561.h>
+       #include <asm/arch-bf561/defBF561_extn.h>
+       #include <asm/arch-bf561/bf561_serial.h>
+#elif defined(__ADSPBF535__)
+       #include <asm/cpu/cdefBF5d35.h>
+#elif defined(__AD6532__)
+       #include <asm/cpu/cdefAD6532.h>
+#else
+       #if defined(__ADSPLPBLACKFIN__)
+               #include <asm/arch-bf533/cdefBF532.h>
+       #else
+               #include <asm/arch-bf533/cdefBF535.h>
+       #endif
+#endif
+
+#endif /* _CDEFBF53x_H */
similarity index 86%
rename from include/asm-blackfin/cpu/cdef_LPBlackfin.h
rename to include/asm-blackfin/arch-common/cdef_LPBlackfin.h
index e6471cbcb37f6520a7caba39fb85de017bfe156c..90b21e525baccd97891263d3a3fe556fc3b1c5e2 100644 (file)
@@ -1,38 +1,24 @@
-/*
- * cdef_LPBlackfin.h
- *
- * This file is subject to the terms and conditions of the GNU Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Non-GPL License also available as part of VisualDSP++
+/************************************************************************
  *
- * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html
- *
- * (c) Copyright 2001-2005 Analog Devices, Inc. All rights reserved
+ * cdef_LPBlackfin.h
  *
- * This file under source code control, please send bugs or changes to:
- * dsptools.support@analog.com
+ * (c) Copyright 2002-2003 Analog Devices, Inc.  All rights reserved.
  *
- */
+ ************************************************************************/
 
 #ifndef _CDEF_LPBLACKFIN_H
 #define _CDEF_LPBLACKFIN_H
 
-/*
- * #if !defined(__ADSPLPBLACKFIN__)
- * #warning cdef_LPBlackfin.h should only be included for 532 compatible chips.
- * #endif
- */
-#include <asm/cpu/def_LPBlackfin.h>
+#if !defined(__ADSPLPBLACKFIN__)
+#warning cdef_LPBlackfin.h should only be included for 532 compatible chips.
+#endif
+#include <asm/arch-common/def_LPBlackfin.h>
 
-/* Cache & SRAM Memory */
+/* Cache & SRAM Memory */
 #define pSRAM_BASE_ADDRESS ((volatile void **)SRAM_BASE_ADDRESS)
 #define pDMEM_CONTROL ((volatile unsigned long *)DMEM_CONTROL)
 #define pDCPLB_STATUS ((volatile unsigned long *)DCPLB_STATUS)
 #define pDCPLB_FAULT_ADDR ((volatile void **)DCPLB_FAULT_ADDR)
-
-/* #define MMR_TIMEOUT 0xFFE00010 */   /* Memory-Mapped Register Timeout Register */
 #define pDCPLB_ADDR0 ((volatile void **)DCPLB_ADDR0)
 #define pDCPLB_ADDR1 ((volatile void **)DCPLB_ADDR1)
 #define pDCPLB_ADDR2 ((volatile void **)DCPLB_ADDR2)
 #define pDCPLB_DATA14 ((volatile unsigned long *)DCPLB_DATA14)
 #define pDCPLB_DATA15 ((volatile unsigned long *)DCPLB_DATA15)
 #define pDTEST_COMMAND ((volatile unsigned long *)DTEST_COMMAND)
-
-/* #define DTEST_INDEX            0xFFE00304 */        /* Data Test Index Register */
 #define pDTEST_DATA0 ((volatile unsigned long *)DTEST_DATA0)
 #define pDTEST_DATA1 ((volatile unsigned long *)DTEST_DATA1)
-
-/*
- * # define DTEST_DATA2        0xFFE00408   Data Test Data Register
- * #define DTEST_DATA3 0xFFE0040C   Data Test Data Register
- */
 #define pIMEM_CONTROL ((volatile unsigned long *)IMEM_CONTROL)
 #define pICPLB_STATUS ((volatile unsigned long *)ICPLB_STATUS)
 #define pICPLB_FAULT_ADDR ((volatile void **)ICPLB_FAULT_ADDR)
 #define pICPLB_DATA14 ((volatile unsigned long *)ICPLB_DATA14)
 #define pICPLB_DATA15 ((volatile unsigned long *)ICPLB_DATA15)
 #define pITEST_COMMAND ((volatile unsigned long *)ITEST_COMMAND)
-
-/* #define ITEST_INDEX 0xFFE01304 */   /* Instruction Test Index Register */
 #define pITEST_DATA0 ((volatile unsigned long *)ITEST_DATA0)
 #define pITEST_DATA1 ((volatile unsigned long *)ITEST_DATA1)
 
 #define pPFCNTR0 ((volatile unsigned long *)PFCNTR0)
 #define pPFCNTR1 ((volatile unsigned long *)PFCNTR1)
 
-/* #define IPRIO 0xFFE02110 */ /* Core Interrupt Priority Register */
-
-#endif /* _CDEF_LPBLACKFIN_H */
+#endif /* _CDEF_LPBLACKFIN_H */
similarity index 99%
rename from include/asm-blackfin/cpu/def_LPBlackfin.h
rename to include/asm-blackfin/arch-common/def_LPBlackfin.h
index 9ac78c836a606accbf68c215bf040fe1e6593fad..ebeeea0321411d314cea4f9228ad135bac048678 100644 (file)
 
 /* ** Masks */
 /* Exception cause */
-#define SEQSTAT_EXCAUSE                MK_BMSK_(SEQSTAT_EXCAUSE0_P ) | \
+#define SEQSTAT_EXCAUSE                MK_BMSK_(SEQSTAT_EXCAUSE0_P ) | \
                                MK_BMSK_(SEQSTAT_EXCAUSE1_P ) | \
                                MK_BMSK_(SEQSTAT_EXCAUSE2_P ) | \
                                MK_BMSK_(SEQSTAT_EXCAUSE3_P ) | \
                                MK_BMSK_(SEQSTAT_EXCAUSE4_P ) | \
                                MK_BMSK_(SEQSTAT_EXCAUSE5_P ) | \
-                               0
+                               0 )
 
 /* Indicates whether the last reset was a software reset (=1) */
 #define SEQSTAT_SFTRESET       MK_BMSK_(SEQSTAT_SFTRESET_P )
index 65d2c2534572f5c313cc4c4f630c88183a08a0a0..438e50b8e83ad8e65c20612df584449af85cd69b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - bitops.h Routines for bit operations
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_BITOPS_H
@@ -59,7 +59,7 @@ static __inline__ unsigned long ffz(unsigned long word)
 
 static __inline__ void set_bit(int nr, volatile void *addr)
 {
-       int *a = (int *) addr;
+       int *a = (int *)addr;
        int mask;
        unsigned long flags;
 
@@ -72,7 +72,7 @@ static __inline__ void set_bit(int nr, volatile void *addr)
 
 static __inline__ void __set_bit(int nr, volatile void *addr)
 {
-       int *a = (int *) addr;
+       int *a = (int *)addr;
        int mask;
 
        a += nr >> 5;
@@ -88,7 +88,7 @@ static __inline__ void __set_bit(int nr, volatile void *addr)
 
 static __inline__ void clear_bit(int nr, volatile void *addr)
 {
-       int *a = (int *) addr;
+       int *a = (int *)addr;
        int mask;
        unsigned long flags;
 
@@ -102,7 +102,7 @@ static __inline__ void clear_bit(int nr, volatile void *addr)
 static __inline__ void change_bit(int nr, volatile void *addr)
 {
        int mask, flags;
-       unsigned long *ADDR = (unsigned long *) addr;
+       unsigned long *ADDR = (unsigned long *)addr;
 
        ADDR += nr >> 5;
        mask = 1 << (nr & 31);
@@ -114,7 +114,7 @@ static __inline__ void change_bit(int nr, volatile void *addr)
 static __inline__ void __change_bit(int nr, volatile void *addr)
 {
        int mask;
-       unsigned long *ADDR = (unsigned long *) addr;
+       unsigned long *ADDR = (unsigned long *)addr;
 
        ADDR += nr >> 5;
        mask = 1 << (nr & 31);
@@ -124,7 +124,7 @@ static __inline__ void __change_bit(int nr, volatile void *addr)
 static __inline__ int test_and_set_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
        unsigned long flags;
 
        a += nr >> 5;
@@ -140,7 +140,7 @@ static __inline__ int test_and_set_bit(int nr, volatile void *addr)
 static __inline__ int __test_and_set_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
 
        a += nr >> 5;
        mask = 1 << (nr & 0x1f);
@@ -152,7 +152,7 @@ static __inline__ int __test_and_set_bit(int nr, volatile void *addr)
 static __inline__ int test_and_clear_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
        unsigned long flags;
 
        a += nr >> 5;
@@ -168,7 +168,7 @@ static __inline__ int test_and_clear_bit(int nr, volatile void *addr)
 static __inline__ int __test_and_clear_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
 
        a += nr >> 5;
        mask = 1 << (nr & 0x1f);
@@ -180,7 +180,7 @@ static __inline__ int __test_and_clear_bit(int nr, volatile void *addr)
 static __inline__ int test_and_change_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
        unsigned long flags;
 
        a += nr >> 5;
@@ -196,7 +196,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void *addr)
 static __inline__ int __test_and_change_bit(int nr, volatile void *addr)
 {
        int mask, retval;
-       volatile unsigned int *a = (volatile unsigned int *) addr;
+       volatile unsigned int *a = (volatile unsigned int *)addr;
 
        a += nr >> 5;
        mask = 1 << (nr & 0x1f);
@@ -208,16 +208,15 @@ static __inline__ int __test_and_change_bit(int nr, volatile void *addr)
 /*
  * This routine doesn't need to be atomic.
  */
-static __inline__ int __constant_test_bit(int nr,
-                                         const volatile void *addr)
+static __inline__ int __constant_test_bit(int nr, const volatile void *addr)
 {
        return ((1UL << (nr & 31)) &
-               (((const volatile unsigned int *) addr)[nr >> 5])) != 0;
+               (((const volatile unsigned int *)addr)[nr >> 5])) != 0;
 }
 
 static __inline__ int __test_bit(int nr, volatile void *addr)
 {
-       int *a = (int *) addr;
+       int *a = (int *)addr;
        int mask;
 
        a += nr >> 5;
@@ -235,7 +234,7 @@ static __inline__ int __test_bit(int nr, volatile void *addr)
 
 static __inline__ int find_next_zero_bit(void *addr, int size, int offset)
 {
-       unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+       unsigned long *p = ((unsigned long *)addr) + (offset >> 5);
        unsigned long result = offset & ~31UL;
        unsigned long tmp;
 
@@ -290,7 +289,7 @@ static __inline__ int ext2_set_bit(int nr, volatile void *addr)
 {
        int mask, retval;
        unsigned long flags;
-       volatile unsigned char *ADDR = (unsigned char *) addr;
+       volatile unsigned char *ADDR = (unsigned char *)addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
@@ -305,7 +304,7 @@ static __inline__ int ext2_clear_bit(int nr, volatile void *addr)
 {
        int mask, retval;
        unsigned long flags;
-       volatile unsigned char *ADDR = (unsigned char *) addr;
+       volatile unsigned char *ADDR = (unsigned char *)addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
@@ -319,7 +318,7 @@ static __inline__ int ext2_clear_bit(int nr, volatile void *addr)
 static __inline__ int ext2_test_bit(int nr, const volatile void *addr)
 {
        int mask;
-       const volatile unsigned char *ADDR = (const unsigned char *) addr;
+       const volatile unsigned char *ADDR = (const unsigned char *)addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
@@ -331,10 +330,9 @@ static __inline__ int ext2_test_bit(int nr, const volatile void *addr)
 
 static __inline__ unsigned long ext2_find_next_zero_bit(void *addr,
                                                        unsigned long size,
-                                                       unsigned long
-                                                       offset)
+                                                       unsigned long offset)
 {
-       unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+       unsigned long *p = ((unsigned long *)addr) + (offset >> 5);
        unsigned long result = offset & ~31UL;
        unsigned long tmp;
 
index fbdbf30fa128213e806aeceea643d40598f481bf..bf502a4e621b6d88fd798c8efae83734bf666cee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - blackfin.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_H_
 #define _BLACKFIN_H_
 
-#include <asm/cpu/defBF533.h>
-#include <asm/cpu/bf533_serial.h>
+#if !(defined(__ASSEMBLY__) || defined(ASSEMBLY))
+# ifdef SHARED_RESOURCES
+#  include <asm/shared_resources.h>
+# endif
 
-#ifndef __ASSEMBLY__
-#ifndef ASSEMBLY
+# include <linux/types.h>
 
-#ifdef SHARED_RESOURCES
- #include <asm/shared_resources.h>
+extern u_long get_sclk(void);
 #endif
-#include <asm/cpu/cdefBF53x.h>
 
-#endif
-#endif
-
-#include <asm/cpu/defBF533.h>
-#include <asm/cpu/defBF533_extn.h>
-#include <asm/cpu/bf533_serial.h>
+#include <asm/arch-common/cdefBF5xx.h>
 
 #endif
index 21902159716bf486a8a0626e54f418557063366a..451d29c3cfeaaa6133217a1775439cf969223f25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - blackfin_defs.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __BLACKFIN_DEFS_H__
index 3b4df4e134477b2a3b9d72500f5dce6d8ae315a5..a1a52a5c1aa3aabc13734c67a3ee98a47cb15d5c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot -  byteorder.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_BYTEORDER_H
index 7715f645deb98b97d2bbe88fae900ccb24906e22..9d8d9ecc87bac687c28956cb3d653c383268cb73 100644 (file)
@@ -7,14 +7,15 @@
  ************************************************************************/
 
 /* Defines necessary for cplb initialisation routines. */
-
 #ifndef _CPLB_H
 #define _CPLB_H
 
+#define CONFIG_BLKFIN_WT
+
 #define CPLB_ENABLE_ICACHE_P   0
 #define CPLB_ENABLE_DCACHE_P   1
 #define CPLB_ENABLE_DCACHE2_P  2
-#define CPLB_ENABLE_CPLBS_P    3       /* Deprecated!*/
+#define CPLB_ENABLE_CPLBS_P    3       /* Deprecated! */
 #define CPLB_ENABLE_ICPLBS_P   4
 #define CPLB_ENABLE_DCPLBS_P   5
 
 #define CPLB_INOCACHE          CPLB_USER_RD | CPLB_VALID
 #define CPLB_IDOCACHE          CPLB_INOCACHE | CPLB_L1_CHBL
 
-#endif /* _CPLB_H */
+/* Data Attibutes*/
+
+#define SDRAM_IGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID)
+#define SDRAM_IKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
+#define L1_IMEMORY              (PAGE_SIZE_1MB | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
+#define SDRAM_INON_CHBL         (PAGE_SIZE_4MB | CPLB_USER_RD | CPLB_VALID)
+
+/*Use the menuconfig cache policy here - CONFIG_BLKFIN_WT/CONFIG_BLKFIN_WB*/
+
+#define ANOMALY_05000158                0x200
+
+#ifdef CONFIG_BLKFIN_WB                /*Write Back Policy */
+#define SDRAM_DGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_DNON_CHBL         (PAGE_SIZE_4MB | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_USER_RD | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_DKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_USER_WR | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_VALID | CPLB_LOCK | ANOMALY_05000158)
+#define L1_DMEMORY              (PAGE_SIZE_4MB | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_EBIU              (PAGE_SIZE_4MB | CPLB_DIRTY | CPLB_USER_RD | CPLB_USER_WR | CPLB_SUPV_WR | CPLB_VALID | ANOMALY_05000158)
+
+#else                          /*Write Through */
+#define SDRAM_DGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_RD | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_DNON_CHBL         (PAGE_SIZE_4MB | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_DKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | CPLB_LOCK | ANOMALY_05000158)
+#define L1_DMEMORY              (PAGE_SIZE_4MB | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
+#define SDRAM_EBIU              (PAGE_SIZE_4MB | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_USER_WR | CPLB_SUPV_WR | CPLB_VALID | ANOMALY_05000158)
+#endif
+
+#if defined(CONFIG_BF561)
+#define page_descriptor_table_size (CONFIG_MEM_SIZE/4 + 1 + 4) /* SDRAM +L1 + ASYNC_Memory */
+#else
+#define page_descriptor_table_size (CONFIG_MEM_SIZE/4 + 2)     /* SDRAM + L1 + ASYNC_Memory */
+#endif
+#endif                         /* _CPLB_H */
diff --git a/include/asm-blackfin/cplbtab.h b/include/asm-blackfin/cplbtab.h
deleted file mode 100644 (file)
index ab7d989..0000000
+++ /dev/null
@@ -1,572 +0,0 @@
-/*This file is subject to the terms and conditions of the GNU General Public
- * License.
- *
- * Blackfin BF533/2.6 support : LG Soft India
- * Updated : Ashutosh Singh / Jahid Khan : Rrap Software Pvt Ltd
- * Updated : 1. SDRAM_KERNEL, SDRAM_DKENEL are added as initial cplb's
- *             shouldn't be victimized. cplbmgr.S search logic is corrected
- *             to findout the appropriate victim.
- *          2. SDRAM_IGENERIC in dpdt_table is replaced with SDRAM_DGENERIC
- *          : LG Soft India
- */
-#include <config.h>
-
-#ifndef __ARCH_BFINNOMMU_CPLBTAB_H
-#define __ARCH_BFINNOMMU_CPLBTAB_H
-
-/*************************************************************************
- *                     ICPLB TABLE
- *************************************************************************/
-
-.data
-
-/* This table is configurable */
-
-.align 4;
-
-/* Data Attibutes*/
-
-#define SDRAM_IGENERIC         (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID)
-#define SDRAM_IKERNEL          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
-#define L1_IMEMORY             (PAGE_SIZE_1MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_VALID | CPLB_LOCK)
-#define SDRAM_INON_CHBL                (PAGE_SIZE_4MB | CPLB_USER_RD | CPLB_VALID)
-
-/*Use the menuconfig cache policy here - CONFIG_BLKFIN_WT/CONFIG_BLKFIN_WB*/
-
-#define ANOMALY_05000158               0x200
-#ifdef CONFIG_BLKFIN_WB        /*Write Back Policy */
-       #define SDRAM_DGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_DNON_CHBL         (PAGE_SIZE_4MB | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_USER_RD | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_DKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_USER_RD | CPLB_USER_WR | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_VALID | CPLB_LOCK | ANOMALY_05000158)
-       #define L1_DMEMORY              (PAGE_SIZE_4KB | CPLB_L1_CHBL | CPLB_DIRTY | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_EBIU              (PAGE_SIZE_1MB | CPLB_DIRTY | CPLB_USER_RD | CPLB_USER_WR | CPLB_SUPV_WR | CPLB_VALID | ANOMALY_05000158)
-
-#else  /*Write Through*/
-       #define SDRAM_DGENERIC          (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_RD | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_DNON_CHBL         (PAGE_SIZE_4MB | CPLB_WT | CPLB_L1_AOW | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_USER_RD | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_DKERNEL           (PAGE_SIZE_4MB | CPLB_L1_CHBL | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | CPLB_LOCK | ANOMALY_05000158)
-       #define L1_DMEMORY              (PAGE_SIZE_4KB | CPLB_L1_CHBL | CPLB_L1_AOW | CPLB_WT | CPLB_SUPV_WR | CPLB_USER_WR | CPLB_VALID | ANOMALY_05000158)
-       #define SDRAM_EBIU              (PAGE_SIZE_1MB | CPLB_WT | CPLB_L1_AOW | CPLB_USER_RD | CPLB_USER_WR | CPLB_SUPV_WR | CPLB_VALID | ANOMALY_05000158)
-#endif
-
-.global icplb_table
-icplb_table:
-.byte4 0xFFA00000;
-.byte4 (L1_IMEMORY);
-.byte4 0x00000000;
-.byte4 (SDRAM_IKERNEL);                        /*SDRAM_Page1*/
-.byte4 0x00400000;
-.byte4 (SDRAM_IKERNEL);                /*SDRAM_Page1*/
-.byte4 0x07C00000;
-.byte4 (SDRAM_IKERNEL);                /*SDRAM_Page14*/
-.byte4 0x00800000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page2*/
-.byte4 0x00C00000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page2*/
-.byte4 0x01000000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page4*/
-.byte4 0x01400000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page5*/
-.byte4 0x01800000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page6*/
-.byte4 0x01C00000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page7*/
-#ifndef CONFIG_EZKIT                   /*STAMP Memory regions*/
-.byte4 0x02000000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page8*/
-.byte4 0x02400000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page9*/
-.byte4 0x02800000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page10*/
-.byte4 0x02C00000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page11*/
-.byte4 0x03000000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page12*/
-.byte4 0x03400000;
-.byte4 (SDRAM_IGENERIC);               /*SDRAM_Page13*/
-#endif
-.byte4 0xffffffff;                     /* end of section - termination*/
-
-.align 4;
-.global ipdt_table
-ipdt_table:
-#ifdef CONFIG_CPLB_INFO
-.byte4 0x00000000;
-.byte4 (SDRAM_IKERNEL);               /*SDRAM_Page0*/
-.byte4 0x00400000;
-.byte4 (SDRAM_IKERNEL);               /*SDRAM_Page1*/
-#endif
-.byte4 0x00800000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page2*/
-.byte4 0x00C00000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page3*/
-.byte4 0x01000000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page4*/
-.byte4 0x01400000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page5*/
-.byte4 0x01800000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page6*/
-.byte4 0x01C00000;
-.byte4 (SDRAM_IGENERIC);              /*SDRAM_Page7*/
-#ifndef CONFIG_EZKIT                  /*STAMP Memory regions*/
-.byte4  0x02000000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page8*/
-.byte4  0x02400000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page9*/
-.byte4  0x02800000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page10*/
-.byte4  0x02C00000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page11*/
-.byte4  0x03000000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page12*/
-.byte4  0x03400000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page13*/
-.byte4  0x03800000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page14*/
-.byte4  0x03C00000;
-.byte4  (SDRAM_IGENERIC);              /*SDRAM_Page15*/
-#endif
-.byte4  0x20200000;
-.byte4  (SDRAM_EBIU);      /* Async Memory Bank 2 (Secnd)*/
-.byte4  0x20100000;
-.byte4  (SDRAM_EBIU);      /* Async Memory Bank 1 (Prim B)*/
-.byte4  0x20000000;
-.byte4  (SDRAM_EBIU);      /* Async Memory Bank 0 (Prim A)*/
-.byte4  0x20300000;             /*Fix for Network*/
-.byte4  (SDRAM_EBIU);    /*Async Memory bank 3*/
-
-#ifdef CONFIG_STAMP
-.byte4        0x04000000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x04400000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x04800000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x04C00000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x05000000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x05400000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x05800000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x05C00000;
-.byte4  (SDRAM_IGENERIC);
-.byte4        0x06000000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page25*/
-.byte4        0x06400000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page26*/
-.byte4        0x06800000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page27*/
-.byte4        0x06C00000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page28*/
-.byte4        0x07000000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page29*/
-.byte4        0x07400000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page30*/
-.byte4        0x07800000;
-.byte4  (SDRAM_IGENERIC);       /*SDRAM_Page31*/
-#ifdef CONFIG_CPLB_INFO
-.byte4        0x07C00000;
-.byte4  (SDRAM_IKERNEL);        /*SDRAM_Page32*/
-#endif
-#endif
-.byte4 0xffffffff;                    /* end of section - termination*/
-
-/*********************************************************************
- *                     DCPLB TABLE
- ********************************************************************/
-
-.global dcplb_table
-dcplb_table:
-.byte4 0x00000000;
-.byte4 (SDRAM_DKERNEL);        /*SDRAM_Page1*/
-.byte4 0x00400000;
-.byte4 (SDRAM_DKERNEL);        /*SDRAM_Page1*/
-.byte4 0x07C00000;
-.byte4 (SDRAM_DKERNEL);        /*SDRAM_Page15*/
-.byte4 0x00800000;
-.byte4         (SDRAM_DGENERIC);       /*SDRAM_Page2*/
-.byte4         0x00C00000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page3*/
-.byte4 0x01000000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page4*/
-.byte4 0x01400000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page5*/
-.byte4 0x01800000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page6*/
-.byte4 0x01C00000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page7*/
-#ifndef CONFIG_EZKIT
-.byte4 0x02000000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page8*/
-.byte4 0x02400000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page9*/
-.byte4 0x02800000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page10*/
-.byte4 0x02C00000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page11*/
-.byte4 0x03000000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page12*/
-.byte4 0x03400000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page13*/
-.byte4 0x03800000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page14*/
-#endif
-.byte4 0xffffffff;             /*end of section - termination*/
-
-/**********************************************************************
- *             PAGE DESCRIPTOR TABLE
- *
- **********************************************************************/
-
-/* Till here we are discussing about the static memory management model.
- * However, the operating envoronments commonly define more CPLB
- * descriptors to cover the entire addressable memory than will fit into
- * the available on-chip 16 CPLB MMRs. When this happens, the below table
- * will be used which will hold all the potentially required CPLB descriptors
- *
- * This is how Page descriptor Table is implemented in uClinux/Blackfin.
- */
-.global dpdt_table
-dpdt_table:
-#ifdef CONFIG_CPLB_INFO
-.byte4        0x00000000;
-.byte4        (SDRAM_DKERNEL);        /*SDRAM_Page0*/
-.byte4        0x00400000;
-.byte4        (SDRAM_DKERNEL);        /*SDRAM_Page1*/
-#endif
-.byte4        0x00800000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page2*/
-.byte4        0x00C00000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page3*/
-.byte4        0x01000000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page4*/
-.byte4        0x01400000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page5*/
-.byte4        0x01800000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page6*/
-.byte4        0x01C00000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page7*/
-
-#ifndef CONFIG_EZKIT
-.byte4        0x02000000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page8*/
-.byte4        0x02400000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page9*/
-.byte4        0x02800000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page10*/
-.byte4        0x02C00000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page11*/
-.byte4        0x03000000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page12*/
-.byte4        0x03400000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page13*/
-.byte4        0x03800000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page14*/
-.byte4        0x03C00000;
-.byte4        (SDRAM_DGENERIC);       /*SDRAM_Page15*/
-#endif
-.byte4 0x20200000;
-.byte4 (SDRAM_EBIU);   /* Async Memory Bank 2 (Secnd)*/
-.byte4 0x20100000;
-.byte4 (SDRAM_EBIU);   /* Async Memory Bank 1 (Prim B)*/
-.byte4 0x20000000;
-.byte4 (SDRAM_EBIU);   /* Async Memory Bank 0 (Prim A)*/
-.byte4 0x20300000;             /*Fix for Network*/
-.byte4  (SDRAM_EBIU);  /*Async Memory bank 3*/
-
-#ifdef CONFIG_STAMP
-.byte4 0x04000000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x04400000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x04800000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x04C00000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x05000000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x05400000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x05800000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x05C00000;
-.byte4  (SDRAM_DGENERIC);
-.byte4 0x06000000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page25*/
-.byte4 0x06400000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page26*/
-.byte4 0x06800000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page27*/
-.byte4 0x06C00000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page28*/
-.byte4 0x07000000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page29*/
-.byte4 0x07400000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page30*/
-.byte4 0x07800000;
-.byte4 (SDRAM_DGENERIC);       /*SDRAM_Page31*/
-#ifdef CONFIG_CPLB_INFO
-.byte4 0x07C00000;
-.byte4 (SDRAM_DKERNEL);        /*SDRAM_Page32*/
-#endif
-#endif
-
-.byte4  0xFF900000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF901000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF902000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF903000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF904000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF905000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF906000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF907000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF800000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF801000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF802000;
-.byte4  (L1_DMEMORY);
-.byte4  0xFF803000;
-.byte4  (L1_DMEMORY);
-
-.byte4 0xffffffff;             /*end of section - termination*/
-
-#ifdef CONFIG_CPLB_INFO
-.global ipdt_swapcount_table;  /* swapin count first, then swapout count*/
-ipdt_swapcount_table:
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 10 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 20 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 30 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 40 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 50 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 60 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 70 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 80 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 90 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 100 */
-
-.global dpdt_swapcount_table;  /* swapin count first, then swapout count*/
-dpdt_swapcount_table:
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 10 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 20 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 30 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 40 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 50 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 60 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 70 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 80 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 80 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 100 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 110 */
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;
-.byte4        0x00000000;      /* 120 */
-
-#endif
-
-#endif /*__ARCH_BFINNOMMU_CPLBTAB_H*/
diff --git a/include/asm-blackfin/cpu/cdefBF53x.h b/include/asm-blackfin/cpu/cdefBF53x.h
deleted file mode 100644 (file)
index db4eaa9..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/************************************************************************
- *
- * cdefBF53x.h
- *
- * (c) Copyright 2002-2003 Analog Devices, Inc.  All rights reserved.
- *
- ************************************************************************/
-
-#ifndef _CDEFBF53x_H
-#define _CDEFBF53x_H
-
-#if defined(__ADSPBF531__)
-       #include <asm/cpu/cdefBF531.h>
-#elif defined(__ADSPBF532__)
-       #include <asm/cpu/cdefBF532.h>
-#elif defined(__ADSPBF533__)
-       #include <asm/cpu/cdefBF533.h>
-#elif defined(__ADSPBF561__)
-       #include <asm/cpu/cdefBF561.h>
-#elif defined(__ADSPBF535__)
-       #include <asm/cpu/cdefBF535.h>
-#elif defined(__AD6532__)
-       #include <sam/cpu/cdefAD6532.h>
-#else
-       #if defined(__ADSPLPBLACKFIN__)
-               #include <asm/cpu/cdefBF532.h>
-       #else
-               #include <asm/cpu/cdefBF535.h>
-       #endif
-#endif
-
-#endif /* _CDEFBF53x_H */
index 108c2792a09000a8006caaf7dd9223e7c6f467e1..ed2b851e9559643aee67ce4b0b91491fa8037a37 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - current.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_CURRENT_H
index dbb73887efd7db366157255dcb63c94859ace27e..ea0b3664e01bf690254cdeff9540d3f0f49e2059 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - delay.h Routines for introducing delays
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_DELAY_H
@@ -35,9 +35,9 @@
 extern __inline__ void __delay(unsigned long loops)
 {
        __asm__ __volatile__("1:\t%0 += -1;\n\t"
-                               "cc = %0 == 0;\n\t"
-                               "if ! cc jump 1b;\n":"=d"(loops)
-                               :"0"(loops));
+                            "cc = %0 == 0;\n\t"
+                            "if ! cc jump 1b;\n":"=d"(loops)
+                            :"0"(loops));
 }
 
 /*
index 607a5b8e98a43604ee813edfced3b2a8d98f6574..eb84f11bdb30d6733c83520ac20d27870cd4a400 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - entry.h Routines for context saving and restoring
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __BLACKFIN_ENTRY_H
@@ -27,7 +27,6 @@
 
 #include <linux/config.h>
 #include <asm/setup.h>
-#include <asm/page.h>
 
 /*
  * Stack layout in 'ret_from_exception':
 #define STR1(X)                #X
 
 #if defined(NEW_PT_REGS)
-
 #define PT_OFF_ORIG_R0         208
 #define PT_OFF_SR              8
-
 #else
-
 #define PT_OFF_ORIG_R0         0x54
 #define PT_OFF_SR              0x38    /* seqstat in pt_regs */
-
-#endif
 #endif
 
 #endif
+#endif
index 713bba0b221c96882bec38a01536945089486009..0d2c618030f18d0be0453945ca53fc14791cf733 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - errno.h Error number defines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_ERRNO_H
index 56a12f07b387f0f01179dc5577de4facc73a701d..9024d0a06e3cc6a398c43b967abc8a481da9aa51 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - global_data.h Declarations for global data of u-boot
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef        __ASM_GBL_DATA_H
@@ -45,11 +45,16 @@ typedef struct global_data {
        unsigned long board_type;
        unsigned long baudrate;
        unsigned long have_console;     /* serial_init() was called */
-       unsigned long ram_size;         /* RAM size */
+       unsigned long ram_size; /* RAM size */
        unsigned long reloc_off;        /* Relocation Offset */
-       unsigned long env_addr;         /* Address  of Environment struct */
+       unsigned long env_addr; /* Address  of Environment struct */
        unsigned long env_valid;        /* Checksum of Environment valid? */
-       void **jt;                      /* jump table */
+#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
+       unsigned long post_log_word;    /* Record POST activities */
+       unsigned long post_init_f_time; /* When post_init_f started */
+#endif
+
+       void **jt;              /* jump table */
 } gd_t;
 
 /*
@@ -59,6 +64,6 @@ typedef struct global_data {
 #define        GD_FLG_DEVINIT  0x00002 /* Devices have been initialized */
 #define        GD_FLG_SILENT   0x00004 /* Silent mode                   */
 
-#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("P5")
+#define DECLARE_GLOBAL_DATA_PTR     register gd_t * volatile gd asm ("P5")
 
 #endif
index 1ee050ec14ab1da2d9a64d5841bc037a8602c646..9b360553cb549b0fa4d7ec63f2add7255d66425e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - hw_irq.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * linux/arch/$(ARCH)/platform/$(PLATFORM)/hw_irq.h
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <linux/config.h>
 #ifdef CONFIG_EZKIT533
-#include <asm/board/bf533_irq.h>
+#include <asm/arch-bf533/irq.h>
+#endif
+#ifdef CONFIG_EZKIT561
+#include <asm/arch-bf561/irq.h>
 #endif
 #ifdef CONFIG_STAMP
-#include <asm/board/bf533_irq.h>
+#include <asm/arch-bf533/irq.h>
+#endif
+#ifdef CONFIG_BF537
+#include <asm/arch-bf537/irq.h>
 #endif
index 0b0572ffa4d3b715d76934380125e60c765be195..5d0ad0618438cc3e04b69eea7b445dad60ccd23e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - io-kernel.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_IO_H
@@ -87,7 +87,8 @@
 #define IOMAP_WRITETHROUGH             3
 
 #ifndef __ASSEMBLY__
-extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag);
+extern void *__ioremap(unsigned long physaddr, unsigned long size,
+                      int cacheflag);
 extern void __iounmap(void *addr, unsigned long size);
 extern inline void *ioremap(unsigned long physaddr, unsigned long size)
 {
@@ -97,11 +98,13 @@ extern inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
 {
        return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
 }
-extern inline void *ioremap_writethrough(unsigned long physaddr, unsigned long size)
+extern inline void *ioremap_writethrough(unsigned long physaddr,
+                                        unsigned long size)
 {
        return __ioremap(physaddr, size, IOMAP_WRITETHROUGH);
 }
-extern inline void *ioremap_fullcache(unsigned long physaddr, unsigned long size)
+extern inline void *ioremap_fullcache(unsigned long physaddr,
+                                     unsigned long size)
 {
        return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
 }
index e5b388e262b87f2411677c14e7aac7a5b6bc30bb..332d2c643745f6aa12b4a865c9710b5e2a55fa8f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - io.h IO routines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_IO_H
 extern void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words);
 extern void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words);
 extern unsigned char cf_inb(volatile unsigned char *addr);
-extern void cf_outb(unsigned char val, volatile unsigned char* addr);
+extern void cf_outb(unsigned char val, volatile unsigned char *addr);
+
+static inline void sync(void)
+{
+       __builtin_bfin_ssync();
+}
 
 /*
  * These are for ISA/PCI shared memory _only_ and should never be used
@@ -46,7 +51,6 @@ extern void cf_outb(unsigned char val, volatile unsigned char* addr);
  * memory location directly.
  */
 
-
 #define readb(addr)            ({ unsigned char __v = (*(volatile unsigned char *) (addr));asm("ssync;"); __v; })
 #define readw(addr)            ({ unsigned short __v = (*(volatile unsigned short *) (addr)); asm("ssync;");__v; })
 #define readl(addr)            ({ unsigned int __v = (*(volatile unsigned int *) (addr));asm("ssync;"); __v; })
@@ -95,8 +99,7 @@ extern inline void *ioremap(unsigned long physaddr, unsigned long size)
 {
        return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
 }
-extern inline void *ioremap_nocache(unsigned long physaddr,
-                                   unsigned long size)
+extern inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
 {
        return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
 }
index 5fbc5a363b25ce7b7a54d87dd8a38109542094d7..1fff316881505d701827cecc0a1f7c323cba333c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - irq.h Interrupt related header file
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file was based on
  * linux/arch/$(ARCH)/platform/$(PLATFORM)/irq.c
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_IRQ_H_
 #define _BLACKFIN_IRQ_H_
 
 #include <linux/config.h>
-#include <asm/cpu/bf533_irq.h>
+#include <asm/hw_irq.h>
 
 /*
  *   On the Blackfin, the interrupt structure allows remmapping of the hardware
@@ -85,8 +85,8 @@ static __inline__ int irq_cannonicalize(int irq)
 extern void (*mach_enable_irq) (unsigned int);
 extern void (*mach_disable_irq) (unsigned int);
 extern int sys_request_irq(unsigned int,
-                       void (*)(int, void *, struct pt_regs *),
-                       unsigned long, const char *, void *);
+                          void (*)(int, void *, struct pt_regs *),
+                          unsigned long, const char *, void *);
 extern void sys_free_irq(unsigned int, void *);
 
 /*
index 18f0c36d24a0edaecc04c0de4e983129050d240f..4fc1acf0ba3c868c4467fb21cb2afae37b5b6101 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - linkage.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _LINUX_LINKAGE_H
index 0a43ba1c5a77d99e20f15062458686ee722ed874..8bf94738ec9d0f6acbf0468a6665e55571d4191c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - machdep.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_MACHDEP_H
@@ -39,7 +39,8 @@ struct hwclk_time;
 struct gendisk;
 struct buffer_head;
 
-extern void (*mach_sched_init) (void (*handler)        (int, void *, struct pt_regs *));
+extern
+    void (*mach_sched_init) (void (*handler) (int, void *, struct pt_regs *));
 
 /* machine dependent keyboard functions */
 extern int (*mach_keyb_init) (void);
index 1a13d908e0f03afb63fc8f4d5382170232259fca..cb448ad61ec4d601d146853ed4b6f326fa35c9fa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - mem_init.h Header file for memory initialization
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
-#if ( CONFIG_MEM_MT48LC16M16A2TG_75  ||  CONFIG_MEM_MT48LC64M4A2FB_7E )
+#if (CONFIG_MEM_MT48LC16M16A2TG_75 || \
+       CONFIG_MEM_MT48LC64M4A2FB_7E || \
+       CONFIG_MEM_MT48LC16M8A2TG_75 || \
+       CONFIG_MEM_MT48LC8M16A2TG_7E || \
+       CONFIG_MEM_MT48LC8M32B2B5_7  || \
+       CONFIG_MEM_MT48LC32M8A2_75)
+
        #if ( CONFIG_SCLK_HZ > 119402985 )
                #define SDRAM_tRP       TRP_2
                #define SDRAM_tRP_num   2
@@ -66,7 +72,7 @@
        #if ( CONFIG_SCLK_HZ >  59701493 ) && ( CONFIG_SCLK_HZ <= 66666667 )
                #define SDRAM_tRP       TRP_1
                #define SDRAM_tRP_num   1
-               #define SDRAM_tRAS      TRAS_4
+               #define SDRAM_tRAS      TRAS_3
                #define SDRAM_tRAS_num  3
                #define SDRAM_tRCD      TRCD_1
                #define SDRAM_tWR       TWR_2
 
 #if (CONFIG_MEM_MT48LC16M16A2TG_75)
        /*SDRAM INFORMATION: */
-       #define SDRAM_Tref      64       /* Refresh period in milliseconds   */
-       #define SDRAM_NRA       8192     /* Number of row addresses in SDRAM */
+       #define SDRAM_Tref      64      /* Refresh period in milliseconds   */
+       #define SDRAM_NRA       8192    /* Number of row addresses in SDRAM */
        #define SDRAM_CL        CL_3
 #endif
 
 #if (CONFIG_MEM_MT48LC64M4A2FB_7E)
        /*SDRAM INFORMATION: */
-       #define SDRAM_Tref      64       /* Refresh period in milliseconds   */
-       #define SDRAM_NRA       8192     /* Number of row addresses in SDRAM */
+       #define SDRAM_Tref      64      /* Refresh period in milliseconds   */
+       #define SDRAM_NRA       8192    /* Number of row addresses in SDRAM */
+       #define SDRAM_CL        CL_2
+#endif
+
+#if (CONFIG_MEM_MT48LC16M8A2TG_75)
+       /*SDRAM INFORMATION: */
+       #define SDRAM_Tref      64      /* Refresh period in milliseconds   */
+       #define SDRAM_NRA       4096    /* Number of row addresses in SDRAM */
+       #define SDRAM_CL        CL_3
+#endif
+
+#if (CONFIG_MEM_MT48LC32M8A2_75)
+/*SDRAM INFORMATION: */
+#define SDRAM_Tref  64                 /* Refresh period in milliseconds   */
+#define SDRAM_NRA   8192               /* Number of row addresses in SDRAM */
+#define SDRAM_CL    CL_3
+#endif
+
+#if (CONFIG_MEM_MT48LC8M16A2TG_7E)
+       /*SDRAM INFORMATION: */
+       #define SDRAM_Tref      64      /* Refresh period in milliseconds   */
+       #define SDRAM_NRA       4096    /* Number of row addresses in SDRAM */
        #define SDRAM_CL        CL_2
 #endif
 
+#if (CONFIG_MEM_MT48LC8M32B2B5_7)
+       /*SDRAM INFORMATION: */
+       #define SDRAM_Tref      64      /* Refresh period in milliseconds   */
+       #define SDRAM_NRA       4096    /* Number of row addresses in SDRAM */
+       #define SDRAM_CL        CL_3
+#endif
+
 #if ( CONFIG_MEM_SIZE == 128 )
        #define SDRAM_SIZE      EBSZ_128
 #endif
diff --git a/include/asm-blackfin/page.h b/include/asm-blackfin/page.h
deleted file mode 100644 (file)
index 406ece5..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * U-boot -  page.h
- *
- * Copyright (c) 2005 blackfin.uclinux.org
- *
- * 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 _BLACKFIN_PAGE_H
-#define _BLACKFIN_PAGE_H
-
-#include <linux/config.h>
-
-/* PAGE_SHIFT determines the page size */
-
-#define PAGE_SHIFT                     (12)
-#define PAGE_SIZE                      (4096)
-#define PAGE_MASK                      (~(PAGE_SIZE-1))
-
-#ifdef __KERNEL__
-
-#include <asm/setup.h>
-
-#if PAGE_SHIFT < 13
-#define                                        KTHREAD_SIZE (8192)
-#else
-#define                                        KTHREAD_SIZE PAGE_SIZE
-#endif
-
-#ifndef __ASSEMBLY__
-
-#define get_user_page(vaddr)           __get_free_page(GFP_KERNEL)
-#define free_user_page(page, addr)     free_page(addr)
-
-#define clear_page(page)               memset((page), 0, PAGE_SIZE)
-#define copy_page(to,from)             memcpy((to), (from), PAGE_SIZE)
-
-#define clear_user_page(page, vaddr)   clear_page(page)
-#define copy_user_page(to, from, vaddr)        copy_page(to, from)
-
-/*
- * These are used to make use of C type-checking..
- */
-typedef struct {
-       unsigned long pte;
-} pte_t;
-typedef struct {
-       unsigned long pmd[16];
-} pmd_t;
-typedef struct {
-       unsigned long pgd;
-} pgd_t;
-typedef struct {
-       unsigned long pgprot;
-} pgprot_t;
-
-#define pte_val(x)                     ((x).pte)
-#define pmd_val(x)                     ((&x)->pmd[0])
-#define pgd_val(x)                     ((x).pgd)
-#define pgprot_val(x)                  ((x).pgprot)
-
-#define __pte(x)                       ((pte_t) { (x) } )
-#define __pmd(x)                       ((pmd_t) { (x) } )
-#define __pgd(x)                       ((pgd_t) { (x) } )
-#define __pgprot(x)                    ((pgprot_t) { (x) } )
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)               (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-/* Pure 2^n version of get_order */
-extern __inline__ int get_order(unsigned long size)
-{
-       int order;
-
-       size = (size - 1) >> (PAGE_SHIFT - 1);
-       order = -1;
-       do {
-               size >>= 1;
-               order++;
-       } while (size);
-       return order;
-}
-
-#endif /* !__ASSEMBLY__ */
-
-#include <asm/page_offset.h>
-
-#define PAGE_OFFSET                    (PAGE_OFFSET_RAW)
-
-#ifndef __ASSEMBLY__
-
-#define __pa(vaddr)                    virt_to_phys((void *)vaddr)
-#define __va(paddr)                    phys_to_virt((unsigned long)paddr)
-
-#define MAP_NR(addr)                   (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)
-#define virt_to_page(addr)             (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
-#define VALID_PAGE(page)               ((page - mem_map) < max_mapnr)
-
-#define BUG() do       { \
-        \
-       while (1);      /* dead-loop */ \
-} while (0)
-
-#define PAGE_BUG(page) do      { \
-       BUG(); \
-} while (0)
-
-#endif
-
-#endif
-
-#endif
index 262473fc3d0b27783198d7ddb4d6445212a194c2..cfd8f1fef3fb39b9d3a8c72b67f5f0f63f964019 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - page_offset.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /*
index f1f2b5ffc20f11b4f3e5f626a72b145b73fdb420..27889e8e8544dff03b291ccbf03e73026fc3abaa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - posix_types.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __ARCH_BLACKFIN_POSIX_TYPES_H
index 19bd72010661e47d2ade0ea72ce487a7c444e9ff..6cd4f567fcd50b914bedd6594f8ede2dbe775c81 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - processor.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * include/asm-m68k/processor.h
@@ -23,8 +23,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __ASM_BLACKFIN_PROCESSOR_H
@@ -126,8 +126,7 @@ static inline void release_thread(struct task_struct *dead_task)
 {
 }
 
-extern int kernel_thread(int (*fn) (void *), void *arg,
-                        unsigned long flags);
+extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags);
 
 #define copy_segments(tsk, mm)         do { } while (0)
 #define release_segments(mm)           do { } while (0)
index afd57773ac946b609ef6653fea72d8dbf52c3395..f1b7d0064bc607501066cf6e3717dd86d9b622c9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - ptrace.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_PTRACE_H
index 9e6d817fc7455039d6aaad29a565ef5e1990071a..f309543742267a55b68b616ca683ba5aa366c07c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - segment.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_SEGMENT_H
index 6ce96880ac33a3bb1ea4aba7b3a34e8ffd438539..b6b82679ec3ca23fa640752152ad12e6cd7ae97f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - setup.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * asm/setup.h -- Definition of the Linux/Blackfin setup information
@@ -22,8 +22,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_SETUP_H
@@ -75,12 +75,13 @@ extern unsigned long vme_brdtype;
 
 extern int blackfin_num_memory;        /* # of memory blocks found (and used) */
 extern int blackfin_realnum_memory;    /* real # of memory blocks found */
-extern struct mem_info blackfin_memory[NUM_MEMINFO];   /* memory description */
 
 struct mem_info {
        unsigned long addr;     /* physical address of memory chunk */
        unsigned long size;     /* length of memory chunk (in bytes) */
 };
+
+extern struct mem_info blackfin_memory[NUM_MEMINFO];   /* memory description */
 #endif
 
 #endif
index fbef18618ceb24ad5c73b03871a472abbf2d828d..d280ffeeaa9a55bfbd9873a6f92db8a9cf724af6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - setup.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _SHARED_RESOURCES_H_
index ffd81d61a8b10a19673409d7c1d52bb4bcf3977e..dd50207092916f3798aa5fe67764ac5aa66aab82 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - string.h String functions
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /* Changed by Lineo Inc. May 2001 */
 #ifdef __KERNEL__              /* only set these up for kernel code */
 
 #include <asm/setup.h>
-#include <asm/page.h>
-#include <asm/cpu/defBF533.h>
+#include <config.h>
+#include <asm/blackfin.h>
 
 #define __HAVE_ARCH_STRCPY
 #define __HAVE_ARCH_STRNCPY
 #define __HAVE_ARCH_STRCMP
 #define __HAVE_ARCH_STRNCMP
 #define __HAVE_ARCH_MEMCPY
+#define __HAVE_ARCH_MEMCMP
+#define __HAVE_ARCH_MEMSET
+#define __HAVE_ARCH_MEMMOVE
 
 extern char *strcpy(char *dest, const char *src);
 extern char *strncpy(char *dest, const char *src, size_t n);
 extern int strcmp(const char *cs, const char *ct);
 extern int strncmp(const char *cs, const char *ct, size_t count);
-extern void * memcpy(void * dest,const void *src,size_t count);
+extern void *memcpy(void *dest, const void *src, size_t count);
 extern void *memset(void *s, int c, size_t count);
 extern int memcmp(const void *, const void *, __kernel_size_t);
+extern void *memmove(void *dest, const void *src, size_t count);
 
 #else                          /* KERNEL */
 
index 0e53adfe0f197489102ae4471b98c40b72a75567..eda887fb62fb0d70cf37dab55cd2e0811cfd6e67 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - system.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_SYSTEM_H
index 29e6eba6fac434bf40ff5ee1eaf789771e8725ad..b90cedacbceb10d82a65c0d9f4fe6dcd87363540 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - traps.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * linux/include/asm/traps.h
@@ -23,8 +23,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /*
index 942ed275af7a8c1c3d6d6a726fa3ee7e96e17ccc..665a419f2bcd0d51917894586dc849db37317229 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - types.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _BLACKFIN_TYPES_H
index ec3933803907e2cb5f7ca064c0ad5223ac3808c9..b4928da4f5a2d8d5f9a85fb00813ce3003783993 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - u-boot.h Structure declarations for board specific data
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef _U_BOOT_H_
index 8578166a37e8af542d15980adf42b777197b2073..6e913bb85b0d9d971eb96a1c2ff934da9b700b90 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - uaccess.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * This file is based on
  * Based on: include/asm-m68knommu/uaccess.h
@@ -22,8 +22,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __BLACKFIN_UACCESS_H
 /* We let the MMU do all checking */
 static inline int access_ok(int type, const void *addr, unsigned long size)
 {
-       return ((unsigned long) addr < 0x10f00000);     /* need final decision - Tony */
+       return ((unsigned long)addr < 0x10f00000);      /* need final decision - Tony */
 }
 
-static inline int verify_area(int type, const void *addr,
-                             unsigned long size)
+static inline int verify_area(int type, const void *addr, unsigned long size)
 {
        return access_ok(type, addr, size) ? 0 : -EFAULT;
 }
@@ -173,12 +172,11 @@ static inline int bad_user_access_length(void)
  * Copy a null terminated string from userspace.
  */
 
-static inline long strncpy_from_user(char *dst, const char *src,
-                                    long count)
+static inline long strncpy_from_user(char *dst, const char *src, long count)
 {
        char *tmp;
        strncpy(dst, src, count);
-       for (tmp = dst; *tmp && count > 0; tmp++, count--);
+       for (tmp = dst; *tmp && count > 0; tmp++, count--) ;
        return (tmp - dst);     /* DAVIDM should we count a NUL ?  check getname */
 }
 
index 769f5a089c097d579b5221f24f44755b48fb15bb..9eda9f85542d65ca94979b5aec81ea222ce0beaa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - virtconvert.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __BLACKFIN_VIRT_CONVERT__
@@ -33,7 +33,6 @@
 
 #include <linux/config.h>
 #include <asm/setup.h>
-#include <asm/page.h>
 
 #define mm_vtop(vaddr)         ((unsigned long) vaddr)
 #define mm_ptov(vaddr)         ((unsigned long) vaddr)
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_ */
diff --git a/include/asm-microblaze/asm.h b/include/asm-microblaze/asm.h
new file mode 100755 (executable)
index 0000000..f10f89c
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* FSL macros */
+#define NGET(val, fslnum) \
+       __asm__ __volatile__ ("nget %0, rfsl" #fslnum :"=r" (val));
+
+#define GET(val, fslnum) \
+       __asm__ __volatile__ ("get %0, rfsl" #fslnum :"=r" (val));
+
+#define NCGET(val, fslnum) \
+       __asm__ __volatile__ ("ncget %0, rfsl" #fslnum :"=r" (val));
+
+#define CGET(val, fslnum) \
+       __asm__ __volatile__ ("cget %0, rfsl" #fslnum :"=r" (val));
+
+#define NPUT(val, fslnum) \
+       __asm__ __volatile__ ("nput %0, rfsl" #fslnum ::"r" (val));
+
+#define PUT(val, fslnum) \
+       __asm__ __volatile__ ("put %0, rfsl" #fslnum ::"r" (val));
+
+#define NCPUT(val, fslnum) \
+       __asm__ __volatile__ ("ncput %0, rfsl" #fslnum ::"r" (val));
+
+#define CPUT(val, fslnum) \
+       __asm__ __volatile__ ("cput %0, rfsl" #fslnum ::"r" (val));
+
+/* CPU dependent */
+/* machine status register */
+#define MFS(val, reg) \
+       __asm__ __volatile__ ("mfs %0," #reg :"=r" (val));
+
+#define MTS(val, reg) \
+       __asm__ __volatile__ ("mts " #reg ", %0"::"r" (val));
+
+/* get return address from interrupt */
+#define R14(val) \
+       __asm__ __volatile__ ("addi %0, r14, 0":"=r" (val));
+
+#define NOP    __asm__ __volatile__ ("nop");
+
+/* use machine status registe USE_MSR_REG */
+#ifdef XILINX_USE_MSR_INSTR
+#define MSRSET(val) \
+       __asm__ __volatile__ ("msrset r0," #val );
+
+#define MSRCLR(val) \
+       __asm__ __volatile__ ("msrclr r0," #val );
+
+#else
+#define MSRSET(val)                                            \
+{                                                              \
+       register unsigned tmp;                                  \
+       __asm__ __volatile__ ("                                 \
+                       mfs     %0, rmsr;                       \
+                       ori     %0, %0, "#val";                 \
+                       mts     rmsr, %0;                       \
+                       nop;"                                   \
+                       : "=r" (tmp)                            \
+                       : "d" (val)                             \
+                       : "memory");                            \
+}
+
+#define MSRCLR(val)                                            \
+{                                                              \
+       register unsigned tmp;                                  \
+       __asm__ __volatile__ ("                                 \
+                       mfs     %0, rmsr;                       \
+                       andi    %0, %0, ~"#val";                \
+                       mts     rmsr, %0;                       \
+                       nop;"                                   \
+                       : "=r" (tmp)                            \
+                       : "d" (val)                             \
+                       : "memory");                            \
+}
+#endif
index 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__ */
diff --git a/include/asm-microblaze/microblaze_intc.h b/include/asm-microblaze/microblaze_intc.h
new file mode 100644 (file)
index 0000000..4c385aa
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.cz>
+ *
+ * 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
+ */
+
+typedef volatile struct microblaze_intc_t {
+       int isr; /* interrupt status register */
+       int ipr; /* interrupt pending register */
+       int ier; /* interrupt enable register */
+       int iar; /* interrupt acknowledge register */
+       int sie; /* set interrupt enable bits */
+       int cie; /* clear interrupt enable bits */
+       int ivr; /* interrupt vector register */
+       int mer; /* master enable register */
+} microblaze_intc_t;
+
+struct irq_action {
+       interrupt_handler_t *handler; /* pointer to interrupt rutine */
+       void *arg;
+       int count; /* number of interrupt */
+};
+
+void install_interrupt_handler (int irq, interrupt_handler_t * hdlr,
+                                      void *arg);
diff --git a/include/asm-microblaze/microblaze_timer.h b/include/asm-microblaze/microblaze_timer.h
new file mode 100644 (file)
index 0000000..844c8db
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * (C) Copyright 2007 Michal Simek
+ *
+ * Michal  SIMEK <monstr@monstr.cz>
+ *
+ * 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 TIMER_ENABLE_ALL    0x400 /* ENALL */
+#define TIMER_PWM           0x200 /* PWMA0 */
+#define TIMER_INTERRUPT     0x100 /* T0INT */
+#define TIMER_ENABLE        0x080 /* ENT0 */
+#define TIMER_ENABLE_INTR   0x040 /* ENIT0 */
+#define TIMER_RESET         0x020 /* LOAD0 */
+#define TIMER_RELOAD        0x010 /* ARHT0 */
+#define TIMER_EXT_CAPTURE   0x008 /* CAPT0 */
+#define TIMER_EXT_COMPARE   0x004 /* GENT0 */
+#define TIMER_DOWN_COUNT    0x002 /* UDT0 */
+#define TIMER_CAPTURE_MODE  0x001 /* MDT0 */
+
+typedef volatile struct microblaze_timer_t {
+       int control; /* control/statuc register TCSR */
+       int loadreg; /* load register TLR */
+       int counter; /* timer/counter register */
+} microblaze_timer_t;
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..d1bb159aefa82b90cf019fba87dae5f2bf1349ce 100644 (file)
@@ -6,14 +6,9 @@
 #ifndef        __E300_H__
 #define __E300_H__
 
-/*
- * e300 Processor Version & Revision Numbers
- */
-#define PVR_83xx 0x80830000
-#define PVR_8349_REV10 (PVR_83xx | 0x0010)
-#define PVR_8349_REV11 (PVR_83xx | 0x0011)
-#define PVR_8360_REV10 (PVR_83xx | 0x0020)
-#define PVR_8360_REV11 (PVR_83xx | 0x0020)
+#define PVR_E300C1     0x80830000
+#define PVR_E300C2     0x80840000
+#define PVR_E300C3     0x80850000
 
 /*
  * Hardware Implementation-Dependent Register 0 (HID0)
index 8bc61b63a859943220e37f7df6a34bbe78eb2dcc..cd2463643ced57c1097c2d4fdfec681bc43975dc 100644 (file)
@@ -49,15 +49,20 @@ typedef     struct  global_data {
        unsigned long   scc_clk;
        unsigned long   brg_clk;
 #endif
+#if defined(CONFIG_MPC7448HPC2)
+       unsigned long   mem_clk;
+#endif
 #if defined(CONFIG_MPC83XX)
        /* There are other clocks in the MPC83XX */
        u32 csb_clk;
-#if defined (CONFIG_MPC8349)
+#if defined (CONFIG_MPC834X) || defined(CONFIG_MPC831X)
        u32 tsec1_clk;
        u32 tsec2_clk;
-       u32 usbmph_clk;
        u32 usbdr_clk;
-#endif /* CONFIG_MPC8349 */
+#endif
+#if defined (CONFIG_MPC834X)
+       u32 usbmph_clk;
+#endif /* CONFIG_MPC834X */
        u32 core_clk;
        u32 i2c1_clk;
        u32 i2c2_clk;
diff --git a/include/asm-ppc/gpio.h b/include/asm-ppc/gpio.h
new file mode 100644 (file)
index 0000000..114dc92
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * (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
+ */
+
+/* 4xx PPC's have 2 GPIO controllers */
+#if defined(CONFIG_405EZ) ||                                   \
+       defined(CONFIG_440EP) || defined(CONFIG_440GR) ||       \
+       defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+#define GPIO_GROUP_MAX 2
+#else
+#define GPIO_GROUP_MAX 1
+#endif
+
+#define GPIO_MAX       32
+#define GPIO_ALT1_SEL  0x40000000
+#define GPIO_ALT2_SEL  0x80000000
+#define GPIO_ALT3_SEL  0xc0000000
+#define GPIO_IN_SEL    0x40000000
+#define GPIO_MASK      0xc0000000
+
+#define GPIO_VAL(gpio) (0x80000000 >> (gpio))
+
+#ifndef __ASSEMBLY__
+typedef enum gpio_select { GPIO_SEL, GPIO_ALT1, GPIO_ALT2, GPIO_ALT3 } gpio_select_t;
+typedef enum gpio_driver { GPIO_DIS, GPIO_IN, GPIO_OUT, GPIO_BI } gpio_driver_t;
+typedef enum gpio_out   { GPIO_OUT_0, GPIO_OUT_1, GPIO_OUT_NO_CHG } gpio_out_t;
+
+typedef struct {
+       unsigned long add;      /* gpio core base address       */
+       gpio_driver_t in_out;   /* Driver Setting               */
+       gpio_select_t alt_nb;   /* Selected Alternate           */
+} gpio_param_s;
+#endif
+
+void gpio_config(int pin, int in_out, int gpio_alt, int out_val);
+void gpio_write_bit(int pin, int val);
+void gpio_set_chip_configuration(void);
index 43cde5e28ef7a563f5743c6e11e79092563dba54..0de93385f3f43dc8d7b1552c02422d7b9fe0276b 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,16 @@ 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)
-       u8 res0[0xF4];
+       u32 pmccr;              /* PMC Configuration Register */
+       u32 pmcer;              /* PMC Event Register */
+       u32 pmcmr;              /* PMC Mask Register */
+       u32 pmccr1;             /* PMC Configuration Register 1 */
+       u32 pmccr2;             /* PMC Configuration Register 2 */
+       u8 res0[0xEC];
 } 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 +223,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 +247,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 +342,59 @@ 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 */
-       u8 res3[0x8];
-       u32 lsdmr;              /**< SDRAM Mode Register */
+       u32 mrtpr;              /* Memory Refresh Timer Prescaler Register */
+       u32 mdr;                /* UPM Data Register */
+       u8 res3[0x4];
+       u32 lsor;               /* Special Operation Initiation 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
-
-       u8 res7[0x28];
-       u8 res8[0xF00];
+       u32 lbcr;               /* Configuration Register */
+       u32 lcrr;               /* Clock Ratio Register */
+       u8 res7[0x8];
+       u32 fmr;                /* Flash Mode Register */
+       u32 fir;                /* Flash Instruction Register */
+       u32 fcr;                /* Flash Command Register */
+       u32 fbar;               /* Flash Block Addr Register */
+       u32 fpar;               /* Flash Page Addr Register */
+       u32 fbcr;               /* Flash Byte Count Register */
+       u8 res8[0xF08];
 } lbus83xx_t;
 
-#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 +404,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 +426,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 +437,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 +448,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 +458,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 +489,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 +501,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,46 +530,13 @@ 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
  */
 typedef struct usb83xx {
-       u8 fixme[0x2000];
+       u8 fixme[0x1000];
 } usb83xx_t;
 
 /*
@@ -1491,7 +545,6 @@ typedef struct usb83xx {
 typedef struct tsec83xx {
        u8 fixme[0x1000];
 } tsec83xx_t;
-#endif
 
 /*
  * Security
@@ -1500,581 +553,154 @@ 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;
+#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[2];
+       tsec83xx_t              tsec[2];
+       u8                      res6[0xA000];
+       security83xx_t          security;
+       u8                      res7[0xC0000];
+} immap_t;
 
-/*
-*  RISC Special Registers (Trap and Breakpoint)
-*/
+#elif defined(CONFIG_MPC831X)
+typedef struct immap {
+       sysconf83xx_t           sysconf;        /* System configuration */
+       wdt83xx_t               wdt;            /* Watch Dog Timer (WDT) Registers */
+       rtclk83xx_t             rtc;            /* Real Time Clock Module Registers */
+       rtclk83xx_t             pit;            /* Periodic Interval Timer */
+       gtm83xx_t               gtm[2];         /* Global Timers Module */
+       ipic83xx_t              ipic;           /* Integrated Programmable Interrupt Controller */
+       arbiter83xx_t           arbiter;        /* System Arbiter Registers */
+       reset83xx_t             reset;          /* Reset Module */
+       clk83xx_t               clk;            /* System Clock Module */
+       pmc83xx_t               pmc;            /* Power Management Control Module */
+       gpio83xx_t              gpio[1];        /* General purpose I/O module */
+       u8                      res0[0x1300];
+       ddr83xx_t               ddr;            /* DDR Memory Controller Memory */
+       fsl_i2c_t               i2c[2];         /* I2C Controllers */
+       u8                      res1[0x1300];
+       duart83xx_t             duart[2];       /* DUART */
+       u8                      res2[0x900];
+       lbus83xx_t              lbus;           /* Local Bus Controller Registers */
+       u8                      res3[0x1000];
+       spi83xx_t               spi;            /* Serial Peripheral Interface */
+       dma83xx_t               dma;            /* DMA */
+       pciconf83xx_t           pci_conf[1];    /* PCI Software Configuration Registers */
+       u8                      res4[0x80];
+       ios83xx_t               ios;            /* Sequencer */
+       pcictrl83xx_t           pci_ctrl[1];    /* PCI Controller Control and Status Registers */
+       u8                      res5[0x1aa00];
+       usb83xx_t               usb[1];
+       tsec83xx_t              tsec[2];
+       u8                      res6[0xA000];
+       security83xx_t          security;
+       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 a5552c48ee904d4b368433625020e067edb4827b..0e3fc3403d5d8c20da392d19bc454afdbe00b669 100644 (file)
@@ -721,6 +721,8 @@ typedef struct ccsr_pic {
        uint    frr;            /* 0x41000 - Feature Reporting Register */
        char    res10[28];
        uint    gcr;            /* 0x41020 - Global Configuration Register */
+#define MPC86xx_PICGCR_RST     0x80000000
+#define MPC86xx_PICGCR_MODE    0x20000000
        char    res11[92];
        uint    vir;            /* 0x41080 - Vendor Identification Register */
        char    res12[12];
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..48fd9829506992bcd95da0fe8eaabbdd3d701933 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
  */
@@ -431,8 +396,8 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
 #define BOOKE_PAGESZ_16M        7
 #define BOOKE_PAGESZ_64M        8
 #define BOOKE_PAGESZ_256M       9
-#define BOOKE_PAGESZ_1GB        10
-#define BOOKE_PAGESZ_4GB        11
+#define BOOKE_PAGESZ_1G                10
+#define BOOKE_PAGESZ_4G                11
 
 #if defined(CONFIG_MPC86xx)
 #define LAWBAR_BASE_ADDR       0x00FFFFFF
@@ -448,6 +413,7 @@ extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower);
 #define LAWAR_TRGT_IF_PCI1     0x00000000
 #define LAWAR_TRGT_IF_PCIX     0x00000000
 #define LAWAR_TRGT_IF_PCI2     0x00100000
+#define LAWAR_TRGT_IF_PEX      0x00200000
 #define LAWAR_TRGT_IF_LBC      0x00400000
 #define LAWAR_TRGT_IF_CCSR     0x00800000
 #define LAWAR_TRGT_IF_DDR_INTERLEAVED 0x00B00000
@@ -482,7 +448,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 +637,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 f102600038bf836938eafeb47c561b3d016076ee..5efc3ee2ca7d287b6add45f2adbbbe0abba62043 100644 (file)
 #define   HID0_BHTE    (1<<2)          /* Branch History Table Enable */
 #define   HID0_BTCD    (1<<1)          /* Branch target cache disable */
 #define SPRN_HID1      0x3F1   /* Hardware Implementation Register 1 */
+#define          HID1_RFXE     (1<<17)         /* Read Fault Exception Enable */
+#define          HID1_ASTME    (1<<13)         /* Address bus streaming mode */
+#define          HID1_ABE      (1<<12)         /* Address broadcast enable */
 #define SPRN_IABR      0x3F2   /* Instruction Address Breakpoint Register */
 #ifndef CONFIG_BOOKE
 #define SPRN_IAC1      0x3F4   /* Instruction Address Compare 1 */
 #define SPRN_SPRG1     0x111   /* Special Purpose Register General 1 */
 #define SPRN_SPRG2     0x112   /* Special Purpose Register General 2 */
 #define SPRN_SPRG3     0x113   /* Special Purpose Register General 3 */
+#define SPRN_SPRG4     0x114   /* Special Purpose Register General 4 */
+#define SPRN_SPRG5     0x115   /* Special Purpose Register General 5 */
+#define SPRN_SPRG6     0x116   /* Special Purpose Register General 6 */
+#define SPRN_SPRG7     0x117   /* Special Purpose Register General 7 */
 #define SPRN_SRR0      0x01A   /* Save/Restore Register 0 */
 #define SPRN_SRR1      0x01B   /* Save/Restore Register 1 */
 #define SPRN_SRR2      0x3DE   /* Save/Restore Register 2 */
 #define SPRN_IVOR15    0x19f   /* Interrupt Vector Offset Register 15 */
 
 /* e500 definitions */
-#define SPRN_L1CSR0     0x3f2   /* L1 Cache Control and Status Register 0 */
+#define SPRN_L1CSR0     0x3f2   /* L1 Data Cache Control and Status Register 0 */
+#define   L1CSR0_CPE            0x00010000     /* Data Cache Parity Enable */
 #define   L1CSR0_DCFI           0x00000002      /* Data Cache Flash Invalidate */
 #define   L1CSR0_DCE            0x00000001      /* Data Cache Enable */
-#define SPRN_L1CSR1     0x3f3   /* L1 Cache Control and Status Register 1 */
+#define SPRN_L1CSR1     0x3f3   /* L1 Instruction Cache Control and Status Register 1 */
+#define   L1CSR1_CPE            0x00010000     /* Instruction Cache Parity Enable */
 #define   L1CSR1_ICFI           0x00000002      /* Instruction Cache Flash Invalidate */
 #define   L1CSR1_ICE            0x00000001      /* Instruction Cache Enable */
 
 #define SPRG1   SPRN_SPRG1
 #define SPRG2   SPRN_SPRG2
 #define SPRG3   SPRN_SPRG3
+#define SPRG4   SPRN_SPRG4
+#define SPRG5   SPRN_SPRG5
+#define SPRG6   SPRN_SPRG6
+#define SPRG7   SPRN_SPRG7
 #define SRR0   SPRN_SRR0       /* Save and Restore Register 0 */
 #define SRR1   SPRN_SRR1       /* Save and Restore Register 1 */
 #define SVR    SPRN_SVR        /* System Version Register */
 #define SVR_MJREV(svr) (((svr) >>  4) & 0x0F)   /* Major SOC design revision indicator */
 #define SVR_MNREV(svr) (((svr) >>  0) & 0x0F)   /* Minor SOC design revision indicator */
 
-/* System-On-Chip Version Numbers (version field only) */
-#define SVR_MPC5200    0x8011
 
 /* Processor Version Register */
 
 #define PVR_405CR_RC   0x40110145  /* same as pc405gp rev e */
 #define PVR_405EP_RA   0x51210950
 #define PVR_405GPR_RB  0x50910951
+#define PVR_405EZ_RA   0x41511460
 #define PVR_440GP_RB   0x40120440
 #define PVR_440GP_RC   0x40120481
 #define PVR_440EP_RA   0x42221850
 #define PVR_440GR_RB   0x422218D4 /* 440EP rev C and 440GR rev B have same PVR */
 #define PVR_440EPX1_RA  0x216218D0 /* 440EPX rev A with Security / Kasumi */
 #define PVR_440EPX2_RA  0x216218D4 /* 440EPX rev A without Security / Kasumi */
-#define PVR_440GRX1_RA  0x216218D8 /* 440GRX rev A with Security / Kasumi */
-#define PVR_440GRX2_RA  0x216218DC /* 440GRX rev A without Security / Kasumi */
+#define PVR_440GRX1_RA  0x216218D0 /* 440GRX rev A with Security / Kasumi */
+#define PVR_440GRX2_RA  0x216218D4 /* 440GRX rev A without Security / Kasumi */
 #define PVR_440GX_RA   0x51B21850
 #define PVR_440GX_RB   0x51B21851
 #define PVR_440GX_RC   0x51B21892
 #define PVR_8260_HIP7R1 0x80822013
 #define PVR_8260_HIP7RA        0x80822014
 
+/*
+ * MPC 52xx
+ */
+#define PVR_5200       0x80822011
+#define PVR_5200B      0x80822014
+
 
 /*
  * System Version Register
 #define SVR_8560       0x8070
 #define SVR_8555       0x8079
 #define SVR_8541       0x807A
+#define SVR_8544       0x8034
+#define SVR_8544_E     0x803C
 #define SVR_8548       0x8031
 #define SVR_8548_E     0x8039
 #define SVR_8641       0x8090
+#define SVR_8568_E     0x807D
 
 
 /* I am just adding a single entry for 8260 boards.  I think we may be
index 30b44e3d22822570758d53205ddaeb513331b00b..464f6b5756e2f04a03dbcf15404eb4fc470e83c6 100644 (file)
@@ -83,6 +83,7 @@ typedef struct bd_info {
     defined(CONFIG_405GP) || \
     defined(CONFIG_405CR) || \
     defined(CONFIG_405EP) || \
+    defined(CONFIG_405EZ) || \
     defined(CONFIG_440)
        unsigned char   bi_s_version[4];        /* Version of this structure */
        unsigned char   bi_r_version[32];       /* Version of the ROM (AMCC) */
@@ -107,7 +108,8 @@ typedef struct bd_info {
        unsigned char   bi_enet3addr[6];
 #endif
 
-#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || defined (CONFIG_440GX) || \
+#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
+    defined(CONFIG_405EZ) || defined(CONFIG_440GX) || \
     defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
     defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
        unsigned int    bi_opbfreq;             /* OPB clock in Hz */
index cf36583108c7bd1513eb1f1863fc1eb4053a66b9..b3ccdcea2b0d3e42157e7bca1d84517c02b4a545 100644 (file)
@@ -94,6 +94,7 @@
 #define CFG_CMD_EXT2   0x1000000000000000ULL   /* EXT2 Support                 */
 #define CFG_CMD_SNTP   0x2000000000000000ULL   /* SNTP support                 */
 #define CFG_CMD_DISPLAY        0x4000000000000000ULL   /* Display support              */
+#define CFG_CMD_MFSL   0x8000000000000000ULL   /* FSL support for Microblaze   */
 
 #define CFG_CMD_ALL    0xFFFFFFFFFFFFFFFFULL   /* ALL commands                 */
 
                        CFG_CMD_IRQ     | \
                        CFG_CMD_JFFS2   | \
                        CFG_CMD_KGDB    | \
+                       CFG_CMD_MFSL    | \
                        CFG_CMD_MII     | \
                        CFG_CMD_MMC     | \
                        CFG_CMD_NAND    | \
index 982d6a8637f502be02804b73eee62ef34189bd13..3c4b37b0dcbb11ab5c1321e05c5d6e6e9bfcb006 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);
@@ -401,6 +402,10 @@ void               ppcDcbi(unsigned long value);
 void           ppcSync(void);
 void           ppcDcbz(unsigned long value);
 #endif
+#if defined (CONFIG_MICROBLAZE)
+unsigned short in16(unsigned int);
+void           out16(unsigned int, unsigned short value);
+#endif
 
 #if defined (CONFIG_MPC83XX)
 void           ppcDWload(unsigned int *addr, unsigned int *ret);
@@ -439,8 +444,6 @@ int sdram_adjust_866 (void);
 int    adjust_sdram_tbs_8xx (void);
 #if defined(CONFIG_8260)
 int    prt_8260_clks (void);
-#elif defined(CONFIG_MPC83XX)
-int print_clock_conf(void);
 #elif defined(CONFIG_MPC5xxx)
 int    prt_mpc5xxx_clks (void);
 #endif
index 09f8d206efa2d3bef58b7c3f4e460d8a2e19f14f..73be06950bc1c35612b99650592719125fb1624e 100644 (file)
 
 #define OF_CPU                 "PowerPC,5200@0"
 #define OF_SOC                 "soc5200@f0000000"
-#define OF_TBCLK               (bd->bi_busfreq / 8)
+#define OF_TBCLK               (bd->bi_busfreq / 4)
 #define OF_STDOUT_PATH         "/soc5200@f0000000/serial@2000"
 
 /*
diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h
new file mode 100644 (file)
index 0000000..6976313
--- /dev/null
@@ -0,0 +1,561 @@
+/*
+ * Copyright (C) Freescale Semiconductor, Inc. 2006.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+/*
+ * mpc8313epb board configuration file
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_E300            1
+#define CONFIG_MPC83XX         1
+#define CONFIG_MPC831X         1
+#define CONFIG_MPC8313         1
+#define CONFIG_MPC8313ERDB     1
+
+#define CONFIG_PCI
+#define CONFIG_83XX_GENERIC_PCI
+
+#ifdef CFG_66MHZ
+#define CONFIG_83XX_CLKIN      66666667        /* in Hz */
+#elif defined(CFG_33MHZ)
+#define CONFIG_83XX_CLKIN      33333333        /* in Hz */
+#else
+#error Unknown oscillator frequency.
+#endif
+
+#define CONFIG_SYS_CLK_FREQ    CONFIG_83XX_CLKIN
+
+#define CONFIG_BOARD_EARLY_INIT_F              /* call board_pre_init */
+
+#define CFG_IMMR               0xE0000000
+
+#define CFG_MEMTEST_START      0x00001000
+#define CFG_MEMTEST_END                0x07f00000
+
+/* Early revs of this board will lock up hard when attempting
+ * to access the PMC registers, unless a JTAG debugger is
+ * connected, or some resistor modifications are made.
+ */
+#define CFG_8313ERDB_BROKEN_PMC 1
+
+#define CFG_ACR_PIPE_DEP       3       /* Arbiter pipeline depth (0-3) */
+#define CFG_ACR_RPTCNT         3       /* Arbiter repeat count (0-7) */
+
+/*
+ * DDR Setup
+ */
+#define CFG_DDR_BASE           0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE         CFG_DDR_BASE
+#define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
+
+/*
+ * Manually set up DDR parameters, as this board does not
+ * seem to have the SPD connected to I2C.
+ */
+#define CFG_DDR_SIZE           128             /* MB */
+#define CFG_DDR_CONFIG         ( CSCONFIG_EN | CSCONFIG_AP \
+                               | 0x00040000 /* TODO */ \
+                               | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10 )
+                               /* 0x80840102 */
+
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_TIMING_0       ( ( 0 << TIMING_CFG0_RWT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_WRT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_RRT_SHIFT ) \
+                               | ( 0 << TIMING_CFG0_WWT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_ACT_PD_EXIT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_PRE_PD_EXIT_SHIFT ) \
+                               | ( 8 << TIMING_CFG0_ODT_PD_EXIT_SHIFT ) \
+                               | ( 2 << TIMING_CFG0_MRS_CYC_SHIFT ) )
+                               /* 0x00220802 */
+#define CFG_DDR_TIMING_1       ( ( 3 << TIMING_CFG1_PRETOACT_SHIFT ) \
+                               | ( 9 << TIMING_CFG1_ACTTOPRE_SHIFT ) \
+                               | ( 3 << TIMING_CFG1_ACTTORW_SHIFT ) \
+                               | ( 5 << TIMING_CFG1_CASLAT_SHIFT ) \
+                               | (13 << TIMING_CFG1_REFREC_SHIFT ) \
+                               | ( 3 << TIMING_CFG1_WRREC_SHIFT ) \
+                               | ( 2 << TIMING_CFG1_ACTTOACT_SHIFT ) \
+                               | ( 2 << TIMING_CFG1_WRTORD_SHIFT ) )
+                               /* 0x3935d322 */
+#define CFG_DDR_TIMING_2       ( ( 0 << TIMING_CFG2_ADD_LAT_SHIFT ) \
+                               | (31 << TIMING_CFG2_CPO_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_WR_LAT_DELAY_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_RD_TO_PRE_SHIFT ) \
+                               | ( 2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT ) \
+                               | ( 3 << TIMING_CFG2_CKE_PLS_SHIFT ) \
+                               | (10 << TIMING_CFG2_FOUR_ACT_SHIFT) )
+                               /* 0x0f9048ca */ /* P9-45,may need tuning */
+#define CFG_DDR_INTERVAL       ( ( 800 << SDRAM_INTERVAL_REFINT_SHIFT ) \
+                               | ( 100 << SDRAM_INTERVAL_BSTOPRE_SHIFT ) )
+                               /* 0x03200064 */
+#if defined(CONFIG_DDR_2T_TIMING)
+#define CFG_SDRAM_CFG          ( SDRAM_CFG_SREN \
+                               | 3 << SDRAM_CFG_SDRAM_TYPE_SHIFT \
+                               | SDRAM_CFG_2T_EN \
+                               | SDRAM_CFG_DBW_32 )
+#else
+#define CFG_SDRAM_CFG          ( SDRAM_CFG_SREN \
+                               | 3 << SDRAM_CFG_SDRAM_TYPE_SHIFT \
+                               | SDRAM_CFG_32_BE )
+                               /* 0x43080000 */
+#endif
+#define CFG_SDRAM_CFG2         0x00401000;
+/* set burst length to 8 for 32-bit data path */
+#define CFG_DDR_MODE           ( ( 0x4440 << SDRAM_MODE_ESD_SHIFT ) \
+                               | ( 0x0232 << SDRAM_MODE_SD_SHIFT ) )
+                               /* 0x44400232 */
+#define CFG_DDR_MODE_2         0x8000C000;
+
+#define CFG_DDR_CLK_CNTL       DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05
+                               /*0x02000000*/
+#define CFG_DDRCDR_VALUE       ( DDRCDR_EN \
+                               | DDRCDR_PZ_NOMZ \
+                               | DDRCDR_NZ_NOMZ \
+                               | DDRCDR_M_ODR )
+
+/*
+ * FLASH on the Local Bus
+ */
+#define CFG_FLASH_CFI                          /* use the Common Flash Interface */
+#define CFG_FLASH_CFI_DRIVER                   /* use the CFI driver */
+#define CFG_FLASH_BASE         0xFE000000      /* start of FLASH   */
+#define CFG_FLASH_SIZE         8               /* flash size in MB */
+#define CFG_FLASH_EMPTY_INFO                   /* display empty sectors */
+#define CFG_FLASH_USE_BUFFER_WRITE             /* buffer up multiple bytes */
+
+#define CFG_BR0_PRELIM         (CFG_FLASH_BASE |       /* flash Base address */ \
+                               (2 << BR_PS_SHIFT) |    /* 16 bit port size */ \
+                               BR_V)                   /* valid */
+#define CFG_OR0_PRELIM         ( 0xFF000000            /* 16 MByte */ \
+                               | OR_GPCM_XACS \
+                               | OR_GPCM_SCY_9 \
+                               | OR_GPCM_EHTR \
+                               | OR_GPCM_EAD )
+                               /* 0xFF006FF7   TODO SLOW 16 MB flash size */
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* window base at flash base */
+#define CFG_LBLAWAR0_PRELIM    0x80000017      /* 16 MB window size */
+
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks */
+#define CFG_MAX_FLASH_SECT     135             /* sectors per device */
+
+#define CFG_FLASH_ERASE_TOUT   60000   /* Flash Erase Timeout (ms) */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (ms) */
+
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#endif
+
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR      0xFD000000      /* Initial RAM address */
+#define CFG_INIT_RAM_END       0x1000          /* End of used area in RAM*/
+
+#define CFG_GBL_DATA_SIZE      0x100           /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (512 * 1024)    /* Reserved for malloc */
+
+/*
+ * Local Bus LCRR and LBCR regs
+ */
+#define CFG_LCRR       LCRR_EADC_1 | LCRR_CLKDIV_2     /* 0x00010002 */
+#define CFG_LBC_LBCR   ( 0x00040000 /* TODO */ \
+                       | (0xFF << LBCR_BMT_SHIFT) \
+                       | 0xF ) /* 0x0004ff0f */
+
+#define CFG_LBC_MRTPR  0x20000000  /*TODO */   /* LB refresh timer prescal, 266MHz/32 */
+
+/* drivers/nand/nand.c */
+#define CFG_NAND_BASE          0xE2800000      /* 0xF0000000 */
+#define CFG_MAX_NAND_DEVICE    1
+#define NAND_MAX_CHIPS         1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+
+#define CFG_BR1_PRELIM         ( CFG_NAND_BASE \
+                               | (2<<BR_DECC_SHIFT)    /* Use HW ECC */ \
+                               | BR_PS_8               /* Port Size = 8 bit */ \
+                               | BR_MS_FCM             /* MSEL = FCM */ \
+                               | BR_V )                /* valid */
+#define CFG_OR1_PRELIM         ( 0xFFFF8000            /* length 32K */ \
+                               | OR_FCM_CSCT \
+                               | OR_FCM_CST \
+                               | OR_FCM_CHT \
+                               | OR_FCM_SCY_1 \
+                               | OR_FCM_TRLX \
+                               | OR_FCM_EHTR )
+                               /* 0xFFFF8396 */
+#define CFG_LBLAWBAR1_PRELIM   CFG_NAND_BASE
+#define CFG_LBLAWAR1_PRELIM    0x8000000E      /* 32KB  */
+
+#define CFG_VSC7385_BASE       0xF0000000
+
+#define CONFIG_VSC7385_ENET                    /* VSC7385 ethernet support */
+#define CFG_BR2_PRELIM         0xf0000801      /* VSC7385 Base address */
+#define CFG_OR2_PRELIM         0xfffe09ff      /* VSC7385, 128K bytes*/
+#define CFG_LBLAWBAR2_PRELIM   CFG_VSC7385_BASE/* Access window base at VSC7385 base */
+#define CFG_LBLAWAR2_PRELIM    0x80000010      /* Access window size 128K */
+
+/* local bus read write buffer mapping */
+#define CFG_BR3_PRELIM         0xFA000801      /* map at 0xFA000000 */
+#define CFG_OR3_PRELIM         0xFFFF8FF7      /* 32kB */
+#define CFG_LBLAWBAR3_PRELIM   0xFA000000
+#define CFG_LBLAWAR3_PRELIM    0x8000000E      /* 32KB  */
+
+/* pass open firmware flat tree */
+#define CONFIG_OF_FLAT_TREE    1
+#define CONFIG_OF_BOARD_SETUP  1
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+
+#define OF_CPU                 "PowerPC,8313@0"
+#define OF_SOC                 "soc8313@e0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc8313@e0000000/serial@4500"
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX      1
+#define CFG_NS16550
+#define CFG_NS16550_SERIAL
+#define CFG_NS16550_REG_SIZE   1
+#define CFG_NS16550_CLK                get_bus_freq(0)
+
+#define CFG_BAUDRATE_TABLE     \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 115200}
+
+#define CFG_NS16550_COM1       (CFG_IMMR+0x4500)
+#define CFG_NS16550_COM2       (CFG_IMMR+0x4600)
+
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+
+/* I2C */
+#define CONFIG_HARD_I2C                        /* I2C with hardware support*/
+#define CONFIG_FSL_I2C
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_CMD_TREE
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address */
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_NOPROBES       {0x69}  /* Don't probe these addrs */
+#define CFG_I2C_OFFSET         0x3000
+#define CFG_I2C2_OFFSET                0x3100
+
+/* TSEC */
+#define CFG_TSEC1_OFFSET       0x24000
+#define CFG_TSEC1              (CFG_IMMR+CFG_TSEC1_OFFSET)
+#define CFG_TSEC2_OFFSET       0x25000
+#define CFG_TSEC2              (CFG_IMMR+CFG_TSEC2_OFFSET)
+#define CONFIG_NET_MULTI
+
+/*
+ * General PCI
+ * Addresses are mapped 1-1.
+ */
+#define CFG_PCI1_MEM_BASE      0x80000000
+#define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
+#define CFG_PCI1_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI1_MMIO_BASE     0x90000000
+#define CFG_PCI1_MMIO_PHYS     CFG_PCI1_MMIO_BASE
+#define CFG_PCI1_MMIO_SIZE     0x10000000      /* 256M */
+#define CFG_PCI1_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xE2000000
+#define CFG_PCI1_IO_SIZE       0x00100000      /* 1M */
+
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+#define CFG_PCI_SUBSYS_VENDORID 0x1057 /* Motorola */
+
+/*
+ * TSEC configuration
+ */
+#define CONFIG_TSEC_ENET               /* TSEC ethernet support */
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI               1
+#endif
+
+#define CONFIG_GMII                    1       /* MII PHY management */
+#define CONFIG_MPC83XX_TSEC1           1
+
+#define CONFIG_MPC83XX_TSEC1_NAME      "TSEC0"
+#define CONFIG_MPC83XX_TSEC2           1
+#define CONFIG_MPC83XX_TSEC2_NAME      "TSEC1"
+#define TSEC1_PHY_ADDR                 0x1c
+#define TSEC2_PHY_ADDR                 4
+#define TSEC1_PHYIDX                   0
+#define TSEC2_PHYIDX                   0
+
+/* Options are: TSEC[0-1] */
+#define CONFIG_ETHPRIME                        "TSEC1"
+
+/*
+ * Configure on-board RTC
+ */
+#define CONFIG_RTC_DS1337
+#define CFG_I2C_RTC_ADDR               0x68
+
+/*
+ * Environment
+ */
+#ifndef CFG_RAMBOOT
+       #define CFG_ENV_IS_IN_FLASH     1
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE + 0x40000)
+       #define CFG_ENV_SECT_SIZE       0x10000 /* 64K(one sector) for env */
+       #define CFG_ENV_SIZE            0x2000
+
+/* Address and size of Redundant Environment Sector */
+#else
+       #define CFG_ENV_IS_NOWHERE      1       /* Store ENV in memory only */
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - 0x1000)
+       #define CFG_ENV_SIZE            0x2000
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#define CFG_BASE_COMMANDS      ( CONFIG_CMD_DFL        \
+                               | CFG_CMD_PING          \
+                               | CFG_CMD_DHCP          \
+                               | CFG_CMD_I2C           \
+                               | CFG_CMD_MII           \
+                               | CFG_CMD_DATE          \
+                               | CFG_CMD_PCI)
+
+#define CONFIG_CMDLINE_EDITING 1
+
+#define CFG_RAMBOOT_COMMANDS   (CFG_BASE_COMMANDS & \
+                                ~(CFG_CMD_ENV | CFG_CMD_LOADS))
+
+#if defined(CFG_RAMBOOT)
+#define CONFIG_COMMANDS CFG_RAMBOOT_COMMANDS
+#else
+#define CONFIG_COMMANDS CFG_BASE_COMMANDS
+#endif
+
+#include <cmd_confdefs.h>
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory */
+#define CFG_LOAD_ADDR  0x2000000       /* default load address */
+#define CFG_PROMPT     "=> "           /* Monitor Command Prompt */
+#define CFG_CBSIZE     1024            /* Console I/O Buffer Size */
+
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)  /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size */
+#define CFG_HZ         1000            /* decrementer freq: 1ms ticks */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CFG_BOOTMAPSZ  (8 << 20)       /* Initial Memory map for Linux*/
+
+/* Cache Configuration */
+#define CFG_DCACHE_SIZE                16384
+#define CFG_CACHELINE_SIZE     32
+#define CFG_CACHELINE_SHIFT    5       /*log base 2 of the above value*/
+
+#define CFG_RCWH_PCIHOST 0x80000000    /* PCIHOST  */
+
+#ifdef CFG_66MHZ
+
+/* 66MHz IN, 133MHz CSB, 266 DDR, 266 CORE */
+/* 0x62040000 */
+#define CFG_HRCW_LOW (\
+       0x20000000 /* reserved, must be set */ |\
+       HRCWL_DDRCM |\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_CSB_TO_CLKIN_2X1 |\
+       HRCWL_CORE_TO_CSB_2X1)
+
+#elif defined(CFG_33MHZ)
+
+/* 33MHz IN, 165MHz CSB, 330 DDR, 330 CORE */
+/* 0x65040000 */
+#define CFG_HRCW_LOW (\
+       0x20000000 /* reserved, must be set */ |\
+       HRCWL_DDRCM |\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_CSB_TO_CLKIN_5X1 |\
+       HRCWL_CORE_TO_CSB_2X1)
+
+#endif
+
+/* 0xa0606c00 */
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_HOST |\
+       HRCWH_PCI1_ARBITER_ENABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0X00000100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_RL_EXT_LEGACY |\
+       HRCWH_TSEC1M_IN_RGMII |\
+       HRCWH_TSEC2M_IN_RGMII |\
+       HRCWH_BIG_ENDIAN |\
+       HRCWH_LALE_NORMAL)
+
+/* System IO Config */
+#define CFG_SICRH      (SICRH_TSOBI1 | SICRH_TSOBI2)   /* RGMII */
+#define CFG_SICRL      SICRL_USBDR                     /* Enable Internal USB Phy  */
+
+#define CFG_HID0_INIT  0x000000000
+#define CFG_HID0_FINAL (HID0_ENABLE_MACHINE_CHECK | \
+                        HID0_ENABLE_DYNAMIC_POWER_MANAGMENT)
+
+#define CFG_HID2 HID2_HBE
+
+/* DDR @ 0x00000000 */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* PCI @ 0x80000000 */
+#define CFG_IBAT1L     (CFG_PCI1_MEM_BASE | BATL_PP_10)
+#define CFG_IBAT1U     (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT2L     (CFG_PCI1_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT2U     (CFG_PCI1_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* PCI2 not supported on 8313 */
+#define CFG_IBAT3L     (0)
+#define CFG_IBAT3U     (0)
+#define CFG_IBAT4L     (0)
+#define CFG_IBAT4U     (0)
+
+/* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 & BCSR @ 0xE2400000 */
+#define CFG_IBAT5L     (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT5U     (CFG_IMMR | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* SDRAM @ 0xF0000000, stack in DCACHE 0xFDF00000 & FLASH @ 0xFE000000 */
+#define CFG_IBAT6L     (0xF0000000 | BATL_PP_10)
+#define CFG_IBAT6U     (0xF0000000 | BATU_BL_256M | BATU_VS | BATU_VP)
+
+#define CFG_IBAT7L     (0)
+#define CFG_IBAT7U     (0)
+
+#define CFG_DBAT0L     CFG_IBAT0L
+#define CFG_DBAT0U     CFG_IBAT0U
+#define CFG_DBAT1L     CFG_IBAT1L
+#define CFG_DBAT1U     CFG_IBAT1U
+#define CFG_DBAT2L     CFG_IBAT2L
+#define CFG_DBAT2U     CFG_IBAT2U
+#define CFG_DBAT3L     CFG_IBAT3L
+#define CFG_DBAT3U     CFG_IBAT3U
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01    /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02    /* Software reboot */
+
+/*
+ * Environment Configuration
+ */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_ETHADDR         00:E0:0C:00:95:01
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR                00:E0:0C:00:95:02
+
+#define CONFIG_IPADDR          10.0.0.2
+#define CONFIG_SERVERIP                10.0.0.1
+#define CONFIG_GATEWAYIP       10.0.0.1
+#define CONFIG_NETMASK         255.0.0.0
+#define CONFIG_NETDEV          eth1
+
+#define CONFIG_HOSTNAME                mpc8313erdb
+#define CONFIG_ROOTPATH                /nfs/root/path
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_UBOOTPATH       u-boot.bin      /* U-Boot image on TFTP server */
+#define CONFIG_FDTFILE         mpc8313erdb.dtb
+
+#define CONFIG_LOADADDR                200000  /* default location for tftp and bootm */
+#define CONFIG_BOOTDELAY       -1      /* -1 disables auto-boot */
+#define CONFIG_BAUDRATE                115200
+
+#define XMK_STR(x)     #x
+#define MK_STR(x)      XMK_STR(x)
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "netdev=" MK_STR(CONFIG_NETDEV) "\0"                            \
+       "ethprime=TSEC1\0"                                              \
+       "uboot=" MK_STR(CONFIG_UBOOTPATH) "\0"                          \
+       "tftpflash=tftpboot $loadaddr $uboot; "                         \
+               "protect off " MK_STR(TEXT_BASE) " +$filesize; "        \
+               "erase " MK_STR(TEXT_BASE) " +$filesize; "              \
+               "cp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize; "      \
+               "protect on " MK_STR(TEXT_BASE) " +$filesize; "         \
+               "cmp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize\0"     \
+       "fdtaddr=400000\0"                                              \
+       "fdtfile=" MK_STR(CONFIG_FDTFILE) "\0"                          \
+       "console=ttyS0\0"                                               \
+       "setbootargs=setenv bootargs "                                  \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0" \
+       "setipargs=setenv bootargs nfsroot=$serverip:$rootpath " \
+               "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0"
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+       "setenv rootdev /dev/nfs;"                                      \
+       "run setbootargs;"                                                      \
+       "run setipargs;"                                                        \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND                                          \
+       "setenv rootdev /dev/ram;"                                      \
+       "run setbootargs;"                                              \
+       "tftp $ramdiskaddr $ramdiskfile;"                               \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+#undef MK_STR
+#undef XMK_STR
+
+#endif /* __CONFIG_H */
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..906339e9d8827b281d58620b4fcce25c3998dac3 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
+
+#endif
 
 /*
  * 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_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
 
-/*
- * 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_SDRAM_CLK_CNTL (DDR_SDRAM_CLK_CNTL_SS_EN | \
+                               DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05)
 
-#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_83XX_DDR_USES_CS0
+#ifdef CONFIG_HARD_I2C
+#define CONFIG_SPD_EEPROM              /* use SPD EEPROM for DDR setup*/
+#endif
 
-#ifndef CONFIG_SPD_EEPROM
-/*
- * Manually set up DDR parameters
- */
+#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
+
+/* LED */
 
-#define CFG_LED_BASE           0xF9000000  /* start of LED and Board ID */
+#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..79937dcd8f9bc42d01bf94f68a2c8e37f0d6a0bd 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
 #endif
 
 /* pass open firmware flat tree */
-#define CONFIG_OF_FLAT_TREE    1
+#define CONFIG_OF_LIBFDT       1
+#undef  CONFIG_OF_FLAT_TREE
 #define CONFIG_OF_BOARD_SETUP  1
+#define CONFIG_OF_HAS_BD_T     1
+#define CONFIG_OF_HAS_UBOOT_ENV        1
+
 
 /* maximum size of the flat tree (8K) */
 #define OF_FLAT_TREE_MAX_SIZE  8192
 
 #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 74a84f4e86ab259c8477c9cc4a064a20c09297dd..5aeea586800eb9587ae1e289305387736753c14b 100644 (file)
 
 /*
  * General PCI
- * Addresses are mapped 1-1.
+ * Memory space is mapped 1-1, but I/O space must start from 0.
  */
 #define CFG_PCI1_MEM_BASE      0x80000000
 #define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
 #define CFG_PCI1_MEM_SIZE      0x20000000      /* 512M */
-
-#define CFG_PCI1_IO_BASE       0x0
+#define CFG_PCI1_IO_BASE       0x00000000
 #define CFG_PCI1_IO_PHYS       0xe2000000
 #define CFG_PCI1_IO_SIZE       0x100000        /* 1M */
 
index db389cfe676255598816e957c01205055548491f..fb360d282cd4cf653d2a09a569127555172c3cd2 100644 (file)
@@ -334,7 +334,7 @@ extern unsigned long get_clock_freq(void);
 
 /*
  * General PCI
- * Addresses are mapped 1-1.
+ * Memory space is mapped 1-1, but I/O space must start from 0.
  */
 #define CFG_PCI1_MEM_BASE      0x80000000
 #define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
diff --git a/include/configs/MPC8544DS.h b/include/configs/MPC8544DS.h
new file mode 100644 (file)
index 0000000..4c34308
--- /dev/null
@@ -0,0 +1,591 @@
+/*
+ * Copyright 2007 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.
+ *
+ * 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
+ */
+
+/*
+ * mpc8544ds board configuration file
+ *
+ */
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* High Level Configuration Options */
+#define CONFIG_BOOKE           1       /* BOOKE */
+#define CONFIG_E500            1       /* BOOKE e500 family */
+#define CONFIG_MPC85xx         1       /* MPC8540/60/55/41/48 */
+#define CONFIG_MPC8544         1
+#define CONFIG_MPC8544DS       1
+
+#undef CONFIG_PCI                      /* Enable PCI/PCIE */
+#undef CONFIG_PCI1                     /* PCI controller 1 */
+#undef CONFIG_PCIE1                    /* PCIE controler 1 (slot 1) */
+#undef CONFIG_PCIE2                    /* PCIE controler 2 (slot 2) */
+#undef CONFIG_PCIE3                    /* PCIE controler 3 (ULI bridge) */
+#undef CONFIG_FSL_PCI_INIT             /* Use common FSL init code */
+
+#define CONFIG_TSEC_ENET               /* tsec ethernet support */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SPD_EEPROM              /* Use SPD EEPROM for DDR setup */
+#undef CONFIG_DDR_DLL
+#define CONFIG_DDR_2T_TIMING           /* Sets the 2T timing bit */
+
+#define CONFIG_DDR_ECC                 /* only for ECC DDR module */
+#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER      /* DDR controller or DMA? */
+#define CONFIG_MEM_INIT_VALUE          0xDeadBeef
+
+#define CONFIG_DDR_ECC_CMD
+
+/*
+ * When initializing flash, if we cannot find the manufacturer ID,
+ * assume this is the AMD flash associated with the CDS board.
+ * This allows booting from a promjet.
+ */
+#define CONFIG_ASSUME_AMD_FLASH
+
+#define MPC85xx_DDR_SDRAM_CLK_CNTL     /* 85xx has clock control reg */
+
+#ifndef __ASSEMBLY__
+extern unsigned long get_board_sys_clk(unsigned long dummy);
+#endif
+#define CONFIG_SYS_CLK_FREQ    get_board_sys_clk(0) /* sysclk for MPC85xx */
+
+/*
+ * These can be toggled for performance analysis, otherwise use default.
+ */
+#define CONFIG_L2_CACHE                        /* toggle L2 cache      */
+#define CONFIG_BTB                     /* toggle branch predition */
+#define CONFIG_ADDR_STREAMING          /* toggle addr streaming */
+#define CONFIG_CLEAR_LAW0              /* Clear LAW0 in cpu_init_r */
+
+/*
+ * Only possible on E500 Version 2 or newer cores.
+ */
+#define CONFIG_ENABLE_36BIT_PHYS       1
+
+#define CONFIG_BOARD_EARLY_INIT_F      1       /* Call board_pre_init */
+
+#undef CFG_DRAM_TEST                   /* memory test, takes time */
+#define CFG_MEMTEST_START      0x00200000      /* memtest works on */
+#define CFG_MEMTEST_END                0x00400000
+#define CFG_ALT_MEMTEST
+#define CONFIG_PANIC_HANG      /* do not reset board on panic */
+
+/*
+ * Base addresses -- Note these are effective addresses where the
+ * actual resources get mapped (not physical addresses)
+ */
+#define CFG_CCSRBAR_DEFAULT    0xff700000      /* CCSRBAR Default */
+#define CFG_CCSRBAR            0xe0000000      /* relocated CCSRBAR */
+#define CFG_IMMR               CFG_CCSRBAR     /* PQII uses CFG_IMMR */
+
+#define CFG_PCI1_ADDR          (CFG_CCSRBAR+0x8000)
+#define CFG_PCIE1_ADDR         (CFG_CCSRBAR+0xa000)
+#define CFG_PCIE2_ADDR         (CFG_CCSRBAR+0x9000)
+#define CFG_PCIE3_ADDR         (CFG_CCSRBAR+0xb000)
+
+/*
+ * DDR Setup
+ */
+#define CFG_DDR_SDRAM_BASE     0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE         CFG_DDR_SDRAM_BASE
+
+#define SPD_EEPROM_ADDRESS     0x51            /* DDR DIMM */
+
+/*
+ * Make sure required options are set
+ */
+#ifndef CONFIG_SPD_EEPROM
+#error ("CONFIG_SPD_EEPROM is required")
+#endif
+
+#undef CONFIG_CLOCKS_IN_MHZ
+
+/*
+ * Memory map
+ *
+ * 0x0000_0000 0x7fff_ffff     DDR                     2G Cacheable
+ *
+ * 0x8000_0000 0xbfff_ffff     PCI Express Mem         1G non-cacheable
+ *
+ * 0xc000_0000 0xdfff_ffff     PCI                     512M non-cacheable
+ *
+ * 0xe000_0000 0xe00f_ffff     CCSR                    1M non-cacheable
+ * 0xe100_0000 0xe3ff_ffff     PCI IO range            4M non-cacheable
+ *
+ * Localbus cacheable
+ *
+ * 0xf000_0000 0xf3ff_ffff     SDRAM                   64M Cacheable
+ * 0xf401_0000 0xf401_3fff     L1 for stack            4K Cacheable TLB0
+ *
+ * Localbus non-cacheable
+ *
+ * 0xf800_0000 0xf80f_ffff     NVRAM/CADMUS (*)        1M non-cacheable
+ * 0xff00_0000 0xff7f_ffff     FLASH (2nd bank)        8M non-cacheable
+ * 0xff80_0000 0xffff_ffff     FLASH (boot bank)       8M non-cacheable
+ *
+ */
+
+/*
+ * Local Bus Definitions
+ */
+#define CFG_BOOT_BLOCK         0xfc000000      /* boot TLB */
+
+#define CFG_LBC_CACHE_BASE     0xf0000000      /* Localbus cacheable */
+
+#define CFG_FLASH_BASE         0xff800000      /* start of FLASH 8M */
+
+#define CFG_BR0_PRELIM         0xff801001
+#define CFG_BR1_PRELIM         0xfe801001
+
+#define CFG_OR0_PRELIM         0xff806e65
+#define CFG_OR1_PRELIM         0xff806e65
+
+#define CFG_FLASH_BANKS_LIST   {0xfe800000,CFG_FLASH_BASE}
+
+#define CFG_MAX_FLASH_BANKS    2               /* number of banks */
+#define CFG_MAX_FLASH_SECT     128             /* 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_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#define CFG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#define CFG_FLASH_EMPTY_INFO
+
+#define CFG_LBC_NONCACHE_BASE  0xf8000000
+
+#define CFG_BR2_PRELIM         0xf8201001      /* port size 16bit */
+#define CFG_OR2_PRELIM         0xfff06ff7      /* 1MB Compact Flash area*/
+
+#define CFG_BR3_PRELIM         0xf8100801      /* port size 8bit */
+#define CFG_OR3_PRELIM         0xfff06ff7      /* 1MB PIXIS area*/
+
+#define PIXIS_BASE     0xf8100000      /* PIXIS registers */
+#define PIXIS_ID               0x0     /* Board ID at offset 0 */
+#define PIXIS_VER              0x1     /* Board version at offset 1 */
+#define PIXIS_PVER             0x2     /* PIXIS FPGA version at offset 2 */
+#define PIXIS_RST              0x4     /* PIXIS Reset Control register */
+#define PIXIS_AUX              0x6     /* PIXIS Auxiliary register; Scratch
+                                        * register */
+#define PIXIS_SPD              0x7     /* Register for SYSCLK speed */
+#define PIXIS_VCTL             0x10    /* VELA Control Register */
+#define PIXIS_VCFGEN0          0x12    /* VELA Config Enable 0 */
+#define PIXIS_VCFGEN1          0x13    /* VELA Config Enable 1 */
+#define PIXIS_VBOOT            0x16    /* VELA VBOOT Register */
+#define PIXIS_VSPEED0          0x17    /* VELA VSpeed 0 */
+#define PIXIS_VSPEED1          0x18    /* VELA VSpeed 1 */
+#define PIXIS_VCLKH            0x19    /* VELA VCLKH register */
+#define PIXIS_VCLKL            0x1A    /* VELA VCLKL register */
+
+
+/* define to use L1 as initial stack */
+#define CONFIG_L1_INIT_RAM     1
+#define CFG_INIT_L1_LOCK       1
+#define CFG_INIT_L1_ADDR       0xf4010000      /* Initial L1 address */
+#define CFG_INIT_L1_END                0x00004000      /* End of used area in RAM */
+
+/* define to use L2SRAM as initial stack */
+#undef CONFIG_L2_INIT_RAM
+#define CFG_INIT_L2_ADDR       0xf8fc0000
+#define CFG_INIT_L2_END                0x00040000      /* End of used area in RAM */
+
+#ifdef CONFIG_L1_INIT_RAM
+#define CFG_INIT_RAM_ADDR      CFG_INIT_L1_ADDR
+#define CFG_INIT_RAM_END       CFG_INIT_L1_END
+#else
+#define CFG_INIT_RAM_ADDR      CFG_INIT_L2_ADDR
+#define CFG_INIT_RAM_END       CFG_INIT_L2_END
+#endif
+
+#define CFG_GBL_DATA_SIZE      128     /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+#define CFG_MONITOR_LEN                (256 * 1024) /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
+
+/* Serial Port - controlled on board with jumper J8
+ * open - index 2
+ * shorted - index 1
+ */
+#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_CCSRBAR+0x4500)
+#define CFG_NS16550_COM2       (CFG_CCSRBAR+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
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+
+#define OF_CPU                 "PowerPC,8544@0"
+#define OF_SOC                 "soc8544@e0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 8)
+#define OF_STDOUT_PATH         "/soc8544@e0000000/serial@4500"
+
+/* I2C */
+#define CONFIG_FSL_I2C         /* Use FSL common I2C driver */
+#define CONFIG_HARD_I2C                /* I2C with hardware support */
+#undef CONFIG_SOFT_I2C         /* I2C bit-banged */
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address */
+#define CFG_I2C_EEPROM_ADDR    0x57
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_NOPROBES       {0x69}  /* Don't probe these addrs */
+#define CFG_I2C_OFFSET         0x3100
+
+/*
+ * General PCI
+ * Memory space is mapped 1-1, but I/O space must start from 0.
+ */
+#define CFG_PCIE_PHYS          0x80000000      /* 1G PCIE TLB */
+#define CFG_PCI_PHYS           0xc0000000      /* 512M PCI TLB */
+
+#define CFG_PCI1_MEM_BASE      0xc0000000
+#define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
+#define CFG_PCI1_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI1_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xe1000000
+#define CFG_PCI1_IO_SIZE       0x00100000      /* 1M */
+
+/* PCI view of System Memory */
+#define CFG_PCI_MEMORY_BUS     0x00000000
+#define CFG_PCI_MEMORY_PHYS    0x00000000
+#define CFG_PCI_MEMORY_SIZE    0x80000000
+
+/* controller 2, Slot 1, tgtid 1, Base address 9000 */
+#define CFG_PCIE2_MEM_BASE     0x80000000
+#define CFG_PCIE2_MEM_PHYS     CFG_PCIE2_MEM_BASE
+#define CFG_PCIE2_MEM_SIZE     0x20000000      /* 512M */
+#define CFG_PCIE2_IO_BASE      0x00000000
+#define CFG_PCIE2_IO_PHYS      0xe2000000
+#define CFG_PCIE2_IO_SIZE      0x00100000      /* 1M */
+
+/* controller 1, Slot 2,tgtid 2, Base address a000 */
+#define CFG_PCIE1_MEM_BASE     0xa0000000
+#define CFG_PCIE1_MEM_PHYS     CFG_PCIE1_MEM_BASE
+#define CFG_PCIE1_MEM_SIZE     0x08000000      /* 128M */
+#define CFG_PCIE1_MEM_BASE2    0xa8000000
+#define CFG_PCIE1_MEM_PHYS2    CFG_PCIE1_MEM_BASE2
+#define CFG_PCIE1_MEM_SIZE2    0x04000000      /* 64M */
+#define CFG_PCIE1_IO_BASE      0x00000000      /* reuse mem LAW */
+#define CFG_PCIE1_IO_PHYS      0xaf000000
+#define CFG_PCIE1_IO_SIZE      0x00100000      /* 1M */
+
+/* controller 3, direct to uli, tgtid 3, Base address b000 */
+#define CFG_PCIE3_MEM_BASE     0xb0000000
+#define CFG_PCIE3_MEM_PHYS     CFG_PCIE3_MEM_BASE
+#define CFG_PCIE3_MEM_SIZE     0x10000000      /* 256M */
+#define CFG_PCIE3_IO_BASE      0x00000000
+#define CFG_PCIE3_IO_PHYS      0xe3000000
+#define CFG_PCIE3_IO_SIZE      0x00100000      /* 1M */
+
+#if defined(CONFIG_PCI)
+
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP                 /* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_TULIP
+#define CONFIG_RTL8139
+
+#ifdef CONFIG_RTL8139
+/* This macro is used by RTL8139 but not defined in PPC architecture */
+#define KSEG1ADDR(x)           (x)
+#define _IO_BASE       0x00000000
+#endif
+
+#ifndef CONFIG_PCI_PNP
+       #define PCI_ENET0_IOADDR        CFG_PCI1_IO_BASE
+       #define PCI_ENET0_MEMADDR       CFG_PCI1_IO_BASE
+       #define PCI_IDSEL_NUMBER        0x11    /* IDSEL = AD11 */
+#endif
+
+#define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
+#define CONFIG_DOS_PARTITION
+#define CONFIG_SCSI_AHCI
+
+#ifdef CONFIG_SCSI_AHCI
+#define CONFIG_SATA_ULI5288
+#define CFG_SCSI_MAX_SCSI_ID   4
+#define CFG_SCSI_MAX_LUN       1
+#define CFG_SCSI_MAX_DEVICE    (CFG_SCSI_MAX_SCSI_ID * CFG_SCSI_MAX_LUN)
+#define CFG_SCSI_MAXDEVICE     CFG_SCSI_MAX_DEVICE
+#endif /* SCSCI */
+
+#endif /* CONFIG_PCI */
+
+
+#if defined(CONFIG_TSEC_ENET)
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+#define CONFIG_MII             1       /* MII PHY management */
+#define CONFIG_MII_DEFAULT_TSEC        1       /* Allow unregistered phys */
+#define CONFIG_MPC85XX_TSEC1   1
+#define CONFIG_MPC85XX_TSEC1_NAME      "eTSEC1"
+#define CONFIG_MPC85XX_TSEC3   1
+#define CONFIG_MPC85XX_TSEC3_NAME      "eTSEC3"
+#undef CONFIG_MPC85XX_FEC
+
+#define TSEC1_PHY_ADDR         0
+#define TSEC3_PHY_ADDR         1
+
+#define TSEC1_PHYIDX           0
+#define TSEC3_PHYIDX           0
+
+#define CONFIG_ETHPRIME                "eTSEC1"
+
+#define CONFIG_PHY_GIGE                1       /* Include GbE speed/duplex detection */
+
+#endif /* CONFIG_TSEC_ENET */
+
+/*
+ * Environment
+ */
+#define CFG_ENV_IS_IN_FLASH    1
+#if CFG_MONITOR_BASE > 0xfff80000
+#define CFG_ENV_ADDR           0xfff80000
+#else
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE + 0x40000)
+#endif
+#define CFG_ENV_SIZE           0x2000
+#define CFG_ENV_SECT_SIZE      0x10000 /* 64K (one sector) */
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#if defined(CONFIG_PCI)
+#define        CONFIG_COMMANDS (CONFIG_CMD_DFL \
+                               | CFG_CMD_PCI \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_I2C \
+                               | CFG_CMD_MII \
+                               | CFG_CMD_BEDBUG \
+                               | CFG_CMD_NET)
+#else
+#define        CONFIG_COMMANDS (CONFIG_CMD_DFL \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_I2C \
+                               | CFG_CMD_MII)
+#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
+
+/*
+ * 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
+
+/*
+ * Environment Configuration
+ */
+
+/* The mac addresses for all ethernet interface */
+#if defined(CONFIG_TSEC_ENET)
+#define CONFIG_ETHADDR 00:E0:0C:02:00:FD
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR        00:E0:0C:02:01:FD
+#define CONFIG_HAS_ETH2
+#define CONFIG_ETH2ADDR        00:E0:0C:02:02:FD
+#define CONFIG_HAS_ETH3
+#define CONFIG_ETH3ADDR        00:E0:0C:02:03:FD
+#endif
+
+#define CONFIG_IPADDR  192.168.1.251
+
+#define CONFIG_HOSTNAME        8544ds_unknown
+#define CONFIG_ROOTPATH        /nfs/mpc85xx
+#define CONFIG_BOOTFILE        8544ds_tmt/uImage.uboot
+
+#define CONFIG_SERVERIP        192.168.0.1
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.0.0
+
+#define CONFIG_LOADADDR        1000000 /*default location for tftp and bootm*/
+
+#define CONFIG_BOOTDELAY 10    /* -1 disables auto-boot */
+#undef CONFIG_BOOTARGS /* the boot command will set bootargs*/
+
+#define CONFIG_BAUDRATE        115200
+
+#if defined(CONFIG_PCIE1) || defined(CONFIG_PCIE2) || defined(CONFIG_PCIE3)
+#define PCIE_ENV \
+ "pciereg=md ${a}000 6; md ${a}020 4; md ${a}bf8 2; echo o;md ${a}c00 25;" \
+       "echo i; md ${a}da0 15; echo e;md ${a}e00 e; echo d; md ${a}f00 c\0" \
+ "pcie1regs=setenv a e000a; run pciereg\0"     \
+ "pcie2regs=setenv a e0009; run pciereg\0"     \
+ "pcie3regs=setenv a e000b; run pciereg\0"     \
+ "pcieerr=md ${a}020 1; md ${a}e00;"           \
+       "pci d.b $b.0 7 1; pci d.w $b.0 1e 1;"  \
+       "pci d.w $b.0 56 1;"                    \
+       "pci d $b.0 104 1;pci d $b.0 110 1;pci d $b.0 130 1\0" \
+ "pcieerrc=mw ${a}020 ffffffff; mw ${a}e00 ffffffff;"  \
+       "pci w.b $b.0 7 ff; pci w.w $b.0 1e ffff; pci w.w $b.0 56 ffff;" \
+       "pci w $b.0 104 ffffffff; pci w $b.0 110 ffffffff;" \
+       "pci w $b.0 130 ffffffff\0" \
+ "pciecfg=pci d $b.0 0 20; pci d $b.0 100 e; pci d $b.0 400 69\0"      \
+ "pcie1err=setenv a e000a; run pcieerr\0"      \
+ "pcie2err=setenv a e0009; run pcieerr\0"      \
+ "pcie3err=setenv a e000b; run pcieerr\0"      \
+ "pcie1errc=setenv a e000a; run pcieerrc\0"    \
+ "pcie2errc=setenv a e0009; run pcieerrc\0"    \
+ "pcie3errc=setenv a e000b; run pcieerrc\0"
+#else
+#define        PCIE_ENV ""
+#endif
+
+#if defined(CONFIG_PCI1)
+#define PCI_ENV \
+ "pcireg=md ${a}000 3; echo o;md ${a}c00 25; echo i; md ${a}da0 15;" \
+       "echo e;md ${a}e00 9\0"                 \
+ "pci1regs=setenv a e0008; run pcireg\0"       \
+ "pcierr=md ${a}e00 8; pci d.b $b.0 7 1; pci d.w $b.0 1e 1;" \
+       "pci d.w $b.0 56 1\0"                   \
+ "pcierrc=mw ${a}e00 ffffffff; pci w.b $b.0 7 ff; pci w.w $b.0 1e ffff;" \
+       "pci w.w $b.0 56 ffff\0"                \
+ "pci1err=setenv a e0008; run pcierr\0"                \
+ "pci1errc=setenv a e0008; run pcierrc\0"
+#else
+#define        PCI_ENV ""
+#endif
+
+#if defined(CONFIG_TSEC_ENET)
+#define ENET_ENV \
+ "enetreg1=md ${a}000 2; md ${a}010 9; md ${a}050 4; md ${a}08c 1;" \
+       "md ${a}098 2\0" \
+ "enetregt=echo t;md ${a}100 6; md ${a}140 2; md ${a}180 10; md ${a}200 10\0" \
+ "enetregr=echo r;md ${a}300 6; md ${a}330 5; md ${a}380 10; md ${a}400 10\0" \
+ "enetregm=echo mac;md ${a}500 5; md ${a}520 28;echo fifo;md ${a}a00 1;" \
+       "echo mib;md ${a}680 31\0" \
+ "enetreg=run enetreg1; run enetregm; run enetregt; run enetregr\0" \
+ "enet1regs=setenv a e0024; run enetreg\0" \
+ "enet3regs=setenv a e0026; run enetreg\0"
+#else
+#define ENET_ENV ""
+#endif
+
+#define        CONFIG_EXTRA_ENV_SETTINGS               \
+ "netdev=eth0\0"                               \
+ "consoledev=ttyS0\0"                          \
+ "ramdiskaddr=2000000\0"                       \
+ "ramdiskfile=8544ds_tmt/ramdisk.uboot\0"      \
+ "fdtaddr=400000\0"                            \
+ "fdtfile=8544ds_tmt/mpc8544ds.dtb\0"          \
+ "eoi=mw e00400b0 0\0"                                 \
+ "iack=md e00400a0 1\0"                        \
+ "ddrreg=md ${a}000 8; md ${a}080 8;md ${a}100 d; md ${a}140 4; md ${a}bf0 4;" \
+       "md ${a}e00 3; md ${a}e20 3; md ${a}e40 7; md ${a}f00 5\0" \
+ "ddrregs=setenv a e0002; run ddrreg\0"        \
+ "gureg=md ${a}000 2c; md ${a}0b0 1; md ${a}0c0 1; md ${a}b20 3;" \
+       "md ${a}e00 1; md ${a}e60 1; md ${a}ef0 15\0"   \
+ "guregs=setenv a e00e0; run gureg\0"          \
+ "ecmreg=md ${a}000 1; md ${a}010 1; md ${a}bf8 2; md ${a}e00 6\0" \
+ "ecmregs=setenv a e0001; run ecmreg\0"        \
+ PCIE_ENV      \
+ PCI_ENV       \
+ ENET_ENV
+
+
+#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             \
+ "setenv bootargs root=/dev/sda3 rw "  \
+ "console=$consoledev,$baudrate $othbootargs;" \
+ "tftp $loadaddr $bootfile;"           \
+ "tftp $fdtaddr $fdtfile;"             \
+ "bootm $loadaddr - $fdtaddr"
+
+#endif /* __CONFIG_H */
index 7c4849fadfb2e1a0b18d745d30125dddbd4ec524..680009d6006aa366ef681a46517dcc33e8f7cd86 100644 (file)
 #define CONFIG_MPC8548         1       /* MPC8548 specific */
 #define CONFIG_MPC8548CDS      1       /* MPC8548CDS board specific */
 
-#undef CONFIG_PCI
+#define CONFIG_PCI
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_SPD_EEPROM              /* Use SPD EEPROM for DDR setup*/
 #define CONFIG_DDR_DLL                 /* possible DLL fix needed */
-#define CONFIG_DDR_2T_TIMING           /* Sets the 2T timing bit */
+#undef CONFIG_DDR_2T_TIMING            /* Sets the 2T timing bit */
 
 #define CONFIG_DDR_ECC                 /* only for ECC DDR module */
 #define CONFIG_ECC_INIT_VIA_DDRCONTROLLER      /* DDR controller or DMA? */
@@ -340,22 +340,34 @@ extern unsigned long get_clock_freq(void);
 
 /*
  * General PCI
- * Addresses are mapped 1-1.
+ * Memory space is mapped 1-1, but I/O space must start from 0.
  */
 #define CFG_PCI1_MEM_BASE      0x80000000
 #define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
-#define CFG_PCI1_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI1_MEM_SIZE      0x10000000      /* 256M */
 #define CFG_PCI1_IO_BASE       0x00000000
 #define CFG_PCI1_IO_PHYS       0xe2000000
-#define CFG_PCI1_IO_SIZE       0x00100000      /* 1M */
+#define CFG_PCI1_IO_SIZE       0x00800000      /* 8M */
 
-#define CFG_PCI2_MEM_BASE      0xa0000000
+#define CFG_PCI2_MEM_BASE      0x90000000
 #define CFG_PCI2_MEM_PHYS      CFG_PCI2_MEM_BASE
-#define CFG_PCI2_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI2_MEM_SIZE      0x10000000      /* 256M */
 #define CFG_PCI2_IO_BASE       0x00000000
-#define CFG_PCI2_IO_PHYS       0xe2100000
-#define CFG_PCI2_IO_SIZE       0x00100000      /* 1M */
+#define CFG_PCI2_IO_PHYS       0xe2800000
+#define CFG_PCI2_IO_SIZE       0x00800000      /* 8M */
 
+#define CFG_PEX_MEM_BASE       0xa0000000
+#define CFG_PEX_MEM_PHYS       CFG_PEX_MEM_BASE
+#define CFG_PEX_MEM_SIZE       0x20000000      /* 512M */
+#define CFG_PEX_IO_BASE                0x00000000
+#define CFG_PEX_IO_PHYS                0xe3000000
+#define CFG_PEX_IO_SIZE                0x01000000      /* 16M */
+
+/*
+ * RapidIO MMU
+ */
+#define CFG_RIO_MEM_BASE       0xC0000000
+#define CFG_RIO_MEM_SIZE       0x20000000      /* 512M */
 
 #if defined(CONFIG_PCI)
 
index 835bf5cb64e6a27613c396e044403031a6d4a9db..21e663768059e23496457b3c02a9267e0caa4f17 100644 (file)
 
 /*
  * General PCI
- * Addresses are mapped 1-1.
+ * Memory space is mapped 1-1, but I/O space must start from 0.
  */
 #define CFG_PCI1_MEM_BASE      0x80000000
 #define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
 #define CFG_PCI1_MEM_SIZE      0x20000000      /* 512M */
-#define CFG_PCI1_IO_BASE       0xe2000000
-#define CFG_PCI1_IO_PHYS       CFG_PCI1_IO_BASE
-#define CFG_PCI1_IO_SIZE       0x1000000       /* 16M */
+#define CFG_PCI1_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xe2000000
+#define CFG_PCI1_IO_SIZE       0x100000        /* 1M */
 
 #if defined(CONFIG_PCI)
 
diff --git a/include/configs/MPC8568MDS.h b/include/configs/MPC8568MDS.h
new file mode 100644 (file)
index 0000000..3f65644
--- /dev/null
@@ -0,0 +1,505 @@
+/*
+ * Copyright 2004-2007 Freescale Semiconductor.
+ *
+ * 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
+ */
+
+/*
+ * mpc8568mds board configuration file
+ */
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* High Level Configuration Options */
+#define CONFIG_BOOKE           1       /* BOOKE */
+#define CONFIG_E500                    1       /* BOOKE e500 family */
+#define CONFIG_MPC85xx         1       /* MPC8540/60/55/41/48/68 */
+#define CONFIG_MPC8568         1       /* MPC8568 specific */
+#define CONFIG_MPC8568MDS      1       /* MPC8568MDS board specific */
+
+#undef CONFIG_PCI
+#define CONFIG_TSEC_ENET               /* tsec ethernet support */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SPD_EEPROM              /* Use SPD EEPROM for DDR setup*/
+#define CONFIG_DDR_DLL                 /* possible DLL fix needed */
+/*#define CONFIG_DDR_2T_TIMING          Sets the 2T timing bit */
+
+/*#define CONFIG_DDR_ECC*/                     /* only for ECC DDR module */
+/*#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER*/  /*       DDR controller or DMA? */
+#define CONFIG_MEM_INIT_VALUE          0xDeadBeef
+
+
+/*
+ * When initializing flash, if we cannot find the manufacturer ID,
+ * assume this is the AMD flash associated with the MDS board.
+ * This allows booting from a promjet.
+ */
+#define CONFIG_ASSUME_AMD_FLASH
+
+#define MPC85xx_DDR_SDRAM_CLK_CNTL     /* 85xx has clock control reg */
+
+#ifndef __ASSEMBLY__
+extern unsigned long get_clock_freq(void);
+#endif                                           /*Replace a call to get_clock_freq (after it is implemented)*/
+#define CONFIG_SYS_CLK_FREQ    66000000 /*TODO: restore if wanting to read from BCSR: get_clock_freq()*/ /* sysclk for MPC85xx */
+
+/*
+ * These can be toggled for performance analysis, otherwise use default.
+ */
+/*#define CONFIG_L2_CACHE*/                        /* toggle L2 cache  */
+#define CONFIG_BTB                                             /* toggle branch predition */
+#define CONFIG_ADDR_STREAMING              /* toggle addr streaming   */
+
+/*
+ * Only possible on E500 Version 2 or newer cores.
+ */
+#define CONFIG_ENABLE_36BIT_PHYS       1
+
+
+#define CONFIG_BOARD_EARLY_INIT_F      1       /* Call board_pre_init */
+
+#undef CFG_DRAM_TEST                   /* memory test, takes time */
+#define CFG_MEMTEST_START      0x00200000      /* memtest works on */
+#define CFG_MEMTEST_END                0x00400000
+
+/*
+ * Base addresses -- Note these are effective addresses where the
+ * actual resources get mapped (not physical addresses)
+ */
+#define CFG_CCSRBAR_DEFAULT    0xff700000      /* CCSRBAR Default */
+#define CFG_CCSRBAR            0xe0000000      /* relocated CCSRBAR */
+#define CFG_IMMR               CFG_CCSRBAR     /* PQII uses CFG_IMMR */
+
+/*
+ * DDR Setup
+ */
+#define CFG_DDR_SDRAM_BASE     0x00000000      /* DDR is system memory*/
+#define CFG_SDRAM_BASE         CFG_DDR_SDRAM_BASE
+
+#define SPD_EEPROM_ADDRESS     0x51            /* DDR DIMM */
+
+/*
+ * Make sure required options are set
+ */
+#ifndef CONFIG_SPD_EEPROM
+#error ("CONFIG_SPD_EEPROM is required")
+#endif
+
+#undef CONFIG_CLOCKS_IN_MHZ
+
+
+/*
+ * Local Bus Definitions
+ */
+
+/*
+ * FLASH on the Local Bus
+ * Two banks, 8M each, using the CFI driver.
+ * Boot from BR0/OR0 bank at 0xff00_0000
+ * Alternate BR1/OR1 bank at 0xff80_0000
+ *
+ * BR0, BR1:
+ *    Base address 0 = 0xff00_0000 = BR0[0:16] = 1111 1111 0000 0000 0
+ *    Base address 1 = 0xff80_0000 = BR1[0:16] = 1111 1111 1000 0000 0
+ *    Port Size = 16 bits = BRx[19:20] = 10
+ *    Use GPCM = BRx[24:26] = 000
+ *    Valid = BRx[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1111 1000 0000 0001 0000 0000 0001 = ff801001    BR0
+ * 1111 1111 0000 0000 0001 0000 0000 0001 = ff001001    BR1
+ *
+ * OR0, OR1:
+ *    Addr Mask = 8M = ORx[0:16] = 1111 1111 1000 0000 0
+ *    Reserved ORx[17:18] = 11, confusion here?
+ *    CSNT = ORx[20] = 1
+ *    ACS = half cycle delay = ORx[21:22] = 11
+ *    SCY = 6 = ORx[24:27] = 0110
+ *    TRLX = use relaxed timing = ORx[29] = 1
+ *    EAD = use external address latch delay = OR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1111 1000 0000 0110 1110 0110 0101 = ff806e65    ORx
+ */
+#define CFG_BCSR_BASE          0xf8000000
+
+#define CFG_FLASH_BASE         0xfe000000      /* start of FLASH 32M */
+
+/*Chip select 0 - Flash*/
+#define CFG_BR0_PRELIM         0xfe001001
+#define        CFG_OR0_PRELIM          0xfe006ff7
+
+/*Chip slelect 1 - BCSR*/
+#define CFG_BR1_PRELIM         0xf8000801
+#define        CFG_OR1_PRELIM          0xffffe9f7
+
+/*#define CFG_FLASH_BANKS_LIST {0xff800000, CFG_FLASH_BASE} */
+#define CFG_MAX_FLASH_BANKS            1               /* number of banks */
+#define CFG_MAX_FLASH_SECT             512             /* 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_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#define CFG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#define CFG_FLASH_EMPTY_INFO
+
+
+/*
+ * SDRAM on the LocalBus
+ */
+#define CFG_LBC_SDRAM_BASE     0xf0000000      /* Localbus SDRAM        */
+#define CFG_LBC_SDRAM_SIZE     64                      /* LBC SDRAM is 64MB */
+
+
+/*Chip select 2 - SDRAM*/
+#define CFG_BR2_PRELIM      0xf0001861
+#define CFG_OR2_PRELIM         0xfc006901
+
+#define CFG_LBC_LCRR           0x00030004      /* LB clock ratio reg */
+#define CFG_LBC_LBCR           0x00000000      /* LB config reg */
+#define CFG_LBC_LSRT           0x20000000      /* LB sdram refresh timer */
+#define CFG_LBC_MRTPR          0x00000000      /* LB refresh timer prescal*/
+
+/*
+ * 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_RFCR16   (7 << (31 - 16))
+#define CFG_LBC_LSDMR_PRETOACT7        (7 << (31 - 19))
+#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_WRC4     (0 << (31 - 27))
+#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))
+
+/*
+ * Common settings for all Local Bus SDRAM commands.
+ * At run time, either BSMA1516 (for CPU 1.1)
+ *                  or BSMA1617 (for CPU 1.0) (old)
+ * is OR'ed in too.
+ */
+#define CFG_LBC_LSDMR_COMMON   ( CFG_LBC_LSDMR_RFCR16          \
+                               | CFG_LBC_LSDMR_PRETOACT7       \
+                               | CFG_LBC_LSDMR_ACTTORW7        \
+                               | CFG_LBC_LSDMR_BL8             \
+                               | CFG_LBC_LSDMR_WRC4            \
+                               | CFG_LBC_LSDMR_CL3             \
+                               | CFG_LBC_LSDMR_RFEN            \
+                               )
+
+/*
+ * The bcsr registers are connected to CS3 on MDS.
+ * The new memory map places bcsr at 0xf8000000.
+ *
+ * For BR3, need:
+ *    Base address of 0xf8000000 = BR[0:16] = 1111 1000 0000 0000 0
+ *    port-size = 8-bits  = BR[19:20] = 01
+ *    no parity checking  = BR[21:22] = 00
+ *    GPMC for MSEL       = BR[24:26] = 000
+ *    Valid               = BR[31]    = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1000 0000 0000 0000 1000 0000 0001 = f8000801
+ *
+ * For OR3, need:
+ *    1 MB mask for AM,   OR[0:16]  = 1111 1111 1111 0000 0
+ *    disable buffer ctrl OR[19]    = 0
+ *    CSNT                OR[20]    = 1
+ *    ACS                 OR[21:22] = 11
+ *    XACS                OR[23]    = 1
+ *    SCY 15 wait states  OR[24:27] = 1111     max is suboptimal but safe
+ *    SETA                OR[28]    = 0
+ *    TRLX                OR[29]    = 1
+ *    EHTR                OR[30]    = 1
+ *    EAD extra time      OR[31]    = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1111 1111 0000 0000 1111 1111 0111 = fff00ff7
+ */
+#define CFG_BCSR (0xf8000000)
+
+/*Chip slelect 4 - PIB*/
+#define CFG_BR4_PRELIM   0xf8008801
+#define CFG_OR4_PRELIM   0xffffe9f7
+
+/*Chip select 5 - PIB*/
+#define CFG_BR5_PRELIM  0xf8010801
+#define CFG_OR5_PRELIM  0xffff69f7
+
+#define CONFIG_L1_INIT_RAM
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR      0xe4010000      /* Initial RAM address */
+#define CFG_INIT_RAM_END       0x4000      /* End of used area in RAM */
+
+#define CFG_GBL_DATA_SIZE      128         /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+#define CFG_MONITOR_LEN                (256 * 1024) /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
+
+/* Serial Port */
+#define CONFIG_CONS_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_CCSRBAR+0x4500)
+#define CFG_NS16550_COM2        (CFG_CCSRBAR+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
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+
+#define OF_CPU                 "PowerPC,8568@0"
+#define OF_SOC                 "soc8568@e0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 8)
+#define OF_STDOUT_PATH         "/soc8568@e0000000/serial@4600"
+
+/*
+ * I2C
+ */
+#define CONFIG_FSL_I2C         /* Use FSL common I2C driver */
+#define CONFIG_HARD_I2C                /* I2C with hardware support*/
+#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address */
+#define CFG_I2C_EEPROM_ADDR    0x57
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_NOPROBES        {0x69} /* Don't probe these addrs */
+#define CFG_I2C_OFFSET         0x3000
+
+/*
+ * General PCI
+ * Memory Addresses are mapped 1-1. I/O is mapped from 0
+ */
+#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_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xe2000000
+#define CFG_PCI1_IO_SIZE       0x00800000      /* 8M */
+
+#define CFG_PEX_MEM_BASE       0xa0000000
+#define CFG_PEX_MEM_PHYS       CFG_PEX_MEM_BASE
+#define CFG_PEX_MEM_SIZE       0x10000000      /* 256M */
+#define CFG_PEX_IO_BASE                0x00000000
+#define CFG_PEX_IO_PHYS                0xe2800000
+#define CFG_PEX_IO_SIZE                0x00800000      /* 8M */
+
+#define CFG_SRIO_MEM_BASE      0xc0000000
+
+#if defined(CONFIG_PCI)
+
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP                 /* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_TULIP
+
+#undef CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup */
+#define CFG_PCI_SUBSYS_VENDORID 0x1057  /* Motorola */
+
+#endif /* CONFIG_PCI */
+
+
+#if defined(CONFIG_TSEC_ENET)
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+#define CONFIG_MII             1       /* MII PHY management */
+#define CONFIG_MPC85XX_TSEC1   1
+#define CONFIG_MPC85XX_TSEC1_NAME      "eTSEC0"
+#define CONFIG_MPC85XX_TSEC2   1
+#define CONFIG_MPC85XX_TSEC2_NAME      "eTSEC1"
+#undef  CONFIG_MPC85XX_TSEC3
+#undef  CONFIG_MPC85XX_TSEC4
+#undef  CONFIG_MPC85XX_FEC
+
+#define TSEC1_PHY_ADDR         2
+#define TSEC2_PHY_ADDR         3
+
+#define TSEC1_PHYIDX           0
+#define TSEC2_PHYIDX           0
+
+/* Options are: eTSEC[0-3] */
+#define CONFIG_ETHPRIME                "eTSEC0"
+
+#endif /* CONFIG_TSEC_ENET */
+
+/*
+ * Environment
+ */
+#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
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+#if defined(CONFIG_PCI)
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL \
+                               | CFG_CMD_PCI \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_I2C \
+                               | CFG_CMD_MII)
+#else
+#define  CONFIG_COMMANDS       (CONFIG_CMD_DFL \
+                               | CFG_CMD_PING \
+                               | CFG_CMD_I2C \
+                               | CFG_CMD_MII)
+#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
+
+/*
+ * 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
+
+/*
+ * Environment Configuration
+ */
+
+/* The mac addresses for all ethernet interface */
+#if defined(CONFIG_TSEC_ENET)
+#define CONFIG_ETHADDR   00:E0:0C:00:00:FD
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR  00:E0:0C:00:01:FD
+#define CONFIG_HAS_ETH2
+#define CONFIG_ETH2ADDR  00:E0:0C:00:02:FD
+#endif
+
+#define CONFIG_IPADDR    192.168.1.253
+
+#define CONFIG_HOSTNAME  unknown
+#define CONFIG_ROOTPATH  /nfsroot
+#define CONFIG_BOOTFILE  your.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 10       /* -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"                                                      \
+   "consoledev=ttyS0\0"                                                 \
+   "ramdiskaddr=600000\0"                                               \
+   "ramdiskfile=your.ramdisk.u-boot\0"                                 \
+   "fdtaddr=400000\0"                                                  \
+   "fdtfile=your.fdt.dtb\0"                                            \
+   "nfsargs=setenv bootargs root=/dev/nfs rw "                         \
+      "nfsroot=$serverip:$rootpath "                                   \
+      "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+      "console=$consoledev,$baudrate $othbootargs\0"                   \
+   "ramargs=setenv bootargs root=/dev/ram rw "                         \
+      "console=$consoledev,$baudrate $othbootargs\0"                   \
+
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+   "run nfsargs;"                                                      \
+   "tftp $loadaddr $bootfile;"                                          \
+   "tftp $fdtaddr $fdtfile;"                                           \
+   "bootm $loadaddr - $fdtaddr"
+
+
+#define CONFIG_RAMBOOTCOMMAND \
+   "run ramargs;"                                                      \
+   "tftp $ramdiskaddr $ramdiskfile;"                                    \
+   "tftp $loadaddr $bootfile;"                                          \
+   "bootm $loadaddr $ramdiskaddr"
+
+#define CONFIG_BOOTCOMMAND  CONFIG_NFSBOOTCOMMAND
+
+#endif /* __CONFIG_H */
index 246ac7f316fb4e2ad13e3ebbaeb2eeb53b1650ee..bbe35053dd7ff3874159685a6cb52d4daf82f7e7 100644 (file)
 #endif
 
 #if defined(CFG_RAMBOOT)
-#undef CFG_FLASH_CFI_DRIVER
 #undef CONFIG_SPD_EEPROM
 #define CFG_SDRAM_SIZE 256
 #endif
     #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
                                 | CFG_CMD_SCSI         \
                                 | CFG_CMD_EXT2)        \
                                &                       \
-                                ~(CFG_CMD_ENV          \
-                                 | CFG_CMD_IMLS        \
-                                 | CFG_CMD_FLASH       \
-                                 | CFG_CMD_LOADS))
+                                ~(CFG_CMD_ENV))
   #else
     #define  CONFIG_COMMANDS   ((CONFIG_CMD_DFL        \
                                 | CFG_CMD_PING         \
-                                | CFG_CMD_I2C          \
-                                | CFG_CMD_SCSI         \
-                                | CGF_CMD_EXT2)        \
+                                | CFG_CMD_I2C)         \
                                &                       \
-                                ~(CFG_CMD_ENV          \
-                                | CFG_CMD_IMLS         \
-                                | CFG_CMD_FLASH        \
-                                | CFG_CMD_LOADS))
+                                ~(CFG_CMD_ENV))
   #endif
 #else
   #if defined(CONFIG_PCI)
index 8da29c4afc01659c54fc730f976c76114aed3142..a12c8da13eccfde105145355259467446aabf199 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006 Detlev Zundel, dzu@denx.de
+ * (C) Copyright 2006, 2007 Detlev Zundel, dzu@denx.de
  * (C) Copyright 2005
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
 /*
  * NAND flash support
  */
-#define CFG_NAND_LEGACY
-
 #define CFG_MAX_NAND_DEVICE    1
-#define NAND_ChipID_UNKNOWN    0x00
-#define SECTORSIZE             512
-#define NAND_MAX_FLOORS                1
 #define NAND_MAX_CHIPS         1
-#define ADDR_PAGE              2
-#define ADDR_COLUMN_PAGE       3
-#define ADDR_COLUMN            1
-#define NAND_NO_RB
-
 
 /*-----------------------------------------------------------------------
  * SYPCR - System Protection Control                                   11-9
index 9d5c4f4d04e7eac95f133d0ed41760cd77ece19a..027dd22bf4676fd544b0372bd698b3ccbbed38e7 100644 (file)
@@ -1,6 +1,9 @@
 /*
+ * (C) Copyright 2007
+ * Matthias Fuchs, esd gmbh, matthias.fuchs@esd-electronics.com
+ *
  * (C) Copyright 2001-2004
- * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
+ * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -32,8 +35,6 @@
  * High Level Configuration Options
  * (easy to change)
  */
-#define CONFIG_IDENT_STRING     " $Name: esd_PCI405_05_07_28 $"
-
 #define CONFIG_405GP           1       /* This is a PPC405 CPU         */
 #define CONFIG_4xx             1       /* ...member of PPC4xx family   */
 #define CONFIG_PCI405          1       /* ...on a PCI405 board         */
@@ -53,9 +54,9 @@
        "mem_linux=14336k\0"                                            \
        "optargs=panic=0\0"                                             \
        "ramargs=setenv bootargs mem=$mem_linux root=/dev/ram rw\0"     \
-       "addcon=setenv bootargs $bootargs console=ttyS0,$baudrate $optargs\0" \
+       "addcons=setenv bootargs $bootargs console=ttyS0,$baudrate $optargs\0" \
        ""
-#define        CONFIG_BOOTCOMMAND      "run ramargs;run addcon;loadpci"
+#define        CONFIG_BOOTCOMMAND      "run ramargs;run addcons;loadpci"
 
 #define CONFIG_PREBOOT                  /* enable preboot variable      */
 
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*/
 
diff --git a/include/configs/SBC8560.h b/include/configs/SBC8560.h
deleted file mode 100644 (file)
index 8b46a17..0000000
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * (C) Copyright 2002,2003 Motorola,Inc.
- * Xianghua Xiao <X.Xiao@motorola.com>
- *
- * (C) Copyright 2004 Wind River Systems Inc <www.windriver.com>.
- * Added support for Wind River SBC8560 board
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-/* mpc8560ads board configuration file */
-/* please refer to doc/README.mpc85xx for more info */
-/* make sure you change the MAC address and other network params first,
- * search for CONFIG_ETHADDR,CONFIG_SERVERIP,etc in this file
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-#if XXX
-#define DEBUG                /* General debug */
-#define ET_DEBUG
-#endif
-#define TSEC_DEBUG
-
-/* High Level Configuration Options */
-#define CONFIG_BOOKE           1       /* BOOKE                        */
-#define CONFIG_E500            1       /* BOOKE e500 family            */
-#define CONFIG_MPC85xx         1       /* MPC8540/MPC8560              */
-#define CONFIG_MPC85xx_REV1    1       /* MPC85xx Rev 1.0 chip         */
-
-
-#define CONFIG_CPM2            1       /* has CPM2 */
-#define CONFIG_SBC8560         1       /* configuration for SBC8560 board */
-
-#define CONFIG_MPC8560ADS      1       /* MPC8560ADS board specific (supplement)       */
-
-#define CONFIG_TSEC_ENET               /* tsec ethernet support        */
-#undef CONFIG_PCI                      /* pci ethernet support         */
-#undef  CONFIG_ETHER_ON_FCC            /* cpm FCC ethernet support     */
-
-
-#define CONFIG_ENV_OVERWRITE
-
-/* Using Localbus SDRAM to emulate flash before we can program the flash,
- * normally you need a flash-boot image(u-boot.bin), if so undef this.
- */
-#undef CONFIG_RAM_AS_FLASH
-
-#if defined(CONFIG_PCI_66)             /* some PCI card is 33Mhz only  */
-  #define CONFIG_SYS_CLK_FREQ  66000000/* sysclk for MPC85xx           */
-#else
-  #define CONFIG_SYS_CLK_FREQ  33000000/* most pci cards are 33Mhz     */
-#endif
-
-/* below can be toggled for performance analysis. otherwise use default */
-#define CONFIG_L2_CACHE                            /* toggle L2 cache          */
-#undef CONFIG_BTB                          /* toggle branch predition  */
-#undef CONFIG_ADDR_STREAMING               /* toggle addr streaming    */
-
-#define CONFIG_BOARD_EARLY_INIT_F 1        /* Call board_early_init_f  */
-
-#undef CFG_DRAM_TEST                       /* memory test, takes time  */
-#define CFG_MEMTEST_START      0x00200000  /* memtest region */
-#define CFG_MEMTEST_END                0x00400000
-
-#if (defined(CONFIG_PCI) && defined(CONFIG_TSEC_ENET) || \
-     defined(CONFIG_PCI) && defined(CONFIG_ETHER_ON_FCC) || \
-     defined(CONFIG_TSEC_ENET) && defined(CONFIG_ETHER_ON_FCC))
-#error "You can only use ONE of PCI Ethernet Card or TSEC Ethernet or CPM FCC."
-#endif
-
-/*
- * Base addresses -- Note these are effective addresses where the
- * actual resources get mapped (not physical addresses)
- */
-#define CFG_CCSRBAR_DEFAULT    0xff700000      /* CCSRBAR Default      */
-
-#if XXX
-  #define CFG_CCSRBAR          0xfdf00000      /* relocated CCSRBAR    */
-#else
-  #define CFG_CCSRBAR          0xff700000      /* default CCSRBAR      */
-#endif
-#define CFG_IMMR               CFG_CCSRBAR     /* PQII uses CFG_IMMR   */
-
-#define CFG_DDR_SDRAM_BASE     0x00000000      /* DDR is system memory  */
-#define CFG_SDRAM_BASE         CFG_DDR_SDRAM_BASE
-#define CFG_SDRAM_SIZE         512             /* DDR is 512MB */
-#define SPD_EEPROM_ADDRESS     0x55            /*  DDR DIMM */
-
-#undef  CONFIG_DDR_ECC                         /* only for ECC DDR module      */
-#undef  CONFIG_SPD_EEPROM                      /* Use SPD EEPROM for DDR setup */
-
-#if defined(CONFIG_MPC85xx_REV1)
-  #define CONFIG_DDR_DLL                       /* possible DLL fix needed      */
-#endif
-
-#undef CONFIG_CLOCKS_IN_MHZ
-
-#if defined(CONFIG_RAM_AS_FLASH)
-  #define CFG_LBC_SDRAM_BASE   0xfc000000      /* Localbus SDRAM */
-  #define CFG_FLASH_BASE       0xf8000000      /* start of FLASH 8M  */
-  #define CFG_BR0_PRELIM       0xf8000801      /* port size 8bit */
-  #define CFG_OR0_PRELIM       0xf8000ff7      /* 8MB Flash            */
-#else /* Boot from real Flash */
-  #define CFG_LBC_SDRAM_BASE   0xf8000000      /* Localbus SDRAM */
-  #define CFG_FLASH_BASE       0xff800000      /* start of FLASH 8M    */
-  #define CFG_BR0_PRELIM       0xff800801      /* port size 8bit      */
-  #define CFG_OR0_PRELIM       0xff800ff7      /* 8MB Flash            */
-#endif
-#define CFG_LBC_SDRAM_SIZE     64              /* LBC SDRAM is 64MB    */
-
-/* local bus definitions */
-#define CFG_BR1_PRELIM         0xe4001801      /* 64M, 32-bit flash */
-#define CFG_OR1_PRELIM         0xfc000ff7
-
-#define CFG_BR2_PRELIM         0x00000000      /* CS2 not used */
-#define CFG_OR2_PRELIM         0x00000000
-
-#define CFG_BR3_PRELIM         0xf0001861      /* 64MB localbus SDRAM  */
-#define CFG_OR3_PRELIM         0xfc000cc1
-
-#if defined(CONFIG_RAM_AS_FLASH)
-  #define CFG_BR4_PRELIM       0xf4001861      /* 64M localbus SDRAM */
-#else
-  #define CFG_BR4_PRELIM       0xf8001861      /* 64M localbus SDRAM */
-#endif
-#define CFG_OR4_PRELIM         0xfc000cc1
-
-#define CFG_BR5_PRELIM         0xfc000801      /* 16M CS5 misc devices */
-#if 1
-  #define CFG_OR5_PRELIM       0xff000ff7
-#else
-  #define CFG_OR5_PRELIM       0xff0000f0
-#endif
-
-#define CFG_BR6_PRELIM         0xe0001801      /* 64M, 32-bit flash */
-#define CFG_OR6_PRELIM         0xfc000ff7
-#define CFG_LBC_LCRR           0x00030002      /* local bus freq       */
-#define CFG_LBC_LBCR           0x00000000
-#define CFG_LBC_LSRT           0x20000000
-#define CFG_LBC_MRTPR          0x20000000
-#define CFG_LBC_LSDMR_1                0x2861b723
-#define CFG_LBC_LSDMR_2                0x0861b723
-#define CFG_LBC_LSDMR_3                0x0861b723
-#define CFG_LBC_LSDMR_4                0x1861b723
-#define CFG_LBC_LSDMR_5                0x4061b723
-
-/* just hijack the MOT BCSR def for SBC8560 misc devices */
-#define CFG_BCSR               ((CFG_BR5_PRELIM & 0xff000000)|0x00400000)
-/* the size of CS5 needs to be >= 16M for TLB and LAW setups */
-
-#define CONFIG_L1_INIT_RAM
-#define CFG_INIT_RAM_LOCK      1
-#define CFG_INIT_RAM_ADDR      0x70000000      /* Initial RAM address  */
-#define CFG_INIT_RAM_END       0x4000          /* End of used area in RAM */
-
-#define CFG_GBL_DATA_SIZE      128             /* num bytes initial data */
-#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
-#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
-
-#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
-#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
-
-/* Serial Port */
-#undef  CONFIG_CONS_ON_SCC                     /* define if console on SCC */
-#undef CONFIG_CONS_NONE                        /* define if console on something else */
-
-#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                1843200 /* get_bus_freq(0) */
-#define CONFIG_BAUDRATE                9600
-
-#define CFG_BAUDRATE_TABLE  \
-       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200}
-
-#define CFG_NS16550_COM1       ((CFG_BR5_PRELIM & 0xff000000)+0x00700000)
-#define CFG_NS16550_COM2       ((CFG_BR5_PRELIM & 0xff000000)+0x00800000)
-
-/* Use the HUSH parser */
-#define CFG_HUSH_PARSER
-#ifdef CFG_HUSH_PARSER
-#define CFG_PROMPT_HUSH_PS2 "> "
-#endif
-
-/* I2C */
-#define         CONFIG_HARD_I2C                /* I2C with hardware support*/
-#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
-#define CFG_I2C_SPEED          400000  /* I2C speed and slave address  */
-#define CFG_I2C_SLAVE          0x7F
-#define CFG_I2C_NOPROBES       {0x69}  /* Don't probe these addrs */
-
-#define CFG_PCI_MEM_BASE       0xC0000000
-#define CFG_PCI_MEM_PHYS       0xC0000000
-#define CFG_PCI_MEM_SIZE       0x10000000
-
-#if defined(CONFIG_TSEC_ENET)          /* TSEC Ethernet port */
-
-#  define CONFIG_NET_MULTI     1
-#  define CONFIG_MII           1       /* MII PHY management           */
-#  define CONFIG_MPC85xx_TSEC1
-#  define CONFIG_MPC85xx_TSEC1_NAME    "TSEC0"
-#  define TSEC1_PHY_ADDR       25
-#  define TSEC1_PHYIDX         0
-/* Options are: TSEC0 */
-#  define CONFIG_ETHPRIME              "TSEC0"
-
-
-#elif defined(CONFIG_ETHER_ON_FCC)     /* CPM FCC Ethernet */
-
-  #undef  CONFIG_ETHER_NONE            /* define if ether on something else */
-  #define CONFIG_ETHER_ON_FCC2         /* cpm FCC ethernet support     */
-  #define CONFIG_ETHER_INDEX   2       /* which channel for ether  */
-
-  #if (CONFIG_ETHER_INDEX == 2)
-    /*
-     * - Rx-CLK is CLK13
-     * - Tx-CLK is CLK14
-     * - Select bus for bd/buffers
-     * - Full duplex
-     */
-    #define CFG_CMXFCR_MASK    (CMXFCR_FC2 | CMXFCR_RF2CS_MSK | CMXFCR_TF2CS_MSK)
-    #define CFG_CMXFCR_VALUE   (CMXFCR_RF2CS_CLK13 | CMXFCR_TF2CS_CLK14)
-    #define CFG_CPMFCR_RAMTYPE 0
-    #define CFG_FCC_PSMR       (FCC_PSMR_FDE)
-
-  #elif (CONFIG_ETHER_INDEX == 3)
-    /* need more definitions here for FE3 */
-  #endif                               /* CONFIG_ETHER_INDEX */
-
-  #define CONFIG_MII                   /* MII PHY management */
-  #define CONFIG_BITBANGMII            /* bit-bang MII PHY management  */
-  /*
-   * GPIO pins used for bit-banged MII communications
-   */
-  #define MDIO_PORT    2               /* Port C */
-  #define MDIO_ACTIVE  (iop->pdir |=  0x00400000)
-  #define MDIO_TRISTATE        (iop->pdir &= ~0x00400000)
-  #define MDIO_READ    ((iop->pdat &  0x00400000) != 0)
-
-  #define MDIO(bit)    if(bit) iop->pdat |=  0x00400000; \
-                       else    iop->pdat &= ~0x00400000
-
-  #define MDC(bit)     if(bit) iop->pdat |=  0x00200000; \
-                       else    iop->pdat &= ~0x00200000
-
-  #define MIIDELAY     udelay(1)
-
-#endif
-
-/*-----------------------------------------------------------------------
- * FLASH and environment organization
- */
-
-#define CFG_FLASH_CFI          1       /* Flash is CFI conformant              */
-#define CFG_FLASH_CFI_DRIVER   1       /* Use the common driver                */
-#if 0
-#define CFG_FLASH_USE_BUFFER_WRITE 1    /* use buffered writes (20x faster)     */
-#define CFG_FLASH_PROTECTION           /* use hardware protection              */
-#endif
-#define CFG_MAX_FLASH_SECT     64      /* max number of sectors on one chip    */
-#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks           */
-
-#undef CFG_FLASH_CHECKSUM
-#define CFG_FLASH_ERASE_TOUT   200000          /* Timeout for Flash Erase (in ms)      */
-#define CFG_FLASH_WRITE_TOUT   50000           /* Timeout for Flash Write (in ms)      */
-
-#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor     */
-
-#if 0
-/* XXX This doesn't work and I don't want to fix it */
-#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
-  #define CFG_RAMBOOT
-#else
-  #undef  CFG_RAMBOOT
-#endif
-#endif
-
-/* Environment */
-#if !defined(CFG_RAMBOOT)
-  #if defined(CONFIG_RAM_AS_FLASH)
-    #define CFG_ENV_IS_NOWHERE
-    #define CFG_ENV_ADDR       (CFG_FLASH_BASE + 0x100000)
-    #define CFG_ENV_SIZE       0x2000
-  #else
-    #define CFG_ENV_IS_IN_FLASH        1
-    #define CFG_ENV_SECT_SIZE  0x20000 /* 128K(one sector) for env */
-    #define CFG_ENV_ADDR       (CFG_MONITOR_BASE - CFG_ENV_SECT_SIZE)
-    #define CFG_ENV_SIZE       0x2000 /* CFG_ENV_SECT_SIZE */
-  #endif
-#else
-  #define CFG_NO_FLASH         1       /* Flash is not usable now      */
-  #define CFG_ENV_IS_NOWHERE   1       /* Store ENV in memory only     */
-  #define CFG_ENV_ADDR         (CFG_MONITOR_BASE - 0x1000)
-  #define CFG_ENV_SIZE         0x2000
-#endif
-
-#define CONFIG_BOOTARGS "root=/dev/nfs rw nfsroot=192.168.0.251:/tftpboot ip=192.168.0.105:192.168.0.251::255.255.255.0:sbc8560:eth0:off console=ttyS0,9600"
-/*#define CONFIG_BOOTARGS      "root=/dev/ram rw console=ttyS0,115200"*/
-#define CONFIG_BOOTCOMMAND     "bootm 0xff800000 0xffa00000"
-#define CONFIG_BOOTDELAY       5       /* -1 disable autoboot */
-
-#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
-#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
-
-#if defined(CFG_RAMBOOT) || defined(CONFIG_RAM_AS_FLASH)
-  #if defined(CONFIG_PCI)
-    #define  CONFIG_COMMANDS   ((CONFIG_CMD_DFL | CFG_CMD_PCI | \
-                               CFG_CMD_PING | CFG_CMD_I2C) & \
-                                ~(CFG_CMD_ENV | \
-                                 CFG_CMD_LOADS ))
-  #elif (defined(CONFIG_TSEC_ENET) || defined(CONFIG_ETHER_ON_FCC))
-    #define  CONFIG_COMMANDS   ((CONFIG_CMD_DFL | CFG_CMD_MII | \
-                               CFG_CMD_PING | CFG_CMD_I2C) & \
-                               ~(CFG_CMD_ENV))
-  #endif
-#else
-  #if defined(CONFIG_PCI)
-    #define  CONFIG_COMMANDS   (CONFIG_CMD_DFL | CFG_CMD_PCI | \
-                               CFG_CMD_PING | CFG_CMD_I2C)
-  #elif (defined(CONFIG_TSEC_ENET) || defined(CONFIG_ETHER_ON_FCC))
-    #define  CONFIG_COMMANDS   (CONFIG_CMD_DFL | CFG_CMD_MII | \
-                               CFG_CMD_PING | CFG_CMD_I2C)
-  #endif
-#endif
-
-#include <cmd_confdefs.h>
-
-#undef CONFIG_WATCHDOG                 /* watchdog disabled            */
-
-/*
- * Miscellaneous configurable options
- */
-#define CFG_LONGHELP                   /* undef to save memory         */
-#define CFG_PROMPT     "SBC8560=> " /* Monitor Command Prompt  */
-#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-  #define CFG_CBSIZE   1024            /* Console I/O Buffer Size      */
-#else
-  #define CFG_CBSIZE   256             /* Console I/O Buffer Size      */
-#endif
-#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
-#define CFG_MAXARGS    16              /* max number of command args   */
-#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
-#define CFG_LOAD_ADDR  0x1000000       /* default load address */
-#define CFG_HZ         1000            /* decrementer freq: 1 ms ticks */
-
-/*
- * For booting Linux, the board info and command line data
- * have to be in the first 8 MB of memory, since this is
- * the maximum mapped by the Linux kernel during initialization.
- */
-#define CFG_BOOTMAPSZ          (8 << 20) /* Initial Memory map for Linux */
-
-/* Cache Configuration */
-#define CFG_DCACHE_SIZE                32768
-#define CFG_CACHELINE_SIZE     32
-#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-  #define CFG_CACHELINE_SHIFT  5       /* log base 2 of the above value */
-#endif
-
-/*
- * Internal Definitions
- *
- * Boot Flags
- */
-#define BOOTFLAG_COLD  0x01            /* Normal Power-On: Boot from FLASH */
-#define BOOTFLAG_WARM  0x02            /* Software reboot              */
-
-#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
-  #define CONFIG_KGDB_BAUDRATE 230400  /* speed to run kgdb serial port */
-  #define CONFIG_KGDB_SER_INDEX        2       /* which serial port to use */
-#endif
-
-/*Note: change below for your network setting!!! */
-#if defined(CONFIG_TSEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
-#  define CONFIG_ETHADDR       00:vv:ww:xx:yy:8a
-#  define CONFIG_HAS_ETH1
-#  define CONFIG_ETH1ADDR      00:vv:ww:xx:yy:8b
-#  define CONFIG_HAS_ETH2
-#  define CONFIG_ETH2ADDR      00:vv:ww:xx:yy:8c
-#endif
-
-#define CONFIG_SERVERIP                YourServerIP
-#define CONFIG_IPADDR          YourTargetIP
-#define CONFIG_GATEWAYIP       YourGatewayIP
-#define CONFIG_NETMASK         255.255.255.0
-#define CONFIG_HOSTNAME                SBC8560
-#define CONFIG_ROOTPATH                YourRootPath
-#define CONFIG_BOOTFILE                YourImageName
-
-#endif /* __CONFIG_H */
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
 
diff --git a/include/configs/acadia.h b/include/configs/acadia.h
new file mode 100644 (file)
index 0000000..c72d933
--- /dev/null
@@ -0,0 +1,411 @@
+/*
+ * (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
+ */
+
+/************************************************************************
+ * acadia.h - configuration for AMCC Acadia (405EZ)
+ ***********************************************************************/
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*-----------------------------------------------------------------------
+ * High Level Configuration Options
+ *----------------------------------------------------------------------*/
+#define CONFIG_ACADIA          1               /* Board is Acadia      */
+#define CONFIG_4xx             1               /* ... PPC4xx family    */
+#define CONFIG_405EZ           1               /* Specifc 405EZ support*/
+/* Detect Acadia PLL input clock automatically via CPLD bit            */
+#define CONFIG_SYS_CLK_FREQ    ((in8(CFG_CPLD_BASE + 0) == 0x0c) ? \
+                               66666666 : 33333000)
+
+#define CONFIG_BOARD_EARLY_INIT_F 1            /* Call board_early_init_f */
+#define CONFIG_MISC_INIT_F     1               /* Call misc_init_f     */
+
+#define CONFIG_NO_SERIAL_EEPROM
+/*#undef CONFIG_NO_SERIAL_EEPROM*/
+
+#ifdef CONFIG_NO_SERIAL_EEPROM
+/*----------------------------------------------------------------------------
+ * PLL settings for 266MHz CPU, 133MHz PLB/SDRAM, 66MHz EBC, 33MHz PCI,
+ * assuming a 66MHz input clock to the 405EZ.
+ *---------------------------------------------------------------------------*/
+/* #define PLLMR0_100_100_12 */
+#define PLLMR0_200_133_66
+/* #define PLLMR0_266_160_80 */
+/* #define PLLMR0_333_166_83 */
+#endif
+
+/*-----------------------------------------------------------------------
+ * 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 Monitor       */
+#define CFG_MALLOC_LEN         (512 * 1024)/* Reserve 512 kB for malloc()      */
+
+#define CFG_SDRAM_BASE         0x00000000
+#define CFG_FLASH_BASE         0xfe000000
+#define CFG_MONITOR_BASE       TEXT_BASE
+#define CFG_CPLD_BASE          0x80000000
+#define CFG_NAND_ADDR          0xd0000000
+#define CFG_USB_HOST           0xef603000      /* USB OHCI 1.1 controller      */
+
+/*-----------------------------------------------------------------------
+ * Initial RAM & stack pointer
+ *----------------------------------------------------------------------*/
+#define CFG_TEMP_STACK_OCM     1               /* OCM as init ram      */
+
+/* On Chip Memory location */
+#define CFG_OCM_DATA_ADDR      0xF8000000
+#define CFG_OCM_DATA_SIZE      0x4000                  /* 16K of onchip SRAM           */
+#define CFG_INIT_RAM_ADDR      CFG_OCM_DATA_ADDR       /* inside of SRAM               */
+#define CFG_INIT_RAM_END       CFG_OCM_DATA_SIZE       /* End of used area in RAM      */
+
+#define CFG_GBL_DATA_SIZE      128                     /* size 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
+
+/*-----------------------------------------------------------------------
+ * Serial Port
+ *----------------------------------------------------------------------*/
+#undef CFG_EXT_SERIAL_CLOCK                    /* external serial clock */
+#define CFG_BASE_BAUD          691200
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_SERIAL_MULTI     1
+
+/* The following table includes the supported baudrates */
+#define CFG_BAUDRATE_TABLE     \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}
+
+/*-----------------------------------------------------------------------
+ * Environment
+ *----------------------------------------------------------------------*/
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+#define CFG_ENV_IS_IN_FLASH     1      /* use FLASH for environment vars       */
+#else
+#define CFG_ENV_IS_IN_NAND     1       /* use NAND for environment vars        */
+#define CFG_ENV_IS_EMBEDDED    1       /* use embedded environment */
+#endif
+
+/*-----------------------------------------------------------------------
+ * FLASH related
+ *----------------------------------------------------------------------*/
+#define CFG_FLASH_CFI                  /* The flash is CFI compatible  */
+#define CFG_FLASH_CFI_DRIVER           /* Use common CFI driver        */
+
+#define CFG_FLASH_BANKS_LIST    {CFG_FLASH_BASE}
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks           */
+#define CFG_MAX_FLASH_SECT     512     /* max number of sectors on one chip    */
+
+#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_FLASH_USE_BUFFER_WRITE 1   /* use buffered writes (20x faster)     */
+#define CFG_FLASH_EMPTY_INFO           /* print 'E' for empty sector on flinfo */
+
+#ifdef CFG_ENV_IS_IN_FLASH
+#define CFG_ENV_SECT_SIZE      0x40000 /* size of one complete sector  */
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE)
+#define        CFG_ENV_SIZE            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)
+#endif
+
+/*-----------------------------------------------------------------------
+ * RAM (CRAM)
+ *----------------------------------------------------------------------*/
+#define CFG_MBYTES_RAM         64              /* 64MB                 */
+
+/*-----------------------------------------------------------------------
+ * I2C
+ *----------------------------------------------------------------------*/
+#define CONFIG_HARD_I2C                1               /* I2C with hardware support    */
+#undef CONFIG_SOFT_I2C                         /* I2C bit-banged               */
+#define CFG_I2C_SPEED          400000          /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+
+#define CFG_I2C_MULTI_EEPROMS
+#define CFG_I2C_EEPROM_ADDR    (0xa8>>1)
+#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 SYSMON (LM75, AD7414 is almost compatible)                      */
+#define CONFIG_DTT_LM75                1               /* ON Semi's LM75       */
+#define CONFIG_DTT_AD7414      1               /* use AD7414           */
+#define CONFIG_DTT_SENSORS     {0}             /* Sensor addresses     */
+#define CFG_DTT_MAX_TEMP       70
+#define CFG_DTT_LOW_TEMP       -30
+#define CFG_DTT_HYSTERESIS     3
+
+#if 0 /* test-only... */
+/*-----------------------------------------------------------------------
+ * SPI stuff - Define to include SPI control
+ *-----------------------------------------------------------------------
+ */
+#define CONFIG_SPI
+#endif
+
+/*-----------------------------------------------------------------------
+ * Ethernet
+ *----------------------------------------------------------------------*/
+#define CONFIG_MII             1       /* MII PHY management           */
+#define        CONFIG_PHY_ADDR         0       /* PHY address                  */
+#define CONFIG_NET_MULTI       1
+#define CFG_RX_ETH_BUFFER      16      /* # of rx buffers & descriptors*/
+
+#define CONFIG_NETCONSOLE              /* include NetConsole support   */
+
+#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=acadia\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=acadia/uImage\0"                                      \
+       "kernel_addr=fff10000\0"                                        \
+       "ramdisk_addr=fff20000\0"                                       \
+       "initrd_high=30000000\0"                                        \
+       "load=tftp 200000 acadia/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"
+
+#if 0
+#define CONFIG_BOOTDELAY       -1      /* autoboot disabled            */
+#else
+#define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds     */
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
+
+#define CONFIG_USB_OHCI
+#define CONFIG_USB_STORAGE
+
+/* Partitions */
+#define CONFIG_MAC_PARTITION
+#define CONFIG_DOS_PARTITION
+#define CONFIG_ISO_PARTITION
+
+#define CONFIG_SUPPORT_VFAT
+
+#define CONFIG_COMMANDS       (CONFIG_CMD_DFL  |       \
+                              CFG_CMD_ASKENV   |       \
+                              CFG_CMD_DHCP     |       \
+                              CFG_CMD_DTT      |       \
+                              CFG_CMD_DIAG     |       \
+                              CFG_CMD_EEPROM   |       \
+                              CFG_CMD_ELF      |       \
+                              CFG_CMD_FAT      |       \
+                              CFG_CMD_I2C      |       \
+                              CFG_CMD_IRQ      |       \
+                              CFG_CMD_MII      |       \
+                              CFG_CMD_NAND     |       \
+                              CFG_CMD_NET      |       \
+                              CFG_CMD_NFS      |       \
+                              CFG_CMD_PCI      |       \
+                              CFG_CMD_PING     |       \
+                              CFG_CMD_REGINFO  |       \
+                              CFG_CMD_USB)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#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 */
+
+/*
+ * 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 */
+
+/*-----------------------------------------------------------------------
+ * NAND FLASH
+ *----------------------------------------------------------------------*/
+#define CFG_MAX_NAND_DEVICE    1
+#define NAND_MAX_CHIPS         1
+#define CFG_NAND_BASE          (CFG_NAND_ADDR + CFG_NAND_CS)
+#define CFG_NAND_SELECT_DEVICE  1      /* nand driver supports mutipl. chips   */
+
+/*-----------------------------------------------------------------------
+ * Cache Configuration
+ */
+#define CFG_DCACHE_SIZE                16384           /* For AMCC 405EZ CPU           */
+#define CFG_CACHELINE_SIZE     32              /* ...                          */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5               /* log base 2 of the above value*/
+#endif
+
+/*-----------------------------------------------------------------------
+ * External Bus Controller (EBC) Setup
+ *----------------------------------------------------------------------*/
+#define CFG_NAND_CS            3               /* NAND chip connected to CSx   */
+
+/* Memory Bank 0 (Flash) initialization                                                */
+#define CFG_EBC_PB0AP          0x03337200
+#define CFG_EBC_PB0CR          0xfe0bc000
+
+/* Just initial configuration for CRAM. Will be changed in memory.c to sync mode*/
+/* Memory Bank 1 (CRAM) initialization                                         */
+#define CFG_EBC_PB1AP          0x030400c0
+#define CFG_EBC_PB1CR          0x000bc000
+
+/* Memory Bank 2 (CRAM) initialization                                         */
+#define CFG_EBC_PB2AP          0x030400c0
+#define CFG_EBC_PB2CR          0x020bc000
+
+/* Memory Bank 3 (NAND-FLASH) initialization                                   */
+#define CFG_EBC_PB3AP          0x018003c0
+#define CFG_EBC_PB3CR          (CFG_NAND_ADDR | 0x1c000)
+
+/* Memory Bank 4 (CPLD) initialization                                         */
+#define CFG_EBC_PB4AP          0x04006000
+#define CFG_EBC_PB4CR          (CFG_CPLD_BASE | 0x18000)
+
+#define CFG_EBC_CFG            0xf8400000
+
+/*-----------------------------------------------------------------------
+ * GPIO Setup
+ *----------------------------------------------------------------------*/
+#define CFG_GPIO_CRAM_CLK      8
+#define CFG_GPIO_CRAM_WAIT     9
+#define CFG_GPIO_CRAM_ADV      10
+#define CFG_GPIO_CRAM_CRE      (32 + 21)
+
+/*-----------------------------------------------------------------------
+ * Definitions for GPIO_0 setup (PPC405EZ specific)
+ *
+ * GPIO0[0-2]  - External Bus Controller CS_4 - CS_6 Outputs
+ * GPIO0[3]    - NAND FLASH Controller CE3 (NFCE3) Output
+ * GPIO0[4]    - External Bus Controller Hold Input
+ * GPIO0[5]    - External Bus Controller Priority Input
+ * GPIO0[6]    - External Bus Controller HLDA Output
+ * GPIO0[7]    - External Bus Controller Bus Request Output
+ * GPIO0[8]    - CRAM Clk Output
+ * GPIO0[9]    - External Bus Controller Ready Input
+ * GPIO0[10]   - CRAM Adv Output
+ * GPIO0[11-24]        - NAND Flash Control Data -> Bypasses GPIO when enabled
+ * GPIO0[25]   - External DMA Request Input
+ * GPIO0[26]   - External DMA EOT I/O
+ * GPIO0[25]   - External DMA Ack_n Output
+ * GPIO0[17-23]        - External Interrupts IRQ0 - IRQ6 inputs
+ * GPIO0[28-30]        - Trace Outputs / PWM Inputs
+ * GPIO0[31]   - PWM_8 I/O
+ */
+#define CFG_GPIO0_TCR          0xC0000000
+#define CFG_GPIO0_OSRL         0x50000000
+#define CFG_GPIO0_OSRH         0x02000055
+#define CFG_GPIO0_ISR1L                0x00000000
+#define CFG_GPIO0_ISR1H                0x00000055
+#define CFG_GPIO0_TSRL         0x02000000
+#define CFG_GPIO0_TSRH         0x00000055
+
+/*-----------------------------------------------------------------------
+ * Definitions for GPIO_1 setup (PPC405EZ specific)
+ *
+ * GPIO1[0-6]  - PWM_9 to PWM_15 I/O
+ * GPIO1[7]    - PWM_DIV_CLK (Out) / IRQ4 Input
+ * GPIO1[8]    - TS5 Output / DAC_IP_TRIG Input
+ * GPIO1[9]    - TS6 Output / ADC_IP_TRIG Input
+ * GPIO1[10-12]        - UART0 Control Inputs
+ * GPIO1[13]   - UART0_DTR_N Output/IEEE_1588_TS Output/TMRCLK Input
+ * GPIO1[14]   - UART0_RTS_N Output/SPI_SS_2_N Output
+ * GPIO1[15]   - SPI_SS_3_N Output/UART0_RI_N Input
+ * GPIO1[16]   - SPI_SS_1_N Output
+ * GPIO1[17-20]        - Trace Output/External Interrupts IRQ0 - IRQ3 inputs
+ */
+#define CFG_GPIO1_OSRH         0x55455555
+#define CFG_GPIO1_OSRL         0x40000110
+#define CFG_GPIO1_ISR1H                0x00000000
+#define CFG_GPIO1_ISR1L                0x15555445
+#define CFG_GPIO1_TSRH         0x00000000
+#define CFG_GPIO1_TSRL         0x00000000
+#define CFG_GPIO1_TCR          0xFFFF8014
+
+/*
+ * 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 49027da5a491d877c6a98fe65744940041680829..67f62d3dfbe4ad2979b34f3a9266c548faa43d1b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
 #define CFG_EEPROM_PAGE_WRITE_ENABLE
 
 #define CONFIG_PREBOOT "echo;" \
-       "echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \
+       "echo Type \"run kernelx\" to boot the system;"                 \
        "echo"
 
 #undef CONFIG_BOOTARGS
        "netdev=eth3\0"                                                 \
        "hostname=alpr\0"                                               \
        "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
-               "nfsroot=${serverip}:${rootpath}\0"                     \
+               "nfsroot=${serverip}:${rootpath} ${init}\0"             \
        "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
        "addip=setenv bootargs ${bootargs} "                            \
                "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
        "ethact=ppc_4xx_eth3\0"                                         \
        "autoload=no\0"                                                 \
        "ipconfig=dhcp;setenv serverip 11.0.0.152\0"                    \
-       "actkernel=kernel2\0"                                           \
        "load_fpga=fpga load 0 ffe00000 10dd9a\0"                       \
        "mtdargs=setenv bootargs root=/dev/mtdblock6 rw "               \
                "rootfstype=jffs2 init=/sbin/init\0"                    \
                ";bootm 200000\0"                                       \
        "kernel2_mtd=nand read 200000 200000 200000;run mtdargs addip " \
                "addtty;bootm 200000\0"                                 \
-       "kernel1=run ipconfig load_fpga kernel1_mtd\0"                  \
-       "kernel2=run ipconfig load_fpga kernel2_mtd\0"                  \
+       "kernel1=setenv actkernel 'kernel1';run load_fpga "             \
+               "kernel1_mtd\0"                                         \
+       "kernel2=setenv actkernel 'kernel2';run load_fpga "             \
+               "kernel2_mtd\0"                                         \
        ""
 
 #define CONFIG_BOOTCOMMAND     "run kernel2"
 #define CFG_MAXARGS    16              /* max number of command args   */
 #define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
 
+#define CFG_ALT_MEMTEST                1       /* Enable more extensive memtest*/
 #define CFG_MEMTEST_START      0x0400000       /* memtest works on     */
 #define CFG_MEMTEST_END                0x0C00000       /* 4 ... 12 MB in DRAM  */
 
index 458ebabeb9a217946d39d057ed6b84a72a63126a..beaf3851dc8ece66173b667179b36ab03a820e6d 100644 (file)
  */
 #define CFG_PLL0_OPT                   0x04
 
-#define CFG_USART1                     1
-
-#define CFG_CONSOLE_UART_DEV           DEVICE_USART1
+#undef CONFIG_USART0
+#define CONFIG_USART1                  1
+#undef CONFIG_USART2
+#undef CONFIG_USART3
 
 /* User serviceable stuff */
+#define CONFIG_DOS_PARTITION           1
+
 #define CONFIG_CMDLINE_TAG             1
 #define CONFIG_SETUP_MEMORY_TAGS       1
 #define CONFIG_INITRD_TAG              1
 
 #define CONFIG_BAUDRATE                        115200
 #define CONFIG_BOOTARGS                                                        \
-       "console=ttyUS0 root=/dev/mtdblock1 fbmem=600k"
+       "console=ttyS0 root=/dev/mtdblock1 rootfstype=jffs2 fbmem=600k"
+
+#define CONFIG_BOOTCOMMAND                                             \
+       "fsload; bootm $(fileaddr)"
+
+/*
+ * Only interrupt autoboot if <space> is pressed. Otherwise, garbage
+ * data on the serial line may interrupt the boot sequence.
+ */
+#define CONFIG_BOOTDELAY               2
+#define CONFIG_AUTOBOOT                        1
+#define CONFIG_AUTOBOOT_KEYED          1
+#define CONFIG_AUTOBOOT_PROMPT                         \
+       "Press SPACE to abort autoboot in %d seconds\n"
+#define CONFIG_AUTOBOOT_DELAY_STR      "d"
+#define CONFIG_AUTOBOOT_STOP_STR       " "
+
+/*
+ * These are "locally administered ethernet addresses" generated by
+ * ./tools/gen_eth_addr
+ *
+ * After booting the board for the first time, new addresses should be
+ * generated and assigned to the environment variables "ethaddr" and
+ * "eth1addr".
+ */
+#define CONFIG_ETHADDR                 "6a:87:71:14:cd:cb"
+#define CONFIG_ETH1ADDR                        "ca:f8:15:e6:3e:e6"
+#define CONFIG_OVERWRITE_ETHADDR_ONCE  1
+#define CONFIG_NET_MULTI               1
+
+#define CONFIG_BOOTP_MASK              (CONFIG_BOOTP_SUBNETMASK        \
+                                        | CONFIG_BOOTP_GATEWAY)
 
 #define CONFIG_COMMANDS                        (CFG_CMD_BDI                    \
                                         | CFG_CMD_LOADS                \
                                         | CFG_CMD_LOADB                \
-                                        /* | CFG_CMD_IMI */            \
+                                        | CFG_CMD_IMI                  \
                                         /* | CFG_CMD_CACHE */          \
                                         | CFG_CMD_FLASH                \
                                         | CFG_CMD_MEMORY               \
-                                        /* | CFG_CMD_NET */            \
+                                        | CFG_CMD_NET                  \
                                         | CFG_CMD_ENV                  \
                                         /* | CFG_CMD_IRQ */            \
                                         | CFG_CMD_BOOTD                \
                                         /* | CFG_CMD_I2C */            \
                                         | CFG_CMD_REGINFO              \
                                         /* | CFG_CMD_DATE */           \
-                                        /* | CFG_CMD_DHCP */           \
+                                        | CFG_CMD_DHCP                 \
                                         /* | CFG_CMD_AUTOSCRIPT */     \
                                         /* | CFG_CMD_MII */            \
                                         | CFG_CMD_MISC                 \
                                         /* | CFG_CMD_SAVES */          \
                                         /* | CFG_CMD_SPI */            \
                                         /* | CFG_CMD_PING */           \
-                                        /* | CFG_CMD_MMC */            \
-                                        /* | CFG_CMD_FAT */            \
-                                        /* | CFG_CMD_IMLS */           \
+                                        | CFG_CMD_MMC                  \
+                                        | CFG_CMD_FAT                  \
+                                        | CFG_CMD_IMLS                 \
                                         /* | CFG_CMD_ITEST */          \
-                                        /* | CFG_CMD_EXT2 */           \
+                                        | CFG_CMD_EXT2                 \
+                                        | CFG_CMD_JFFS2                \
                )
 
 #include <cmd_confdefs.h>
 
 #define CONFIG_ATMEL_USART             1
+#define CONFIG_MACB                    1
 #define CONFIG_PIO2                    1
 #define CFG_NR_PIOS                    5
 #define CFG_HSDRAMC                    1
+#define CONFIG_MMC                     1
 
 #define CFG_DCACHE_LINESZ              32
 #define CFG_ICACHE_LINESZ              32
 #define CFG_INIT_SP_ADDR               (CFG_INTRAM_BASE + CFG_INTRAM_SIZE)
 
 #define CFG_MALLOC_LEN                 (256*1024)
-#define CFG_MALLOC_END                                                 \
-       ({                                                              \
-               DECLARE_GLOBAL_DATA_PTR;                                \
-               CFG_SDRAM_BASE + gd->sdram_size;                        \
-       })
-#define CFG_MALLOC_START               (CFG_MALLOC_END - CFG_MALLOC_LEN)
-
 #define CFG_DMA_ALLOC_LEN              (16384)
-#define CFG_DMA_ALLOC_END              (CFG_MALLOC_START)
-#define CFG_DMA_ALLOC_START            (CFG_DMA_ALLOC_END - CFG_DMA_ALLOC_LEN)
+
 /* Allow 2MB for the kernel run-time image */
 #define CFG_LOAD_ADDR                  (CFG_SDRAM_BASE + 0x00200000)
 #define CFG_BOOTPARAMS_LEN             (16 * 1024)
index 4961011b5cd631712f7f0df9aca56c1e076b1db9..db58a9fa74a204f2f7b14d02690962b5cd2c42dd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2005-2006
+ * (C) Copyright 2005-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
@@ -43,7 +43,6 @@
  * 2nd ethernet port you have to "undef" the following define.
  */
 #define CONFIG_BAMBOO_NAND      1       /* enable nand flash support    */
-#define CFG_NAND_LEGACY
 
 /*-----------------------------------------------------------------------
  * Base addresses -- Note these are effective addresses where the
 #endif /* CFG_ENV_IS_IN_FLASH */
 
 /*-----------------------------------------------------------------------
- * NAND-FLASH related
+ * NAND FLASH
  *----------------------------------------------------------------------*/
-#define NAND_CMD_REG   (0x00) /* NandFlash Command Register */
-#define NAND_ADDR_REG  (0x04) /* NandFlash Address Register */
-#define NAND_DATA_REG  (0x08) /* NandFlash Data Register */
-#define NAND_ECC0_REG  (0x10) /* NandFlash ECC Register0 */
-#define NAND_ECC1_REG  (0x14) /* NandFlash ECC Register1 */
-#define NAND_ECC2_REG  (0x18) /* NandFlash ECC Register2 */
-#define NAND_ECC3_REG  (0x1C) /* NandFlash ECC Register3 */
-#define NAND_ECC4_REG  (0x20) /* NandFlash ECC Register4 */
-#define NAND_ECC5_REG  (0x24) /* NandFlash ECC Register5 */
-#define NAND_ECC6_REG  (0x28) /* NandFlash ECC Register6 */
-#define NAND_ECC7_REG  (0x2C) /* NandFlash ECC Register7 */
-#define NAND_CR0_REG   (0x30) /* NandFlash Device Bank0 Config Register */
-#define NAND_CR1_REG   (0x34) /* NandFlash Device Bank1 Config Register */
-#define NAND_CR2_REG   (0x38) /* NandFlash Device Bank2 Config Register */
-#define NAND_CR3_REG   (0x3C) /* NandFlash Device Bank3 Config Register */
-#define NAND_CCR_REG   (0x40) /* NandFlash Core Configuration Register */
-#define NAND_STAT_REG  (0x44) /* NandFlash Device Status Register */
-#define NAND_HWCTL_REG (0x48) /* NandFlash Direct Hwd Control Register */
-#define NAND_REVID_REG (0x50) /* NandFlash Core Revision Id Register */
-
-/* Nand Flash K9F1208U0A Command Set => Nand Flash 0 */
-#define NAND0_CMD_READ1_HALF1     0x00     /* Starting addr for 1rst half of registers */
-#define NAND0_CMD_READ1_HALF2     0x01     /* Starting addr for 2nd half of registers */
-#define NAND0_CMD_READ2           0x50
-#define NAND0_CMD_READ_ID         0x90
-#define NAND0_CMD_READ_STATUS     0x70
-#define NAND0_CMD_RESET           0xFF
-#define NAND0_CMD_PAGE_PROG       0x80
-#define NAND0_CMD_PAGE_PROG_TRUE  0x10
-#define NAND0_CMD_PAGE_PROG_DUMMY 0x11
-#define NAND0_CMD_BLOCK_ERASE     0x60
-#define NAND0_CMD_BLOCK_ERASE_END 0xD0
-
-#define CFG_MAX_NAND_DEVICE     1      /* Max number of NAND devices */
-#define SECTORSIZE              512
-
-#define ADDR_COLUMN             1
-#define ADDR_PAGE               2
-#define ADDR_COLUMN_PAGE        3
-
-#define NAND_ChipID_UNKNOWN     0x00
-#define NAND_MAX_FLOORS         1
-#define NAND_MAX_CHIPS          1
-
-#define WRITE_NAND_COMMAND(d, adr) do {*(volatile u8 *)((ulong)adr+NAND_CMD_REG) = d;} while(0)
-#define WRITE_NAND_ADDRESS(d, adr) do {*(volatile u8 *)((ulong)adr+NAND_ADDR_REG) = d;} while(0)
-#define WRITE_NAND(d, adr)      do {*(volatile u8 *)((ulong)adr+NAND_DATA_REG) = d;} while(0)
-#define READ_NAND(adr)          (*(volatile u8 *)((ulong)adr+NAND_DATA_REG))
-#define NAND_WAIT_READY(nand)   while (!(*(volatile u8 *)((ulong)nand->IO_ADDR+NAND_STAT_REG) & 0x01))
-
-/* not needed with 440EP NAND controller */
-#define NAND_CTL_CLRALE(nandptr)
-#define NAND_CTL_SETALE(nandptr)
-#define NAND_CTL_CLRCLE(nandptr)
-#define NAND_CTL_SETCLE(nandptr)
-#define NAND_DISABLE_CE(nand)
-#define NAND_ENABLE_CE(nand)
+#define CFG_MAX_NAND_DEVICE    1
+#define NAND_MAX_CHIPS         1
+#define CFG_NAND_CS            1
+#define CFG_NAND_BASE          (CFG_NAND_ADDR + CFG_NAND_CS)
+#define CFG_NAND_SELECT_DEVICE  1      /* nand driver supports mutipl. chips   */
 
 /*-----------------------------------------------------------------------
  * DDR SDRAM
        "bootfile=/tftpboot/bamboo/uImage\0"                            \
        "kernel_addr=fff00000\0"                                        \
        "ramdisk_addr=fff10000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/bamboo/u-boot.bin\0"                \
        "update=protect off fffa0000 ffffffff;era fffa0000 ffffffff;"   \
                "cp.b 100000 fffa0000 60000;"                           \
diff --git a/include/configs/bf533-ezkit.h b/include/configs/bf533-ezkit.h
new file mode 100644 (file)
index 0000000..65dfc81
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * U-boot - Configuration file for BF533 EZKIT board
+ */
+
+#ifndef __CONFIG_EZKIT533_H__
+#define __CONFIG_EZKIT533_H__
+
+#define CONFIG_BAUDRATE                57600
+#define CONFIG_STAMP           1
+
+#define CONFIG_BOOTDELAY       5
+#define CFG_AUTOLOAD           "no"    /*rarpb, bootp or dhcp commands will perform only a */
+
+#define CFG_LONGHELP           1
+#define CONFIG_CMDLINE_EDITING 1
+#define CONFIG_LOADADDR                0x01000000      /* default load address */
+#define CONFIG_BOOTCOMMAND     "tftp $(loadaddr) linux"
+/* #define CONFIG_BOOTARGS             "root=/dev/mtdblock0 rw" */
+
+#define CONFIG_DRIVER_SMC91111 1
+#define CONFIG_SMC91111_BASE   0x20310300
+
+#if 0
+#define        CONFIG_MII
+#define CFG_DISCOVER_PHY
+#endif
+
+#define CONFIG_RTC_BFIN                1
+#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, currently its disabled */
+
+/*
+ * Boot Mode Set
+ * Blackfin can support several boot modes
+ */
+#define BF533_BYPASS_BOOT      0x0001  /* Bootmode 0: Execute from 16-bit externeal memory ( bypass BOOT ROM) */
+#define BF533_PARA_BOOT                0x0002  /* Bootmode 1: Boot from 8-bit or 16-bit flash */
+#define BF533_SPI_BOOT         0x0004  /* Bootmode 3: Boot from SPI flash */
+/* Define the boot mode */
+#define BFIN_BOOT_MODE         BF533_BYPASS_BOOT
+/* #define BFIN_BOOT_MODE      BF533_SPI_BOOT */
+
+#define CONFIG_PANIC_HANG 1
+
+#define ADSP_BF531             0x31
+#define ADSP_BF532             0x32
+#define ADSP_BF533             0x33
+#define BFIN_CPU               ADSP_BF533
+
+/* This sets the default state of the cache on U-Boot's boot */
+#define CONFIG_ICACHE_ON
+#define CONFIG_DCACHE_ON
+
+/* Define where the uboot will be loaded by on-chip boot rom */
+#define APP_ENTRY 0x00001000
+
+/* CONFIG_CLKIN_HZ is any value in Hz                          */
+#define CONFIG_CLKIN_HZ                27000000
+/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN    */
+/*                                                 1=CLKIN/2   */
+#define CONFIG_CLKIN_HALF      0
+/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass        */
+/*                                              1=bypass PLL   */
+#define CONFIG_PLL_BYPASS      0
+/* CONFIG_VCO_MULT controls what the multiplier of the PLL is. */
+/* Values can range from 1-64                                  */
+#define CONFIG_VCO_MULT                22
+/* CONFIG_CCLK_DIV controls what the core clock divider is     */
+/* Values can be 1, 2, 4, or 8 ONLY                            */
+#define CONFIG_CCLK_DIV                1
+/* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
+/* Values can range from 1-15                                  */
+#define CONFIG_SCLK_DIV                5
+/* CONFIG_SPI_BAUD controls the SPI peripheral clock divider   */
+/* Values can range from 2-65535                               */
+/* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD)                        */
+#define CONFIG_SPI_BAUD                2
+#define CONFIG_SPI_BAUD_INITBLOCK      4
+
+#if ( CONFIG_CLKIN_HALF == 0 )
+#define CONFIG_VCO_HZ          ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
+#else
+#define CONFIG_VCO_HZ          (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
+#endif
+
+#if (CONFIG_PLL_BYPASS == 0)
+#define CONFIG_CCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
+#define CONFIG_SCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
+#else
+#define CONFIG_CCLK_HZ         CONFIG_CLKIN_HZ
+#define CONFIG_SCLK_HZ         CONFIG_CLKIN_HZ
+#endif
+
+#define CONFIG_MEM_SIZE                32      /* 128, 64, 32, 16 */
+#define CONFIG_MEM_ADD_WDTH    9       /* 8, 9, 10, 11    */
+#define CONFIG_MEM_MT48LC16M16A2TG_75  1
+
+#define CONFIG_LOADS_ECHO      1
+
+
+#define CONFIG_COMMANDS                        (CONFIG_CMD_DFL | \
+                                        CFG_CMD_PING   | \
+                                        CFG_CMD_ELF    | \
+                                        CFG_CMD_I2C    | \
+                                        CFG_CMD_JFFS2  | \
+                                        CFG_CMD_DATE)
+#define CONFIG_BOOTARGS "root=/dev/mtdblock0 ip=192.168.0.15:192.168.0.2:192.168.0.1:255.255.255.0:ezkit:eth0:off console=ttyBF0,57600"
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define        CFG_PROMPT              "ezkit> "       /* 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      0x00000000      /* memtest works on */
+#define CFG_MEMTEST_END                ( (CONFIG_MEM_SIZE - 1) * 1024 * 1024)  /* 1 ... 31 MB in DRAM */
+#define        CFG_LOAD_ADDR           0x01000000      /* default load address */
+#define        CFG_HZ                  1000    /* decrementer freq: 10 ms ticks */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+#define        CFG_SDRAM_BASE          0x00000000
+#define CFG_MAX_RAM_SIZE       (CONFIG_MEM_SIZE * 1024 * 1024)
+#define CFG_FLASH_BASE         0x20000000
+
+#define        CFG_MONITOR_LEN         (256 << 10)     /* Reserve 256 kB for Monitor   */
+#define CFG_MONITOR_BASE       (CFG_MAX_RAM_SIZE - CFG_MONITOR_LEN)
+#define        CFG_MALLOC_LEN          (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+#define CFG_GBL_DATA_SIZE      0x4000
+#define CFG_GBL_DATA_ADDR      (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
+#define CONFIG_STACKBASE       (CFG_GBL_DATA_ADDR  - 4)
+
+#define        CFG_BOOTMAPSZ           (8 << 20)       /* Initial Memory map for Linux */
+#define CFG_FLASH0_BASE                0x20000000
+#define CFG_FLASH1_BASE                0x20200000
+#define CFG_FLASH2_BASE                0x20280000
+#define CFG_MAX_FLASH_BANKS    3       /* max number of memory banks */
+#define CFG_MAX_FLASH_SECT     40      /* max number of sectors on one chip */
+
+#define        CFG_ENV_IS_IN_FLASH     1
+#define CFG_ENV_ADDR           0x20020000
+#define        CFG_ENV_SECT_SIZE       0x10000 /* Total Size of Environment Sector */
+
+/* JFFS Partition offset set  */
+#define CFG_JFFS2_FIRST_BANK   0
+#define CFG_JFFS2_NUM_BANKS    1
+/* 512k reserved for u-boot */
+#define CFG_JFFS2_FIRST_SECTOR 11
+
+
+/*
+ * Stack sizes
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+
+#define POLL_MODE              1
+#define FLASH_TOT_SECT         40
+#define FLASH_SIZE             0x220000
+#define CFG_FLASH_SIZE         0x220000
+
+/*
+ * Initialize PSD4256 registers for using I2C
+ */
+#define        CONFIG_MISC_INIT_R
+
+/*
+ * I2C settings
+ * By default PF1 is used as SDA and PF0 as SCL on the Stamp board
+ */
+#define CONFIG_SOFT_I2C                1       /* I2C bit-banged */
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define PF_SCL                 PF0
+#define PF_SDA                 PF1
+
+#define I2C_INIT               (*pFIO_DIR |=  PF_SCL); asm("ssync;")
+#define I2C_ACTIVE             (*pFIO_DIR |=  PF_SDA); *pFIO_INEN &= ~PF_SDA; asm("ssync;")
+#define I2C_TRISTATE           (*pFIO_DIR &= ~PF_SDA); *pFIO_INEN |= PF_SDA; asm("ssync;")
+#define I2C_READ               ((volatile)(*pFIO_FLAG_D & PF_SDA) != 0); asm("ssync;")
+#define I2C_SDA(bit)   if(bit) { \
+                               *pFIO_FLAG_S = PF_SDA; \
+                               asm("ssync;"); \
+                               } \
+                       else    { \
+                               *pFIO_FLAG_C = PF_SDA; \
+                               asm("ssync;"); \
+                               }
+#define I2C_SCL(bit)   if(bit) { \
+                               *pFIO_FLAG_S = PF_SCL; \
+                               asm("ssync;"); \
+                               } \
+                       else    { \
+                               *pFIO_FLAG_C = PF_SCL; \
+                               asm("ssync;"); \
+                               }
+#define I2C_DELAY      udelay(5)       /* 1/4 I2C clock duration */
+
+#define CFG_I2C_SPEED          50000
+#define CFG_I2C_SLAVE          0xFE
+
+#define CFG_BOOTM_LEN          0x4000000       /* Large Image Length, set to 64 Meg */
+
+/* 0xFF, 0x7BB07BB0, 0x22547BB0 */
+/* #define AMGCTLVAL           (AMBEN_P0 | AMBEN_P1 | AMBEN_P2 | AMCKEN)
+#define AMBCTL0VAL             (B1WAT_7 | B1RAT_11 | B1HT_2 | B1ST_3 | B1TT_4 | ~B1RDYPOL | \
+                               ~B1RDYEN | B0WAT_7 | B0RAT_11 | B0HT_2 | B0ST_3 | B0TT_4 | ~B0RDYPOL | ~B0RDYEN)
+#define AMBCTL1VAL             (B3WAT_2 | B3RAT_2 | B3HT_1 | B3ST_1 | B3TT_4 | B3RDYPOL | ~B3RDYEN | \
+                               B2WAT_7 | B2RAT_11 | B2HT_2 | B2ST_3 | B2TT_4 | ~B2RDYPOL | ~B2RDYEN)
+*/
+#define AMGCTLVAL              0xFF
+#define AMBCTL0VAL             0x7BB07BB0
+#define AMBCTL1VAL             0xFFC27BB0
+
+#define CONFIG_VDSP            1
+
+#ifdef CONFIG_VDSP
+#define ET_EXEC_VDSP           0x8
+#define SHT_STRTAB_VDSP                0x1
+#define ELFSHDRSIZE_VDSP       0x2C
+#define VDSP_ENTRY_ADDR                0xFFA00000
+#endif
+
+#endif
diff --git a/include/configs/bf533-stamp.h b/include/configs/bf533-stamp.h
new file mode 100644 (file)
index 0000000..79a1404
--- /dev/null
@@ -0,0 +1,467 @@
+/*
+ * U-boot - Configuration file for BF533 STAMP board
+ */
+
+#ifndef __CONFIG_STAMP_H__
+#define __CONFIG_STAMP_H__
+
+#define CONFIG_STAMP                   1
+#define CONFIG_RTC_BFIN                        1
+#define CONFIG_BF533                   1
+/*
+ * Boot Mode Set
+ * Blackfin can support several boot modes
+ */
+#define BF533_BYPASS_BOOT      0x0001  /* Bootmode 0: Execute from 16-bit externeal memory ( bypass BOOT ROM) */
+#define BF533_PARA_BOOT                0x0002  /* Bootmode 1: Boot from 8-bit or 16-bit flash */
+#define BF533_SPI_BOOT         0x0004  /* Bootmode 3: Boot from SPI flash */
+/* Define the boot mode */
+#define BFIN_BOOT_MODE         BF533_BYPASS_BOOT
+/* #define BFIN_BOOT_MODE      BF533_SPI_BOOT */
+
+#define CONFIG_PANIC_HANG 1
+
+#define ADSP_BF531             0x31
+#define ADSP_BF532             0x32
+#define ADSP_BF533             0x33
+#define BFIN_CPU               ADSP_BF533
+
+/* This sets the default state of the cache on U-Boot's boot */
+#define CONFIG_ICACHE_ON
+#define CONFIG_DCACHE_ON
+
+/* Define where the uboot will be loaded by on-chip boot rom */
+#define APP_ENTRY 0x00001000
+
+/*
+ * Stringize definitions - needed for environmental settings
+ */
+#define STRINGIZE2(x) #x
+#define STRINGIZE(x) STRINGIZE2(x)
+
+/*
+ * Board settings
+ */
+#define CONFIG_DRIVER_SMC91111 1
+#define CONFIG_SMC91111_BASE   0x20300300
+
+/* FLASH/ETHERNET uses the same address range */
+#define SHARED_RESOURCES       1
+
+/* Is I2C bit-banged? */
+#define CONFIG_SOFT_I2C                1
+
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define PF_SCL                 PF3
+#define PF_SDA                 PF2
+
+/*
+ * Video splash screen support
+ */
+#define  CONFIG_VIDEO          0
+
+#define CONFIG_VDSP            1
+
+/*
+ * Clock settings
+ */
+
+/* CONFIG_CLKIN_HZ is any value in Hz                          */
+#define CONFIG_CLKIN_HZ                11059200
+/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN    */
+/*                                                 1=CLKIN/2   */
+#define CONFIG_CLKIN_HALF      0
+/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass        */
+/*                                              1=bypass PLL   */
+#define CONFIG_PLL_BYPASS      0
+/* CONFIG_VCO_MULT controls what the multiplier of the PLL is. */
+/* Values can range from 1-64                                  */
+#define CONFIG_VCO_MULT                36
+/* CONFIG_CCLK_DIV controls what the core clock divider is     */
+/* Values can be 1, 2, 4, or 8 ONLY                            */
+#define CONFIG_CCLK_DIV                1
+/* CONFIG_SCLK_DIV controls what the peripheral clock divider is*/
+/* Values can range from 1-15                                  */
+#define CONFIG_SCLK_DIV                5
+/* CONFIG_SPI_BAUD controls the SPI peripheral clock divider   */
+/* Values can range from 2-65535                               */
+/* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD)                        */
+#define CONFIG_SPI_BAUD                2
+
+#if (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CONFIG_SPI_BAUD_INITBLOCK      4
+#endif
+
+/*
+ * Network settings
+ */
+
+#if (CONFIG_DRIVER_SMC91111)
+#if 0
+#define        CONFIG_MII
+#endif
+
+/* network support */
+#define CONFIG_IPADDR          192.168.0.15
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_GATEWAYIP       192.168.0.1
+#define CONFIG_SERVERIP                192.168.0.2
+#define CONFIG_HOSTNAME                STAMP
+#define CONFIG_ROOTPATH                /checkout/uClinux-dist/romfs
+
+/* To remove hardcoding and enable MAC storage in EEPROM  */
+/* #define CONFIG_ETHADDR              02:80:ad:20:31:b8 */
+#endif /* CONFIG_DRIVER_SMC91111 */
+
+/*
+ * Flash settings
+ */
+
+#define CFG_FLASH_CFI          /* The flash is CFI compatible  */
+#define CFG_FLASH_CFI_DRIVER   /* Use common CFI driver        */
+#define        CFG_FLASH_CFI_AMD_RESET
+
+#define CFG_FLASH_BASE         0x20000000
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks */
+#define CFG_MAX_FLASH_SECT     67      /* max number of sectors on one chip */
+
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#define CFG_ENV_IS_IN_FLASH    1
+#define CFG_ENV_ADDR           0x20004000
+#define        CFG_ENV_OFFSET          (CFG_ENV_ADDR - CFG_FLASH_BASE)
+#elif (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CFG_ENV_IS_IN_EEPROM   1
+#define CFG_ENV_OFFSET         0x4000
+#define CFG_ENV_HEADER         (CFG_ENV_OFFSET + 0x12A)        /* 0x12A is the length of LDR file header */
+#endif
+
+#define        CFG_ENV_SIZE            0x2000
+#define CFG_ENV_SECT_SIZE      0x2000  /* Total Size of Environment Sector */
+#define        ENV_IS_EMBEDDED
+
+#define CFG_FLASH_ERASE_TOUT   30000   /* Timeout for Chip Erase (in ms) */
+#define CFG_FLASH_ERASEBLOCK_TOUT      5000    /* Timeout for Block Erase (in ms) */
+#define CFG_FLASH_WRITE_TOUT   1       /* Timeout for Flash Write (in ms) */
+
+/* JFFS Partition offset set  */
+#define CFG_JFFS2_FIRST_BANK 0
+#define CFG_JFFS2_NUM_BANKS  1
+/* 512k reserved for u-boot */
+#define CFG_JFFS2_FIRST_SECTOR         11
+
+/*
+ * following timeouts shall be used once the
+ * Flash real protection is enabled
+ */
+#define CFG_FLASH_LOCK_TOUT    5       /* Timeout for Flash Set Lock Bit (in ms) */
+#define CFG_FLASH_UNLOCK_TOUT  10000   /* Timeout for Flash Clear Lock Bits (in ms) */
+
+/*
+ * SDRAM settings & memory map
+ */
+
+#define CONFIG_MEM_SIZE                128     /* 128, 64, 32, 16 */
+#define CONFIG_MEM_ADD_WDTH     11     /* 8, 9, 10, 11    */
+#define CONFIG_MEM_MT48LC64M4A2FB_7E   1
+
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#define CFG_MEMTEST_START      0x00000000      /* memtest works on */
+#elif (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CFG_MEMTEST_START      0x00100000      /* memtest works on */
+#endif
+
+#define        CFG_SDRAM_BASE          0x00000000
+
+#define CFG_MAX_RAM_SIZE       (CONFIG_MEM_SIZE * 1024 *1024)
+#define CFG_MEMTEST_END                (CFG_MAX_RAM_SIZE - 0x80000 - 1)
+#define CONFIG_LOADADDR                0x01000000
+
+#define CFG_LOAD_ADDR          CONFIG_LOADADDR
+#define        CFG_MONITOR_LEN         (256 << 10)     /* Reserve 256 kB for Monitor   */
+#define CFG_MALLOC_LEN         (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_GBL_DATA_SIZE      0x4000          /* Reserve 16k for Global Data  */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+
+#define CFG_MONITOR_BASE               (CFG_MAX_RAM_SIZE - 0x40000)
+#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+#define CFG_GBL_DATA_ADDR      (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
+#define CONFIG_STACKBASE       (CFG_GBL_DATA_ADDR  - 4)
+
+/* Check to make sure everything fits in SDRAM */
+#if ((CFG_MONITOR_BASE + CFG_MONITOR_LEN) > CFG_MAX_RAM_SIZE)
+       #error Memory Map does not fit into configuration
+#endif
+
+#if ( CONFIG_CLKIN_HALF == 0 )
+#define CONFIG_VCO_HZ          ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
+#else
+#define CONFIG_VCO_HZ          (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
+#endif
+
+#if (CONFIG_PLL_BYPASS == 0)
+#define CONFIG_CCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
+#define CONFIG_SCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
+#else
+#define CONFIG_CCLK_HZ         CONFIG_CLKIN_HZ
+#define CONFIG_SCLK_HZ         CONFIG_CLKIN_HZ
+#endif
+
+#if (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#if (CONFIG_SCLK_HZ / (2*CONFIG_SPI_BAUD) > 20000000)
+#define CONFIG_SPI_FLASH_FAST_READ 1 /* Needed if SPI_CLK > 20 MHz */
+#else
+#undef CONFIG_SPI_FLASH_FAST_READ
+#endif
+#endif
+
+/*
+ * Command settings
+ */
+
+#define CFG_LONGHELP           1
+#define CONFIG_CMDLINE_EDITING 1
+
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#define CFG_AUTOLOAD           "no"    /*rarpb, bootp or dhcp commands will perform only a */
+#endif
+
+/* configuration lookup from the BOOTP/DHCP server, */
+/* but not try to load any image using TFTP        */
+
+#define CONFIG_BOOTDELAY       5
+#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, currently its disabled */
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#define CONFIG_BOOTCOMMAND     "run ramboot"
+#elif (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CONFIG_BOOTCOMMAND     "eeprom read 0x1000000 0x100000 0x180000;icache on;dcache on;bootm 0x1000000"
+#endif
+
+#define CONFIG_BOOTARGS                "root=/dev/mtdblock0 rw console=ttyBF0,57600"
+
+#if (CONFIG_DRIVER_SMC91111)
+#define CONFIG_COMMANDS1       (CONFIG_CMD_DFL | \
+                                CFG_CMD_PING   | \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2  | \
+                                CFG_CMD_EEPROM | \
+                                CFG_CMD_DATE)
+
+#else
+#define CONFIG_COMMANDS1       (CONFIG_CMD_DFL | \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2  | \
+                                CFG_CMD_EEPROM | \
+                                CFG_CMD_DATE)
+#endif
+
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#if (CONFIG_DRIVER_SMC91111)
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):" \
+               "$(rootpath) console=ttyBF0,57600\0" \
+       "addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):" \
+               "$(gatewayip):$(netmask):$(hostname):eth0:off\0" \
+       "ramboot=tftpboot $(loadaddr) linux; " \
+               "run ramargs;run addip;bootelf\0" \
+       "nfsboot=tftpboot $(loadaddr) linux; " \
+               "run nfsargs;run addip;bootelf\0" \
+       "flashboot=bootm 0x20100000\0" \
+       "update=tftpboot $(loadaddr) u-boot.bin; " \
+               "protect off 0x20000000 0x2003FFFF; erase 0x20000000 0x2003FFFF;" \
+               "cp.b $(loadaddr) 0x20000000 $(filesize)\0" \
+       ""
+#else
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "flashboot=bootm 0x20100000\0" \
+       "
+#endif
+
+#elif (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):" \
+               "$(rootpath) console=ttyBF0,57600\0"    \
+       "addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):" \
+               "$(gatewayip):$(netmask):$(hostname):eth0:off\0" \
+       "ramboot=tftpboot $(loadaddr) linux; " \
+               "run ramargs;run addip;bootelf\0" \
+       "nfsboot=tftpboot $(loadaddr) linux; "  \
+               "run nfsargs;run addip;bootelf\0" \
+       "flashboot=bootm 0x20100000\0" \
+       "update=tftpboot $(loadaddr) u-boot.ldr;"       \
+               "eeprom write $(loadaddr) 0x0 $(filesize);\0"\
+       ""
+#endif
+
+#ifdef CONFIG_SOFT_I2C
+#if (!CONFIG_SOFT_I2C)
+#undef CONFIG_SOFT_I2C
+#endif
+#endif
+
+#if (CONFIG_SOFT_I2C)
+#define CONFIG_COMMANDS2   CFG_CMD_I2C
+#else
+#define CONFIG_COMMANDS2 0
+#endif /* CONFIG_SOFT_I2C */
+
+#if (BFIN_BOOT_MODE == BF533_BYPASS_BOOT)
+#define CONFIG_COMMANDS  ( CONFIG_COMMANDS1 | CONFIG_COMMANDS2 | CFG_CMD_DHCP)
+#elif (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#define CONFIG_COMMANDS  ( CONFIG_COMMANDS1 | CONFIG_COMMANDS2)
+#endif
+
+/* This must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/*
+ * Console settings
+ */
+
+#define CONFIG_BAUDRATE                57600
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+#if (BFIN_BOOT_MODE == BF533_SPI_BOOT)
+#if (BFIN_CPU == ADSP_BF531)
+#define        CFG_PROMPT      "serial_bf531> "        /* Monitor Command Prompt */
+#elif (BFIN_CPU == ADSP_BF532)
+#define        CFG_PROMPT      "serial_bf532> "        /* Monitor Command Prompt */
+#else
+#define        CFG_PROMPT      "serial_bf533> "        /* Monitor Command Prompt */
+#endif
+#else
+#if (BFIN_CPU == ADSP_BF531)
+#define        CFG_PROMPT      "bf531> "       /* Monitor Command Prompt */
+#elif (BFIN_CPU == ADSP_BF532)
+#define        CFG_PROMPT      "bf532> "       /* Monitor Command Prompt */
+#else
+#define        CFG_PROMPT      "bf533> "       /* Monitor Command Prompt */
+#endif
+#endif
+
+#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 CONFIG_LOADS_ECHO      1
+
+/*
+ * I2C settings
+ * By default PF2 is used as SDA and PF3 as SCL on the Stamp board
+ */
+#if (CONFIG_SOFT_I2C)
+
+#define I2C_INIT               (*pFIO_DIR |=  PF_SCL); asm("ssync;")
+#define I2C_ACTIVE             (*pFIO_DIR |=  PF_SDA); *pFIO_INEN &= ~PF_SDA; asm("ssync;")
+#define I2C_TRISTATE           (*pFIO_DIR &= ~PF_SDA); *pFIO_INEN |= PF_SDA; asm("ssync;")
+#define I2C_READ               ((volatile)(*pFIO_FLAG_D & PF_SDA) != 0); asm("ssync;")
+#define I2C_SDA(bit)   if(bit) { \
+                               *pFIO_FLAG_S = PF_SDA; \
+                               asm("ssync;"); \
+                               } \
+                       else    { \
+                               *pFIO_FLAG_C = PF_SDA; \
+                               asm("ssync;"); \
+                               }
+#define I2C_SCL(bit)   if(bit) { \
+                               *pFIO_FLAG_S = PF_SCL; \
+                               asm("ssync;"); \
+                               } \
+                       else    { \
+                               *pFIO_FLAG_C = PF_SCL; \
+                               asm("ssync;"); \
+                               }
+#define I2C_DELAY              udelay(5)       /* 1/4 I2C clock duration */
+
+#define CFG_I2C_SPEED          50000
+#define CFG_I2C_SLAVE          0xFE
+#endif /* CONFIG_SOFT_I2C */
+
+/*
+ * Compact Flash settings
+ */
+
+/* Enabled below option for CF support */
+/* #define CONFIG_STAMP_CF     1 */
+
+#if defined(CONFIG_STAMP_CF) && (CONFIG_COMMANDS & CFG_CMD_IDE)
+
+#define CONFIG_MISC_INIT_R     1
+#define CONFIG_DOS_PARTITION   1
+/*
+ * IDE/ATA stuff
+ */
+#undef  CONFIG_IDE_8xx_DIRECT          /* no pcmcia interface required */
+#undef  CONFIG_IDE_LED                 /* no led for ide supported */
+#undef  CONFIG_IDE_RESET               /* no reset for ide supported */
+
+#define CFG_IDE_MAXBUS         1       /* max. 1 IDE busses */
+#define CFG_IDE_MAXDEVICE      (CFG_IDE_MAXBUS*1) /* max. 1 drives per IDE bus */
+
+#define CFG_ATA_BASE_ADDR      0x20200000
+#define CFG_ATA_IDE0_OFFSET    0x0000
+
+#define CFG_ATA_DATA_OFFSET    0x0020  /* Offset for data I/O */
+#define CFG_ATA_REG_OFFSET     0x0020  /* Offset for normal register accesses */
+#define CFG_ATA_ALT_OFFSET     0x0007  /* Offset for alternate registers */
+
+#define CFG_ATA_STRIDE         2
+#endif
+
+/*
+ * Miscellaneous configurable options
+ */
+
+#define        CFG_HZ                  1000    /* 1ms time tick */
+
+#define CFG_BOOTM_LEN          0x4000000/* Large Image Length, set to 64 Meg */
+
+#define CONFIG_SHOW_BOOT_PROGRESS 1    /* Show boot progress on LEDs */
+
+#define CONFIG_SPI
+
+#ifdef  CONFIG_VIDEO
+#if (CONFIG_VIDEO)
+#define CONFIG_SPLASH_SCREEN   1
+#define CONFIG_SILENT_CONSOLE  1
+#else
+#undef CONFIG_VIDEO
+#endif
+#endif
+
+/*
+ * FLASH organization and environment definitions
+ */
+#define        CFG_BOOTMAPSZ           (8 << 20)/* Initial Memory map for Linux */
+
+/* 0xFF, 0xBBC3BBc3, 0x99B39983 */
+/*#define AMGCTLVAL            (AMBEN_P0 | AMBEN_P1 | AMBEN_P2 | AMCKEN)
+#define AMBCTL0VAL             (B1WAT_11 | B1RAT_11 | B1HT_3 | B1ST_4 | B1TT_4 | B1RDYPOL | \
+                               B1RDYEN | B0WAT_11 | B0RAT_11 | B0HT_3 | B0ST_4 | B0TT_4 | B0RDYPOL | B0RDYEN)
+#define AMBCTL1VAL             (B3WAT_9 | B3RAT_9 | B3HT_2 | B3ST_3 | B3TT_4 | B3RDYPOL | \
+                               B3RDYEN | B2WAT_9 | B2RAT_9 | B2HT_2 | B2ST_4 | B2TT_4 | B2RDYPOL | B2RDYEN)
+*/
+#define AMGCTLVAL              0xFF
+#define AMBCTL0VAL             0xBBC3BBC3
+#define AMBCTL1VAL             0x99B39983
+#define CF_AMBCTL1VAL          0x99B3ffc2
+
+#ifdef CONFIG_VDSP
+#define ET_EXEC_VDSP           0x8
+#define SHT_STRTAB_VDSP                0x1
+#define ELFSHDRSIZE_VDSP       0x2C
+#define VDSP_ENTRY_ADDR                0xFFA00000
+#endif
+
+#endif
diff --git a/include/configs/bf537-stamp.h b/include/configs/bf537-stamp.h
new file mode 100644 (file)
index 0000000..f6755ac
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * U-boot - Configuration file for BF537 STAMP board
+ */
+
+#ifndef __CONFIG_BF537_H__
+#define __CONFIG_BF537_H__
+
+#define CFG_LONGHELP           1
+#define CONFIG_CMDLINE_EDITING 1
+#define CONFIG_BAUDRATE                57600
+/* Set default serial console for bf537 */
+#define CONFIG_UART_CONSOLE    0
+#define CONFIG_BF537           1
+#define CONFIG_BOOTDELAY       5
+/* define CONFIG_BF537_STAMP_LEDCMD to enable LED command*/
+/*#define CONFIG_BF537_STAMP_LEDCMD    1*/
+
+/*
+ * Boot Mode Set
+ * Blackfin can support several boot modes
+ */
+#define BF537_BYPASS_BOOT      0x0011  /* Bootmode 0: Execute from 16-bit externeal memory ( bypass BOOT ROM)  */
+#define BF537_PARA_BOOT                0x0012  /* Bootmode 1: Boot from 8-bit or 16-bit flash                          */
+#define BF537_SPI_MASTER_BOOT  0x0014  /* Bootmode 3: SPI master mode boot from SPI flash                      */
+#define BF537_SPI_SLAVE_BOOT   0x0015  /* Bootmode 4: SPI slave mode boot from SPI flash                       */
+#define BF537_TWI_MASTER_BOOT  0x0016  /* Bootmode 5: TWI master mode boot from EEPROM                         */
+#define BF537_TWI_SLAVE_BOOT   0x0017  /* Bootmode 6: TWI slave mode boot from EEPROM                          */
+#define BF537_UART_BOOT                0x0018  /* Bootmode 7: UART slave mdoe boot via UART host                       */
+/* Define the boot mode */
+#define BFIN_BOOT_MODE         BF537_BYPASS_BOOT
+
+#define CONFIG_PANIC_HANG 1
+
+#define ADSP_BF534             0x34
+#define ADSP_BF536             0x36
+#define ADSP_BF537             0x37
+#define BFIN_CPU               ADSP_BF537
+
+/* This sets the default state of the cache on U-Boot's boot */
+#define CONFIG_ICACHE_ON
+#define CONFIG_DCACHE_ON
+
+/* Define if want to do post memory test */
+#undef CONFIG_POST_TEST
+
+/* Define where the uboot will be loaded by on-chip boot rom */
+#define APP_ENTRY 0x00001000
+
+#define CONFIG_RTC_BFIN                1
+#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, currently its disabled */
+
+/* CONFIG_CLKIN_HZ is any value in Hz                          */
+#define CONFIG_CLKIN_HZ                25000000
+/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN    */
+/*                                                 1=CLKIN/2   */
+#define CONFIG_CLKIN_HALF      0
+/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass */
+/*                                                 1=bypass PLL*/
+#define CONFIG_PLL_BYPASS      0
+/* CONFIG_VCO_MULT controls what the multiplier of the PLL is. */
+/* Values can range from 1-64                                  */
+#define CONFIG_VCO_MULT                        20
+/* CONFIG_CCLK_DIV controls what the core clock divider is     */
+/* Values can be 1, 2, 4, or 8 ONLY                            */
+#define CONFIG_CCLK_DIV                        1
+/* CONFIG_SCLK_DIV controls what the peripheral clock divider is*/
+/* Values can range from 1-15                                  */
+#define CONFIG_SCLK_DIV                        5
+/* CONFIG_SPI_BAUD controls the SPI peripheral clock divider   */
+/* Values can range from 2-65535                               */
+/* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD)                        */
+#define CONFIG_SPI_BAUD                        2
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#define CONFIG_SPI_BAUD_INITBLOCK      4
+#endif
+
+#if ( CONFIG_CLKIN_HALF == 0 )
+#define CONFIG_VCO_HZ ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
+#else
+#define CONFIG_VCO_HZ (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
+#endif
+
+#if (CONFIG_PLL_BYPASS == 0)
+#define CONFIG_CCLK_HZ ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
+#define CONFIG_SCLK_HZ ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
+#else
+#define CONFIG_CCLK_HZ CONFIG_CLKIN_HZ
+#define CONFIG_SCLK_HZ CONFIG_CLKIN_HZ
+#endif
+
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#if (CONFIG_SCLK_HZ / (2*CONFIG_SPI_BAUD) > 20000000)
+#define CONFIG_SPI_FLASH_FAST_READ 1   /* Needed if SPI_CLK > 20 MHz */
+#else
+#undef CONFIG_SPI_FLASH_FAST_READ
+#endif
+#endif
+
+#define CONFIG_MEM_SIZE                        64      /* 128, 64, 32, 16 */
+#define CONFIG_MEM_ADD_WDTH            10      /* 8, 9, 10, 11 */
+#define CONFIG_MEM_MT48LC32M8A2_75     1
+
+#define CONFIG_LOADS_ECHO              1
+
+/*
+ * rarpb, bootp or dhcp commands will perform only a
+ * configuration lookup from the BOOTP/DHCP server
+ * but not try to load any image using TFTP
+ */
+#define CFG_AUTOLOAD                   "no"
+
+/*
+ * Network Settings
+ */
+/* network support */
+#if (BFIN_CPU != ADSP_BF534)
+#define CONFIG_IPADDR          192.168.0.15
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_GATEWAYIP       192.168.0.1
+#define CONFIG_SERVERIP                192.168.0.2
+#define CONFIG_HOSTNAME                BF537
+#endif
+
+#define CONFIG_ROOTPATH                /romfs
+/* Uncomment next line to use fixed MAC address */
+/* #define CONFIG_ETHADDR      02:80:ad:20:31:e8 */
+/* This is the routine that copies the MAC in Flash to the 'ethaddr' setting */
+
+#define CFG_LONGHELP           1
+#define CONFIG_BOOTDELAY       5
+#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, currently its disabled */
+#define CONFIG_BOOTCOMMAND     "run ramboot"
+
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT) && defined(CONFIG_POST_TEST)
+/* POST support */
+#define CONFIG_POST            ( CFG_POST_MEMORY | \
+                                 CFG_POST_UART   | \
+                                 CFG_POST_FLASH  | \
+                                 CFG_POST_ETHER  | \
+                                 CFG_POST_LED    | \
+                                 CFG_POST_BUTTON)
+#else
+#undef CONFIG_POST
+#endif
+
+#ifdef CONFIG_POST
+#define CFG_CMD_POST_DIAG      CFG_CMD_DIAG
+#define FLASH_START_POST_BLOCK 11      /* Should > = 11 */
+#define FLASH_END_POST_BLOCK   71      /* Should < = 71 */
+#else
+#define CFG_CMD_POST_DIAG      0
+#endif
+
+/* CF-CARD IDE-HDD Support */
+
+/* #define CONFIG_BFIN_TRUE_IDE */     /* Add CF flash card support */
+/* #define CONFIG_BFIN_CF_IDE */       /* Add CF flash card support */
+/* #define CONFIG_BFIN_HDD_IDE */      /* Add IDE Disk Drive (HDD) support */
+
+#if defined(CONFIG_BFIN_CF_IDE) || defined(CONFIG_BFIN_HDD_IDE) || defined(CONFIG_BFIN_TRUE_IDE)
+# define CONFIG_BFIN_IDE       1
+# define ADD_IDE_CMD           CFG_CMD_IDE
+#else
+# define ADD_IDE_CMD           0
+#endif
+
+/*#define CONFIG_BF537_NAND */         /* Add nand flash support */
+
+#ifdef CONFIG_BF537_NAND
+# define ADD_NAND_CMD          CFG_CMD_NAND
+#else
+# define ADD_NAND_CMD          0
+#endif
+
+#define CONFIG_NETCONSOLE      1
+#define CONFIG_NET_MULTI       1
+
+#if (BFIN_CPU == ADSP_BF534)
+#define CONFIG_BFIN_CMD                (CONFIG_CMD_DFL & ~CFG_CMD_NET)
+#else
+#define CONFIG_BFIN_CMD                (CONFIG_CMD_DFL | CFG_CMD_PING)
+#endif
+
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT)
+#define CONFIG_COMMANDS                (CONFIG_BFIN_CMD| \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_I2C    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2  | \
+                                CFG_CMD_EEPROM | \
+                                CFG_CMD_DHCP   | \
+                                ADD_IDE_CMD    | \
+                                ADD_NAND_CMD   | \
+                                CFG_CMD_POST_DIAG | \
+                                CFG_CMD_DATE)
+#elif (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#define CONFIG_COMMANDS                (CONFIG_BFIN_CMD| \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_I2C    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2  | \
+                                CFG_CMD_EEPROM | \
+                                ADD_IDE_CMD    | \
+                                CFG_CMD_DATE)
+#endif
+
+#define CONFIG_BOOTARGS "root=/dev/mtdblock0 rw console=ttyBF0,57600"
+#define CONFIG_LOADADDR        0x1000000
+
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT)
+#if (BFIN_CPU != ADSP_BF534)
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "             \
+       "nfsroot=$(serverip):$(rootpath) console=ttyBF0,57600\0"\
+       "addip=setenv bootargs $(bootargs) "                    \
+       "ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)"      \
+       ":$(hostname):eth0:off\0"                               \
+       "ramboot=tftpboot $(loadaddr) linux;"                   \
+       "run ramargs;run addip;bootelf\0"                       \
+       "nfsboot=tftpboot $(loadaddr) linux;"                   \
+       "run nfsargs;run addip;bootelf\0"                       \
+       "flashboot=bootm 0x20100000\0"                          \
+       "update=tftpboot $(loadaddr) u-boot.bin;"               \
+       "protect off 0x20000000 0x2007FFFF;"                    \
+       "erase 0x20000000 0x2007FFFF;cp.b 0x1000000 0x20000000 $(filesize)\0"   \
+       ""
+#else
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "flashboot=bootm 0x20100000\0"                          \
+       ""
+#endif
+#elif (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#if (BFIN_CPU != ADSP_BF534)
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "             \
+       "nfsroot=$(serverip):$(rootpath) console=ttyBF0,57600\0"\
+       "addip=setenv bootargs $(bootargs) "                    \
+       "ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)"      \
+       ":$(hostname):eth0:off\0"                               \
+       "ramboot=tftpboot $(loadaddr) linux;"                   \
+       "run ramargs;run addip;bootelf\0"                       \
+       "nfsboot=tftpboot $(loadaddr) linux;"                   \
+       "run nfsargs;run addip;bootelf\0"                       \
+       "flashboot=bootm 0x20100000\0"                          \
+       "update=tftpboot $(loadaddr) u-boot.ldr;"               \
+       "eeprom write $(loadaddr) 0x0 $(filesize);\0"           \
+       ""
+#else
+#define CONFIG_EXTRA_ENV_SETTINGS                              \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0" \
+       "flashboot=bootm 0x20100000\0"                          \
+       ""
+#endif
+#endif
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#if (BFIN_CPU == ADSP_BF534)
+#define        CFG_PROMPT              "serial_bf534> "        /* Monitor Command Prompt */
+#elif (BFIN_CPU == ADSP_BF536)
+#define        CFG_PROMPT              "serial_bf536> "        /* Monitor Command Prompt */
+#else
+#define        CFG_PROMPT              "serial_bf537> "        /* Monitor Command Prompt */
+#endif
+#else
+#if (BFIN_CPU == ADSP_BF534)
+#define        CFG_PROMPT              "bf534> "       /* Monitor Command Prompt */
+#elif (BFIN_CPU == ADSP_BF536)
+#define        CFG_PROMPT              "bf536> "       /* Monitor Command Prompt */
+#else
+#define        CFG_PROMPT              "bf537> "       /* Monitor Command Prompt */
+#endif
+#endif
+
+#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_MAX_RAM_SIZE               (CONFIG_MEM_SIZE * 1024*1024)
+#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      0x0     /* memtest works on */
+#define CFG_MEMTEST_END                ( (CONFIG_MEM_SIZE - 1) * 1024*1024)    /* 1 ... 63 MB in DRAM */
+#define        CFG_LOAD_ADDR           CONFIG_LOADADDR /* default load address */
+#define        CFG_HZ                  1000    /* decrementer freq: 10 ms ticks */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+#define        CFG_SDRAM_BASE          0x00000000
+
+#define CFG_FLASH_BASE         0x20000000
+
+#define        CFG_MONITOR_LEN         (256 << 10)     /* Reserve 256 kB for Monitor   */
+#define CFG_MONITOR_BASE       (CFG_MAX_RAM_SIZE - CFG_MONITOR_LEN)
+#define        CFG_MALLOC_LEN          (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+#define CFG_GBL_DATA_SIZE      0x4000
+#define CFG_GBL_DATA_ADDR      (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
+#define CONFIG_STACKBASE       (CFG_GBL_DATA_ADDR  - 4)
+
+#define        CFG_BOOTMAPSZ           (8 << 20)       /* Initial Memory map for Linux */
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks */
+#define CFG_MAX_FLASH_SECT     71      /* max number of sectors on one chip */
+
+#if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT) || (BFIN_BOOT_MODE == BF537_UART_BOOT)
+/* for bf537-stamp, usrt boot mode still store env in flash */
+#define        CFG_ENV_IS_IN_FLASH     1
+#define CFG_ENV_ADDR           0x20004000
+#define CFG_ENV_OFFSET         (CFG_ENV_ADDR - CFG_FLASH_BASE)
+#elif (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
+#define CFG_ENV_IS_IN_EEPROM   1
+#define CFG_ENV_OFFSET         0x4000
+#define CFG_ENV_HEADER         (CFG_ENV_OFFSET + 0x16e) /* 0x12A is the length of LDR file header */
+#endif
+#define CFG_ENV_SIZE           0x2000
+#define        CFG_ENV_SECT_SIZE       0x2000  /* Total Size of Environment Sector */
+/* #if (BFIN_BOOT_MODE == BF537_BYPASS_BOOT) */
+#define ENV_IS_EMBEDDED
+/* #endif */
+
+/* JFFS Partition offset set  */
+#define CFG_JFFS2_FIRST_BANK   0
+#define CFG_JFFS2_NUM_BANKS    1
+/* 512k reserved for u-boot */
+#define CFG_JFFS2_FIRST_SECTOR 15
+
+#define CONFIG_SPI
+
+/*
+ * Stack sizes
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+
+#define POLL_MODE              1
+#define FLASH_TOT_SECT         71
+#define FLASH_SIZE             0x400000
+#define CFG_FLASH_SIZE         0x400000
+
+/*
+ * Board NAND Infomation
+ */
+
+#define CFG_NAND_ADDR          0x20212000
+#define CFG_NAND_BASE          CFG_NAND_ADDR
+#define CFG_MAX_NAND_DEVICE    1
+#define SECTORSIZE             512
+#define ADDR_COLUMN            1
+#define ADDR_PAGE              2
+#define ADDR_COLUMN_PAGE       3
+#define NAND_ChipID_UNKNOWN    0x00
+#define NAND_MAX_FLOORS                1
+#define NAND_MAX_CHIPS         1
+#define BFIN_NAND_READY                PF3
+
+#define NAND_WAIT_READY(nand)                          \
+       do {                                    \
+               int timeout = 0;                \
+               while(!(*pPORTFIO & PF3))       \
+                       if (timeout++ > 100000) \
+                               break;          \
+       } while (0)
+
+#define BFIN_NAND_CLE          (1<<2)  /* A2 -> Command Enable */
+#define BFIN_NAND_ALE          (1<<1)  /* A1 -> Address Enable */
+
+#define WRITE_NAND_COMMAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | BFIN_NAND_CLE) = (__u8)(d); } while(0)
+#define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | BFIN_NAND_ALE) = (__u8)(d); } while(0)
+#define WRITE_NAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)d; } while(0)
+#define READ_NAND(adr) ((volatile unsigned char)(*(volatile __u8 *)(unsigned long)adr))
+
+/*
+ * Initialize PSD4256 registers for using I2C
+ */
+#define CONFIG_MISC_INIT_R
+
+#define CFG_BOOTM_LEN          0x4000000       /* Large Image Length, set to 64 Meg */
+
+/*
+ * I2C settings
+ * By default PF1 is used as SDA and PF0 as SCL on the Stamp board
+ */
+/* #define CONFIG_SOFT_I2C     1*/     /* I2C bit-banged */
+#define CONFIG_HARD_I2C                1       /* I2C TWI */
+#if defined CONFIG_HARD_I2C
+#define CONFIG_TWICLK_KHZ      50
+#endif
+
+#if defined CONFIG_SOFT_I2C
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define PF_SCL                 PF0
+#define PF_SDA                 PF1
+
+#define I2C_INIT               (*pFIO_DIR |=  PF_SCL); asm("ssync;")
+#define I2C_ACTIVE             (*pFIO_DIR |=  PF_SDA); *pFIO_INEN &= ~PF_SDA; asm("ssync;")
+#define I2C_TRISTATE           (*pFIO_DIR &= ~PF_SDA); *pFIO_INEN |= PF_SDA; asm("ssync;")
+#define I2C_READ               ((volatile)(*pFIO_FLAG_D & PF_SDA) != 0); asm("ssync;")
+#define I2C_SDA(bit)           if(bit) { \
+                                       *pFIO_FLAG_S = PF_SDA; \
+                                       asm("ssync;"); \
+                                       } \
+                               else    { \
+                                       *pFIO_FLAG_C = PF_SDA; \
+                                       asm("ssync;"); \
+                                       }
+#define I2C_SCL(bit)           if(bit) { \
+                                       *pFIO_FLAG_S = PF_SCL; \
+                                       asm("ssync;"); \
+                                       } \
+                               else    { \
+                                       *pFIO_FLAG_C = PF_SCL; \
+                                       asm("ssync;"); \
+                                       }
+#define I2C_DELAY              udelay(5)       /* 1/4 I2C clock duration */
+#endif
+
+#define CFG_I2C_SPEED          50000
+#define CFG_I2C_SLAVE          0xFE
+
+/* 0xFF, 0x7BB07BB0, 0x22547BB0 */
+/* #define AMGCTLVAL           (AMBEN_P0 | AMBEN_P1 | AMBEN_P2 | AMCKEN)
+#define AMBCTL0VAL             (B1WAT_7 | B1RAT_11 | B1HT_2 | B1ST_3 | B1TT_4 | ~B1RDYPOL | \
+                               ~B1RDYEN | B0WAT_7 | B0RAT_11 | B0HT_2 | B0ST_3 | B0TT_4 | ~B0RDYPOL | ~B0RDYEN)
+#define AMBCTL1VAL             (B3WAT_2 | B3RAT_2 | B3HT_1 | B3ST_1 | B3TT_4 | B3RDYPOL | ~B3RDYEN | \
+                               B2WAT_7 | B2RAT_11 | B2HT_2 | B2ST_3 | B2TT_4 | ~B2RDYPOL | ~B2RDYEN)
+*/
+
+#define AMGCTLVAL              0xFF
+#define AMBCTL0VAL             0x7BB07BB0
+#define AMBCTL1VAL             0xFFC27BB0
+
+#define CONFIG_VDSP            1
+
+#ifdef CONFIG_VDSP
+#define ET_EXEC_VDSP           0x8
+#define SHT_STRTAB_VDSP                0x1
+#define ELFSHDRSIZE_VDSP       0x2C
+#define VDSP_ENTRY_ADDR                0xFFA00000
+#endif
+
+#if defined(CONFIG_BFIN_IDE)
+
+#define CONFIG_DOS_PARTITION   1
+/*
+ * IDE/ATA stuff
+ */
+#undef  CONFIG_IDE_8xx_DIRECT  /* no pcmcia interface required */
+#undef  CONFIG_IDE_LED         /* no led for ide supported */
+#undef  CONFIG_IDE_RESET       /* no reset for ide supported */
+
+#define CFG_IDE_MAXBUS         1       /* max. 1 IDE busses */
+#define CFG_IDE_MAXDEVICE      (CFG_IDE_MAXBUS*1)      /* max. 1 drives per IDE bus */
+
+#undef  AMBCTL1VAL
+#define AMBCTL1VAL             0xFFC3FFC3
+
+#define CONFIG_CF_ATASEL_DIS   0x20311800
+#define CONFIG_CF_ATASEL_ENA   0x20311802
+
+#if defined(CONFIG_BFIN_TRUE_IDE)
+/*
+ * Note that these settings aren't for the most part used in include/ata.h
+ * when all of the ATA registers are setup
+ */
+#define CFG_ATA_BASE_ADDR      0x2031C000
+#define CFG_ATA_IDE0_OFFSET    0x0000
+#define CFG_ATA_DATA_OFFSET    0x0020  /* Offset for data I/O */
+#define CFG_ATA_REG_OFFSET     0x0020  /* Offset for normal register accesses */
+#define CFG_ATA_ALT_OFFSET     0x001C  /* Offset for alternate registers */
+#define CFG_ATA_STRIDE         2       /* CF.A0 --> Blackfin.Ax */
+#endif                         /* CONFIG_BFIN_TRUE_IDE */
+
+#if defined(CONFIG_BFIN_CF_IDE)        /* USE CompactFlash Storage Card in the common memory space */
+#define CFG_ATA_BASE_ADDR      0x20211800
+#define CFG_ATA_IDE0_OFFSET    0x0000
+#define CFG_ATA_DATA_OFFSET    0x0000  /* Offset for data I/O */
+#define CFG_ATA_REG_OFFSET     0x0000  /* Offset for normal register accesses */
+#define CFG_ATA_ALT_OFFSET     0x000E  /* Offset for alternate registers */
+#define CFG_ATA_STRIDE         1       /* CF.A0 --> Blackfin.Ax */
+#endif                         /* CONFIG_BFIN_CF_IDE */
+
+#if defined(CONFIG_BFIN_HDD_IDE)       /* USE TRUE IDE */
+#define CFG_ATA_BASE_ADDR      0x20314000
+#define CFG_ATA_IDE0_OFFSET    0x0000
+#define CFG_ATA_DATA_OFFSET    0x0020  /* Offset for data I/O */
+#define CFG_ATA_REG_OFFSET     0x0020  /* Offset for normal register accesses */
+#define CFG_ATA_ALT_OFFSET     0x001C  /* Offset for alternate registers */
+#define CFG_ATA_STRIDE         2       /* CF.A0 --> Blackfin.A1 */
+
+#undef  CONFIG_SCLK_DIV
+#define CONFIG_SCLK_DIV                8
+#endif                         /* CONFIG_BFIN_HDD_IDE */
+
+#endif                         /*CONFIG_BFIN_IDE */
+
+#endif
diff --git a/include/configs/bf561-ezkit.h b/include/configs/bf561-ezkit.h
new file mode 100644 (file)
index 0000000..8d826fa
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * U-boot - Configuration file for BF561 EZKIT board
+ */
+
+#ifndef __CONFIG_EZKIT561_H__
+#define __CONFIG_EZKIT561_H__
+
+#define CONFIG_VDSP            1
+#define CONFIG_BF561           1
+
+#define CFG_LONGHELP           1
+#define CONFIG_CMDLINE_EDITING 1
+#define CONFIG_BAUDRATE                57600
+/* Set default serial console for bf537 */
+#define CONFIG_UART_CONSOLE    0
+#define CONFIG_EZKIT561                1
+#define CONFIG_BOOTDELAY       5
+
+#define CONFIG_PANIC_HANG 1
+
+/*
+* Boot Mode Set
+* Blackfin can support several boot modes
+*/
+#define BF561_BYPASS_BOOT      0x21
+#define BF561_PARA_BOOT                0x22
+#define BF561_SPI_BOOT         0x24
+/* Define the boot mode */
+#define BFIN_BOOT_MODE BF561_BYPASS_BOOT
+
+/* This sets the default state of the cache on U-Boot's boot */
+#define CONFIG_ICACHE_ON
+#define CONFIG_DCACHE_ON
+
+/* Define where the uboot will be loaded by on-chip boot rom */
+#define APP_ENTRY 0x00001000
+
+/*
+ * Stringize definitions - needed for environmental settings
+ */
+#define STRINGIZE2(x) #x
+#define STRINGIZE(x) STRINGIZE2(x)
+
+/*
+ * Board settings
+ */
+#define CONFIG_DRIVER_SMC91111 1
+#define CONFIG_SMC91111_BASE   0x2C010300
+#define CONFIG_ASYNC_EBIU_BASE CONFIG_SMC91111_BASE & ~(4*1024*1024)
+#define CONFIG_SMC_USE_32_BIT  1
+#define CONFIG_MISC_INIT_R     1
+
+/*
+ * Clock settings
+ */
+
+/* CONFIG_CLKIN_HZ is any value in Hz                          */
+#define CONFIG_CLKIN_HZ                30000000
+/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN    */
+/*                                                 1=CLKIN/2   */
+#define CONFIG_CLKIN_HALF      0
+/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass        */
+/*                                              1=bypass PLL   */
+#define CONFIG_PLL_BYPASS      0
+/* CONFIG_VCO_MULT controls what the multiplier of the PLL is  */
+/* Values can range from 1-64                                  */
+#define CONFIG_VCO_MULT                20
+/* CONFIG_CCLK_DIV controls what the core clock divider is     */
+/* Values can be 1, 2, 4, or 8 ONLY                            */
+#define CONFIG_CCLK_DIV                1
+/* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
+/* Values can range from 1-15                                  */
+#define CONFIG_SCLK_DIV                5
+/* CONFIG_SPI_BAUD controls the SPI peripheral clock divider   */
+/* Values can range from 2-65535                               */
+/* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD)                        */
+#define CONFIG_SPI_BAUD                2
+#define CONFIG_SPI_BAUD_INITBLOCK      4
+
+/*
+ * Network settings
+ */
+#if (CONFIG_DRIVER_SMC91111)
+#define CONFIG_IPADDR          192.168.0.15
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_GATEWAYIP       192.168.0.1
+#define CONFIG_SERVERIP                192.168.0.2
+#define CONFIG_HOSTNAME                ezkit561
+#define CONFIG_ROOTPATH                /arm-cross-build/BF561/uClinux-dist/romfs
+#endif                         /* CONFIG_DRIVER_SMC91111 */
+
+/*
+ * Flash settings
+ */
+
+#define CFG_FLASH_CFI          /* The flash is CFI compatible */
+#define CFG_FLASH_CFI_DRIVER   /* Use common CFI driver */
+#define CFG_FLASH_CFI_AMD_RESET
+#define        CFG_ENV_IS_IN_FLASH     1
+#define CFG_FLASH_BASE         0x20000000
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks */
+#define CFG_MAX_FLASH_SECT     135     /* max number of sectors on one chip */
+#define CFG_ENV_ADDR           0x20020000
+#define        CFG_ENV_SECT_SIZE       0x10000 /* Total Size of Environment Sector */
+/* JFFS Partition offset set  */
+#define CFG_JFFS2_FIRST_BANK   0
+#define CFG_JFFS2_NUM_BANKS    1
+/* 512k reserved for u-boot */
+#define CFG_JFFS2_FIRST_SECTOR 8
+
+/*
+ * SDRAM settings & memory map
+ */
+
+#define CONFIG_MEM_SIZE                        64      /* 128, 64, 32, 16 */
+#define CONFIG_MEM_ADD_WDTH            9       /* 8, 9, 10, 11    */
+#define CONFIG_MEM_MT48LC16M16A2TG_75  1
+
+#define        CFG_SDRAM_BASE          0x00000000
+#define CFG_MAX_RAM_SIZE       (CONFIG_MEM_SIZE * 1024 * 1024)
+
+#define CFG_MEMTEST_START      0x0     /* memtest works on */
+#define CFG_MEMTEST_END                ( (CONFIG_MEM_SIZE - 1) * 1024*1024)    /* 1 ... 63 MB in DRAM */
+
+#define        CONFIG_LOADADDR         0x01000000      /* default load address */
+#define CFG_LOAD_ADDR          CONFIG_LOADADDR
+#define        CFG_MONITOR_LEN         (256 << 10)     /* Reserve 256 kB for Monitor   */
+#define CFG_MONITOR_BASE       (CFG_MAX_RAM_SIZE - CFG_MONITOR_LEN)
+
+#define        CFG_MALLOC_LEN          (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+
+#define CFG_GBL_DATA_SIZE      0x4000
+#define CFG_GBL_DATA_ADDR      (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
+#define CONFIG_STACKBASE       (CFG_GBL_DATA_ADDR  - 4)
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+
+#if ( CONFIG_CLKIN_HALF == 0 )
+#define CONFIG_VCO_HZ          ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
+#else
+#define CONFIG_VCO_HZ          (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
+#endif
+
+#if (CONFIG_PLL_BYPASS == 0)
+#define CONFIG_CCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
+#define CONFIG_SCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
+#else
+#define CONFIG_CCLK_HZ         CONFIG_CLKIN_HZ
+#define CONFIG_SCLK_HZ         CONFIG_CLKIN_HZ
+#endif
+
+/*
+ * Command settings
+ */
+
+#define CFG_AUTOLOAD   "no"    /* rarpb, bootp, dhcp commands will     */
+                               /* only perform a configuration         */
+                               /* lookup from the BOOTP/DHCP server    */
+                               /* but not try to load any image        */
+                               /* using TFTP                           */
+#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, */
+                                       /* currently its disabled */
+#define CONFIG_BOOTCOMMAND     "run ramboot"
+#define CONFIG_BOOTARGS                "root=/dev/mtdblock0 rw console=ttyBF0,57600"
+
+#if (CONFIG_DRIVER_SMC91111)
+#define CONFIG_COMMANDS1       (CONFIG_CMD_DFL | \
+                                CFG_CMD_PING   | \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2  | \
+                                CFG_CMD_DHCP)
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0"                 \
+       "nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=$(serverip):" \
+               "$(rootpath) console=ttyBF0,57600\0"                                            \
+       "addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):"   \
+               "$(gatewayip):$(netmask):$(hostname):eth0:off\0"        \
+       "ramboot=tftpboot $(loadaddr) linux; "          \
+               "run ramargs; run addip; bootelf\0"                     \
+       "nfsboot=tftpboot $(loadaddr) linux; "          \
+               "run nfsargs; run addip; bootelf\0"                     \
+       "update=tftpboot $(loadaddr) u-boot.bin; "      \
+               "protect off 0x20000000 0x2003FFFF; "                   \
+               "erase 0x20000000 0x2003FFFF; "                         \
+               "cp.b $(loadaddr) 0x20000000 $(filesize)\0" \
+       ""
+#else
+#define CONFIG_COMMANDS1       (CONFIG_CMD_DFL | \
+                                CFG_CMD_ELF    | \
+                                CFG_CMD_CACHE  | \
+                                CFG_CMD_JFFS2)
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "ramargs=setenv bootargs root=/dev/mtdblock0 rw console=ttyBF0,57600\0"         \
+       "flashboot=bootm 0x20100000\0"                                  \
+       ""
+#endif
+
+#define CONFIG_COMMANDS ( CONFIG_COMMANDS1 | CONFIG_COMMANDS2 )
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/*
+ * Console settings
+ */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+#define        CFG_PROMPT              "ezkit> "       /* 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 CONFIG_LOADS_ECHO      1
+
+/*
+ * Miscellaneous configurable options
+ */
+#define        CFG_HZ                  1000            /* decrementer freq: 10 ms ticks */
+#define CFG_BOOTM_LEN          0x4000000       /* Large Image Length, set to 64 Meg */
+
+/*
+ * FLASH organization and environment definitions
+ */
+#define        CFG_BOOTMAPSZ           (8 << 20)       /* Initial Memory map for Linux */
+
+#define AMGCTLVAL              0x3F
+#define AMBCTL0VAL             0x7BB07BB0
+#define AMBCTL1VAL             0xFFC27BB0
+
+#ifdef CONFIG_VDSP
+#define ET_EXEC_VDSP           0x8
+#define SHT_STRTAB_VDSP                0x1
+#define ELFSHDRSIZE_VDSP       0x2C
+#define VDSP_ENTRY_ADDR                0xFFA00000
+#endif
+
+#endif                         /* __CONFIG_EZKIT561_H__ */
index a66cdc39567fcad2294d46fd011ff93fe1f2c030..10c48143117c4fe643492876c9c5f479251adb88 100644 (file)
        "bootfile=/tftpboot/bubinga/uImage\0"                           \
        "kernel_addr=fff80000\0"                                        \
        "ramdisk_addr=fff90000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/bubinga/u-boot.bin\0"               \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
index 91284fdace858fe5e3052e0de788267a49d3001e..15681208b62355232030a7f39c160d9165500e8c 100644 (file)
 /*
  * NAND Flash
  */
-/* Use the new NAND code. (BOARDLIBS = drivers/nand/libnand.a required) */
 #undef CFG_NAND_LEGACY
 
 #define CFG_NAND0_BASE         0x0 /* 0x43100040 */ /* 0x10000000 */
index d8882ea31c56facba581da671a2a5fb0f77ea152..a42319b097d094cbe6c19a5698e31967e8374c23 100644 (file)
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------*/
-#define CONFIG_SPD_EEPROM               /* Use SPD EEPROM for setup     */
-#define SPD_EEPROM_ADDRESS {0x53,0x52}  /* SPD i2c spd addresses        */
+#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
        "bootfile=/tftpboot/ebony/uImage\0"                             \
        "kernel_addr=ff800000\0"                                        \
        "ramdisk_addr=ff810000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/ebony/u-boot.bin\0"                 \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
diff --git a/include/configs/ezkit533.h b/include/configs/ezkit533.h
deleted file mode 100644 (file)
index 5eda673..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef __CONFIG_EZKIT533_H__
-#define __CONFIG_EZKIT533_H__
-
-#define CFG_LONGHELP           1
-#define CONFIG_BAUDRATE                57600
-#define CONFIG_STAMP           1
-#define CONFIG_BOOTDELAY       5
-
-#define CONFIG_DRIVER_SMC91111 1
-#define CONFIG_SMC91111_BASE   0x20310300
-#if 0
-#define CONFIG_MII
-#define CFG_DISCOVER_PHY
-#endif
-
-#define CONFIG_RTC_BF533       1
-#define CONFIG_BOOT_RETRY_TIME -1      /* Enable this if bootretry required, currently its disabled */
-
-/* CONFIG_CLKIN_HZ is any value in Hz                           */
-#define CONFIG_CLKIN_HZ                 27000000
-/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN     */
-/*                                                 1=CLKIN/2    */
-#define CONFIG_CLKIN_HALF              0
-/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass         */
-/*                                              1=bypass PLL    */
-#define CONFIG_PLL_BYPASS              0
-/* CONFIG_VCO_MULT controls what the multiplier of the PLL is.  */
-/* Values can range from 1-64                                   */
-#define CONFIG_VCO_MULT                        22
-/* CONFIG_CCLK_DIV controls what the core clock divider is      */
-/* Values can be 1, 2, 4, or 8 ONLY                             */
-#define CONFIG_CCLK_DIV                        1
-/* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
-/* Values can range from 1-15                                   */
-#define CONFIG_SCLK_DIV                        5
-
-#if ( CONFIG_CLKIN_HALF == 0 )
-#define CONFIG_VCO_HZ          ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
-#else
-#define CONFIG_VCO_HZ          (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
-#endif
-
-#if (CONFIG_PLL_BYPASS == 0)
-#define CONFIG_CCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
-#define CONFIG_SCLK_HZ         ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
-#else
-#define CONFIG_CCLK_HZ         CONFIG_CLKIN_HZ
-#define CONFIG_SCLK_HZ         CONFIG_CLKIN_HZ
-#endif
-
-#define CONFIG_MEM_SIZE                        32             /* 128, 64, 32, 16 */
-#define CONFIG_MEM_ADD_WDTH             9             /* 8, 9, 10, 11    */
-#define CONFIG_MEM_MT48LC16M16A2TG_75   1
-
-#define CONFIG_LOADS_ECHO      1
-
-
-#define CONFIG_COMMANDS                        (CONFIG_CMD_DFL | \
-                                        CFG_CMD_PING   | \
-                                        CFG_CMD_ELF    | \
-                                        CFG_CMD_I2C    | \
-                                        CFG_CMD_JFFS2  | \
-                                        CFG_CMD_DATE)
-#define CONFIG_BOOTARGS "root=/dev/mtdblock0 ip=192.168.0.15:192.168.0.2:192.168.0.1:255.255.255.0:ezkit:eth0:off"
-
-/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
-#include <cmd_confdefs.h>
-
-#define CFG_PROMPT             "ezkit> "       /* 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      0x00100000      /* memtest works on */
-#define CFG_MEMTEST_END                0x01F00000      /* 1 ... 31 MB in DRAM */
-#define CFG_LOAD_ADDR          0x01000000      /* default load address */
-#define CFG_HZ                 1000    /* decrementer freq: 10 ms ticks */
-#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
-#define CFG_SDRAM_BASE         0x00000000
-#define CFG_MAX_RAM_SIZE       0x02000000
-#define CFG_FLASH_BASE         0x20000000
-
-#define CFG_MONITOR_LEN                (256 << 10)     /* Reserve 256 kB for Monitor   */
-#define CFG_MONITOR_BASE       (CFG_MAX_RAM_SIZE - CFG_MONITOR_LEN)
-#define CFG_MALLOC_LEN         (128 << 10)     /* Reserve 128 kB for malloc()  */
-#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
-#define CFG_GBL_DATA_SIZE      0x4000
-#define CFG_GBL_DATA_ADDR      (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
-#define CONFIG_STACKBASE       (CFG_GBL_DATA_ADDR  - 4)
-
-#define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
-#define CFG_FLASH0_BASE                0x20000000
-#define CFG_FLASH1_BASE                0x20200000
-#define CFG_FLASH2_BASE                0x20280000
-#define CFG_MAX_FLASH_BANKS    3       /* max number of memory banks */
-#define CFG_MAX_FLASH_SECT     40      /* max number of sectors on one chip */
-
-#define CFG_ENV_IS_IN_FLASH    1
-#define CFG_ENV_ADDR           0x20020000
-#define CFG_ENV_SECT_SIZE      0x10000 /* Total Size of Environment Sector */
-
-/* JFFS Partition offset set  */
-#define CFG_JFFS2_FIRST_BANK 0
-#define CFG_JFFS2_NUM_BANKS  1
-/* 512k reserved for u-boot */
-#define CFG_JFFS2_FIRST_SECTOR                11
-
-
-/*
- * Stack sizes
- */
-#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
-
-#define POLL_MODE              1
-#define FLASH_TOT_SECT         40
-#define FLASH_SIZE             0x220000
-#define CFG_FLASH_SIZE         0x220000
-
-/*
- * Initialize PSD4256 registers for using I2C
- */
-#define CONFIG_MISC_INIT_R
-
-/*
- * I2C settings
- * By default PF1 is used as SDA and PF0 as SCL on the Stamp board
- */
-#define CONFIG_SOFT_I2C                        1       /* I2C bit-banged               */
-/*
- * Software (bit-bang) I2C driver configuration
- */
-#define PF_SCL                         PF0
-#define PF_SDA                         PF1
-
-#define I2C_INIT                       (*pFIO_DIR |=  PF_SCL); asm("ssync;")
-#define I2C_ACTIVE                     (*pFIO_DIR |=  PF_SDA); *pFIO_INEN &= ~PF_SDA; asm("ssync;")
-#define I2C_TRISTATE                   (*pFIO_DIR &= ~PF_SDA); *pFIO_INEN |= PF_SDA; asm("ssync;")
-#define I2C_READ                       ((volatile)(*pFIO_FLAG_D & PF_SDA) != 0); asm("ssync;")
-#define I2C_SDA(bit)                   if(bit) { \
-                                                       *pFIO_FLAG_S = PF_SDA; \
-                                                       asm("ssync;"); \
-                                               } \
-                                       else    { \
-                                                       *pFIO_FLAG_C = PF_SDA; \
-                                                       asm("ssync;"); \
-                                               }
-#define I2C_SCL(bit)                   if(bit) { \
-                                                       *pFIO_FLAG_S = PF_SCL; \
-                                                       asm("ssync;"); \
-                                               } \
-                                       else    { \
-                                                       *pFIO_FLAG_C = PF_SCL; \
-                                                       asm("ssync;"); \
-                                               }
-#define I2C_DELAY                      udelay(5)       /* 1/4 I2C clock duration */
-
-#define CFG_I2C_SPEED                  50000
-#define CFG_I2C_SLAVE                  0xFE
-
-
-#define __ADSPLPBLACKFIN__     1
-#define __ADSPBF533__          1
-
-/* 0xFF, 0x7BB07BB0, 0x22547BB0 */
-/* #define AMGCTLVAL           (AMBEN_P0 | AMBEN_P1 | AMBEN_P2 | AMCKEN)
-#define AMBCTL0VAL             (B1WAT_7 | B1RAT_11 | B1HT_2 | B1ST_3 | B1TT_4 | ~B1RDYPOL |    \
-                               ~B1RDYEN | B0WAT_7 | B0RAT_11 | B0HT_2 | B0ST_3 | B0TT_4 | ~B0RDYPOL | ~B0RDYEN)
-#define AMBCTL1VAL             (B3WAT_2 | B3RAT_2 | B3HT_1 | B3ST_1 | B3TT_4 | B3RDYPOL | ~B3RDYEN |   \
-                               B2WAT_7 | B2RAT_11 | B2HT_2 | B2ST_3 | B2TT_4 | ~B2RDYPOL | ~B2RDYEN)
-*/
-#define AMGCTLVAL              0xFF
-#define AMBCTL0VAL             0x7BB07BB0
-#define AMBCTL1VAL             0xFFC27BB0
-
-#define CONFIG_VDSP            1
-
-#ifdef CONFIG_VDSP
-#define ET_EXEC_VDSP           0x8
-#define SHT_STRTAB_VDSP                0x1
-#define ELFSHDRSIZE_VDSP       0x2C
-#define VDSP_ENTRY_ADDR                0xFFA00000
-#endif
-
-#endif
index 45a28c7c49ae53a2a5adad54518f2d4f223bb584..4d813d8be789aa1e7f410b26c4756120bcafd1e5 100644 (file)
  */
 #define CONFIG_MPC5xxx_FEC     1
 #define CONFIG_PHY_ADDR                0x00
+#define CONFIG_MII             1               /* MII PHY management           */
 
 /*
  * GPIO configuration
diff --git a/include/configs/jupiter.h b/include/configs/jupiter.h
new file mode 100644 (file)
index 0000000..5b97526
--- /dev/null
@@ -0,0 +1,291 @@
+/*
+ * (C) Copyright 2007
+ * Heiko Schocher, DENX Software Engineering, hs@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 __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+
+#define CONFIG_MPC5xxx         1       /* This is an MPC5xxx CPU */
+#define CONFIG_MPC5200         1       /* especially an MPC5200 */
+#define CONFIG_JUPITER         1       /* ... on Jupiter board */
+
+#define CFG_MPC5XXX_CLKIN      33000000 /* ... running at 33.000000MHz */
+
+#define CONFIG_BOARD_EARLY_INIT_R      1
+#define CONFIG_BOARD_EARLY_INIT_F      1
+
+#define BOOTFLAG_COLD          0x01    /* Normal Power-On: Boot from FLASH  */
+#define BOOTFLAG_WARM          0x02    /* Software reboot           */
+
+#define CFG_CACHELINE_SIZE     32      /* For MPC5xxx CPUs */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#  define CFG_CACHELINE_SHIFT  5       /* log base 2 of the above value */
+#endif
+
+/*
+ * Serial console configuration
+ */
+#define CONFIG_PSC_CONSOLE     1       /* console is on PSC1 */
+#define CONFIG_BAUDRATE                115200  /* ... at 115200 bps */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200, 230400 }
+
+/*
+ * PCI Mapping:
+ * 0x40000000 - 0x4fffffff - PCI Memory
+ * 0x50000000 - 0x50ffffff - PCI IO Space
+ */
+/*#define CONFIG_PCI           */
+
+#if defined(CONFIG_PCI)
+#define CONFIG_PCI_PNP         1
+#define CONFIG_PCI_SCAN_SHOW   1
+
+#define CONFIG_PCI_MEM_BUS     0x40000000
+#define CONFIG_PCI_MEM_PHYS    CONFIG_PCI_MEM_BUS
+#define CONFIG_PCI_MEM_SIZE    0x10000000
+
+#define CONFIG_PCI_IO_BUS      0x50000000
+#define CONFIG_PCI_IO_PHYS     CONFIG_PCI_IO_BUS
+#define CONFIG_PCI_IO_SIZE     0x01000000
+#define ADD_PCI_CMD            CFG_CMD_PCI
+#endif
+
+#define CFG_XLB_PIPELINING     1
+
+#define CONFIG_NET_MULTI       1
+#define CONFIG_MII             1
+#define CFG_RX_ETH_BUFFER      8  /* use 8 rx buffer on eepro100  */
+
+/* Partitions */
+#define CONFIG_MAC_PARTITION
+#define CONFIG_DOS_PARTITION
+#define CONFIG_ISO_PARTITION
+
+#define        CONFIG_TIMESTAMP                /* Print image info with timestamp */
+
+/*
+ * Supported commands
+ */
+#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
+                               CFG_CMD_NFS     | \
+                               CFG_CMD_SNTP)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/*
+ * Autobooting
+ */
+#define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds */
+
+#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"                                                 \
+       "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"                  \
+       "flash_nfs=run nfsargs addip addcons;"                          \
+               "bootm ${kernel_addr}\0"                                \
+       "flash_self=run ramargs addip;"                                 \
+               "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
+       "addcons=setenv bootargs ${bootargs} console=${contyp},"        \
+               "${baudrate}\0"                                         \
+       "contyp=ttyS0\0"                                                \
+       "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addcons;"    \
+               "bootm\0"                                               \
+       "rootpath=/opt/eldk/ppc_6xx\0"                                  \
+       "bootfile=/tftpboot/jupiter/uImage\0"                           \
+       ""
+
+#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+/*
+ * IPB Bus clocking configuration.
+ */
+#undef CFG_IPBSPEED_133        /* define for 133MHz speed */
+
+#if 0
+/* pass open firmware flat tree */
+#define CONFIG_OF_FLAT_TREE    1
+#define CONFIG_OF_BOARD_SETUP  1
+
+/* maximum size of the flat tree (8K) */
+#define OF_FLAT_TREE_MAX_SIZE  8192
+
+#define OF_CPU                 "PowerPC,5200@0"
+#define OF_SOC                 "soc5200@f0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 8)
+#define OF_STDOUT_PATH         "/soc5200@f0000000/serial@2000"
+#endif
+
+#if 0
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C                1       /* I2C with hardware support */
+#define CFG_I2C_MODULE         2       /* Select I2C module #1 or #2 */
+
+#define CFG_I2C_SPEED          100000 /* 100 kHz */
+#define CFG_I2C_SLAVE          0x7F
+
+/*
+ * EEPROM configuration
+ */
+#define CFG_I2C_EEPROM_ADDR            0x50    /* 1010000x */
+#define CFG_I2C_EEPROM_ADDR_LEN                1
+#define CFG_EEPROM_PAGE_WRITE_BITS     3
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 70
+#endif
+
+/*
+ * Flash configuration
+ */
+#define CFG_FLASH_BASE         0xFF000000
+#define CFG_FLASH_SIZE         0x01000000
+
+#define CFG_MAX_FLASH_SECT     128     /* max num of sects on one chip */
+
+#define CFG_ENV_ADDR           (TEXT_BASE + 0x40000) /* third sector */
+
+#define CFG_FLASH_ERASE_TOUT   240000  /* Flash Erase Timeout (in ms)  */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (in ms)  */
+
+#define CFG_MAX_FLASH_BANKS    1       /* max num of flash banks */
+
+#define CFG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#define CFG_FLASH_EMPTY_INFO
+#define CFG_FLASH_CFI_WIDTH    FLASH_CFI_8BIT
+#define CFG_UPDATE_FLASH_SIZE  1
+#define CFG_FLASH_USE_BUFFER_WRITE     1
+
+/*
+ * Environment settings
+ */
+#define CFG_ENV_IS_IN_FLASH    1
+#define CFG_ENV_SIZE           0x20000
+#define CFG_ENV_SECT_SIZE      0x20000
+#define CONFIG_ENV_OVERWRITE   1
+
+/* 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)
+
+/*
+ * Memory map
+ */
+#define CFG_MBAR               0xF0000000
+#define CFG_SDRAM_BASE         0x00000000
+#define CFG_DEFAULT_MBAR       0x80000000
+
+/* Use SRAM until RAM will be available */
+#define CFG_INIT_RAM_ADDR      MPC5XXX_SRAM
+#define CFG_INIT_RAM_END       MPC5XXX_SRAM_SIZE       /* End of used area in DPRAM */
+
+
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes reserved 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                (192 << 10)     /* Reserve 192 kB for Monitor   */
+#define CFG_MALLOC_LEN         (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
+
+/*
+ * Ethernet configuration
+ */
+#define CONFIG_MPC5xxx_FEC     1
+/*
+ * Define CONFIG_FEC_10MBIT to force FEC at 10Mb
+ */
+/* #define CONFIG_FEC_10MBIT 1 */
+#define CONFIG_PHY_ADDR                0x00
+
+/*
+ * GPIO configuration
+ */
+#define CFG_GPS_PORT_CONFIG    0x10000004
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory     */
+#define CFG_PROMPT             "=> "   /* Monitor Command Prompt   */
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+#define CFG_HUSH_PARSER                1       /* Use the HUSH parser          */
+#ifdef CFG_HUSH_PARSER
+#define        CFG_PROMPT_HUSH_PS2     "> "
+#endif
+#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      0x00100000      /* memtest works on */
+#define CFG_MEMTEST_END                0x00f00000      /* 1 ... 15 MB in DRAM  */
+#define CFG_ALT_MEMTEST                1
+
+#define CFG_LOAD_ADDR          0x200000        /* default load address */
+
+#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 CFG_BOOTCS_START       CFG_FLASH_BASE
+#define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
+#define CFG_BOOTCS_CFG         0x00047801
+#define CFG_CS0_START          CFG_FLASH_BASE
+#define CFG_CS0_SIZE           CFG_FLASH_SIZE
+
+#define CFG_CS_BURST           0x00000000
+#define CFG_CS_DEADCYCLE       0x33333333
+
+#define CFG_RESET_ADDRESS      0xff000000
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/katmai.h b/include/configs/katmai.h
new file mode 100644 (file)
index 0000000..cc47a16
--- /dev/null
@@ -0,0 +1,441 @@
+/*
+ * (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           0xfe000000      /* 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          (EBC_BXAP_BME_DISABLED      |           \
+                                EBC_BXAP_TWT_ENCODE(4)     |           \
+                                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_NONDELAYED    |           \
+                                EBC_BXAP_BEM_WRITEONLY     |           \
+                                EBC_BXAP_PEN_DISABLED)
+#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 */
diff --git a/include/configs/lpc2292sodimm.h b/include/configs/lpc2292sodimm.h
new file mode 100644 (file)
index 0000000..7e51523
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * (C) Copyright 2000
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * Configuation settings for the EP7312 board.
+ *
+ * Modified to work on Armadillo HT1070 ARM720T board
+ * (C) Copyright 2005 Rowel Atienza rowel@diwalabs.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
+
+/*
+ * If we are developing, we might want to start armboot from ram
+ * so we MUST NOT initialize critical regs like mem-timing ...
+ */
+#undef CONFIG_INIT_CRITICAL            /* undef for developing */
+
+#undef CONFIG_SKIP_LOWLEVEL_INIT
+#undef CONFIG_SKIP_RELOCATE_UBOOT
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM7            1       /* This is a ARM7 CPU   */
+#define CONFIG_ARM_THUMB       1       /* this is an ARM720TDMI */
+#define CONFIG_LPC2292
+#undef  CONFIG_ARM7_REVD               /* disable ARM720 REV.D Workarounds */
+
+#undef CONFIG_USE_IRQ                  /* don't need them anymore */
+
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN         (CFG_ENV_SIZE + 128*1024)
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes reserved for initial data */
+
+/*
+ * Hardware drivers
+ */
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_SERIAL1         1       /* we use Serial line 1 */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE                115200
+
+#define CONFIG_BOOTP_MASK       (CONFIG_BOOTP_DEFAULT|CONFIG_BOOTP_BOOTFILESIZE)
+
+/*
+ * Supported commands
+ */
+#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
+                               CFG_CMD_DHCP    | \
+                               CFG_CMD_FAT     | \
+                               CFG_CMD_MMC     | \
+                               CFG_CMD_NET     | \
+                               CFG_CMD_PING)
+
+#define CONFIG_MAC_PARTITION
+#define CONFIG_DOS_PARTITION
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#define CONFIG_BOOTDELAY       5
+
+/*
+ * Miscellaneous configurable options
+ */
+#define        CFG_LONGHELP                            /* undef to save memory         */
+#define        CFG_PROMPT              "LPC2292SODIMM # " /* 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      0x40000000      /* memtest works on     */
+#define CFG_MEMTEST_END                0x40000000      /* 4 ... 8 MB in DRAM   */
+
+#undef  CFG_CLKS_IN_HZ         /* everything, incl board info, in Hz */
+
+#define        CFG_LOAD_ADDR           0x00040000      /* default load address for armadillo: kernel img is here*/
+
+#define CFG_SYS_CLK_FREQ        58982400        /* Hz */
+#define        CFG_HZ                  2048            /* decrementer freq in Hz */
+
+                                               /* valid baudrates */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       (128*1024)      /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ   (4*1024)        /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ   (4*1024)        /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS   1          /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1           0x81000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE      0x00800000 /* 8 MB SDRAM */
+
+#define PHYS_FLASH_1           0x80000000 /* Flash Bank #1 */
+#define PHYS_FLASH_SIZE                0x00200000 /* 2 MB */
+
+#define CFG_FLASH_BASE         PHYS_FLASH_1
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CFG_MAX_FLASH_BANKS    2       /* max number of memory banks           */
+#define CFG_MAX_FLASH_SECT     1024    /* max number of sectors on one chip    */
+
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT   (2*CFG_HZ) /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT   (2*CFG_HZ) /* Timeout for Flash Write */
+
+#define        CFG_ENV_IS_IN_FLASH     1
+#define CFG_ENV_ADDR           (0x0 + 0x3C000) /* Addr of Environment Sector   */
+#define CFG_ENV_SIZE           0x2000 /* Total Size of Environment Sector      */
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_MMC 1
+
+#endif /* __CONFIG_H */
index 0350e91f0fb5c1903ad6454220bae98375adfd8f..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
        "bootfile=/tftpboot/luan/uImage\0"                              \
        "kernel_addr=fc000000\0"                                        \
        "ramdisk_addr=fc100000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/luan/u-boot.bin\0"                  \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
 #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 00d2e07e4a41726c12557e9103e8ded3a0a00b9d..c2324a04c911396e38690d1ad165cc49ca8ef569 100644 (file)
  */
 #if !defined(CONFIG_PRS200)
 #define CONFIG_LCD             1
+#define CONFIG_PROGRESSBAR 1
 #endif
 
 #if defined(CONFIG_LCD)
diff --git a/include/configs/mecp5200.h b/include/configs/mecp5200.h
new file mode 100644 (file)
index 0000000..0c10294
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * (C) Copyright 2003-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
+ */
+
+
+/*************************************************************************
+ * (c) 2005 esd gmbh Hannover
+ *
+ *
+ * from IceCube.h file
+ * by Reinhard Arlt reinhard.arlt@esd-electronics.com
+ *
+ *************************************************************************/
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+
+#define CONFIG_MPC5200         1       /* This is an MPC5xxx CPU */
+#define CONFIG_MPC5xxx         1       /* This is an MPC5xxx CPU */
+#define CONFIG_ICECUBE         1       /* ... on IceCube board */
+#define CONFIG_MECP5200                1       /* ... on MECP5200  board */
+#define CONFIG_MPC5200_DDR      1       /* ... use DDR RAM      */
+
+#define CFG_MPC5XXX_CLKIN      33000000 /* ... running at 33.000000MHz */
+
+#define BOOTFLAG_COLD          0x01    /* Normal Power-On: Boot from FLASH  */
+#define BOOTFLAG_WARM          0x02    /* Software reboot           */
+
+#define CFG_CACHELINE_SIZE     32      /* For MPC5xxx CPUs */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#  define CFG_CACHELINE_SHIFT  5       /* log base 2 of the above value */
+#endif
+
+/*
+ * Serial console configuration
+ */
+#define CONFIG_PSC_CONSOLE     1       /* console is on PSC1 */
+#if 0 /* test-only */
+#define CONFIG_BAUDRATE                115200  /* ... at 115200 bps */
+#else
+#define CONFIG_BAUDRATE                9600    /* ... at 115200 bps */
+#endif
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200, 230400 }
+
+
+#ifdef CONFIG_MPC5200  /* MPC5100 PCI is not supported yet. */
+
+#define CONFIG_MII
+#if 0 /* test-only !!! */
+#define CONFIG_NET_MULTI       1
+#define CONFIG_EEPRO100                1
+#define CFG_RX_ETH_BUFFER      8  /* use 8 rx buffer on eepro100  */
+#define CONFIG_NS8382X         1
+#endif
+
+#else  /* MPC5100 */
+
+#endif
+
+/* Partitions */
+#define CONFIG_MAC_PARTITION
+#define CONFIG_DOS_PARTITION
+
+/* USB */
+#if 0
+#define CONFIG_USB_OHCI
+#define ADD_USB_CMD            CFG_CMD_USB | CFG_CMD_FAT
+#define CONFIG_USB_STORAGE
+#else
+#define ADD_USB_CMD            0
+#endif
+
+/*
+ * Supported commands
+ */
+#define CONFIG_COMMANDS                (CONFIG_CMD_DFL | \
+                                CFG_CMD_EEPROM | \
+                                CFG_CMD_FAT    | \
+                                CFG_CMD_EXT2   | \
+                                CFG_CMD_I2C    | \
+                                CFG_CMD_IDE    | \
+                                CFG_CMD_BSP    | \
+                                CFG_CMD_ELF)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#if (TEXT_BASE == 0xFF000000)          /* Boot low with 16 MB Flash */
+#   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_LOWBOOT08       1
+#endif
+
+/*
+ * Autobooting
+ */
+#define CONFIG_BOOTDELAY       3       /* autoboot after 5 seconds */
+
+#define CONFIG_PREBOOT "echo;" \
+       "echo Welcome to CBX-CPU5200 (mecp5200);" \
+       "echo"
+
+#undef CONFIG_BOOTARGS
+
+#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" \
+       ""
+
+#define CONFIG_BOOTCOMMAND     "run flash_vxworks0"
+
+#if defined(CONFIG_MPC5200)
+/*
+ * IPB Bus clocking configuration.
+ */
+#undef CFG_IPBSPEED_133                /* define for 133MHz speed */
+#endif
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C                1       /* I2C with hardware support */
+#define CFG_I2C_MODULE         2       /* Select I2C module #1 or #2 */
+
+#define CFG_I2C_SPEED          86000 /* 100 kHz */
+#define CFG_I2C_SLAVE          0x7F
+
+/*
+ * EEPROM configuration
+ */
+#define CFG_I2C_EEPROM_ADDR            0x50    /* 1010000x */
+#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
+/*
+ * Flash configuration
+ */
+#define CFG_FLASH_BASE         0xFFC00000
+#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 CFG_FLASH_ERASE_TOUT   240000  /* Flash Erase Timeout (in ms)  */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (in ms)  */
+
+/*
+ * Environment settings
+ */
+#if 1 /* test-only */
+#define CFG_ENV_IS_IN_FLASH    1
+#define CFG_ENV_SIZE           0x10000
+#define CFG_ENV_SECT_SIZE      0x10000
+#define CONFIG_ENV_OVERWRITE   1
+#else
+#define CFG_ENV_IS_IN_EEPROM   1       /* use EEPROM for environment vars */
+#define CFG_ENV_OFFSET         0x0000  /* environment starts at the beginning of the EEPROM */
+#define CFG_ENV_SIZE           0x0400  /* 8192 bytes may be used for env vars*/
+                                  /* total size of a CAT24WC32 is 8192 bytes */
+#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           */
+#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_BANKS_LIST  { CFG_FLASH_BASE }
+#define CFG_FLASH_EMPTY_INFO   1          /* show if bank is empty             */
+
+
+/*
+ * Memory map
+ */
+#define CFG_MBAR               0xF0000000
+#define CFG_SDRAM_BASE         0x00000000
+#define CFG_DEFAULT_MBAR       0x80000000
+
+/* Use SRAM until RAM will be available */
+#define CFG_INIT_RAM_ADDR      MPC5XXX_SRAM
+#define CFG_INIT_RAM_END       MPC5XXX_SRAM_SIZE       /* End of used area in DPRAM */
+
+
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes reserved 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                (192 << 10)     /* Reserve 192 kB for Monitor   */
+#define CFG_MALLOC_LEN         (128 << 10)     /* Reserve 128 kB for malloc()  */
+#define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
+
+/*
+ * Ethernet configuration
+ */
+#define CONFIG_MPC5xxx_FEC     1
+/*
+ * Define CONFIG_FEC_10MBIT to force FEC at 10Mb
+ */
+/* #define CONFIG_FEC_10MBIT 1 */
+#define CONFIG_PHY_ADDR                0x00
+#define CONFIG_UDP_CHECKSUM     1
+
+
+/*
+ * GPIO configuration
+ */
+#define CFG_GPS_PORT_CONFIG    0x01052444
+
+/*
+ * 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      0x00100000      /* memtest works on */
+#define CFG_MEMTEST_END                0x00f00000      /* 1 ... 15 MB in DRAM  */
+
+#define CFG_LOAD_ADDR          0x100000        /* default load address */
+
+#define CFG_HZ                 1000            /* decrementer freq: 1 ms ticks */
+
+#define CFG_VXWORKS_MAC_PTR    0x00000000      /* Pass Ethernet MAC to VxWorks */
+
+/*
+ * Various low-level settings
+ */
+#if defined(CONFIG_MPC5200)
+#define CFG_HID0_INIT          HID0_ICE | HID0_ICFI
+#define CFG_HID0_FINAL         HID0_ICE
+#else
+#define CFG_HID0_INIT          0
+#define CFG_HID0_FINAL         0
+#endif
+
+#define CFG_BOOTCS_START       CFG_FLASH_BASE
+#define CFG_BOOTCS_SIZE                CFG_FLASH_SIZE
+#define CFG_BOOTCS_CFG         0x00085d00
+
+#define CFG_CS0_START          CFG_FLASH_BASE
+#define CFG_CS0_SIZE           CFG_FLASH_SIZE
+
+#define CFG_CS1_START          0xfd000000
+#define CFG_CS1_SIZE           0x00010000
+#define CFG_CS1_CFG            0x10101410
+
+#define CFG_CS_BURST           0x00000000
+#define CFG_CS_DEADCYCLE       0x33333333
+
+#define CFG_RESET_ADDRESS      0xff000000
+
+/*-----------------------------------------------------------------------
+ * USB stuff
+ *-----------------------------------------------------------------------
+ */
+#define CONFIG_USB_CLOCK       0x0001BBBB
+#define CONFIG_USB_CONFIG      0x00001000
+
+/*-----------------------------------------------------------------------
+ * IDE/ATA stuff Supports IDE harddisk
+ *-----------------------------------------------------------------------
+ */
+
+#undef  CONFIG_IDE_8xx_PCCARD          /* Use IDE with PC Card Adapter */
+
+#undef CONFIG_IDE_8xx_DIRECT           /* Direct IDE    not supported  */
+#undef CONFIG_IDE_LED                  /* LED   for ide not supported  */
+
+#define        CONFIG_IDE_RESET                /* reset for ide supported      */
+#define CONFIG_IDE_PREINIT
+
+#define CFG_IDE_MAXBUS         1       /* max. 1 IDE bus               */
+#define CFG_IDE_MAXDEVICE      1       /* max. 1 drive per IDE bus     */
+
+#define CFG_ATA_IDE0_OFFSET    0x0000
+
+#define CFG_ATA_BASE_ADDR      MPC5XXX_ATA
+
+/* Offset for data I/O                 */
+#define CFG_ATA_DATA_OFFSET    (0x0060)
+
+/* Offset for normal register accesses */
+#define CFG_ATA_REG_OFFSET     (CFG_ATA_DATA_OFFSET)
+
+/* Offset for alternate registers      */
+#define CFG_ATA_ALT_OFFSET     (0x005C)
+
+/* Interval between registers          */
+#define CFG_ATA_STRIDE         4
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ml401.h b/include/configs/ml401.h
new file mode 100644 (file)
index 0000000..3db2877
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * (C) Copyright 2007 Czech Technical University.
+ *
+ * Michal SIMEK <monstr@seznam.cz>
+ *
+ * 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
+
+#include "../board/xilinx/ml401/xparameters.h"
+
+#define        CONFIG_MICROBLAZE       1       /* MicroBlaze CPU */
+#define        MICROBLAZE_V5           1
+#define        CONFIG_ML401            1       /* ML401 Board */
+
+/* uart */
+#define        CONFIG_SERIAL_BASE      XILINX_UART_BASEADDR
+#define        CONFIG_BAUDRATE         XILINX_UART_BAUDRATE
+#define        CFG_BAUDRATE_TABLE      { CONFIG_BAUDRATE }
+
+/* setting reset address */
+/*#define      CFG_RESET_ADDRESS       TEXT_BASE*/
+
+/* ethernet */
+#define CONFIG_EMACLITE                1
+#define XPAR_EMAC_0_DEVICE_ID  XPAR_OPB_ETHERNET_0_DEVICE_ID
+
+/* gpio */
+#define        CFG_GPIO_0              1
+#define        CFG_GPIO_0_ADDR         XILINX_GPIO_BASEADDR
+
+/* interrupt controller */
+#define        CFG_INTC_0              1
+#define        CFG_INTC_0_ADDR         XILINX_INTC_BASEADDR
+#define        CFG_INTC_0_NUM          XILINX_INTC_NUM_INTR_INPUTS
+
+/* timer */
+#define        CFG_TIMER_0             1
+#define        CFG_TIMER_0_ADDR        XILINX_TIMER_BASEADDR
+#define        CFG_TIMER_0_IRQ         XILINX_TIMER_IRQ
+#define        FREQUENCE               XILINX_CLOCK_FREQ
+#define        CFG_TIMER_0_PRELOAD     ( FREQUENCE/1000 )
+
+/* FSL */
+#define        CFG_FSL_2
+#define        FSL_INTR_2      1
+
+/*
+ * memory layout - Example
+ * TEXT_BASE = 0x1200_0000;
+ * CFG_SRAM_BASE = 0x1000_0000;
+ * CFG_SRAM_SIZE = 0x0400_0000;
+ *
+ * CFG_GBL_DATA_OFFSET = 0x1000_0000 + 0x0400_0000 - 0x1000 = 0x13FF_F000
+ * CFG_MONITOR_BASE = 0x13FF_F000 - 0x40000 = 0x13FB_F000
+ * CFG_MALLOC_BASE = 0x13FB_F000 - 0x40000 = 0x13F7_F000
+ *
+ * 0x1000_0000 CFG_SDRAM_BASE
+ *                                     FREE
+ * 0x1200_0000 TEXT_BASE
+ *             U-BOOT code
+ * 0x1202_0000
+ *                                     FREE
+ *
+ *                                     STACK
+ * 0x13F7_F000 CFG_MALLOC_BASE
+ *                                     MALLOC_AREA     256kB   Alloc
+ * 0x11FB_F000 CFG_MONITOR_BASE
+ *                                     MONITOR_CODE    256kB   Env
+ * 0x13FF_F000 CFG_GBL_DATA_OFFSET
+ *                                     GLOBAL_DATA     4kB     bd, gd
+ * 0x1400_0000 CFG_SDRAM_BASE + CFG_SDRAM_SIZE
+ */
+
+/* ddr sdram - main memory */
+#define        CFG_SDRAM_BASE          XILINX_RAM_START
+#define        CFG_SDRAM_SIZE          XILINX_RAM_SIZE
+#define        CFG_MEMTEST_START       CFG_SDRAM_BASE
+#define        CFG_MEMTEST_END         (CFG_SDRAM_BASE + 0x1000)
+
+/* global pointer */
+#define        CFG_GBL_DATA_SIZE       0x1000  /* size of global data */
+/* start of global data */
+#define        CFG_GBL_DATA_OFFSET     (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - CFG_GBL_DATA_SIZE)
+
+/* monitor code */
+#define        SIZE                    0x40000
+#define        CFG_MONITOR_LEN         SIZE
+#define        CFG_MONITOR_BASE        (CFG_GBL_DATA_OFFSET - CFG_MONITOR_LEN)
+#define        CFG_MONITOR_END         (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
+#define        CFG_MALLOC_LEN          SIZE
+#define        CFG_MALLOC_BASE         (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+
+/* stack */
+#define        CFG_INIT_SP_OFFSET      CFG_MONITOR_BASE
+
+/*#define      RAMENV */
+#define        FLASH
+
+#ifdef FLASH
+       #define CFG_FLASH_BASE          XILINX_FLASH_START
+       #define CFG_FLASH_SIZE          XILINX_FLASH_SIZE
+       #define CFG_FLASH_CFI           1
+       #define CFG_FLASH_CFI_DRIVER    1
+       #define CFG_FLASH_EMPTY_INFO    1       /* ?empty sector */
+       #define CFG_MAX_FLASH_BANKS     1       /* max number of memory banks */
+       #define CFG_MAX_FLASH_SECT      128     /* max number of sectors on one chip */
+       #define CFG_FLASH_PROTECTION            /* hardware flash protection */
+
+       #ifdef  RAMENV
+               #define CFG_ENV_IS_NOWHERE      1
+               #define CFG_ENV_SIZE            0x1000
+               #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SIZE)
+
+       #else   /* !RAMENV */
+               #define CFG_ENV_IS_IN_FLASH     1
+               #define CFG_ENV_ADDR            0x40000
+               #define CFG_ENV_SECT_SIZE       0x40000 /* 256K(one sector) for env */
+               #define CFG_ENV_SIZE            0x2000
+       #endif /* !RAMBOOT */
+#else /* !FLASH */
+       /* ENV in RAM */
+       #define CFG_NO_FLASH            1
+       #define CFG_ENV_IS_NOWHERE      1
+       #define CFG_ENV_SIZE            0x1000
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SIZE)
+       #define CFG_FLASH_PROTECTION            /* hardware flash protection */
+#endif /* !FLASH */
+
+#ifdef FLASH
+       #ifdef  RAMENV
+       #define CONFIG_COMMANDS (CONFIG__CMD_DFL |\
+                               CFG_CMD_MEMORY |\
+                               CFG_CMD_MISC |\
+                               CFG_CMD_AUTOSCRIPT |\
+                               CFG_CMD_IRQ |\
+                               CFG_CMD_ASKENV |\
+                               CFG_CMD_BDI |\
+                               CFG_CMD_RUN |\
+                               CFG_CMD_LOADS |\
+                               CFG_CMD_LOADB |\
+                               CFG_CMD_IMI |\
+                               CFG_CMD_NET |\
+                               CFG_CMD_CACHE |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
+                               CFG_CMD_JFFS2 |\
+                               CFG_CMD_ECHO |\
+                               CFG_CMD_IMLS |\
+                               CFG_CMD_FLASH |\
+                               CFG_CMD_MFSL |\
+                               CFG_CMD_PING \
+                               )
+       #else   /* !RAMENV */
+       #define CONFIG_COMMANDS (CONFIG__CMD_DFL |\
+                               CFG_CMD_MEMORY |\
+                               CFG_CMD_MISC |\
+                               CFG_CMD_AUTOSCRIPT |\
+                               CFG_CMD_IRQ |\
+                               CFG_CMD_ASKENV |\
+                               CFG_CMD_BDI |\
+                               CFG_CMD_RUN |\
+                               CFG_CMD_LOADS |\
+                               CFG_CMD_LOADB |\
+                               CFG_CMD_IMI |\
+                               CFG_CMD_NET |\
+                               CFG_CMD_CACHE |\
+                               CFG_CMD_IMLS |\
+                               CFG_CMD_FLASH |\
+                               CFG_CMD_PING |\
+                               CFG_CMD_ENV |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
+                               CFG_CMD_JFFS2 |\
+                               CFG_CMD_ECHO |\
+                               CFG_CMD_MFSL |\
+                               CFG_CMD_SAVES \
+                               )
+
+       #endif
+
+#else  /* !FLASH */
+       #define CONFIG_COMMANDS (CONFIG__CMD_DFL |\
+                               CFG_CMD_MEMORY |\
+                               CFG_CMD_MISC |\
+                               CFG_CMD_AUTOSCRIPT |\
+                               CFG_CMD_IRQ |\
+                               CFG_CMD_ASKENV |\
+                               CFG_CMD_BDI |\
+                               CFG_CMD_RUN |\
+                               CFG_CMD_LOADS |\
+                               CFG_CMD_FAT |\
+                               CFG_CMD_EXT2 |\
+                               CFG_CMD_LOADB |\
+                               CFG_CMD_IMI |\
+                               CFG_CMD_NET |\
+                               CFG_CMD_CACHE |\
+                               CFG_CMD_MFSL |\
+                               CFG_CMD_PING \
+                               )
+#endif /* !FLASH */
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_JFFS2)
+/* JFFS2 partitions */
+#define CONFIG_JFFS2_CMDLINE   /* mtdparts command line support */
+#define MTDIDS_DEFAULT         "nor0=ml401-0"
+
+/* default mtd partition table */
+#define MTDPARTS_DEFAULT       "mtdparts=ml401-0:256k(u-boot),"\
+                               "256k(env),3m(kernel),1m(romfs),"\
+                               "1m(cramfs),-(jffs2)"
+#endif
+
+/* Miscellaneous configurable options */
+#define        CFG_PROMPT      "U-Boot-mONStR> "
+#define        CFG_CBSIZE      512     /* size of console buffer */
+#define        CFG_PBSIZE      (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) /* print buffer size */
+#define        CFG_MAXARGS     15      /* max number of command args */
+#define        CFG_LONGHELP
+#define        CFG_LOAD_ADDR   0x12000000 /* default load address */
+
+#define        CONFIG_BOOTDELAY        30
+#define        CONFIG_BOOTARGS         "root=romfs"
+#define        CONFIG_HOSTNAME         "ml401"
+#define        CONFIG_BOOTCOMMAND      "base 0;tftp 11000000 image.img;bootm"
+#define        CONFIG_IPADDR           192.168.0.3
+#define        CONFIG_SERVERIP         192.168.0.5
+#define        CONFIG_GATEWAYIP        192.168.0.1
+#define        CONFIG_ETHADDR          00:E0:0C:00:00:FD
+
+/* architecture dependent code */
+#define        CFG_USR_EXCEP   /* user exception */
+#define CFG_HZ 1000
+
+/* system ace */
+#define        CONFIG_SYSTEMACE
+/* #define DEBUG_SYSTEMACE */
+#define        SYSTEMACE_CONFIG_FPGA
+#define        CFG_SYSTEMACE_BASE      XILINX_SYSACE_BASEADDR
+#define        CFG_SYSTEMACE_WIDTH     XILINX_SYSACE_MEM_WIDTH
+#define        CONFIG_DOS_PARTITION
+
+#define        CONFIG_PREBOOT          "echo U-BOOT for ML401;setenv preboot;echo"
+
+#define        CONFIG_EXTRA_ENV_SETTINGS       "unlock=yes\0" /* hardware flash protection */\
+                                       "nor0=ml401-0\0"\
+                                       "mtdparts=mtdparts=ml401-0:"\
+                                       "256k(u-boot),256k(env),3m(kernel),"\
+                                       "1m(romfs),1m(cramfs),-(jffs2)\0"
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/mpc7448hpc2.h b/include/configs/mpc7448hpc2.h
new file mode 100644 (file)
index 0000000..243a3f6
--- /dev/null
@@ -0,0 +1,411 @@
+/*
+ * Copyright (c) 2005 Freescale Semiconductor, Inc.
+ *
+ * (C) Copyright 2006
+ * Alex Bounine , Tundra Semiconductor Corp.
+ * Roy Zang    , <tie-fei.zang@freescale.com> Freescale Corp.
+ *
+ * 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
+ */
+
+/*
+ * board specific configuration options for Freescale
+ * MPC7448HPC2 (High-Performance Computing II) (Taiga) board
+ *
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#undef DEBUG
+
+/* Board Configuration Definitions */
+/* MPC7448HPC2 (High-Performance Computing II) (Taiga) board */
+
+#define CONFIG_MPC7448HPC2
+
+#define CONFIG_74xx
+#define CONFIG_750FX           /* this option to enable init of extended BATs */
+#define CONFIG_ALTIVEC         /* undef to disable */
+
+#define CFG_BOARD_NAME         "MPC7448 HPC II"
+#define CONFIG_IDENT_STRING    " Freescale MPC7448 HPC II"
+
+#define CFG_OCN_CLK            133000000       /* 133 MHz */
+#define CFG_CONFIG_BUS_CLK     133000000
+
+#define CFG_CLK_SPREAD         /* Enable Spread-Spectrum Clock generation */
+
+#undef  CONFIG_ECC             /* disable ECC support */
+
+/* Board-specific Initialization Functions to be called */
+#define CFG_BOARD_ASM_INIT
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_EARLY_INIT_R
+#define CONFIG_MISC_INIT_R
+
+#define CONFIG_HAS_ETH1
+
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+
+#define CONFIG_BAUDRATE                115200  /* console baudrate = 115000 */
+
+/*#define CFG_HUSH_PARSER */
+#undef CFG_HUSH_PARSER
+
+#define CFG_PROMPT_HUSH_PS2    "> "
+
+/* 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,7448@0"
+#define OF_TSI                 "tsi108@c0000000"
+#define OF_TBCLK               (bd->bi_busfreq / 8)
+#define OF_STDOUT_PATH         "/tsi108@c0000000/serial@7808"
+
+/*
+ * The following defines let you select what serial you want to use
+ * for your console driver.
+ *
+ * what to do:
+ * If you have hacked a serial cable onto the second DUART channel,
+ * change the CFG_DUART port from 1 to 0 below.
+ *
+ */
+
+#define CONFIG_CONS_INDEX      1
+#define CFG_NS16550
+#define CFG_NS16550_SERIAL
+#define CFG_NS16550_REG_SIZE   1
+#define CFG_NS16550_CLK                CFG_OCN_CLK * 8
+
+#define CFG_NS16550_COM1       (CFG_TSI108_CSR_RST_BASE+0x7808)
+#define CFG_NS16550_COM2       (CFG_TSI108_CSR_RST_BASE+0x7C08)
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+#define CONFIG_BOOTDELAY       3       /* autoboot after 3 seconds */
+#define CONFIG_ZERO_BOOTDELAY_CHECK
+
+#undef CONFIG_BOOTARGS
+/* #define CONFIG_PREBOOT  "echo;echo Type \"run flash_nfs\"
+ * to mount root filesystem over NFS;echo" */
+
+#if (CONFIG_BOOTDELAY >= 0)
+#define CONFIG_BOOTCOMMAND     "tftpboot 0x400000 zImage.initrd.elf;\
+ setenv bootargs $(bootargs) $(bootargs_root) nfsroot=$(serverip):$(rootpath) \
+ ip=$(ipaddr):$(serverip)$(bootargs_end);  bootm 0x400000; "
+
+#define CONFIG_BOOTARGS "console=ttyS0,115200"
+#endif
+
+#undef CONFIG_EXTRA_ENV_SETTINGS
+
+#define CONFIG_SERIAL  "No. 1"
+
+/* Networking Configuration */
+
+#define KSEG1ADDR(a)   (a)     /* Needed by the rtl8139 driver */
+
+#define CONFIG_TSI108_ETH
+#define CONFIG_TSI108_ETH_NUM_PORTS    2
+
+#define CONFIG_NET_MULTI
+
+#define CONFIG_BOOTFILE                zImage.initrd.elf
+#define CONFIG_LOADADDR                0x400000
+
+/*-------------------------------------------------------------------------- */
+
+#define CONFIG_LOADS_ECHO      0       /* echo off for serial download */
+#define CFG_LOADS_BAUD_CHANGE  /* allow baudrate changes */
+
+#undef CONFIG_WATCHDOG         /* watchdog disabled */
+
+#define CONFIG_BOOTP_MASK      (CONFIG_BOOTP_DEFAULT | \
+                               CONFIG_BOOTP_BOOTFILESIZE)
+
+#define CONFIG_COMMANDS (CONFIG_CMD_DFL \
+               | CFG_CMD_ASKENV \
+               | CFG_CMD_CACHE \
+               | CFG_CMD_PCI \
+               | CFG_CMD_I2C \
+               | CFG_CMD_SDRAM \
+               | CFG_CMD_EEPROM \
+               | CFG_CMD_FLASH \
+               | CFG_CMD_ENV \
+               | CFG_CMD_BSP \
+               | CFG_CMD_DHCP \
+               | CFG_CMD_PING \
+               | CFG_CMD_DATE)
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/*set date in u-boot*/
+#define CONFIG_RTC_M48T35A
+#define CFG_NVRAM_BASE_ADDR    0xfc000000
+#define CFG_NVRAM_SIZE         0x8000
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_VERSION_VARIABLE                1
+#define CONFIG_TSI108_I2C
+
+#define CFG_I2C_EEPROM_ADDR            0x50    /* I2C EEPROM page 1 */
+#define CFG_I2C_EEPROM_ADDR_LEN                1       /* Bytes of address */
+
+#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 */
+#define CONFIG_KGDB_BAUDRATE   115200  /* speed to run kgdb serial port at */
+#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      0x00400000      /* memtest works on */
+#define CFG_MEMTEST_END                0x07c00000      /* 4 ... 124 MB in DRAM */
+
+#define CFG_LOAD_ADDR  0x00400000      /* default load address */
+
+#define CFG_HZ         1000            /* decr freq: 1ms ticks */
+
+/*
+ * Low Level Configuration Settings
+ * (address mappings, register initial values, etc.)
+ * You should know what you are doing if you make changes here.
+ */
+
+/*-----------------------------------------------------------------------
+ * Definitions for initial stack pointer and data area
+ */
+
+/*
+ * When locking data in cache you should point the CFG_INIT_RAM_ADDRESS
+ * To an unused memory region. The stack will remain in cache until RAM
+ * is initialized
+ */
+#undef  CFG_INIT_RAM_LOCK
+#define CFG_INIT_RAM_ADDR      0x07d00000      /* unused memory region */
+#define CFG_INIT_RAM_END       0x4000/* larger space - we have SDRAM initialized */
+
+#define CFG_GBL_DATA_SIZE      128/* size in bytes reserved for init data */
+#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+
+/*-----------------------------------------------------------------------
+ * Start addresses for the final memory configuration
+ * (Set up by the startup code)
+ * Please note that CFG_SDRAM_BASE _must_ start at 0
+ */
+
+#define CFG_SDRAM_BASE         0x00000000      /* first 256 MB of SDRAM */
+#define CFG_SDRAM1_BASE                0x10000000      /* next 256MB of SDRAM */
+
+#define CFG_SDRAM2_BASE        0x40000000      /* beginning of non-cacheable alias for SDRAM - first 256MB */
+#define CFG_SDRAM3_BASE        0x50000000      /* next Non-Cacheable 256MB of SDRAM */
+
+#define CFG_PCI_PFM_BASE       0x80000000      /* Prefetchable (cacheable) PCI/X PFM and SDRAM OCN (128MB+128MB) */
+
+#define CFG_PCI_MEM32_BASE     0xE0000000      /* Non-Cacheable PCI/X MEM and SDRAM OCN (128MB+128MB) */
+
+#define CFG_MISC_REGION_BASE   0xf0000000      /* Base Address for (PCI/X + Flash) region */
+
+#define CFG_FLASH_BASE 0xff000000      /* Base Address of Flash device */
+#define CFG_FLASH_BASE2        0xfe000000      /* Alternate Flash Base Address */
+
+#define CONFIG_VERY_BIG_RAM    /* we will use up to 256M memory for cause we are short of BATS */
+
+#define PCI0_IO_BASE_BOOTM     0xfd000000
+
+#define CFG_RESET_ADDRESS      0x3fffff00
+#define CFG_MONITOR_LEN                (256 << 10)     /* Reserve 256 kB for Monitor */
+#define CFG_MONITOR_BASE       TEXT_BASE       /* u-boot code base */
+#define CFG_MALLOC_LEN         (256 << 10)     /* Reserve 256 kB for malloc */
+
+/* Peripheral Device section */
+
+/*
+ * Resources on the Tsi108
+ */
+
+#define CFG_TSI108_CSR_RST_BASE        0xC0000000      /* Tsi108 CSR base after reset */
+#define CFG_TSI108_CSR_BASE    CFG_TSI108_CSR_RST_BASE /* Runtime Tsi108 CSR base */
+
+#define ENABLE_PCI_CSR_BAR     /* enables access to Tsi108 CSRs from the PCI/X bus */
+
+#undef  DISABLE_PBM
+
+/*
+ * PCI stuff
+ *
+ */
+
+#define CONFIG_PCI             /* include pci support */
+#define CONFIG_TSI108_PCI      /* include tsi108 pci support */
+
+#define PCI_HOST_ADAPTER       0       /* configure as pci adapter */
+#define PCI_HOST_FORCE         1       /* configure as pci host */
+#define PCI_HOST_AUTO          2       /* detected via arbiter enable */
+
+#define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function */
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+
+/* PCI MEMORY MAP section */
+
+/* PCI view of System Memory */
+#define CFG_PCI_MEMORY_BUS     0x00000000
+#define CFG_PCI_MEMORY_PHYS    0x00000000
+#define CFG_PCI_MEMORY_SIZE    0x80000000
+
+/* PCI Memory Space */
+#define CFG_PCI_MEM_BUS                (CFG_PCI_MEM_PHYS)
+#define CFG_PCI_MEM_PHYS       (CFG_PCI_MEM32_BASE)    /* 0xE0000000 */
+#define CFG_PCI_MEM_SIZE       0x10000000      /* 256 MB space for PCI/X Mem + SDRAM OCN */
+
+/* PCI I/O Space */
+#define CFG_PCI_IO_BUS         0x00000000
+#define CFG_PCI_IO_PHYS                0xfa000000      /* Changed from fd000000 */
+
+#define CFG_PCI_IO_SIZE                0x01000000      /* 16MB */
+
+#define _IO_BASE               0x00000000      /* points to PCI I/O space      */
+
+/* PCI Config Space mapping */
+#define CFG_PCI_CFG_BASE       0xfb000000      /* Changed from FE000000 */
+#define CFG_PCI_CFG_SIZE       0x01000000      /* 16MB */
+
+#define CFG_IBAT0U     0xFE0003FF
+#define CFG_IBAT0L     0xFE000002
+
+#define CFG_IBAT1U     0x00007FFF
+#define CFG_IBAT1L     0x00000012
+
+#define CFG_IBAT2U     0x80007FFF
+#define CFG_IBAT2L     0x80000022
+
+#define CFG_IBAT3U     0x00000000
+#define CFG_IBAT3L     0x00000000
+
+#define CFG_IBAT4U     0x00000000
+#define CFG_IBAT4L     0x00000000
+
+#define CFG_IBAT5U     0x00000000
+#define CFG_IBAT5L     0x00000000
+
+#define CFG_IBAT6U     0x00000000
+#define CFG_IBAT6L     0x00000000
+
+#define CFG_IBAT7U     0x00000000
+#define CFG_IBAT7L     0x00000000
+
+#define CFG_DBAT0U     0xE0003FFF
+#define CFG_DBAT0L     0xE000002A
+
+#define CFG_DBAT1U     0x00007FFF
+#define CFG_DBAT1L     0x00000012
+
+#define CFG_DBAT2U     0x00000000
+#define CFG_DBAT2L     0x00000000
+
+#define CFG_DBAT3U     0xC0000003
+#define CFG_DBAT3L     0xC000002A
+
+#define CFG_DBAT4U     0x00000000
+#define CFG_DBAT4L     0x00000000
+
+#define CFG_DBAT5U     0x00000000
+#define CFG_DBAT5L     0x00000000
+
+#define CFG_DBAT6U     0x00000000
+#define CFG_DBAT6L     0x00000000
+
+#define CFG_DBAT7U     0x00000000
+#define CFG_DBAT7L     0x00000000
+
+/* I2C addresses for the two DIMM SPD chips */
+#define DIMM0_I2C_ADDR 0x51
+#define DIMM1_I2C_ADDR 0x52
+
+/*
+ * 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 */
+
+/*-----------------------------------------------------------------------
+ * FLASH organization
+ */
+#define CFG_MAX_FLASH_BANKS    1/* Flash can be at one of two addresses */
+#define FLASH_BANK_SIZE                0x01000000      /* 16 MB Total */
+#define CFG_FLASH_BANKS_LIST {CFG_FLASH_BASE, CFG_FLASH_BASE2}
+
+#define CFG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#define CFG_WRITE_SWAPPED_DATA
+
+#define PHYS_FLASH_SIZE                0x01000000
+#define CFG_MAX_FLASH_SECT     (128)
+
+#define CFG_ENV_IS_IN_NVRAM
+#define CFG_ENV_ADDR           0xFC000000
+
+#define CFG_ENV_OFFSET 0x00000000      /* Offset of Environment Sector */
+#define CFG_ENV_SIZE   0x00000400      /* Total Size of Environment Space */
+
+/*-----------------------------------------------------------------------
+ * Cache Configuration
+ */
+#define CFG_CACHELINE_SIZE     32      /* For all MPC74xx CPUs */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /* log base 2 of the above value */
+#endif
+
+/*-----------------------------------------------------------------------
+ * L2CR setup -- make sure this is right for your board!
+ * look in include/mpc74xx.h for the defines used here
+ */
+#undef CFG_L2
+
+#define L2_INIT                0
+#define L2_ENABLE      (L2_INIT | L2CR_L2E)
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01    /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02    /* Software reboot */
+#define CFG_SERIAL_HANG_IN_EXCEPTION
+#endif /* __CONFIG_H */
index 89e9164e036cb249df978daf441d9106cbc331b9..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
        "bootfile=/tftpboot/ocotea/uImage\0"                            \
        "kernel_addr=fff00000\0"                                        \
        "ramdisk_addr=fff10000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/ocotea/u-boot.bin\0"                \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
index 2cc137ce6a884df3c0086983d8b07a1637e9f96f..06c66528784520bafc47abe4cc2eba839e8dfa73 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * Configuation settings for the PDNB3 board.
 
 #define        CFG_ENV_IS_IN_FLASH     1
 
+#define CFG_ENV_ADDR           (CFG_FLASH_BASE + CFG_MONITOR_LEN)
 #if defined(CONFIG_SCPU)
-#define CFG_ENV_SECT_SIZE      0x20000         /* size of one complete sector  */
+/* no redundant environment on SCPU */
+#define CFG_ENV_SECT_SIZE      0x20000 /* size of one complete sector          */
 #define        CFG_ENV_SIZE            0x4000  /* Total Size of Environment Sector     */
 #else
-#define CFG_ENV_SECT_SIZE      0x1000  /* size of one complete sector  */
+#define CFG_ENV_SECT_SIZE      0x1000  /* size of one complete sector          */
 #define        CFG_ENV_SIZE            0x1000  /* Total Size of Environment Sector     */
-#endif
-#define CFG_ENV_ADDR           (CFG_FLASH_BASE + CFG_MONITOR_LEN)
 
 /* 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)
+#endif
 
 #if !defined(CONFIG_SCPU)
 /*
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..6b6acfa875834e0878b858bf1134f8da6188d044 100644 (file)
        "addip=setenv bootargs ${bootargs} "                            \
                "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
                ":${hostname}:${netdev}:off panic=1\0"                  \
-       "flash_nfs=run nfsargs addip;"                                  \
+       "addcons=setenv bootargs ${bootargs} "                          \
+               "console=ttyS0,${baudrate}\0"                           \
+       "flash_nfs=run nfsargs addip addcons;"                          \
                "bootm ${kernel_addr}\0"                                \
-       "flash_nand=nand_args addip addcon;bootm ${kernel_addr}\0"      \
-       "net_nfs=tftp 200000 ${bootfile};run nfsargs addip;bootm\0"     \
+       "flash_nand=run nand_args addip addcons;bootm ${kernel_addr}\0" \
+       "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addcons;"    \
+               "bootm\0"                                               \
        "rootpath=/opt/eldk/ppc_4xx\0"                                  \
        "bootfile=/tftpboot/sc3/uImage\0"                               \
        "u-boot=/tftpboot/sc3/u-boot.bin\0"                             \
 
 #if 1  /* feel free to disable for development */
 #define CONFIG_AUTOBOOT_KEYED          /* Enable password protection   */
-#define CONFIG_AUTOBOOT_PROMPT         "\nSC3 - booting... stop with S\n"
-#define CONFIG_AUTOBOOT_DELAY_STR      "S"     /* 1st "password"       */
+#define CONFIG_AUTOBOOT_PROMPT         "\nSC3 - booting... stop with ENTER\n"
+#define CONFIG_AUTOBOOT_DELAY_STR      "\n"    /* 1st "password"       */
 #endif
 
 /*
@@ -413,11 +416,11 @@ extern unsigned long offsetOfEnvironment;
 
 #define CONFIG_JFFS2_NAND 1                    /* jffs2 on nand support */
 
-/* No command line, one static partition Partition 3 contains jffs2 rootfs */
+/* No command line, one static partition */
 #undef CONFIG_JFFS2_CMDLINE
 #define CONFIG_JFFS2_DEV               "nand0"
-#define CONFIG_JFFS2_PART_SIZE         0x00400000
-#define CONFIG_JFFS2_PART_OFFSET       0x00c00000
+#define CONFIG_JFFS2_PART_SIZE         0x01000000
+#define CONFIG_JFFS2_PART_OFFSET       0x00000000
 
 /*-----------------------------------------------------------------------
  * Cache Configuration
index e7f0108892c08102ecbcedd48ec2ddbdafffdf71..e1572ba39c869e7ae3fc54063fd6e96f9ba8c720 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2006
+ * (C) Copyright 2006-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * (C) Copyright 2006
@@ -23,7 +23,7 @@
  */
 
 /************************************************************************
- * sequoia.h - configuration for Sequoia board (PowerPC440EPx)
+ * sequoia.h - configuration for Sequoia & Rainier boards
  ***********************************************************************/
 #ifndef __CONFIG_H
 #define __CONFIG_H
 /*-----------------------------------------------------------------------
  * High Level Configuration Options
  *----------------------------------------------------------------------*/
-/* This config file is used for Sequoia (440EPx) and Rainier (440GRx) */
+/* This config file is used for Sequoia (440EPx) and Rainier (440GRx)  */
 #ifndef CONFIG_RAINIER
-#define CONFIG_SEQUOIA         1               /* Board is Sequoia     */
 #define CONFIG_440EPX          1               /* Specific PPC440EPx   */
 #else
 #define CONFIG_440GRX          1               /* Specific PPC440GRx   */
 #endif
 #define CONFIG_4xx             1               /* ... PPC4xx family    */
-#define CONFIG_SYS_CLK_FREQ    33333333        /* external freq to pll */
+/* Detect Sequoia PLL input clock automatically via CPLD bit           */
+#define CONFIG_SYS_CLK_FREQ    ((in8(CFG_BCSR_BASE + 3) & 0x80) ? \
+                               33333333 : 33000000)
 
 #define CONFIG_BOARD_EARLY_INIT_F 1            /* Call board_early_init_f */
 #define CONFIG_MISC_INIT_R     1               /* Call misc_init_r     */
@@ -75,9 +76,7 @@
  * Initial RAM & stack pointer
  *----------------------------------------------------------------------*/
 /* 440EPx/440GRx have 16KB of internal SRAM, so no need for D-Cache    */
-#define CFG_INIT_RAM_OCM       1               /* OCM as init ram      */
 #define CFG_INIT_RAM_ADDR      CFG_OCM_BASE    /* OCM                  */
-
 #define CFG_INIT_RAM_END       (4 << 10)
 #define CFG_GBL_DATA_SIZE      256             /* num bytes initial data */
 #define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
 
 #undef CONFIG_BOOTARGS
 
+/* Setup some board specific values for the default environment variables */
+#ifndef CONFIG_RAINIER
+#define CONFIG_HOSTNAME                sequoia
+#define CFG_BOOTFILE           "bootfile=/tftpboot/sequoia/uImage\0"
+#define CFG_ROOTPATH           "rootpath=/opt/eldk/ppc_4xxFP\0"
+#else
+#define CONFIG_HOSTNAME                rainier
+#define CFG_BOOTFILE           "bootfile=/tftpboot/rainier/uImage\0"
+#define CFG_ROOTPATH           "rootpath=/opt/eldk/ppc_4xx\0"
+#endif
+
 #define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       CFG_BOOTFILE                                                    \
+       CFG_ROOTPATH                                                    \
        "netdev=eth0\0"                                                 \
-       "hostname=sequoia\0"                                            \
        "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
                "nfsroot=${serverip}:${rootpath}\0"                     \
        "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
                "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
        "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;"     \
                "bootm\0"                                               \
-       "rootpath=/opt/eldk/ppc_4xxFP\0"                                        \
-       "bootfile=/tftpboot/sequoia/uImage\0"                           \
        "kernel_addr=FC000000\0"                                        \
        "ramdisk_addr=FC180000\0"                                       \
-       "load=tftp 100000 /tftpboot/sequoia/u-boot.bin\0"               \
+       "load=tftp 200000 /tftpboot/${hostname}/u-boot.bin\0"           \
        "update=protect off FFFA0000 FFFFFFFF;era FFFA0000 FFFFFFFF;"   \
-               "cp.b 100000 FFFA0000 60000\0"                          \
+               "cp.b 200000 FFFA0000 60000\0"                          \
        "upd=run load;run update\0"                                     \
        ""
 #define CONFIG_BOOTCOMMAND     "run flash_self"
  *----------------------------------------------------------------------*/
 /* General PCI */
 #define CONFIG_PCI                     /* include pci support          */
-#define CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
+#undef CONFIG_PCI_PNP                  /* do (not) pci plug-and-play   */
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup  */
 #define CFG_PCI_TARGBASE        0x80000000 /* PCIaddr mapped to CFG_PCI_MEMBASE*/
 
 /*-----------------------------------------------------------------------
  * External Bus Controller (EBC) Setup
  *----------------------------------------------------------------------*/
-#define CFG_FLASH              CFG_FLASH_BASE
-#define CFG_NAND               0xD0000000
-#define CFG_CPLD               0xC0000000
 
 /*
  * On Sequoia CS0 and CS3 are switched when configuring for NAND booting
 #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_PB0CR          (CFG_FLASH | 0xda000)
+#define CFG_EBC_PB0AP          0x03017200
+#define CFG_EBC_PB0CR          (CFG_FLASH_BASE | 0xda000)
 
 /* Memory Bank 3 (NAND-FLASH) initialization                                   */
 #define CFG_EBC_PB3AP          0x018003c0
-#define CFG_EBC_PB3CR          (CFG_NAND | 0x1c000)
+#define CFG_EBC_PB3CR          (CFG_NAND_ADDR | 0x1c000)
 #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_PB3CR          (CFG_FLASH | 0xda000)
+#define CFG_EBC_PB3AP          0x03017200
+#define CFG_EBC_PB3CR          (CFG_FLASH_BASE | 0xda000)
 
 /* Memory Bank 0 (NAND-FLASH) initialization                                   */
 #define CFG_EBC_PB0AP          0x018003c0
-#define CFG_EBC_PB0CR          (CFG_NAND | 0x1c000)
+#define CFG_EBC_PB0CR          (CFG_NAND_ADDR | 0x1c000)
 #endif
 
 /* Memory Bank 2 (CPLD) initialization                                         */
 #define CFG_EBC_PB2AP          0x24814580
-#define CFG_EBC_PB2CR          (CFG_CPLD | 0x38000)
+#define CFG_EBC_PB2CR          (CFG_BCSR_BASE | 0x38000)
 
 /*-----------------------------------------------------------------------
  * NAND FLASH
diff --git a/include/configs/stamp.h b/include/configs/stamp.h
deleted file mode 100644 (file)
index 248ca70..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * U-boot - stamp.h  Configuration file for STAMP board
- *                     having BF533 processor
- *
- * Copyright (c) 2005 blackfin.uclinux.org
- *
- * (C) Copyright 2000-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
- */
-
-#ifndef __CONFIG_STAMP_H__
-#define __CONFIG_STAMP_H__
-
-/*
- * Board settings
- *
- */
-
-#define __ADSPLPBLACKFIN__             1
-#define __ADSPBF533__                  1
-#define CONFIG_STAMP                   1
-#define CONFIG_RTC_BF533               1
-
-/* FLASH/ETHERNET uses the same address range */
-#define SHARED_RESOURCES               1
-
-#define CONFIG_VDSP                    1
-
-/*
- * Clock settings
- *
- */
-
-/* CONFIG_CLKIN_HZ is any value in Hz                           */
-#define CONFIG_CLKIN_HZ                        11059200
-/* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN     */
-/*                                                 1=CLKIN/2    */
-#define CONFIG_CLKIN_HALF              0
-/* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass         */
-/*                                              1=bypass PLL    */
-#define CONFIG_PLL_BYPASS              0
-/* CONFIG_VCO_MULT controls what the multiplier of the PLL is.  */
-/* Values can range from 1-64                                   */
-#define CONFIG_VCO_MULT                        45
-/* CONFIG_CCLK_DIV controls what the core clock divider is      */
-/* Values can be 1, 2, 4, or 8 ONLY                             */
-#define CONFIG_CCLK_DIV                        1
-/* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
-/* Values can range from 1-15                                   */
-#define CONFIG_SCLK_DIV                        6
-
-/*
- * Network Settings
- */
-/* network support */
-#define CONFIG_IPADDR          192.168.0.15
-#define CONFIG_NETMASK         255.255.255.0
-#define CONFIG_GATEWAYIP       192.168.0.1
-#define CONFIG_SERVERIP                192.168.0.2
-#define CONFIG_HOSTNAME                STAMP
-#define CONFIG_ROOTPATH                        /checkout/uClinux-dist/romfs
-
-/* To remove hardcoding and enable MAC storage in EEPROM  */
-/* #define CONFIG_ETHADDR              02:80:ad:20:31:b8 */
-
-/*
- * Command settings
- *
- */
-
-#define CFG_LONGHELP                   1
-
-#define CONFIG_BOOTDELAY               5
-#define CONFIG_BOOT_RETRY_TIME         -1      /* Enable this if bootretry required, currently its disabled */
-#define CONFIG_BOOTCOMMAND             "run ramboot"
-#define CONFIG_AUTOBOOT_PROMPT         "autoboot in %d seconds\n"
-
-#define CONFIG_COMMANDS                        (CONFIG_CMD_DFL | \
-                                        CFG_CMD_PING   | \
-                                        CFG_CMD_ELF    | \
-                                        CFG_CMD_I2C    | \
-                                        CFG_CMD_CACHE  | \
-                                        CFG_CMD_JFFS2  | \
-                                        CFG_CMD_DATE)
-#define CONFIG_BOOTARGS "root=/dev/mtdblock0 rw"
-
-#define CONFIG_EXTRA_ENV_SETTINGS                                                                                              \
-       "ramargs=setenv bootargs root=/dev/mtdblock0 rw\0"                                                      \
-       "nfsargs=setenv bootargs root=/dev/nfs rw "                                                                     \
-       "nfsroot=$(serverip):$(rootpath)\0"                                                                                     \
-       "addip=setenv bootargs $(bootargs) "                                                                            \
-       "ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask)"                                                      \
-       ":$(hostname):eth0:off\0"                                                                                                       \
-    "ramboot=tftpboot 0x1000000 linux;"                                                                                        \
-       "run ramargs;run addip;bootelf\0"                                                                                       \
-       "nfsboot=tftpboot 0x1000000 linux;"                                                                                     \
-       "run nfsargs;run addip;bootelf\0"                                                                                       \
-       "flashboot=bootm 0x20100000\0"                                                                                          \
-       ""
-
-/* This must be included AFTER the definition of CONFIG_COMMANDS (if any) */
-#include <cmd_confdefs.h>
-
-/*
- * Console settings
- *
- */
-
-#define CONFIG_BAUDRATE                        57600
-#define CFG_BAUDRATE_TABLE             { 9600, 19200, 38400, 57600, 115200 }
-
-#define CFG_PROMPT                     "stamp>"        /* 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 CONFIG_LOADS_ECHO              1
-
-/*
- * Network settings
- *
- */
-
-#define CONFIG_DRIVER_SMC91111         1
-#define CONFIG_SMC91111_BASE           0x20300300
-/* To remove hardcoding and enable MAC storage in EEPROM */
-/* #define HARDCODE_MAC                        1 */
-
-/*
- * Flash settings
- *
- */
-
-#define CFG_FLASH_CFI                          /* The flash is CFI compatible  */
-#define CFG_FLASH_CFI_DRIVER                   /* Use common CFI driver        */
-#define CFG_FLASH_CFI_AMD_RESET
-
-#define CFG_ENV_IS_IN_FLASH            1
-
-#define CFG_FLASH_BASE                 0x20000000
-#define CFG_MAX_FLASH_BANKS            1               /* max number of memory banks */
-#define CFG_MAX_FLASH_SECT             67              /* max number of sectors on one chip */
-
-#define CFG_ENV_ADDR                   0x20020000
-#define CFG_ENV_SIZE                   0x10000
-#define CFG_ENV_SECT_SIZE              0x10000 /* Total Size of Environment Sector */
-
-#define CFG_FLASH_ERASE_TOUT           30000   /* Timeout for Chip Erase (in ms) */
-#define CFG_FLASH_ERASEBLOCK_TOUT      5000    /* Timeout for Block Erase (in ms) */
-#define CFG_FLASH_WRITE_TOUT           1       /* Timeout for Flash Write (in ms) */
-
-/* JFFS Partition offset set  */
-#define CFG_JFFS2_FIRST_BANK 0
-#define CFG_JFFS2_NUM_BANKS  1
-/* 512k reserved for u-boot */
-#define CFG_JFFS2_FIRST_SECTOR         11
-
-/*
- * following timeouts shall be used once the
- * Flash real protection is enabled
- */
-#define CFG_FLASH_LOCK_TOUT            5       /* Timeout for Flash Set Lock Bit (in ms) */
-#define CFG_FLASH_UNLOCK_TOUT          10000   /* Timeout for Flash Clear Lock Bits (in ms) */
-
-/*
- * I2C settings
- * By default PF2 is used as SDA and PF3 as SCL on the Stamp board
- */
-#define CONFIG_SOFT_I2C                        1       /* I2C bit-banged               */
-/*
- * Software (bit-bang) I2C driver configuration
- */
-#define PF_SCL                         PF3
-#define PF_SDA                         PF2
-
-#define I2C_INIT                       (*pFIO_DIR |=  PF_SCL); asm("ssync;")
-#define I2C_ACTIVE                     (*pFIO_DIR |=  PF_SDA); *pFIO_INEN &= ~PF_SDA; asm("ssync;")
-#define I2C_TRISTATE                   (*pFIO_DIR &= ~PF_SDA); *pFIO_INEN |= PF_SDA; asm("ssync;")
-#define I2C_READ                       ((volatile)(*pFIO_FLAG_D & PF_SDA) != 0); asm("ssync;")
-#define I2C_SDA(bit)                   if(bit) { \
-                                                       *pFIO_FLAG_S = PF_SDA; \
-                                                       asm("ssync;"); \
-                                               } \
-                                       else    { \
-                                                       *pFIO_FLAG_C = PF_SDA; \
-                                                       asm("ssync;"); \
-                                               }
-#define I2C_SCL(bit)                   if(bit) { \
-                                                       *pFIO_FLAG_S = PF_SCL; \
-                                                       asm("ssync;"); \
-                                               } \
-                                       else    { \
-                                                       *pFIO_FLAG_C = PF_SCL; \
-                                                       asm("ssync;"); \
-                                               }
-#define I2C_DELAY                      udelay(5)       /* 1/4 I2C clock duration */
-
-#define CFG_I2C_SPEED                  50000
-#define CFG_I2C_SLAVE                  0xFE
-
-/*
- * Compact Flash settings
- */
-
-/* Enabled below option for CF support */
-/* #define CONFIG_STAMP_CF             1 */
-
-#if defined(CONFIG_STAMP_CF) && (CONFIG_COMMANDS & CFG_CMD_IDE)
-
-#define CONFIG_MISC_INIT_R             1
-#define CONFIG_DOS_PARTITION           1
-
-/*
- * IDE/ATA stuff
- */
-#undef CONFIG_IDE_8xx_DIRECT           /* no pcmcia interface required */
-#undef CONFIG_IDE_LED                  /* no led for ide supported */
-#undef CONFIG_IDE_RESET                /* no reset for ide supported */
-
-#define CFG_IDE_MAXBUS 1               /* max. 1 IDE busses */
-#define CFG_IDE_MAXDEVICE              (CFG_IDE_MAXBUS*1) /* max. 1 drives per IDE bus */
-
-#define CFG_ATA_BASE_ADDR              0x20200000
-#define CFG_ATA_IDE0_OFFSET            0x0000
-
-#define CFG_ATA_DATA_OFFSET            0x0020  /* Offset for data I/O */
-#define CFG_ATA_REG_OFFSET             0x0020  /* Offset for normal register accesses */
-#define CFG_ATA_ALT_OFFSET             0x0007  /* Offset for alternate registers */
-
-#define CFG_ATA_STRIDE                 2
-#endif
-
-/*
- * SDRAM settings
- *
- */
-
-#define CONFIG_MEM_SIZE                        128             /* 128, 64, 32, 16 */
-#define CONFIG_MEM_ADD_WDTH            11             /* 8, 9, 10, 11    */
-#define CONFIG_MEM_MT48LC64M4A2FB_7E   1
-
-#define CFG_MEMTEST_START              0x00100000      /* memtest works on */
-#define CFG_MEMTEST_END                        0x07EFFFFF      /* 1 ... 127 MB in DRAM */
-#define CFG_LOAD_ADDR                  0x01000000      /* default load address */
-
-#define CFG_SDRAM_BASE                 0x00000000
-#define CFG_MAX_RAM_SIZE               0x08000000
-
-#define CFG_MONITOR_LEN                        (256 << 10)     /* Reserve 256 kB for Monitor   */
-#define CFG_MONITOR_BASE               (CFG_MAX_RAM_SIZE - CFG_MONITOR_LEN)
-
-#if ( CONFIG_CLKIN_HALF == 0 )
-#define CONFIG_VCO_HZ                  ( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT )
-#else
-#define CONFIG_VCO_HZ                  (( CONFIG_CLKIN_HZ * CONFIG_VCO_MULT ) / 2 )
-#endif
-
-#if (CONFIG_PLL_BYPASS == 0)
-#define CONFIG_CCLK_HZ                 ( CONFIG_VCO_HZ / CONFIG_CCLK_DIV )
-#define CONFIG_SCLK_HZ                 ( CONFIG_VCO_HZ / CONFIG_SCLK_DIV )
-#else
-#define CONFIG_CCLK_HZ                 CONFIG_CLKIN_HZ
-#define CONFIG_SCLK_HZ                 CONFIG_CLKIN_HZ
-#endif
-
-/*
- * Miscellaneous configurable options
- */
-#define CFG_HZ                         1000            /* 1ms time tick */
-
-#define CFG_MALLOC_LEN                 (128 << 10)     /* Reserve 128 kB for malloc()  */
-#define CFG_MALLOC_BASE                        (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
-#define CFG_GBL_DATA_SIZE              0x4000
-#define CFG_GBL_DATA_ADDR              (CFG_MALLOC_BASE - CFG_GBL_DATA_SIZE)
-#define CONFIG_STACKBASE               (CFG_GBL_DATA_ADDR  - 4)
-
-#define CFG_LARGE_IMAGE_LEN    0x4000000       /* Large Image Length, set to 64 Meg */
-
-#define CONFIG_SHOW_BOOT_PROGRESS      1       /* Show boot progress on LEDs */
-
-/*
- * Stack sizes
- */
-#define CONFIG_STACKSIZE               (128*1024)      /* regular stack */
-
-/*
- * FLASH organization and environment definitions
- */
-#define CFG_BOOTMAPSZ                  (8 << 20)       /* Initial Memory map for Linux */
-
-/* 0xFF, 0xBBC3BBc3, 0x99B39983 */
-/*#define AMGCTLVAL            (AMBEN_P0 | AMBEN_P1 | AMBEN_P2 | AMCKEN)
-#define AMBCTL0VAL             (B1WAT_11 | B1RAT_11 | B1HT_3 | B1ST_4 | B1TT_4 | B1RDYPOL |    \
-                               B1RDYEN | B0WAT_11 | B0RAT_11 | B0HT_3 | B0ST_4 | B0TT_4 | B0RDYPOL | B0RDYEN)
-#define AMBCTL1VAL             (B3WAT_9 | B3RAT_9 | B3HT_2 | B3ST_3 | B3TT_4 | B3RDYPOL |      \
-                               B3RDYEN | B2WAT_9 | B2RAT_9 | B2HT_2 | B2ST_4 | B2TT_4 | B2RDYPOL | B2RDYEN)
-*/
-#define AMGCTLVAL              0xFF
-#define AMBCTL0VAL             0xBBC3BBC3
-#define AMBCTL1VAL             0x99B39983
-#define CF_AMBCTL1VAL          0x99B3ffc2
-
-#ifdef CONFIG_VDSP
-#define ET_EXEC_VDSP           0x8
-#define SHT_STRTAB_VDSP                0x1
-#define ELFSHDRSIZE_VDSP       0x2C
-#define VDSP_ENTRY_ADDR                0xFFA00000
-#endif
-
-#endif
diff --git a/include/configs/stxssa.h b/include/configs/stxssa.h
new file mode 100644 (file)
index 0000000..8624f4b
--- /dev/null
@@ -0,0 +1,465 @@
+/*
+ * (C) Copyright 2005 Embedded Alley Solutions, Inc.
+ * Dan Malek <dan@embeddedalley.com>
+ * Copied from STx GP3.
+ * Updates for Silicon Tx GP3 SSA board.
+ *
+ * (C) Copyright 2002,2003 Motorola,Inc.
+ * Xianghua Xiao <X.Xiao@motorola.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* mpc8560ads board configuration file */
+/* please refer to doc/README.mpc85xx for more info */
+/* make sure you change the MAC address and other network params first,
+ * search for CONFIG_ETHADDR,CONFIG_SERVERIP,etc in this file
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* High Level Configuration Options */
+#define CONFIG_BOOKE           1       /* BOOKE                */
+#define CONFIG_E500            1       /* BOOKE e500 family    */
+#define CONFIG_MPC85xx         1       /* MPC8540/MPC8560      */
+#define CONFIG_CPM2            1       /* has CPM2 */
+#define CONFIG_STXSSA          1       /* Silicon Tx GPPP SSA board specific*/
+
+#undef  CONFIG_PCI                     /* pci ethernet support */
+#define CONFIG_TSEC_ENET               /* tsec ethernet support*/
+#undef CONFIG_ETHER_ON_FCC             /* cpm FCC ethernet support */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SPD_EEPROM               /* Use SPD EEPROM for DDR setup */
+#undef  CONFIG_DDR_ECC                 /* only for ECC DDR module */
+#undef CONFIG_DDR_DLL                  /* possible DLL fix needed */
+#define CONFIG_DDR_2T_TIMING           /* Sets the 2T timing bit */
+
+
+/* sysclk for MPC85xx
+ */
+
+#define CONFIG_SYS_CLK_FREQ     33000000 /* most pci cards are 33Mhz */
+
+/* Blinkin' LEDs for Robert :-)
+*/
+#define CONFIG_SHOW_ACTIVITY 1
+
+/*
+ * These can be toggled for performance analysis, otherwise use default.
+ */
+#define CONFIG_L2_CACHE                     /* toggle L2 cache         */
+#define  CONFIG_BTB                          /* toggle branch predition */
+#define  CONFIG_ADDR_STREAMING               /* toggle addr streaming   */
+
+#define CONFIG_BOARD_EARLY_INIT_F   1        /* Call board_pre_init      */
+
+#undef  CFG_DRAM_TEST                       /* memory test, takes time  */
+#define CFG_MEMTEST_START       0x00200000  /* memtest region */
+#define CFG_MEMTEST_END         0x00400000
+
+
+/* Localbus connector.  There are many options that can be
+ * connected here, including sdram or lots of flash.
+ * This address, however, is used to configure a 256M local bus
+ * window that includes the Config latch below.
+ */
+#define CFG_LBC_OPTION_BASE    0xf0000000      /* Localbus Extension */
+#define CFG_LBC_OPTION_SIZE    256             /* 256MB */
+
+/* There are various flash options used, we configure for the largest,
+ * which is 64Mbytes.  The CFI works fine and will discover the proper
+ * sizes.
+ */
+#define CFG_FLASH_BASE         0xFC000000      /* start of FLASH 64M    */
+#define CFG_BR0_PRELIM         0xFC001801      /* port size 32bit      */
+#define CFG_OR0_PRELIM         0xFC000FF7      /* 64 MB Flash           */
+
+#define CFG_FLASH_CFI          1
+#define CFG_FLASH_CFI_DRIVER   1
+#undef CFG_FLASH_USE_BUFFER_WRITE      /* use buffered writes (20x faster) */
+#define CFG_MAX_FLASH_SECT     256     /* max number of sectors on one chip */
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks   */
+
+#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
+
+#define CFG_FLASH_PROTECTION
+
+/* The configuration latch is Chip Select 1.
+ * It's an 8-bit latch in the lower 8 bits of the word.
+ */
+#define CFG_LBC_CFGLATCH_BASE  0xfb000000      /* Base of config latch */
+#define CFG_BR1_PRELIM         0xfb001801      /* 32-bit port */
+#define CFG_OR1_PRELIM         0xffff0ff7      /* 64K is enough */
+
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor     */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#else
+#undef  CFG_RAMBOOT
+#endif
+
+#ifdef CFG_RAMBOOT
+#define CFG_CCSRBAR_DEFAULT    0x40000000      /* CCSRBAR by BDI cfg   */
+#else
+#define CFG_CCSRBAR_DEFAULT    0xff700000      /* CCSRBAR Default      */
+#endif
+#define CFG_CCSRBAR             0xe0000000      /* relocated CCSRBAR    */
+#define CFG_IMMR               CFG_CCSRBAR     /* PQII uses CFG_IMMR   */
+
+
+/*
+ * DDR Setup
+ */
+
+/*
+ * Base addresses -- Note these are effective addresses where the
+ * actual resources get mapped (not physical addresses)
+ */
+#define CFG_DDR_SDRAM_BASE     0x00000000      /* DDR is system memory  */
+#define CFG_SDRAM_BASE         CFG_DDR_SDRAM_BASE
+
+#define SPD_EEPROM_ADDRESS     0x54            /*  DDR DIMM */
+
+#undef CONFIG_CLOCKS_IN_MHZ
+
+/* local bus definitions */
+#define CFG_BR2_PRELIM         0xf8001861      /* 64MB localbus SDRAM  */
+#define CFG_OR2_PRELIM         0xfc006901
+#define CFG_LBC_LCRR           0x00030004      /* local bus freq       */
+#define CFG_LBC_LBCR           0x00000000
+#define CFG_LBC_LSRT           0x20000000
+#define CFG_LBC_MRTPR          0x20000000
+#define CFG_LBC_LSDMR_1                0x2861b723
+#define CFG_LBC_LSDMR_2                0x0861b723
+#define CFG_LBC_LSDMR_3                0x0861b723
+#define CFG_LBC_LSDMR_4                0x1861b723
+#define CFG_LBC_LSDMR_5                0x4061b723
+
+#define CONFIG_L1_INIT_RAM
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR       0x60000000      /* Initial RAM address  */
+#define CFG_INIT_RAM_END       0x4000          /* End of used area in RAM */
+
+#define CFG_GBL_DATA_SIZE      128             /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (512 * 1024)    /* Reserved for malloc */
+
+/* Serial Port */
+#define CONFIG_CONS_INDEX     2
+#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_CCSRBAR+0x4500)
+#define CFG_NS16550_COM2        (CFG_CCSRBAR+0x4600)
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+#define CFG_HUSH_PARSER                1       /* Use the HUSH parser          */
+#ifdef  CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+#endif
+
+/* I2C */
+#define CONFIG_FSL_I2C                 /* Use FSL common I2C driver */
+#define  CONFIG_HARD_I2C               /* I2C with hardware support*/
+#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+#if 0
+#define CFG_I2C_NOPROBES        {0x00}  /* Don't probe these addrs */
+#else
+/* I did the 'if 0' so we could keep the syntax above if ever needed. */
+#undef CFG_I2C_NOPROBES
+#endif
+#define CFG_I2C_OFFSET         0x3000
+
+/* I2C EEPROM.  AT24C32, we keep our environment in here.
+*/
+#define CFG_I2C_EEPROM_ADDR            0x51    /* 1010001x             */
+#define CFG_I2C_EEPROM_ADDR_LEN                2
+#define CFG_EEPROM_PAGE_WRITE_BITS     5       /* =32 Bytes per write  */
+#define CFG_EEPROM_PAGE_WRITE_ENABLE
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 20
+
+/*
+ * Standard 8555 PCI mapping.
+ * 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      0x20000000      /* 512M */
+#define CFG_PCI1_IO_BASE       0x00000000
+#define CFG_PCI1_IO_PHYS       0xe2000000
+#define CFG_PCI1_IO_SIZE       0x01000000      /* 16M */
+
+#define CFG_PCI2_MEM_BASE      0xa0000000
+#define CFG_PCI2_MEM_PHYS      CFG_PCI2_MEM_BASE
+#define CFG_PCI2_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI2_IO_BASE       0x00000000
+#define CFG_PCI2_IO_PHYS       0xe3000000
+#define CFG_PCI2_IO_SIZE       0x01000000      /* 16M */
+
+#if defined(CONFIG_PCI)                /* PCI Ethernet card */
+
+#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     0xe0000000
+  #define PCI_ENET0_MEMADDR     0xe0000000
+  #define PCI_IDSEL_NUMBER      0x0c   /* slot0->3(IDSEL)=12->15 */
+#endif
+
+#undef CONFIG_PCI_SCAN_SHOW
+#define CFG_PCI_SUBSYS_VENDORID 0x1057  /* Motorola */
+
+#endif /* CONFIG_PCI */
+
+#if defined(CONFIG_TSEC_ENET)
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+#define CONFIG_MII             1       /* MII PHY management           */
+
+#define CONFIG_MPC85XX_TSEC1   1
+#define CONFIG_MPC85XX_TSEC1_NAME      "TSEC0"
+#define CONFIG_MPC85XX_TSEC2   1
+#define CONFIG_MPC85XX_TSEC2_NAME      "TSEC1"
+#undef CONFIG_MPS85XX_FEC
+
+#define TSEC1_PHY_ADDR         2
+#define TSEC2_PHY_ADDR         4
+#define TSEC1_PHYIDX           0
+#define TSEC2_PHYIDX           0
+#define CONFIG_ETHPRIME                "TSEC0"
+
+#elif defined(CONFIG_ETHER_ON_FCC)     /* CPM FCC Ethernet */
+
+#define CONFIG_ETHER_ON_FCC2             /* define if ether on FCC   */
+#undef  CONFIG_ETHER_NONE               /* define if ether on something else */
+#define CONFIG_ETHER_INDEX      2       /* which channel for ether  */
+
+#if (CONFIG_ETHER_INDEX == 2)
+  /*
+   * - Rx-CLK is CLK13
+   * - Tx-CLK is CLK14
+   * - Select bus for bd/buffers
+   * - Full duplex
+   */
+  #define CFG_CMXFCR_MASK       (CMXFCR_FC2 | CMXFCR_RF2CS_MSK | CMXFCR_TF2CS_MSK)
+  #define CFG_CMXFCR_VALUE      (CMXFCR_RF2CS_CLK13 | CMXFCR_TF2CS_CLK14)
+  #define CFG_CPMFCR_RAMTYPE    0
+#if 0
+  #define CFG_FCC_PSMR          (FCC_PSMR_FDE)
+#else
+  #define CFG_FCC_PSMR          0
+#endif
+  #define FETH2_RST            0x01
+#elif (CONFIG_ETHER_INDEX == 3)
+  /* need more definitions here for FE3 */
+  #define FETH3_RST            0x80
+#endif                                 /* CONFIG_ETHER_INDEX */
+
+/* MDIO is done through the TSEC0 control.
+*/
+#define CONFIG_MII                     /* MII PHY management */
+#undef CONFIG_BITBANGMII               /* bit-bang MII PHY management  */
+
+#endif
+
+/* Environment - default config is in flash, see below */
+#if 0  /* in EEPROM */
+#define CFG_ENV_IS_IN_EEPROM   1
+#define CFG_ENV_OFFSET         0
+#define CFG_ENV_SIZE           2048
+#else  /* in flash */
+#define        CFG_ENV_IS_IN_FLASH     1
+#define CFG_ENV_SECT_SIZE      0x40000
+
+#define        CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SECT_SIZE)
+#define        CFG_ENV_SIZE            0x4000
+#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR - CFG_ENV_SECT_SIZE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SIZE)
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
+
+#define        CONFIG_TIMESTAMP                /* Print image info with ts     */
+
+#if defined(CFG_RAMBOOT)
+  #if defined(CONFIG_PCI)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_PCI | \
+                               CFG_CMD_PING | CFG_CMD_I2C) & \
+                                ~(CFG_CMD_ENV | \
+                                 CFG_CMD_LOADS ))
+  #elif defined(CONFIG_TSEC_ENET)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_PING | \
+                               CFG_CMD_MII | CFG_CMD_I2C ) & \
+                               ~(CFG_CMD_ENV))
+  #elif defined(CONFIG_ETHER_ON_FCC)
+  #define  CONFIG_COMMANDS     ((CONFIG_CMD_DFL | CFG_CMD_MII | \
+                               CFG_CMD_PING | CFG_CMD_I2C) & \
+                               ~(CFG_CMD_ENV))
+  #endif
+#else
+  #if defined(CONFIG_PCI)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_PCI | \
+                               CFG_CMD_ELF | CFG_CMD_PING | CFG_CMD_I2C)
+  #elif defined(CONFIG_TSEC_ENET)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_PING | \
+                               CFG_CMD_ELF | CFG_CMD_MII | CFG_CMD_I2C)
+  #elif defined(CONFIG_ETHER_ON_FCC)
+  #define  CONFIG_COMMANDS     (CONFIG_CMD_DFL | CFG_CMD_MII | \
+                               CFG_CMD_ELF | CFG_CMD_PING | CFG_CMD_I2C)
+  #endif
+#endif
+#include <cmd_confdefs.h>
+
+#undef CONFIG_WATCHDOG                 /* watchdog disabled            */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                   /* undef to save memory         */
+#define CFG_PROMPT     "SSA=> "        /* Monitor Command Prompt       */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CBSIZE     1024            /* Console I/O Buffer Size      */
+#else
+#define CFG_CBSIZE     256             /* Console I/O Buffer Size      */
+#endif
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args   */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size    */
+#define CFG_LOAD_ADDR  0x1000000       /* default load address */
+#define CFG_HZ         1000            /* decrementer freq: 1 ms ticks */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CFG_BOOTMAPSZ          (8 << 20) /* Initial Memory map for Linux */
+
+/* Cache Configuration */
+#define CFG_DCACHE_SIZE                32768
+#define CFG_CACHELINE_SIZE     32
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CACHELINE_SHIFT    5       /* log base 2 of the above value */
+#endif
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD  0x01            /* Normal Power-On: Boot from FLASH */
+#define BOOTFLAG_WARM  0x02            /* Software reboot              */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   230400  /* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  2       /* which serial port to use */
+#endif
+
+/*Note: change below for your network setting!!! */
+#if defined(CONFIG_TSEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
+#define CONFIG_ETHADDR  00:e0:0c:07:9b:8a
+#define CONFIG_HAS_ETH1
+#define CONFIG_ETH1ADDR  00:e0:0c:07:9b:8b
+#define CONFIG_HAS_ETH2
+#define CONFIG_ETH2ADDR  00:e0:0c:07:9b:8c
+#endif
+
+/*
+ * Environment in EEPROM is compatible with different flash sector sizes,
+ * but only little space is available, so we use a very simple setup.
+ * With environment in flash, we use a more powerful default configuration.
+ */
+#ifdef CFG_ENV_IS_IN_EEPROM            /* use restricted "standard" environment */
+
+#define CONFIG_BAUDRATE                38400
+
+#define CONFIG_BOOTDELAY       3       /* -1 disable autoboot */
+#define CONFIG_BOOTCOMMAND     "bootm 0xffc00000 0xffd00000"
+#define CONFIG_BOOTARGS                "root=/dev/nfs rw ip=any console=ttyS1,$baudrate"
+#define CONFIG_SERVERIP        192.168.85.1
+#define CONFIG_IPADDR                  192.168.85.60
+#define CONFIG_GATEWAYIP       192.168.85.1
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_HOSTNAME        STX_SSA
+#define CONFIG_ROOTPATH        /gppproot
+#define CONFIG_BOOTFILE        uImage
+#define CONFIG_LOADADDR                0x1000000
+
+#else /* ENV IS IN FLASH               -- use a full-blown envionment */
+
+#define CONFIG_BAUDRATE                115200
+
+#define CONFIG_BOOTDELAY       5       /* -1 disable autoboot */
+
+#define CONFIG_PREBOOT "echo;" \
+       "echo Type \\\"run flash_nfs\\\" to mount root filesystem over NFS;" \
+       "echo"
+
+#undef CONFIG_BOOTARGS         /* the boot command will set bootargs   */
+
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "hostname=gp3ssa\0"                                             \
+       "bootfile=/tftpboot/gp3ssa/uImage\0"                            \
+       "loadaddr=400000\0"                                             \
+       "netdev=eth0\0"                                                 \
+       "consdev=ttyS1\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"                      \
+       "addcons=setenv bootargs $bootargs "                            \
+               "console=$consdev,$baudrate\0"                          \
+       "flash_nfs=run nfsargs addip addcons;"                          \
+               "bootm $kernel_addr\0"                                  \
+       "flash_self=run ramargs addip addcons;"                         \
+               "bootm $kernel_addr $ramdisk_addr\0"                    \
+       "net_nfs=tftp $loadaddr $bootfile;"                             \
+               "run nfsargs addip addcons;bootm\0"                     \
+       "rootpath=/opt/eldk/ppc_85xx\0"                                 \
+       "kernel_addr=FC000000\0"                                        \
+       "ramdisk_addr=FC200000\0"                                       \
+       ""
+#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+#endif /* CFG_ENV_IS_IN_EEPROM */
+
+#endif /* __CONFIG_H */
index 1ee6be174fe326c3b6a92bfb2a9f05e924f88024..82245558961906d58dec4484dbf536fe0892a22e 100644 (file)
 #define CFG_FLASH_SIZE         0x00400000
 #define CFG_RESET_ADDRESS      0xfff00100
 #define CFG_MONITOR_LEN                (256 << 10)     /* Reserve 256 kB for Monitor */
-#define CFG_MONITOR_BASE        (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - (1024 * 1024))
+#define CFG_MONITOR_BASE       (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - (1024 * 1024))
 #define CFG_MALLOC_LEN         (256 << 10)     /* Reserve 256 kB for malloc */
+#define CFG_MALLOC_BASE                (CFG_MONITOR_BASE - (1024 * 1024))
 
 #define CONFIG_BAUDRATE                115200
 #define CFG_BAUDRATE_TABLE     { 115200 }
 
+/* System Register (GPIO) */
+#define MICROBLAZE_SYSREG_BASE_ADDR 0xFFFFA000
+#define MICROBLAZE_SYSREG_RECONFIGURE (1 << 0)
+
 #define CONFIG_COMMANDS                (CONFIG__CMD_DFL)
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
index 7ace3971d74de00b4cc25d3a3c9649ba21472f97..2b28f93a071e211a34523c943223267bb5d7375b 100644 (file)
        "bootfile=/tftpboot/taishan/uImage\0"                           \
        "kernel_addr=fc000000\0"                                        \
        "ramdisk_addr=fc180000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/taishan/u-boot.bin\0"               \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
index 28abd6e1533709962377b5ff0cca65a12cb321bc..b34dc71d23f3762f38b8de1dc98b27eef1399c4a 100644 (file)
@@ -68,6 +68,7 @@
        "bootfile=/tftpboot/walnut/uImage\0"                            \
        "kernel_addr=fff80000\0"                                        \
        "ramdisk_addr=fff80000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 /tftpboot/walnut/u-boot.bin\0"                \
        "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;"   \
                "cp.b 100000 fffc0000 40000;"                           \
diff --git a/include/configs/xupv2p.h b/include/configs/xupv2p.h
new file mode 100644 (file)
index 0000000..b4c720d
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * (C) Copyright 2007 Czech Technical University.
+ *
+ * Michal SIMEK <monstr@monstr.eu>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include "../board/xilinx/xupv2p/xparameters.h"
+
+#define        CONFIG_MICROBLAZE       1       /* MicroBlaze CPU */
+#define        CONFIG_XUPV2P           1
+
+/* uart */
+#define        CONFIG_SERIAL_BASE      XILINX_UART_BASEADDR
+#define        CONFIG_BAUDRATE         XILINX_UART_BAUDRATE
+#define        CFG_BAUDRATE_TABLE      { CONFIG_BAUDRATE }
+
+/* ethernet */
+#define CONFIG_EMAC    1
+#define XPAR_EMAC_0_DEVICE_ID  XPAR_XEMAC_NUM_INSTANCES
+
+/*
+ * setting reset address
+ *
+ * TEXT_BASE is set to place, where the U-BOOT run in RAM, but
+ * if you want to store U-BOOT in flash, set CFG_RESET_ADDRESS
+ * to FLASH memory and after loading bitstream jump to FLASH.
+ * U-BOOT auto-relocate to TEXT_BASE. After RESET command Microblaze
+ * jump to CFG_RESET_ADDRESS where is the original U-BOOT code.
+ */
+#define        CFG_RESET_ADDRESS       0x36000000
+
+/* gpio */
+#define        CFG_GPIO_0              1
+#define        CFG_GPIO_0_ADDR         XILINX_GPIO_BASEADDR
+
+/* interrupt controller */
+#define        CFG_INTC_0              1
+#define        CFG_INTC_0_ADDR         XILINX_INTC_BASEADDR
+#define        CFG_INTC_0_NUM          XILINX_INTC_NUM_INTR_INPUTS
+
+/* timer */
+#define        CFG_TIMER_0             1
+#define        CFG_TIMER_0_ADDR        XILINX_TIMER_BASEADDR
+#define        CFG_TIMER_0_IRQ         XILINX_TIMER_IRQ
+#define        FREQUENCE               XILINX_CLOCK_FREQ
+#define        CFG_TIMER_0_PRELOAD     ( FREQUENCE/1000 )
+
+/*
+ * memory layout - Example
+ * TEXT_BASE = 0x3600_0000;
+ * CFG_SRAM_BASE = 0x3000_0000;
+ * CFG_SRAM_SIZE = 0x1000_0000;
+ *
+ * CFG_GBL_DATA_OFFSET = 0x3000_0000 + 0x1000_0000 - 0x1000 = 0x3FFF_F000
+ * CFG_MONITOR_BASE = 0x3FFF_F000 - 0x40000 = 0x3FFB_F000
+ * CFG_MALLOC_BASE = 0x3FFB_F000 - 0x40000 = 0x3FF7_F000
+ *
+ * 0x3000_0000 CFG_SDRAM_BASE
+ *                                     FREE
+ * 0x3600_0000 TEXT_BASE
+ *             U-BOOT code
+ * 0x3602_0000
+ *                                     FREE
+ *
+ *                                     STACK
+ * 0x3FF7_F000 CFG_MALLOC_BASE
+ *                                     MALLOC_AREA     256kB   Alloc
+ * 0x3FFB_F000 CFG_MONITOR_BASE
+ *                                     MONITOR_CODE    256kB   Env
+ * 0x3FFF_F000 CFG_GBL_DATA_OFFSET
+ *                                     GLOBAL_DATA     4kB     bd, gd
+ * 0x4000_0000 CFG_SDRAM_BASE + CFG_SDRAM_SIZE
+ */
+
+/* ddr sdram - main memory */
+#define        CFG_SDRAM_BASE          XILINX_RAM_START
+#define        CFG_SDRAM_SIZE          XILINX_RAM_SIZE
+#define        CFG_MEMTEST_START       CFG_SDRAM_BASE
+#define        CFG_MEMTEST_END         (CFG_SDRAM_BASE + 0x1000)
+
+/* global pointer */
+#define        CFG_GBL_DATA_SIZE       0x1000  /* size of global data */
+#define        CFG_GBL_DATA_OFFSET     (CFG_SDRAM_BASE + CFG_SDRAM_SIZE - CFG_GBL_DATA_SIZE) /* start of global data */
+
+/* monitor code */
+#define        SIZE                    0x40000
+#define        CFG_MONITOR_LEN         SIZE
+#define        CFG_MONITOR_BASE        (CFG_GBL_DATA_OFFSET - CFG_MONITOR_LEN)
+#define        CFG_MONITOR_END         (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
+#define        CFG_MALLOC_LEN          SIZE
+#define        CFG_MALLOC_BASE         (CFG_MONITOR_BASE - CFG_MALLOC_LEN)
+
+/* stack */
+#define        CFG_INIT_SP_OFFSET      CFG_MALLOC_BASE
+
+#define        CFG_NO_FLASH            1
+#define        CFG_ENV_IS_NOWHERE      1
+#define        CFG_ENV_SIZE            0x1000
+#define        CFG_ENV_ADDR            (CFG_MONITOR_BASE - CFG_ENV_SIZE)
+#define        CONFIG_COMMANDS (CONFIG__CMD_DFL |\
+                       CFG_CMD_MEMORY |\
+                       CFG_CMD_IRQ |\
+                       CFG_CMD_BDI |\
+                       CFG_CMD_NET |\
+                       CFG_CMD_IMI |\
+                       CFG_CMD_ECHO |\
+                       CFG_CMD_CACHE |\
+                       CFG_CMD_RUN |\
+                       CFG_CMD_AUTOSCRIPT |\
+                       CFG_CMD_ASKENV |\
+                       CFG_CMD_LOADS |\
+                       CFG_CMD_LOADB |\
+                       CFG_CMD_MISC |\
+                       CFG_CMD_FAT |\
+                       CFG_CMD_EXT2 |\
+                       CFG_CMD_PING \
+                       )
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/* Miscellaneous configurable options */
+#define        CFG_PROMPT      "U-Boot-mONStR> "
+#define        CFG_CBSIZE      512     /* size of console buffer */
+#define        CFG_PBSIZE      (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) /* print buffer size */
+#define        CFG_MAXARGS     15      /* max number of command args */
+#define        CFG_LONGHELP
+#define        CFG_LOAD_ADDR   0x12000000 /* default load address */
+
+#define        CONFIG_BOOTDELAY        30
+#define        CONFIG_BOOTARGS         "root=romfs"
+#define        CONFIG_HOSTNAME         "ml401"
+#define        CONFIG_BOOTCOMMAND      "base 0;tftp 11000000 image.img;bootm"
+#define        CONFIG_IPADDR           192.168.0.3
+#define        CONFIG_SERVERIP         192.168.0.5
+#define        CONFIG_GATEWAYIP        192.168.0.1
+#define        CONFIG_ETHADDR          00:E0:0C:00:00:FD
+
+/* architecture dependent code */
+#define        CFG_USR_EXCEP   /* user exception */
+#define CFG_HZ 1000
+
+#define CONFIG_PREBOOT "echo U-BOOT by mONStR;"        \
+       "base 0;" \
+       "echo"
+
+/* system ace */
+#define        CONFIG_SYSTEMACE
+/* #define DEBUG_SYSTEMACE */
+#define        SYSTEMACE_CONFIG_FPGA
+#define        CFG_SYSTEMACE_BASE      XILINX_SYSACE_BASEADDR
+#define        CFG_SYSTEMACE_WIDTH     XILINX_SYSACE_MEM_WIDTH
+#define        CONFIG_DOS_PARTITION
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/yellowstone.h b/include/configs/yellowstone.h
deleted file mode 100644 (file)
index 911a52d..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * (C) Copyright 2005-2006
- * 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
- */
-
-/************************************************************************
- * yellowstone.h - configuration for YELLOWSTONE board
- ***********************************************************************/
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-/*-----------------------------------------------------------------------
- * High Level Configuration Options
- *----------------------------------------------------------------------*/
-#define CONFIG_YOLLOWSTONE     1       /* Board is Yellowstone         */
-#define CONFIG_440GR           1       /* Specific PPC440EP support    */
-#define CONFIG_4xx             1       /* ... PPC4xx family            */
-#define CONFIG_SYS_CLK_FREQ    66666666    /* external freq to pll     */
-
-#define CONFIG_BOARD_EARLY_INIT_F 1     /* Call board_early_init_f     */
-#define CONFIG_MISC_INIT_R     1       /* call misc_init_r()           */
-#define CONFIG_BOARD_RESET     1       /* call board_reset()           */
-
-/*-----------------------------------------------------------------------
- * Base addresses -- Note these are effective addresses where the
- * actual resources get mapped (not physical addresses)
- *----------------------------------------------------------------------*/
-#define CFG_MONITOR_LEN                (512 * 1024)    /* Reserve 512 kB for Monitor   */
-#define CFG_MALLOC_LEN         (256 * 1024)    /* Reserve 256 kB for malloc()  */
-#define CFG_MONITOR_BASE       (-CFG_MONITOR_LEN)
-#define CFG_SDRAM_BASE         0x00000000          /* _must_ be 0      */
-#define CFG_FLASH_BASE         0xfc000000          /* start of FLASH   */
-#define CFG_PCI_MEMBASE                0xa0000000          /* mapped pci memory*/
-#define CFG_PCI_MEMBASE1        CFG_PCI_MEMBASE  + 0x10000000
-#define CFG_PCI_MEMBASE2        CFG_PCI_MEMBASE1 + 0x10000000
-#define CFG_PCI_MEMBASE3        CFG_PCI_MEMBASE2 + 0x10000000
-
-/*Don't change either of these*/
-#define CFG_PERIPHERAL_BASE     0xef600000         /* internal peripherals*/
-#define CFG_PCI_BASE           0xe0000000          /* internal PCI regs*/
-/*Don't change either of these*/
-
-#define CFG_USB_DEVICE          0x50000000
-#define CFG_NVRAM_BASE_ADDR     0x80000000
-#define CFG_BCSR_BASE          (CFG_NVRAM_BASE_ADDR | 0x2000)
-#define CFG_BOOT_BASE_ADDR      0xf0000000
-
-/*-----------------------------------------------------------------------
- * Initial RAM & stack pointer (placed in SDRAM)
- *----------------------------------------------------------------------*/
-#define CFG_INIT_RAM_DCACHE    1               /* d-cache as init ram  */
-#define CFG_INIT_RAM_ADDR      0x70000000              /* DCache       */
-#define CFG_INIT_RAM_END       (8 << 10)
-#define CFG_GBL_DATA_SIZE      256                     /* 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
-
-/*-----------------------------------------------------------------------
- * Serial Port
- *----------------------------------------------------------------------*/
-#define CFG_EXT_SERIAL_CLOCK   11059200 /* use external 11.059MHz clk  */
-#define CONFIG_BAUDRATE                115200
-#define CONFIG_SERIAL_MULTI     1
-/*define this if you want console on UART1*/
-#undef CONFIG_UART1_CONSOLE
-
-#define CFG_BAUDRATE_TABLE  \
-    {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
-
-/*-----------------------------------------------------------------------
- * Environment
- *----------------------------------------------------------------------*/
-/*
- * Define here the location of the environment variables (FLASH or EEPROM).
- * Note: DENX encourages to use redundant environment in FLASH.
- */
-#if 1
-#define CFG_ENV_IS_IN_FLASH     1      /* use FLASH for environment vars       */
-#else
-#define CFG_ENV_IS_IN_EEPROM   1       /* use EEPROM for environment vars      */
-#endif
-
-/*-----------------------------------------------------------------------
- * FLASH related
- *----------------------------------------------------------------------*/
-#define CFG_FLASH_CFI                          /* The flash is CFI compatible  */
-#define CFG_FLASH_CFI_DRIVER                   /* Use common CFI driver        */
-#define CFG_FLASH_CFI_AMD_RESET 1              /* AMD RESET for STM 29W320DB!  */
-
-#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks           */
-#define CFG_MAX_FLASH_SECT     512     /* max number of sectors on one chip    */
-
-#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_FLASH_USE_BUFFER_WRITE 1   /* use buffered writes (20x faster)     */
-
-#define CFG_FLASH_EMPTY_INFO           /* print 'E' for empty sector on flinfo */
-
-#ifdef CFG_ENV_IS_IN_FLASH
-#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            0x2000  /* 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)
-#endif /* CFG_ENV_IS_IN_FLASH */
-
-/*-----------------------------------------------------------------------
- * DDR SDRAM
- *----------------------------------------------------------------------*/
-#undef CONFIG_SPD_EEPROM              /* Don't use SPD EEPROM for setup    */
-#define CFG_KBYTES_SDRAM        (128 * 1024)    /* 128MB                   */
-#define CFG_SDRAM_BANKS                (2)
-
-
-/*-----------------------------------------------------------------------
- * I2C
- *----------------------------------------------------------------------*/
-#define CONFIG_HARD_I2C                1           /* I2C with hardware support        */
-#undef CONFIG_SOFT_I2C                     /* I2C bit-banged           */
-#define CFG_I2C_SPEED          400000  /* I2C speed and slave address  */
-#define CFG_I2C_SLAVE          0x7F
-
-#define CFG_I2C_MULTI_EEPROMS
-#define CFG_I2C_EEPROM_ADDR    (0xa8>>1)
-#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
-
-#ifdef CFG_ENV_IS_IN_EEPROM
-#define CFG_ENV_SIZE           0x200       /* Size of Environment vars */
-#define CFG_ENV_OFFSET         0x0
-#endif /* CFG_ENV_IS_IN_EEPROM */
-
-#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=yellowstone\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=/tftpboot/yellowstone/uImage\0"                       \
-       "kernel_addr=fc000000\0"                                        \
-       "ramdisk_addr=fc180000\0"                                       \
-       "load=tftp 100000 /tftpboot/yellowstone/u-boot.bin\0"           \
-       "update=protect off fff80000 ffffffff;era fff80000 ffffffff;"   \
-               "cp.b 100000 fff80000 80000;"                           \
-               "setenv filesize;saveenv\0"                             \
-       "upd=run load;run update\0"                                     \
-       ""
-#define CONFIG_BOOTCOMMAND     "run flash_self"
-
-#if 0
-#define CONFIG_BOOTDELAY       -1      /* autoboot disabled            */
-#else
-#define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds     */
-#endif
-
-#define CONFIG_BAUDRATE                115200
-
-#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
-#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change        */
-
-#define CONFIG_MII             1       /* MII PHY management           */
-#define CONFIG_NET_MULTI        1      /* required for netconsole      */
-#define CONFIG_PHY1_ADDR        3
-#define CONFIG_HAS_ETH1                1       /* add support for "eth1addr"   */
-#define CONFIG_PHY_ADDR                1       /* PHY address, See schematics  */
-
-#define CFG_RX_ETH_BUFFER      32      /* Number of ethernet rx buffers & descriptors */
-
-#define CONFIG_NETCONSOLE              /* include NetConsole support   */
-
-/* Partitions */
-#define CONFIG_MAC_PARTITION
-#define CONFIG_DOS_PARTITION
-#define CONFIG_ISO_PARTITION
-
-#ifdef CONFIG_440EP
-/* USB */
-#define CONFIG_USB_OHCI
-#define CONFIG_USB_STORAGE
-
-/*Comment this out to enable USB 1.1 device*/
-#define USB_2_0_DEVICE
-#endif /*CONFIG_440EP*/
-
-#ifdef DEBUG
-#define CONFIG_PANIC_HANG
-#else
-#define CONFIG_HW_WATCHDOG                     /* watchdog */
-#endif
-
-#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
-                               CFG_CMD_ASKENV  | \
-                               CFG_CMD_DHCP    | \
-                               CFG_CMD_DIAG    | \
-                               CFG_CMD_ELF     | \
-                               CFG_CMD_EEPROM  | \
-                               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>
-
-/*
- * 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 CONFIG_LYNXKDI          1       /* support kdi files            */
-
-#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 */
-
-/*-----------------------------------------------------------------------
- * PCI stuff
- *-----------------------------------------------------------------------
- */
-/* General PCI */
-#define CONFIG_PCI                     /* include pci support          */
-#undef  CONFIG_PCI_PNP                 /* do (not) pci plug-and-play   */
-#define CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup  */
-#define CFG_PCI_TARGBASE        0x80000000 /* PCIaddr mapped to CFG_PCI_MEMBASE*/
-
-/* Board-specific PCI */
-#define CFG_PCI_PRE_INIT                /* enable board pci_pre_init()  */
-#define CFG_PCI_TARGET_INIT
-#define CFG_PCI_MASTER_INIT
-
-#define CFG_PCI_SUBSYS_VENDORID 0x10e8 /* AMCC */
-#define CFG_PCI_SUBSYS_ID       0xcafe /* Whatever */
-
-/*
- * 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 */
-
-/*-----------------------------------------------------------------------
- * External Bus Controller (EBC) Setup
- *----------------------------------------------------------------------*/
-#define CFG_FLASH              CFG_FLASH_BASE
-#define CFG_CPLD               0x80000000
-
-/* Memory Bank 0 (NOR-FLASH) initialization                                    */
-#define CFG_EBC_PB0AP          0x03017300
-#define CFG_EBC_PB0CR          (CFG_FLASH | 0xda000)
-
-/* Memory Bank 2 (CPLD) initialization                                         */
-#define CFG_EBC_PB2AP          0x04814500
-#define CFG_EBC_PB2CR          (CFG_CPLD | 0x18000)
-
-/*-----------------------------------------------------------------------
- * Cache Configuration
- */
-#define CFG_DCACHE_SIZE                (32<<10) /* For AMCC 440 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 2cc18db9a50d7b0e816e44d3f9bc3a363a849f02..b68ae54b94d44719aa0f35576e0c863e3fbfe417 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2005-2006
+ * (C) Copyright 2005-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
@@ -22,7 +22,7 @@
  */
 
 /************************************************************************
- * yosemite.h - configuration for YOSEMITE board
+ * yosemite.h - configuration for Yosemite & Yellowstone boards
  ***********************************************************************/
 #ifndef __CONFIG_H
 #define __CONFIG_H
 /*-----------------------------------------------------------------------
  * High Level Configuration Options
  *----------------------------------------------------------------------*/
-#define CONFIG_YOSEMITE                1       /* Board is Yosemite            */
-#define CONFIG_440EP           1       /* Specific PPC440EP support    */
-#define CONFIG_4xx             1       /* ... PPC4xx family            */
+/* This config file is used for Yosemite (440EP) and Yellowstone (440GR)*/
+#ifndef CONFIG_YELLOWSTONE
+#define CONFIG_440EP           1       /* Specific PPC440EP support    */
+#define CONFIG_HOSTNAME                yosemite
+#else
+#define CONFIG_440GR           1       /* Specific PPC440GR support    */
+#define CONFIG_HOSTNAME                yellowstone
+#endif
+#define CONFIG_4xx             1       /* ... PPC4xx family            */
 #define CONFIG_SYS_CLK_FREQ    66666666    /* external freq to pll     */
 
 #define CONFIG_BOARD_EARLY_INIT_F 1     /* Call board_early_init_f     */
 
 #undef CONFIG_BOOTARGS
 
+/* Setup some board specific values for the default environment variables */
+#ifndef CONFIG_YELLOWSTONE
+#define CONFIG_HOSTNAME                yosemite
+#define CFG_BOOTFILE           "bootfile=/tftpboot/yosemite/uImage\0"
+#define CFG_ROOTPATH           "rootpath=/opt/eldk/ppc_4xxFP\0"
+#else
+#define CONFIG_HOSTNAME                yellowstone
+#define CFG_BOOTFILE           "bootfile=/tftpboot/yellowstone/uImage\0"
+#define CFG_ROOTPATH           "rootpath=/opt/eldk/ppc_4xx\0"
+#endif
+
 #define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       CFG_BOOTFILE                                                    \
+       CFG_ROOTPATH                                                    \
        "netdev=eth0\0"                                                 \
-       "hostname=yosemite\0"                                           \
        "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
                "nfsroot=${serverip}:${rootpath}\0"                     \
        "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
                "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
        "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;"     \
                "bootm\0"                                               \
-       "rootpath=/opt/eldk/ppc_4xx\0"                                  \
-       "bootfile=/tftpboot/yosemite/uImage\0"                          \
+       "bootfile=/tftpboot/${hostname}/uImage\0"                       \
        "kernel_addr=fc000000\0"                                        \
        "ramdisk_addr=fc180000\0"                                       \
-       "load=tftp 100000 /tftpboot/yosemite/u-boot.bin\0"              \
+       "load=tftp 200000 /tftpboot/${hostname}/u-boot.bin\0"           \
        "update=protect off fff80000 ffffffff;era fff80000 ffffffff;"   \
-               "cp.b 100000 fff80000 80000;"                           \
+               "cp.b 200000 fff80000 80000;"                           \
                "setenv filesize;saveenv\0"                             \
        "upd=run load;run update\0"                                     \
        ""
 #define CONFIG_USB_OHCI
 #define CONFIG_USB_STORAGE
 
-/*Comment this out to enable USB 1.1 device*/
+/* Comment this out to enable USB 1.1 device */
 #define USB_2_0_DEVICE
-#endif /*CONFIG_440EP*/
+
+#define CMD_USB                        (CFG_CMD_USB | CFG_CMD_FAT | CFG_CMD_EXT2)
+
+#define CONFIG_SUPPORT_VFAT
+#else
+#define CMD_USB                        0       /* no USB on 440GR              */
+#endif /* CONFIG_440EP */
 
 #ifdef DEBUG
 #define CONFIG_PANIC_HANG
                                CFG_CMD_PING    | \
                                CFG_CMD_REGINFO | \
                                CFG_CMD_SDRAM   | \
-                               CFG_CMD_FAT     | \
-                               CFG_CMD_EXT2    | \
-                               CFG_CMD_USB     )
-
-#define CONFIG_SUPPORT_VFAT
+                               CMD_USB)
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #include <cmd_confdefs.h>
index a6532b5e85338d112c09aab20ac0934977d5bf92..7f8b0228aec2135be2f660d60f93d8e91bceaa69 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*/
+#define CONFIG_DDR_ECC         1       /* with ECC support             */
 
 /*-----------------------------------------------------------------------
  * I2C
        "bootfile=yucca/uImage\0"                                       \
        "kernel_addr=E7F10000\0"                                        \
        "ramdisk_addr=E7F20000\0"                                       \
+       "initrd_high=30000000\0"                                        \
        "load=tftp 100000 yuca/u-boot.bin\0"                            \
        "update=protect off 2:4-7;era 2:4-7;"                           \
                "cp.b ${fileaddr} FFFB0000 ${filesize};"                \
 /* 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 c6aa8ece5b010886e7d2d235b22efed8bd0e458b..1e8ed7abdfcaf65a746fd3d96260783176dd7e61 100644 (file)
 /*
  * NAND Flash
  */
-/* Use the new NAND code. (BOARDLIBS = drivers/nand/libnand.a required) */
 #define CONFIG_NEW_NAND_CODE
 #define CFG_NAND0_BASE         0x0
 #undef CFG_NAND1_BASE
diff --git a/include/fdt.h b/include/fdt.h
new file mode 100644 (file)
index 0000000..3dd3aca
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _FDT_H
+#define _FDT_H
+
+#ifndef __ASSEMBLY__
+
+struct fdt_header {
+       uint32_t magic;                  /* magic word FDT_MAGIC */
+       uint32_t totalsize;              /* total size of DT block */
+       uint32_t off_dt_struct;          /* offset to structure */
+       uint32_t off_dt_strings;         /* offset to strings */
+       uint32_t off_mem_rsvmap;         /* offset to memory reserve map */
+       uint32_t version;                /* format version */
+       uint32_t last_comp_version;      /* last compatible version */
+
+       /* version 2 fields below */
+       uint32_t boot_cpuid_phys;        /* Which physical CPU id we're
+                                           booting on */
+       /* version 3 fields below */
+       uint32_t size_dt_strings;        /* size of the strings block */
+
+       /* version 17 fields below */
+       uint32_t size_dt_struct;         /* size of the structure block */
+};
+
+struct fdt_reserve_entry {
+       uint64_t address;
+       uint64_t size;
+};
+
+struct fdt_node_header {
+       uint32_t tag;
+       char name[0];
+};
+
+struct fdt_property {
+       uint32_t tag;
+       uint32_t len;
+       uint32_t nameoff;
+       char data[0];
+};
+
+#endif /* !__ASSEMBLY */
+
+#define FDT_MAGIC      0xd00dfeed      /* 4: version, 4: total size */
+#define FDT_TAGSIZE    sizeof(uint32_t)
+
+#define FDT_BEGIN_NODE 0x1             /* Start node: full name */
+#define FDT_END_NODE   0x2             /* End node */
+#define FDT_PROP       0x3             /* Property: name off,
+                                          size, content */
+#define FDT_NOP                0x4             /* nop */
+#define FDT_END                0x9
+
+#define FDT_V1_SIZE    (7*sizeof(uint32_t))
+#define FDT_V2_SIZE    (FDT_V1_SIZE + sizeof(uint32_t))
+#define FDT_V3_SIZE    (FDT_V2_SIZE + sizeof(uint32_t))
+#define FDT_V16_SIZE   FDT_V3_SIZE
+#define FDT_V17_SIZE   (FDT_V16_SIZE + sizeof(uint32_t))
+
+#endif /* _FDT_H */
diff --git a/include/fdt_support.h b/include/fdt_support.h
new file mode 100644 (file)
index 0000000..a276834
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * (C) Copyright 2007
+ * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.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 __FDT_SUPPORT_H
+#define __FDT_SUPPORT_H
+
+#ifdef CONFIG_OF_LIBFDT
+
+#include <fdt.h>
+
+int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force);
+
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
+int fdt_env(void *fdt);
+#endif
+
+#ifdef CONFIG_OF_HAS_BD_T
+int fdt_bd_t(void *fdt);
+#endif
+
+#endif /* ifdef CONFIG_OF_LIBFDT */
+#endif /* ifndef __FDT_SUPPORT_H */
index 8b7e824cca08d495379b7b528a15738ee3e9e7ec..43b9c6bdca6252b85faa6c5eadee91296ac7fa64 100644 (file)
@@ -252,6 +252,8 @@ extern void flash_read_factory_serial(flash_info_t * info, void * buffer, int of
 #define STM_ID_x800AB  0x005B005B      /* M29W800AB ID (8M = 512K x 16 )       */
 #define STM_ID_29W320DT 0x22CA22CA     /* M29W320DT ID (32 M, top boot sector) */
 #define STM_ID_29W320DB 0x22CB22CB     /* M29W320DB ID (32 M, bottom boot sect)        */
+#define STM_ID_29W320ET 0x22562256     /* M29W320ET ID (32 M, top boot sector) */
+#define STM_ID_29W320EB 0x22572257     /* M29W320EB ID (32 M, bottom boot sect)*/
 #define STM_ID_29W040B 0x00E300E3      /* M29W040B ID (4M = 512K x 8)  */
 #define FLASH_PSD4256GV 0x00E9         /* PSD4256 Flash and CPLD combination   */
 
@@ -304,6 +306,7 @@ extern void flash_read_factory_serial(flash_info_t * info, void * buffer, int of
 
 #define TOSH_ID_FVT160 0xC2            /* TC58FVT160 ID (16 M, top )           */
 #define TOSH_ID_FVB160 0x43            /* TC58FVT160 ID (16 M, bottom )        */
+#define PHILIPS_LPC2292 0x0401FF13  /* LPC2292 internal FLASH                  */
 
 /*-----------------------------------------------------------------------
  * Internal FLASH identification codes
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 */
diff --git a/include/libfdt.h b/include/libfdt.h
new file mode 100644 (file)
index 0000000..f8bac73
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _LIBFDT_H
+#define _LIBFDT_H
+
+#include <fdt.h>
+#include <libfdt_env.h>
+
+#define FDT_FIRST_SUPPORTED_VERSION    0x10
+#define FDT_LAST_SUPPORTED_VERSION     0x11
+
+/* Error codes: informative error codes */
+#define FDT_ERR_NOTFOUND       1
+#define FDT_ERR_EXISTS         2
+#define FDT_ERR_NOSPACE                3
+
+/* Error codes: codes for bad parameters */
+#define FDT_ERR_BADOFFSET      4
+#define FDT_ERR_BADPATH                5
+#define FDT_ERR_BADSTATE       6
+
+/* Error codes: codes for bad device tree blobs */
+#define FDT_ERR_TRUNCATED      7
+#define FDT_ERR_BADMAGIC       8
+#define FDT_ERR_BADVERSION     9
+#define FDT_ERR_BADSTRUCTURE   10
+#define FDT_ERR_BADLAYOUT      11
+
+#define FDT_ERR_MAX            11
+
+#define fdt_get_header(fdt, field) \
+       (fdt32_to_cpu(((struct fdt_header *)(fdt))->field))
+#define fdt_magic(fdt)                 (fdt_get_header(fdt, magic))
+#define fdt_totalsize(fdt)             (fdt_get_header(fdt, totalsize))
+#define fdt_off_dt_struct(fdt)         (fdt_get_header(fdt, off_dt_struct))
+#define fdt_off_dt_strings(fdt)                (fdt_get_header(fdt, off_dt_strings))
+#define fdt_off_mem_rsvmap(fdt)                (fdt_get_header(fdt, off_mem_rsvmap))
+#define fdt_version(fdt)               (fdt_get_header(fdt, version))
+#define fdt_last_comp_version(fdt)     (fdt_get_header(fdt, last_comp_version))
+#define fdt_boot_cpuid_phys(fdt)       (fdt_get_header(fdt, boot_cpuid_phys))
+#define fdt_size_dt_strings(fdt)       (fdt_get_header(fdt, size_dt_strings))
+#define fdt_size_dt_struct(fdt)                (fdt_get_header(fdt, size_dt_struct))
+
+#define fdt_set_header(fdt, field, val) \
+       ((struct fdt_header *)(fdt))->field = cpu_to_fdt32(val)
+
+int fdt_check_header(const void *fdt);
+
+void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
+
+#define fdt_offset_ptr_typed(fdt, offset, var) \
+       ((typeof(var))(fdt_offset_ptr((fdt), (offset), sizeof(*(var)))))
+
+int fdt_move(const void *fdt, void *buf, int bufsize);
+
+/* Read-only functions */
+char *fdt_string(const void *fdt, int stroffset);
+
+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
+                              const char *name, int namelen);
+int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
+
+int fdt_path_offset(const void *fdt, const char *path);
+
+struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
+                                     const char *name, int *lenp);
+void *fdt_getprop(const void *fdt, int nodeoffset,
+                 const char *name, int *lenp);
+
+uint32_t fdt_next_tag(const void *fdt, int offset,
+                     int *nextoffset, char **namep);
+int fdt_num_reservemap(void *fdt, int *used, int *total);
+int fdt_get_reservemap(void *fdt, int n, struct fdt_reserve_entry *re);
+
+/* Write-in-place functions */
+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+                       const void *val, int len);
+
+#define fdt_setprop_inplace_typed(fdt, nodeoffset, name, val) \
+       ({ \
+               typeof(val) x = val; \
+               fdt_setprop_inplace(fdt, nodeoffset, name, &x, sizeof(x)); \
+       })
+
+int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
+int fdt_nop_node(void *fdt, int nodeoffset);
+int fdt_insert_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size);
+
+
+/* Sequential-write functions */
+int fdt_create(void *buf, int bufsize);
+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
+int fdt_finish_reservemap(void *fdt);
+int fdt_begin_node(void *fdt, const char *name);
+int fdt_property(void *fdt, const char *name, const void *val, int len);
+#define fdt_property_typed(fdt, name, val) \
+       ({ \
+               typeof(val) x = (val); \
+               fdt_property((fdt), (name), &x, sizeof(x)); \
+       })
+#define fdt_property_string(fdt, name, str) \
+       fdt_property(fdt, name, str, strlen(str)+1)
+int fdt_end_node(void *fdt);
+int fdt_finish(void *fdt);
+int fdt_replace_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size);
+
+/* Read-write functions */
+int fdt_open_into(void *fdt, void *buf, int bufsize);
+int fdt_pack(void *fdt);
+
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+               const void *val, int len);
+#define fdt_setprop_typed(fdt, nodeoffset, name, val) \
+       ({ \
+               typeof(val) x = (val); \
+               fdt_setprop((fdt), (nodeoffset), (name), &x, sizeof(x)); \
+       })
+#define fdt_setprop_string(fdt, nodeoffset, name, str) \
+       fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
+int fdt_delprop(void *fdt, int nodeoffset, const char *name);
+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+                           const char *name, int namelen);
+int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
+int fdt_del_node(void *fdt, int nodeoffset);
+
+/* Extra functions */
+const char *fdt_strerror(int errval);
+
+#endif /* _LIBFDT_H */
diff --git a/include/libfdt_env.h b/include/libfdt_env.h
new file mode 100644 (file)
index 0000000..e746314
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * libfdt - Flat Device Tree manipulation (build/run environment adaptation)
+ * Copyright (C) 2007 Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
+ * Original version written by David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _LIBFDT_ENV_H
+#define _LIBFDT_ENV_H
+
+#include <stddef.h>
+#include <linux/types.h>
+#include <asm/byteorder.h>
+#include <linux/string.h>
+
+struct fdt_header *fdt;         /* Pointer to the working fdt */
+
+#define fdt32_to_cpu(x)                __be32_to_cpu(x)
+#define cpu_to_fdt32(x)                __cpu_to_be32(x)
+#define fdt64_to_cpu(x)                __be64_to_cpu(x)
+#define cpu_to_fdt64(x)                __cpu_to_be64(x)
+
+#endif /* _LIBFDT_ENV_H */
diff --git a/include/linux/mii.h b/include/linux/mii.h
new file mode 100644 (file)
index 0000000..7c63095
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * linux/mii.h: definitions for MII-compatible transceivers
+ * Originally drivers/net/sunhme.h.
+ *
+ * Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com)
+ */
+
+#ifndef __LINUX_MII_H__
+#define __LINUX_MII_H__
+
+/* Generic MII registers. */
+
+#define MII_BMCR           0x00        /* Basic mode control register */
+#define MII_BMSR           0x01        /* Basic mode status register  */
+#define MII_PHYSID1        0x02        /* PHYS ID 1                   */
+#define MII_PHYSID2        0x03        /* PHYS ID 2                   */
+#define MII_ADVERTISE      0x04        /* Advertisement control reg   */
+#define MII_LPA                    0x05        /* Link partner ability reg    */
+#define MII_EXPANSION      0x06        /* Expansion register          */
+#define MII_DCOUNTER       0x12        /* Disconnect counter          */
+#define MII_FCSCOUNTER     0x13        /* False carrier counter       */
+#define MII_NWAYTEST       0x14        /* N-way auto-neg test reg     */
+#define MII_RERRCOUNTER     0x15       /* Receive error counter       */
+#define MII_SREVISION      0x16        /* Silicon revision            */
+#define MII_RESV1          0x17        /* Reserved...                 */
+#define MII_LBRERROR       0x18        /* Lpback, rx, bypass error    */
+#define MII_PHYADDR        0x19        /* PHY address                 */
+#define MII_RESV2          0x1a        /* Reserved...                 */
+#define MII_TPISTATUS      0x1b        /* TPI status for 10mbps       */
+#define MII_NCONFIG        0x1c        /* Network interface config    */
+
+/* Basic mode control register. */
+#define BMCR_RESV              0x003f  /* Unused...                   */
+#define BMCR_SPEED1000         0x0040  /* MSB of Speed (1000)         */
+#define BMCR_CTST              0x0080  /* Collision test              */
+#define BMCR_FULLDPLX          0x0100  /* Full duplex                 */
+#define BMCR_ANRESTART         0x0200  /* Auto negotiation restart    */
+#define BMCR_ISOLATE           0x0400  /* Disconnect DP83840 from MII */
+#define BMCR_PDOWN             0x0800  /* Powerdown the DP83840       */
+#define BMCR_ANENABLE          0x1000  /* Enable auto negotiation     */
+#define BMCR_SPEED100          0x2000  /* Select 100Mbps              */
+#define BMCR_LOOPBACK          0x4000  /* TXD loopback bits           */
+#define BMCR_RESET             0x8000  /* Reset the DP83840           */
+
+/* Basic mode status register. */
+#define BMSR_ERCAP             0x0001  /* Ext-reg capability          */
+#define BMSR_JCD               0x0002  /* Jabber detected             */
+#define BMSR_LSTATUS           0x0004  /* Link status                 */
+#define BMSR_ANEGCAPABLE       0x0008  /* Able to do auto-negotiation */
+#define BMSR_RFAULT            0x0010  /* Remote fault detected       */
+#define BMSR_ANEGCOMPLETE      0x0020  /* Auto-negotiation complete   */
+#define BMSR_RESV              0x07c0  /* Unused...                   */
+#define BMSR_10HALF            0x0800  /* Can do 10mbps, half-duplex  */
+#define BMSR_10FULL            0x1000  /* Can do 10mbps, full-duplex  */
+#define BMSR_100HALF           0x2000  /* Can do 100mbps, half-duplex */
+#define BMSR_100FULL           0x4000  /* Can do 100mbps, full-duplex */
+#define BMSR_100BASE4          0x8000  /* Can do 100mbps, 4k packets  */
+
+/* Advertisement control register. */
+#define ADVERTISE_SLCT         0x001f  /* Selector bits               */
+#define ADVERTISE_CSMA         0x0001  /* Only selector supported     */
+#define ADVERTISE_10HALF       0x0020  /* Try for 10mbps half-duplex  */
+#define ADVERTISE_10FULL       0x0040  /* Try for 10mbps full-duplex  */
+#define ADVERTISE_100HALF      0x0080  /* Try for 100mbps half-duplex */
+#define ADVERTISE_100FULL      0x0100  /* Try for 100mbps full-duplex */
+#define ADVERTISE_100BASE4     0x0200  /* Try for 100mbps 4k packets  */
+#define ADVERTISE_RESV         0x1c00  /* Unused...                   */
+#define ADVERTISE_RFAULT       0x2000  /* Say we can detect faults    */
+#define ADVERTISE_LPACK                0x4000  /* Ack link partners response  */
+#define ADVERTISE_NPAGE                0x8000  /* Next page bit               */
+
+#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \
+                       ADVERTISE_CSMA)
+#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \
+                      ADVERTISE_100HALF | ADVERTISE_100FULL)
+
+/* Link partner ability register. */
+#define LPA_SLCT               0x001f  /* Same as advertise selector  */
+#define LPA_10HALF             0x0020  /* Can do 10mbps half-duplex   */
+#define LPA_10FULL             0x0040  /* Can do 10mbps full-duplex   */
+#define LPA_100HALF            0x0080  /* Can do 100mbps half-duplex  */
+#define LPA_100FULL            0x0100  /* Can do 100mbps full-duplex  */
+#define LPA_100BASE4           0x0200  /* Can do 100mbps 4k packets   */
+#define LPA_RESV               0x1c00  /* Unused...                   */
+#define LPA_RFAULT             0x2000  /* Link partner faulted        */
+#define LPA_LPACK              0x4000  /* Link partner acked us       */
+#define LPA_NPAGE              0x8000  /* Next page bit               */
+
+#define LPA_DUPLEX             (LPA_10FULL | LPA_100FULL)
+#define LPA_100                        (LPA_100FULL | LPA_100HALF | LPA_100BASE4)
+
+/* Expansion register for auto-negotiation. */
+#define EXPANSION_NWAY         0x0001  /* Can do N-way auto-nego      */
+#define EXPANSION_LCWP         0x0002  /* Got new RX page code word   */
+#define EXPANSION_ENABLENPAGE  0x0004  /* This enables npage words    */
+#define EXPANSION_NPCAPABLE    0x0008  /* Link partner supports npage */
+#define EXPANSION_MFAULTS      0x0010  /* Multiple faults detected    */
+#define EXPANSION_RESV         0xffe0  /* Unused...                   */
+
+/* N-way test register. */
+#define NWAYTEST_RESV1         0x00ff  /* Unused...                   */
+#define NWAYTEST_LOOPBACK      0x0100  /* Enable loopback for N-way   */
+#define NWAYTEST_RESV2         0xfe00  /* Unused...                   */
+
+
+/**
+ * mii_nway_result
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * Given a set of MII abilities, check each bit and returns the
+ * currently supported media, in the priority order defined by
+ * IEEE 802.3u.  We use LPA_xxx constants but note this is not the
+ * value of LPA solely, as described above.
+ *
+ * The one exception to IEEE 802.3u is that 100baseT4 is placed
+ * between 100T-full and 100T-half.  If your phy does not support
+ * 100T4 this is fine. If your phy places 100T4 elsewhere in the
+ * priority order, you will need to roll your own function.
+ */
+static inline unsigned int mii_nway_result (unsigned int negotiated)
+{
+       unsigned int ret;
+
+       if (negotiated & LPA_100FULL)
+               ret = LPA_100FULL;
+       else if (negotiated & LPA_100BASE4)
+               ret = LPA_100BASE4;
+       else if (negotiated & LPA_100HALF)
+               ret = LPA_100HALF;
+       else if (negotiated & LPA_10FULL)
+               ret = LPA_10FULL;
+       else
+               ret = LPA_10HALF;
+
+       return ret;
+}
+
+/**
+ * mii_duplex
+ * @duplex_lock: Non-zero if duplex is locked at full
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * A small helper function for a common case.  Returns one
+ * if the media is operating or locked at full duplex, and
+ * returns zero otherwise.
+ */
+static inline unsigned int mii_duplex (unsigned int duplex_lock,
+                                      unsigned int negotiated)
+{
+       if (duplex_lock)
+               return 1;
+       if (mii_nway_result(negotiated) & LPA_DUPLEX)
+               return 1;
+       return 0;
+}
+
+
+#endif /* __LINUX_MII_H__ */
index f9422cb1fafcf2d2bb24e2b36ece2fe39335bda2..37f2924df18881bf6569c21607cc9d19518f794a 100644 (file)
@@ -7,7 +7,7 @@
 extern "C" {
 #endif
 
-#define S_IFMT  00170000       /* type of file */
+#define S_IFMT 00170000        /* type of file */
 #define S_IFSOCK 0140000       /* named socket */
 #define S_IFLNK         0120000        /* symbolic link */
 #define S_IFREG  0100000       /* regular */
@@ -49,25 +49,26 @@ struct stat {
        ino_t           st_ino;         /* file id */
        mode_t          st_mode;        /* ownership/protection */
        nlink_t         st_nlink;       /* number of links */
-       uid_t           st_uid;         /* user id */
-       gid_t           st_gid;         /* group id */
+       uid_t           st_uid;         /* user id */
+       gid_t           st_gid;         /* group id */
        dev_t           st_rdev;
        off_t           st_size;        /* file size in # of bytes */
-       unsigned long   st_blksize;     /* block size */
-       unsigned long   st_blocks;      /* file size in # of blocks */
-       unsigned long   st_atime;       /* time file was last accessed */
-       unsigned long   __unused1;
-       unsigned long   st_mtime;       /* time file was last modified */
-       unsigned long   __unused2;
-       unsigned long   st_ctime;       /* time file status was last changed */
-       unsigned long   __unused3;
-       unsigned long   __unused4;
-       unsigned long   __unused5;
+       unsigned long   st_blksize;     /* block size */
+       unsigned long   st_blocks;      /* file size in # of blocks */
+       unsigned long   st_atime;       /* time file was last accessed */
+       unsigned long   __unused1;
+       unsigned long   st_mtime;       /* time file was last modified */
+       unsigned long   __unused2;
+       unsigned long   st_ctime;       /* time file status was last changed */
+       unsigned long   __unused3;
+       unsigned long   __unused4;
+       unsigned long   __unused5;
 };
 
 #endif /* __PPC__ */
 
-#if defined (__ARM__) || defined (__I386__) || defined (__M68K__) || defined (__blackfin__)
+#if defined (__ARM__) || defined (__I386__) || defined (__M68K__) || defined (__bfin__) ||\
+       defined (__microblaze__)
 
 struct stat {
        unsigned short st_dev;
@@ -97,34 +98,59 @@ struct stat {
 #if defined (__MIPS__)
 
 struct stat {
-       dev_t           st_dev;
-       long            st_pad1[3];
-       ino_t           st_ino;
-       mode_t          st_mode;
-       nlink_t         st_nlink;
-       uid_t           st_uid;
-       gid_t           st_gid;
-       dev_t           st_rdev;
-       long            st_pad2[2];
-       off_t           st_size;
-       long            st_pad3;
+       dev_t           st_dev;
+       long            st_pad1[3];
+       ino_t           st_ino;
+       mode_t          st_mode;
+       nlink_t         st_nlink;
+       uid_t           st_uid;
+       gid_t           st_gid;
+       dev_t           st_rdev;
+       long            st_pad2[2];
+       off_t           st_size;
+       long            st_pad3;
        /*
         * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
         * but we don't have it under Linux.
         */
-       time_t          st_atime;
-       long            reserved0;
-       time_t          st_mtime;
-       long            reserved1;
-       time_t          st_ctime;
-       long            reserved2;
-       long            st_blksize;
-       long            st_blocks;
-       long            st_pad4[14];
+       time_t          st_atime;
+       long            reserved0;
+       time_t          st_mtime;
+       long            reserved1;
+       time_t          st_ctime;
+       long            reserved2;
+       long            st_blksize;
+       long            st_blocks;
+       long            st_pad4[14];
 };
 
 #endif /* __MIPS__ */
 
+#if defined(__AVR32__)
+
+struct stat {
+       unsigned long st_dev;
+       unsigned long st_ino;
+       unsigned short st_mode;
+       unsigned short st_nlink;
+       unsigned short st_uid;
+       unsigned short st_gid;
+       unsigned long  st_rdev;
+       unsigned long  st_size;
+       unsigned long  st_blksize;
+       unsigned long  st_blocks;
+       unsigned long  st_atime;
+       unsigned long  st_atime_nsec;
+       unsigned long  st_mtime;
+       unsigned long  st_mtime_nsec;
+       unsigned long  st_ctime;
+       unsigned long  st_ctime_nsec;
+       unsigned long  __unused4;
+       unsigned long  __unused5;
+};
+
+#endif /* __AVR32__ */
+
 #ifdef __cplusplus
 }
 #endif
index 03dd0cafd2dbff9510929f218779450209dbef84..60fc214b3e224658274886ead3348bf2c78b6a6d 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 */
 
-#define SWCNR      0x0208
-#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field.
-#define SWCNR_RES  ~(SWCNR_SWCN)
+/* SPRIDR - System Part and Revision ID Register
+ */
+#define SPRIDR_PARTID                  0xFFFF0000      /* Part Identification */
+#define SPRIDR_REVID                   0x0000FFFF      /* Revision Identification */
 
-#define SWSRR      0x020E
+#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
 
-/*
- * Default Internal Memory Register Space (Freescale recomandation)
- */
-#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 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
 
-/*
- * Default Internal Memory Register Space (Freescale recomandation)
+#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
+
+#define SPR_8311_REV10                 0x80B30010
+#define SPR_8311E_REV10                        0x80B20010
+#define SPR_8313_REV10                 0x80B10010
+#define SPR_8313E_REV10                        0x80B00010
+
+/* SPCR - System Priority Configuration Register
  */
-#define LBLAWBAR0 0x0020
-#define LBLAWAR0  0x0024
-#define LBLAWBAR1 0x0028
-#define LBLAWAR1  0x002C
-#define LBLAWBAR2 0x0030
-#define LBLAWAR2  0x0034
-#define LBLAWBAR3 0x0038
-#define LBLAWAR3  0x003C
+#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)
 
-/*
- * 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
+#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)
 
-/*
- * 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
+#elif defined(CONFIG_MPC831X)
+/* SPCR bits - MPC831x specific */
+#define SPCR_TSECDP                    0x00003000      /* TSEC data priority */
+#define SPCR_TSECDP_SHIFT              (31-19)
+#define SPCR_TSECEP                    0x00000C00      /* TSEC emergency priority */
+#define SPCR_TSECEP_SHIFT              (31-21)
+#define SPCR_TSECBDP                   0x00000300      /* TSEC buffer descriptor priority */
+#define SPCR_TSECBDP_SHIFT             (31-23)
 #endif
-#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)
+
+/* 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
+
+#elif defined(CONFIG_MPC831X)
+/* SICRL bits - MPC831x specific */
+#define SICRL_LBC                      0x30000000
+#define SICRL_UART                     0x0C000000
+#define SICRL_SPI_A                    0x03000000
+#define SICRL_SPI_B                    0x00C00000
+#define SICRL_SPI_C                    0x00300000
+#define SICRL_SPI_D                    0x000C0000
+#define SICRL_USBDR                    0x00000C00
+#define SICRL_ETSEC1_A                 0x0000000C
+#define SICRL_ETSEC2_A                 0x00000003
+
+/* SICRH bits - MPC831x specific */
+#define SICRH_INTR_A                   0x02000000
+#define SICRH_INTR_B                   0x00C00000
+#define SICRH_IIC                      0x00300000
+#define SICRH_ETSEC2_B                 0x000C0000
+#define SICRH_ETSEC2_C                 0x00030000
+#define SICRH_ETSEC2_D                 0x0000C000
+#define SICRH_ETSEC2_E                 0x00003000
+#define SICRH_ETSEC2_F                 0x00000C00
+#define SICRH_ETSEC2_G                 0x00000300
+#define SICRH_ETSEC1_B                 0x00000080
+#define SICRH_ETSEC1_C                 0x00000060
+#define SICRH_GTX1_DLY                 0x00000008
+#define SICRH_GTX2_DLY                 0x00000004
+#define SICRH_TSOBI1                   0x00000002
+#define SICRH_TSOBI2                   0x00000001
+
 #endif
 
-#define OR0 0x5004
-#define OR1 0x500C
-#define OR2 0x5014
-#define OR3 0x501C
-#define OR4 0x5024
-#define OR5 0x502C
-#define OR6 0x5034
-#define OR7 0x503C
+/* 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)
 
-#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
+/* 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)
 
-/*
- * Hard Reset Configration Word - High
+/* SWSRR - System Watchdog Service Register
+ */
+#define SWSRR                          0x020E          /* Register offset to immr */
+
+/* ACR - Arbiter Configuration Register
+ */
+#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 */
+
+/* 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 */
+
+/* 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
+
+/* HRCWH - Hardware Reset Configuration Word High
  */
-#define HRCWH_PCI_AGENT              0x00000000
-#define HRCWH_PCI_HOST               0x80000000
+#define HRCWH_PCI_HOST                 0x80000000
+#define HRCWH_PCI_HOST_SHIFT           31
+#define HRCWH_PCI_AGENT                        0x00000000
 
-#if defined (CONFIG_MPC8349)
-#define HRCWH_32_BIT_PCI             0x00000000
-#define HRCWH_64_BIT_PCI             0x40000000
+#if defined(CONFIG_MPC834X)
+#define HRCWH_32_BIT_PCI               0x00000000
+#define HRCWH_64_BIT_PCI               0x40000000
 #endif
 
-#define HRCWH_PCI1_ARBITER_DISABLE   0x00000000
-#define HRCWH_PCI1_ARBITER_ENABLE    0x20000000
+#define HRCWH_PCI1_ARBITER_DISABLE     0x00000000
+#define HRCWH_PCI1_ARBITER_ENABLE      0x20000000
 
-#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_PCI_ARBITER_DISABLE      0x00000000
+#define HRCWH_PCI_ARBITER_ENABLE       0x20000000
+
+#if defined(CONFIG_MPC834X)
+#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
 #endif
 
-#define HRCWH_CORE_DISABLE           0x08000000
-#define HRCWH_CORE_ENABLE            0x00000000
+#define HRCWH_CORE_DISABLE             0x08000000
+#define HRCWH_CORE_ENABLE              0x00000000
 
-#define HRCWH_FROM_0X00000100        0x00000000
-#define HRCWH_FROM_0XFFF00100        0x04000000
+#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_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
+#define HRCWH_SW_WATCHDOG_DISABLE      0x00000000
+#define HRCWH_SW_WATCHDOG_ENABLE       0x00800000
 
-#define HRCWH_ROM_LOC_DDR_SDRAM      0x00000000
-#define HRCWH_ROM_LOC_PCI1           0x00100000
-#if defined (CONFIG_MPC8349)
-#define HRCWH_ROM_LOC_PCI2           0x00200000
+#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_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 HRCWH_ROM_LOC_LOCAL_8BIT       0x00500000
+#define HRCWH_ROM_LOC_LOCAL_16BIT      0x00600000
+#define HRCWH_ROM_LOC_LOCAL_32BIT      0x00700000
+
+#if defined(CONFIG_MPC831X)
+#define HRCWH_ROM_LOC_NAND_SP_8BIT     0x00100000
+#define HRCWH_ROM_LOC_NAND_SP_16BIT    0x00200000
+#define HRCWH_ROM_LOC_NAND_LP_8BIT     0x00500000
+#define HRCWH_ROM_LOC_NAND_LP_16BIT    0x00600000
+
+#define HRCWH_RL_EXT_LEGACY            0x00000000
+#define HRCWH_RL_EXT_NAND              0x00040000
+
+#define HRCWH_TSEC1M_IN_MII            0x00000000
+#define HRCWH_TSEC1M_IN_RMII           0x00002000
+#define HRCWH_TSEC1M_IN_RGMII          0x00006000
+#define HRCWH_TSEC1M_IN_RTBI           0x0000A000
+#define HRCWH_TSEC1M_IN_SGMII          0x0000C000
+
+#define HRCWH_TSEC2M_IN_MII            0x00000000
+#define HRCWH_TSEC2M_IN_RMII           0x00000400
+#define HRCWH_TSEC2M_IN_RGMII          0x00000C00
+#define HRCWH_TSEC2M_IN_RTBI           0x00001400
+#define HRCWH_TSEC2M_IN_SGMII          0x00001800
 #endif
 
-#if defined (CONFIG_MPC8360)
-#define HRCWH_SECONDARY_DDR_DISABLE  0x00000000
-#define HRCWH_SECONDARY_DDR_ENABLE   0x00000010
+#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
 
-#define HRCWH_BIG_ENDIAN             0x00000000
-#define HRCWH_LITTLE_ENDIAN          0x00000008
+#if defined(CONFIG_MPC8360)
+#define HRCWH_SECONDARY_DDR_DISABLE    0x00000000
+#define HRCWH_SECONDARY_DDR_ENABLE     0x00000010
+#endif
 
-#define HRCWH_LALE_NORMAL            0x00000000
-#define HRCWH_LALE_EARLY             0x00000004
+#define HRCWH_BIG_ENDIAN               0x00000000
+#define HRCWH_LITTLE_ENDIAN            0x00000008
 
-#define HRCWH_LDP_SET                0x00000000
-#define HRCWH_LDP_CLEAR              0x00000002
+#define HRCWH_LALE_NORMAL              0x00000000
+#define HRCWH_LALE_EARLY               0x00000004
+
+#define HRCWH_LDP_SET                  0x00000000
+#define HRCWH_LDP_CLEAR                        0x00000002
+
+/* 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)
+
+/* 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
+
+#elif defined(CONFIG_MPC831X)
+/* TSEC1 bits are for TSEC2 as well */
+#define SCCR_TSEC1CM                   0xc0000000
+#define SCCR_TSEC1CM_SHIFT             30
+#define SCCR_TSEC1CM_1                 0x40000000
+#define SCCR_TSEC1CM_2                 0x80000000
+#define SCCR_TSEC1CM_3                 0xC0000000
+
+#define SCCR_TSEC1ON                   0x20000000
+#define SCCR_TSEC2ON                   0x10000000
 
-/*
- * 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
 
-/*
- * 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
+#define SCCR_USBMPHCM                  0x00c00000
+#define SCCR_USBMPHCM_SHIFT            22
+#define SCCR_USBDRCM                   0x00300000
+#define SCCR_USBDRCM_SHIFT             20
 
-/*
- * 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
+#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_0 - DDR SDRAM Timing Configuration 0
+ */
+#define TIMING_CFG0_RWT                        0xC0000000
+#define TIMING_CFG0_RWT_SHIFT          30
+#define TIMING_CFG0_WRT                        0x30000000
+#define TIMING_CFG0_WRT_SHIFT          28
+#define TIMING_CFG0_RRT                        0x0C000000
+#define TIMING_CFG0_RRT_SHIFT          26
+#define TIMING_CFG0_WWT                        0x03000000
+#define TIMING_CFG0_WWT_SHIFT          24
+#define TIMING_CFG0_ACT_PD_EXIT                0x00700000
+#define TIMING_CFG0_ACT_PD_EXIT_SHIFT  20
+#define TIMING_CFG0_PRE_PD_EXIT                0x00070000
+#define TIMING_CFG0_PRE_PD_EXIT_SHIFT  16
+#define TIMING_CFG0_ODT_PD_EXIT                0x00000F00
+#define TIMING_CFG0_ODT_PD_EXIT_SHIFT  8
+#define TIMING_CFG0_MRS_CYC            0x00000F00
+#define TIMING_CFG0_MRS_CYC_SHIFT      0
+
+/* TIMING_CFG_1 - DDR SDRAM Timing Configuration 1
+ */
+#define TIMING_CFG1_PRETOACT           0x70000000
+#define TIMING_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) */
+
+#define TIMING_CFG2_ADD_LAT            0x70000000
+#define TIMING_CFG2_ADD_LAT_SHIFT      28
+#define TIMING_CFG2_WR_LAT_DELAY       0x00380000
+#define TIMING_CFG2_WR_LAT_DELAY_SHIFT 19
+#define TIMING_CFG2_RD_TO_PRE          0x0000E000
+#define TIMING_CFG2_RD_TO_PRE_SHIFT    13
+#define TIMING_CFG2_CKE_PLS            0x000001C0
+#define TIMING_CFG2_CKE_PLS_SHIFT      6
+#define TIMING_CFG2_FOUR_ACT           0x0000003F
+#define TIMING_CFG2_FOUR_ACT_SHIFT     0
+
+/* DDR_SDRAM_CFG - DDR SDRAM Control Configuration
+ */
+#define SDRAM_CFG_MEM_EN               0x80000000
+#define SDRAM_CFG_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_DDR       0x02000000
+#define SDRAM_CFG_SDRAM_TYPE_SHIFT     24
+#define SDRAM_CFG_DYN_PWR              0x00200000
+#define SDRAM_CFG_32_BE                        0x00080000
+#define SDRAM_CFG_8_BE                 0x00040000
+#define SDRAM_CFG_NCAP                 0x00020000
+#define SDRAM_CFG_2T_EN                        0x00008000
+#define SDRAM_CFG_BI                   0x00000001
+
+/* 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_DECC_OFF                    0x00000000
+#define BR_DECC_CHK                    0x00000200
+#define BR_DECC_CHK_GEN                        0x00000400
+#define BR_WP                          0x00000100
+#define BR_WP_SHIFT                    8
+#define BR_MSEL                                0x000000E0
+#define BR_MSEL_SHIFT                  5
+#define BR_MS_GPCM                     0x00000000      /* GPCM */
+#define BR_MS_FCM                      0x00000020      /* FCM */
+#define BR_MS_SDRAM                    0x00000060      /* SDRAM */
+#define BR_MS_UPMA                     0x00000080      /* UPMA */
+#define BR_MS_UPMB                     0x000000A0      /* UPMB */
+#define 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_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
+
+/* 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_FCM_AM                      0xFFFF8000
+#define OR_FCM_AM_SHIFT                                15
+#define OR_FCM_BCTLD                   0x00001000
+#define OR_FCM_BCTLD_SHIFT                     12
+#define OR_FCM_PGS                     0x00000400
+#define OR_FCM_PGS_SHIFT                       10
+#define OR_FCM_CSCT                    0x00000200
+#define OR_FCM_CSCT_SHIFT                       9
+#define OR_FCM_CST                     0x00000100
+#define OR_FCM_CST_SHIFT                        8
+#define OR_FCM_CHT                     0x00000080
+#define OR_FCM_CHT_SHIFT                        7
+#define OR_FCM_SCY                     0x00000070
+#define OR_FCM_SCY_SHIFT                        4
+#define OR_FCM_SCY_1                   0x00000010
+#define OR_FCM_SCY_2                   0x00000020
+#define OR_FCM_SCY_3                   0x00000030
+#define OR_FCM_SCY_4                   0x00000040
+#define OR_FCM_SCY_5                   0x00000050
+#define OR_FCM_SCY_6                   0x00000060
+#define OR_FCM_SCY_7                   0x00000070
+#define OR_FCM_RST                     0x00000008
+#define OR_FCM_RST_SHIFT                        3
+#define OR_FCM_TRLX                    0x00000004
+#define OR_FCM_TRLX_SHIFT                       2
+#define OR_FCM_EHTR                    0x00000002
+#define OR_FCM_EHTR_SHIFT                       1
+
+#define OR_UPM_AM                      0xFFFF8000
+#define OR_UPM_AM_SHIFT                        15
+#define OR_UPM_XAM                     0x00006000
+#define 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 */
+
+/* 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
+
+/* POBAR - PCI Outbound Base Address Register
+ */
+#define POBAR_BA_MASK                  0x000fffff
+
+/* 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
+
+/* PIBAR - PCI Inbound Base/Extended Address Register
+ */
+#define PIBAR_MASK                     0xffffffff
+#define PIEBAR_EBA_MASK                        0x000fffff
+
+/* 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
+
+/* PMCCR1 - PCI Configuration Register 1
+ */
+#define PMCCR1_POWER_OFF               0x00000020
+
+/* FMR - Flash Mode Register
+ */
+#define FMR_CWTO               0x0000F000
+#define FMR_CWTO_SHIFT         12
+#define FMR_BOOT               0x00000800
+#define FMR_ECCM               0x00000100
+#define FMR_AL                 0x00000030
+#define FMR_AL_SHIFT           4
+#define FMR_OP                 0x00000003
+#define FMR_OP_SHIFT           0
+
+/* FIR - Flash Instruction Register
+ */
+#define FIR_OP0                        0xF0000000
+#define FIR_OP0_SHIFT          28
+#define FIR_OP1                        0x0F000000
+#define FIR_OP1_SHIFT          24
+#define FIR_OP2                        0x00F00000
+#define FIR_OP2_SHIFT          20
+#define FIR_OP3                        0x000F0000
+#define FIR_OP3_SHIFT          16
+#define FIR_OP4                        0x0000F000
+#define FIR_OP4_SHIFT          12
+#define FIR_OP5                        0x00000F00
+#define FIR_OP5_SHIFT          8
+#define FIR_OP6                        0x000000F0
+#define FIR_OP6_SHIFT          4
+#define FIR_OP7                        0x0000000F
+#define FIR_OP7_SHIFT          0
+#define FIR_OP_NOP             0x0 /* No operation and end of sequence */
+#define FIR_OP_CA              0x1 /* Issue current column address */
+#define FIR_OP_PA              0x2 /* Issue current block+page address */
+#define FIR_OP_UA              0x3 /* Issue user defined address */
+#define FIR_OP_CM0             0x4 /* Issue command from FCR[CMD0] */
+#define FIR_OP_CM1             0x5 /* Issue command from FCR[CMD1] */
+#define FIR_OP_CM2             0x6 /* Issue command from FCR[CMD2] */
+#define FIR_OP_CM3             0x7 /* Issue command from FCR[CMD3] */
+#define FIR_OP_WB              0x8 /* Write FBCR bytes from FCM buffer */
+#define FIR_OP_WS              0x9 /* Write 1 or 2 bytes from MDR[AS] */
+#define FIR_OP_RB              0xA /* Read FBCR bytes to FCM buffer */
+#define FIR_OP_RS              0xB /* Read 1 or 2 bytes to MDR[AS] */
+#define FIR_OP_CW0             0xC /* Wait then issue FCR[CMD0] */
+#define FIR_OP_CW1             0xD /* Wait then issue FCR[CMD1] */
+#define FIR_OP_RBW             0xE /* Wait then read FBCR bytes */
+#define FIR_OP_RSW             0xF /* Wait then read 1 or 2 bytes */
+
+/* FCR - Flash Command Register
+ */
+#define FCR_CMD0               0xFF000000
+#define FCR_CMD0_SHIFT         24
+#define FCR_CMD1               0x00FF0000
+#define FCR_CMD1_SHIFT         16
+#define FCR_CMD2               0x0000FF00
+#define FCR_CMD2_SHIFT         8
+#define FCR_CMD3               0x000000FF
+#define FCR_CMD3_SHIFT         0
+
+/* FBAR - Flash Block Address Register
+ */
+#define FBAR_BLK               0x00FFFFFF
+
+/* FPAR - Flash Page Address Register
+ */
+#define FPAR_SP_PI             0x00007C00
+#define FPAR_SP_PI_SHIFT       10
+#define FPAR_SP_MS             0x00000200
+#define FPAR_SP_CI             0x000001FF
+#define FPAR_SP_CI_SHIFT       0
+#define FPAR_LP_PI             0x0003F000
+#define FPAR_LP_PI_SHIFT       12
+#define FPAR_LP_MS             0x00000800
+#define FPAR_LP_CI             0x000007FF
+#define FPAR_LP_CI_SHIFT       0
+
+/* LTESR - Transfer Error Status Register
+ */
+#define LTESR_BM               0x80000000
+#define LTESR_FCT              0x40000000
+#define LTESR_PAR              0x20000000
+#define LTESR_WP               0x04000000
+#define LTESR_ATMW             0x00800000
+#define LTESR_ATMR             0x00400000
+#define LTESR_CS               0x00080000
+#define LTESR_CC               0x00000001
+
+/* DDR Control Driver Register
+ */
+#define DDRCDR_EN              0x40000000
+#define DDRCDR_PZ              0x3C000000
+#define DDRCDR_PZ_MAXZ         0x00000000
+#define DDRCDR_PZ_HIZ          0x20000000
+#define DDRCDR_PZ_NOMZ         0x30000000
+#define DDRCDR_PZ_LOZ          0x38000000
+#define DDRCDR_PZ_MINZ         0x3C000000
+#define DDRCDR_NZ              0x3C000000
+#define DDRCDR_NZ_MAXZ         0x00000000
+#define DDRCDR_NZ_HIZ          0x02000000
+#define DDRCDR_NZ_NOMZ         0x03000000
+#define DDRCDR_NZ_LOZ          0x03800000
+#define DDRCDR_NZ_MINZ         0x03C00000
+#define DDRCDR_ODT             0x00080000
+#define DDRCDR_DDR_CFG         0x00040000
+#define DDRCDR_M_ODR           0x00000002
+#define DDRCDR_Q_DRN           0x00000001
+
+#ifndef __ASSEMBLY__
+struct pci_region;
+void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot);
+#endif
 
 #endif /* __MPC83XX_H__ */
index bc8ba3f2da2872ae9debdc9c2c9306e7b5678586..673bfed16e9832054835420e7e7d3ff4f5f3be53 100644 (file)
@@ -9,6 +9,15 @@
 
 #define EXC_OFF_SYS_RESET      0x0100  /* System reset offset */
 
+
+/*
+ * platform register addresses
+ */
+
+#define GUTS_SVR       (CFG_CCSRBAR + 0xE00A4)
+#define MCM_ABCR       (CFG_CCSRBAR + 0x01000)
+#define MCM_DBCR       (CFG_CCSRBAR + 0x01008)
+
 /*
  * l2cr values.  Look in config_<BOARD>.h for the actual setup
  */
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..fffae4dd16afeb3ed106a4137e43d63904db1628 100644 (file)
 /*-----------------------------------------------------------------------------+
 |  Universal interrupt controller interrupts
 +-----------------------------------------------------------------------------*/
+#if defined(CONFIG_405EZ)
+#define UIC_DMA0       0x80000000      /* DMA chan. 0                  */
+#define UIC_DMA1       0x40000000      /* DMA chan. 1                  */
+#define UIC_DMA2       0x20000000      /* DMA chan. 2                  */
+#define UIC_DMA3       0x10000000      /* DMA chan. 3                  */
+#define UIC_1588       0x08000000      /* IEEE 1588 network synchronization */
+#define UIC_UART0      0x04000000      /* UART 0                       */
+#define UIC_UART1      0x02000000      /* UART 1                       */
+#define UIC_CAN0       0x01000000      /* CAN 0                        */
+#define UIC_CAN1       0x00800000      /* CAN 1                        */
+#define UIC_SPI                0x00400000      /* SPI                          */
+#define UIC_IIC                0x00200000      /* IIC                          */
+#define UIC_CHT0       0x00100000      /* Chameleon timer high pri interrupt */
+#define UIC_CHT1       0x00080000      /* Chameleon timer high pri interrupt */
+#define UIC_USBH1      0x00040000      /* USB Host 1                   */
+#define UIC_USBH2      0x00020000      /* USB Host 2                   */
+#define UIC_USBDEV     0x00010000      /* USB Device                   */
+#define UIC_ENET       0x00008000      /* Ethernet interrupt status    */
+#define UIC_ENET1      0x00008000      /* dummy define                 */
+#define UIC_EMAC_WAKE  0x00004000      /* EMAC wake up                 */
+
+#define UIC_MADMAL     0x00002000      /* Logical OR of following MadMAL int */
+#define UIC_MAL_SERR   0x00002000      /*   MAL SERR                   */
+#define UIC_MAL_TXDE   0x00002000      /*   MAL TXDE                   */
+#define UIC_MAL_RXDE   0x00002000      /*   MAL RXDE                   */
+
+#define UIC_MAL_TXEOB  0x00001000      /* MAL TXEOB                    */
+#define UIC_MAL_TXEOB1 0x00000800      /* MAL TXEOB1                   */
+#define UIC_MAL_RXEOB  0x00000400      /* MAL RXEOB                    */
+#define UIC_NAND       0x00000200      /* NAND Flash controller        */
+#define UIC_ADC                0x00000100      /* ADC                          */
+#define UIC_DAC                0x00000080      /* DAC                          */
+#define UIC_OPB2PLB    0x00000040      /* OPB to PLB bridge interrupt  */
+#define UIC_RESERVED0  0x00000020      /* Reserved                     */
+#define UIC_EXT0       0x00000010      /* External  interrupt 0        */
+#define UIC_EXT1       0x00000008      /* External  interrupt 1        */
+#define UIC_EXT2       0x00000004      /* External  interrupt 2        */
+#define UIC_EXT3       0x00000002      /* External  interrupt 3        */
+#define UIC_EXT4       0x00000001      /* External  interrupt 4        */
+
+#else  /* !defined(CONFIG_405EZ) */
+
 #define UIC_UART0     0x80000000      /* UART 0                             */
 #define UIC_UART1     0x40000000      /* UART 1                             */
 #define UIC_IIC       0x20000000      /* IIC                                */
 #define UIC_EXT4      0x00000004      /* External  interrupt 4              */
 #define UIC_EXT5      0x00000002      /* External  interrupt 5              */
 #define UIC_EXT6      0x00000001      /* External  interrupt 6              */
+#endif /* defined(CONFIG_405EZ) */
 
 /******************************************************************************
  * SDRAM Controller
   #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
 /******************************************************************************
  */
 #define VCO_MIN     500
 #define VCO_MAX     1000
+#elif defined(CONFIG_405EZ)
+/******************************************************************************
+ * SDR Registers
+ ******************************************************************************/
+#define SDR_DCR_BASE 0x0E
+#define sdrcfga (SDR_DCR_BASE+0x0)     /* ADDR */
+#define sdrcfgd (SDR_DCR_BASE+0x1)     /* Data */
+
+#define mtsdr(reg, data)       do { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); } while (0)
+#define mfsdr(reg, data)       do { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); } while (0)
+
+#define sdrnand0       0x4000
+#define sdrultra0      0x4040
+#define sdrultra1      0x4050
+#define sdricintstat   0x4510
+
+#define SDR_NAND0_NDEN         0x80000000
+
+#define SDR_ULTRA0_NDGPIOBP    0x80000000
+#define SDR_ULTRA0_CSN_MASK    0x78000000
+#define SDR_ULTRA0_CSNSEL0     0x40000000
+#define SDR_ULTRA0_CSNSEL1     0x20000000
+#define SDR_ULTRA0_CSNSEL2     0x10000000
+#define SDR_ULTRA0_CSNSEL3     0x08000000
+
+#define SDR_ULTRA1_LEDNENABLE  0x40000000
+
+#define SDR_ICRX_STAT  0x80000000
+#define SDR_ICTX0_STAT 0x40000000
+#define SDR_ICTX1_STAT 0x20000000
+
+#define SDR_PINSTP     0x40
+
+/******************************************************************************
+ * Control
+ ******************************************************************************/
+#define CNTRL_DCR_BASE 0x0C
+#define cprcfga (CNTRL_DCR_BASE+0x0)   /* CPR addr reg     */
+#define cprcfgd (CNTRL_DCR_BASE+0x1)   /* CPR data reg     */
+
+/* CPR Registers */
+#define cprclkupd       0x020          /* CPR_CLKUPD */
+#define cprpllc         0x040          /* CPR_PLLC */
+#define cprplld         0x060          /* CPR_PLLD */
+#define cprprimad       0x080          /* CPR_PRIMAD */
+#define cprperd0        0x0e0          /* CPR_PERD0 */
+#define cprperd1        0x0e1          /* CPR_PERD1 */
+#define cprperc0        0x180          /* CPR_PERC0 */
+#define cprmisc0        0x181          /* CPR_MISC0 */
+#define cprmisc1        0x182          /* CPR_MISC1 */
+
+/*
+ * Macro for accessing the indirect CPR register
+ */
+#define mtcpr(reg, data)       do { mtdcr(cprcfga,reg);mtdcr(cprcfgd,data); } while (0)
+#define mfcpr(reg, data)       do { mtdcr(cprcfga,reg);data = mfdcr(cprcfgd); } while (0)
+
+#define CPR_CLKUPD_ENPLLCH_EN  0x40000000     /* Enable CPR PLL Changes */
+#define CPR_CLKUPD_ENDVCH_EN   0x20000000     /* Enable CPR Sys. Div. Changes */
+#define CPR_PERD0_SPIDV_MASK   0x000F0000     /* SPI Clock Divider */
+
+#define PLLD_FBDV_MASK         0x1F000000     /* PLL feedback divider value */
+#define PLLD_FWDVA_MASK        0x000F0000     /* PLL forward divider A value */
+#define PLLD_FWDVB_MASK        0x00000700     /* PLL forward divider B value */
+
+#define PRIMAD_CPUDV_MASK      0x0F000000     /* CPU Clock Divisor Mask */
+#define PRIMAD_PLBDV_MASK      0x000F0000     /* PLB Clock Divisor Mask */
+#define PRIMAD_OPBDV_MASK      0x00000F00     /* OPB Clock Divisor Mask */
+#define PRIMAD_EBCDV_MASK      0x0000000F     /* EBC Clock Divisor Mask */
+
+#define PERD0_PWMDV_MASK       0xFF000000     /* PWM Divider Mask */
+#define PERD0_SPIDV_MASK       0x000F0000     /* SPI Divider Mask */
+#define PERD0_U0DV_MASK        0x0000FF00     /* UART 0 Divider Mask */
+#define PERD0_U1DV_MASK        0x000000FF     /* UART 1 Divider Mask */
+
+#if 0 /* Deprecated */
+#define CNTRL_DCR_BASE 0x0f0
+#define cpc0_pllmr0   (CNTRL_DCR_BASE+0x0)  /* PLL mode  register 0                */
+#define cpc0_boot     (CNTRL_DCR_BASE+0x1)  /* Clock status register               */
+#define cpc0_epctl    (CNTRL_DCR_BASE+0x3)  /* EMAC to PHY control register        */
+#define cpc0_pllmr1   (CNTRL_DCR_BASE+0x4)  /* PLL mode  register 1                */
+#define cpc0_ucr      (CNTRL_DCR_BASE+0x5)  /* UART control register               */
+#define cpc0_pci      (CNTRL_DCR_BASE+0x9)  /* PCI control register                */
+
+#define CPC0_PLLMR0  (CNTRL_DCR_BASE+0x0)  /* PLL mode 0 register          */
+#define CPC0_BOOT    (CNTRL_DCR_BASE+0x1)  /* Chip Clock Status register   */
+#define CPC0_CR1     (CNTRL_DCR_BASE+0x2)  /* Chip Control 1 register      */
+#define CPC0_EPRCSR  (CNTRL_DCR_BASE+0x3)  /* EMAC PHY Rcv Clk Src register*/
+#define CPC0_PLLMR1  (CNTRL_DCR_BASE+0x4)  /* PLL mode 1 register          */
+#define CPC0_UCR     (CNTRL_DCR_BASE+0x5)  /* UART Control register        */
+#define CPC0_SRR     (CNTRL_DCR_BASE+0x6)  /* Soft Reset register          */
+#define CPC0_JTAGID  (CNTRL_DCR_BASE+0x7)  /* JTAG ID register             */
+#define CPC0_SPARE   (CNTRL_DCR_BASE+0x8)  /* Spare DCR                    */
+#define CPC0_PCI     (CNTRL_DCR_BASE+0x9)  /* PCI Control register         */
+
+/* Bit definitions */
+#define PLLMR0_CPU_DIV_MASK      0x00300000     /* CPU clock divider */
+#define PLLMR0_CPU_DIV_BYPASS    0x00000000
+#define PLLMR0_CPU_DIV_2         0x00100000
+#define PLLMR0_CPU_DIV_3         0x00200000
+#define PLLMR0_CPU_DIV_4         0x00300000
+
+#define PLLMR0_CPU_TO_PLB_MASK   0x00030000     /* CPU:PLB Frequency Divisor */
+#define PLLMR0_CPU_PLB_DIV_1     0x00000000
+#define PLLMR0_CPU_PLB_DIV_2     0x00010000
+#define PLLMR0_CPU_PLB_DIV_3     0x00020000
+#define PLLMR0_CPU_PLB_DIV_4     0x00030000
+
+#define PLLMR0_OPB_TO_PLB_MASK   0x00003000     /* OPB:PLB Frequency Divisor */
+#define PLLMR0_OPB_PLB_DIV_1     0x00000000
+#define PLLMR0_OPB_PLB_DIV_2     0x00001000
+#define PLLMR0_OPB_PLB_DIV_3     0x00002000
+#define PLLMR0_OPB_PLB_DIV_4     0x00003000
+
+#define PLLMR0_EXB_TO_PLB_MASK   0x00000300     /* External Bus:PLB Divisor  */
+#define PLLMR0_EXB_PLB_DIV_2     0x00000000
+#define PLLMR0_EXB_PLB_DIV_3     0x00000100
+#define PLLMR0_EXB_PLB_DIV_4     0x00000200
+#define PLLMR0_EXB_PLB_DIV_5     0x00000300
+
+#define PLLMR0_MAL_TO_PLB_MASK   0x00000030     /* MAL:PLB Divisor  */
+#define PLLMR0_MAL_PLB_DIV_1     0x00000000
+#define PLLMR0_MAL_PLB_DIV_2     0x00000010
+#define PLLMR0_MAL_PLB_DIV_3     0x00000020
+#define PLLMR0_MAL_PLB_DIV_4     0x00000030
+
+#define PLLMR0_PCI_TO_PLB_MASK   0x00000003     /* PCI:PLB Frequency Divisor */
+#define PLLMR0_PCI_PLB_DIV_1     0x00000000
+#define PLLMR0_PCI_PLB_DIV_2     0x00000001
+#define PLLMR0_PCI_PLB_DIV_3     0x00000002
+#define PLLMR0_PCI_PLB_DIV_4     0x00000003
+
+#define PLLMR1_SSCS_MASK         0x80000000     /* Select system clock source */
+#define PLLMR1_PLLR_MASK         0x40000000     /* PLL reset */
+#define PLLMR1_FBMUL_MASK        0x00F00000     /* PLL feedback multiplier value */
+#define PLLMR1_FBMUL_DIV_16      0x00000000
+#define PLLMR1_FBMUL_DIV_1       0x00100000
+#define PLLMR1_FBMUL_DIV_2       0x00200000
+#define PLLMR1_FBMUL_DIV_3       0x00300000
+#define PLLMR1_FBMUL_DIV_4       0x00400000
+#define PLLMR1_FBMUL_DIV_5       0x00500000
+#define PLLMR1_FBMUL_DIV_6       0x00600000
+#define PLLMR1_FBMUL_DIV_7       0x00700000
+#define PLLMR1_FBMUL_DIV_8       0x00800000
+#define PLLMR1_FBMUL_DIV_9       0x00900000
+#define PLLMR1_FBMUL_DIV_10      0x00A00000
+#define PLLMR1_FBMUL_DIV_11      0x00B00000
+#define PLLMR1_FBMUL_DIV_12      0x00C00000
+#define PLLMR1_FBMUL_DIV_13      0x00D00000
+#define PLLMR1_FBMUL_DIV_14      0x00E00000
+#define PLLMR1_FBMUL_DIV_15      0x00F00000
+
+#define PLLMR1_FWDVA_MASK        0x00070000     /* PLL forward divider A value */
+#define PLLMR1_FWDVA_DIV_8       0x00000000
+#define PLLMR1_FWDVA_DIV_7       0x00010000
+#define PLLMR1_FWDVA_DIV_6       0x00020000
+#define PLLMR1_FWDVA_DIV_5       0x00030000
+#define PLLMR1_FWDVA_DIV_4       0x00040000
+#define PLLMR1_FWDVA_DIV_3       0x00050000
+#define PLLMR1_FWDVA_DIV_2       0x00060000
+#define PLLMR1_FWDVA_DIV_1       0x00070000
+#define PLLMR1_FWDVB_MASK        0x00007000     /* PLL forward divider B value */
+#define PLLMR1_TUNING_MASK       0x000003FF     /* PLL tune bits */
+
+/* Defines for CPC0_EPRCSR register */
+#define CPC0_EPRCSR_E0NFE          0x80000000
+#define CPC0_EPRCSR_E1NFE          0x40000000
+#define CPC0_EPRCSR_E1RPP          0x00000080
+#define CPC0_EPRCSR_E0RPP          0x00000040
+#define CPC0_EPRCSR_E1ERP          0x00000020
+#define CPC0_EPRCSR_E0ERP          0x00000010
+#define CPC0_EPRCSR_E1PCI          0x00000002
+#define CPC0_EPRCSR_E0PCI          0x00000001
+
+/* Defines for CPC0_BOOR Register */
+#define CPC0_BOOT_SEP                      0x00000002 /* serial EEPROM present  */
+
+/* Defines for CPC0_PLLMR1 Register fields */
+#define PLL_ACTIVE                 0x80000000
+#define CPC0_PLLMR1_SSCS           0x80000000
+#define PLL_RESET                  0x40000000
+#define CPC0_PLLMR1_PLLR           0x40000000
+    /* Feedback multiplier */
+#define PLL_FBKDIV                 0x00F00000
+#define CPC0_PLLMR1_FBDV           0x00F00000
+#define PLL_FBKDIV_16              0x00000000
+#define PLL_FBKDIV_1               0x00100000
+#define PLL_FBKDIV_2               0x00200000
+#define PLL_FBKDIV_3               0x00300000
+#define PLL_FBKDIV_4               0x00400000
+#define PLL_FBKDIV_5               0x00500000
+#define PLL_FBKDIV_6               0x00600000
+#define PLL_FBKDIV_7               0x00700000
+#define PLL_FBKDIV_8               0x00800000
+#define PLL_FBKDIV_9               0x00900000
+#define PLL_FBKDIV_10              0x00A00000
+#define PLL_FBKDIV_11              0x00B00000
+#define PLL_FBKDIV_12              0x00C00000
+#define PLL_FBKDIV_13              0x00D00000
+#define PLL_FBKDIV_14              0x00E00000
+#define PLL_FBKDIV_15              0x00F00000
+    /* Forward A divisor */
+#define PLL_FWDDIVA                0x00070000
+#define CPC0_PLLMR1_FWDVA          0x00070000
+#define PLL_FWDDIVA_8              0x00000000
+#define PLL_FWDDIVA_7              0x00010000
+#define PLL_FWDDIVA_6              0x00020000
+#define PLL_FWDDIVA_5              0x00030000
+#define PLL_FWDDIVA_4              0x00040000
+#define PLL_FWDDIVA_3              0x00050000
+#define PLL_FWDDIVA_2              0x00060000
+#define PLL_FWDDIVA_1              0x00070000
+    /* Forward B divisor */
+#define PLL_FWDDIVB                0x00007000
+#define CPC0_PLLMR1_FWDVB          0x00007000
+#define PLL_FWDDIVB_8              0x00000000
+#define PLL_FWDDIVB_7              0x00001000
+#define PLL_FWDDIVB_6              0x00002000
+#define PLL_FWDDIVB_5              0x00003000
+#define PLL_FWDDIVB_4              0x00004000
+#define PLL_FWDDIVB_3              0x00005000
+#define PLL_FWDDIVB_2              0x00006000
+#define PLL_FWDDIVB_1              0x00007000
+    /* PLL tune bits */
+#define PLL_TUNE_MASK            0x000003FF
+#define PLL_TUNE_2_M_3           0x00000133     /*  2 <= M <= 3               */
+#define PLL_TUNE_4_M_6           0x00000134     /*  3 <  M <= 6               */
+#define PLL_TUNE_7_M_10          0x00000138     /*  6 <  M <= 10              */
+#define PLL_TUNE_11_M_14         0x0000013C     /* 10 <  M <= 14              */
+#define PLL_TUNE_15_M_40         0x0000023E     /* 14 <  M <= 40              */
+#define PLL_TUNE_VCO_LOW         0x00000000     /* 500MHz <= VCO <=  800MHz   */
+#define PLL_TUNE_VCO_HI          0x00000080     /* 800MHz <  VCO <= 1000MHz   */
+
+/* Defines for CPC0_PLLMR0 Register fields */
+    /* CPU divisor */
+#define PLL_CPUDIV                 0x00300000
+#define CPC0_PLLMR0_CCDV           0x00300000
+#define PLL_CPUDIV_1               0x00000000
+#define PLL_CPUDIV_2               0x00100000
+#define PLL_CPUDIV_3               0x00200000
+#define PLL_CPUDIV_4               0x00300000
+    /* PLB divisor */
+#define PLL_PLBDIV                 0x00030000
+#define CPC0_PLLMR0_CBDV           0x00030000
+#define PLL_PLBDIV_1               0x00000000
+#define PLL_PLBDIV_2               0x00010000
+#define PLL_PLBDIV_3               0x00020000
+#define PLL_PLBDIV_4               0x00030000
+    /* OPB divisor */
+#define PLL_OPBDIV                 0x00003000
+#define CPC0_PLLMR0_OPDV           0x00003000
+#define PLL_OPBDIV_1               0x00000000
+#define PLL_OPBDIV_2               0x00001000
+#define PLL_OPBDIV_3               0x00002000
+#define PLL_OPBDIV_4               0x00003000
+    /* EBC divisor */
+#define PLL_EXTBUSDIV              0x00000300
+#define CPC0_PLLMR0_EPDV           0x00000300
+#define PLL_EXTBUSDIV_2            0x00000000
+#define PLL_EXTBUSDIV_3            0x00000100
+#define PLL_EXTBUSDIV_4            0x00000200
+#define PLL_EXTBUSDIV_5            0x00000300
+    /* MAL divisor */
+#define PLL_MALDIV                 0x00000030
+#define CPC0_PLLMR0_MPDV           0x00000030
+#define PLL_MALDIV_1               0x00000000
+#define PLL_MALDIV_2               0x00000010
+#define PLL_MALDIV_3               0x00000020
+#define PLL_MALDIV_4               0x00000030
+    /* PCI divisor */
+#define PLL_PCIDIV                 0x00000003
+#define CPC0_PLLMR0_PPFD           0x00000003
+#define PLL_PCIDIV_1               0x00000000
+#define PLL_PCIDIV_2               0x00000001
+#define PLL_PCIDIV_3               0x00000002
+#define PLL_PCIDIV_4               0x00000003
+
+/*
+ *-------------------------------------------------------------------------------
+ * PLL settings for 266MHz CPU, 133MHz PLB/SDRAM, 66MHz EBC, 33MHz PCI,
+ * assuming a 33.3MHz input clock to the 405EP.
+ *-------------------------------------------------------------------------------
+ */
+#define PLLMR0_266_133_66  (PLL_CPUDIV_1 | PLL_PLBDIV_2 |  \
+                           PLL_OPBDIV_2 | PLL_EXTBUSDIV_2 |  \
+                           PLL_MALDIV_1 | PLL_PCIDIV_4)
+#define PLLMR1_266_133_66  (PLL_FBKDIV_8  |  \
+                           PLL_FWDDIVA_3 | PLL_FWDDIVB_3 |  \
+                           PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
+#define PLLMR0_133_66_66_33  (PLL_CPUDIV_1 | PLL_PLBDIV_1 |  \
+                             PLL_OPBDIV_2 | PLL_EXTBUSDIV_4 |  \
+                             PLL_MALDIV_1 | PLL_PCIDIV_4)
+#define PLLMR1_133_66_66_33  (PLL_FBKDIV_4  |  \
+                             PLL_FWDDIVA_6 | PLL_FWDDIVB_6 |  \
+                             PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
+#define PLLMR0_200_100_50_33 (PLL_CPUDIV_1 | PLL_PLBDIV_2 |  \
+                             PLL_OPBDIV_2 | PLL_EXTBUSDIV_3 |  \
+                             PLL_MALDIV_1 | PLL_PCIDIV_4)
+#define PLLMR1_200_100_50_33 (PLL_FBKDIV_6  |  \
+                             PLL_FWDDIVA_4 | PLL_FWDDIVB_4 |  \
+                             PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
+#define PLLMR0_266_133_66_33 (PLL_CPUDIV_1 | PLL_PLBDIV_2 |  \
+                             PLL_OPBDIV_2 | PLL_EXTBUSDIV_4 |  \
+                             PLL_MALDIV_1 | PLL_PCIDIV_4)
+#define PLLMR1_266_133_66_33 (PLL_FBKDIV_8  |  \
+                             PLL_FWDDIVA_3 | PLL_FWDDIVB_3 |  \
+                             PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
+#define PLLMR0_266_66_33_33 (PLL_CPUDIV_1 | PLL_PLBDIV_4 |  \
+                             PLL_OPBDIV_2 | PLL_EXTBUSDIV_2 |  \
+                             PLL_MALDIV_1 | PLL_PCIDIV_2)
+#define PLLMR1_266_66_33_33 (PLL_FBKDIV_8  |  \
+                             PLL_FWDDIVA_3 | PLL_FWDDIVB_3 |  \
+                             PLL_TUNE_15_M_40 | PLL_TUNE_VCO_LOW)
+
+/*
+ * PLL Voltage Controlled Oscillator (VCO) definitions
+ * Maximum and minimum values (in MHz) for correct PLL operation.
+ */
+#define VCO_MIN     500
+#define VCO_MAX     1000
+#endif /* #if 0 */
 #else /* #ifdef CONFIG_405EP */
 /******************************************************************************
  * Control
 /******************************************************************************
  * Memory Access Layer
  ******************************************************************************/
+#if defined(CONFIG_405EZ)
+#define        MAL_DCR_BASE    0x380
+#define        malmcr          (MAL_DCR_BASE+0x00)     /* MAL Config reg             */
+#define        malesr          (MAL_DCR_BASE+0x01)     /* Err Status reg (Read/Clear)*/
+#define        malier          (MAL_DCR_BASE+0x02)     /* Interrupt enable reg       */
+#define        maldbr          (MAL_DCR_BASE+0x03)     /* Mal Debug reg (Read only)  */
+#define        maltxcasr       (MAL_DCR_BASE+0x04)     /* TX Channel active reg (set)*/
+#define        maltxcarr       (MAL_DCR_BASE+0x05)     /* TX Channel active reg (Reset)     */
+#define        maltxeobisr     (MAL_DCR_BASE+0x06)     /* TX End of buffer int status reg   */
+#define        maltxdeir       (MAL_DCR_BASE+0x07)     /* TX Descr. Error Int reg    */
+/*                                   0x08-0x0F    Reserved                   */
+#define        malrxcasr       (MAL_DCR_BASE+0x10)     /* RX Channel active reg (set)*/
+#define        malrxcarr       (MAL_DCR_BASE+0x11)     /* RX Channel active reg (Reset)     */
+#define        malrxeobisr     (MAL_DCR_BASE+0x12)     /* RX End of buffer int status reg   */
+#define        malrxdeir       (MAL_DCR_BASE+0x13)     /* RX Descr. Error Int reg  */
+/*                                   0x14-0x1F    Reserved                 */
+#define        maltxctp0r      (MAL_DCR_BASE+0x20)  /* TX 0 Channel table ptr reg  */
+#define        maltxctp1r      (MAL_DCR_BASE+0x21)  /* TX 1 Channel table ptr reg  */
+#define        maltxctp2r      (MAL_DCR_BASE+0x22)  /* TX 2 Channel table ptr reg  */
+#define        maltxctp3r      (MAL_DCR_BASE+0x23)  /* TX 3 Channel table ptr reg  */
+#define        maltxctp4r      (MAL_DCR_BASE+0x24)  /* TX 4 Channel table ptr reg  */
+#define        maltxctp5r      (MAL_DCR_BASE+0x25)  /* TX 5 Channel table ptr reg  */
+#define        maltxctp6r      (MAL_DCR_BASE+0x26)  /* TX 6 Channel table ptr reg  */
+#define        maltxctp7r      (MAL_DCR_BASE+0x27)  /* TX 7 Channel table ptr reg  */
+#define        maltxctp8r      (MAL_DCR_BASE+0x28)  /* TX 8 Channel table ptr reg  */
+#define        maltxctp9r      (MAL_DCR_BASE+0x29)  /* TX 9 Channel table ptr reg  */
+#define        maltxctp10r     (MAL_DCR_BASE+0x2A)  /* TX 10 Channel table ptr reg */
+#define        maltxctp11r     (MAL_DCR_BASE+0x2B)  /* TX 11 Channel table ptr reg */
+#define        maltxctp12r     (MAL_DCR_BASE+0x2C)  /* TX 12 Channel table ptr reg */
+#define        maltxctp13r     (MAL_DCR_BASE+0x2D)  /* TX 13 Channel table ptr reg */
+#define        maltxctp14r     (MAL_DCR_BASE+0x2E)  /* TX 14 Channel table ptr reg */
+#define        maltxctp15r     (MAL_DCR_BASE+0x2F)  /* TX 15 Channel table ptr reg */
+#define        maltxctp16r     (MAL_DCR_BASE+0x30)  /* TX 16 Channel table ptr reg */
+#define        maltxctp17r     (MAL_DCR_BASE+0x31)  /* TX 17 Channel table ptr reg */
+#define        maltxctp18r     (MAL_DCR_BASE+0x32)  /* TX 18 Channel table ptr reg */
+#define        maltxctp19r     (MAL_DCR_BASE+0x33)  /* TX 19 Channel table ptr reg */
+#define        maltxctp20r     (MAL_DCR_BASE+0x34)  /* TX 20 Channel table ptr reg */
+#define        maltxctp21r     (MAL_DCR_BASE+0x35)  /* TX 21 Channel table ptr reg */
+#define        maltxctp22r     (MAL_DCR_BASE+0x36)  /* TX 22 Channel table ptr reg */
+#define        maltxctp23r     (MAL_DCR_BASE+0x37)  /* TX 23 Channel table ptr reg */
+#define        maltxctp24r     (MAL_DCR_BASE+0x38)  /* TX 24 Channel table ptr reg */
+#define        maltxctp25r     (MAL_DCR_BASE+0x39)  /* TX 25 Channel table ptr reg */
+#define        maltxctp26r     (MAL_DCR_BASE+0x3A)  /* TX 26 Channel table ptr reg */
+#define        maltxctp27r     (MAL_DCR_BASE+0x3B)  /* TX 27 Channel table ptr reg */
+#define        maltxctp28r     (MAL_DCR_BASE+0x3C)  /* TX 28 Channel table ptr reg */
+#define        maltxctp29r     (MAL_DCR_BASE+0x3D)  /* TX 29 Channel table ptr reg */
+#define        maltxctp30r     (MAL_DCR_BASE+0x3E)  /* TX 30 Channel table ptr reg */
+#define        maltxctp31r     (MAL_DCR_BASE+0x3F)  /* TX 31 Channel table ptr reg */
+#define        malrxctp0r      (MAL_DCR_BASE+0x40)  /* RX 0 Channel table ptr reg  */
+#define        malrxctp1r      (MAL_DCR_BASE+0x41)  /* RX 1 Channel table ptr reg  */
+#define        malrxctp2r      (MAL_DCR_BASE+0x42)  /* RX 2 Channel table ptr reg  */
+#define        malrxctp3r      (MAL_DCR_BASE+0x43)  /* RX 3 Channel table ptr reg  */
+#define        malrxctp4r      (MAL_DCR_BASE+0x44)  /* RX 4 Channel table ptr reg  */
+#define        malrxctp5r      (MAL_DCR_BASE+0x45)  /* RX 5 Channel table ptr reg  */
+#define        malrxctp6r      (MAL_DCR_BASE+0x46)  /* RX 6 Channel table ptr reg  */
+#define        malrxctp7r      (MAL_DCR_BASE+0x47)  /* RX 7 Channel table ptr reg  */
+#define        malrxctp8r      (MAL_DCR_BASE+0x48)  /* RX 8 Channel table ptr reg  */
+#define        malrxctp9r      (MAL_DCR_BASE+0x49)  /* RX 9 Channel table ptr reg  */
+#define        malrxctp10r     (MAL_DCR_BASE+0x4A)  /* RX 10 Channel table ptr reg */
+#define        malrxctp11r     (MAL_DCR_BASE+0x4B)  /* RX 11 Channel table ptr reg */
+#define        malrxctp12r     (MAL_DCR_BASE+0x4C)  /* RX 12 Channel table ptr reg */
+#define        malrxctp13r     (MAL_DCR_BASE+0x4D)  /* RX 13 Channel table ptr reg */
+#define        malrxctp14r     (MAL_DCR_BASE+0x4E)  /* RX 14 Channel table ptr reg */
+#define        malrxctp15r     (MAL_DCR_BASE+0x4F)  /* RX 15 Channel table ptr reg */
+#define        malrxctp16r     (MAL_DCR_BASE+0x50)  /* RX 16 Channel table ptr reg */
+#define        malrxctp17r     (MAL_DCR_BASE+0x51)  /* RX 17 Channel table ptr reg */
+#define        malrxctp18r     (MAL_DCR_BASE+0x52)  /* RX 18 Channel table ptr reg */
+#define        malrxctp19r     (MAL_DCR_BASE+0x53)  /* RX 19 Channel table ptr reg */
+#define        malrxctp20r     (MAL_DCR_BASE+0x54)  /* RX 20 Channel table ptr reg */
+#define        malrxctp21r     (MAL_DCR_BASE+0x55)  /* RX 21 Channel table ptr reg */
+#define        malrxctp22r     (MAL_DCR_BASE+0x56)  /* RX 22 Channel table ptr reg */
+#define        malrxctp23r     (MAL_DCR_BASE+0x57)  /* RX 23 Channel table ptr reg */
+#define        malrxctp24r     (MAL_DCR_BASE+0x58)  /* RX 24 Channel table ptr reg */
+#define        malrxctp25r     (MAL_DCR_BASE+0x59)  /* RX 25 Channel table ptr reg */
+#define        malrxctp26r     (MAL_DCR_BASE+0x5A)  /* RX 26 Channel table ptr reg */
+#define        malrxctp27r     (MAL_DCR_BASE+0x5B)  /* RX 27 Channel table ptr reg */
+#define        malrxctp28r     (MAL_DCR_BASE+0x5C)  /* RX 28 Channel table ptr reg */
+#define        malrxctp29r     (MAL_DCR_BASE+0x5D)  /* RX 29 Channel table ptr reg */
+#define        malrxctp30r     (MAL_DCR_BASE+0x5E)  /* RX 30 Channel table ptr reg */
+#define        malrxctp31r     (MAL_DCR_BASE+0x5F)  /* RX 31 Channel table ptr reg */
+#define        malrcbs0        (MAL_DCR_BASE+0x60)  /* RX 0 Channel buffer size reg */
+#define        malrcbs1        (MAL_DCR_BASE+0x61)  /* RX 1 Channel buffer size reg */
+#define        malrcbs2        (MAL_DCR_BASE+0x62)  /* RX 2 Channel buffer size reg */
+#define        malrcbs3        (MAL_DCR_BASE+0x63)  /* RX 3 Channel buffer size reg */
+#define        malrcbs4        (MAL_DCR_BASE+0x64)  /* RX 4 Channel buffer size reg */
+#define        malrcbs5        (MAL_DCR_BASE+0x65)  /* RX 5 Channel buffer size reg */
+#define        malrcbs6        (MAL_DCR_BASE+0x66)  /* RX 6 Channel buffer size reg */
+#define        malrcbs7        (MAL_DCR_BASE+0x67)  /* RX 7 Channel buffer size reg */
+#define        malrcbs8        (MAL_DCR_BASE+0x68)  /* RX 8 Channel buffer size reg */
+#define        malrcbs9        (MAL_DCR_BASE+0x69)  /* RX 9 Channel buffer size reg */
+#define        malrcbs10       (MAL_DCR_BASE+0x6A)  /* RX 10 Channel buffer size reg */
+#define        malrcbs11       (MAL_DCR_BASE+0x6B)  /* RX 11 Channel buffer size reg */
+#define        malrcbs12       (MAL_DCR_BASE+0x6C)  /* RX 12 Channel buffer size reg */
+#define        malrcbs13       (MAL_DCR_BASE+0x6D)  /* RX 13 Channel buffer size reg */
+#define        malrcbs14       (MAL_DCR_BASE+0x6E)  /* RX 14 Channel buffer size reg */
+#define        malrcbs15       (MAL_DCR_BASE+0x6F)  /* RX 15 Channel buffer size reg */
+#define        malrcbs16       (MAL_DCR_BASE+0x70)  /* RX 16 Channel buffer size reg */
+#define        malrcbs17       (MAL_DCR_BASE+0x71)  /* RX 17 Channel buffer size reg */
+#define        malrcbs18       (MAL_DCR_BASE+0x72)  /* RX 18 Channel buffer size reg */
+#define        malrcbs19       (MAL_DCR_BASE+0x73)  /* RX 19 Channel buffer size reg */
+#define        malrcbs20       (MAL_DCR_BASE+0x74)  /* RX 20 Channel buffer size reg */
+#define        malrcbs21       (MAL_DCR_BASE+0x75)  /* RX 21 Channel buffer size reg */
+#define        malrcbs22       (MAL_DCR_BASE+0x76)  /* RX 22 Channel buffer size reg */
+#define        malrcbs23       (MAL_DCR_BASE+0x77)  /* RX 23 Channel buffer size reg */
+#define        malrcbs24       (MAL_DCR_BASE+0x78)  /* RX 24 Channel buffer size reg */
+#define        malrcbs25       (MAL_DCR_BASE+0x79)  /* RX 25 Channel buffer size reg */
+#define        malrcbs26       (MAL_DCR_BASE+0x7A)  /* RX 26 Channel buffer size reg */
+#define        malrcbs27       (MAL_DCR_BASE+0x7B)  /* RX 27 Channel buffer size reg */
+#define        malrcbs28       (MAL_DCR_BASE+0x7C)  /* RX 28 Channel buffer size reg */
+#define        malrcbs29       (MAL_DCR_BASE+0x7D)  /* RX 29 Channel buffer size reg */
+#define        malrcbs30       (MAL_DCR_BASE+0x7E)  /* RX 30 Channel buffer size reg */
+#define        malrcbs31       (MAL_DCR_BASE+0x7F)  /* RX 31 Channel buffer size reg */
+
+#else /* !defined(CONFIG_405EZ) */
+
 #define MAL_DCR_BASE 0x180
 #define malmcr  (MAL_DCR_BASE+0x00)  /* MAL Config reg                       */
 #define malesr  (MAL_DCR_BASE+0x01)  /* Error Status reg (Read/Clear)        */
 #define malrxctp1r (MAL_DCR_BASE+0x41)  /* RX 1 Channel table pointer reg    */
 #define malrcbs0   (MAL_DCR_BASE+0x60)  /* RX 0 Channel buffer size reg      */
 #define malrcbs1   (MAL_DCR_BASE+0x61)  /* RX 1 Channel buffer size reg      */
+#endif /* defined(CONFIG_405EZ) */
 
 /*-----------------------------------------------------------------------------
 | IIC Register Offsets
 /******************************************************************************
  * On Chip Memory
  ******************************************************************************/
+#if defined(CONFIG_405EZ)
+#define OCM_DCR_BASE 0x020
+#define ocmplb3cr1      (OCM_DCR_BASE+0x00)  /* OCM PLB3 Bank 1 Config Reg    */
+#define ocmplb3cr2      (OCM_DCR_BASE+0x01)  /* OCM PLB3 Bank 2 Config Reg    */
+#define ocmplb3bear     (OCM_DCR_BASE+0x02)  /* OCM PLB3 Bus Error Add Reg    */
+#define ocmplb3besr0    (OCM_DCR_BASE+0x03)  /* OCM PLB3 Bus Error Stat Reg 0 */
+#define ocmplb3besr1    (OCM_DCR_BASE+0x04)  /* OCM PLB3 Bus Error Stat Reg 1 */
+#define ocmcid          (OCM_DCR_BASE+0x05)  /* OCM Core ID                   */
+#define ocmrevid        (OCM_DCR_BASE+0x06)  /* OCM Revision ID               */
+#define ocmplb3dpc      (OCM_DCR_BASE+0x07)  /* OCM PLB3 Data Parity Check    */
+#define ocmdscr1        (OCM_DCR_BASE+0x08)  /* OCM D-side Bank 1 Config Reg  */
+#define ocmdscr2        (OCM_DCR_BASE+0x09)  /* OCM D-side Bank 2 Config Reg  */
+#define ocmiscr1        (OCM_DCR_BASE+0x0A)  /* OCM I-side Bank 1 Config Reg  */
+#define ocmiscr2        (OCM_DCR_BASE+0x0B)  /* OCM I-side Bank 2 Config Reg  */
+#define ocmdsisdpc      (OCM_DCR_BASE+0x0C)  /* OCM D-side/I-side Data Par Chk*/
+#define ocmdsisbear     (OCM_DCR_BASE+0x0D)  /* OCM D-side/I-side Bus Err Addr*/
+#define ocmdsisbesr     (OCM_DCR_BASE+0x0E)  /* OCM D-side/I-side Bus Err Stat*/
+#else
 #define OCM_DCR_BASE 0x018
 #define ocmisarc   (OCM_DCR_BASE+0x00)  /* OCM I-side address compare reg    */
 #define ocmiscntl  (OCM_DCR_BASE+0x01)  /* OCM I-side control reg            */
 #define ocmdsarc   (OCM_DCR_BASE+0x02)  /* OCM D-side address compare reg    */
 #define ocmdscntl  (OCM_DCR_BASE+0x03)  /* OCM D-side control reg            */
+#endif /* CONFIG_405EZ */
 
 /******************************************************************************
  * GPIO macro register defines
  ******************************************************************************/
+#if defined(CONFIG_405EZ)
+/* Only the 405EZ has 2 GPIOs */
+#define GPIO_BASE  0xEF600700
+#define GPIO0_OR               (GPIO_BASE+0x0)
+#define GPIO0_TCR              (GPIO_BASE+0x4)
+#define GPIO0_OSRL             (GPIO_BASE+0x8)
+#define GPIO0_OSRH             (GPIO_BASE+0xC)
+#define GPIO0_TSRL             (GPIO_BASE+0x10)
+#define GPIO0_TSRH             (GPIO_BASE+0x14)
+#define GPIO0_ODR              (GPIO_BASE+0x18)
+#define GPIO0_IR               (GPIO_BASE+0x1C)
+#define GPIO0_RR1              (GPIO_BASE+0x20)
+#define GPIO0_RR2              (GPIO_BASE+0x24)
+#define GPIO0_RR3              (GPIO_BASE+0x28)
+#define GPIO0_ISR1L            (GPIO_BASE+0x30)
+#define GPIO0_ISR1H            (GPIO_BASE+0x34)
+#define GPIO0_ISR2L            (GPIO_BASE+0x38)
+#define GPIO0_ISR2H            (GPIO_BASE+0x3C)
+#define GPIO0_ISR3L            (GPIO_BASE+0x40)
+#define GPIO0_ISR3H            (GPIO_BASE+0x44)
+
+#define GPIO1_BASE  0xEF600800
+#define GPIO1_OR               (GPIO1_BASE+0x0)
+#define GPIO1_TCR              (GPIO1_BASE+0x4)
+#define GPIO1_OSRL             (GPIO1_BASE+0x8)
+#define GPIO1_OSRH             (GPIO1_BASE+0xC)
+#define GPIO1_TSRL             (GPIO1_BASE+0x10)
+#define GPIO1_TSRH             (GPIO1_BASE+0x14)
+#define GPIO1_ODR              (GPIO1_BASE+0x18)
+#define GPIO1_IR               (GPIO1_BASE+0x1C)
+#define GPIO1_RR1              (GPIO1_BASE+0x20)
+#define GPIO1_RR2              (GPIO1_BASE+0x24)
+#define GPIO1_RR3              (GPIO1_BASE+0x28)
+#define GPIO1_ISR1L            (GPIO1_BASE+0x30)
+#define GPIO1_ISR1H            (GPIO1_BASE+0x34)
+#define GPIO1_ISR2L            (GPIO1_BASE+0x38)
+#define GPIO1_ISR2H            (GPIO1_BASE+0x3C)
+#define GPIO1_ISR3L            (GPIO1_BASE+0x40)
+#define GPIO1_ISR3H            (GPIO1_BASE+0x44)
+
+#else  /* !405EZ */
+
 #define GPIO_BASE  0xEF600700
 #define GPIO0_OR               (GPIO_BASE+0x0)
 #define GPIO0_TCR              (GPIO_BASE+0x4)
 #define GPIO0_ISR2H            (GPIO_BASE+0x38)
 #define GPIO0_ISR2L            (GPIO_BASE+0x3C)
 
+#endif /* CONFIG_405EZ */
 
 /*
  * Macro for accessing the indirect EBC register
index 91cff414af6539ecf971b292242f34ab7fec2019..07f75de08e67105573d400459e8fa5199f9ccd3c 100644 (file)
 #define sdrcfgd                (SDR_DCR_BASE+0x1)
 #define sdr_sdstp0     0x0020      /* */
 #define sdr_sdstp1     0x0021      /* */
-#define sdr_pinstp     0x0040
+#define SDR_PINSTP     0x0040
 #define sdr_sdcs       0x0060
 #define sdr_ecid0      0x0080
 #define sdr_ecid1      0x0081
 #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) || \
 /*----------------------------------------------------------------------------+
 | Clock / Power-on-reset DCR's.
 +----------------------------------------------------------------------------*/
-#define CPR0_CFGADDR                   0x00C
-#define CPR0_CFGDATA                   0x00D
-
 #define CPR0_CLKUPD                    0x20
 #define CPR0_CLKUPD_BSY_MASK           0x80000000
 #define CPR0_CLKUPD_BSY_COMPLETED      0x00000000
 /*-----------------------------------------------------------------------------+
 |  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 GPIO1_ISR3H            (GPIO1_BASE+0x44)
 #endif
 
-#define GPIO_GROUP_MAX     2
-#define GPIO_MAX           32
-#define GPIO_ALT1_SEL      0x40000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 0 */
-#define GPIO_ALT2_SEL      0x80000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 1 */
-#define GPIO_ALT3_SEL      0xC0000000      /* GPIO_OUT value put in GPIO_TSx for the GPIO nb 2 */
-#define GPIO_MASK          0xC0000000      /* GPIO_MASK */
-#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 */
-
-#ifndef __ASSEMBLY__
-
-typedef enum gpio_select { GPIO_SEL, GPIO_ALT1, GPIO_ALT2, GPIO_ALT3 } gpio_select_t;
-typedef enum gpio_driver { GPIO_DIS, GPIO_IN, GPIO_OUT, GPIO_BI } gpio_driver_t;
-
-typedef struct { unsigned long add;    /* gpio core base address */
-       gpio_driver_t  in_out; /* Driver Setting */
-       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)
 
+/*
+ * All 44x except 440GP have CPR registers (indirect DCR)
+ */
+#if !defined(CONFIG_440GP)
+#define CPR0_CFGADDR           0x00C
+#define CPR0_CFGDATA           0x00D
+
+#define mtcpr(reg, data)       do { \
+               mtdcr(CPR0_CFGADDR, reg); \
+               mtdcr(CPR0_CFGDATA, data); \
+       } while (0)
+
+#define mfcpr(reg, data)       do { \
+               mtdcr(CPR0_CFGADDR, reg); \
+               data = mfdcr(CPR0_CFGDATA); \
+       } while (0)
+#endif
 
 #ifndef __ASSEMBLY__
 
index 43c5ca451e09fb81cbd2ad64430f755845bc5a9a..3d8ca090600898f2615d8ad24638633e15ce81a7 100644 (file)
@@ -130,13 +130,13 @@ typedef struct emac_4xx_hw_st {
 
 
 #if defined(CONFIG_440GX)
-#define EMAC_NUM_DEV       4
+#define EMAC_NUM_DEV           4
 #elif (defined(CONFIG_440) || defined(CONFIG_405EP)) &&        \
        defined(CONFIG_NET_MULTI) &&                    \
        !defined(CONFIG_440SP) && !defined(CONFIG_440SPE)
-#define EMAC_NUM_DEV       2
+#define EMAC_NUM_DEV           2
 #else
-#define EMAC_NUM_DEV       1
+#define EMAC_NUM_DEV           1
 #endif
 
 #ifdef CONFIG_IBM_EMAC4_V4     /* EMAC4 V4 changed bit setting */
@@ -153,16 +153,16 @@ typedef struct emac_4xx_hw_st {
 /*ZMII Bridge Register addresses */
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
     defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
-#define ZMII_BASE                      (CFG_PERIPHERAL_BASE + 0x0D00)
+#define ZMII_BASE              (CFG_PERIPHERAL_BASE + 0x0D00)
 #else
-#define ZMII_BASE                      (CFG_PERIPHERAL_BASE + 0x0780)
+#define ZMII_BASE              (CFG_PERIPHERAL_BASE + 0x0780)
 #endif
-#define ZMII_FER                       (ZMII_BASE)
-#define ZMII_SSR                       (ZMII_BASE + 4)
-#define ZMII_SMIISR                    (ZMII_BASE + 8)
+#define ZMII_FER               (ZMII_BASE)
+#define ZMII_SSR               (ZMII_BASE + 4)
+#define ZMII_SMIISR            (ZMII_BASE + 8)
 
-#define ZMII_RMII                      0x22000000
-#define ZMII_MDI0                      0x80000000
+#define ZMII_RMII              0x22000000
+#define ZMII_MDI0              0x80000000
 
 /* ZMII FER Register Bit Definitions */
 #define ZMII_FER_DIS           (0x0)
@@ -299,49 +299,41 @@ typedef struct emac_4xx_hw_st {
 #if defined(CONFIG_440)
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
     defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
-#define EMAC_BASE                          (CFG_PERIPHERAL_BASE + 0x0E00)
+#define EMAC_BASE              (CFG_PERIPHERAL_BASE + 0x0E00)
 #else
-#define EMAC_BASE                          (CFG_PERIPHERAL_BASE + 0x0800)
+#define EMAC_BASE              (CFG_PERIPHERAL_BASE + 0x0800)
 #endif
 #else
-#define EMAC_BASE                      0xEF600800
+#if defined(CONFIG_405EZ)
+#define EMAC_BASE              0xEF600900
+#else
+#define EMAC_BASE              0xEF600800
+#endif
 #endif
 
-#define EMAC_M0                                    (EMAC_BASE)
-#define EMAC_M1                                    (EMAC_BASE + 4)
-#define EMAC_TXM0                              (EMAC_BASE + 8)
-#define EMAC_TXM1                              (EMAC_BASE + 12)
-#define EMAC_RXM                               (EMAC_BASE + 16)
-#define EMAC_ISR                               (EMAC_BASE + 20)
-#define EMAC_IER                               (EMAC_BASE + 24)
-#define EMAC_IAH                               (EMAC_BASE + 28)
-#define EMAC_IAL                               (EMAC_BASE + 32)
-#define EMAC_VLAN_TPID_REG             (EMAC_BASE + 36)
-#define EMAC_VLAN_TCI_REG              (EMAC_BASE + 40)
+#define EMAC_M0                        (EMAC_BASE)
+#define EMAC_M1                        (EMAC_BASE + 4)
+#define EMAC_TXM0              (EMAC_BASE + 8)
+#define EMAC_TXM1              (EMAC_BASE + 12)
+#define EMAC_RXM               (EMAC_BASE + 16)
+#define EMAC_ISR               (EMAC_BASE + 20)
+#define EMAC_IER               (EMAC_BASE + 24)
+#define EMAC_IAH               (EMAC_BASE + 28)
+#define EMAC_IAL               (EMAC_BASE + 32)
 #define EMAC_PAUSE_TIME_REG    (EMAC_BASE + 44)
-#define EMAC_IND_HASH_1                        (EMAC_BASE + 48)
-#define EMAC_IND_HASH_2                        (EMAC_BASE + 52)
-#define EMAC_IND_HASH_3                        (EMAC_BASE + 56)
-#define EMAC_IND_HASH_4                        (EMAC_BASE + 60)
-#define EMAC_GRP_HASH_1                        (EMAC_BASE + 64)
-#define EMAC_GRP_HASH_2                        (EMAC_BASE + 68)
-#define EMAC_GRP_HASH_3                        (EMAC_BASE + 72)
-#define EMAC_GRP_HASH_4                        (EMAC_BASE + 76)
-#define EMAC_LST_SRC_LOW               (EMAC_BASE + 80)
-#define EMAC_LST_SRC_HI                        (EMAC_BASE + 84)
 #define EMAC_I_FRAME_GAP_REG   (EMAC_BASE + 88)
-#define EMAC_STACR                         (EMAC_BASE + 92)
-#define EMAC_TRTR                              (EMAC_BASE + 96)
-#define EMAC_RX_HI_LO_WMARK            (EMAC_BASE + 100)
+#define EMAC_STACR             (EMAC_BASE + 92)
+#define EMAC_TRTR              (EMAC_BASE + 96)
+#define EMAC_RX_HI_LO_WMARK    (EMAC_BASE + 100)
 
 /* bit definitions */
 /* MODE REG 0 */
-#define EMAC_M0_RXI                        (0x80000000)
-#define EMAC_M0_TXI                        (0x40000000)
-#define EMAC_M0_SRST                   (0x20000000)
-#define EMAC_M0_TXE                        (0x10000000)
-#define EMAC_M0_RXE                        (0x08000000)
-#define EMAC_M0_WKE                        (0x04000000)
+#define EMAC_M0_RXI            (0x80000000)
+#define EMAC_M0_TXI            (0x40000000)
+#define EMAC_M0_SRST           (0x20000000)
+#define EMAC_M0_TXE            (0x10000000)
+#define EMAC_M0_RXE            (0x08000000)
+#define EMAC_M0_WKE            (0x04000000)
 
 /* on 440GX EMAC_MR1 has a different layout! */
 #if defined(CONFIG_440GX) || \
@@ -351,23 +343,23 @@ typedef struct emac_4xx_hw_st {
 #define EMAC_M1_FDE            (0x80000000)
 #define EMAC_M1_ILE            (0x40000000)
 #define EMAC_M1_VLE            (0x20000000)
-#define EMAC_M1_EIFC                   (0x10000000)
-#define EMAC_M1_APP                        (0x08000000)
-#define EMAC_M1_RSVD                   (0x06000000)
-#define EMAC_M1_IST                        (0x01000000)
-#define EMAC_M1_MF_1000MBPS            (0x00800000)    /* 0's for 10MBPS */
-#define EMAC_M1_MF_100MBPS             (0x00400000)
-#define EMAC_M1_RFS_16K                        (0x00280000)    /* ~4k for 512 byte */
-#define EMAC_M1_RFS_8K                 (0x00200000)    /* ~4k for 512 byte */
-#define EMAC_M1_RFS_4K                 (0x00180000)    /* ~4k for 512 byte */
-#define EMAC_M1_RFS_2K                 (0x00100000)
-#define EMAC_M1_RFS_1K                 (0x00080000)
-#define EMAC_M1_TX_FIFO_16K            (0x00050000)    /* 0's for 512 byte */
-#define EMAC_M1_TX_FIFO_8K             (0x00040000)
-#define EMAC_M1_TX_FIFO_4K             (0x00030000)
+#define EMAC_M1_EIFC           (0x10000000)
+#define EMAC_M1_APP            (0x08000000)
+#define EMAC_M1_RSVD           (0x06000000)
+#define EMAC_M1_IST            (0x01000000)
+#define EMAC_M1_MF_1000MBPS    (0x00800000)    /* 0's for 10MBPS */
+#define EMAC_M1_MF_100MBPS     (0x00400000)
+#define EMAC_M1_RFS_16K                (0x00280000)    /* ~4k for 512 byte */
+#define EMAC_M1_RFS_8K         (0x00200000)    /* ~4k for 512 byte */
+#define EMAC_M1_RFS_4K         (0x00180000)    /* ~4k for 512 byte */
+#define EMAC_M1_RFS_2K         (0x00100000)
+#define EMAC_M1_RFS_1K         (0x00080000)
+#define EMAC_M1_TX_FIFO_16K    (0x00050000)    /* 0's for 512 byte */
+#define EMAC_M1_TX_FIFO_8K     (0x00040000)
+#define EMAC_M1_TX_FIFO_4K     (0x00030000)
 #define EMAC_M1_TX_FIFO_2K     (0x00020000)
-#define EMAC_M1_TX_FIFO_1K             (0x00010000)
-#define EMAC_M1_TR_MULTI               (0x00008000)    /* 0'x for single packet */
+#define EMAC_M1_TX_FIFO_1K     (0x00010000)
+#define EMAC_M1_TR_MULTI       (0x00008000)    /* 0'x for single packet */
 #define EMAC_M1_MWSW           (0x00007000)
 #define EMAC_M1_JUMBO_ENABLE   (0x00000800)
 #define EMAC_M1_IPPA           (0x000007c0)
@@ -378,34 +370,34 @@ typedef struct emac_4xx_hw_st {
 #define EMAC_M1_RSVD1          (0x00000007)
 #else /* defined(CONFIG_440GX) */
 /* EMAC_MR1 is the same on 405GP, 405GPr, 405EP, 440GP, 440EP */
-#define EMAC_M1_FDE                    0x80000000
-#define EMAC_M1_ILE                    0x40000000
-#define EMAC_M1_VLE                    0x20000000
-#define EMAC_M1_EIFC                   0x10000000
-#define EMAC_M1_APP                    0x08000000
-#define EMAC_M1_AEMI                   0x02000000
-#define EMAC_M1_IST                    0x01000000
-#define EMAC_M1_MF_1000MBPS            0x00800000      /* 0's for 10MBPS */
-#define EMAC_M1_MF_100MBPS             0x00400000
-#define EMAC_M1_RFS_4K                 0x00300000      /* ~4k for 512 byte */
-#define EMAC_M1_RFS_2K                 0x00200000
-#define EMAC_M1_RFS_1K                 0x00100000
-#define EMAC_M1_TX_FIFO_2K             0x00080000      /* 0's for 512 byte */
-#define EMAC_M1_TX_FIFO_1K             0x00040000
-#define EMAC_M1_TR0_DEPEND             0x00010000      /* 0'x for single packet */
-#define EMAC_M1_TR0_MULTI              0x00008000
-#define EMAC_M1_TR1_DEPEND             0x00004000
-#define EMAC_M1_TR1_MULTI              0x00002000
+#define EMAC_M1_FDE            0x80000000
+#define EMAC_M1_ILE            0x40000000
+#define EMAC_M1_VLE            0x20000000
+#define EMAC_M1_EIFC           0x10000000
+#define EMAC_M1_APP            0x08000000
+#define EMAC_M1_AEMI           0x02000000
+#define EMAC_M1_IST            0x01000000
+#define EMAC_M1_MF_1000MBPS    0x00800000      /* 0's for 10MBPS */
+#define EMAC_M1_MF_100MBPS     0x00400000
+#define EMAC_M1_RFS_4K         0x00300000      /* ~4k for 512 byte */
+#define EMAC_M1_RFS_2K         0x00200000
+#define EMAC_M1_RFS_1K         0x00100000
+#define EMAC_M1_TX_FIFO_2K     0x00080000      /* 0's for 512 byte */
+#define EMAC_M1_TX_FIFO_1K     0x00040000
+#define EMAC_M1_TR0_DEPEND     0x00010000      /* 0'x for single packet */
+#define EMAC_M1_TR0_MULTI      0x00008000
+#define EMAC_M1_TR1_DEPEND     0x00004000
+#define EMAC_M1_TR1_MULTI      0x00002000
 #if defined(CONFIG_440EP) || defined(CONFIG_440GR)
-#define EMAC_M1_JUMBO_ENABLE           0x00001000
+#define EMAC_M1_JUMBO_ENABLE   0x00001000
 #endif /* defined(CONFIG_440EP) || defined(CONFIG_440GR) */
 #endif /* defined(CONFIG_440GX) */
 
 /* Transmit Mode Register 0 */
-#define EMAC_TXM0_GNP0                 (0x80000000)
-#define EMAC_TXM0_GNP1                 (0x40000000)
-#define EMAC_TXM0_GNPD                 (0x20000000)
-#define EMAC_TXM0_FC                   (0x10000000)
+#define EMAC_TXM0_GNP0         (0x80000000)
+#define EMAC_TXM0_GNP1         (0x40000000)
+#define EMAC_TXM0_GNPD         (0x20000000)
+#define EMAC_TXM0_FC           (0x10000000)
 
 /* Receive Mode Register */
 #define EMAC_RMR_SP            (0x80000000)
@@ -427,39 +419,38 @@ typedef struct emac_4xx_hw_st {
 #define EMAC_ISR_PP            (0x01000000)
 #define EMAC_ISR_BP            (0x00800000)
 #define EMAC_ISR_RP            (0x00400000)
-#define EMAC_ISR_SE                    (0x00200000)
-#define EMAC_ISR_SYE                   (0x00100000)
-#define EMAC_ISR_BFCS                  (0x00080000)
-#define EMAC_ISR_PTLE                  (0x00040000)
-#define EMAC_ISR_ORE                   (0x00020000)
-#define EMAC_ISR_IRE                   (0x00010000)
-#define EMAC_ISR_DBDM                  (0x00000200)
-#define EMAC_ISR_DB0                   (0x00000100)
-#define EMAC_ISR_SE0                   (0x00000080)
-#define EMAC_ISR_TE0                   (0x00000040)
-#define EMAC_ISR_DB1                   (0x00000020)
-#define EMAC_ISR_SE1                   (0x00000010)
-#define EMAC_ISR_TE1                   (0x00000008)
-#define EMAC_ISR_MOS                   (0x00000002)
-#define EMAC_ISR_MOF                   (0x00000001)
-
+#define EMAC_ISR_SE            (0x00200000)
+#define EMAC_ISR_SYE           (0x00100000)
+#define EMAC_ISR_BFCS          (0x00080000)
+#define EMAC_ISR_PTLE          (0x00040000)
+#define EMAC_ISR_ORE           (0x00020000)
+#define EMAC_ISR_IRE           (0x00010000)
+#define EMAC_ISR_DBDM          (0x00000200)
+#define EMAC_ISR_DB0           (0x00000100)
+#define EMAC_ISR_SE0           (0x00000080)
+#define EMAC_ISR_TE0           (0x00000040)
+#define EMAC_ISR_DB1           (0x00000020)
+#define EMAC_ISR_SE1           (0x00000010)
+#define EMAC_ISR_TE1           (0x00000008)
+#define EMAC_ISR_MOS           (0x00000002)
+#define EMAC_ISR_MOF           (0x00000001)
 
 /* STA CONTROL REG */
-#define EMAC_STACR_OC                  (0x00008000)
-#define EMAC_STACR_PHYE                        (0x00004000)
+#define EMAC_STACR_OC          (0x00008000)
+#define EMAC_STACR_PHYE                (0x00004000)
 
 #ifdef CONFIG_IBM_EMAC4_V4     /* EMAC4 V4 changed bit setting */
-#define EMAC_STACR_INDIRECT_MODE       (0x00002000)
-#define EMAC_STACR_WRITE               (0x00000800) /* $BUC */
-#define EMAC_STACR_READ                        (0x00001000) /* $BUC */
-#define EMAC_STACR_OP_MASK             (0x00001800)
-#define EMAC_STACR_MDIO_ADDR           (0x00000000)
-#define EMAC_STACR_MDIO_WRITE          (0x00000800)
-#define EMAC_STACR_MDIO_READ           (0x00001800)
-#define EMAC_STACR_MDIO_READ_INC       (0x00001000)
+#define EMAC_STACR_INDIRECT_MODE (0x00002000)
+#define EMAC_STACR_WRITE       (0x00000800) /* $BUC */
+#define EMAC_STACR_READ                (0x00001000) /* $BUC */
+#define EMAC_STACR_OP_MASK     (0x00001800)
+#define EMAC_STACR_MDIO_ADDR   (0x00000000)
+#define EMAC_STACR_MDIO_WRITE  (0x00000800)
+#define EMAC_STACR_MDIO_READ   (0x00001800)
+#define EMAC_STACR_MDIO_READ_INC (0x00001000)
 #else
-#define EMAC_STACR_WRITE               (0x00002000)
-#define EMAC_STACR_READ                        (0x00001000)
+#define EMAC_STACR_WRITE       (0x00002000)
+#define EMAC_STACR_READ                (0x00001000)
 #endif
 
 #define EMAC_STACR_CLK_83MHZ   (0x00000800)  /* 0's for 50Mhz */
@@ -467,9 +458,9 @@ typedef struct emac_4xx_hw_st {
 #define EMAC_STACR_CLK_100MHZ  (0x00000C00)
 
 /* Transmit Request Threshold Register */
-#define EMAC_TRTR_256                  (0x18000000)   /* 0's for 64 Bytes */
-#define EMAC_TRTR_192                  (0x10000000)
-#define EMAC_TRTR_128                  (0x01000000)
+#define EMAC_TRTR_256          (0x18000000)   /* 0's for 64 Bytes */
+#define EMAC_TRTR_192          (0x10000000)
+#define EMAC_TRTR_128          (0x01000000)
 
 /* the follwing defines are for the MadMAL status and control registers. */
 /* For bits 0..5 look at the mal.h file                                         */
index 48800595d7816bed37ad1685bf081d87f58f842a..f7412fd1738beb35e346aac314247b73e54260c3 100644 (file)
@@ -23,7 +23,7 @@ extern struct serial_device serial_scc_device;
 extern struct serial_device * default_serial_console (void);
 
 #if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_440) \
-   || defined(CONFIG_405EP) || defined(CONFIG_MPC5xxx)
+   || defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_MPC5xxx)
 extern struct serial_device serial0_device;
 extern struct serial_device serial1_device;
 #if defined(CFG_NS16550_SERIAL)
diff --git a/include/tsi108.h b/include/tsi108.h
new file mode 100644 (file)
index 0000000..ba62e7a
--- /dev/null
@@ -0,0 +1,221 @@
+/*****************************************************************************
+ * (C) Copyright 2003;  Tundra Semiconductor Corp.
+ * (C) Copyright 2006;  Freescale Semiconductor Corp.
+ *
+ * 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
+ *****************************************************************************/
+
+/*
+ * FILENAME: tsi108.h
+ *
+ * Originator: Alex Bounine
+ *
+ * DESCRIPTION:
+ * Common definitions for the Tundra Tsi108 bridge chip
+ *
+ */
+
+#ifndef _TSI108_H_
+#define _TSI108_H_
+
+#define TSI108_HLP_REG_OFFSET  (0x0000)
+#define TSI108_PCI_REG_OFFSET  (0x1000)
+#define TSI108_CLK_REG_OFFSET  (0x2000)
+#define TSI108_PB_REG_OFFSET   (0x3000)
+#define TSI108_SD_REG_OFFSET   (0x4000)
+#define TSI108_MPIC_REG_OFFSET (0x7400)
+
+#define PB_ID                  (0x000)
+#define PB_RSR                 (0x004)
+#define PB_BUS_MS_SELECT       (0x008)
+#define PB_ISR                 (0x00C)
+#define PB_ARB_CTRL            (0x018)
+#define PB_PVT_CTRL2           (0x034)
+#define PB_SCR                 (0x400)
+#define PB_ERRCS               (0x404)
+#define PB_AERR                        (0x408)
+#define PB_REG_BAR             (0x410)
+#define PB_OCN_BAR1            (0x414)
+#define PB_OCN_BAR2            (0x418)
+#define PB_SDRAM_BAR1          (0x41C)
+#define PB_SDRAM_BAR2          (0x420)
+#define PB_MCR                 (0xC00)
+#define PB_MCMD                        (0xC04)
+
+#define HLP_B0_ADDR            (0x000)
+#define HLP_B1_ADDR            (0x010)
+#define HLP_B2_ADDR            (0x020)
+#define HLP_B3_ADDR            (0x030)
+
+#define HLP_B0_MASK            (0x004)
+#define HLP_B1_MASK            (0x014)
+#define HLP_B2_MASK            (0x024)
+#define HLP_B3_MASK            (0x034)
+
+#define HLP_B0_CTRL0           (0x008)
+#define HLP_B1_CTRL0           (0x018)
+#define HLP_B2_CTRL0           (0x028)
+#define HLP_B3_CTRL0           (0x038)
+
+#define HLP_B0_CTRL1           (0x00C)
+#define HLP_B1_CTRL1           (0x01C)
+#define HLP_B2_CTRL1           (0x02C)
+#define HLP_B3_CTRL1           (0x03C)
+
+#define PCI_CSR                        (0x004)
+#define PCI_P2O_BAR0           (0x010)
+#define PCI_P2O_BAR0_UPPER     (0x014)
+#define PCI_P2O_BAR2           (0x018)
+#define PCI_P2O_BAR2_UPPER     (0x01C)
+#define PCI_P2O_BAR3           (0x020)
+#define PCI_P2O_BAR3_UPPER     (0x024)
+
+#define PCI_MISC_CSR           (0x040)
+#define PCI_P2O_PAGE_SIZES     (0x04C)
+
+#define PCI_PCIX_STAT          (0x0F4)
+
+#define PCI_IRP_STAT           (0x184)
+
+#define PCI_PFAB_BAR0          (0x204)
+#define PCI_PFAB_BAR0_UPPER    (0x208)
+#define PCI_PFAB_IO            (0x20C)
+#define PCI_PFAB_IO_UPPER      (0x210)
+
+#define PCI_PFAB_MEM32         (0x214)
+#define PCI_PFAB_MEM32_REMAP   (0x218)
+#define PCI_PFAB_MEM32_MASK    (0x21C)
+
+#define CG_PLL0_CTRL0          (0x210)
+#define CG_PLL0_CTRL1          (0x214)
+#define CG_PLL1_CTRL0          (0x220)
+#define CG_PLL1_CTRL1          (0x224)
+#define CG_PWRUP_STATUS                (0x234)
+
+#define MPIC_CSR(n) (0x30C + (n * 0x40))
+
+#define SD_CTRL                        (0x000)
+#define SD_STATUS              (0x004)
+#define SD_TIMING              (0x008)
+#define SD_REFRESH             (0x00C)
+#define SD_INT_STATUS          (0x010)
+#define SD_INT_ENABLE          (0x014)
+#define SD_INT_SET             (0x018)
+#define SD_D0_CTRL             (0x020)
+#define SD_D1_CTRL             (0x024)
+#define SD_D0_BAR              (0x028)
+#define SD_D1_BAR              (0x02C)
+#define SD_ECC_CTRL            (0x040)
+#define SD_DLL_STATUS          (0x250)
+
+#define TS_SD_CTRL_ENABLE      (1 << 31)
+
+#define PB_ERRCS_ES            (1 << 1)
+#define PB_ISR_PBS_RD_ERR      (1 << 8)
+#define PCI_IRP_STAT_P_CSR     (1 << 23)
+
+/*
+ * I2C : Register address offset definitions
+ */
+#define I2C_CNTRL1             (0x00000000)
+#define I2C_CNTRL2             (0x00000004)
+#define I2C_RD_DATA            (0x00000008)
+#define I2C_TX_DATA            (0x0000000c)
+
+/*
+ * I2C : Register Bit Masks and Reset Values
+ * definitions for every register
+ */
+
+/* I2C_CNTRL1 : Reset Value */
+#define I2C_CNTRL1_RESET_VALUE                         (0x0000000a)
+
+/* I2C_CNTRL1 : Register Bits Masks Definitions */
+#define I2C_CNTRL1_DEVCODE                             (0x0000000f)
+#define I2C_CNTRL1_PAGE                                        (0x00000700)
+#define I2C_CNTRL1_BYTADDR                             (0x00ff0000)
+#define I2C_CNTRL1_I2CWRITE                            (0x01000000)
+
+/* I2C_CNTRL1 : Read/Write Bit Mask Definition */
+#define I2C_CNTRL1_RWMASK                              (0x01ff070f)
+
+/* I2C_CNTRL1 : Unused/Reserved bits Definition */
+#define I2C_CNTRL1_RESERVED                            (0xfe00f8f0)
+
+/* I2C_CNTRL2 : Reset Value */
+#define I2C_CNTRL2_RESET_VALUE                         (0x00000000)
+
+/* I2C_CNTRL2 : Register Bits Masks Definitions */
+#define I2C_CNTRL2_SIZE                                        (0x00000003)
+#define I2C_CNTRL2_LANE                                        (0x0000000c)
+#define I2C_CNTRL2_MULTIBYTE                           (0x00000010)
+#define I2C_CNTRL2_START                               (0x00000100)
+#define I2C_CNTRL2_WR_STATUS                           (0x00010000)
+#define I2C_CNTRL2_RD_STATUS                           (0x00020000)
+#define I2C_CNTRL2_I2C_TO_ERR                          (0x04000000)
+#define I2C_CNTRL2_I2C_CFGERR                          (0x08000000)
+#define I2C_CNTRL2_I2C_CMPLT                           (0x10000000)
+
+/* I2C_CNTRL2 : Read/Write Bit Mask Definition */
+#define I2C_CNTRL2_RWMASK                              (0x0000011f)
+
+/* I2C_CNTRL2 : Unused/Reserved bits Definition */
+#define I2C_CNTRL2_RESERVED                            (0xe3fcfee0)
+
+/* I2C_RD_DATA : Reset Value */
+#define I2C_RD_DATA_RESET_VALUE                                (0x00000000)
+
+/* I2C_RD_DATA : Register Bits Masks Definitions */
+#define I2C_RD_DATA_RBYTE0                             (0x000000ff)
+#define I2C_RD_DATA_RBYTE1                             (0x0000ff00)
+#define I2C_RD_DATA_RBYTE2                             (0x00ff0000)
+#define I2C_RD_DATA_RBYTE3                             (0xff000000)
+
+/* I2C_RD_DATA : Read/Write Bit Mask Definition */
+#define I2C_RD_DATA_RWMASK                             (0x00000000)
+
+/* I2C_RD_DATA : Unused/Reserved bits Definition */
+#define I2C_RD_DATA_RESERVED                           (0x00000000)
+
+/* I2C_TX_DATA : Reset Value */
+#define I2C_TX_DATA_RESET_VALUE                                (0x00000000)
+
+/* I2C_TX_DATA : Register Bits Masks Definitions */
+#define I2C_TX_DATA_TBYTE0                             (0x000000ff)
+#define I2C_TX_DATA_TBYTE1                             (0x0000ff00)
+#define I2C_TX_DATA_TBYTE2                             (0x00ff0000)
+#define I2C_TX_DATA_TBYTE3                             (0xff000000)
+
+/* I2C_TX_DATA : Read/Write Bit Mask Definition */
+#define I2C_TX_DATA_RWMASK                             (0xffffffff)
+
+/* I2C_TX_DATA : Unused/Reserved bits Definition */
+#define I2C_TX_DATA_RESERVED                           (0x00000000)
+
+#define TSI108_I2C_OFFSET      0x7000  /* offset for general use I2C channel */
+#define TSI108_I2C_SDRAM_OFFSET        0x4400  /* offset for SPD I2C channel */
+
+#define I2C_EEPROM_DEVCODE     0xA     /* standard I2C EEPROM device code */
+
+/* I2C status codes */
+
+#define TSI108_I2C_SUCCESS     0
+#define TSI108_I2C_PARAM_ERR   1
+#define TSI108_I2C_TIMEOUT_ERR 2
+#define TSI108_I2C_IF_BUSY     3
+#define TSI108_I2C_IF_ERROR    4
+
+#endif         /* _TSI108_H_ */
index d128dfb53f075b01b8f73616b59a4af6f4553896..6095e2ff214aac67e4741e5a36ee531e2190d157 100644 (file)
@@ -27,7 +27,7 @@
 #include <asm/addrspace.h>
 #include <asm/io.h>
 #include <asm/setup.h>
-#include <asm/arch/platform.h>
+#include <asm/arch/clk.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -133,7 +133,7 @@ static struct tag *setup_clock_tags(struct tag *params)
        params->hdr.size = tag_size(tag_clock);
        params->u.clock.clock_id = ACLOCK_HSB;
        params->u.clock.clock_flags = 0;
-       params->u.clock.clock_hz = pm_get_clock_freq(CLOCK_HSB);
+       params->u.clock.clock_hz = get_hsb_clk_rate();
 #endif
 
        return tag_next(params);
index 02c106b80ede83c7a64b31a095bbe63ec49289f9..265328aa487696a11862aa12ae6e491fd60e64cb 100644 (file)
@@ -47,11 +47,14 @@ static unsigned long mem_malloc_start = 0;
 static unsigned long mem_malloc_end = 0;
 static unsigned long mem_malloc_brk = 0;
 
-/* The malloc area is wherever the board wants it to be */
+/* The malloc area is right below the monitor image in RAM */
 static void mem_malloc_init(void)
 {
-       mem_malloc_start = CFG_MALLOC_START;
-       mem_malloc_end = CFG_MALLOC_END;
+       unsigned long monitor_addr;
+
+       monitor_addr = CFG_MONITOR_BASE + gd->reloc_off;
+       mem_malloc_end = monitor_addr;
+       mem_malloc_start = mem_malloc_end - CFG_MALLOC_LEN;
        mem_malloc_brk = mem_malloc_start;
 
        printf("malloc: Using memory from 0x%08lx to 0x%08lx\n",
@@ -73,6 +76,50 @@ void *sbrk(ptrdiff_t increment)
        return ((void *)old);
 }
 
+#ifdef CFG_DMA_ALLOC_LEN
+#include <asm/cacheflush.h>
+#include <asm/io.h>
+
+static unsigned long dma_alloc_start;
+static unsigned long dma_alloc_end;
+static unsigned long dma_alloc_brk;
+
+static void dma_alloc_init(void)
+{
+       unsigned long monitor_addr;
+
+       monitor_addr = CFG_MONITOR_BASE + gd->reloc_off;
+       dma_alloc_end = monitor_addr - CFG_MALLOC_LEN;
+       dma_alloc_start = dma_alloc_end - CFG_DMA_ALLOC_LEN;
+       dma_alloc_brk = dma_alloc_start;
+
+       printf("DMA: Using memory from 0x%08lx to 0x%08lx\n",
+              dma_alloc_start, dma_alloc_end);
+
+       dcache_invalidate_range(cached(dma_alloc_start),
+                               dma_alloc_end - dma_alloc_start);
+}
+
+void *dma_alloc_coherent(size_t len, unsigned long *handle)
+{
+       unsigned long paddr = dma_alloc_brk;
+
+       if (dma_alloc_brk + len > dma_alloc_end)
+               return NULL;
+
+       dma_alloc_brk = ((paddr + len + CFG_DCACHE_LINESZ - 1)
+                        & ~(CFG_DCACHE_LINESZ - 1));
+
+       *handle = paddr;
+       return uncached(paddr);
+}
+#else
+static inline void dma_alloc_init(void)
+{
+
+}
+#endif
+
 static int init_baudrate(void)
 {
        char tmp[64];
@@ -122,40 +169,152 @@ static void display_flash_config (void)
        printf("at address 0x%08lx\n", gd->bd->bi_flashstart);
 }
 
-void start_u_boot (void)
+void board_init_f(ulong board_type)
 {
        gd_t gd_data;
+       gd_t *new_gd;
+       bd_t *bd;
+       unsigned long *new_sp;
+       unsigned long monitor_len;
+       unsigned long monitor_addr;
+       unsigned long addr;
+       long sdram_size;
 
        /* Initialize the global data pointer */
        memset(&gd_data, 0, sizeof(gd_data));
        gd = &gd_data;
 
-       monitor_flash_len = _edata - _text;
-
        /* Perform initialization sequence */
+       board_early_init_f();
        cpu_init();
-       timer_init();
        env_init();
        init_baudrate();
        serial_init();
        console_init_f();
        display_banner();
+       sdram_size = initdram(board_type);
+
+       /* If we have no SDRAM, we can't go on */
+       if (sdram_size <= 0)
+               panic("No working SDRAM available\n");
+
+       /*
+        * Now that we have DRAM mapped and working, we can
+        * relocate the code and continue running from DRAM.
+        *
+        * Reserve memory at end of RAM for (top down in that order):
+        *  - u-boot image
+        *  - heap for malloc()
+        *  - board info struct
+        *  - global data struct
+        *  - stack
+        */
+       addr = CFG_SDRAM_BASE + sdram_size;
+       monitor_len = _end - _text;
+
+       /*
+        * Reserve memory for u-boot code, data and bss.
+        * Round down to next 4 kB limit.
+        */
+       addr -= monitor_len;
+       addr &= ~(4096UL - 1);
+       monitor_addr = addr;
+
+       /* Reserve memory for malloc() */
+       addr -= CFG_MALLOC_LEN;
+
+#ifdef CFG_DMA_ALLOC_LEN
+       /* Reserve DMA memory (must be cache aligned) */
+       addr &= ~(CFG_DCACHE_LINESZ - 1);
+       addr -= CFG_DMA_ALLOC_LEN;
+#endif
 
-       board_init_memories();
-       mem_malloc_init();
+       /* Allocate a Board Info struct on a word boundary */
+       addr -= sizeof(bd_t);
+       addr &= ~3UL;
+       gd->bd = bd = (bd_t *)addr;
+
+       /* Allocate a new global data copy on a 8-byte boundary. */
+       addr -= sizeof(gd_t);
+       addr &= ~7UL;
+       new_gd = (gd_t *)addr;
+
+       /* And finally, a new, bigger stack. */
+       new_sp = (unsigned long *)addr;
+       gd->stack_end = addr;
+       *(--new_sp) = 0;
+       *(--new_sp) = 0;
+
+       /*
+        * Initialize the board information struct with the
+        * information we have.
+        */
+       bd->bi_dram[0].start = CFG_SDRAM_BASE;
+       bd->bi_dram[0].size = sdram_size;
+       bd->bi_baudrate = gd->baudrate;
+
+       memcpy(new_gd, gd, sizeof(gd_t));
+
+       relocate_code((unsigned long)new_sp, new_gd, monitor_addr);
+}
 
-       gd->bd = malloc(sizeof(bd_t));
-       memset(gd->bd, 0, sizeof(bd_t));
-       gd->bd->bi_baudrate = gd->baudrate;
-       gd->bd->bi_dram[0].start = CFG_SDRAM_BASE;
-       gd->bd->bi_dram[0].size = gd->sdram_size;
+void board_init_r(gd_t *new_gd, ulong dest_addr)
+{
+       extern void malloc_bin_reloc (void);
+#ifndef CFG_ENV_IS_NOWHERE
+       extern char * env_name_spec;
+#endif
+       cmd_tbl_t *cmdtp;
+       bd_t *bd;
+
+       gd = new_gd;
+       bd = gd->bd;
+
+       gd->flags |= GD_FLG_RELOC;
+       gd->reloc_off = dest_addr - CFG_MONITOR_BASE;
+
+       monitor_flash_len = _edata - _text;
 
+       /*
+        * We have to relocate the command table manually
+        */
+       for (cmdtp = &__u_boot_cmd_start;
+            cmdtp !=  &__u_boot_cmd_end; cmdtp++) {
+               unsigned long addr;
+
+               addr = (unsigned long)cmdtp->cmd + gd->reloc_off;
+               cmdtp->cmd = (typeof(cmdtp->cmd))addr;
+
+               addr = (unsigned long)cmdtp->name + gd->reloc_off;
+               cmdtp->name = (typeof(cmdtp->name))addr;
+
+               if (cmdtp->usage) {
+                       addr = (unsigned long)cmdtp->usage + gd->reloc_off;
+                       cmdtp->usage = (typeof(cmdtp->usage))addr;
+               }
+#ifdef CFG_LONGHELP
+               if (cmdtp->help) {
+                       addr = (unsigned long)cmdtp->help + gd->reloc_off;
+                       cmdtp->help = (typeof(cmdtp->help))addr;
+               }
+#endif
+       }
+
+       /* there are some other pointer constants we must deal with */
+#ifndef CFG_ENV_IS_NOWHERE
+       env_name_spec += gd->reloc_off;
+#endif
+
+       timer_init();
+       mem_malloc_init();
+       malloc_bin_reloc();
+       dma_alloc_init();
        board_init_info();
        flash_init();
 
-       if (gd->bd->bi_flashsize)
+       if (bd->bi_flashsize)
                display_flash_config();
-       if (gd->bd->bi_dram[0].size)
+       if (bd->bi_dram[0].size)
                display_dram_config();
 
        gd->bd->bi_boot_params = malloc(CFG_BOOTPARAMS_LEN);
@@ -169,6 +328,13 @@ void start_u_boot (void)
        jumptable_init();
        console_init_r();
 
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+#if defined(CONFIG_NET_MULTI)
+       puts("Net:   ");
+#endif
+       eth_initialize(gd->bd);
+#endif
+
        for (;;) {
                main_loop();
        }
index de7114b80ae68bfa9edbfe6d110f9a1d8bb7dd25..a7aaef7a3c305e02ff1fc18c549ff6f6646b3516 100644 (file)
@@ -1,7 +1,7 @@
 #
 # U-boot Makefile
 #
-# Copyright (c) 2005 blackfin.uclinux.org
+# Copyright (c) 2005-2007 Analog Devices Inc.
 #
 # (C) Copyright 2000-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # 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
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301 USA
 #
 
 include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(ARCH).a
 
-SOBJS  =
+SOBJS  = memcpy.o memcmp.o memset.o memmove.o
 
-COBJS  = board.o bf533_linux.o bf533_string.o cache.o muldi3.o
+COBJS  = post.o tests.o board.o bf533_linux.o bf533_string.o cache.o muldi3.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
index 88b4da29df91fccec0a0a4af3bc24c3c1d12775e..3b9c4df9883ac1805387bd6fd1d98ef69a955cc2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - bf533_linux.c
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /* Dummy functions, currently not in Use */
 #define SHOW_BOOT_PROGRESS(arg)
 #endif
 
-#define CMD_LINE_ADDR 0xFF900000  /* L1 scratchpad */
+#define CMD_LINE_ADDR 0xFF900000       /* L1 scratchpad */
 
 #ifdef SHARED_RESOURCES
-       extern void swap_to(int device_id);
+extern void swap_to(int device_id);
 #endif
 
+extern image_header_t header;
+extern void flush_instruction_cache(void);
+extern void flush_data_cache(void);
 static char *make_command_line(void);
 
-extern image_header_t header;
-extern int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
 void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
                    ulong addr, ulong * len_ptr, int verify)
 {
-       int (*appl)(char *cmdline);
+       int (*appl) (char *cmdline);
        char *cmdline;
 
 #ifdef SHARED_RESOURCES
@@ -66,26 +67,26 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
        appl = (int (*)(char *))ntohl(header.ih_ep);
        printf("Starting Kernel at = %x\n", appl);
        cmdline = make_command_line();
-       if(icache_status()){
+       if (icache_status()) {
                flush_instruction_cache();
                icache_disable();
-               }
-       if(dcache_status()){
+       }
+       if (dcache_status()) {
                flush_data_cache();
                dcache_disable();
-               }
-       (*appl)(cmdline);
+       }
+       (*appl) (cmdline);
 }
 
 char *make_command_line(void)
 {
-    char *dest = (char *) CMD_LINE_ADDR;
-    char *bootargs;
+       char *dest = (char *)CMD_LINE_ADDR;
+       char *bootargs;
 
-    if ( (bootargs = getenv("bootargs")) == NULL )
-       return NULL;
+       if ((bootargs = getenv("bootargs")) == NULL)
+               return NULL;
 
-    strncpy(dest, bootargs, 0x1000);
-    dest[0xfff] = 0;
-    return dest;
+       strncpy(dest, bootargs, 0x1000);
+       dest[0xfff] = 0;
+       return dest;
 }
index c8b1a3a9833de288bd77abff2713bfd6bc8d76ec..1553f1b5ac491b1fa1c41536e8fa55dedaed6b39 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - bf533_string.c Contains library routines.
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <asm/setup.h>
-#include <asm/page.h>
-#include <asm/cpu/defBF533.h>
-
-void *dma_memcpy(void *,const void *,size_t);
+#include <config.h>
+#include <asm/blackfin.h>
+#include <asm/io.h>
+#include "cache.h"
 
 char *strcpy(char *dest, const char *src)
 {
@@ -38,11 +38,11 @@ char *strcpy(char *dest, const char *src)
        char temp = 0;
 
        __asm__ __volatile__
-               ("1:\t%2 = B [%1++] (Z);\n\t"
-               "B [%0++] = %2;\n\t"
-               "CC = %2;\n\t"
-               "if cc jump 1b (bp);\n":"=a"(dest), "=a"(src), "=d"(temp)
-               :"0"(dest), "1"(src), "2"(temp):"memory");
+           ("1:\t%2 = B [%1++] (Z);\n\t"
+            "B [%0++] = %2;\n\t"
+            "CC = %2;\n\t"
+            "if cc jump 1b (bp);\n":"=a"(dest), "=a"(src), "=d"(temp)
+            :"0"(dest), "1"(src), "2"(temp):"memory");
 
        return xdest;
 }
@@ -56,16 +56,16 @@ char *strncpy(char *dest, const char *src, size_t n)
                return xdest;
 
        __asm__ __volatile__
-               ("1:\t%3 = B [%1++] (Z);\n\t"
-               "B [%0++] = %3;\n\t"
-               "CC = %3;\n\t"
-               "if ! cc jump 2f;\n\t"
-               "%2 += -1;\n\t"
-               "CC = %2 == 0;\n\t"
-               "if ! cc jump 1b (bp);\n"
-               "2:\n":"=a"(dest), "=a"(src), "=da"(n), "=d"(temp)
-               :"0"(dest), "1"(src), "2"(n), "3"(temp)
-               :"memory");
+           ("1:\t%3 = B [%1++] (Z);\n\t"
+            "B [%0++] = %3;\n\t"
+            "CC = %3;\n\t"
+            "if ! cc jump 2f;\n\t"
+            "%2 += -1;\n\t"
+            "CC = %2 == 0;\n\t"
+            "if ! cc jump 1b (bp);\n"
+            "2:\n":"=a"(dest), "=a"(src), "=da"(n), "=d"(temp)
+            :"0"(dest), "1"(src), "2"(n), "3"(temp)
+            :"memory");
 
        return xdest;
 }
@@ -74,18 +74,16 @@ int strcmp(const char *cs, const char *ct)
 {
        char __res1, __res2;
 
-       __asm__
-               ("1:\t%2 = B[%0++] (Z);\n\t"    /* get *cs */
-               "%3 = B[%1++] (Z);\n\t"         /* get *ct */
-               "CC = %2 == %3;\n\t"            /* compare a byte */
-               "if ! cc jump 2f;\n\t"          /* not equal, break out */
-               "CC = %2;\n\t"                  /* at end of cs? */
+       __asm__("1:\t%2 = B[%0++] (Z);\n\t"     /* get *cs */
+               "%3 = B[%1++] (Z);\n\t" /* get *ct */
+               "CC = %2 == %3;\n\t"    /* compare a byte */
+               "if ! cc jump 2f;\n\t"  /* not equal, break out */
+               "CC = %2;\n\t"  /* at end of cs? */
                "if cc jump 1b (bp);\n\t"       /* no, keep going */
-               "jump.s 3f;\n"                  /* strings are equal */
-               "2:\t%2 = %2 - %3;\n"           /* *cs - *ct */
-               "3:\n": "=a"(cs), "=a"(ct), "=d"(__res1),
-               "=d"(__res2)
-               : "0"(cs), "1"(ct));
+               "jump.s 3f;\n"  /* strings are equal */
+               "2:\t%2 = %2 - %3;\n"   /* *cs - *ct */
+      "3:\n":  "=a"(cs), "=a"(ct), "=d"(__res1), "=d"(__res2)
+      :        "0"(cs), "1"(ct));
 
        return __res1;
 }
@@ -97,24 +95,58 @@ int strncmp(const char *cs, const char *ct, size_t count)
        if (!count)
                return 0;
 
-       __asm__
-               ("1:\t%3 = B[%0++] (Z);\n\t"    /* get *cs */
-               "%4 = B[%1++] (Z);\n\t"         /* get *ct */
-               "CC = %3 == %4;\n\t"            /* compare a byte */
-               "if ! cc jump 3f;\n\t"          /* not equal, break out */
-               "CC = %3;\n\t"                  /* at end of cs? */
-               "if ! cc jump 4f;\n\t"          /* yes, all done */
-               "%2 += -1;\n\t"                 /* no, adjust count */
+       __asm__("1:\t%3 = B[%0++] (Z);\n\t"     /* get *cs */
+               "%4 = B[%1++] (Z);\n\t" /* get *ct */
+               "CC = %3 == %4;\n\t"    /* compare a byte */
+               "if ! cc jump 3f;\n\t"  /* not equal, break out */
+               "CC = %3;\n\t"  /* at end of cs? */
+               "if ! cc jump 4f;\n\t"  /* yes, all done */
+               "%2 += -1;\n\t" /* no, adjust count */
                "CC = %2 == 0;\n\t" "if ! cc jump 1b;\n"        /* more to do, keep going */
-               "2:\t%3 = 0;\n\t"               /* strings are equal */
+               "2:\t%3 = 0;\n\t"       /* strings are equal */
                "jump.s    4f;\n" "3:\t%3 = %3 - %4;\n" /* *cs - *ct */
-               "4:":   "=a"(cs), "=a"(ct), "=da"(count), "=d"(__res1),
+      "4:":    "=a"(cs), "=a"(ct), "=da"(count), "=d"(__res1),
                "=d"(__res2)
-               : "0"(cs), "1"(ct), "2"(count));
+      :        "0"(cs), "1"(ct), "2"(count));
 
        return __res1;
 }
 
+static void *dma_memcpy(void *dest, const void *src, size_t count)
+{
+       *pMDMA_D0_IRQ_STATUS = DMA_DONE | DMA_ERR;
+
+       /* Copy sram functions from sdram to sram */
+       /* Setup destination start address */
+       *pMDMA_D0_START_ADDR = (volatile void **)dest;
+       /* Setup destination xcount */
+       *pMDMA_D0_X_COUNT = count;
+       /* Setup destination xmodify */
+       *pMDMA_D0_X_MODIFY = 1;
+
+       /* Setup Source start address */
+       *pMDMA_S0_START_ADDR = (volatile void **)src;
+       /* Setup Source xcount */
+       *pMDMA_S0_X_COUNT = count;
+       /* Setup Source xmodify */
+       *pMDMA_S0_X_MODIFY = 1;
+
+       /* Enable source DMA */
+       *pMDMA_S0_CONFIG = (DMAEN);
+       sync();
+
+       *pMDMA_D0_CONFIG = (WNR | DMAEN);
+
+       while (*pMDMA_D0_IRQ_STATUS & DMA_RUN) {
+               *pMDMA_D0_IRQ_STATUS |= (DMA_DONE | DMA_ERR);
+       }
+       *pMDMA_D0_IRQ_STATUS |= (DMA_DONE | DMA_ERR);
+
+       dest += count;
+       src += count;
+       return dest;
+}
+
 /*
  * memcpy - Copy one area of memory to another
  * @dest: Where to copy to
@@ -124,62 +156,30 @@ int strncmp(const char *cs, const char *ct, size_t count)
  * You should not use this function to access IO space, use memcpy_toio()
  * or memcpy_fromio() instead.
  */
-void * memcpy(void * dest,const void *src,size_t count)
+extern void *memcpy_ASM(void *dest, const void *src, size_t count);
+void *memcpy(void *dest, const void *src, size_t count)
 {
        char *tmp = (char *) dest, *s = (char *) src;
 
-/* Turn off the cache, if destination in the L1 memory */
-       if ( (tmp >= (char *)L1_ISRAM) && (tmp < (char *)L1_ISRAM_END)
-               || (tmp >= (char *)DATA_BANKA_SRAM) && (tmp < DATA_BANKA_SRAM_END)
-           || (tmp >= (char *)DATA_BANKB_SRAM) && (tmp < DATA_BANKB_SRAM_END) ){
-                       if(icache_status()){
-                                       blackfin_icache_flush_range(src, src+count);
-                                       icache_disable();
-                       }
-                       if(dcache_status()){
-                                       blackfin_dcache_flush_range(src, src+count);
-                                       dcache_disable();
-                       }
-                       dma_memcpy(dest,src,count);
-       }else{
-               while(count--)
-                       *tmp++ = *s++;
+       if (dcache_status()) {
+               blackfin_dcache_flush_range(src, src+count);
        }
-       return dest;
-}
-
-void *dma_memcpy(void * dest,const void *src,size_t count)
-{
-
-               *pMDMA_D0_IRQ_STATUS = DMA_DONE | DMA_ERR;
-
-               /* Copy sram functions from sdram to sram */
-               /* Setup destination start address */
-               *pMDMA_D0_START_ADDR = (volatile void **)dest;
-               /* Setup destination xcount */
-               *pMDMA_D0_X_COUNT = count ;
-               /* Setup destination xmodify */
-               *pMDMA_D0_X_MODIFY = 1;
-
-               /* Setup Source start address */
-               *pMDMA_S0_START_ADDR = (volatile void **)src;
-               /* Setup Source xcount */
-               *pMDMA_S0_X_COUNT = count;
-               /* Setup Source xmodify */
-               *pMDMA_S0_X_MODIFY = 1;
-
-               /* Enable source DMA */
-               *pMDMA_S0_CONFIG = (DMAEN);
-               asm("ssync;");
-
-               *pMDMA_D0_CONFIG = ( WNR | DMAEN);
-
-               while(*pMDMA_D0_IRQ_STATUS & DMA_RUN){
-                       *pMDMA_D0_IRQ_STATUS |= (DMA_DONE | DMA_ERR);
+       /* L1_ISRAM can only be accessed via dma */
+       if ((tmp >= (char *)L1_ISRAM) && (tmp < (char *)L1_ISRAM_END)) {
+               /* L1 is the destination */
+               dma_memcpy(dest,src,count);
+       } else if ((s >= (char *)L1_ISRAM) && (s < (char *)L1_ISRAM_END)) {
+               /* L1 is the source */
+               dma_memcpy(dest,src,count);
+
+               if (icache_status()) {
+                       blackfin_icache_flush_range(dest, dest+count);
                }
-               *pMDMA_D0_IRQ_STATUS |= (DMA_DONE | DMA_ERR);
-
-               dest += count;
-               src  += count;
-               return dest;
+               if (dcache_status()) {
+                       blackfin_dcache_invalidate_range(dest, dest+count);
+               }
+       } else {
+               memcpy_ASM(dest,src,count);
+       }
+       return dest;
 }
index 31c16a20fe188cd89a2bdf783ce1dbdfea5b3497..1353421c33da3aa0fa9076534677c2faa28e554b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - blackfin_board.h
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #ifndef __BLACKFIN_BOARD_H__
 #define __BLACKFIN_BOARD_H__
 
+#include <version.h>
+
 extern void timer_init(void);
 extern void init_IRQ(void);
 extern void rtc_init(void);
index d9dc2b6d0cf9a254bf422b7375cfe256c65eae2f..1538da3f29a6f6a0317e9ff7d75d23322baf0161 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - board.c First C file to be called contains init routines
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -21,8 +21,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 #include <common.h>
 #include <version.h>
 #include <net.h>
 #include <environment.h>
+#include <i2c.h>
 #include "blackfin_board.h"
+#include <asm/cplb.h>
 #include "../drivers/smc91111.h"
 
-DECLARE_GLOBAL_DATA_PTR;
+#if defined(CONFIG_BF537)&&defined(CONFIG_POST)
+#include <post.h>
+int post_flag;
+#endif
 
+#ifndef CFG_NO_FLASH
 extern flash_info_t flash_info[];
+#endif
+
+static inline u_long get_vco(void)
+{
+       u_long msel;
+       u_long vco;
 
+       msel = (*pPLL_CTL >> 9) & 0x3F;
+       if (0 == msel)
+               msel = 64;
+
+       vco = CONFIG_CLKIN_HZ;
+       vco >>= (1 & *pPLL_CTL);        /* DF bit */
+       vco = msel * vco;
+       return vco;
+}
+
+/*Get the Core clock*/
+u_long get_cclk(void)
+{
+       u_long csel, ssel;
+       if (*pPLL_STAT & 0x1)
+               return CONFIG_CLKIN_HZ;
+
+       ssel = *pPLL_DIV;
+       csel = ((ssel >> 4) & 0x03);
+       ssel &= 0xf;
+       if (ssel && ssel < (1 << csel)) /* SCLK > CCLK */
+               return get_vco() / ssel;
+       return get_vco() >> csel;
+}
+
+/* Get the System clock */
+u_long get_sclk(void)
+{
+       u_long ssel;
+
+       if (*pPLL_STAT & 0x1)
+               return CONFIG_CLKIN_HZ;
+
+       ssel = (*pPLL_DIV & 0xf);
+
+       return get_vco() / ssel;
+}
 
 static void mem_malloc_init(void)
 {
        mem_malloc_start = CFG_MALLOC_BASE;
        mem_malloc_end = (CFG_MALLOC_BASE + CFG_MALLOC_LEN);
        mem_malloc_brk = mem_malloc_start;
-       memset((void *) mem_malloc_start, 0,
-       mem_malloc_end - mem_malloc_start);
+       memset((void *)mem_malloc_start, 0, mem_malloc_end - mem_malloc_start);
 }
 
 void *sbrk(ptrdiff_t increment)
@@ -59,7 +107,7 @@ void *sbrk(ptrdiff_t increment)
        }
        mem_malloc_brk = new;
 
-       return ((void *) old);
+       return ((void *)old);
 }
 
 static int display_banner(void)
@@ -78,17 +126,20 @@ static void display_flash_config(ulong size)
 
 static int init_baudrate(void)
 {
-       uchar tmp[64];
+       DECLARE_GLOBAL_DATA_PTR;
+
+       char tmp[64];
        int i = getenv_r("baudrate", tmp, sizeof(tmp));
        gd->bd->bi_baudrate = gd->baudrate = (i > 0)
-               ? (int) simple_strtoul(tmp, NULL, 10)
-               : CONFIG_BAUDRATE;
+           ? (int)simple_strtoul(tmp, NULL, 10)
+           : CONFIG_BAUDRATE;
        return (0);
 }
 
 #ifdef DEBUG
 static void display_global_data(void)
 {
+       DECLARE_GLOBAL_DATA_PTR;
        bd_t *bd;
        bd = gd->bd;
        printf("--flags:%x\n", gd->flags);
@@ -103,12 +154,10 @@ static void display_global_data(void)
        printf("---bi_baudrate:%x\n", bd->bi_baudrate);
        printf("---bi_ip_addr:%x\n", bd->bi_ip_addr);
        printf("---bi_enetaddr:%x %x %x %x %x %x\n",
-                               bd->bi_enetaddr[0],
-                               bd->bi_enetaddr[1],
-                               bd->bi_enetaddr[2],
-                               bd->bi_enetaddr[3],
-                               bd->bi_enetaddr[4],
-                               bd->bi_enetaddr[5]);
+              bd->bi_enetaddr[0],
+              bd->bi_enetaddr[1],
+              bd->bi_enetaddr[2],
+              bd->bi_enetaddr[3], bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
        printf("---bi_arch_number:%x\n", bd->bi_arch_number);
        printf("---bi_boot_params:%x\n", bd->bi_boot_params);
        printf("---bi_memstart:%x\n", bd->bi_memstart);
@@ -120,6 +169,78 @@ static void display_global_data(void)
 }
 #endif
 
+/* we cover everything with 4 meg pages, and need an extra for L1 */
+unsigned int icplb_table[page_descriptor_table_size][2];
+unsigned int dcplb_table[page_descriptor_table_size][2];
+
+void init_cplbtables(void)
+{
+       int i, j;
+
+       j = 0;
+       icplb_table[j][0] = 0xFFA00000;
+       icplb_table[j][1] = L1_IMEMORY;
+       j++;
+
+       for (i = 0; i < CONFIG_MEM_SIZE / 4; i++) {
+               icplb_table[j][0] = (i * 4 * 1024 * 1024);
+               if (i * 4 * 1024 * 1024 <= CFG_MONITOR_BASE
+                   && (i + 1) * 4 * 1024 * 1024 >= CFG_MONITOR_BASE) {
+                       icplb_table[j][1] = SDRAM_IKERNEL;
+               } else {
+                       icplb_table[j][1] = SDRAM_IGENERIC;
+               }
+               j++;
+       }
+#if defined(CONFIG_BF561)
+       /* MAC space */
+       icplb_table[j][0] = 0x2C000000;
+       icplb_table[j][1] = SDRAM_INON_CHBL;
+       j++;
+       /* Async Memory space */
+       for (i = 0; i < 3; i++) {
+               icplb_table[j][0] = 0x20000000 + i * 4 * 1024 * 1024;
+               icplb_table[j][1] = SDRAM_INON_CHBL;
+               j++;
+       }
+#else
+       icplb_table[j][0] = 0x20000000;
+       icplb_table[j][1] = SDRAM_INON_CHBL;
+#endif
+       j = 0;
+       dcplb_table[j][0] = 0xFF800000;
+       dcplb_table[j][1] = L1_DMEMORY;
+       j++;
+
+       for (i = 0; i < CONFIG_MEM_SIZE / 4; i++) {
+               dcplb_table[j][0] = (i * 4 * 1024 * 1024);
+               if (i * 4 * 1024 * 1024 <= CFG_MONITOR_BASE
+                   && (i + 1) * 4 * 1024 * 1024 >= CFG_MONITOR_BASE) {
+                       dcplb_table[j][1] = SDRAM_DKERNEL;
+               } else {
+                       dcplb_table[j][1] = SDRAM_DGENERIC;
+               }
+               j++;
+       }
+
+#if defined(CONFIG_BF561)
+       /* MAC space */
+       dcplb_table[j][0] = 0x2C000000;
+       dcplb_table[j][1] = SDRAM_EBIU;
+       j++;
+
+       /* Flash space */
+       for (i = 0; i < 3; i++) {
+               dcplb_table[j][0] = 0x20000000 + i * 4 * 1024 * 1024;
+               dcplb_table[j][1] = SDRAM_EBIU;
+               j++;
+       }
+#else
+       dcplb_table[j][0] = 0x20000000;
+       dcplb_table[j][1] = SDRAM_EBIU;
+#endif
+}
+
 /*
  * All attempts to come up with a "common" initialization sequence
  * that works for all boards and architectures failed: some of the
@@ -135,20 +256,24 @@ static void display_global_data(void)
 
 void board_init_f(ulong bootflag)
 {
+       DECLARE_GLOBAL_DATA_PTR;
        ulong addr;
        bd_t *bd;
+       int i;
+
+       init_cplbtables();
 
        gd = (gd_t *) (CFG_GBL_DATA_ADDR);
-       memset((void *) gd, 0, sizeof(gd_t));
+       memset((void *)gd, 0, sizeof(gd_t));
 
        /* Board data initialization */
        addr = (CFG_GBL_DATA_ADDR + sizeof(gd_t));
 
        /* Align to 4 byte boundary */
        addr &= ~(4 - 1);
-       bd = (bd_t*)addr;
+       bd = (bd_t *) addr;
        gd->bd = bd;
-       memset((void *) bd, 0, sizeof(bd_t));
+       memset((void *)bd, 0, sizeof(bd_t));
 
        /* Initialize */
        init_IRQ();
@@ -156,21 +281,51 @@ void board_init_f(ulong bootflag)
        init_baudrate();        /* initialze baudrate settings */
        serial_init();          /* serial communications setup */
        console_init_f();
+#ifdef CONFIG_ICACHE_ON
+       icache_enable();
+#endif
+#ifdef CONFIG_DCACHE_ON
+       dcache_enable();
+#endif
        display_banner();       /* say that we are here */
+
+       for (i = 0; i < page_descriptor_table_size; i++) {
+               debug
+                   ("data (%02i)= 0x%08x : 0x%08x    intr = 0x%08x : 0x%08x\n",
+                    i, dcplb_table[i][0], dcplb_table[i][1], icplb_table[i][0],
+                    icplb_table[i][1]);
+       }
+
        checkboard();
 #if defined(CONFIG_RTC_BF533) && (CONFIG_COMMANDS & CFG_CMD_DATE)
        rtc_init();
 #endif
        timer_init();
-       printf("Clock: VCO: %lu MHz, Core: %lu MHz, System: %lu MHz\n", \
-       CONFIG_VCO_HZ/1000000, CONFIG_CCLK_HZ/1000000, CONFIG_SCLK_HZ/1000000);
+       printf("Clock: VCO: %lu MHz, Core: %lu MHz, System: %lu MHz\n",
+              get_vco() / 1000000, get_cclk() / 1000000, get_sclk() / 1000000);
        printf("SDRAM: ");
        print_size(initdram(0), "\n");
+#if defined(CONFIG_BF537)&&defined(CONFIG_POST)
+       post_init_f();
+       post_bootmode_init();
+       post_run(NULL, POST_ROM | post_bootmode_get(0));
+#endif
        board_init_r((gd_t *) gd, 0x20000010);
 }
 
+#if defined(CONFIG_SOFT_I2C) || defined(CONFIG_HARD_I2C)
+static int init_func_i2c(void)
+{
+       puts("I2C:   ");
+       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+       puts("ready\n");
+       return (0);
+}
+#endif
+
 void board_init_r(gd_t * id, ulong dest_addr)
 {
+       DECLARE_GLOBAL_DATA_PTR;
        ulong size;
        extern void malloc_bin_reloc(void);
        char *s, *e;
@@ -180,12 +335,18 @@ void board_init_r(gd_t * id, ulong dest_addr)
        gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
        bd = gd->bd;
 
-#if    CONFIG_STAMP
+#if    defined(CONFIG_BF537) && defined(CONFIG_POST)
+       post_output_backlog();
+       post_reloc();
+#endif
+
+#if    (CONFIG_STAMP || CONFIG_BF537 || CONFIG_EZKIT561) && !defined(CFG_NO_FLASH)
        /* There are some other pointer constants we must deal with */
        /* configure available FLASH banks */
        size = flash_init();
        display_flash_config(size);
-       flash_protect(FLAG_PROTECT_SET, CFG_FLASH_BASE, CFG_FLASH_BASE + 0x1ffff, &flash_info[0]);
+       flash_protect(FLAG_PROTECT_SET, CFG_FLASH_BASE,
+                     CFG_FLASH_BASE + 0x1ffff, &flash_info[0]);
        bd->bi_flashstart = CFG_FLASH_BASE;
        bd->bi_flashsize = size;
        bd->bi_flashoffset = 0;
@@ -198,6 +359,13 @@ void board_init_r(gd_t * id, ulong dest_addr)
        mem_malloc_init();
        malloc_bin_reloc();
 
+#ifdef CONFIG_SPI
+# if ! defined(CFG_ENV_IS_IN_EEPROM)
+       spi_init_f();
+# endif
+       spi_init_r();
+#endif
+
        /* relocate environment function pointers etc. */
        env_relocate();
 
@@ -228,18 +396,30 @@ void board_init_r(gd_t * id, ulong dest_addr)
                copy_filename(BootFile, s, sizeof(BootFile));
        }
 #endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_NAND)
+       puts("NAND:  ");
+       nand_init();            /* go init the NAND */
+#endif
+
 #if defined(CONFIG_MISC_INIT_R)
        /* miscellaneous platform dependent initialisations */
        misc_init_r();
 #endif
 
+#if ((BFIN_CPU == ADSP_BF537) || (BFIN_CPU == ADSP_BF536))
+       printf("Net:    ");
+       eth_initialize(bd);
+#endif
+
 #ifdef CONFIG_DRIVER_SMC91111
 #ifdef SHARED_RESOURCES
        /* Switch to Ethernet */
        swap_to(ETHERNET);
 #endif
-       if  ( (SMC_inw(BANK_SELECT) & UPPER_BYTE_MASK) != SMC_IDENT ) {
-               printf("ERROR: Can't find SMC91111 at address %x\n", SMC_BASE_ADDRESS);
+       if ((SMC_inw(BANK_SELECT) & UPPER_BYTE_MASK) != SMC_IDENT) {
+               printf("ERROR: Can't find SMC91111 at address %x\n",
+                      SMC_BASE_ADDRESS);
        } else {
                printf("Net:   SMC91111 at 0x%08X\n", SMC_BASE_ADDRESS);
        }
@@ -248,12 +428,17 @@ void board_init_r(gd_t * id, ulong dest_addr)
        swap_to(FLASH);
 #endif
 #endif
-#ifdef CONFIG_SOFT_I2C
+#if defined(CONFIG_SOFT_I2C) || defined(CONFIG_HARD_I2C)
        init_func_i2c();
 #endif
 
 #ifdef DEBUG
-       display_global_data(void);
+       display_global_data();
+#endif
+
+#if defined(CONFIG_BF537) && defined(CONFIG_POST)
+       if (post_flag)
+               post_run(NULL, POST_RAM | post_bootmode_get(0));
 #endif
 
        /* main_loop() can return to retry autoboot, if so just run it again. */
@@ -262,18 +447,8 @@ void board_init_r(gd_t * id, ulong dest_addr)
        }
 }
 
-#ifdef CONFIG_SOFT_I2C
-static int init_func_i2c (void)
-{
-       puts ("I2C:   ");
-       i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);
-       puts ("ready\n");
-       return (0);
-}
-#endif
-
 void hang(void)
 {
        puts("### ERROR ### Please RESET the board ###\n");
-       for (;;);
+       for (;;) ;
 }
index 847278d226ed3114bfd709d28878b2786c27c26e..9d71bcb5474712c7ea24f5eb42f789520319baf4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - cache.c
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * (C) Copyright 2000-2004
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /* for now: just dummy functions to satisfy the linker */
-extern void blackfin_icache_range (unsigned long *, unsigned long *);
-extern void blackfin_dcache_range (unsigned long *, unsigned long *);
-void flush_cache (unsigned long dummy1, unsigned long dummy2)
+#include <config.h>
+#include <common.h>
+#include <asm/blackfin.h>
+#include "cache.h"
+
+void flush_cache(unsigned long dummy1, unsigned long dummy2)
 {
-       if (icache_status ()) {
-               blackfin_icache_flush_range (dummy1, dummy1 + dummy2);
-       }
-       if (dcache_status ()) {
-               blackfin_dcache_flush_range (dummy1, dummy1 + dummy2);
-       }
+       if ((dummy1 >= L1_ISRAM) && (dummy1 < L1_ISRAM_END))
+               return;
+       if ((dummy1 >= DATA_BANKA_SRAM) && (dummy1 < DATA_BANKA_SRAM_END))
+               return;
+       if ((dummy1 >= DATA_BANKB_SRAM) && (dummy1 < DATA_BANKB_SRAM_END))
+               return;
+
+       if (icache_status())
+               blackfin_icache_flush_range((void*)dummy1, (void*)(dummy1 + dummy2));
+       if (dcache_status())
+               blackfin_dcache_flush_range((void*)dummy1, (void*)(dummy1 + dummy2));
+
        return;
 }
diff --git a/lib_blackfin/cache.h b/lib_blackfin/cache.h
new file mode 100644 (file)
index 0000000..3ea6809
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * U-boot - prototypes for cache handling functions.
+ *
+ * Copyright (c) 2005-2007 Analog Devices Inc.
+ *
+ * (C) Copyright 2000-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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef _LIB_BLACKFIN_CACHE_H_
+#define _LIB_BLACKFIN_CACHE_H_
+
+extern void blackfin_icache_flush_range(const void *, const void *);
+extern void blackfin_dcache_flush_range(const void *, const void *);
+extern void blackfin_dcache_invalidate_range(const void *, const void *);
+
+#endif
diff --git a/lib_blackfin/memcmp.S b/lib_blackfin/memcmp.S
new file mode 100644 (file)
index 0000000..9b58832
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * File: memcmp.S
+ *
+ * Copyright 2004-2007 Analog Devices Inc.
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+.align 2
+
+/*
+ * C Library function MEMCMP
+ * R0 = First Address
+ * R1 = Second Address
+ * R2 = count
+ * Favours word aligned data.
+ */
+
+.globl _memcmp;
+_memcmp:
+       I1 = P3;
+       P0 = R0;                        /* P0 = s1 address */
+       P3 = R1;                        /* P3 = s2 Address  */
+       P2 = R2 ;                       /* P2 = count */
+       CC = R2 <= 7(IU);
+       IF CC JUMP  .Ltoo_small;
+       I0 = R1;                        /* s2 */
+       R1 = R1 | R0;           /* OR addresses together */
+       R1 <<= 30;              /* check bottom two bits */
+       CC =  AZ;                       /* AZ set if zero. */
+       IF !CC JUMP  .Lbytes ;  /* Jump if addrs not aligned. */
+
+       P1 = P2 >> 2;           /* count = n/4 */
+       R3 =  3;
+       R2 = R2 & R3;           /* remainder */
+       P2 = R2;                        /* set remainder */
+
+       LSETUP (.Lquad_loop_s , .Lquad_loop_e) LC0=P1;
+.Lquad_loop_s:
+       NOP;
+       R0 = [P0++];
+       R1 = [I0++];
+       CC = R0 == R1;
+       IF !CC JUMP .Lquad_different;
+.Lquad_loop_e:
+       NOP;
+
+       P3 = I0;                        /* s2 */
+.Ltoo_small:
+       CC = P2 == 0;           /* Check zero count*/
+       IF CC JUMP .Lfinished;  /* very unlikely*/
+
+.Lbytes:
+       LSETUP (.Lbyte_loop_s , .Lbyte_loop_e) LC0=P2;
+.Lbyte_loop_s:
+       R1 = B[P3++](Z);        /* *s2 */
+       R0 = B[P0++](Z);        /* *s1 */
+       CC = R0 == R1;
+       IF !CC JUMP .Ldifferent;
+.Lbyte_loop_e:
+       NOP;
+
+.Ldifferent:
+       R0 = R0 - R1;
+       P3 = I1;
+       RTS;
+
+.Lquad_different:
+/* We've read two quads which don't match.
+ * Can't just compare them, because we're
+ * a little-endian machine, so the MSBs of
+ * the regs occur at later addresses in the
+ * string.
+ * Arrange to re-read those two quads again,
+ * byte-by-byte.
+ */
+       P0 += -4;               /* back up to the start of the */
+       P3 = I0;                /* quads, and increase the*/
+       P2 += 4;                /* remainder count*/
+       P3 += -4;
+       JUMP .Lbytes;
+
+.Lfinished:
+       R0 = 0;
+       P3 = I1;
+       RTS;
diff --git a/lib_blackfin/memcpy.S b/lib_blackfin/memcpy.S
new file mode 100644 (file)
index 0000000..24577be
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * File: memcpy.S
+ *
+ * Copyright 2004-2007 Analog Devices Inc.
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+.align 2
+
+.globl _memcpy_ASM;
+_memcpy_ASM:
+       CC = R2 <=  0;  /* length not positive?*/
+       IF CC JUMP  .L_P1L2147483647;   /* Nothing to do */
+
+       P0 = R0 ;       /* dst*/
+       P1 = R1 ;       /* src*/
+       P2 = R2 ;       /* length */
+
+       /* check for overlapping data */
+       CC = R1 < R0;   /* src < dst */
+       IF !CC JUMP .Lno_overlap;
+       R3 = R1 + R2;
+       CC = R0 < R3;   /* and dst < src+len */
+       IF CC JUMP .Lhas_overlap;
+
+.Lno_overlap:
+       /* Check for aligned data.*/
+
+       R3 = R1 | R0;
+       R0 = 0x3;
+       R3 = R3 & R0;
+       CC = R3;        /* low bits set on either address? */
+       IF CC JUMP .Lnot_aligned;
+
+       /* Both addresses are word-aligned, so we can copy
+       at least part of the data using word copies.*/
+       P2 = P2 >> 2;
+       CC = P2 <= 2;
+       IF !CC JUMP .Lmore_than_seven;
+       /* less than eight bytes... */
+       P2 = R2;
+       LSETUP(.Lthree_start, .Lthree_end) LC0=P2;
+       R0 = R1;        /* setup src address for return */
+.Lthree_start:
+       R3 = B[P1++] (X);
+.Lthree_end:
+       B[P0++] = R3;
+
+       RTS;
+
+.Lmore_than_seven:
+       /* There's at least eight bytes to copy. */
+       P2 += -1;       /* because we unroll one iteration */
+       LSETUP(.Lword_loop, .Lword_loop) LC0=P2;
+       R0 = R1;
+       I1 = P1;
+       R3 = [I1++];
+.Lword_loop:
+       MNOP || [P0++] = R3 || R3 = [I1++];
+
+       [P0++] = R3;
+       /* Any remaining bytes to copy? */
+       R3 = 0x3;
+       R3 = R2 & R3;
+       CC = R3 == 0;
+       P1 = I1;        /* in case there's something left, */
+       IF !CC JUMP .Lbytes_left;
+       RTS;
+.Lbytes_left:  P2 = R3;
+.Lnot_aligned:
+       /* From here, we're copying byte-by-byte. */
+       LSETUP (.Lbyte_start , .Lbyte_end) LC0=P2;
+       R0 = R1;        /* Save src address for return */
+.Lbyte_start:
+       R1 = B[P1++] (X);
+.Lbyte_end:
+       B[P0++] = R1;
+
+.L_P1L2147483647:
+       RTS;
+
+.Lhas_overlap:
+/* Need to reverse the copying, because the
+ * dst would clobber the src.
+ * Don't bother to work out alignment for
+ * the reverse case.
+ */
+       R0 = R1;        /* save src for later. */
+       P0 = P0 + P2;
+       P0 += -1;
+       P1 = P1 + P2;
+       P1 += -1;
+       LSETUP(.Lover_start, .Lover_end) LC0=P2;
+.Lover_start:
+       R1 = B[P1--] (X);
+.Lover_end:
+       B[P0--] = R1;
+
+       RTS;
diff --git a/lib_blackfin/memmove.S b/lib_blackfin/memmove.S
new file mode 100644 (file)
index 0000000..46f79ed
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * File: memmove.S
+ *
+ * Copyright 2004-2007 Analog Devices Inc.
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+.align 2
+
+/*
+ * C Library function MEMMOVE
+ * R0 = To Address (leave unchanged to form result)
+ * R1 = From Address
+ * R2 = count
+ * Data may overlap
+ */
+
+.globl _memmove;
+_memmove:
+       I1 = P3;
+       P0 = R0;                  /* P0 = To address */
+       P3 = R1;                  /* P3 = From Address */
+       P2 = R2 ;                 /* P2 = count */
+       CC = P2 == 0;             /* Check zero count*/
+       IF CC JUMP .Lfinished;    /* very unlikely */
+
+       CC = R1 < R0 (IU);        /* From < To */
+       IF !CC JUMP .Lno_overlap;
+       R3 = R1 + R2;
+       CC = R0 <= R3 (IU);       /* (From+len) >= To */
+       IF CC JUMP .Loverlap;
+.Lno_overlap:
+       R3 = 11;
+       CC = R2 <= R3;
+       IF CC JUMP  .Lbytes;
+       R3 = R1 | R0;             /* OR addresses together */
+       R3 <<= 30;                /* check bottom two bits */
+       CC =  AZ;                 /* AZ set if zero.*/
+       IF !CC JUMP  .Lbytes ;    /* Jump if addrs not aligned.*/
+
+       I0 = P3;
+       P1 = P2 >> 2;             /* count = n/4 */
+       P1 += -1;
+       R3 =  3;
+       R2 = R2 & R3;             /* remainder */
+       P2 = R2;                  /* set remainder */
+       R1 = [I0++];
+
+       LSETUP (.Lquad_loop , .Lquad_loop) LC0=P1;
+.Lquad_loop: MNOP || [P0++] = R1 || R1 = [I0++];
+       [P0++] = R1;
+
+       CC = P2 == 0;             /* any remaining bytes? */
+       P3 = I0;                  /* Ammend P3 to updated ptr. */
+       IF !CC JUMP .Lbytes;
+       P3 = I1;
+       RTS;
+
+.Lbytes:     LSETUP (.Lbyte2_s , .Lbyte2_e) LC0=P2;
+.Lbyte2_s:   R1 = B[P3++](Z);
+.Lbyte2_e:   B[P0++] = R1;
+
+.Lfinished:  P3 = I1;
+       RTS;
+
+.Loverlap:
+       P2 += -1;
+       P0 = P0 + P2;
+       P3 = P3 + P2;
+       R1 = B[P3--] (Z);
+       CC = P2 == 0;
+       IF CC JUMP .Lno_loop;
+       LSETUP (.Lol_s, .Lol_e) LC0 = P2;
+.Lol_s:    B[P0--] = R1;
+.Lol_e:    R1 = B[P3--] (Z);
+.Lno_loop: B[P0] = R1;
+       P3 = I1;
+       RTS;
diff --git a/lib_blackfin/memset.S b/lib_blackfin/memset.S
new file mode 100644 (file)
index 0000000..c33c551
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * File: memset.S
+ *
+ * Copyright 2004-2007 Analog Devices Inc.
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+.align 2
+
+/*
+ * C Library function MEMSET
+ * R0 = address (leave unchanged to form result)
+ * R1 = filler byte
+ * R2 = count
+ * Favours word aligned data.
+ */
+
+.globl _memset;
+_memset:
+       P0 = R0 ;              /* P0 = address */
+       P2 = R2 ;              /* P2 = count   */
+       R3 = R0 + R2;          /* end          */
+       CC = R2 <= 7(IU);
+       IF CC JUMP  .Ltoo_small;
+       R1 = R1.B (Z);         /* R1 = fill char */
+       R2 =  3;
+       R2 = R0 & R2;          /* addr bottom two bits */
+       CC =  R2 == 0;             /* AZ set if zero.   */
+       IF !CC JUMP  .Lforce_align ;  /* Jump if addr not aligned. */
+
+.Laligned:
+       P1 = P2 >> 2;          /* count = n/4        */
+       R2 = R1 <<  8;         /* create quad filler */
+       R2.L = R2.L + R1.L(NS);
+       R2.H = R2.L + R1.H(NS);
+       P2 = R3;
+
+       LSETUP (.Lquad_loop , .Lquad_loop) LC0=P1;
+.Lquad_loop:
+       [P0++] = R2;
+
+       CC = P0 == P2;
+       IF !CC JUMP .Lbytes_left;
+       RTS;
+
+.Lbytes_left:
+       R2 = R3;                /* end point */
+       R3 = P0;                /* current position */
+       R2 = R2 - R3;           /* bytes left */
+       P2 = R2;
+
+.Ltoo_small:
+       CC = P2 == 0;           /* Check zero count */
+       IF CC JUMP .Lfinished;    /* Unusual */
+
+.Lbytes:
+       LSETUP (.Lbyte_loop , .Lbyte_loop) LC0=P2;
+.Lbyte_loop:
+       B[P0++] = R1;
+
+.Lfinished:
+       RTS;
+
+.Lforce_align:
+       CC = BITTST (R0, 0);  /* odd byte */
+       R0 = 4;
+       R0 = R0 - R2;
+       P1 = R0;
+       R0 = P0;                    /* Recover return address */
+       IF !CC JUMP .Lskip1;
+       B[P0++] = R1;
+.Lskip1:
+       CC = R2 <= 2;          /* 2 bytes */
+       P2 -= P1;              /* reduce count */
+       IF !CC JUMP .Laligned;
+       B[P0++] = R1;
+       B[P0++] = R1;
+       JUMP .Laligned;
index 1fc34e3d932d49cce4ad5fe1c9f5ecd169bc896e..bf1ca535fa76c19326376b5b2486ba382fea8bbe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * U-boot - muldi3.c contains routines for mult and div
  *
- * Copyright (c) 2005 blackfin.uclinux.org
+ * Copyright (c) 2005-2007 Analog Devices Inc.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -18,8 +18,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
 /* Generic function got from GNU gcc package, libgcc2.c */
@@ -64,29 +64,29 @@ do {                                                                        \
        __w.ll; })
 #endif
 
-typedef unsigned int USItype    __attribute__ ((mode (SI)));
-typedef int SItype     __attribute__ ((mode (SI)));
-typedef int DItype     __attribute__ ((mode (DI)));
-typedef        int word_type __attribute__ ((mode (__word__)));
+typedef unsigned int USItype __attribute__ ((mode(SI)));
+typedef int SItype __attribute__ ((mode(SI)));
+typedef int DItype __attribute__ ((mode(DI)));
+typedef int word_type __attribute__ ((mode(__word__)));
 
-struct DIstruct {SItype low, high;};
-typedef union
-{
+struct DIstruct {
+       SItype low, high;
+};
+typedef union {
        struct DIstruct s;
        DItype ll;
 } DIunion;
 
-DItype __muldi3 (DItype u, DItype v)
+DItype __muldi3(DItype u, DItype v)
 {
        DIunion w;
        DIunion uu, vv;
 
-       uu.ll = u,
-       vv.ll = v;
+       uu.ll = u, vv.ll = v;
        /*  panic("kernel panic for __muldi3"); */
-       w.ll = __umulsidi3 (uu.s.low, vv.s.low);
+       w.ll = __umulsidi3(uu.s.low, vv.s.low);
        w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
-       + (USItype) uu.s.high * (USItype) vv.s.low);
+                    + (USItype) uu.s.high * (USItype) vv.s.low);
 
        return w.ll;
 }
diff --git a/lib_blackfin/post.c b/lib_blackfin/post.c
new file mode 100644 (file)
index 0000000..0e76026
--- /dev/null
@@ -0,0 +1,435 @@
+/*
+ * (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>
+#include <console.h>
+#include <watchdog.h>
+#include <post.h>
+
+#ifdef CONFIG_LOGBUFFER
+#include <logbuff.h>
+#endif
+
+#ifdef CONFIG_POST
+
+#define POST_MAX_NUMBER                32
+
+#define BOOTMODE_MAGIC 0xDEAD0000
+
+int post_init_f(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       int res = 0;
+       unsigned int i;
+
+       for (i = 0; i < post_list_size; i++) {
+               struct post_test *test = post_list + i;
+
+               if (test->init_f && test->init_f()) {
+                       res = -1;
+               }
+       }
+
+       gd->post_init_f_time = post_time_ms(0);
+       if (!gd->post_init_f_time) {
+               printf
+                   ("post/post.c: post_time_ms seems not to be implemented\n");
+       }
+
+       return res;
+}
+
+void post_bootmode_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       int bootmode = post_bootmode_get(0);
+       int newword;
+
+       if (post_hotkeys_pressed() && !(bootmode & POST_POWERTEST)) {
+               newword = BOOTMODE_MAGIC | POST_SLOWTEST;
+       } else if (bootmode == 0) {
+               newword = BOOTMODE_MAGIC | POST_POWERON;
+       } else if (bootmode == POST_POWERON || bootmode == POST_SLOWTEST) {
+               newword = BOOTMODE_MAGIC | POST_NORMAL;
+       } else {
+               /* Use old value */
+               newword = post_word_load() & ~POST_COLDBOOT;
+       }
+
+       if (bootmode == 0) {
+               /* We are booting after power-on */
+               newword |= POST_COLDBOOT;
+       }
+
+       post_word_store(newword);
+
+       /* Reset activity record */
+       gd->post_log_word = 0;
+}
+
+int post_bootmode_get(unsigned int *last_test)
+{
+       unsigned long word = post_word_load();
+       int bootmode;
+
+       if ((word & 0xFFFF0000) != BOOTMODE_MAGIC) {
+               return 0;
+       }
+
+       bootmode = word & 0x7F;
+
+       if (last_test && (bootmode & POST_POWERTEST)) {
+               *last_test = (word >> 8) & 0xFF;
+       }
+
+       return bootmode;
+}
+
+/* POST tests run before relocation only mark status bits .... */
+static void post_log_mark_start(unsigned long testid)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       gd->post_log_word |= (testid) << 16;
+}
+
+static void post_log_mark_succ(unsigned long testid)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       gd->post_log_word |= testid;
+}
+
+/* ... and the messages are output once we are relocated */
+void post_output_backlog(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       int j;
+
+       for (j = 0; j < post_list_size; j++) {
+               if (gd->post_log_word & (post_list[j].testid << 16)) {
+                       post_log("POST %s ", post_list[j].cmd);
+                       if (gd->post_log_word & post_list[j].testid)
+                               post_log("PASSED\n");
+                       else {
+                               post_log("FAILED\n");
+#ifdef CONFIG_SHOW_BOOT_PROGRESS
+                               show_boot_progress(-31);
+#endif
+                       }
+               }
+       }
+}
+
+static void post_bootmode_test_on(unsigned int last_test)
+{
+       unsigned long word = post_word_load();
+
+       word |= POST_POWERTEST;
+
+       word |= (last_test & 0xFF) << 8;
+
+       post_word_store(word);
+}
+
+static void post_bootmode_test_off(void)
+{
+       unsigned long word = post_word_load();
+
+       word &= ~POST_POWERTEST;
+
+       post_word_store(word);
+}
+
+static void post_get_flags(int *test_flags)
+{
+       int flag[] = { POST_POWERON, POST_NORMAL, POST_SLOWTEST };
+       char *var[] = { "post_poweron", "post_normal", "post_slowtest" };
+       int varnum = sizeof(var) / sizeof(var[0]);
+       char list[128];         /* long enough for POST list */
+       char *name;
+       char *s;
+       int last;
+       int i, j;
+
+       for (j = 0; j < post_list_size; j++) {
+               test_flags[j] = post_list[j].flags;
+       }
+
+       for (i = 0; i < varnum; i++) {
+               if (getenv_r(var[i], list, sizeof(list)) <= 0)
+                       continue;
+
+               for (j = 0; j < post_list_size; j++) {
+                       test_flags[j] &= ~flag[i];
+               }
+
+               last = 0;
+               name = list;
+               while (!last) {
+                       while (*name && *name == ' ')
+                               name++;
+                       if (*name == 0)
+                               break;
+                       s = name + 1;
+                       while (*s && *s != ' ')
+                               s++;
+                       if (*s == 0)
+                               last = 1;
+                       else
+                               *s = 0;
+
+                       for (j = 0; j < post_list_size; j++) {
+                               if (strcmp(post_list[j].cmd, name) == 0) {
+                                       test_flags[j] |= flag[i];
+                                       break;
+                               }
+                       }
+
+                       if (j == post_list_size) {
+                               printf("No such test: %s\n", name);
+                       }
+
+                       name = s + 1;
+               }
+       }
+
+       for (j = 0; j < post_list_size; j++) {
+               if (test_flags[j] & POST_POWERON) {
+                       test_flags[j] |= POST_SLOWTEST;
+               }
+       }
+}
+
+static int post_run_single(struct post_test *test,
+                          int test_flags, int flags, unsigned int i)
+{
+       if ((flags & test_flags & POST_ALWAYS) &&
+           (flags & test_flags & POST_MEM)) {
+               WATCHDOG_RESET();
+
+               if (!(flags & POST_REBOOT)) {
+                       if ((test_flags & POST_REBOOT)
+                           && !(flags & POST_MANUAL)) {
+                               post_bootmode_test_on(i);
+                       }
+
+                       if (test_flags & POST_PREREL)
+                               post_log_mark_start(test->testid);
+                       else
+                               post_log("POST %s ", test->cmd);
+               }
+
+               if (test_flags & POST_PREREL) {
+                       if ((*test->test) (flags) == 0)
+                               post_log_mark_succ(test->testid);
+               } else {
+                       if ((*test->test) (flags) != 0) {
+                               post_log("FAILED\n");
+#ifdef CONFIG_SHOW_BOOT_PROGRESS
+                               show_boot_progress(-32);
+#endif
+                       } else
+                               post_log("PASSED\n");
+               }
+
+               if ((test_flags & POST_REBOOT) && !(flags & POST_MANUAL)) {
+                       post_bootmode_test_off();
+               }
+
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+int post_run(char *name, int flags)
+{
+       unsigned int i;
+       int test_flags[POST_MAX_NUMBER];
+
+       post_get_flags(test_flags);
+
+       if (name == NULL) {
+               unsigned int last;
+
+               if (post_bootmode_get(&last) & POST_POWERTEST) {
+                       if (last < post_list_size &&
+                           (flags & test_flags[last] & POST_ALWAYS) &&
+                           (flags & test_flags[last] & POST_MEM)) {
+
+                               post_run_single(post_list + last,
+                                               test_flags[last],
+                                               flags | POST_REBOOT, last);
+
+                               for (i = last + 1; i < post_list_size; i++) {
+                                       post_run_single(post_list + i,
+                                                       test_flags[i],
+                                                       flags, i);
+                               }
+                       }
+               } else {
+                       for (i = 0; i < post_list_size; i++) {
+                               post_run_single(post_list + i,
+                                               test_flags[i], flags, i);
+                       }
+               }
+
+               return 0;
+       } else {
+               for (i = 0; i < post_list_size; i++) {
+                       if (strcmp(post_list[i].cmd, name) == 0)
+                               break;
+               }
+
+               if (i < post_list_size) {
+                       return post_run_single(post_list + i,
+                                              test_flags[i], flags, i);
+               } else {
+                       return -1;
+               }
+       }
+}
+
+static int post_info_single(struct post_test *test, int full)
+{
+       if (test->flags & POST_MANUAL) {
+               if (full)
+                       printf("%s - %s\n"
+                              "  %s\n", test->cmd, test->name, test->desc);
+               else
+                       printf("  %-15s - %s\n", test->cmd, test->name);
+
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
+int post_info(char *name)
+{
+       unsigned int i;
+
+       if (name == NULL) {
+               for (i = 0; i < post_list_size; i++) {
+                       post_info_single(post_list + i, 0);
+               }
+
+               return 0;
+       } else {
+               for (i = 0; i < post_list_size; i++) {
+                       if (strcmp(post_list[i].cmd, name) == 0)
+                               break;
+               }
+
+               if (i < post_list_size) {
+                       return post_info_single(post_list + i, 1);
+               } else {
+                       return -1;
+               }
+       }
+}
+
+int post_log(char *format, ...)
+{
+       va_list args;
+       uint i;
+       char printbuffer[CFG_PBSIZE];
+
+       va_start(args, format);
+
+       /* For this to work, printbuffer must be larger than
+        * anything we ever want to print.
+        */
+       i = vsprintf(printbuffer, format, args);
+       va_end(args);
+
+#ifdef CONFIG_LOGBUFFER
+       /* Send to the logbuffer */
+       logbuff_log(printbuffer);
+#else
+       /* Send to the stdout file */
+       puts(printbuffer);
+#endif
+
+       return 0;
+}
+
+void post_reloc(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       unsigned int i;
+
+       /*
+        * We have to relocate the test table manually
+        */
+       for (i = 0; i < post_list_size; i++) {
+               ulong addr;
+               struct post_test *test = post_list + i;
+
+               if (test->name) {
+                       addr = (ulong) (test->name) + gd->reloc_off;
+                       test->name = (char *)addr;
+               }
+
+               if (test->cmd) {
+                       addr = (ulong) (test->cmd) + gd->reloc_off;
+                       test->cmd = (char *)addr;
+               }
+
+               if (test->desc) {
+                       addr = (ulong) (test->desc) + gd->reloc_off;
+                       test->desc = (char *)addr;
+               }
+
+               if (test->test) {
+                       addr = (ulong) (test->test) + gd->reloc_off;
+                       test->test = (int (*)(int flags))addr;
+               }
+
+               if (test->init_f) {
+                       addr = (ulong) (test->init_f) + gd->reloc_off;
+                       test->init_f = (int (*)(void))addr;
+               }
+
+               if (test->reloc) {
+                       addr = (ulong) (test->reloc) + gd->reloc_off;
+                       test->reloc = (void (*)(void))addr;
+
+                       test->reloc();
+               }
+       }
+}
+
+/*
+ * Some tests (e.g. SYSMON) need the time when post_init_f started,
+ * but we cannot use get_timer() at this point.
+ *
+ * On PowerPC we implement it using the timebase register.
+ */
+unsigned long post_time_ms(unsigned long base)
+{
+       return (unsigned long)get_ticks() / (get_tbclk() / CFG_HZ) - base;
+}
+
+#endif                         /* CONFIG_POST */
diff --git a/lib_blackfin/tests.c b/lib_blackfin/tests.c
new file mode 100644 (file)
index 0000000..051649d
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * (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
+ *
+ * Be sure to mark tests to be run before relocation as such with the
+ * CFG_POST_PREREL flag so that logging is done correctly if the
+ * logbuffer support is enabled.
+ */
+
+#include <common.h>
+#include <config.h>
+#ifdef CONFIG_POST
+
+#include <post.h>
+#define CFG_POST_FLASH  0x00004000
+#define CFG_POST_LED    0x00008000
+#define CFG_POST_BUTTON 0x00010000
+
+extern int cache_post_test(int flags);
+extern int watchdog_post_test(int flags);
+extern int i2c_post_test(int flags);
+extern int rtc_post_test(int flags);
+extern int memory_post_test(int flags);
+extern int cpu_post_test(int flags);
+extern int uart_post_test(int flags);
+extern int ether_post_test(int flags);
+extern int spi_post_test(int flags);
+extern int usb_post_test(int flags);
+extern int spr_post_test(int flags);
+extern int sysmon_post_test(int flags);
+extern int dsp_post_test(int flags);
+extern int codec_post_test(int flags);
+
+extern int sysmon_init_f(void);
+
+extern void sysmon_reloc(void);
+
+extern int flash_post_test(int flags);
+extern int led_post_test(int flags);
+extern int button_post_test(int flags);
+
+struct post_test post_list[] = {
+#if CONFIG_POST & CFG_POST_CACHE
+       {
+        "Cache test",
+        "cache",
+        "This test verifies the CPU cache operation.",
+        POST_RAM | POST_ALWAYS,
+        &cache_post_test,
+        NULL,
+        NULL,
+        CFG_POST_CACHE},
+#endif
+#if CONFIG_POST & CFG_POST_WATCHDOG
+       {
+        "Watchdog timer test",
+        "watchdog",
+        "This test checks the watchdog timer.",
+        POST_RAM | POST_POWERON | POST_SLOWTEST | POST_MANUAL | POST_REBOOT,
+        &watchdog_post_test,
+        NULL,
+        NULL,
+        CFG_POST_WATCHDOG},
+#endif
+#if CONFIG_POST & CFG_POST_I2C
+       {
+        "I2C test",
+        "i2c",
+        "This test verifies the I2C operation.",
+        POST_RAM | POST_ALWAYS,
+        &i2c_post_test,
+        NULL,
+        NULL,
+        CFG_POST_I2C},
+#endif
+#if CONFIG_POST & CFG_POST_RTC
+       {
+        "RTC test",
+        "rtc",
+        "This test verifies the RTC operation.",
+        POST_RAM | POST_SLOWTEST | POST_MANUAL,
+        &rtc_post_test,
+        NULL,
+        NULL,
+        CFG_POST_RTC},
+#endif
+#if CONFIG_POST & CFG_POST_MEMORY
+       {
+        "Memory test",
+        "memory",
+        "This test checks RAM.",
+        POST_ROM | POST_POWERON | POST_SLOWTEST | POST_PREREL,
+        &memory_post_test,
+        NULL,
+        NULL,
+        CFG_POST_MEMORY},
+#endif
+#if CONFIG_POST & CFG_POST_CPU
+       {
+        "CPU test",
+        "cpu",
+        "This test verifies the arithmetic logic unit of" " CPU.",
+        POST_RAM | POST_ALWAYS,
+        &cpu_post_test,
+        NULL,
+        NULL,
+        CFG_POST_CPU},
+#endif
+#if CONFIG_POST & CFG_POST_UART
+       {
+        "UART test",
+        "uart",
+        "This test verifies the UART operation.",
+        POST_RAM | POST_SLOWTEST | POST_MANUAL,
+        &uart_post_test,
+        NULL,
+        NULL,
+        CFG_POST_UART},
+#endif
+#if CONFIG_POST & CFG_POST_ETHER
+       {
+        "ETHERNET test",
+        "ethernet",
+        "This test verifies the ETHERNET operation.",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &ether_post_test,
+        NULL,
+        NULL,
+        CFG_POST_ETHER},
+#endif
+#if CONFIG_POST & CFG_POST_SPI
+       {
+        "SPI test",
+        "spi",
+        "This test verifies the SPI operation.",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &spi_post_test,
+        NULL,
+        NULL,
+        CFG_POST_SPI},
+#endif
+#if CONFIG_POST & CFG_POST_USB
+       {
+        "USB test",
+        "usb",
+        "This test verifies the USB operation.",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &usb_post_test,
+        NULL,
+        NULL,
+        CFG_POST_USB},
+#endif
+#if CONFIG_POST & CFG_POST_SPR
+       {
+        "SPR test",
+        "spr",
+        "This test checks SPR contents.",
+        POST_ROM | POST_ALWAYS | POST_PREREL,
+        &spr_post_test,
+        NULL,
+        NULL,
+        CFG_POST_SPR},
+#endif
+#if CONFIG_POST & CFG_POST_SYSMON
+       {
+        "SYSMON test",
+        "sysmon",
+        "This test monitors system hardware.",
+        POST_RAM | POST_ALWAYS,
+        &sysmon_post_test,
+        &sysmon_init_f,
+        &sysmon_reloc,
+        CFG_POST_SYSMON},
+#endif
+#if CONFIG_POST & CFG_POST_DSP
+       {
+        "DSP test",
+        "dsp",
+        "This test checks any connected DSP(s).",
+        POST_RAM | POST_MANUAL,
+        &dsp_post_test,
+        NULL,
+        NULL,
+        CFG_POST_DSP},
+#endif
+#if CONFIG_POST & CFG_POST_CODEC
+       {
+        "CODEC test",
+        "codec",
+        "This test checks any connected codec(s).",
+        POST_RAM | POST_MANUAL,
+        &codec_post_test,
+        NULL,
+        NULL,
+        CFG_POST_CODEC},
+#endif
+#if CONFIG_POST & CFG_POST_FLASH
+       {
+        "FLASH test",
+        "flash",
+        "This test checks flash.",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &flash_post_test,
+        NULL,
+        NULL,
+        CFG_POST_FLASH},
+#endif
+#if CONFIG_POST & CFG_POST_LED
+       {
+        "LED test",
+        "LED",
+        "This test checks LED ",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &led_post_test,
+        NULL,
+        NULL,
+        CFG_POST_LED},
+#endif
+#if CONFIG_POST & CFG_POST_BUTTON
+       {
+        "Button test",
+        "button",
+        "This test checks Button ",
+        POST_RAM | POST_ALWAYS | POST_MANUAL,
+        &button_post_test,
+        NULL,
+        NULL,
+        CFG_POST_BUTTON},
+#endif
+
+};
+
+unsigned int post_list_size = sizeof(post_list) / sizeof(struct post_test);
+
+#endif                         /* CONFIG_POST */
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 026d247e54ad8a36a1b5ebf53ab6a5539583b8b5..c95125ad33d120b578350f9ba8ea538e3049edac 100644 (file)
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2007 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <monstr@monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -13,7 +15,7 @@
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
 
 DECLARE_GLOBAL_DATA_PTR;
 
-const char version_string[] =
-       U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")";
+const char version_string[] = U_BOOT_VERSION " (" __DATE__ " - " __TIME__ ")";
+
+#ifdef CFG_GPIO_0
+extern int gpio_init (void);
+#endif
+#ifdef CFG_INTC_0
+extern int interrupts_init (void);
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+extern int eth_init (bd_t * bis);
+extern int getenv_IPaddr (char *);
+#endif
 
 /*
  * Begin and End of memory area for malloc(), and current "brk"
@@ -40,6 +52,18 @@ static ulong mem_malloc_start;
 static ulong mem_malloc_end;
 static ulong mem_malloc_brk;
 
+/*
+ * The Malloc area is immediately below the monitor copy in DRAM
+ * aka CFG_MONITOR_BASE - Note there is no need for reloc_off
+ * as our monitory code is run from SDRAM
+ */
+static void mem_malloc_init (void)
+{
+       mem_malloc_end = (CFG_MALLOC_BASE + CFG_MALLOC_LEN);
+       mem_malloc_start = CFG_MALLOC_BASE;
+       mem_malloc_brk = mem_malloc_start;
+       memset ((void *)mem_malloc_start, 0, mem_malloc_end - mem_malloc_start);
+}
 
 void *sbrk (ptrdiff_t increment)
 {
@@ -50,7 +74,7 @@ void *sbrk (ptrdiff_t increment)
                return (NULL);
        }
        mem_malloc_brk = new;
-       return ((void *) old);
+       return ((void *)old);
 }
 
 /*
@@ -68,24 +92,36 @@ void *sbrk (ptrdiff_t increment)
 typedef int (init_fnc_t) (void);
 
 init_fnc_t *init_sequence[] = {
-       serial_init,            /* serial communications setup */
+       env_init,
+       serial_init,
+#ifdef CFG_GPIO_0
+       gpio_init,
+#endif
+#ifdef CFG_INTC_0
+       interrupts_init,
+#endif
        NULL,
 };
 
-void board_init(void)
+void board_init (void)
 {
        bd_t *bd;
        init_fnc_t **init_fnc_ptr;
-
-       /* Pointer is writable since we allocated a register for it. */
-       gd = (gd_t *)CFG_GBL_DATA_OFFSET;
-       memset((void *)gd, 0, CFG_GBL_DATA_SIZE);
-
-       gd->bd = (bd_t *)(gd+1);        /* At end of global data */
+       gd = (gd_t *) CFG_GBL_DATA_OFFSET;
+#if (CONFIG_COMMANDS & CFG_CMD_FLASH)
+       ulong flash_size = 0;
+#endif
+       asm ("nop");    /* FIXME gd is not initialize - wait */
+       memset ((void *)gd, 0, CFG_GBL_DATA_SIZE);
+       gd->bd = (bd_t *) (gd + 1);     /* At end of global data */
        gd->baudrate = CONFIG_BAUDRATE;
-
        bd = gd->bd;
        bd->bi_baudrate = CONFIG_BAUDRATE;
+       bd->bi_memstart = CFG_SDRAM_BASE;
+       bd->bi_memsize = CFG_SDRAM_SIZE;
+
+       /* Initialise malloc() area */
+       mem_malloc_init ();
 
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
                WATCHDOG_RESET ();
@@ -94,6 +130,37 @@ void board_init(void)
                }
        }
 
+#if (CONFIG_COMMANDS & CFG_CMD_FLASH)
+       bd->bi_flashstart = CFG_FLASH_BASE;
+       if (0 < (flash_size = flash_init ())) {
+               bd->bi_flashsize = flash_size;
+               bd->bi_flashoffset = CFG_FLASH_BASE + flash_size;
+       } else {
+               puts ("Flash init FAILED");
+               bd->bi_flashstart = 0;
+               bd->bi_flashsize = 0;
+               bd->bi_flashoffset = 0;
+       }
+#endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+       char *s, *e;
+       int i;
+       /* board MAC address */
+       s = getenv ("ethaddr");
+       for (i = 0; i < 6; ++i) {
+               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               if (s)
+                       s = (*e) ? e + 1 : e;
+       }
+       /* IP Address */
+       bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
+       eth_init (bd);
+#endif
+
+       /* relocate environment function pointers etc. */
+       env_relocate ();
+
        /* main_loop */
        for (;;) {
                WATCHDOG_RESET ();
@@ -104,5 +171,5 @@ void board_init(void)
 void hang (void)
 {
        puts ("### ERROR ### Please RESET the board ###\n");
-       for (;;);
+       for (;;) ;
 }
index b3a081551063e34c2f462c10fc5f525a6430244c..2c7885c1f11ba1e8cc943317f7b9c7013b72c870 100644 (file)
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2007 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <monstr@monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -13,7 +15,7 @@
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
 
 #include <common.h>
 #include <command.h>
+#include <image.h>
+#include <zlib.h>
+#include <asm/byteorder.h>
 
-void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
-               ulong addr, ulong *len_ptr, int   verify)
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SHOW_BOOT_PROGRESS
+# include <status_led.h>
+# define SHOW_BOOT_PROGRESS(arg)        show_boot_progress(arg)
+#else
+# define SHOW_BOOT_PROGRESS(arg)
+#endif
+
+extern image_header_t header;  /* from cmd_bootm.c */
+/*cmd_boot.c*/
+extern int do_reset (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
+
+void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
+                    ulong addr, ulong * len_ptr, int verify)
 {
+       ulong len = 0, checksum;
+       ulong initrd_start, initrd_end;
+       ulong data;
+       /* First parameter is mapped to $r5 for kernel boot args */
+       void (*theKernel) (char *);
+       image_header_t *hdr = &header;
+       char *commandline = getenv ("bootargs");
+       int i;
+
+       theKernel = (void (*)(char *))ntohl (hdr->ih_ep);
+
+       /* Check if there is an initrd image */
+       if (argc >= 3) {
+               SHOW_BOOT_PROGRESS (9);
+
+               addr = simple_strtoul (argv[2], NULL, 16);
+
+               printf ("## Loading Ramdisk Image at %08lx ...\n", addr);
+
+               /* Copy header so we can blank CRC field for re-calculation */
+               memcpy (&header, (char *)addr, sizeof (image_header_t));
+
+               if (ntohl (hdr->ih_magic) != IH_MAGIC) {
+                       printf ("Bad Magic Number\n");
+                       SHOW_BOOT_PROGRESS (-10);
+                       do_reset (cmdtp, flag, argc, argv);
+               }
+
+               data = (ulong) & header;
+               len = sizeof (image_header_t);
+
+               checksum = ntohl (hdr->ih_hcrc);
+               hdr->ih_hcrc = 0;
+
+               if (crc32 (0, (char *)data, len) != checksum) {
+                       printf ("Bad Header Checksum\n");
+                       SHOW_BOOT_PROGRESS (-11);
+                       do_reset (cmdtp, flag, argc, argv);
+               }
+
+               SHOW_BOOT_PROGRESS (10);
+
+               print_image_hdr (hdr);
+
+               data = addr + sizeof (image_header_t);
+               len = ntohl (hdr->ih_size);
+
+               if (verify) {
+                       ulong csum = 0;
+
+                       printf ("   Verifying Checksum ... ");
+                       csum = crc32 (0, (char *)data, len);
+                       if (csum != ntohl (hdr->ih_dcrc)) {
+                               printf ("Bad Data CRC\n");
+                               SHOW_BOOT_PROGRESS (-12);
+                               do_reset (cmdtp, flag, argc, argv);
+                       }
+                       printf ("OK\n");
+               }
+
+               SHOW_BOOT_PROGRESS (11);
+
+               if ((hdr->ih_os != IH_OS_LINUX) ||
+                   (hdr->ih_arch != IH_CPU_MICROBLAZE) ||
+                   (hdr->ih_type != IH_TYPE_RAMDISK)) {
+                       printf ("No Linux Microblaze Ramdisk Image\n");
+                       SHOW_BOOT_PROGRESS (-13);
+                       do_reset (cmdtp, flag, argc, argv);
+               }
+
+               /*
+                * Now check if we have a multifile image
+                */
+       } else if ((hdr->ih_type == IH_TYPE_MULTI) && (len_ptr[1])) {
+               ulong tail = ntohl (len_ptr[0]) % 4;
+
+               SHOW_BOOT_PROGRESS (13);
+
+               /* skip kernel length and terminator */
+               data = (ulong) (&len_ptr[2]);
+               /* skip any additional image length fields */
+               for (i = 1; len_ptr[i]; ++i)
+                       data += 4;
+               /* add kernel length, and align */
+               data += ntohl (len_ptr[0]);
+               if (tail) {
+                       data += 4 - tail;
+               }
+
+               len = ntohl (len_ptr[1]);
+
+       } else {
+               /*
+                * no initrd image
+                */
+               SHOW_BOOT_PROGRESS (14);
+
+               data = 0;
+       }
+
+#ifdef  DEBUG
+       if (!data) {
+               printf ("No initrd\n");
+       }
+#endif
+
+       if (data) {
+               initrd_start = data;
+               initrd_end = initrd_start + len;
+       } else {
+               initrd_start = 0;
+               initrd_end = 0;
+       }
+
+       SHOW_BOOT_PROGRESS (15);
+
+#ifdef DEBUG
+       printf ("## Transferring control to Linux (at address %08lx) ...\n",
+               (ulong) theKernel);
+#endif
+
+       theKernel (commandline);
 }
index 12e84888bd5f3daa0285be53a34e430208d76194..3fa1b112627664d9fefa13bc1d5aea13bc40796d 100644 (file)
@@ -1,6 +1,8 @@
 /*
+ * (C) Copyright 2007 Michal Simek
  * (C) Copyright 2004 Atmark Techno, Inc.
  *
+ * Michal  SIMEK <monstr@monstr.eu>
  * Yasushi SHOJI <yashi@atmark-techno.com>
  *
  * See file CREDITS for list of people who contributed to this
  * MA 02111-1307 USA
  */
 
-void udelay(unsigned long usec)
+#include <common.h>
+
+void udelay (unsigned long usec)
 {
+       int i;
+       i = get_timer (0);
+       while ((get_timer (0) - i) < (usec / 1000)) ;
 }
index 24e8e970b367f3c6e2707453161734d8619eb409..9e85cdddc4aee4192529b760a4ae3c92ce28b4e4 100644 (file)
@@ -310,10 +310,6 @@ init_fnc_t *init_sequence[] = {
        prt_8260_clks,
 #endif /* CONFIG_8260 */
 
-#if defined(CONFIG_MPC83XX)
-       print_clock_conf,
-#endif
-
        checkcpu,
 #if defined(CONFIG_MPC5xxx)
        prt_mpc5xxx_clks,
@@ -568,7 +564,9 @@ void board_init_f (ulong bootflag)
 
        bd->bi_procfreq = gd->cpu_clk;  /* Processor Speed, In Hz */
        bd->bi_plb_busfreq = gd->bus_clk;
-#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
+#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
+    defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
+    defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
        bd->bi_pci_busfreq = get_PCI_freq ();
        bd->bi_opbfreq = get_OPB_freq ();
 #elif defined(CONFIG_XILINX_ML300)
index d92f14270ef189fc80fa02f8b0ce2443478c116f..b14d661bbea885ff1d24925aeb3686fbc84a451c 100644 (file)
@@ -37,6 +37,8 @@
  * on our cache or tlb entries.
  */
 
+DECLARE_GLOBAL_DATA_PTR;
+
 struct exception_table_entry
 {
        unsigned long insn, fixup;
@@ -55,13 +57,25 @@ search_one_table(const struct exception_table_entry *first,
                long diff;
 
                mid = (last - first) / 2 + first;
-               diff = mid->insn - value;
-               if (diff == 0)
-                       return mid->fixup;
-               else if (diff < 0)
-                       first = mid+1;
+               if ((ulong) mid > CFG_MONITOR_BASE) {
+                       /* exception occurs in FLASH, before u-boot relocation.
+                        * No relocation offset is needed.
+                        */
+                       diff = mid->insn - value;
+                       if (diff == 0)
+                               return mid->fixup;
+               } else {
+                       /* exception occurs in RAM, after u-boot relocation.
+                        * A relocation offset should be added.
+                        */
+                       diff = (mid->insn + gd->reloc_off) - value;
+                       if (diff == 0)
+                               return (mid->fixup + gd->reloc_off);
+               }
+               if (diff < 0)
+                       first = mid + 1;
                else
-                       last = mid-1;
+                       last = mid - 1;
        }
        return 0;
 }
@@ -75,8 +89,11 @@ search_exception_table(unsigned long addr)
 
        /* There is only the kernel to search.  */
        ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
+       /* if the serial port does not hang in exception, printf can be used */
+#if !defined(CFG_SERIAL_HANG_IN_EXCEPTION)
        if (ex_tab_message)
                printf("Bus Fault @ 0x%08lx, fixup 0x%08lx\n", addr, ret);
+#endif
        if (ret) return ret;
 
        return 0;
diff --git a/libfdt/Makefile b/libfdt/Makefile
new file mode 100644 (file)
index 0000000..dc41137
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# (C) Copyright 2000-2007
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)libfdt.a
+
+SOBJS  =
+
+COBJS  = fdt.o  fdt_ro.o  fdt_rw.o  fdt_strerror.o  fdt_sw.o  fdt_wip.o
+
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/libfdt/README b/libfdt/README
new file mode 100644 (file)
index 0000000..f4cca34
--- /dev/null
@@ -0,0 +1,23 @@
+The libfdt functionality was written by David Gibson.  The original
+source came from the git repository:
+
+URL:           git://ozlabs.org/home/dgibson/git/libfdt.git
+
+author         David Gibson <dgibson@sneetch.(none)>
+               Fri, 23 Mar 2007 04:16:54 +0000 (15:16 +1100)
+committer      David Gibson <dgibson@sneetch.(none)>
+               Fri, 23 Mar 2007 04:16:54 +0000 (15:16 +1100)
+commit         857f54e79f74429af20c2b5ecc00ee98af6a3b8b
+tree           2f648f0f88225a51ded452968d28b4402df8ade0
+parent         07a12a08005f3b5cd9337900a6551e450c07b515
+
+To adapt for u-boot usage, only the applicable files were copied and
+imported into the u-boot git repository.
+Omitted:
+* GPL - u-boot comes with a copy of the GPL license
+* test subdirectory - not directly useful for u-boot
+
+After importing, other customizations were performed.  See the git log
+for details.
+
+Jerry Van Baren
diff --git a/libfdt/fdt.c b/libfdt/fdt.c
new file mode 100644 (file)
index 0000000..212b838
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+int fdt_check_header(const void *fdt)
+{
+       if (fdt_magic(fdt) == FDT_MAGIC) {
+               /* Complete tree */
+               if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
+                       return -FDT_ERR_BADVERSION;
+               if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
+                       return -FDT_ERR_BADVERSION;
+       } else if (fdt_magic(fdt) == SW_MAGIC) {
+               /* Unfinished sequential-write blob */
+               if (fdt_size_dt_struct(fdt) == 0)
+                       return -FDT_ERR_BADSTATE;
+       } else {
+               return -FDT_ERR_BADMAGIC;
+       }
+
+       return 0;
+}
+
+void *fdt_offset_ptr(const void *fdt, int offset, int len)
+{
+       void *p;
+
+       if (fdt_version(fdt) >= 0x11)
+               if (((offset + len) < offset)
+                   || ((offset + len) > fdt_size_dt_struct(fdt)))
+                       return NULL;
+
+       p = _fdt_offset_ptr(fdt, offset);
+
+       if (p + len < p)
+               return NULL;
+       return p;
+}
+
+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
+{
+       int len = strlen(s) + 1;
+       const char *last = strtab + tabsize - len;
+       const char *p;
+
+       for (p = strtab; p <= last; p++)
+               if (memeq(p, s, len))
+                       return p;
+       return NULL;
+}
+
+int fdt_move(const void *fdt, void *buf, int bufsize)
+{
+       int err = fdt_check_header(fdt);
+
+       if (err)
+               return err;
+
+       if (fdt_totalsize(fdt) > bufsize)
+               return -FDT_ERR_NOSPACE;
+
+       memmove(buf, fdt, fdt_totalsize(fdt));
+       return 0;
+}
diff --git a/libfdt/fdt_ro.c b/libfdt/fdt_ro.c
new file mode 100644 (file)
index 0000000..4e2c325
--- /dev/null
@@ -0,0 +1,402 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+#define CHECK_HEADER(fdt)      { \
+       int err; \
+       if ((err = fdt_check_header(fdt)) != 0) \
+               return err; \
+}
+
+static int offset_streq(const void *fdt, int offset,
+                       const char *s, int len)
+{
+       const char *p = fdt_offset_ptr(fdt, offset, len+1);
+
+       if (! p)
+               /* short match */
+               return 0;
+
+       if (memcmp(p, s, len) != 0)
+               return 0;
+
+       if (p[len] != '\0')
+               return 0;
+
+       return 1;
+}
+
+/*
+ * Return a pointer to the string at the given string offset.
+ */
+char *fdt_string(const void *fdt, int stroffset)
+{
+       return (char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
+}
+
+/*
+ * Return the node offset of the node specified by:
+ *   parentoffset - starting place (0 to start at the root)
+ *   name         - name being searched for
+ *   namelen      - length of the name: typically strlen(name)
+ *
+ * Notes:
+ *   If the start node has subnodes, the subnodes are _not_ searched for the
+ *     requested name.
+ */
+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
+                              const char *name, int namelen)
+{
+       int level = 0;
+       uint32_t tag;
+       int offset, nextoffset;
+
+       CHECK_HEADER(fdt);
+
+       tag = fdt_next_tag(fdt, parentoffset, &nextoffset, NULL);
+       if (tag != FDT_BEGIN_NODE)
+               return -FDT_ERR_BADOFFSET;
+
+       do {
+               offset = nextoffset;
+               tag = fdt_next_tag(fdt, offset, &nextoffset, NULL);
+
+               switch (tag) {
+               case FDT_END:
+                       return -FDT_ERR_TRUNCATED;
+
+               case FDT_BEGIN_NODE:
+                       level++;
+                       /*
+                        * If we are nested down levels, ignore the strings
+                        * until we get back to the proper level.
+                        */
+                       if (level != 1)
+                               continue;
+
+                       /* Return the offset if this is "our" string. */
+                       if (offset_streq(fdt, offset+FDT_TAGSIZE, name, namelen))
+                               return offset;
+                       break;
+
+               case FDT_END_NODE:
+                       level--;
+                       break;
+
+               case FDT_PROP:
+               case FDT_NOP:
+                       break;
+
+               default:
+                       return -FDT_ERR_BADSTRUCTURE;
+               }
+       } while (level >= 0);
+
+       return -FDT_ERR_NOTFOUND;
+}
+
+/*
+ * See fdt_subnode_offset_namelen()
+ */
+int fdt_subnode_offset(const void *fdt, int parentoffset,
+                      const char *name)
+{
+       return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
+}
+
+/*
+ * Searches for the node corresponding to the given path and returns the
+ * offset of that node.
+ */
+int fdt_path_offset(const void *fdt, const char *path)
+{
+       const char *end = path + strlen(path);
+       const char *p = path;
+       int offset = 0;
+
+       CHECK_HEADER(fdt);
+
+       /* Paths must be absolute */
+       if (*path != '/')
+               return -FDT_ERR_BADPATH;
+
+       while (*p) {
+               const char *q;
+
+               /* Skip path separator(s) */
+               while (*p == '/')
+                       p++;
+               if (! *p)
+                       return -FDT_ERR_BADPATH;
+
+               /*
+                * Find the next path separator.  The characters between
+                * p and q are the next segment of the the path to find.
+                */
+               q = strchr(p, '/');
+               if (! q)
+                       q = end;
+
+               /*
+                * Find the offset corresponding to the this path segment.
+                */
+               offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
+
+               /* Oops, error, abort abort abort */
+               if (offset < 0)
+                       return offset;
+
+               p = q;
+       }
+
+       return offset;
+}
+
+/*
+ * Given the offset of a node and a name of a property in that node, return
+ * a pointer to the property struct.
+ */
+struct fdt_property *fdt_get_property(const void *fdt,
+                                     int nodeoffset,
+                                     const char *name, int *lenp)
+{
+       int level = 0;
+       uint32_t tag;
+       struct fdt_property *prop;
+       int namestroff;
+       int offset, nextoffset;
+       int err;
+
+       if ((err = fdt_check_header(fdt)) != 0)
+               goto fail;
+
+       err = -FDT_ERR_BADOFFSET;
+       if (nodeoffset % FDT_TAGSIZE)
+               goto fail;
+
+       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset, NULL);
+       if (tag != FDT_BEGIN_NODE)
+               goto fail;
+
+       do {
+               offset = nextoffset;
+
+               tag = fdt_next_tag(fdt, offset, &nextoffset, NULL);
+               switch (tag) {
+               case FDT_END:
+                       err = -FDT_ERR_TRUNCATED;
+                       goto fail;
+
+               case FDT_BEGIN_NODE:
+                       level++;
+                       break;
+
+               case FDT_END_NODE:
+                       level--;
+                       break;
+
+               case FDT_PROP:
+                       /*
+                        * If we are nested down levels, ignore the strings
+                        * until we get back to the proper level.
+                        */
+                       if (level != 0)
+                               continue;
+
+                       err = -FDT_ERR_BADSTRUCTURE;
+                       prop = fdt_offset_ptr_typed(fdt, offset, prop);
+                       if (! prop)
+                               goto fail;
+                       namestroff = fdt32_to_cpu(prop->nameoff);
+                       if (streq(fdt_string(fdt, namestroff), name)) {
+                               /* Found it! */
+                               int len = fdt32_to_cpu(prop->len);
+                               prop = fdt_offset_ptr(fdt, offset,
+                                                     sizeof(*prop)+len);
+                               if (! prop)
+                                       goto fail;
+
+                               if (lenp)
+                                       *lenp = len;
+
+                               return prop;
+                       }
+                       break;
+
+               case FDT_NOP:
+                       break;
+
+               default:
+                       err = -FDT_ERR_BADSTRUCTURE;
+                       goto fail;
+               }
+       } while (level >= 0);
+
+       err = -FDT_ERR_NOTFOUND;
+fail:
+       if (lenp)
+               *lenp = err;
+       return NULL;
+}
+
+/*
+ * Given the offset of a node and a name of a property in that node, return
+ * a pointer to the property data (ONLY).
+ */
+void *fdt_getprop(const void *fdt, int nodeoffset,
+                 const char *name, int *lenp)
+{
+       const struct fdt_property *prop;
+
+       prop = fdt_get_property(fdt, nodeoffset, name, lenp);
+       if (! prop)
+               return NULL;
+
+       return (void *)prop->data;
+}
+
+
+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset, char **namep)
+{
+       const uint32_t *tagp, *lenp;
+       uint32_t tag;
+       const char *p;
+
+       if (offset % FDT_TAGSIZE)
+               return -1;
+
+       tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
+       if (! tagp)
+               return FDT_END; /* premature end */
+       tag = fdt32_to_cpu(*tagp);
+       offset += FDT_TAGSIZE;
+
+       switch (tag) {
+       case FDT_BEGIN_NODE:
+               if(namep)
+                       *namep = fdt_offset_ptr(fdt, offset, 1);
+
+               /* skip name */
+               do {
+                       p = fdt_offset_ptr(fdt, offset++, 1);
+               } while (p && (*p != '\0'));
+               if (! p)
+                       return FDT_END;
+               break;
+       case FDT_PROP:
+               lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
+               if (! lenp)
+                       return FDT_END;
+               /*
+                * Get the property and set the namep to the name.
+                */
+               if(namep) {
+                       struct fdt_property *prop;
+
+                       prop = fdt_offset_ptr_typed(fdt, offset - FDT_TAGSIZE, prop);
+                       if (! prop)
+                               return -FDT_ERR_BADSTRUCTURE;
+                       *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
+               }
+               /* skip name offset, length and value */
+               offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
+               break;
+       }
+
+       if (nextoffset)
+               *nextoffset = ALIGN(offset, FDT_TAGSIZE);
+
+       return tag;
+}
+
+/*
+ * Return the number of used reserve map entries and total slots available.
+ */
+int fdt_num_reservemap(void *fdt, int *used, int *total)
+{
+       struct fdt_reserve_entry *re;
+       int  start;
+       int  end;
+       int  err = fdt_check_header(fdt);
+
+       if (err != 0)
+               return err;
+
+       start = fdt_off_mem_rsvmap(fdt);
+
+       /*
+        * Convention is that the reserve map is before the dt_struct,
+        * but it does not have to be.
+        */
+       end = fdt_totalsize(fdt);
+       if (end > fdt_off_dt_struct(fdt))
+               end = fdt_off_dt_struct(fdt);
+       if (end > fdt_off_dt_strings(fdt))
+               end = fdt_off_dt_strings(fdt);
+
+       /*
+        * Since the reserved area list is zero terminated, you get one fewer.
+        */
+       if (total)
+               *total = ((end - start) / sizeof(struct fdt_reserve_entry)) - 1;
+
+       if (used) {
+               *used = 0;
+               while (start < end) {
+                       re = (struct fdt_reserve_entry *)(fdt + start);
+                       if (re->size == 0)
+                               return 0;       /* zero size terminates the list */
+
+                       *used += 1;
+                       start += sizeof(struct fdt_reserve_entry);
+               }
+               /*
+                * If we get here, there was no zero size termination.
+                */
+               return -FDT_ERR_BADLAYOUT;
+       }
+       return 0;
+}
+
+/*
+ * Return the nth reserve map entry.
+ */
+int fdt_get_reservemap(void *fdt, int n, struct fdt_reserve_entry *re)
+{
+       int  used;
+       int  total;
+       int  err;
+
+       err = fdt_num_reservemap(fdt, &used, &total);
+       if (err != 0)
+               return err;
+
+       if (n >= total)
+               return -FDT_ERR_NOSPACE;
+       if (re) {
+               *re = *(struct fdt_reserve_entry *)
+                       _fdt_offset_ptr(fdt, n * sizeof(struct fdt_reserve_entry));
+       }
+       return 0;
+}
diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c
new file mode 100644 (file)
index 0000000..aaafc53
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+static int rw_check_header(void *fdt)
+{
+       int err;
+
+       if ((err = fdt_check_header(fdt)))
+               return err;
+       if (fdt_version(fdt) < 0x11)
+               return -FDT_ERR_BADVERSION;
+       if (fdt_off_mem_rsvmap(fdt) < ALIGN(sizeof(struct fdt_header), 8))
+               return -FDT_ERR_BADLAYOUT;
+       if (fdt_off_dt_struct(fdt) <
+           (fdt_off_mem_rsvmap(fdt) + sizeof(struct fdt_reserve_entry)))
+               return -FDT_ERR_BADLAYOUT;
+       if (fdt_off_dt_strings(fdt) <
+           (fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt)))
+               return -FDT_ERR_BADLAYOUT;
+       if (fdt_totalsize(fdt) <
+           (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)))
+               return -FDT_ERR_BADLAYOUT;
+       return 0;
+}
+
+#define RW_CHECK_HEADER(fdt) \
+       { \
+               int err; \
+               if ((err = rw_check_header(fdt)) != 0) \
+                       return err; \
+       }
+
+static inline int _blob_data_size(void *fdt)
+{
+       return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+}
+
+static int _blob_splice(void *fdt, void *p, int oldlen, int newlen)
+{
+       void *end = fdt + _blob_data_size(fdt);
+
+       if (((p + oldlen) < p) || ((p + oldlen) > end))
+               return -FDT_ERR_BADOFFSET;
+       if ((end - oldlen + newlen) > (fdt + fdt_totalsize(fdt)))
+               return -FDT_ERR_NOSPACE;
+       memmove(p + newlen, p + oldlen, end - p - oldlen);
+       return 0;
+}
+
+static int _blob_splice_struct(void *fdt, void *p,
+                              int oldlen, int newlen)
+{
+       int delta = newlen - oldlen;
+       int err;
+
+       if ((err = _blob_splice(fdt, p, oldlen, newlen)))
+               return err;
+
+       fdt_set_header(fdt, size_dt_struct, fdt_size_dt_struct(fdt) + delta);
+       fdt_set_header(fdt, off_dt_strings, fdt_off_dt_strings(fdt) + delta);
+       return 0;
+}
+
+static int _blob_splice_string(void *fdt, int newlen)
+{
+       void *p = fdt + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
+       int err;
+
+       if ((err = _blob_splice(fdt, p, 0, newlen)))
+               return err;
+
+       fdt_set_header(fdt, size_dt_strings, fdt_size_dt_strings(fdt) + newlen);
+       return 0;
+}
+
+static int _find_add_string(void *fdt, const char *s)
+{
+       char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
+       const char *p;
+       char *new;
+       int len = strlen(s) + 1;
+       int err;
+
+       p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
+       if (p)
+               /* found it */
+               return (p - strtab);
+
+       new = strtab + fdt_size_dt_strings(fdt);
+       err = _blob_splice_string(fdt, len);
+       if (err)
+               return err;
+
+       memcpy(new, s, len);
+       return (new - strtab);
+}
+
+static int _resize_property(void *fdt, int nodeoffset, const char *name, int len,
+                           struct fdt_property **prop)
+{
+       int oldlen;
+       int err;
+
+       *prop = fdt_get_property(fdt, nodeoffset, name, &oldlen);
+       if (! (*prop))
+               return oldlen;
+
+       if ((err = _blob_splice_struct(fdt, (*prop)->data,
+                                      ALIGN(oldlen, FDT_TAGSIZE),
+                                      ALIGN(len, FDT_TAGSIZE))))
+               return err;
+
+       (*prop)->len = cpu_to_fdt32(len);
+       return 0;
+}
+
+static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
+                        struct fdt_property **prop)
+{
+       uint32_t tag;
+       int proplen;
+       int nextoffset;
+       int namestroff;
+       int err;
+
+       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset, NULL);
+       if (tag != FDT_BEGIN_NODE)
+               return -FDT_ERR_BADOFFSET;
+
+       namestroff = _find_add_string(fdt, name);
+       if (namestroff < 0)
+               return namestroff;
+
+       *prop = _fdt_offset_ptr(fdt, nextoffset);
+       proplen = sizeof(**prop) + ALIGN(len, FDT_TAGSIZE);
+
+       err = _blob_splice_struct(fdt, *prop, 0, proplen);
+       if (err)
+               return err;
+
+       (*prop)->tag = cpu_to_fdt32(FDT_PROP);
+       (*prop)->nameoff = cpu_to_fdt32(namestroff);
+       (*prop)->len = cpu_to_fdt32(len);
+       return 0;
+}
+
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+               const void *val, int len)
+{
+       struct fdt_property *prop;
+       int err;
+
+       if ((err = rw_check_header(fdt)))
+               return err;
+
+       err = _resize_property(fdt, nodeoffset, name, len, &prop);
+       if (err == -FDT_ERR_NOTFOUND)
+               err = _add_property(fdt, nodeoffset, name, len, &prop);
+       if (err)
+               return err;
+
+       memcpy(prop->data, val, len);
+       return 0;
+}
+
+int fdt_delprop(void *fdt, int nodeoffset, const char *name)
+{
+       struct fdt_property *prop;
+       int len, proplen;
+
+       RW_CHECK_HEADER(fdt);
+
+       prop = fdt_get_property(fdt, nodeoffset, name, &len);
+       if (! prop)
+               return len;
+
+       proplen = sizeof(*prop) + ALIGN(len, FDT_TAGSIZE);
+       return _blob_splice_struct(fdt, prop, proplen, 0);
+}
+
+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
+                           const char *name, int namelen)
+{
+       struct fdt_node_header *nh;
+       int offset, nextoffset;
+       int nodelen;
+       int err;
+       uint32_t tag;
+       uint32_t *endtag;
+
+       RW_CHECK_HEADER(fdt);
+
+       offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
+       if (offset >= 0)
+               return -FDT_ERR_EXISTS;
+       else if (offset != -FDT_ERR_NOTFOUND)
+               return offset;
+
+       /* Try to place the new node after the parent's properties */
+       fdt_next_tag(fdt, parentoffset, &nextoffset, NULL); /* skip the BEGIN_NODE */
+       do {
+               offset = nextoffset;
+               tag = fdt_next_tag(fdt, offset, &nextoffset, NULL);
+       } while (tag == FDT_PROP);
+
+       nh = _fdt_offset_ptr(fdt, offset);
+       nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
+
+       err = _blob_splice_struct(fdt, nh, 0, nodelen);
+       if (err)
+               return err;
+
+       nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+       memset(nh->name, 0, ALIGN(namelen+1, FDT_TAGSIZE));
+       memcpy(nh->name, name, namelen);
+       endtag = (uint32_t *)((void *)nh + nodelen - FDT_TAGSIZE);
+       *endtag = cpu_to_fdt32(FDT_END_NODE);
+
+       return offset;
+}
+
+int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
+{
+       return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
+}
+
+int fdt_del_node(void *fdt, int nodeoffset)
+{
+       int endoffset;
+
+       endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+       if (endoffset < 0)
+               return endoffset;
+
+       return _blob_splice_struct(fdt, _fdt_offset_ptr(fdt, nodeoffset),
+                                  endoffset - nodeoffset, 0);
+}
+
+int fdt_open_into(void *fdt, void *buf, int bufsize)
+{
+       int err;
+
+       err = fdt_move(fdt, buf, bufsize);
+       if (err)
+               return err;
+
+       fdt = buf;
+
+       fdt_set_header(fdt, totalsize, bufsize);
+
+       /* FIXME: re-order if necessary */
+
+       err = rw_check_header(fdt);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+int fdt_pack(void *fdt)
+{
+       int err;
+
+       err = rw_check_header(fdt);
+       if (err)
+               return err;
+
+       /* FIXME: pack components */
+       fdt_set_header(fdt, totalsize, _blob_data_size(fdt));
+       return 0;
+}
diff --git a/libfdt/fdt_strerror.c b/libfdt/fdt_strerror.c
new file mode 100644 (file)
index 0000000..7f231ce
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+struct errtabent {
+       const char *str;
+};
+
+#define ERRTABENT(val) \
+       [(val)] = { .str = #val, }
+
+static struct errtabent errtable[] = {
+       ERRTABENT(FDT_ERR_NOTFOUND),
+       ERRTABENT(FDT_ERR_EXISTS),
+       ERRTABENT(FDT_ERR_NOSPACE),
+
+       ERRTABENT(FDT_ERR_BADOFFSET),
+       ERRTABENT(FDT_ERR_BADPATH),
+       ERRTABENT(FDT_ERR_BADSTATE),
+
+       ERRTABENT(FDT_ERR_TRUNCATED),
+       ERRTABENT(FDT_ERR_BADMAGIC),
+       ERRTABENT(FDT_ERR_BADVERSION),
+       ERRTABENT(FDT_ERR_BADSTRUCTURE),
+       ERRTABENT(FDT_ERR_BADLAYOUT),
+};
+#define ERRTABSIZE     (sizeof(errtable) / sizeof(errtable[0]))
+
+const char *fdt_strerror(int errval)
+{
+       if (errval > 0)
+               return "<valid offset/length>";
+       else if (errval == 0)
+               return "<no error>";
+       else if (errval > -ERRTABSIZE) {
+               const char *s = errtable[-errval].str;
+
+               if (s)
+                       return s;
+       }
+
+       return "<unknown error>";
+}
diff --git a/libfdt/fdt_sw.c b/libfdt/fdt_sw.c
new file mode 100644 (file)
index 0000000..672f4dd
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+static int check_header_sw(void *fdt)
+{
+       if (fdt_magic(fdt) != SW_MAGIC)
+               return -FDT_ERR_BADMAGIC;
+       return 0;
+}
+
+static void *grab_space(void *fdt, int len)
+{
+       int offset = fdt_size_dt_struct(fdt);
+       int spaceleft;
+
+       spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
+               - fdt_size_dt_strings(fdt);
+
+       if ((offset + len < offset) || (offset + len > spaceleft))
+               return NULL;
+
+       fdt_set_header(fdt, size_dt_struct, offset + len);
+       return fdt_offset_ptr(fdt, offset, len);
+}
+
+int fdt_create(void *buf, int bufsize)
+{
+       void *fdt = buf;
+
+       if (bufsize < sizeof(struct fdt_header))
+               return -FDT_ERR_NOSPACE;
+
+       memset(buf, 0, bufsize);
+
+       fdt_set_header(fdt, magic, SW_MAGIC);
+       fdt_set_header(fdt, version, FDT_LAST_SUPPORTED_VERSION);
+       fdt_set_header(fdt, last_comp_version, FDT_FIRST_SUPPORTED_VERSION);
+       fdt_set_header(fdt, totalsize, bufsize);
+
+       fdt_set_header(fdt, off_mem_rsvmap, ALIGN(sizeof(struct fdt_header),
+                                             sizeof(struct fdt_reserve_entry)));
+       fdt_set_header(fdt, off_dt_struct, fdt_off_mem_rsvmap(fdt));
+       fdt_set_header(fdt, off_dt_strings, bufsize);
+
+       return 0;
+}
+
+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
+{
+       struct fdt_reserve_entry *re;
+       int err = check_header_sw(fdt);
+       int offset;
+
+       if (err)
+               return err;
+       if (fdt_size_dt_struct(fdt))
+               return -FDT_ERR_BADSTATE;
+
+       offset = fdt_off_dt_struct(fdt);
+       if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
+               return -FDT_ERR_NOSPACE;
+
+       re = (struct fdt_reserve_entry *)((void *)fdt + offset);
+       re->address = cpu_to_fdt64(addr);
+       re->size = cpu_to_fdt64(size);
+
+       fdt_set_header(fdt, off_dt_struct, offset + sizeof(*re));
+
+       return 0;
+}
+
+int fdt_finish_reservemap(void *fdt)
+{
+       return fdt_add_reservemap_entry(fdt, 0, 0);
+}
+
+int fdt_begin_node(void *fdt, const char *name)
+{
+       struct fdt_node_header *nh;
+       int err = check_header_sw(fdt);
+       int namelen = strlen(name) + 1;
+
+       if (err)
+               return err;
+
+       nh = grab_space(fdt, sizeof(*nh) + ALIGN(namelen, FDT_TAGSIZE));
+       if (! nh)
+               return -FDT_ERR_NOSPACE;
+
+       nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
+       memcpy(nh->name, name, namelen);
+       return 0;
+}
+
+int fdt_end_node(void *fdt)
+{
+       uint32_t *en;
+       int err = check_header_sw(fdt);
+
+       if (err)
+               return err;
+
+       en = grab_space(fdt, FDT_TAGSIZE);
+       if (! en)
+               return -FDT_ERR_NOSPACE;
+
+       *en = cpu_to_fdt32(FDT_END_NODE);
+       return 0;
+}
+
+static int find_add_string(void *fdt, const char *s)
+{
+       char *strtab = (char *)fdt + fdt_totalsize(fdt);
+       const char *p;
+       int strtabsize = fdt_size_dt_strings(fdt);
+       int len = strlen(s) + 1;
+       int struct_top, offset;
+
+       p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
+       if (p)
+               return p - strtab;
+
+       /* Add it */
+       offset = -strtabsize - len;
+       struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+       if (fdt_totalsize(fdt) + offset < struct_top)
+               return 0; /* no more room :( */
+
+       memcpy(strtab + offset, s, len);
+       fdt_set_header(fdt, size_dt_strings, strtabsize + len);
+       return offset;
+}
+
+int fdt_property(void *fdt, const char *name, const void *val, int len)
+{
+       struct fdt_property *prop;
+       int err = check_header_sw(fdt);
+       int nameoff;
+
+       if (err)
+               return err;
+
+       nameoff = find_add_string(fdt, name);
+       if (nameoff == 0)
+               return -FDT_ERR_NOSPACE;
+
+       prop = grab_space(fdt, sizeof(*prop) + ALIGN(len, FDT_TAGSIZE));
+       if (! prop)
+               return -FDT_ERR_NOSPACE;
+
+       prop->tag = cpu_to_fdt32(FDT_PROP);
+       prop->nameoff = cpu_to_fdt32(nameoff);
+       prop->len = cpu_to_fdt32(len);
+       memcpy(prop->data, val, len);
+       return 0;
+}
+
+int fdt_finish(void *fdt)
+{
+       int err = check_header_sw(fdt);
+       char *p = (char *)fdt;
+       uint32_t *end;
+       int oldstroffset, newstroffset;
+       uint32_t tag;
+       int offset, nextoffset;
+
+       if (err)
+               return err;
+
+       /* Add terminator */
+       end = grab_space(fdt, sizeof(*end));
+       if (! end)
+               return -FDT_ERR_NOSPACE;
+       *end = cpu_to_fdt32(FDT_END);
+
+       /* Relocate the string table */
+       oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
+       newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+       memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
+       fdt_set_header(fdt, off_dt_strings, newstroffset);
+
+       /* Walk the structure, correcting string offsets */
+       offset = 0;
+       while ((tag = fdt_next_tag(fdt, offset, &nextoffset, NULL)) != FDT_END) {
+               if (tag == FDT_PROP) {
+                       struct fdt_property *prop = fdt_offset_ptr(fdt, offset,
+                                                                  sizeof(*prop));
+                       int nameoff;
+
+                       if (! prop)
+                               return -FDT_ERR_BADSTRUCTURE;
+
+                       nameoff = fdt32_to_cpu(prop->nameoff);
+                       nameoff += fdt_size_dt_strings(fdt);
+                       prop->nameoff = cpu_to_fdt32(nameoff);
+               }
+               offset = nextoffset;
+       }
+
+       /* Finally, adjust the header */
+       fdt_set_header(fdt, totalsize, newstroffset + fdt_size_dt_strings(fdt));
+       fdt_set_header(fdt, magic, FDT_MAGIC);
+       return 0;
+}
diff --git a/libfdt/fdt_wip.c b/libfdt/fdt_wip.c
new file mode 100644 (file)
index 0000000..2d2ed37
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
+                       const void *val, int len)
+{
+       void *propval;
+       int proplen;
+
+       propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
+       if (! propval)
+               return proplen;
+
+       if (proplen != len)
+               return -FDT_ERR_NOSPACE;
+
+       memcpy(propval, val, len);
+       return 0;
+}
+
+static void nop_region(void *start, int len)
+{
+       uint32_t *p;
+
+       for (p = start; (void *)p < (start + len); p++)
+               *p = cpu_to_fdt32(FDT_NOP);
+}
+
+int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
+{
+       struct fdt_property *prop;
+       int len;
+
+       prop = fdt_get_property(fdt, nodeoffset, name, &len);
+       if (! prop)
+               return len;
+
+       nop_region(prop, len + sizeof(*prop));
+
+       return 0;
+}
+
+int _fdt_node_end_offset(void *fdt, int nodeoffset)
+{
+       int level = 0;
+       uint32_t tag;
+       int offset, nextoffset;
+
+       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset, NULL);
+       if (tag != FDT_BEGIN_NODE)
+               return -FDT_ERR_BADOFFSET;
+       do {
+               offset = nextoffset;
+               tag = fdt_next_tag(fdt, offset, &nextoffset, NULL);
+
+               switch (tag) {
+               case FDT_END:
+                       return offset;
+
+               case FDT_BEGIN_NODE:
+                       level++;
+                       break;
+
+               case FDT_END_NODE:
+                       level--;
+                       break;
+
+               case FDT_PROP:
+               case FDT_NOP:
+                       break;
+
+               default:
+                       return -FDT_ERR_BADSTRUCTURE;
+               }
+       } while (level >= 0);
+
+       return nextoffset;
+}
+
+int fdt_nop_node(void *fdt, int nodeoffset)
+{
+       int endoffset;
+
+       endoffset = _fdt_node_end_offset(fdt, nodeoffset);
+       if (endoffset < 0)
+               return endoffset;
+
+       nop_region(fdt_offset_ptr(fdt, nodeoffset, 0), endoffset - nodeoffset);
+       return 0;
+}
+
+/*
+ * Replace a reserve map entry in the nth slot.
+ */
+int fdt_replace_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size)
+{
+       struct fdt_reserve_entry *re;
+       int  used;
+       int  total;
+       int  err;
+
+       err = fdt_num_reservemap(fdt, &used, &total);
+       if (err != 0)
+               return err;
+
+       if (n >= total)
+               return -FDT_ERR_NOSPACE;
+       re = (struct fdt_reserve_entry *)
+               (fdt + fdt_off_mem_rsvmap(fdt) +
+                (n * sizeof(struct fdt_reserve_entry)));
+       re->address = cpu_to_fdt64(addr);
+       re->size    = cpu_to_fdt64(size);
+
+       return 0;
+}
diff --git a/libfdt/libfdt_internal.h b/libfdt/libfdt_internal.h
new file mode 100644 (file)
index 0000000..cc9633c
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _LIBFDT_INTERNAL_H
+#define _LIBFDT_INTERNAL_H
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <fdt.h>
+
+#define ALIGN(x, a)    (((x) + (a) - 1) & ~((a) - 1))
+#define PALIGN(p, a)   ((void *)ALIGN((unsigned long)(p), (a)))
+
+#define memeq(p, q, n) (memcmp((p), (q), (n)) == 0)
+#define streq(p, q)    (strcmp((p), (q)) == 0)
+
+int _fdt_check_header(const void *fdt);
+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
+int _fdt_node_end_offset(void *fdt, int nodeoffset);
+
+static inline void *_fdt_offset_ptr(const struct fdt_header *fdt, int offset)
+{
+       return (void *)fdt + fdt_off_dt_struct(fdt) + offset;
+}
+
+#define SW_MAGIC               (~FDT_MAGIC)
+
+#endif /* _LIBFDT_INTERNAL_H */
index b3ac8e08cfc0b73dcd03584907cbd2ec88ac12b3..06ddefa4cee0ea7e8aae0d95df26042abed9b730 100644 (file)
@@ -22,7 +22,7 @@
 # MA 02111-1307 USA
 #
 
-PLATFORM_CPPFLAGS += -ffixed-r31
+PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
 
 ifdef CONFIG_MICROBLAZE_HARD_MULT
 PLATFORM_CPPFLAGS += -mno-xl-soft-mul
index cca93920594b521b634c8315462b1518d4208350..0fc22115dc20772349dde0e9bd9fd7fa849314d4 100644 (file)
--- a/net/eth.c
+++ b/net/eth.c
@@ -52,9 +52,12 @@ extern int rtl8139_initialize(bd_t*);
 extern int rtl8169_initialize(bd_t*);
 extern int scc_initialize(bd_t*);
 extern int skge_initialize(bd_t*);
+extern int tsi108_eth_initialize(bd_t*);
 extern int tsec_initialize(bd_t*, int, char *);
 extern int npe_initialize(bd_t *);
 extern int uec_initialize(int);
+extern int bfin_EMAC_initialize(bd_t *);
+extern int atstk1000_eth_initialize(bd_t *);
 
 static struct eth_device *eth_devices, *eth_current;
 
@@ -249,12 +252,21 @@ int eth_initialize(bd_t *bis)
 #ifdef CONFIG_NS8382X
        ns8382x_initialize(bis);
 #endif
+#if defined(CONFIG_TSI108_ETH)
+       tsi108_eth_initialize(bis);
+#endif
 #if defined(CONFIG_RTL8139)
        rtl8139_initialize(bis);
 #endif
 #if defined(CONFIG_RTL8169)
        rtl8169_initialize(bis);
 #endif
+#if defined(CONFIG_BF537)
+       bfin_EMAC_initialize(bis);
+#endif
+#if defined(CONFIG_ATSTK1000)
+       atstk1000_eth_initialize(bis);
+#endif
 
        if (!eth_devices) {
                puts ("No ethernet found.\n");
index 1d1c98f3c20204c74ef3173b50537e21af8c60cd..2ff7bfc09f0bf63ae6ca488df6fabce7f44d32b7 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -1424,6 +1424,26 @@ NetReceive(volatile uchar * inpkt, int len)
                                /* XXX point to ip packet */
                                (*packetHandler)((uchar *)ip, 0, 0, 0);
                                return;
+                       case ICMP_ECHO_REQUEST:
+#ifdef ET_DEBUG
+                               printf ("Got ICMP ECHO REQUEST, return %d bytes \n",
+                                       ETHER_HDR_SIZE + len);
+#endif
+                               memcpy (&et->et_dest[0], &et->et_src[0], 6);
+                               memcpy (&et->et_src[ 0], NetOurEther, 6);
+
+                               ip->ip_sum = 0;
+                               ip->ip_off = 0;
+                               NetCopyIP((void*)&ip->ip_dst, &ip->ip_src);
+                               NetCopyIP((void*)&ip->ip_src, &NetOurIP);
+                               ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP >> 1);
+
+                               icmph->type = ICMP_ECHO_REPLY;
+                               icmph->checksum = 0;
+                               icmph->checksum = ~NetCksum((uchar *)icmph,
+                                               (len - IP_HDR_SIZE_NO_UDP) >> 1);
+                               (void) eth_send((uchar *)et, ETHER_HDR_SIZE + len);
+                               return;
 #endif
                        default:
                                return;
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
similarity index 89%
rename from board/ezkit533/config.mk
rename to post/board/lwmon/Makefile
index 36c9f997dde3c14ac2fe71f612b7b27848d4d9fa..899b0dc1f303eec11086ac79620c9f73e7f65987 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2001
+# (C) Copyright 2002-2006
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -21,5 +21,9 @@
 # MA 02111-1307 USA
 #
 
-TEXT_BASE = 0x01FC0000
-PLATFORM_CPPFLAGS += -I$(TOPDIR)
+
+LIB    = libpostlwmon.a
+
+COBJS  = sysmon.o
+
+include $(TOPDIR)/post/rules.mk
similarity index 100%
rename from post/sysmon.c
rename to post/board/lwmon/sysmon.c
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
similarity index 100%
rename from post/codec.c
rename to post/board/netta/codec.c
similarity index 100%
rename from post/dsp.c
rename to post/board/netta/dsp.c
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
similarity index 100%
rename from post/cache_8xx.S
rename to post/cpu/mpc8xx/cache_8xx.S
similarity index 100%
rename from post/ether.c
rename to post/cpu/mpc8xx/ether.c
similarity index 100%
rename from post/spr.c
rename to post/cpu/mpc8xx/spr.c
similarity index 100%
rename from post/uart.c
rename to post/cpu/mpc8xx/uart.c
similarity index 100%
rename from post/usb.c
rename to post/cpu/mpc8xx/usb.c
similarity index 100%
rename from post/watchdog.c
rename to post/cpu/mpc8xx/watchdog.c
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
similarity index 100%
rename from post/cache.c
rename to post/drivers/cache.c
similarity index 100%
rename from post/i2c.c
rename to post/drivers/i2c.c
similarity index 100%
rename from post/memory.c
rename to post/drivers/memory.c
similarity index 100%
rename from post/rtc.c
rename to post/drivers/rtc.c
similarity index 93%
rename from post/cpu/Makefile
rename to post/lib_ppc/Makefile
index 645e83856c8ff171b6e119388a13092e4d7368e0..14354a032363e449e380b27eabe945a15aa5e863 100644 (file)
 # MA 02111-1307 USA
 #
 
-SUBDIRS =
 
-LIB    = libcpu.a
+LIB    = libpostppc.a
 
 AOBJS  = asm.o
-COBJS  = cmp.o cmpi.o two.o twox.o three.o threex.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
 
similarity index 100%
rename from post/cpu/andi.c
rename to post/lib_ppc/andi.c
similarity index 100%
rename from post/cpu/asm.S
rename to post/lib_ppc/asm.S
similarity index 100%
rename from post/cpu/b.c
rename to post/lib_ppc/b.c
similarity index 100%
rename from post/cpu/cmp.c
rename to post/lib_ppc/cmp.c
similarity index 100%
rename from post/cpu/cmpi.c
rename to post/lib_ppc/cmpi.c
similarity index 100%
rename from post/cpu/complex.c
rename to post/lib_ppc/complex.c
similarity index 100%
rename from post/cpu.c
rename to post/lib_ppc/cpu.c
similarity index 100%
rename from post/cpu/cpu_asm.h
rename to post/lib_ppc/cpu_asm.h
similarity index 100%
rename from post/cpu/cr.c
rename to post/lib_ppc/cr.c
similarity index 100%
rename from post/cpu/load.c
rename to post/lib_ppc/load.c
similarity index 100%
rename from post/cpu/multi.c
rename to post/lib_ppc/multi.c
similarity index 100%
rename from post/cpu/rlwimi.c
rename to post/lib_ppc/rlwimi.c
similarity index 100%
rename from post/cpu/rlwinm.c
rename to post/lib_ppc/rlwinm.c
similarity index 100%
rename from post/cpu/rlwnm.c
rename to post/lib_ppc/rlwnm.c
similarity index 100%
rename from post/cpu/srawi.c
rename to post/lib_ppc/srawi.c
similarity index 100%
rename from post/cpu/store.c
rename to post/lib_ppc/store.c
similarity index 100%
rename from post/cpu/string.c
rename to post/lib_ppc/string.c
similarity index 100%
rename from post/cpu/three.c
rename to post/lib_ppc/three.c
similarity index 100%
rename from post/cpu/threei.c
rename to post/lib_ppc/threei.c
similarity index 100%
rename from post/cpu/threex.c
rename to post/lib_ppc/threex.c
similarity index 100%
rename from post/cpu/two.c
rename to post/lib_ppc/two.c
similarity index 100%
rename from post/cpu/twox.c
rename to post/lib_ppc/twox.c
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
 }
index cdc8ac934f94abe305cb4bdff4ef0aa82c8d9818..96c68c0ce7160d1ef572604083ae2da8ef1f247e 100644 (file)
@@ -28,7 +28,7 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)librtc.a
 
 COBJS  = date.o   \
-         bf533_rtc.o ds12887.o ds1302.o ds1306.o ds1307.o \
+         bf5xx_rtc.o ds12887.o ds1302.o ds1306.o ds1307.o \
          ds1337.o ds1374.o ds1556.o ds164x.o ds174x.o ds3231.o \
          m41t11.o max6900.o m48t35ax.o mc146818.o mk48t59.o \
          mpc5xxx.o mpc8xx.o pcf8563.o s3c24x0_rtc.o rs5c372.o
similarity index 75%
rename from rtc/bf533_rtc.c
rename to rtc/bf5xx_rtc.c
index 948be64102d3f30f9cd40ccf5d5dc7767049b6d4..85bbb56e3960cb51e9e98fe5301399ab1ad2e369 100644 (file)
 #include <command.h>
 #include <rtc.h>
 
-#if defined(CONFIG_RTC_BF533) && (CONFIG_COMMANDS & CFG_CMD_DATE)
+#if defined(CONFIG_RTC_BFIN) && (CONFIG_COMMANDS & CFG_CMD_DATE)
 
 #include <asm/blackfin.h>
-#include <asm/cpu/bf533_rtc.h>
+#include <asm/arch/bf5xx_rtc.h>
 
-void rtc_reset (void)
+void rtc_reset(void)
 {
        return;                 /* nothing to do */
 }
 
 /* Wait for pending writes to complete */
-void wait_for_complete (void)
+void wait_for_complete(void)
 {
-       while (!(*(volatile unsigned short *) RTC_ISTAT & 0x8000)) {
-               printf ("");
+       while (!(*(volatile unsigned short *)RTC_ISTAT & 0x8000)) {
+               printf("");
        }
-       *(volatile unsigned short *) RTC_ISTAT = 0x8000;
+       *(volatile unsigned short *)RTC_ISTAT = 0x8000;
 }
 
 /* Enable the RTC prescaler enable register */
-void rtc_init ()
+void rtc_init()
 {
-       *(volatile unsigned short *) RTC_PREN = 0x1;
-       wait_for_complete ();
+       *(volatile unsigned short *)RTC_PREN = 0x1;
+       wait_for_complete();
 }
 
 /* Set the time. Get the time_in_secs which is the number of seconds since Jan 1970 and set the RTC registers
  * based on this value.
  */
-void rtc_set (struct rtc_time *tmp)
+void rtc_set(struct rtc_time *tmp)
 {
        unsigned long n_days_1970 = 0;
        unsigned long n_secs_rem = 0;
@@ -88,46 +88,46 @@ void rtc_set (struct rtc_time *tmp)
        unsigned long time_in_secs;
 
        if (tmp == NULL) {
-               printf ("Error setting the date/time \n");
+               printf("Error setting the date/time \n");
                return;
        }
 
        time_in_secs =
-               mktime (tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_hour,
-                       tmp->tm_min, tmp->tm_sec);
+           mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_hour,
+                  tmp->tm_min, tmp->tm_sec);
 
        /* Compute no. of days since 1970 */
-       n_days_1970 = (unsigned long) (time_in_secs / (NUM_SECS_IN_DAY));
+       n_days_1970 = (unsigned long)(time_in_secs / (NUM_SECS_IN_DAY));
 
        /* From the remining secs, compute the hrs(0-23), mins(0-59) and secs(0-59) */
-       n_secs_rem = (unsigned long) (time_in_secs % (NUM_SECS_IN_DAY));
+       n_secs_rem = (unsigned long)(time_in_secs % (NUM_SECS_IN_DAY));
        n_hrs = n_secs_rem / (NUM_SECS_IN_HOUR);
        n_secs_rem = n_secs_rem % (NUM_SECS_IN_HOUR);
        n_mins = n_secs_rem / (NUM_SECS_IN_MIN);
        n_secs = n_secs_rem % (NUM_SECS_IN_MIN);
 
        /* Store the new time in the RTC_STAT register */
-       *(volatile unsigned long *) RTC_STAT =
-               ((n_days_1970 << DAY_BITS_OFF) | (n_hrs << HOUR_BITS_OFF) |
-                (n_mins << MIN_BITS_OFF) | (n_secs << SEC_BITS_OFF));
+       *(volatile unsigned long *)RTC_STAT =
+           ((n_days_1970 << DAY_BITS_OFF) | (n_hrs << HOUR_BITS_OFF) |
+            (n_mins << MIN_BITS_OFF) | (n_secs << SEC_BITS_OFF));
 
-       wait_for_complete ();
+       wait_for_complete();
 }
 
 /* Read the time from the RTC_STAT. time_in_seconds is seconds since Jan 1970 */
-void rtc_get (struct rtc_time *tmp)
+void rtc_get(struct rtc_time *tmp)
 {
        unsigned long cur_rtc_stat = 0;
        unsigned long time_in_sec;
        unsigned long tm_sec = 0, tm_min = 0, tm_hour = 0, tm_day = 0;
 
        if (tmp == NULL) {
-               printf ("Error getting the date/time \n");
+               printf("Error getting the date/time \n");
                return;
        }
 
        /* Read the RTC_STAT register */
-       cur_rtc_stat = *(volatile unsigned long *) RTC_STAT;
+       cur_rtc_stat = *(volatile unsigned long *)RTC_STAT;
 
        /* Get the secs (0-59), mins (0-59), hrs (0-23) and the days since Jan 1970 */
        tm_sec = (cur_rtc_stat >> SEC_BITS_OFF) & 0x3f;
@@ -137,9 +137,7 @@ void rtc_get (struct rtc_time *tmp)
 
        /* Calculate the total number of seconds since Jan 1970 */
        time_in_sec = (tm_sec) +
-               MIN_TO_SECS (tm_min) +
-               HRS_TO_SECS (tm_hour) +
-               DAYS_TO_SECS (tm_day);
-       to_tm (time_in_sec, tmp);
+           MIN_TO_SECS(tm_min) + HRS_TO_SECS(tm_hour) + DAYS_TO_SECS(tm_day);
+       to_tm(time_in_sec, tmp);
 }
-#endif /* CONFIG_RTC_BF533 && CFG_CMD_DATE */
+#endif                         /* CONFIG_RTC_BFIN && CFG_CMD_DATE */