summaryrefslogtreecommitdiff
path: root/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch
diff options
context:
space:
mode:
authorStelios Koroneos <skoroneos@digital-opsis.com>2007-11-05 13:13:12 +0000
committerStelios Koroneos <skoroneos@digital-opsis.com>2007-11-05 13:13:12 +0000
commit1f283a10afe40f2290fd995330c2c29485ca4ea2 (patch)
tree3c8d5ca9e51aa4434f874e0610d99d674cf48937 /packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch
parent0a805d5fb077877d61ff75709b37605deb60df0e (diff)
packages/uboot/u-boot_1.1.6.bb : Add support for the MPC8323e-rdb board
Diffstat (limited to 'packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch')
-rw-r--r--packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch32020
1 files changed, 32020 insertions, 0 deletions
diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch
new file mode 100644
index 0000000000..5f3e1f7aaa
--- /dev/null
+++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch
@@ -0,0 +1,32020 @@
+This patch, when applied against the external pristine
+tarball u-boot-1.1.6.tar.bz2, makes the u-boot code match the git tree
+with sha1 dd520bf314c7add4183c5191692180f576f96b60,
+in the repository http://opensource.freescale.com/pub/scm/u-boot-83xx.git.
+This git tag is identified for this code baseline: u-boot-1.1.6-fsl-1
+
+The patch includes support changes for mpc8349itx, mpc8349emds, and mpc8360emds
+as well as many other changes as of November 30, 2006.
+
+diff -Naupr u-boot-1.1.6/board/amcc/yellowstone/yellowstone.c u-boot-1.1.6-fsl-1/board/amcc/yellowstone/yellowstone.c
+--- u-boot-1.1.6/board/amcc/yellowstone/yellowstone.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/amcc/yellowstone/yellowstone.c 2006-11-30 12:34:13.000000000 -0600
+@@ -552,3 +552,9 @@ void hw_watchdog_reset(void)
+
+ }
+ #endif
++
++void board_reset(void)
++{
++ /* give reset to BCSR */
++ *(unsigned char *)(CFG_BCSR_BASE | 0x06) = 0x09;
++}
+diff -Naupr u-boot-1.1.6/board/amcc/yosemite/yosemite.c u-boot-1.1.6-fsl-1/board/amcc/yosemite/yosemite.c
+--- u-boot-1.1.6/board/amcc/yosemite/yosemite.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/amcc/yosemite/yosemite.c 2006-11-30 12:34:13.000000000 -0600
+@@ -548,3 +548,9 @@ void hw_watchdog_reset(void)
+
+ }
+ #endif
++
++void board_reset(void)
++{
++ /* give reset to BCSR */
++ *(unsigned char *)(CFG_BCSR_BASE | 0x06) = 0x09;
++}
+diff -Naupr u-boot-1.1.6/board/bc3450/bc3450.c u-boot-1.1.6-fsl-1/board/bc3450/bc3450.c
+--- u-boot-1.1.6/board/bc3450/bc3450.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/bc3450/bc3450.c 2006-11-10 11:24:28.000000000 -0600
+@@ -295,7 +295,6 @@ void pci_init_board(void)
+ #endif
+
+ #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
+-#define GPIO_PSC1_4 0x01000000UL
+
+ void init_ide_reset (void)
+ {
+@@ -311,9 +310,9 @@ void ide_set_reset (int idereset)
+ debug ("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/cfm_flash.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/cfm_flash.c
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/cfm_flash.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/cfm_flash.c 2006-12-06 10:33:49.000000000 -0600
+@@ -60,7 +60,7 @@ void cfm_flash_init (flash_info_t * info
+ MCFCFM_MCR = 0;
+ MCFCFM_CLKD = CFM_CLK;
+ debug ("CFM Clock divider: %ld (%d Hz @ %ld Hz)\n",CFM_CLK,\
+- CFG_CLK / (2* ((CFM_CLK & 0x3F)+1) * (1+((CFM_CLK & 0x40)>>6)*7)),\
++ CFG_CLK / (2* ((CFM_CLK & 0x3F)+1) * (1+((CFM_CLK & 0x40)>>6)*7)),\
+ CFG_CLK);
+ MCFCFM_SACC = 0;
+ MCFCFM_DACC = 0;
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c 2006-12-06 10:33:49.000000000 -0600
+@@ -50,13 +50,13 @@ long int initdram (int board_type)
+
+ MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE(CFG_SDRAM_BASE0)
+ | MCFSDRAMC_DACR_CASL(1)
+- | MCFSDRAMC_DACR_CBM(3)
++ | MCFSDRAMC_DACR_CBM(3)
+ | MCFSDRAMC_DACR_PS_16);
+
+ MCFSDRAMC_DMR0 = MCFSDRAMC_DMR_BAM_16M
+ | MCFSDRAMC_DMR_V;
+
+- MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP;
++ MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP;
+
+ *(unsigned short *)(CFG_SDRAM_BASE0) = 0xA5A5;
+ MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE;
+@@ -70,10 +70,10 @@ long int initdram (int board_type)
+ #ifdef CFG_SDRAM_BASE1
+ MCFSDRAMC_DACR1 = MCFSDRAMC_DACR_BASE(CFG_SDRAM_BASE1)
+ | MCFSDRAMC_DACR_CASL(1)
+- | MCFSDRAMC_DACR_CBM(3)
++ | MCFSDRAMC_DACR_CBM(3)
+ | MCFSDRAMC_DACR_PS_16;
+
+- MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M
++ MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M
+ | MCFSDRAMC_DMR_V;
+
+ MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IP;
+@@ -82,7 +82,7 @@ long int initdram (int board_type)
+ MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_RE;
+ for (i=0; i < 2000; i++)
+ asm(" nop");
+- MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS;
++ MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS;
+ *(unsigned int *)(CFG_SDRAM_BASE1 + 0x220) = 0xA5A5;
+ size += CFG_SDRAM_SIZE1 * 1024 * 1024;
+ #endif
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/flash.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/flash.c
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/flash.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/flash.c 2006-12-06 10:33:49.000000000 -0600
+@@ -256,7 +256,7 @@ int flash_erase (flash_info_t * info, in
+ enable_interrupts ();
+
+ if (cflag)
+- icache_enable ();
++ icache_enable ();
+
+ return rc;
+ }
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/u-boot.lds u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/u-boot.lds
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/u-boot.lds 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/u-boot.lds 2006-12-06 10:33:49.000000000 -0600
+@@ -34,11 +34,11 @@ SECTIONS
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rel.text : { *(.rel.text) }
+- .rela.text : { *(.rela.text) }
++ .rela.text : { *(.rela.text) }
+ .rel.data : { *(.rel.data) }
+- .rela.data : { *(.rela.data) }
+- .rel.rodata : { *(.rel.rodata) }
+- .rela.rodata : { *(.rela.rodata) }
++ .rela.data : { *(.rela.data) }
++ .rel.rodata : { *(.rel.rodata) }
++ .rela.rodata : { *(.rela.rodata) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.c
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.c 2006-12-06 10:33:49.000000000 -0600
+@@ -66,7 +66,7 @@ int init_vcxk(void)
+ return 1;
+ }
+
+-void vcxk_loadimage(ulong source)
++void vcxk_loadimage(ulong source)
+ {
+ int cnt;
+ vcxk_acknowledge_wait();
+diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.h u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.h
+--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.h 2006-12-06 10:33:49.000000000 -0600
+@@ -25,24 +25,24 @@
+ #define __VCXK_H_
+
+ extern int init_vcxk(void);
+-void vcxk_loadimage(ulong source);
++void vcxk_loadimage(ulong source);
+
+ #define VIDEO_ACKNOWLEDGE_PORT MCFGPTB_GPTPORT
+-#define VIDEO_ACKNOWLEDGE_DDR MCFGPTB_GPTDDR
++#define VIDEO_ACKNOWLEDGE_DDR MCFGPTB_GPTDDR
+ #define VIDEO_ACKNOWLEDGE_PIN 0x0001
+
+-#define VIDEO_ENABLE_PORT MCFGPTB_GPTPORT
+-#define VIDEO_ENABLE_DDR MCFGPTB_GPTDDR
++#define VIDEO_ENABLE_PORT MCFGPTB_GPTPORT
++#define VIDEO_ENABLE_DDR MCFGPTB_GPTDDR
+ #define VIDEO_ENABLE_PIN 0x0002
+
+-#define VIDEO_REQUEST_PORT MCFGPTB_GPTPORT
+-#define VIDEO_REQUEST_DDR MCFGPTB_GPTDDR
++#define VIDEO_REQUEST_PORT MCFGPTB_GPTPORT
++#define VIDEO_REQUEST_DDR MCFGPTB_GPTDDR
+ #define VIDEO_REQUEST_PIN 0x0004
+
+ #define VIDEO_Invert_CFG MCFGPIO_PEPAR
+ #define VIDEO_Invert_IO MCFGPIO_PEPAR_PEPA2
+-#define VIDEO_INVERT_PORT MCFGPIO_PORTE
+-#define VIDEO_INVERT_DDR MCFGPIO_DDRE
++#define VIDEO_INVERT_PORT MCFGPIO_PORTE
++#define VIDEO_INVERT_DDR MCFGPIO_DDRE
+ #define VIDEO_INVERT_PIN MCFGPIO_PORT2
+
+ #endif
+diff -Naupr u-boot-1.1.6/board/emk/top5200/top5200.c u-boot-1.1.6-fsl-1/board/emk/top5200/top5200.c
+--- u-boot-1.1.6/board/emk/top5200/top5200.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/emk/top5200/top5200.c 2006-12-06 10:33:49.000000000 -0600
+@@ -186,13 +186,11 @@ void pci_init_board(void)
+ *****************************************************************************/
+ #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 */
++ /* 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;
+ }
+@@ -202,9 +200,9 @@ void ide_set_reset (int idereset)
+ debug ("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+diff -Naupr u-boot-1.1.6/board/esd/cpci5200/cpci5200.c u-boot-1.1.6-fsl-1/board/esd/cpci5200/cpci5200.c
+--- u-boot-1.1.6/board/esd/cpci5200/cpci5200.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/esd/cpci5200/cpci5200.c 2006-12-06 10:33:49.000000000 -0600
+@@ -191,16 +191,13 @@ static struct pci_controller hose;
+
+ extern void pci_mpc5xxx_init(struct pci_controller *);
+
+-void pci_init_board(void
+- ) {
++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");
+@@ -215,9 +212,9 @@ void ide_set_reset(int idereset)
+ debug("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+@@ -242,7 +239,7 @@ void init_ata_reset(void)
+ debug("init_ata_reset\n");
+
+ /* Configure GPIO_WU6 as GPIO output for ATA reset */
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_WU6;
++ *(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");
+diff -Naupr u-boot-1.1.6/board/esd/pf5200/pf5200.c u-boot-1.1.6-fsl-1/board/esd/pf5200/pf5200.c
+--- u-boot-1.1.6/board/esd/pf5200/pf5200.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/esd/pf5200/pf5200.c 2006-12-06 10:33:49.000000000 -0600
+@@ -191,16 +191,13 @@ static struct pci_controller hose;
+
+ extern void pci_mpc5xxx_init(struct pci_controller *);
+
+-void pci_init_board(void
+- ) {
++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");
+@@ -215,9 +212,9 @@ void ide_set_reset(int idereset)
+ debug("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+@@ -242,7 +239,7 @@ 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 |= GPIO_WU6;
++ *(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");
+@@ -272,10 +269,10 @@ void power_set_reset(int power)
+ debug("ide_set_reset(%d)\n", power);
+
+ if (power) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_WU6;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_WU6;
+ *(vu_long *) MPC5XXX_INTERRUPT_GPIO_DATA_OUTPUT &= ~GPIO_USB9;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_WU6;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WU6;
+ if ((*(vu_long *) MPC5XXX_INTERRUPT_GPIO_STATUS & GPIO_USB9S) ==
+ 0) {
+ *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_DATA_OUTPUT |=
+diff -Naupr u-boot-1.1.6/board/icecube/icecube.c u-boot-1.1.6-fsl-1/board/icecube/icecube.c
+--- u-boot-1.1.6/board/icecube/icecube.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/icecube/icecube.c 2006-12-06 10:33:49.000000000 -0600
+@@ -29,6 +29,10 @@
+ #include <pci.h>
+ #include <asm/processor.h>
+
++#if defined(CONFIG_OF_FLAT_TREE)
++#include <ft_build.h>
++#endif
++
+ #if defined(CONFIG_LITE5200B)
+ #include "mt46v32m16.h"
+ #else
+@@ -308,17 +312,15 @@ void pci_init_board(void)
+
+ #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 */
++ /* 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 |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+
+ void ide_set_reset (int idereset)
+@@ -326,11 +328,19 @@ void ide_set_reset (int idereset)
+ debug ("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(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 |= GPIO_PSC1_4;
++ *(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 -Naupr u-boot-1.1.6/board/inka4x0/inka4x0.c u-boot-1.1.6-fsl-1/board/inka4x0/inka4x0.c
+--- u-boot-1.1.6/board/inka4x0/inka4x0.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/inka4x0/inka4x0.c 2006-11-10 11:24:28.000000000 -0600
+@@ -173,9 +173,6 @@ void flash_preinit(void)
+ *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
+ }
+
+-#define GPIO_WKUP_7 0x80000000UL
+-#define GPIO_PSC3_9 0x04000000UL
+-
+ int misc_init_f (void)
+ {
+ uchar tmp[10];
+@@ -218,13 +215,13 @@ int misc_init_f (void)
+ *(vu_long *)MPC5XXX_WU_GPIO_DIR |= 0xc4000000;
+
+ /* Set LR mirror bit because it is low-active */
+- *(vu_long *)MPC5XXX_WU_GPIO_DATA |= GPIO_WKUP_7;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WKUP_7;
+ /*
+ * Reset Coral-P graphics controller
+ */
+ *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC3_9;
+ *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC3_9;
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC3_9;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC3_9;
+ return 0;
+ }
+
+@@ -241,8 +238,6 @@ void pci_init_board(void)
+
+ #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
+
+-#define GPIO_PSC1_4 0x01000000UL
+-
+ void init_ide_reset (void)
+ {
+ debug ("init_ide_reset\n");
+@@ -251,7 +246,7 @@ void init_ide_reset (void)
+ *(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 |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+
+ void ide_set_reset (int idereset)
+@@ -259,11 +254,11 @@ void ide_set_reset (int idereset)
+ debug ("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(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 |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+diff -Naupr u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds
+--- u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds 2006-12-06 10:33:49.000000000 -0600
+@@ -43,11 +43,11 @@ SECTIONS
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rel.text : { *(.rel.text) }
+- .rela.text : { *(.rela.text) }
++ .rela.text : { *(.rela.text) }
+ .rel.data : { *(.rel.data) }
+- .rela.data : { *(.rela.data) }
+- .rel.rodata : { *(.rel.rodata) }
+- .rela.rodata : { *(.rela.rodata) }
++ .rela.data : { *(.rela.data) }
++ .rel.rodata : { *(.rel.rodata) }
++ .rela.rodata : { *(.rela.rodata) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+diff -Naupr u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds.debug u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds.debug
+--- u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds.debug 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds.debug 2006-12-06 10:33:49.000000000 -0600
+@@ -43,11 +43,11 @@ SECTIONS
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rel.text : { *(.rel.text) }
+- .rela.text : { *(.rela.text) }
++ .rela.text : { *(.rela.text) }
+ .rel.data : { *(.rel.data) }
+- .rela.data : { *(.rela.data) }
+- .rel.rodata : { *(.rel.rodata) }
+- .rela.rodata : { *(.rela.rodata) }
++ .rela.data : { *(.rela.data) }
++ .rel.rodata : { *(.rel.rodata) }
++ .rela.rodata : { *(.rela.rodata) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/articiaS_pci.c u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/articiaS_pci.c
+--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/articiaS_pci.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/articiaS_pci.c 2006-12-06 10:33:49.000000000 -0600
+@@ -368,11 +368,11 @@ void articiaS_pci_init (void)
+ if (articiaS_init_vga() == -1)
+ {
+ /* If the VGA didn't init and we have stdout set to VGA, reset to serial */
+-/* s = getenv("stdout"); */
+-/* if (s && strcmp(s, "vga") == 0) */
+-/* { */
+-/* setenv("stdout", "serial"); */
+-/* } */
++/* s = getenv("stdout"); */
++/* if (s && strcmp(s, "vga") == 0) */
++/* { */
++/* setenv("stdout", "serial"); */
++/* } */
+ }
+ }
+ pci_write_config_byte(PCI_BDF(0,1,0), PCI_INTERRUPT_LINE, 0xFF);
+diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/enet.c u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/enet.c
+--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/enet.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/enet.c 2006-12-06 10:33:49.000000000 -0600
+@@ -41,57 +41,57 @@
+
+ /* 3Com Commands, top 5 bits are command and bottom 11 bits are parameters */
+
+-#define TotalReset (0<<11)
+-#define SelectWindow (1<<11)
+-#define StartCoax (2<<11)
+-#define RxDisable (3<<11)
+-#define RxEnable (4<<11)
+-#define RxReset (5<<11)
+-#define UpStall (6<<11)
+-#define UpUnstall (6<<11)+1
+-#define DownStall (6<<11)+2
+-#define DownUnstall (6<<11)+3
+-#define RxDiscard (8<<11)
+-#define TxEnable (9<<11)
+-#define TxDisable (10<<11)
+-#define TxReset (11<<11)
+-#define FakeIntr (12<<11)
+-#define AckIntr (13<<11)
+-#define SetIntrEnb (14<<11)
+-#define SetStatusEnb (15<<11)
+-#define SetRxFilter (16<<11)
+-#define SetRxThreshold (17<<11)
+-#define SetTxThreshold (18<<11)
+-#define SetTxStart (19<<11)
+-#define StartDMAUp (20<<11)
+-#define StartDMADown (20<<11)+1
++#define TotalReset (0<<11)
++#define SelectWindow (1<<11)
++#define StartCoax (2<<11)
++#define RxDisable (3<<11)
++#define RxEnable (4<<11)
++#define RxReset (5<<11)
++#define UpStall (6<<11)
++#define UpUnstall (6<<11)+1
++#define DownStall (6<<11)+2
++#define DownUnstall (6<<11)+3
++#define RxDiscard (8<<11)
++#define TxEnable (9<<11)
++#define TxDisable (10<<11)
++#define TxReset (11<<11)
++#define FakeIntr (12<<11)
++#define AckIntr (13<<11)
++#define SetIntrEnb (14<<11)
++#define SetStatusEnb (15<<11)
++#define SetRxFilter (16<<11)
++#define SetRxThreshold (17<<11)
++#define SetTxThreshold (18<<11)
++#define SetTxStart (19<<11)
++#define StartDMAUp (20<<11)
++#define StartDMADown (20<<11)+1
+ #define StatsEnable (21<<11)
+ #define StatsDisable (22<<11)
+-#define StopCoax (23<<11)
+-#define SetFilterBit (25<<11)
++#define StopCoax (23<<11)
++#define SetFilterBit (25<<11)
+
+ /* The SetRxFilter command accepts the following classes */
+
+-#define RxStation 1
++#define RxStation 1
+ #define RxMulticast 2
+ #define RxBroadcast 4
+-#define RxProm 8
++#define RxProm 8
+
+ /* 3Com status word defnitions */
+
+-#define IntLatch 0x0001
+-#define HostError 0x0002
+-#define TxComplete 0x0004
+-#define TxAvailable 0x0008
+-#define RxComplete 0x0010
+-#define RxEarly 0x0020
+-#define IntReq 0x0040
+-#define StatsFull 0x0080
+-#define DMADone (1<<8)
+-#define DownComplete (1<<9)
+-#define UpComplete (1<<10)
+-#define DMAInProgress (1<<11) /* DMA controller is still busy.*/
+-#define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/
++#define IntLatch 0x0001
++#define HostError 0x0002
++#define TxComplete 0x0004
++#define TxAvailable 0x0008
++#define RxComplete 0x0010
++#define RxEarly 0x0020
++#define IntReq 0x0040
++#define StatsFull 0x0080
++#define DMADone (1<<8)
++#define DownComplete (1<<9)
++#define UpComplete (1<<10)
++#define DMAInProgress (1<<11) /* DMA controller is still busy.*/
++#define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/
+
+ /* Polling Registers */
+
+@@ -100,17 +100,17 @@
+
+ /* Register window 0 offets */
+
+-#define Wn0EepromCmd 10 /* Window 0: EEPROM command register. */
+-#define Wn0EepromData 12 /* Window 0: EEPROM results register. */
++#define Wn0EepromCmd 10 /* Window 0: EEPROM command register. */
++#define Wn0EepromData 12 /* Window 0: EEPROM results register. */
+ #define IntrStatus 0x0E /* Valid in all windows. */
+
+ /* Register window 0 EEPROM bits */
+
+-#define EEPROM_Read 0x80
+-#define EEPROM_WRITE 0x40
+-#define EEPROM_ERASE 0xC0
+-#define EEPROM_EWENB 0x30 /* Enable erasing/writing for 10 msec. */
+-#define EEPROM_EWDIS 0x00 /* Disable EWENB before 10 msec timeout. */
++#define EEPROM_Read 0x80
++#define EEPROM_WRITE 0x40
++#define EEPROM_ERASE 0xC0
++#define EEPROM_EWENB 0x30 /* Enable erasing/writing for 10 msec. */
++#define EEPROM_EWDIS 0x00 /* Disable EWENB before 10 msec timeout. */
+
+ /* EEPROM locations. */
+
+@@ -129,13 +129,13 @@
+
+ /* Register window 1 offsets, the window used in normal operation */
+
+-#define TX_FIFO 0x10
+-#define RX_FIFO 0x10
+-#define RxErrors 0x14
+-#define RxStatus 0x18
++#define TX_FIFO 0x10
++#define RX_FIFOa 0x10
++#define RxErrors 0x14
++#define RxStatus 0x18
+ #define Timer 0x1A
+-#define TxStatus 0x1B
+-#define TxFree 0x1C /* Remaining free bytes in Tx buffer. */
++#define TxStatus 0x1B
++#define TxFree 0x1C /* Remaining free bytes in Tx buffer. */
+
+ /* Register Window 2 */
+
+@@ -147,47 +147,47 @@
+ #define Wn3_MAC_Ctrl 6
+ #define Wn3_Options 8
+
+-#define BFEXT(value, offset, bitcount) \
++#define BFEXT(value, offset, bitcount) \
+ ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1))
+
+ #define BFINS(lhs, rhs, offset, bitcount) \
+- (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \
++ (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \
+ (((rhs) & ((1 << (bitcount)) - 1)) << (offset)))
+
+ #define RAM_SIZE(v) BFEXT(v, 0, 3)
+-#define RAM_WIDTH(v) BFEXT(v, 3, 1)
+-#define RAM_SPEED(v) BFEXT(v, 4, 2)
++#define RAM_WIDTH(v) BFEXT(v, 3, 1)
++#define RAM_SPEED(v) BFEXT(v, 4, 2)
+ #define ROM_SIZE(v) BFEXT(v, 6, 2)
+-#define RAM_SPLIT(v) BFEXT(v, 16, 2)
++#define RAM_SPLIT(v) BFEXT(v, 16, 2)
+ #define XCVR(v) BFEXT(v, 20, 4)
+-#define AUTOSELECT(v) BFEXT(v, 24, 1)
++#define AUTOSELECT(v) BFEXT(v, 24, 1)
+
+ /* Register Window 4: Xcvr/media bits */
+
+-#define Wn4_FIFODiag 4
+-#define Wn4_NetDiag 6
++#define Wn4_FIFODiag 4
++#define Wn4_NetDiag 6
+ #define Wn4_PhysicalMgmt 8
+-#define Wn4_Media 10
++#define Wn4_Media 10
+
+-#define Media_SQE 0x0008 /* Enable SQE error counting for AUI. */
+-#define Media_10TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
+-#define Media_Lnk 0x0080 /* Enable just link beat for 100TX/100FX. */
+-#define Media_LnkBeat 0x0800
++#define Media_SQE 0x0008 /* Enable SQE error counting for AUI. */
++#define Media_10TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
++#define Media_Lnk 0x0080 /* Enable just link beat for 100TX/100FX. */
++#define Media_LnkBeat 0x0800
+
+ /* Register Window 7: Bus Master control */
+
+-#define Wn7_MasterAddr 0
+-#define Wn7_MasterLen 6
+-#define Wn7_MasterStatus 12
++#define Wn7_MasterAddr 0
++#define Wn7_MasterLen 6
++#define Wn7_MasterStatus 12
+
+ /* Boomerang bus master control registers. */
+
+-#define PktStatus 0x20
++#define PktStatus 0x20
+ #define DownListPtr 0x24
+-#define FragAddr 0x28
+-#define FragLen 0x2c
++#define FragAddr 0x28
++#define FragLen 0x2c
+ #define TxFreeThreshold 0x2f
+-#define UpPktStatus 0x30
++#define UpPktStatus 0x30
+ #define UpListPtr 0x38
+
+ /* The Rx and Tx descriptor lists. */
+diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/Makefile u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/Makefile
+--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/Makefile 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/Makefile 2006-12-06 10:33:49.000000000 -0600
+@@ -30,7 +30,7 @@ endif
+ LIB = $(obj)lib$(BOARD).a
+
+ COBJS = $(BOARD).o articiaS.o flash.o serial.o smbus.o articiaS_pci.o \
+- via686.o i8259.o ../bios_emulator/x86interface.o \
++ via686.o i8259.o ../bios_emulator/x86interface.o \
+ ../bios_emulator/bios.o ../bios_emulator/glue.o \
+ interrupts.o ps2kbd.o video.o usb_uhci.o enet.o \
+ ../menu/cmd_menu.o cmd_boota.o nvram.o
+diff -Naupr u-boot-1.1.6/board/mcc200/mcc200.c u-boot-1.1.6-fsl-1/board/mcc200/mcc200.c
+--- u-boot-1.1.6/board/mcc200/mcc200.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mcc200/mcc200.c 2006-11-30 12:34:13.000000000 -0600
+@@ -27,6 +27,7 @@
+ #include <common.h>
+ #include <mpc5xxx.h>
+ #include <pci.h>
++#include <asm/processor.h>
+
+ /* Two MT48LC8M32B2 for 32 MB */
+ /* #include "mt48lc8m32b2-6-7.h" */
+@@ -98,6 +99,7 @@ long int initdram (int board_type)
+ {
+ ulong dramsize = 0;
+ ulong dramsize2 = 0;
++ uint svr, pvr;
+ #ifndef CFG_RAMBOOT
+ ulong test1, test2;
+
+@@ -192,6 +194,22 @@ long int initdram (int board_type)
+
+ #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;
+ }
+
+diff -Naupr u-boot-1.1.6/board/mpc8349emds/Makefile u-boot-1.1.6-fsl-1/board/mpc8349emds/Makefile
+--- u-boot-1.1.6/board/mpc8349emds/Makefile 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/Makefile 2006-11-10 11:24:28.000000000 -0600
+@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
+
+ LIB = $(obj)lib$(BOARD).a
+
+-COBJS := $(BOARD).o
++COBJS := $(BOARD).o pci.o
+
+ SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+ OBJS := $(addprefix $(obj),$(COBJS))
+diff -Naupr u-boot-1.1.6/board/mpc8349emds/mpc8349emds.c u-boot-1.1.6-fsl-1/board/mpc8349emds/mpc8349emds.c
+--- u-boot-1.1.6/board/mpc8349emds/mpc8349emds.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/mpc8349emds.c 2006-11-10 11:24:28.000000000 -0600
+@@ -33,6 +33,10 @@
+ #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);
+
+@@ -59,7 +63,7 @@ int board_early_init_f (void)
+
+ long int initdram (int board_type)
+ {
+- volatile immap_t *im = (immap_t *)CFG_IMMRBAR;
++ volatile immap_t *im = (immap_t *)CFG_IMMR;
+ u32 msize = 0;
+
+ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
+@@ -96,7 +100,7 @@ long int initdram (int board_type)
+ ************************************************************************/
+ int fixed_sdram(void)
+ {
+- volatile immap_t *im = (immap_t *)CFG_IMMRBAR;
++ volatile immap_t *im = (immap_t *)CFG_IMMR;
+ u32 msize = 0;
+ u32 ddr_size;
+ u32 ddr_size_log2;
+@@ -167,8 +171,8 @@ int checkboard (void)
+
+ void sdram_init(void)
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile lbus8349_t *lbc= &immap->lbus;
++ 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: ");
+@@ -245,8 +249,8 @@ void sdram_init(void)
+ */
+ void ecc_print_status(void)
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile ddr8349_t *ddr = &immap->ddr;
++ 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");
+
+@@ -320,8 +324,8 @@ void ecc_print_status(void)
+
+ int do_ecc ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile ddr8349_t *ddr = &immap->ddr;
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile ddr83xx_t *ddr = &immap->ddr;
+ volatile u32 val;
+ u64 *addr, count, val64;
+ register u64 *i;
+@@ -564,3 +568,23 @@ U_BOOT_CMD(
+ " - 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 -Naupr u-boot-1.1.6/board/mpc8349emds/pci.c u-boot-1.1.6-fsl-1/board/mpc8349emds/pci.c
+--- u-boot-1.1.6/board/mpc8349emds/pci.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/pci.c 2006-12-06 10:33:49.000000000 -0600
+@@ -68,12 +68,13 @@ static struct pci_controller pci_hose[]
+ void
+ pib_init(void)
+ {
+- u8 val8;
++ u8 val8, orig_i2c_bus;
+ /*
+ * Assign PIB PMC slot to desired PCI bus
+ */
+- mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C2_OFFSET);
+- i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
++ /* 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);
+@@ -118,6 +119,8 @@ pib_init(void)
+ printf("PCI1: 32-bit on PMC1, PMC2\n");
+ printf("PCI2: 32-bit on PMC3\n");
+ #endif
++ /* Reset to original I2C bus */
++ i2c_set_bus_num(orig_i2c_bus);
+ }
+
+ /**************************************************************************
+@@ -130,18 +133,18 @@ void
+ pci_init_board(void)
+ {
+ volatile immap_t * immr;
+- volatile clk8349_t * clk;
+- volatile law8349_t * pci_law;
+- volatile pot8349_t * pci_pot;
+- volatile pcictrl8349_t * pci_ctrl;
+- volatile pciconf8349_t * pci_conf;
++ 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_IMMRBAR;
+- clk = (clk8349_t *)&immr->clk;
++ 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;
+@@ -254,8 +257,8 @@ pci_init_board(void)
+ hose->region_count = 4;
+
+ pci_setup_indirect(hose,
+- (CFG_IMMRBAR+0x8300),
+- (CFG_IMMRBAR+0x8304));
++ (CFG_IMMR+0x8300),
++ (CFG_IMMR+0x8304));
+
+ pci_register_hose(hose);
+
+@@ -350,8 +353,8 @@ pci_init_board(void)
+ hose->region_count = 4;
+
+ pci_setup_indirect(hose,
+- (CFG_IMMRBAR+0x8380),
+- (CFG_IMMRBAR+0x8384));
++ (CFG_IMMR+0x8380),
++ (CFG_IMMR+0x8384));
+
+ pci_register_hose(hose);
+
+@@ -379,4 +382,26 @@ pci_init_board(void)
+
+ }
+
++#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 -Naupr u-boot-1.1.6/board/mpc8349itx/config.mk u-boot-1.1.6-fsl-1/board/mpc8349itx/config.mk
+--- u-boot-1.1.6/board/mpc8349itx/config.mk 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/config.mk 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,33 @@
++#
++# Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++
++#
++# MPC8349ITX
++#
++
++TEXT_BASE = 0xFEF00000
++
++ifneq ($(OBJTREE),$(SRCTREE))
++# We are building u-boot in a separate directory, use generated
++# .lds script from OBJTREE directory.
++LDSCRIPT := $(OBJTREE)/board/$(BOARDDIR)/u-boot.lds
++endif
+diff -Naupr u-boot-1.1.6/board/mpc8349itx/Makefile u-boot-1.1.6-fsl-1/board/mpc8349itx/Makefile
+--- u-boot-1.1.6/board/mpc8349itx/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/Makefile 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 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) crv $@ $(OBJS)
++
++clean:
++ rm -f $(SOBJS) $(OBJS)
++
++distclean: clean
++ rm -f $(LIB) core *.bak .depend
++
++#########################################################################
++
++include $(SRCTREE)/rules.mk
++
++sinclude $(obj).depend
++
++#########################################################################
+diff -Naupr u-boot-1.1.6/board/mpc8349itx/mpc8349itx.c u-boot-1.1.6-fsl-1/board/mpc8349itx/mpc8349itx.c
+--- u-boot-1.1.6/board/mpc8349itx/mpc8349itx.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/mpc8349itx.c 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,477 @@
++/*
++ * Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <common.h>
++#include <ioports.h>
++#include <mpc83xx.h>
++#include <i2c.h>
++#include <spd.h>
++#include <miiphy.h>
++
++#ifdef CONFIG_PCI
++#include <asm/mpc8349_pci.h>
++#include <pci.h>
++#endif
++
++#ifdef CONFIG_SPD_EEPROM
++#include <spd_sdram.h>
++#else
++#include <asm/mmu.h>
++#endif
++#if defined(CONFIG_OF_FLAT_TREE)
++#include <ft_build.h>
++#endif
++
++#ifndef 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 ddr_size; /* The size of RAM, in bytes */
++ u32 ddr_size_log2 = 0;
++
++ for (ddr_size = CFG_DDR_SIZE * 0x100000; ddr_size > 1; ddr_size >>= 1) {
++ if (ddr_size & 1) {
++ return -1;
++ }
++ ddr_size_log2++;
++ }
++
++ im->sysconf.ddrlaw[0].ar =
++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
++ im->sysconf.ddrlaw[0].bar = (CFG_DDR_SDRAM_BASE >> 12) & 0xfffff;
++
++ /* Only one CS0 for DDR */
++ im->ddr.csbnds[0].csbnds = 0x0000000f;
++ im->ddr.cs_config[0] = CFG_DDR_CONFIG;
++
++ debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds);
++ debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]);
++
++ debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar);
++ debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar);
++
++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */
++ im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR;
++ im->ddr.sdram_mode =
++ (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT);
++ 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;
++
++ udelay(200);
++
++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
++
++ debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1);
++ debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2);
++ debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode);
++ debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval);
++ debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg);
++
++ return CFG_DDR_SIZE;
++}
++#endif
++
++#ifdef CONFIG_PCI
++/*
++ * Initialize PCI Devices, report devices found
++ */
++#ifndef CONFIG_PCI_PNP
++static struct pci_config_table pci_mpc83xxmitx_config_table[] = {
++ {
++ PCI_ANY_ID,
++ PCI_ANY_ID,
++ PCI_ANY_ID,
++ PCI_ANY_ID,
++ 0x0f,
++ PCI_ANY_ID,
++ pci_cfgfunc_config_device,
++ {
++ PCI_ENET0_IOADDR,
++ PCI_ENET0_MEMADDR,
++ PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER}
++ },
++ {}
++}
++#endif
++
++volatile static struct pci_controller hose[] = {
++ {
++#ifndef CONFIG_PCI_PNP
++ config_table:pci_mpc83xxmitx_config_table,
++#endif
++ },
++ {
++#ifndef CONFIG_PCI_PNP
++ config_table:pci_mpc83xxmitx_config_table,
++#endif
++ }
++};
++#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;
++ u32 msize = 0;
++#ifdef CONFIG_DDR_ECC
++ volatile ddr83xx_t *ddr = &im->ddr;
++#endif
++
++ 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;
++#ifdef CONFIG_SPD_EEPROM
++ msize = spd_sdram();
++#else
++ msize = fixed_sdram();
++#endif
++
++#ifdef CONFIG_DDR_ECC
++ if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN)
++ /* Unlike every other board, on the 83xx spd_sdram() returns
++ megabytes instead of just bytes. That's why we need to
++ multiple by 1MB when calling ddr_enable_ecc(). */
++ 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 msize * 1024 * 1024;
++}
++
++int checkboard(void)
++{
++ puts("Board: Freescale MPC8349E-mITX\n");
++
++ return 0;
++}
++
++/*
++ * Implement a work-around for a hardware problem with compact
++ * flash.
++ *
++ * Program the UPM if compact flash is enabled.
++ */
++int misc_init_f(void)
++{
++ volatile u32 *vsc7385_cpuctrl;
++
++ /* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register. The power up
++ default of VSC7385 L1_IRQ and L2_IRQ requests are active high. That
++ means it is 0 when the IRQ is not active. This makes the wire-AND
++ logic always assert IRQ7 to CPU even if there is no request from the
++ switch. Since the compact flash and the switch share the same IRQ,
++ the Linux kernel will think that the compact flash is requesting irq
++ and get stuck when it tries to clear the IRQ. Thus we need to set
++ the L2_IRQ0 and L2_IRQ1 to active low.
++
++ The following code sets the L1_IRQ and L2_IRQ polarity to active low.
++ Without this code, compact flash will not work in Linux because
++ unlike U-Boot, Linux uses the IRQ, so this code is necessary if we
++ don't enable compact flash for U-Boot.
++ */
++
++ vsc7385_cpuctrl = (volatile u32 *)(CFG_VSC7385_BASE + 0x1c0c0);
++ *vsc7385_cpuctrl |= 0x0c;
++
++#ifdef CONFIG_COMPACT_FLASH
++ /* UPM Table Configuration Code */
++ static uint UPMATable[] = {
++ 0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00,
++ 0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
++ 0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00,
++ 0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01
++ };
++ volatile immap_t *immap = (immap_t *) CFG_IMMR;
++ volatile lbus83xx_t *lbus = &immap->lbus;
++
++ lbus->bank[3].br = CFG_BR3_PRELIM;
++ lbus->bank[3].or = CFG_OR3_PRELIM;
++
++ /* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000,
++ GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000
++ */
++ lbus->mamr = 0x08404440;
++
++ upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0]));
++
++ puts("UPMA: Configured for compact flash\n");
++#endif
++
++ return 0;
++}
++
++/*
++ * Make sure the EEPROM has the HRCW correctly programmed.
++ * Make sure the RTC is correctly programmed.
++ *
++ * The MPC8349E-mITX can be configured to load the HRCW from
++ * EEPROM instead of flash. This is controlled via jumpers
++ * LGPL0, 1, and 3. Normally, these jumpers are set to 000 (all
++ * jumpered), but if they're set to 001 or 010, then the HRCW is
++ * read from the "I2C EEPROM".
++ *
++ * This function makes sure that the I2C EEPROM is programmed
++ * correctly.
++ */
++int misc_init_r(void)
++{
++ int rc = 0;
++
++#ifdef CONFIG_HARD_I2C
++
++ unsigned int orig_bus = i2c_get_bus_num();;
++ u8 i2c_data;
++
++#ifdef CFG_I2C_RTC_ADDR
++ u8 ds1339_data[17];
++#endif
++
++#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,
++ };
++
++ u8 data[sizeof(eeprom_data)];
++#endif
++
++ printf("Board revision: ");
++ i2c_set_bus_num(1);
++ if (i2c_read(CFG_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
++ printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01);
++ else if (i2c_read(CFG_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0)
++ printf("%u.%u (PCF8475)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01);
++ else {
++ printf("Unknown\n");
++ rc = 1;
++ }
++
++#ifdef CFG_I2C_EEPROM_ADDR
++ i2c_set_bus_num(0);
++
++ if (i2c_read(CFG_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) {
++ if (memcmp(data, eeprom_data, sizeof(data)) != 0) {
++ if (i2c_write
++ (CFG_I2C_EEPROM_ADDR, 0, 2, eeprom_data,
++ sizeof(eeprom_data)) != 0) {
++ puts("Failure writing the HRCW to EEPROM via I2C.\n");
++ rc = 1;
++ }
++ }
++ } else {
++ puts("Failure reading the HRCW from EEPROM via I2C.\n");
++ rc = 1;
++ }
++#endif
++
++#ifdef CFG_I2C_RTC_ADDR
++ i2c_set_bus_num(1);
++
++ if (i2c_read(CFG_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data))
++ == 0) {
++
++ /* Work-around for MPC8349E-mITX bug #13601.
++ If the RTC does not contain valid register values, the DS1339
++ Linux driver will not work.
++ */
++
++ /* Make sure status register bits 6-2 are zero */
++ ds1339_data[0x0f] &= ~0x7c;
++
++ /* Check for a valid day register value */
++ ds1339_data[0x03] &= ~0xf8;
++ if (ds1339_data[0x03] == 0) {
++ ds1339_data[0x03] = 1;
++ }
++
++ /* Check for a valid date register value */
++ ds1339_data[0x04] &= ~0xc0;
++ if ((ds1339_data[0x04] == 0) ||
++ ((ds1339_data[0x04] & 0x0f) > 9) ||
++ (ds1339_data[0x04] >= 0x32)) {
++ ds1339_data[0x04] = 1;
++ }
++
++ /* Check for a valid month register value */
++ ds1339_data[0x05] &= ~0x60;
++
++ if ((ds1339_data[0x05] == 0) ||
++ ((ds1339_data[0x05] & 0x0f) > 9) ||
++ ((ds1339_data[0x05] >= 0x13)
++ && (ds1339_data[0x05] <= 0x19))) {
++ ds1339_data[0x05] = 1;
++ }
++
++ /* Enable Oscillator and rate select */
++ ds1339_data[0x0e] = 0x1c;
++
++ /* Work-around for MPC8349E-mITX bug #13330.
++ Ensure that the RTC control register contains the value 0x1c.
++ This affects SATA performance.
++ */
++
++ if (i2c_write
++ (CFG_I2C_RTC_ADDR, 0, 1, ds1339_data,
++ sizeof(ds1339_data))) {
++ puts("Failure writing to the RTC via I2C.\n");
++ rc = 1;
++ }
++ } else {
++ puts("Failure reading from the RTC via I2C.\n");
++ rc = 1;
++ }
++#endif
++
++ i2c_set_bus_num(orig_bus);
++#endif
++
++ return rc;
++}
++
++#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 -Naupr u-boot-1.1.6/board/mpc8349itx/pci.c u-boot-1.1.6-fsl-1/board/mpc8349itx/pci.c
+--- u-boot-1.1.6/board/mpc8349itx/pci.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/pci.c 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,357 @@
++/*
++ * Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <common.h>
++
++#ifdef CONFIG_PCI
++
++#include <asm/mmu.h>
++#include <asm/global_data.h>
++#include <pci.h>
++#include <asm/mpc8349_pci.h>
++#include <i2c.h>
++#if defined(CONFIG_OF_FLAT_TREE)
++#include <ft_build.h>
++#endif
++
++DECLARE_GLOBAL_DATA_PTR;
++
++/* 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_mpc8349itx_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_mpc8349itx_config_table,
++#endif
++ },
++ {
++#ifndef CONFIG_PCI_PNP
++ config_table:pci_mpc8349itx_config_table,
++#endif
++ }
++};
++
++/**************************************************************************
++ * pci_init_board()
++ *
++ * NOTICE: PCI2 is not currently supported
++ *
++ */
++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;
++ u8 reg8;
++ 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);
++
++#ifdef CONFIG_HARD_I2C
++ i2c_set_bus_num(1);
++ /* Read the PCI_M66EN jumper setting */
++ if ((i2c_read(CFG_I2C_8574_ADDR2, 0, 0, &reg8, sizeof(reg8)) == 0) ||
++ (i2c_read(CFG_I2C_8574A_ADDR2, 0, 0, &reg8, sizeof(reg8)) == 0)) {
++ if (reg8 & I2C_8574_PCI66)
++ clk->occr = 0xff000000; /* 66 MHz PCI */
++ else
++ clk->occr = 0xff600001; /* 33 MHz PCI */
++ } else {
++ clk->occr = 0xff600001; /* 33 MHz PCI */
++ }
++#else
++ clk->occr = 0xff000000; /* 66 MHz PCI */
++#endif
++
++ 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_32M;
++
++ /*
++ * 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;
++
++ /* 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_16M;
++
++ /* 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;
++
++ /*
++ * 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;
++
++ /* 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_16M;
++
++ /* 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;
++
++ /*
++ * 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
++}
++
++#endif /* CONFIG_PCI */
++#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 */
+diff -Naupr u-boot-1.1.6/board/mpc8349itx/u-boot.lds u-boot-1.1.6-fsl-1/board/mpc8349itx/u-boot.lds
+--- u-boot-1.1.6/board/mpc8349itx/u-boot.lds 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/u-boot.lds 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,120 @@
++/*
++ * Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 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)
++ }
++ .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 -Naupr u-boot-1.1.6/board/mpc8360emds/config.mk u-boot-1.1.6-fsl-1/board/mpc8360emds/config.mk
+--- u-boot-1.1.6/board/mpc8360emds/config.mk 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/config.mk 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,28 @@
++#
++# (C) Copyright 2006
++# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
++#
++# See file CREDITS for list of people who contributed to this
++# project.
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License as
++# published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++
++#
++# MPC8360EMDS
++#
++
++TEXT_BASE = 0xFE000000
+diff -Naupr u-boot-1.1.6/board/mpc8360emds/Makefile u-boot-1.1.6-fsl-1/board/mpc8360emds/Makefile
+--- u-boot-1.1.6/board/mpc8360emds/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/Makefile 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,50 @@
++#
++# (C) Copyright 2006
++# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
++#
++# See file CREDITS for list of people who contributed to this
++# project.
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License as
++# published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++# MA 02111-1307 USA
++#
++
++include $(TOPDIR)/config.mk
++
++LIB = $(obj)lib$(BOARD).a
++
++COBJS := $(BOARD).o pci.o
++
++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
++OBJS := $(addprefix $(obj),$(COBJS))
++SOBJS := $(addprefix $(obj),$(SOBJS))
++
++$(LIB): $(obj).depend $(OBJS)
++ $(AR) $(ARFLAGS) $@ $(OBJS)
++
++clean:
++ rm -f $(SOBJS) $(OBJS)
++
++distclean: clean
++ rm -f $(LIB) core *.bak .depend
++
++#########################################################################
++
++# defines $(obj).depend target
++include $(SRCTREE)/rules.mk
++
++sinclude $(obj).depend
++
++#########################################################################
+diff -Naupr u-boot-1.1.6/board/mpc8360emds/mpc8360emds.c u-boot-1.1.6-fsl-1/board/mpc8360emds/mpc8360emds.c
+--- u-boot-1.1.6/board/mpc8360emds/mpc8360emds.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/mpc8360emds.c 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,657 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on board/mpc8349emds/mpc8349emds.c
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the 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[] = {
++ /* GETH1 */
++ {0, 3, 1, 0, 1}, /* TxD0 */
++ {0, 4, 1, 0, 1}, /* TxD1 */
++ {0, 5, 1, 0, 1}, /* TxD2 */
++ {0, 6, 1, 0, 1}, /* TxD3 */
++ {1, 6, 1, 0, 3}, /* TxD4 */
++ {1, 7, 1, 0, 1}, /* TxD5 */
++ {1, 9, 1, 0, 2}, /* TxD6 */
++ {1, 10, 1, 0, 2}, /* TxD7 */
++ {0, 9, 2, 0, 1}, /* RxD0 */
++ {0, 10, 2, 0, 1}, /* RxD1 */
++ {0, 11, 2, 0, 1}, /* RxD2 */
++ {0, 12, 2, 0, 1}, /* RxD3 */
++ {0, 13, 2, 0, 1}, /* RxD4 */
++ {1, 1, 2, 0, 2}, /* RxD5 */
++ {1, 0, 2, 0, 2}, /* RxD6 */
++ {1, 4, 2, 0, 2}, /* RxD7 */
++ {0, 7, 1, 0, 1}, /* TX_EN */
++ {0, 8, 1, 0, 1}, /* TX_ER */
++ {0, 15, 2, 0, 1}, /* RX_DV */
++ {0, 16, 2, 0, 1}, /* RX_ER */
++ {0, 0, 2, 0, 1}, /* RX_CLK */
++ {2, 9, 1, 0, 3}, /* GTX_CLK - CLK10 */
++ {2, 8, 2, 0, 1}, /* GTX125 - CLK9 */
++ /* GETH2 */
++ {0, 17, 1, 0, 1}, /* TxD0 */
++ {0, 18, 1, 0, 1}, /* TxD1 */
++ {0, 19, 1, 0, 1}, /* TxD2 */
++ {0, 20, 1, 0, 1}, /* TxD3 */
++ {1, 2, 1, 0, 1}, /* TxD4 */
++ {1, 3, 1, 0, 2}, /* TxD5 */
++ {1, 5, 1, 0, 3}, /* TxD6 */
++ {1, 8, 1, 0, 3}, /* TxD7 */
++ {0, 23, 2, 0, 1}, /* RxD0 */
++ {0, 24, 2, 0, 1}, /* RxD1 */
++ {0, 25, 2, 0, 1}, /* RxD2 */
++ {0, 26, 2, 0, 1}, /* RxD3 */
++ {0, 27, 2, 0, 1}, /* RxD4 */
++ {1, 12, 2, 0, 2}, /* RxD5 */
++ {1, 13, 2, 0, 3}, /* RxD6 */
++ {1, 11, 2, 0, 2}, /* RxD7 */
++ {0, 21, 1, 0, 1}, /* TX_EN */
++ {0, 22, 1, 0, 1}, /* TX_ER */
++ {0, 29, 2, 0, 1}, /* RX_DV */
++ {0, 30, 2, 0, 1}, /* RX_ER */
++ {0, 31, 2, 0, 1}, /* RX_CLK */
++ {2, 2, 1, 0, 2}, /* GTX_CLK = CLK10 */
++ {2, 3, 2, 0, 1}, /* GTX125 - CLK4 */
++
++ {0, 1, 3, 0, 2}, /* MDIO */
++ {0, 2, 1, 0, 1}, /* 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[0xa] &= ~0x04;
++
++ return 0;
++}
++
++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
++extern void ddr_enable_ecc(unsigned int dram_size);
++#endif
++int fixed_sdram(void);
++void sdram_init(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;
++#if defined(CONFIG_SPD_EEPROM)
++ msize = spd_sdram();
++#else
++ msize = fixed_sdram();
++#endif
++
++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
++ /*
++ * Initialize DDR ECC byte
++ */
++ ddr_enable_ecc(msize * 1024 * 1024);
++#endif
++ /*
++ * Initialize SDRAM if it is on local bus.
++ */
++ sdram_init();
++ 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].ar =
++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
++#if (CFG_DDR_SIZE != 256)
++#warning Currenly any ddr size other than 256 is not supported
++#endif
++ im->ddr.csbnds[0].csbnds = 0x00000007;
++ im->ddr.csbnds[1].csbnds = 0x0008000f;
++
++ im->ddr.cs_config[0] = CFG_DDR_CONFIG;
++ im->ddr.cs_config[1] = CFG_DDR_CONFIG;
++
++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
++ im->ddr.sdram_cfg = CFG_DDR_CONTROL;
++
++ im->ddr.sdram_mode = CFG_DDR_MODE;
++ im->ddr.sdram_interval = CFG_DDR_INTERVAL;
++ udelay(200);
++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
++
++ return msize;
++}
++#endif /*!CFG_SPD_EEPROM */
++
++int checkboard(void)
++{
++ puts("Board: Freescale MPC8360EMDS\n");
++ return 0;
++}
++
++/*
++ * if MPC8360EMDS is soldered 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; /* Normal Operation */
++ lbc->lsdmr = CFG_LBC_LSDMR_1; /* Precharge All Banks */
++ asm("sync");
++ *sdram_addr = 0xff;
++ udelay(100);
++
++ /*
++ * We need do 8 times auto refresh operation.
++ */
++ lbc->lsdmr = CFG_LBC_LSDMR_2;
++ asm("sync");
++ *sdram_addr = 0xff; /* 1 times */
++ 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);
++
++ /* Mode register write operation */
++ lbc->lsdmr = CFG_LBC_LSDMR_4;
++ asm("sync");
++ *(sdram_addr + 0xcc) = 0xff;
++ udelay(100);
++
++ /* Normal operation */
++ lbc->lsdmr = CFG_LBC_LSDMR_5 | 0x40000000;
++ asm("sync");
++ *sdram_addr = 0xff;
++ udelay(100);
++}
++#else
++void sdram_init(void)
++{
++ puts("SDRAM on Local Bus is NOT available!\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;
++ u32 count;
++ register u64 *i;
++ u32 ret[2];
++ u32 pattern[2];
++ u32 writeback[2];
++
++ /* The pattern is written into memory to generate error */
++ pattern[0] = 0xfedcba98UL;
++ pattern[1] = 0x76543210UL;
++
++ /* After injecting error, re-initialize the memory with the value */
++ writeback[0] = 0x01234567UL;
++ writeback[1] = 0x89abcdefUL;
++
++ 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], "testdw") == 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();
++
++ 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 */
++ ppcDWstore((u32 *) i, pattern);
++ __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 */
++ ppcDWload((u32 *) i, ret);
++ __asm__ __volatile__("sync");
++
++ /* re-initialize memory, double word write the location again,
++ * generates new ECC code this time */
++ ppcDWstore((u32 *) i, writeback);
++ __asm__ __volatile__("sync");
++ }
++ enable_interrupts();
++ return 0;
++ }
++ if (strcmp(argv[1], "testword") == 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();
++
++ 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 */
++ *(u32 *) i = 0xfedcba98UL;
++ __asm__ __volatile__("sync");
++
++ /* sub double word write,
++ * bus will read-modify-write,
++ * generates ECC error */
++ *((u32 *) i + 1) = 0x76543210UL;
++ __asm__ __volatile__("sync");
++
++ /* disable injects */
++ ddr->ecc_err_inject &= ~ECC_ERR_INJECT_EIEN;
++ __asm__ __volatile__("sync");
++ __asm__ __volatile__("isync");
++
++ /* re-initialize memory,
++ * double word write the location again,
++ * generates new ECC code this time */
++ ppcDWstore((u32 *) i, writeback);
++ __asm__ __volatile__("sync");
++ }
++ 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 testdw <addr> <cnt> - test mem region with double word access:\n"
++ " - enables injects\n"
++ " - writes pattern injecting errors with double word access\n"
++ " - disables injects\n"
++ " - reads pattern back with double word access, generates error\n"
++ " - re-inits memory\n"
++ "ecc testword <addr> <cnt> - test mem region with word access:\n"
++ " - enables injects\n"
++ " - writes pattern injecting errors with word access\n"
++ " - writes pattern with word access, generates error\n"
++ " - 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)
++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 -Naupr u-boot-1.1.6/board/mpc8360emds/pci.c u-boot-1.1.6-fsl-1/board/mpc8360emds/pci.c
+--- u-boot-1.1.6/board/mpc8360emds/pci.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/pci.c 2006-11-10 11:24:28.000000000 -0600
+@@ -0,0 +1,313 @@
++/*
++ * 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>
++
++#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 = 0xf3; /*PMC1, 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 PMC1 & 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 -Naupr u-boot-1.1.6/board/mpc8360emds/u-boot.lds u-boot-1.1.6-fsl-1/board/mpc8360emds/u-boot.lds
+--- u-boot-1.1.6/board/mpc8360emds/u-boot.lds 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/u-boot.lds 2006-11-10 11:24:28.000000000 -0600
+@@ -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 -Naupr u-boot-1.1.6/board/prodrive/alpr/alpr.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/alpr.c
+--- u-boot-1.1.6/board/prodrive/alpr/alpr.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/alpr.c 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,328 @@
++/*
++ * (C) Copyright 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
++ */
++
++
++#include <common.h>
++#include <asm/processor.h>
++#include <spd_sdram.h>
++#include <ppc4xx_enet.h>
++#include <miiphy.h>
++
++DECLARE_GLOBAL_DATA_PTR;
++
++extern int alpr_fpga_init(void);
++
++int board_early_init_f (void)
++{
++ /*-------------------------------------------------------------------------
++ * Initialize EBC CONFIG
++ *-------------------------------------------------------------------------*/
++ mtebc(xbcfg, EBC_CFG_LE_UNLOCK |
++ EBC_CFG_PTD_DISABLE | EBC_CFG_RTC_64PERCLK |
++ EBC_CFG_ATC_PREVIOUS | EBC_CFG_DTC_PREVIOUS |
++ EBC_CFG_CTC_PREVIOUS | EBC_CFG_EMC_NONDEFAULT |
++ EBC_CFG_PME_DISABLE | EBC_CFG_PR_32);
++
++ /*--------------------------------------------------------------------
++ * Setup the interrupt controller polarities, triggers, etc.
++ *-------------------------------------------------------------------*/
++ mtdcr (uic0sr, 0xffffffff); /* clear all */
++ mtdcr (uic0er, 0x00000000); /* disable all */
++ mtdcr (uic0cr, 0x00000009); /* SMI & UIC1 crit are critical */
++ mtdcr (uic0pr, 0xfffffe03); /* per manual */
++ mtdcr (uic0tr, 0x01c00000); /* per 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 */
++
++ mtdcr (uic2sr, 0xffffffff); /* clear all */
++ mtdcr (uic2er, 0x00000000); /* disable all */
++ mtdcr (uic2cr, 0x00000000); /* all non-critical */
++ mtdcr (uic2pr, 0xffffffff); /* per ref-board manual */
++ mtdcr (uic2tr, 0x00ff8c0f); /* per ref-board manual */
++ mtdcr (uic2vr, 0x00000001); /* int31 highest, base=0x000 */
++ mtdcr (uic2sr, 0xffffffff); /* clear all */
++
++ mtdcr (uicb0sr, 0xfc000000); /* clear all */
++ mtdcr (uicb0er, 0x00000000); /* disable all */
++ mtdcr (uicb0cr, 0x00000000); /* all non-critical */
++ mtdcr (uicb0pr, 0xfc000000); /* */
++ mtdcr (uicb0tr, 0x00000000); /* */
++ mtdcr (uicb0vr, 0x00000001); /* */
++
++ /* Setup GPIO/IRQ multiplexing */
++ mtsdr(sdr_pfc0, 0x01a03e00);
++
++ return 0;
++}
++
++int last_stage_init(void)
++{
++ unsigned short reg;
++
++ /*
++ * Configure LED's of both Marvell 88E1111 PHY's
++ *
++ * This has to be done after the 4xx ethernet driver is loaded,
++ * so "last_stage_init()" is the right place.
++ */
++ miiphy_read("ppc_4xx_eth2", CONFIG_PHY2_ADDR, 0x18, &reg);
++ reg |= 0x0001;
++ miiphy_write("ppc_4xx_eth2", CONFIG_PHY2_ADDR, 0x18, reg);
++ miiphy_read("ppc_4xx_eth3", CONFIG_PHY3_ADDR, 0x18, &reg);
++ reg |= 0x0001;
++ miiphy_write("ppc_4xx_eth3", CONFIG_PHY3_ADDR, 0x18, reg);
++
++ return 0;
++}
++
++static int board_rev(void)
++{
++ int rev;
++ u32 pfc0;
++
++ /* Setup GPIO14 & 15 as GPIO */
++ mfsdr(sdr_pfc0, pfc0);
++ pfc0 |= CFG_GPIO_REV0 | CFG_GPIO_REV1;
++ mtsdr(sdr_pfc0, pfc0);
++
++ /* Setup as input */
++ out32(GPIO0_TCR, in32(GPIO0_TCR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0));
++ out32(GPIO0_ODR, in32(GPIO0_ODR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0));
++
++ rev = (in32(GPIO0_IR) >> 16) & 0x3;
++
++ /* Setup GPIO14 & 15 as non GPIO again */
++ mfsdr(sdr_pfc0, pfc0);
++ pfc0 &= ~(CFG_GPIO_REV0 | CFG_GPIO_REV1);
++ mtsdr(sdr_pfc0, pfc0);
++
++ return rev;
++}
++
++int checkboard (void)
++{
++ char *s = getenv ("serial#");
++
++ printf ("Board: ALPR");
++ if (s != NULL) {
++ puts (", serial# ");
++ puts (s);
++ }
++ printf(" (Rev. %d)\n", board_rev());
++
++ 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 ocotea 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;
++ }
++
++ /* FPGA Init */
++ alpr_fpga_init ();
++
++ 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 )
++{
++ /*--------------------------------------------------------------------------+
++ * 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 | PCI_COMMAND_MASTER);
++}
++#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_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)
++
++static void wait_for_pci_ready(void)
++{
++ /*
++ * Configure EREADY as input
++ */
++ out32(GPIO0_TCR, in32(GPIO0_TCR) & ~CFG_GPIO_EREADY);
++ udelay(1000);
++
++ for (;;) {
++ if (in32(GPIO0_IR) & CFG_GPIO_EREADY)
++ return;
++ }
++
++}
++
++int is_pci_host(struct pci_controller *hose)
++{
++ wait_for_pci_ready();
++ return 1; /* return 1 for host controller */
++}
++#endif /* defined(CONFIG_PCI) */
++
++/*************************************************************************
++ * pci_master_init
++ *
++ ************************************************************************/
++#if defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT)
++void pci_master_init(struct pci_controller *hose)
++{
++ /*--------------------------------------------------------------------------+
++ | PowerPC440 PCI Master configuration.
++ | Map PLB/processor addresses to PCI memory space.
++ | PLB address 0xA0000000-0xCFFFFFFF ==> PCI address 0x80000000-0xCFFFFFFF
++ | Use byte reversed out routines to handle endianess.
++ | Make this region non-prefetchable.
++ +--------------------------------------------------------------------------*/
++ out32r( PCIX0_POM0SA, 0 ); /* disable */
++ out32r( PCIX0_POM1SA, 0 ); /* disable */
++ out32r( PCIX0_POM2SA, 0 ); /* disable */
++
++ out32r(PCIX0_POM0LAL, CFG_PCI_MEMBASE); /* PMM0 Local Address */
++ out32r(PCIX0_POM0LAH, 0x00000003); /* PMM0 Local Address */
++ out32r(PCIX0_POM0PCIAL, CFG_PCI_MEMBASE); /* PMM0 PCI Low Address */
++ out32r(PCIX0_POM0PCIAH, 0x00000000); /* PMM0 PCI High Address */
++ out32r(PCIX0_POM0SA, ~(0x10000000 - 1) | 1); /* 256MB + enable region */
++
++ out32r(PCIX0_POM1LAL, CFG_PCI_MEMBASE2); /* PMM0 Local Address */
++ out32r(PCIX0_POM1LAH, 0x00000003); /* PMM0 Local Address */
++ out32r(PCIX0_POM1PCIAL, CFG_PCI_MEMBASE2); /* PMM0 PCI Low Address */
++ out32r(PCIX0_POM1PCIAH, 0x00000000); /* PMM0 PCI High Address */
++ out32r(PCIX0_POM1SA, ~(0x10000000 - 1) | 1); /* 256MB + enable region */
++}
++#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) */
++
++#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 -Naupr u-boot-1.1.6/board/prodrive/alpr/config.mk u-boot-1.1.6-fsl-1/board/prodrive/alpr/config.mk
+--- u-boot-1.1.6/board/prodrive/alpr/config.mk 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/config.mk 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,44 @@
++#
++# (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
++#
++
++#
++# AMCC 440GX Reference Platform (Ocotea) board
++#
++
++#TEXT_BASE = 0xFFFE0000
++
++ifeq ($(ramsym),1)
++TEXT_BASE = 0x07FD0000
++else
++TEXT_BASE = 0xFFFC0000
++endif
++
++PLATFORM_CPPFLAGS += -DCONFIG_440=1
++
++ifeq ($(debug),1)
++PLATFORM_CPPFLAGS += -DDEBUG
++endif
++
++ifeq ($(dbcr),1)
++PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000
++endif
+diff -Naupr u-boot-1.1.6/board/prodrive/alpr/fpga.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/fpga.c
+--- u-boot-1.1.6/board/prodrive/alpr/fpga.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/fpga.c 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,257 @@
++/*
++ * (C) Copyright 2006
++ * 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
++ *
++ */
++
++/*
++ * Altera FPGA configuration support for the ALPR computer from prodrive
++ */
++
++#include <common.h>
++#include <altera.h>
++#include <ACEX1K.h>
++#include <command.h>
++#include <asm-ppc/processor.h>
++#include <ppc440.h>
++#include "fpga.h"
++
++DECLARE_GLOBAL_DATA_PTR;
++
++#if defined(CONFIG_FPGA)
++
++#ifdef FPGA_DEBUG
++#define PRINTF(fmt,args...) printf (fmt ,##args)
++#else
++#define PRINTF(fmt,args...)
++#endif
++
++static unsigned long regval;
++
++#define SET_GPIO_REG_0(reg, bit) { \
++ regval = in32(reg); \
++ regval &= ~(0x80000000 >> bit); \
++ out32(reg, regval); \
++ }
++
++#define SET_GPIO_REG_1(reg, bit) { \
++ regval = in32(reg); \
++ regval |= (0x80000000 >> bit); \
++ out32(reg, regval); \
++ }
++
++#define SET_GPIO_0(bit) SET_GPIO_REG_0(GPIO0_OR, bit)
++#define SET_GPIO_1(bit) SET_GPIO_REG_1(GPIO0_OR, bit)
++
++#define FPGA_PRG (0x80000000 >> CFG_GPIO_PROG_EN)
++#define FPGA_CONFIG (0x80000000 >> CFG_GPIO_CONFIG)
++#define FPGA_DATA (0x80000000 >> CFG_GPIO_DATA)
++#define FPGA_CLK (0x80000000 >> CFG_GPIO_CLK)
++#define OLD_VAL (FPGA_PRG | FPGA_CONFIG)
++
++#define SET_FPGA(data) out32(GPIO0_OR, data)
++
++#define FPGA_WRITE_1 { \
++ SET_FPGA(OLD_VAL | 0 | FPGA_DATA); /* set data to 1 */ \
++ SET_FPGA(OLD_VAL | FPGA_CLK | FPGA_DATA);} /* set data to 1 */
++
++#define FPGA_WRITE_0 { \
++ SET_FPGA(OLD_VAL | 0 | 0 ); /* set data to 0 */ \
++ SET_FPGA(OLD_VAL | FPGA_CLK | 0 );} /* set data to 1 */
++
++/* Plattforminitializations */
++/* Here we have to set the FPGA Chain */
++/* PROGRAM_PROG_EN = HIGH */
++/* PROGRAM_SEL_DPR = LOW */
++int fpga_pre_fn (int cookie)
++{
++ unsigned long reg;
++
++ reg = in32(GPIO0_IR);
++ /* Enable the FPGA Chain */
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_PROG_EN);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_PROG_EN);
++ SET_GPIO_1(CFG_GPIO_PROG_EN);
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_SEL_DPR);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_SEL_DPR);
++ SET_GPIO_0((CFG_GPIO_SEL_DPR));
++
++ /* initialize the GPIO Pins */
++ /* output */
++ SET_GPIO_0(CFG_GPIO_CLK);
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_CLK);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CLK);
++
++ /* output */
++ SET_GPIO_0(CFG_GPIO_DATA);
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_DATA);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_DATA);
++
++ /* First we set STATUS to 0 then as an input */
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_STATUS);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_STATUS);
++ SET_GPIO_0(CFG_GPIO_STATUS);
++ SET_GPIO_REG_0(GPIO0_TCR, CFG_GPIO_STATUS);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_STATUS);
++
++ /* output */
++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_CONFIG);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CONFIG);
++ SET_GPIO_0(CFG_GPIO_CONFIG);
++
++ /* input */
++ SET_GPIO_0(CFG_GPIO_CON_DON);
++ SET_GPIO_REG_0(GPIO0_TCR, CFG_GPIO_CON_DON);
++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CON_DON);
++
++ /* CONFIG = 0 STATUS = 0 -> FPGA in reset state */
++ SET_GPIO_0(CFG_GPIO_CONFIG);
++ return FPGA_SUCCESS;
++}
++
++/* Set the state of CONFIG Pin */
++int fpga_config_fn (int assert_config, int flush, int cookie)
++{
++ if (assert_config) {
++ SET_GPIO_1(CFG_GPIO_CONFIG);
++ } else {
++ SET_GPIO_0(CFG_GPIO_CONFIG);
++ }
++ return FPGA_SUCCESS;
++}
++
++/* Returns the state of STATUS Pin */
++int fpga_status_fn (int cookie)
++{
++ unsigned long reg;
++
++ reg = in32(GPIO0_IR);
++ if (reg &= (0x80000000 >> CFG_GPIO_STATUS)) {
++ PRINTF("STATUS = HIGH\n");
++ return FPGA_FAIL;
++ }
++ PRINTF("STATUS = LOW\n");
++ return FPGA_SUCCESS;
++}
++
++/* Returns the state of CONF_DONE Pin */
++int fpga_done_fn (int cookie)
++{
++ unsigned long reg;
++ reg = in32(GPIO0_IR);
++ if (reg &= (0x80000000 >> CFG_GPIO_CON_DON)) {
++ PRINTF("CONF_DON = HIGH\n");
++ return FPGA_FAIL;
++ }
++ PRINTF("CONF_DON = LOW\n");
++ return FPGA_SUCCESS;
++}
++
++/* writes the complete buffer to the FPGA
++ writing the complete buffer in one function is much faster,
++ then calling it for every bit */
++int fpga_write_fn (void *buf, size_t len, int flush, int cookie)
++{
++ size_t bytecount = 0;
++ unsigned char *data = (unsigned char *) buf;
++ unsigned char val=0;
++ int i;
++ int len_40 = len / 40;
++
++ while (bytecount < len) {
++ val = data[bytecount++];
++ i = 8;
++ do {
++ if (val & 0x01) {
++ FPGA_WRITE_1;
++ } else {
++ FPGA_WRITE_0;
++ }
++ val >>= 1;
++ i --;
++ } while (i > 0);
++
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ if (bytecount % len_40 == 0) {
++ putc ('.'); /* let them know we are alive */
++#ifdef CFG_FPGA_CHECK_CTRLC
++ if (ctrlc ())
++ return FPGA_FAIL;
++#endif
++ }
++#endif
++ }
++ return FPGA_SUCCESS;
++}
++
++/* called, when programming is aborted */
++int fpga_abort_fn (int cookie)
++{
++ SET_GPIO_1((CFG_GPIO_SEL_DPR));
++ return FPGA_SUCCESS;
++}
++
++/* called, when programming was succesful */
++int fpga_post_fn (int cookie)
++{
++ return fpga_abort_fn (cookie);
++}
++
++/* Note that these are pointers to code that is in Flash. They will be
++ * relocated at runtime.
++ */
++Altera_CYC2_Passive_Serial_fns fpga_fns = {
++ fpga_pre_fn,
++ fpga_config_fn,
++ fpga_status_fn,
++ fpga_done_fn,
++ fpga_write_fn,
++ fpga_abort_fn,
++ fpga_post_fn
++};
++
++Altera_desc fpga[CONFIG_FPGA_COUNT] = {
++ {Altera_CYC2,
++ passive_serial,
++ Altera_EP2C35_SIZE,
++ (void *) &fpga_fns,
++ NULL,
++ 0}
++};
++
++/*
++ * Initialize the fpga. Return 1 on success, 0 on failure.
++ */
++int alpr_fpga_init (void)
++{
++ int i;
++
++ PRINTF ("%s:%d: Initialize FPGA interface (relocation offset = 0x%.8lx)\n", __FUNCTION__, __LINE__, gd->reloc_off);
++ fpga_init (gd->reloc_off);
++
++ for (i = 0; i < CONFIG_FPGA_COUNT; i++) {
++ PRINTF ("%s:%d: Adding fpga %d\n", __FUNCTION__, __LINE__, i);
++ fpga_add (fpga_altera, &fpga[i]);
++ }
++ return 1;
++}
++
++#endif
+diff -Naupr u-boot-1.1.6/board/prodrive/alpr/init.S u-boot-1.1.6-fsl-1/board/prodrive/alpr/init.S
+--- u-boot-1.1.6/board/prodrive/alpr/init.S 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/init.S 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,103 @@
++/*
++ * (C) Copyright 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
++ */
++
++#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)
++
++
++/**************************************************************************
++ * 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
++ tlbentry( 0xff000000, SZ_16M, 0xff000000, 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 )
++
++ /* PCI */
++ tlbentry( CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 3, AC_R|AC_W|SA_G|SA_I )
++ tlbentry( CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 3, AC_R|AC_W|SA_G|SA_I )
++ tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 3, AC_R|AC_W|SA_G|SA_I )
++
++ /* NAND */
++ tlbentry( CFG_NAND_BASE, SZ_4K, CFG_NAND_BASE, 1, AC_R|AC_W|AC_X|SA_G|SA_I )
++ tlbtab_end
+diff -Naupr u-boot-1.1.6/board/prodrive/alpr/Makefile u-boot-1.1.6-fsl-1/board/prodrive/alpr/Makefile
+--- u-boot-1.1.6/board/prodrive/alpr/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/Makefile 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,51 @@
++#
++# (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 fpga.o nand.o
++SOBJS = init.o
++
++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
++OBJS := $(addprefix $(obj),$(COBJS))
++SOBJS := $(addprefix $(obj),$(SOBJS))
++
++$(LIB): $(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 -Naupr u-boot-1.1.6/board/prodrive/alpr/nand.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/nand.c
+--- u-boot-1.1.6/board/prodrive/alpr/nand.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/nand.c 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,173 @@
++/*
++ * (C) Copyright 2006
++ * Heiko Schocher, DENX Software Engineering, hs@denx.de
++ *
++ * (C) Copyright 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
++ */
++
++#include <common.h>
++
++#if (CONFIG_COMMANDS & CFG_CMD_NAND)
++
++#include <asm/processor.h>
++#include <nand.h>
++
++struct alpr_ndfc_regs {
++ u8 cmd[4];
++ u8 addr_wait;
++ u8 term;
++ u8 dummy;
++ u8 dummy2;
++ u8 data;
++};
++
++static u8 hwctl;
++static struct alpr_ndfc_regs *alpr_ndfc = NULL;
++
++#define readb(addr) (u8)(*(volatile u8 *)(addr))
++#define writeb(d,addr) *(volatile u8 *)(addr) = ((u8)(d))
++
++/*
++ * The ALPR has a NAND Flash Controller (NDFC) that handles all accesses to
++ * the NAND devices. The NDFC has command, address and data registers that
++ * when accessed will set up the NAND flash pins appropriately. We'll use the
++ * hwcontrol function to save the configuration in a global variable.
++ * We can then use this information in the read and write functions to
++ * determine which NDFC register to access.
++ *
++ * There are 2 NAND devices on the board, a Hynix HY27US08561A (1 GByte).
++ */
++static void alpr_nand_hwcontrol(struct mtd_info *mtd, int cmd)
++{
++ switch (cmd) {
++ case NAND_CTL_SETCLE:
++ hwctl |= 0x1;
++ break;
++ case NAND_CTL_CLRCLE:
++ hwctl &= ~0x1;
++ break;
++ case NAND_CTL_SETALE:
++ hwctl |= 0x2;
++ break;
++ case NAND_CTL_CLRALE:
++ hwctl &= ~0x2;
++ break;
++ case NAND_CTL_SETNCE:
++ break;
++ case NAND_CTL_CLRNCE:
++ writeb(0x00, &(alpr_ndfc->term));
++ break;
++ }
++}
++
++static void alpr_nand_write_byte(struct mtd_info *mtd, u_char byte)
++{
++ struct nand_chip *nand = mtd->priv;
++
++ if (hwctl & 0x1)
++ /*
++ * IO_ADDR_W used as CMD[i] reg to support multiple NAND
++ * chips.
++ */
++ writeb(byte, nand->IO_ADDR_W);
++ else if (hwctl & 0x2) {
++ writeb(byte, &(alpr_ndfc->addr_wait));
++ } else
++ writeb(byte, &(alpr_ndfc->data));
++}
++
++static u_char alpr_nand_read_byte(struct mtd_info *mtd)
++{
++ return readb(&(alpr_ndfc->data));
++}
++
++static void alpr_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
++{
++ struct nand_chip *nand = mtd->priv;
++ int i;
++
++ for (i = 0; i < len; i++) {
++ if (hwctl & 0x1)
++ /*
++ * IO_ADDR_W used as CMD[i] reg to support multiple NAND
++ * chips.
++ */
++ writeb(buf[i], nand->IO_ADDR_W);
++ else if (hwctl & 0x2)
++ writeb(buf[i], &(alpr_ndfc->addr_wait));
++ else
++ writeb(buf[i], &(alpr_ndfc->data));
++ }
++}
++
++static void alpr_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
++{
++ int i;
++
++ for (i = 0; i < len; i++) {
++ buf[i] = readb(&(alpr_ndfc->data));
++ }
++}
++
++static int alpr_nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
++{
++ int i;
++
++ for (i = 0; i < len; i++)
++ if (buf[i] != readb(&(alpr_ndfc->data)))
++ return i;
++
++ return 0;
++}
++
++static int alpr_nand_dev_ready(struct mtd_info *mtd)
++{
++ volatile u_char val;
++
++ /*
++ * Blocking read to wait for NAND to be ready
++ */
++ val = readb(&(alpr_ndfc->addr_wait));
++
++ /*
++ * Return always true
++ */
++ return 1;
++}
++
++void board_nand_init(struct nand_chip *nand)
++{
++ alpr_ndfc = (struct alpr_ndfc_regs *)CFG_NAND_BASE;
++
++ nand->eccmode = NAND_ECC_SOFT;
++
++ /* Reference hardware control function */
++ nand->hwcontrol = alpr_nand_hwcontrol;
++ /* Set command delay time */
++ nand->write_byte = alpr_nand_write_byte;
++ nand->read_byte = alpr_nand_read_byte;
++ nand->write_buf = alpr_nand_write_buf;
++ nand->read_buf = alpr_nand_read_buf;
++ nand->verify_buf = alpr_nand_verify_buf;
++ nand->dev_ready = alpr_nand_dev_ready;
++}
++#endif
+diff -Naupr u-boot-1.1.6/board/prodrive/alpr/u-boot.lds u-boot-1.1.6-fsl-1/board/prodrive/alpr/u-boot.lds
+--- u-boot-1.1.6/board/prodrive/alpr/u-boot.lds 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/u-boot.lds 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,157 @@
++/*
++ * (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 :
++ {
++ /* WARNING - the following is hand-optimized to fit within */
++ /* the sector layout of our flash chips! XXX FIXME XXX */
++
++ cpu/ppc4xx/start.o (.text)
++ board/prodrive/alpr/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)
++ *(.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 = .);
++}
+diff -Naupr u-boot-1.1.6/board/prodrive/common/flash.c u-boot-1.1.6-fsl-1/board/prodrive/common/flash.c
+--- u-boot-1.1.6/board/prodrive/common/flash.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/common/flash.c 2006-11-30 12:34:13.000000000 -0600
+@@ -48,6 +48,7 @@ void flash_print_info(flash_info_t *info
+ case FLASH_MAN_AMD: printf ("AMD "); break;
+ case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
+ case FLASH_MAN_SST: printf ("SST "); break;
++ case FLASH_MAN_STM: printf ("ST "); break;
+ case FLASH_MAN_EXCEL: printf ("Excel Semiconductor "); break;
+ default: printf ("Unknown Vendor "); break;
+ }
+@@ -156,6 +157,9 @@ static ulong flash_get_size(vu_long *add
+ case (CFG_FLASH_WORD_SIZE)SST_MANUFACT:
+ info->flash_id = FLASH_MAN_SST;
+ break;
++ case (CFG_FLASH_WORD_SIZE)STM_MANUFACT:
++ info->flash_id = FLASH_MAN_STM;
++ break;
+ case (CFG_FLASH_WORD_SIZE)EXCEL_MANUFACT:
+ info->flash_id = FLASH_MAN_EXCEL;
+ break;
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/64460.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/64460.h
+--- u-boot-1.1.6/board/prodrive/p3mx/64460.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/64460.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,52 @@
++/*
++ * (C) Copyright 2003
++ * Ingo Assmus <ingo.assmus@keymile.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
++ */
++
++/*
++ * main board support/init for the Galileo Eval board DB64460.
++ */
++
++#ifndef __64460_H__
++#define __64460_H__
++
++/* CPU Configuration bits */
++#define CPU_CONF_ADDR_MISS_EN (1 << 8)
++#define CPU_CONF_SINGLE_CPU (1 << 11)
++#define CPU_CONF_ENDIANESS (1 << 12)
++#define CPU_CONF_PIPELINE (1 << 13)
++#define CPU_CONF_STOP_RETRY (1 << 17)
++#define CPU_CONF_MULTI_DECODE (1 << 18)
++#define CPU_CONF_DP_VALID (1 << 19)
++#define CPU_CONF_PERR_PROP (1 << 22)
++#define CPU_CONF_AACK_DELAY_2 (1 << 25)
++#define CPU_CONF_AP_VALID (1 << 26)
++#define CPU_CONF_REMAP_WR_DIS (1 << 27)
++
++/* CPU Master Control bits */
++#define CPU_MAST_CTL_ARB_EN (1 << 8)
++#define CPU_MAST_CTL_MASK_BR_1 (1 << 9)
++#define CPU_MAST_CTL_M_WR_TRIG (1 << 10)
++#define CPU_MAST_CTL_M_RD_TRIG (1 << 11)
++#define CPU_MAST_CTL_CLEAN_BLK (1 << 12)
++#define CPU_MAST_CTL_FLUSH_BLK (1 << 13)
++
++#endif /* __64460_H__ */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/config.mk u-boot-1.1.6-fsl-1/board/prodrive/p3mx/config.mk
+--- u-boot-1.1.6/board/prodrive/p3mx/config.mk 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/config.mk 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,28 @@
++#
++# (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
++#
++
++#
++# p3mx boards (P3M750 & P3M7448)
++#
++
++TEXT_BASE = 0xfff00000
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/eth.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/eth.h
+--- u-boot-1.1.6/board/prodrive/p3mx/eth.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/eth.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,43 @@
++/*
++ * (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
++ */
++
++/*
++ * eth.h - header file for the polled mode GT ethernet driver
++ */
++
++#ifndef __EVB64360_ETH_H__
++#define __EVB64360_ETH_H__
++
++#include <asm/types.h>
++#include <asm/io.h>
++#include <asm/byteorder.h>
++#include <common.h>
++
++
++int db64360_eth0_poll(void);
++int db64360_eth0_transmit(unsigned int s, volatile char *p);
++void db64360_eth0_disable(void);
++bool network_start(bd_t *bis);
++
++
++#endif /* __EVB64360_ETH_H__ */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/Makefile u-boot-1.1.6-fsl-1/board/prodrive/p3mx/Makefile
+--- u-boot-1.1.6/board/prodrive/p3mx/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/Makefile 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,55 @@
++#
++# (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
++#
++
++include $(TOPDIR)/config.mk
++ifneq ($(OBJTREE),$(SRCTREE))
++$(shell mkdir -p $(obj)../../Marvell/common)
++endif
++
++LIB = $(obj)lib$(BOARD).a
++
++SOBJS = misc.o
++COBJS = $(BOARD).o mpsc.o mv_eth.o pci.o sdram_init.o serial.o \
++ ../../Marvell/common/i2c.o ../../Marvell/common/memory.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)
++
++distclean: clean
++ rm -f $(LIB) core *.bak .depend *~
++
++#########################################################################
++
++# defines $(obj).depend target
++include $(SRCTREE)/rules.mk
++
++sinclude $(obj).depend
++
++#########################################################################
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/misc.S u-boot-1.1.6-fsl-1/board/prodrive/p3mx/misc.S
+--- u-boot-1.1.6/board/prodrive/p3mx/misc.S 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/misc.S 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,245 @@
++#include <config.h>
++#include <74xx_7xx.h>
++#include "version.h"
++
++#include <ppc_asm.tmpl>
++#include <ppc_defs.h>
++
++#include <asm/cache.h>
++#include <asm/mmu.h>
++
++#include "../../Marvell/include/mv_gen_reg.h"
++
++#ifdef CONFIG_ECC
++ /* Galileo specific asm code for initializing ECC */
++ .globl board_relocate_rom
++board_relocate_rom:
++ mflr r7
++ /* update the location of the GT registers */
++ lis r11, CFG_GT_REGS@h
++ /* if we're using ECC, we must use the DMA engine to copy ourselves */
++ bl start_idma_transfer_0
++ bl wait_for_idma_0
++ bl stop_idma_engine_0
++
++ mtlr r7
++ blr
++
++ .globl board_init_ecc
++board_init_ecc:
++ mflr r7
++ /* NOTE: r10 still contains the location we've been relocated to
++ * which happens to be TOP_OF_RAM - CFG_MONITOR_LEN */
++
++ /* now that we're running from ram, init the rest of main memory
++ * for ECC use */
++ lis r8, CFG_MONITOR_LEN@h
++ ori r8, r8, CFG_MONITOR_LEN@l
++
++ divw r3, r10, r8
++
++ /* set up the counter, and init the starting address */
++ mtctr r3
++ li r12, 0
++
++ /* bytes per transfer */
++ mr r5, r8
++about_to_init_ecc:
++1: mr r3, r12
++ mr r4, r12
++ bl start_idma_transfer_0
++ bl wait_for_idma_0
++ bl stop_idma_engine_0
++ add r12, r12, r8
++ bdnz 1b
++
++ mtlr r7
++ blr
++
++ /* r3: dest addr
++ * r4: source addr
++ * r5: byte count
++ * r11: gt regbase
++ * trashes: r6, r5
++ */
++start_idma_transfer_0:
++ /* set the byte count, including the OWN bit */
++ mr r6, r11
++ ori r6, r6, CHANNEL0_DMA_BYTE_COUNT
++ stwbrx r5, 0, (r6)
++
++ /* set the source address */
++ mr r6, r11
++ ori r6, r6, CHANNEL0_DMA_SOURCE_ADDRESS
++ stwbrx r4, 0, (r6)
++
++ /* set the dest address */
++ mr r6, r11
++ ori r6, r6, CHANNEL0_DMA_DESTINATION_ADDRESS
++ stwbrx r3, 0, (r6)
++
++ /* set the next record pointer */
++ li r5, 0
++ mr r6, r11
++ ori r6, r6, CHANNEL0NEXT_RECORD_POINTER
++ stwbrx r5, 0, (r6)
++
++ /* set the low control register */
++ /* bit 9 is NON chained mode, bit 31 is new style descriptors.
++ bit 12 is channel enable */
++ ori r5, r5, (1 << 12) | (1 << 12) | (1 << 11)
++ /* 15 shifted by 16 (oris) == bit 31 */
++ oris r5, r5, (1 << 15)
++ mr r6, r11
++ ori r6, r6, CHANNEL0CONTROL
++ stwbrx r5, 0, (r6)
++
++ blr
++
++ /* this waits for the bytecount to return to zero, indicating
++ * that the trasfer is complete */
++wait_for_idma_0:
++ mr r5, r11
++ lis r6, 0xff
++ ori r6, r6, 0xffff
++ ori r5, r5, CHANNEL0_DMA_BYTE_COUNT
++1: lwbrx r4, 0, (r5)
++ and. r4, r4, r6
++ bne 1b
++
++ blr
++
++ /* this turns off channel 0 of the idma engine */
++stop_idma_engine_0:
++ /* shut off the DMA engine */
++ li r5, 0
++ mr r6, r11
++ ori r6, r6, CHANNEL0CONTROL
++ stwbrx r5, 0, (r6)
++
++ blr
++#endif
++
++#ifdef CFG_BOARD_ASM_INIT
++ /* NOTE: trashes r3-r7 */
++ .globl board_asm_init
++board_asm_init:
++ /* just move the GT registers to where they belong */
++ lis r3, CFG_DFL_GT_REGS@h
++ ori r3, r3, CFG_DFL_GT_REGS@l
++ lis r4, CFG_GT_REGS@h
++ ori r4, r4, CFG_GT_REGS@l
++ li r5, INTERNAL_SPACE_DECODE
++
++ /* test to see if we've already moved */
++ lwbrx r6, r5, r4
++ andi. r6, r6, 0xffff
++ /* check loading of R7 is: 0x0F80 should: 0xf800: DONE */
++/* rlwinm r7, r4, 8, 16, 31
++ rlwinm r7, r4, 12, 16, 31 */ /* original */
++ rlwinm r7, r4, 16, 16, 31
++ /* -----------------------------------------------------*/
++ cmp cr0, r7, r6
++ beqlr
++
++ /* nope, have to move the registers */
++ lwbrx r6, r5, r3
++ andis. r6, r6, 0xffff
++ or r6, r6, r7
++ stwbrx r6, r5, r3
++
++ /* now, poll for the change */
++1: lwbrx r7, r5, r4
++ cmp cr0, r7, r6
++ bne 1b
++
++ lis r3, CFG_INT_SRAM_BASE@h
++ ori r3, r3, CFG_INT_SRAM_BASE@l
++ rlwinm r3, r3, 16, 16, 31
++ lis r4, CFG_GT_REGS@h
++ ori r4, r4, CFG_GT_REGS@l
++ li r5, INTEGRATED_SRAM_BASE_ADDR
++ stwbrx r3, r5, r4
++
++2: lwbrx r6, r5, r4
++ cmp cr0, r3, r6
++ bne 2b
++
++ /* done! */
++ blr
++#endif
++
++/* For use of the debug LEDs */
++ .global led_on0_relocated
++led_on0_relocated:
++ xor r21, r21, r21
++ xor r18, r18, r18
++ lis r18, 0xFC80
++ ori r18, r18, 0x8000
++/* stw r21, 0x0(r18) */
++ sync
++ blr
++
++ .global led_off0_relocated
++led_off0_relocated:
++ xor r21, r21, r21
++ xor r18, r18, r18
++ lis r18, 0xFC81
++ ori r18, r18, 0x4000
++/* stw r21, 0x0(r18) */
++ sync
++ blr
++
++ .global led_on0
++led_on0:
++ xor r18, r18, r18
++ lis r18, 0x1c80
++ ori r18, r18, 0x8000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
++
++ .global led_off0
++led_off0:
++ xor r18, r18, r18
++ lis r18, 0x1c81
++ ori r18, r18, 0x4000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
++
++ .global led_on1
++led_on1:
++ xor r18, r18, r18
++ lis r18, 0x1c80
++ ori r18, r18, 0xc000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
++
++ .global led_off1
++led_off1:
++ xor r18, r18, r18
++ lis r18, 0x1c81
++ ori r18, r18, 0x8000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
++
++ .global led_on2
++led_on2:
++ xor r18, r18, r18
++ lis r18, 0x1c81
++ ori r18, r18, 0x0000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
++
++ .global led_off2
++led_off2:
++ xor r18, r18, r18
++ lis r18, 0x1c81
++ ori r18, r18, 0xc000
++/* stw r18, 0x0(r18) */
++ sync
++ blr
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mpsc.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.c
+--- u-boot-1.1.6/board/prodrive/p3mx/mpsc.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,1013 @@
++/*
++ * (C) Copyright 2001
++ * John Clemens <clemens@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
++ */
++
++/*************************************************************************
++ * changes for Marvell DB64460 eval board 2003 by Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ ************************************************************************/
++
++/*
++ * mpsc.c - driver for console over the MPSC.
++ */
++
++
++#include <common.h>
++#include <config.h>
++#include <asm/cache.h>
++
++#include <malloc.h>
++#include "mpsc.h"
++
++#include "mv_regs.h"
++
++#include "../../Marvell/include/memory.h"
++
++DECLARE_GLOBAL_DATA_PTR;
++
++/* Define this if you wish to use the MPSC as a register based UART.
++ * This will force the serial port to not use the SDMA engine at all.
++ */
++#undef CONFIG_MPSC_DEBUG_PORT
++
++
++int (*mpsc_putchar) (char ch) = mpsc_putchar_early;
++char (*mpsc_getchar) (void) = mpsc_getchar_debug;
++int (*mpsc_test_char) (void) = mpsc_test_char_debug;
++
++
++static volatile unsigned int *rx_desc_base = NULL;
++static unsigned int rx_desc_index = 0;
++static volatile unsigned int *tx_desc_base = NULL;
++static unsigned int tx_desc_index = 0;
++
++/* local function declarations */
++static int galmpsc_connect (int channel, int connect);
++static int galmpsc_route_rx_clock (int channel, int brg);
++static int galmpsc_route_tx_clock (int channel, int brg);
++static int galmpsc_write_config_regs (int mpsc, int mode);
++static int galmpsc_config_channel_regs (int mpsc);
++static int galmpsc_set_char_length (int mpsc, int value);
++static int galmpsc_set_stop_bit_length (int mpsc, int value);
++static int galmpsc_set_parity (int mpsc, int value);
++static int galmpsc_enter_hunt (int mpsc);
++static int galmpsc_set_brkcnt (int mpsc, int value);
++static int galmpsc_set_tcschar (int mpsc, int value);
++static int galmpsc_set_snoop (int mpsc, int value);
++static int galmpsc_shutdown (int mpsc);
++
++static int galsdma_set_RFT (int channel);
++static int galsdma_set_SFM (int channel);
++static int galsdma_set_rxle (int channel);
++static int galsdma_set_txle (int channel);
++static int galsdma_set_burstsize (int channel, unsigned int value);
++static int galsdma_set_RC (int channel, unsigned int value);
++
++static int galbrg_set_CDV (int channel, int value);
++static int galbrg_enable (int channel);
++static int galbrg_disable (int channel);
++static int galbrg_set_clksrc (int channel, int value);
++static int galbrg_set_CUV (int channel, int value);
++
++static void galsdma_enable_rx (void);
++static int galsdma_set_mem_space (unsigned int memSpace,
++ unsigned int memSpaceTarget,
++ unsigned int memSpaceAttr,
++ unsigned int baseAddress,
++ unsigned int size);
++
++
++#define SOFTWARE_CACHE_MANAGEMENT
++
++#ifdef SOFTWARE_CACHE_MANAGEMENT
++#define FLUSH_DCACHE(a,b) if(dcache_status()){clean_dcache_range((u32)(a),(u32)(b));}
++#define FLUSH_AND_INVALIDATE_DCACHE(a,b) if(dcache_status()){flush_dcache_range((u32)(a),(u32)(b));}
++#define INVALIDATE_DCACHE(a,b) if(dcache_status()){invalidate_dcache_range((u32)(a),(u32)(b));}
++#else
++#define FLUSH_DCACHE(a,b)
++#define FLUSH_AND_INVALIDATE_DCACHE(a,b)
++#define INVALIDATE_DCACHE(a,b)
++#endif
++
++#ifdef CONFIG_MPSC_DEBUG_PORT
++static void mpsc_debug_init (void)
++{
++
++ volatile unsigned int temp;
++
++ /* Clear the CFR (CHR4) */
++ /* Write random 'Z' bit (bit 29) of CHR4 to enable debug uart *UNDOCUMENTED FEATURE* */
++ temp = GTREGREAD (GALMPSC_CHANNELREG_4 + (CHANNEL * GALMPSC_REG_GAP));
++ temp &= 0xffffff00;
++ temp |= BIT29;
++ GT_REG_WRITE (GALMPSC_CHANNELREG_4 + (CHANNEL * GALMPSC_REG_GAP),
++ temp);
++
++ /* Set the Valid bit 'V' (bit 12) and int generation bit 'INT' (bit 15) */
++ temp = GTREGREAD (GALMPSC_CHANNELREG_5 + (CHANNEL * GALMPSC_REG_GAP));
++ temp |= (BIT12 | BIT15);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_5 + (CHANNEL * GALMPSC_REG_GAP),
++ temp);
++
++ /* Set int mask */
++ temp = GTREGREAD (GALMPSC_0_INT_MASK);
++ temp |= BIT6;
++ GT_REG_WRITE (GALMPSC_0_INT_MASK, temp);
++}
++#endif
++
++char mpsc_getchar_debug (void)
++{
++ volatile int temp;
++ volatile unsigned int cause;
++
++ cause = GTREGREAD (GALMPSC_0_INT_CAUSE);
++ while ((cause & BIT6) == 0) {
++ cause = GTREGREAD (GALMPSC_0_INT_CAUSE);
++ }
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_10 +
++ (CHANNEL * GALMPSC_REG_GAP));
++ /* By writing 1's to the set bits, the register is cleared */
++ GT_REG_WRITE (GALMPSC_CHANNELREG_10 + (CHANNEL * GALMPSC_REG_GAP),
++ temp);
++ GT_REG_WRITE (GALMPSC_0_INT_CAUSE, cause & ~BIT6);
++ return (temp >> 16) & 0xff;
++}
++
++/* special function for running out of flash. doesn't modify any
++ * global variables [josh] */
++int mpsc_putchar_early (char ch)
++{
++ int mpsc = CHANNEL;
++ int temp =
++ GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP));
++ galmpsc_set_tcschar (mpsc, ch);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP),
++ temp | 0x200);
++
++#define MAGIC_FACTOR (10*1000000)
++
++ udelay (MAGIC_FACTOR / gd->baudrate);
++ return 0;
++}
++
++/* This is used after relocation, see serial.c and mpsc_init2 */
++static int mpsc_putchar_sdma (char ch)
++{
++ volatile unsigned int *p;
++ unsigned int temp;
++
++
++ /* align the descriptor */
++ p = tx_desc_base;
++ memset ((void *) p, 0, 8 * sizeof (unsigned int));
++
++ /* fill one 64 bit buffer */
++ /* word swap, pad with 0 */
++ p[4] = 0; /* x */
++ p[5] = (unsigned int) ch; /* x */
++
++ /* CHANGED completely according to GT64260A dox - NTL */
++ p[0] = 0x00010001; /* 0 */
++ p[1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; /* 4 */
++ p[2] = 0; /* 8 */
++ p[3] = (unsigned int) &p[4]; /* c */
++
++#if 0
++ p[9] = DESC_FIRST | DESC_LAST;
++ p[10] = (unsigned int) &p[0];
++ p[11] = (unsigned int) &p[12];
++#endif
++
++ FLUSH_DCACHE (&p[0], &p[8]);
++
++ GT_REG_WRITE (GALSDMA_0_CUR_TX_PTR + (CHANNEL * GALSDMA_REG_DIFF),
++ (unsigned int) &p[0]);
++ GT_REG_WRITE (GALSDMA_0_FIR_TX_PTR + (CHANNEL * GALSDMA_REG_DIFF),
++ (unsigned int) &p[0]);
++
++ temp = GTREGREAD (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF));
++ temp |= (TX_DEMAND | TX_STOP);
++ GT_REG_WRITE (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF), temp);
++
++ INVALIDATE_DCACHE (&p[1], &p[2]);
++
++ while (p[1] & DESC_OWNER_BIT) {
++ udelay (100);
++ INVALIDATE_DCACHE (&p[1], &p[2]);
++ }
++ return 0;
++}
++
++char mpsc_getchar_sdma (void)
++{
++ static unsigned int done = 0;
++ volatile char ch;
++ unsigned int len = 0, idx = 0, temp;
++
++ volatile unsigned int *p;
++
++
++ do {
++ p = &rx_desc_base[rx_desc_index * 8];
++
++ INVALIDATE_DCACHE (&p[0], &p[1]);
++ /* Wait for character */
++ while (p[1] & DESC_OWNER_BIT) {
++ udelay (100);
++ INVALIDATE_DCACHE (&p[0], &p[1]);
++ }
++
++ /* Handle error case */
++ if (p[1] & (1 << 15)) {
++ printf ("oops, error: %08x\n", p[1]);
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 +
++ (CHANNEL * GALMPSC_REG_GAP));
++ temp |= (1 << 23);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 +
++ (CHANNEL * GALMPSC_REG_GAP), temp);
++
++ /* Can't poll on abort bit, so we just wait. */
++ udelay (100);
++
++ galsdma_enable_rx ();
++ }
++
++ /* Number of bytes left in this descriptor */
++ len = p[0] & 0xffff;
++
++ if (len) {
++ /* Where to look */
++ idx = 5;
++ if (done > 3)
++ idx = 4;
++ if (done > 7)
++ idx = 7;
++ if (done > 11)
++ idx = 6;
++
++ INVALIDATE_DCACHE (&p[idx], &p[idx + 1]);
++ ch = p[idx] & 0xff;
++ done++;
++ }
++
++ if (done < len) {
++ /* this descriptor has more bytes still
++ * shift down the char we just read, and leave the
++ * buffer in place for the next time around
++ */
++ p[idx] = p[idx] >> 8;
++ FLUSH_DCACHE (&p[idx], &p[idx + 1]);
++ }
++
++ if (done == len) {
++ /* nothing left in this descriptor.
++ * go to next one
++ */
++ p[1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST;
++ p[0] = 0x00100000;
++ FLUSH_DCACHE (&p[0], &p[1]);
++ /* Next descriptor */
++ rx_desc_index = (rx_desc_index + 1) % RX_DESC;
++ done = 0;
++ }
++ } while (len == 0); /* galileo bug.. len might be zero */
++
++ return ch;
++}
++
++
++int mpsc_test_char_debug (void)
++{
++ if ((GTREGREAD (GALMPSC_0_INT_CAUSE) & BIT6) == 0)
++ return 0;
++ else {
++ return 1;
++ }
++}
++
++
++int mpsc_test_char_sdma (void)
++{
++ volatile unsigned int *p = &rx_desc_base[rx_desc_index * 8];
++
++ INVALIDATE_DCACHE (&p[1], &p[2]);
++
++ if (p[1] & DESC_OWNER_BIT)
++ return 0;
++ else
++ return 1;
++}
++
++int mpsc_init (int baud)
++{
++ /* BRG CONFIG */
++ galbrg_set_baudrate (CHANNEL, baud);
++ galbrg_set_clksrc (CHANNEL, 8); /* set source=Tclk */
++ galbrg_set_CUV (CHANNEL, 0); /* set up CountUpValue */
++ galbrg_enable (CHANNEL); /* Enable BRG */
++
++ /* Set up clock routing */
++ galmpsc_connect (CHANNEL, GALMPSC_CONNECT); /* connect it */
++
++ galmpsc_route_rx_clock (CHANNEL, CHANNEL); /* chosse BRG0 for Rx */
++ galmpsc_route_tx_clock (CHANNEL, CHANNEL); /* chose BRG0 for Tx */
++
++ /* reset MPSC state */
++ galmpsc_shutdown (CHANNEL);
++
++ /* SDMA CONFIG */
++ galsdma_set_burstsize (CHANNEL, L1_CACHE_BYTES / 8); /* in 64 bit words (8 bytes) */
++ galsdma_set_txle (CHANNEL);
++ galsdma_set_rxle (CHANNEL);
++ galsdma_set_RC (CHANNEL, 0xf);
++ galsdma_set_SFM (CHANNEL);
++ galsdma_set_RFT (CHANNEL);
++
++ /* MPSC CONFIG */
++ galmpsc_write_config_regs (CHANNEL, GALMPSC_UART);
++ galmpsc_config_channel_regs (CHANNEL);
++ galmpsc_set_char_length (CHANNEL, GALMPSC_CHAR_LENGTH_8); /* 8 */
++ galmpsc_set_parity (CHANNEL, GALMPSC_PARITY_NONE); /* N */
++ galmpsc_set_stop_bit_length (CHANNEL, GALMPSC_STOP_BITS_1); /* 1 */
++
++#ifdef CONFIG_MPSC_DEBUG_PORT
++ mpsc_debug_init ();
++#endif
++
++ /* COMM_MPSC CONFIG */
++#ifdef SOFTWARE_CACHE_MANAGEMENT
++ galmpsc_set_snoop (CHANNEL, 0); /* disable snoop */
++#else
++ galmpsc_set_snoop (CHANNEL, 1); /* enable snoop */
++#endif
++
++ return 0;
++}
++
++
++void mpsc_sdma_init (void)
++{
++ /* Setup SDMA channel0 SDMA_CONFIG_REG*/
++ GT_REG_WRITE (SDMA_CONFIG_REG (0), 0x000020ff);
++
++ /* Enable MPSC-Window0 for DRAM Bank 0 */
++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT,
++ MV64460_SDMA_DRAM_CS_0_TARGET,
++ 0,
++ memoryGetBankBaseAddress(0),
++ memoryGetBankSize(0)) != true)
++ printf ("%s: SDMA_Window0 memory setup failed !!! \n",
++ __FUNCTION__);
++
++
++ /* Enable MPSC-Window1 for DRAM Bank 1 */
++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_1_BIT,
++ MV64460_SDMA_DRAM_CS_1_TARGET,
++ 0,
++ memoryGetBankBaseAddress(1),
++ memoryGetBankSize(1)) != true)
++ printf ("%s: SDMA_Window1 memory setup failed !!! \n",
++ __FUNCTION__);
++
++
++ /* Disable MPSC-Window2 */
++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_2_BIT,
++ MV64460_SDMA_DRAM_CS_2_TARGET,
++ 0,
++ memoryGetBankBaseAddress(2),
++ memoryGetBankSize(2)) != true)
++ printf ("%s: SDMA_Window2 memory setup failed !!! \n",
++ __FUNCTION__);
++
++
++ /* Disable MPSC-Window3 */
++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_3_BIT,
++ MV64460_SDMA_DRAM_CS_3_TARGET,
++ 0,
++ memoryGetBankBaseAddress(3),
++ memoryGetBankSize(3)) != true)
++ printf ("%s: SDMA_Window3 memory setup failed !!! \n",
++ __FUNCTION__);
++
++ /* Setup MPSC0 access mode Window0 full access */
++ GT_SET_REG_BITS (MPSC0_ACCESS_PROTECTION_REG,
++ (MV64460_SDMA_WIN_ACCESS_FULL <<
++ (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT * 2)));
++
++ /* Setup MPSC1 access mode Window1 full access */
++ GT_SET_REG_BITS (MPSC1_ACCESS_PROTECTION_REG,
++ (MV64460_SDMA_WIN_ACCESS_FULL <<
++ (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT * 2)));
++
++ /* Setup MPSC internal address space base address */
++ GT_REG_WRITE (CUNIT_INTERNAL_SPACE_BASE_ADDR_REG, CFG_GT_REGS);
++
++ /* no high address remap*/
++ GT_REG_WRITE (CUNIT_HIGH_ADDR_REMAP_REG0, 0x00);
++ GT_REG_WRITE (CUNIT_HIGH_ADDR_REMAP_REG1, 0x00);
++
++ /* clear interrupt cause register for MPSC (fault register)*/
++ GT_REG_WRITE (CUNIT_INTERRUPT_CAUSE_REG, 0x00);
++}
++
++
++void mpsc_init2 (void)
++{
++ int i;
++
++#ifndef CONFIG_MPSC_DEBUG_PORT
++ mpsc_putchar = mpsc_putchar_sdma;
++ mpsc_getchar = mpsc_getchar_sdma;
++ mpsc_test_char = mpsc_test_char_sdma;
++#endif
++ /* RX descriptors */
++ rx_desc_base = (unsigned int *) malloc (((RX_DESC + 1) * 8) *
++ sizeof (unsigned int));
++
++ /* align descriptors */
++ rx_desc_base = (unsigned int *)
++ (((unsigned int) rx_desc_base + 32) & 0xFFFFFFF0);
++
++ rx_desc_index = 0;
++
++ memset ((void *) rx_desc_base, 0,
++ (RX_DESC * 8) * sizeof (unsigned int));
++
++ for (i = 0; i < RX_DESC; i++) {
++ rx_desc_base[i * 8 + 3] = (unsigned int) &rx_desc_base[i * 8 + 4]; /* Buffer */
++ rx_desc_base[i * 8 + 2] = (unsigned int) &rx_desc_base[(i + 1) * 8]; /* Next descriptor */
++ rx_desc_base[i * 8 + 1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; /* Command & control */
++ rx_desc_base[i * 8] = 0x00100000;
++ }
++ rx_desc_base[(i - 1) * 8 + 2] = (unsigned int) &rx_desc_base[0];
++
++ FLUSH_DCACHE (&rx_desc_base[0], &rx_desc_base[RX_DESC * 8]);
++ GT_REG_WRITE (GALSDMA_0_CUR_RX_PTR + (CHANNEL * GALSDMA_REG_DIFF),
++ (unsigned int) &rx_desc_base[0]);
++
++ /* TX descriptors */
++ tx_desc_base = (unsigned int *) malloc (((TX_DESC + 1) * 8) *
++ sizeof (unsigned int));
++
++ /* align descriptors */
++ tx_desc_base = (unsigned int *)
++ (((unsigned int) tx_desc_base + 32) & 0xFFFFFFF0);
++
++ tx_desc_index = -1;
++
++ memset ((void *) tx_desc_base, 0,
++ (TX_DESC * 8) * sizeof (unsigned int));
++
++ for (i = 0; i < TX_DESC; i++) {
++ tx_desc_base[i * 8 + 5] = (unsigned int) 0x23232323;
++ tx_desc_base[i * 8 + 4] = (unsigned int) 0x23232323;
++ tx_desc_base[i * 8 + 3] =
++ (unsigned int) &tx_desc_base[i * 8 + 4];
++ tx_desc_base[i * 8 + 2] =
++ (unsigned int) &tx_desc_base[(i + 1) * 8];
++ tx_desc_base[i * 8 + 1] =
++ DESC_OWNER_BIT | DESC_FIRST | DESC_LAST;
++
++ /* set sbytecnt and shadow byte cnt to 1 */
++ tx_desc_base[i * 8] = 0x00010001;
++ }
++ tx_desc_base[(i - 1) * 8 + 2] = (unsigned int) &tx_desc_base[0];
++
++ FLUSH_DCACHE (&tx_desc_base[0], &tx_desc_base[TX_DESC * 8]);
++
++ udelay (100);
++
++ galsdma_enable_rx ();
++
++ return;
++}
++
++int galbrg_set_baudrate (int channel, int rate)
++{
++ int clock;
++
++ galbrg_disable (channel); /*ok */
++
++#ifdef ZUMA_NTL
++ /* from tclk */
++ clock = (CFG_TCLK / (16 * rate)) - 1;
++#else
++ clock = (CFG_TCLK / (16 * rate)) - 1;
++#endif
++
++ galbrg_set_CDV (channel, clock); /* set timer Reg. for BRG */
++
++ galbrg_enable (channel);
++
++ gd->baudrate = rate;
++
++ return 0;
++}
++
++/* ------------------------------------------------------------------ */
++
++/* Below are all the private functions that no one else needs */
++
++static int galbrg_set_CDV (int channel, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP));
++ temp &= 0xFFFF0000;
++ temp |= (value & 0x0000FFFF);
++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galbrg_enable (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP));
++ temp |= 0x00010000;
++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galbrg_disable (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP));
++ temp &= 0xFFFEFFFF;
++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galbrg_set_clksrc (int channel, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP));
++ temp &= 0xFFC3FFFF; /* Bit 18 - 21 (MV 64260 18-22) */
++ temp |= (value << 18);
++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp);
++ return 0;
++}
++
++static int galbrg_set_CUV (int channel, int value)
++{
++ /* set CountUpValue */
++ GT_REG_WRITE (GALBRG_0_BTREG + (channel * GALBRG_REG_GAP), value);
++
++ return 0;
++}
++
++#if 0
++static int galbrg_reset (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP));
++ temp |= 0x20000;
++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp);
++
++ return 0;
++}
++#endif
++
++static int galsdma_set_RFT (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp |= 0x00000001;
++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF),
++ temp);
++
++ return 0;
++}
++
++static int galsdma_set_SFM (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp |= 0x00000002;
++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF),
++ temp);
++
++ return 0;
++}
++
++static int galsdma_set_rxle (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp |= 0x00000040;
++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF),
++ temp);
++
++ return 0;
++}
++
++static int galsdma_set_txle (int channel)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp |= 0x00000080;
++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF),
++ temp);
++
++ return 0;
++}
++
++static int galsdma_set_RC (int channel, unsigned int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp &= ~0x0000003c;
++ temp |= (value << 2);
++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF),
++ temp);
++
++ return 0;
++}
++
++static int galsdma_set_burstsize (int channel, unsigned int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF));
++ temp &= 0xFFFFCFFF;
++ switch (value) {
++ case 8:
++ GT_REG_WRITE (GALSDMA_0_CONF_REG +
++ (channel * GALSDMA_REG_DIFF),
++ (temp | (0x3 << 12)));
++ break;
++
++ case 4:
++ GT_REG_WRITE (GALSDMA_0_CONF_REG +
++ (channel * GALSDMA_REG_DIFF),
++ (temp | (0x2 << 12)));
++ break;
++
++ case 2:
++ GT_REG_WRITE (GALSDMA_0_CONF_REG +
++ (channel * GALSDMA_REG_DIFF),
++ (temp | (0x1 << 12)));
++ break;
++
++ case 1:
++ GT_REG_WRITE (GALSDMA_0_CONF_REG +
++ (channel * GALSDMA_REG_DIFF),
++ (temp | (0x0 << 12)));
++ break;
++
++ default:
++ return -1;
++ break;
++ }
++
++ return 0;
++}
++
++static int galmpsc_connect (int channel, int connect)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_ROUTING_REGISTER);
++
++ if ((channel == 0) && connect)
++ temp &= ~0x00000007;
++ else if ((channel == 1) && connect)
++ temp &= ~(0x00000007 << 6);
++ else if ((channel == 0) && !connect)
++ temp |= 0x00000007;
++ else
++ temp |= (0x00000007 << 6);
++
++ /* Just in case... */
++ temp &= 0x3fffffff;
++
++ GT_REG_WRITE (GALMPSC_ROUTING_REGISTER, temp);
++
++ return 0;
++}
++
++static int galmpsc_route_rx_clock (int channel, int brg)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_RxC_ROUTE);
++
++ if (channel == 0) {
++ temp &= ~0x0000000F;
++ temp |= brg;
++ } else {
++ temp &= ~0x00000F00;
++ temp |= (brg << 8);
++ }
++
++ GT_REG_WRITE (GALMPSC_RxC_ROUTE, temp);
++
++ return 0;
++}
++
++static int galmpsc_route_tx_clock (int channel, int brg)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_TxC_ROUTE);
++
++ if (channel == 0) {
++ temp &= ~0x0000000F;
++ temp |= brg;
++ } else {
++ temp &= ~0x00000F00;
++ temp |= (brg << 8);
++ }
++
++ GT_REG_WRITE (GALMPSC_TxC_ROUTE, temp);
++
++ return 0;
++}
++
++static int galmpsc_write_config_regs (int mpsc, int mode)
++{
++ if (mode == GALMPSC_UART) {
++ /* Main config reg Low (Null modem, Enable Tx/Rx, UART mode) */
++ GT_REG_WRITE (GALMPSC_MCONF_LOW + (mpsc * GALMPSC_REG_GAP),
++ 0x000004c4);
++
++ /* Main config reg High (32x Rx/Tx clock mode, width=8bits */
++ GT_REG_WRITE (GALMPSC_MCONF_HIGH + (mpsc * GALMPSC_REG_GAP),
++ 0x024003f8);
++ /* 22 2222 1111 */
++ /* 54 3210 9876 */
++ /* 0000 0010 0000 0000 */
++ /* 1 */
++ /* 098 7654 3210 */
++ /* 0000 0011 1111 1000 */
++ } else
++ return -1;
++
++ return 0;
++}
++
++static int galmpsc_config_channel_regs (int mpsc)
++{
++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_3 + (mpsc * GALMPSC_REG_GAP), 1);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_4 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_5 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_6 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_7 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_8 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_9 + (mpsc * GALMPSC_REG_GAP), 0);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_10 + (mpsc * GALMPSC_REG_GAP), 0);
++
++ galmpsc_set_brkcnt (mpsc, 0x3);
++ galmpsc_set_tcschar (mpsc, 0xab);
++
++ return 0;
++}
++
++static int galmpsc_set_brkcnt (int mpsc, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP));
++ temp &= 0x0000FFFF;
++ temp |= (value << 16);
++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galmpsc_set_tcschar (int mpsc, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP));
++ temp &= 0xFFFF0000;
++ temp |= value;
++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galmpsc_set_char_length (int mpsc, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP));
++ temp &= 0xFFFFCFFF;
++ temp |= (value << 12);
++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galmpsc_set_stop_bit_length (int mpsc, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP));
++ temp &= 0xFFFFBFFF;
++ temp |= (value << 14);
++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galmpsc_set_parity (int mpsc, int value)
++{
++ unsigned int temp;
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP));
++ if (value != -1) {
++ temp &= 0xFFF3FFF3;
++ temp |= ((value << 18) | (value << 2));
++ temp |= ((value << 17) | (value << 1));
++ } else {
++ temp &= 0xFFF1FFF1;
++ }
++
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp);
++
++ return 0;
++}
++
++static int galmpsc_enter_hunt (int mpsc)
++{
++ int temp;
++
++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP));
++ temp |= 0x80000000;
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp);
++
++ while (GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)) &
++ MPSC_ENTER_HUNT) {
++ udelay (1);
++ }
++ return 0;
++}
++
++
++static int galmpsc_shutdown (int mpsc)
++{
++ unsigned int temp;
++
++ /* cause RX abort (clears RX) */
++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP));
++ temp |= MPSC_RX_ABORT | MPSC_TX_ABORT;
++ temp &= ~MPSC_ENTER_HUNT;
++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp);
++
++ GT_REG_WRITE (GALSDMA_0_COM_REG, 0);
++ GT_REG_WRITE (GALSDMA_0_COM_REG, SDMA_TX_ABORT | SDMA_RX_ABORT);
++
++ /* shut down the MPSC */
++ GT_REG_WRITE (GALMPSC_MCONF_LOW, 0);
++ GT_REG_WRITE (GALMPSC_MCONF_HIGH, 0);
++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), 0);
++
++ udelay (100);
++
++ /* shut down the sdma engines. */
++ /* reset config to default */
++ GT_REG_WRITE (GALSDMA_0_CONF_REG, 0x000000fc);
++
++ udelay (100);
++
++ /* clear the SDMA current and first TX and RX pointers */
++ GT_REG_WRITE (GALSDMA_0_CUR_RX_PTR, 0);
++ GT_REG_WRITE (GALSDMA_0_CUR_TX_PTR, 0);
++ GT_REG_WRITE (GALSDMA_0_FIR_TX_PTR, 0);
++
++ udelay (100);
++
++ return 0;
++}
++
++static void galsdma_enable_rx (void)
++{
++ int temp;
++
++ /* Enable RX processing */
++ temp = GTREGREAD (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF));
++ temp |= RX_ENABLE;
++ GT_REG_WRITE (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF), temp);
++
++ galmpsc_enter_hunt (CHANNEL);
++}
++
++static int galmpsc_set_snoop (int mpsc, int value)
++{
++ int reg =
++ mpsc ? MPSC_1_ADDRESS_CONTROL_LOW :
++ MPSC_0_ADDRESS_CONTROL_LOW;
++ int temp = GTREGREAD (reg);
++
++ if (value)
++ temp |= (1 << 6) | (1 << 14) | (1 << 22) | (1 << 30);
++ else
++ temp &= ~((1 << 6) | (1 << 14) | (1 << 22) | (1 << 30));
++ GT_REG_WRITE (reg, temp);
++ return 0;
++}
++
++/*******************************************************************************
++* galsdma_set_mem_space - Set MV64460 IDMA memory decoding map.
++*
++* DESCRIPTION:
++* the MV64460 SDMA has its own address decoding map that is de-coupled
++* from the CPU interface address decoding windows. The SDMA channels
++* share four address windows. Each region can be individually configured
++* by this function by associating it to a target interface and setting
++* base and size values.
++*
++* NOTE!!!
++* The size must be in 64Kbyte granularity.
++* The base address must be aligned to the size.
++* The size must be a series of 1s followed by a series of zeros
++*
++* OUTPUT:
++* None.
++*
++* RETURN:
++* True for success, false otherwise.
++*
++*******************************************************************************/
++
++static int galsdma_set_mem_space (unsigned int memSpace,
++ unsigned int memSpaceTarget,
++ unsigned int memSpaceAttr,
++ unsigned int baseAddress, unsigned int size)
++{
++ unsigned int temp;
++
++ if (size == 0) {
++ GT_RESET_REG_BITS (MV64460_CUNIT_BASE_ADDR_ENABLE_REG,
++ 1 << memSpace);
++ return true;
++ }
++
++ /* The base address must be aligned to the size. */
++ if (baseAddress % size != 0) {
++ return false;
++ }
++ if (size < 0x10000) {
++ return false;
++ }
++
++ /* Align size and base to 64K */
++ baseAddress &= 0xffff0000;
++ size &= 0xffff0000;
++ temp = size >> 16;
++
++ /* Checking that the size is a sequence of '1' followed by a
++ sequence of '0' starting from LSB to MSB. */
++ while ((temp > 0) && (temp & 0x1)) {
++ temp = temp >> 1;
++ }
++
++ if (temp != 0) {
++ GT_REG_WRITE (MV64460_CUNIT_BASE_ADDR_REG0 + memSpace * 8,
++ (baseAddress | memSpaceTarget | memSpaceAttr));
++ GT_REG_WRITE ((MV64460_CUNIT_SIZE0 + memSpace * 8),
++ (size - 1) & 0xffff0000);
++ GT_RESET_REG_BITS (MV64460_CUNIT_BASE_ADDR_ENABLE_REG,
++ 1 << memSpace);
++ } else {
++ /* An invalid size was specified */
++ return false;
++ }
++ return true;
++}
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mpsc.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.h
+--- u-boot-1.1.6/board/prodrive/p3mx/mpsc.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,156 @@
++/*
++ * (C) Copyright 2001
++ * John Clemens <clemens@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
++ */
++
++/*************************************************************************
++ * changes for Marvell DB64360 eval board 2003 by Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ ************************************************************************/
++
++
++/*
++ * mpsc.h - header file for MPSC in uart mode (console driver)
++ */
++
++#ifndef __MPSC_H__
++#define __MPSC_H__
++
++/* include actual Galileo defines */
++#include "../../Marvell/include/mv_gen_reg.h"
++
++/* driver related defines */
++
++int mpsc_init(int baud);
++void mpsc_sdma_init(void);
++void mpsc_init2(void);
++int galbrg_set_baudrate(int channel, int rate);
++
++int mpsc_putchar_early(char ch);
++char mpsc_getchar_debug(void);
++int mpsc_test_char_debug(void);
++
++int mpsc_test_char_sdma(void);
++
++extern int (*mpsc_putchar)(char ch);
++extern char (*mpsc_getchar)(void);
++extern int (*mpsc_test_char)(void);
++
++#define CHANNEL CONFIG_MPSC_PORT
++
++#define TX_DESC 5
++#define RX_DESC 20
++
++#define DESC_FIRST 0x00010000
++#define DESC_LAST 0x00020000
++#define DESC_OWNER_BIT 0x80000000
++
++#define TX_DEMAND 0x00800000
++#define TX_STOP 0x00010000
++#define RX_ENABLE 0x00000080
++
++#define SDMA_RX_ABORT (1 << 15)
++#define SDMA_TX_ABORT (1 << 31)
++#define MPSC_TX_ABORT (1 << 7)
++#define MPSC_RX_ABORT (1 << 23)
++#define MPSC_ENTER_HUNT (1 << 31)
++
++/* MPSC defines */
++
++#define GALMPSC_CONNECT 0x1
++#define GALMPSC_DISCONNECT 0x0
++
++#define GALMPSC_UART 0x1
++
++#define GALMPSC_STOP_BITS_1 0x0
++#define GALMPSC_STOP_BITS_2 0x1
++#define GALMPSC_CHAR_LENGTH_8 0x3
++#define GALMPSC_CHAR_LENGTH_7 0x2
++
++#define GALMPSC_PARITY_ODD 0x0
++#define GALMPSC_PARITY_EVEN 0x2
++#define GALMPSC_PARITY_MARK 0x3
++#define GALMPSC_PARITY_SPACE 0x1
++#define GALMPSC_PARITY_NONE -1
++
++#define GALMPSC_SERIAL_MULTIPLEX SERIAL_PORT_MULTIPLEX /* 0xf010 */
++#define GALMPSC_ROUTING_REGISTER MAIN_ROUTING_REGISTER /* 0xb400 */
++#define GALMPSC_RxC_ROUTE RECEIVE_CLOCK_ROUTING_REGISTER /* 0xb404 */
++#define GALMPSC_TxC_ROUTE TRANSMIT_CLOCK_ROUTING_REGISTER /* 0xb408 */
++#define GALMPSC_MCONF_LOW MPSC0_MAIN_CONFIGURATION_LOW /* 0x8000 */
++#define GALMPSC_MCONF_HIGH MPSC0_MAIN_CONFIGURATION_HIGH /* 0x8004 */
++#define GALMPSC_PROTOCONF_REG MPSC0_PROTOCOL_CONFIGURATION /* 0x8008 */
++
++#define GALMPSC_REG_GAP 0x1000
++
++#define GALMPSC_MCONF_CHREG_BASE CHANNEL0_REGISTER1 /* 0x800c */
++#define GALMPSC_CHANNELREG_1 CHANNEL0_REGISTER1 /* 0x800c */
++#define GALMPSC_CHANNELREG_2 CHANNEL0_REGISTER2 /* 0x8010 */
++#define GALMPSC_CHANNELREG_3 CHANNEL0_REGISTER3 /* 0x8014 */
++#define GALMPSC_CHANNELREG_4 CHANNEL0_REGISTER4 /* 0x8018 */
++#define GALMPSC_CHANNELREG_5 CHANNEL0_REGISTER5 /* 0x801c */
++#define GALMPSC_CHANNELREG_6 CHANNEL0_REGISTER6 /* 0x8020 */
++#define GALMPSC_CHANNELREG_7 CHANNEL0_REGISTER7 /* 0x8024 */
++#define GALMPSC_CHANNELREG_8 CHANNEL0_REGISTER8 /* 0x8028 */
++#define GALMPSC_CHANNELREG_9 CHANNEL0_REGISTER9 /* 0x802c */
++#define GALMPSC_CHANNELREG_10 CHANNEL0_REGISTER10 /* 0x8030 */
++#define GALMPSC_CHANNELREG_11 CHANNEL0_REGISTER11 /* 0x8034 */
++
++#define GALSDMA_COMMAND_FIRST (1 << 16)
++#define GALSDMA_COMMAND_LAST (1 << 17)
++#define GALSDMA_COMMAND_ENABLEINT (1 << 23)
++#define GALSDMA_COMMAND_AUTO (1 << 30)
++#define GALSDMA_COMMAND_OWNER (1 << 31)
++
++#define GALSDMA_RX 0
++#define GALSDMA_TX 1
++
++/* CHANNEL2 should be CHANNEL1, according to documentation,
++ * but to work with the current GTREGS file...
++ */
++#define GALSDMA_0_CONF_REG CHANNEL0_CONFIGURATION_REGISTER /* 0x4000 */
++#define GALSDMA_1_CONF_REG CHANNEL2_CONFIGURATION_REGISTER /* 0x6000 */
++#define GALSDMA_0_COM_REG CHANNEL0_COMMAND_REGISTER /* 0x4008 */
++#define GALSDMA_1_COM_REG CHANNEL2_COMMAND_REGISTER /* 0x6008 */
++#define GALSDMA_0_CUR_RX_PTR CHANNEL0_CURRENT_RX_DESCRIPTOR_POINTER /* 0x4810 */
++#define GALSDMA_0_CUR_TX_PTR CHANNEL0_CURRENT_TX_DESCRIPTOR_POINTER /* 0x4c10 */
++#define GALSDMA_0_FIR_TX_PTR CHANNEL0_FIRST_TX_DESCRIPTOR_POINTER /* 0x4c14 */
++#define GALSDMA_1_CUR_RX_PTR CHANNEL2_CURRENT_RX_DESCRIPTOR_POINTER /* 0x6810 */
++#define GALSDMA_1_CUR_TX_PTR CHANNEL2_CURRENT_TX_DESCRIPTOR_POINTER /* 0x6c10 */
++#define GALSDMA_1_FIR_TX_PTR CHANNEL2_FIRST_TX_DESCRIPTOR_POINTER /* 0x6c14 */
++#define GALSDMA_REG_DIFF 0x2000
++
++/* WRONG in gt64260R.h */
++#define GALSDMA_INT_CAUSE 0xb800 /* SDMA_CAUSE */
++#define GALSDMA_INT_MASK 0xb880 /* SDMA_MASK */
++#define GALMPSC_0_INT_CAUSE 0xb804
++#define GALMPSC_0_INT_MASK 0xb884
++
++#define GALSDMA_MODE_UART 0
++#define GALSDMA_MODE_BISYNC 1
++#define GALSDMA_MODE_HDLC 2
++#define GALSDMA_MODE_TRANSPARENT 3
++
++#define GALBRG_0_CONFREG BRG0_CONFIGURATION_REGISTER /* 0xb200 */
++#define GALBRG_REG_GAP 0x0008
++#define GALBRG_0_BTREG BRG0_BAUDE_TUNING_REGISTER /* 0xb204 */
++
++#endif /* __MPSC_H__ */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_eth.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.c
+--- u-boot-1.1.6/board/prodrive/p3mx/mv_eth.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,3344 @@
++/*
++ * (C) Copyright 2003
++ * Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ * based on - Driver for MV64460X ethernet ports
++ * Copyright (C) 2002 rabeeh@galileo.co.il
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ 3 the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/*
++ * mv_eth.c - header file for the polled mode GT ethernet driver
++ */
++#include <common.h>
++#include <net.h>
++#include <malloc.h>
++#include <miiphy.h>
++
++#include "mv_eth.h"
++
++/* enable Debug outputs */
++
++#undef DEBUG_MV_ETH
++
++#ifdef DEBUG_MV_ETH
++#define DEBUG
++#define DP(x) x
++#else
++#define DP(x)
++#endif
++
++/* PHY DFCDL Registers */
++#define ETH_PHY_DFCDL_CONFIG0_REG 0x2100
++#define ETH_PHY_DFCDL_CONFIG1_REG 0x2104
++#define ETH_PHY_DFCDL_ADDR_REG 0x2110
++#define ETH_PHY_DFCDL_DATA0_REG 0x2114
++
++#define PHY_AUTONEGOTIATE_TIMEOUT 4000 /* 4000 ms autonegotiate timeout */
++#define PHY_UPDATE_TIMEOUT 10000
++
++#undef MV64460_CHECKSUM_OFFLOAD
++/*************************************************************************
++* The first part is the high level driver of the gigE ethernet ports. *
++*************************************************************************/
++
++/* Definition for configuring driver */
++/* #define UPDATE_STATS_BY_SOFTWARE */
++#undef MV64460_RX_QUEUE_FILL_ON_TASK
++
++/* Constants */
++#define MAGIC_ETH_RUNNING 8031971
++#define MV64460_INTERNAL_SRAM_SIZE _256K
++#define EXTRA_BYTES 32
++#define WRAP ETH_HLEN + 2 + 4 + 16
++#define BUFFER_MTU dev->mtu + WRAP
++#define INT_CAUSE_UNMASK_ALL 0x0007ffff
++#define INT_CAUSE_UNMASK_ALL_EXT 0x0011ffff
++#ifdef MV64460_RX_FILL_ON_TASK
++#define INT_CAUSE_MASK_ALL 0x00000000
++#define INT_CAUSE_CHECK_BITS INT_CAUSE_UNMASK_ALL
++#define INT_CAUSE_CHECK_BITS_EXT INT_CAUSE_UNMASK_ALL_EXT
++#endif
++
++/* Read/Write to/from MV64460 internal registers */
++#define MV_REG_READ(offset) my_le32_to_cpu(* (volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset))
++#define MV_REG_WRITE(offset,data) *(volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset) = my_cpu_to_le32 (data)
++#define MV_SET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) |= ((unsigned int)my_cpu_to_le32(bits)))
++#define MV_RESET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) &= ~((unsigned int)my_cpu_to_le32(bits)))
++
++#define my_cpu_to_le32(x) my_le32_to_cpu((x))
++
++/* Static function declarations */
++static int mv64460_eth_real_open (struct eth_device *eth);
++static int mv64460_eth_real_stop (struct eth_device *eth);
++static struct net_device_stats *mv64460_eth_get_stats (struct eth_device
++ *dev);
++static void eth_port_init_mac_tables (ETH_PORT eth_port_num);
++static void mv64460_eth_update_stat (struct eth_device *dev);
++bool db64460_eth_start (struct eth_device *eth);
++unsigned int eth_read_mib_counter (ETH_PORT eth_port_num,
++ unsigned int mib_offset);
++int mv64460_eth_receive (struct eth_device *dev);
++
++int mv64460_eth_xmit (struct eth_device *, volatile void *packet, int length);
++
++int mv_miiphy_read(char *devname, unsigned char phy_addr,
++ unsigned char phy_reg, unsigned short *value);
++int mv_miiphy_write(char *devname, unsigned char phy_addr,
++ unsigned char phy_reg, unsigned short value);
++
++int phy_setup_aneg (char *devname, unsigned char addr);
++
++#ifndef UPDATE_STATS_BY_SOFTWARE
++static void mv64460_eth_print_stat (struct eth_device *dev);
++#endif
++/* Processes a received packet */
++extern void NetReceive (volatile uchar *, int);
++
++extern unsigned int INTERNAL_REG_BASE_ADDR;
++
++unsigned long my_le32_to_cpu (unsigned long x)
++{
++ return (((x & 0x000000ffU) << 24) |
++ ((x & 0x0000ff00U) << 8) |
++ ((x & 0x00ff0000U) >> 8) | ((x & 0xff000000U) >> 24));
++}
++
++/*************************************************
++ *Helper functions - used inside the driver only *
++ *************************************************/
++#ifdef DEBUG_MV_ETH
++void print_globals (struct eth_device *dev)
++{
++ printf ("Ethernet PRINT_Globals-Debug function\n");
++ printf ("Base Address for ETH_PORT_INFO: %08x\n",
++ (unsigned int) dev->priv);
++ printf ("Base Address for mv64460_eth_priv: %08x\n",
++ (unsigned int) &(((ETH_PORT_INFO *) dev->priv)->
++ port_private));
++
++ printf ("GT Internal Base Address: %08x\n",
++ INTERNAL_REG_BASE_ADDR);
++ printf ("Base Address for TX-DESCs: %08x Number of allocated Buffers %d\n",
++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_tx_desc_area_base[0], MV64460_TX_QUEUE_SIZE);
++ printf ("Base Address for RX-DESCs: %08x Number of allocated Buffers %d\n",
++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_rx_desc_area_base[0], MV64460_RX_QUEUE_SIZE);
++ printf ("Base Address for RX-Buffer: %08x allocated Bytes %d\n",
++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->
++ p_rx_buffer_base[0],
++ (MV64460_RX_QUEUE_SIZE * MV64460_RX_BUFFER_SIZE) + 32);
++ printf ("Base Address for TX-Buffer: %08x allocated Bytes %d\n",
++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->
++ p_tx_buffer_base[0],
++ (MV64460_TX_QUEUE_SIZE * MV64460_TX_BUFFER_SIZE) + 32);
++}
++#endif
++
++/**********************************************************************
++ * mv64460_eth_print_phy_status
++ *
++ * Prints gigabit ethenret phy status
++ *
++ * Input : pointer to ethernet interface network device structure
++ * Output : N/A
++ **********************************************************************/
++void mv64460_eth_print_phy_status (struct eth_device *dev)
++{
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ ETH_PORT_INFO *ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ unsigned int port_status, phy_reg_data;
++
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ /* Check Link status on phy */
++ eth_port_read_smi_reg (port_num, 1, &phy_reg_data);
++ if (!(phy_reg_data & 0x20)) {
++ printf ("Ethernet port changed link status to DOWN\n");
++ } else {
++ port_status =
++ MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num));
++ printf ("Ethernet status port %d: Link up", port_num);
++ printf (", %s",
++ (port_status & BIT2) ? "Full Duplex" : "Half Duplex");
++ if (port_status & BIT4)
++ printf (", Speed 1 Gbps");
++ else
++ printf (", %s",
++ (port_status & BIT5) ? "Speed 100 Mbps" :
++ "Speed 10 Mbps");
++ printf ("\n");
++ }
++}
++
++/**********************************************************************
++ * u-boot entry functions for mv64460_eth
++ *
++ **********************************************************************/
++int db64460_eth_probe (struct eth_device *dev)
++{
++ return ((int) db64460_eth_start (dev));
++}
++
++int db64460_eth_poll (struct eth_device *dev)
++{
++ return mv64460_eth_receive (dev);
++}
++
++int db64460_eth_transmit (struct eth_device *dev, volatile void *packet,
++ int length)
++{
++ mv64460_eth_xmit (dev, packet, length);
++ return 0;
++}
++
++void db64460_eth_disable (struct eth_device *dev)
++{
++ mv64460_eth_stop (dev);
++}
++
++#define DFCDL(write,read) ((write << 6) | read)
++unsigned int ethDfcdls[] = {
++ DFCDL(0,0), DFCDL(1,1), DFCDL(2,2), DFCDL(3,3),
++ DFCDL(4,4), DFCDL(5,5), DFCDL(6,6), DFCDL(7,7),
++ DFCDL(8,8), DFCDL(9,9), DFCDL(10,10), DFCDL(11,11),
++ DFCDL(12,12), DFCDL(13,13), DFCDL(14,14), DFCDL(15,15),
++ DFCDL(16,16), DFCDL(17,17), DFCDL(18,18), DFCDL(19,19),
++ DFCDL(20,20), DFCDL(21,21), DFCDL(22,22), DFCDL(23,23),
++ DFCDL(24,24), DFCDL(25,25), DFCDL(26,26), DFCDL(27,27),
++ DFCDL(28,28), DFCDL(29,29), DFCDL(30,30), DFCDL(31,31),
++ DFCDL(32,32), DFCDL(33,33), DFCDL(34,34), DFCDL(35,35),
++ DFCDL(36,36), DFCDL(37,37), DFCDL(38,38), DFCDL(39,39),
++ DFCDL(40,40), DFCDL(41,41), DFCDL(42,42), DFCDL(43,43),
++ DFCDL(44,44), DFCDL(45,45), DFCDL(46,46), DFCDL(47,47),
++ DFCDL(48,48), DFCDL(49,49), DFCDL(50,50), DFCDL(51,51),
++ DFCDL(52,52), DFCDL(53,53), DFCDL(54,54), DFCDL(55,55),
++ DFCDL(56,56), DFCDL(57,57), DFCDL(58,58), DFCDL(59,59),
++ DFCDL(60,60), DFCDL(61,61), DFCDL(62,62), DFCDL(63,63),
++};
++
++void mv_eth_phy_init (void)
++{
++ int i;
++
++ MV_REG_WRITE (ETH_PHY_DFCDL_ADDR_REG, 0);
++
++ for (i = 0; i < 64; i++) {
++ MV_REG_WRITE (ETH_PHY_DFCDL_DATA0_REG, ethDfcdls[i]);
++ }
++
++ MV_REG_WRITE (ETH_PHY_DFCDL_CONFIG0_REG, 0x300000);
++}
++
++void mv6446x_eth_initialize (bd_t * bis)
++{
++ struct eth_device *dev;
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ int devnum, x, temp;
++ char *s, *e, buf[64];
++
++ /* P3M750 only
++ * Set RGMII clock drives strength
++ */
++ temp = MV_REG_READ(0x20A0);
++ temp |= 0x04000080;
++ MV_REG_WRITE(0x20A0, temp);
++
++ mv_eth_phy_init();
++
++ for (devnum = 0; devnum < MV_ETH_DEVS; devnum++) {
++ dev = calloc (sizeof (*dev), 1);
++ if (!dev) {
++ printf ("%s: mv_enet%d allocation failure, %s\n",
++ __FUNCTION__, devnum, "eth_device structure");
++ return;
++ }
++
++ /* must be less than NAMESIZE (16) */
++ sprintf (dev->name, "mv_enet%d", devnum);
++
++#ifdef DEBUG
++ printf ("Initializing %s\n", dev->name);
++#endif
++
++ /* Extract the MAC address from the environment */
++ switch (devnum) {
++ case 0:
++ s = "ethaddr";
++ break;
++ case 1:
++ s = "eth1addr";
++ break;
++ case 2:
++ s = "eth2addr";
++ break;
++ default: /* this should never happen */
++ printf ("%s: Invalid device number %d\n",
++ __FUNCTION__, devnum);
++ return;
++ }
++
++ temp = getenv_r (s, buf, sizeof (buf));
++ s = (temp > 0) ? buf : NULL;
++
++#ifdef DEBUG
++ printf ("Setting MAC %d to %s\n", devnum, s);
++#endif
++ for (x = 0; x < 6; ++x) {
++ dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0;
++ if (s)
++ s = (*e) ? e + 1 : e;
++ }
++ /* ronen - set the MAC addr in the HW */
++ eth_port_uc_addr_set (devnum, dev->enetaddr, 0);
++
++ dev->init = (void *) db64460_eth_probe;
++ dev->halt = (void *) ethernet_phy_reset;
++ dev->send = (void *) db64460_eth_transmit;
++ dev->recv = (void *) db64460_eth_poll;
++
++ ethernet_private = calloc (sizeof (*ethernet_private), 1);
++ dev->priv = (void *)ethernet_private;
++ if (!ethernet_private) {
++ printf ("%s: %s allocation failure, %s\n",
++ __FUNCTION__, dev->name,
++ "Private Device Structure");
++ free (dev);
++ return;
++ }
++ /* start with an zeroed ETH_PORT_INFO */
++ memset (ethernet_private, 0, sizeof (ETH_PORT_INFO));
++ memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6);
++
++ /* set pointer to memory for stats data structure etc... */
++ port_private = calloc (sizeof (*ethernet_private), 1);
++ ethernet_private->port_private = (void *)port_private;
++ if (!port_private) {
++ printf ("%s: %s allocation failure, %s\n",
++ __FUNCTION__, dev->name,
++ "Port Private Device Structure");
++
++ free (ethernet_private);
++ free (dev);
++ return;
++ }
++
++ port_private->stats =
++ calloc (sizeof (struct net_device_stats), 1);
++ if (!port_private->stats) {
++ printf ("%s: %s allocation failure, %s\n",
++ __FUNCTION__, dev->name,
++ "Net stat Structure");
++
++ free (port_private);
++ free (ethernet_private);
++ free (dev);
++ return;
++ }
++ memset (ethernet_private->port_private, 0,
++ sizeof (struct mv64460_eth_priv));
++ switch (devnum) {
++ case 0:
++ ethernet_private->port_num = ETH_0;
++ break;
++ case 1:
++ ethernet_private->port_num = ETH_1;
++ break;
++ case 2:
++ ethernet_private->port_num = ETH_2;
++ break;
++ default:
++ printf ("Invalid device number %d\n", devnum);
++ break;
++ };
++
++ port_private->port_num = devnum;
++ /*
++ * Read MIB counter on the GT in order to reset them,
++ * then zero all the stats fields in memory
++ */
++ mv64460_eth_update_stat (dev);
++ memset (port_private->stats, 0,
++ sizeof (struct net_device_stats));
++ /* Extract the MAC address from the environment */
++ switch (devnum) {
++ case 0:
++ s = "ethaddr";
++ break;
++ case 1:
++ s = "eth1addr";
++ break;
++ case 2:
++ s = "eth2addr";
++ break;
++ default: /* this should never happen */
++ printf ("%s: Invalid device number %d\n",
++ __FUNCTION__, devnum);
++ return;
++ }
++
++ temp = getenv_r (s, buf, sizeof (buf));
++ s = (temp > 0) ? buf : NULL;
++
++#ifdef DEBUG
++ printf ("Setting MAC %d to %s\n", devnum, s);
++#endif
++ for (x = 0; x < 6; ++x) {
++ dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0;
++ if (s)
++ s = (*e) ? e + 1 : e;
++ }
++
++ DP (printf ("Allocating descriptor and buffer rings\n"));
++
++ ethernet_private->p_rx_desc_area_base[0] =
++ (ETH_RX_DESC *) memalign (16,
++ RX_DESC_ALIGNED_SIZE *
++ MV64460_RX_QUEUE_SIZE + 1);
++ ethernet_private->p_tx_desc_area_base[0] =
++ (ETH_TX_DESC *) memalign (16,
++ TX_DESC_ALIGNED_SIZE *
++ MV64460_TX_QUEUE_SIZE + 1);
++
++ ethernet_private->p_rx_buffer_base[0] =
++ (char *) memalign (16,
++ MV64460_RX_QUEUE_SIZE *
++ MV64460_TX_BUFFER_SIZE + 1);
++ ethernet_private->p_tx_buffer_base[0] =
++ (char *) memalign (16,
++ MV64460_RX_QUEUE_SIZE *
++ MV64460_TX_BUFFER_SIZE + 1);
++
++#ifdef DEBUG_MV_ETH
++ /* DEBUG OUTPUT prints adresses of globals */
++ print_globals (dev);
++#endif
++ eth_register (dev);
++
++ miiphy_register(dev->name, mv_miiphy_read, mv_miiphy_write);
++ }
++ DP (printf ("%s: exit\n", __FUNCTION__));
++
++}
++
++/**********************************************************************
++ * mv64460_eth_open
++ *
++ * This function is called when openning the network device. The function
++ * should initialize all the hardware, initialize cyclic Rx/Tx
++ * descriptors chain and buffers and allocate an IRQ to the network
++ * device.
++ *
++ * Input : a pointer to the network device structure
++ * / / ronen - changed the output to match net/eth.c needs
++ * Output : nonzero of success , zero if fails.
++ * under construction
++ **********************************************************************/
++
++int mv64460_eth_open (struct eth_device *dev)
++{
++ return (mv64460_eth_real_open (dev));
++}
++
++/* Helper function for mv64460_eth_open */
++static int mv64460_eth_real_open (struct eth_device *dev)
++{
++
++ unsigned int queue;
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ u32 port_status;
++ ushort reg_short;
++ int speed;
++ int duplex;
++ int i;
++ int reg;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ /* ronen - when we update the MAC env params we only update dev->enetaddr
++ see ./net/eth.c eth_set_enetaddr() */
++ memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6);
++
++ port_private = (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ /* Stop RX Queues */
++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num), 0x0000ff00);
++
++ /* Clear the ethernet port interrupts */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0);
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0);
++
++ /* Unmask RX buffer and TX end interrupt */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num),
++ INT_CAUSE_UNMASK_ALL);
++
++ /* Unmask phy and link status changes interrupts */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num),
++ INT_CAUSE_UNMASK_ALL_EXT);
++
++ /* Set phy address of the port */
++ ethernet_private->port_phy_addr = 0x1 + (port_num << 1);
++ reg = ethernet_private->port_phy_addr;
++
++ /* Activate the DMA channels etc */
++ eth_port_init (ethernet_private);
++
++ /* "Allocate" setup TX rings */
++
++ for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) {
++ unsigned int size;
++
++ port_private->tx_ring_size[queue] = MV64460_TX_QUEUE_SIZE;
++ size = (port_private->tx_ring_size[queue] * TX_DESC_ALIGNED_SIZE); /*size = no of DESCs times DESC-size */
++ ethernet_private->tx_desc_area_size[queue] = size;
++
++ /* first clear desc area completely */
++ memset ((void *) ethernet_private->p_tx_desc_area_base[queue],
++ 0, ethernet_private->tx_desc_area_size[queue]);
++
++ /* initialize tx desc ring with low level driver */
++ if (ether_init_tx_desc_ring
++ (ethernet_private, ETH_Q0,
++ port_private->tx_ring_size[queue],
++ MV64460_TX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ ,
++ (unsigned int) ethernet_private->
++ p_tx_desc_area_base[queue],
++ (unsigned int) ethernet_private->
++ p_tx_buffer_base[queue]) == false)
++ printf ("### Error initializing TX Ring\n");
++ }
++
++ /* "Allocate" setup RX rings */
++ for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) {
++ unsigned int size;
++
++ /* Meantime RX Ring are fixed - but must be configurable by user */
++ port_private->rx_ring_size[queue] = MV64460_RX_QUEUE_SIZE;
++ size = (port_private->rx_ring_size[queue] *
++ RX_DESC_ALIGNED_SIZE);
++ ethernet_private->rx_desc_area_size[queue] = size;
++
++ /* first clear desc area completely */
++ memset ((void *) ethernet_private->p_rx_desc_area_base[queue],
++ 0, ethernet_private->rx_desc_area_size[queue]);
++ if ((ether_init_rx_desc_ring
++ (ethernet_private, ETH_Q0,
++ port_private->rx_ring_size[queue],
++ MV64460_RX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ ,
++ (unsigned int) ethernet_private->
++ p_rx_desc_area_base[queue],
++ (unsigned int) ethernet_private->
++ p_rx_buffer_base[queue])) == false)
++ printf ("### Error initializing RX Ring\n");
++ }
++
++ eth_port_start (ethernet_private);
++
++ /* Set maximum receive buffer to 9700 bytes */
++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num),
++ (0x5 << 17) |
++ (MV_REG_READ
++ (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num))
++ & 0xfff1ffff));
++
++ /*
++ * Set ethernet MTU for leaky bucket mechanism to 0 - this will
++ * disable the leaky bucket mechanism .
++ */
++
++ MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (port_num), 0);
++ port_status = MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num));
++
++#if defined(CONFIG_PHY_RESET)
++ /*
++ * Reset the phy, only if its the first time through
++ * otherwise, just check the speeds & feeds
++ */
++ if (port_private->first_init == 0) {
++ port_private->first_init = 1;
++ ethernet_phy_reset (port_num);
++
++ /* Start/Restart autonegotiation */
++ phy_setup_aneg (dev->name, reg);
++ udelay (1000);
++ }
++#endif /* defined(CONFIG_PHY_RESET) */
++
++ miiphy_read (dev->name, reg, PHY_BMSR, &reg_short);
++
++ /*
++ * Wait if PHY is capable of autonegotiation and autonegotiation is not complete
++ */
++ if ((reg_short & PHY_BMSR_AUTN_ABLE)
++ && !(reg_short & PHY_BMSR_AUTN_COMP)) {
++ puts ("Waiting for PHY auto negotiation to complete");
++ i = 0;
++ while (!(reg_short & PHY_BMSR_AUTN_COMP)) {
++ /*
++ * Timeout reached ?
++ */
++ if (i > PHY_AUTONEGOTIATE_TIMEOUT) {
++ puts (" TIMEOUT !\n");
++ break;
++ }
++
++ if ((i++ % 1000) == 0) {
++ putc ('.');
++ }
++ udelay (1000); /* 1 ms */
++ miiphy_read (dev->name, reg, PHY_BMSR, &reg_short);
++
++ }
++ puts (" done\n");
++ udelay (500000); /* another 500 ms (results in faster booting) */
++ }
++
++ speed = miiphy_speed (dev->name, reg);
++ duplex = miiphy_duplex (dev->name, reg);
++
++ printf ("ENET Speed is %d Mbps - %s duplex connection\n",
++ (int) speed, (duplex == HALF) ? "HALF" : "FULL");
++
++ port_private->eth_running = MAGIC_ETH_RUNNING;
++ return 1;
++}
++
++static int mv64460_eth_free_tx_rings (struct eth_device *dev)
++{
++ unsigned int queue;
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ volatile ETH_TX_DESC *p_tx_curr_desc;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ /* Stop Tx Queues */
++ MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG (port_num),
++ 0x0000ff00);
++
++ /* Free TX rings */
++ DP (printf ("Clearing previously allocated TX queues... "));
++ for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) {
++ /* Free on TX rings */
++ for (p_tx_curr_desc =
++ ethernet_private->p_tx_desc_area_base[queue];
++ ((unsigned int) p_tx_curr_desc <= (unsigned int)
++ ethernet_private->p_tx_desc_area_base[queue] +
++ ethernet_private->tx_desc_area_size[queue]);
++ p_tx_curr_desc =
++ (ETH_TX_DESC *) ((unsigned int) p_tx_curr_desc +
++ TX_DESC_ALIGNED_SIZE)) {
++ /* this is inside for loop */
++ if (p_tx_curr_desc->return_info != 0) {
++ p_tx_curr_desc->return_info = 0;
++ DP (printf ("freed\n"));
++ }
++ }
++ DP (printf ("Done\n"));
++ }
++ return 0;
++}
++
++static int mv64460_eth_free_rx_rings (struct eth_device *dev)
++{
++ unsigned int queue;
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ volatile ETH_RX_DESC *p_rx_curr_desc;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ /* Stop RX Queues */
++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num),
++ 0x0000ff00);
++
++ /* Free RX rings */
++ DP (printf ("Clearing previously allocated RX queues... "));
++ for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) {
++ /* Free preallocated skb's on RX rings */
++ for (p_rx_curr_desc =
++ ethernet_private->p_rx_desc_area_base[queue];
++ (((unsigned int) p_rx_curr_desc <
++ ((unsigned int) ethernet_private->
++ p_rx_desc_area_base[queue] +
++ ethernet_private->rx_desc_area_size[queue])));
++ p_rx_curr_desc =
++ (ETH_RX_DESC *) ((unsigned int) p_rx_curr_desc +
++ RX_DESC_ALIGNED_SIZE)) {
++ if (p_rx_curr_desc->return_info != 0) {
++ p_rx_curr_desc->return_info = 0;
++ DP (printf ("freed\n"));
++ }
++ }
++ DP (printf ("Done\n"));
++ }
++ return 0;
++}
++
++/**********************************************************************
++ * mv64460_eth_stop
++ *
++ * This function is used when closing the network device.
++ * It updates the hardware,
++ * release all memory that holds buffers and descriptors and release the IRQ.
++ * Input : a pointer to the device structure
++ * Output : zero if success , nonzero if fails
++ *********************************************************************/
++
++int mv64460_eth_stop (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ /* Disable all gigE address decoder */
++ MV_REG_WRITE (MV64460_ETH_BASE_ADDR_ENABLE_REG, 0x3f);
++ DP (printf ("%s Ethernet stop called ... \n", __FUNCTION__));
++ mv64460_eth_real_stop (dev);
++
++ return 0;
++};
++
++/* Helper function for mv64460_eth_stop */
++
++static int mv64460_eth_real_stop (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ mv64460_eth_free_tx_rings (dev);
++ mv64460_eth_free_rx_rings (dev);
++
++ eth_port_reset (ethernet_private->port_num);
++ /* Disable ethernet port interrupts */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0);
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0);
++ /* Mask RX buffer and TX end interrupt */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num), 0);
++ /* Mask phy and link status changes interrupts */
++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num), 0);
++ MV_RESET_REG_BITS (MV64460_CPU_INTERRUPT0_MASK_HIGH,
++ BIT0 << port_num);
++ /* Print Network statistics */
++#ifndef UPDATE_STATS_BY_SOFTWARE
++ /*
++ * Print statistics (only if ethernet is running),
++ * then zero all the stats fields in memory
++ */
++ if (port_private->eth_running == MAGIC_ETH_RUNNING) {
++ port_private->eth_running = 0;
++ mv64460_eth_print_stat (dev);
++ }
++ memset (port_private->stats, 0, sizeof (struct net_device_stats));
++#endif
++ DP (printf ("\nEthernet stopped ... \n"));
++ return 0;
++}
++
++/**********************************************************************
++ * mv64460_eth_start_xmit
++ *
++ * This function is queues a packet in the Tx descriptor for
++ * required port.
++ *
++ * Input : skb - a pointer to socket buffer
++ * dev - a pointer to the required port
++ *
++ * Output : zero upon success
++ **********************************************************************/
++
++int mv64460_eth_xmit (struct eth_device *dev, volatile void *dataPtr,
++ int dataSize)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ PKT_INFO pkt_info;
++ ETH_FUNC_RET_STATUS status;
++ struct net_device_stats *stats;
++ ETH_FUNC_RET_STATUS release_result;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ stats = port_private->stats;
++
++ /* Update packet info data structure */
++ pkt_info.cmd_sts = ETH_TX_FIRST_DESC | ETH_TX_LAST_DESC; /* DMA owned, first last */
++ pkt_info.byte_cnt = dataSize;
++ pkt_info.buf_ptr = (unsigned int) dataPtr;
++ pkt_info.return_info = 0;
++
++ status = eth_port_send (ethernet_private, ETH_Q0, &pkt_info);
++ if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) {
++ printf ("Error on transmitting packet ..");
++ if (status == ETH_QUEUE_FULL)
++ printf ("ETH Queue is full. \n");
++ if (status == ETH_QUEUE_LAST_RESOURCE)
++ printf ("ETH Queue: using last available resource. \n");
++ return 1;
++ }
++
++ /* Update statistics and start of transmittion time */
++ stats->tx_bytes += dataSize;
++ stats->tx_packets++;
++
++ /* Check if packet(s) is(are) transmitted correctly (release everything) */
++ do {
++ release_result =
++ eth_tx_return_desc (ethernet_private, ETH_Q0,
++ &pkt_info);
++ switch (release_result) {
++ case ETH_OK:
++ DP (printf ("descriptor released\n"));
++ if (pkt_info.cmd_sts & BIT0) {
++ printf ("Error in TX\n");
++ stats->tx_errors++;
++ }
++ break;
++ case ETH_RETRY:
++ DP (printf ("transmission still in process\n"));
++ break;
++
++ case ETH_ERROR:
++ printf ("routine can not access Tx desc ring\n");
++ break;
++
++ case ETH_END_OF_JOB:
++ DP (printf ("the routine has nothing to release\n"));
++ break;
++ default: /* should not happen */
++ break;
++ }
++ } while (release_result == ETH_OK);
++
++ return 0; /* success */
++}
++
++/**********************************************************************
++ * mv64460_eth_receive
++ *
++ * This function is forward packets that are received from the port's
++ * queues toward kernel core or FastRoute them to another interface.
++ *
++ * Input : dev - a pointer to the required interface
++ * max - maximum number to receive (0 means unlimted)
++ *
++ * Output : number of served packets
++ **********************************************************************/
++
++int mv64460_eth_receive (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++ PKT_INFO pkt_info;
++ struct net_device_stats *stats;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private = (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++ stats = port_private->stats;
++
++ while ((eth_port_receive (ethernet_private, ETH_Q0, &pkt_info) == ETH_OK)) {
++#ifdef DEBUG_MV_ETH
++ if (pkt_info.byte_cnt != 0) {
++ printf ("%s: Received %d byte Packet @ 0x%x\n",
++ __FUNCTION__, pkt_info.byte_cnt,
++ pkt_info.buf_ptr);
++ if(pkt_info.buf_ptr != 0){
++ for(i=0; i < pkt_info.byte_cnt; i++){
++ if((i % 4) == 0){
++ printf("\n0x");
++ }
++ printf("%02x", ((char*)pkt_info.buf_ptr)[i]);
++ }
++ printf("\n");
++ }
++ }
++#endif
++ /* Update statistics. Note byte count includes 4 byte CRC count */
++ stats->rx_packets++;
++ stats->rx_bytes += pkt_info.byte_cnt;
++
++ /*
++ * In case received a packet without first / last bits on OR the error
++ * summary bit is on, the packets needs to be dropeed.
++ */
++ if (((pkt_info.
++ cmd_sts & (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) !=
++ (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC))
++ || (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)) {
++ stats->rx_dropped++;
++
++ printf ("Received packet spread on multiple descriptors\n");
++
++ /* Is this caused by an error ? */
++ if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY) {
++ stats->rx_errors++;
++ }
++
++ /* free these descriptors again without forwarding them to the higher layers */
++ pkt_info.buf_ptr &= ~0x7; /* realign buffer again */
++ pkt_info.byte_cnt = 0x0000; /* Reset Byte count */
++
++ if (eth_rx_return_buff
++ (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) {
++ printf ("Error while returning the RX Desc to Ring\n");
++ } else {
++ DP (printf ("RX Desc returned to Ring\n"));
++ }
++ /* /free these descriptors again */
++ } else {
++
++/* !!! call higher layer processing */
++#ifdef DEBUG_MV_ETH
++ printf ("\nNow send it to upper layer protocols (NetReceive) ...\n");
++#endif
++ /* let the upper layer handle the packet */
++ NetReceive ((uchar *) pkt_info.buf_ptr,
++ (int) pkt_info.byte_cnt);
++
++/* **************************************************************** */
++/* free descriptor */
++ pkt_info.buf_ptr &= ~0x7; /* realign buffer again */
++ pkt_info.byte_cnt = 0x0000; /* Reset Byte count */
++ DP (printf ("RX: pkt_info.buf_ptr = %x\n", pkt_info.buf_ptr));
++ if (eth_rx_return_buff
++ (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) {
++ printf ("Error while returning the RX Desc to Ring\n");
++ } else {
++ DP (printf ("RX: Desc returned to Ring\n"));
++ }
++
++/* **************************************************************** */
++
++ }
++ }
++ mv64460_eth_get_stats (dev); /* update statistics */
++ return 1;
++}
++
++/**********************************************************************
++ * mv64460_eth_get_stats
++ *
++ * Returns a pointer to the interface statistics.
++ *
++ * Input : dev - a pointer to the required interface
++ *
++ * Output : a pointer to the interface's statistics
++ **********************************************************************/
++
++static struct net_device_stats *mv64460_eth_get_stats (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ unsigned int port_num;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++
++ mv64460_eth_update_stat (dev);
++
++ return port_private->stats;
++}
++
++/**********************************************************************
++ * mv64460_eth_update_stat
++ *
++ * Update the statistics structure in the private data structure
++ *
++ * Input : pointer to ethernet interface network device structure
++ * Output : N/A
++ **********************************************************************/
++
++static void mv64460_eth_update_stat (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ struct net_device_stats *stats;
++ unsigned int port_num;
++ volatile unsigned int dummy;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++ stats = port_private->stats;
++
++ /* These are false updates */
++ stats->rx_packets += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_FRAMES_RECEIVED);
++ stats->tx_packets += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_FRAMES_SENT);
++ stats->rx_bytes += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_OCTETS_RECEIVED_LOW);
++ /*
++ * Ideally this should be as follows -
++ *
++ * stats->rx_bytes += stats->rx_bytes +
++ * ((unsigned long) ethReadMibCounter (ethernet_private->port_num ,
++ * ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH) << 32);
++ *
++ * But the unsigned long in PowerPC and MIPS are 32bit. So the next read
++ * is just a dummy read for proper work of the GigE port
++ */
++ dummy = eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH);
++ stats->tx_bytes += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_OCTETS_SENT_LOW);
++ dummy = eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_GOOD_OCTETS_SENT_HIGH);
++ stats->rx_errors += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_MAC_RECEIVE_ERROR);
++
++ /* Rx dropped is for received packet with CRC error */
++ stats->rx_dropped +=
++ (unsigned long) eth_read_mib_counter (ethernet_private->
++ port_num,
++ ETH_MIB_BAD_CRC_EVENT);
++ stats->multicast += (unsigned long)
++ eth_read_mib_counter (ethernet_private->port_num,
++ ETH_MIB_MULTICAST_FRAMES_RECEIVED);
++ stats->collisions +=
++ (unsigned long) eth_read_mib_counter (ethernet_private->
++ port_num,
++ ETH_MIB_COLLISION) +
++ (unsigned long) eth_read_mib_counter (ethernet_private->
++ port_num,
++ ETH_MIB_LATE_COLLISION);
++ /* detailed rx errors */
++ stats->rx_length_errors +=
++ (unsigned long) eth_read_mib_counter (ethernet_private->
++ port_num,
++ ETH_MIB_UNDERSIZE_RECEIVED)
++ +
++ (unsigned long) eth_read_mib_counter (ethernet_private->
++ port_num,
++ ETH_MIB_OVERSIZE_RECEIVED);
++ /* detailed tx errors */
++}
++
++#ifndef UPDATE_STATS_BY_SOFTWARE
++/**********************************************************************
++ * mv64460_eth_print_stat
++ *
++ * Update the statistics structure in the private data structure
++ *
++ * Input : pointer to ethernet interface network device structure
++ * Output : N/A
++ **********************************************************************/
++
++static void mv64460_eth_print_stat (struct eth_device *dev)
++{
++ ETH_PORT_INFO *ethernet_private;
++ struct mv64460_eth_priv *port_private;
++ struct net_device_stats *stats;
++ unsigned int port_num;
++
++ ethernet_private = (ETH_PORT_INFO *) dev->priv;
++ port_private =
++ (struct mv64460_eth_priv *) ethernet_private->port_private;
++ port_num = port_private->port_num;
++ stats = port_private->stats;
++
++ /* These are false updates */
++ printf ("\n### Network statistics: ###\n");
++ printf ("--------------------------\n");
++ printf (" Packets received: %ld\n", stats->rx_packets);
++ printf (" Packets send: %ld\n", stats->tx_packets);
++ printf (" Received bytes: %ld\n", stats->rx_bytes);
++ printf (" Send bytes: %ld\n", stats->tx_bytes);
++ if (stats->rx_errors != 0)
++ printf (" Rx Errors: %ld\n",
++ stats->rx_errors);
++ if (stats->rx_dropped != 0)
++ printf (" Rx dropped (CRC Errors): %ld\n",
++ stats->rx_dropped);
++ if (stats->multicast != 0)
++ printf (" Rx mulicast frames: %ld\n",
++ stats->multicast);
++ if (stats->collisions != 0)
++ printf (" No. of collisions: %ld\n",
++ stats->collisions);
++ if (stats->rx_length_errors != 0)
++ printf (" Rx length errors: %ld\n",
++ stats->rx_length_errors);
++}
++#endif
++
++/**************************************************************************
++ *network_start - Network Kick Off Routine UBoot
++ *Inputs :
++ *Outputs :
++ **************************************************************************/
++
++bool db64460_eth_start (struct eth_device *dev)
++{
++ return (mv64460_eth_open (dev)); /* calls real open */
++}
++
++/*************************************************************************
++**************************************************************************
++**************************************************************************
++* The second part is the low level driver of the gigE ethernet ports. *
++**************************************************************************
++**************************************************************************
++*************************************************************************/
++/*
++ * based on Linux code
++ * arch/ppc/galileo/EVB64460/mv64460_eth.c - Driver for MV64460X ethernet ports
++ * Copyright (C) 2002 rabeeh@galileo.co.il
++
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ */
++
++/********************************************************************************
++ * Marvell's Gigabit Ethernet controller low level driver
++ *
++ * DESCRIPTION:
++ * This file introduce low level API to Marvell's Gigabit Ethernet
++ * controller. This Gigabit Ethernet Controller driver API controls
++ * 1) Operations (i.e. port init, start, reset etc').
++ * 2) Data flow (i.e. port send, receive etc').
++ * Each Gigabit Ethernet port is controlled via ETH_PORT_INFO
++ * struct.
++ * This struct includes user configuration information as well as
++ * driver internal data needed for its operations.
++ *
++ * Supported Features:
++ * - This low level driver is OS independent. Allocating memory for
++ * the descriptor rings and buffers are not within the scope of
++ * this driver.
++ * - The user is free from Rx/Tx queue managing.
++ * - This low level driver introduce functionality API that enable
++ * the to operate Marvell's Gigabit Ethernet Controller in a
++ * convenient way.
++ * - Simple Gigabit Ethernet port operation API.
++ * - Simple Gigabit Ethernet port data flow API.
++ * - Data flow and operation API support per queue functionality.
++ * - Support cached descriptors for better performance.
++ * - Enable access to all four DRAM banks and internal SRAM memory
++ * spaces.
++ * - PHY access and control API.
++ * - Port control register configuration API.
++ * - Full control over Unicast and Multicast MAC configurations.
++ *
++ * Operation flow:
++ *
++ * Initialization phase
++ * This phase complete the initialization of the ETH_PORT_INFO
++ * struct.
++ * User information regarding port configuration has to be set
++ * prior to calling the port initialization routine. For example,
++ * the user has to assign the port_phy_addr field which is board
++ * depended parameter.
++ * In this phase any port Tx/Rx activity is halted, MIB counters
++ * are cleared, PHY address is set according to user parameter and
++ * access to DRAM and internal SRAM memory spaces.
++ *
++ * Driver ring initialization
++ * Allocating memory for the descriptor rings and buffers is not
++ * within the scope of this driver. Thus, the user is required to
++ * allocate memory for the descriptors ring and buffers. Those
++ * memory parameters are used by the Rx and Tx ring initialization
++ * routines in order to curve the descriptor linked list in a form
++ * of a ring.
++ * Note: Pay special attention to alignment issues when using
++ * cached descriptors/buffers. In this phase the driver store
++ * information in the ETH_PORT_INFO struct regarding each queue
++ * ring.
++ *
++ * Driver start
++ * This phase prepares the Ethernet port for Rx and Tx activity.
++ * It uses the information stored in the ETH_PORT_INFO struct to
++ * initialize the various port registers.
++ *
++ * Data flow:
++ * All packet references to/from the driver are done using PKT_INFO
++ * struct.
++ * This struct is a unified struct used with Rx and Tx operations.
++ * This way the user is not required to be familiar with neither
++ * Tx nor Rx descriptors structures.
++ * The driver's descriptors rings are management by indexes.
++ * Those indexes controls the ring resources and used to indicate
++ * a SW resource error:
++ * 'current'
++ * This index points to the current available resource for use. For
++ * example in Rx process this index will point to the descriptor
++ * that will be passed to the user upon calling the receive routine.
++ * In Tx process, this index will point to the descriptor
++ * that will be assigned with the user packet info and transmitted.
++ * 'used'
++ * This index points to the descriptor that need to restore its
++ * resources. For example in Rx process, using the Rx buffer return
++ * API will attach the buffer returned in packet info to the
++ * descriptor pointed by 'used'. In Tx process, using the Tx
++ * descriptor return will merely return the user packet info with
++ * the command status of the transmitted buffer pointed by the
++ * 'used' index. Nevertheless, it is essential to use this routine
++ * to update the 'used' index.
++ * 'first'
++ * This index supports Tx Scatter-Gather. It points to the first
++ * descriptor of a packet assembled of multiple buffers. For example
++ * when in middle of Such packet we have a Tx resource error the
++ * 'curr' index get the value of 'first' to indicate that the ring
++ * returned to its state before trying to transmit this packet.
++ *
++ * Receive operation:
++ * The eth_port_receive API set the packet information struct,
++ * passed by the caller, with received information from the
++ * 'current' SDMA descriptor.
++ * It is the user responsibility to return this resource back
++ * to the Rx descriptor ring to enable the reuse of this source.
++ * Return Rx resource is done using the eth_rx_return_buff API.
++ *
++ * Transmit operation:
++ * The eth_port_send API supports Scatter-Gather which enables to
++ * send a packet spanned over multiple buffers. This means that
++ * for each packet info structure given by the user and put into
++ * the Tx descriptors ring, will be transmitted only if the 'LAST'
++ * bit will be set in the packet info command status field. This
++ * API also consider restriction regarding buffer alignments and
++ * sizes.
++ * The user must return a Tx resource after ensuring the buffer
++ * has been transmitted to enable the Tx ring indexes to update.
++ *
++ * BOARD LAYOUT
++ * This device is on-board. No jumper diagram is necessary.
++ *
++ * EXTERNAL INTERFACE
++ *
++ * Prior to calling the initialization routine eth_port_init() the user
++ * must set the following fields under ETH_PORT_INFO struct:
++ * port_num User Ethernet port number.
++ * port_phy_addr User PHY address of Ethernet port.
++ * port_mac_addr[6] User defined port MAC address.
++ * port_config User port configuration value.
++ * port_config_extend User port config extend value.
++ * port_sdma_config User port SDMA config value.
++ * port_serial_control User port serial control value.
++ * *port_virt_to_phys () User function to cast virtual addr to CPU bus addr.
++ * *port_private User scratch pad for user specific data structures.
++ *
++ * This driver introduce a set of default values:
++ * PORT_CONFIG_VALUE Default port configuration value
++ * PORT_CONFIG_EXTEND_VALUE Default port extend configuration value
++ * PORT_SDMA_CONFIG_VALUE Default sdma control value
++ * PORT_SERIAL_CONTROL_VALUE Default port serial control value
++ *
++ * This driver data flow is done using the PKT_INFO struct which is
++ * a unified struct for Rx and Tx operations:
++ * byte_cnt Tx/Rx descriptor buffer byte count.
++ * l4i_chk CPU provided TCP Checksum. For Tx operation only.
++ * cmd_sts Tx/Rx descriptor command status.
++ * buf_ptr Tx/Rx descriptor buffer pointer.
++ * return_info Tx/Rx user resource return information.
++ *
++ *
++ * EXTERNAL SUPPORT REQUIREMENTS
++ *
++ * This driver requires the following external support:
++ *
++ * D_CACHE_FLUSH_LINE (address, address offset)
++ *
++ * This macro applies assembly code to flush and invalidate cache
++ * line.
++ * address - address base.
++ * address offset - address offset
++ *
++ *
++ * CPU_PIPE_FLUSH
++ *
++ * This macro applies assembly code to flush the CPU pipeline.
++ *
++ *******************************************************************************/
++/* includes */
++
++/* defines */
++/* SDMA command macros */
++#define ETH_ENABLE_TX_QUEUE(tx_queue, eth_port) \
++ MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), (1 << tx_queue))
++
++#define ETH_DISABLE_TX_QUEUE(tx_queue, eth_port) \
++ MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port),\
++ (1 << (8 + tx_queue)))
++
++#define ETH_ENABLE_RX_QUEUE(rx_queue, eth_port) \
++MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << rx_queue))
++
++#define ETH_DISABLE_RX_QUEUE(rx_queue, eth_port) \
++MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << (8 + rx_queue)))
++
++#define CURR_RFD_GET(p_curr_desc, queue) \
++ ((p_curr_desc) = p_eth_port_ctrl->p_rx_curr_desc_q[queue])
++
++#define CURR_RFD_SET(p_curr_desc, queue) \
++ (p_eth_port_ctrl->p_rx_curr_desc_q[queue] = (p_curr_desc))
++
++#define USED_RFD_GET(p_used_desc, queue) \
++ ((p_used_desc) = p_eth_port_ctrl->p_rx_used_desc_q[queue])
++
++#define USED_RFD_SET(p_used_desc, queue)\
++(p_eth_port_ctrl->p_rx_used_desc_q[queue] = (p_used_desc))
++
++
++#define CURR_TFD_GET(p_curr_desc, queue) \
++ ((p_curr_desc) = p_eth_port_ctrl->p_tx_curr_desc_q[queue])
++
++#define CURR_TFD_SET(p_curr_desc, queue) \
++ (p_eth_port_ctrl->p_tx_curr_desc_q[queue] = (p_curr_desc))
++
++#define USED_TFD_GET(p_used_desc, queue) \
++ ((p_used_desc) = p_eth_port_ctrl->p_tx_used_desc_q[queue])
++
++#define USED_TFD_SET(p_used_desc, queue) \
++ (p_eth_port_ctrl->p_tx_used_desc_q[queue] = (p_used_desc))
++
++#define FIRST_TFD_GET(p_first_desc, queue) \
++ ((p_first_desc) = p_eth_port_ctrl->p_tx_first_desc_q[queue])
++
++#define FIRST_TFD_SET(p_first_desc, queue) \
++ (p_eth_port_ctrl->p_tx_first_desc_q[queue] = (p_first_desc))
++
++
++/* Macros that save access to desc in order to find next desc pointer */
++#define RX_NEXT_DESC_PTR(p_rx_desc, queue) (ETH_RX_DESC*)(((((unsigned int)p_rx_desc - (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue]) + RX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->rx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue])
++
++#define TX_NEXT_DESC_PTR(p_tx_desc, queue) (ETH_TX_DESC*)(((((unsigned int)p_tx_desc - (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue]) + TX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->tx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue])
++
++#define LINK_UP_TIMEOUT 100000
++#define PHY_BUSY_TIMEOUT 10000000
++
++/* locals */
++
++/* PHY routines */
++static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr);
++static int ethernet_phy_get (ETH_PORT eth_port_num);
++
++/* Ethernet Port routines */
++static void eth_set_access_control (ETH_PORT eth_port_num,
++ ETH_WIN_PARAM * param);
++static bool eth_port_uc_addr (ETH_PORT eth_port_num, unsigned char uc_nibble,
++ ETH_QUEUE queue, int option);
++#if 0 /* FIXME */
++static bool eth_port_smc_addr (ETH_PORT eth_port_num,
++ unsigned char mc_byte,
++ ETH_QUEUE queue, int option);
++static bool eth_port_omc_addr (ETH_PORT eth_port_num,
++ unsigned char crc8,
++ ETH_QUEUE queue, int option);
++#endif
++
++static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr,
++ int byte_count);
++
++void eth_dbg (ETH_PORT_INFO * p_eth_port_ctrl);
++
++
++typedef enum _memory_bank { BANK0, BANK1, BANK2, BANK3 } MEMORY_BANK;
++u32 mv_get_dram_bank_base_addr (MEMORY_BANK bank)
++{
++ u32 result = 0;
++ u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE);
++
++ if (enable & (1 << bank))
++ return 0;
++ if (bank == BANK0)
++ result = MV_REG_READ (MV64460_CS_0_BASE_ADDR);
++ if (bank == BANK1)
++ result = MV_REG_READ (MV64460_CS_1_BASE_ADDR);
++ if (bank == BANK2)
++ result = MV_REG_READ (MV64460_CS_2_BASE_ADDR);
++ if (bank == BANK3)
++ result = MV_REG_READ (MV64460_CS_3_BASE_ADDR);
++ result &= 0x0000ffff;
++ result = result << 16;
++ return result;
++}
++
++u32 mv_get_dram_bank_size (MEMORY_BANK bank)
++{
++ u32 result = 0;
++ u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE);
++
++ if (enable & (1 << bank))
++ return 0;
++ if (bank == BANK0)
++ result = MV_REG_READ (MV64460_CS_0_SIZE);
++ if (bank == BANK1)
++ result = MV_REG_READ (MV64460_CS_1_SIZE);
++ if (bank == BANK2)
++ result = MV_REG_READ (MV64460_CS_2_SIZE);
++ if (bank == BANK3)
++ result = MV_REG_READ (MV64460_CS_3_SIZE);
++ result += 1;
++ result &= 0x0000ffff;
++ result = result << 16;
++ return result;
++}
++
++u32 mv_get_internal_sram_base (void)
++{
++ u32 result;
++
++ result = MV_REG_READ (MV64460_INTEGRATED_SRAM_BASE_ADDR);
++ result &= 0x0000ffff;
++ result = result << 16;
++ return result;
++}
++
++/*******************************************************************************
++* eth_port_init - Initialize the Ethernet port driver
++*
++* DESCRIPTION:
++* This function prepares the ethernet port to start its activity:
++* 1) Completes the ethernet port driver struct initialization toward port
++* start routine.
++* 2) Resets the device to a quiescent state in case of warm reboot.
++* 3) Enable SDMA access to all four DRAM banks as well as internal SRAM.
++* 4) Clean MAC tables. The reset status of those tables is unknown.
++* 5) Set PHY address.
++* Note: Call this routine prior to eth_port_start routine and after setting
++* user values in the user fields of Ethernet port control struct (i.e.
++* port_phy_addr).
++*
++* INPUT:
++* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct
++*
++* OUTPUT:
++* See description.
++*
++* RETURN:
++* None.
++*
++*******************************************************************************/
++static void eth_port_init (ETH_PORT_INFO * p_eth_port_ctrl)
++{
++ int queue;
++ ETH_WIN_PARAM win_param;
++
++ p_eth_port_ctrl->port_config = PORT_CONFIG_VALUE;
++ p_eth_port_ctrl->port_config_extend = PORT_CONFIG_EXTEND_VALUE;
++ p_eth_port_ctrl->port_sdma_config = PORT_SDMA_CONFIG_VALUE;
++ p_eth_port_ctrl->port_serial_control = PORT_SERIAL_CONTROL_VALUE;
++
++ p_eth_port_ctrl->port_rx_queue_command = 0;
++ p_eth_port_ctrl->port_tx_queue_command = 0;
++
++ /* Zero out SW structs */
++ for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) {
++ CURR_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue);
++ USED_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue);
++ p_eth_port_ctrl->rx_resource_err[queue] = false;
++ }
++
++ for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) {
++ CURR_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
++ USED_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
++ FIRST_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue);
++ p_eth_port_ctrl->tx_resource_err[queue] = false;
++ }
++
++ eth_port_reset (p_eth_port_ctrl->port_num);
++
++ /* Set access parameters for DRAM bank 0 */
++ win_param.win = ETH_WIN0; /* Use Ethernet window 0 */
++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */
++ win_param.attributes = EBAR_ATTR_DRAM_CS0; /* Enable DRAM bank */
++#ifndef CONFIG_NOT_COHERENT_CACHE
++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
++#endif
++ win_param.high_addr = 0;
++ /* Get bank base */
++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK0);
++ win_param.size = mv_get_dram_bank_size (BANK0); /* Get bank size */
++ if (win_param.size == 0)
++ win_param.enable = 0;
++ else
++ win_param.enable = 1; /* Enable the access */
++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */
++
++ /* Set the access control for address window (EPAPR) READ & WRITE */
++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
++
++ /* Set access parameters for DRAM bank 1 */
++ win_param.win = ETH_WIN1; /* Use Ethernet window 1 */
++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */
++ win_param.attributes = EBAR_ATTR_DRAM_CS1; /* Enable DRAM bank */
++#ifndef CONFIG_NOT_COHERENT_CACHE
++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
++#endif
++ win_param.high_addr = 0;
++ /* Get bank base */
++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK1);
++ win_param.size = mv_get_dram_bank_size (BANK1); /* Get bank size */
++ if (win_param.size == 0)
++ win_param.enable = 0;
++ else
++ win_param.enable = 1; /* Enable the access */
++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */
++
++ /* Set the access control for address window (EPAPR) READ & WRITE */
++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
++
++ /* Set access parameters for DRAM bank 2 */
++ win_param.win = ETH_WIN2; /* Use Ethernet window 2 */
++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */
++ win_param.attributes = EBAR_ATTR_DRAM_CS2; /* Enable DRAM bank */
++#ifndef CONFIG_NOT_COHERENT_CACHE
++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
++#endif
++ win_param.high_addr = 0;
++ /* Get bank base */
++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK2);
++ win_param.size = mv_get_dram_bank_size (BANK2); /* Get bank size */
++ if (win_param.size == 0)
++ win_param.enable = 0;
++ else
++ win_param.enable = 1; /* Enable the access */
++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */
++
++ /* Set the access control for address window (EPAPR) READ & WRITE */
++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
++
++ /* Set access parameters for DRAM bank 3 */
++ win_param.win = ETH_WIN3; /* Use Ethernet window 3 */
++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */
++ win_param.attributes = EBAR_ATTR_DRAM_CS3; /* Enable DRAM bank */
++#ifndef CONFIG_NOT_COHERENT_CACHE
++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB;
++#endif
++ win_param.high_addr = 0;
++ /* Get bank base */
++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK3);
++ win_param.size = mv_get_dram_bank_size (BANK3); /* Get bank size */
++ if (win_param.size == 0)
++ win_param.enable = 0;
++ else
++ win_param.enable = 1; /* Enable the access */
++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */
++
++ /* Set the access control for address window (EPAPR) READ & WRITE */
++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
++
++ /* Set access parameters for Internal SRAM */
++ win_param.win = ETH_WIN4; /* Use Ethernet window 0 */
++ win_param.target = EBAR_TARGET_CBS; /* Target - Internal SRAM */
++ win_param.attributes = EBAR_ATTR_CBS_SRAM | EBAR_ATTR_CBS_SRAM_BLOCK0;
++ win_param.high_addr = 0;
++ win_param.base_addr = mv_get_internal_sram_base (); /* Get base addr */
++ win_param.size = MV64460_INTERNAL_SRAM_SIZE; /* Get bank size */
++ win_param.enable = 1; /* Enable the access */
++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */
++
++ /* Set the access control for address window (EPAPR) READ & WRITE */
++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param);
++
++ eth_port_init_mac_tables (p_eth_port_ctrl->port_num);
++
++ ethernet_phy_set (p_eth_port_ctrl->port_num,
++ p_eth_port_ctrl->port_phy_addr);
++
++ return;
++
++}
++
++/*******************************************************************************
++* eth_port_start - Start the Ethernet port activity.
++*
++* DESCRIPTION:
++* This routine prepares the Ethernet port for Rx and Tx activity:
++* 1. Initialize Tx and Rx Current Descriptor Pointer for each queue that
++* has been initialized a descriptor's ring (using ether_init_tx_desc_ring
++* for Tx and ether_init_rx_desc_ring for Rx)
++* 2. Initialize and enable the Ethernet configuration port by writing to
++* the port's configuration and command registers.
++* 3. Initialize and enable the SDMA by writing to the SDMA's
++* configuration and command registers.
++* After completing these steps, the ethernet port SDMA can starts to
++* perform Rx and Tx activities.
++*
++* Note: Each Rx and Tx queue descriptor's list must be initialized prior
++* to calling this function (use ether_init_tx_desc_ring for Tx queues and
++* ether_init_rx_desc_ring for Rx queues).
++*
++* INPUT:
++* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct
++*
++* OUTPUT:
++* Ethernet port is ready to receive and transmit.
++*
++* RETURN:
++* false if the port PHY is not up.
++* true otherwise.
++*
++*******************************************************************************/
++static bool eth_port_start (ETH_PORT_INFO * p_eth_port_ctrl)
++{
++ int queue;
++ volatile ETH_TX_DESC *p_tx_curr_desc;
++ volatile ETH_RX_DESC *p_rx_curr_desc;
++ unsigned int phy_reg_data;
++ ETH_PORT eth_port_num = p_eth_port_ctrl->port_num;
++
++ /* Assignment of Tx CTRP of given queue */
++ for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) {
++ CURR_TFD_GET (p_tx_curr_desc, queue);
++ MV_REG_WRITE ((MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_0
++ (eth_port_num)
++ + (4 * queue)),
++ ((unsigned int) p_tx_curr_desc));
++
++ }
++
++ /* Assignment of Rx CRDP of given queue */
++ for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) {
++ CURR_RFD_GET (p_rx_curr_desc, queue);
++ MV_REG_WRITE ((MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_0
++ (eth_port_num)
++ + (4 * queue)),
++ ((unsigned int) p_rx_curr_desc));
++
++ if (p_rx_curr_desc != NULL)
++ /* Add the assigned Ethernet address to the port's address table */
++ eth_port_uc_addr_set (p_eth_port_ctrl->port_num,
++ p_eth_port_ctrl->port_mac_addr,
++ queue);
++ }
++
++ /* Assign port configuration and command. */
++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num),
++ p_eth_port_ctrl->port_config);
++
++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num),
++ p_eth_port_ctrl->port_config_extend);
++
++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
++ p_eth_port_ctrl->port_serial_control);
++
++ MV_SET_REG_BITS (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
++ ETH_SERIAL_PORT_ENABLE);
++
++ /* Assign port SDMA configuration */
++ MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num),
++ p_eth_port_ctrl->port_sdma_config);
++
++ MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_COUNT
++ (eth_port_num), 0x3fffffff);
++ MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_CONFIG
++ (eth_port_num), 0x03fffcff);
++ /* Turn off the port/queue bandwidth limitation */
++ MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (eth_port_num), 0x0);
++
++ /* Enable port Rx. */
++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (eth_port_num),
++ p_eth_port_ctrl->port_rx_queue_command);
++
++ /* Check if link is up */
++ eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data);
++
++ if (!(phy_reg_data & 0x20))
++ return false;
++
++ return true;
++}
++
++/*******************************************************************************
++* eth_port_uc_addr_set - This function Set the port Unicast address.
++*
++* DESCRIPTION:
++* This function Set the port Ethernet MAC address.
++*
++* INPUT:
++* ETH_PORT eth_port_num Port number.
++* char * p_addr Address to be set
++* ETH_QUEUE queue Rx queue number for this MAC address.
++*
++* OUTPUT:
++* Set MAC address low and high registers. also calls eth_port_uc_addr()
++* To set the unicast table with the proper information.
++*
++* RETURN:
++* N/A.
++*
++*******************************************************************************/
++static void eth_port_uc_addr_set (ETH_PORT eth_port_num,
++ unsigned char *p_addr, ETH_QUEUE queue)
++{
++ unsigned int mac_h;
++ unsigned int mac_l;
++
++ mac_l = (p_addr[4] << 8) | (p_addr[5]);
++ mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) |
++ (p_addr[2] << 8) | (p_addr[3] << 0);
++
++ MV_REG_WRITE (MV64460_ETH_MAC_ADDR_LOW (eth_port_num), mac_l);
++ MV_REG_WRITE (MV64460_ETH_MAC_ADDR_HIGH (eth_port_num), mac_h);
++
++ /* Accept frames of this address */
++ eth_port_uc_addr (eth_port_num, p_addr[5], queue, ACCEPT_MAC_ADDR);
++
++ return;
++}
++
++/*******************************************************************************
++* eth_port_uc_addr - This function Set the port unicast address table
++*
++* DESCRIPTION:
++* This function locates the proper entry in the Unicast table for the
++* specified MAC nibble and sets its properties according to function
++* parameters.
++*
++* INPUT:
++* ETH_PORT eth_port_num Port number.
++* unsigned char uc_nibble Unicast MAC Address last nibble.
++* ETH_QUEUE queue Rx queue number for this MAC address.
++* int option 0 = Add, 1 = remove address.
++*
++* OUTPUT:
++* This function add/removes MAC addresses from the port unicast address
++* table.
++*
++* RETURN:
++* true is output succeeded.
++* false if option parameter is invalid.
++*
++*******************************************************************************/
++static bool eth_port_uc_addr (ETH_PORT eth_port_num,
++ unsigned char uc_nibble,
++ ETH_QUEUE queue, int option)
++{
++ unsigned int unicast_reg;
++ unsigned int tbl_offset;
++ unsigned int reg_offset;
++
++ /* Locate the Unicast table entry */
++ uc_nibble = (0xf & uc_nibble);
++ tbl_offset = (uc_nibble / 4) * 4; /* Register offset from unicast table base */
++ reg_offset = uc_nibble % 4; /* Entry offset within the above register */
++
++ switch (option) {
++ case REJECT_MAC_ADDR:
++ /* Clear accepts frame bit at specified unicast DA table entry */
++ unicast_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
++ (eth_port_num)
++ + tbl_offset));
++
++ unicast_reg &= (0x0E << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
++ (eth_port_num)
++ + tbl_offset), unicast_reg);
++ break;
++
++ case ACCEPT_MAC_ADDR:
++ /* Set accepts frame bit at unicast DA filter table entry */
++ unicast_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
++ (eth_port_num)
++ + tbl_offset));
++
++ unicast_reg |= ((0x01 | queue) << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
++ (eth_port_num)
++ + tbl_offset), unicast_reg);
++
++ break;
++
++ default:
++ return false;
++ }
++ return true;
++}
++
++#if 0 /* FIXME */
++/*******************************************************************************
++* eth_port_mc_addr - Multicast address settings.
++*
++* DESCRIPTION:
++* This API controls the MV device MAC multicast support.
++* The MV device supports multicast using two tables:
++* 1) Special Multicast Table for MAC addresses of the form
++* 0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF).
++* The MAC DA[7:0] bits are used as a pointer to the Special Multicast
++* Table entries in the DA-Filter table.
++* In this case, the function calls eth_port_smc_addr() routine to set the
++* Special Multicast Table.
++* 2) Other Multicast Table for multicast of another type. A CRC-8bit
++* is used as an index to the Other Multicast Table entries in the
++* DA-Filter table.
++* In this case, the function calculates the CRC-8bit value and calls
++* eth_port_omc_addr() routine to set the Other Multicast Table.
++* INPUT:
++* ETH_PORT eth_port_num Port number.
++* unsigned char *p_addr Unicast MAC Address.
++* ETH_QUEUE queue Rx queue number for this MAC address.
++* int option 0 = Add, 1 = remove address.
++*
++* OUTPUT:
++* See description.
++*
++* RETURN:
++* true is output succeeded.
++* false if add_address_table_entry( ) failed.
++*
++*******************************************************************************/
++static void eth_port_mc_addr (ETH_PORT eth_port_num,
++ unsigned char *p_addr,
++ ETH_QUEUE queue, int option)
++{
++ unsigned int mac_h;
++ unsigned int mac_l;
++ unsigned char crc_result = 0;
++ int mac_array[48];
++ int crc[8];
++ int i;
++
++ if ((p_addr[0] == 0x01) &&
++ (p_addr[1] == 0x00) &&
++ (p_addr[2] == 0x5E) && (p_addr[3] == 0x00) && (p_addr[4] == 0x00)) {
++
++ eth_port_smc_addr (eth_port_num, p_addr[5], queue, option);
++ } else {
++ /* Calculate CRC-8 out of the given address */
++ mac_h = (p_addr[0] << 8) | (p_addr[1]);
++ mac_l = (p_addr[2] << 24) | (p_addr[3] << 16) |
++ (p_addr[4] << 8) | (p_addr[5] << 0);
++
++ for (i = 0; i < 32; i++)
++ mac_array[i] = (mac_l >> i) & 0x1;
++ for (i = 32; i < 48; i++)
++ mac_array[i] = (mac_h >> (i - 32)) & 0x1;
++
++ crc[0] = mac_array[45] ^ mac_array[43] ^ mac_array[40] ^
++ mac_array[39] ^ mac_array[35] ^ mac_array[34] ^
++ mac_array[31] ^ mac_array[30] ^ mac_array[28] ^
++ mac_array[23] ^ mac_array[21] ^ mac_array[19] ^
++ mac_array[18] ^ mac_array[16] ^ mac_array[14] ^
++ mac_array[12] ^ mac_array[8] ^ mac_array[7] ^
++ mac_array[6] ^ mac_array[0];
++
++ crc[1] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^
++ mac_array[43] ^ mac_array[41] ^ mac_array[39] ^
++ mac_array[36] ^ mac_array[34] ^ mac_array[32] ^
++ mac_array[30] ^ mac_array[29] ^ mac_array[28] ^
++ mac_array[24] ^ mac_array[23] ^ mac_array[22] ^
++ mac_array[21] ^ mac_array[20] ^ mac_array[18] ^
++ mac_array[17] ^ mac_array[16] ^ mac_array[15] ^
++ mac_array[14] ^ mac_array[13] ^ mac_array[12] ^
++ mac_array[9] ^ mac_array[6] ^ mac_array[1] ^
++ mac_array[0];
++
++ crc[2] = mac_array[47] ^ mac_array[46] ^ mac_array[44] ^
++ mac_array[43] ^ mac_array[42] ^ mac_array[39] ^
++ mac_array[37] ^ mac_array[34] ^ mac_array[33] ^
++ mac_array[29] ^ mac_array[28] ^ mac_array[25] ^
++ mac_array[24] ^ mac_array[22] ^ mac_array[17] ^
++ mac_array[15] ^ mac_array[13] ^ mac_array[12] ^
++ mac_array[10] ^ mac_array[8] ^ mac_array[6] ^
++ mac_array[2] ^ mac_array[1] ^ mac_array[0];
++
++ crc[3] = mac_array[47] ^ mac_array[45] ^ mac_array[44] ^
++ mac_array[43] ^ mac_array[40] ^ mac_array[38] ^
++ mac_array[35] ^ mac_array[34] ^ mac_array[30] ^
++ mac_array[29] ^ mac_array[26] ^ mac_array[25] ^
++ mac_array[23] ^ mac_array[18] ^ mac_array[16] ^
++ mac_array[14] ^ mac_array[13] ^ mac_array[11] ^
++ mac_array[9] ^ mac_array[7] ^ mac_array[3] ^
++ mac_array[2] ^ mac_array[1];
++
++ crc[4] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^
++ mac_array[41] ^ mac_array[39] ^ mac_array[36] ^
++ mac_array[35] ^ mac_array[31] ^ mac_array[30] ^
++ mac_array[27] ^ mac_array[26] ^ mac_array[24] ^
++ mac_array[19] ^ mac_array[17] ^ mac_array[15] ^
++ mac_array[14] ^ mac_array[12] ^ mac_array[10] ^
++ mac_array[8] ^ mac_array[4] ^ mac_array[3] ^
++ mac_array[2];
++
++ crc[5] = mac_array[47] ^ mac_array[46] ^ mac_array[45] ^
++ mac_array[42] ^ mac_array[40] ^ mac_array[37] ^
++ mac_array[36] ^ mac_array[32] ^ mac_array[31] ^
++ mac_array[28] ^ mac_array[27] ^ mac_array[25] ^
++ mac_array[20] ^ mac_array[18] ^ mac_array[16] ^
++ mac_array[15] ^ mac_array[13] ^ mac_array[11] ^
++ mac_array[9] ^ mac_array[5] ^ mac_array[4] ^
++ mac_array[3];
++
++ crc[6] = mac_array[47] ^ mac_array[46] ^ mac_array[43] ^
++ mac_array[41] ^ mac_array[38] ^ mac_array[37] ^
++ mac_array[33] ^ mac_array[32] ^ mac_array[29] ^
++ mac_array[28] ^ mac_array[26] ^ mac_array[21] ^
++ mac_array[19] ^ mac_array[17] ^ mac_array[16] ^
++ mac_array[14] ^ mac_array[12] ^ mac_array[10] ^
++ mac_array[6] ^ mac_array[5] ^ mac_array[4];
++
++ crc[7] = mac_array[47] ^ mac_array[44] ^ mac_array[42] ^
++ mac_array[39] ^ mac_array[38] ^ mac_array[34] ^
++ mac_array[33] ^ mac_array[30] ^ mac_array[29] ^
++ mac_array[27] ^ mac_array[22] ^ mac_array[20] ^
++ mac_array[18] ^ mac_array[17] ^ mac_array[15] ^
++ mac_array[13] ^ mac_array[11] ^ mac_array[7] ^
++ mac_array[6] ^ mac_array[5];
++
++ for (i = 0; i < 8; i++)
++ crc_result = crc_result | (crc[i] << i);
++
++ eth_port_omc_addr (eth_port_num, crc_result, queue, option);
++ }
++ return;
++}
++
++/*******************************************************************************
++* eth_port_smc_addr - Special Multicast address settings.
++*
++* DESCRIPTION:
++* This routine controls the MV device special MAC multicast support.
++* The Special Multicast Table for MAC addresses supports MAC of the form
++* 0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF).
++* The MAC DA[7:0] bits are used as a pointer to the Special Multicast
++* Table entries in the DA-Filter table.
++* This function set the Special Multicast Table appropriate entry
++* according to the argument given.
++*
++* INPUT:
++* ETH_PORT eth_port_num Port number.
++* unsigned char mc_byte Multicast addr last byte (MAC DA[7:0] bits).
++* ETH_QUEUE queue Rx queue number for this MAC address.
++* int option 0 = Add, 1 = remove address.
++*
++* OUTPUT:
++* See description.
++*
++* RETURN:
++* true is output succeeded.
++* false if option parameter is invalid.
++*
++*******************************************************************************/
++static bool eth_port_smc_addr (ETH_PORT eth_port_num,
++ unsigned char mc_byte,
++ ETH_QUEUE queue, int option)
++{
++ unsigned int smc_table_reg;
++ unsigned int tbl_offset;
++ unsigned int reg_offset;
++
++ /* Locate the SMC table entry */
++ tbl_offset = (mc_byte / 4) * 4; /* Register offset from SMC table base */
++ reg_offset = mc_byte % 4; /* Entry offset within the above register */
++ queue &= 0x7;
++
++ switch (option) {
++ case REJECT_MAC_ADDR:
++ /* Clear accepts frame bit at specified Special DA table entry */
++ smc_table_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
++ smc_table_reg &= (0x0E << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg);
++ break;
++
++ case ACCEPT_MAC_ADDR:
++ /* Set accepts frame bit at specified Special DA table entry */
++ smc_table_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
++ smc_table_reg |= ((0x01 | queue) << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg);
++ break;
++
++ default:
++ return false;
++ }
++ return true;
++}
++
++/*******************************************************************************
++* eth_port_omc_addr - Multicast address settings.
++*
++* DESCRIPTION:
++* This routine controls the MV device Other MAC multicast support.
++* The Other Multicast Table is used for multicast of another type.
++* A CRC-8bit is used as an index to the Other Multicast Table entries
++* in the DA-Filter table.
++* The function gets the CRC-8bit value from the calling routine and
++* set the Other Multicast Table appropriate entry according to the
++* CRC-8 argument given.
++*
++* INPUT:
++* ETH_PORT eth_port_num Port number.
++* unsigned char crc8 A CRC-8bit (Polynomial: x^8+x^2+x^1+1).
++* ETH_QUEUE queue Rx queue number for this MAC address.
++* int option 0 = Add, 1 = remove address.
++*
++* OUTPUT:
++* See description.
++*
++* RETURN:
++* true is output succeeded.
++* false if option parameter is invalid.
++*
++*******************************************************************************/
++static bool eth_port_omc_addr (ETH_PORT eth_port_num,
++ unsigned char crc8,
++ ETH_QUEUE queue, int option)
++{
++ unsigned int omc_table_reg;
++ unsigned int tbl_offset;
++ unsigned int reg_offset;
++
++ /* Locate the OMC table entry */
++ tbl_offset = (crc8 / 4) * 4; /* Register offset from OMC table base */
++ reg_offset = crc8 % 4; /* Entry offset within the above register */
++ queue &= 0x7;
++
++ switch (option) {
++ case REJECT_MAC_ADDR:
++ /* Clear accepts frame bit at specified Other DA table entry */
++ omc_table_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
++ omc_table_reg &= (0x0E << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg);
++ break;
++
++ case ACCEPT_MAC_ADDR:
++ /* Set accepts frame bit at specified Other DA table entry */
++ omc_table_reg =
++ MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset));
++ omc_table_reg |= ((0x01 | queue) << (8 * reg_offset));
++
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg);
++ break;
++
++ default:
++ return false;
++ }
++ return true;
++}
++#endif
++
++/*******************************************************************************
++* eth_port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables
++*
++* DESCRIPTION:
++* Go through all the DA filter tables (Unicast, Special Multicast & Other
++* Multicast) and set each entry to 0.
++*
++* INPUT:
++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++*
++* OUTPUT:
++* Multicast and Unicast packets are rejected.
++*
++* RETURN:
++* None.
++*
++*******************************************************************************/
++static void eth_port_init_mac_tables (ETH_PORT eth_port_num)
++{
++ int table_index;
++
++ /* Clear DA filter unicast table (Ex_dFUT) */
++ for (table_index = 0; table_index <= 0xC; table_index += 4)
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE
++ (eth_port_num) + table_index), 0);
++
++ for (table_index = 0; table_index <= 0xFC; table_index += 4) {
++ /* Clear DA filter special multicast table (Ex_dFSMT) */
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0);
++ /* Clear DA filter other multicast table (Ex_dFOMT) */
++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0);
++ }
++}
++
++/*******************************************************************************
++* eth_clear_mib_counters - Clear all MIB counters
++*
++* DESCRIPTION:
++* This function clears all MIB counters of a specific ethernet port.
++* A read from the MIB counter will reset the counter.
++*
++* INPUT:
++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++*
++* OUTPUT:
++* After reading all MIB counters, the counters resets.
++*
++* RETURN:
++* MIB counter value.
++*
++*******************************************************************************/
++static void eth_clear_mib_counters (ETH_PORT eth_port_num)
++{
++ int i;
++ unsigned int dummy;
++
++ /* Perform dummy reads from MIB counters */
++ for (i = ETH_MIB_GOOD_OCTETS_RECEIVED_LOW; i < ETH_MIB_LATE_COLLISION;
++ i += 4)
++ dummy = MV_REG_READ ((MV64460_ETH_MIB_COUNTERS_BASE
++ (eth_port_num) + i));
++
++ return;
++}
++
++/*******************************************************************************
++* eth_read_mib_counter - Read a MIB counter
++*
++* DESCRIPTION:
++* This function reads a MIB counter of a specific ethernet port.
++* NOTE - If read from ETH_MIB_GOOD_OCTETS_RECEIVED_LOW, then the
++* following read must be from ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH
++* register. The same applies for ETH_MIB_GOOD_OCTETS_SENT_LOW and
++* ETH_MIB_GOOD_OCTETS_SENT_HIGH
++*
++* INPUT:
++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++* unsigned int mib_offset MIB counter offset (use ETH_MIB_... macros).
++*
++* OUTPUT:
++* After reading the MIB counter, the counter resets.
++*
++* RETURN:
++* MIB counter value.
++*
++*******************************************************************************/
++unsigned int eth_read_mib_counter (ETH_PORT eth_port_num,
++ unsigned int mib_offset)
++{
++ return (MV_REG_READ (MV64460_ETH_MIB_COUNTERS_BASE (eth_port_num)
++ + mib_offset));
++}
++
++/*******************************************************************************
++* ethernet_phy_set - Set the ethernet port PHY address.
++*
++* DESCRIPTION:
++* This routine set the ethernet port PHY address according to given
++* parameter.
++*
++* INPUT:
++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++*
++* OUTPUT:
++* Set PHY Address Register with given PHY address parameter.
++*
++* RETURN:
++* None.
++*
++*******************************************************************************/
++static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr)
++{
++ unsigned int reg_data;
++
++ reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG);
++
++ reg_data &= ~(0x1F << (5 * eth_port_num));
++ reg_data |= (phy_addr << (5 * eth_port_num));
++
++ MV_REG_WRITE (MV64460_ETH_PHY_ADDR_REG, reg_data);
++
++ return;
++}
++
++/*******************************************************************************
++ * ethernet_phy_get - Get the ethernet port PHY address.
++ *
++ * DESCRIPTION:
++ * This routine returns the given ethernet port PHY address.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ *
++ * OUTPUT:
++ * None.
++ *
++ * RETURN:
++ * PHY address.
++ *
++ *******************************************************************************/
++static int ethernet_phy_get (ETH_PORT eth_port_num)
++{
++ unsigned int reg_data;
++
++ reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG);
++
++ return ((reg_data >> (5 * eth_port_num)) & 0x1f);
++}
++
++/***********************************************************/
++/* (Re)start autonegotiation */
++/***********************************************************/
++int phy_setup_aneg (char *devname, unsigned char addr)
++{
++ unsigned short ctl, adv;
++
++ /* Setup standard advertise */
++ miiphy_read (devname, addr, PHY_ANAR, &adv);
++ adv |= (PHY_ANLPAR_ACK | PHY_ANLPAR_RF | PHY_ANLPAR_T4 |
++ PHY_ANLPAR_TXFD | PHY_ANLPAR_TX | PHY_ANLPAR_10FD |
++ PHY_ANLPAR_10);
++ miiphy_write (devname, addr, PHY_ANAR, adv);
++
++ miiphy_read (devname, addr, PHY_1000BTCR, &adv);
++ adv |= (0x0300);
++ miiphy_write (devname, addr, PHY_1000BTCR, adv);
++
++ /* Start/Restart aneg */
++ miiphy_read (devname, addr, PHY_BMCR, &ctl);
++ ctl |= (PHY_BMCR_AUTON | PHY_BMCR_RST_NEG);
++ miiphy_write (devname, addr, PHY_BMCR, ctl);
++
++ return 0;
++}
++
++/*******************************************************************************
++ * ethernet_phy_reset - Reset Ethernet port PHY.
++ *
++ * DESCRIPTION:
++ * This routine utilize the SMI interface to reset the ethernet port PHY.
++ * The routine waits until the link is up again or link up is timeout.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ *
++ * OUTPUT:
++ * The ethernet port PHY renew its link.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static bool ethernet_phy_reset (ETH_PORT eth_port_num)
++{
++ unsigned int time_out = 50;
++ unsigned int phy_reg_data;
++
++ eth_port_read_smi_reg (eth_port_num, 20, &phy_reg_data);
++ phy_reg_data |= 0x0083; /* Set bit 7 to 1 for different RGMII timing */
++ eth_port_write_smi_reg (eth_port_num, 20, phy_reg_data);
++
++ /* Reset the PHY */
++ eth_port_read_smi_reg (eth_port_num, 0, &phy_reg_data);
++ phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */
++ eth_port_write_smi_reg (eth_port_num, 0, phy_reg_data);
++
++ /* Poll on the PHY LINK */
++ do {
++ eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data);
++
++ if (time_out-- == 0)
++ return false;
++ }
++ while (!(phy_reg_data & 0x20));
++
++ return true;
++}
++
++/*******************************************************************************
++ * eth_port_reset - Reset Ethernet port
++ *
++ * DESCRIPTION:
++ * This routine resets the chip by aborting any SDMA engine activity and
++ * clearing the MIB counters. The Receiver and the Transmit unit are in
++ * idle state after this command is performed and the port is disabled.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ *
++ * OUTPUT:
++ * Channel activity is halted.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static void eth_port_reset (ETH_PORT eth_port_num)
++{
++ unsigned int reg_data;
++
++ /* Stop Tx port activity. Check port Tx activity. */
++ reg_data =
++ MV_REG_READ (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
++ (eth_port_num));
++
++ if (reg_data & 0xFF) {
++ /* Issue stop command for active channels only */
++ MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
++ (eth_port_num), (reg_data << 8));
++
++ /* Wait for all Tx activity to terminate. */
++ do {
++ /* Check port cause register that all Tx queues are stopped */
++ reg_data =
++ MV_REG_READ
++ (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG
++ (eth_port_num));
++ }
++ while (reg_data & 0xFF);
++ }
++
++ /* Stop Rx port activity. Check port Rx activity. */
++ reg_data =
++ MV_REG_READ (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
++ (eth_port_num));
++
++ if (reg_data & 0xFF) {
++ /* Issue stop command for active channels only */
++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
++ (eth_port_num), (reg_data << 8));
++
++ /* Wait for all Rx activity to terminate. */
++ do {
++ /* Check port cause register that all Rx queues are stopped */
++ reg_data =
++ MV_REG_READ
++ (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG
++ (eth_port_num));
++ }
++ while (reg_data & 0xFF);
++ }
++
++ /* Clear all MIB counters */
++ eth_clear_mib_counters (eth_port_num);
++
++ /* Reset the Enable bit in the Configuration Register */
++ reg_data =
++ MV_REG_READ (MV64460_ETH_PORT_SERIAL_CONTROL_REG
++ (eth_port_num));
++ reg_data &= ~ETH_SERIAL_PORT_ENABLE;
++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num),
++ reg_data);
++
++ return;
++}
++
++#if 0 /* Not needed here */
++/*******************************************************************************
++ * ethernet_set_config_reg - Set specified bits in configuration register.
++ *
++ * DESCRIPTION:
++ * This function sets specified bits in the given ethernet
++ * configuration register.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ * unsigned int value 32 bit value.
++ *
++ * OUTPUT:
++ * The set bits in the value parameter are set in the configuration
++ * register.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static void ethernet_set_config_reg (ETH_PORT eth_port_num,
++ unsigned int value)
++{
++ unsigned int eth_config_reg;
++
++ eth_config_reg =
++ MV_REG_READ (MV64460_ETH_PORT_CONFIG_REG (eth_port_num));
++ eth_config_reg |= value;
++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num),
++ eth_config_reg);
++
++ return;
++}
++#endif
++
++#if 0 /* FIXME */
++/*******************************************************************************
++ * ethernet_reset_config_reg - Reset specified bits in configuration register.
++ *
++ * DESCRIPTION:
++ * This function resets specified bits in the given Ethernet
++ * configuration register.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ * unsigned int value 32 bit value.
++ *
++ * OUTPUT:
++ * The set bits in the value parameter are reset in the configuration
++ * register.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static void ethernet_reset_config_reg (ETH_PORT eth_port_num,
++ unsigned int value)
++{
++ unsigned int eth_config_reg;
++
++ eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG
++ (eth_port_num));
++ eth_config_reg &= ~value;
++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num),
++ eth_config_reg);
++
++ return;
++}
++#endif
++
++#if 0 /* Not needed here */
++/*******************************************************************************
++ * ethernet_get_config_reg - Get the port configuration register
++ *
++ * DESCRIPTION:
++ * This function returns the configuration register value of the given
++ * ethernet port.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ *
++ * OUTPUT:
++ * None.
++ *
++ * RETURN:
++ * Port configuration register value.
++ *
++ *******************************************************************************/
++static unsigned int ethernet_get_config_reg (ETH_PORT eth_port_num)
++{
++ unsigned int eth_config_reg;
++
++ eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG
++ (eth_port_num));
++ return eth_config_reg;
++}
++
++#endif
++
++/*******************************************************************************
++ * eth_port_read_smi_reg - Read PHY registers
++ *
++ * DESCRIPTION:
++ * This routine utilize the SMI interface to interact with the PHY in
++ * order to perform PHY register read.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ * unsigned int phy_reg PHY register address offset.
++ * unsigned int *value Register value buffer.
++ *
++ * OUTPUT:
++ * Write the value of a specified PHY register into given buffer.
++ *
++ * RETURN:
++ * false if the PHY is busy or read data is not in valid state.
++ * true otherwise.
++ *
++ *******************************************************************************/
++static bool eth_port_read_smi_reg (ETH_PORT eth_port_num,
++ unsigned int phy_reg, unsigned int *value)
++{
++ unsigned int reg_value;
++ unsigned int time_out = PHY_BUSY_TIMEOUT;
++ int phy_addr;
++
++ phy_addr = ethernet_phy_get (eth_port_num);
++
++ /* first check that it is not busy */
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while (reg_value & ETH_SMI_BUSY);
++
++ /* not busy */
++
++ MV_REG_WRITE (MV64460_ETH_SMI_REG,
++ (phy_addr << 16) | (phy_reg << 21) |
++ ETH_SMI_OPCODE_READ);
++
++ time_out = PHY_BUSY_TIMEOUT; /* initialize the time out var again */
++
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while ((reg_value & ETH_SMI_READ_VALID) != ETH_SMI_READ_VALID); /* Bit set equ operation done */
++
++ /* Wait for the data to update in the SMI register */
++#define PHY_UPDATE_TIMEOUT 10000
++ for (time_out = 0; time_out < PHY_UPDATE_TIMEOUT; time_out++);
++
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++
++ *value = reg_value & 0xffff;
++
++ return true;
++}
++
++int mv_miiphy_read(char *devname, unsigned char phy_addr,
++ unsigned char phy_reg, unsigned short *value)
++{
++ unsigned int reg_value;
++ unsigned int time_out = PHY_BUSY_TIMEOUT;
++
++ /* first check that it is not busy */
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while (reg_value & ETH_SMI_BUSY);
++
++ /* not busy */
++ MV_REG_WRITE (MV64460_ETH_SMI_REG,
++ (phy_addr << 16) | (phy_reg << 21) |
++ ETH_SMI_OPCODE_READ);
++
++ time_out = PHY_BUSY_TIMEOUT; /* initialize the time out var again */
++
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while ((reg_value & ETH_SMI_READ_VALID) != ETH_SMI_READ_VALID); /* Bit set equ operation done */
++
++ /* Wait for the data to update in the SMI register */
++ for (time_out = 0; time_out < PHY_UPDATE_TIMEOUT; time_out++);
++
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++
++ *value = reg_value & 0xffff;
++
++ return 0;
++}
++
++/*******************************************************************************
++ * eth_port_write_smi_reg - Write to PHY registers
++ *
++ * DESCRIPTION:
++ * This routine utilize the SMI interface to interact with the PHY in
++ * order to perform writes to PHY registers.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ * unsigned int phy_reg PHY register address offset.
++ * unsigned int value Register value.
++ *
++ * OUTPUT:
++ * Write the given value to the specified PHY register.
++ *
++ * RETURN:
++ * false if the PHY is busy.
++ * true otherwise.
++ *
++ *******************************************************************************/
++static bool eth_port_write_smi_reg (ETH_PORT eth_port_num,
++ unsigned int phy_reg, unsigned int value)
++{
++ unsigned int reg_value;
++ unsigned int time_out = PHY_BUSY_TIMEOUT;
++ int phy_addr;
++
++ phy_addr = ethernet_phy_get (eth_port_num);
++
++ /* first check that it is not busy */
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while (reg_value & ETH_SMI_BUSY);
++
++ /* not busy */
++ MV_REG_WRITE (MV64460_ETH_SMI_REG,
++ (phy_addr << 16) | (phy_reg << 21) |
++ ETH_SMI_OPCODE_WRITE | (value & 0xffff));
++ return true;
++}
++
++int mv_miiphy_write(char *devname, unsigned char phy_addr,
++ unsigned char phy_reg, unsigned short value)
++{
++ unsigned int reg_value;
++ unsigned int time_out = PHY_BUSY_TIMEOUT;
++
++ /* first check that it is not busy */
++ do {
++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG);
++ if (time_out-- == 0) {
++ return false;
++ }
++ }
++ while (reg_value & ETH_SMI_BUSY);
++
++ /* not busy */
++ MV_REG_WRITE (MV64460_ETH_SMI_REG,
++ (phy_addr << 16) | (phy_reg << 21) |
++ ETH_SMI_OPCODE_WRITE | (value & 0xffff));
++ return 0;
++}
++
++/*******************************************************************************
++ * eth_set_access_control - Config address decode parameters for Ethernet unit
++ *
++ * DESCRIPTION:
++ * This function configures the address decode parameters for the Gigabit
++ * Ethernet Controller according the given parameters struct.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum.
++ * ETH_WIN_PARAM *param Address decode parameter struct.
++ *
++ * OUTPUT:
++ * An access window is opened using the given access parameters.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static void eth_set_access_control (ETH_PORT eth_port_num,
++ ETH_WIN_PARAM * param)
++{
++ unsigned int access_prot_reg;
++
++ /* Set access control register */
++ access_prot_reg = MV_REG_READ (MV64460_ETH_ACCESS_PROTECTION_REG
++ (eth_port_num));
++ access_prot_reg &= (~(3 << (param->win * 2))); /* clear window permission */
++ access_prot_reg |= (param->access_ctrl << (param->win * 2));
++ MV_REG_WRITE (MV64460_ETH_ACCESS_PROTECTION_REG (eth_port_num),
++ access_prot_reg);
++
++ /* Set window Size reg (SR) */
++ MV_REG_WRITE ((MV64460_ETH_SIZE_REG_0 +
++ (ETH_SIZE_REG_GAP * param->win)),
++ (((param->size / 0x10000) - 1) << 16));
++
++ /* Set window Base address reg (BA) */
++ MV_REG_WRITE ((MV64460_ETH_BAR_0 + (ETH_BAR_GAP * param->win)),
++ (param->target | param->attributes | param->base_addr));
++ /* High address remap reg (HARR) */
++ if (param->win < 4)
++ MV_REG_WRITE ((MV64460_ETH_HIGH_ADDR_REMAP_REG_0 +
++ (ETH_HIGH_ADDR_REMAP_REG_GAP * param->win)),
++ param->high_addr);
++
++ /* Base address enable reg (BARER) */
++ if (param->enable == 1)
++ MV_RESET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG,
++ (1 << param->win));
++ else
++ MV_SET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG,
++ (1 << param->win));
++}
++
++/*******************************************************************************
++ * ether_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory.
++ *
++ * DESCRIPTION:
++ * This function prepares a Rx chained list of descriptors and packet
++ * buffers in a form of a ring. The routine must be called after port
++ * initialization routine and before port start routine.
++ * The Ethernet SDMA engine uses CPU bus addresses to access the various
++ * devices in the system (i.e. DRAM). This function uses the ethernet
++ * struct 'virtual to physical' routine (set by the user) to set the ring
++ * with physical addresses.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE rx_queue Number of Rx queue.
++ * int rx_desc_num Number of Rx descriptors
++ * int rx_buff_size Size of Rx buffer
++ * unsigned int rx_desc_base_addr Rx descriptors memory area base addr.
++ * unsigned int rx_buff_base_addr Rx buffer memory area base addr.
++ *
++ * OUTPUT:
++ * The routine updates the Ethernet port control struct with information
++ * regarding the Rx descriptors and buffers.
++ *
++ * RETURN:
++ * false if the given descriptors memory area is not aligned according to
++ * Ethernet SDMA specifications.
++ * true otherwise.
++ *
++ *******************************************************************************/
++static bool ether_init_rx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ int rx_desc_num,
++ int rx_buff_size,
++ unsigned int rx_desc_base_addr,
++ unsigned int rx_buff_base_addr)
++{
++ ETH_RX_DESC *p_rx_desc;
++ ETH_RX_DESC *p_rx_prev_desc; /* pointer to link with the last descriptor */
++ unsigned int buffer_addr;
++ int ix; /* a counter */
++
++ p_rx_desc = (ETH_RX_DESC *) rx_desc_base_addr;
++ p_rx_prev_desc = p_rx_desc;
++ buffer_addr = rx_buff_base_addr;
++
++ /* Rx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */
++ if (rx_buff_base_addr & 0xF)
++ return false;
++
++ /* Rx buffers are limited to 64K bytes and Minimum size is 8 bytes */
++ if ((rx_buff_size < 8) || (rx_buff_size > RX_BUFFER_MAX_SIZE))
++ return false;
++
++ /* Rx buffers must be 64-bit aligned. */
++ if ((rx_buff_base_addr + rx_buff_size) & 0x7)
++ return false;
++
++ /* initialize the Rx descriptors ring */
++ for (ix = 0; ix < rx_desc_num; ix++) {
++ p_rx_desc->buf_size = rx_buff_size;
++ p_rx_desc->byte_cnt = 0x0000;
++ p_rx_desc->cmd_sts =
++ ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT;
++ p_rx_desc->next_desc_ptr =
++ ((unsigned int) p_rx_desc) + RX_DESC_ALIGNED_SIZE;
++ p_rx_desc->buf_ptr = buffer_addr;
++ p_rx_desc->return_info = 0x00000000;
++ D_CACHE_FLUSH_LINE (p_rx_desc, 0);
++ buffer_addr += rx_buff_size;
++ p_rx_prev_desc = p_rx_desc;
++ p_rx_desc = (ETH_RX_DESC *)
++ ((unsigned int) p_rx_desc + RX_DESC_ALIGNED_SIZE);
++ }
++
++ /* Closing Rx descriptors ring */
++ p_rx_prev_desc->next_desc_ptr = (rx_desc_base_addr);
++ D_CACHE_FLUSH_LINE (p_rx_prev_desc, 0);
++
++ /* Save Rx desc pointer to driver struct. */
++ CURR_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue);
++ USED_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue);
++
++ p_eth_port_ctrl->p_rx_desc_area_base[rx_queue] =
++ (ETH_RX_DESC *) rx_desc_base_addr;
++ p_eth_port_ctrl->rx_desc_area_size[rx_queue] =
++ rx_desc_num * RX_DESC_ALIGNED_SIZE;
++
++ p_eth_port_ctrl->port_rx_queue_command |= (1 << rx_queue);
++
++ return true;
++}
++
++/*******************************************************************************
++ * ether_init_tx_desc_ring - Curve a Tx chain desc list and buffer in memory.
++ *
++ * DESCRIPTION:
++ * This function prepares a Tx chained list of descriptors and packet
++ * buffers in a form of a ring. The routine must be called after port
++ * initialization routine and before port start routine.
++ * The Ethernet SDMA engine uses CPU bus addresses to access the various
++ * devices in the system (i.e. DRAM). This function uses the ethernet
++ * struct 'virtual to physical' routine (set by the user) to set the ring
++ * with physical addresses.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE tx_queue Number of Tx queue.
++ * int tx_desc_num Number of Tx descriptors
++ * int tx_buff_size Size of Tx buffer
++ * unsigned int tx_desc_base_addr Tx descriptors memory area base addr.
++ * unsigned int tx_buff_base_addr Tx buffer memory area base addr.
++ *
++ * OUTPUT:
++ * The routine updates the Ethernet port control struct with information
++ * regarding the Tx descriptors and buffers.
++ *
++ * RETURN:
++ * false if the given descriptors memory area is not aligned according to
++ * Ethernet SDMA specifications.
++ * true otherwise.
++ *
++ *******************************************************************************/
++static bool ether_init_tx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ int tx_desc_num,
++ int tx_buff_size,
++ unsigned int tx_desc_base_addr,
++ unsigned int tx_buff_base_addr)
++{
++
++ ETH_TX_DESC *p_tx_desc;
++ ETH_TX_DESC *p_tx_prev_desc;
++ unsigned int buffer_addr;
++ int ix; /* a counter */
++
++ /* save the first desc pointer to link with the last descriptor */
++ p_tx_desc = (ETH_TX_DESC *) tx_desc_base_addr;
++ p_tx_prev_desc = p_tx_desc;
++ buffer_addr = tx_buff_base_addr;
++
++ /* Tx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */
++ if (tx_buff_base_addr & 0xF)
++ return false;
++
++ /* Tx buffers are limited to 64K bytes and Minimum size is 8 bytes */
++ if ((tx_buff_size > TX_BUFFER_MAX_SIZE)
++ || (tx_buff_size < TX_BUFFER_MIN_SIZE))
++ return false;
++
++ /* Initialize the Tx descriptors ring */
++ for (ix = 0; ix < tx_desc_num; ix++) {
++ p_tx_desc->byte_cnt = 0x0000;
++ p_tx_desc->l4i_chk = 0x0000;
++ p_tx_desc->cmd_sts = 0x00000000;
++ p_tx_desc->next_desc_ptr =
++ ((unsigned int) p_tx_desc) + TX_DESC_ALIGNED_SIZE;
++
++ p_tx_desc->buf_ptr = buffer_addr;
++ p_tx_desc->return_info = 0x00000000;
++ D_CACHE_FLUSH_LINE (p_tx_desc, 0);
++ buffer_addr += tx_buff_size;
++ p_tx_prev_desc = p_tx_desc;
++ p_tx_desc = (ETH_TX_DESC *)
++ ((unsigned int) p_tx_desc + TX_DESC_ALIGNED_SIZE);
++
++ }
++ /* Closing Tx descriptors ring */
++ p_tx_prev_desc->next_desc_ptr = tx_desc_base_addr;
++ D_CACHE_FLUSH_LINE (p_tx_prev_desc, 0);
++ /* Set Tx desc pointer in driver struct. */
++ CURR_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue);
++ USED_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue);
++
++ /* Init Tx ring base and size parameters */
++ p_eth_port_ctrl->p_tx_desc_area_base[tx_queue] =
++ (ETH_TX_DESC *) tx_desc_base_addr;
++ p_eth_port_ctrl->tx_desc_area_size[tx_queue] =
++ (tx_desc_num * TX_DESC_ALIGNED_SIZE);
++
++ /* Add the queue to the list of Tx queues of this port */
++ p_eth_port_ctrl->port_tx_queue_command |= (1 << tx_queue);
++
++ return true;
++}
++
++/*******************************************************************************
++ * eth_port_send - Send an Ethernet packet
++ *
++ * DESCRIPTION:
++ * This routine send a given packet described by p_pktinfo parameter. It
++ * supports transmitting of a packet spaned over multiple buffers. The
++ * routine updates 'curr' and 'first' indexes according to the packet
++ * segment passed to the routine. In case the packet segment is first,
++ * the 'first' index is update. In any case, the 'curr' index is updated.
++ * If the routine get into Tx resource error it assigns 'curr' index as
++ * 'first'. This way the function can abort Tx process of multiple
++ * descriptors per packet.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE tx_queue Number of Tx queue.
++ * PKT_INFO *p_pkt_info User packet buffer.
++ *
++ * OUTPUT:
++ * Tx ring 'curr' and 'first' indexes are updated.
++ *
++ * RETURN:
++ * ETH_QUEUE_FULL in case of Tx resource error.
++ * ETH_ERROR in case the routine can not access Tx desc ring.
++ * ETH_QUEUE_LAST_RESOURCE if the routine uses the last Tx resource.
++ * ETH_OK otherwise.
++ *
++ *******************************************************************************/
++static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO * p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ PKT_INFO * p_pkt_info)
++{
++ volatile ETH_TX_DESC *p_tx_desc_first;
++ volatile ETH_TX_DESC *p_tx_desc_curr;
++ volatile ETH_TX_DESC *p_tx_next_desc_curr;
++ volatile ETH_TX_DESC *p_tx_desc_used;
++ unsigned int command_status;
++
++ /* Do not process Tx ring in case of Tx ring resource error */
++ if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true)
++ return ETH_QUEUE_FULL;
++
++ /* Get the Tx Desc ring indexes */
++ CURR_TFD_GET (p_tx_desc_curr, tx_queue);
++ USED_TFD_GET (p_tx_desc_used, tx_queue);
++
++ if (p_tx_desc_curr == NULL)
++ return ETH_ERROR;
++
++ /* The following parameters are used to save readings from memory */
++ p_tx_next_desc_curr = TX_NEXT_DESC_PTR (p_tx_desc_curr, tx_queue);
++ command_status = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC;
++
++ if (command_status & (ETH_TX_FIRST_DESC)) {
++ /* Update first desc */
++ FIRST_TFD_SET (p_tx_desc_curr, tx_queue);
++ p_tx_desc_first = p_tx_desc_curr;
++ } else {
++ FIRST_TFD_GET (p_tx_desc_first, tx_queue);
++ command_status |= ETH_BUFFER_OWNED_BY_DMA;
++ }
++
++ /* Buffers with a payload smaller than 8 bytes must be aligned to 64-bit */
++ /* boundary. We use the memory allocated for Tx descriptor. This memory */
++ /* located in TX_BUF_OFFSET_IN_DESC offset within the Tx descriptor. */
++ if (p_pkt_info->byte_cnt <= 8) {
++ printf ("You have failed in the < 8 bytes errata - fixme\n"); /* RABEEH - TBD */
++ return ETH_ERROR;
++
++ p_tx_desc_curr->buf_ptr =
++ (unsigned int) p_tx_desc_curr + TX_BUF_OFFSET_IN_DESC;
++ eth_b_copy (p_pkt_info->buf_ptr, p_tx_desc_curr->buf_ptr,
++ p_pkt_info->byte_cnt);
++ } else
++ p_tx_desc_curr->buf_ptr = p_pkt_info->buf_ptr;
++
++ p_tx_desc_curr->byte_cnt = p_pkt_info->byte_cnt;
++ p_tx_desc_curr->return_info = p_pkt_info->return_info;
++
++ if (p_pkt_info->cmd_sts & (ETH_TX_LAST_DESC)) {
++ /* Set last desc with DMA ownership and interrupt enable. */
++ p_tx_desc_curr->cmd_sts = command_status |
++ ETH_BUFFER_OWNED_BY_DMA | ETH_TX_ENABLE_INTERRUPT;
++
++ if (p_tx_desc_curr != p_tx_desc_first)
++ p_tx_desc_first->cmd_sts |= ETH_BUFFER_OWNED_BY_DMA;
++
++ /* Flush CPU pipe */
++
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0);
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_first, 0);
++ CPU_PIPE_FLUSH;
++
++ /* Apply send command */
++ ETH_ENABLE_TX_QUEUE (tx_queue, p_eth_port_ctrl->port_num);
++
++ /* Finish Tx packet. Update first desc in case of Tx resource error */
++ p_tx_desc_first = p_tx_next_desc_curr;
++ FIRST_TFD_SET (p_tx_desc_first, tx_queue);
++
++ } else {
++ p_tx_desc_curr->cmd_sts = command_status;
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0);
++ }
++
++ /* Check for ring index overlap in the Tx desc ring */
++ if (p_tx_next_desc_curr == p_tx_desc_used) {
++ /* Update the current descriptor */
++ CURR_TFD_SET (p_tx_desc_first, tx_queue);
++
++ p_eth_port_ctrl->tx_resource_err[tx_queue] = true;
++ return ETH_QUEUE_LAST_RESOURCE;
++ } else {
++ /* Update the current descriptor */
++ CURR_TFD_SET (p_tx_next_desc_curr, tx_queue);
++ return ETH_OK;
++ }
++}
++
++/*******************************************************************************
++ * eth_tx_return_desc - Free all used Tx descriptors
++ *
++ * DESCRIPTION:
++ * This routine returns the transmitted packet information to the caller.
++ * It uses the 'first' index to support Tx desc return in case a transmit
++ * of a packet spanned over multiple buffer still in process.
++ * In case the Tx queue was in "resource error" condition, where there are
++ * no available Tx resources, the function resets the resource error flag.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE tx_queue Number of Tx queue.
++ * PKT_INFO *p_pkt_info User packet buffer.
++ *
++ * OUTPUT:
++ * Tx ring 'first' and 'used' indexes are updated.
++ *
++ * RETURN:
++ * ETH_ERROR in case the routine can not access Tx desc ring.
++ * ETH_RETRY in case there is transmission in process.
++ * ETH_END_OF_JOB if the routine has nothing to release.
++ * ETH_OK otherwise.
++ *
++ *******************************************************************************/
++static ETH_FUNC_RET_STATUS eth_tx_return_desc (ETH_PORT_INFO *
++ p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ PKT_INFO * p_pkt_info)
++{
++ volatile ETH_TX_DESC *p_tx_desc_used = NULL;
++ volatile ETH_TX_DESC *p_tx_desc_first = NULL;
++ unsigned int command_status;
++
++ /* Get the Tx Desc ring indexes */
++ USED_TFD_GET (p_tx_desc_used, tx_queue);
++ FIRST_TFD_GET (p_tx_desc_first, tx_queue);
++
++ /* Sanity check */
++ if (p_tx_desc_used == NULL)
++ return ETH_ERROR;
++
++ command_status = p_tx_desc_used->cmd_sts;
++
++ /* Still transmitting... */
++ if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) {
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
++ return ETH_RETRY;
++ }
++
++ /* Stop release. About to overlap the current available Tx descriptor */
++ if ((p_tx_desc_used == p_tx_desc_first) &&
++ (p_eth_port_ctrl->tx_resource_err[tx_queue] == false)) {
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
++ return ETH_END_OF_JOB;
++ }
++
++ /* Pass the packet information to the caller */
++ p_pkt_info->cmd_sts = command_status;
++ p_pkt_info->return_info = p_tx_desc_used->return_info;
++ p_tx_desc_used->return_info = 0;
++
++ /* Update the next descriptor to release. */
++ USED_TFD_SET (TX_NEXT_DESC_PTR (p_tx_desc_used, tx_queue), tx_queue);
++
++ /* Any Tx return cancels the Tx resource error status */
++ if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true)
++ p_eth_port_ctrl->tx_resource_err[tx_queue] = false;
++
++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0);
++
++ return ETH_OK;
++
++}
++
++/*******************************************************************************
++ * eth_port_receive - Get received information from Rx ring.
++ *
++ * DESCRIPTION:
++ * This routine returns the received data to the caller. There is no
++ * data copying during routine operation. All information is returned
++ * using pointer to packet information struct passed from the caller.
++ * If the routine exhausts Rx ring resources then the resource error flag
++ * is set.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE rx_queue Number of Rx queue.
++ * PKT_INFO *p_pkt_info User packet buffer.
++ *
++ * OUTPUT:
++ * Rx ring current and used indexes are updated.
++ *
++ * RETURN:
++ * ETH_ERROR in case the routine can not access Rx desc ring.
++ * ETH_QUEUE_FULL if Rx ring resources are exhausted.
++ * ETH_END_OF_JOB if there is no received data.
++ * ETH_OK otherwise.
++ *
++ *******************************************************************************/
++static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO * p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ PKT_INFO * p_pkt_info)
++{
++ volatile ETH_RX_DESC *p_rx_curr_desc;
++ volatile ETH_RX_DESC *p_rx_next_curr_desc;
++ volatile ETH_RX_DESC *p_rx_used_desc;
++ unsigned int command_status;
++
++ /* Do not process Rx ring in case of Rx ring resource error */
++ if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true) {
++ printf ("\nRx Queue is full ...\n");
++ return ETH_QUEUE_FULL;
++ }
++
++ /* Get the Rx Desc ring 'curr and 'used' indexes */
++ CURR_RFD_GET (p_rx_curr_desc, rx_queue);
++ USED_RFD_GET (p_rx_used_desc, rx_queue);
++
++ /* Sanity check */
++ if (p_rx_curr_desc == NULL)
++ return ETH_ERROR;
++
++ /* The following parameters are used to save readings from memory */
++ p_rx_next_curr_desc = RX_NEXT_DESC_PTR (p_rx_curr_desc, rx_queue);
++ command_status = p_rx_curr_desc->cmd_sts;
++
++ /* Nothing to receive... */
++ if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) {
++/* DP(printf("Rx: command_status: %08x\n", command_status)); */
++ D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0);
++/* DP(printf("\nETH_END_OF_JOB ...\n"));*/
++ return ETH_END_OF_JOB;
++ }
++
++ p_pkt_info->byte_cnt = (p_rx_curr_desc->byte_cnt) - RX_BUF_OFFSET;
++ p_pkt_info->cmd_sts = command_status;
++ p_pkt_info->buf_ptr = (p_rx_curr_desc->buf_ptr) + RX_BUF_OFFSET;
++ p_pkt_info->return_info = p_rx_curr_desc->return_info;
++ p_pkt_info->l4i_chk = p_rx_curr_desc->buf_size; /* IP fragment indicator */
++
++ /* Clean the return info field to indicate that the packet has been */
++ /* moved to the upper layers */
++ p_rx_curr_desc->return_info = 0;
++
++ /* Update 'curr' in data structure */
++ CURR_RFD_SET (p_rx_next_curr_desc, rx_queue);
++
++ /* Rx descriptors resource exhausted. Set the Rx ring resource error flag */
++ if (p_rx_next_curr_desc == p_rx_used_desc)
++ p_eth_port_ctrl->rx_resource_err[rx_queue] = true;
++
++ D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0);
++ CPU_PIPE_FLUSH;
++
++ return ETH_OK;
++}
++
++/*******************************************************************************
++ * eth_rx_return_buff - Returns a Rx buffer back to the Rx ring.
++ *
++ * DESCRIPTION:
++ * This routine returns a Rx buffer back to the Rx ring. It retrieves the
++ * next 'used' descriptor and attached the returned buffer to it.
++ * In case the Rx ring was in "resource error" condition, where there are
++ * no available Rx resources, the function resets the resource error flag.
++ *
++ * INPUT:
++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct.
++ * ETH_QUEUE rx_queue Number of Rx queue.
++ * PKT_INFO *p_pkt_info Information on the returned buffer.
++ *
++ * OUTPUT:
++ * New available Rx resource in Rx descriptor ring.
++ *
++ * RETURN:
++ * ETH_ERROR in case the routine can not access Rx desc ring.
++ * ETH_OK otherwise.
++ *
++ *******************************************************************************/
++static ETH_FUNC_RET_STATUS eth_rx_return_buff (ETH_PORT_INFO *
++ p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ PKT_INFO * p_pkt_info)
++{
++ volatile ETH_RX_DESC *p_used_rx_desc; /* Where to return Rx resource */
++
++ /* Get 'used' Rx descriptor */
++ USED_RFD_GET (p_used_rx_desc, rx_queue);
++
++ /* Sanity check */
++ if (p_used_rx_desc == NULL)
++ return ETH_ERROR;
++
++ p_used_rx_desc->buf_ptr = p_pkt_info->buf_ptr;
++ p_used_rx_desc->return_info = p_pkt_info->return_info;
++ p_used_rx_desc->byte_cnt = p_pkt_info->byte_cnt;
++ p_used_rx_desc->buf_size = MV64460_RX_BUFFER_SIZE; /* Reset Buffer size */
++
++ /* Flush the write pipe */
++ CPU_PIPE_FLUSH;
++
++ /* Return the descriptor to DMA ownership */
++ p_used_rx_desc->cmd_sts =
++ ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT;
++
++ /* Flush descriptor and CPU pipe */
++ D_CACHE_FLUSH_LINE ((unsigned int) p_used_rx_desc, 0);
++ CPU_PIPE_FLUSH;
++
++ /* Move the used descriptor pointer to the next descriptor */
++ USED_RFD_SET (RX_NEXT_DESC_PTR (p_used_rx_desc, rx_queue), rx_queue);
++
++ /* Any Rx return cancels the Rx resource error status */
++ if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true)
++ p_eth_port_ctrl->rx_resource_err[rx_queue] = false;
++
++ return ETH_OK;
++}
++
++/*******************************************************************************
++ * eth_port_set_rx_coal - Sets coalescing interrupt mechanism on RX path
++ *
++ * DESCRIPTION:
++ * This routine sets the RX coalescing interrupt mechanism parameter.
++ * This parameter is a timeout counter, that counts in 64 t_clk
++ * chunks ; that when timeout event occurs a maskable interrupt
++ * occurs.
++ * The parameter is calculated using the tClk of the MV-643xx chip
++ * , and the required delay of the interrupt in usec.
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet port number
++ * unsigned int t_clk t_clk of the MV-643xx chip in HZ units
++ * unsigned int delay Delay in usec
++ *
++ * OUTPUT:
++ * Interrupt coalescing mechanism value is set in MV-643xx chip.
++ *
++ * RETURN:
++ * The interrupt coalescing value set in the gigE port.
++ *
++ *******************************************************************************/
++#if 0 /* FIXME */
++static unsigned int eth_port_set_rx_coal (ETH_PORT eth_port_num,
++ unsigned int t_clk,
++ unsigned int delay)
++{
++ unsigned int coal;
++
++ coal = ((t_clk / 1000000) * delay) / 64;
++ /* Set RX Coalescing mechanism */
++ MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num),
++ ((coal & 0x3fff) << 8) |
++ (MV_REG_READ
++ (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num))
++ & 0xffc000ff));
++ return coal;
++}
++
++#endif
++/*******************************************************************************
++ * eth_port_set_tx_coal - Sets coalescing interrupt mechanism on TX path
++ *
++ * DESCRIPTION:
++ * This routine sets the TX coalescing interrupt mechanism parameter.
++ * This parameter is a timeout counter, that counts in 64 t_clk
++ * chunks ; that when timeout event occurs a maskable interrupt
++ * occurs.
++ * The parameter is calculated using the t_cLK frequency of the
++ * MV-643xx chip and the required delay in the interrupt in uSec
++ *
++ * INPUT:
++ * ETH_PORT eth_port_num Ethernet port number
++ * unsigned int t_clk t_clk of the MV-643xx chip in HZ units
++ * unsigned int delay Delay in uSeconds
++ *
++ * OUTPUT:
++ * Interrupt coalescing mechanism value is set in MV-643xx chip.
++ *
++ * RETURN:
++ * The interrupt coalescing value set in the gigE port.
++ *
++ *******************************************************************************/
++#if 0 /* FIXME */
++static unsigned int eth_port_set_tx_coal (ETH_PORT eth_port_num,
++ unsigned int t_clk,
++ unsigned int delay)
++{
++ unsigned int coal;
++
++ coal = ((t_clk / 1000000) * delay) / 64;
++ /* Set TX Coalescing mechanism */
++ MV_REG_WRITE (MV64460_ETH_TX_FIFO_URGENT_THRESHOLD_REG (eth_port_num),
++ coal << 4);
++ return coal;
++}
++#endif
++
++/*******************************************************************************
++ * eth_b_copy - Copy bytes from source to destination
++ *
++ * DESCRIPTION:
++ * This function supports the eight bytes limitation on Tx buffer size.
++ * The routine will zero eight bytes starting from the destination address
++ * followed by copying bytes from the source address to the destination.
++ *
++ * INPUT:
++ * unsigned int src_addr 32 bit source address.
++ * unsigned int dst_addr 32 bit destination address.
++ * int byte_count Number of bytes to copy.
++ *
++ * OUTPUT:
++ * See description.
++ *
++ * RETURN:
++ * None.
++ *
++ *******************************************************************************/
++static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr,
++ int byte_count)
++{
++ /* Zero the dst_addr area */
++ *(unsigned int *) dst_addr = 0x0;
++
++ while (byte_count != 0) {
++ *(char *) dst_addr = *(char *) src_addr;
++ dst_addr++;
++ src_addr++;
++ byte_count--;
++ }
++}
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_eth.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.h
+--- u-boot-1.1.6/board/prodrive/p3mx/mv_eth.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,840 @@
++/*
++ * (C) Copyright 2003
++ * Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ * based on - Driver for MV64460X ethernet ports
++ * Copyright (C) 2002 rabeeh@galileo.co.il
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/*
++ * mv_eth.h - header file for the polled mode GT ethernet driver
++ */
++
++#ifndef __DB64460_ETH_H__
++#define __DB64460_ETH_H__
++
++#include <asm/types.h>
++#include <asm/io.h>
++#include <asm/byteorder.h>
++#include <common.h>
++#include <net.h>
++#include "mv_regs.h"
++#include "ppc_error_no.h"
++#include "../../Marvell/include/core.h"
++
++/*************************************************************************
++**************************************************************************
++**************************************************************************
++* The first part is the high level driver of the gigE ethernet ports. *
++**************************************************************************
++**************************************************************************
++*************************************************************************/
++#ifndef TRUE
++#define TRUE 1
++#endif
++#ifndef FALSE
++#define FALSE 0
++#endif
++
++/* In case not using SG on Tx, define MAX_SKB_FRAGS as 0 */
++#ifndef MAX_SKB_FRAGS
++#define MAX_SKB_FRAGS 0
++#endif
++
++/* Port attributes */
++/*#define MAX_RX_QUEUE_NUM 8*/
++/*#define MAX_TX_QUEUE_NUM 8*/
++#define MAX_RX_QUEUE_NUM 1
++#define MAX_TX_QUEUE_NUM 1
++
++
++/* Use one TX queue and one RX queue */
++#define MV64460_TX_QUEUE_NUM 1
++#define MV64460_RX_QUEUE_NUM 1
++
++/*
++ * Number of RX / TX descriptors on RX / TX rings.
++ * Note that allocating RX descriptors is done by allocating the RX
++ * ring AND a preallocated RX buffers (skb's) for each descriptor.
++ * The TX descriptors only allocates the TX descriptors ring,
++ * with no pre allocated TX buffers (skb's are allocated by higher layers.
++ */
++
++/* Default TX ring size is 10 descriptors */
++#ifdef CONFIG_MV64460_ETH_TXQUEUE_SIZE
++#define MV64460_TX_QUEUE_SIZE CONFIG_MV64460_ETH_TXQUEUE_SIZE
++#else
++#define MV64460_TX_QUEUE_SIZE 4
++#endif
++
++/* Default RX ring size is 4 descriptors */
++#ifdef CONFIG_MV64460_ETH_RXQUEUE_SIZE
++#define MV64460_RX_QUEUE_SIZE CONFIG_MV64460_ETH_RXQUEUE_SIZE
++#else
++#define MV64460_RX_QUEUE_SIZE 4
++#endif
++
++#ifdef CONFIG_RX_BUFFER_SIZE
++#define MV64460_RX_BUFFER_SIZE CONFIG_RX_BUFFER_SIZE
++#else
++#define MV64460_RX_BUFFER_SIZE 1600
++#endif
++
++#ifdef CONFIG_TX_BUFFER_SIZE
++#define MV64460_TX_BUFFER_SIZE CONFIG_TX_BUFFER_SIZE
++#else
++#define MV64460_TX_BUFFER_SIZE 1600
++#endif
++
++/*
++ * Network device statistics. Akin to the 2.0 ether stats but
++ * with byte counters.
++ */
++
++struct net_device_stats
++{
++ unsigned long rx_packets; /* total packets received */
++ unsigned long tx_packets; /* total packets transmitted */
++ unsigned long rx_bytes; /* total bytes received */
++ unsigned long tx_bytes; /* total bytes transmitted */
++ unsigned long rx_errors; /* bad packets received */
++ unsigned long tx_errors; /* packet transmit problems */
++ unsigned long rx_dropped; /* no space in linux buffers */
++ unsigned long tx_dropped; /* no space available in linux */
++ unsigned long multicast; /* multicast packets received */
++ unsigned long collisions;
++
++ /* detailed rx_errors: */
++ unsigned long rx_length_errors;
++ unsigned long rx_over_errors; /* receiver ring buff overflow */
++ unsigned long rx_crc_errors; /* recved pkt with crc error */
++ unsigned long rx_frame_errors; /* recv'd frame alignment error */
++ unsigned long rx_fifo_errors; /* recv'r fifo overrun */
++ unsigned long rx_missed_errors; /* receiver missed packet */
++
++ /* detailed tx_errors */
++ unsigned long tx_aborted_errors;
++ unsigned long tx_carrier_errors;
++ unsigned long tx_fifo_errors;
++ unsigned long tx_heartbeat_errors;
++ unsigned long tx_window_errors;
++
++ /* for cslip etc */
++ unsigned long rx_compressed;
++ unsigned long tx_compressed;
++};
++
++
++/* Private data structure used for ethernet device */
++struct mv64460_eth_priv {
++ unsigned int port_num;
++ struct net_device_stats *stats;
++
++ /* to buffer area aligned */
++ char * p_eth_tx_buffer[MV64460_TX_QUEUE_SIZE+1]; /*pointers to alligned tx buffs in memory space */
++ char * p_eth_rx_buffer[MV64460_RX_QUEUE_SIZE+1]; /*pointers to allinged rx buffs in memory space */
++
++ /* Size of Tx Ring per queue */
++ unsigned int tx_ring_size [MAX_TX_QUEUE_NUM];
++
++ /* Size of Rx Ring per queue */
++ unsigned int rx_ring_size [MAX_RX_QUEUE_NUM];
++
++ /* Magic Number for Ethernet running */
++ unsigned int eth_running;
++
++ int first_init;
++};
++
++int mv64460_eth_init (struct eth_device *dev);
++int mv64460_eth_stop (struct eth_device *dev);
++int mv64460_eth_start_xmit (struct eth_device*, volatile void* packet, int length);
++/* return db64460_eth0_poll(); */
++
++int mv64460_eth_open (struct eth_device *dev);
++
++
++/*************************************************************************
++**************************************************************************
++**************************************************************************
++* The second part is the low level driver of the gigE ethernet ports. *
++**************************************************************************
++**************************************************************************
++*************************************************************************/
++
++
++/********************************************************************************
++ * Header File for : MV-643xx network interface header
++ *
++ * DESCRIPTION:
++ * This header file contains macros typedefs and function declaration for
++ * the Marvell Gig Bit Ethernet Controller.
++ *
++ * DEPENDENCIES:
++ * None.
++ *
++ *******************************************************************************/
++
++
++#ifdef CONFIG_SPECIAL_CONSISTENT_MEMORY
++#ifdef CONFIG_MV64460_SRAM_CACHEABLE
++/* In case SRAM is cacheable but not cache coherent */
++#define D_CACHE_FLUSH_LINE(addr, offset) \
++{ \
++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \
++}
++#else
++/* In case SRAM is cache coherent or non-cacheable */
++#define D_CACHE_FLUSH_LINE(addr, offset) ;
++#endif
++#else
++#ifdef CONFIG_NOT_COHERENT_CACHE
++/* In case of descriptors on DDR but not cache coherent */
++#define D_CACHE_FLUSH_LINE(addr, offset) \
++{ \
++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \
++}
++#else
++/* In case of descriptors on DDR and cache coherent */
++#define D_CACHE_FLUSH_LINE(addr, offset) ;
++#endif /* CONFIG_NOT_COHERENT_CACHE */
++#endif /* CONFIG_SPECIAL_CONSISTENT_MEMORY */
++
++
++#define CPU_PIPE_FLUSH \
++{ \
++ __asm__ __volatile__ ("eieio"); \
++}
++
++
++/* defines */
++
++/* Default port configuration value */
++#define PORT_CONFIG_VALUE \
++ ETH_UNICAST_NORMAL_MODE | \
++ ETH_DEFAULT_RX_QUEUE_0 | \
++ ETH_DEFAULT_RX_ARP_QUEUE_0 | \
++ ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP | \
++ ETH_RECEIVE_BC_IF_IP | \
++ ETH_RECEIVE_BC_IF_ARP | \
++ ETH_CAPTURE_TCP_FRAMES_DIS | \
++ ETH_CAPTURE_UDP_FRAMES_DIS | \
++ ETH_DEFAULT_RX_TCP_QUEUE_0 | \
++ ETH_DEFAULT_RX_UDP_QUEUE_0 | \
++ ETH_DEFAULT_RX_BPDU_QUEUE_0
++
++/* Default port extend configuration value */
++#define PORT_CONFIG_EXTEND_VALUE \
++ ETH_SPAN_BPDU_PACKETS_AS_NORMAL | \
++ ETH_PARTITION_DISABLE
++
++
++/* Default sdma control value */
++#ifdef CONFIG_NOT_COHERENT_CACHE
++#define PORT_SDMA_CONFIG_VALUE \
++ ETH_RX_BURST_SIZE_16_64BIT | \
++ GT_ETH_IPG_INT_RX(0) | \
++ ETH_TX_BURST_SIZE_16_64BIT;
++#else
++#define PORT_SDMA_CONFIG_VALUE \
++ ETH_RX_BURST_SIZE_4_64BIT | \
++ GT_ETH_IPG_INT_RX(0) | \
++ ETH_TX_BURST_SIZE_4_64BIT;
++#endif
++
++#define GT_ETH_IPG_INT_RX(value) \
++ ((value & 0x3fff) << 8)
++
++/* Default port serial control value */
++#define PORT_SERIAL_CONTROL_VALUE \
++ ETH_FORCE_LINK_PASS | \
++ ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \
++ ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL | \
++ ETH_ADV_SYMMETRIC_FLOW_CTRL | \
++ ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX | \
++ ETH_FORCE_BP_MODE_NO_JAM | \
++ BIT9 | \
++ ETH_DO_NOT_FORCE_LINK_FAIL | \
++ ETH_RETRANSMIT_16_ETTEMPTS | \
++ ETH_ENABLE_AUTO_NEG_SPEED_GMII | \
++ ETH_DTE_ADV_0 | \
++ ETH_DISABLE_AUTO_NEG_BYPASS | \
++ ETH_AUTO_NEG_NO_CHANGE | \
++ ETH_MAX_RX_PACKET_1552BYTE | \
++ ETH_CLR_EXT_LOOPBACK | \
++ ETH_SET_FULL_DUPLEX_MODE | \
++ ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX;
++
++#define RX_BUFFER_MAX_SIZE 0xFFFF
++#define TX_BUFFER_MAX_SIZE 0xFFFF /* Buffer are limited to 64k */
++
++#define RX_BUFFER_MIN_SIZE 0x8
++#define TX_BUFFER_MIN_SIZE 0x8
++
++/* Tx WRR confoguration macros */
++#define PORT_MAX_TRAN_UNIT 0x24 /* MTU register (default) 9KByte */
++#define PORT_MAX_TOKEN_BUCKET_SIZE 0x_fFFF /* PMTBS register (default) */
++#define PORT_TOKEN_RATE 1023 /* PTTBRC register (default) */
++
++/* MAC accepet/reject macros */
++#define ACCEPT_MAC_ADDR 0
++#define REJECT_MAC_ADDR 1
++
++/* Size of a Tx/Rx descriptor used in chain list data structure */
++#define RX_DESC_ALIGNED_SIZE 0x20
++#define TX_DESC_ALIGNED_SIZE 0x20
++
++/* An offest in Tx descriptors to store data for buffers less than 8 Bytes */
++#define TX_BUF_OFFSET_IN_DESC 0x18
++/* Buffer offset from buffer pointer */
++#define RX_BUF_OFFSET 0x2
++
++/* Gap define */
++#define ETH_BAR_GAP 0x8
++#define ETH_SIZE_REG_GAP 0x8
++#define ETH_HIGH_ADDR_REMAP_REG_GAP 0x4
++#define ETH_PORT_ACCESS_CTRL_GAP 0x4
++
++/* Gigabit Ethernet Unit Global Registers */
++
++/* MIB Counters register definitions */
++#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0
++#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4
++#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8
++#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc
++#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10
++#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14
++#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18
++#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c
++#define ETH_MIB_FRAMES_64_OCTETS 0x20
++#define ETH_MIB_FRAMES_65_TO_127_OCTETS 0x24
++#define ETH_MIB_FRAMES_128_TO_255_OCTETS 0x28
++#define ETH_MIB_FRAMES_256_TO_511_OCTETS 0x2c
++#define ETH_MIB_FRAMES_512_TO_1023_OCTETS 0x30
++#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS 0x34
++#define ETH_MIB_GOOD_OCTETS_SENT_LOW 0x38
++#define ETH_MIB_GOOD_OCTETS_SENT_HIGH 0x3c
++#define ETH_MIB_GOOD_FRAMES_SENT 0x40
++#define ETH_MIB_EXCESSIVE_COLLISION 0x44
++#define ETH_MIB_MULTICAST_FRAMES_SENT 0x48
++#define ETH_MIB_BROADCAST_FRAMES_SENT 0x4c
++#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED 0x50
++#define ETH_MIB_FC_SENT 0x54
++#define ETH_MIB_GOOD_FC_RECEIVED 0x58
++#define ETH_MIB_BAD_FC_RECEIVED 0x5c
++#define ETH_MIB_UNDERSIZE_RECEIVED 0x60
++#define ETH_MIB_FRAGMENTS_RECEIVED 0x64
++#define ETH_MIB_OVERSIZE_RECEIVED 0x68
++#define ETH_MIB_JABBER_RECEIVED 0x6c
++#define ETH_MIB_MAC_RECEIVE_ERROR 0x70
++#define ETH_MIB_BAD_CRC_EVENT 0x74
++#define ETH_MIB_COLLISION 0x78
++#define ETH_MIB_LATE_COLLISION 0x7c
++
++/* Port serial status reg (PSR) */
++#define ETH_INTERFACE_GMII_MII 0
++#define ETH_INTERFACE_PCM BIT0
++#define ETH_LINK_IS_DOWN 0
++#define ETH_LINK_IS_UP BIT1
++#define ETH_PORT_AT_HALF_DUPLEX 0
++#define ETH_PORT_AT_FULL_DUPLEX BIT2
++#define ETH_RX_FLOW_CTRL_DISABLED 0
++#define ETH_RX_FLOW_CTRL_ENBALED BIT3
++#define ETH_GMII_SPEED_100_10 0
++#define ETH_GMII_SPEED_1000 BIT4
++#define ETH_MII_SPEED_10 0
++#define ETH_MII_SPEED_100 BIT5
++#define ETH_NO_TX 0
++#define ETH_TX_IN_PROGRESS BIT7
++#define ETH_BYPASS_NO_ACTIVE 0
++#define ETH_BYPASS_ACTIVE BIT8
++#define ETH_PORT_NOT_AT_PARTITION_STATE 0
++#define ETH_PORT_AT_PARTITION_STATE BIT9
++#define ETH_PORT_TX_FIFO_NOT_EMPTY 0
++#define ETH_PORT_TX_FIFO_EMPTY BIT10
++
++
++/* These macros describes the Port configuration reg (Px_cR) bits */
++#define ETH_UNICAST_NORMAL_MODE 0
++#define ETH_UNICAST_PROMISCUOUS_MODE BIT0
++#define ETH_DEFAULT_RX_QUEUE_0 0
++#define ETH_DEFAULT_RX_QUEUE_1 BIT1
++#define ETH_DEFAULT_RX_QUEUE_2 BIT2
++#define ETH_DEFAULT_RX_QUEUE_3 (BIT2 | BIT1)
++#define ETH_DEFAULT_RX_QUEUE_4 BIT3
++#define ETH_DEFAULT_RX_QUEUE_5 (BIT3 | BIT1)
++#define ETH_DEFAULT_RX_QUEUE_6 (BIT3 | BIT2)
++#define ETH_DEFAULT_RX_QUEUE_7 (BIT3 | BIT2 | BIT1)
++#define ETH_DEFAULT_RX_ARP_QUEUE_0 0
++#define ETH_DEFAULT_RX_ARP_QUEUE_1 BIT4
++#define ETH_DEFAULT_RX_ARP_QUEUE_2 BIT5
++#define ETH_DEFAULT_RX_ARP_QUEUE_3 (BIT5 | BIT4)
++#define ETH_DEFAULT_RX_ARP_QUEUE_4 BIT6
++#define ETH_DEFAULT_RX_ARP_QUEUE_5 (BIT6 | BIT4)
++#define ETH_DEFAULT_RX_ARP_QUEUE_6 (BIT6 | BIT5)
++#define ETH_DEFAULT_RX_ARP_QUEUE_7 (BIT6 | BIT5 | BIT4)
++#define ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP 0
++#define ETH_REJECT_BC_IF_NOT_IP_OR_ARP BIT7
++#define ETH_RECEIVE_BC_IF_IP 0
++#define ETH_REJECT_BC_IF_IP BIT8
++#define ETH_RECEIVE_BC_IF_ARP 0
++#define ETH_REJECT_BC_IF_ARP BIT9
++#define ETH_TX_AM_NO_UPDATE_ERROR_SUMMARY BIT12
++#define ETH_CAPTURE_TCP_FRAMES_DIS 0
++#define ETH_CAPTURE_TCP_FRAMES_EN BIT14
++#define ETH_CAPTURE_UDP_FRAMES_DIS 0
++#define ETH_CAPTURE_UDP_FRAMES_EN BIT15
++#define ETH_DEFAULT_RX_TCP_QUEUE_0 0
++#define ETH_DEFAULT_RX_TCP_QUEUE_1 BIT16
++#define ETH_DEFAULT_RX_TCP_QUEUE_2 BIT17
++#define ETH_DEFAULT_RX_TCP_QUEUE_3 (BIT17 | BIT16)
++#define ETH_DEFAULT_RX_TCP_QUEUE_4 BIT18
++#define ETH_DEFAULT_RX_TCP_QUEUE_5 (BIT18 | BIT16)
++#define ETH_DEFAULT_RX_TCP_QUEUE_6 (BIT18 | BIT17)
++#define ETH_DEFAULT_RX_TCP_QUEUE_7 (BIT18 | BIT17 | BIT16)
++#define ETH_DEFAULT_RX_UDP_QUEUE_0 0
++#define ETH_DEFAULT_RX_UDP_QUEUE_1 BIT19
++#define ETH_DEFAULT_RX_UDP_QUEUE_2 BIT20
++#define ETH_DEFAULT_RX_UDP_QUEUE_3 (BIT20 | BIT19)
++#define ETH_DEFAULT_RX_UDP_QUEUE_4 (BIT21
++#define ETH_DEFAULT_RX_UDP_QUEUE_5 (BIT21 | BIT19)
++#define ETH_DEFAULT_RX_UDP_QUEUE_6 (BIT21 | BIT20)
++#define ETH_DEFAULT_RX_UDP_QUEUE_7 (BIT21 | BIT20 | BIT19)
++#define ETH_DEFAULT_RX_BPDU_QUEUE_0 0
++#define ETH_DEFAULT_RX_BPDU_QUEUE_1 BIT22
++#define ETH_DEFAULT_RX_BPDU_QUEUE_2 BIT23
++#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22)
++#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24
++#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22)
++#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23)
++#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22)
++
++
++/* These macros describes the Port configuration extend reg (Px_cXR) bits*/
++#define ETH_CLASSIFY_EN BIT0
++#define ETH_SPAN_BPDU_PACKETS_AS_NORMAL 0
++#define ETH_SPAN_BPDU_PACKETS_TO_RX_QUEUE_7 BIT1
++#define ETH_PARTITION_DISABLE 0
++#define ETH_PARTITION_ENABLE BIT2
++
++
++/* Tx/Rx queue command reg (RQCR/TQCR)*/
++#define ETH_QUEUE_0_ENABLE BIT0
++#define ETH_QUEUE_1_ENABLE BIT1
++#define ETH_QUEUE_2_ENABLE BIT2
++#define ETH_QUEUE_3_ENABLE BIT3
++#define ETH_QUEUE_4_ENABLE BIT4
++#define ETH_QUEUE_5_ENABLE BIT5
++#define ETH_QUEUE_6_ENABLE BIT6
++#define ETH_QUEUE_7_ENABLE BIT7
++#define ETH_QUEUE_0_DISABLE BIT8
++#define ETH_QUEUE_1_DISABLE BIT9
++#define ETH_QUEUE_2_DISABLE BIT10
++#define ETH_QUEUE_3_DISABLE BIT11
++#define ETH_QUEUE_4_DISABLE BIT12
++#define ETH_QUEUE_5_DISABLE BIT13
++#define ETH_QUEUE_6_DISABLE BIT14
++#define ETH_QUEUE_7_DISABLE BIT15
++
++/* These macros describes the Port Sdma configuration reg (SDCR) bits */
++#define ETH_RIFB BIT0
++#define ETH_RX_BURST_SIZE_1_64BIT 0
++#define ETH_RX_BURST_SIZE_2_64BIT BIT1
++#define ETH_RX_BURST_SIZE_4_64BIT BIT2
++#define ETH_RX_BURST_SIZE_8_64BIT (BIT2 | BIT1)
++#define ETH_RX_BURST_SIZE_16_64BIT BIT3
++#define ETH_BLM_RX_NO_SWAP BIT4
++#define ETH_BLM_RX_BYTE_SWAP 0
++#define ETH_BLM_TX_NO_SWAP BIT5
++#define ETH_BLM_TX_BYTE_SWAP 0
++#define ETH_DESCRIPTORS_BYTE_SWAP BIT6
++#define ETH_DESCRIPTORS_NO_SWAP 0
++#define ETH_TX_BURST_SIZE_1_64BIT 0
++#define ETH_TX_BURST_SIZE_2_64BIT BIT22
++#define ETH_TX_BURST_SIZE_4_64BIT BIT23
++#define ETH_TX_BURST_SIZE_8_64BIT (BIT23 | BIT22)
++#define ETH_TX_BURST_SIZE_16_64BIT BIT24
++
++/* These macros describes the Port serial control reg (PSCR) bits */
++#define ETH_SERIAL_PORT_DISABLE 0
++#define ETH_SERIAL_PORT_ENABLE BIT0
++#define ETH_FORCE_LINK_PASS BIT1
++#define ETH_DO_NOT_FORCE_LINK_PASS 0
++#define ETH_ENABLE_AUTO_NEG_FOR_DUPLX 0
++#define ETH_DISABLE_AUTO_NEG_FOR_DUPLX BIT2
++#define ETH_ENABLE_AUTO_NEG_FOR_FLOW_CTRL 0
++#define ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL BIT3
++#define ETH_ADV_NO_FLOW_CTRL 0
++#define ETH_ADV_SYMMETRIC_FLOW_CTRL BIT4
++#define ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX 0
++#define ETH_FORCE_FC_MODE_TX_PAUSE_DIS BIT5
++#define ETH_FORCE_BP_MODE_NO_JAM 0
++#define ETH_FORCE_BP_MODE_JAM_TX BIT7
++#define ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR BIT8
++#define ETH_FORCE_LINK_FAIL 0
++#define ETH_DO_NOT_FORCE_LINK_FAIL BIT10
++#define ETH_RETRANSMIT_16_ETTEMPTS 0
++#define ETH_RETRANSMIT_FOREVER BIT11
++#define ETH_DISABLE_AUTO_NEG_SPEED_GMII BIT13
++#define ETH_ENABLE_AUTO_NEG_SPEED_GMII 0
++#define ETH_DTE_ADV_0 0
++#define ETH_DTE_ADV_1 BIT14
++#define ETH_DISABLE_AUTO_NEG_BYPASS 0
++#define ETH_ENABLE_AUTO_NEG_BYPASS BIT15
++#define ETH_AUTO_NEG_NO_CHANGE 0
++#define ETH_RESTART_AUTO_NEG BIT16
++#define ETH_MAX_RX_PACKET_1518BYTE 0
++#define ETH_MAX_RX_PACKET_1522BYTE BIT17
++#define ETH_MAX_RX_PACKET_1552BYTE BIT18
++#define ETH_MAX_RX_PACKET_9022BYTE (BIT18 | BIT17)
++#define ETH_MAX_RX_PACKET_9192BYTE BIT19
++#define ETH_MAX_RX_PACKET_9700BYTE (BIT19 | BIT17)
++#define ETH_SET_EXT_LOOPBACK BIT20
++#define ETH_CLR_EXT_LOOPBACK 0
++#define ETH_SET_FULL_DUPLEX_MODE BIT21
++#define ETH_SET_HALF_DUPLEX_MODE 0
++#define ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX BIT22
++#define ETH_DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX 0
++#define ETH_SET_GMII_SPEED_TO_10_100 0
++#define ETH_SET_GMII_SPEED_TO_1000 BIT23
++#define ETH_SET_MII_SPEED_TO_10 0
++#define ETH_SET_MII_SPEED_TO_100 BIT24
++
++
++/* SMI reg */
++#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */
++#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */
++#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */
++#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */
++
++/* SDMA command status fields macros */
++
++/* Tx & Rx descriptors status */
++#define ETH_ERROR_SUMMARY (BIT0)
++
++/* Tx & Rx descriptors command */
++#define ETH_BUFFER_OWNED_BY_DMA (BIT31)
++
++/* Tx descriptors status */
++#define ETH_LC_ERROR (0 )
++#define ETH_UR_ERROR (BIT1 )
++#define ETH_RL_ERROR (BIT2 )
++#define ETH_LLC_SNAP_FORMAT (BIT9 )
++
++/* Rx descriptors status */
++#define ETH_CRC_ERROR (0 )
++#define ETH_OVERRUN_ERROR (BIT1 )
++#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 )
++#define ETH_RESOURCE_ERROR ((BIT2 | BIT1))
++#define ETH_VLAN_TAGGED (BIT19)
++#define ETH_BPDU_FRAME (BIT20)
++#define ETH_TCP_FRAME_OVER_IP_V_4 (0 )
++#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21)
++#define ETH_OTHER_FRAME_TYPE (BIT22)
++#define ETH_LAYER_2_IS_ETH_V_2 (BIT23)
++#define ETH_FRAME_TYPE_IP_V_4 (BIT24)
++#define ETH_FRAME_HEADER_OK (BIT25)
++#define ETH_RX_LAST_DESC (BIT26)
++#define ETH_RX_FIRST_DESC (BIT27)
++#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28)
++#define ETH_RX_ENABLE_INTERRUPT (BIT29)
++#define ETH_LAYER_4_CHECKSUM_OK (BIT30)
++
++/* Rx descriptors byte count */
++#define ETH_FRAME_FRAGMENTED (BIT2)
++
++/* Tx descriptors command */
++#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10)
++#define ETH_FRAME_SET_TO_VLAN (BIT15)
++#define ETH_TCP_FRAME (0 )
++#define ETH_UDP_FRAME (BIT16)
++#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17)
++#define ETH_GEN_IP_V_4_CHECKSUM (BIT18)
++#define ETH_ZERO_PADDING (BIT19)
++#define ETH_TX_LAST_DESC (BIT20)
++#define ETH_TX_FIRST_DESC (BIT21)
++#define ETH_GEN_CRC (BIT22)
++#define ETH_TX_ENABLE_INTERRUPT (BIT23)
++#define ETH_AUTO_MODE (BIT30)
++
++/* Address decode parameters */
++/* Ethernet Base Address Register bits */
++#define EBAR_TARGET_DRAM 0x00000000
++#define EBAR_TARGET_DEVICE 0x00000001
++#define EBAR_TARGET_CBS 0x00000002
++#define EBAR_TARGET_PCI0 0x00000003
++#define EBAR_TARGET_PCI1 0x00000004
++#define EBAR_TARGET_CUNIT 0x00000005
++#define EBAR_TARGET_AUNIT 0x00000006
++#define EBAR_TARGET_GUNIT 0x00000007
++
++/* Window attributes */
++#define EBAR_ATTR_DRAM_CS0 0x00000E00
++#define EBAR_ATTR_DRAM_CS1 0x00000D00
++#define EBAR_ATTR_DRAM_CS2 0x00000B00
++#define EBAR_ATTR_DRAM_CS3 0x00000700
++
++/* DRAM Target interface */
++#define EBAR_ATTR_DRAM_NO_CACHE_COHERENCY 0x00000000
++#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WT 0x00001000
++#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WB 0x00002000
++
++/* Device Bus Target interface */
++#define EBAR_ATTR_DEVICE_DEVCS0 0x00001E00
++#define EBAR_ATTR_DEVICE_DEVCS1 0x00001D00
++#define EBAR_ATTR_DEVICE_DEVCS2 0x00001B00
++#define EBAR_ATTR_DEVICE_DEVCS3 0x00001700
++#define EBAR_ATTR_DEVICE_BOOTCS3 0x00000F00
++
++/* PCI Target interface */
++#define EBAR_ATTR_PCI_BYTE_SWAP 0x00000000
++#define EBAR_ATTR_PCI_NO_SWAP 0x00000100
++#define EBAR_ATTR_PCI_BYTE_WORD_SWAP 0x00000200
++#define EBAR_ATTR_PCI_WORD_SWAP 0x00000300
++#define EBAR_ATTR_PCI_NO_SNOOP_NOT_ASSERT 0x00000000
++#define EBAR_ATTR_PCI_NO_SNOOP_ASSERT 0x00000400
++#define EBAR_ATTR_PCI_IO_SPACE 0x00000000
++#define EBAR_ATTR_PCI_MEMORY_SPACE 0x00000800
++#define EBAR_ATTR_PCI_REQ64_FORCE 0x00000000
++#define EBAR_ATTR_PCI_REQ64_SIZE 0x00001000
++
++/* CPU 60x bus or internal SRAM interface */
++#define EBAR_ATTR_CBS_SRAM_BLOCK0 0x00000000
++#define EBAR_ATTR_CBS_SRAM_BLOCK1 0x00000100
++#define EBAR_ATTR_CBS_SRAM 0x00000000
++#define EBAR_ATTR_CBS_CPU_BUS 0x00000800
++
++/* Window access control */
++#define EWIN_ACCESS_NOT_ALLOWED 0
++#define EWIN_ACCESS_READ_ONLY BIT0
++#define EWIN_ACCESS_FULL (BIT1 | BIT0)
++#define EWIN0_ACCESS_MASK 0x0003
++#define EWIN1_ACCESS_MASK 0x000C
++#define EWIN2_ACCESS_MASK 0x0030
++#define EWIN3_ACCESS_MASK 0x00C0
++
++/* typedefs */
++
++typedef enum _eth_port
++{
++ ETH_0 = 0,
++ ETH_1 = 1,
++ ETH_2 = 2
++}ETH_PORT;
++
++typedef enum _eth_func_ret_status
++{
++ ETH_OK, /* Returned as expected. */
++ ETH_ERROR, /* Fundamental error. */
++ ETH_RETRY, /* Could not process request. Try later. */
++ ETH_END_OF_JOB, /* Ring has nothing to process. */
++ ETH_QUEUE_FULL, /* Ring resource error. */
++ ETH_QUEUE_LAST_RESOURCE /* Ring resources about to exhaust. */
++}ETH_FUNC_RET_STATUS;
++
++typedef enum _eth_queue
++{
++ ETH_Q0 = 0,
++ ETH_Q1 = 1,
++ ETH_Q2 = 2,
++ ETH_Q3 = 3,
++ ETH_Q4 = 4,
++ ETH_Q5 = 5,
++ ETH_Q6 = 6,
++ ETH_Q7 = 7
++} ETH_QUEUE;
++
++typedef enum _addr_win
++{
++ ETH_WIN0,
++ ETH_WIN1,
++ ETH_WIN2,
++ ETH_WIN3,
++ ETH_WIN4,
++ ETH_WIN5
++} ETH_ADDR_WIN;
++
++typedef enum _eth_target
++{
++ ETH_TARGET_DRAM ,
++ ETH_TARGET_DEVICE,
++ ETH_TARGET_CBS ,
++ ETH_TARGET_PCI0 ,
++ ETH_TARGET_PCI1
++}ETH_TARGET;
++
++typedef struct _eth_rx_desc
++{
++ unsigned short byte_cnt ; /* Descriptor buffer byte count */
++ unsigned short buf_size ; /* Buffer size */
++ unsigned int cmd_sts ; /* Descriptor command status */
++ unsigned int next_desc_ptr; /* Next descriptor pointer */
++ unsigned int buf_ptr ; /* Descriptor buffer pointer */
++ unsigned int return_info ; /* User resource return information */
++} ETH_RX_DESC;
++
++
++typedef struct _eth_tx_desc
++{
++ unsigned short byte_cnt ; /* Descriptor buffer byte count */
++ unsigned short l4i_chk ; /* CPU provided TCP Checksum */
++ unsigned int cmd_sts ; /* Descriptor command status */
++ unsigned int next_desc_ptr; /* Next descriptor pointer */
++ unsigned int buf_ptr ; /* Descriptor buffer pointer */
++ unsigned int return_info ; /* User resource return information */
++} ETH_TX_DESC;
++
++/* Unified struct for Rx and Tx operations. The user is not required to */
++/* be familier with neither Tx nor Rx descriptors. */
++typedef struct _pkt_info
++{
++ unsigned short byte_cnt ; /* Descriptor buffer byte count */
++ unsigned short l4i_chk ; /* Tx CPU provided TCP Checksum */
++ unsigned int cmd_sts ; /* Descriptor command status */
++ unsigned int buf_ptr ; /* Descriptor buffer pointer */
++ unsigned int return_info ; /* User resource return information */
++} PKT_INFO;
++
++
++typedef struct _eth_win_param
++{
++ ETH_ADDR_WIN win; /* Window number. See ETH_ADDR_WIN enum */
++ ETH_TARGET target; /* System targets. See ETH_TARGET enum */
++ unsigned short attributes; /* BAR attributes. See above macros. */
++ unsigned int base_addr; /* Window base address in unsigned int form */
++ unsigned int high_addr; /* Window high address in unsigned int form */
++ unsigned int size; /* Size in MBytes. Must be % 64Kbyte. */
++ bool enable; /* Enable/disable access to the window. */
++ unsigned short access_ctrl; /* Access ctrl register. see above macros */
++} ETH_WIN_PARAM;
++
++
++/* Ethernet port specific infomation */
++
++typedef struct _eth_port_ctrl
++{
++ ETH_PORT port_num; /* User Ethernet port number */
++ int port_phy_addr; /* User phy address of Ethrnet port */
++ unsigned char port_mac_addr[6]; /* User defined port MAC address. */
++ unsigned int port_config; /* User port configuration value */
++ unsigned int port_config_extend; /* User port config extend value */
++ unsigned int port_sdma_config; /* User port SDMA config value */
++ unsigned int port_serial_control; /* User port serial control value */
++ unsigned int port_tx_queue_command; /* Port active Tx queues summary */
++ unsigned int port_rx_queue_command; /* Port active Rx queues summary */
++
++ /* User function to cast virtual address to CPU bus address */
++ unsigned int (*port_virt_to_phys)(unsigned int addr);
++ /* User scratch pad for user specific data structures */
++ void *port_private;
++
++ bool rx_resource_err[MAX_RX_QUEUE_NUM]; /* Rx ring resource error flag */
++ bool tx_resource_err[MAX_TX_QUEUE_NUM]; /* Tx ring resource error flag */
++
++ /* Tx/Rx rings managment indexes fields. For driver use */
++
++ /* Next available Rx resource */
++ volatile ETH_RX_DESC *p_rx_curr_desc_q[MAX_RX_QUEUE_NUM];
++ /* Returning Rx resource */
++ volatile ETH_RX_DESC *p_rx_used_desc_q[MAX_RX_QUEUE_NUM];
++
++ /* Next available Tx resource */
++ volatile ETH_TX_DESC *p_tx_curr_desc_q[MAX_TX_QUEUE_NUM];
++ /* Returning Tx resource */
++ volatile ETH_TX_DESC *p_tx_used_desc_q[MAX_TX_QUEUE_NUM];
++ /* An extra Tx index to support transmit of multiple buffers per packet */
++ volatile ETH_TX_DESC *p_tx_first_desc_q[MAX_TX_QUEUE_NUM];
++
++ /* Tx/Rx rings size and base variables fields. For driver use */
++
++ volatile ETH_RX_DESC *p_rx_desc_area_base[MAX_RX_QUEUE_NUM];
++ unsigned int rx_desc_area_size[MAX_RX_QUEUE_NUM];
++ char *p_rx_buffer_base[MAX_RX_QUEUE_NUM];
++
++ volatile ETH_TX_DESC *p_tx_desc_area_base[MAX_TX_QUEUE_NUM];
++ unsigned int tx_desc_area_size[MAX_TX_QUEUE_NUM];
++ char *p_tx_buffer_base[MAX_TX_QUEUE_NUM];
++
++} ETH_PORT_INFO;
++
++
++/* ethernet.h API list */
++
++/* Port operation control routines */
++static void eth_port_init (ETH_PORT_INFO *p_eth_port_ctrl);
++static void eth_port_reset(ETH_PORT eth_port_num);
++static bool eth_port_start(ETH_PORT_INFO *p_eth_port_ctrl);
++
++
++/* Port MAC address routines */
++static void eth_port_uc_addr_set (ETH_PORT eth_port_num,
++ unsigned char *p_addr,
++ ETH_QUEUE queue);
++#if 0 /* FIXME */
++static void eth_port_mc_addr (ETH_PORT eth_port_num,
++ unsigned char *p_addr,
++ ETH_QUEUE queue,
++ int option);
++#endif
++
++/* PHY and MIB routines */
++static bool ethernet_phy_reset(ETH_PORT eth_port_num);
++
++static bool eth_port_write_smi_reg(ETH_PORT eth_port_num,
++ unsigned int phy_reg,
++ unsigned int value);
++
++static bool eth_port_read_smi_reg(ETH_PORT eth_port_num,
++ unsigned int phy_reg,
++ unsigned int* value);
++
++static void eth_clear_mib_counters(ETH_PORT eth_port_num);
++
++/* Port data flow control routines */
++static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ PKT_INFO *p_pkt_info);
++static ETH_FUNC_RET_STATUS eth_tx_return_desc(ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ PKT_INFO *p_pkt_info);
++static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ PKT_INFO *p_pkt_info);
++static ETH_FUNC_RET_STATUS eth_rx_return_buff(ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ PKT_INFO *p_pkt_info);
++
++
++static bool ether_init_tx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE tx_queue,
++ int tx_desc_num,
++ int tx_buff_size,
++ unsigned int tx_desc_base_addr,
++ unsigned int tx_buff_base_addr);
++
++static bool ether_init_rx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl,
++ ETH_QUEUE rx_queue,
++ int rx_desc_num,
++ int rx_buff_size,
++ unsigned int rx_desc_base_addr,
++ unsigned int rx_buff_base_addr);
++
++#endif /* MV64460_ETH_ */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_regs.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_regs.h
+--- u-boot-1.1.6/board/prodrive/p3mx/mv_regs.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_regs.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,1125 @@
++/*
++ * (C) Copyright 2003
++ * Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ * based on - Driver for MV64460X ethernet ports
++ * Copyright (C) 2002 rabeeh@galileo.co.il
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/********************************************************************************
++* gt64460r.h - GT-64460 Internal registers definition file.
++*
++* DESCRIPTION:
++* None.
++*
++* DEPENDENCIES:
++* None.
++*
++*******************************************************************************/
++
++#ifndef __INCmv_regsh
++#define __INCmv_regsh
++
++#define MV64460
++
++/* Supported by the Atlantis */
++#define MV64460_INCLUDE_PCI_1
++#define MV64460_INCLUDE_PCI_0_ARBITER
++#define MV64460_INCLUDE_PCI_1_ARBITER
++#define MV64460_INCLUDE_SNOOP_SUPPORT
++#define MV64460_INCLUDE_P2P
++#define MV64460_INCLUDE_ETH_PORT_2
++#define MV64460_INCLUDE_CPU_MAPPING
++#define MV64460_INCLUDE_MPSC
++
++/* Not supported features */
++#undef INCLUDE_CNTMR_4_7
++#undef INCLUDE_DMA_4_7
++
++/****************************************/
++/* Processor Address Space */
++/****************************************/
++
++/* DDR SDRAM BAR and size registers */
++
++#define MV64460_CS_0_BASE_ADDR 0x008
++#define MV64460_CS_0_SIZE 0x010
++#define MV64460_CS_1_BASE_ADDR 0x208
++#define MV64460_CS_1_SIZE 0x210
++#define MV64460_CS_2_BASE_ADDR 0x018
++#define MV64460_CS_2_SIZE 0x020
++#define MV64460_CS_3_BASE_ADDR 0x218
++#define MV64460_CS_3_SIZE 0x220
++
++/* Devices BAR and size registers */
++
++#define MV64460_DEV_CS0_BASE_ADDR 0x028
++#define MV64460_DEV_CS0_SIZE 0x030
++#define MV64460_DEV_CS1_BASE_ADDR 0x228
++#define MV64460_DEV_CS1_SIZE 0x230
++#define MV64460_DEV_CS2_BASE_ADDR 0x248
++#define MV64460_DEV_CS2_SIZE 0x250
++#define MV64460_DEV_CS3_BASE_ADDR 0x038
++#define MV64460_DEV_CS3_SIZE 0x040
++#define MV64460_BOOTCS_BASE_ADDR 0x238
++#define MV64460_BOOTCS_SIZE 0x240
++
++/* PCI 0 BAR and size registers */
++
++#define MV64460_PCI_0_IO_BASE_ADDR 0x048
++#define MV64460_PCI_0_IO_SIZE 0x050
++#define MV64460_PCI_0_MEMORY0_BASE_ADDR 0x058
++#define MV64460_PCI_0_MEMORY0_SIZE 0x060
++#define MV64460_PCI_0_MEMORY1_BASE_ADDR 0x080
++#define MV64460_PCI_0_MEMORY1_SIZE 0x088
++#define MV64460_PCI_0_MEMORY2_BASE_ADDR 0x258
++#define MV64460_PCI_0_MEMORY2_SIZE 0x260
++#define MV64460_PCI_0_MEMORY3_BASE_ADDR 0x280
++#define MV64460_PCI_0_MEMORY3_SIZE 0x288
++
++/* PCI 1 BAR and size registers */
++#define MV64460_PCI_1_IO_BASE_ADDR 0x090
++#define MV64460_PCI_1_IO_SIZE 0x098
++#define MV64460_PCI_1_MEMORY0_BASE_ADDR 0x0a0
++#define MV64460_PCI_1_MEMORY0_SIZE 0x0a8
++#define MV64460_PCI_1_MEMORY1_BASE_ADDR 0x0b0
++#define MV64460_PCI_1_MEMORY1_SIZE 0x0b8
++#define MV64460_PCI_1_MEMORY2_BASE_ADDR 0x2a0
++#define MV64460_PCI_1_MEMORY2_SIZE 0x2a8
++#define MV64460_PCI_1_MEMORY3_BASE_ADDR 0x2b0
++#define MV64460_PCI_1_MEMORY3_SIZE 0x2b8
++
++/* SRAM base address */
++#define MV64460_INTEGRATED_SRAM_BASE_ADDR 0x268
++
++/* internal registers space base address */
++#define MV64460_INTERNAL_SPACE_BASE_ADDR 0x068
++
++/* Enables the CS , DEV_CS , PCI 0 and PCI 1
++ windows above */
++#define MV64460_BASE_ADDR_ENABLE 0x278
++
++/****************************************/
++/* PCI remap registers */
++/****************************************/
++ /* PCI 0 */
++#define MV64460_PCI_0_IO_ADDR_REMAP 0x0f0
++#define MV64460_PCI_0_MEMORY0_LOW_ADDR_REMAP 0x0f8
++#define MV64460_PCI_0_MEMORY0_HIGH_ADDR_REMAP 0x320
++#define MV64460_PCI_0_MEMORY1_LOW_ADDR_REMAP 0x100
++#define MV64460_PCI_0_MEMORY1_HIGH_ADDR_REMAP 0x328
++#define MV64460_PCI_0_MEMORY2_LOW_ADDR_REMAP 0x2f8
++#define MV64460_PCI_0_MEMORY2_HIGH_ADDR_REMAP 0x330
++#define MV64460_PCI_0_MEMORY3_LOW_ADDR_REMAP 0x300
++#define MV64460_PCI_0_MEMORY3_HIGH_ADDR_REMAP 0x338
++ /* PCI 1 */
++#define MV64460_PCI_1_IO_ADDR_REMAP 0x108
++#define MV64460_PCI_1_MEMORY0_LOW_ADDR_REMAP 0x110
++#define MV64460_PCI_1_MEMORY0_HIGH_ADDR_REMAP 0x340
++#define MV64460_PCI_1_MEMORY1_LOW_ADDR_REMAP 0x118
++#define MV64460_PCI_1_MEMORY1_HIGH_ADDR_REMAP 0x348
++#define MV64460_PCI_1_MEMORY2_LOW_ADDR_REMAP 0x310
++#define MV64460_PCI_1_MEMORY2_HIGH_ADDR_REMAP 0x350
++#define MV64460_PCI_1_MEMORY3_LOW_ADDR_REMAP 0x318
++#define MV64460_PCI_1_MEMORY3_HIGH_ADDR_REMAP 0x358
++
++#define MV64460_CPU_PCI_0_HEADERS_RETARGET_CONTROL 0x3b0
++#define MV64460_CPU_PCI_0_HEADERS_RETARGET_BASE 0x3b8
++#define MV64460_CPU_PCI_1_HEADERS_RETARGET_CONTROL 0x3c0
++#define MV64460_CPU_PCI_1_HEADERS_RETARGET_BASE 0x3c8
++#define MV64460_CPU_GE_HEADERS_RETARGET_CONTROL 0x3d0
++#define MV64460_CPU_GE_HEADERS_RETARGET_BASE 0x3d8
++#define MV64460_CPU_IDMA_HEADERS_RETARGET_CONTROL 0x3e0
++#define MV64460_CPU_IDMA_HEADERS_RETARGET_BASE 0x3e8
++
++/****************************************/
++/* CPU Control Registers */
++/****************************************/
++
++#define MV64460_CPU_CONFIG 0x000
++#define MV64460_CPU_MODE 0x120
++#define MV64460_CPU_MASTER_CONTROL 0x160
++#define MV64460_CPU_CROSS_BAR_CONTROL_LOW 0x150
++#define MV64460_CPU_CROSS_BAR_CONTROL_HIGH 0x158
++#define MV64460_CPU_CROSS_BAR_TIMEOUT 0x168
++
++/****************************************/
++/* SMP RegisterS */
++/****************************************/
++
++#define MV64460_SMP_WHO_AM_I 0x200
++#define MV64460_SMP_CPU0_DOORBELL 0x214
++#define MV64460_SMP_CPU0_DOORBELL_CLEAR 0x21C
++#define MV64460_SMP_CPU1_DOORBELL 0x224
++#define MV64460_SMP_CPU1_DOORBELL_CLEAR 0x22C
++#define MV64460_SMP_CPU0_DOORBELL_MASK 0x234
++#define MV64460_SMP_CPU1_DOORBELL_MASK 0x23C
++#define MV64460_SMP_SEMAPHOR0 0x244
++#define MV64460_SMP_SEMAPHOR1 0x24c
++#define MV64460_SMP_SEMAPHOR2 0x254
++#define MV64460_SMP_SEMAPHOR3 0x25c
++#define MV64460_SMP_SEMAPHOR4 0x264
++#define MV64460_SMP_SEMAPHOR5 0x26c
++#define MV64460_SMP_SEMAPHOR6 0x274
++#define MV64460_SMP_SEMAPHOR7 0x27c
++
++/****************************************/
++/* CPU Sync Barrier Register */
++/****************************************/
++
++#define MV64460_CPU_0_SYNC_BARRIER_TRIGGER 0x0c0
++#define MV64460_CPU_0_SYNC_BARRIER_VIRTUAL 0x0c8
++#define MV64460_CPU_1_SYNC_BARRIER_TRIGGER 0x0d0
++#define MV64460_CPU_1_SYNC_BARRIER_VIRTUAL 0x0d8
++
++/****************************************/
++/* CPU Access Protect */
++/****************************************/
++
++#define MV64460_CPU_PROTECT_WINDOW_0_BASE_ADDR 0x180
++#define MV64460_CPU_PROTECT_WINDOW_0_SIZE 0x188
++#define MV64460_CPU_PROTECT_WINDOW_1_BASE_ADDR 0x190
++#define MV64460_CPU_PROTECT_WINDOW_1_SIZE 0x198
++#define MV64460_CPU_PROTECT_WINDOW_2_BASE_ADDR 0x1a0
++#define MV64460_CPU_PROTECT_WINDOW_2_SIZE 0x1a8
++#define MV64460_CPU_PROTECT_WINDOW_3_BASE_ADDR 0x1b0
++#define MV64460_CPU_PROTECT_WINDOW_3_SIZE 0x1b8
++
++
++/****************************************/
++/* CPU Error Report */
++/****************************************/
++
++#define MV64460_CPU_ERROR_ADDR_LOW 0x070
++#define MV64460_CPU_ERROR_ADDR_HIGH 0x078
++#define MV64460_CPU_ERROR_DATA_LOW 0x128
++#define MV64460_CPU_ERROR_DATA_HIGH 0x130
++#define MV64460_CPU_ERROR_PARITY 0x138
++#define MV64460_CPU_ERROR_CAUSE 0x140
++#define MV64460_CPU_ERROR_MASK 0x148
++
++/****************************************/
++/* CPU Interface Debug Registers */
++/****************************************/
++
++#define MV64460_PUNIT_SLAVE_DEBUG_LOW 0x360
++#define MV64460_PUNIT_SLAVE_DEBUG_HIGH 0x368
++#define MV64460_PUNIT_MASTER_DEBUG_LOW 0x370
++#define MV64460_PUNIT_MASTER_DEBUG_HIGH 0x378
++#define MV64460_PUNIT_MMASK 0x3e4
++
++/****************************************/
++/* Integrated SRAM Registers */
++/****************************************/
++
++#define MV64460_SRAM_CONFIG 0x380
++#define MV64460_SRAM_TEST_MODE 0X3F4
++#define MV64460_SRAM_ERROR_CAUSE 0x388
++#define MV64460_SRAM_ERROR_ADDR 0x390
++#define MV64460_SRAM_ERROR_ADDR_HIGH 0X3F8
++#define MV64460_SRAM_ERROR_DATA_LOW 0x398
++#define MV64460_SRAM_ERROR_DATA_HIGH 0x3a0
++#define MV64460_SRAM_ERROR_DATA_PARITY 0x3a8
++
++/****************************************/
++/* SDRAM Configuration */
++/****************************************/
++
++#define MV64460_SDRAM_CONFIG 0x1400
++#define MV64460_D_UNIT_CONTROL_LOW 0x1404
++#define MV64460_D_UNIT_CONTROL_HIGH 0x1424
++#define MV64460_D_UNIT_MMASK 0x14B0
++#define MV64460_SDRAM_TIMING_CONTROL_LOW 0x1408
++#define MV64460_SDRAM_TIMING_CONTROL_HIGH 0x140c
++#define MV64460_SDRAM_ADDR_CONTROL 0x1410
++#define MV64460_SDRAM_OPEN_PAGES_CONTROL 0x1414
++#define MV64460_SDRAM_OPERATION 0x1418
++#define MV64460_SDRAM_MODE 0x141c
++#define MV64460_EXTENDED_DRAM_MODE 0x1420
++#define MV64460_SDRAM_CROSS_BAR_CONTROL_LOW 0x1430
++#define MV64460_SDRAM_CROSS_BAR_CONTROL_HIGH 0x1434
++#define MV64460_SDRAM_CROSS_BAR_TIMEOUT 0x1438
++#define MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION 0x14c0
++#define MV64460_SDRAM_DATA_PADS_CALIBRATION 0x14c4
++
++/****************************************/
++/* SDRAM Error Report */
++/****************************************/
++
++#define MV64460_SDRAM_ERROR_DATA_LOW 0x1444
++#define MV64460_SDRAM_ERROR_DATA_HIGH 0x1440
++#define MV64460_SDRAM_ERROR_ADDR 0x1450
++#define MV64460_SDRAM_RECEIVED_ECC 0x1448
++#define MV64460_SDRAM_CALCULATED_ECC 0x144c
++#define MV64460_SDRAM_ECC_CONTROL 0x1454
++#define MV64460_SDRAM_ECC_ERROR_COUNTER 0x1458
++
++/******************************************/
++/* Controlled Delay Line (CDL) Registers */
++/******************************************/
++
++#define MV64460_DFCDL_CONFIG0 0x1480
++#define MV64460_DFCDL_CONFIG1 0x1484
++#define MV64460_DLL_WRITE 0x1488
++#define MV64460_DLL_READ 0x148c
++#define MV64460_SRAM_ADDR 0x1490
++#define MV64460_SRAM_DATA0 0x1494
++#define MV64460_SRAM_DATA1 0x1498
++#define MV64460_SRAM_DATA2 0x149c
++#define MV64460_DFCL_PROBE 0x14a0
++
++/******************************************/
++/* Debug Registers */
++/******************************************/
++
++#define MV64460_DUNIT_DEBUG_LOW 0x1460
++#define MV64460_DUNIT_DEBUG_HIGH 0x1464
++#define MV64460_DUNIT_MMASK 0X1b40
++
++/****************************************/
++/* Device Parameters */
++/****************************************/
++
++#define MV64460_DEVICE_BANK0_PARAMETERS 0x45c
++#define MV64460_DEVICE_BANK1_PARAMETERS 0x460
++#define MV64460_DEVICE_BANK2_PARAMETERS 0x464
++#define MV64460_DEVICE_BANK3_PARAMETERS 0x468
++#define MV64460_DEVICE_BOOT_BANK_PARAMETERS 0x46c
++#define MV64460_DEVICE_INTERFACE_CONTROL 0x4c0
++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_CONTROL_LOW 0x4c8
++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_CONTROL_HIGH 0x4cc
++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_TIMEOUT 0x4c4
++
++/****************************************/
++/* Device interrupt registers */
++/****************************************/
++
++#define MV64460_DEVICE_INTERRUPT_CAUSE 0x4d0
++#define MV64460_DEVICE_INTERRUPT_MASK 0x4d4
++#define MV64460_DEVICE_ERROR_ADDR 0x4d8
++#define MV64460_DEVICE_ERROR_DATA 0x4dc
++#define MV64460_DEVICE_ERROR_PARITY 0x4e0
++
++/****************************************/
++/* Device debug registers */
++/****************************************/
++
++#define MV64460_DEVICE_DEBUG_LOW 0x4e4
++#define MV64460_DEVICE_DEBUG_HIGH 0x4e8
++#define MV64460_RUNIT_MMASK 0x4f0
++
++/****************************************/
++/* PCI Slave Address Decoding registers */
++/****************************************/
++
++#define MV64460_PCI_0_CS_0_BANK_SIZE 0xc08
++#define MV64460_PCI_1_CS_0_BANK_SIZE 0xc88
++#define MV64460_PCI_0_CS_1_BANK_SIZE 0xd08
++#define MV64460_PCI_1_CS_1_BANK_SIZE 0xd88
++#define MV64460_PCI_0_CS_2_BANK_SIZE 0xc0c
++#define MV64460_PCI_1_CS_2_BANK_SIZE 0xc8c
++#define MV64460_PCI_0_CS_3_BANK_SIZE 0xd0c
++#define MV64460_PCI_1_CS_3_BANK_SIZE 0xd8c
++#define MV64460_PCI_0_DEVCS_0_BANK_SIZE 0xc10
++#define MV64460_PCI_1_DEVCS_0_BANK_SIZE 0xc90
++#define MV64460_PCI_0_DEVCS_1_BANK_SIZE 0xd10
++#define MV64460_PCI_1_DEVCS_1_BANK_SIZE 0xd90
++#define MV64460_PCI_0_DEVCS_2_BANK_SIZE 0xd18
++#define MV64460_PCI_1_DEVCS_2_BANK_SIZE 0xd98
++#define MV64460_PCI_0_DEVCS_3_BANK_SIZE 0xc14
++#define MV64460_PCI_1_DEVCS_3_BANK_SIZE 0xc94
++#define MV64460_PCI_0_DEVCS_BOOT_BANK_SIZE 0xd14
++#define MV64460_PCI_1_DEVCS_BOOT_BANK_SIZE 0xd94
++#define MV64460_PCI_0_P2P_MEM0_BAR_SIZE 0xd1c
++#define MV64460_PCI_1_P2P_MEM0_BAR_SIZE 0xd9c
++#define MV64460_PCI_0_P2P_MEM1_BAR_SIZE 0xd20
++#define MV64460_PCI_1_P2P_MEM1_BAR_SIZE 0xda0
++#define MV64460_PCI_0_P2P_I_O_BAR_SIZE 0xd24
++#define MV64460_PCI_1_P2P_I_O_BAR_SIZE 0xda4
++#define MV64460_PCI_0_CPU_BAR_SIZE 0xd28
++#define MV64460_PCI_1_CPU_BAR_SIZE 0xda8
++#define MV64460_PCI_0_INTERNAL_SRAM_BAR_SIZE 0xe00
++#define MV64460_PCI_1_INTERNAL_SRAM_BAR_SIZE 0xe80
++#define MV64460_PCI_0_EXPANSION_ROM_BAR_SIZE 0xd2c
++#define MV64460_PCI_1_EXPANSION_ROM_BAR_SIZE 0xd9c
++#define MV64460_PCI_0_BASE_ADDR_REG_ENABLE 0xc3c
++#define MV64460_PCI_1_BASE_ADDR_REG_ENABLE 0xcbc
++#define MV64460_PCI_0_CS_0_BASE_ADDR_REMAP 0xc48
++#define MV64460_PCI_1_CS_0_BASE_ADDR_REMAP 0xcc8
++#define MV64460_PCI_0_CS_1_BASE_ADDR_REMAP 0xd48
++#define MV64460_PCI_1_CS_1_BASE_ADDR_REMAP 0xdc8
++#define MV64460_PCI_0_CS_2_BASE_ADDR_REMAP 0xc4c
++#define MV64460_PCI_1_CS_2_BASE_ADDR_REMAP 0xccc
++#define MV64460_PCI_0_CS_3_BASE_ADDR_REMAP 0xd4c
++#define MV64460_PCI_1_CS_3_BASE_ADDR_REMAP 0xdcc
++#define MV64460_PCI_0_CS_0_BASE_HIGH_ADDR_REMAP 0xF04
++#define MV64460_PCI_1_CS_0_BASE_HIGH_ADDR_REMAP 0xF84
++#define MV64460_PCI_0_CS_1_BASE_HIGH_ADDR_REMAP 0xF08
++#define MV64460_PCI_1_CS_1_BASE_HIGH_ADDR_REMAP 0xF88
++#define MV64460_PCI_0_CS_2_BASE_HIGH_ADDR_REMAP 0xF0C
++#define MV64460_PCI_1_CS_2_BASE_HIGH_ADDR_REMAP 0xF8C
++#define MV64460_PCI_0_CS_3_BASE_HIGH_ADDR_REMAP 0xF10
++#define MV64460_PCI_1_CS_3_BASE_HIGH_ADDR_REMAP 0xF90
++#define MV64460_PCI_0_DEVCS_0_BASE_ADDR_REMAP 0xc50
++#define MV64460_PCI_1_DEVCS_0_BASE_ADDR_REMAP 0xcd0
++#define MV64460_PCI_0_DEVCS_1_BASE_ADDR_REMAP 0xd50
++#define MV64460_PCI_1_DEVCS_1_BASE_ADDR_REMAP 0xdd0
++#define MV64460_PCI_0_DEVCS_2_BASE_ADDR_REMAP 0xd58
++#define MV64460_PCI_1_DEVCS_2_BASE_ADDR_REMAP 0xdd8
++#define MV64460_PCI_0_DEVCS_3_BASE_ADDR_REMAP 0xc54
++#define MV64460_PCI_1_DEVCS_3_BASE_ADDR_REMAP 0xcd4
++#define MV64460_PCI_0_DEVCS_BOOTCS_BASE_ADDR_REMAP 0xd54
++#define MV64460_PCI_1_DEVCS_BOOTCS_BASE_ADDR_REMAP 0xdd4
++#define MV64460_PCI_0_P2P_MEM0_BASE_ADDR_REMAP_LOW 0xd5c
++#define MV64460_PCI_1_P2P_MEM0_BASE_ADDR_REMAP_LOW 0xddc
++#define MV64460_PCI_0_P2P_MEM0_BASE_ADDR_REMAP_HIGH 0xd60
++#define MV64460_PCI_1_P2P_MEM0_BASE_ADDR_REMAP_HIGH 0xde0
++#define MV64460_PCI_0_P2P_MEM1_BASE_ADDR_REMAP_LOW 0xd64
++#define MV64460_PCI_1_P2P_MEM1_BASE_ADDR_REMAP_LOW 0xde4
++#define MV64460_PCI_0_P2P_MEM1_BASE_ADDR_REMAP_HIGH 0xd68
++#define MV64460_PCI_1_P2P_MEM1_BASE_ADDR_REMAP_HIGH 0xde8
++#define MV64460_PCI_0_P2P_I_O_BASE_ADDR_REMAP 0xd6c
++#define MV64460_PCI_1_P2P_I_O_BASE_ADDR_REMAP 0xdec
++#define MV64460_PCI_0_CPU_BASE_ADDR_REMAP_LOW 0xd70
++#define MV64460_PCI_1_CPU_BASE_ADDR_REMAP_LOW 0xdf0
++#define MV64460_PCI_0_CPU_BASE_ADDR_REMAP_HIGH 0xd74
++#define MV64460_PCI_1_CPU_BASE_ADDR_REMAP_HIGH 0xdf4
++#define MV64460_PCI_0_INTEGRATED_SRAM_BASE_ADDR_REMAP 0xf00
++#define MV64460_PCI_1_INTEGRATED_SRAM_BASE_ADDR_REMAP 0xf80
++#define MV64460_PCI_0_EXPANSION_ROM_BASE_ADDR_REMAP 0xf38
++#define MV64460_PCI_1_EXPANSION_ROM_BASE_ADDR_REMAP 0xfb8
++#define MV64460_PCI_0_ADDR_DECODE_CONTROL 0xd3c
++#define MV64460_PCI_1_ADDR_DECODE_CONTROL 0xdbc
++#define MV64460_PCI_0_HEADERS_RETARGET_CONTROL 0xF40
++#define MV64460_PCI_1_HEADERS_RETARGET_CONTROL 0xFc0
++#define MV64460_PCI_0_HEADERS_RETARGET_BASE 0xF44
++#define MV64460_PCI_1_HEADERS_RETARGET_BASE 0xFc4
++#define MV64460_PCI_0_HEADERS_RETARGET_HIGH 0xF48
++#define MV64460_PCI_1_HEADERS_RETARGET_HIGH 0xFc8
++
++/***********************************/
++/* PCI Control Register Map */
++/***********************************/
++
++#define MV64460_PCI_0_DLL_STATUS_AND_COMMAND 0x1d20
++#define MV64460_PCI_1_DLL_STATUS_AND_COMMAND 0x1da0
++#define MV64460_PCI_0_MPP_PADS_DRIVE_CONTROL 0x1d1C
++#define MV64460_PCI_1_MPP_PADS_DRIVE_CONTROL 0x1d9C
++#define MV64460_PCI_0_COMMAND 0xc00
++#define MV64460_PCI_1_COMMAND 0xc80
++#define MV64460_PCI_0_MODE 0xd00
++#define MV64460_PCI_1_MODE 0xd80
++#define MV64460_PCI_0_RETRY 0xc04
++#define MV64460_PCI_1_RETRY 0xc84
++#define MV64460_PCI_0_READ_BUFFER_DISCARD_TIMER 0xd04
++#define MV64460_PCI_1_READ_BUFFER_DISCARD_TIMER 0xd84
++#define MV64460_PCI_0_MSI_TRIGGER_TIMER 0xc38
++#define MV64460_PCI_1_MSI_TRIGGER_TIMER 0xcb8
++#define MV64460_PCI_0_ARBITER_CONTROL 0x1d00
++#define MV64460_PCI_1_ARBITER_CONTROL 0x1d80
++#define MV64460_PCI_0_CROSS_BAR_CONTROL_LOW 0x1d08
++#define MV64460_PCI_1_CROSS_BAR_CONTROL_LOW 0x1d88
++#define MV64460_PCI_0_CROSS_BAR_CONTROL_HIGH 0x1d0c
++#define MV64460_PCI_1_CROSS_BAR_CONTROL_HIGH 0x1d8c
++#define MV64460_PCI_0_CROSS_BAR_TIMEOUT 0x1d04
++#define MV64460_PCI_1_CROSS_BAR_TIMEOUT 0x1d84
++#define MV64460_PCI_0_SYNC_BARRIER_TRIGGER_REG 0x1D18
++#define MV64460_PCI_1_SYNC_BARRIER_TRIGGER_REG 0x1D98
++#define MV64460_PCI_0_SYNC_BARRIER_VIRTUAL_REG 0x1d10
++#define MV64460_PCI_1_SYNC_BARRIER_VIRTUAL_REG 0x1d90
++#define MV64460_PCI_0_P2P_CONFIG 0x1d14
++#define MV64460_PCI_1_P2P_CONFIG 0x1d94
++
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_0_LOW 0x1e00
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_0_HIGH 0x1e04
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_0 0x1e08
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_1_LOW 0x1e10
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_1_HIGH 0x1e14
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_1 0x1e18
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_2_LOW 0x1e20
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_2_HIGH 0x1e24
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_2 0x1e28
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_3_LOW 0x1e30
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_3_HIGH 0x1e34
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_3 0x1e38
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_4_LOW 0x1e40
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_4_HIGH 0x1e44
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_4 0x1e48
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_5_LOW 0x1e50
++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_5_HIGH 0x1e54
++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_5 0x1e58
++
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_0_LOW 0x1e80
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_0_HIGH 0x1e84
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_0 0x1e88
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_1_LOW 0x1e90
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_1_HIGH 0x1e94
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_1 0x1e98
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_2_LOW 0x1ea0
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_2_HIGH 0x1ea4
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_2 0x1ea8
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_3_LOW 0x1eb0
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_3_HIGH 0x1eb4
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_3 0x1eb8
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_4_LOW 0x1ec0
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_4_HIGH 0x1ec4
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_4 0x1ec8
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_5_LOW 0x1ed0
++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_5_HIGH 0x1ed4
++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_5 0x1ed8
++
++/****************************************/
++/* PCI Configuration Access Registers */
++/****************************************/
++
++#define MV64460_PCI_0_CONFIG_ADDR 0xcf8
++#define MV64460_PCI_0_CONFIG_DATA_VIRTUAL_REG 0xcfc
++#define MV64460_PCI_1_CONFIG_ADDR 0xc78
++#define MV64460_PCI_1_CONFIG_DATA_VIRTUAL_REG 0xc7c
++#define MV64460_PCI_0_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG 0xc34
++#define MV64460_PCI_1_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG 0xcb4
++
++/****************************************/
++/* PCI Error Report Registers */
++/****************************************/
++
++#define MV64460_PCI_0_SERR_MASK 0xc28
++#define MV64460_PCI_1_SERR_MASK 0xca8
++#define MV64460_PCI_0_ERROR_ADDR_LOW 0x1d40
++#define MV64460_PCI_1_ERROR_ADDR_LOW 0x1dc0
++#define MV64460_PCI_0_ERROR_ADDR_HIGH 0x1d44
++#define MV64460_PCI_1_ERROR_ADDR_HIGH 0x1dc4
++#define MV64460_PCI_0_ERROR_ATTRIBUTE 0x1d48
++#define MV64460_PCI_1_ERROR_ATTRIBUTE 0x1dc8
++#define MV64460_PCI_0_ERROR_COMMAND 0x1d50
++#define MV64460_PCI_1_ERROR_COMMAND 0x1dd0
++#define MV64460_PCI_0_ERROR_CAUSE 0x1d58
++#define MV64460_PCI_1_ERROR_CAUSE 0x1dd8
++#define MV64460_PCI_0_ERROR_MASK 0x1d5c
++#define MV64460_PCI_1_ERROR_MASK 0x1ddc
++
++/****************************************/
++/* PCI Debug Registers */
++/****************************************/
++
++#define MV64460_PCI_0_MMASK 0X1D24
++#define MV64460_PCI_1_MMASK 0X1DA4
++
++/*********************************************/
++/* PCI Configuration, Function 0, Registers */
++/*********************************************/
++
++#define MV64460_PCI_DEVICE_AND_VENDOR_ID 0x000
++#define MV64460_PCI_STATUS_AND_COMMAND 0x004
++#define MV64460_PCI_CLASS_CODE_AND_REVISION_ID 0x008
++#define MV64460_PCI_BIST_HEADER_TYPE_LATENCY_TIMER_CACHE_LINE 0x00C
++
++#define MV64460_PCI_SCS_0_BASE_ADDR_LOW 0x010
++#define MV64460_PCI_SCS_0_BASE_ADDR_HIGH 0x014
++#define MV64460_PCI_SCS_1_BASE_ADDR_LOW 0x018
++#define MV64460_PCI_SCS_1_BASE_ADDR_HIGH 0x01C
++#define MV64460_PCI_INTERNAL_REG_MEM_MAPPED_BASE_ADDR_LOW 0x020
++#define MV64460_PCI_INTERNAL_REG_MEM_MAPPED_BASE_ADDR_HIGH 0x024
++#define MV64460_PCI_SUBSYSTEM_ID_AND_SUBSYSTEM_VENDOR_ID 0x02c
++#define MV64460_PCI_EXPANSION_ROM_BASE_ADDR_REG 0x030
++#define MV64460_PCI_CAPABILTY_LIST_POINTER 0x034
++#define MV64460_PCI_INTERRUPT_PIN_AND_LINE 0x03C
++ /* capability list */
++#define MV64460_PCI_POWER_MANAGEMENT_CAPABILITY 0x040
++#define MV64460_PCI_POWER_MANAGEMENT_STATUS_AND_CONTROL 0x044
++#define MV64460_PCI_VPD_ADDR 0x048
++#define MV64460_PCI_VPD_DATA 0x04c
++#define MV64460_PCI_MSI_MESSAGE_CONTROL 0x050
++#define MV64460_PCI_MSI_MESSAGE_ADDR 0x054
++#define MV64460_PCI_MSI_MESSAGE_UPPER_ADDR 0x058
++#define MV64460_PCI_MSI_MESSAGE_DATA 0x05c
++#define MV64460_PCI_X_COMMAND 0x060
++#define MV64460_PCI_X_STATUS 0x064
++#define MV64460_PCI_COMPACT_PCI_HOT_SWAP 0x068
++
++/***********************************************/
++/* PCI Configuration, Function 1, Registers */
++/***********************************************/
++
++#define MV64460_PCI_SCS_2_BASE_ADDR_LOW 0x110
++#define MV64460_PCI_SCS_2_BASE_ADDR_HIGH 0x114
++#define MV64460_PCI_SCS_3_BASE_ADDR_LOW 0x118
++#define MV64460_PCI_SCS_3_BASE_ADDR_HIGH 0x11c
++#define MV64460_PCI_INTERNAL_SRAM_BASE_ADDR_LOW 0x120
++#define MV64460_PCI_INTERNAL_SRAM_BASE_ADDR_HIGH 0x124
++
++/***********************************************/
++/* PCI Configuration, Function 2, Registers */
++/***********************************************/
++
++#define MV64460_PCI_DEVCS_0_BASE_ADDR_LOW 0x210
++#define MV64460_PCI_DEVCS_0_BASE_ADDR_HIGH 0x214
++#define MV64460_PCI_DEVCS_1_BASE_ADDR_LOW 0x218
++#define MV64460_PCI_DEVCS_1_BASE_ADDR_HIGH 0x21c
++#define MV64460_PCI_DEVCS_2_BASE_ADDR_LOW 0x220
++#define MV64460_PCI_DEVCS_2_BASE_ADDR_HIGH 0x224
++
++/***********************************************/
++/* PCI Configuration, Function 3, Registers */
++/***********************************************/
++
++#define MV64460_PCI_DEVCS_3_BASE_ADDR_LOW 0x310
++#define MV64460_PCI_DEVCS_3_BASE_ADDR_HIGH 0x314
++#define MV64460_PCI_BOOT_CS_BASE_ADDR_LOW 0x318
++#define MV64460_PCI_BOOT_CS_BASE_ADDR_HIGH 0x31c
++#define MV64460_PCI_CPU_BASE_ADDR_LOW 0x220
++#define MV64460_PCI_CPU_BASE_ADDR_HIGH 0x224
++
++/***********************************************/
++/* PCI Configuration, Function 4, Registers */
++/***********************************************/
++
++#define MV64460_PCI_P2P_MEM0_BASE_ADDR_LOW 0x410
++#define MV64460_PCI_P2P_MEM0_BASE_ADDR_HIGH 0x414
++#define MV64460_PCI_P2P_MEM1_BASE_ADDR_LOW 0x418
++#define MV64460_PCI_P2P_MEM1_BASE_ADDR_HIGH 0x41c
++#define MV64460_PCI_P2P_I_O_BASE_ADDR 0x420
++#define MV64460_PCI_INTERNAL_REGS_I_O_MAPPED_BASE_ADDR 0x424
++
++/****************************************/
++/* Messaging Unit Registers (I20) */
++/****************************************/
++
++#define MV64460_I2O_INBOUND_MESSAGE_REG0_PCI_0_SIDE 0x010
++#define MV64460_I2O_INBOUND_MESSAGE_REG1_PCI_0_SIDE 0x014
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_PCI_0_SIDE 0x018
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_PCI_0_SIDE 0x01C
++#define MV64460_I2O_INBOUND_DOORBELL_REG_PCI_0_SIDE 0x020
++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_PCI_0_SIDE 0x024
++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_PCI_0_SIDE 0x028
++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_PCI_0_SIDE 0x02C
++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_PCI_0_SIDE 0x030
++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_PCI_0_SIDE 0x034
++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_0_SIDE 0x040
++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_0_SIDE 0x044
++#define MV64460_I2O_QUEUE_CONTROL_REG_PCI_0_SIDE 0x050
++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_PCI_0_SIDE 0x054
++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_PCI_0_SIDE 0x060
++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_PCI_0_SIDE 0x064
++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_PCI_0_SIDE 0x068
++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_PCI_0_SIDE 0x06C
++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_PCI_0_SIDE 0x070
++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_PCI_0_SIDE 0x074
++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_PCI_0_SIDE 0x0F8
++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_PCI_0_SIDE 0x0FC
++
++#define MV64460_I2O_INBOUND_MESSAGE_REG0_PCI_1_SIDE 0x090
++#define MV64460_I2O_INBOUND_MESSAGE_REG1_PCI_1_SIDE 0x094
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_PCI_1_SIDE 0x098
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_PCI_1_SIDE 0x09C
++#define MV64460_I2O_INBOUND_DOORBELL_REG_PCI_1_SIDE 0x0A0
++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_PCI_1_SIDE 0x0A4
++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_PCI_1_SIDE 0x0A8
++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_PCI_1_SIDE 0x0AC
++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_PCI_1_SIDE 0x0B0
++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_PCI_1_SIDE 0x0B4
++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_1_SIDE 0x0C0
++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_1_SIDE 0x0C4
++#define MV64460_I2O_QUEUE_CONTROL_REG_PCI_1_SIDE 0x0D0
++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_PCI_1_SIDE 0x0D4
++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_PCI_1_SIDE 0x0E0
++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_PCI_1_SIDE 0x0E4
++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_PCI_1_SIDE 0x0E8
++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_PCI_1_SIDE 0x0EC
++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_PCI_1_SIDE 0x0F0
++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_PCI_1_SIDE 0x0F4
++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_PCI_1_SIDE 0x078
++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_PCI_1_SIDE 0x07C
++
++#define MV64460_I2O_INBOUND_MESSAGE_REG0_CPU0_SIDE 0x1C10
++#define MV64460_I2O_INBOUND_MESSAGE_REG1_CPU0_SIDE 0x1C14
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_CPU0_SIDE 0x1C18
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_CPU0_SIDE 0x1C1C
++#define MV64460_I2O_INBOUND_DOORBELL_REG_CPU0_SIDE 0x1C20
++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_CPU0_SIDE 0x1C24
++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_CPU0_SIDE 0x1C28
++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_CPU0_SIDE 0x1C2C
++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_CPU0_SIDE 0x1C30
++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_CPU0_SIDE 0x1C34
++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_CPU0_SIDE 0x1C40
++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_CPU0_SIDE 0x1C44
++#define MV64460_I2O_QUEUE_CONTROL_REG_CPU0_SIDE 0x1C50
++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_CPU0_SIDE 0x1C54
++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_CPU0_SIDE 0x1C60
++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_CPU0_SIDE 0x1C64
++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_CPU0_SIDE 0x1C68
++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_CPU0_SIDE 0x1C6C
++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_CPU0_SIDE 0x1C70
++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_CPU0_SIDE 0x1C74
++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_CPU0_SIDE 0x1CF8
++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_CPU0_SIDE 0x1CFC
++#define MV64460_I2O_INBOUND_MESSAGE_REG0_CPU1_SIDE 0x1C90
++#define MV64460_I2O_INBOUND_MESSAGE_REG1_CPU1_SIDE 0x1C94
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_CPU1_SIDE 0x1C98
++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_CPU1_SIDE 0x1C9C
++#define MV64460_I2O_INBOUND_DOORBELL_REG_CPU1_SIDE 0x1CA0
++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_CPU1_SIDE 0x1CA4
++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_CPU1_SIDE 0x1CA8
++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_CPU1_SIDE 0x1CAC
++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_CPU1_SIDE 0x1CB0
++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_CPU1_SIDE 0x1CB4
++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_CPU1_SIDE 0x1CC0
++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_CPU1_SIDE 0x1CC4
++#define MV64460_I2O_QUEUE_CONTROL_REG_CPU1_SIDE 0x1CD0
++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_CPU1_SIDE 0x1CD4
++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_CPU1_SIDE 0x1CE0
++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_CPU1_SIDE 0x1CE4
++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_CPU1_SIDE 0x1CE8
++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_CPU1_SIDE 0x1CEC
++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_CPU1_SIDE 0x1CF0
++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_CPU1_SIDE 0x1CF4
++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_CPU1_SIDE 0x1C78
++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_CPU1_SIDE 0x1C7C
++
++/****************************************/
++/* Ethernet Unit Registers */
++/****************************************/
++
++#define MV64460_ETH_PHY_ADDR_REG 0x2000
++#define MV64460_ETH_SMI_REG 0x2004
++#define MV64460_ETH_UNIT_DEFAULT_ADDR_REG 0x2008
++#define MV64460_ETH_UNIT_DEFAULTID_REG 0x200c
++#define MV64460_ETH_UNIT_INTERRUPT_CAUSE_REG 0x2080
++#define MV64460_ETH_UNIT_INTERRUPT_MASK_REG 0x2084
++#define MV64460_ETH_UNIT_INTERNAL_USE_REG 0x24fc
++#define MV64460_ETH_UNIT_ERROR_ADDR_REG 0x2094
++#define MV64460_ETH_BAR_0 0x2200
++#define MV64460_ETH_BAR_1 0x2208
++#define MV64460_ETH_BAR_2 0x2210
++#define MV64460_ETH_BAR_3 0x2218
++#define MV64460_ETH_BAR_4 0x2220
++#define MV64460_ETH_BAR_5 0x2228
++#define MV64460_ETH_SIZE_REG_0 0x2204
++#define MV64460_ETH_SIZE_REG_1 0x220c
++#define MV64460_ETH_SIZE_REG_2 0x2214
++#define MV64460_ETH_SIZE_REG_3 0x221c
++#define MV64460_ETH_SIZE_REG_4 0x2224
++#define MV64460_ETH_SIZE_REG_5 0x222c
++#define MV64460_ETH_HEADERS_RETARGET_BASE_REG 0x2230
++#define MV64460_ETH_HEADERS_RETARGET_CONTROL_REG 0x2234
++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_0 0x2280
++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_1 0x2284
++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_2 0x2288
++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_3 0x228c
++#define MV64460_ETH_BASE_ADDR_ENABLE_REG 0x2290
++#define MV64460_ETH_ACCESS_PROTECTION_REG(port) (0x2294 + (port<<2))
++#define MV64460_ETH_MIB_COUNTERS_BASE(port) (0x3000 + (port<<7))
++#define MV64460_ETH_PORT_CONFIG_REG(port) (0x2400 + (port<<10))
++#define MV64460_ETH_PORT_CONFIG_EXTEND_REG(port) (0x2404 + (port<<10))
++#define MV64460_ETH_MII_SERIAL_PARAMETRS_REG(port) (0x2408 + (port<<10))
++#define MV64460_ETH_GMII_SERIAL_PARAMETRS_REG(port) (0x240c + (port<<10))
++#define MV64460_ETH_VLAN_ETHERTYPE_REG(port) (0x2410 + (port<<10))
++#define MV64460_ETH_MAC_ADDR_LOW(port) (0x2414 + (port<<10))
++#define MV64460_ETH_MAC_ADDR_HIGH(port) (0x2418 + (port<<10))
++#define MV64460_ETH_SDMA_CONFIG_REG(port) (0x241c + (port<<10))
++#define MV64460_ETH_DSCP_0(port) (0x2420 + (port<<10))
++#define MV64460_ETH_DSCP_1(port) (0x2424 + (port<<10))
++#define MV64460_ETH_DSCP_2(port) (0x2428 + (port<<10))
++#define MV64460_ETH_DSCP_3(port) (0x242c + (port<<10))
++#define MV64460_ETH_DSCP_4(port) (0x2430 + (port<<10))
++#define MV64460_ETH_DSCP_5(port) (0x2434 + (port<<10))
++#define MV64460_ETH_DSCP_6(port) (0x2438 + (port<<10))
++#define MV64460_ETH_PORT_SERIAL_CONTROL_REG(port) (0x243c + (port<<10))
++#define MV64460_ETH_VLAN_PRIORITY_TAG_TO_PRIORITY(port) (0x2440 + (port<<10))
++#define MV64460_ETH_PORT_STATUS_REG(port) (0x2444 + (port<<10))
++#define MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(port) (0x2448 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_FIXED_PRIORITY(port) (0x244c + (port<<10))
++#define MV64460_ETH_PORT_TX_TOKEN_BUCKET_RATE_CONFIG(port) (0x2450 + (port<<10))
++#define MV64460_ETH_MAXIMUM_TRANSMIT_UNIT(port) (0x2458 + (port<<10))
++#define MV64460_ETH_PORT_MAXIMUM_TOKEN_BUCKET_SIZE(port) (0x245c + (port<<10))
++#define MV64460_ETH_INTERRUPT_CAUSE_REG(port) (0x2460 + (port<<10))
++#define MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG(port) (0x2464 + (port<<10))
++#define MV64460_ETH_INTERRUPT_MASK_REG(port) (0x2468 + (port<<10))
++#define MV64460_ETH_INTERRUPT_EXTEND_MASK_REG(port) (0x246c + (port<<10))
++#define MV64460_ETH_RX_FIFO_URGENT_THRESHOLD_REG(port) (0x2470 + (port<<10))
++#define MV64460_ETH_TX_FIFO_URGENT_THRESHOLD_REG(port) (0x2474 + (port<<10))
++#define MV64460_ETH_RX_MINIMAL_FRAME_SIZE_REG(port) (0x247c + (port<<10))
++#define MV64460_ETH_RX_DISCARDED_FRAMES_COUNTER(port) (0x2484 + (port<<10)
++#define MV64460_ETH_PORT_DEBUG_0_REG(port) (0x248c + (port<<10))
++#define MV64460_ETH_PORT_DEBUG_1_REG(port) (0x2490 + (port<<10))
++#define MV64460_ETH_PORT_INTERNAL_ADDR_ERROR_REG(port) (0x2494 + (port<<10))
++#define MV64460_ETH_INTERNAL_USE_REG(port) (0x24fc + (port<<10))
++#define MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(port) (0x2680 + (port<<10))
++#define MV64460_ETH_CURRENT_SERVED_TX_DESC_PTR(port) (0x2684 + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_0(port) (0x260c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_1(port) (0x261c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_2(port) (0x262c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_3(port) (0x263c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_4(port) (0x264c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_5(port) (0x265c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_6(port) (0x266c + (port<<10))
++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_7(port) (0x267c + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_0(port) (0x26c0 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_1(port) (0x26c4 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_2(port) (0x26c8 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_3(port) (0x26cc + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_4(port) (0x26d0 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_5(port) (0x26d4 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_6(port) (0x26d8 + (port<<10))
++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_7(port) (0x26dc + (port<<10))
++#define MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_COUNT(port) (0x2700 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_1_TOKEN_BUCKET_COUNT(port) (0x2710 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_2_TOKEN_BUCKET_COUNT(port) (0x2720 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_3_TOKEN_BUCKET_COUNT(port) (0x2730 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_4_TOKEN_BUCKET_COUNT(port) (0x2740 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_5_TOKEN_BUCKET_COUNT(port) (0x2750 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_6_TOKEN_BUCKET_COUNT(port) (0x2760 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_7_TOKEN_BUCKET_COUNT(port) (0x2770 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_CONFIG(port) (0x2704 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_1_TOKEN_BUCKET_CONFIG(port) (0x2714 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_2_TOKEN_BUCKET_CONFIG(port) (0x2724 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_3_TOKEN_BUCKET_CONFIG(port) (0x2734 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_4_TOKEN_BUCKET_CONFIG(port) (0x2744 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_5_TOKEN_BUCKET_CONFIG(port) (0x2754 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_6_TOKEN_BUCKET_CONFIG(port) (0x2764 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_7_TOKEN_BUCKET_CONFIG(port) (0x2774 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_0_ARBITER_CONFIG(port) (0x2708 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_1_ARBITER_CONFIG(port) (0x2718 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_2_ARBITER_CONFIG(port) (0x2728 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_3_ARBITER_CONFIG(port) (0x2738 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_4_ARBITER_CONFIG(port) (0x2748 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_5_ARBITER_CONFIG(port) (0x2758 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_6_ARBITER_CONFIG(port) (0x2768 + (port<<10))
++#define MV64460_ETH_TX_QUEUE_7_ARBITER_CONFIG(port) (0x2778 + (port<<10))
++#define MV64460_ETH_PORT_TX_TOKEN_BUCKET_COUNT(port) (0x2780 + (port<<10))
++#define MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(port) (0x3400 + (port<<10))
++#define MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(port) (0x3500 + (port<<10))
++#define MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE(port) (0x3600 + (port<<10))
++
++/*******************************************/
++/* CUNIT Registers */
++/*******************************************/
++
++ /* Address Decoding Register Map */
++
++#define MV64460_CUNIT_BASE_ADDR_REG0 0xf200
++#define MV64460_CUNIT_BASE_ADDR_REG1 0xf208
++#define MV64460_CUNIT_BASE_ADDR_REG2 0xf210
++#define MV64460_CUNIT_BASE_ADDR_REG3 0xf218
++#define MV64460_CUNIT_SIZE0 0xf204
++#define MV64460_CUNIT_SIZE1 0xf20c
++#define MV64460_CUNIT_SIZE2 0xf214
++#define MV64460_CUNIT_SIZE3 0xf21c
++#define MV64460_CUNIT_HIGH_ADDR_REMAP_REG0 0xf240
++#define MV64460_CUNIT_HIGH_ADDR_REMAP_REG1 0xf244
++#define MV64460_CUNIT_BASE_ADDR_ENABLE_REG 0xf250
++#define MV64460_MPSC0_ACCESS_PROTECTION_REG 0xf254
++#define MV64460_MPSC1_ACCESS_PROTECTION_REG 0xf258
++#define MV64460_CUNIT_INTERNAL_SPACE_BASE_ADDR_REG 0xf25C
++
++ /* Error Report Registers */
++
++#define MV64460_CUNIT_INTERRUPT_CAUSE_REG 0xf310
++#define MV64460_CUNIT_INTERRUPT_MASK_REG 0xf314
++#define MV64460_CUNIT_ERROR_ADDR 0xf318
++
++ /* Cunit Control Registers */
++
++#define MV64460_CUNIT_ARBITER_CONTROL_REG 0xf300
++#define MV64460_CUNIT_CONFIG_REG 0xb40c
++#define MV64460_CUNIT_CRROSBAR_TIMEOUT_REG 0xf304
++
++ /* Cunit Debug Registers */
++
++#define MV64460_CUNIT_DEBUG_LOW 0xf340
++#define MV64460_CUNIT_DEBUG_HIGH 0xf344
++#define MV64460_CUNIT_MMASK 0xf380
++
++ /* Cunit Base Address Enable Window Bits*/
++#define MV64460_CUNIT_BASE_ADDR_WIN_0_BIT 0x0
++#define MV64460_CUNIT_BASE_ADDR_WIN_1_BIT 0x1
++#define MV64460_CUNIT_BASE_ADDR_WIN_2_BIT 0x2
++#define MV64460_CUNIT_BASE_ADDR_WIN_3_BIT 0x3
++
++ /* MPSCs Clocks Routing Registers */
++
++#define MV64460_MPSC_ROUTING_REG 0xb400
++#define MV64460_MPSC_RX_CLOCK_ROUTING_REG 0xb404
++#define MV64460_MPSC_TX_CLOCK_ROUTING_REG 0xb408
++
++ /* MPSCs Interrupts Registers */
++
++#define MV64460_MPSC_CAUSE_REG(port) (0xb804 + (port<<3))
++#define MV64460_MPSC_MASK_REG(port) (0xb884 + (port<<3))
++
++#define MV64460_MPSC_MAIN_CONFIG_LOW(port) (0x8000 + (port<<12))
++#define MV64460_MPSC_MAIN_CONFIG_HIGH(port) (0x8004 + (port<<12))
++#define MV64460_MPSC_PROTOCOL_CONFIG(port) (0x8008 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG1(port) (0x800c + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG2(port) (0x8010 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG3(port) (0x8014 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG4(port) (0x8018 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG5(port) (0x801c + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG6(port) (0x8020 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG7(port) (0x8024 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG8(port) (0x8028 + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG9(port) (0x802c + (port<<12))
++#define MV64460_MPSC_CHANNEL_REG10(port) (0x8030 + (port<<12))
++
++ /* MPSC0 Registers */
++
++
++/***************************************/
++/* SDMA Registers */
++/***************************************/
++
++#define MV64460_SDMA_CONFIG_REG(channel) (0x4000 + (channel<<13))
++#define MV64460_SDMA_COMMAND_REG(channel) (0x4008 + (channel<<13))
++#define MV64460_SDMA_CURRENT_RX_DESCRIPTOR_POINTER(channel) (0x4810 + (channel<<13))
++#define MV64460_SDMA_CURRENT_TX_DESCRIPTOR_POINTER(channel) (0x4c10 + (channel<<13))
++#define MV64460_SDMA_FIRST_TX_DESCRIPTOR_POINTER(channel) (0x4c14 + (channel<<13))
++
++#define MV64460_SDMA_CAUSE_REG 0xb800
++#define MV64460_SDMA_MASK_REG 0xb880
++
++
++/****************************************/
++/* SDMA Address Space Targets */
++/****************************************/
++
++#define MV64460_SDMA_DRAM_CS_0_TARGET 0x0e00
++#define MV64460_SDMA_DRAM_CS_1_TARGET 0x0d00
++#define MV64460_SDMA_DRAM_CS_2_TARGET 0x0b00
++#define MV64460_SDMA_DRAM_CS_3_TARGET 0x0700
++
++#define MV64460_SDMA_DEV_CS_0_TARGET 0x1e01
++#define MV64460_SDMA_DEV_CS_1_TARGET 0x1d01
++#define MV64460_SDMA_DEV_CS_2_TARGET 0x1b01
++#define MV64460_SDMA_DEV_CS_3_TARGET 0x1701
++
++#define MV64460_SDMA_BOOT_CS_TARGET 0x0f00
++
++#define MV64460_SDMA_SRAM_TARGET 0x0003
++#define MV64460_SDMA_60X_BUS_TARGET 0x4003
++
++#define MV64460_PCI_0_TARGET 0x0003
++#define MV64460_PCI_1_TARGET 0x0004
++
++
++/* Devices BAR and size registers */
++
++#define MV64460_DEV_CS0_BASE_ADDR 0x028
++#define MV64460_DEV_CS0_SIZE 0x030
++#define MV64460_DEV_CS1_BASE_ADDR 0x228
++#define MV64460_DEV_CS1_SIZE 0x230
++#define MV64460_DEV_CS2_BASE_ADDR 0x248
++#define MV64460_DEV_CS2_SIZE 0x250
++#define MV64460_DEV_CS3_BASE_ADDR 0x038
++#define MV64460_DEV_CS3_SIZE 0x040
++#define MV64460_BOOTCS_BASE_ADDR 0x238
++#define MV64460_BOOTCS_SIZE 0x240
++
++/* SDMA Window access protection */
++#define MV64460_SDMA_WIN_ACCESS_NOT_ALLOWED 0
++#define MV64460_SDMA_WIN_ACCESS_READ_ONLY 1
++#define MV64460_SDMA_WIN_ACCESS_FULL 2
++
++/* BRG Interrupts */
++
++#define MV64460_BRG_CONFIG_REG(brg) (0xb200 + (brg<<3))
++#define MV64460_BRG_BAUDE_TUNING_REG(brg) (0xb204 + (brg<<3))
++#define MV64460_BRG_CAUSE_REG 0xb834
++#define MV64460_BRG_MASK_REG 0xb8b4
++
++/****************************************/
++/* DMA Channel Control */
++/****************************************/
++
++#define MV64460_DMA_CHANNEL0_CONTROL 0x840
++#define MV64460_DMA_CHANNEL0_CONTROL_HIGH 0x880
++#define MV64460_DMA_CHANNEL1_CONTROL 0x844
++#define MV64460_DMA_CHANNEL1_CONTROL_HIGH 0x884
++#define MV64460_DMA_CHANNEL2_CONTROL 0x848
++#define MV64460_DMA_CHANNEL2_CONTROL_HIGH 0x888
++#define MV64460_DMA_CHANNEL3_CONTROL 0x84C
++#define MV64460_DMA_CHANNEL3_CONTROL_HIGH 0x88C
++
++
++/****************************************/
++/* IDMA Registers */
++/****************************************/
++
++#define MV64460_DMA_CHANNEL0_BYTE_COUNT 0x800
++#define MV64460_DMA_CHANNEL1_BYTE_COUNT 0x804
++#define MV64460_DMA_CHANNEL2_BYTE_COUNT 0x808
++#define MV64460_DMA_CHANNEL3_BYTE_COUNT 0x80C
++#define MV64460_DMA_CHANNEL0_SOURCE_ADDR 0x810
++#define MV64460_DMA_CHANNEL1_SOURCE_ADDR 0x814
++#define MV64460_DMA_CHANNEL2_SOURCE_ADDR 0x818
++#define MV64460_DMA_CHANNEL3_SOURCE_ADDR 0x81c
++#define MV64460_DMA_CHANNEL0_DESTINATION_ADDR 0x820
++#define MV64460_DMA_CHANNEL1_DESTINATION_ADDR 0x824
++#define MV64460_DMA_CHANNEL2_DESTINATION_ADDR 0x828
++#define MV64460_DMA_CHANNEL3_DESTINATION_ADDR 0x82C
++#define MV64460_DMA_CHANNEL0_NEXT_DESCRIPTOR_POINTER 0x830
++#define MV64460_DMA_CHANNEL1_NEXT_DESCRIPTOR_POINTER 0x834
++#define MV64460_DMA_CHANNEL2_NEXT_DESCRIPTOR_POINTER 0x838
++#define MV64460_DMA_CHANNEL3_NEXT_DESCRIPTOR_POINTER 0x83C
++#define MV64460_DMA_CHANNEL0_CURRENT_DESCRIPTOR_POINTER 0x870
++#define MV64460_DMA_CHANNEL1_CURRENT_DESCRIPTOR_POINTER 0x874
++#define MV64460_DMA_CHANNEL2_CURRENT_DESCRIPTOR_POINTER 0x878
++#define MV64460_DMA_CHANNEL3_CURRENT_DESCRIPTOR_POINTER 0x87C
++
++ /* IDMA Address Decoding Base Address Registers */
++
++#define MV64460_DMA_BASE_ADDR_REG0 0xa00
++#define MV64460_DMA_BASE_ADDR_REG1 0xa08
++#define MV64460_DMA_BASE_ADDR_REG2 0xa10
++#define MV64460_DMA_BASE_ADDR_REG3 0xa18
++#define MV64460_DMA_BASE_ADDR_REG4 0xa20
++#define MV64460_DMA_BASE_ADDR_REG5 0xa28
++#define MV64460_DMA_BASE_ADDR_REG6 0xa30
++#define MV64460_DMA_BASE_ADDR_REG7 0xa38
++
++ /* IDMA Address Decoding Size Address Register */
++
++#define MV64460_DMA_SIZE_REG0 0xa04
++#define MV64460_DMA_SIZE_REG1 0xa0c
++#define MV64460_DMA_SIZE_REG2 0xa14
++#define MV64460_DMA_SIZE_REG3 0xa1c
++#define MV64460_DMA_SIZE_REG4 0xa24
++#define MV64460_DMA_SIZE_REG5 0xa2c
++#define MV64460_DMA_SIZE_REG6 0xa34
++#define MV64460_DMA_SIZE_REG7 0xa3C
++
++ /* IDMA Address Decoding High Address Remap and Access
++ Protection Registers */
++
++#define MV64460_DMA_HIGH_ADDR_REMAP_REG0 0xa60
++#define MV64460_DMA_HIGH_ADDR_REMAP_REG1 0xa64
++#define MV64460_DMA_HIGH_ADDR_REMAP_REG2 0xa68
++#define MV64460_DMA_HIGH_ADDR_REMAP_REG3 0xa6C
++#define MV64460_DMA_BASE_ADDR_ENABLE_REG 0xa80
++#define MV64460_DMA_CHANNEL0_ACCESS_PROTECTION_REG 0xa70
++#define MV64460_DMA_CHANNEL1_ACCESS_PROTECTION_REG 0xa74
++#define MV64460_DMA_CHANNEL2_ACCESS_PROTECTION_REG 0xa78
++#define MV64460_DMA_CHANNEL3_ACCESS_PROTECTION_REG 0xa7c
++#define MV64460_DMA_ARBITER_CONTROL 0x860
++#define MV64460_DMA_CROSS_BAR_TIMEOUT 0x8d0
++
++ /* IDMA Headers Retarget Registers */
++
++#define MV64460_DMA_HEADERS_RETARGET_CONTROL 0xa84
++#define MV64460_DMA_HEADERS_RETARGET_BASE 0xa88
++
++ /* IDMA Interrupt Register */
++
++#define MV64460_DMA_INTERRUPT_CAUSE_REG 0x8c0
++#define MV64460_DMA_INTERRUPT_CAUSE_MASK 0x8c4
++#define MV64460_DMA_ERROR_ADDR 0x8c8
++#define MV64460_DMA_ERROR_SELECT 0x8cc
++
++ /* IDMA Debug Register ( for internal use ) */
++
++#define MV64460_DMA_DEBUG_LOW 0x8e0
++#define MV64460_DMA_DEBUG_HIGH 0x8e4
++#define MV64460_DMA_SPARE 0xA8C
++
++/****************************************/
++/* Timer_Counter */
++/****************************************/
++
++#define MV64460_TIMER_COUNTER0 0x850
++#define MV64460_TIMER_COUNTER1 0x854
++#define MV64460_TIMER_COUNTER2 0x858
++#define MV64460_TIMER_COUNTER3 0x85C
++#define MV64460_TIMER_COUNTER_0_3_CONTROL 0x864
++#define MV64460_TIMER_COUNTER_0_3_INTERRUPT_CAUSE 0x868
++#define MV64460_TIMER_COUNTER_0_3_INTERRUPT_MASK 0x86c
++
++/****************************************/
++/* Watchdog registers */
++/****************************************/
++
++#define MV64460_WATCHDOG_CONFIG_REG 0xb410
++#define MV64460_WATCHDOG_VALUE_REG 0xb414
++
++/****************************************/
++/* I2C Registers */
++/****************************************/
++
++#define MV64460_I2C_SLAVE_ADDR 0xc000
++#define MV64460_I2C_EXTENDED_SLAVE_ADDR 0xc010
++#define MV64460_I2C_DATA 0xc004
++#define MV64460_I2C_CONTROL 0xc008
++#define MV64460_I2C_STATUS_BAUDE_RATE 0xc00C
++#define MV64460_I2C_SOFT_RESET 0xc01c
++
++/****************************************/
++/* GPP Interface Registers */
++/****************************************/
++
++#define MV64460_GPP_IO_CONTROL 0xf100
++#define MV64460_GPP_LEVEL_CONTROL 0xf110
++#define MV64460_GPP_VALUE 0xf104
++#define MV64460_GPP_INTERRUPT_CAUSE 0xf108
++#define MV64460_GPP_INTERRUPT_MASK0 0xf10c
++#define MV64460_GPP_INTERRUPT_MASK1 0xf114
++#define MV64460_GPP_VALUE_SET 0xf118
++#define MV64460_GPP_VALUE_CLEAR 0xf11c
++
++/****************************************/
++/* Interrupt Controller Registers */
++/****************************************/
++
++/****************************************/
++/* Interrupts */
++/****************************************/
++
++#define MV64460_MAIN_INTERRUPT_CAUSE_LOW 0x004
++#define MV64460_MAIN_INTERRUPT_CAUSE_HIGH 0x00c
++#define MV64460_CPU_INTERRUPT0_MASK_LOW 0x014
++#define MV64460_CPU_INTERRUPT0_MASK_HIGH 0x01c
++#define MV64460_CPU_INTERRUPT0_SELECT_CAUSE 0x024
++#define MV64460_CPU_INTERRUPT1_MASK_LOW 0x034
++#define MV64460_CPU_INTERRUPT1_MASK_HIGH 0x03c
++#define MV64460_CPU_INTERRUPT1_SELECT_CAUSE 0x044
++#define MV64460_INTERRUPT0_MASK_0_LOW 0x054
++#define MV64460_INTERRUPT0_MASK_0_HIGH 0x05c
++#define MV64460_INTERRUPT0_SELECT_CAUSE 0x064
++#define MV64460_INTERRUPT1_MASK_0_LOW 0x074
++#define MV64460_INTERRUPT1_MASK_0_HIGH 0x07c
++#define MV64460_INTERRUPT1_SELECT_CAUSE 0x084
++
++/****************************************/
++/* MPP Interface Registers */
++/****************************************/
++
++#define MV64460_MPP_CONTROL0 0xf000
++#define MV64460_MPP_CONTROL1 0xf004
++#define MV64460_MPP_CONTROL2 0xf008
++#define MV64460_MPP_CONTROL3 0xf00c
++
++/****************************************/
++/* Serial Initialization registers */
++/****************************************/
++
++#define MV64460_SERIAL_INIT_LAST_DATA 0xf324
++#define MV64460_SERIAL_INIT_CONTROL 0xf328
++#define MV64460_SERIAL_INIT_STATUS 0xf32c
++
++
++#endif /* __INCgt64460rh */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/p3mx.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/p3mx.c
+--- u-boot-1.1.6/board/prodrive/p3mx/p3mx.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/p3mx.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,809 @@
++/*
++ * (C) Copyright 2006
++ * Stefan Roese, DENX Software Engineering, sr@denx.de.
++ *
++ * Based on original work by
++ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V.
++ * Josh Huber, (C) Copyright 2001 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
++ *
++ * modifications for the DB64360 eval board based by Ingo.Assmus@keymile.com
++ * modifications for the cpci750 by reinhard.arlt@esd-electronics.com
++ * modifications for the P3M750 by roel.loeffen@prodrive.nl
++ */
++
++/*
++ * p3m750.c - main board support/init for the Prodrive p3m750/p3m7448.
++ */
++
++#include <common.h>
++#include <74xx_7xx.h>
++#include "../../Marvell/include/memory.h"
++#include "../../Marvell/include/pci.h"
++#include "../../Marvell/include/mv_gen_reg.h"
++#include <net.h>
++#include <i2c.h>
++
++#include "eth.h"
++#include "mpsc.h"
++#include "64460.h"
++#include "mv_regs.h"
++
++DECLARE_GLOBAL_DATA_PTR;
++
++#undef DEBUG
++/*#define DEBUG */
++
++#ifdef CONFIG_PCI
++#define MAP_PCI
++#endif /* of CONFIG_PCI */
++
++#ifdef DEBUG
++#define DP(x) x
++#else
++#define DP(x)
++#endif
++
++extern void flush_data_cache (void);
++extern void invalidate_l1_instruction_cache (void);
++extern flash_info_t flash_info[];
++
++/* ------------------------------------------------------------------------- */
++
++/* this is the current GT register space location */
++/* it starts at CFG_DFL_GT_REGS but moves later to CFG_GT_REGS */
++
++/* Unfortunately, we cant change it while we are in flash, so we initialize it
++ * to the "final" value. This means that any debug_led calls before
++ * board_early_init_f wont work right (like in cpu_init_f).
++ * See also my_remap_gt_regs below. (NTL)
++ */
++
++void board_prebootm_init (void);
++unsigned int INTERNAL_REG_BASE_ADDR = CFG_GT_REGS;
++int display_mem_map (void);
++
++/* ------------------------------------------------------------------------- */
++
++/*
++ * This is a version of the GT register space remapping function that
++ * doesn't touch globals (meaning, it's ok to run from flash.)
++ *
++ * Unfortunately, this has the side effect that a writable
++ * INTERNAL_REG_BASE_ADDR is impossible. Oh well.
++ */
++
++void my_remap_gt_regs (u32 cur_loc, u32 new_loc)
++{
++ u32 temp;
++
++ /* check and see if it's already moved */
++ temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE));
++ if ((temp & 0xffff) == new_loc >> 16)
++ return;
++
++ temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) &
++ 0xffff0000) | (new_loc >> 16);
++
++ out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp);
++
++ while (GTREGREAD (INTERNAL_SPACE_DECODE) != temp);
++}
++
++#ifdef CONFIG_PCI
++
++static void gt_pci_config (void)
++{
++ unsigned int stat;
++ unsigned int val = 0x00fff864; /* DINK32: BusNum 23:16, DevNum 15:11, */
++ /* FuncNum 10:8, RegNum 7:2 */
++
++ /*
++ * In PCIX mode devices provide their own bus and device numbers.
++ * We query the Discovery II's
++ * config registers by writing ones to the bus and device.
++ * We then update the Virtual register with the correct value for the
++ * bus and device.
++ */
++ if ((GTREGREAD (PCI_0_MODE) & (BIT4 | BIT5)) != 0) { /* if PCI-X */
++ GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val);
++
++ GT_REG_READ (PCI_0_CONFIG_DATA_VIRTUAL_REG, &stat);
++
++ GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val);
++ GT_REG_WRITE (PCI_0_CONFIG_DATA_VIRTUAL_REG,
++ (stat & 0xffff0000) | CFG_PCI_IDSEL);
++
++ }
++ if ((GTREGREAD (PCI_1_MODE) & (BIT4 | BIT5)) != 0) { /* if PCI-X */
++ GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val);
++ GT_REG_READ (PCI_1_CONFIG_DATA_VIRTUAL_REG, &stat);
++
++ GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val);
++ GT_REG_WRITE (PCI_1_CONFIG_DATA_VIRTUAL_REG,
++ (stat & 0xffff0000) | CFG_PCI_IDSEL);
++ }
++
++ /* Enable master */
++ PCI_MASTER_ENABLE (0, SELF);
++ PCI_MASTER_ENABLE (1, SELF);
++
++ /* Enable PCI0/1 Mem0 and IO 0 disable all others */
++ GT_REG_READ (BASE_ADDR_ENABLE, &stat);
++ stat |= (1 << 11) | (1 << 12) | (1 << 13) | (1 << 16) | (1 << 17) |
++ (1 << 18);
++ stat &= ~((1 << 9) | (1 << 10) | (1 << 14) | (1 << 15));
++ GT_REG_WRITE (BASE_ADDR_ENABLE, stat);
++
++ /* ronen:
++ * add write to pci remap registers for 64460.
++ * in 64360 when writing to pci base go and overide remap automaticaly,
++ * in 64460 it doesn't
++ */
++ GT_REG_WRITE (PCI_0_IO_BASE_ADDR, CFG_PCI0_IO_SPACE >> 16);
++ GT_REG_WRITE (PCI_0I_O_ADDRESS_REMAP, CFG_PCI0_IO_SPACE_PCI >> 16);
++ GT_REG_WRITE (PCI_0_IO_SIZE, (CFG_PCI0_IO_SIZE - 1) >> 16);
++
++ GT_REG_WRITE (PCI_0_MEMORY0_BASE_ADDR, CFG_PCI0_MEM_BASE >> 16);
++ GT_REG_WRITE (PCI_0MEMORY0_ADDRESS_REMAP, CFG_PCI0_MEM_BASE >> 16);
++ GT_REG_WRITE (PCI_0_MEMORY0_SIZE, (CFG_PCI0_MEM_SIZE - 1) >> 16);
++
++ GT_REG_WRITE (PCI_1_IO_BASE_ADDR, CFG_PCI1_IO_SPACE >> 16);
++ GT_REG_WRITE (PCI_1I_O_ADDRESS_REMAP, CFG_PCI1_IO_SPACE_PCI >> 16);
++ GT_REG_WRITE (PCI_1_IO_SIZE, (CFG_PCI1_IO_SIZE - 1) >> 16);
++
++ GT_REG_WRITE (PCI_1_MEMORY0_BASE_ADDR, CFG_PCI1_MEM_BASE >> 16);
++ GT_REG_WRITE (PCI_1MEMORY0_ADDRESS_REMAP, CFG_PCI1_MEM_BASE >> 16);
++ GT_REG_WRITE (PCI_1_MEMORY0_SIZE, (CFG_PCI1_MEM_SIZE - 1) >> 16);
++
++ /* PCI interface settings */
++ /* Timeout set to retry forever */
++ GT_REG_WRITE (PCI_0TIMEOUT_RETRY, 0x0);
++ GT_REG_WRITE (PCI_1TIMEOUT_RETRY, 0x0);
++
++ /* ronen - enable only CS0 and Internal reg!! */
++ GT_REG_WRITE (PCI_0BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe);
++ GT_REG_WRITE (PCI_1BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe);
++
++ /* ronen:
++ * update the pci internal registers base address.
++ */
++#ifdef MAP_PCI
++ for (stat = 0; stat <= PCI_HOST1; stat++)
++ pciWriteConfigReg (stat,
++ PCI_INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS,
++ SELF, CFG_GT_REGS);
++#endif
++
++}
++#endif
++
++/* Setup CPU interface paramaters */
++static void gt_cpu_config (void)
++{
++ cpu_t cpu = get_cpu_type ();
++ ulong tmp;
++
++ /* cpu configuration register */
++ tmp = GTREGREAD (CPU_CONFIGURATION);
++ /* set the SINGLE_CPU bit see MV64460 */
++#ifndef CFG_GT_DUAL_CPU /* SINGLE_CPU seems to cause JTAG problems */
++ tmp |= CPU_CONF_SINGLE_CPU;
++#endif
++ tmp &= ~CPU_CONF_AACK_DELAY_2;
++ tmp |= CPU_CONF_DP_VALID;
++ tmp |= CPU_CONF_AP_VALID;
++ tmp |= CPU_CONF_PIPELINE;
++ GT_REG_WRITE (CPU_CONFIGURATION, tmp); /* Marvell (VXWorks) writes 0x20220FF */
++
++ /* CPU master control register */
++ tmp = GTREGREAD (CPU_MASTER_CONTROL);
++ tmp |= CPU_MAST_CTL_ARB_EN;
++
++ if ((cpu == CPU_7400) ||
++ (cpu == CPU_7410) || (cpu == CPU_7455) || (cpu == CPU_7450)) {
++
++ tmp |= CPU_MAST_CTL_CLEAN_BLK;
++ tmp |= CPU_MAST_CTL_FLUSH_BLK;
++
++ } else {
++ /* cleanblock must be cleared for CPUs
++ * that do not support this command (603e, 750)
++ * see Res#1 */
++ tmp &= ~CPU_MAST_CTL_CLEAN_BLK;
++ tmp &= ~CPU_MAST_CTL_FLUSH_BLK;
++ }
++ GT_REG_WRITE (CPU_MASTER_CONTROL, tmp);
++}
++
++/*
++ * board_early_init_f.
++ *
++ * set up gal. device mappings, etc.
++ */
++int board_early_init_f (void)
++{
++ /* set up the GT the way the kernel wants it
++ * the call to move the GT register space will obviously
++ * fail if it has already been done, but we're going to assume
++ * that if it's not at the power-on location, it's where we put
++ * it last time. (huber)
++ */
++
++ my_remap_gt_regs (CFG_DFL_GT_REGS, CFG_GT_REGS);
++
++#ifdef CONFIG_PCI
++ gt_pci_config ();
++#endif
++ /* mask all external interrupt sources */
++ GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_LOW, 0);
++ GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_HIGH, 0);
++ /* new in >MV6436x */
++ GT_REG_WRITE (CPU_INTERRUPT_1_MASK_REGISTER_LOW, 0);
++ GT_REG_WRITE (CPU_INTERRUPT_1_MASK_REGISTER_HIGH, 0);
++ /* --------------------- */
++ GT_REG_WRITE (PCI_0INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0);
++ GT_REG_WRITE (PCI_0INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0);
++ GT_REG_WRITE (PCI_1INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0);
++ GT_REG_WRITE (PCI_1INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0);
++
++ /* Device and Boot bus settings
++ */
++ memoryMapDeviceSpace(DEVICE0, 0, 0);
++ GT_REG_WRITE(DEVICE_BANK0PARAMETERS, 0);
++ memoryMapDeviceSpace(DEVICE1, 0, 0);
++ GT_REG_WRITE(DEVICE_BANK1PARAMETERS, 0);
++ memoryMapDeviceSpace(DEVICE2, 0, 0);
++ GT_REG_WRITE(DEVICE_BANK2PARAMETERS, 0);
++ memoryMapDeviceSpace(DEVICE3, 0, 0);
++ GT_REG_WRITE(DEVICE_BANK3PARAMETERS, 0);
++
++ GT_REG_WRITE(DEVICE_BOOT_BANK_PARAMETERS, CFG_BOOT_PAR);
++
++ gt_cpu_config();
++
++ /* MPP setup */
++ GT_REG_WRITE (MPP_CONTROL0, CFG_MPP_CONTROL_0);
++ GT_REG_WRITE (MPP_CONTROL1, CFG_MPP_CONTROL_1);
++ GT_REG_WRITE (MPP_CONTROL2, CFG_MPP_CONTROL_2);
++ GT_REG_WRITE (MPP_CONTROL3, CFG_MPP_CONTROL_3);
++
++ GT_REG_WRITE (GPP_LEVEL_CONTROL, CFG_GPP_LEVEL_CONTROL);
++
++ return 0;
++}
++
++/* various things to do after relocation */
++
++int misc_init_r ()
++{
++ u8 val;
++
++ icache_enable ();
++#ifdef CFG_L2
++ l2cache_enable ();
++#endif
++#ifdef CONFIG_MPSC
++ mpsc_sdma_init ();
++ mpsc_init2 ();
++#endif
++
++ /*
++ * Enable trickle changing in RTC upon powerup
++ * No diode, 250 ohm series resistor
++ */
++ val = 0xa5;
++ i2c_write(CFG_I2C_RTC_ADDR, 8, 1, &val, 1);
++
++ return 0;
++}
++
++int board_early_init_r(void)
++{
++ /* now relocate the debug serial driver */
++ mpsc_putchar += gd->reloc_off;
++ mpsc_getchar += gd->reloc_off;
++ mpsc_test_char += gd->reloc_off;
++
++ return 0;
++}
++
++void after_reloc (ulong dest_addr, gd_t * gd)
++{
++ memoryMapDeviceSpace (BOOT_DEVICE, CFG_BOOT_SPACE, CFG_BOOT_SIZE);
++
++/* display_mem_map(); */
++
++ /* now, jump to the main U-Boot board init code */
++ board_init_r (gd, dest_addr);
++ /* NOTREACHED */
++}
++
++/*
++ * Check Board Identity:
++ * right now, assume borad type. (there is just one...after all)
++ */
++
++int checkboard (void)
++{
++ char *s = getenv("serial#");
++
++ printf("Board: %s", CFG_BOARD_NAME);
++
++ if (s != NULL) {
++ puts(", serial# ");
++ puts(s);
++ }
++ putc('\n');
++
++ return (0);
++}
++
++/* utility functions */
++void debug_led (int led, int mode)
++{
++}
++
++int display_mem_map (void)
++{
++ int i, j;
++ unsigned int base, size, width;
++
++ /* SDRAM */
++ printf ("SD (DDR) RAM\n");
++ for (i = 0; i <= BANK3; i++) {
++ base = memoryGetBankBaseAddress (i);
++ size = memoryGetBankSize (i);
++ if (size != 0)
++ printf ("BANK%d: base - 0x%08x\tsize - %dM bytes\n",
++ i, base, size >> 20);
++ }
++#ifdef CONFIG_PCI
++ /* CPU's PCI windows */
++ for (i = 0; i <= PCI_HOST1; i++) {
++ printf ("\nCPU's PCI %d windows\n", i);
++ base = pciGetSpaceBase (i, PCI_IO);
++ size = pciGetSpaceSize (i, PCI_IO);
++ printf (" IO: base - 0x%08x\tsize - %dM bytes\n", base,
++ size >> 20);
++ /* ronen currently only first PCI MEM is used 3 */
++ for (j = 0; j <= PCI_REGION0; j++) {
++ base = pciGetSpaceBase (i, j);
++ size = pciGetSpaceSize (i, j);
++ printf ("MEMORY %d: base - 0x%08x\tsize - %dM bytes\n",
++ j, base, size >> 20);
++ }
++ }
++#endif /* of CONFIG_PCI */
++
++ /* Bootrom */
++ base = memoryGetDeviceBaseAddress (BOOT_DEVICE); /* Boot */
++ size = memoryGetDeviceSize (BOOT_DEVICE);
++ width = memoryGetDeviceWidth (BOOT_DEVICE) * 8;
++ printf (" BOOT: base - 0x%08x size - %dM bytes\twidth - %d bits\t- FLASH\n",
++ base, size >> 20, width);
++
++ return (0);
++}
++
++/* DRAM check routines copied from gw8260 */
++
++#if defined (CFG_DRAM_TEST)
++
++/*********************************************************************/
++/* NAME: move64() - moves a double word (64-bit) */
++/* */
++/* DESCRIPTION: */
++/* this function performs a double word move from the data at */
++/* the source pointer to the location at the destination pointer. */
++/* */
++/* INPUTS: */
++/* unsigned long long *src - pointer to data to move */
++/* */
++/* OUTPUTS: */
++/* unsigned long long *dest - pointer to locate to move data */
++/* */
++/* RETURNS: */
++/* None */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* May cloober fr0. */
++/* */
++/*********************************************************************/
++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 */
++ return;
++}
++
++
++#if defined (CFG_DRAM_TEST_DATA)
++
++unsigned long long pattern[] = {
++ 0xaaaaaaaaaaaaaaaaULL,
++ 0xccccccccccccccccULL,
++ 0xf0f0f0f0f0f0f0f0ULL,
++ 0xff00ff00ff00ff00ULL,
++ 0xffff0000ffff0000ULL,
++ 0xffffffff00000000ULL,
++ 0x00000000ffffffffULL,
++ 0x0000ffff0000ffffULL,
++ 0x00ff00ff00ff00ffULL,
++ 0x0f0f0f0f0f0f0f0fULL,
++ 0x3333333333333333ULL,
++ 0x5555555555555555ULL
++};
++
++/*********************************************************************/
++/* NAME: mem_test_data() - test data lines for shorts and opens */
++/* */
++/* DESCRIPTION: */
++/* Tests data lines for shorts and opens by forcing adjacent data */
++/* to opposite states. Because the data lines could be routed in */
++/* an arbitrary manner the must ensure test patterns ensure that */
++/* every case is tested. By using the following series of binary */
++/* patterns every combination of adjacent bits is test regardless */
++/* of routing. */
++/* */
++/* ...101010101010101010101010 */
++/* ...110011001100110011001100 */
++/* ...111100001111000011110000 */
++/* ...111111110000000011111111 */
++/* */
++/* Carrying this out, gives us six hex patterns as follows: */
++/* */
++/* 0xaaaaaaaaaaaaaaaa */
++/* 0xcccccccccccccccc */
++/* 0xf0f0f0f0f0f0f0f0 */
++/* 0xff00ff00ff00ff00 */
++/* 0xffff0000ffff0000 */
++/* 0xffffffff00000000 */
++/* */
++/* The number test patterns will always be given by: */
++/* */
++/* log(base 2)(number data bits) = log2 (64) = 6 */
++/* */
++/* To test for short and opens to other signals on our boards. we */
++/* simply */
++/* test with the 1's complemnt of the paterns as well. */
++/* */
++/* OUTPUTS: */
++/* Displays failing test pattern */
++/* */
++/* RETURNS: */
++/* 0 - Passed test */
++/* 1 - Failed test */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* Assumes only one one SDRAM bank */
++/* */
++/*********************************************************************/
++int mem_test_data (void)
++{
++ unsigned long long *pmem = (unsigned long long *) CFG_MEMTEST_START;
++ unsigned long long temp64 = 0;
++ int num_patterns = sizeof (pattern) / sizeof (pattern[0]);
++ int i;
++ unsigned int hi, lo;
++
++ for (i = 0; i < num_patterns; i++) {
++ move64 (&(pattern[i]), pmem);
++ move64 (pmem, &temp64);
++
++ /* hi = (temp64>>32) & 0xffffffff; */
++ /* lo = temp64 & 0xffffffff; */
++ /* printf("\ntemp64 = 0x%08x%08x", hi, lo); */
++
++ hi = (pattern[i] >> 32) & 0xffffffff;
++ lo = pattern[i] & 0xffffffff;
++ /* printf("\npattern[%d] = 0x%08x%08x", i, hi, lo); */
++
++ if (temp64 != pattern[i]) {
++ printf ("\n Data Test Failed, pattern 0x%08x%08x",
++ hi, lo);
++ return 1;
++ }
++ }
++
++ return 0;
++}
++#endif /* CFG_DRAM_TEST_DATA */
++
++#if defined (CFG_DRAM_TEST_ADDRESS)
++/*********************************************************************/
++/* NAME: mem_test_address() - test address lines */
++/* */
++/* DESCRIPTION: */
++/* This function performs a test to verify that each word im */
++/* memory is uniquly addressable. The test sequence is as follows: */
++/* */
++/* 1) write the address of each word to each word. */
++/* 2) verify that each location equals its address */
++/* */
++/* OUTPUTS: */
++/* Displays failing test pattern and address */
++/* */
++/* RETURNS: */
++/* 0 - Passed test */
++/* 1 - Failed test */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* */
++/* */
++/*********************************************************************/
++int mem_test_address (void)
++{
++ volatile unsigned int *pmem =
++ (volatile unsigned int *) CFG_MEMTEST_START;
++ const unsigned int size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 4;
++ unsigned int i;
++
++ /* write address to each location */
++ for (i = 0; i < size; i++)
++ pmem[i] = i;
++
++ /* verify each loaction */
++ for (i = 0; i < size; i++) {
++ if (pmem[i] != i) {
++ printf ("\n Address Test Failed at 0x%x", i);
++ return 1;
++ }
++ }
++ return 0;
++}
++#endif /* CFG_DRAM_TEST_ADDRESS */
++
++#if defined (CFG_DRAM_TEST_WALK)
++/*********************************************************************/
++/* NAME: mem_march() - memory march */
++/* */
++/* DESCRIPTION: */
++/* Marches up through memory. At each location verifies rmask if */
++/* read = 1. At each location write wmask if write = 1. Displays */
++/* failing address and pattern. */
++/* */
++/* INPUTS: */
++/* volatile unsigned long long * base - start address of test */
++/* unsigned int size - number of dwords(64-bit) to test */
++/* unsigned long long rmask - read verify mask */
++/* unsigned long long wmask - wrtie verify mask */
++/* short read - verifies rmask if read = 1 */
++/* short write - writes wmask if write = 1 */
++/* */
++/* OUTPUTS: */
++/* Displays failing test pattern and address */
++/* */
++/* RETURNS: */
++/* 0 - Passed test */
++/* 1 - Failed test */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* */
++/* */
++/*********************************************************************/
++int mem_march (volatile unsigned long long *base,
++ unsigned int size,
++ unsigned long long rmask,
++ unsigned long long wmask, short read, short write)
++{
++ unsigned int i;
++ unsigned long long temp = 0;
++ unsigned int hitemp, lotemp, himask, lomask;
++
++ for (i = 0; i < size; i++) {
++ if (read != 0) {
++ /* temp = base[i]; */
++ move64 ((unsigned long long *) &(base[i]), &temp);
++ if (rmask != temp) {
++ hitemp = (temp >> 32) & 0xffffffff;
++ lotemp = temp & 0xffffffff;
++ himask = (rmask >> 32) & 0xffffffff;
++ lomask = rmask & 0xffffffff;
++
++ printf ("\n Walking one's test failed: address = 0x%08x," "\n\texpected 0x%08x%08x, found 0x%08x%08x", i << 3, himask, lomask, hitemp, lotemp);
++ return 1;
++ }
++ }
++ if (write != 0) {
++ /* base[i] = wmask; */
++ move64 (&wmask, (unsigned long long *) &(base[i]));
++ }
++ }
++ return 0;
++}
++#endif /* CFG_DRAM_TEST_WALK */
++
++/*********************************************************************/
++/* NAME: mem_test_walk() - a simple walking ones test */
++/* */
++/* DESCRIPTION: */
++/* Performs a walking ones through entire physical memory. The */
++/* test uses as series of memory marches, mem_march(), to verify */
++/* and write the test patterns to memory. The test sequence is as */
++/* follows: */
++/* 1) march writing 0000...0001 */
++/* 2) march verifying 0000...0001 , writing 0000...0010 */
++/* 3) repeat step 2 shifting masks left 1 bit each time unitl */
++/* the write mask equals 1000...0000 */
++/* 4) march verifying 1000...0000 */
++/* The test fails if any of the memory marches return a failure. */
++/* */
++/* OUTPUTS: */
++/* Displays which pass on the memory test is executing */
++/* */
++/* RETURNS: */
++/* 0 - Passed test */
++/* 1 - Failed test */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* */
++/* */
++/*********************************************************************/
++int mem_test_walk (void)
++{
++ unsigned long long mask;
++ volatile unsigned long long *pmem =
++ (volatile unsigned long long *) CFG_MEMTEST_START;
++ const unsigned long size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 8;
++
++ unsigned int i;
++
++ mask = 0x01;
++
++ printf ("Initial Pass");
++ mem_march (pmem, size, 0x0, 0x1, 0, 1);
++
++ printf ("\b\b\b\b\b\b\b\b\b\b\b\b");
++ printf (" ");
++ printf (" ");
++ printf ("\b\b\b\b\b\b\b\b\b\b\b\b");
++
++ for (i = 0; i < 63; i++) {
++ printf ("Pass %2d", i + 2);
++ if (mem_march (pmem, size, mask, mask << 1, 1, 1) != 0) {
++ /*printf("mask: 0x%x, pass: %d, ", mask, i); */
++ return 1;
++ }
++ mask = mask << 1;
++ printf ("\b\b\b\b\b\b\b");
++ }
++
++ printf ("Last Pass");
++ if (mem_march (pmem, size, 0, mask, 0, 1) != 0) {
++ /* printf("mask: 0x%x", mask); */
++ return 1;
++ }
++ printf ("\b\b\b\b\b\b\b\b\b");
++ printf (" ");
++ printf ("\b\b\b\b\b\b\b\b\b");
++
++ return 0;
++}
++
++/*********************************************************************/
++/* NAME: testdram() - calls any enabled memory tests */
++/* */
++/* DESCRIPTION: */
++/* Runs memory tests if the environment test variables are set to */
++/* 'y'. */
++/* */
++/* INPUTS: */
++/* testdramdata - If set to 'y', data test is run. */
++/* testdramaddress - If set to 'y', address test is run. */
++/* testdramwalk - If set to 'y', walking ones test is run */
++/* */
++/* OUTPUTS: */
++/* None */
++/* */
++/* RETURNS: */
++/* 0 - Passed test */
++/* 1 - Failed test */
++/* */
++/* RESTRICTIONS/LIMITATIONS: */
++/* */
++/* */
++/*********************************************************************/
++int testdram (void)
++{
++ char *s;
++ int rundata = 0;
++ int runaddress = 0;
++ int runwalk = 0;
++
++#ifdef CFG_DRAM_TEST_DATA
++ s = getenv ("testdramdata");
++ rundata = (s && (*s == 'y')) ? 1 : 0;
++#endif
++#ifdef CFG_DRAM_TEST_ADDRESS
++ s = getenv ("testdramaddress");
++ runaddress = (s && (*s == 'y')) ? 1 : 0;
++#endif
++#ifdef CFG_DRAM_TEST_WALK
++ s = getenv ("testdramwalk");
++ runwalk = (s && (*s == 'y')) ? 1 : 0;
++#endif
++
++ if ((rundata == 1) || (runaddress == 1) || (runwalk == 1))
++ printf ("Testing RAM from 0x%08x to 0x%08x ... "
++ "(don't panic... that will take a moment !!!!)\n",
++ CFG_MEMTEST_START, CFG_MEMTEST_END);
++#ifdef CFG_DRAM_TEST_DATA
++ if (rundata == 1) {
++ printf ("Test DATA ... ");
++ if (mem_test_data () == 1) {
++ printf ("failed \n");
++ return 1;
++ } else
++ printf ("ok \n");
++ }
++#endif
++#ifdef CFG_DRAM_TEST_ADDRESS
++ if (runaddress == 1) {
++ printf ("Test ADDRESS ... ");
++ if (mem_test_address () == 1) {
++ printf ("failed \n");
++ return 1;
++ } else
++ printf ("ok \n");
++ }
++#endif
++#ifdef CFG_DRAM_TEST_WALK
++ if (runwalk == 1) {
++ printf ("Test WALKING ONEs ... ");
++ if (mem_test_walk () == 1) {
++ printf ("failed \n");
++ return 1;
++ } else
++ printf ("ok \n");
++ }
++#endif
++ if ((rundata == 1) || (runaddress == 1) || (runwalk == 1))
++ printf ("passed\n");
++ return 0;
++
++}
++#endif /* CFG_DRAM_TEST */
++
++/* 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. */
++void my_remap_gt_regs_bootm (u32 cur_loc, u32 new_loc)
++{
++ u32 temp;
++
++ temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE));
++ if ((temp & 0xffff) == new_loc >> 16)
++ return;
++
++ temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) &
++ 0xffff0000) | (new_loc >> 16);
++
++ out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp);
++
++ while ((WORD_SWAP (*((volatile unsigned int *) (NONE_CACHEABLE |
++ new_loc |
++ (INTERNAL_SPACE_DECODE)))))
++ != temp);
++
++}
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/pci.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/pci.c
+--- u-boot-1.1.6/board/prodrive/p3mx/pci.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/pci.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,1025 @@
++/*
++ * (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
++ *
++ */
++/* PCI.c - PCI functions */
++
++
++#include <common.h>
++#ifdef CONFIG_PCI
++#include <pci.h>
++
++#ifdef CONFIG_PCI_PNP
++void pciauto_config_init(struct pci_controller *hose);
++int pciauto_region_allocate(struct pci_region* res, unsigned int size, unsigned int *bar);
++#endif
++
++#include "../../Marvell/include/pci.h"
++
++#undef DEBUG
++#undef IDE_SET_NATIVE_MODE
++static unsigned int local_buses[] = { 0, 0 };
++
++static const unsigned char pci_irq_swizzle[2][PCI_MAX_DEVICES] = {
++ {0, 0, 0, 0, 0, 0, 0, 27, 27, [9 ... PCI_MAX_DEVICES - 1] = 0 },
++ {0, 0, 0, 0, 0, 0, 0, 29, 29, [9 ... PCI_MAX_DEVICES - 1] = 0 },
++};
++
++#ifdef CONFIG_USE_CPCIDVI
++typedef struct {
++ unsigned int base;
++ unsigned int init;
++} GT_CPCIDVI_ROM_T;
++
++static GT_CPCIDVI_ROM_T gt_cpcidvi_rom = {0, 0};
++#endif
++
++#ifdef DEBUG
++static const unsigned int pci_bus_list[] = { PCI_0_MODE, PCI_1_MODE };
++static void gt_pci_bus_mode_display (PCI_HOST host)
++{
++ unsigned int mode;
++
++
++ mode = (GTREGREAD (pci_bus_list[host]) & (BIT4 | BIT5)) >> 4;
++ switch (mode) {
++ case 0:
++ printf ("PCI %d bus mode: Conventional PCI\n", host);
++ break;
++ case 1:
++ printf ("PCI %d bus mode: 66 Mhz PCIX\n", host);
++ break;
++ case 2:
++ printf ("PCI %d bus mode: 100 Mhz PCIX\n", host);
++ break;
++ case 3:
++ printf ("PCI %d bus mode: 133 Mhz PCIX\n", host);
++ break;
++ default:
++ printf ("Unknown BUS %d\n", mode);
++ }
++}
++#endif
++
++static const unsigned int pci_p2p_configuration_reg[] = {
++ PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION
++};
++
++static const unsigned int pci_configuration_address[] = {
++ PCI_0CONFIGURATION_ADDRESS, PCI_1CONFIGURATION_ADDRESS
++};
++
++static const unsigned int pci_configuration_data[] = {
++ PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
++ PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER
++};
++
++static const unsigned int pci_error_cause_reg[] = {
++ PCI_0ERROR_CAUSE, PCI_1ERROR_CAUSE
++};
++
++static const unsigned int pci_arbiter_control[] = {
++ PCI_0ARBITER_CONTROL, PCI_1ARBITER_CONTROL
++};
++
++static const unsigned int pci_address_space_en[] = {
++ PCI_0_BASE_ADDR_REG_ENABLE, PCI_1_BASE_ADDR_REG_ENABLE
++};
++
++static const unsigned int pci_snoop_control_base_0_low[] = {
++ PCI_0SNOOP_CONTROL_BASE_0_LOW, PCI_1SNOOP_CONTROL_BASE_0_LOW
++};
++static const unsigned int pci_snoop_control_top_0[] = {
++ PCI_0SNOOP_CONTROL_TOP_0, PCI_1SNOOP_CONTROL_TOP_0
++};
++
++static const unsigned int pci_access_control_base_0_low[] = {
++ PCI_0ACCESS_CONTROL_BASE_0_LOW, PCI_1ACCESS_CONTROL_BASE_0_LOW
++};
++static const unsigned int pci_access_control_top_0[] = {
++ PCI_0ACCESS_CONTROL_TOP_0, PCI_1ACCESS_CONTROL_TOP_0
++};
++
++static const unsigned int pci_scs_bank_size[2][4] = {
++ {PCI_0SCS_0_BANK_SIZE, PCI_0SCS_1_BANK_SIZE,
++ PCI_0SCS_2_BANK_SIZE, PCI_0SCS_3_BANK_SIZE},
++ {PCI_1SCS_0_BANK_SIZE, PCI_1SCS_1_BANK_SIZE,
++ PCI_1SCS_2_BANK_SIZE, PCI_1SCS_3_BANK_SIZE}
++};
++
++static const unsigned int pci_p2p_configuration[] = {
++ PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION
++};
++
++
++/********************************************************************
++* pciWriteConfigReg - Write to a PCI configuration register
++* - Make sure the GT is configured as a master before writing
++* to another device on the PCI.
++* - The function takes care of Big/Little endian conversion.
++*
++*
++* Inputs: unsigned int regOffset: The register offset as it apears in the GT spec
++* (or any other PCI device spec)
++* pciDevNum: The device number needs to be addressed.
++*
++* Configuration Address 0xCF8:
++*
++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
++* |congif|Reserved| Bus |Device|Function|Register|00|
++* |Enable| |Number|Number| Number | Number | | <=field Name
++*
++*********************************************************************/
++void pciWriteConfigReg (PCI_HOST host, unsigned int regOffset,
++ unsigned int pciDevNum, unsigned int data)
++{
++ volatile unsigned int DataForAddrReg;
++ unsigned int functionNum;
++ unsigned int busNum = 0;
++ unsigned int addr;
++
++ if (pciDevNum > 32) /* illegal device Number */
++ return;
++ if (pciDevNum == SELF) { /* configure our configuration space. */
++ pciDevNum =
++ (GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) &
++ 0x1f;
++ busNum = GTREGREAD (pci_p2p_configuration_reg[host]) &
++ 0xff0000;
++ }
++ functionNum = regOffset & 0x00000700;
++ pciDevNum = pciDevNum << 11;
++ regOffset = regOffset & 0xfc;
++ DataForAddrReg =
++ (regOffset | pciDevNum | functionNum | busNum) | BIT31;
++ GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg);
++ GT_REG_READ (pci_configuration_address[host], &addr);
++ if (addr != DataForAddrReg)
++ return;
++ GT_REG_WRITE (pci_configuration_data[host], data);
++}
++
++/********************************************************************
++* pciReadConfigReg - Read from a PCI0 configuration register
++* - Make sure the GT is configured as a master before reading
++* from another device on the PCI.
++* - The function takes care of Big/Little endian conversion.
++* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI
++* spec)
++* pciDevNum: The device number needs to be addressed.
++* RETURNS: data , if the data == 0xffffffff check the master abort bit in the
++* cause register to make sure the data is valid
++*
++* Configuration Address 0xCF8:
++*
++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
++* |congif|Reserved| Bus |Device|Function|Register|00|
++* |Enable| |Number|Number| Number | Number | | <=field Name
++*
++*********************************************************************/
++unsigned int pciReadConfigReg (PCI_HOST host, unsigned int regOffset,
++ unsigned int pciDevNum)
++{
++ volatile unsigned int DataForAddrReg;
++ unsigned int data;
++ unsigned int functionNum;
++ unsigned int busNum = 0;
++
++ if (pciDevNum > 32) /* illegal device Number */
++ return 0xffffffff;
++ if (pciDevNum == SELF) { /* configure our configuration space. */
++ pciDevNum =
++ (GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) &
++ 0x1f;
++ busNum = GTREGREAD (pci_p2p_configuration_reg[host]) &
++ 0xff0000;
++ }
++ functionNum = regOffset & 0x00000700;
++ pciDevNum = pciDevNum << 11;
++ regOffset = regOffset & 0xfc;
++ DataForAddrReg =
++ (regOffset | pciDevNum | functionNum | busNum) | BIT31;
++ GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg);
++ GT_REG_READ (pci_configuration_address[host], &data);
++ if (data != DataForAddrReg)
++ return 0xffffffff;
++ GT_REG_READ (pci_configuration_data[host], &data);
++ return data;
++}
++
++/********************************************************************
++* pciOverBridgeWriteConfigReg - Write to a PCI configuration register where
++* the agent is placed on another Bus. For more
++* information read P2P in the PCI spec.
++*
++* Inputs: unsigned int regOffset - The register offset as it apears in the
++* GT spec (or any other PCI device spec).
++* unsigned int pciDevNum - The device number needs to be addressed.
++* unsigned int busNum - On which bus does the Target agent connect
++* to.
++* unsigned int data - data to be written.
++*
++* Configuration Address 0xCF8:
++*
++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
++* |congif|Reserved| Bus |Device|Function|Register|01|
++* |Enable| |Number|Number| Number | Number | | <=field Name
++*
++* The configuration Address is configure as type-I (bits[1:0] = '01') due to
++* PCI spec referring to P2P.
++*
++*********************************************************************/
++void pciOverBridgeWriteConfigReg (PCI_HOST host,
++ unsigned int regOffset,
++ unsigned int pciDevNum,
++ unsigned int busNum, unsigned int data)
++{
++ unsigned int DataForReg;
++ unsigned int functionNum;
++
++ functionNum = regOffset & 0x00000700;
++ pciDevNum = pciDevNum << 11;
++ regOffset = regOffset & 0xff;
++ busNum = busNum << 16;
++ if (pciDevNum == SELF) { /* This board */
++ DataForReg = (regOffset | pciDevNum | functionNum) | BIT0;
++ } else {
++ DataForReg = (regOffset | pciDevNum | functionNum | busNum) |
++ BIT31 | BIT0;
++ }
++ GT_REG_WRITE (pci_configuration_address[host], DataForReg);
++ GT_REG_WRITE (pci_configuration_data[host], data);
++}
++
++
++/********************************************************************
++* pciOverBridgeReadConfigReg - Read from a PCIn configuration register where
++* the agent target locate on another PCI bus.
++* - Make sure the GT is configured as a master
++* before reading from another device on the PCI.
++* - The function takes care of Big/Little endian
++* conversion.
++* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI
++* spec). (configuration register offset.)
++* pciDevNum: The device number needs to be addressed.
++* busNum: the Bus number where the agent is place.
++* RETURNS: data , if the data == 0xffffffff check the master abort bit in the
++* cause register to make sure the data is valid
++*
++* Configuration Address 0xCF8:
++*
++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number
++* |congif|Reserved| Bus |Device|Function|Register|01|
++* |Enable| |Number|Number| Number | Number | | <=field Name
++*
++*********************************************************************/
++unsigned int pciOverBridgeReadConfigReg (PCI_HOST host,
++ unsigned int regOffset,
++ unsigned int pciDevNum,
++ unsigned int busNum)
++{
++ unsigned int DataForReg;
++ unsigned int data;
++ unsigned int functionNum;
++
++ functionNum = regOffset & 0x00000700;
++ pciDevNum = pciDevNum << 11;
++ regOffset = regOffset & 0xff;
++ busNum = busNum << 16;
++ if (pciDevNum == SELF) { /* This board */
++ DataForReg = (regOffset | pciDevNum | functionNum) | BIT31;
++ } else { /* agent on another bus */
++
++ DataForReg = (regOffset | pciDevNum | functionNum | busNum) |
++ BIT0 | BIT31;
++ }
++ GT_REG_WRITE (pci_configuration_address[host], DataForReg);
++ GT_REG_READ (pci_configuration_data[host], &data);
++ return data;
++}
++
++
++/********************************************************************
++* pciGetRegOffset - Gets the register offset for this region config.
++*
++* INPUT: Bus, Region - The bus and region we ask for its base address.
++* OUTPUT: N/A
++* RETURNS: PCI register base address
++*********************************************************************/
++static unsigned int pciGetRegOffset (PCI_HOST host, PCI_REGION region)
++{
++ switch (host) {
++ case PCI_HOST0:
++ switch (region) {
++ case PCI_IO:
++ return PCI_0I_O_LOW_DECODE_ADDRESS;
++ case PCI_REGION0:
++ return PCI_0MEMORY0_LOW_DECODE_ADDRESS;
++ case PCI_REGION1:
++ return PCI_0MEMORY1_LOW_DECODE_ADDRESS;
++ case PCI_REGION2:
++ return PCI_0MEMORY2_LOW_DECODE_ADDRESS;
++ case PCI_REGION3:
++ return PCI_0MEMORY3_LOW_DECODE_ADDRESS;
++ }
++ case PCI_HOST1:
++ switch (region) {
++ case PCI_IO:
++ return PCI_1I_O_LOW_DECODE_ADDRESS;
++ case PCI_REGION0:
++ return PCI_1MEMORY0_LOW_DECODE_ADDRESS;
++ case PCI_REGION1:
++ return PCI_1MEMORY1_LOW_DECODE_ADDRESS;
++ case PCI_REGION2:
++ return PCI_1MEMORY2_LOW_DECODE_ADDRESS;
++ case PCI_REGION3:
++ return PCI_1MEMORY3_LOW_DECODE_ADDRESS;
++ }
++ }
++ return PCI_0MEMORY0_LOW_DECODE_ADDRESS;
++}
++
++static unsigned int pciGetRemapOffset (PCI_HOST host, PCI_REGION region)
++{
++ switch (host) {
++ case PCI_HOST0:
++ switch (region) {
++ case PCI_IO:
++ return PCI_0I_O_ADDRESS_REMAP;
++ case PCI_REGION0:
++ return PCI_0MEMORY0_ADDRESS_REMAP;
++ case PCI_REGION1:
++ return PCI_0MEMORY1_ADDRESS_REMAP;
++ case PCI_REGION2:
++ return PCI_0MEMORY2_ADDRESS_REMAP;
++ case PCI_REGION3:
++ return PCI_0MEMORY3_ADDRESS_REMAP;
++ }
++ case PCI_HOST1:
++ switch (region) {
++ case PCI_IO:
++ return PCI_1I_O_ADDRESS_REMAP;
++ case PCI_REGION0:
++ return PCI_1MEMORY0_ADDRESS_REMAP;
++ case PCI_REGION1:
++ return PCI_1MEMORY1_ADDRESS_REMAP;
++ case PCI_REGION2:
++ return PCI_1MEMORY2_ADDRESS_REMAP;
++ case PCI_REGION3:
++ return PCI_1MEMORY3_ADDRESS_REMAP;
++ }
++ }
++ return PCI_0MEMORY0_ADDRESS_REMAP;
++}
++
++/********************************************************************
++* pciGetBaseAddress - Gets the base address of a PCI.
++* - If the PCI size is 0 then this base address has no meaning!!!
++*
++*
++* INPUT: Bus, Region - The bus and region we ask for its base address.
++* OUTPUT: N/A
++* RETURNS: PCI base address.
++*********************************************************************/
++unsigned int pciGetBaseAddress (PCI_HOST host, PCI_REGION region)
++{
++ unsigned int regBase;
++ unsigned int regEnd;
++ unsigned int regOffset = pciGetRegOffset (host, region);
++
++ GT_REG_READ (regOffset, &regBase);
++ GT_REG_READ (regOffset + 8, &regEnd);
++
++ if (regEnd <= regBase)
++ return 0xffffffff; /* ERROR !!! */
++
++ regBase = regBase << 16;
++ return regBase;
++}
++
++bool pciMapSpace (PCI_HOST host, PCI_REGION region, unsigned int remapBase,
++ unsigned int bankBase, unsigned int bankLength)
++{
++ unsigned int low = 0xfff;
++ unsigned int high = 0x0;
++ unsigned int regOffset = pciGetRegOffset (host, region);
++ unsigned int remapOffset = pciGetRemapOffset (host, region);
++
++ if (bankLength != 0) {
++ low = (bankBase >> 16) & 0xffff;
++ high = ((bankBase + bankLength) >> 16) - 1;
++ }
++
++ GT_REG_WRITE (regOffset, low | (1 << 24)); /* no swapping */
++ GT_REG_WRITE (regOffset + 8, high);
++
++ if (bankLength != 0) { /* must do AFTER writing maps */
++ GT_REG_WRITE (remapOffset, remapBase >> 16); /* sorry, 32 bits only.
++ dont support upper 32
++ in this driver */
++ }
++ return true;
++}
++
++unsigned int pciGetSpaceBase (PCI_HOST host, PCI_REGION region)
++{
++ unsigned int low;
++ unsigned int regOffset = pciGetRegOffset (host, region);
++
++ GT_REG_READ (regOffset, &low);
++ return (low & 0xffff) << 16;
++}
++
++unsigned int pciGetSpaceSize (PCI_HOST host, PCI_REGION region)
++{
++ unsigned int low, high;
++ unsigned int regOffset = pciGetRegOffset (host, region);
++
++ GT_REG_READ (regOffset, &low);
++ GT_REG_READ (regOffset + 8, &high);
++ return ((high & 0xffff) + 1) << 16;
++}
++
++
++/* ronen - 7/Dec/03*/
++/********************************************************************
++* gtPciDisable/EnableInternalBAR - This function enable/disable PCI BARS.
++* Inputs: one of the PCI BAR
++*********************************************************************/
++void gtPciEnableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR)
++{
++ RESET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR);
++}
++
++void gtPciDisableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR)
++{
++ SET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR);
++}
++
++/********************************************************************
++* pciMapMemoryBank - Maps PCI_host memory bank "bank" for the slave.
++*
++* Inputs: base and size of PCI SCS
++*********************************************************************/
++void pciMapMemoryBank (PCI_HOST host, MEMORY_BANK bank,
++ unsigned int pciDramBase, unsigned int pciDramSize)
++{
++ /*ronen different function for 3rd bank. */
++ unsigned int offset = (bank < 2) ? bank * 8 : 0x100 + (bank - 2) * 8;
++
++ pciDramBase = pciDramBase & 0xfffff000;
++ pciDramBase = pciDramBase | (pciReadConfigReg (host,
++ PCI_SCS_0_BASE_ADDRESS
++ + offset,
++ SELF) & 0x00000fff);
++ pciWriteConfigReg (host, PCI_SCS_0_BASE_ADDRESS + offset, SELF,
++ pciDramBase);
++ if (pciDramSize == 0)
++ pciDramSize++;
++ GT_REG_WRITE (pci_scs_bank_size[host][bank], pciDramSize - 1);
++ gtPciEnableInternalBAR (host, bank);
++}
++
++/********************************************************************
++* pciSetRegionFeatures - This function modifys one of the 8 regions with
++* feature bits given as an input.
++* - Be advised to check the spec before modifying them.
++* Inputs: PCI_PROTECT_REGION region - one of the eight regions.
++* unsigned int features - See file: pci.h there are defintion for those
++* region features.
++* unsigned int baseAddress - The region base Address.
++* unsigned int topAddress - The region top Address.
++* Returns: false if one of the parameters is erroneous true otherwise.
++*********************************************************************/
++bool pciSetRegionFeatures (PCI_HOST host, PCI_ACCESS_REGIONS region,
++ unsigned int features, unsigned int baseAddress,
++ unsigned int regionLength)
++{
++ unsigned int accessLow;
++ unsigned int accessHigh;
++ unsigned int accessTop = baseAddress + regionLength;
++
++ if (regionLength == 0) { /* close the region. */
++ pciDisableAccessRegion (host, region);
++ return true;
++ }
++ /* base Address is store is bits [11:0] */
++ accessLow = (baseAddress & 0xfff00000) >> 20;
++ /* All the features are update according to the defines in pci.h (to be on
++ the safe side we disable bits: [11:0] */
++ accessLow = accessLow | (features & 0xfffff000);
++ /* write to the Low Access Region register */
++ GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region,
++ accessLow);
++
++ accessHigh = (accessTop & 0xfff00000) >> 20;
++
++ /* write to the High Access Region register */
++ GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region,
++ accessHigh - 1);
++ return true;
++}
++
++/********************************************************************
++* pciDisableAccessRegion - Disable The given Region by writing MAX size
++* to its low Address and MIN size to its high Address.
++*
++* Inputs: PCI_ACCESS_REGIONS region - The region we to be Disabled.
++* Returns: N/A.
++*********************************************************************/
++void pciDisableAccessRegion (PCI_HOST host, PCI_ACCESS_REGIONS region)
++{
++ /* writing back the registers default values. */
++ GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region,
++ 0x01001fff);
++ GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region, 0);
++}
++
++/********************************************************************
++* pciArbiterEnable - Enables PCI-0`s Arbitration mechanism.
++*
++* Inputs: N/A
++* Returns: true.
++*********************************************************************/
++bool pciArbiterEnable (PCI_HOST host)
++{
++ unsigned int regData;
++
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ GT_REG_WRITE (pci_arbiter_control[host], regData | BIT31);
++ return true;
++}
++
++/********************************************************************
++* pciArbiterDisable - Disable PCI-0`s Arbitration mechanism.
++*
++* Inputs: N/A
++* Returns: true
++*********************************************************************/
++bool pciArbiterDisable (PCI_HOST host)
++{
++ unsigned int regData;
++
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ GT_REG_WRITE (pci_arbiter_control[host], regData & 0x7fffffff);
++ return true;
++}
++
++/********************************************************************
++* pciSetArbiterAgentsPriority - Priority setup for the PCI agents (Hi or Low)
++*
++* Inputs: PCI_AGENT_PRIO internalAgent - priotity for internal agent.
++* PCI_AGENT_PRIO externalAgent0 - priotity for external#0 agent.
++* PCI_AGENT_PRIO externalAgent1 - priotity for external#1 agent.
++* PCI_AGENT_PRIO externalAgent2 - priotity for external#2 agent.
++* PCI_AGENT_PRIO externalAgent3 - priotity for external#3 agent.
++* PCI_AGENT_PRIO externalAgent4 - priotity for external#4 agent.
++* PCI_AGENT_PRIO externalAgent5 - priotity for external#5 agent.
++* Returns: true
++*********************************************************************/
++bool pciSetArbiterAgentsPriority (PCI_HOST host, PCI_AGENT_PRIO internalAgent,
++ PCI_AGENT_PRIO externalAgent0,
++ PCI_AGENT_PRIO externalAgent1,
++ PCI_AGENT_PRIO externalAgent2,
++ PCI_AGENT_PRIO externalAgent3,
++ PCI_AGENT_PRIO externalAgent4,
++ PCI_AGENT_PRIO externalAgent5)
++{
++ unsigned int regData;
++ unsigned int writeData;
++
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ writeData = (internalAgent << 7) + (externalAgent0 << 8) +
++ (externalAgent1 << 9) + (externalAgent2 << 10) +
++ (externalAgent3 << 11) + (externalAgent4 << 12) +
++ (externalAgent5 << 13);
++ regData = (regData & 0xffffc07f) | writeData;
++ GT_REG_WRITE (pci_arbiter_control[host], regData & regData);
++ return true;
++}
++
++/********************************************************************
++* pciParkingDisable - Park on last option disable, with this function you can
++* disable the park on last mechanism for each agent.
++* disabling this option for all agents results parking
++* on the internal master.
++*
++* Inputs: PCI_AGENT_PARK internalAgent - parking Disable for internal agent.
++* PCI_AGENT_PARK externalAgent0 - parking Disable for external#0 agent.
++* PCI_AGENT_PARK externalAgent1 - parking Disable for external#1 agent.
++* PCI_AGENT_PARK externalAgent2 - parking Disable for external#2 agent.
++* PCI_AGENT_PARK externalAgent3 - parking Disable for external#3 agent.
++* PCI_AGENT_PARK externalAgent4 - parking Disable for external#4 agent.
++* PCI_AGENT_PARK externalAgent5 - parking Disable for external#5 agent.
++* Returns: true
++*********************************************************************/
++bool pciParkingDisable (PCI_HOST host, PCI_AGENT_PARK internalAgent,
++ PCI_AGENT_PARK externalAgent0,
++ PCI_AGENT_PARK externalAgent1,
++ PCI_AGENT_PARK externalAgent2,
++ PCI_AGENT_PARK externalAgent3,
++ PCI_AGENT_PARK externalAgent4,
++ PCI_AGENT_PARK externalAgent5)
++{
++ unsigned int regData;
++ unsigned int writeData;
++
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ writeData = (internalAgent << 14) + (externalAgent0 << 15) +
++ (externalAgent1 << 16) + (externalAgent2 << 17) +
++ (externalAgent3 << 18) + (externalAgent4 << 19) +
++ (externalAgent5 << 20);
++ regData = (regData & ~(0x7f << 14)) | writeData;
++ GT_REG_WRITE (pci_arbiter_control[host], regData);
++ return true;
++}
++
++/********************************************************************
++* pciEnableBrokenAgentDetection - A master is said to be broken if it fails to
++* respond to grant assertion within a window specified in
++* the input value: 'brokenValue'.
++*
++* Inputs: unsigned char brokenValue - A value which limits the Master to hold the
++* grant without asserting frame.
++* Returns: Error for illegal broken value otherwise true.
++*********************************************************************/
++bool pciEnableBrokenAgentDetection (PCI_HOST host, unsigned char brokenValue)
++{
++ unsigned int data;
++ unsigned int regData;
++
++ if (brokenValue > 0xf)
++ return false; /* brokenValue must be 4 bit */
++ data = brokenValue << 3;
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ regData = (regData & 0xffffff87) | data;
++ GT_REG_WRITE (pci_arbiter_control[host], regData | BIT1);
++ return true;
++}
++
++/********************************************************************
++* pciDisableBrokenAgentDetection - This function disable the Broken agent
++* Detection mechanism.
++* NOTE: This operation may cause a dead lock on the
++* pci0 arbitration.
++*
++* Inputs: N/A
++* Returns: true.
++*********************************************************************/
++bool pciDisableBrokenAgentDetection (PCI_HOST host)
++{
++ unsigned int regData;
++
++ GT_REG_READ (pci_arbiter_control[host], &regData);
++ regData = regData & 0xfffffffd;
++ GT_REG_WRITE (pci_arbiter_control[host], regData);
++ return true;
++}
++
++/********************************************************************
++* pciP2PConfig - This function set the PCI_n P2P configurate.
++* For more information on the P2P read PCI spec.
++*
++* Inputs: unsigned int SecondBusLow - Secondery PCI interface Bus Range Lower
++* Boundry.
++* unsigned int SecondBusHigh - Secondry PCI interface Bus Range upper
++* Boundry.
++* unsigned int busNum - The CPI bus number to which the PCI interface
++* is connected.
++* unsigned int devNum - The PCI interface's device number.
++*
++* Returns: true.
++*********************************************************************/
++bool pciP2PConfig (PCI_HOST host, unsigned int SecondBusLow,
++ unsigned int SecondBusHigh,
++ unsigned int busNum, unsigned int devNum)
++{
++ unsigned int regData;
++
++ regData = (SecondBusLow & 0xff) | ((SecondBusHigh & 0xff) << 8) |
++ ((busNum & 0xff) << 16) | ((devNum & 0x1f) << 24);
++ GT_REG_WRITE (pci_p2p_configuration[host], regData);
++ return true;
++}
++
++/********************************************************************
++* pciSetRegionSnoopMode - This function modifys one of the 4 regions which
++* supports Cache Coherency in the PCI_n interface.
++* Inputs: region - One of the four regions.
++* snoopType - There is four optional Types:
++* 1. No Snoop.
++* 2. Snoop to WT region.
++* 3. Snoop to WB region.
++* 4. Snoop & Invalidate to WB region.
++* baseAddress - Base Address of this region.
++* regionLength - Region length.
++* Returns: false if one of the parameters is wrong otherwise return true.
++*********************************************************************/
++bool pciSetRegionSnoopMode (PCI_HOST host, PCI_SNOOP_REGION region,
++ PCI_SNOOP_TYPE snoopType,
++ unsigned int baseAddress,
++ unsigned int regionLength)
++{
++ unsigned int snoopXbaseAddress;
++ unsigned int snoopXtopAddress;
++ unsigned int data;
++ unsigned int snoopHigh = baseAddress + regionLength;
++
++ if ((region > PCI_SNOOP_REGION3) || (snoopType > PCI_SNOOP_WB))
++ return false;
++ snoopXbaseAddress =
++ pci_snoop_control_base_0_low[host] + 0x10 * region;
++ snoopXtopAddress = pci_snoop_control_top_0[host] + 0x10 * region;
++ if (regionLength == 0) { /* closing the region */
++ GT_REG_WRITE (snoopXbaseAddress, 0x0000ffff);
++ GT_REG_WRITE (snoopXtopAddress, 0);
++ return true;
++ }
++ baseAddress = baseAddress & 0xfff00000; /* Granularity of 1MByte */
++ data = (baseAddress >> 20) | snoopType << 12;
++ GT_REG_WRITE (snoopXbaseAddress, data);
++ snoopHigh = (snoopHigh & 0xfff00000) >> 20;
++ GT_REG_WRITE (snoopXtopAddress, snoopHigh - 1);
++ return true;
++}
++
++static int gt_read_config_dword (struct pci_controller *hose,
++ pci_dev_t dev, int offset, u32 * value)
++{
++ int bus = PCI_BUS (dev);
++
++ if ((bus == local_buses[0]) || (bus == local_buses[1])) {
++ *value = pciReadConfigReg ((PCI_HOST) hose->cfg_addr, offset,
++ PCI_DEV (dev));
++ } else {
++ *value = pciOverBridgeReadConfigReg ((PCI_HOST) hose->
++ cfg_addr, offset,
++ PCI_DEV (dev), bus);
++ }
++
++ return 0;
++}
++
++static int gt_write_config_dword (struct pci_controller *hose,
++ pci_dev_t dev, int offset, u32 value)
++{
++ int bus = PCI_BUS (dev);
++
++ if ((bus == local_buses[0]) || (bus == local_buses[1])) {
++ pciWriteConfigReg ((PCI_HOST) hose->cfg_addr, offset,
++ PCI_DEV (dev), value);
++ } else {
++ pciOverBridgeWriteConfigReg ((PCI_HOST) hose->cfg_addr,
++ offset, PCI_DEV (dev), bus,
++ value);
++ }
++ return 0;
++}
++
++
++static void gt_setup_ide (struct pci_controller *hose,
++ pci_dev_t dev, struct pci_config_table *entry)
++{
++ static const int ide_bar[] = { 8, 4, 8, 4, 0, 0 };
++ u32 bar_response, bar_value;
++ int bar;
++
++ for (bar = 0; bar < 6; bar++) {
++ /*ronen different function for 3rd bank. */
++ unsigned int offset =
++ (bar < 2) ? bar * 8 : 0x100 + (bar - 2) * 8;
++
++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + offset,
++ 0x0);
++ pci_hose_read_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + offset,
++ &bar_response);
++
++ pciauto_region_allocate (bar_response &
++ PCI_BASE_ADDRESS_SPACE_IO ? hose->
++ pci_io : hose->pci_mem, ide_bar[bar],
++ &bar_value);
++
++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + bar * 4,
++ bar_value);
++ }
++}
++
++#ifdef CONFIG_USE_CPCIDVI
++static void gt_setup_cpcidvi (struct pci_controller *hose,
++ pci_dev_t dev, struct pci_config_table *entry)
++{
++ u32 bar_value, pci_response;
++
++ pci_hose_read_config_dword (hose, dev, PCI_COMMAND, &pci_response);
++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0, 0xffffffff);
++ pci_hose_read_config_dword (hose, dev, PCI_BASE_ADDRESS_0, &pci_response);
++ pciauto_region_allocate (hose->pci_mem, 0x01000000, &bar_value);
++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0, (bar_value & 0xffffff00));
++ pci_hose_write_config_dword (hose, dev, PCI_ROM_ADDRESS, 0x0);
++ pciauto_region_allocate (hose->pci_mem, 0x40000, &bar_value);
++ pci_hose_write_config_dword (hose, dev, PCI_ROM_ADDRESS, (bar_value & 0xffffff00) | 0x01);
++ gt_cpcidvi_rom.base = bar_value & 0xffffff00;
++ gt_cpcidvi_rom.init = 1;
++}
++
++unsigned char gt_cpcidvi_in8(unsigned int offset)
++{
++ unsigned char data;
++
++ if (gt_cpcidvi_rom.init == 0) {
++ return(0);
++ }
++ data = in8((offset & 0x04) + 0x3f000 + gt_cpcidvi_rom.base);
++ return(data);
++}
++
++void gt_cpcidvi_out8(unsigned int offset, unsigned char data)
++{
++ unsigned int off;
++
++ if (gt_cpcidvi_rom.init == 0) {
++ return;
++ }
++ off = data;
++ off = ((off << 3) & 0x7f8) + (offset & 0x4) + 0x3e000 + gt_cpcidvi_rom.base;
++ in8(off);
++ return;
++}
++#endif
++
++/* TODO BJW: Change this for DB64360. This was pulled from the EV64260 */
++/* and is curently not called *. */
++#if 0
++static void gt_fixup_irq (struct pci_controller *hose, pci_dev_t dev)
++{
++ unsigned char pin, irq;
++
++ pci_read_config_byte (dev, PCI_INTERRUPT_PIN, &pin);
++
++ if (pin == 1) { /* only allow INT A */
++ irq = pci_irq_swizzle[(PCI_HOST) hose->
++ cfg_addr][PCI_DEV (dev)];
++ if (irq)
++ pci_write_config_byte (dev, PCI_INTERRUPT_LINE, irq);
++ }
++}
++#endif
++
++struct pci_config_table gt_config_table[] = {
++#ifdef CONFIG_USE_CPCIDVI
++ {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69030, PCI_CLASS_DISPLAY_VGA,
++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, gt_setup_cpcidvi},
++#endif
++ {PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE,
++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, gt_setup_ide},
++ {}
++};
++
++struct pci_controller pci0_hose = {
++/* fixup_irq: gt_fixup_irq, */
++ config_table:gt_config_table,
++};
++
++struct pci_controller pci1_hose = {
++/* fixup_irq: gt_fixup_irq, */
++ config_table:gt_config_table,
++};
++
++void pci_init_board (void)
++{
++ unsigned int command;
++#ifdef CONFIG_PCI_PNP
++ unsigned int bar;
++#endif
++#ifdef DEBUG
++ gt_pci_bus_mode_display (PCI_HOST0);
++#endif
++#ifdef CONFIG_USE_CPCIDVI
++ gt_cpcidvi_rom.init = 0;
++ gt_cpcidvi_rom.base = 0;
++#endif
++
++ pci0_hose.config_table = gt_config_table;
++ pci1_hose.config_table = gt_config_table;
++
++#ifdef CONFIG_USE_CPCIDVI
++ gt_config_table[0].config_device = gt_setup_cpcidvi;
++#endif
++ gt_config_table[1].config_device = gt_setup_ide;
++
++ pci0_hose.first_busno = 0;
++ pci0_hose.last_busno = 0xff;
++ local_buses[0] = pci0_hose.first_busno;
++
++ /* PCI memory space */
++ pci_set_region (pci0_hose.regions + 0,
++ CFG_PCI0_0_MEM_SPACE,
++ CFG_PCI0_0_MEM_SPACE,
++ CFG_PCI0_MEM_SIZE, PCI_REGION_MEM);
++
++ /* PCI I/O space */
++ pci_set_region (pci0_hose.regions + 1,
++ CFG_PCI0_IO_SPACE_PCI,
++ CFG_PCI0_IO_SPACE, CFG_PCI0_IO_SIZE, PCI_REGION_IO);
++
++ pci_set_ops (&pci0_hose,
++ pci_hose_read_config_byte_via_dword,
++ pci_hose_read_config_word_via_dword,
++ gt_read_config_dword,
++ pci_hose_write_config_byte_via_dword,
++ pci_hose_write_config_word_via_dword,
++ gt_write_config_dword);
++ pci0_hose.region_count = 2;
++
++ pci0_hose.cfg_addr = (unsigned int *) PCI_HOST0;
++
++ pci_register_hose (&pci0_hose);
++ pciArbiterDisable(PCI_HOST0); /* on PMC modules no arbiter is used */
++ pciParkingDisable (PCI_HOST0, 1, 1, 1, 1, 1, 1, 1);
++ command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF);
++ command |= PCI_COMMAND_MASTER;
++ pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command);
++ command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF);
++ command |= PCI_COMMAND_MEMORY;
++ pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command);
++
++#ifdef CONFIG_PCI_PNP
++ pciauto_config_init(&pci0_hose);
++ pciauto_region_allocate(pci0_hose.pci_io, 0x400, &bar);
++#endif
++#ifdef CONFIG_PCI_SCAN_SHOW
++ printf("PCI: Bus Dev VenId DevId Class Int\n");
++#endif
++ pci0_hose.last_busno = pci_hose_scan_bus (&pci0_hose, pci0_hose.first_busno);
++
++#ifdef DEBUG
++ gt_pci_bus_mode_display (PCI_HOST1);
++#endif
++ pci1_hose.first_busno = pci0_hose.last_busno + 1;
++ pci1_hose.last_busno = 0xff;
++ pci1_hose.current_busno = pci1_hose.first_busno;
++ local_buses[1] = pci1_hose.first_busno;
++
++ /* PCI memory space */
++ pci_set_region (pci1_hose.regions + 0,
++ CFG_PCI1_0_MEM_SPACE,
++ CFG_PCI1_0_MEM_SPACE,
++ CFG_PCI1_MEM_SIZE, PCI_REGION_MEM);
++
++ /* PCI I/O space */
++ pci_set_region (pci1_hose.regions + 1,
++ CFG_PCI1_IO_SPACE_PCI,
++ CFG_PCI1_IO_SPACE, CFG_PCI1_IO_SIZE, PCI_REGION_IO);
++
++ pci_set_ops (&pci1_hose,
++ pci_hose_read_config_byte_via_dword,
++ pci_hose_read_config_word_via_dword,
++ gt_read_config_dword,
++ pci_hose_write_config_byte_via_dword,
++ pci_hose_write_config_word_via_dword,
++ gt_write_config_dword);
++
++ pci1_hose.region_count = 2;
++
++ pci1_hose.cfg_addr = (unsigned int *) PCI_HOST1;
++
++ pci_register_hose (&pci1_hose);
++
++ pciArbiterEnable (PCI_HOST1);
++ pciParkingDisable (PCI_HOST1, 1, 1, 1, 1, 1, 1, 1);
++
++ command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF);
++ command |= PCI_COMMAND_MASTER;
++ pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command);
++
++#ifdef CONFIG_PCI_PNP
++ pciauto_config_init(&pci1_hose);
++ pciauto_region_allocate(pci1_hose.pci_io, 0x400, &bar);
++#endif
++ pci1_hose.last_busno = pci_hose_scan_bus (&pci1_hose, pci1_hose.first_busno);
++
++ command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF);
++ command |= PCI_COMMAND_MEMORY;
++ pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command);
++
++}
++#endif /* of CONFIG_PCI */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/ppc_error_no.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/ppc_error_no.h
+--- u-boot-1.1.6/board/prodrive/p3mx/ppc_error_no.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/ppc_error_no.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,164 @@
++/*
++ * (C) Copyright 2003
++ * Ingo Assmus <ingo.assmus@keymile.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
++ */
++
++/*
++ * BK Id: SCCS/s.errno.h 1.9 06/05/01 21:45:21 paulus
++ */
++#ifndef _MV_PPC_ERRNO_H
++#define _MV_PPC_ERRNO_H
++
++#define EPERM 1 /* Operation not permitted */
++#define ENOENT 2 /* No such file or directory */
++#define ESRCH 3 /* No such process */
++#define EINTR 4 /* Interrupted system call */
++#define EIO 5 /* I/O error */
++#define ENXIO 6 /* No such device or address */
++#define E2BIG 7 /* Arg list too long */
++#define ENOEXEC 8 /* Exec format error */
++#define EBADF 9 /* Bad file number */
++#define ECHILD 10 /* No child processes */
++#define EAGAIN 11 /* Try again */
++#define ENOMEM 12 /* Out of memory */
++#define EACCES 13 /* Permission denied */
++#define EFAULT 14 /* Bad address */
++#define ENOTBLK 15 /* Block device required */
++#define EBUSY 16 /* Device or resource busy */
++#define EEXIST 17 /* File exists */
++#define EXDEV 18 /* Cross-device link */
++#define ENODEV 19 /* No such device */
++#define ENOTDIR 20 /* Not a directory */
++#define EISDIR 21 /* Is a directory */
++#define EINVAL 22 /* Invalid argument */
++#define ENFILE 23 /* File table overflow */
++#define EMFILE 24 /* Too many open files */
++#define ENOTTY 25 /* Not a typewriter */
++#define ETXTBSY 26 /* Text file busy */
++#define EFBIG 27 /* File too large */
++#define ENOSPC 28 /* No space left on device */
++#define ESPIPE 29 /* Illegal seek */
++#define EROFS 30 /* Read-only file system */
++#define EMLINK 31 /* Too many links */
++#define EPIPE 32 /* Broken pipe */
++#define EDOM 33 /* Math argument out of domain of func */
++#define ERANGE 34 /* Math result not representable */
++#define EDEADLK 35 /* Resource deadlock would occur */
++#define ENAMETOOLONG 36 /* File name too long */
++#define ENOLCK 37 /* No record locks available */
++#define ENOSYS 38 /* Function not implemented */
++#define ENOTEMPTY 39 /* Directory not empty */
++#define ELOOP 40 /* Too many symbolic links encountered */
++#define EWOULDBLOCK EAGAIN /* Operation would block */
++#define ENOMSG 42 /* No message of desired type */
++#define EIDRM 43 /* Identifier removed */
++#define ECHRNG 44 /* Channel number out of range */
++#define EL2NSYNC 45 /* Level 2 not synchronized */
++#define EL3HLT 46 /* Level 3 halted */
++#define EL3RST 47 /* Level 3 reset */
++#define ELNRNG 48 /* Link number out of range */
++#define EUNATCH 49 /* Protocol driver not attached */
++#define ENOCSI 50 /* No CSI structure available */
++#define EL2HLT 51 /* Level 2 halted */
++#define EBADE 52 /* Invalid exchange */
++#define EBADR 53 /* Invalid request descriptor */
++#define EXFULL 54 /* Exchange full */
++#define ENOANO 55 /* No anode */
++#define EBADRQC 56 /* Invalid request code */
++#define EBADSLT 57 /* Invalid slot */
++#define EDEADLOCK 58 /* File locking deadlock error */
++#define EBFONT 59 /* Bad font file format */
++#define ENOSTR 60 /* Device not a stream */
++#define ENODATA 61 /* No data available */
++#define ETIME 62 /* Timer expired */
++#define ENOSR 63 /* Out of streams resources */
++#define ENONET 64 /* Machine is not on the network */
++#define ENOPKG 65 /* Package not installed */
++#define EREMOTE 66 /* Object is remote */
++#define ENOLINK 67 /* Link has been severed */
++#define EADV 68 /* Advertise error */
++#define ESRMNT 69 /* Srmount error */
++#define ECOMM 70 /* Communication error on send */
++#define EPROTO 71 /* Protocol error */
++#define EMULTIHOP 72 /* Multihop attempted */
++#define EDOTDOT 73 /* RFS specific error */
++#define EBADMSG 74 /* Not a data message */
++#define EOVERFLOW 75 /* Value too large for defined data type */
++#define ENOTUNIQ 76 /* Name not unique on network */
++#define EBADFD 77 /* File descriptor in bad state */
++#define EREMCHG 78 /* Remote address changed */
++#define ELIBACC 79 /* Can not access a needed shared library */
++#define ELIBBAD 80 /* Accessing a corrupted shared library */
++#define ELIBSCN 81 /* .lib section in a.out corrupted */
++#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
++#define ELIBEXEC 83 /* Cannot exec a shared library directly */
++#define EILSEQ 84 /* Illegal byte sequence */
++#define ERESTART 85 /* Interrupted system call should be restarted */
++#define ESTRPIPE 86 /* Streams pipe error */
++#define EUSERS 87 /* Too many users */
++#define ENOTSOCK 88 /* Socket operation on non-socket */
++#define EDESTADDRREQ 89 /* Destination address required */
++#define EMSGSIZE 90 /* Message too long */
++#define EPROTOTYPE 91 /* Protocol wrong type for socket */
++#define ENOPROTOOPT 92 /* Protocol not available */
++#define EPROTONOSUPPORT 93 /* Protocol not supported */
++#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
++#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
++#define EPFNOSUPPORT 96 /* Protocol family not supported */
++#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
++#define EADDRINUSE 98 /* Address already in use */
++#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
++#define ENETDOWN 100 /* Network is down */
++#define ENETUNREACH 101 /* Network is unreachable */
++#define ENETRESET 102 /* Network dropped connection because of reset */
++#define ECONNABORTED 103 /* Software caused connection abort */
++#define ECONNRESET 104 /* Connection reset by peer */
++#define ENOBUFS 105 /* No buffer space available */
++#define EISCONN 106 /* Transport endpoint is already connected */
++#define ENOTCONN 107 /* Transport endpoint is not connected */
++#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
++#define ETOOMANYREFS 109 /* Too many references: cannot splice */
++#define ETIMEDOUT 110 /* Connection timed out */
++#define ECONNREFUSED 111 /* Connection refused */
++#define EHOSTDOWN 112 /* Host is down */
++#define EHOSTUNREACH 113 /* No route to host */
++#define EALREADY 114 /* Operation already in progress */
++#define EINPROGRESS 115 /* Operation now in progress */
++#define ESTALE 116 /* Stale NFS file handle */
++#define EUCLEAN 117 /* Structure needs cleaning */
++#define ENOTNAM 118 /* Not a XENIX named type file */
++#define ENAVAIL 119 /* No XENIX semaphores available */
++#define EISNAM 120 /* Is a named type file */
++#define EREMOTEIO 121 /* Remote I/O error */
++#define EDQUOT 122 /* Quota exceeded */
++
++#define ENOMEDIUM 123 /* No medium found */
++#define EMEDIUMTYPE 124 /* Wrong medium type */
++
++/* Should never be seen by user programs */
++#define ERESTARTSYS 512
++#define ERESTARTNOINTR 513
++#define ERESTARTNOHAND 514 /* restart if no handler.. */
++#define ENOIOCTLCMD 515 /* No ioctl command */
++
++#define _LAST_ERRNO 515
++
++#endif
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/sdram_init.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/sdram_init.c
+--- u-boot-1.1.6/board/prodrive/p3mx/sdram_init.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/sdram_init.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,434 @@
++/*
++ * (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
++ */
++
++/*************************************************************************
++ * adaption for the Marvell DB64460 Board
++ * Ingo Assmus (ingo.assmus@keymile.com)
++ *************************************************************************/
++
++/* sdram_init.c - automatic memory sizing */
++
++#include <common.h>
++#include <74xx_7xx.h>
++#include "../../Marvell/include/memory.h"
++#include "../../Marvell/include/pci.h"
++#include "../../Marvell/include/mv_gen_reg.h"
++#include <net.h>
++
++#include "eth.h"
++#include "mpsc.h"
++#include "../../Marvell/common/i2c.h"
++#include "64460.h"
++#include "mv_regs.h"
++
++DECLARE_GLOBAL_DATA_PTR;
++
++#undef DEBUG
++#define MAP_PCI
++
++#ifdef DEBUG
++#define DP(x) x
++#else
++#define DP(x)
++#endif
++
++int set_dfcdlInit (void); /* setup delay line of Mv64460 */
++int mvDmaIsChannelActive (int);
++int mvDmaSetMemorySpace (ulong, ulong, ulong, ulong, ulong);
++int mvDmaTransfer (int, ulong, ulong, ulong, ulong);
++
++#define D_CACHE_FLUSH_LINE(addr, offset) \
++ { \
++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \
++ }
++
++int memory_map_bank (unsigned int bankNo,
++ unsigned int bankBase, unsigned int bankLength)
++{
++#ifdef MAP_PCI
++ PCI_HOST host;
++#endif
++
++#ifdef DEBUG
++ if (bankLength > 0) {
++ printf ("mapping bank %d at %08x - %08x\n",
++ bankNo, bankBase, bankBase + bankLength - 1);
++ } else {
++ printf ("unmapping bank %d\n", bankNo);
++ }
++#endif
++
++ memoryMapBank (bankNo, bankBase, bankLength);
++
++#ifdef MAP_PCI
++ for (host = PCI_HOST0; host <= PCI_HOST1; host++) {
++ const int features =
++ PREFETCH_ENABLE |
++ DELAYED_READ_ENABLE |
++ AGGRESSIVE_PREFETCH |
++ READ_LINE_AGGRESSIVE_PREFETCH |
++ READ_MULTI_AGGRESSIVE_PREFETCH |
++ MAX_BURST_4 | PCI_NO_SWAP;
++
++ pciMapMemoryBank (host, bankNo, bankBase, bankLength);
++
++ pciSetRegionSnoopMode (host, bankNo, PCI_SNOOP_WB, bankBase,
++ bankLength);
++
++ pciSetRegionFeatures (host, bankNo, features, bankBase,
++ bankLength);
++ }
++#endif
++
++ return 0;
++}
++
++/*
++ * Check memory range for valid RAM. A simple memory test determines
++ * the actually available RAM size between addresses `base' and
++ * `base + maxsize'. Some (not all) hardware errors are detected:
++ * - short between address lines
++ * - short between data lines
++ */
++long int dram_size (long int *base, long int maxsize)
++{
++ volatile long int *addr, *b = base;
++ long int cnt, val, save1, save2;
++
++#define STARTVAL (1<<20) /* start test at 1M */
++ for (cnt = STARTVAL / sizeof (long); cnt < maxsize / sizeof (long);
++ cnt <<= 1) {
++ addr = base + cnt; /* pointer arith! */
++
++ save1 = *addr; /* save contents of addr */
++ save2 = *b; /* save contents of base */
++
++ *addr = cnt; /* write cnt to addr */
++ *b = 0; /* put null at base */
++
++ /* check at base address */
++ if ((*b) != 0) {
++ *addr = save1; /* restore *addr */
++ *b = save2; /* restore *b */
++ return (0);
++ }
++ val = *addr; /* read *addr */
++ val = *addr; /* read *addr */
++
++ *addr = save1;
++ *b = save2;
++
++ if (val != cnt) {
++ DP (printf
++ ("Found %08x at Address %08x (failure)\n",
++ (unsigned int) val, (unsigned int) addr));
++ /* fix boundary condition.. STARTVAL means zero */
++ if (cnt == STARTVAL / sizeof (long))
++ cnt = 0;
++ return (cnt * sizeof (long));
++ }
++ }
++
++ return maxsize;
++}
++
++#define SDRAM_NORMAL 0x0
++#define SDRAM_PRECHARGE_ALL 0x1
++#define SDRAM_REFRESH_ALL 0x2
++#define SDRAM_MODE_REG_SETUP 0x3
++#define SDRAM_XTEN_MODE_REG_SETUP 0x4
++#define SDRAM_NOP 0x5
++#define SDRAM_SELF_REFRESH 0x7
++
++long int initdram (int board_type)
++{
++ int tmp;
++ int start;
++ ulong size;
++ ulong memSpaceAttr;
++ ulong dest;
++
++ /* first disable all banks */
++ memory_map_bank(0, 0, 0);
++ memory_map_bank(1, 0, 0);
++ memory_map_bank(2, 0, 0);
++ memory_map_bank(3, 0, 0);
++
++ /* calibrate delay lines */
++ set_dfcdlInit();
++
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_NOP); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* SDRAM controller configuration */
++#ifdef CONFIG_MV64460_ECC
++ GT_REG_WRITE(MV64460_SDRAM_CONFIG, 0x58201400); /* 0x1400 */
++#else
++ GT_REG_WRITE(MV64460_SDRAM_CONFIG, 0x58200400); /* 0x1400 */
++#endif
++ GT_REG_WRITE(MV64460_D_UNIT_CONTROL_LOW, 0xC3000540); /* 0x1404 */
++ GT_REG_WRITE(MV64460_D_UNIT_CONTROL_HIGH, 0x0300F777); /* 0x1424 */
++ GT_REG_WRITE(MV64460_SDRAM_TIMING_CONTROL_LOW, 0x01712220); /* 0x1408 */
++ GT_REG_WRITE(MV64460_SDRAM_TIMING_CONTROL_HIGH, 0x0000005D); /* 0x140C */
++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CONTROL, 0x00000012); /* 0x1410 */
++ GT_REG_WRITE(MV64460_SDRAM_OPEN_PAGES_CONTROL, 0x00000001); /* 0x1414 */
++
++ /* SDRAM drive strength */
++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION, 0x80000000); /* 0x14C0 */
++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION, 0x80000008); /* 0x14C0 */
++ GT_REG_WRITE(MV64460_SDRAM_DATA_PADS_CALIBRATION, 0x80000000); /* 0x14C4 */
++ GT_REG_WRITE(MV64460_SDRAM_DATA_PADS_CALIBRATION, 0x80000008); /* 0x14C4 */
++
++ /* setup SDRAM device registers */
++
++ /* precharge all */
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_PRECHARGE_ALL); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* enable DLL */
++ GT_REG_WRITE(MV64460_EXTENDED_DRAM_MODE, 0x00000000); /* 0x1420 */
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_XTEN_MODE_REG_SETUP); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* reset DLL */
++ GT_REG_WRITE(MV64460_SDRAM_MODE, 0x00000132); /* 0x141C */
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_MODE_REG_SETUP); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* precharge all */
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_PRECHARGE_ALL); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* wait for 2 auto refresh commands */
++ udelay(20);
++
++ /* un-reset DLL */
++ GT_REG_WRITE(MV64460_SDRAM_MODE, 0x00000032); /* 0x141C */
++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_MODE_REG_SETUP); /* 0x1418 */
++ do {
++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION);
++ } while(tmp != 0x0);
++
++ /* wait 200 cycles */
++ udelay(2); /* FIXME make this dynamic for the system clock */
++
++ /* SDRAM init done */
++ memory_map_bank(0, CFG_SDRAM_BASE, (256 << 20));
++#ifdef CFG_SDRAM1_BASE
++ memory_map_bank(1, CFG_SDRAM1_BASE, (256 << 20));
++#endif
++
++ /* DUNIT_MMASK: enable SnoopHitEn bit to avoid errata CPU-#4
++ */
++ tmp = GTREGREAD(MV64460_D_UNIT_MMASK); /* 0x14B0 */
++ GT_REG_WRITE(MV64460_D_UNIT_MMASK, tmp | 0x2);
++
++ start = (0 << 20);
++#ifdef CONFIG_P3M750
++ size = (512 << 20);
++#elif defined (CONFIG_P3M7448)
++ size = (128 << 20);
++#endif
++
++#ifdef CONFIG_MV64460_ECC
++ memSpaceAttr = ((~(BIT0 << 0)) & 0xf) << 8;
++ mvDmaSetMemorySpace (0, 0, memSpaceAttr, start, size);
++ for (dest = start; dest < start + size; dest += _8M) {
++ mvDmaTransfer (0, start, dest, _8M,
++ BIT8 /*DMA_DTL_128BYTES */ |
++ BIT3 /*DMA_HOLD_SOURCE_ADDR */ |
++ BIT11 /*DMA_BLOCK_TRANSFER_MODE */ );
++ while (mvDmaIsChannelActive (0));
++ }
++#endif
++
++ return (size);
++}
++
++void board_add_ram_info(int use_default)
++{
++ u32 val;
++
++ puts(" (CL=");
++ switch ((GTREGREAD(MV64460_SDRAM_MODE) >> 4) & 0x7) {
++ case 0x2:
++ puts("2");
++ break;
++ case 0x3:
++ puts("3");
++ break;
++ case 0x5:
++ puts("1.5");
++ break;
++ case 0x6:
++ puts("2.5");
++ break;
++ }
++
++ val = GTREGREAD(MV64460_SDRAM_CONFIG);
++
++ puts(", ECC ");
++ if (val & 0x00001000)
++ puts("enabled)");
++ else
++ puts("not enabled)");
++}
++
++/*
++ * mvDmaIsChannelActive - Check if IDMA channel is active
++ *
++ * channel = IDMA channel number from 0 to 7
++ */
++int mvDmaIsChannelActive (int channel)
++{
++ ulong data;
++
++ data = GTREGREAD (MV64460_DMA_CHANNEL0_CONTROL + 4 * channel);
++ if (data & BIT14) /* activity status */
++ return 1;
++
++ return 0;
++}
++
++/*
++ * mvDmaSetMemorySpace - Set a DMA memory window for the DMA's address decoding
++ * map.
++ *
++ * memSpace = IDMA memory window number from 0 to 7
++ * trg_if = Target interface:
++ * 0x0 DRAM
++ * 0x1 Device Bus
++ * 0x2 Integrated SDRAM (or CPU bus 60x only)
++ * 0x3 PCI0
++ * 0x4 PCI1
++ * attr = IDMA attributes (see MV datasheet)
++ * base_addr = Sets up memory window for transfers
++ *
++ */
++int mvDmaSetMemorySpace (ulong memSpace,
++ ulong trg_if,
++ ulong attr, ulong base_addr, ulong size)
++{
++ ulong temp;
++
++ /* The base address must be aligned to the size. */
++ if (base_addr % size != 0)
++ return 0;
++
++ if (size >= 0x10000) { /* 64K */
++ size &= 0xffff0000;
++ base_addr = (base_addr & 0xffff0000);
++ /* Set the new attributes */
++ GT_REG_WRITE (MV64460_DMA_BASE_ADDR_REG0 + memSpace * 8,
++ (base_addr | trg_if | attr));
++ GT_REG_WRITE ((MV64460_DMA_SIZE_REG0 + memSpace * 8),
++ (size - 1) & 0xffff0000);
++ temp = GTREGREAD (MV64460_DMA_BASE_ADDR_ENABLE_REG);
++ GT_REG_WRITE (DMA_BASE_ADDR_ENABLE_REG,
++ (temp & ~(BIT0 << memSpace)));
++ return 1;
++ }
++
++ return 0;
++}
++
++/*
++ * mvDmaTransfer - Transfer data from src_addr to dst_addr on one of the 4
++ * DMA channels.
++ *
++ * channel = IDMA channel number from 0 to 3
++ * destAddr = Destination address
++ * sourceAddr = Source address
++ * size = Size in bytes
++ * command = See MV datasheet
++ *
++ */
++int mvDmaTransfer (int channel, ulong sourceAddr,
++ ulong destAddr, ulong size, ulong command)
++{
++ ulong engOffReg = 0; /* Engine Offset Register */
++
++ if (size > 0xffff)
++ command = command | BIT31; /* DMA_16M_DESCRIPTOR_MODE */
++ command = command | ((command >> 6) & 0x7);
++ engOffReg = channel * 4;
++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_BYTE_COUNT + engOffReg, size);
++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_SOURCE_ADDR + engOffReg, sourceAddr);
++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_DESTINATION_ADDR + engOffReg, destAddr);
++ command = command |
++ BIT12 | /* DMA_CHANNEL_ENABLE */
++ BIT9; /* DMA_NON_CHAIN_MODE */
++ /* Activate DMA channel By writting to mvDmaControlRegister */
++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_CONTROL + engOffReg, command);
++ return 1;
++}
++
++/****************************************************************************************
++ * SDRAM INIT *
++ * This procedure detect all Sdram types: 64, 128, 256, 512 Mbit, 1Gbit and 2Gb *
++ * This procedure fits only the Atlantis *
++ * *
++ ***************************************************************************************/
++
++/****************************************************************************************
++ * DFCDL initialize MV643xx Design Considerations *
++ * *
++ ***************************************************************************************/
++int set_dfcdlInit (void)
++{
++ int i;
++
++ /* Values from MV64460 User Manual */
++ unsigned int dfcdl_tbl[] = { 0x00000000, 0x00000001, 0x00000042, 0x00000083,
++ 0x000000c4, 0x00000105, 0x00000146, 0x00000187,
++ 0x000001c8, 0x00000209, 0x0000024a, 0x0000028b,
++ 0x000002cc, 0x0000030d, 0x0000034e, 0x0000038f,
++ 0x000003d0, 0x00000411, 0x00000452, 0x00000493,
++ 0x000004d4, 0x00000515, 0x00000556, 0x00000597,
++ 0x000005d8, 0x00000619, 0x0000065a, 0x0000069b,
++ 0x000006dc, 0x0000071d, 0x0000075e, 0x0000079f,
++ 0x000007e0, 0x00000821, 0x00000862, 0x000008a3,
++ 0x000008e4, 0x00000925, 0x00000966, 0x000009a7,
++ 0x000009e8, 0x00000a29, 0x00000a6a, 0x00000aab,
++ 0x00000aec, 0x00000b2d, 0x00000b6e, 0x00000baf,
++ 0x00000bf0, 0x00000c31, 0x00000c72, 0x00000cb3,
++ 0x00000cf4, 0x00000d35, 0x00000d76, 0x00000db7,
++ 0x00000df8, 0x00000e39, 0x00000e7a, 0x00000ebb,
++ 0x00000efc, 0x00000f3d, 0x00000f7e, 0x00000fbf };
++
++ for (i = 0; i < 64; i++)
++ GT_REG_WRITE (SRAM_DATA0, dfcdl_tbl[i]);
++ GT_REG_WRITE (DFCDL_CONFIG0, 0x00300000); /* enable dynamic delay line updating */
++
++ return (0);
++}
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/serial.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.c
+--- u-boot-1.1.6/board/prodrive/p3mx/serial.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,107 @@
++/*
++ * (C) Copyright 2001
++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
++ *
++ * modified for marvell db64360 eval board by
++ * Ingo Assmus <ingo.assmus@keymile.com>
++ *
++ * modified for cpci750 board by
++ * Reinhard Arlt <reinhard.arlt@esd-electronics.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
++ */
++
++/*
++ * serial.c - serial support for esd cpci750 board
++ */
++
++/* supports the MPSC */
++
++#include <common.h>
++#include <command.h>
++#include "../../Marvell/include/memory.h"
++#include "serial.h"
++
++#include "mpsc.h"
++
++DECLARE_GLOBAL_DATA_PTR;
++
++int serial_init (void)
++{
++ mpsc_init (gd->baudrate);
++
++ return (0);
++}
++
++void serial_putc (const char c)
++{
++ if (c == '\n')
++ mpsc_putchar ('\r');
++
++ mpsc_putchar (c);
++}
++
++int serial_getc (void)
++{
++ return mpsc_getchar ();
++}
++
++int serial_tstc (void)
++{
++ return mpsc_test_char ();
++}
++
++void serial_setbrg (void)
++{
++ galbrg_set_baudrate (CONFIG_MPSC_PORT, gd->baudrate);
++}
++
++
++void serial_puts (const char *s)
++{
++ while (*s) {
++ serial_putc (*s++);
++ }
++}
++
++#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
++void kgdb_serial_init (void)
++{
++}
++
++void putDebugChar (int c)
++{
++ serial_putc (c);
++}
++
++void putDebugStr (const char *str)
++{
++ serial_puts (str);
++}
++
++int getDebugChar (void)
++{
++ return serial_getc ();
++}
++
++void kgdb_interruptible (int yes)
++{
++ return;
++}
++#endif /* CFG_CMD_KGDB */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/serial.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.h
+--- u-boot-1.1.6/board/prodrive/p3mx/serial.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,89 @@
++/*
++ * (C) Copyright 2001
++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
++ *
++ * modified for marvell db64360 eval board by
++ * Ingo Assmus <ingo.assmus@keymile.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
++ */
++
++/* serial.h - mostly useful for DUART serial_init in serial.c */
++
++#ifndef __SERIAL_H__
++#define __SERIAL_H__
++
++#if 0
++
++#define B230400 1
++#define B115200 2
++#define B57600 4
++#define B38400 82
++#define B19200 163
++#define B9600 24
++#define B4800 651
++#define B2400 1302
++#define B1200 2604
++#define B600 5208
++#define B300 10417
++#define B150 20833
++#define B110 28409
++#define BDEFAULT B115200
++
++ /* this stuff is important to initialize
++ the DUART channels */
++
++#define Scale 0x01L /* distance between port addresses */
++#define COM1 0x000003f8 /* Keyboard */
++#define COM2 0x000002f8 /* Host */
++
++
++/* Port Definitions relative to base COM port addresses */
++#define DataIn (0x00*Scale) /* data input port */
++#define DataOut (0x00*Scale) /* data output port */
++#define BaudLsb (0x00*Scale) /* baud rate divisor least significant byte */
++#define BaudMsb (0x01*Scale) /* baud rate divisor most significant byte */
++#define Ier (0x01*Scale) /* interrupt enable register */
++#define Iir (0x02*Scale) /* interrupt identification register */
++#define Lcr (0x03*Scale) /* line control register */
++#define Mcr (0x04*Scale) /* modem control register */
++#define Lsr (0x05*Scale) /* line status register */
++#define Msr (0x06*Scale) /* modem status register */
++
++/* Bit Definitions for above ports */
++#define LcrDlab 0x80 /* b7: enable baud rate divisor registers */
++#define LcrDflt 0x03 /* b6-0: no parity, 1 stop, 8 data */
++
++#define McrRts 0x02 /* b1: request to send (I am ready to xmit) */
++#define McrDtr 0x01 /* b0: data terminal ready (I am alive ready to rcv) */
++#define McrDflt (McrRts|McrDtr)
++
++#define LsrTxD 0x6000 /* b5: transmit holding register empty (i.e. xmit OK!)*/
++ /* b6: transmitter empty */
++#define LsrRxD 0x0100 /* b0: received data ready (i.e. got a byte!) */
++
++#define MsrRi 0x0040 /* b6: ring indicator (other guy is ready to rcv) */
++#define MsrDsr 0x0020 /* b5: data set ready (other guy is alive ready to rcv */
++#define MsrCts 0x0010 /* b4: clear to send (other guy is ready to rcv) */
++
++#define IerRda 0xf /* b0: Enable received data available interrupt */
++
++#endif
++
++#endif /* __SERIAL_H__ */
+diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/u-boot.lds u-boot-1.1.6-fsl-1/board/prodrive/p3mx/u-boot.lds
+--- u-boot-1.1.6/board/prodrive/p3mx/u-boot.lds 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/u-boot.lds 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,138 @@
++/*
++ * (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 the Galileo Eval 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)
++ *(.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 = .);
++}
+diff -Naupr u-boot-1.1.6/board/tqm5200/cam5200_flash.c u-boot-1.1.6-fsl-1/board/tqm5200/cam5200_flash.c
+--- u-boot-1.1.6/board/tqm5200/cam5200_flash.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/tqm5200/cam5200_flash.c 2006-11-30 12:34:13.000000000 -0600
+@@ -759,7 +759,7 @@ unsigned long flash_init(void)
+
+ if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+ printf("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+- i, size_b[i], size_b[i] << 20);
++ i+1, size_b[i], size_b[i] << 20);
+ flash_info[i].sector_count = -1;
+ flash_info[i].size = 0;
+ }
+diff -Naupr u-boot-1.1.6/board/tqm5200/tqm5200.c u-boot-1.1.6-fsl-1/board/tqm5200/tqm5200.c
+--- u-boot-1.1.6/board/tqm5200/tqm5200.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/tqm5200/tqm5200.c 2006-11-30 12:34:13.000000000 -0600
+@@ -289,7 +289,7 @@ int checkboard (void)
+ #elif defined(CONFIG_TB5200)
+ # define CARRIER_NAME "TB5200"
+ #elif defined(CONFIG_CAM5200)
+-# define CARRIER_NAME "Cam5200"
++# define CARRIER_NAME "CAM5200"
+ #elif defined(CONFIG_FO300)
+ # define CARRIER_NAME "FO300"
+ #else
+@@ -341,9 +341,7 @@ void pci_init_board(void)
+ #define SM501_GPIO_DATA_DIR_HIGH 0x0001000CUL
+ #define SM501_GPIO_DATA_HIGH 0x00010004UL
+ #define SM501_GPIO_51 0x00080000UL
+-#else
+-#define GPIO_PSC1_4 0x01000000UL
+-#endif
++#endif /* CONFIG MINIFAP */
+
+ void init_ide_reset (void)
+ {
+@@ -381,9 +379,9 @@ void ide_set_reset (int idereset)
+ }
+ #else
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4;
+ } else {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ #endif
+ }
+diff -Naupr u-boot-1.1.6/board/tqm834x/pci.c u-boot-1.1.6-fsl-1/board/tqm834x/pci.c
+--- u-boot-1.1.6/board/tqm834x/pci.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/tqm834x/pci.c 2006-11-10 11:24:29.000000000 -0600
+@@ -69,17 +69,17 @@ void
+ pci_init_board(void)
+ {
+ volatile immap_t * immr;
+- volatile clk8349_t * clk;
+- volatile law8349_t * pci_law;
+- volatile pot8349_t * pci_pot;
+- volatile pcictrl8349_t * pci_ctrl;
+- volatile pciconf8349_t * pci_conf;
++ 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;
+ struct pci_controller * hose;
+
+- immr = (immap_t *)CFG_IMMRBAR;
+- clk = (clk8349_t *)&immr->clk;
++ 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;
+@@ -186,8 +186,8 @@ pci_init_board(void)
+ hose->region_count = 3;
+
+ pci_setup_indirect(hose,
+- (CFG_IMMRBAR+0x8300),
+- (CFG_IMMRBAR+0x8304));
++ (CFG_IMMR+0x8300),
++ (CFG_IMMR+0x8304));
+
+ pci_register_hose(hose);
+
+diff -Naupr u-boot-1.1.6/board/tqm834x/tqm834x.c u-boot-1.1.6-fsl-1/board/tqm834x/tqm834x.c
+--- u-boot-1.1.6/board/tqm834x/tqm834x.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/tqm834x/tqm834x.c 2006-11-10 11:24:29.000000000 -0600
+@@ -69,7 +69,7 @@ static void set_cs_config(short cs, long
+ static void set_ddr_config(void);
+
+ /* Local variable */
+-static volatile immap_t *im = (immap_t *)CFG_IMMRBAR;
++static volatile immap_t *im = (immap_t *)CFG_IMMR;
+
+ /**************************************************************************
+ * Board initialzation after relocation to RAM. Used to detect the number
+@@ -147,7 +147,7 @@ int checkboard (void)
+ volatile immap_t * immr;
+ u32 w, f;
+
+- immr = (immap_t *)CFG_IMMRBAR;
++ immr = (immap_t *)CFG_IMMR;
+ if (!(immr->reset.rcwh & RCWH_PCIHOST)) {
+ printf("PCI: NOT in host mode..?!\n");
+ return 0;
+diff -Naupr u-boot-1.1.6/board/v38b/ethaddr.c u-boot-1.1.6-fsl-1/board/v38b/ethaddr.c
+--- u-boot-1.1.6/board/v38b/ethaddr.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/v38b/ethaddr.c 2006-11-10 11:24:29.000000000 -0600
+@@ -1,5 +1,4 @@
+ /*
+- *
+ * (C) Copyright 2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+@@ -25,48 +24,13 @@
+ #include <common.h>
+ #include <mpc5xxx.h>
+
+-#define GPIO_ENABLE (MPC5XXX_WU_GPIO)
+-
+-/* Open Drain Emulation Register */
+-#define GPIO_ODR (MPC5XXX_WU_GPIO + 0x04)
+-
+-/* Data Direction Register */
+-#define GPIO_DDR (MPC5XXX_WU_GPIO + 0x08)
+-
+-/* Data Value Out Register */
+-#define GPIO_DVOR (MPC5XXX_WU_GPIO + 0x0C)
+-
+-/* Interrupt Enable Register */
+-#define GPIO_IER (MPC5XXX_WU_GPIO + 0x10)
+-
+-/* Individual Interrupt Enable Register */
+-#define GPIO_IIER (MPC5XXX_WU_GPIO + 0x14)
+-
+-/* Interrupt Type Register */
+-#define GPIO_ITR (MPC5XXX_WU_GPIO + 0x18)
+-
+-/* Master Enable Register */
+-#define GPIO_MER (MPC5XXX_WU_GPIO + 0x1C)
+-
+-/* Data Input Value Register */
+-#define GPIO_DIVR (MPC5XXX_WU_GPIO + 0x20)
+-
+-/* Status Register */
+-#define GPIO_SR (MPC5XXX_WU_GPIO + 0x24)
+-
+-#define PSC6_0 0x10000000
+-#define WKUP_7 0x80000000
+-
+-/* For NS4 A/B board define WKUP_7, for V38B board PSC_6 */
+-#define GPIO_PIN PSC6_0
++/* For the V38B board the pin is GPIO_PSC_6 */
++#define GPIO_PIN GPIO_PSC6_0
+
+ #define NO_ERROR 0
+ #define ERR_NO_NUMBER 1
+ #define ERR_BAD_NUMBER 2
+
+-typedef volatile unsigned long GPIO_REG;
+-typedef GPIO_REG *GPIO_REG_PTR;
+-
+ static int is_high(void);
+ static int check_device(void);
+ static void io_out(int value);
+@@ -79,33 +43,34 @@ static void write_byte(unsigned char com
+ void read_2501_memory(unsigned char *psernum, unsigned char *perr);
+ void board_get_enetaddr(uchar *enetaddr);
+
++
+ static int is_high()
+ {
+- return (* ((vu_long *) GPIO_DIVR) & GPIO_PIN);
++ return (*((vu_long *) MPC5XXX_WU_GPIO_DATA_I) & GPIO_PIN);
+ }
+
+ static void io_out(int value)
+ {
+ if (value)
+- *((vu_long *) GPIO_DVOR) |= GPIO_PIN;
++ *((vu_long *) MPC5XXX_WU_GPIO_DATA_O) |= GPIO_PIN;
+ else
+- *((vu_long *) GPIO_DVOR) &= ~GPIO_PIN;
++ *((vu_long *) MPC5XXX_WU_GPIO_DATA_O) &= ~GPIO_PIN;
+ }
+
+ static void io_input()
+ {
+- *((vu_long *) GPIO_DDR) &= ~GPIO_PIN;
++ *((vu_long *) MPC5XXX_WU_GPIO_DIR) &= ~GPIO_PIN;
+ udelay(3); /* allow input to settle */
+ }
+
+ static void io_output()
+ {
+- *((vu_long *) GPIO_DDR) |= GPIO_PIN;
++ *((vu_long *) MPC5XXX_WU_GPIO_DIR) |= GPIO_PIN;
+ }
+
+ static void init_gpio()
+ {
+- *((vu_long *) GPIO_ENABLE) |= GPIO_PIN; /* Enable appropriate pin */
++ *((vu_long *) MPC5XXX_WU_GPIO_ENABLE) |= GPIO_PIN; /* Enable appropriate pin */
+ }
+
+ void read_2501_memory(unsigned char *psernum, unsigned char *perr)
+@@ -117,8 +82,8 @@ void read_2501_memory(unsigned char *pse
+ *perr = 0;
+ crcval = 0;
+
+- for (i=0; i<NBYTES; i++)
+-
++ for (i = 0; i < NBYTES; i++)
++ buf[i] = 0;
+
+ if (!check_device())
+ *perr = ERR_NO_NUMBER;
+@@ -130,10 +95,10 @@ void read_2501_memory(unsigned char *pse
+ write_byte(0x00);
+ read_byte(&crcval); /* Read CRC of address and command */
+
+- for (i=0; i<NBYTES; i++)
+- read_byte( &buf[i] );
++ for (i = 0; i < NBYTES; i++)
++ read_byte(&buf[i]);
+ }
+- if (strncmp((const char*) &buf[11], "MAREL IEEE 802.3", 16)) {
++ if (strncmp((const char *) &buf[11], "MAREL IEEE 802.3", 16)) {
+ *perr = ERR_BAD_NUMBER;
+ psernum[0] = 0x00;
+ psernum[1] = 0xE0;
+@@ -141,8 +106,7 @@ void read_2501_memory(unsigned char *pse
+ psernum[3] = 0xFF;
+ psernum[4] = 0xFF;
+ psernum[5] = 0xFF;
+- }
+- else {
++ } else {
+ psernum[0] = 0x00;
+ psernum[1] = 0xE0;
+ psernum[2] = 0xEE;
+@@ -173,27 +137,23 @@ static void write_byte(unsigned char com
+ {
+ char i;
+
+- for (i=0; i<8; i++) {
++ for (i = 0; i < 8; i++) {
+ /* 1 us to 15 us low pulse starts bit slot */
+ /* Start with high pulse for 3 us */
+ io_input();
+-
+ udelay(3);
+
+ io_out(0);
+ io_output();
+-
+ udelay(3);
+
+ if (command & 0x01) {
+ /* 60 us high for 1-bit */
+ io_input();
+ udelay(60);
+- }
+- else {
++ } else
+ /* 60 us low for 0-bit */
+ udelay(60);
+- }
+ /* Leave pin as input */
+ io_input();
+
+@@ -201,11 +161,11 @@ static void write_byte(unsigned char com
+ }
+ }
+
+-static void read_byte(unsigned char *data)
++static void read_byte(unsigned char *data)
+ {
+ unsigned char i, rdat = 0;
+
+- for (i=0; i<8; i++) {
++ for (i = 0; i < 8; i++) {
+ /* read one bit from one-wire device */
+
+ /* 1 - 15 us low starts bit slot */
+@@ -233,22 +193,21 @@ static void read_byte(unsigned char *da
+
+ void board_get_enetaddr(uchar *enetaddr)
+ {
+- unsigned char sn[6], err=NO_ERROR;
++ unsigned char sn[6], err = NO_ERROR;
+
+ init_gpio();
+
+ read_2501_memory(sn, &err);
+
+ if (err == NO_ERROR) {
+- sprintf(enetaddr, "%02x:%02x:%02x:%02x:%02x:%02x",
++ sprintf((char *)enetaddr, "%02x:%02x:%02x:%02x:%02x:%02x",
+ sn[0], sn[1], sn[2], sn[3], sn[4], sn[5]);
+ printf("MAC address: %s\n", enetaddr);
+- setenv("ethaddr", enetaddr);
+- }
+- else {
+- sprintf(enetaddr, "00:01:02:03:04:05");
++ setenv("ethaddr", (char *)enetaddr);
++ } else {
++ sprintf((char *)enetaddr, "00:01:02:03:04:05");
+ printf("Error reading MAC address.\n");
+ printf("Setting default to %s\n", enetaddr);
+- setenv("ethaddr", enetaddr);
++ setenv("ethaddr", (char *)enetaddr);
+ }
+ }
+diff -Naupr u-boot-1.1.6/board/v38b/u-boot.lds u-boot-1.1.6-fsl-1/board/v38b/u-boot.lds
+--- u-boot-1.1.6/board/v38b/u-boot.lds 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/v38b/u-boot.lds 2006-11-10 11:24:29.000000000 -0600
+@@ -61,6 +61,7 @@ SECTIONS
+ *(.rodata)
+ *(.rodata1)
+ *(.rodata.str1.4)
++ *(.eh_frame)
+ }
+ .fini : { *(.fini) } =0
+ .ctors : { *(.ctors) }
+@@ -93,11 +94,13 @@ 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 = .;
+diff -Naupr u-boot-1.1.6/board/v38b/v38b.c u-boot-1.1.6-fsl-1/board/v38b/v38b.c
+--- u-boot-1.1.6/board/v38b/v38b.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/board/v38b/v38b.c 2006-11-10 11:24:29.000000000 -0600
+@@ -28,43 +28,44 @@
+ #include <mpc5xxx.h>
+ #include <asm/processor.h>
+
++
+ #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;
++ *(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;
++ *(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;
++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
+ __asm__ volatile ("sync");
+
+ /* set mode register: reset DLL */
+- *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
+ __asm__ volatile ("sync");
+ #endif /* SDRAM_DDR */
+
+ /* precharge all banks */
+- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit;
++ *(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;
++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit;
+ __asm__ volatile ("sync");
+
+ /* set mode register */
+- *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE;
++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE;
+ __asm__ volatile ("sync");
+
+ /* normal operation */
+- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit;
+ __asm__ volatile ("sync");
+ }
+ #endif /* !CFG_RAMBOOT */
+@@ -80,18 +81,18 @@ long int initdram(int board_type)
+ ulong test1, test2;
+
+ /* setup SDRAM chip selects */
+- *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001e; /* 2G at 0x0 */
+- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x80000000; /* disabled */
++ *(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;
++ *(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;
++ *(vu_long *) MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY;
+ __asm__ volatile ("sync");
+ #endif /* SDRAM_DDR */
+
+@@ -112,20 +113,20 @@ long int initdram(int board_type)
+
+ /* 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;
++ *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0x13 + __builtin_ffs(dramsize >> 20) - 1;
+ else
+- *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
++ *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */
+
+ /* let SDRAM CS1 start right after CS0 */
+- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;/* 2G */
++ *(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);
++ 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);
++ test2 = get_ram_size((long *) (CFG_SDRAM_BASE + dramsize), 0x80000000);
+ }
+ if (test1 > test2) {
+ sdram_start(0);
+@@ -139,22 +140,22 @@ long int initdram(int board_type)
+
+ /* set SDRAM CS1 size according to the amount of RAM found */
+ if (dramsize2 > 0)
+- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize
++ *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize
+ | (0x13 + __builtin_ffs(dramsize2 >> 20) - 1);
+ else
+- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */
++ *(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;
++ 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;
++ dramsize2 = *(vu_long *) MPC5XXX_SDRAM_CS1CFG & 0xFF;
+ if (dramsize2 >= 0x13)
+ dramsize2 = (1 << (dramsize2 - 0x13)) << 20;
+ else
+@@ -176,7 +177,7 @@ long int initdram(int board_type)
+ if ((SVR_MJREV(svr) >= 2) &&
+ (PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) {
+
+- *(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04;
++ *(vu_long *) MPC5XXX_SDRAM_SDELAY = 0x04;
+ __asm__ volatile ("sync");
+ }
+
+@@ -194,27 +195,42 @@ int checkboard (void)
+ int board_early_init_r(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.
++ * Now, when we are in RAM, enable flash write access for the
++ * detection process. Note that CS_BOOT cannot be cleared when
++ * executing in flash.
++ */
++ *(vu_long *) MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
++
++#ifdef CONFIG_HW_WATCHDOG
++ /*
++ * Enable and configure the direction (output) of PSC3_9 - watchdog
++ * reset input. Refer to 7.3.2.2.[1,3,4] of the MPC5200B User's
++ * Manual.
++ */
++ *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC3_9;
++ *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC3_9;
++#endif /* CONFIG_HW_WATCHDOG */
++
++ /*
++ * Enable GPIO_WKUP_7 to "read the status of the actual power
++ * situation". Default direction is input, so no need to set it
++ * explicitly.
+ */
+- *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
++ *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_WKUP_7;
+ return 0;
+ }
+
+
+ #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;
++ *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4;
+ /* Deassert reset */
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+
+
+@@ -223,30 +239,22 @@ void ide_set_reset(int idereset)
+ debug("ide_reset(%d)\n", idereset);
+
+ if (idereset) {
+- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4;
++ *(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 |= GPIO_PSC1_4;
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4;
+ }
+ #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
+
+
+-void led_d4_on(void)
+-{
+- /* TIMER7 as GPIO output low */
+- *(vu_long *) (MPC5XXX_GPT + 0x70) |= 0x24;
+-}
+-
+-
+-void led_d4_off(void)
+-{
+- /* TIMER7 as GPIO output high */
+- *(vu_long *) (MPC5XXX_GPT + 0x70) |= 0x34;
+-}
+-
+-
++#ifdef CONFIG_HW_WATCHDOG
+ void hw_watchdog_reset(void)
+ {
+-/* TODO fill this in */
++ /*
++ * MarelV38B has a TPS3705 watchdog. Spec says that to kick the dog
++ * we need a positive or negative transition on WDI i.e., our PSC3_9.
++ */
++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O ^= GPIO_PSC3_9;
+ }
++#endif /* CONFIG_HW_WATCHDOG */
+diff -Naupr u-boot-1.1.6/CHANGELOG u-boot-1.1.6-fsl-1/CHANGELOG
+--- u-boot-1.1.6/CHANGELOG 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/CHANGELOG 2006-12-06 10:33:48.000000000 -0600
+@@ -1,3 +1,737 @@
++commit 8d9a8610b8256331132227e9e6585c6bd5742787
++Author: Wolfgang Denk <wd@pollux.denx.de>
++Date: Thu Nov 30 01:54:07 2006 +0100
++
++ Code cleanup. Update CHANGELOG.
++
++commit 726e90aacf0b1ecb0e7055be574622fbe3e450ba
++Author: Grant Likely <grant.likely@secretlab.ca>
++Date: Wed Nov 29 16:23:42 2006 +0100
++
++ [PATCH] [MPC52xx] Use IPB bus frequency for SOC peripherals
++
++ The soc node of the mpc52xx needs to be loaded with the IPB bus frequency,
++ not the XLB frequency.
++
++ This patch depends on the previous patches for MPC52xx device tree support
++
++ Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
++ Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
++
++commit 1eac2a71417b6675b11aace72102a2e7fde8f5c6
++Author: Stefan Roese <sr@denx.de>
++Date: Wed Nov 29 15:42:37 2006 +0100
++
++ [PATCH] Add support for Prodrive P3M750 & P3M7448 (P3Mx) boards
++
++ This patch adds support for the Prodrive P3M750 (PPC750 & MV64460)
++ and the P3M7448 (MPC7448 & MV64460) PMC modules. Both modules are
++ quite similar and share the same board directory "prodrive/p3mx"
++ and the same config file "p3mx.h".
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 1bdd46832aeb569f5e04b1f20f64318525b6525a
++Author: Stefan Roese <sr@denx.de>
++Date: Wed Nov 29 12:53:15 2006 +0100
++
++ [PATCH] common/cmd_elf.c: Enable loadaddr as parameter in bootvx command
++
++ In the bootvx command the load address was only read from the env
++ variable "loadaddr" and not optionally passed as paramter as described
++ in the help. This is fixed with this patch. The behaviour is now the
++ same as in the bootelf command.
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 4e26f1074c3ac1bd8fd094f0dc4a1c4a0b15a592
++Author: Stefan Roese <sr@denx.de>
++Date: Wed Nov 29 12:03:57 2006 +0100
++
++ [PATCH] include/ppc440.h minor error affecting interrupts
++
++ Fixed include/ppc440.c for UIC address Bug
++
++ Corrects bug affecting the addresses for the universal interrupt
++ controller UIC2 and UIC3 on the PPC440 Epx, GRx, and SPE chips.
++
++ Signed-off-by: Jeff Mann <mannj@embeddedplanet.com>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 1939d969443ccf316cab2bf32ab1027d4db5ba1a
++Author: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
++Date: Tue Nov 28 16:17:27 2006 -0600
++
++ Make fsl-i2c not conflict with SOFT I2C
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit 14198bf768fdc958e3c1afd2404e5262208e98d7
++Author: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
++Date: Tue Nov 28 16:17:18 2006 -0600
++
++ Fix I2C master address initialization.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit cf3d045e51ca8dcc6cf759827140861d6ac25c04
++Author: Kim Phillips <kim.phillips@freescale.com>
++Date: Tue Nov 28 23:31:19 2006 -0600
++
++ Assign maintainers for mpc8349emds and mpc8360emds
++
++ Dave for mpc8360emds, and me for mpc8349emds.
++
++commit 1aa934c81b77f2080d3ca4b226eab67b17a33961
++Author: Kim Phillips <kim.phillips@freescale.com>
++Date: Tue Nov 28 23:28:33 2006 -0600
++
++ Eliminate gcc 4 'used uninitialized' warnings in drivers/qe/uccf.c
++
++ give initial values for reg_num, shift, p_cmxucr in ucc_set_clk_src
++ since they are passed by reference to ucc_get_cmxucr_reg and assigned.
++
++commit e857a5bdb3954b896c0920cb9d8d2b1b9c107ce5
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Nov 28 12:09:35 2006 -0600
++
++ mpc83xx: Miscellaneous code style fixes
++
++ Implement various code style fixes and similar changes.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit e59581c56ab5d6e0207ddac3b2c1d55cb36ec706
++Author: Stefan Roese <sr@denx.de>
++Date: Tue Nov 28 17:55:49 2006 +0100
++
++ [PATCH] Enable the IceCube/lite5200 variants to pass a device tree to Linux.
++
++ This patch adds the code and configuration necessary to boot with an
++ arch/powerpc Linux kernel.
++
++ Signed-off-by: Grant Likely <grant.likely@gmail.com>
++ Acked-by: Jon Loeliger <jdl@freescale.com>
++
++commit e732faec95a83cb468b4850ae807c8301dde8f6a
++Author: Stefan Roese <sr@denx.de>
++Date: Tue Nov 28 16:09:24 2006 +0100
++
++ [PATCH] PPC4xx: 440SP Rev. C detection added
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit e7f3e9ff01fbd7fa72eb42a9675fbed6bc4736b0
++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
++
++ Update CHANGELOG
++
++commit f6e495f54cdb8fe340b9c03deab40ad746d52fae
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 17:43:25 2006 +0100
++
++ [PATCH] 4xx_enet.c: Correct the setting of zmiifer register
++
++ Patch below corrects the setting of the zmiifer register, it was
++ overwritting the register rather than ORing the settings.
++
++ Signed-off-by: Neil Wilson <NWilson@airspan.com>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit d1a72545296800b7e219f93104ad5836f0003d66
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 17:34:10 2006 +0100
++
++ [PATCH] Select NAND embedded environment from board configuration
++
++ The current NAND Bootloader setup forces the environment
++ variables to be in line with the bootloader. This change
++ enables the configuration to be made in the board include
++ file instead so that it can be individually enabled.
++
++ Signed-off-by: Nick Spence <nick.spence@freescale.com>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 15784862857c3c2214498defcfed84ff137fb81e
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 17:22:19 2006 +0100
++
++ [PATCH] nand_wait() timeout fixes
++
++ Two fixes for the nand_wait() function in
++ drivers/nand/nand_base.c:
++
++ 1. Use correct timeouts. The original timeouts in Linux
++ source are 400ms and 20ms not 40s and 20s
++
++ 2. Return correct error value in case of timeout. 0 is
++ interpreted as OK.
++
++ Signed-off-by: Rui Sousa <rui.sousa@laposte.net>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit da5553b095bf04f4f109ad7e565dae3aba47b230
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 17:04:06 2006 +0100
++
++ [PATCH] Allow CONFIG_OF_FLAT_TREE to boot a non-arch/powerpc kernel
++
++ This patch allows an arch/ppc kernel to be booted by just passing 1 or 2
++ arguments to bootm. It removes the getenv("disable_of") test that used
++ to be used for this purpose.
++
++ Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
++ Acked-by: Jon Loeliger <jdl@freescale.com>
++
++commit a9398e018593782c5fa7d0741955fc1256b34c1e
++Author: Wolfgang Denk <wd@pollux.denx.de>
++Date: Mon Nov 27 15:32:42 2006 +0100
++
++ Minor code cleanup. Update CHANGELOG.
++
++commit 1729b92cde575476684bffe819d0b7791b57bff2
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 14:52:04 2006 +0100
++
++ [PATCH] 4xx: Fix problem with board specific reset code (now for real)
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit cc5ee8a92a0e3ca6f727af71b8fd206460c7afd7
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 14:49:51 2006 +0100
++
++ [PATCH] alpr: remove unused board specific flash driver
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 1f94d162e2b5f0edc28d9fb11482502c44d218e1
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 14:48:41 2006 +0100
++
++ [PATCH] 4xx: Fix problem with board specific reset code
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit ec0c2ec725aec9524a177a77ce75559e644a931a
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 14:46:06 2006 +0100
++
++ [PATCH] Remove testing 4xx enet PHY setup
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 1c2ce2262069510f31c7d3fd7efd3d58b8c0c148
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 27 14:12:17 2006 +0100
++
++ [PATCH] Update Prodrive ALPR board support (440GX)
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 78d620ebb5871d252270dedfad60c6568993b780
++Author: Wolfgang Denk <wd@atlas.denx.de>
++Date: Thu Nov 23 22:58:58 2006 +0100
++
++ Updates for TQM5200 modules:
++ - fix off-by-one error in board/tqm5200/cam5200_flash.c error message
++ - simplify "udate" definitions
++
++commit 2053283304eeddf250d109e6791eb6fa4cad14f7
++Author: Stefan Roese <sr@denx.de>
++Date: Wed Nov 22 13:20:50 2006 +0100
++
++ [PATCH] PPC4xx start.S: Fix for processor errata
++
++ Fixed cpu/ppc4xx/start.S for 440EPx Errata: further corrects PPC440EPx
++ errata 1.12: 440_33 by moving patch up in code.
++
++ Signed-off-by: Jeff Mann <mannj@embeddedplanet.com>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit 4ef6251403f637841000e0fef9e832aa01339822
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 20 20:39:52 2006 +0100
++
++ [PATCH] Update AMCC Sequoia config file to support 64MByte NOR FLASH
++
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit e4bbd8da164b976d38616bd9c69c5e86e193cdf0
++Author: Wolfgang Denk <wd@pollux.denx.de>
++Date: Mon Nov 20 10:28:30 2006 +0100
++
++ Update CHANGELOG
++
++commit 260421a21e934a68d31fb6125b0fbd2631a8ca20
++Author: Stefan Roese <sr@denx.de>
++Date: Mon Nov 13 13:55:24 2006 +0100
++
++ [PATCH] CFI driver AMD Command Set Top boot geometry reversal, etc. [Updated]
++
++ * Adds support for AMD command set Top Boot flash geometry reversal
++ * Adds support for reading JEDEC Manufacturer ID and Device ID
++ * Adds support for displaying command set, manufacturer id and
++ device ids (flinfo)
++ * Makes flinfo output to be consistent when CFG_FLASH_EMPTY_INFO defined
++ * Removes outdated change history (refer to git log instead)
++
++ Signed-off-by: Tolunay Orkun <listmember@orkun.us>
++ Signed-off-by: Stefan Roese <sr@denx.de>
++
++commit b21b511d4c50408f4853f46f06b601272196223f
++Author: Wolfgang Denk <wd@pollux.denx.de>
++Date: Sun Nov 12 21:13:23 2006 +0100
++
++ Update CHANGELOG
++
++commit ce3f1a40c507afbab06c5eb58ccdc6713eda3245
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Sat Nov 11 22:48:22 2006 +0100
++
++ Disable the watchdog in the default config for the V38B board.
++
++commit 44a47e6db2694841211f1c8fdbafd36992e9cd1a
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Sat Nov 11 22:43:00 2006 +0100
++
++ Change the GPIO pin multiplexing configuration for V38B. The USB GPIO pin
++ group is enabled for USB earlier (in cpu_init_f() instead of
++ usb_lowlevel_init()).
++
++commit 91650b3e4de688038d4f71279c44858e3e2c6870
++Author: Wolfgang Denk <wd@pollux.denx.de>
++Date: Mon Nov 6 17:06:36 2006 +0100
++
++ Sequential accesses to non-existent memory must be synchronized,
++ at least on G2 cores.
++
++ This fixes get_ram_size() problems on MPC5200 Rev. B boards.
++
++commit be5e61815d5a1fac290ce9c0ef09cb6a8e4288fa
++Author: Timur Tabi <timur@freescale.com>
++Date: Fri Nov 3 19:15:00 2006 -0600
++
++ mpc83xx: Update 83xx to use fsl_i2c.c
++
++ Update the 83xx tree to use I2C support in drivers/fsl_i2c.c. Delete
++ cpu/mpc83xx/i2c.c, include/asm-ppc/i2c.h, and all references to those files.
++ Added multiple I2C bus support to fsl_i2c.c.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit d239d74b1c937984bc519083a8e7de373a390f06
++Author: Timur Tabi <timur@freescale.com>
++Date: Fri Nov 3 12:00:28 2006 -0600
++
++ mpc83xx: Replace CFG_IMMRBAR with CFG_IMMR
++
++ Replace all instances of CFG_IMMRBAR with CFG_IMMR, so that the 83xx
++ tree matches the other 8xxx trees.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit f7fb2e703ec9688541416962724adff70a7322cb
++Author: Kim Phillips <kim.phillips@freescale.com>
++Date: Thu Nov 2 19:47:11 2006 -0600
++
++ mpc83xx: Lindent and clean up cpu/mpc83xx/speed.c
++
++commit 90f30a710a3c619b5405860a686c4ddfc495d4b6
++Author: Dave Liu <daveliu@freescale.com>
++Date: Thu Nov 2 18:05:50 2006 -0600
++
++ mpc83xx: Fix the incorrect dcbz operation
++
++ The 834x rev1.x silicon has one CPU5 errata.
++
++ The issue is when the data cache locked with
++ HID0[DLOCK], the dcbz instruction looks like no-op inst.
++
++ The right behavior of the data cache is when the data cache
++ Locked with HID0[DLOCK], the dcbz instruction allocates
++ new tags in cache.
++
++ The 834x rev3.0 and later and 8360 have not this bug inside.
++
++ So, when 834x rev3.0/8360 are working with ECC, the dcbz
++ instruction will corrupt the stack in cache, the processor will
++ checkstop reset.
++
++ However, the 834x rev1.x can work with ECC with these code,
++ because the sillicon has this cache bug. The dcbz will not
++ corrupt the stack in cache.
++ Really, it is the fault code running on fault sillicon.
++
++ This patch fix the incorrect dcbz operation. Instead of
++ CPU FP writing to initialise the ECC.
++
++ CHANGELOG:
++ * Fix the incorrect dcbz operation instead of CPU FP
++ writing to initialise the ECC memory. Otherwise, it
++ will corrupt the stack in cache, The processor will checkstop
++ reset.
++
++ Signed-off-by: Dave Liu <daveliu@freescale.com>
++
++commit bf0b542d6773a5a1cbce77691f009b06d9aeb57d
++Author: Kim Phillips <kim.phillips@freescale.com>
++Date: Wed Nov 1 00:10:40 2006 -0600
++
++ mpc83xx: add OF_FLAT_TREE bits to 83xx boards
++
++ add ft_pci_setup, OF_CPU, OF_SOC, OF_TBCLK, and
++ STDOUT_PATH configuration bits to mpc8349emds,
++ mpc8349itx, and mpc8360emds board code.
++
++ redo environment to use bootm with the fdtaddr
++ for booting ARCH=powerpc kernels by default,
++ and provide default fdtaddr values.
++
++commit 48041365b3420589ad464ebc7752e0053538b729
++Author: Kim Phillips <kim.phillips@freescale.com>
++Date: Wed Nov 1 00:07:25 2006 -0600
++
++ mpc83xx: change ft code to modify local-mac-address property
++
++ Update 83xx OF code to update local-mac-address properties
++ for ethernet instead of the obsolete 'address' property.
++
++commit 9ca880a250870a7d55754291b5591d2b5fe89b54
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Oct 31 21:23:16 2006 -0600
++
++ mpc83xx: Fix dual I2C support for the MPC8349ITX, MPC8349EMDS, TQM834x, and MPC8360EMDS
++
++ This patch also adds an improved I2C set_speed(), which handles all clock
++ frequencies.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit ac4b5622ce050b5ee1e154b98df630d778661632
++Author: Dave Liu <daveliu@freescale.com>
++Date: Tue Oct 31 19:54:59 2006 -0600
++
++ mpc83xx: add the README.mpc8360emds
++
++ add doc/README.mpc8360emds to accompany the new board support
++
++commit 7737d5c658c606f999dfbe3e86b0fed49e5c50ef
++Author: Dave Liu <daveliu@freescale.com>
++Date: Fri Nov 3 12:11:15 2006 -0600
++
++ mpc83xx: add QE ethernet support
++
++ this patch adds support for the QUICC Engine based UCC gigabit ethernet device.
++
++commit 5f8204394e39bbe8cd9f08b8f8d145b6c01f7c73
++Author: Dave Liu <daveliu@freescale.com>
++Date: Fri Nov 3 19:33:44 2006 -0600
++
++ mpc83xx: Add MPC8360EMDS basic board support
++
++ Add support for the Freescale MPC8360EMDS board.
++ Includes DDR, DUART, Local Bus, PCI.
++
++commit 23892e49352de74f7fac36ff90bb1be143d195e3
++Author: Dave Liu <daveliu@freescale.com>
++Date: Tue Oct 31 19:30:40 2006 -0600
++
++ mpc83xx: add the QUICC Engine (QE) immap file
++
++ common QE immap file. Also required for 8360.
++
++commit b701652a4992bdcc62fb1a6038a85beef9e55da4
++Author: Dave Liu <daveliu@freescale.com>
++Date: Tue Oct 31 19:25:38 2006 -0600
++
++ mpc83xx: Add 8360 specifics to 83xx immap
++
++ Mainly add QE device dependencies, with appropriate 8360 protection.
++ Lindent also run.
++
++commit 988833324a7fda482c8ac3ca23eb539f8232e404
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Oct 31 19:14:41 2006 -0600
++
++ mpc83xx: Fix PCI, USB, bootargs for MPC8349E-mITX
++
++ PREREQUISITE PATCHES:
++
++ * This patch can only be applied after the following patches have been applied:
++
++ 1) DNX#2006092142000015 "Add support for the MPC8349E-mITX 1/2"
++ 2) DNX#2006092142000024 "Add support for the MPC8349E-mITX 2/2"
++
++ CHANGELOG:
++
++ * For the 8349E-mITX, fix some size values in pci_init_board(), enable
++ the clock for the 2nd USB board (Linux kernel will hang otherwise),
++ and fix the CONFIG_BOOTARGS macro.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit 2ad6b513b31070bd0c003792ed1c3e7f5d740357
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Oct 31 18:44:42 2006 -0600
++
++ mpc83xx: Add support for the MPC8349E-mITX
++
++ PREREQUISITE PATCHES:
++
++ * This patch can only be applied after the following patches have been applied:
++
++ 1) DNX#2006090742000024 "Add support for multiple I2C buses"
++ 2) DNX#2006090742000033 "Multi-bus I2C implementation of MPC834x"
++ 3) DNX#2006091242000041 "Additional MPC8349 support for multibus i2c"
++ 4) DNX#2006091242000078 "Add support for variable flash memory sizes on 83xx systems"
++ 5) DNX#2006091242000069 "Add support for Errata DDR6 on MPC 834x systems"
++
++ CHANGELOG:
++
++ * Add support for the Freescale MPC8349E-mITX reference design platform.
++ The second TSEC (Vitesse 7385 switch) is not supported at this time.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit 183da6d9b446cc12123455844ad1187e2375626f
++Author: Ben Warren <bwarren@qstreams.com>
++Date: Tue Sep 12 10:15:53 2006 -0400
++
++ Additional MPC8349 support for multibus i2c
++
++ Hello,
++
++ Here is a patch for a file that was accidentally left out of a previous
++ attempt.
++
++ It accompanies the patch with ticket DNX#2006090742000024
++
++ CHANGELOG:
++ Change PCI initialization to use new multi-bus I2C API.
++
++ regards,
++ Ben
++
++commit b24f119d672b709d153ff2ac091d4aa63ec6877d
++Author: Ben Warren <bwarren@qstreams.com>
++Date: Thu Sep 7 16:51:04 2006 -0400
++
++ Multi-bus I2C implementation of MPC834x
++
++ Hello,
++
++ Attached is a patch implementing multiple I2C buses on the MPC834x CPU
++ family and the MPC8349EMDS board in particular.
++ This patch requires Patch 1 (Add support for multiple I2C buses).
++ Testing was performed on a 533MHz board.
++
++ /*** Note: This patch replaces ticket DNX#2006083042000027 ***/
++
++ Signed-off-by: Ben Warren <bwarren@qstreams.com>
++
++ CHANGELOG:
++ Implemented driver-level code to support two I2C buses on the
++ MPC834x CPU family and the MPC8349EMDS board. Available I2C bus speeds
++ are 50kHz, 100kHz and 400kHz on each bus.
++
++ regards,
++ Ben
++
++commit bb99ad6d8257bf828f150d40f507b30d80a4a7ae
++Author: Ben Warren <bwarren@qstreams.com>
++Date: Thu Sep 7 16:50:54 2006 -0400
++
++ Add support for multiple I2C buses
++
++ Hello,
++
++ Attached is a patch providing support for multiple I2C buses at the
++ command level. The second part of the patch includes an implementation
++ for the MPC834x CPU and MPC8349EMDS board.
++
++ /*** Note: This patch replaces ticket DNX#2006083042000018 ***/
++
++ Signed-off-by: Ben Warren <bwarren@qstreams.com>
++
++ Overview:
++
++ 1. Include new 'i2c' command (based on USB implementation) using
++ CONFIG_I2C_CMD_TREE.
++
++ 2. Allow multiple buses by defining CONFIG_I2C_MULTI_BUS. Note that
++ the commands to change bus number and speed are only available under the
++ new 'i2c' command mentioned in the first bullet.
++
++ 3. The option CFG_I2C_NOPROBES has been expanded to work in multi-bus
++ systems. When CONFIG_I2C_MULTI_BUS is used, this option takes the form
++ of an array of bus-device pairs. Otherwise, it is an array of uchar.
++
++ CHANGELOG:
++ Added new 'i2c' master command for all I2C interaction. This is
++ conditionally compiled with CONFIG_I2C_CMD_TREE. New commands added for
++ setting I2C bus speed as well as changing the active bus if the board
++ has more than one (conditionally compiled with
++ CONFIG_I2C_MULTI_BUS). Updated NOPROBE logic to handle multiple buses.
++ Updated README.
++
++ regards,
++ Ben
++
++commit bed85caf872714ebf53013967a695c9d63acfc68
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Oct 31 18:13:36 2006 -0600
++
++ mpc83xx: Add support for Errata DDR6 on MPC 834x systems
++
++ CHANGELOG:
++
++ * Errata DDR6, which affects all current MPC 834x processors, lists changes
++ required to maintain compatibility with various types of DDR memory. This
++ patch implements those changes.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit afd6e470f639883002c7c59d562690a5cb0f4865
++Author: Timur Tabi <timur@freescale.com>
++Date: Wed Oct 25 18:45:23 2006 -0500
++
++ mpc83xx: fix TQM build by defining a CFG_FLASH_SIZE for it
++
++commit 31068b7c4abeefcb2c8fd4fbeccc8ec6c6d0475a
++Author: Timur Tabi <timur@freescale.com>
++Date: Tue Aug 22 17:07:00 2006 -0500
++
++ mpc83xx: Add support for variable flash memory sizes on 83xx systems
++
++ CHANGELOG:
++
++ * On 83xx systems, use the CFG_FLASH_SIZE macro to program the LBC local access
++ window registers, instead of using a hard-coded value of 8MB.
++
++ Signed-off-by: Timur Tabi <timur@freescale.com>
++
++commit 2fc34ae66e73fa7841d1a006dc1b5dcbc1f78965
++Author: Tanya Jiang <tanya.jiang@freescale.com>
++Date: Thu Aug 3 18:38:13 2006 +0800
++
++ mpc83xx: Unified TQM834x variable names with 83xx and consolidated macros
++
++ Unified TQM834x variable names with 83xx and consolidated macro
++ in preparation for the 8360 and other upcoming 83xx devices.
++
++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com>
++
++commit f6eda7f80ccc13d658020268c507d7173cf2e8aa
++Author: Dave Liu <daveliu@freescale.com>
++Date: Wed Oct 25 14:41:21 2006 -0500
++
++ mpc83xx: Changed to unified mpx83xx names and added common 83xx changes
++
++ Incorporated the common unified variable names and the changes in preparation
++ for releasing mpc8360 patches.
++
++ Signed-off-by: Dave Liu <daveliu@freescale.com>
++
++commit 3894c46c27c64891f93ac04edde86a9fa9758d92
++Author: Tanya Jiang <tanya.jiang@freescale.com>
++Date: Thu Aug 3 18:36:02 2006 +0800
++
++ mpc83xx: Fix missing build for mpc8349emds pci.c
++
++ Make pci build for mpc8349emds
++
++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com>
++
++commit 09a81ff740b29deea1e2ab08a3c2ac136c2e6219
++Author: Tanya Jiang <tanya.jiang@freescale.com>
++Date: Thu Aug 3 18:39:49 2006 +0800
++
++ mpc83xx: Removed unused file resetvec.S for mpc83xx cpu
++
++ Removed unused file resetvec.S for mpc83xx cpu
++
++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com>
++
++commit 04f899fc465c3e44f2b55ecc70618f5696fc0ddf
++Author: Nick Spence <Nick.Spence@freescale.com>
++Date: Sat Sep 30 00:32:59 2006 -0700
++
++ NAND Flash verify across block boundaries
++
++ This patch addresses a problem when CONFIG_MTD_NAND_VERIFY_WRITE is
++ defined
++ and the write crosses a block boundary. The pointer to the verification
++ buffer (bufstart) is not being updated to reflect the starting of the
++ new
++ block so the verification of the second block fails.
++
++ CHANGELOG:
++
++ * Fix NAND FLASH page verification across block boundaries
++
++commit f484dc791a3932537213c43c654cc1295c64b84c
++Author: Nick Spence <nick.spence@freescale.com>
++Date: Thu Sep 7 07:39:46 2006 -0700
++
++ Added RGMII support to the TSECs and Marvell 881111 Phy
++
++ Added a phy initialization to adjust the RGMII RX and TX timing
++ Always set the R100 bit in 100 BaseT mode regardless of the TSEC mode
++
++ Signed-off-by: Nick Spence <nick.spence@freescale.com>
++
++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 25721b5cec2be4bce79cfade17ec8f6aa1e67526
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Wed Nov 1 02:04:38 2006 +0100
++
++ Finish up support for MarelV38B board
++ - add watchdog support
++ - enable GPIO_WKUP_7 pin for input
++ - code cleanup
++
++commit ffa150bc90c943ca265170bd1be3f293674dd5c7
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Wed Nov 1 01:45:46 2006 +0100
++
++ - Fix issues related to the use of ELDK 4 when compiling for MarelV38B:
++ * remove warnings when compiling ethaddr.c
++ * adjust linker script (fixes a crash resulting from incorrect
++ definition of __u_boot_cmd_start)
++ - Some MarelV38B code cleanup.
++
++commit dae80f3caf9754a6dd3ddf3cf903d0c46cbd4385
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Wed Nov 1 01:38:16 2006 +0100
++
++ - Add MPC5XXX register definition MPC5XXX_WU_GPIO_DATA_I and change the
++ MPC5XXX_WU_GPIO_DATA macro to MPC5XXX_WU_GPIO_DATA_O (per MPC5200 User's
++ Manual). Replace the uses of MPC5XXX_WU_GPIO_DATA with
++ MPC5XXX_WU_GPIO_DATA_O for affected boards.
++
++ - Add defintions for some MPC5XXX GPIO pins.
++
++commit 82d9c9ec29a1bec1b03ba616425ebaed231072c8
++Author: Bartlomiej Sieka <tur@semihalf.com>
++Date: Wed Nov 1 01:34:29 2006 +0100
++
++ Changed MarelV38B board make target to lowercase. Config file cleanup.
++
+ commit 1954be6e9c9421b45d0a9d05b10356acc7563150
+ Author: Wolfgang Denk <wd@pollux.denx.de>
+ Date: Sun Oct 29 01:03:51 2006 +0200
+@@ -451,6 +1185,34 @@ Date: Tue Oct 10 17:02:22 2006 -0500
+
+ Fix whitespace and 80-col issues.
+
++commit 5c912cb1c31266c66ca59b36f9b6f87296421d75
++Author: Stefan Roese <sr@denx.de>
++Date: Sat Oct 7 11:36:51 2006 +0200
++
++ CFG_NAND_QUIET_TEST added to not warn upon missing NAND device
++ Patch by Stefan Roese, 07 Oct 2006
++
++commit 5bc528fa4da751d472397b308137238a6465afd2
++Author: Stefan Roese <sr@denx.de>
++Date: Sat Oct 7 11:35:25 2006 +0200
++
++ Update ALPR code (NAND support working now)
++ Patch by Stefan Roese, 07 Oct 2006
++
++commit 77d5034847d328753b80c46b83f960a14a26f40e
++Author: Stefan Roese <sr@denx.de>
++Date: Sat Oct 7 11:33:03 2006 +0200
++
++ Remove compile warnings in fpga code
++ Patch by Stefan Roese, 07 Oct 2006
++
++commit f3443867e90d2979a7dd1c65b0d537777e1f9850
++Author: Stefan Roese <sr@denx.de>
++Date: Sat Oct 7 11:30:52 2006 +0200
++
++ Add CONFIG_BOARD_RESET to configure board specific reset function
++ Patch by Stefan Roese, 07 Oct 2006
++
+ commit f55df18187e7a45cb73fec4370d12135e6691ae1
+ Author: John Traill <john.traill@freescale.com>
+ Date: Fri Sep 29 08:23:12 2006 +0100
+@@ -683,6 +1445,21 @@ Date: Wed Aug 16 10:54:09 2006 -0500
+
+ Signed-off-by: Matthew McClintock <msm@freescale.com>
+
++commit 899620c2d66d4eef3b2a0034d062e71d45d886c9
++Author: Stefan Roese <sr@denx.de>
++Date: Tue Aug 15 14:22:35 2006 +0200
++
++ Add initial support for the ALPR board from Prodrive
++ NAND needs some additional testing
++ Patch by Heiko Schocher, 15 Aug 2006
++
++commit f0ff4692ff3372dec55074a8eb444943ab095abb
++Author: Stefan Roese <sr@denx.de>
++Date: Tue Aug 15 14:15:51 2006 +0200
++
++ Add FPGA Altera Cyclone 2 support
++ Patch by Heiko Schocher, 15 Aug 2006
++
+ commit fecf1c7e4de1b2779edc18742b91c22bdc32b68b
+ Author: Jon Loeliger <jdl@freescale.com>
+ Date: Mon Aug 14 15:33:38 2006 -0500
+diff -Naupr u-boot-1.1.6/common/altera.c u-boot-1.1.6-fsl-1/common/altera.c
+--- u-boot-1.1.6/common/altera.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/altera.c 2006-11-30 12:34:13.000000000 -0600
+@@ -50,15 +50,20 @@ int altera_load( Altera_desc *desc, void
+ {
+ int ret_val = FPGA_FAIL; /* assume a failure */
+
+- if (!altera_validate (desc, __FUNCTION__)) {
++ if (!altera_validate (desc, (char *)__FUNCTION__)) {
+ printf ("%s: Invalid device descriptor\n", __FUNCTION__);
+ } else {
+ switch (desc->family) {
+ case Altera_ACEX1K:
++ case Altera_CYC2:
+ #if (CONFIG_FPGA & CFG_ACEX1K)
+ PRINTF ("%s: Launching the ACEX1K Loader...\n",
+ __FUNCTION__);
+ ret_val = ACEX1K_load (desc, buf, bsize);
++#elif (CONFIG_FPGA & CFG_CYCLON2)
++ PRINTF ("%s: Launching the CYCLON II Loader...\n",
++ __FUNCTION__);
++ ret_val = CYC2_load (desc, buf, bsize);
+ #else
+ printf ("%s: No support for ACEX1K devices.\n",
+ __FUNCTION__);
+@@ -78,7 +83,7 @@ int altera_dump( Altera_desc *desc, void
+ {
+ int ret_val = FPGA_FAIL; /* assume a failure */
+
+- if (!altera_validate (desc, __FUNCTION__)) {
++ if (!altera_validate (desc, (char *)__FUNCTION__)) {
+ printf ("%s: Invalid device descriptor\n", __FUNCTION__);
+ } else {
+ switch (desc->family) {
+@@ -106,13 +111,16 @@ int altera_info( Altera_desc *desc )
+ {
+ int ret_val = FPGA_FAIL;
+
+- if (altera_validate (desc, __FUNCTION__)) {
++ if (altera_validate (desc, (char *)__FUNCTION__)) {
+ printf ("Family: \t");
+ switch (desc->family) {
+ case Altera_ACEX1K:
+ printf ("ACEX1K\n");
+ break;
+ /* Add new family types here */
++ case Altera_CYC2:
++ printf ("CYCLON II\n");
++ break;
+ default:
+ printf ("Unknown family type, %d\n", desc->family);
+ }
+@@ -147,8 +155,11 @@ int altera_info( Altera_desc *desc )
+ printf ("Device Function Table @ 0x%p\n", desc->iface_fns);
+ switch (desc->family) {
+ case Altera_ACEX1K:
++ case Altera_CYC2:
+ #if (CONFIG_FPGA & CFG_ACEX1K)
+ ACEX1K_info (desc);
++#elif (CONFIG_FPGA & CFG_CYCLON2)
++ CYC2_info (desc);
+ #else
+ /* just in case */
+ printf ("%s: No support for ACEX1K devices.\n",
+@@ -176,7 +187,7 @@ int altera_reloc( Altera_desc *desc, ulo
+ {
+ int ret_val = FPGA_FAIL; /* assume a failure */
+
+- if (!altera_validate (desc, __FUNCTION__)) {
++ if (!altera_validate (desc, (char *)__FUNCTION__)) {
+ printf ("%s: Invalid device descriptor\n", __FUNCTION__);
+ } else {
+ switch (desc->family) {
+@@ -188,6 +199,14 @@ int altera_reloc( Altera_desc *desc, ulo
+ __FUNCTION__);
+ #endif
+ break;
++ case Altera_CYC2:
++#if (CONFIG_FPGA & CFG_CYCLON2)
++ ret_val = CYC2_reloc (desc, reloc_offset);
++#else
++ printf ("%s: No support for CYCLON II devices.\n",
++ __FUNCTION__);
++#endif
++ break;
+ /* Add new family types here */
+ default:
+ printf ("%s: Unsupported family type, %d\n",
+diff -Naupr u-boot-1.1.6/common/cmd_bootm.c u-boot-1.1.6-fsl-1/common/cmd_bootm.c
+--- u-boot-1.1.6/common/cmd_bootm.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cmd_bootm.c 2006-11-30 12:34:13.000000000 -0600
+@@ -833,10 +833,6 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+ printf ("ERROR: flat device tree size does not agree with image\n");
+ return;
+ }
+-
+- } else if (getenv("disable_of") == NULL) {
+- printf ("ERROR: bootm needs flat device tree as third argument\n");
+- return;
+ }
+ #endif
+ if (!data) {
+@@ -913,23 +909,11 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+
+ SHOW_BOOT_PROGRESS (15);
+
+-#ifndef CONFIG_OF_FLAT_TREE
+-
+ #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
+ unlock_ram_in_cache();
+ #endif
+
+- /*
+- * Linux Kernel Parameters:
+- * r3: ptr to board info data
+- * r4: initrd_start or 0 if no initrd
+- * r5: initrd_end - unused if r4 is 0
+- * r6: Start of command line string
+- * r7: End of command line string
+- */
+- (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
+-
+-#else /* CONFIG_OF_FLAT_TREE */
++#ifdef CONFIG_OF_FLAT_TREE
+ /* move of_flat_tree if needed */
+ if (of_data) {
+ ulong of_start, of_len;
+@@ -948,30 +932,36 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl
+ of_start, of_start + of_len - 1);
+ memmove ((void *)of_start, (void *)of_data, of_len);
+ }
++#endif
+
+- ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
+- /* ft_dump_blob(of_flat_tree); */
+-
+-#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
+- unlock_ram_in_cache();
++ /*
++ * Linux Kernel Parameters (passing board info data):
++ * r3: ptr to board info data
++ * r4: initrd_start or 0 if no initrd
++ * r5: initrd_end - unused if r4 is 0
++ * r6: Start of command line string
++ * r7: End of command line string
++ */
++#ifdef CONFIG_OF_FLAT_TREE
++ 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
+ /*
+- * Linux Kernel Parameters:
++ * Linux Kernel Parameters (passing device tree):
+ * r3: ptr to OF flat tree, followed by the board info data
+ * r4: physical pointer to the kernel itself
+ * r5: NULL
+ * r6: NULL
+ * r7: NULL
+ */
+- if (getenv("disable_of") != NULL)
+- (*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end,
+- cmd_start, cmd_end);
+- else {
+- ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
+- /* ft_dump_blob(of_flat_tree); */
+- (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
+- }
+-#endif /* CONFIG_OF_FLAT_TREE */
++ ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
++ /* ft_dump_blob(of_flat_tree); */
++
++ (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
++#endif
+ }
+ #endif /* CONFIG_PPC */
+
+diff -Naupr u-boot-1.1.6/common/cmd_elf.c u-boot-1.1.6-fsl-1/common/cmd_elf.c
+--- u-boot-1.1.6/common/cmd_elf.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cmd_elf.c 2006-12-06 10:33:49.000000000 -0600
+@@ -79,7 +79,7 @@ int do_bootelf (cmd_tbl_t *cmdtp, int fl
+ * be either an ELF image or a raw binary. Will attempt to setup the
+ * bootline and other parameters correctly.
+ * ====================================================================== */
+-int do_bootvx ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
++int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ {
+ unsigned long addr; /* Address of image */
+ unsigned long bootaddr; /* Address to put the bootline */
+@@ -96,12 +96,10 @@ int do_bootvx ( cmd_tbl_t *cmdtp, int fl
+ * If we don't know where the image is then we're done.
+ */
+
+- if ((tmp = getenv ("loadaddr")) != NULL) {
+- addr = simple_strtoul (tmp, NULL, 16);
+- } else {
+- puts ("No load address provided\n");
+- return 1;
+- }
++ if (argc < 2)
++ addr = load_addr;
++ else
++ addr = simple_strtoul (argv[1], NULL, 16);
+
+ #if (CONFIG_COMMANDS & CFG_CMD_NET)
+ /* Check to see if we need to tftp the image ourselves before starting */
+diff -Naupr u-boot-1.1.6/common/cmd_fpga.c u-boot-1.1.6-fsl-1/common/cmd_fpga.c
+--- u-boot-1.1.6/common/cmd_fpga.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cmd_fpga.c 2006-11-30 12:34:13.000000000 -0600
+@@ -55,6 +55,7 @@ static int fpga_get_op (char *opstr);
+ #define FPGA_LOAD 1
+ #define FPGA_LOADB 2
+ #define FPGA_DUMP 3
++#define FPGA_LOADMK 4
+
+ /* Convert bitstream data and load into the fpga */
+ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
+@@ -251,6 +252,23 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag
+ rc = fpga_loadbitstream(dev, fpga_data, data_size);
+ break;
+
++ case FPGA_LOADMK:
++ {
++ image_header_t header;
++ image_header_t *hdr = &header;
++ ulong data;
++
++ memmove (&header, (char *)fpga_data, sizeof(image_header_t));
++ if (ntohl(hdr->ih_magic) != IH_MAGIC) {
++ puts ("Bad Magic Number\n");
++ return 1;
++ }
++ data = ((ulong)fpga_data + sizeof(image_header_t));
++ data_size = ntohl(hdr->ih_size);
++ rc = fpga_load (dev, (void *)data, data_size);
++ }
++ break;
++
+ case FPGA_DUMP:
+ rc = fpga_dump (dev, fpga_data, data_size);
+ break;
+@@ -282,6 +300,8 @@ static int fpga_get_op (char *opstr)
+ op = FPGA_LOADB;
+ } else if (!strcmp ("load", opstr)) {
+ op = FPGA_LOAD;
++ } else if (!strcmp ("loadmk", opstr)) {
++ op = FPGA_LOADMK;
+ } else if (!strcmp ("dump", opstr)) {
+ op = FPGA_DUMP;
+ }
+@@ -299,5 +319,6 @@ U_BOOT_CMD (fpga, 6, 1, do_fpga,
+ "\tinfo\tlist known device information\n"
+ "\tload\tLoad device from memory buffer\n"
+ "\tloadb\tLoad device from bitstream buffer (Xilinx devices only)\n"
++ "\tloadmk\tLoad device generated with mkimage\n"
+ "\tdump\tLoad device to memory buffer\n");
+ #endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */
+diff -Naupr u-boot-1.1.6/common/cmd_i2c.c u-boot-1.1.6-fsl-1/common/cmd_i2c.c
+--- u-boot-1.1.6/common/cmd_i2c.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cmd_i2c.c 2006-11-30 12:34:13.000000000 -0600
+@@ -101,8 +101,31 @@ static uchar i2c_mm_last_chip;
+ static uint i2c_mm_last_addr;
+ static uint i2c_mm_last_alen;
+
++/* If only one I2C bus is present, the list of devices to ignore when
++ * the probe command is issued is represented by a 1D array of addresses.
++ * When multiple buses are present, the list is an array of bus-address
++ * pairs. The following macros take care of this */
++
+ #if defined(CFG_I2C_NOPROBES)
++#if defined(CONFIG_I2C_MULTI_BUS)
++static struct
++{
++ uchar bus;
++ uchar addr;
++} i2c_no_probes[] = CFG_I2C_NOPROBES;
++#define GET_BUS_NUM i2c_get_bus_num()
++#define COMPARE_BUS(b,i) (i2c_no_probes[(i)].bus == (b))
++#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)].addr == (a))
++#define NO_PROBE_ADDR(i) i2c_no_probes[(i)].addr
++#else /* single bus */
+ static uchar i2c_no_probes[] = CFG_I2C_NOPROBES;
++#define GET_BUS_NUM 0
++#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */
++#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a))
++#define NO_PROBE_ADDR(i) i2c_no_probes[(i)]
++#endif /* CONFIG_MULTI_BUS */
++
++#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0]))
+ #endif
+
+ static int
+@@ -151,7 +174,7 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl
+ */
+ addr = simple_strtoul(argv[2], NULL, 16);
+ alen = 1;
+- for(j = 0; j < 8; j++) {
++ for (j = 0; j < 8; j++) {
+ if (argv[2][j] == '.') {
+ alen = argv[2][j+1] - '0';
+ if (alen > 4) {
+@@ -159,9 +182,8 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl
+ return 1;
+ }
+ break;
+- } else if (argv[2][j] == '\0') {
++ } else if (argv[2][j] == '\0')
+ break;
+- }
+ }
+
+ /*
+@@ -185,9 +207,9 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl
+
+ linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
+
+- if(i2c_read(chip, addr, alen, linebuf, linebytes) != 0) {
++ if (i2c_read(chip, addr, alen, linebuf, linebytes) != 0)
+ puts ("Error reading the chip.\n");
+- } else {
++ else {
+ printf("%04x:", addr);
+ cp = linebuf;
+ for (j=0; j<linebytes; j++) {
+@@ -256,17 +278,16 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl
+ */
+ addr = simple_strtoul(argv[2], NULL, 16);
+ alen = 1;
+- for(j = 0; j < 8; j++) {
++ for (j = 0; j < 8; j++) {
+ if (argv[2][j] == '.') {
+ alen = argv[2][j+1] - '0';
+- if(alen > 4) {
++ if (alen > 4) {
+ printf ("Usage:\n%s\n", cmdtp->usage);
+ return 1;
+ }
+ break;
+- } else if (argv[2][j] == '\0') {
++ } else if (argv[2][j] == '\0')
+ break;
+- }
+ }
+
+ /*
+@@ -277,16 +298,14 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl
+ /*
+ * Optional count
+ */
+- if(argc == 5) {
++ if (argc == 5)
+ count = simple_strtoul(argv[4], NULL, 16);
+- } else {
++ else
+ count = 1;
+- }
+
+ while (count-- > 0) {
+- if(i2c_write(chip, addr++, alen, &byte, 1) != 0) {
++ if (i2c_write(chip, addr++, alen, &byte, 1) != 0)
+ puts ("Error writing the chip.\n");
+- }
+ /*
+ * Wait for the write to complete. The write can take
+ * up to 10mSec (we allow a little more time).
+@@ -303,9 +322,9 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl
+ #endif
+
+ #if 0
+- for(timeout = 0; timeout < 10; timeout++) {
++ for (timeout = 0; timeout < 10; timeout++) {
+ udelay(2000);
+- if(i2c_probe(chip) == 0)
++ if (i2c_probe(chip) == 0)
+ break;
+ }
+ #endif
+@@ -346,17 +365,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int fl
+ */
+ addr = simple_strtoul(argv[2], NULL, 16);
+ alen = 1;
+- for(j = 0; j < 8; j++) {
++ for (j = 0; j < 8; j++) {
+ if (argv[2][j] == '.') {
+ alen = argv[2][j+1] - '0';
+- if(alen > 4) {
++ if (alen > 4) {
+ printf ("Usage:\n%s\n", cmdtp->usage);
+ return 1;
+ }
+ break;
+- } else if (argv[2][j] == '\0') {
++ } else if (argv[2][j] == '\0')
+ break;
+- }
+ }
+
+ /*
+@@ -371,19 +389,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int fl
+ */
+ crc = 0;
+ err = 0;
+- while(count-- > 0) {
+- if(i2c_read(chip, addr, alen, &byte, 1) != 0) {
++ while (count-- > 0) {
++ if (i2c_read(chip, addr, alen, &byte, 1) != 0)
+ err++;
+- }
+ crc = crc32 (crc, &byte, 1);
+ addr++;
+ }
+- if(err > 0)
+- {
++ if (err > 0)
+ puts ("Error reading the chip,\n");
+- } else {
++ else
+ printf ("%08lx\n", crc);
+- }
+
+ return 0;
+ }
+@@ -441,17 +456,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl
+ */
+ addr = simple_strtoul(argv[2], NULL, 16);
+ alen = 1;
+- for(j = 0; j < 8; j++) {
++ for (j = 0; j < 8; j++) {
+ if (argv[2][j] == '.') {
+ alen = argv[2][j+1] - '0';
+- if(alen > 4) {
++ if (alen > 4) {
+ printf ("Usage:\n%s\n", cmdtp->usage);
+ return 1;
+ }
+ break;
+- } else if (argv[2][j] == '\0') {
++ } else if (argv[2][j] == '\0')
+ break;
+- }
+ }
+ }
+
+@@ -461,17 +475,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl
+ */
+ do {
+ printf("%08lx:", addr);
+- if(i2c_read(chip, addr, alen, (uchar *)&data, size) != 0) {
++ if (i2c_read(chip, addr, alen, (uchar *)&data, size) != 0)
+ puts ("\nError reading the chip,\n");
+- } else {
++ else {
+ data = cpu_to_be32(data);
+- if(size == 1) {
++ if (size == 1)
+ printf(" %02lx", (data >> 24) & 0x000000FF);
+- } else if(size == 2) {
++ else if (size == 2)
+ printf(" %04lx", (data >> 16) & 0x0000FFFF);
+- } else {
++ else
+ printf(" %08lx", data);
+- }
+ }
+
+ nbytes = readline (" ? ");
+@@ -488,19 +501,17 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl
+ #endif
+ }
+ #ifdef CONFIG_BOOT_RETRY_TIME
+- else if (nbytes == -2) {
++ else if (nbytes == -2)
+ break; /* timed out, exit the command */
+- }
+ #endif
+ else {
+ char *endp;
+
+ data = simple_strtoul(console_buffer, &endp, 16);
+- if(size == 1) {
++ if (size == 1)
+ data = data << 24;
+- } else if(size == 2) {
++ else if (size == 2)
+ data = data << 16;
+- }
+ data = be32_to_cpu(data);
+ nbytes = endp - console_buffer;
+ if (nbytes) {
+@@ -510,9 +521,8 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl
+ */
+ reset_cmd_timeout();
+ #endif
+- if(i2c_write(chip, addr, alen, (uchar *)&data, size) != 0) {
++ if (i2c_write(chip, addr, alen, (uchar *)&data, size) != 0)
+ puts ("Error writing the chip.\n");
+- }
+ #ifdef CFG_EEPROM_PAGE_WRITE_DELAY_MS
+ udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
+ #endif
+@@ -538,14 +548,15 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int
+ int j;
+ #if defined(CFG_I2C_NOPROBES)
+ int k, skip;
+-#endif
++ uchar bus = GET_BUS_NUM;
++#endif /* NOPROBES */
+
+ puts ("Valid chip addresses:");
+- for(j = 0; j < 128; j++) {
++ for (j = 0; j < 128; j++) {
+ #if defined(CFG_I2C_NOPROBES)
+ skip = 0;
+- for (k = 0; k < sizeof(i2c_no_probes); k++){
+- if (j == i2c_no_probes[k]){
++ for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) {
++ if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) {
+ skip = 1;
+ break;
+ }
+@@ -553,16 +564,17 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int
+ if (skip)
+ continue;
+ #endif
+- if(i2c_probe(j) == 0) {
++ if (i2c_probe(j) == 0)
+ printf(" %02X", j);
+- }
+ }
+ putc ('\n');
+
+ #if defined(CFG_I2C_NOPROBES)
+ puts ("Excluded chip addresses:");
+- for( k = 0; k < sizeof(i2c_no_probes); k++ )
+- printf(" %02X", i2c_no_probes[k] );
++ for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) {
++ if (COMPARE_BUS(bus,k))
++ printf(" %02X", NO_PROBE_ADDR(k));
++ }
+ putc ('\n');
+ #endif
+
+@@ -601,7 +613,7 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl
+ */
+ addr = simple_strtoul(argv[2], NULL, 16);
+ alen = 1;
+- for(j = 0; j < 8; j++) {
++ for (j = 0; j < 8; j++) {
+ if (argv[2][j] == '.') {
+ alen = argv[2][j+1] - '0';
+ if (alen > 4) {
+@@ -609,9 +621,8 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl
+ return 1;
+ }
+ break;
+- } else if (argv[2][j] == '\0') {
++ } else if (argv[2][j] == '\0')
+ break;
+- }
+ }
+
+ /*
+@@ -619,24 +630,21 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl
+ */
+ length = 1;
+ length = simple_strtoul(argv[3], NULL, 16);
+- if(length > sizeof(bytes)) {
++ if (length > sizeof(bytes))
+ length = sizeof(bytes);
+- }
+
+ /*
+ * The delay time (uSec) is optional.
+ */
+ delay = 1000;
+- if (argc > 3) {
++ if (argc > 3)
+ delay = simple_strtoul(argv[4], NULL, 10);
+- }
+ /*
+ * Run the loop...
+ */
+- while(1) {
+- if(i2c_read(chip, addr, alen, bytes, length) != 0) {
++ while (1) {
++ if (i2c_read(chip, addr, alen, bytes, length) != 0)
+ puts ("Error reading the chip.\n");
+- }
+ udelay(delay);
+ }
+
+@@ -671,7 +679,7 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ */
+ chip = simple_strtoul(argv[1], NULL, 16);
+
+- if(i2c_read(chip, 0, 1, data, sizeof(data)) != 0) {
++ if (i2c_read(chip, 0, 1, data, sizeof(data)) != 0) {
+ puts ("No SDRAM Serial Presence Detect found.\n");
+ return 1;
+ }
+@@ -680,7 +688,7 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ for (j = 0; j < 63; j++) {
+ cksum += data[j];
+ }
+- if(cksum != data[63]) {
++ if (cksum != data[63]) {
+ printf ("WARNING: Configuration data checksum failure:\n"
+ " is 0x%02x, calculated 0x%02x\n",
+ data[63], cksum);
+@@ -696,17 +704,15 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ default: puts ("unknown\n"); break;
+ }
+ puts ("Row address bits ");
+- if((data[3] & 0x00F0) == 0) {
++ if ((data[3] & 0x00F0) == 0)
+ printf("%d\n", data[3] & 0x0F);
+- } else {
++ else
+ printf("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F);
+- }
+ puts ("Column address bits ");
+- if((data[4] & 0x00F0) == 0) {
++ if ((data[4] & 0x00F0) == 0)
+ printf("%d\n", data[4] & 0x0F);
+- } else {
++ else
+ printf("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F);
+- }
+ printf("Module rows %d\n", data[5]);
+ printf("Module data width %d bits\n", (data[7] << 8) | data[6]);
+ puts ("Interface signal levels ");
+@@ -729,11 +735,10 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ case 2: puts ("ECC\n"); break;
+ default: puts ("unknown\n"); break;
+ }
+- if((data[12] & 0x80) == 0) {
++ if ((data[12] & 0x80) == 0)
+ puts ("No self refresh, rate ");
+- } else {
++ else
+ puts ("Self refresh, rate ");
+- }
+ switch(data[12] & 0x7F) {
+ case 0: puts ("15.625uS\n"); break;
+ case 1: puts ("3.9uS\n"); break;
+@@ -744,17 +749,16 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ default: puts ("unknown\n"); break;
+ }
+ printf("SDRAM width (primary) %d\n", data[13] & 0x7F);
+- if((data[13] & 0x80) != 0) {
++ if ((data[13] & 0x80) != 0) {
+ printf(" (second bank) %d\n",
+ 2 * (data[13] & 0x7F));
+ }
+- if(data[14] != 0) {
++ if (data[14] != 0) {
+ printf("EDC width %d\n",
+ data[14] & 0x7F);
+- if((data[14] & 0x80) != 0) {
++ if ((data[14] & 0x80) != 0)
+ printf(" (second bank) %d\n",
+ 2 * (data[14] & 0x7F));
+- }
+ }
+ printf("Min clock delay, back-to-back random column addresses %d\n",
+ data[15]);
+@@ -852,18 +856,18 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ (data[35] & 0x80) ? '-' : '+',
+ (data[35] >> 4) & 0x07, data[35] & 0x0F);
+ puts ("Manufacturer's JEDEC ID ");
+- for(j = 64; j <= 71; j++)
++ for (j = 64; j <= 71; j++)
+ printf("%02X ", data[j]);
+ putc ('\n');
+ printf("Manufacturing Location %02X\n", data[72]);
+ puts ("Manufacturer's Part Number ");
+- for(j = 73; j <= 90; j++)
++ for (j = 73; j <= 90; j++)
+ printf("%02X ", data[j]);
+ putc ('\n');
+ printf("Revision Code %02X %02X\n", data[91], data[92]);
+ printf("Manufacturing Date %02X %02X\n", data[93], data[94]);
+ puts ("Assembly Serial Number ");
+- for(j = 95; j <= 98; j++)
++ for (j = 95; j <= 98; j++)
+ printf("%02X ", data[j]);
+ putc ('\n');
+ printf("Speed rating PC%d\n",
+@@ -873,6 +877,74 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl
+ }
+ #endif /* CFG_CMD_SDRAM */
+
++#if defined(CONFIG_I2C_CMD_TREE)
++#if defined(CONFIG_I2C_MULTI_BUS)
++int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
++{
++ int bus_idx, ret=0;
++
++ if (argc == 1)
++ /* querying current setting */
++ printf("Current bus is %d\n", i2c_get_bus_num());
++ else {
++ bus_idx = simple_strtoul(argv[1], NULL, 10);
++ printf("Setting bus to %d\n", bus_idx);
++ ret = i2c_set_bus_num(bus_idx);
++ if (ret)
++ printf("Failure changing bus number (%d)\n", ret);
++ }
++ return ret;
++}
++#endif /* CONFIG_I2C_MULTI_BUS */
++
++int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
++{
++ int speed, ret=0;
++
++ if (argc == 1)
++ /* querying current speed */
++ printf("Current bus speed=%d\n", i2c_get_bus_speed());
++ else {
++ speed = simple_strtoul(argv[1], NULL, 10);
++ printf("Setting bus speed to %d Hz\n", speed);
++ ret = i2c_set_bus_speed(speed);
++ if (ret)
++ printf("Failure changing bus speed (%d)\n", ret);
++ }
++ return ret;
++}
++
++int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
++{
++#if defined(CONFIG_I2C_MULTI_BUS)
++ if (!strncmp(argv[1], "de", 2))
++ return do_i2c_bus_num(cmdtp, flag, --argc, ++argv);
++#endif /* CONFIG_I2C_MULTI_BUS */
++ if (!strncmp(argv[1], "sp", 2))
++ return do_i2c_bus_speed(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "md", 2))
++ return do_i2c_md(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "mm", 2))
++ return do_i2c_mm(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "mw", 2))
++ return do_i2c_mw(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "nm", 2))
++ return do_i2c_nm(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "cr", 2))
++ return do_i2c_crc(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "pr", 2))
++ return do_i2c_probe(cmdtp, flag, --argc, ++argv);
++ if (!strncmp(argv[1], "lo", 2))
++ return do_i2c_loop(cmdtp, flag, --argc, ++argv);
++#if (CONFIG_COMMANDS & CFG_CMD_SDRAM)
++ if (!strncmp(argv[1], "sd", 2))
++ return do_sdram(cmdtp, flag, --argc, ++argv);
++#endif /* CFG_CMD_SDRAM */
++ else
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 0;
++}
++#endif /* CONFIG_I2C_CMD_TREE */
+
+ /***************************************************/
+
+@@ -930,4 +1002,26 @@ U_BOOT_CMD(
+ " (valid chip values 50..57)\n"
+ );
+ #endif
++
++#if defined(CONFIG_I2C_CMD_TREE)
++U_BOOT_CMD(
++ i2c, 6, 1, do_i2c,
++ "i2c - I2C sub-system\n",
++#if defined(CONFIG_I2C_MULTI_BUS)
++ "dev [dev] - show or set current I2C bus\n"
++#endif /* CONFIG_I2C_MULTI_BUS */
++ "i2c speed [speed] - show or set I2C bus speed\n"
++ "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
++ "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
++ "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
++ "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
++ "i2c crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
++ "i2c probe - show devices on the I2C bus\n"
++ "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n"
++#if (CONFIG_COMMANDS & CFG_CMD_SDRAM)
++ "i2c sdram chip - print SDRAM configuration information\n"
++#endif /* CFG_CMD_SDRAM */
++);
++#endif /* CONFIG_I2C_CMD_TREE */
++
+ #endif /* CFG_CMD_I2C */
+diff -Naupr u-boot-1.1.6/common/cmd_nand.c u-boot-1.1.6-fsl-1/common/cmd_nand.c
+--- u-boot-1.1.6/common/cmd_nand.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cmd_nand.c 2006-12-06 10:33:49.000000000 -0600
+@@ -684,178 +684,182 @@ extern int nand_write_oob(struct nand_ch
+ size_t len, size_t *retlen, const u_char *buf);
+
+
+-int do_nand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
++int do_nand (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+ {
+- int rcode = 0;
++ int rcode = 0;
+
+- switch (argc) {
+- case 0:
+- case 1:
+- printf ("Usage:\n%s\n", cmdtp->usage);
+- return 1;
+- case 2:
+- if (strcmp(argv[1],"info") == 0) {
+- int i;
+-
+- putc ('\n');
+-
+- for (i=0; i<CFG_MAX_NAND_DEVICE; ++i) {
+- if(nand_dev_desc[i].ChipID == NAND_ChipID_UNKNOWN)
+- continue; /* list only known devices */
+- printf ("Device %d: ", i);
+- nand_print(&nand_dev_desc[i]);
+- }
+- return 0;
++ switch (argc) {
++ case 0:
++ case 1:
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 1;
++ case 2:
++ if (strcmp (argv[1], "info") == 0) {
++ int i;
+
+- } else if (strcmp(argv[1],"device") == 0) {
+- if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) {
+- puts ("\nno devices available\n");
+- return 1;
+- }
+- printf ("\nDevice %d: ", curr_device);
+- nand_print(&nand_dev_desc[curr_device]);
+- return 0;
+-
+- } else if (strcmp(argv[1],"bad") == 0) {
+- if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) {
+- puts ("\nno devices available\n");
+- return 1;
+- }
+- printf ("\nDevice %d bad blocks:\n", curr_device);
+- nand_print_bad(&nand_dev_desc[curr_device]);
+- return 0;
++ putc ('\n');
+
+- }
+- printf ("Usage:\n%s\n", cmdtp->usage);
+- return 1;
+- case 3:
+- if (strcmp(argv[1],"device") == 0) {
+- int dev = (int)simple_strtoul(argv[2], NULL, 10);
+-
+- printf ("\nDevice %d: ", dev);
+- if (dev >= CFG_MAX_NAND_DEVICE) {
+- puts ("unknown device\n");
+- return 1;
+- }
+- nand_print(&nand_dev_desc[dev]);
+- /*nand_print (dev);*/
++ for (i = 0; i < CFG_MAX_NAND_DEVICE; ++i) {
++ if (nand_dev_desc[i].ChipID ==
++ NAND_ChipID_UNKNOWN)
++ continue; /* list only known devices */
++ printf ("Device %d: ", i);
++ nand_print (&nand_dev_desc[i]);
++ }
++ return 0;
++
++ } else if (strcmp (argv[1], "device") == 0) {
++ if ((curr_device < 0)
++ || (curr_device >= CFG_MAX_NAND_DEVICE)) {
++ puts ("\nno devices available\n");
++ return 1;
++ }
++ printf ("\nDevice %d: ", curr_device);
++ nand_print (&nand_dev_desc[curr_device]);
++ return 0;
++
++ } else if (strcmp (argv[1], "bad") == 0) {
++ if ((curr_device < 0)
++ || (curr_device >= CFG_MAX_NAND_DEVICE)) {
++ puts ("\nno devices available\n");
++ return 1;
++ }
++ printf ("\nDevice %d bad blocks:\n", curr_device);
++ nand_print_bad (&nand_dev_desc[curr_device]);
++ return 0;
+
+- if (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN) {
+- return 1;
+ }
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 1;
++ case 3:
++ if (strcmp (argv[1], "device") == 0) {
++ int dev = (int) simple_strtoul (argv[2], NULL, 10);
+
+- curr_device = dev;
++ printf ("\nDevice %d: ", dev);
++ if (dev >= CFG_MAX_NAND_DEVICE) {
++ puts ("unknown device\n");
++ return 1;
++ }
++ nand_print (&nand_dev_desc[dev]);
++ /*nand_print (dev); */
+
+- puts ("... is now current device\n");
++ if (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN) {
++ return 1;
++ }
+
+- return 0;
+- }
+- else if (strcmp(argv[1],"erase") == 0 && strcmp(argv[2], "clean") == 0) {
+- struct nand_chip* nand = &nand_dev_desc[curr_device];
+- ulong off = 0;
+- ulong size = nand->totlen;
+- int ret;
++ curr_device = dev;
+
+- printf ("\nNAND erase: device %d offset %ld, size %ld ... ",
+- curr_device, off, size);
++ puts ("... is now current device\n");
+
+- ret = nand_legacy_erase (nand, off, size, 1);
++ return 0;
++ } else if (strcmp (argv[1], "erase") == 0
++ && strcmp (argv[2], "clean") == 0) {
++ struct nand_chip *nand = &nand_dev_desc[curr_device];
++ ulong off = 0;
++ ulong size = nand->totlen;
++ int ret;
+
+- printf("%s\n", ret ? "ERROR" : "OK");
++ printf ("\nNAND erase: device %d offset %ld, size %ld ... ", curr_device, off, size);
+
+- return ret;
+- }
++ ret = nand_legacy_erase (nand, off, size, 1);
+
+- printf ("Usage:\n%s\n", cmdtp->usage);
+- return 1;
+- default:
+- /* at least 4 args */
+-
+- if (strncmp(argv[1], "read", 4) == 0 ||
+- strncmp(argv[1], "write", 5) == 0) {
+- ulong addr = simple_strtoul(argv[2], NULL, 16);
+- ulong off = simple_strtoul(argv[3], NULL, 16);
+- ulong size = simple_strtoul(argv[4], NULL, 16);
+- int cmd = (strncmp(argv[1], "read", 4) == 0) ?
+- NANDRW_READ : NANDRW_WRITE;
+- int ret, total;
+- char* cmdtail = strchr(argv[1], '.');
++ printf ("%s\n", ret ? "ERROR" : "OK");
+
+- if (cmdtail && !strncmp(cmdtail, ".oob", 2)) {
+- /* read out-of-band data */
+- if (cmd & NANDRW_READ) {
+- ret = nand_read_oob(nand_dev_desc + curr_device,
+- off, size, (size_t *)&total,
+- (u_char*)addr);
+- }
+- else {
+- ret = nand_write_oob(nand_dev_desc + curr_device,
+- off, size, (size_t *)&total,
+- (u_char*)addr);
+- }
+ return ret;
+ }
+- else if (cmdtail && !strncmp(cmdtail, ".jffs2", 2))
+- cmd |= NANDRW_JFFS2; /* skip bad blocks */
+- else if (cmdtail && !strncmp(cmdtail, ".jffs2s", 2)) {
+- cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
+- if (cmd & NANDRW_READ)
+- cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
+- }
++
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 1;
++ default:
++ /* at least 4 args */
++
++ if (strncmp (argv[1], "read", 4) == 0 ||
++ strncmp (argv[1], "write", 5) == 0) {
++ ulong addr = simple_strtoul (argv[2], NULL, 16);
++ ulong off = simple_strtoul (argv[3], NULL, 16);
++ ulong size = simple_strtoul (argv[4], NULL, 16);
++ int cmd = (strncmp (argv[1], "read", 4) == 0) ?
++ NANDRW_READ : NANDRW_WRITE;
++ int ret, total;
++ char *cmdtail = strchr (argv[1], '.');
++
++ if (cmdtail && !strncmp (cmdtail, ".oob", 2)) {
++ /* read out-of-band data */
++ if (cmd & NANDRW_READ) {
++ ret = nand_read_oob (nand_dev_desc + curr_device,
++ off, size, (size_t *) & total,
++ (u_char *) addr);
++ } else {
++ ret = nand_write_oob (nand_dev_desc + curr_device,
++ off, size, (size_t *) & total,
++ (u_char *) addr);
++ }
++ return ret;
++ } else if (cmdtail && !strncmp (cmdtail, ".jffs2", 2))
++ cmd |= NANDRW_JFFS2; /* skip bad blocks */
++ else if (cmdtail && !strncmp (cmdtail, ".jffs2s", 2)) {
++ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
++ if (cmd & NANDRW_READ)
++ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
++ }
+ #ifdef SXNI855T
+- /* need ".e" same as ".j" for compatibility with older units */
+- else if (cmdtail && !strcmp(cmdtail, ".e"))
+- cmd |= NANDRW_JFFS2; /* skip bad blocks */
++ /* need ".e" same as ".j" for compatibility with older units */
++ else if (cmdtail && !strcmp (cmdtail, ".e"))
++ cmd |= NANDRW_JFFS2; /* skip bad blocks */
+ #endif
+ #ifdef CFG_NAND_SKIP_BAD_DOT_I
+- /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */
+- /* ".i" for image -> read skips bad block (no 0xff) */
+- else if (cmdtail && !strcmp(cmdtail, ".i")) {
+- cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
+- if (cmd & NANDRW_READ)
+- cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
+- }
++ /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */
++ /* ".i" for image -> read skips bad block (no 0xff) */
++ else if (cmdtail && !strcmp (cmdtail, ".i")) {
++ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
++ if (cmd & NANDRW_READ)
++ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
++ }
+ #endif /* CFG_NAND_SKIP_BAD_DOT_I */
+- else if (cmdtail) {
+- printf ("Usage:\n%s\n", cmdtp->usage);
+- return 1;
+- }
++ else if (cmdtail) {
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ return 1;
++ }
+
+- printf ("\nNAND %s: device %d offset %ld, size %ld ...\n",
+- (cmd & NANDRW_READ) ? "read" : "write",
+- curr_device, off, size);
+-
+- ret = nand_legacy_rw(nand_dev_desc + curr_device, cmd, off, size,
+- (size_t *)&total, (u_char*)addr);
+-
+- printf (" %d bytes %s: %s\n", total,
+- (cmd & NANDRW_READ) ? "read" : "written",
+- ret ? "ERROR" : "OK");
+-
+- return ret;
+- } else if (strcmp(argv[1],"erase") == 0 &&
+- (argc == 4 || strcmp("clean", argv[2]) == 0)) {
+- int clean = argc == 5;
+- ulong off = simple_strtoul(argv[2 + clean], NULL, 16);
+- ulong size = simple_strtoul(argv[3 + clean], NULL, 16);
+- int ret;
+-
+- printf ("\nNAND erase: device %d offset %ld, size %ld ...\n",
+- curr_device, off, size);
++ printf ("\nNAND %s: device %d offset %ld, size %ld ...\n",
++ (cmd & NANDRW_READ) ? "read" : "write",
++ curr_device, off, size);
++
++ ret = nand_legacy_rw (nand_dev_desc + curr_device,
++ cmd, off, size,
++ (size_t *) & total,
++ (u_char *) addr);
++
++ printf (" %d bytes %s: %s\n", total,
++ (cmd & NANDRW_READ) ? "read" : "written",
++ ret ? "ERROR" : "OK");
+
+- ret = nand_legacy_erase (nand_dev_desc + curr_device,
+- off, size, clean);
++ return ret;
++ } else if (strcmp (argv[1], "erase") == 0 &&
++ (argc == 4 || strcmp ("clean", argv[2]) == 0)) {
++ int clean = argc == 5;
++ ulong off =
++ simple_strtoul (argv[2 + clean], NULL, 16);
++ ulong size =
++ simple_strtoul (argv[3 + clean], NULL, 16);
++ int ret;
+
+- printf("%s\n", ret ? "ERROR" : "OK");
++ printf ("\nNAND erase: device %d offset %ld, size %ld ...\n",
++ curr_device, off, size);
+
+- return ret;
+- } else {
+- printf ("Usage:\n%s\n", cmdtp->usage);
+- rcode = 1;
+- }
++ ret = nand_legacy_erase (nand_dev_desc + curr_device,
++ off, size, clean);
+
+- return rcode;
+- }
++ printf ("%s\n", ret ? "ERROR" : "OK");
++
++ return ret;
++ } else {
++ printf ("Usage:\n%s\n", cmdtp->usage);
++ rcode = 1;
++ }
++
++ return rcode;
++ }
+ }
+
+ U_BOOT_CMD(
+diff -Naupr u-boot-1.1.6/common/cyclon2.c u-boot-1.1.6-fsl-1/common/cyclon2.c
+--- u-boot-1.1.6/common/cyclon2.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/cyclon2.c 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,305 @@
++/*
++ * (C) Copyright 2006
++ * Heiko Schocher, hs@denx.de
++ * Based on ACE1XK.c
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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> /* core U-Boot definitions */
++#include <altera.h>
++#include <ACEX1K.h> /* ACEX device family */
++
++#if (CONFIG_FPGA & (CFG_ALTERA | CFG_CYCLON2))
++
++/* Define FPGA_DEBUG to get debug printf's */
++#ifdef FPGA_DEBUG
++#define PRINTF(fmt,args...) printf (fmt ,##args)
++#else
++#define PRINTF(fmt,args...)
++#endif
++
++/* Note: The assumption is that we cannot possibly run fast enough to
++ * overrun the device (the Slave Parallel mode can free run at 50MHz).
++ * If there is a need to operate slower, define CONFIG_FPGA_DELAY in
++ * the board config file to slow things down.
++ */
++#ifndef CONFIG_FPGA_DELAY
++#define CONFIG_FPGA_DELAY()
++#endif
++
++#ifndef CFG_FPGA_WAIT
++#define CFG_FPGA_WAIT CFG_HZ/10 /* 100 ms */
++#endif
++
++static int CYC2_ps_load( Altera_desc *desc, void *buf, size_t bsize );
++static int CYC2_ps_dump( Altera_desc *desc, void *buf, size_t bsize );
++/* static int CYC2_ps_info( Altera_desc *desc ); */
++static int CYC2_ps_reloc( Altera_desc *desc, ulong reloc_offset );
++
++/* ------------------------------------------------------------------------- */
++/* CYCLON2 Generic Implementation */
++int CYC2_load (Altera_desc * desc, void *buf, size_t bsize)
++{
++ int ret_val = FPGA_FAIL;
++
++ switch (desc->iface) {
++ case passive_serial:
++ PRINTF ("%s: Launching Passive Serial Loader\n", __FUNCTION__);
++ ret_val = CYC2_ps_load (desc, buf, bsize);
++ break;
++
++ /* Add new interface types here */
++
++ default:
++ printf ("%s: Unsupported interface type, %d\n",
++ __FUNCTION__, desc->iface);
++ }
++
++ return ret_val;
++}
++
++int CYC2_dump (Altera_desc * desc, void *buf, size_t bsize)
++{
++ int ret_val = FPGA_FAIL;
++
++ switch (desc->iface) {
++ case passive_serial:
++ PRINTF ("%s: Launching Passive Serial Dump\n", __FUNCTION__);
++ ret_val = CYC2_ps_dump (desc, buf, bsize);
++ break;
++
++ /* Add new interface types here */
++
++ default:
++ printf ("%s: Unsupported interface type, %d\n",
++ __FUNCTION__, desc->iface);
++ }
++
++ return ret_val;
++}
++
++int CYC2_info( Altera_desc *desc )
++{
++ return FPGA_SUCCESS;
++}
++
++int CYC2_reloc (Altera_desc * desc, ulong reloc_offset)
++{
++ int ret_val = FPGA_FAIL; /* assume a failure */
++
++ if (desc->family != Altera_CYC2) {
++ printf ("%s: Unsupported family type, %d\n",
++ __FUNCTION__, desc->family);
++ return FPGA_FAIL;
++ } else
++ switch (desc->iface) {
++ case passive_serial:
++ ret_val = CYC2_ps_reloc (desc, reloc_offset);
++ break;
++
++ /* Add new interface types here */
++
++ default:
++ printf ("%s: Unsupported interface type, %d\n",
++ __FUNCTION__, desc->iface);
++ }
++
++ return ret_val;
++}
++
++/* ------------------------------------------------------------------------- */
++/* CYCLON2 Passive Serial Generic Implementation */
++static int CYC2_ps_load (Altera_desc * desc, void *buf, size_t bsize)
++{
++ int ret_val = FPGA_FAIL; /* assume the worst */
++ Altera_CYC2_Passive_Serial_fns *fn = desc->iface_fns;
++ int ret = 0;
++
++ PRINTF ("%s: start with interface functions @ 0x%p\n",
++ __FUNCTION__, fn);
++
++ if (fn) {
++ int cookie = desc->cookie; /* make a local copy */
++ unsigned long ts; /* timestamp */
++
++ PRINTF ("%s: Function Table:\n"
++ "ptr:\t0x%p\n"
++ "struct: 0x%p\n"
++ "config:\t0x%p\n"
++ "status:\t0x%p\n"
++ "write:\t0x%p\n"
++ "done:\t0x%p\n\n",
++ __FUNCTION__, &fn, fn, fn->config, fn->status,
++ fn->write, fn->done);
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ printf ("Loading FPGA Device %d...", cookie);
++#endif
++
++ /*
++ * Run the pre configuration function if there is one.
++ */
++ if (*fn->pre) {
++ (*fn->pre) (cookie);
++ }
++
++ /* Establish the initial state */
++ (*fn->config) (TRUE, TRUE, cookie); /* Assert nCONFIG */
++
++ udelay(2); /* T_cfg > 2us */
++
++ /* Wait for nSTATUS to be asserted */
++ ts = get_timer (0); /* get current time */
++ do {
++ CONFIG_FPGA_DELAY ();
++ if (get_timer (ts) > CFG_FPGA_WAIT) { /* check the time */
++ puts ("** Timeout waiting for STATUS to go high.\n");
++ (*fn->abort) (cookie);
++ return FPGA_FAIL;
++ }
++ } while (!(*fn->status) (cookie));
++
++ /* Get ready for the burn */
++ CONFIG_FPGA_DELAY ();
++
++ ret = (*fn->write) (buf, bsize, TRUE, cookie);
++ if (ret) {
++ puts ("** Write failed.\n");
++ (*fn->abort) (cookie);
++ return FPGA_FAIL;
++ }
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ puts(" OK? ...");
++#endif
++
++ CONFIG_FPGA_DELAY ();
++
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ putc (' '); /* terminate the dotted line */
++#endif
++
++ /*
++ * Checking FPGA's CONF_DONE signal - correctly booted ?
++ */
++
++ if ( ! (*fn->done) (cookie) ) {
++ puts ("** Booting failed! CONF_DONE is still deasserted.\n");
++ (*fn->abort) (cookie);
++ return (FPGA_FAIL);
++ }
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ puts(" OK\n");
++#endif
++
++ ret_val = FPGA_SUCCESS;
++
++#ifdef CFG_FPGA_PROG_FEEDBACK
++ if (ret_val == FPGA_SUCCESS) {
++ puts ("Done.\n");
++ }
++ else {
++ puts ("Fail.\n");
++ }
++#endif
++ (*fn->post) (cookie);
++
++ } else {
++ printf ("%s: NULL Interface function table!\n", __FUNCTION__);
++ }
++
++ return ret_val;
++}
++
++static int CYC2_ps_dump (Altera_desc * desc, void *buf, size_t bsize)
++{
++ /* Readback is only available through the Slave Parallel and */
++ /* boundary-scan interfaces. */
++ printf ("%s: Passive Serial Dumping is unavailable\n",
++ __FUNCTION__);
++ return FPGA_FAIL;
++}
++
++static int CYC2_ps_reloc (Altera_desc * desc, ulong reloc_offset)
++{
++ int ret_val = FPGA_FAIL; /* assume the worst */
++ Altera_CYC2_Passive_Serial_fns *fn_r, *fn =
++ (Altera_CYC2_Passive_Serial_fns *) (desc->iface_fns);
++
++ if (fn) {
++ ulong addr;
++
++ /* Get the relocated table address */
++ addr = (ulong) fn + reloc_offset;
++ fn_r = (Altera_CYC2_Passive_Serial_fns *) addr;
++
++ if (!fn_r->relocated) {
++
++ if (memcmp (fn_r, fn,
++ sizeof (Altera_CYC2_Passive_Serial_fns))
++ == 0) {
++ /* good copy of the table, fix the descriptor pointer */
++ desc->iface_fns = fn_r;
++ } else {
++ PRINTF ("%s: Invalid function table at 0x%p\n",
++ __FUNCTION__, fn_r);
++ return FPGA_FAIL;
++ }
++
++ PRINTF ("%s: Relocating descriptor at 0x%p\n", __FUNCTION__,
++ desc);
++
++ addr = (ulong) (fn->pre) + reloc_offset;
++ fn_r->pre = (Altera_pre_fn) addr;
++
++ addr = (ulong) (fn->config) + reloc_offset;
++ fn_r->config = (Altera_config_fn) addr;
++
++ addr = (ulong) (fn->status) + reloc_offset;
++ fn_r->status = (Altera_status_fn) addr;
++
++ addr = (ulong) (fn->done) + reloc_offset;
++ fn_r->done = (Altera_done_fn) addr;
++
++ addr = (ulong) (fn->write) + reloc_offset;
++ fn_r->write = (Altera_write_fn) addr;
++
++ addr = (ulong) (fn->abort) + reloc_offset;
++ fn_r->abort = (Altera_abort_fn) addr;
++
++ addr = (ulong) (fn->post) + reloc_offset;
++ fn_r->post = (Altera_post_fn) addr;
++
++ fn_r->relocated = TRUE;
++
++ } else {
++ /* this table has already been moved */
++ /* XXX - should check to see if the descriptor is correct */
++ desc->iface_fns = fn_r;
++ }
++
++ ret_val = FPGA_SUCCESS;
++ } else {
++ printf ("%s: NULL Interface function table!\n", __FUNCTION__);
++ }
++
++ return ret_val;
++}
++
++#endif /* (CONFIG_FPGA & (CFG_ALTERA | CFG_CYCLON2)) */
+diff -Naupr u-boot-1.1.6/common/fpga.c u-boot-1.1.6-fsl-1/common/fpga.c
+--- u-boot-1.1.6/common/fpga.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/fpga.c 2006-11-30 12:34:13.000000000 -0600
+@@ -139,7 +139,7 @@ static int fpga_dev_info( int devnum )
+ printf( "Xilinx Device\nDescriptor @ 0x%p\n", desc );
+ ret_val = xilinx_info( desc->devdesc );
+ #else
+- fpga_no_sup( __FUNCTION__, "Xilinx devices" );
++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+ #endif
+ break;
+ case fpga_altera:
+@@ -178,7 +178,7 @@ int fpga_reloc( fpga_type devtype, void
+ #if CONFIG_FPGA & CFG_FPGA_XILINX
+ ret_val = xilinx_reloc( desc, reloc_off );
+ #else
+- fpga_no_sup( __FUNCTION__, "Xilinx devices" );
++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+ #endif
+ break;
+ case fpga_altera:
+@@ -271,7 +271,7 @@ int fpga_load( int devnum, void *buf, si
+ #if CONFIG_FPGA & CFG_FPGA_XILINX
+ ret_val = xilinx_load( desc->devdesc, buf, bsize );
+ #else
+- fpga_no_sup( __FUNCTION__, "Xilinx devices" );
++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+ #endif
+ break;
+ case fpga_altera:
+@@ -304,7 +304,7 @@ int fpga_dump( int devnum, void *buf, si
+ #if CONFIG_FPGA & CFG_FPGA_XILINX
+ ret_val = xilinx_dump( desc->devdesc, buf, bsize );
+ #else
+- fpga_no_sup( __FUNCTION__, "Xilinx devices" );
++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" );
+ #endif
+ break;
+ case fpga_altera:
+diff -Naupr u-boot-1.1.6/common/Makefile u-boot-1.1.6-fsl-1/common/Makefile
+--- u-boot-1.1.6/common/Makefile 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/Makefile 2006-11-30 12:34:13.000000000 -0600
+@@ -41,7 +41,7 @@ COBJS = main.o ACEX1K.o altera.o bedbug.
+ cmd_pci.o cmd_pcmcia.o cmd_portio.o \
+ cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o \
+ cmd_usb.o cmd_vfd.o \
+- command.o console.o devices.o dlmalloc.o docecc.o \
++ command.o console.o cyclon2.o devices.o dlmalloc.o docecc.o \
+ environment.o env_common.o \
+ env_nand.o env_dataflash.o env_flash.o env_eeprom.o \
+ env_nvram.o env_nowhere.o \
+diff -Naupr u-boot-1.1.6/common/memsize.c u-boot-1.1.6-fsl-1/common/memsize.c
+--- u-boot-1.1.6/common/memsize.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/common/memsize.c 2006-11-30 12:34:13.000000000 -0600
+@@ -21,6 +21,16 @@
+ * MA 02111-1307 USA
+ */
+
++#include <config.h>
++#ifdef __PPC__
++/*
++ * At least on G2 PowerPC cores, sequential accesses to non-existent
++ * memory must be synchronized.
++ */
++# include <asm/io.h> /* for sync() */
++#else
++# define sync() /* nothing */
++#endif
+
+ /*
+ * Check memory range for valid RAM. A simple memory test determines
+@@ -38,20 +48,27 @@ long get_ram_size(volatile long *base, l
+
+ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ addr = base + cnt; /* pointer arith! */
++ sync ();
+ save[i++] = *addr;
++ sync ();
+ *addr = ~cnt;
+ }
+
+ addr = base;
++ sync ();
+ save[i] = *addr;
++ sync ();
+ *addr = 0;
+
++ sync ();
+ if ((val = *addr) != 0) {
+ /* Restore the original data before leaving the function.
+ */
++ sync ();
+ *addr = save[i];
+ for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ addr = base + cnt;
++ sync ();
+ *addr = save[--i];
+ }
+ return (0);
+diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/cpu.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu.c
+--- u-boot-1.1.6/cpu/74xx_7xx/cpu.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu.c 2006-12-06 10:33:49.000000000 -0600
+@@ -101,6 +101,10 @@ get_cpu_type(void)
+ type = CPU_7457;
+ break;
+
++ case 0x8004:
++ type = CPU_7448;
++ break;
++
+ default:
+ break;
+ }
+@@ -152,6 +156,10 @@ int checkcpu (void)
+ str = "MPC7410";
+ break;
+
++ case CPU_7448:
++ str = "MPC7448";
++ break;
++
+ case CPU_7450:
+ str = "MPC7450";
+ break;
+@@ -221,7 +229,7 @@ soft_restart(unsigned long addr)
+ void
+ do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ {
+- ulong addr;
++ ulong addr;
+ /* flush and disable I/D cache */
+ __asm__ __volatile__ ("mfspr 3, 1008" ::: "r3");
+ __asm__ __volatile__ ("ori 5, 5, 0xcc00" ::: "r5");
+diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu_init.c
+--- u-boot-1.1.6/cpu/74xx_7xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu_init.c 2006-12-06 10:33:49.000000000 -0600
+@@ -43,6 +43,7 @@ cpu_init_f (void)
+ case CPU_7450:
+ case CPU_7455:
+ case CPU_7457:
++ case CPU_7448:
+ /* enable the timebase bit in HID0 */
+ set_hid0(get_hid0() | 0x4000000);
+ break;
+diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/speed.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/speed.c
+--- u-boot-1.1.6/cpu/74xx_7xx/speed.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/speed.c 2006-12-06 10:33:49.000000000 -0600
+@@ -91,6 +91,7 @@ int get_clocks (void)
+
+ /* calculate the clock frequency based upon the CPU type */
+ switch (get_cpu_type()) {
++ case CPU_7448:
+ case CPU_7455:
+ case CPU_7457:
+ /*
+diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/start.S u-boot-1.1.6-fsl-1/cpu/74xx_7xx/start.S
+--- u-boot-1.1.6/cpu/74xx_7xx/start.S 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/start.S 2006-12-06 10:33:49.000000000 -0600
+@@ -44,7 +44,8 @@
+
+ #if !defined(CONFIG_DB64360) && \
+ !defined(CONFIG_DB64460) && \
+- !defined(CONFIG_CPCI750)
++ !defined(CONFIG_CPCI750) && \
++ !defined(CONFIG_P3Mx)
+ #include <galileo/gt64260R.h>
+ #endif
+
+@@ -270,7 +271,7 @@ in_flash:
+ * gt-regs BAT can be reused after board_init_f calls
+ * board_early_init_f (EVB only).
+ */
+-#if !defined(CONFIG_BAB7xx) && !defined(CONFIG_ELPPC)
++#if !defined(CONFIG_BAB7xx) && !defined(CONFIG_ELPPC) && !defined(CONFIG_P3Mx)
+ /* enable address translation */
+ bl enable_addr_trans
+ sync
+@@ -757,7 +758,8 @@ in_ram:
+ defined(CONFIG_DB64360) || \
+ defined(CONFIG_DB64460) || \
+ defined(CONFIG_CPCI750) || \
+- defined(CONFIG_PPMC7XX)
++ defined(CONFIG_PPMC7XX) || \
++ defined(CONFIG_P3Mx)
+ mr r4, r9 /* Use RAM copy of the global data */
+ #endif
+ bl after_reloc
+diff -Naupr u-boot-1.1.6/cpu/mpc5xxx/cpu.c u-boot-1.1.6-fsl-1/cpu/mpc5xxx/cpu.c
+--- u-boot-1.1.6/cpu/mpc5xxx/cpu.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc5xxx/cpu.c 2006-12-06 10:33:49.000000000 -0600
+@@ -31,6 +31,10 @@
+ #include <mpc5xxx.h>
+ #include <asm/processor.h>
+
++#if defined(CONFIG_OF_FLAT_TREE)
++#include <ft_build.h>
++#endif
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int checkcpu (void)
+@@ -102,3 +106,26 @@ unsigned long get_tbclk (void)
+ }
+
+ /* ------------------------------------------------------------------------- */
++
++#ifdef CONFIG_OF_FLAT_TREE
++void
++ft_cpu_setup(void *blob, bd_t *bd)
++{
++ u32 *p;
++ int len;
++
++ /* Core XLB bus frequency */
++ p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len);
++ if (p != NULL)
++ *p = cpu_to_be32(bd->bi_busfreq);
++
++ /* SOC peripherals use the IPB bus frequency */
++ p = ft_get_prop(blob, "/" OF_SOC "/bus-frequency", &len);
++ if (p != NULL)
++ *p = cpu_to_be32(bd->bi_ipbfreq);
++
++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/mac-address", &len);
++ if (p != NULL)
++ memcpy(p, bd->bi_enetaddr, 6);
++}
++#endif
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/cpu.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu.c
+--- u-boot-1.1.6/cpu/mpc83xx/cpu.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu.c 2006-11-30 12:34:13.000000000 -0600
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2004 Freescale Semiconductor, Inc.
++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -18,11 +18,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ /*
+@@ -43,35 +38,140 @@ DECLARE_GLOBAL_DATA_PTR;
+
+ int checkcpu(void)
+ {
++ volatile immap_t *immr;
+ ulong clock = gd->cpu_clk;
+ u32 pvr = get_pvr();
++ u32 spridr;
+ char buf[32];
+
++ immr = (immap_t *)CFG_IMMR;
++
+ if ((pvr & 0xFFFF0000) != PVR_83xx) {
+ puts("Not MPC83xx Family!!!\n");
+ return -1;
+ }
+
+- puts("CPU: MPC83xx, ");
+- switch(pvr) {
+- case PVR_8349_REV10:
++ spridr = immr->sysconf.spridr;
++ puts("CPU: ");
++ switch(spridr) {
++ case SPR_8349E_REV10:
++ case SPR_8349E_REV11:
++ puts("MPC8349E, ");
++ break;
++ case SPR_8349_REV10:
++ case SPR_8349_REV11:
++ puts("MPC8349, ");
++ break;
++ case SPR_8347E_REV10_TBGA:
++ case SPR_8347E_REV11_TBGA:
++ case SPR_8347E_REV10_PBGA:
++ case SPR_8347E_REV11_PBGA:
++ puts("MPC8347E, ");
++ break;
++ case SPR_8347_REV10_TBGA:
++ case SPR_8347_REV11_TBGA:
++ case SPR_8347_REV10_PBGA:
++ case SPR_8347_REV11_PBGA:
++ puts("MPC8347, ");
++ break;
++ case SPR_8343E_REV10:
++ case SPR_8343E_REV11:
++ puts("MPC8343E, ");
+ break;
+- case PVR_8349_REV11:
++ case SPR_8343_REV10:
++ case SPR_8343_REV11:
++ puts("MPC8343, ");
++ break;
++ case SPR_8360E_REV10:
++ case SPR_8360E_REV11:
++ case SPR_8360E_REV12:
++ puts("MPC8360E, ");
++ break;
++ case SPR_8360_REV10:
++ case SPR_8360_REV11:
++ case SPR_8360_REV12:
++ puts("MPC8360, ");
+ break;
+ default:
+ puts("Rev: Unknown\n");
+ return -1; /* Not sure what this is */
+ }
+- printf("Rev: %d.%d at %s MHz\n", (pvr & 0xf0) >> 4,
+- (pvr & 0x0f), strmhz(buf, clock));
+
++#if defined(CONFIG_MPC8349)
++ printf("Rev: %02x at %s MHz\n", (spridr & 0x0000FFFF)>>4 |(spridr & 0x0000000F), strmhz(buf, clock));
++#else
++ printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock));
++#endif
+ return 0;
+ }
+
+
++/*
++ * Program a UPM with the code supplied in the table.
++ *
++ * The 'dummy' variable is used to increment the MAD. 'dummy' is
++ * supposed to be a pointer to the memory of the device being
++ * programmed by the UPM. The data in the MDR is written into
++ * memory and the MAD is incremented every time there's a read
++ * from 'dummy'. Unfortunately, the current prototype for this
++ * function doesn't allow for passing the address of this
++ * device, and changing the prototype will break a number lots
++ * of other code, so we need to use a round-about way of finding
++ * the value for 'dummy'.
++ *
++ * The value can be extracted from the base address bits of the
++ * Base Register (BR) associated with the specific UPM. To find
++ * that BR, we need to scan all 8 BRs until we find the one that
++ * has its MSEL bits matching the UPM we want. Once we know the
++ * right BR, we can extract the base address bits from it.
++ *
++ * The MxMR and the BR and OR of the chosen bank should all be
++ * configured before calling this function.
++ *
++ * Parameters:
++ * upm: 0=UPMA, 1=UPMB, 2=UPMC
++ * table: Pointer to an array of values to program
++ * size: Number of elements in the array. Must be 64 or less.
++ */
+ void upmconfig (uint upm, uint *table, uint size)
+ {
+- hang(); /* FIXME: upconfig() needed? */
++#if defined(CONFIG_MPC834X)
++ volatile immap_t *immap = (immap_t *) CFG_IMMR;
++ volatile lbus83xx_t *lbus = &immap->lbus;
++ volatile uchar *dummy = NULL;
++ const u32 msel = (upm + 4) << BR_MSEL_SHIFT; /* What the MSEL field in BRn should be */
++ volatile u32 *mxmr = &lbus->mamr + upm; /* Pointer to mamr, mbmr, or mcmr */
++ uint i;
++
++ /* Scan all the banks to determine the base address of the device */
++ for (i = 0; i < 8; i++) {
++ if ((lbus->bank[i].br & BR_MSEL) == msel) {
++ dummy = (uchar *) (lbus->bank[i].br & BR_BA);
++ break;
++ }
++ }
++
++ if (!dummy) {
++ printf("Error: %s() could not find matching BR\n", __FUNCTION__);
++ hang();
++ }
++
++ /* Set the OP field in the MxMR to "write" and the MAD field to 000000 */
++ *mxmr = (*mxmr & 0xCFFFFFC0) | 0x10000000;
++
++ for (i = 0; i < size; i++) {
++ lbus->mdr = table[i];
++ __asm__ __volatile__ ("sync");
++ *dummy; /* Write the value to memory and increment MAD */
++ __asm__ __volatile__ ("sync");
++ }
++
++ /* Set the OP field in the MxMR to "normal" and the MAD field to 000000 */
++ *mxmr &= 0xCFFFFFC0;
++#else
++ printf("Error: %s() not defined for this configuration.\n", __FUNCTION__);
++ hang();
++#endif
+ }
+
+
+@@ -83,7 +183,7 @@ do_reset (cmd_tbl_t * cmdtp, int flag, i
+ ulong addr;
+ #endif
+
+- volatile immap_t *immap = (immap_t *) CFG_IMMRBAR;
++ volatile immap_t *immap = (immap_t *) CFG_IMMR;
+
+ #ifdef MPC83xx_RESET
+ /* Interrupts and MMU off */
+@@ -150,9 +250,21 @@ unsigned long get_tbclk(void)
+ #if defined(CONFIG_WATCHDOG)
+ void watchdog_reset (void)
+ {
+- hang(); /* FIXME: implement watchdog_reset()? */
++#ifdef CONFIG_MPC834X
++ int re_enable = disable_interrupts();
++
++ /* Reset the 83xx watchdog */
++ volatile immap_t *immr = (immap_t *) CFG_IMMR;
++ immr->wdt.swsrr = 0x556c;
++ immr->wdt.swsrr = 0xaa39;
++
++ if (re_enable)
++ enable_interrupts ();
++#else
++ hang();
++#endif
+ }
+-#endif /* CONFIG_WATCHDOG */
++#endif
+
+ #if defined(CONFIG_OF_FLAT_TREE)
+ void
+@@ -180,12 +292,12 @@ 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/address", &len);
++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len);
+ memcpy(p, bd->bi_enetaddr, 6);
+ #endif
+
+ #ifdef CONFIG_MPC83XX_TSEC2
+- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/address", &len);
++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len);
+ memcpy(p, bd->bi_enet1addr, 6);
+ #endif
+ }
+@@ -194,8 +306,8 @@ ft_cpu_setup(void *blob, bd_t *bd)
+ #if defined(CONFIG_DDR_ECC)
+ void dma_init(void)
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile dma8349_t *dma = &immap->dma;
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile dma83xx_t *dma = &immap->dma;
+ volatile u32 status = swab32(dma->dmasr0);
+ volatile u32 dmamr0 = swab32(dma->dmamr0);
+
+@@ -225,8 +337,8 @@ void dma_init(void)
+
+ uint dma_check(void)
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile dma8349_t *dma = &immap->dma;
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile dma83xx_t *dma = &immap->dma;
+ volatile u32 status = swab32(dma->dmasr0);
+ volatile u32 byte_count = swab32(dma->dmabcr0);
+
+@@ -244,8 +356,8 @@ uint dma_check(void)
+
+ int dma_xfer(void *dest, u32 count, void *src)
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile dma8349_t *dma = &immap->dma;
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile dma83xx_t *dma = &immap->dma;
+ volatile u32 dmamr0;
+
+ /* initialize DMASARn, DMADAR and DMAABCRn */
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu_init.c
+--- u-boot-1.1.6/cpu/mpc83xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu_init.c 2006-11-30 12:34:13.000000000 -0600
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2004 Freescale Semiconductor, Inc.
++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -18,11 +18,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ #include <common.h>
+@@ -31,6 +26,30 @@
+
+ DECLARE_GLOBAL_DATA_PTR;
+
++#ifdef CONFIG_QE
++extern qe_iop_conf_t qe_iop_conf_tab[];
++extern void qe_config_iopin(u8 port, u8 pin, int dir,
++ int open_drain, int assign);
++extern void qe_init(uint qe_base);
++extern void qe_reset(void);
++
++static void config_qe_ioports(void)
++{
++ u8 port, pin;
++ int dir, open_drain, assign;
++ int i;
++
++ for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) {
++ port = qe_iop_conf_tab[i].port;
++ pin = qe_iop_conf_tab[i].pin;
++ dir = qe_iop_conf_tab[i].dir;
++ open_drain = qe_iop_conf_tab[i].open_drain;
++ assign = qe_iop_conf_tab[i].assign;
++ qe_config_iopin(port, pin, dir, open_drain, assign);
++ }
++}
++#endif
++
+ /*
+ * Breathe some life into the CPU...
+ *
+@@ -46,6 +65,37 @@ void cpu_init_f (volatile immap_t * im)
+ /* Clear initial global data */
+ memset ((void *) gd, 0, sizeof (gd_t));
+
++ /* system performance tweaking */
++
++#ifdef CFG_ACR_PIPE_DEP
++ /* Arbiter pipeline depth */
++ im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) | (3 << ACR_PIPE_DEP_SHIFT);
++#endif
++
++#ifdef CFG_SPCR_TSEC1EP
++ /* TSEC1 Emergency priority */
++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) | (3 << SPCR_TSEC1EP_SHIFT);
++#endif
++
++#ifdef CFG_SPCR_TSEC2EP
++ /* TSEC2 Emergency priority */
++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (3 << SPCR_TSEC2EP_SHIFT);
++#endif
++
++#ifdef CFG_SCCR_TSEC1CM
++ /* TSEC1 clock mode */
++ im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (1 << SCCR_TSEC1CM_SHIFT);
++#endif
++#ifdef CFG_SCCR_TSEC2CM
++ /* TSEC2 & I2C1 clock mode */
++ im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (1 << SCCR_TSEC2CM_SHIFT);
++#endif
++
++#ifdef CFG_ACR_RPTCNT
++ /* Arbiter repeat count */
++ im->arbiter.acr = ((im->arbiter.acr & ~(ACR_RPTCNT)) | (3 << ACR_RPTCNT_SHIFT));
++#endif
++
+ /* RSR - Reset Status Register - clear all status (4.6.1.3) */
+ gd->reset_status = im->reset.rsr;
+ im->reset.rsr = ~(RSR_RES);
+@@ -69,6 +119,10 @@ void cpu_init_f (volatile immap_t * im)
+ #ifdef CFG_SICRL
+ im->sysconf.sicrl = CFG_SICRL;
+ #endif
++#ifdef CONFIG_QE
++ /* Config QE ioports */
++ config_qe_ioports();
++#endif
+
+ /*
+ * Memory Controller:
+@@ -157,12 +211,12 @@ void cpu_init_f (volatile immap_t * im)
+ #endif
+ }
+
+-
+-/*
+- * Initialize higher level parts of CPU like time base and timers.
+- */
+-
+ int cpu_init_r (void)
+ {
++#ifdef CONFIG_QE
++ uint qe_base = CFG_IMMR + 0x00100000; /* QE immr base */
++ qe_init(qe_base);
++ qe_reset();
++#endif
+ return 0;
+ }
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/i2c.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/i2c.c
+--- u-boot-1.1.6/cpu/mpc83xx/i2c.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/i2c.c 1969-12-31 18:00:00.000000000 -0600
+@@ -1,253 +0,0 @@
+-/*
+- * (C) Copyright 2003,Motorola Inc.
+- * Xianghua Xiao <x.xiao@motorola.com>
+- * Adapted for Motorola 85xx chip.
+- *
+- * (C) Copyright 2003
+- * Gleb Natapov <gnatapov@mrv.com>
+- * Some bits are taken from linux driver writen by adrian@humboldt.co.uk
+- *
+- * Hardware I2C driver for MPC107 PCI bridge.
+- *
+- * See file CREDITS for list of people who contributed to this
+- * project.
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+- * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+- */
+-
+-#include <common.h>
+-#include <command.h>
+-#include <asm/io.h>
+-
+-#ifdef CONFIG_HARD_I2C
+-#include <i2c.h>
+-#include <asm/i2c.h>
+-
+-#if defined(CONFIG_MPC8349EMDS) || defined(CONFIG_TQM834X)
+-i2c_t * mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET);
+-#endif
+-
+-void
+-i2c_init(int speed, int slaveadd)
+-{
+- /* stop I2C controller */
+- writeb(0x00 , &I2C->cr);
+-
+- /* set clock */
+- writeb(0x3f, &I2C->fdr);
+-
+- /* set default filter */
+- writeb(0x10,&I2C->dfsrr);
+-
+- /* write slave address */
+- writeb(slaveadd, &I2C->adr);
+-
+- /* clear status register */
+- writeb(0x00, &I2C->sr);
+-
+- /* start I2C controller */
+- writeb(I2C_CR_MEN, &I2C->cr);
+-}
+-
+-static __inline__ int
+-i2c_wait4bus (void)
+-{
+- ulong timeval = get_timer (0);
+- while (readb(&I2C->sr) & I2C_SR_MBB) {
+- if (get_timer (timeval) > I2C_TIMEOUT) {
+- return -1;
+- }
+- }
+- return 0;
+-}
+-
+-static __inline__ int
+-i2c_wait (int write)
+-{
+- u32 csr;
+- ulong timeval = get_timer(0);
+- do {
+- csr = readb(&I2C->sr);
+-
+- if (!(csr & I2C_SR_MIF))
+- continue;
+-
+- writeb(0x0, &I2C->sr);
+-
+- if (csr & I2C_SR_MAL) {
+- debug("i2c_wait: MAL\n");
+- return -1;
+- }
+-
+- if (!(csr & I2C_SR_MCF)) {
+- debug("i2c_wait: unfinished\n");
+- return -1;
+- }
+-
+- if (write == I2C_WRITE && (csr & I2C_SR_RXAK)) {
+- debug("i2c_wait: No RXACK\n");
+- return -1;
+- }
+-
+- return 0;
+- } while (get_timer (timeval) < I2C_TIMEOUT);
+-
+- debug("i2c_wait: timed out\n");
+- return -1;
+-}
+-
+-static __inline__ int
+-i2c_write_addr (u8 dev, u8 dir, int rsta)
+-{
+- writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX |
+- (rsta?I2C_CR_RSTA:0),
+- &I2C->cr);
+-
+- writeb((dev << 1) | dir, &I2C->dr);
+-
+- if (i2c_wait (I2C_WRITE) < 0)
+- return 0;
+- return 1;
+-}
+-
+-static __inline__ int
+-__i2c_write (u8 *data, int length)
+-{
+- int i;
+-
+- writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX,
+- &I2C->cr);
+-
+- for (i=0; i < length; i++) {
+- writeb(data[i], &I2C->dr);
+-
+- if (i2c_wait (I2C_WRITE) < 0)
+- break;
+- }
+- return i;
+-}
+-
+-static __inline__ int
+-__i2c_read (u8 *data, int length)
+-{
+- int i;
+-
+- writeb(I2C_CR_MEN | I2C_CR_MSTA |
+- ((length == 1) ? I2C_CR_TXAK : 0),
+- &I2C->cr);
+-
+- /* dummy read */
+- readb(&I2C->dr);
+-
+- for (i=0; i < length; i++) {
+- if (i2c_wait (I2C_READ) < 0)
+- break;
+-
+- /* Generate ack on last next to last byte */
+- if (i == length - 2)
+- writeb(I2C_CR_MEN | I2C_CR_MSTA |
+- I2C_CR_TXAK,
+- &I2C->cr);
+-
+- /* Generate stop on last byte */
+- if (i == length - 1)
+- writeb(I2C_CR_MEN | I2C_CR_TXAK, &I2C->cr);
+-
+- data[i] = readb(&I2C->dr);
+- }
+- return i;
+-}
+-
+-int
+-i2c_read (u8 dev, uint addr, int alen, u8 *data, int length)
+-{
+- int i = 0;
+- u8 *a = (u8*)&addr;
+-
+- if (i2c_wait4bus () < 0)
+- goto exit;
+-
+- if (i2c_write_addr (dev, I2C_WRITE, 0) == 0)
+- goto exit;
+-
+- if (__i2c_write (&a[4 - alen], alen) != alen)
+- goto exit;
+-
+- if (i2c_write_addr (dev, I2C_READ, 1) == 0)
+- goto exit;
+-
+- i = __i2c_read (data, length);
+-
+- exit:
+- writeb(I2C_CR_MEN, &I2C->cr);
+- return !(i == length);
+-}
+-
+-int
+-i2c_write (u8 dev, uint addr, int alen, u8 *data, int length)
+-{
+- int i = 0;
+- u8 *a = (u8*)&addr;
+-
+- if (i2c_wait4bus () < 0)
+- goto exit;
+-
+- if (i2c_write_addr (dev, I2C_WRITE, 0) == 0)
+- goto exit;
+-
+- if (__i2c_write (&a[4 - alen], alen) != alen)
+- goto exit;
+-
+- i = __i2c_write (data, length);
+-
+- exit:
+- writeb(I2C_CR_MEN, &I2C->cr);
+- return !(i == 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.
+- */
+- udelay(10000);
+- return i2c_read (chip, 0, 1, (uchar *)&tmp, 1);
+-}
+-
+-uchar i2c_reg_read (uchar i2c_addr, uchar reg)
+-{
+- uchar buf[1];
+-
+- i2c_read (i2c_addr, reg, 1, buf, 1);
+-
+- return (buf[0]);
+-}
+-
+-void i2c_reg_write (uchar i2c_addr, uchar reg, uchar val)
+-{
+- i2c_write (i2c_addr, reg, 1, &val, 1);
+-}
+-
+-#endif /* CONFIG_HARD_I2C */
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/interrupts.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/interrupts.c
+--- u-boot-1.1.6/cpu/mpc83xx/interrupts.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/interrupts.c 2006-11-30 12:34:13.000000000 -0600
+@@ -21,13 +21,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * Hacked for MPC8260 by Murray.Jensen@cmst.csiro.au, 22-Oct-00
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ #include <common.h>
+@@ -45,7 +38,7 @@ struct irq_action {
+
+ int interrupt_init_cpu (unsigned *decrementer_count)
+ {
+- volatile immap_t *immr = (immap_t *) CFG_IMMRBAR;
++ volatile immap_t *immr = (immap_t *) CFG_IMMR;
+
+ *decrementer_count = (gd->bus_clk / 4) / CFG_HZ;
+
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/Makefile u-boot-1.1.6-fsl-1/cpu/mpc83xx/Makefile
+--- u-boot-1.1.6/cpu/mpc83xx/Makefile 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/Makefile 2006-11-10 11:24:29.000000000 -0600
+@@ -27,9 +27,9 @@ include $(TOPDIR)/config.mk
+
+ LIB = $(obj)lib$(CPU).a
+
+-START = start.o resetvec.o
++START = start.o
+ COBJS = traps.o cpu.o cpu_init.o speed.o interrupts.o \
+- i2c.o spd_sdram.o
++ spd_sdram.o qe_io.o
+
+ SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
+ OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/qe_io.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/qe_io.c
+--- u-boot-1.1.6/cpu/mpc83xx/qe_io.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/qe_io.c 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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/errno.h"
++#include "asm/io.h"
++#include "asm/immap_83xx.h"
++
++#if defined(CONFIG_QE)
++#define NUM_OF_PINS 32
++void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
++{
++ u32 pin_2bit_mask;
++ u32 pin_2bit_dir;
++ u32 pin_2bit_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;
++
++ /* Caculate pin location and 2bit mask and dir */
++ pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
++ pin_2bit_dir = (u32)(dir << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
++
++ /* Setup the direction */
++ tmp_val = (pin > (NUM_OF_PINS/2) - 1) ? \
++ in_be32(&par_io->ioport[port].dir2) :
++ in_be32(&par_io->ioport[port].dir1);
++
++ if (pin > (NUM_OF_PINS/2) -1) {
++ out_be32(&par_io->ioport[port].dir2, ~pin_2bit_mask & tmp_val);
++ out_be32(&par_io->ioport[port].dir2, pin_2bit_dir | tmp_val);
++ } else {
++ out_be32(&par_io->ioport[port].dir1, ~pin_2bit_mask & tmp_val);
++ out_be32(&par_io->ioport[port].dir1, pin_2bit_dir | tmp_val);
++ }
++
++ /* Calculate pin location for 1bit mask */
++ pin_1bit_mask = (u32)(1 << (NUM_OF_PINS - (pin+1)));
++
++ /* Setup the open drain */
++ tmp_val = in_be32(&par_io->ioport[port].podr);
++ if (open_drain) {
++ out_be32(&par_io->ioport[port].podr, pin_1bit_mask | tmp_val);
++ } else {
++ out_be32(&par_io->ioport[port].podr, ~pin_1bit_mask & tmp_val);
++ }
++
++ /* Setup the assignment */
++ tmp_val = (pin > (NUM_OF_PINS/2) - 1) ?
++ in_be32(&par_io->ioport[port].ppar2):
++ in_be32(&par_io->ioport[port].ppar1);
++ pin_2bit_assign = (u32)(assign
++ << (NUM_OF_PINS - (pin%(NUM_OF_PINS/2)+1)*2));
++
++ /* Clear and set 2 bits mask */
++ if (pin > (NUM_OF_PINS/2) - 1) {
++ out_be32(&par_io->ioport[port].ppar2, ~pin_2bit_mask & tmp_val);
++ out_be32(&par_io->ioport[port].ppar2, pin_2bit_assign | tmp_val);
++ } else {
++ out_be32(&par_io->ioport[port].ppar1, ~pin_2bit_mask & tmp_val);
++ out_be32(&par_io->ioport[port].ppar1, pin_2bit_assign | tmp_val);
++ }
++}
++
++#endif /* CONFIG_QE */
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/resetvec.S u-boot-1.1.6-fsl-1/cpu/mpc83xx/resetvec.S
+--- u-boot-1.1.6/cpu/mpc83xx/resetvec.S 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/resetvec.S 1969-12-31 18:00:00.000000000 -0600
+@@ -1,6 +0,0 @@
+- .section .resetvec,"ax"
+-#ifndef FIXME
+-#if 0
+- b _start_e500
+-#endif
+-#endif
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/spd_sdram.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/spd_sdram.c
+--- u-boot-1.1.6/cpu/mpc83xx/spd_sdram.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/spd_sdram.c 2006-12-06 10:33:49.000000000 -0600
+@@ -1,8 +1,10 @@
+ /*
++ * (C) Copyright 2006 Freescale Semiconductor, Inc.
++ *
+ * (C) Copyright 2006
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+- * Copyright 2004 Freescale Semiconductor.
++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
+ * (C) Copyright 2003 Motorola Inc.
+ * Xianghua Xiao (X.Xiao@motorola.com)
+ *
+@@ -23,11 +25,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ #include <common.h>
+@@ -39,7 +36,9 @@
+
+ #ifdef CONFIG_SPD_EEPROM
+
+-#if defined(CONFIG_DDR_ECC)
++DECLARE_GLOBAL_DATA_PTR;
++
++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
+ extern void dma_init(void);
+ extern uint dma_check(void);
+ extern int dma_xfer(void *dest, uint count, void *src);
+@@ -52,16 +51,16 @@ extern int dma_xfer(void *dest, uint cou
+ /*
+ * Convert picoseconds into clock cycles (rounding up if needed).
+ */
+-
+ int
+ picos_to_clk(int picos)
+ {
++ unsigned int ddr_bus_clk;
+ int clks;
+
+- clks = picos / (2000000000 / (get_bus_freq(0) / 1000));
+- if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) {
+- clks++;
+- }
++ ddr_bus_clk = gd->ddr_clk >> 1;
++ clks = picos / ((1000000000 / ddr_bus_clk) * 1000);
++ if (picos % ((1000000000 / ddr_bus_clk) * 1000) != 0)
++ clks++;
+
+ return clks;
+ }
+@@ -103,33 +102,72 @@ static void spd_debug(spd_eeprom_t *spd)
+
+ long int spd_sdram()
+ {
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile ddr8349_t *ddr = &immap->ddr;
+- volatile law8349_t *ecm = &immap->sysconf.ddrlaw[0];
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile ddr83xx_t *ddr = &immap->ddr;
++ volatile law83xx_t *ecm = &immap->sysconf.ddrlaw[0];
+ spd_eeprom_t spd;
+- unsigned tmp, tmp1;
+ unsigned int memsize;
+ unsigned int law_size;
+- unsigned char caslat;
+- unsigned int trfc, trfc_clk, trfc_low;
++ unsigned char caslat, caslat_ctrl;
++ unsigned char burstlen;
++ 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 ddrc_ecc_enable;
+
++ /* Read SPD parameters with I2C */
+ CFG_READ_SPD(SPD_EEPROM_ADDRESS, 0, 1, (uchar *) & spd, sizeof (spd));
+ #ifdef SPD_DEBUG
+ spd_debug(&spd);
+ #endif
++ /* Check the memory type */
++ if (spd.mem_type != SPD_MEMTYPE_DDR) {
++ printf("DDR: Module mem type is %02X\n", spd.mem_type);
++ return 0;
++ }
++
++ /* Check the number of physical bank */
+ if (spd.nrows > 2) {
+- puts("DDR:Only two chip selects are supported on ADS.\n");
++ printf("DDR: The number of physical bank is %02X\n", spd.nrows);
+ return 0;
+ }
+
+- if (spd.nrow_addr < 12
+- || spd.nrow_addr > 14
+- || spd.ncol_addr < 8
+- || spd.ncol_addr > 11) {
+- puts("DDR:Row or Col number unsupported.\n");
++ /* Check if the number of row of the module is in the range of DDRC */
++ if (spd.nrow_addr < 12 || spd.nrow_addr > 14) {
++ printf("DDR: Row number is out of range of DDRC, row=%02X\n",
++ spd.nrow_addr);
+ return 0;
+ }
+
++ /* Check if the number of col of the module is in the range of DDRC */
++ if (spd.ncol_addr < 8 || spd.ncol_addr > 11) {
++ printf("DDR: Col number is out of range of DDRC, col=%02X\n",
++ spd.ncol_addr);
++ return 0;
++ }
++ /* 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
++ | (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) {
++ ddr->csbnds[1].csbnds = ( (banksize(spd.row_dens) >> 8)
++ | ((banksize(spd.row_dens) >> 23) - 1) );
++ ddr->cs_config[1] = ( 1<<31
++ | (spd.nrow_addr-12) << 8
++ | (spd.ncol_addr-8) );
++ debug("cs1_bnds = 0x%08x\n",ddr->csbnds[1].csbnds);
++ debug("cs1_config = 0x%08x\n",ddr->cs_config[1]);
++ }
++
++#else
+ ddr->csbnds[2].csbnds = (banksize(spd.row_dens) >> 24) - 1;
+ ddr->cs_config[2] = ( 1 << 31
+ | (spd.nrow_addr - 12) << 8
+@@ -147,6 +185,7 @@ long int spd_sdram()
+ debug("cs3_bnds = 0x%08x\n",ddr->csbnds[3].csbnds);
+ debug("cs3_config = 0x%08x\n",ddr->cs_config[3]);
+ }
++#endif
+
+ if (spd.mem_type != 0x07) {
+ puts("No DDR module found!\n");
+@@ -172,56 +211,136 @@ long int spd_sdram()
+ debug("DDR:ar=0x%08x\n", ecm->ar);
+
+ /*
+- * find the largest CAS
+- */
+- if(spd.cas_lat & 0x40) {
+- caslat = 7;
+- } else if (spd.cas_lat & 0x20) {
+- caslat = 6;
+- } else if (spd.cas_lat & 0x10) {
+- caslat = 5;
+- } else if (spd.cas_lat & 0x08) {
+- caslat = 4;
+- } else if (spd.cas_lat & 0x04) {
+- caslat = 3;
+- } else if (spd.cas_lat & 0x02) {
+- caslat = 2;
+- } else if (spd.cas_lat & 0x01) {
+- caslat = 1;
+- } else {
+- puts("DDR:no valid CAS Latency information.\n");
++ * Find the largest CAS by locating the highest 1 bit
++ * 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
++ */
++ caslat = __ilog2(spd.cas_lat);
++
++ if (caslat > 6 ) {
++ printf("DDR: Invalid SPD CAS Latency, caslat=%02X\n",
++ spd.cas_lat);
+ return 0;
+ }
+-
+- tmp = 20000 / (((spd.clk_cycle & 0xF0) >> 4) * 10
+- + (spd.clk_cycle & 0x0f));
+- debug("DDR:Module maximum data rate is: %dMhz\n", tmp);
+-
+- tmp1 = get_bus_freq(0) / 1000000;
+- if (tmp1 < 230 && tmp1 >= 90 && tmp >= 230) {
+- /* 90~230 range, treated as DDR 200 */
+- if (spd.clk_cycle3 == 0xa0)
+- caslat -= 2;
+- else if(spd.clk_cycle2 == 0xa0)
+- caslat--;
+- } else if (tmp1 < 280 && tmp1 >= 230 && tmp >= 280) {
+- /* 230-280 range, treated as DDR 266 */
+- if (spd.clk_cycle3 == 0x75)
+- caslat -= 2;
+- else if (spd.clk_cycle2 == 0x75)
+- caslat--;
+- } else if (tmp1 < 350 && tmp1 >= 280 && tmp >= 350) {
+- /* 280~350 range, treated as DDR 333 */
+- if (spd.clk_cycle3 == 0x60)
+- caslat -= 2;
+- else if (spd.clk_cycle2 == 0x60)
+- caslat--;
+- } else if (tmp1 < 90 || tmp1 >= 350) {
+- /* DDR rate out-of-range */
+- puts("DDR:platform frequency is not fit for DDR rate\n");
+- return 0;
++ max_bus_clk = 1000 *10 / (((spd.clk_cycle & 0xF0) >> 4) * 10
++ + (spd.clk_cycle & 0x0f));
++ max_data_rate = max_bus_clk * 2;
++
++ debug("DDR:Module maximum data rate is: %dMhz\n", max_data_rate);
++
++ ddrc_clk = gd->ddr_clk / 1000000;
++
++ if (max_data_rate >= 390) { /* it is DDR 400 */
++ if (ddrc_clk <= 410 && ddrc_clk > 350) {
++ /* DDR controller clk at 350~410 */
++ effective_data_rate = 400; /* 5ns */
++ caslat = caslat;
++ } else if (ddrc_clk <= 350 && ddrc_clk > 280) {
++ /* DDR controller clk at 280~350 */
++ effective_data_rate = 333; /* 6ns */
++ if (spd.clk_cycle2 == 0x60)
++ caslat = caslat - 1;
++ else
++ caslat = caslat;
++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
++ /* DDR controller clk at 230~280 */
++ effective_data_rate = 266; /* 7.5ns */
++ if (spd.clk_cycle3 == 0x75)
++ caslat = caslat - 2;
++ else if (spd.clk_cycle2 == 0x60)
++ 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)
++ caslat = caslat - 2;
++ else if (spd.clk_cycle2 == 0x60)
++ caslat = caslat - 1;
++ else
++ caslat = caslat;
++ }
++ } else if (max_data_rate >= 323) { /* it is DDR 333 */
++ if (ddrc_clk <= 350 && ddrc_clk > 280) {
++ /* DDR controller clk at 280~350 */
++ effective_data_rate = 333; /* 6ns */
++ caslat = caslat;
++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
++ /* DDR controller clk at 230~280 */
++ effective_data_rate = 266; /* 7.5ns */
++ 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 == 0xa0)
++ caslat = caslat - 2;
++ else if (spd.clk_cycle2 == 0x75)
++ caslat = caslat - 1;
++ else
++ caslat = caslat;
++ }
++ } else if (max_data_rate >= 256) { /* it is DDR 266 */
++ if (ddrc_clk <= 350 && ddrc_clk > 280) {
++ /* DDR controller clk at 280~350 */
++ printf("DDR: DDR controller freq is more than "
++ "max data rate of the module\n");
++ return 0;
++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) {
++ /* DDR controller clk at 230~280 */
++ effective_data_rate = 266; /* 7.5ns */
++ caslat = caslat;
++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
++ /* DDR controller clk at 90~230 */
++ effective_data_rate = 200; /* 10ns */
++ if (spd.clk_cycle2 == 0xa0)
++ caslat = caslat - 1;
++ }
++ } else if (max_data_rate >= 190) { /* it is DDR 200 */
++ if (ddrc_clk <= 350 && ddrc_clk > 230) {
++ /* DDR controller clk at 230~350 */
++ printf("DDR: DDR controller freq is more than "
++ "max data rate of the module\n");
++ return 0;
++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) {
++ /* DDR controller clk at 90~230 */
++ effective_data_rate = 200; /* 10ns */
++ caslat = caslat;
++ }
+ }
+
++ debug("DDR:Effective data rate is: %dMhz\n", effective_data_rate);
++ debug("DDR:The MSB 1 of CAS Latency is: %d\n", caslat);
++
++ /*
++ * 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 */
++
++ __asm__ __volatile__ ("sync");
++
++ debug("Errata DDR6 (debug_reg=0x%08x)\n", ddr->debug_reg);
++
+ /*
+ * note: caslat must also be programmed into ddr->sdram_mode
+ * register.
+@@ -229,16 +348,14 @@ long int spd_sdram()
+ * note: WRREC(Twr) and WRTORD(Twtr) are not in SPD,
+ * use conservative value here.
+ */
+- trfc = spd.trfc * 1000; /* up to ps */
+- trfc_clk = picos_to_clk(trfc);
+- trfc_low = (trfc_clk - 8) & 0xf;
++ caslat_ctrl = (caslat + 1) & 0x07; /* see as above */
+
+ 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 & 0x07) << 16 ) |
+- (trfc_low << 12 ) |
++ ((caslat_ctrl & 0x07) << 16 ) |
++ (((picos_to_clk(spd.trfc * 1000) - 8) & 0x0f) << 12 ) |
+ ( 0x300 ) |
+ ((picos_to_clk(spd.trrd * 250) & 0x07) << 4) | 1);
+
+@@ -246,144 +363,143 @@ long int spd_sdram()
+
+ 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;
+
+- /*
+- * Only DDR I is supported
+- * DDR I and II have different mode-register-set definition
+- */
+- switch(caslat) {
+- case 2:
+- tmp = 0x50; /* 1.5 */
+- break;
+- case 3:
+- tmp = 0x20; /* 2.0 */
+- break;
+- case 4:
+- tmp = 0x60; /* 2.5 */
+- break;
+- case 5:
+- tmp = 0x30; /* 3.0 */
+- break;
+- default:
+- puts("DDR:only CAS Latency 1.5, 2.0, 2.5, 3.0 is supported.\n");
+- return 0;
++ /* Check DIMM data bus width */
++ if (spd.dataw_lsb == 0x20) {
++ burstlen = 0x03; /* 32 bit data bus, burst len is 8 */
++ printf("\n DDR DIMM: data bus width is 32 bit");
++ } else {
++ burstlen = 0x02; /* Others act as 64 bit bus, burst len is 4 */
++ printf("\n DDR DIMM: data bus width is 64 bit");
++ }
++
++ /* Is this an ECC DDR chip? */
++ if (spd.config == 0x02)
++ printf(" with ECC\n");
++ else
++ printf(" without ECC\n");
++
++ /* Burst length is always 4 for 64 bit data bus, 8 for 32 bit data bus,
++ Burst type is sequential
++ */
++ switch (caslat) {
++ case 1:
++ ddr->sdram_mode = 0x50 | burstlen; /* CL=1.5 */
++ break;
++ case 2:
++ ddr->sdram_mode = 0x20 | burstlen; /* CL=2.0 */
++ break;
++ case 3:
++ ddr->sdram_mode = 0x60 | burstlen; /* CL=2.5 */
++ break;
++ case 4:
++ ddr->sdram_mode = 0x30 | burstlen; /* CL=3.0 */
++ break;
++ default:
++ printf("DDR:only CL 1.5, 2.0, 2.5, 3.0 is supported\n");
++ return 0;
+ }
+-#if defined (CONFIG_DDR_32BIT)
+- /* set burst length to 8 for 32-bit data path */
+- tmp |= 0x03;
+-#else
+- /* set burst length to 4 - default for 64-bit data path */
+- tmp |= 0x02;
+-#endif
+- ddr->sdram_mode = tmp;
+ debug("DDR:sdram_mode=0x%08x\n", ddr->sdram_mode);
+
+- switch(spd.refresh) {
+- case 0x00:
+- case 0x80:
+- tmp = picos_to_clk(15625000);
+- break;
+- case 0x01:
+- case 0x81:
+- tmp = picos_to_clk(3900000);
+- break;
+- case 0x02:
+- case 0x82:
+- tmp = picos_to_clk(7800000);
+- break;
+- case 0x03:
+- case 0x83:
+- tmp = picos_to_clk(31300000);
+- break;
+- case 0x04:
+- case 0x84:
+- tmp = picos_to_clk(62500000);
+- break;
+- case 0x05:
+- case 0x85:
+- tmp = picos_to_clk(125000000);
+- break;
+- default:
+- tmp = 0x512;
+- break;
++ switch (spd.refresh) {
++ case 0x00:
++ case 0x80:
++ refresh_clk = picos_to_clk(15625000);
++ break;
++ case 0x01:
++ case 0x81:
++ refresh_clk = picos_to_clk(3900000);
++ break;
++ case 0x02:
++ case 0x82:
++ refresh_clk = picos_to_clk(7800000);
++ break;
++ case 0x03:
++ case 0x83:
++ refresh_clk = picos_to_clk(31300000);
++ break;
++ case 0x04:
++ case 0x84:
++ refresh_clk = picos_to_clk(62500000);
++ break;
++ case 0x05:
++ case 0x85:
++ refresh_clk = picos_to_clk(125000000);
++ break;
++ default:
++ refresh_clk = 0x512;
++ break;
+ }
+
+ /*
+ * Set BSTOPRE to 0x100 for page mode
+ * If auto-charge is used, set BSTOPRE = 0
+ */
+- ddr->sdram_interval = ((tmp & 0x3fff) << 16) | 0x100;
++ ddr->sdram_interval = ((refresh_clk & 0x3fff) << 16) | 0x100;
+ debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval);
+
+- /*
+- * Is this an ECC DDR chip?
++ /* SS_EN = 0, source synchronous disable
++ * CLK_ADJST = 0, MCK/MCK# is launched aligned with addr/cmd
+ */
+-#if defined(CONFIG_DDR_ECC)
+- if (spd.config == 0x02) {
+- /* disable error detection */
+- ddr->err_disable = ~ECC_ERROR_ENABLE;
++ ddr->sdram_clk_cntl = 0x00000000;
++ debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl);
+
+- /* set single bit error threshold to maximum value,
+- * reset counter to zero */
+- ddr->err_sbe = (255 << ECC_ERROR_MAN_SBET_SHIFT) |
+- (0 << ECC_ERROR_MAN_SBEC_SHIFT);
+- }
+- debug("DDR:err_disable=0x%08x\n", ddr->err_disable);
+- debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe);
+-#endif
+ asm("sync;isync");
+
+- udelay(500);
++ udelay(600);
+
+ /*
+- * SS_EN=1,
+- * CLK_ADJST = 2-MCK/MCK_B, is lauched 1/2 of one SDRAM
+- * clock cycle after address/command
+- */
+- /*ddr->sdram_clk_cntl = 0x82000000;*/
+- ddr->sdram_clk_cntl = (DDR_SDRAM_CLK_CNTL_SS_EN|DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05);
+-
+- /*
+- * Figure out the settings for the sdram_cfg register. Build up
+- * the entire register in 'tmp' before writing since the write into
++ * Figure out the settings for the sdram_cfg register. Build up
++ * the value in 'sdram_cfg' before writing since the write into
+ * the register will actually enable the memory controller, and all
+ * settings must be done before enabling.
+ *
+ * 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[12] = 0 (32_BE =0 , 64 bit bus mode)
++ * sdram_cfg[13] = 0 (8_BE =0, 4-beat bursts)
+ */
+- tmp = 0xc2000000;
++ sdram_cfg = 0xC2000000;
+
+-#if defined (CONFIG_DDR_32BIT)
+- /* in 32-Bit mode burst len is 8 beats */
+- tmp |= (SDRAM_CFG_32_BE | SDRAM_CFG_8_BE);
+-#endif
+- /*
+- * sdram_cfg[3] = RD_EN - registered DIMM enable
+- * A value of 0x26 indicates micron registered DIMMS (micron.com)
+- */
+- if (spd.mod_attr == 0x26) {
+- tmp |= 0x10000000;
+- }
++ /* sdram_cfg[3] = RD_EN - registered DIMM enable */
++ if (spd.mod_attr & 0x02)
++ sdram_cfg |= 0x10000000;
++
++ /* The DIMM is 32bit width */
++ if (spd.dataw_lsb == 0x20)
++ sdram_cfg |= 0x000C0000;
++
++ ddrc_ecc_enable = 0;
+
+ #if defined(CONFIG_DDR_ECC)
+- /*
+- * If the user wanted ECC (enabled via sdram_cfg[2])
+- */
++ /* Enable ECC with sdram_cfg[2] */
+ if (spd.config == 0x02) {
+- tmp |= SDRAM_CFG_ECC_EN;
++ sdram_cfg |= 0x20000000;
++ ddrc_ecc_enable = 1;
++ /* disable error detection */
++ ddr->err_disable = ~ECC_ERROR_ENABLE;
++ /* set single bit error threshold to maximum value,
++ * reset counter to zero */
++ ddr->err_sbe = (255 << ECC_ERROR_MAN_SBET_SHIFT) |
++ (0 << ECC_ERROR_MAN_SBEC_SHIFT);
+ }
++
++ debug("DDR:err_disable=0x%08x\n", ddr->err_disable);
++ debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe);
+ #endif
++ printf(" DDRC ECC mode: %s\n", ddrc_ecc_enable ? "ON":"OFF");
+
+ #if defined(CONFIG_DDR_2T_TIMING)
+ /*
+ * Enable 2T timing by setting sdram_cfg[16].
+ */
+- tmp |= SDRAM_CFG_2T_EN;
++ sdram_cfg |= SDRAM_CFG_2T_EN;
+ #endif
+-
+- ddr->sdram_cfg = tmp;
++ /* Enable controller, and GO! */
++ ddr->sdram_cfg = sdram_cfg;
+ asm("sync;isync");
+ udelay(500);
+
+@@ -392,8 +508,7 @@ long int spd_sdram()
+ }
+ #endif /* CONFIG_SPD_EEPROM */
+
+-
+-#if defined(CONFIG_DDR_ECC)
++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
+ /*
+ * Use timebase counter, get_timer() is not availabe
+ * at this point of initialization yet.
+@@ -429,74 +544,48 @@ static __inline__ unsigned long get_tbms
+ /* #define CONFIG_DDR_ECC_INIT_VIA_DMA */
+ void ddr_enable_ecc(unsigned int dram_size)
+ {
+- uint *p;
+- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR;
+- volatile ddr8349_t *ddr = &immap->ddr;
++ volatile immap_t *immap = (immap_t *)CFG_IMMR;
++ volatile ddr83xx_t *ddr= &immap->ddr;
+ unsigned long t_start, t_end;
++ register u64 *p;
++ register uint size;
++ unsigned int pattern[2];
+ #if defined(CONFIG_DDR_ECC_INIT_VIA_DMA)
+ uint i;
+ #endif
+-
+- debug("Initialize a Cachline in DRAM\n");
+ icache_enable();
+-
+-#if defined(CONFIG_DDR_ECC_INIT_VIA_DMA)
+- /* Initialise DMA for direct Transfers */
+- dma_init();
+-#endif
+-
+ t_start = get_tbms();
++ pattern[0] = 0xdeadbeef;
++ pattern[1] = 0xdeadbeef;
+
+ #if !defined(CONFIG_DDR_ECC_INIT_VIA_DMA)
+- debug("DDR init: Cache flush method\n");
+- for (p = 0; p < (uint *)(dram_size); p++) {
+- if (((unsigned int)p & 0x1f) == 0) {
+- ppcDcbz((unsigned long) p);
+- }
+-
+- /* write pattern to cache and flush */
+- *p = (unsigned int)0xdeadbeef;
+-
+- if (((unsigned int)p & 0x1c) == 0x1c) {
+- ppcDcbf((unsigned long) p);
+- }
++ debug("ddr init: CPU FP write method\n");
++ size = dram_size;
++ for (p = 0; p < (u64*)(size); p++) {
++ ppcDWstore((u32*)p, pattern);
+ }
++ __asm__ __volatile__ ("sync");
+ #else
+- printf("DDR init: DMA method\n");
+- for (p = 0; p < (uint *)(8 * 1024); p++) {
+- /* zero one data cache line */
+- if (((unsigned int)p & 0x1f) == 0) {
+- ppcDcbz((unsigned long)p);
+- }
+-
+- /* write pattern to it and flush */
+- *p = (unsigned int)0xdeadbeef;
+-
+- if (((unsigned int)p & 0x1c) == 0x1c) {
+- ppcDcbf((unsigned long)p);
+- }
++ debug("ddr init: DMA method\n");
++ size = 0x2000;
++ for (p = 0; p < (u64*)(size); p++) {
++ ppcDWstore((u32*)p, pattern);
+ }
++ __asm__ __volatile__ ("sync");
+
+- /* 8K */
+- dma_xfer((uint *)0x2000, 0x2000, (uint *)0);
+- /* 16K */
+- dma_xfer((uint *)0x4000, 0x4000, (uint *)0);
+- /* 32K */
+- dma_xfer((uint *)0x8000, 0x8000, (uint *)0);
+- /* 64K */
+- dma_xfer((uint *)0x10000, 0x10000, (uint *)0);
+- /* 128k */
+- dma_xfer((uint *)0x20000, 0x20000, (uint *)0);
+- /* 256k */
+- dma_xfer((uint *)0x40000, 0x40000, (uint *)0);
+- /* 512k */
+- dma_xfer((uint *)0x80000, 0x80000, (uint *)0);
+- /* 1M */
+- dma_xfer((uint *)0x100000, 0x100000, (uint *)0);
+- /* 2M */
+- dma_xfer((uint *)0x200000, 0x200000, (uint *)0);
+- /* 4M */
+- dma_xfer((uint *)0x400000, 0x400000, (uint *)0);
++ /* Initialise DMA for direct transfer */
++ dma_init();
++ /* Start DMA to transfer */
++ dma_xfer((uint *)0x2000, 0x2000, (uint *)0); /* 8K */
++ dma_xfer((uint *)0x4000, 0x4000, (uint *)0); /* 16K */
++ dma_xfer((uint *)0x8000, 0x8000, (uint *)0); /* 32K */
++ dma_xfer((uint *)0x10000, 0x10000, (uint *)0); /* 64K */
++ dma_xfer((uint *)0x20000, 0x20000, (uint *)0); /* 128K */
++ dma_xfer((uint *)0x40000, 0x40000, (uint *)0); /* 256K */
++ dma_xfer((uint *)0x80000, 0x80000, (uint *)0); /* 512K */
++ dma_xfer((uint *)0x100000, 0x100000, (uint *)0); /* 1M */
++ dma_xfer((uint *)0x200000, 0x200000, (uint *)0); /* 2M */
++ dma_xfer((uint *)0x400000, 0x400000, (uint *)0); /* 4M */
+
+ for (i = 1; i < dram_size / 0x800000; i++) {
+ dma_xfer((uint *)(0x800000*i), 0x800000, (uint *)0);
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/speed.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/speed.c
+--- u-boot-1.1.6/cpu/mpc83xx/speed.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/speed.c 2006-11-30 12:34:13.000000000 -0600
+@@ -2,7 +2,7 @@
+ * (C) Copyright 2000-2002
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+- * Copyright 2004 Freescale Semiconductor, Inc.
++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -21,11 +21,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ #include <common.h>
+@@ -53,38 +48,38 @@ typedef enum {
+
+ typedef struct {
+ mult_t core_csb_ratio;
+- mult_t vco_divider;
++ mult_t vco_divider;
+ } corecnf_t;
+
+ corecnf_t corecnf_tab[] = {
+- { _byp, _byp}, /* 0x00 */
+- { _byp, _byp}, /* 0x01 */
+- { _byp, _byp}, /* 0x02 */
+- { _byp, _byp}, /* 0x03 */
+- { _byp, _byp}, /* 0x04 */
+- { _byp, _byp}, /* 0x05 */
+- { _byp, _byp}, /* 0x06 */
+- { _byp, _byp}, /* 0x07 */
+- { _1x, _x2}, /* 0x08 */
+- { _1x, _x4}, /* 0x09 */
+- { _1x, _x8}, /* 0x0A */
+- { _1x, _x8}, /* 0x0B */
+- {_1_5x, _x2}, /* 0x0C */
+- {_1_5x, _x4}, /* 0x0D */
+- {_1_5x, _x8}, /* 0x0E */
+- {_1_5x, _x8}, /* 0x0F */
+- { _2x, _x2}, /* 0x10 */
+- { _2x, _x4}, /* 0x11 */
+- { _2x, _x8}, /* 0x12 */
+- { _2x, _x8}, /* 0x13 */
+- {_2_5x, _x2}, /* 0x14 */
+- {_2_5x, _x4}, /* 0x15 */
+- {_2_5x, _x8}, /* 0x16 */
+- {_2_5x, _x8}, /* 0x17 */
+- { _3x, _x2}, /* 0x18 */
+- { _3x, _x4}, /* 0x19 */
+- { _3x, _x8}, /* 0x1A */
+- { _3x, _x8}, /* 0x1B */
++ {_byp, _byp}, /* 0x00 */
++ {_byp, _byp}, /* 0x01 */
++ {_byp, _byp}, /* 0x02 */
++ {_byp, _byp}, /* 0x03 */
++ {_byp, _byp}, /* 0x04 */
++ {_byp, _byp}, /* 0x05 */
++ {_byp, _byp}, /* 0x06 */
++ {_byp, _byp}, /* 0x07 */
++ {_1x, _x2}, /* 0x08 */
++ {_1x, _x4}, /* 0x09 */
++ {_1x, _x8}, /* 0x0A */
++ {_1x, _x8}, /* 0x0B */
++ {_1_5x, _x2}, /* 0x0C */
++ {_1_5x, _x4}, /* 0x0D */
++ {_1_5x, _x8}, /* 0x0E */
++ {_1_5x, _x8}, /* 0x0F */
++ {_2x, _x2}, /* 0x10 */
++ {_2x, _x4}, /* 0x11 */
++ {_2x, _x8}, /* 0x12 */
++ {_2x, _x8}, /* 0x13 */
++ {_2_5x, _x2}, /* 0x14 */
++ {_2_5x, _x4}, /* 0x15 */
++ {_2_5x, _x8}, /* 0x16 */
++ {_2_5x, _x8}, /* 0x17 */
++ {_3x, _x2}, /* 0x18 */
++ {_3x, _x4}, /* 0x19 */
++ {_3x, _x8}, /* 0x1A */
++ {_3x, _x8}, /* 0x1B */
+ };
+
+ /* ----------------------------------------------------------------- */
+@@ -92,91 +87,64 @@ corecnf_t corecnf_tab[] = {
+ /*
+ *
+ */
+-int get_clocks (void)
++int get_clocks(void)
+ {
+- volatile immap_t *im = (immap_t *)CFG_IMMRBAR;
++ volatile immap_t *im = (immap_t *) CFG_IMMR;
+ u32 pci_sync_in;
+- u8 spmf;
+- u8 clkin_div;
++ u8 spmf;
++ u8 clkin_div;
+ u32 sccr;
+ u32 corecnf_tab_index;
+- u8 corepll;
++ u8 corepll;
+ u32 lcrr;
+
+ u32 csb_clk;
++#if defined(CONFIG_MPC8349)
+ u32 tsec1_clk;
+ u32 tsec2_clk;
+- u32 core_clk;
+ u32 usbmph_clk;
+ u32 usbdr_clk;
+- u32 i2c_clk;
++#endif
++ u32 core_clk;
++ u32 i2c1_clk;
++ u32 i2c2_clk;
+ u32 enc_clk;
+ u32 lbiu_clk;
+ u32 lclk_clk;
+ u32 ddr_clk;
++#if defined (CONFIG_MPC8360)
++ u32 qepmf;
++ u32 qepdf;
++ u32 ddr_sec_clk;
++ u32 qe_clk;
++ u32 brg_clk;
++#endif
+
+- if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
+ return -1;
+
+-#ifndef CFG_HRCW_HIGH
+-# error "CFG_HRCW_HIGH must be defined in board config file"
+-#endif /* CFG_HCWD_HIGH */
+-
+-#if (CFG_HRCW_HIGH & HRCWH_PCI_HOST)
+-
+-# ifndef CONFIG_83XX_CLKIN
+-# error "In PCI Host Mode, CONFIG_83XX_CLKIN must be defined in board config file"
+-# endif /* CONFIG_83XX_CLKIN */
+-# ifdef CONFIG_83XX_PCICLK
+-# warning "In PCI Host Mode, CONFIG_83XX_PCICLK in board config file is igonred"
+-# endif /* CONFIG_83XX_PCICLK */
+-
+- /* PCI Host Mode */
+- if (!(im->reset.rcwh & RCWH_PCIHOST)) {
+- /* though RCWH_PCIHOST is defined in CFG_HRCW_HIGH
+- * the im->reset.rcwhr PCI Host Mode is disabled
+- * FIXME: findout if there is a way to issue some warning */
+- return -2;
+- }
+- if (im->clk.spmr & SPMR_CKID) {
+- /* PCI Clock is half CONFIG_83XX_CLKIN */
+- pci_sync_in = CONFIG_83XX_CLKIN / 2;
+- }
+- else {
+- pci_sync_in = CONFIG_83XX_CLKIN;
+- }
+-
+-#else /* (CFG_HRCW_HIGH & HRCWH_PCI_HOST) */
++ clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT);
+
+-# ifdef CONFIG_83XX_CLKIN
+-# warning "In PCI Agent Mode, CONFIG_83XX_CLKIN in board config file is igonred"
+-# endif /* CONFIG_83XX_CLKIN */
+-# ifndef CONFIG_83XX_PCICLK
+-# error "In PCI Agent Mode, CONFIG_83XX_PCICLK must be defined in board config file"
+-# endif /* CONFIG_83XX_PCICLK */
+-
+- /* PCI Agent Mode */
+- if (im->reset.rcwh & RCWH_PCIHOST) {
+- /* though RCWH_PCIHOST is not defined in CFG_HRCW_HIGH
+- * the im->reset.rcwhr PCI Host Mode is enabled */
+- return -3;
++ if (im->reset.rcwh & HRCWH_PCI_HOST) {
++#if defined(CONFIG_83XX_CLKIN)
++ pci_sync_in = CONFIG_83XX_CLKIN / (1 + clkin_div);
++#else
++ pci_sync_in = 0xDEADBEEF;
++#endif
++ } else {
++#if defined(CONFIG_83XX_PCICLK)
++ pci_sync_in = CONFIG_83XX_PCICLK;
++#else
++ pci_sync_in = 0xDEADBEEF;
++#endif
+ }
+- pci_sync_in = CONFIG_83XX_PCICLK;
+
+-#endif /* (CFG_HRCW_HIGH | RCWH_PCIHOST) */
+-
+- /* we have up to date pci_sync_in */
+ spmf = ((im->reset.rcwl & RCWL_SPMF) >> RCWL_SPMF_SHIFT);
+- clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT);
+-
+- if ((im->reset.rcwl & RCWL_LBIUCM) || (im->reset.rcwl & RCWL_DDRCM)) {
+- csb_clk = (pci_sync_in * spmf * (1 + clkin_div)) / 2;
+- }
+- else {
+- csb_clk = pci_sync_in * spmf * (1 + clkin_div);
+- }
++ csb_clk = pci_sync_in * (1 + clkin_div) * spmf;
+
+ sccr = im->clk.sccr;
++
++#if defined(CONFIG_MPC8349)
+ switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {
+ case 0:
+ tsec1_clk = 0;
+@@ -212,25 +180,8 @@ int get_clocks (void)
+ /* unkown SCCR_TSEC2CM value */
+ return -5;
+ }
+- i2c_clk = tsec2_clk;
+
+- switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) {
+- case 0:
+- enc_clk = 0;
+- break;
+- case 1:
+- enc_clk = csb_clk;
+- break;
+- case 2:
+- enc_clk = csb_clk / 2;
+- break;
+- case 3:
+- enc_clk = csb_clk / 3;
+- break;
+- default:
+- /* unkown SCCR_ENCCM value */
+- return -6;
+- }
++ i2c1_clk = tsec2_clk;
+
+ switch ((sccr & SCCR_USBMPHCM) >> SCCR_USBMPHCM_SHIFT) {
+ case 0:
+@@ -268,14 +219,42 @@ int get_clocks (void)
+ 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 than USB MPH & USB DR must have the same rate */
++ 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
++ * USB MPH & USB DR must have the same rate
++ */
+ return -9;
+ }
++#endif
++#if defined (CONFIG_MPC8360)
++ i2c1_clk = csb_clk;
++#endif
++ i2c2_clk = csb_clk; /* i2c-2 clk is equal to csb clk */
+
+- lbiu_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT));
++ switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) {
++ case 0:
++ enc_clk = 0;
++ break;
++ case 1:
++ enc_clk = csb_clk;
++ break;
++ case 2:
++ enc_clk = csb_clk / 2;
++ break;
++ case 3:
++ enc_clk = csb_clk / 3;
++ break;
++ default:
++ /* 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
+ lcrr = (im->lbus.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT;
+ switch (lcrr) {
+ case 2:
+@@ -287,12 +266,20 @@ int get_clocks (void)
+ /* unknown lcrr */
+ return -10;
+ }
+-
+- ddr_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT));
+-
++#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)
++ ddr_sec_clk = csb_clk * (1 +
++ ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT));
++#endif
++#else
++#error Unknown MPC83xx chip
++#endif
++
+ corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5);
+- if (corecnf_tab_index > (sizeof(corecnf_tab)/sizeof(corecnf_t)) ) {
++ if (corecnf_tab_index > (sizeof(corecnf_tab) / sizeof(corecnf_t))) {
+ /* corecnf_tab_index is too high, possibly worng value */
+ return -11;
+ }
+@@ -309,7 +296,7 @@ int get_clocks (void)
+ core_clk = 2 * csb_clk;
+ break;
+ case _2_5x:
+- core_clk = ( 5 * csb_clk) / 2;
++ core_clk = (5 * csb_clk) / 2;
+ break;
+ case _3x:
+ core_clk = 3 * csb_clk;
+@@ -319,46 +306,69 @@ int get_clocks (void)
+ return -12;
+ }
+
+- gd->csb_clk = csb_clk ;
+- gd->tsec1_clk = tsec1_clk ;
+- gd->tsec2_clk = tsec2_clk ;
+- gd->core_clk = core_clk ;
++#if defined (CONFIG_MPC8360)
++ qepmf = (im->reset.rcwl & RCWL_CEPMF) >> RCWL_CEPMF_SHIFT;
++ qepdf = (im->reset.rcwl & RCWL_CEPDF) >> RCWL_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)
++ gd->tsec1_clk = tsec1_clk;
++ gd->tsec2_clk = tsec2_clk;
+ gd->usbmph_clk = usbmph_clk;
+- gd->usbdr_clk = usbdr_clk ;
+- gd->i2c_clk = i2c_clk ;
+- gd->enc_clk = enc_clk ;
+- gd->lbiu_clk = lbiu_clk ;
+- gd->lclk_clk = lclk_clk ;
+- gd->ddr_clk = ddr_clk ;
+- gd->pci_clk = pci_sync_in;
+-
++ gd->usbdr_clk = usbdr_clk;
++#endif
++ gd->core_clk = core_clk;
++ gd->i2c1_clk = i2c1_clk;
++ gd->i2c2_clk = i2c2_clk;
++ gd->enc_clk = enc_clk;
++ gd->lbiu_clk = lbiu_clk;
++ gd->lclk_clk = lclk_clk;
++ gd->ddr_clk = ddr_clk;
++#if defined (CONFIG_MPC8360)
++ gd->ddr_sec_clk = ddr_sec_clk;
++ gd->qe_clk = qe_clk;
++ gd->brg_clk = brg_clk;
++#endif
+ gd->cpu_clk = gd->core_clk;
+- gd->bus_clk = gd->lbiu_clk;
++ gd->bus_clk = gd->csb_clk;
+ return 0;
++
+ }
+
+ /********************************************
+ * get_bus_freq
+ * return system bus freq in Hz
+ *********************************************/
+-ulong get_bus_freq (ulong dummy)
++ulong get_bus_freq(ulong dummy)
+ {
+ return gd->csb_clk;
+ }
+
+-int print_clock_conf (void)
++int print_clock_conf(void)
+ {
+ printf("Clock configuration:\n");
+- printf(" Coherent System Bus: %4d MHz\n",gd->csb_clk/1000000);
+- printf(" Core: %4d MHz\n",gd->core_clk/1000000);
+- debug(" Local Bus Controller:%4d MHz\n",gd->lbiu_clk/1000000);
+- printf(" Local Bus: %4d MHz\n",gd->lclk_clk/1000000);
+- debug(" DDR: %4d MHz\n",gd->ddr_clk/1000000);
+- debug(" I2C: %4d MHz\n",gd->i2c_clk/1000000);
+- debug(" TSEC1: %4d MHz\n",gd->tsec1_clk/1000000);
+- debug(" TSEC2: %4d MHz\n",gd->tsec2_clk/1000000);
+- debug(" USB MPH: %4d MHz\n",gd->usbmph_clk/1000000);
+- debug(" USB DR: %4d MHz\n",gd->usbdr_clk/1000000);
+-
++ 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(" QE: %4d MHz\n", gd->qe_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)
++ 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);
++ printf(" I2C2: %4d MHz\n", gd->i2c2_clk / 1000000);
++#if defined(CONFIG_MPC8349)
++ 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
+ return 0;
+ }
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/start.S u-boot-1.1.6-fsl-1/cpu/mpc83xx/start.S
+--- u-boot-1.1.6/cpu/mpc83xx/start.S 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/start.S 2006-11-10 11:24:29.000000000 -0600
+@@ -2,7 +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 2004 Freescale Semiconductor, Inc.
++ * Copyright Freescale Semiconductor, Inc. 2004, 2006. All rights reserved.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -104,9 +104,9 @@ version_string:
+ #ifndef CONFIG_DEFAULT_IMMR
+ #error CONFIG_DEFAULT_IMMR must be defined
+ #endif /* CFG_DEFAULT_IMMR */
+-#ifndef CFG_IMMRBAR
+-#define CFG_IMMRBAR CONFIG_DEFAULT_IMMR
+-#endif /* CFG_IMMRBAR */
++#ifndef CFG_IMMR
++#define CFG_IMMR CONFIG_DEFAULT_IMMR
++#endif /* CFG_IMMR */
+
+ /*
+ * After configuration, a system reset exception is executed using the
+@@ -152,8 +152,8 @@ boot_cold: /* time t 3 */
+ nop
+ boot_warm: /* time t 5 */
+ mfmsr r5 /* save msr contents */
+- lis r3, CFG_IMMRBAR@h
+- ori r3, r3, CFG_IMMRBAR@l
++ lis r3, CFG_IMMR@h
++ ori r3, r3, CFG_IMMR@l
+ stw r3, IMMRBAR(r4)
+
+ /* Initialise the E300 processor core */
+@@ -226,7 +226,7 @@ in_flash:
+ GET_GOT /* initialize GOT access */
+
+ /* r3: IMMR */
+- lis r3, CFG_IMMRBAR@h
++ lis r3, CFG_IMMR@h
+ /* run low-level CPU init code (in Flash)*/
+ bl cpu_init_f
+
+@@ -446,7 +446,7 @@ init_e300_core: /* time t 10 */
+ mtspr SRR1, r3 /* Make SRR1 match MSR */
+
+
+- lis r3, CFG_IMMRBAR@h
++ lis r3, CFG_IMMR@h
+ #if defined(CONFIG_WATCHDOG)
+ /* Initialise the Wathcdog values and reset it (if req) */
+ /*------------------------------------------------------*/
+@@ -870,6 +870,18 @@ ppcDcbz:
+ dcbz r0,r3
+ blr
+
++ .globl ppcDWstore
++ppcDWstore:
++ lfd 1, 0(r4)
++ stfd 1, 0(r3)
++ blr
++
++ .globl ppcDWload
++ppcDWload:
++ lfd 1, 0(r3)
++ stfd 1, 0(r4)
++ blr
++
+ /*-------------------------------------------------------------------*/
+
+ /*
+@@ -1189,7 +1201,7 @@ map_flash_by_law1:
+ /* When booting from ROM (Flash or EPROM), clear the */
+ /* Address Mask in OR0 so ROM appears everywhere */
+ /*----------------------------------------------------*/
+- lis r3, (CFG_IMMRBAR)@h /* r3 <= CFG_IMMRBAR */
++ lis r3, (CFG_IMMR)@h /* r3 <= CFG_IMMR */
+ lwz r4, OR0@l(r3)
+ li r5, 0x7fff /* r5 <= 0x00007FFFF */
+ and r4, r4, r5
+@@ -1214,8 +1226,15 @@ map_flash_by_law1:
+ lis r4, (CFG_FLASH_BASE)@h
+ ori r4, r4, (CFG_FLASH_BASE)@l
+ stw r4, LBLAWBAR1(r3) /* LBLAWBAR1 <= CFG_FLASH_BASE */
+- lis r4, (0x80000016)@h
+- ori r4, r4, (0x80000016)@l
++
++ /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR1 */
++ lis r4, (0x80000012)@h
++ ori r4, r4, (0x80000012)@l
++ li r5, CFG_FLASH_SIZE
++1: srawi. r5, r5, 1 /* r5 = r5 >> 1 */
++ addi r4, r4, 1
++ bne 1b
++
+ stw r4, LBLAWAR1(r3) /* LBLAWAR1 <= 8MB Flash Size */
+ blr
+
+@@ -1234,17 +1253,23 @@ remap_flash_by_law0:
+ stw r5, BR0(r3) /* r5 <= (CFG_FLASH_BASE & 0xFFFF8000) | (BR0 & 0x00007FFF) */
+
+ lwz r4, OR0(r3)
+- lis r5, 0xFF80 /* 8M */
++ lis r5, ~((CFG_FLASH_SIZE << 4) - 1)
+ or r4, r4, r5
+- stw r4, OR0(r3) /* OR0 <= OR0 | 0xFF800000 */
++ stw r4, OR0(r3)
+
+ lis r4, (CFG_FLASH_BASE)@h
+ ori r4, r4, (CFG_FLASH_BASE)@l
+ stw r4, LBLAWBAR0(r3) /* LBLAWBAR0 <= CFG_FLASH_BASE */
+
+- lis r4, (0x80000016)@h
+- ori r4, r4, (0x80000016)@l
+- stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= 8MB Flash Size */
++ /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR0 */
++ lis r4, (0x80000012)@h
++ ori r4, r4, (0x80000012)@l
++ li r5, CFG_FLASH_SIZE
++1: srawi. r5, r5, 1 /* r5 = r5 >> 1 */
++ addi r4, r4, 1
++ bne 1b
++ stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= Flash Size */
++
+
+ xor r4, r4, r4
+ stw r4, LBLAWBAR1(r3)
+diff -Naupr u-boot-1.1.6/cpu/mpc83xx/traps.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/traps.c
+--- u-boot-1.1.6/cpu/mpc83xx/traps.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/traps.c 2006-11-30 12:34:13.000000000 -0600
+@@ -1,5 +1,8 @@
+ /*
+- * linux/arch/ppc/kernel/traps.c
++ * (C) Copyright 2000
++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
++ *
++ * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+@@ -15,19 +18,6 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+- *
+- * Change log:
+- *
+- * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+- *
+- * Modified by Cort Dougan (cort@cs.nmt.edu)
+- * and Paul Mackerras (paulus@cs.anu.edu.au)
+- *
+- * (C) Copyright 2000
+- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+- *
+- * 20050101: Eran Liberty (liberty@freescale.com)
+- * Initial file creating (porting from 85XX & 8260)
+ */
+
+ /*
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/405gp_pci.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/405gp_pci.c
+--- u-boot-1.1.6/cpu/ppc4xx/405gp_pci.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/405gp_pci.c 2006-11-30 12:34:13.000000000 -0600
+@@ -475,7 +475,11 @@ void pci_440_init (struct pci_controller
+ pci_set_region(hose->regions + reg_num++,
+ CFG_PCI_TARGBASE,
+ CFG_PCI_MEMBASE,
++#ifdef CFG_PCI_MEMSIZE
++ CFG_PCI_MEMSIZE,
++#else
+ 0x10000000,
++#endif
+ PCI_REGION_MEM );
+
+ #if defined(CONFIG_PCI_SYS_MEM_BUS) && defined(CONFIG_PCI_SYS_MEM_PHYS) && \
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/4xx_enet.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/4xx_enet.c
+--- u-boot-1.1.6/cpu/ppc4xx/4xx_enet.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/4xx_enet.c 2006-11-30 12:34:13.000000000 -0600
+@@ -264,10 +264,10 @@ int ppc_4xx_eth_setup_bridge(int devnum,
+ bis->bi_phymode[3] = BI_PHYMODE_ZMII;
+ break;
+ case 2:
+- zmiifer = ZMII_FER_SMII << ZMII_FER_V(0);
+- zmiifer = ZMII_FER_SMII << ZMII_FER_V(1);
+- zmiifer = ZMII_FER_SMII << ZMII_FER_V(2);
+- zmiifer = ZMII_FER_SMII << ZMII_FER_V(3);
++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0);
++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1);
++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(2);
++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(3);
+ bis->bi_phymode[0] = BI_PHYMODE_ZMII;
+ bis->bi_phymode[1] = BI_PHYMODE_ZMII;
+ bis->bi_phymode[2] = BI_PHYMODE_ZMII;
+@@ -470,8 +470,7 @@ static int ppc_4xx_eth_init (struct eth_
+ #else
+ if ((devnum == 0) || (devnum == 1)) {
+ out32 (ZMII_FER, (ZMII_FER_SMII | ZMII_FER_MDI) << ZMII_FER_V (devnum));
+- }
+- else { /* ((devnum == 2) || (devnum == 3)) */
++ } else { /* ((devnum == 2) || (devnum == 3)) */
+ out32 (ZMII_FER, ZMII_FER_MDI << ZMII_FER_V (devnum));
+ out32 (RGMII_FER, ((RGMII_FER_RGMII << RGMII_FER_V (2)) |
+ (RGMII_FER_RGMII << RGMII_FER_V (3))));
+@@ -561,22 +560,7 @@ static int ppc_4xx_eth_init (struct eth_
+ * otherwise, just check the speeds & feeds
+ */
+ if (hw_p->first_init == 0) {
+-#if defined(CONFIG_88E1111_CLK_DELAY)
+- /*
+- * On some boards (e.g. ALPR) the Marvell 88E1111 PHY needs
+- * the "RGMII transmit timing control" and "RGMII receive
+- * timing control" bits set, so that Gbit communication works
+- * without problems.
+- * Also set the "Transmitter disable" to 1 to enable the
+- * transmitter.
+- * After setting these bits a soft-reset must occur for this
+- * change to become active.
+- */
+- miiphy_read (dev->name, reg, 0x14, &reg_short);
+- reg_short |= (1 << 7) | (1 << 1) | (1 << 0);
+- miiphy_write (dev->name, reg, 0x14, reg_short);
+-#endif
+-#if defined(CONFIG_M88E1111_PHY) /* test-only: merge with CONFIG_88E1111_CLK_DELAY !!! */
++#if defined(CONFIG_M88E1111_PHY)
+ miiphy_write (dev->name, reg, 0x14, 0x0ce3);
+ miiphy_write (dev->name, reg, 0x18, 0x4101);
+ miiphy_write (dev->name, reg, 0x09, 0x0e00);
+@@ -808,7 +792,7 @@ static int ppc_4xx_eth_init (struct eth_
+ hw_p->rx[i].ctrl |= MAL_RX_CTRL_EMPTY | MAL_RX_CTRL_INTR;
+ hw_p->rx_ready[i] = -1;
+ #if 0
+- printf ("RX_BUFF %d @ 0x%08lx\n", i, (ulong) rx[i].data_ptr);
++ printf ("RX_BUFF %d @ 0x%08lx\n", i, (ulong) hw_p->rx[i].data_ptr);
+ #endif
+ }
+
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/cpu.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu.c
+--- u-boot-1.1.6/cpu/ppc4xx/cpu.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu.c 2006-12-06 10:33:49.000000000 -0600
+@@ -41,6 +41,10 @@
+ DECLARE_GLOBAL_DATA_PTR;
+ #endif
+
++#if defined(CONFIG_BOARD_RESET)
++void board_reset(void);
++#endif
++
+ #if defined(CONFIG_440)
+ #define FREQ_EBC (sys_info.freqEPB)
+ #else
+@@ -336,6 +340,10 @@ int checkcpu (void)
+ puts("SP Rev. B");
+ break;
+
++ case PVR_440SP_RC:
++ puts("SP Rev. C");
++ break;
++
+ case PVR_440SPe_RA:
+ puts("SPe Rev. A");
+ break;
+@@ -422,23 +430,19 @@ int ppc440spe_revB() {
+
+ int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+ {
+-#if defined(CONFIG_YOSEMITE) || defined(CONFIG_YELLOWSTONE)
+- /*give reset to BCSR*/
+- *(unsigned char*)(CFG_BCSR_BASE | 0x06) = 0x09;
+-
++#if defined(CONFIG_BOARD_RESET)
++ board_reset();
++#else
++#if defined(CFG_4xx_RESET_TYPE)
++ mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
+ #else
+-
+ /*
+ * Initiate system reset in debug control register DBCR
+ */
+- __asm__ __volatile__("lis 3, 0x3000" ::: "r3");
+-#if defined(CONFIG_440)
+- __asm__ __volatile__("mtspr 0x134, 3");
+-#else
+- __asm__ __volatile__("mtspr 0x3f2, 3");
+-#endif
++ mtspr(dbcr0, 0x30000000);
++#endif /* defined(CFG_4xx_RESET_TYPE) */
++#endif /* defined(CONFIG_BOARD_RESET) */
+
+-#endif/* defined(CONFIG_YOSEMITE) || defined(CONFIG_YELLOWSTONE)*/
+ return 1;
+ }
+
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu_init.c
+--- u-boot-1.1.6/cpu/ppc4xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu_init.c 2006-11-30 12:34:13.000000000 -0600
+@@ -321,6 +321,10 @@ cpu_init_f (void)
+ #else
+ val |= 0xf0000000; /* generate system reset after 2.684 seconds */
+ #endif
++#if defined(CFG_4xx_RESET_TYPE)
++ val &= ~0x30000000; /* clear WRC bits */
++ val |= CFG_4xx_RESET_TYPE << 28; /* set board specific WRC type */
++#endif
+ mtspr(tcr, val);
+
+ val = mfspr(tsr);
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/sdram.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/sdram.c
+--- u-boot-1.1.6/cpu/ppc4xx/sdram.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/sdram.c 2006-11-30 12:34:13.000000000 -0600
+@@ -351,6 +351,14 @@ long int initdram(int board_type)
+ int i;
+ int tr1_bank1;
+
++#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_440SP)
++ /*
++ * Soft-reset SDRAM controller.
++ */
++ mtsdr(sdr_srst, SDR0_SRST_DMC);
++ mtsdr(sdr_srst, 0x00000000);
++#endif
++
+ for (i=0; i<N_MB0CF; i++) {
+ /*
+ * Disable memory controller.
+diff -Naupr u-boot-1.1.6/cpu/ppc4xx/start.S u-boot-1.1.6-fsl-1/cpu/ppc4xx/start.S
+--- u-boot-1.1.6/cpu/ppc4xx/start.S 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/start.S 2006-11-30 12:34:13.000000000 -0600
+@@ -204,6 +204,18 @@ _start_440:
+ mfspr r1,mcsr
+ mtspr mcsr,r1
+ #endif
++
++ /*----------------------------------------------------------------*/
++ /* CCR0 init */
++ /*----------------------------------------------------------------*/
++ /* Disable store gathering & broadcast, guarantee inst/data
++ * cache block touch, force load/store alignment
++ * (see errata 1.12: 440_33)
++ */
++ lis r1,0x0030 /* store gathering & broadcast disable */
++ ori r1,r1,0x6000 /* cache touch */
++ mtspr ccr0,r1
++
+ /*----------------------------------------------------------------*/
+ /* Initialize debug */
+ /*----------------------------------------------------------------*/
+@@ -225,17 +237,6 @@ _start_440:
+ mtspr dbsr,r1 /* Clear all valid bits */
+ skip_debug_init:
+
+- /*----------------------------------------------------------------*/
+- /* CCR0 init */
+- /*----------------------------------------------------------------*/
+- /* Disable store gathering & broadcast, guarantee inst/data
+- * cache block touch, force load/store alignment
+- * (see errata 1.12: 440_33)
+- */
+- lis r1,0x0030 /* store gathering & broadcast disable */
+- ori r1,r1,0x6000 /* cache touch */
+- mtspr ccr0,r1
+-
+ #if defined (CONFIG_440SPE)
+ /*----------------------------------------------------------------+
+ | Initialize Core Configuration Reg1.
+diff -Naupr u-boot-1.1.6/CREDITS u-boot-1.1.6-fsl-1/CREDITS
+--- u-boot-1.1.6/CREDITS 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/CREDITS 2006-11-10 11:24:28.000000000 -0600
+@@ -465,3 +465,8 @@ N: James MacAulay
+ E: james.macaulay@amirix.com
+ D: Suppport for Amirix AP1000
+ W: www.amirix.com
++
++N: Timur Tabi
++E: timur@freescale.com
++D: Support for MPC8349E-mITX
++W: www.freescale.com
+diff -Naupr u-boot-1.1.6/doc/README.mpc8360emds u-boot-1.1.6-fsl-1/doc/README.mpc8360emds
+--- u-boot-1.1.6/doc/README.mpc8360emds 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/doc/README.mpc8360emds 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,126 @@
++Freescale MPC8360EMDS Board
++-----------------------------------------
++1. Board Switches and Jumpers
++1.0 There are four Dual-In-Line Packages(DIP) Switches on MPC8360EMDS 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
++
++ SW18 is switch 18 as silk-screened onto the board.
++ SW4[8] is the bit labled 8 on Switch 4.
++ SW2[1:6] refers to bits labeled 1 through 6 in order on switch 2.
++ SW3[7:1] refers to bits labeled 7 through 1 in order on switch 3.
++ SW3[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 MPC8360E PB 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_0100 (HRCW setting value is performed on local bus)
++ SW4[1-8]= 0011_0000 (Flash boot on local bus)
++ SW9[1-8]= 0110_0110 (PCI Mode enabled. HRCW is read from FLASH)
++ SW10[1-8]= 0000_1000 (core PLL setting)
++ SW11[1-8]= 0000_0100 (SW11 is on the another side of the board)
++ JP6 1-2
++ 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
++ 0xf000_0000 0xf3ff_ffff Local Bus SDRAM 64M
++ 0xf400_0000 0xf7ff_ffff Empty 64M
++ 0xf800_0000 0xf800_7fff BCSR on CS1 32K
++ 0xf800_8000 0xf800_ffff PIB CS4 32K
++ 0xf801_0000 0xf801_7fff PIB CS5 32K
++ 0xfe00_0000 0xfeff_ffff FLASH on CS0 16M
++
++
++3. Definitions
++
++3.1 Explanation of NEW definitions in:
++
++ include/configs/MPC8360EMDS.h
++
++ CONFIG_MPC83XX MPC83xx family for both MPC8349 and MPC8360
++ CONFIG_MPC8360 MPC8360 specific
++ CONFIG_MPC8360EMDS MPC8360EMDS board specific
++
++4. Compilation
++
++ Assuming you're using BASH shell:
++
++ export CROSS_COMPILE=your-cross-compile-prefix
++ cd u-boot
++ make distclean
++ make MPC8360EMDS_config
++ make
++
++ MPC8360 support PCI in host and slave mode.
++
++ To make u-boot support PCI host 66M :
++ 1) DIP SW support PCI mode as described in Section 1.1.
++ 2) Make MPC8360EMDS_HOST_66_config
++
++ To make u-boot support PCI host 33M :
++ 1) DIP SW setting is similar as Section 1.1, except for SW3[4] is 1
++ 2) Make MPC8360EMDS_HOST_33_config
++
++ To make u-boot support PCI slave 66M :
++ 1) DIP SW setting is similar as Section 1.1, except for SW9[3] is 1
++ 2) Make MPC8360EMDS_SLAVE_config
++
++
++5. Downloading and Flashing Images
++
++5.0 Download over serial line using Kermit:
++
++ loadb
++ [Drop to kermit:
++ ^\c
++ send <u-boot-bin-image>
++ c
++ ]
++
++
++ Or via tftp:
++
++ tftp 10000 u-boot.bin
++
++5.1 Reflash U-boot Image using U-boot
++
++ tftp 20000 u-boot.bin
++ protect off fef00000 fef3ffff
++ erase fef00000 fef3ffff
++
++ cp.b 20000 fef00000 xxxx
++
++ or
++
++ cp.b 20000 fef00000 3ffff
++
++
++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 MPC8360EMDS is 115200bps.
+diff -Naupr u-boot-1.1.6/drivers/cfi_flash.c u-boot-1.1.6-fsl-1/drivers/cfi_flash.c
+--- u-boot-1.1.6/drivers/cfi_flash.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/cfi_flash.c 2006-11-30 12:34:13.000000000 -0600
+@@ -4,11 +4,12 @@
+ *
+ * Copyright (C) 2003 Arabella Software Ltd.
+ * Yuli Barcohen <yuli@arabellasw.com>
+- * Modified to work with AMD flashes
+ *
+ * Copyright (C) 2004
+ * Ed Okerson
+- * Modified to work with little-endian systems.
++ *
++ * Copyright (C) 2006
++ * Tolunay Orkun <listmember@orkun.us>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -28,17 +29,6 @@
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+- * History
+- * 01/20/2004 - combined variants of original driver.
+- * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+- * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+- * 01/27/2004 - Little endian support Ed Okerson
+- *
+- * Tested Architectures
+- * Port Width Chip Width # of banks Flash Chip Board
+- * 32 16 1 28F128J3 seranoa/eagle
+- * 64 16 1 28F128J3 seranoa/falcon
+- *
+ */
+
+ /* The DEBUG define must be before common to enable debugging */
+@@ -54,21 +44,16 @@
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+- * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
++ * AMD CFI Specification, Release 2.0 December 1, 2001
++ * AMD/Spansion Application Note: Migration from Single-byte to Three-byte
++ * Device IDs, Publication Number 25538 Revision A, November 8, 2001
+ *
+- * TODO
+- *
+- * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+- * Table (ALT) to determine if protection is available
+- *
+- * Add support for other command sets Use the PRI and ALT to determine command set
+- * Verify erase and program timeouts.
+ */
+
+ #ifndef CFG_FLASH_BANKS_LIST
+@@ -114,6 +99,10 @@
+ #define AMD_ADDR_START ((info->portwidth == FLASH_CFI_8BIT) ? 0xAAA : 0x555)
+ #define AMD_ADDR_ACK ((info->portwidth == FLASH_CFI_8BIT) ? 0x555 : 0x2AA)
+
++#define FLASH_OFFSET_MANUFACTURER_ID 0x00
++#define FLASH_OFFSET_DEVICE_ID 0x01
++#define FLASH_OFFSET_DEVICE_ID2 0x0E
++#define FLASH_OFFSET_DEVICE_ID3 0x0F
+ #define FLASH_OFFSET_CFI 0x55
+ #define FLASH_OFFSET_CFI_RESP 0x10
+ #define FLASH_OFFSET_PRIMARY_VENDOR 0x13
+@@ -135,25 +124,20 @@
+ #define FLASH_OFFSET_USER_PROTECTION 0x85
+ #define FLASH_OFFSET_INTEL_PROTECTION 0x81
+
+-
+-#define FLASH_MAN_CFI 0x01000000
+-
+-#define CFI_CMDSET_NONE 0
+-#define CFI_CMDSET_INTEL_EXTENDED 1
+-#define CFI_CMDSET_AMD_STANDARD 2
+-#define CFI_CMDSET_INTEL_STANDARD 3
+-#define CFI_CMDSET_AMD_EXTENDED 4
+-#define CFI_CMDSET_MITSU_STANDARD 256
+-#define CFI_CMDSET_MITSU_EXTENDED 257
+-#define CFI_CMDSET_SST 258
+-
++#define CFI_CMDSET_NONE 0
++#define CFI_CMDSET_INTEL_EXTENDED 1
++#define CFI_CMDSET_AMD_STANDARD 2
++#define CFI_CMDSET_INTEL_STANDARD 3
++#define CFI_CMDSET_AMD_EXTENDED 4
++#define CFI_CMDSET_MITSU_STANDARD 256
++#define CFI_CMDSET_MITSU_EXTENDED 257
++#define CFI_CMDSET_SST 258
+
+ #ifdef CFG_FLASH_CFI_AMD_RESET /* needed for STM_ID_29W320DB on UC100 */
+ # undef FLASH_CMD_RESET
+-# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */
++# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */
+ #endif
+
+-
+ typedef union {
+ unsigned char c;
+ unsigned short w;
+@@ -168,7 +152,7 @@ typedef union {
+ volatile unsigned long long *llp;
+ } cfiptr_t;
+
+-#define NUM_ERASE_REGIONS 4
++#define NUM_ERASE_REGIONS 4 /* max. number of erase regions */
+
+ /* use CFG_MAX_FLASH_BANKS_DETECT if defined */
+ #ifdef CFG_MAX_FLASH_BANKS_DETECT
+@@ -200,6 +184,7 @@ static void flash_unlock_seq (flash_info
+ static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+ static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+ static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
++static void flash_read_jedec_ids (flash_info_t * info);
+ static int flash_detect_cfi (flash_info_t * info);
+ static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword);
+ static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
+@@ -307,7 +292,7 @@ ushort flash_read_ushort (flash_info_t *
+ }
+
+ /*-----------------------------------------------------------------------
+- * read a long word by picking the least significant byte of each maiximum
++ * read a long word by picking the least significant byte of each maximum
+ * port size word. Swap for ppc format.
+ */
+ ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
+@@ -529,14 +514,42 @@ void flash_print_info (flash_info_t * in
+ (info->portwidth << 3), (info->chipwidth << 3));
+ printf (" Size: %ld MB in %d Sectors\n",
+ info->size >> 20, info->sector_count);
+- printf (" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n",
++ printf (" ");
++ switch (info->vendor) {
++ case CFI_CMDSET_INTEL_STANDARD:
++ printf ("Intel Standard");
++ break;
++ case CFI_CMDSET_INTEL_EXTENDED:
++ printf ("Intel Extended");
++ break;
++ case CFI_CMDSET_AMD_STANDARD:
++ printf ("AMD Standard");
++ break;
++ case CFI_CMDSET_AMD_EXTENDED:
++ printf ("AMD Extended");
++ break;
++ default:
++ printf ("Unknown (%d)", info->vendor);
++ break;
++ }
++ printf (" command set, Manufacturer ID: 0x%02X, Device ID: 0x%02X",
++ info->manufacturer_id, info->device_id);
++ if (info->device_id == 0x7E) {
++ printf("%04X", info->device_id2);
++ }
++ printf ("\n Erase timeout: %ld ms, write timeout: %ld ms\n",
+ info->erase_blk_tout,
+- info->write_tout,
++ info->write_tout);
++ if (info->buffer_size > 1) {
++ printf (" Buffer write timeout: %ld ms, buffer size: %d bytes\n",
+ info->buffer_write_tout,
+ info->buffer_size);
++ }
+
+- puts (" Sector Start Addresses:");
++ puts ("\n Sector Start Addresses:");
+ for (i = 0; i < info->sector_count; ++i) {
++ if ((i % 5) == 0)
++ printf ("\n");
+ #ifdef CFG_FLASH_EMPTY_INFO
+ int k;
+ int size;
+@@ -560,18 +573,15 @@ void flash_print_info (flash_info_t * in
+ }
+ }
+
+- if ((i % 5) == 0)
+- printf ("\n");
+ /* print empty and read-only info */
+- printf (" %08lX%s%s",
++ printf (" %08lX %c %s ",
+ info->start[i],
+- erased ? " E" : " ",
+- info->protect[i] ? "RO " : " ");
++ erased ? 'E' : ' ',
++ info->protect[i] ? "RO" : " ");
+ #else /* ! CFG_FLASH_EMPTY_INFO */
+- if ((i % 5) == 0)
+- printf ("\n ");
+- printf (" %08lX%s",
+- info->start[i], info->protect[i] ? " (RO)" : " ");
++ printf (" %08lX %s ",
++ info->start[i],
++ info->protect[i] ? "RO" : " ");
+ #endif
+ }
+ putc ('\n');
+@@ -1071,6 +1081,55 @@ static int flash_toggle (flash_info_t *
+ }
+
+ /*-----------------------------------------------------------------------
++ * read jedec ids from device and set corresponding fields in info struct
++ *
++ * Note: assume cfi->vendor, cfi->portwidth and cfi->chipwidth are correct
++ *
++*/
++static void flash_read_jedec_ids (flash_info_t * info)
++{
++ info->manufacturer_id = 0;
++ info->device_id = 0;
++ info->device_id2 = 0;
++
++ switch (info->vendor) {
++ case CFI_CMDSET_INTEL_STANDARD:
++ case CFI_CMDSET_INTEL_EXTENDED:
++ flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
++ flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID);
++ udelay(1000); /* some flash are slow to respond */
++ info->manufacturer_id = flash_read_uchar (info,
++ FLASH_OFFSET_MANUFACTURER_ID);
++ info->device_id = flash_read_uchar (info,
++ FLASH_OFFSET_DEVICE_ID);
++ flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
++ break;
++ case CFI_CMDSET_AMD_STANDARD:
++ case CFI_CMDSET_AMD_EXTENDED:
++ flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
++ flash_unlock_seq(info, 0);
++ flash_write_cmd(info, 0, AMD_ADDR_START, FLASH_CMD_READ_ID);
++ udelay(1000); /* some flash are slow to respond */
++ info->manufacturer_id = flash_read_uchar (info,
++ FLASH_OFFSET_MANUFACTURER_ID);
++ info->device_id = flash_read_uchar (info,
++ FLASH_OFFSET_DEVICE_ID);
++ if (info->device_id == 0x7E) {
++ /* AMD 3-byte (expanded) device ids */
++ info->device_id2 = flash_read_uchar (info,
++ FLASH_OFFSET_DEVICE_ID2);
++ info->device_id2 <<= 8;
++ info->device_id2 |= flash_read_uchar (info,
++ FLASH_OFFSET_DEVICE_ID3);
++ }
++ flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
++ break;
++ default:
++ break;
++ }
++}
++
++/*-----------------------------------------------------------------------
+ * detect if flash is compatible with the Common Flash Interface (CFI)
+ * http://www.jedec.org/download/search/jesd68.pdf
+ *
+@@ -1120,15 +1179,31 @@ ulong flash_get_size (ulong base, int ba
+ uchar num_erase_regions;
+ int erase_region_size;
+ int erase_region_count;
++ int geometry_reversed = 0;
++
++ info->ext_addr = 0;
++ info->cfi_version = 0;
+ #ifdef CFG_FLASH_PROTECTION
+- int ext_addr;
+ info->legacy_unlock = 0;
+ #endif
+
+ info->start[0] = base;
+
+ if (flash_detect_cfi (info)) {
+- info->vendor = flash_read_ushort (info, 0, FLASH_OFFSET_PRIMARY_VENDOR);
++ info->vendor = flash_read_ushort (info, 0,
++ FLASH_OFFSET_PRIMARY_VENDOR);
++ flash_read_jedec_ids (info);
++ flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
++ num_erase_regions = flash_read_uchar (info,
++ FLASH_OFFSET_NUM_ERASE_REGIONS);
++ info->ext_addr = flash_read_ushort (info, 0,
++ FLASH_OFFSET_EXT_QUERY_T_P_ADDR);
++ if (info->ext_addr) {
++ info->cfi_version = (ushort) flash_read_uchar (info,
++ info->ext_addr + 3) << 8;
++ info->cfi_version |= (ushort) flash_read_uchar (info,
++ info->ext_addr + 4);
++ }
+ #ifdef DEBUG
+ flash_printqry (info, 0);
+ #endif
+@@ -1139,26 +1214,46 @@ ulong flash_get_size (ulong base, int ba
+ info->cmd_reset = FLASH_CMD_RESET;
+ #ifdef CFG_FLASH_PROTECTION
+ /* read legacy lock/unlock bit from intel flash */
+- ext_addr = flash_read_ushort (info, 0,
+- FLASH_OFFSET_EXT_QUERY_T_P_ADDR);
+- info->legacy_unlock =
+- flash_read_uchar (info, ext_addr + 5) & 0x08;
++ if (info->ext_addr) {
++ info->legacy_unlock = flash_read_uchar (info,
++ info->ext_addr + 5) & 0x08;
++ }
+ #endif
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ info->cmd_reset = AMD_CMD_RESET;
++ /* check if flash geometry needs reversal */
++ if (num_erase_regions <= 1)
++ break;
++ /* reverse geometry if top boot part */
++ if (info->cfi_version < 0x3131) {
++ /* CFI < 1.1, try to guess from device id */
++ if ((info->device_id & 0x80) != 0) {
++ geometry_reversed = 1;
++ }
++ break;
++ }
++ /* CFI >= 1.1, deduct from top/bottom flag */
++ /* note: ext_addr is valid since cfi_version > 0 */
++ if (flash_read_uchar(info, info->ext_addr + 0xf) == 3) {
++ geometry_reversed = 1;
++ }
+ break;
+ }
+
+ debug ("manufacturer is %d\n", info->vendor);
++ debug ("manufacturer id is 0x%x\n", info->manufacturer_id);
++ debug ("device id is 0x%x\n", info->device_id);
++ debug ("device id2 is 0x%x\n", info->device_id2);
++ debug ("cfi version is 0x%04x\n", info->cfi_version);
++
+ size_ratio = info->portwidth / info->chipwidth;
+ /* if the chip is x8/x16 reduce the ratio by half */
+ if ((info->interface == FLASH_CFI_X8X16)
+ && (info->chipwidth == FLASH_CFI_BY8)) {
+ size_ratio >>= 1;
+ }
+- num_erase_regions = flash_read_uchar (info, FLASH_OFFSET_NUM_ERASE_REGIONS);
+ debug ("size_ratio %d port %d bits chip %d bits\n",
+ size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+@@ -1171,7 +1266,12 @@ ulong flash_get_size (ulong base, int ba
+ num_erase_regions, NUM_ERASE_REGIONS);
+ break;
+ }
+- tmp = flash_read_long (info, 0,
++ if (geometry_reversed)
++ tmp = flash_read_long (info, 0,
++ FLASH_OFFSET_ERASE_REGIONS +
++ (num_erase_regions - 1 - i) * 4);
++ else
++ tmp = flash_read_long (info, 0,
+ FLASH_OFFSET_ERASE_REGIONS +
+ i * 4);
+ erase_region_size =
+diff -Naupr u-boot-1.1.6/drivers/fsl_i2c.c u-boot-1.1.6-fsl-1/drivers/fsl_i2c.c
+--- u-boot-1.1.6/drivers/fsl_i2c.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/fsl_i2c.c 2006-11-30 12:34:13.000000000 -0600
+@@ -28,29 +28,52 @@
+ #include <asm/fsl_i2c.h> /* HW definitions */
+
+ #define I2C_TIMEOUT (CFG_HZ / 4)
+-#define I2C ((struct fsl_i2c *)(CFG_IMMR + CFG_I2C_OFFSET))
+
++#define I2C_READ_BIT 1
++#define I2C_WRITE_BIT 0
++
++/* 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
++
++static volatile struct fsl_i2c *i2c_dev[2] = {
++ (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET),
++#ifdef CFG_I2C2_OFFSET
++ (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET)
++#endif
++};
+
+ void
+ i2c_init(int speed, int slaveadd)
+ {
+- /* stop I2C controller */
+- writeb(0x0, &I2C->cr);
+-
+- /* set clock */
+- writeb(0x3f, &I2C->fdr);
+-
+- /* set default filter */
+- writeb(0x10, &I2C->dfsrr);
++ volatile struct fsl_i2c *dev;
+
+- /* write slave address */
+- writeb(slaveadd, &I2C->adr);
++ dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET);
+
+- /* clear status register */
+- writeb(0x0, &I2C->sr);
+-
+- /* start I2C controller */
+- writeb(I2C_CR_MEN, &I2C->cr);
++ writeb(0, &dev->cr); /* stop I2C controller */
++ writeb(0x3F, &dev->fdr); /* set bus speed */
++ writeb(0x3F, &dev->dfsrr); /* set default filter */
++ writeb(slaveadd << 1, &dev->adr); /* write slave address */
++ writeb(0x0, &dev->sr); /* clear status register */
++ writeb(I2C_CR_MEN, &dev->cr); /* start I2C controller */
++
++#ifdef CFG_I2C2_OFFSET
++ dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET);
++
++ writeb(0, &dev->cr); /* stop I2C controller */
++ writeb(0x3F, &dev->fdr); /* set bus speed */
++ writeb(0x3F, &dev->dfsrr); /* set default filter */
++ writeb(slaveadd, &dev->adr); /* write slave address */
++ writeb(0x0, &dev->sr); /* clear status register */
++ writeb(I2C_CR_MEN, &dev->cr); /* start I2C controller */
++#endif /* CFG_I2C2_OFFSET */
+ }
+
+ static __inline__ int
+@@ -58,7 +81,7 @@ i2c_wait4bus(void)
+ {
+ ulong timeval = get_timer(0);
+
+- while (readb(&I2C->sr) & I2C_SR_MBB) {
++ while (readb(&i2c_dev[i2c_bus_num]->sr) & I2C_SR_MBB) {
+ if (get_timer(timeval) > I2C_TIMEOUT) {
+ return -1;
+ }
+@@ -74,11 +97,11 @@ i2c_wait(int write)
+ ulong timeval = get_timer(0);
+
+ do {
+- csr = readb(&I2C->sr);
++ csr = readb(&i2c_dev[i2c_bus_num]->sr);
+ if (!(csr & I2C_SR_MIF))
+ continue;
+
+- writeb(0x0, &I2C->sr);
++ writeb(0x0, &i2c_dev[i2c_bus_num]->sr);
+
+ if (csr & I2C_SR_MAL) {
+ debug("i2c_wait: MAL\n");
+@@ -90,7 +113,7 @@ i2c_wait(int write)
+ return -1;
+ }
+
+- if (write == I2C_WRITE && (csr & I2C_SR_RXAK)) {
++ if (write == I2C_WRITE_BIT && (csr & I2C_SR_RXAK)) {
+ debug("i2c_wait: No RXACK\n");
+ return -1;
+ }
+@@ -107,11 +130,11 @@ i2c_write_addr (u8 dev, u8 dir, int rsta
+ {
+ writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX
+ | (rsta ? I2C_CR_RSTA : 0),
+- &I2C->cr);
++ &i2c_dev[i2c_bus_num]->cr);
+
+- writeb((dev << 1) | dir, &I2C->dr);
++ writeb((dev << 1) | dir, &i2c_dev[i2c_bus_num]->dr);
+
+- if (i2c_wait(I2C_WRITE) < 0)
++ if (i2c_wait(I2C_WRITE_BIT) < 0)
+ return 0;
+
+ return 1;
+@@ -123,12 +146,12 @@ __i2c_write(u8 *data, int length)
+ int i;
+
+ writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX,
+- &I2C->cr);
++ &i2c_dev[i2c_bus_num]->cr);
+
+ for (i = 0; i < length; i++) {
+- writeb(data[i], &I2C->dr);
++ writeb(data[i], &i2c_dev[i2c_bus_num]->dr);
+
+- if (i2c_wait(I2C_WRITE) < 0)
++ if (i2c_wait(I2C_WRITE_BIT) < 0)
+ break;
+ }
+
+@@ -141,25 +164,25 @@ __i2c_read(u8 *data, int length)
+ int i;
+
+ writeb(I2C_CR_MEN | I2C_CR_MSTA | ((length == 1) ? I2C_CR_TXAK : 0),
+- &I2C->cr);
++ &i2c_dev[i2c_bus_num]->cr);
+
+ /* dummy read */
+- readb(&I2C->dr);
++ readb(&i2c_dev[i2c_bus_num]->dr);
+
+ for (i = 0; i < length; i++) {
+- if (i2c_wait(I2C_READ) < 0)
++ if (i2c_wait(I2C_READ_BIT) < 0)
+ break;
+
+ /* Generate ack on last next to last byte */
+ if (i == length - 2)
+ writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_TXAK,
+- &I2C->cr);
++ &i2c_dev[i2c_bus_num]->cr);
+
+ /* Generate stop on last byte */
+ if (i == length - 1)
+- writeb(I2C_CR_MEN | I2C_CR_TXAK, &I2C->cr);
++ writeb(I2C_CR_MEN | I2C_CR_TXAK, &i2c_dev[i2c_bus_num]->cr);
+
+- data[i] = readb(&I2C->dr);
++ data[i] = readb(&i2c_dev[i2c_bus_num]->dr);
+ }
+
+ return i;
+@@ -172,13 +195,13 @@ i2c_read(u8 dev, uint addr, int alen, u8
+ u8 *a = (u8*)&addr;
+
+ if (i2c_wait4bus() >= 0
+- && i2c_write_addr(dev, I2C_WRITE, 0) != 0
++ && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0
+ && __i2c_write(&a[4 - alen], alen) == alen
+- && i2c_write_addr(dev, I2C_READ, 1) != 0) {
++ && i2c_write_addr(dev, I2C_READ_BIT, 1) != 0) {
+ i = __i2c_read(data, length);
+ }
+
+- writeb(I2C_CR_MEN, &I2C->cr);
++ writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr);
+
+ if (i == length)
+ return 0;
+@@ -193,12 +216,12 @@ i2c_write(u8 dev, uint addr, int alen, u
+ u8 *a = (u8*)&addr;
+
+ if (i2c_wait4bus() >= 0
+- && i2c_write_addr(dev, I2C_WRITE, 0) != 0
++ && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0
+ && __i2c_write(&a[4 - alen], alen) == alen) {
+ i = __i2c_write(data, length);
+ }
+
+- writeb(I2C_CR_MEN, &I2C->cr);
++ writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr);
+
+ if (i == length)
+ return 0;
+@@ -237,5 +260,34 @@ i2c_reg_write(uchar i2c_addr, uchar reg,
+ i2c_write(i2c_addr, reg, 1, &val, 1);
+ }
+
++int i2c_set_bus_num(unsigned int bus)
++{
++#ifdef CFG_I2C2_OFFSET
++ if (bus > 1) {
++#else
++ if (bus > 0) {
++#endif
++ return -1;
++ }
++
++ i2c_bus_num = bus;
++
++ return 0;
++}
++
++int i2c_set_bus_speed(unsigned int speed)
++{
++ return -1;
++}
++
++unsigned int i2c_get_bus_num(void)
++{
++ return i2c_bus_num;
++}
++
++unsigned int i2c_get_bus_speed(void)
++{
++ return 0;
++}
+ #endif /* CONFIG_HARD_I2C */
+ #endif /* CONFIG_FSL_I2C */
+diff -Naupr u-boot-1.1.6/drivers/nand/nand_base.c u-boot-1.1.6-fsl-1/drivers/nand/nand_base.c
+--- u-boot-1.1.6/drivers/nand/nand_base.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/nand/nand_base.c 2006-12-06 10:33:49.000000000 -0600
+@@ -838,9 +838,9 @@ static int nand_wait(struct mtd_info *mt
+ unsigned long timeo;
+
+ if (state == FL_ERASING)
+- timeo = CFG_HZ * 400;
++ timeo = (CFG_HZ * 400) / 1000;
+ else
+- timeo = CFG_HZ * 20;
++ timeo = (CFG_HZ * 20) / 1000;
+
+ if ((state == FL_ERASING) && (this->options & NAND_IS_AND))
+ this->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
+@@ -852,8 +852,8 @@ static int nand_wait(struct mtd_info *mt
+ while (1) {
+ if (get_timer(0) > timeo) {
+ printf("Timeout!");
+- return 0;
+- }
++ return 0x01;
++ }
+
+ if (this->dev_ready) {
+ if (this->dev_ready(mtd))
+@@ -1713,6 +1713,7 @@ static int nand_write_ecc (struct mtd_in
+ goto out;
+ }
+ *retlen = written;
++ bufstart = (u_char*) &buf[written];
+
+ ofs = autoplace ? mtd->oobavail : mtd->oobsize;
+ if (eccbuf)
+@@ -2407,7 +2408,9 @@ int nand_scan (struct mtd_info *mtd, int
+ }
+
+ if (!nand_flash_ids[i].name) {
++#ifndef CFG_NAND_QUIET_TEST
+ printk (KERN_WARNING "No NAND device found!!!\n");
++#endif
+ this->select_chip(mtd, -1);
+ return 1;
+ }
+diff -Naupr u-boot-1.1.6/drivers/qe/Makefile u-boot-1.1.6-fsl-1/drivers/qe/Makefile
+--- u-boot-1.1.6/drivers/qe/Makefile 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/Makefile 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,43 @@
++#
++# 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.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public 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)qe.a
++
++COBJS := qe.o uccf.o uec.o uec_phy.o
++
++SRCS := $(COBJS:.o=.c)
++OBJS := $(addprefix $(obj),$(COBJS))
++
++all: $(LIB)
++
++$(LIB): $(obj).depend $(OBJS)
++ $(AR) $(ARFLAGS) $@ $(OBJS)
++
++#########################################################################
++
++include $(SRCTREE)/rules.mk
++
++sinclude $(obj).depend
++
++#########################################################################
+diff -Naupr u-boot-1.1.6/drivers/qe/qe.c u-boot-1.1.6-fsl-1/drivers/qe/qe.c
+--- u-boot-1.1.6/drivers/qe/qe.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/qe.c 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,254 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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/errno.h"
++#include "asm/io.h"
++#include "asm/immap_qe.h"
++#include "qe.h"
++
++#if defined(CONFIG_QE)
++qe_map_t *qe_immr = NULL;
++static qe_snum_t snums[QE_NUM_OF_SNUM];
++
++void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
++{
++ u32 cecr;
++
++ if (cmd == QE_RESET) {
++ out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
++ } else {
++ out_be32(&qe_immr->cp.cecdr, cmd_data);
++ out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
++ ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
++ }
++ /* Wait for the QE_CR_FLG to clear */
++ do {
++ cecr = in_be32(&qe_immr->cp.cecr);
++ } while (cecr & QE_CR_FLG);
++
++ return;
++}
++
++uint qe_muram_alloc(uint size, uint align)
++{
++ DECLARE_GLOBAL_DATA_PTR;
++
++ uint retloc;
++ uint align_mask, off;
++ uint savebase;
++
++ align_mask = align - 1;
++ savebase = gd->mp_alloc_base;
++
++ if ((off = (gd->mp_alloc_base & align_mask)) != 0)
++ gd->mp_alloc_base += (align - off);
++
++ if ((off = size & align_mask) != 0)
++ size += (align - off);
++
++ if ((gd->mp_alloc_base + size) >= gd->mp_alloc_top) {
++ gd->mp_alloc_base = savebase;
++ printf("%s: ran out of ram.\n", __FUNCTION__);
++ }
++
++ retloc = gd->mp_alloc_base;
++ gd->mp_alloc_base += size;
++
++ memset((void *)&qe_immr->muram[retloc], 0, size);
++
++ __asm__ __volatile__("sync");
++
++ return retloc;
++}
++
++void *qe_muram_addr(uint offset)
++{
++ return (void *)&qe_immr->muram[offset];
++}
++
++static void qe_sdma_init(void)
++{
++ volatile sdma_t *p;
++ uint sdma_buffer_base;
++
++ p = (volatile sdma_t *)&qe_immr->sdma;
++
++ /* All of DMA transaction in bus 1 */
++ out_be32(&p->sdaqr, 0);
++ out_be32(&p->sdaqmr, 0);
++
++ /* Allocate 2KB temporary buffer for sdma */
++ sdma_buffer_base = qe_muram_alloc(2048, 64);
++ out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
++
++ /* Clear sdma status */
++ out_be32(&p->sdsr, 0x03000000);
++
++ /* Enable global mode on bus 1, and 2KB buffer size */
++ out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT));
++}
++
++static u8 thread_snum[QE_NUM_OF_SNUM] = {
++ 0x04, 0x05, 0x0c, 0x0d,
++ 0x14, 0x15, 0x1c, 0x1d,
++ 0x24, 0x25, 0x2c, 0x2d,
++ 0x34, 0x35, 0x88, 0x89,
++ 0x98, 0x99, 0xa8, 0xa9,
++ 0xb8, 0xb9, 0xc8, 0xc9,
++ 0xd8, 0xd9, 0xe8, 0xe9
++};
++
++static void qe_snums_init(void)
++{
++ int i;
++
++ for (i = 0; i < QE_NUM_OF_SNUM; i++) {
++ snums[i].state = QE_SNUM_STATE_FREE;
++ snums[i].num = thread_snum[i];
++ }
++}
++
++int qe_get_snum(void)
++{
++ int snum = -EBUSY;
++ int i;
++
++ for (i = 0; i < QE_NUM_OF_SNUM; i++) {
++ if (snums[i].state == QE_SNUM_STATE_FREE) {
++ snums[i].state = QE_SNUM_STATE_USED;
++ snum = snums[i].num;
++ break;
++ }
++ }
++
++ return snum;
++}
++
++void qe_put_snum(u8 snum)
++{
++ int i;
++
++ for (i = 0; i < QE_NUM_OF_SNUM; i++) {
++ if (snums[i].num == snum) {
++ snums[i].state = QE_SNUM_STATE_FREE;
++ break;
++ }
++ }
++}
++
++void qe_init(uint qe_base)
++{
++ DECLARE_GLOBAL_DATA_PTR;
++
++ /* Init the QE IMMR base */
++ qe_immr = (qe_map_t *)qe_base;
++
++ gd->mp_alloc_base = QE_DATAONLY_BASE;
++ gd->mp_alloc_top = gd->mp_alloc_base + QE_DATAONLY_SIZE;
++
++ qe_sdma_init();
++ qe_snums_init();
++}
++
++void qe_reset(void)
++{
++ qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
++}
++
++void qe_assign_page(uint snum, uint para_ram_base)
++{
++ u32 cecr;
++
++ out_be32(&qe_immr->cp.cecdr, para_ram_base);
++ out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
++ | QE_CR_FLG | QE_ASSIGN_PAGE);
++
++ /* Wait for the QE_CR_FLG to clear */
++ do {
++ cecr = in_be32(&qe_immr->cp.cecr);
++ } while (cecr & QE_CR_FLG );
++
++ return;
++}
++
++/*
++ * brg: 0~15 as BRG1~BRG16
++ rate: baud rate
++ * BRG input clock comes from the BRGCLK (internal clock generated from
++ the QE clock, it is one-half of the QE clock), If need the clock source
++ from CLKn pin, we have te change the function.
++ */
++
++#define BRG_CLK (gd->brg_clk)
++
++int qe_set_brg(uint brg, uint rate)
++{
++ DECLARE_GLOBAL_DATA_PTR;
++ volatile uint *bp;
++ u32 divisor;
++ int div16 = 0;
++
++ if (brg >= QE_NUM_OF_BRGS)
++ return -EINVAL;
++ bp = (uint *)&qe_immr->brg.brgc1;
++ bp += brg;
++
++ divisor = (BRG_CLK / rate);
++ if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
++ div16 = 1;
++ divisor /= 16;
++ }
++
++ *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
++ __asm__ __volatile__("sync");
++
++ if (div16) {
++ *bp |= QE_BRGC_DIV16;
++ __asm__ __volatile__("sync");
++ }
++
++ return 0;
++}
++
++/* Set ethernet MII clock master
++*/
++int qe_set_mii_clk_src(int ucc_num)
++{
++ u32 cmxgcr;
++
++ /* check if the UCC number is in range. */
++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
++ printf("%s: ucc num not in ranges\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
++ cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
++ cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
++ out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
++
++ return 0;
++}
++
++#endif /* CONFIG_QE */
+diff -Naupr u-boot-1.1.6/drivers/qe/qe.h u-boot-1.1.6-fsl-1/drivers/qe/qe.h
+--- u-boot-1.1.6/drivers/qe/qe.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/qe.h 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,237 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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 __QE_H__
++#define __QE_H__
++
++#include "common.h"
++
++#define QE_NUM_OF_SNUM 28
++#define QE_NUM_OF_BRGS 16
++#define UCC_MAX_NUM 8
++
++#define QE_DATAONLY_BASE (uint)(128)
++#define QE_DATAONLY_SIZE ((uint)(0xc000) - QE_DATAONLY_BASE)
++
++/* QE threads SNUM
++*/
++typedef enum qe_snum_state {
++ QE_SNUM_STATE_USED, /* used */
++ QE_SNUM_STATE_FREE /* free */
++} qe_snum_state_e;
++
++typedef struct qe_snum {
++ u8 num; /* snum */
++ qe_snum_state_e state; /* state */
++} qe_snum_t;
++
++/* QE RISC allocation
++*/
++typedef enum qe_risc_allocation {
++ QE_RISC_ALLOCATION_RISC1 = 1, /* RISC 1 */
++ QE_RISC_ALLOCATION_RISC2 = 2, /* RISC 2 */
++ QE_RISC_ALLOCATION_RISC1_AND_RISC2 = 3 /* RISC 1 or RISC 2 */
++} qe_risc_allocation_e;
++
++/* QE CECR commands for UCC fast.
++*/
++#define QE_CR_FLG 0x00010000
++#define QE_RESET 0x80000000
++#define QE_INIT_TX_RX 0x00000000
++#define QE_INIT_RX 0x00000001
++#define QE_INIT_TX 0x00000002
++#define QE_ENTER_HUNT_MODE 0x00000003
++#define QE_STOP_TX 0x00000004
++#define QE_GRACEFUL_STOP_TX 0x00000005
++#define QE_RESTART_TX 0x00000006
++#define QE_SWITCH_COMMAND 0x00000007
++#define QE_SET_GROUP_ADDRESS 0x00000008
++#define QE_INSERT_CELL 0x00000009
++#define QE_ATM_TRANSMIT 0x0000000a
++#define QE_CELL_POOL_GET 0x0000000b
++#define QE_CELL_POOL_PUT 0x0000000c
++#define QE_IMA_HOST_CMD 0x0000000d
++#define QE_ATM_MULTI_THREAD_INIT 0x00000011
++#define QE_ASSIGN_PAGE 0x00000012
++#define QE_START_FLOW_CONTROL 0x00000014
++#define QE_STOP_FLOW_CONTROL 0x00000015
++#define QE_ASSIGN_PAGE_TO_DEVICE 0x00000016
++#define QE_GRACEFUL_STOP_RX 0x0000001a
++#define QE_RESTART_RX 0x0000001b
++
++/* QE CECR Sub Block Code - sub block code of QE command.
++*/
++#define QE_CR_SUBBLOCK_INVALID 0x00000000
++#define QE_CR_SUBBLOCK_USB 0x03200000
++#define QE_CR_SUBBLOCK_UCCFAST1 0x02000000
++#define QE_CR_SUBBLOCK_UCCFAST2 0x02200000
++#define QE_CR_SUBBLOCK_UCCFAST3 0x02400000
++#define QE_CR_SUBBLOCK_UCCFAST4 0x02600000
++#define QE_CR_SUBBLOCK_UCCFAST5 0x02800000
++#define QE_CR_SUBBLOCK_UCCFAST6 0x02a00000
++#define QE_CR_SUBBLOCK_UCCFAST7 0x02c00000
++#define QE_CR_SUBBLOCK_UCCFAST8 0x02e00000
++#define QE_CR_SUBBLOCK_UCCSLOW1 0x00000000
++#define QE_CR_SUBBLOCK_UCCSLOW2 0x00200000
++#define QE_CR_SUBBLOCK_UCCSLOW3 0x00400000
++#define QE_CR_SUBBLOCK_UCCSLOW4 0x00600000
++#define QE_CR_SUBBLOCK_UCCSLOW5 0x00800000
++#define QE_CR_SUBBLOCK_UCCSLOW6 0x00a00000
++#define QE_CR_SUBBLOCK_UCCSLOW7 0x00c00000
++#define QE_CR_SUBBLOCK_UCCSLOW8 0x00e00000
++#define QE_CR_SUBBLOCK_MCC1 0x03800000
++#define QE_CR_SUBBLOCK_MCC2 0x03a00000
++#define QE_CR_SUBBLOCK_MCC3 0x03000000
++#define QE_CR_SUBBLOCK_IDMA1 0x02800000
++#define QE_CR_SUBBLOCK_IDMA2 0x02a00000
++#define QE_CR_SUBBLOCK_IDMA3 0x02c00000
++#define QE_CR_SUBBLOCK_IDMA4 0x02e00000
++#define QE_CR_SUBBLOCK_HPAC 0x01e00000
++#define QE_CR_SUBBLOCK_SPI1 0x01400000
++#define QE_CR_SUBBLOCK_SPI2 0x01600000
++#define QE_CR_SUBBLOCK_RAND 0x01c00000
++#define QE_CR_SUBBLOCK_TIMER 0x01e00000
++#define QE_CR_SUBBLOCK_GENERAL 0x03c00000
++
++/* QE CECR Protocol - For non-MCC, specifies mode for QE CECR command.
++*/
++#define QE_CR_PROTOCOL_UNSPECIFIED 0x00 /* For all other protocols */
++#define QE_CR_PROTOCOL_HDLC_TRANSPARENT 0x00
++#define QE_CR_PROTOCOL_ATM_POS 0x0A
++#define QE_CR_PROTOCOL_ETHERNET 0x0C
++#define QE_CR_PROTOCOL_L2_SWITCH 0x0D
++#define QE_CR_PROTOCOL_SHIFT 6
++
++/* QE ASSIGN PAGE command
++*/
++#define QE_CR_ASSIGN_PAGE_SNUM_SHIFT 17
++
++/* Communication Direction.
++*/
++typedef enum comm_dir {
++ COMM_DIR_NONE = 0,
++ COMM_DIR_RX = 1,
++ COMM_DIR_TX = 2,
++ COMM_DIR_RX_AND_TX = 3
++} comm_dir_e;
++
++/* Clocks and BRG's
++*/
++typedef enum qe_clock {
++ QE_CLK_NONE = 0,
++ QE_BRG1, /* Baud Rate Generator 1 */
++ QE_BRG2, /* Baud Rate Generator 2 */
++ QE_BRG3, /* Baud Rate Generator 3 */
++ QE_BRG4, /* Baud Rate Generator 4 */
++ QE_BRG5, /* Baud Rate Generator 5 */
++ QE_BRG6, /* Baud Rate Generator 6 */
++ QE_BRG7, /* Baud Rate Generator 7 */
++ QE_BRG8, /* Baud Rate Generator 8 */
++ QE_BRG9, /* Baud Rate Generator 9 */
++ QE_BRG10, /* Baud Rate Generator 10 */
++ QE_BRG11, /* Baud Rate Generator 11 */
++ QE_BRG12, /* Baud Rate Generator 12 */
++ QE_BRG13, /* Baud Rate Generator 13 */
++ QE_BRG14, /* Baud Rate Generator 14 */
++ QE_BRG15, /* Baud Rate Generator 15 */
++ QE_BRG16, /* Baud Rate Generator 16 */
++ QE_CLK1, /* Clock 1 */
++ QE_CLK2, /* Clock 2 */
++ QE_CLK3, /* Clock 3 */
++ QE_CLK4, /* Clock 4 */
++ QE_CLK5, /* Clock 5 */
++ QE_CLK6, /* Clock 6 */
++ QE_CLK7, /* Clock 7 */
++ QE_CLK8, /* Clock 8 */
++ QE_CLK9, /* Clock 9 */
++ QE_CLK10, /* Clock 10 */
++ QE_CLK11, /* Clock 11 */
++ QE_CLK12, /* Clock 12 */
++ QE_CLK13, /* Clock 13 */
++ QE_CLK14, /* Clock 14 */
++ QE_CLK15, /* Clock 15 */
++ QE_CLK16, /* Clock 16 */
++ QE_CLK17, /* Clock 17 */
++ QE_CLK18, /* Clock 18 */
++ QE_CLK19, /* Clock 19 */
++ QE_CLK20, /* Clock 20 */
++ QE_CLK21, /* Clock 21 */
++ QE_CLK22, /* Clock 22 */
++ QE_CLK23, /* Clock 23 */
++ QE_CLK24, /* Clock 24 */
++ QE_CLK_DUMMY
++} qe_clock_e;
++
++/* QE CMXGCR register
++*/
++#define QE_CMXGCR_MII_ENET_MNG_MASK 0x00007000
++#define QE_CMXGCR_MII_ENET_MNG_SHIFT 12
++
++/* QE CMXUCR registers
++ */
++#define QE_CMXUCR_TX_CLK_SRC_MASK 0x0000000F
++
++/* QE BRG configuration register
++*/
++#define QE_BRGC_ENABLE 0x00010000
++#define QE_BRGC_DIVISOR_SHIFT 1
++#define QE_BRGC_DIVISOR_MAX 0xFFF
++#define QE_BRGC_DIV16 1
++
++/* QE SDMA registers
++*/
++#define QE_SDSR_BER1 0x02000000
++#define QE_SDSR_BER2 0x01000000
++
++#define QE_SDMR_GLB_1_MSK 0x80000000
++#define QE_SDMR_ADR_SEL 0x20000000
++#define QE_SDMR_BER1_MSK 0x02000000
++#define QE_SDMR_BER2_MSK 0x01000000
++#define QE_SDMR_EB1_MSK 0x00800000
++#define QE_SDMR_ER1_MSK 0x00080000
++#define QE_SDMR_ER2_MSK 0x00040000
++#define QE_SDMR_CEN_MASK 0x0000E000
++#define QE_SDMR_SBER_1 0x00000200
++#define QE_SDMR_SBER_2 0x00000200
++#define QE_SDMR_EB1_PR_MASK 0x000000C0
++#define QE_SDMR_ER1_PR 0x00000008
++
++#define QE_SDMR_CEN_SHIFT 13
++#define QE_SDMR_EB1_PR_SHIFT 6
++
++#define QE_SDTM_MSNUM_SHIFT 24
++
++#define QE_SDEBCR_BA_MASK 0x01FFFFFF
++
++void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign);
++void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data);
++uint qe_muram_alloc(uint size, uint align);
++void *qe_muram_addr(uint offset);
++int qe_get_snum(void);
++void qe_put_snum(u8 snum);
++void qe_init(uint qe_base);
++void qe_reset(void);
++void qe_assign_page(uint snum, uint para_ram_base);
++int qe_set_brg(uint brg, uint rate);
++int qe_set_mii_clk_src(int ucc_num);
++
++#endif /* __QE_H__ */
+diff -Naupr u-boot-1.1.6/drivers/qe/uccf.c u-boot-1.1.6-fsl-1/drivers/qe/uccf.c
+--- u-boot-1.1.6/drivers/qe/uccf.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uccf.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,404 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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 "malloc.h"
++#include "asm/errno.h"
++#include "asm/io.h"
++#include "asm/immap_qe.h"
++#include "qe.h"
++#include "uccf.h"
++
++#if defined(CONFIG_QE)
++void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf)
++{
++ out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD);
++}
++
++u32 ucc_fast_get_qe_cr_subblock(int ucc_num)
++{
++ switch (ucc_num) {
++ case 0: return QE_CR_SUBBLOCK_UCCFAST1;
++ case 1: return QE_CR_SUBBLOCK_UCCFAST2;
++ case 2: return QE_CR_SUBBLOCK_UCCFAST3;
++ case 3: return QE_CR_SUBBLOCK_UCCFAST4;
++ case 4: return QE_CR_SUBBLOCK_UCCFAST5;
++ case 5: return QE_CR_SUBBLOCK_UCCFAST6;
++ case 6: return QE_CR_SUBBLOCK_UCCFAST7;
++ case 7: return QE_CR_SUBBLOCK_UCCFAST8;
++ default: return QE_CR_SUBBLOCK_INVALID;
++ }
++}
++
++static void ucc_get_cmxucr_reg(int ucc_num, volatile u32 **p_cmxucr,
++ u8 *reg_num, u8 *shift)
++{
++ switch (ucc_num) {
++ case 0: /* UCC1 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr1);
++ *reg_num = 1;
++ *shift = 16;
++ break;
++ case 2: /* UCC3 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr1);
++ *reg_num = 1;
++ *shift = 0;
++ break;
++ case 4: /* UCC5 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr2);
++ *reg_num = 2;
++ *shift = 16;
++ break;
++ case 6: /* UCC7 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr2);
++ *reg_num = 2;
++ *shift = 0;
++ break;
++ case 1: /* UCC2 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr3);
++ *reg_num = 3;
++ *shift = 16;
++ break;
++ case 3: /* UCC4 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr3);
++ *reg_num = 3;
++ *shift = 0;
++ break;
++ case 5: /* UCC6 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr4);
++ *reg_num = 4;
++ *shift = 16;
++ break;
++ case 7: /* UCC8 */
++ *p_cmxucr = &(qe_immr->qmx.cmxucr4);
++ *reg_num = 4;
++ *shift = 0;
++ break;
++ default:
++ break;
++ }
++}
++
++static int ucc_set_clk_src(int ucc_num, qe_clock_e clock, comm_dir_e mode)
++{
++ volatile u32 *p_cmxucr = NULL;
++ u8 reg_num = 0;
++ u8 shift = 0;
++ u32 clockBits;
++ u32 clockMask;
++ int source = -1;
++
++ /* check if the UCC number is in range. */
++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0))
++ return -EINVAL;
++
++ if (! ((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX))) {
++ printf("%s: bad comm mode type passed\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ ucc_get_cmxucr_reg(ucc_num, &p_cmxucr, &reg_num, &shift);
++
++ switch (reg_num) {
++ case 1:
++ switch (clock) {
++ case QE_BRG1: source = 1; break;
++ case QE_BRG2: source = 2; break;
++ case QE_BRG7: source = 3; break;
++ case QE_BRG8: source = 4; break;
++ case QE_CLK9: source = 5; break;
++ case QE_CLK10: source = 6; break;
++ case QE_CLK11: source = 7; break;
++ case QE_CLK12: source = 8; break;
++ case QE_CLK15: source = 9; break;
++ case QE_CLK16: source = 10; break;
++ default: source = -1; break;
++ }
++ break;
++ case 2:
++ switch (clock) {
++ case QE_BRG5: source = 1; break;
++ case QE_BRG6: source = 2; break;
++ case QE_BRG7: source = 3; break;
++ case QE_BRG8: source = 4; break;
++ case QE_CLK13: source = 5; break;
++ case QE_CLK14: source = 6; break;
++ case QE_CLK19: source = 7; break;
++ case QE_CLK20: source = 8; break;
++ case QE_CLK15: source = 9; break;
++ case QE_CLK16: source = 10; break;
++ default: source = -1; break;
++ }
++ break;
++ case 3:
++ switch (clock) {
++ case QE_BRG9: source = 1; break;
++ case QE_BRG10: source = 2; break;
++ case QE_BRG15: source = 3; break;
++ case QE_BRG16: source = 4; break;
++ case QE_CLK3: source = 5; break;
++ case QE_CLK4: source = 6; break;
++ case QE_CLK17: source = 7; break;
++ case QE_CLK18: source = 8; break;
++ case QE_CLK7: source = 9; break;
++ case QE_CLK8: source = 10; break;
++ case QE_CLK16: source = 11; break;
++ default: source = -1; break;
++ }
++ break;
++ case 4:
++ switch (clock) {
++ case QE_BRG13: source = 1; break;
++ case QE_BRG14: source = 2; break;
++ case QE_BRG15: source = 3; break;
++ case QE_BRG16: source = 4; break;
++ case QE_CLK5: source = 5; break;
++ case QE_CLK6: source = 6; break;
++ case QE_CLK21: source = 7; break;
++ case QE_CLK22: source = 8; break;
++ case QE_CLK7: source = 9; break;
++ case QE_CLK8: source = 10; break;
++ case QE_CLK16: source = 11; break;
++ default: source = -1; break;
++ }
++ break;
++ default:
++ source = -1;
++ break;
++ }
++
++ if (source == -1) {
++ printf("%s: Bad combination of clock and UCC\n", __FUNCTION__);
++ return -ENOENT;
++ }
++
++ clockBits = (u32) source;
++ clockMask = QE_CMXUCR_TX_CLK_SRC_MASK;
++ if (mode == COMM_DIR_RX) {
++ clockBits <<= 4; /* Rx field is 4 bits to left of Tx field */
++ clockMask <<= 4; /* Rx field is 4 bits to left of Tx field */
++ }
++ clockBits <<= shift;
++ clockMask <<= shift;
++
++ out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clockMask) | clockBits);
++
++ return 0;
++}
++
++static uint ucc_get_reg_baseaddr(int ucc_num)
++{
++ uint base = 0;
++
++ /* check if the UCC number is in range */
++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
++ printf("%s: the UCC num not in ranges\n", __FUNCTION__);
++ return 0;
++ }
++
++ switch (ucc_num) {
++ case 0: base = 0x00002000; break;
++ case 1: base = 0x00003000; break;
++ case 2: base = 0x00002200; break;
++ case 3: base = 0x00003200; break;
++ case 4: base = 0x00002400; break;
++ case 5: base = 0x00003400; break;
++ case 6: base = 0x00002600; break;
++ case 7: base = 0x00003600; break;
++ default: break;
++ }
++
++ base = (uint)qe_immr + base;
++ return base;
++}
++
++void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode)
++{
++ ucc_fast_t *uf_regs;
++ u32 gumr;
++
++ uf_regs = uccf->uf_regs;
++
++ /* Enable reception and/or transmission on this UCC. */
++ gumr = in_be32(&uf_regs->gumr);
++ if (mode & COMM_DIR_TX) {
++ gumr |= UCC_FAST_GUMR_ENT;
++ uccf->enabled_tx = 1;
++ }
++ if (mode & COMM_DIR_RX) {
++ gumr |= UCC_FAST_GUMR_ENR;
++ uccf->enabled_rx = 1;
++ }
++ out_be32(&uf_regs->gumr, gumr);
++}
++
++void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode)
++{
++ ucc_fast_t *uf_regs;
++ u32 gumr;
++
++ uf_regs = uccf->uf_regs;
++
++ /* Disable reception and/or transmission on this UCC. */
++ gumr = in_be32(&uf_regs->gumr);
++ if (mode & COMM_DIR_TX) {
++ gumr &= ~UCC_FAST_GUMR_ENT;
++ uccf->enabled_tx = 0;
++ }
++ if (mode & COMM_DIR_RX) {
++ gumr &= ~UCC_FAST_GUMR_ENR;
++ uccf->enabled_rx = 0;
++ }
++ out_be32(&uf_regs->gumr, gumr);
++}
++
++int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t **uccf_ret)
++{
++ ucc_fast_private_t *uccf;
++ ucc_fast_t *uf_regs;
++
++ if (!uf_info)
++ return -EINVAL;
++
++ if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
++ printf("%s: Illagal UCC number!\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uccf = (ucc_fast_private_t *)malloc(sizeof(ucc_fast_private_t));
++ if (!uccf) {
++ printf("%s: No memory for UCC fast data structure!\n",
++ __FUNCTION__);
++ return -ENOMEM;
++ }
++ memset(uccf, 0, sizeof(ucc_fast_private_t));
++
++ /* Save fast UCC structure */
++ uccf->uf_info = uf_info;
++ uccf->uf_regs = (ucc_fast_t *)ucc_get_reg_baseaddr(uf_info->ucc_num);
++
++ if (uccf->uf_regs == NULL) {
++ printf("%s: No memory map for UCC fast controller!\n",
++ __FUNCTION__);
++ return -ENOMEM;
++ }
++
++ uccf->enabled_tx = 0;
++ uccf->enabled_rx = 0;
++
++ uf_regs = uccf->uf_regs;
++ uccf->p_ucce = (u32 *) &(uf_regs->ucce);
++ uccf->p_uccm = (u32 *) &(uf_regs->uccm);
++
++ /* Init GUEMR register, UCC both Rx and Tx is Fast protocol */
++ out_8(&uf_regs->guemr, UCC_GUEMR_SET_RESERVED3 | UCC_GUEMR_MODE_FAST_RX
++ | UCC_GUEMR_MODE_FAST_TX);
++
++ /* Set GUMR, disable UCC both Rx and Tx, Ethernet protocol */
++ out_be32(&uf_regs->gumr, UCC_FAST_GUMR_ETH);
++
++ /* Set the Giga ethernet VFIFO stuff */
++ if (uf_info->eth_type == GIGA_ETH) {
++ /* Allocate memory for Tx Virtual Fifo */
++ uccf->ucc_fast_tx_virtual_fifo_base_offset =
++ qe_muram_alloc(UCC_GETH_UTFS_GIGA_INIT,
++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
++
++ /* Allocate memory for Rx Virtual Fifo */
++ uccf->ucc_fast_rx_virtual_fifo_base_offset =
++ qe_muram_alloc(UCC_GETH_URFS_GIGA_INIT +
++ UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
++
++ /* utfb, urfb are offsets from MURAM base */
++ out_be32(&uf_regs->utfb,
++ uccf->ucc_fast_tx_virtual_fifo_base_offset);
++ out_be32(&uf_regs->urfb,
++ uccf->ucc_fast_rx_virtual_fifo_base_offset);
++
++ /* Set Virtual Fifo registers */
++ out_be16(&uf_regs->urfs, UCC_GETH_URFS_GIGA_INIT);
++ out_be16(&uf_regs->urfet, UCC_GETH_URFET_GIGA_INIT);
++ out_be16(&uf_regs->urfset, UCC_GETH_URFSET_GIGA_INIT);
++ out_be16(&uf_regs->utfs, UCC_GETH_UTFS_GIGA_INIT);
++ out_be16(&uf_regs->utfet, UCC_GETH_UTFET_GIGA_INIT);
++ out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_GIGA_INIT);
++ }
++
++ /* Set the Fast ethernet VFIFO stuff */
++ if (uf_info->eth_type == FAST_ETH) {
++ /* Allocate memory for Tx Virtual Fifo */
++ uccf->ucc_fast_tx_virtual_fifo_base_offset =
++ qe_muram_alloc(UCC_GETH_UTFS_INIT,
++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
++
++ /* Allocate memory for Rx Virtual Fifo */
++ uccf->ucc_fast_rx_virtual_fifo_base_offset =
++ qe_muram_alloc(UCC_GETH_URFS_INIT +
++ UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
++
++ /* utfb, urfb are offsets from MURAM base */
++ out_be32(&uf_regs->utfb,
++ uccf->ucc_fast_tx_virtual_fifo_base_offset);
++ out_be32(&uf_regs->urfb,
++ uccf->ucc_fast_rx_virtual_fifo_base_offset);
++
++ /* Set Virtual Fifo registers */
++ out_be16(&uf_regs->urfs, UCC_GETH_URFS_INIT);
++ out_be16(&uf_regs->urfet, UCC_GETH_URFET_INIT);
++ out_be16(&uf_regs->urfset, UCC_GETH_URFSET_INIT);
++ out_be16(&uf_regs->utfs, UCC_GETH_UTFS_INIT);
++ out_be16(&uf_regs->utfet, UCC_GETH_UTFET_INIT);
++ out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_INIT);
++ }
++
++ /* Rx clock routing */
++ if (uf_info->rx_clock != QE_CLK_NONE) {
++ if (ucc_set_clk_src(uf_info->ucc_num,
++ uf_info->rx_clock, COMM_DIR_RX)) {
++ printf("%s: Illegal value for parameter 'RxClock'.\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++ }
++
++ /* Tx clock routing */
++ if (uf_info->tx_clock != QE_CLK_NONE) {
++ if (ucc_set_clk_src(uf_info->ucc_num,
++ uf_info->tx_clock, COMM_DIR_TX)) {
++ printf("%s: Illegal value for parameter 'TxClock'.\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++ }
++
++ /* Clear interrupt mask register to disable all of interrupts */
++ out_be32(&uf_regs->uccm, 0x0);
++
++ /* Writing '1' to clear all of envents */
++ out_be32(&uf_regs->ucce, 0xffffffff);
++
++ *uccf_ret = uccf;
++ return 0;
++}
++#endif /* CONFIG_QE */
+diff -Naupr u-boot-1.1.6/drivers/qe/uccf.h u-boot-1.1.6-fsl-1/drivers/qe/uccf.h
+--- u-boot-1.1.6/drivers/qe/uccf.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uccf.h 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,130 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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 __UCCF_H__
++#define __UCCF_H__
++
++#include "common.h"
++#include "qe.h"
++
++/* Fast or Giga ethernet
++*/
++typedef enum enet_type {
++ FAST_ETH,
++ GIGA_ETH,
++} enet_type_e;
++
++/* General UCC Extended Mode Register
++*/
++#define UCC_GUEMR_MODE_MASK_RX 0x02
++#define UCC_GUEMR_MODE_MASK_TX 0x01
++#define UCC_GUEMR_MODE_FAST_RX 0x02
++#define UCC_GUEMR_MODE_FAST_TX 0x01
++#define UCC_GUEMR_MODE_SLOW_RX 0x00
++#define UCC_GUEMR_MODE_SLOW_TX 0x00
++#define UCC_GUEMR_SET_RESERVED3 0x10 /* Bit 3 must be set 1 */
++
++/* General UCC FAST Mode Register
++*/
++#define UCC_FAST_GUMR_TCI 0x20000000
++#define UCC_FAST_GUMR_TRX 0x10000000
++#define UCC_FAST_GUMR_TTX 0x08000000
++#define UCC_FAST_GUMR_CDP 0x04000000
++#define UCC_FAST_GUMR_CTSP 0x02000000
++#define UCC_FAST_GUMR_CDS 0x01000000
++#define UCC_FAST_GUMR_CTSS 0x00800000
++#define UCC_FAST_GUMR_TXSY 0x00020000
++#define UCC_FAST_GUMR_RSYN 0x00010000
++#define UCC_FAST_GUMR_RTSM 0x00002000
++#define UCC_FAST_GUMR_REVD 0x00000400
++#define UCC_FAST_GUMR_ENR 0x00000020
++#define UCC_FAST_GUMR_ENT 0x00000010
++
++/* GUMR [MODE] bit maps
++*/
++#define UCC_FAST_GUMR_HDLC 0x00000000
++#define UCC_FAST_GUMR_QMC 0x00000002
++#define UCC_FAST_GUMR_UART 0x00000004
++#define UCC_FAST_GUMR_BISYNC 0x00000008
++#define UCC_FAST_GUMR_ATM 0x0000000a
++#define UCC_FAST_GUMR_ETH 0x0000000c
++
++/* Transmit On Demand (UTORD)
++*/
++#define UCC_SLOW_TOD 0x8000
++#define UCC_FAST_TOD 0x8000
++
++/* Fast Ethernet (10/100 Mbps)
++*/
++#define UCC_GETH_URFS_INIT 512 /* Rx virtual FIFO size */
++#define UCC_GETH_URFET_INIT 256 /* 1/2 urfs */
++#define UCC_GETH_URFSET_INIT 384 /* 3/4 urfs */
++#define UCC_GETH_UTFS_INIT 512 /* Tx virtual FIFO size */
++#define UCC_GETH_UTFET_INIT 256 /* 1/2 utfs */
++#define UCC_GETH_UTFTT_INIT 128
++
++/* Gigabit Ethernet (1000 Mbps)
++*/
++#define UCC_GETH_URFS_GIGA_INIT 4096/*2048*/ /* Rx virtual FIFO size */
++#define UCC_GETH_URFET_GIGA_INIT 2048/*1024*/ /* 1/2 urfs */
++#define UCC_GETH_URFSET_GIGA_INIT 3072/*1536*/ /* 3/4 urfs */
++#define UCC_GETH_UTFS_GIGA_INIT 8192/*2048*/ /* Tx virtual FIFO size */
++#define UCC_GETH_UTFET_GIGA_INIT 4096/*1024*/ /* 1/2 utfs */
++#define UCC_GETH_UTFTT_GIGA_INIT 0x400/*0x40*/ /* */
++
++/* UCC fast alignment
++*/
++#define UCC_FAST_RX_ALIGN 4
++#define UCC_FAST_MRBLR_ALIGNMENT 4
++#define UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT 8
++
++/* Sizes
++*/
++#define UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD 8
++
++/* UCC fast structure.
++*/
++typedef struct ucc_fast_info {
++ int ucc_num;
++ qe_clock_e rx_clock;
++ qe_clock_e tx_clock;
++ enet_type_e eth_type;
++} ucc_fast_info_t;
++
++typedef struct ucc_fast_private {
++ ucc_fast_info_t *uf_info;
++ ucc_fast_t *uf_regs; /* a pointer to memory map of UCC regs */
++ u32 *p_ucce; /* a pointer to the event register */
++ u32 *p_uccm; /* a pointer to the mask register */
++ int enabled_tx; /* whether UCC is enabled for Tx (ENT) */
++ int enabled_rx; /* whether UCC is enabled for Rx (ENR) */
++ u32 ucc_fast_tx_virtual_fifo_base_offset;
++ u32 ucc_fast_rx_virtual_fifo_base_offset;
++} ucc_fast_private_t;
++
++void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf);
++u32 ucc_fast_get_qe_cr_subblock(int ucc_num);
++void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode);
++void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode);
++int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t **uccf_ret);
++
++#endif /* __UCCF_H__ */
+diff -Naupr u-boot-1.1.6/drivers/qe/uec.c u-boot-1.1.6-fsl-1/drivers/qe/uec.c
+--- u-boot-1.1.6/drivers/qe/uec.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uec.c 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,1266 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@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
++ */
++
++#include "common.h"
++#include "net.h"
++#include "malloc.h"
++#include "asm/errno.h"
++#include "asm/io.h"
++#include "asm/immap_qe.h"
++#include "qe.h"
++#include "uccf.h"
++#include "uec.h"
++#include "uec_phy.h"
++
++#if defined(CONFIG_QE)
++
++#ifdef CONFIG_UEC_ETH1
++static uec_info_t eth1_uec_info = {
++ .uf_info = {
++ .ucc_num = CFG_UEC1_UCC_NUM,
++ .rx_clock = CFG_UEC1_RX_CLK,
++ .tx_clock = CFG_UEC1_TX_CLK,
++ .eth_type = CFG_UEC1_ETH_TYPE,
++ },
++ .num_threads_tx = UEC_NUM_OF_THREADS_4,
++ .num_threads_rx = UEC_NUM_OF_THREADS_4,
++ .riscTx = QE_RISC_ALLOCATION_RISC1_AND_RISC2,
++ .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2,
++ .tx_bd_ring_len = 16,
++ .rx_bd_ring_len = 16,
++ .phy_address = CFG_UEC1_PHY_ADDR,
++ .enet_interface = CFG_UEC1_INTERFACE_MODE,
++};
++#endif
++#ifdef CONFIG_UEC_ETH2
++static uec_info_t eth2_uec_info = {
++ .uf_info = {
++ .ucc_num = CFG_UEC2_UCC_NUM,
++ .rx_clock = CFG_UEC2_RX_CLK,
++ .tx_clock = CFG_UEC2_TX_CLK,
++ .eth_type = CFG_UEC2_ETH_TYPE,
++ },
++ .num_threads_tx = UEC_NUM_OF_THREADS_4,
++ .num_threads_rx = UEC_NUM_OF_THREADS_4,
++ .riscTx = QE_RISC_ALLOCATION_RISC1_AND_RISC2,
++ .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2,
++ .tx_bd_ring_len = 16,
++ .rx_bd_ring_len = 16,
++ .phy_address = CFG_UEC2_PHY_ADDR,
++ .enet_interface = CFG_UEC2_INTERFACE_MODE,
++};
++#endif
++
++static int uec_mac_enable(uec_private_t *uec, comm_dir_e mode)
++{
++ uec_t *uec_regs;
++ u32 maccfg1;
++
++ if (!uec) {
++ printf("%s: uec not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ uec_regs = uec->uec_regs;
++
++ maccfg1 = in_be32(&uec_regs->maccfg1);
++
++ if (mode & COMM_DIR_TX) {
++ maccfg1 |= MACCFG1_ENABLE_TX;
++ out_be32(&uec_regs->maccfg1, maccfg1);
++ uec->mac_tx_enabled = 1;
++ }
++
++ if (mode & COMM_DIR_RX) {
++ maccfg1 |= MACCFG1_ENABLE_RX;
++ out_be32(&uec_regs->maccfg1, maccfg1);
++ uec->mac_rx_enabled = 1;
++ }
++
++ return 0;
++}
++
++static int uec_mac_disable(uec_private_t *uec, comm_dir_e mode)
++{
++ uec_t *uec_regs;
++ u32 maccfg1;
++
++ if (!uec) {
++ printf("%s: uec not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ uec_regs = uec->uec_regs;
++
++ maccfg1 = in_be32(&uec_regs->maccfg1);
++
++ if (mode & COMM_DIR_TX) {
++ maccfg1 &= ~MACCFG1_ENABLE_TX;
++ out_be32(&uec_regs->maccfg1, maccfg1);
++ uec->mac_tx_enabled = 0;
++ }
++
++ if (mode & COMM_DIR_RX) {
++ maccfg1 &= ~MACCFG1_ENABLE_RX;
++ out_be32(&uec_regs->maccfg1, maccfg1);
++ uec->mac_rx_enabled = 0;
++ }
++
++ return 0;
++}
++
++static int uec_graceful_stop_tx(uec_private_t *uec)
++{
++ ucc_fast_t *uf_regs;
++ u32 cecr_subblock;
++ u32 ucce;
++
++ if (!uec || !uec->uccf) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uf_regs = uec->uccf->uf_regs;
++
++ /* Clear the grace stop event */
++ out_be32(&uf_regs->ucce, UCCE_GRA);
++
++ /* Issue host command */
++ cecr_subblock =
++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
++ qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
++ (u8)QE_CR_PROTOCOL_ETHERNET, 0);
++
++ /* Wait for command to complete */
++ do {
++ ucce = in_be32(&uf_regs->ucce);
++ } while (! (ucce & UCCE_GRA));
++
++ uec->grace_stopped_tx = 1;
++
++ return 0;
++}
++
++static int uec_graceful_stop_rx(uec_private_t *uec)
++{
++ u32 cecr_subblock;
++ u8 ack;
++
++ if (!uec) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ if (!uec->p_rx_glbl_pram) {
++ printf("%s: No init rx global parameter\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ /* Clear acknowledge bit */
++ ack = uec->p_rx_glbl_pram->rxgstpack;
++ ack &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX;
++ uec->p_rx_glbl_pram->rxgstpack = ack;
++
++ /* Keep issuing cmd and checking ack bit until it is asserted */
++ do {
++ /* Issue host command */
++ cecr_subblock =
++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
++ qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
++ (u8)QE_CR_PROTOCOL_ETHERNET, 0);
++ ack = uec->p_rx_glbl_pram->rxgstpack;
++ } while (! (ack & GRACEFUL_STOP_ACKNOWLEDGE_RX ));
++
++ uec->grace_stopped_rx = 1;
++
++ return 0;
++}
++
++static int uec_restart_tx(uec_private_t *uec)
++{
++ u32 cecr_subblock;
++
++ if (!uec || !uec->uec_info) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ cecr_subblock =
++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
++ qe_issue_cmd(QE_RESTART_TX, cecr_subblock,
++ (u8)QE_CR_PROTOCOL_ETHERNET, 0);
++
++ uec->grace_stopped_tx = 0;
++
++ return 0;
++}
++
++static int uec_restart_rx(uec_private_t *uec)
++{
++ u32 cecr_subblock;
++
++ if (!uec || !uec->uec_info) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ cecr_subblock =
++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
++ qe_issue_cmd(QE_RESTART_RX, cecr_subblock,
++ (u8)QE_CR_PROTOCOL_ETHERNET, 0);
++
++ uec->grace_stopped_rx = 0;
++
++ return 0;
++}
++
++static int uec_open(uec_private_t *uec, comm_dir_e mode)
++{
++ ucc_fast_private_t *uccf;
++
++ if (!uec || !uec->uccf) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ uccf = uec->uccf;
++
++ /* check if the UCC number is in range. */
++ if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
++ printf("%s: ucc_num out of range.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ /* Enable MAC */
++ uec_mac_enable(uec, mode);
++
++ /* Enable UCC fast */
++ ucc_fast_enable(uccf, mode);
++
++ /* RISC microcode start */
++ if ((mode & COMM_DIR_TX) && uec->grace_stopped_tx) {
++ uec_restart_tx(uec);
++ }
++ if ((mode & COMM_DIR_RX) && uec->grace_stopped_rx) {
++ uec_restart_rx(uec);
++ }
++
++ return 0;
++}
++
++static int uec_stop(uec_private_t *uec, comm_dir_e mode)
++{
++ ucc_fast_private_t *uccf;
++
++ if (!uec || !uec->uccf) {
++ printf("%s: No handle passed.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ uccf = uec->uccf;
++
++ /* check if the UCC number is in range. */
++ if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
++ printf("%s: ucc_num out of range.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ /* Stop any transmissions */
++ if ((mode & COMM_DIR_TX) && !uec->grace_stopped_tx) {
++ uec_graceful_stop_tx(uec);
++ }
++ /* Stop any receptions */
++ if ((mode & COMM_DIR_RX) && !uec->grace_stopped_rx) {
++ uec_graceful_stop_rx(uec);
++ }
++
++ /* Disable the UCC fast */
++ ucc_fast_disable(uec->uccf, mode);
++
++ /* Disable the MAC */
++ uec_mac_disable(uec, mode);
++
++ return 0;
++}
++
++static int uec_set_mac_duplex(uec_private_t *uec, int duplex)
++{
++ uec_t *uec_regs;
++ u32 maccfg2;
++
++ if (!uec) {
++ printf("%s: uec not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++ uec_regs = uec->uec_regs;
++
++ if (duplex == DUPLEX_HALF) {
++ maccfg2 = in_be32(&uec_regs->maccfg2);
++ maccfg2 &= ~MACCFG2_FDX;
++ out_be32(&uec_regs->maccfg2, maccfg2);
++ }
++
++ if (duplex == DUPLEX_FULL) {
++ maccfg2 = in_be32(&uec_regs->maccfg2);
++ maccfg2 |= MACCFG2_FDX;
++ out_be32(&uec_regs->maccfg2, maccfg2);
++ }
++
++ return 0;
++}
++
++static int uec_set_mac_if_mode(uec_private_t *uec, enet_interface_e if_mode)
++{
++ enet_interface_e enet_if_mode;
++ uec_info_t *uec_info;
++ uec_t *uec_regs;
++ u32 upsmr;
++ u32 maccfg2;
++
++ if (!uec) {
++ printf("%s: uec not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uec_info = uec->uec_info;
++ uec_regs = uec->uec_regs;
++ enet_if_mode = if_mode;
++
++ maccfg2 = in_be32(&uec_regs->maccfg2);
++ maccfg2 &= ~MACCFG2_INTERFACE_MODE_MASK;
++
++ upsmr = in_be32(&uec->uccf->uf_regs->upsmr);
++ upsmr &= ~(UPSMR_RPM | UPSMR_TBIM | UPSMR_R10M | UPSMR_RMM);
++
++ switch (enet_if_mode) {
++ case ENET_100_MII:
++ case ENET_10_MII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
++ break;
++ case ENET_1000_GMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
++ break;
++ case ENET_1000_TBI:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
++ upsmr |= UPSMR_TBIM;
++ break;
++ case ENET_1000_RTBI:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
++ upsmr |= (UPSMR_RPM | UPSMR_TBIM);
++ break;
++ case ENET_1000_RGMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
++ upsmr |= UPSMR_RPM;
++ break;
++ case ENET_100_RGMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
++ upsmr |= UPSMR_RPM;
++ break;
++ case ENET_10_RGMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
++ upsmr |= (UPSMR_RPM | UPSMR_R10M);
++ break;
++ case ENET_100_RMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
++ upsmr |= UPSMR_RMM;
++ break;
++ case ENET_10_RMII:
++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
++ upsmr |= (UPSMR_R10M | UPSMR_RMM);
++ break;
++ default:
++ return -EINVAL;
++ break;
++ }
++ out_be32(&uec_regs->maccfg2, maccfg2);
++ out_be32(&uec->uccf->uf_regs->upsmr, upsmr);
++
++ return 0;
++}
++
++static int init_mii_management_configuration(uec_t *uec_regs)
++{
++ uint timeout = 0x1000;
++ u32 miimcfg = 0;
++
++ miimcfg = in_be32(&uec_regs->miimcfg);
++ miimcfg |= MIIMCFG_MNGMNT_CLC_DIV_INIT_VALUE;
++ out_be32(&uec_regs->miimcfg, miimcfg);
++
++ /* Wait until the bus is free */
++ while ((in_be32(&uec_regs->miimcfg) & MIIMIND_BUSY) && timeout--);
++ if (timeout <= 0) {
++ printf("%s: The MII Bus is stuck!", __FUNCTION__);
++ return -ETIMEDOUT;
++ }
++
++ return 0;
++}
++
++static int init_phy(struct eth_device *dev)
++{
++ uec_private_t *uec;
++ uec_t *uec_regs;
++ struct uec_mii_info *mii_info;
++ struct phy_info *curphy;
++ int err;
++
++ uec = (uec_private_t *)dev->priv;
++ uec_regs = uec->uec_regs;
++
++ uec->oldlink = 0;
++ uec->oldspeed = 0;
++ uec->oldduplex = -1;
++
++ mii_info = malloc(sizeof(*mii_info));
++ if (!mii_info) {
++ printf("%s: Could not allocate mii_info", dev->name);
++ return -ENOMEM;
++ }
++ memset(mii_info, 0, sizeof(*mii_info));
++
++ mii_info->speed = SPEED_1000;
++ mii_info->duplex = DUPLEX_FULL;
++ mii_info->pause = 0;
++ mii_info->link = 1;
++
++ mii_info->advertising = (ADVERTISED_10baseT_Half |
++ ADVERTISED_10baseT_Full |
++ ADVERTISED_100baseT_Half |
++ ADVERTISED_100baseT_Full |
++ ADVERTISED_1000baseT_Full);
++ mii_info->autoneg = 1;
++ mii_info->mii_id = uec->uec_info->phy_address;
++ mii_info->dev = dev;
++
++ mii_info->mdio_read = &read_phy_reg;
++ mii_info->mdio_write = &write_phy_reg;
++
++ uec->mii_info = mii_info;
++
++ if (init_mii_management_configuration(uec_regs)) {
++ printf("%s: The MII Bus is stuck!", dev->name);
++ err = -1;
++ goto bus_fail;
++ }
++
++ /* get info for this PHY */
++ curphy = get_phy_info(uec->mii_info);
++ if (!curphy) {
++ printf("%s: No PHY found", dev->name);
++ err = -1;
++ goto no_phy;
++ }
++
++ mii_info->phyinfo = curphy;
++
++ /* Run the commands which initialize the PHY */
++ if (curphy->init) {
++ err = curphy->init(uec->mii_info);
++ if (err)
++ goto phy_init_fail;
++ }
++
++ return 0;
++
++phy_init_fail:
++no_phy:
++bus_fail:
++ free(mii_info);
++ return err;
++}
++
++static void adjust_link(struct eth_device *dev)
++{
++ uec_private_t *uec = (uec_private_t *)dev->priv;
++ uec_t *uec_regs;
++ struct uec_mii_info *mii_info = uec->mii_info;
++
++ extern void change_phy_interface_mode(struct eth_device *dev,
++ enet_interface_e mode);
++ uec_regs = uec->uec_regs;
++
++ if (mii_info->link) {
++ /* Now we make sure that we can be in full duplex mode.
++ * If not, we operate in half-duplex mode. */
++ if (mii_info->duplex != uec->oldduplex) {
++ if (!(mii_info->duplex)) {
++ uec_set_mac_duplex(uec, DUPLEX_HALF);
++ printf("%s: Half Duplex\n", dev->name);
++ } else {
++ uec_set_mac_duplex(uec, DUPLEX_FULL);
++ printf("%s: Full Duplex\n", dev->name);
++ }
++ uec->oldduplex = mii_info->duplex;
++ }
++
++ if (mii_info->speed != uec->oldspeed) {
++ switch (mii_info->speed) {
++ case 1000:
++ break;
++ case 100:
++ printf ("switching to rgmii 100\n");
++ /* change phy to rgmii 100 */
++ change_phy_interface_mode(dev,
++ ENET_100_RGMII);
++ /* change the MAC interface mode */
++ uec_set_mac_if_mode(uec,ENET_100_RGMII);
++ break;
++ case 10:
++ printf ("switching to rgmii 10\n");
++ /* change phy to rgmii 10 */
++ change_phy_interface_mode(dev,
++ ENET_10_RGMII);
++ /* change the MAC interface mode */
++ uec_set_mac_if_mode(uec,ENET_10_RGMII);
++ break;
++ default:
++ printf("%s: Ack,Speed(%d)is illegal\n",
++ dev->name, mii_info->speed);
++ break;
++ }
++
++ printf("%s: Speed %dBT\n", dev->name, mii_info->speed);
++ uec->oldspeed = mii_info->speed;
++ }
++
++ if (!uec->oldlink) {
++ printf("%s: Link is up\n", dev->name);
++ uec->oldlink = 1;
++ }
++
++ } else { /* if (mii_info->link) */
++ if (uec->oldlink) {
++ printf("%s: Link is down\n", dev->name);
++ uec->oldlink = 0;
++ uec->oldspeed = 0;
++ uec->oldduplex = -1;
++ }
++ }
++}
++
++static void phy_change(struct eth_device *dev)
++{
++ uec_private_t *uec = (uec_private_t *)dev->priv;
++ uec_t *uec_regs;
++ int result = 0;
++
++ uec_regs = uec->uec_regs;
++
++ /* Delay 5s to give the PHY a chance to change the register state */
++ udelay(5000000);
++
++ /* Update the link, speed, duplex */
++ result = uec->mii_info->phyinfo->read_status(uec->mii_info);
++
++ /* Adjust the interface according to speed */
++ if ((0 == result) || (uec->mii_info->link == 0)) {
++ adjust_link(dev);
++ }
++}
++
++static int uec_set_mac_address(uec_private_t *uec, u8 *mac_addr)
++{
++ uec_t *uec_regs;
++ u32 mac_addr1;
++ u32 mac_addr2;
++
++ if (!uec) {
++ printf("%s: uec not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uec_regs = uec->uec_regs;
++
++ /* if a station address of 0x12345678ABCD, perform a write to
++ MACSTNADDR1 of 0xCDAB7856,
++ MACSTNADDR2 of 0x34120000 */
++
++ mac_addr1 = (mac_addr[5] << 24) | (mac_addr[4] << 16) | \
++ (mac_addr[3] << 8) | (mac_addr[2]);
++ out_be32(&uec_regs->macstnaddr1, mac_addr1);
++
++ mac_addr2 = ((mac_addr[1] << 24) | (mac_addr[0] << 16)) & 0xffff0000;
++ out_be32(&uec_regs->macstnaddr2, mac_addr2);
++
++ return 0;
++}
++
++static int uec_convert_threads_num(uec_num_of_threads_e threads_num,
++ int *threads_num_ret)
++{
++ int num_threads_numerica;
++
++ switch (threads_num) {
++ case UEC_NUM_OF_THREADS_1:
++ num_threads_numerica = 1;
++ break;
++ case UEC_NUM_OF_THREADS_2:
++ num_threads_numerica = 2;
++ break;
++ case UEC_NUM_OF_THREADS_4:
++ num_threads_numerica = 4;
++ break;
++ case UEC_NUM_OF_THREADS_6:
++ num_threads_numerica = 6;
++ break;
++ case UEC_NUM_OF_THREADS_8:
++ num_threads_numerica = 8;
++ break;
++ default:
++ printf("%s: Bad number of threads value.",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++
++ *threads_num_ret = num_threads_numerica;
++
++ return 0;
++}
++
++static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
++{
++ uec_info_t *uec_info;
++ u32 end_bd;
++ u8 bmrx = 0;
++ int i;
++
++ uec_info = uec->uec_info;
++
++ /* Alloc global Tx parameter RAM page */
++ uec->tx_glbl_pram_offset = qe_muram_alloc(
++ sizeof(uec_tx_global_pram_t),
++ UEC_TX_GLOBAL_PRAM_ALIGNMENT);
++ uec->p_tx_glbl_pram = (uec_tx_global_pram_t *)
++ qe_muram_addr(uec->tx_glbl_pram_offset);
++
++ /* Zero the global Tx prameter RAM */
++ memset(uec->p_tx_glbl_pram, 0, sizeof(uec_tx_global_pram_t));
++
++ /* Init global Tx parameter RAM */
++
++ /* TEMODER, RMON statistics disable, one Tx queue */
++ out_be16(&uec->p_tx_glbl_pram->temoder, TEMODER_INIT_VALUE);
++
++ /* SQPTR */
++ uec->send_q_mem_reg_offset = qe_muram_alloc(
++ sizeof(uec_send_queue_qd_t),
++ UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT);
++ uec->p_send_q_mem_reg = (uec_send_queue_mem_region_t *)
++ qe_muram_addr(uec->send_q_mem_reg_offset);
++ out_be32(&uec->p_tx_glbl_pram->sqptr, uec->send_q_mem_reg_offset);
++
++ /* Setup the table with TxBDs ring */
++ end_bd = (u32)uec->p_tx_bd_ring + (uec_info->tx_bd_ring_len - 1)
++ * SIZEOFBD;
++ out_be32(&uec->p_send_q_mem_reg->sqqd[0].bd_ring_base,
++ (u32)(uec->p_tx_bd_ring));
++ out_be32(&uec->p_send_q_mem_reg->sqqd[0].last_bd_completed_address,
++ end_bd);
++
++ /* Scheduler Base Pointer, we have only one Tx queue, no need it */
++ out_be32(&uec->p_tx_glbl_pram->schedulerbasepointer, 0);
++
++ /* TxRMON Base Pointer, TxRMON disable, we don't need it */
++ out_be32(&uec->p_tx_glbl_pram->txrmonbaseptr, 0);
++
++ /* TSTATE, global snooping, big endian, the CSB bus selected */
++ bmrx = BMR_INIT_VALUE;
++ out_be32(&uec->p_tx_glbl_pram->tstate, ((u32)(bmrx) << BMR_SHIFT));
++
++ /* IPH_Offset */
++ for (i = 0; i < MAX_IPH_OFFSET_ENTRY; i++) {
++ out_8(&uec->p_tx_glbl_pram->iphoffset[i], 0);
++ }
++
++ /* VTAG table */
++ for (i = 0; i < UEC_TX_VTAG_TABLE_ENTRY_MAX; i++) {
++ out_be32(&uec->p_tx_glbl_pram->vtagtable[i], 0);
++ }
++
++ /* TQPTR */
++ uec->thread_dat_tx_offset = qe_muram_alloc(
++ num_threads_tx * sizeof(uec_thread_data_tx_t) +
++ 32 *(num_threads_tx == 1), UEC_THREAD_DATA_ALIGNMENT);
++
++ uec->p_thread_data_tx = (uec_thread_data_tx_t *)
++ qe_muram_addr(uec->thread_dat_tx_offset);
++ out_be32(&uec->p_tx_glbl_pram->tqptr, uec->thread_dat_tx_offset);
++}
++
++static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
++{
++ u8 bmrx = 0;
++ int i;
++ uec_82xx_address_filtering_pram_t *p_af_pram;
++
++ /* Allocate global Rx parameter RAM page */
++ uec->rx_glbl_pram_offset = qe_muram_alloc(
++ sizeof(uec_rx_global_pram_t), UEC_RX_GLOBAL_PRAM_ALIGNMENT);
++ uec->p_rx_glbl_pram = (uec_rx_global_pram_t *)
++ qe_muram_addr(uec->rx_glbl_pram_offset);
++
++ /* Zero Global Rx parameter RAM */
++ memset(uec->p_rx_glbl_pram, 0, sizeof(uec_rx_global_pram_t));
++
++ /* Init global Rx parameter RAM */
++ /* REMODER, Extended feature mode disable, VLAN disable,
++ LossLess flow control disable, Receive firmware statisic disable,
++ Extended address parsing mode disable, One Rx queues,
++ Dynamic maximum/minimum frame length disable, IP checksum check
++ disable, IP address alignment disable
++ */
++ out_be32(&uec->p_rx_glbl_pram->remoder, REMODER_INIT_VALUE);
++
++ /* RQPTR */
++ uec->thread_dat_rx_offset = qe_muram_alloc(
++ num_threads_rx * sizeof(uec_thread_data_rx_t),
++ UEC_THREAD_DATA_ALIGNMENT);
++ uec->p_thread_data_rx = (uec_thread_data_rx_t *)
++ qe_muram_addr(uec->thread_dat_rx_offset);
++ out_be32(&uec->p_rx_glbl_pram->rqptr, uec->thread_dat_rx_offset);
++
++ /* Type_or_Len */
++ out_be16(&uec->p_rx_glbl_pram->typeorlen, 3072);
++
++ /* RxRMON base pointer, we don't need it */
++ out_be32(&uec->p_rx_glbl_pram->rxrmonbaseptr, 0);
++
++ /* IntCoalescingPTR, we don't need it, no interrupt */
++ out_be32(&uec->p_rx_glbl_pram->intcoalescingptr, 0);
++
++ /* RSTATE, global snooping, big endian, the CSB bus selected */
++ bmrx = BMR_INIT_VALUE;
++ out_8(&uec->p_rx_glbl_pram->rstate, bmrx);
++
++ /* MRBLR */
++ out_be16(&uec->p_rx_glbl_pram->mrblr, MAX_RXBUF_LEN);
++
++ /* RBDQPTR */
++ uec->rx_bd_qs_tbl_offset = qe_muram_alloc(
++ sizeof(uec_rx_bd_queues_entry_t) + \
++ sizeof(uec_rx_prefetched_bds_t),
++ UEC_RX_BD_QUEUES_ALIGNMENT);
++ uec->p_rx_bd_qs_tbl = (uec_rx_bd_queues_entry_t *)
++ qe_muram_addr(uec->rx_bd_qs_tbl_offset);
++
++ /* Zero it */
++ memset(uec->p_rx_bd_qs_tbl, 0, sizeof(uec_rx_bd_queues_entry_t) + \
++ sizeof(uec_rx_prefetched_bds_t));
++ out_be32(&uec->p_rx_glbl_pram->rbdqptr, uec->rx_bd_qs_tbl_offset);
++ out_be32(&uec->p_rx_bd_qs_tbl->externalbdbaseptr,
++ (u32)uec->p_rx_bd_ring);
++
++ /* MFLR */
++ out_be16(&uec->p_rx_glbl_pram->mflr, MAX_FRAME_LEN);
++ /* MINFLR */
++ out_be16(&uec->p_rx_glbl_pram->minflr, MIN_FRAME_LEN);
++ /* MAXD1 */
++ out_be16(&uec->p_rx_glbl_pram->maxd1, MAX_DMA1_LEN);
++ /* MAXD2 */
++ out_be16(&uec->p_rx_glbl_pram->maxd2, MAX_DMA2_LEN);
++ /* ECAM_PTR */
++ out_be32(&uec->p_rx_glbl_pram->ecamptr, 0);
++ /* L2QT */
++ out_be32(&uec->p_rx_glbl_pram->l2qt, 0);
++ /* L3QT */
++ for (i = 0; i < 8; i++) {
++ out_be32(&uec->p_rx_glbl_pram->l3qt[i], 0);
++ }
++
++ /* VLAN_TYPE */
++ out_be16(&uec->p_rx_glbl_pram->vlantype, 0x8100);
++ /* TCI */
++ out_be16(&uec->p_rx_glbl_pram->vlantci, 0);
++
++ /* Clear PQ2 style address filtering hash table */
++ p_af_pram = (uec_82xx_address_filtering_pram_t *) \
++ uec->p_rx_glbl_pram->addressfiltering;
++
++ p_af_pram->iaddr_h = 0;
++ p_af_pram->iaddr_l = 0;
++ p_af_pram->gaddr_h = 0;
++ p_af_pram->gaddr_l = 0;
++}
++
++static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec,
++ int thread_tx, int thread_rx)
++{
++ uec_init_cmd_pram_t *p_init_enet_param;
++ u32 init_enet_param_offset;
++ uec_info_t *uec_info;
++ int i;
++ int snum;
++ u32 init_enet_offset;
++ u32 entry_val;
++ u32 command;
++ u32 cecr_subblock;
++
++ uec_info = uec->uec_info;
++
++ /* Allocate init enet command parameter */
++ uec->init_enet_param_offset = qe_muram_alloc(
++ sizeof(uec_init_cmd_pram_t), 4);
++ init_enet_param_offset = uec->init_enet_param_offset;
++ uec->p_init_enet_param = (uec_init_cmd_pram_t *)
++ qe_muram_addr(uec->init_enet_param_offset);
++
++ /* Zero init enet command struct */
++ memset((void *)uec->p_init_enet_param, 0, sizeof(uec_init_cmd_pram_t));
++
++ /* Init the command struct */
++ p_init_enet_param = uec->p_init_enet_param;
++ p_init_enet_param->resinit0 = ENET_INIT_PARAM_MAGIC_RES_INIT0;
++ p_init_enet_param->resinit1 = ENET_INIT_PARAM_MAGIC_RES_INIT1;
++ p_init_enet_param->resinit2 = ENET_INIT_PARAM_MAGIC_RES_INIT2;
++ p_init_enet_param->resinit3 = ENET_INIT_PARAM_MAGIC_RES_INIT3;
++ p_init_enet_param->resinit4 = ENET_INIT_PARAM_MAGIC_RES_INIT4;
++ p_init_enet_param->largestexternallookupkeysize = 0;
++
++ p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_rx)
++ << ENET_INIT_PARAM_RGF_SHIFT;
++ p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_tx)
++ << ENET_INIT_PARAM_TGF_SHIFT;
++
++ /* Init Rx global parameter pointer */
++ p_init_enet_param->rgftgfrxglobal |= uec->rx_glbl_pram_offset |
++ (u32)uec_info->riscRx;
++
++ /* Init Rx threads */
++ for (i = 0; i < (thread_rx + 1); i++) {
++ if ((snum = qe_get_snum()) < 0) {
++ printf("%s can not get snum\n", __FUNCTION__);
++ return -ENOMEM;
++ }
++
++ if (i==0) {
++ init_enet_offset = 0;
++ } else {
++ init_enet_offset = qe_muram_alloc(
++ sizeof(uec_thread_rx_pram_t),
++ UEC_THREAD_RX_PRAM_ALIGNMENT);
++ }
++
++ entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
++ init_enet_offset | (u32)uec_info->riscRx;
++ p_init_enet_param->rxthread[i] = entry_val;
++ }
++
++ /* Init Tx global parameter pointer */
++ p_init_enet_param->txglobal = uec->tx_glbl_pram_offset |
++ (u32)uec_info->riscTx;
++
++ /* Init Tx threads */
++ for (i = 0; i < thread_tx; i++) {
++ if ((snum = qe_get_snum()) < 0) {
++ printf("%s can not get snum\n", __FUNCTION__);
++ return -ENOMEM;
++ }
++
++ init_enet_offset = qe_muram_alloc(sizeof(uec_thread_tx_pram_t),
++ UEC_THREAD_TX_PRAM_ALIGNMENT);
++
++ entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
++ init_enet_offset | (u32)uec_info->riscTx;
++ p_init_enet_param->txthread[i] = entry_val;
++ }
++
++ __asm__ __volatile__("sync");
++
++ /* Issue QE command */
++ command = QE_INIT_TX_RX;
++ cecr_subblock = ucc_fast_get_qe_cr_subblock(
++ uec->uec_info->uf_info.ucc_num);
++ qe_issue_cmd(command, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET,
++ init_enet_param_offset);
++
++ return 0;
++}
++
++static int uec_startup(uec_private_t *uec)
++{
++ uec_info_t *uec_info;
++ ucc_fast_info_t *uf_info;
++ ucc_fast_private_t *uccf;
++ ucc_fast_t *uf_regs;
++ uec_t *uec_regs;
++ int num_threads_tx;
++ int num_threads_rx;
++ u32 utbipar;
++ enet_interface_e enet_interface;
++ u32 length;
++ u32 align;
++ qe_bd_t *bd;
++ u8 *buf;
++ int i;
++
++ if (!uec || !uec->uec_info) {
++ printf("%s: uec or uec_info not initial\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uec_info = uec->uec_info;
++ uf_info = &(uec_info->uf_info);
++
++ /* Check if Rx BD ring len is illegal */
++ if ((uec_info->rx_bd_ring_len < UEC_RX_BD_RING_SIZE_MIN) || \
++ (uec_info->rx_bd_ring_len % UEC_RX_BD_RING_SIZE_ALIGNMENT)) {
++ printf("%s: Rx BD ring len must be multiple of 4, and > 8.\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++
++ /* Check if Tx BD ring len is illegal */
++ if (uec_info->tx_bd_ring_len < UEC_TX_BD_RING_SIZE_MIN) {
++ printf("%s: Tx BD ring length must not be smaller than 2.\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++
++ /* Check if MRBLR is illegal */
++ if ((MAX_RXBUF_LEN == 0) || (MAX_RXBUF_LEN % UEC_MRBLR_ALIGNMENT)) {
++ printf("%s: max rx buffer length must be mutliple of 128.\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++
++ /* Both Rx and Tx are stopped */
++ uec->grace_stopped_rx = 1;
++ uec->grace_stopped_tx = 1;
++
++ /* Init UCC fast */
++ if (ucc_fast_init(uf_info, &uccf)) {
++ printf("%s: failed to init ucc fast\n", __FUNCTION__);
++ return -ENOMEM;
++ }
++
++ /* Save uccf */
++ uec->uccf = uccf;
++
++ /* Convert the Tx threads number */
++ if (uec_convert_threads_num(uec_info->num_threads_tx,
++ &num_threads_tx)) {
++ return -EINVAL;
++ }
++
++ /* Convert the Rx threads number */
++ if (uec_convert_threads_num(uec_info->num_threads_rx,
++ &num_threads_rx)) {
++ return -EINVAL;
++ }
++
++ uf_regs = uccf->uf_regs;
++
++ /* UEC register is following UCC fast registers */
++ uec_regs = (uec_t *)(&uf_regs->ucc_eth);
++
++ /* Save the UEC register pointer to UEC private struct */
++ uec->uec_regs = uec_regs;
++
++ /* Init UPSMR, enable hardware statistics (UCC) */
++ out_be32(&uec->uccf->uf_regs->upsmr, UPSMR_INIT_VALUE);
++
++ /* Init MACCFG1, flow control disable, disable Tx and Rx */
++ out_be32(&uec_regs->maccfg1, MACCFG1_INIT_VALUE);
++
++ /* Init MACCFG2, length check, MAC PAD and CRC enable */
++ out_be32(&uec_regs->maccfg2, MACCFG2_INIT_VALUE);
++
++ /* Setup MAC interface mode */
++ uec_set_mac_if_mode(uec, uec_info->enet_interface);
++
++ /* Setup MII master clock source */
++ qe_set_mii_clk_src(uec_info->uf_info.ucc_num);
++
++ /* Setup UTBIPAR */
++ utbipar = in_be32(&uec_regs->utbipar);
++ utbipar &= ~UTBIPAR_PHY_ADDRESS_MASK;
++ enet_interface = uec->uec_info->enet_interface;
++ if (enet_interface == ENET_1000_TBI ||
++ enet_interface == ENET_1000_RTBI) {
++ utbipar |= (uec_info->phy_address + uec_info->uf_info.ucc_num)
++ << UTBIPAR_PHY_ADDRESS_SHIFT;
++ } else {
++ utbipar |= (0x10 + uec_info->uf_info.ucc_num)
++ << UTBIPAR_PHY_ADDRESS_SHIFT;
++ }
++
++ out_be32(&uec_regs->utbipar, utbipar);
++
++ /* Allocate Tx BDs */
++ length = ((uec_info->tx_bd_ring_len * SIZEOFBD) /
++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) *
++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
++ if ((uec_info->tx_bd_ring_len * SIZEOFBD) %
++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) {
++ length += UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
++ }
++
++ align = UEC_TX_BD_RING_ALIGNMENT;
++ uec->tx_bd_ring_offset = (u32)malloc((u32)(length + align));
++ if (uec->tx_bd_ring_offset != 0) {
++ uec->p_tx_bd_ring = (u8 *)((uec->tx_bd_ring_offset + align)
++ & ~(align - 1));
++ }
++
++ /* Zero all of Tx BDs */
++ memset((void *)(uec->tx_bd_ring_offset), 0, length + align);
++
++ /* Allocate Rx BDs */
++ length = uec_info->rx_bd_ring_len * SIZEOFBD;
++ align = UEC_RX_BD_RING_ALIGNMENT;
++ uec->rx_bd_ring_offset = (u32)(malloc((u32)(length + align)));
++ if (uec->rx_bd_ring_offset != 0) {
++ uec->p_rx_bd_ring = (u8 *)((uec->rx_bd_ring_offset + align)
++ & ~(align - 1));
++ }
++
++ /* Zero all of Rx BDs */
++ memset((void *)(uec->rx_bd_ring_offset), 0, length + align);
++
++ /* Allocate Rx buffer */
++ length = uec_info->rx_bd_ring_len * MAX_RXBUF_LEN;
++ align = UEC_RX_DATA_BUF_ALIGNMENT;
++ uec->rx_buf_offset = (u32)malloc(length + align);
++ if (uec->rx_buf_offset != 0) {
++ uec->p_rx_buf = (u8 *)((uec->rx_buf_offset + align)
++ & ~(align - 1));
++ }
++
++ /* Zero all of the Rx buffer */
++ memset((void *)(uec->rx_buf_offset), 0, length + align);
++
++ /* Init TxBD ring */
++ bd = (qe_bd_t *)uec->p_tx_bd_ring;
++ uec->txBd = bd;
++
++ for (i = 0; i < uec_info->tx_bd_ring_len; i++) {
++ BD_DATA_CLEAR(bd);
++ BD_STATUS_SET(bd, 0);
++ BD_LENGTH_SET(bd, 0);
++ bd ++;
++ }
++ BD_STATUS_SET((--bd), TxBD_WRAP);
++
++ /* Init RxBD ring */
++ bd = (qe_bd_t *)uec->p_rx_bd_ring;
++ uec->rxBd = bd;
++ buf = uec->p_rx_buf;
++ for (i = 0; i < uec_info->rx_bd_ring_len; i++) {
++ BD_DATA_SET(bd, buf);
++ BD_LENGTH_SET(bd, 0);
++ BD_STATUS_SET(bd, RxBD_EMPTY);
++ buf += MAX_RXBUF_LEN;
++ bd ++;
++ }
++ BD_STATUS_SET((--bd), RxBD_WRAP | RxBD_EMPTY);
++
++ /* Init global Tx parameter RAM */
++ uec_init_tx_parameter(uec, num_threads_tx);
++
++ /* Init global Rx parameter RAM */
++ uec_init_rx_parameter(uec, num_threads_rx);
++
++ /* Init ethernet Tx and Rx parameter command */
++ if (uec_issue_init_enet_rxtx_cmd(uec, num_threads_tx,
++ num_threads_rx)) {
++ printf("%s issue init enet cmd failed\n", __FUNCTION__);
++ return -ENOMEM;
++ }
++
++ return 0;
++}
++
++static int uec_init(struct eth_device* dev, bd_t *bd)
++{
++ uec_private_t *uec;
++ int err;
++
++ uec = (uec_private_t *)dev->priv;
++
++ if (uec->the_first_run == 0) {
++ /* Set up the MAC address */
++ if (dev->enetaddr[0] & 0x01) {
++ printf("%s: MacAddress is multcast address\n",
++ __FUNCTION__);
++ return -EINVAL;
++ }
++ uec_set_mac_address(uec, dev->enetaddr);
++ uec->the_first_run = 1;
++ }
++
++ err = uec_open(uec, COMM_DIR_RX_AND_TX);
++ if (err) {
++ printf("%s: cannot enable UEC device\n", dev->name);
++ return err;
++ }
++
++ return 0;
++}
++
++static void uec_halt(struct eth_device* dev)
++{
++ uec_private_t *uec = (uec_private_t *)dev->priv;
++ uec_stop(uec, COMM_DIR_RX_AND_TX);
++}
++
++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;
++ int i;
++ int result = 0;
++
++ uec = (uec_private_t *)dev->priv;
++ uccf = uec->uccf;
++ bd = uec->txBd;
++
++ /* Find an empty TxBD */
++ for (i = 0; BD_STATUS(bd) & TxBD_READY; i++) {
++ if (i > 0x100000) {
++ printf("%s: tx buffer not ready\n", dev->name);
++ return result;
++ }
++ }
++
++ /* Init TxBD */
++ BD_DATA_SET(bd, buf);
++ BD_LENGTH_SET(bd, len);
++ status = BD_STATUS(bd);
++ status &= BD_WRAP;
++ status |= (TxBD_READY | TxBD_LAST);
++ BD_STATUS_SET(bd, status);
++
++ /* Tell UCC to transmit the buffer */
++ ucc_fast_transmit_on_demand(uccf);
++
++ /* Wait for buffer to be transmitted */
++ status = BD_STATUS(bd);
++ for (i = 0; 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 */
++ BD_ADVANCE(bd, status, uec->p_tx_bd_ring);
++ uec->txBd = bd;
++ result = 1;
++
++ return result;
++}
++
++static int uec_recv(struct eth_device* dev)
++{
++ uec_private_t *uec = dev->priv;
++ volatile qe_bd_t *bd;
++ volatile u16 status;
++ u16 len;
++ u8 *data;
++
++ bd = uec->rxBd;
++ status = BD_STATUS(bd);
++
++ while (!(status & RxBD_EMPTY)) {
++ if (!(status & RxBD_ERROR)) {
++ data = BD_DATA(bd);
++ len = BD_LENGTH(bd);
++ NetReceive(data, len);
++ } else {
++ printf("%s: Rx error\n", dev->name);
++ }
++ status &= BD_CLEAN;
++ 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);
++ }
++ uec->rxBd = bd;
++
++ return 1;
++}
++
++int uec_initialize(int index)
++{
++ struct eth_device *dev;
++ int i;
++ uec_private_t *uec;
++ uec_info_t *uec_info;
++ int err;
++
++ dev = (struct eth_device *)malloc(sizeof(struct eth_device));
++ if (!dev)
++ return 0;
++ memset(dev, 0, sizeof(struct eth_device));
++
++ /* Allocate the UEC private struct */
++ uec = (uec_private_t *)malloc(sizeof(uec_private_t));
++ if (!uec) {
++ return -ENOMEM;
++ }
++ memset(uec, 0, sizeof(uec_private_t));
++
++ /* Init UEC private struct, they come from board.h */
++ if (index == 0) {
++#ifdef CONFIG_UEC_ETH1
++ uec_info = &eth1_uec_info;
++#endif
++ } else if (index == 1) {
++#ifdef CONFIG_UEC_ETH2
++ uec_info = &eth2_uec_info;
++#endif
++ } else {
++ printf("%s: index is illegal.\n", __FUNCTION__);
++ return -EINVAL;
++ }
++
++ uec->uec_info = uec_info;
++
++ sprintf(dev->name, "FSL UEC%d", index);
++ dev->iobase = 0;
++ dev->priv = (void *)uec;
++ dev->init = uec_init;
++ dev->halt = uec_halt;
++ dev->send = uec_send;
++ dev->recv = uec_recv;
++
++ /* Clear the ethnet address */
++ for (i = 0; i < 6; i++)
++ dev->enetaddr[i] = 0;
++
++ eth_register(dev);
++
++ err = uec_startup(uec);
++ if (err) {
++ printf("%s: Cannot configure net device, aborting.",dev->name);
++ return err;
++ }
++
++ err = init_phy(dev);
++ if (err) {
++ printf("%s: Cannot initialize PHY, aborting.\n", dev->name);
++ return err;
++ }
++
++ phy_change(dev);
++
++ return 1;
++}
++#endif /* CONFIG_QE */
+diff -Naupr u-boot-1.1.6/drivers/qe/uec.h u-boot-1.1.6-fsl-1/drivers/qe/uec.h
+--- u-boot-1.1.6/drivers/qe/uec.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uec.h 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,716 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@freescale.com>
++ * based on source code of Shlomi Gridish
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public 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 __UEC_H__
++#define __UEC_H__
++
++#define MAX_TX_THREADS 8
++#define MAX_RX_THREADS 8
++#define MAX_TX_QUEUES 8
++#define MAX_RX_QUEUES 8
++#define MAX_PREFETCHED_BDS 4
++#define MAX_IPH_OFFSET_ENTRY 8
++#define MAX_ENET_INIT_PARAM_ENTRIES_RX 9
++#define MAX_ENET_INIT_PARAM_ENTRIES_TX 8
++
++/* UEC UPSMR (Protocol Specific Mode Register)
++ */
++#define UPSMR_ECM 0x04000000 /* Enable CAM Miss */
++#define UPSMR_HSE 0x02000000 /* Hardware Statistics Enable */
++#define UPSMR_PRO 0x00400000 /* Promiscuous */
++#define UPSMR_CAP 0x00200000 /* CAM polarity */
++#define UPSMR_RSH 0x00100000 /* Receive Short Frames */
++#define UPSMR_RPM 0x00080000 /* Reduced Pin Mode interfaces */
++#define UPSMR_R10M 0x00040000 /* RGMII/RMII 10 Mode */
++#define UPSMR_RLPB 0x00020000 /* RMII Loopback Mode */
++#define UPSMR_TBIM 0x00010000 /* Ten-bit Interface Mode */
++#define UPSMR_RMM 0x00001000 /* RMII/RGMII Mode */
++#define UPSMR_CAM 0x00000400 /* CAM Address Matching */
++#define UPSMR_BRO 0x00000200 /* Broadcast Address */
++#define UPSMR_RES1 0x00002000 /* Reserved feild - must be 1 */
++
++#define UPSMR_INIT_VALUE (UPSMR_HSE | UPSMR_RES1)
++
++/* UEC MACCFG1 (MAC Configuration 1 Register)
++ */
++#define MACCFG1_FLOW_RX 0x00000020 /* Flow Control Rx */
++#define MACCFG1_FLOW_TX 0x00000010 /* Flow Control Tx */
++#define MACCFG1_ENABLE_SYNCHED_RX 0x00000008 /* Enable Rx Sync */
++#define MACCFG1_ENABLE_RX 0x00000004 /* Enable Rx */
++#define MACCFG1_ENABLE_SYNCHED_TX 0x00000002 /* Enable Tx Sync */
++#define MACCFG1_ENABLE_TX 0x00000001 /* Enable Tx */
++
++#define MACCFG1_INIT_VALUE (0)
++
++/* UEC MACCFG2 (MAC Configuration 2 Register)
++ */
++#define MACCFG2_PREL 0x00007000
++#define MACCFG2_PREL_SHIFT (31 - 19)
++#define MACCFG2_PREL_MASK 0x0000f000
++#define MACCFG2_SRP 0x00000080
++#define MACCFG2_STP 0x00000040
++#define MACCFG2_RESERVED_1 0x00000020 /* must be set */
++#define MACCFG2_LC 0x00000010 /* Length Check */
++#define MACCFG2_MPE 0x00000008
++#define MACCFG2_FDX 0x00000001 /* Full Duplex */
++#define MACCFG2_FDX_MASK 0x00000001
++#define MACCFG2_PAD_CRC 0x00000004
++#define MACCFG2_CRC_EN 0x00000002
++#define MACCFG2_PAD_AND_CRC_MODE_NONE 0x00000000
++#define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY 0x00000002
++#define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC 0x00000004
++#define MACCFG2_INTERFACE_MODE_NIBBLE 0x00000100
++#define MACCFG2_INTERFACE_MODE_BYTE 0x00000200
++#define MACCFG2_INTERFACE_MODE_MASK 0x00000300
++
++#define MACCFG2_INIT_VALUE (MACCFG2_PREL | MACCFG2_RESERVED_1 | \
++ MACCFG2_LC | MACCFG2_PAD_CRC | MACCFG2_FDX)
++
++/* UEC Event Register
++*/
++#define UCCE_MPD 0x80000000
++#define UCCE_SCAR 0x40000000
++#define UCCE_GRA 0x20000000
++#define UCCE_CBPR 0x10000000
++#define UCCE_BSY 0x08000000
++#define UCCE_RXC 0x04000000
++#define UCCE_TXC 0x02000000
++#define UCCE_TXE 0x01000000
++#define UCCE_TXB7 0x00800000
++#define UCCE_TXB6 0x00400000
++#define UCCE_TXB5 0x00200000
++#define UCCE_TXB4 0x00100000
++#define UCCE_TXB3 0x00080000
++#define UCCE_TXB2 0x00040000
++#define UCCE_TXB1 0x00020000
++#define UCCE_TXB0 0x00010000
++#define UCCE_RXB7 0x00008000
++#define UCCE_RXB6 0x00004000
++#define UCCE_RXB5 0x00002000
++#define UCCE_RXB4 0x00001000
++#define UCCE_RXB3 0x00000800
++#define UCCE_RXB2 0x00000400
++#define UCCE_RXB1 0x00000200
++#define UCCE_RXB0 0x00000100
++#define UCCE_RXF7 0x00000080
++#define UCCE_RXF6 0x00000040
++#define UCCE_RXF5 0x00000020
++#define UCCE_RXF4 0x00000010
++#define UCCE_RXF3 0x00000008
++#define UCCE_RXF2 0x00000004
++#define UCCE_RXF1 0x00000002
++#define UCCE_RXF0 0x00000001
++
++#define UCCE_TXB (UCCE_TXB7 | UCCE_TXB6 | UCCE_TXB5 | UCCE_TXB4 | \
++ UCCE_TXB3 | UCCE_TXB2 | UCCE_TXB1 | UCCE_TXB0)
++#define UCCE_RXB (UCCE_RXB7 | UCCE_RXB6 | UCCE_RXB5 | UCCE_RXB4 | \
++ UCCE_RXB3 | UCCE_RXB2 | UCCE_RXB1 | UCCE_RXB0)
++#define UCCE_RXF (UCCE_RXF7 | UCCE_RXF6 | UCCE_RXF5 | UCCE_RXF4 | \
++ UCCE_RXF3 | UCCE_RXF2 | UCCE_RXF1 | UCCE_RXF0)
++#define UCCE_OTHER (UCCE_SCAR | UCCE_GRA | UCCE_CBPR | UCCE_BSY | \
++ UCCE_RXC | UCCE_TXC | UCCE_TXE)
++
++/* UEC TEMODR Register
++*/
++#define TEMODER_SCHEDULER_ENABLE 0x2000
++#define TEMODER_IP_CHECKSUM_GENERATE 0x0400
++#define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200
++#define TEMODER_RMON_STATISTICS 0x0100
++#define TEMODER_NUM_OF_QUEUES_SHIFT (15-15)
++
++#define TEMODER_INIT_VALUE 0xc000
++
++/* UEC REMODR Register
++*/
++#define REMODER_RX_RMON_STATISTICS_ENABLE 0x00001000
++#define REMODER_RX_EXTENDED_FEATURES 0x80000000
++#define REMODER_VLAN_OPERATION_TAGGED_SHIFT (31-9 )
++#define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT (31-10)
++#define REMODER_RX_QOS_MODE_SHIFT (31-15)
++#define REMODER_RMON_STATISTICS 0x00001000
++#define REMODER_RX_EXTENDED_FILTERING 0x00000800
++#define REMODER_NUM_OF_QUEUES_SHIFT (31-23)
++#define REMODER_DYNAMIC_MAX_FRAME_LENGTH 0x00000008
++#define REMODER_DYNAMIC_MIN_FRAME_LENGTH 0x00000004
++#define REMODER_IP_CHECKSUM_CHECK 0x00000002
++#define REMODER_IP_ADDRESS_ALIGNMENT 0x00000001
++
++#define REMODER_INIT_VALUE 0
++
++/* BMRx - Bus Mode Register */
++#define BMR_GLB 0x20
++#define BMR_BO_BE 0x10
++#define BMR_DTB_SECONDARY_BUS 0x02
++#define BMR_BDB_SECONDARY_BUS 0x01
++
++#define BMR_SHIFT 24
++#define BMR_INIT_VALUE (BMR_GLB | BMR_BO_BE)
++
++/* UEC UCCS (Ethernet Status Register)
++ */
++#define UCCS_BPR 0x02
++#define UCCS_PAU 0x02
++#define UCCS_MPD 0x01
++
++/* UEC MIIMCFG (MII Management Configuration Register)
++ */
++#define MIIMCFG_RESET_MANAGEMENT 0x80000000
++#define MIIMCFG_NO_PREAMBLE 0x00000010
++#define MIIMCFG_CLOCK_DIVIDE_SHIFT (31 - 31)
++#define MIIMCFG_CLOCK_DIVIDE_MASK 0x0000000f
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_4 0x00000001
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_6 0x00000002
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_8 0x00000003
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10 0x00000004
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_14 0x00000005
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_20 0x00000006
++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_28 0x00000007
++
++#define MIIMCFG_MNGMNT_CLC_DIV_INIT_VALUE \
++ MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10
++
++/* UEC MIIMCOM (MII Management Command Register)
++ */
++#define MIIMCOM_SCAN_CYCLE 0x00000002 /* Scan cycle */
++#define MIIMCOM_READ_CYCLE 0x00000001 /* Read cycle */
++
++/* UEC MIIMADD (MII Management Address Register)
++ */
++#define MIIMADD_PHY_ADDRESS_SHIFT (31 - 23)
++#define MIIMADD_PHY_REGISTER_SHIFT (31 - 31)
++
++/* UEC MIIMCON (MII Management Control Register)
++ */
++#define MIIMCON_PHY_CONTROL_SHIFT (31 - 31)
++#define MIIMCON_PHY_STATUS_SHIFT (31 - 31)
++
++/* UEC MIIMIND (MII Management Indicator Register)
++ */
++#define MIIMIND_NOT_VALID 0x00000004
++#define MIIMIND_SCAN 0x00000002
++#define MIIMIND_BUSY 0x00000001
++
++/* UEC UTBIPAR (Ten Bit Interface Physical Address Register)
++ */
++#define UTBIPAR_PHY_ADDRESS_SHIFT (31 - 31)
++#define UTBIPAR_PHY_ADDRESS_MASK 0x0000001f
++
++/* UEC UESCR (Ethernet Statistics Control Register)
++ */
++#define UESCR_AUTOZ 0x8000
++#define UESCR_CLRCNT 0x4000
++#define UESCR_MAXCOV_SHIFT (15 - 7)
++#define UESCR_SCOV_SHIFT (15 - 15)
++
++/****** Tx data struct collection ******/
++/* Tx thread data, each Tx thread has one this struct.
++*/
++typedef struct uec_thread_data_tx {
++ u8 res0[136];
++} __attribute__ ((packed)) uec_thread_data_tx_t;
++
++/* Tx thread parameter, each Tx thread has one this struct.
++*/
++typedef struct uec_thread_tx_pram {
++ u8 res0[64];
++} __attribute__ ((packed)) uec_thread_tx_pram_t;
++
++/* Send queue queue-descriptor, each Tx queue has one this QD
++*/
++typedef struct uec_send_queue_qd {
++ u32 bd_ring_base; /* pointer to BD ring base address */
++ u8 res0[0x8];
++ u32 last_bd_completed_address; /* last entry in BD ring */
++ u8 res1[0x30];
++} __attribute__ ((packed)) uec_send_queue_qd_t;
++
++/* Send queue memory region */
++typedef struct uec_send_queue_mem_region {
++ uec_send_queue_qd_t sqqd[MAX_TX_QUEUES];
++} __attribute__ ((packed)) uec_send_queue_mem_region_t;
++
++/* Scheduler struct
++*/
++typedef struct uec_scheduler {
++ u16 cpucount0; /* CPU packet counter */
++ u16 cpucount1; /* CPU packet counter */
++ u16 cecount0; /* QE packet counter */
++ u16 cecount1; /* QE packet counter */
++ u16 cpucount2; /* CPU packet counter */
++ u16 cpucount3; /* CPU packet counter */
++ u16 cecount2; /* QE packet counter */
++ u16 cecount3; /* QE packet counter */
++ u16 cpucount4; /* CPU packet counter */
++ u16 cpucount5; /* CPU packet counter */
++ u16 cecount4; /* QE packet counter */
++ u16 cecount5; /* QE packet counter */
++ u16 cpucount6; /* CPU packet counter */
++ u16 cpucount7; /* CPU packet counter */
++ u16 cecount6; /* QE packet counter */
++ u16 cecount7; /* QE packet counter */
++ u32 weightstatus[MAX_TX_QUEUES]; /* accumulated weight factor */
++ u32 rtsrshadow; /* temporary variable handled by QE */
++ u32 time; /* temporary variable handled by QE */
++ u32 ttl; /* temporary variable handled by QE */
++ u32 mblinterval; /* max burst length interval */
++ u16 nortsrbytetime; /* normalized value of byte time in tsr units */
++ u8 fracsiz;
++ u8 res0[1];
++ u8 strictpriorityq; /* Strict Priority Mask register */
++ u8 txasap; /* Transmit ASAP register */
++ u8 extrabw; /* Extra BandWidth register */
++ u8 oldwfqmask; /* temporary variable handled by QE */
++ u8 weightfactor[MAX_TX_QUEUES]; /**< weight factor for queues */
++ u32 minw; /* temporary variable handled by QE */
++ u8 res1[0x70-0x64];
++} __attribute__ ((packed)) uec_scheduler_t;
++
++/* Tx firmware counters
++*/
++typedef struct uec_tx_firmware_statistics_pram {
++ u32 sicoltx; /* single collision */
++ u32 mulcoltx; /* multiple collision */
++ u32 latecoltxfr; /* late collision */
++ u32 frabortduecol; /* frames aborted due to tx collision */
++ u32 frlostinmactxer; /* frames lost due to internal MAC error tx */
++ u32 carriersenseertx; /* carrier sense error */
++ u32 frtxok; /* frames transmitted OK */
++ u32 txfrexcessivedefer;
++ u32 txpkts256; /* total packets(including bad) 256~511 B */
++ u32 txpkts512; /* total packets(including bad) 512~1023B */
++ u32 txpkts1024; /* total packets(including bad) 1024~1518B */
++ u32 txpktsjumbo; /* total packets(including bad) >1024 */
++} __attribute__ ((packed)) uec_tx_firmware_statistics_pram_t;
++
++/* Tx global parameter table
++*/
++typedef struct uec_tx_global_pram {
++ u16 temoder;
++ u8 res0[0x38-0x02];
++ u32 sqptr;
++ u32 schedulerbasepointer;
++ u32 txrmonbaseptr;
++ u32 tstate;
++ u8 iphoffset[MAX_IPH_OFFSET_ENTRY];
++ u32 vtagtable[0x8];
++ u32 tqptr;
++ u8 res2[0x80-0x74];
++} __attribute__ ((packed)) uec_tx_global_pram_t;
++
++
++/****** Rx data struct collection ******/
++/* Rx thread data, each Rx thread has one this struct.
++*/
++typedef struct uec_thread_data_rx {
++ u8 res0[40];
++} __attribute__ ((packed)) uec_thread_data_rx_t;
++
++/* Rx thread parameter, each Rx thread has one this struct.
++*/
++typedef struct uec_thread_rx_pram {
++ u8 res0[128];
++} __attribute__ ((packed)) uec_thread_rx_pram_t;
++
++/* Rx firmware counters
++*/
++typedef struct uec_rx_firmware_statistics_pram {
++ u32 frrxfcser; /* frames with crc error */
++ u32 fraligner; /* frames with alignment error */
++ u32 inrangelenrxer; /* in range length error */
++ u32 outrangelenrxer; /* out of range length error */
++ u32 frtoolong; /* frame too long */
++ u32 runt; /* runt */
++ u32 verylongevent; /* very long event */
++ u32 symbolerror; /* symbol error */
++ u32 dropbsy; /* drop because of BD not ready */
++ u8 res0[0x8];
++ u32 mismatchdrop; /* drop because of MAC filtering */
++ u32 underpkts; /* total frames less than 64 octets */
++ u32 pkts256; /* total frames(including bad)256~511 B */
++ u32 pkts512; /* total frames(including bad)512~1023 B */
++ u32 pkts1024; /* total frames(including bad)1024~1518 B */
++ u32 pktsjumbo; /* total frames(including bad) >1024 B */
++ u32 frlossinmacer;
++ u32 pausefr; /* pause frames */
++ u8 res1[0x4];
++ u32 removevlan;
++ u32 replacevlan;
++ u32 insertvlan;
++} __attribute__ ((packed)) uec_rx_firmware_statistics_pram_t;
++
++/* Rx interrupt coalescing entry, each Rx queue has one this entry.
++*/
++typedef struct uec_rx_interrupt_coalescing_entry {
++ u32 maxvalue;
++ u32 counter;
++} __attribute__ ((packed)) uec_rx_interrupt_coalescing_entry_t;
++
++typedef struct uec_rx_interrupt_coalescing_table {
++ uec_rx_interrupt_coalescing_entry_t entry[MAX_RX_QUEUES];
++} __attribute__ ((packed)) uec_rx_interrupt_coalescing_table_t;
++
++/* RxBD queue entry, each Rx queue has one this entry.
++*/
++typedef struct uec_rx_bd_queues_entry {
++ u32 bdbaseptr; /* BD base pointer */
++ u32 bdptr; /* BD pointer */
++ u32 externalbdbaseptr; /* external BD base pointer */
++ u32 externalbdptr; /* external BD pointer */
++} __attribute__ ((packed)) uec_rx_bd_queues_entry_t;
++
++/* Rx global paramter table
++*/
++typedef struct uec_rx_global_pram {
++ u32 remoder; /* ethernet mode reg. */
++ u32 rqptr; /* base pointer to the Rx Queues */
++ u32 res0[0x1];
++ u8 res1[0x20-0xC];
++ u16 typeorlen;
++ u8 res2[0x1];
++ u8 rxgstpack; /* ack on GRACEFUL STOP RX command */
++ u32 rxrmonbaseptr; /* Rx RMON statistics base */
++ u8 res3[0x30-0x28];
++ u32 intcoalescingptr; /* Interrupt coalescing table pointer */
++ u8 res4[0x36-0x34];
++ u8 rstate;
++ u8 res5[0x46-0x37];
++ u16 mrblr; /* max receive buffer length reg. */
++ u32 rbdqptr; /* RxBD parameter table description */
++ u16 mflr; /* max frame length reg. */
++ u16 minflr; /* min frame length reg. */
++ u16 maxd1; /* max dma1 length reg. */
++ u16 maxd2; /* max dma2 length reg. */
++ u32 ecamptr; /* external CAM address */
++ u32 l2qt; /* VLAN priority mapping table. */
++ u32 l3qt[0x8]; /* IP priority mapping table. */
++ u16 vlantype; /* vlan type */
++ u16 vlantci; /* default vlan tci */
++ u8 addressfiltering[64];/* address filtering data structure */
++ u32 exfGlobalParam; /* extended filtering global parameters */
++ u8 res6[0x100-0xC4]; /* Initialize to zero */
++} __attribute__ ((packed)) uec_rx_global_pram_t;
++
++#define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01
++
++
++/****** UEC common ******/
++/* UCC statistics - hardware counters
++*/
++typedef struct uec_hardware_statistics {
++ u32 tx64;
++ u32 tx127;
++ u32 tx255;
++ u32 rx64;
++ u32 rx127;
++ u32 rx255;
++ u32 txok;
++ u16 txcf;
++ u32 tmca;
++ u32 tbca;
++ u32 rxfok;
++ u32 rxbok;
++ u32 rbyt;
++ u32 rmca;
++ u32 rbca;
++} __attribute__ ((packed)) uec_hardware_statistics_t;
++
++/* InitEnet command parameter
++*/
++typedef struct uec_init_cmd_pram {
++ u8 resinit0;
++ u8 resinit1;
++ u8 resinit2;
++ u8 resinit3;
++ u16 resinit4;
++ u8 res1[0x1];
++ u8 largestexternallookupkeysize;
++ u32 rgftgfrxglobal;
++ u32 rxthread[MAX_ENET_INIT_PARAM_ENTRIES_RX]; /* rx threads */
++ u8 res2[0x38 - 0x30];
++ u32 txglobal; /* tx global */
++ u32 txthread[MAX_ENET_INIT_PARAM_ENTRIES_TX]; /* tx threads */
++ u8 res3[0x1];
++} __attribute__ ((packed)) uec_init_cmd_pram_t;
++
++#define ENET_INIT_PARAM_RGF_SHIFT (32 - 4)
++#define ENET_INIT_PARAM_TGF_SHIFT (32 - 8)
++
++#define ENET_INIT_PARAM_RISC_MASK 0x0000003f
++#define ENET_INIT_PARAM_PTR_MASK 0x00ffffc0
++#define ENET_INIT_PARAM_SNUM_MASK 0xff000000
++#define ENET_INIT_PARAM_SNUM_SHIFT 24
++
++#define ENET_INIT_PARAM_MAGIC_RES_INIT0 0x06
++#define ENET_INIT_PARAM_MAGIC_RES_INIT1 0x30
++#define ENET_INIT_PARAM_MAGIC_RES_INIT2 0xff
++#define ENET_INIT_PARAM_MAGIC_RES_INIT3 0x00
++#define ENET_INIT_PARAM_MAGIC_RES_INIT4 0x0400
++
++/* structure representing 82xx Address Filtering Enet Address in PRAM
++*/
++typedef struct uec_82xx_enet_address {
++ u8 res1[0x2];
++ u16 h; /* address (MSB) */
++ u16 m; /* address */
++ u16 l; /* address (LSB) */
++} __attribute__ ((packed)) uec_82xx_enet_address_t;
++
++/* structure representing 82xx Address Filtering PRAM
++*/
++typedef struct uec_82xx_address_filtering_pram {
++ u32 iaddr_h; /* individual address filter, high */
++ u32 iaddr_l; /* individual address filter, low */
++ u32 gaddr_h; /* group address filter, high */
++ u32 gaddr_l; /* group address filter, low */
++ uec_82xx_enet_address_t taddr;
++ uec_82xx_enet_address_t paddr[4];
++ u8 res0[0x40-0x38];
++} __attribute__ ((packed)) uec_82xx_address_filtering_pram_t;
++
++/* Buffer Descriptor
++*/
++typedef struct buffer_descriptor {
++ u16 status;
++ u16 len;
++ u32 data;
++} __attribute__ ((packed)) qe_bd_t, *p_bd_t;
++
++#define SIZEOFBD sizeof(qe_bd_t)
++
++/* Common BD flags
++*/
++#define BD_WRAP 0x2000
++#define BD_INT 0x1000
++#define BD_LAST 0x0800
++#define BD_CLEAN 0x3000
++
++/* TxBD status flags
++*/
++#define TxBD_READY 0x8000
++#define TxBD_PADCRC 0x4000
++#define TxBD_WRAP BD_WRAP
++#define TxBD_INT BD_INT
++#define TxBD_LAST BD_LAST
++#define TxBD_TXCRC 0x0400
++#define TxBD_DEF 0x0200
++#define TxBD_PP 0x0100
++#define TxBD_LC 0x0080
++#define TxBD_RL 0x0040
++#define TxBD_RC 0x003C
++#define TxBD_UNDERRUN 0x0002
++#define TxBD_TRUNC 0x0001
++
++#define TxBD_ERROR (TxBD_UNDERRUN | TxBD_TRUNC)
++
++/* RxBD status flags
++*/
++#define RxBD_EMPTY 0x8000
++#define RxBD_OWNER 0x4000
++#define RxBD_WRAP BD_WRAP
++#define RxBD_INT BD_INT
++#define RxBD_LAST BD_LAST
++#define RxBD_FIRST 0x0400
++#define RxBD_CMR 0x0200
++#define RxBD_MISS 0x0100
++#define RxBD_BCAST 0x0080
++#define RxBD_MCAST 0x0040
++#define RxBD_LG 0x0020
++#define RxBD_NO 0x0010
++#define RxBD_SHORT 0x0008
++#define RxBD_CRCERR 0x0004
++#define RxBD_OVERRUN 0x0002
++#define RxBD_IPCH 0x0001
++
++#define RxBD_ERROR (RxBD_LG | RxBD_NO | RxBD_SHORT | \
++ RxBD_CRCERR | RxBD_OVERRUN)
++
++/* BD access macros
++*/
++#define BD_STATUS(_bd) (((p_bd_t)(_bd))->status)
++#define BD_STATUS_SET(_bd, _val) (((p_bd_t)(_bd))->status = _val)
++#define BD_LENGTH(_bd) (((p_bd_t)(_bd))->len)
++#define BD_LENGTH_SET(_bd, _val) (((p_bd_t)(_bd))->len = _val)
++#define BD_DATA_CLEAR(_bd) (((p_bd_t)(_bd))->data = 0)
++#define BD_IS_DATA(_bd) (((p_bd_t)(_bd))->data)
++#define BD_DATA(_bd) ((u8 *)(((p_bd_t)(_bd))->data))
++#define BD_DATA_SET(_bd, _data) (((p_bd_t)(_bd))->data = (u32)(_data))
++#define BD_ADVANCE(_bd,_status,_base) \
++ (((_status) & BD_WRAP) ? (_bd) = ((p_bd_t)(_base)) : ++(_bd))
++
++/* Rx Prefetched BDs
++*/
++typedef struct uec_rx_prefetched_bds {
++ qe_bd_t bd[MAX_PREFETCHED_BDS]; /* prefetched bd */
++} __attribute__ ((packed)) uec_rx_prefetched_bds_t;
++
++/* Alignments
++ */
++#define UEC_RX_GLOBAL_PRAM_ALIGNMENT 64
++#define UEC_TX_GLOBAL_PRAM_ALIGNMENT 64
++#define UEC_THREAD_RX_PRAM_ALIGNMENT 128
++#define UEC_THREAD_TX_PRAM_ALIGNMENT 64
++#define UEC_THREAD_DATA_ALIGNMENT 256
++#define UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT 32
++#define UEC_SCHEDULER_ALIGNMENT 4
++#define UEC_TX_STATISTICS_ALIGNMENT 4
++#define UEC_RX_STATISTICS_ALIGNMENT 4
++#define UEC_RX_INTERRUPT_COALESCING_ALIGNMENT 4
++#define UEC_RX_BD_QUEUES_ALIGNMENT 8
++#define UEC_RX_PREFETCHED_BDS_ALIGNMENT 128
++#define UEC_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT 4
++#define UEC_RX_BD_RING_ALIGNMENT 32
++#define UEC_TX_BD_RING_ALIGNMENT 32
++#define UEC_MRBLR_ALIGNMENT 128
++#define UEC_RX_BD_RING_SIZE_ALIGNMENT 4
++#define UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT 32
++#define UEC_RX_DATA_BUF_ALIGNMENT 64
++
++#define UEC_VLAN_PRIORITY_MAX 8
++#define UEC_IP_PRIORITY_MAX 64
++#define UEC_TX_VTAG_TABLE_ENTRY_MAX 8
++#define UEC_RX_BD_RING_SIZE_MIN 8
++#define UEC_TX_BD_RING_SIZE_MIN 2
++
++/* Ethernet speed
++*/
++typedef enum enet_speed {
++ ENET_SPEED_10BT, /* 10 Base T */
++ ENET_SPEED_100BT, /* 100 Base T */
++ ENET_SPEED_1000BT /* 1000 Base T */
++} enet_speed_e;
++
++/* Ethernet Address Type.
++*/
++typedef enum enet_addr_type {
++ ENET_ADDR_TYPE_INDIVIDUAL,
++ ENET_ADDR_TYPE_GROUP,
++ ENET_ADDR_TYPE_BROADCAST
++} enet_addr_type_e;
++
++/* TBI / MII Set Register
++*/
++typedef enum enet_tbi_mii_reg {
++ ENET_TBI_MII_CR = 0x00,
++ ENET_TBI_MII_SR = 0x01,
++ ENET_TBI_MII_ANA = 0x04,
++ ENET_TBI_MII_ANLPBPA = 0x05,
++ ENET_TBI_MII_ANEX = 0x06,
++ ENET_TBI_MII_ANNPT = 0x07,
++ ENET_TBI_MII_ANLPANP = 0x08,
++ ENET_TBI_MII_EXST = 0x0F,
++ ENET_TBI_MII_JD = 0x10,
++ ENET_TBI_MII_TBICON = 0x11
++} enet_tbi_mii_reg_e;
++
++/* UEC number of threads
++*/
++typedef enum uec_num_of_threads {
++ UEC_NUM_OF_THREADS_1 = 0x1, /* 1 */
++ UEC_NUM_OF_THREADS_2 = 0x2, /* 2 */
++ UEC_NUM_OF_THREADS_4 = 0x0, /* 4 */
++ UEC_NUM_OF_THREADS_6 = 0x3, /* 6 */
++ UEC_NUM_OF_THREADS_8 = 0x4 /* 8 */
++} uec_num_of_threads_e;
++
++/* UEC ethernet interface type
++*/
++typedef enum enet_interface {
++ ENET_10_MII,
++ ENET_10_RMII,
++ ENET_10_RGMII,
++ ENET_100_MII,
++ ENET_100_RMII,
++ ENET_100_RGMII,
++ ENET_1000_GMII,
++ ENET_1000_RGMII,
++ ENET_1000_TBI,
++ ENET_1000_RTBI
++} enet_interface_e;
++
++/* UEC initialization info struct
++*/
++typedef struct uec_info {
++ ucc_fast_info_t uf_info;
++ uec_num_of_threads_e num_threads_tx;
++ uec_num_of_threads_e num_threads_rx;
++ qe_risc_allocation_e riscTx;
++ qe_risc_allocation_e riscRx;
++ u16 rx_bd_ring_len;
++ u16 tx_bd_ring_len;
++ u8 phy_address;
++ enet_interface_e enet_interface;
++} uec_info_t;
++
++/* UEC driver initialized info
++*/
++#define MAX_RXBUF_LEN 1536
++#define MAX_FRAME_LEN 1518
++#define MIN_FRAME_LEN 64
++#define MAX_DMA1_LEN 1520
++#define MAX_DMA2_LEN 1520
++
++/* UEC driver private struct
++*/
++typedef struct uec_private {
++ uec_info_t *uec_info;
++ ucc_fast_private_t *uccf;
++ struct eth_device *dev;
++ uec_t *uec_regs;
++ /* enet init command parameter */
++ uec_init_cmd_pram_t *p_init_enet_param;
++ u32 init_enet_param_offset;
++ /* Rx and Tx paramter */
++ uec_rx_global_pram_t *p_rx_glbl_pram;
++ u32 rx_glbl_pram_offset;
++ uec_tx_global_pram_t *p_tx_glbl_pram;
++ u32 tx_glbl_pram_offset;
++ uec_send_queue_mem_region_t *p_send_q_mem_reg;
++ u32 send_q_mem_reg_offset;
++ uec_thread_data_tx_t *p_thread_data_tx;
++ u32 thread_dat_tx_offset;
++ uec_thread_data_rx_t *p_thread_data_rx;
++ u32 thread_dat_rx_offset;
++ uec_rx_bd_queues_entry_t *p_rx_bd_qs_tbl;
++ u32 rx_bd_qs_tbl_offset;
++ /* BDs specific */
++ u8 *p_tx_bd_ring;
++ u32 tx_bd_ring_offset;
++ u8 *p_rx_bd_ring;
++ u32 rx_bd_ring_offset;
++ u8 *p_rx_buf;
++ u32 rx_buf_offset;
++ volatile qe_bd_t *txBd;
++ volatile qe_bd_t *rxBd;
++ /* Status */
++ int mac_tx_enabled;
++ int mac_rx_enabled;
++ int grace_stopped_tx;
++ int grace_stopped_rx;
++ int the_first_run;
++ /* PHY specific */
++ struct uec_mii_info *mii_info;
++ int oldspeed;
++ int oldduplex;
++ int oldlink;
++} uec_private_t;
++
++#endif /* __UEC_H__ */
+diff -Naupr u-boot-1.1.6/drivers/qe/uec_phy.c u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.c
+--- u-boot-1.1.6/drivers/qe/uec_phy.c 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.c 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,607 @@
++/*
++ * Copyright (C) 2005 Freescale Semiconductor, Inc.
++ *
++ * Author: Shlomi Gridish
++ *
++ * Description: UCC GETH Driver -- PHY handling
++ * Driver for UEC on QE
++ * Based on 8260_io/fcc_enet.c
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the 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 "net.h"
++#include "malloc.h"
++#include "asm/errno.h"
++#include "asm/immap_qe.h"
++#include "asm/io.h"
++#include "qe.h"
++#include "uccf.h"
++#include "uec.h"
++#include "uec_phy.h"
++#include "miiphy.h"
++
++#if defined(CONFIG_QE)
++
++#define UEC_VERBOSE_DEBUG
++#define ugphy_printk(format, arg...) \
++ printf(format "\n", ## arg)
++
++#define ugphy_dbg(format, arg...) \
++ ugphy_printk(format , ## arg)
++#define ugphy_err(format, arg...) \
++ ugphy_printk(format , ## arg)
++#define ugphy_info(format, arg...) \
++ ugphy_printk(format , ## arg)
++#define ugphy_warn(format, arg...) \
++ ugphy_printk(format , ## arg)
++
++#ifdef UEC_VERBOSE_DEBUG
++#define ugphy_vdbg ugphy_dbg
++#else
++#define ugphy_vdbg(ugeth, fmt, args...) do { } while (0)
++#endif /* UEC_VERBOSE_DEBUG */
++
++static void config_genmii_advert (struct uec_mii_info *mii_info);
++static void genmii_setup_forced (struct uec_mii_info *mii_info);
++static void genmii_restart_aneg (struct uec_mii_info *mii_info);
++static int gbit_config_aneg (struct uec_mii_info *mii_info);
++static int genmii_config_aneg (struct uec_mii_info *mii_info);
++static int genmii_update_link (struct uec_mii_info *mii_info);
++static int genmii_read_status (struct uec_mii_info *mii_info);
++u16 phy_read (struct uec_mii_info *mii_info, u16 regnum);
++void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val);
++
++/* Write value to the PHY for this device to the register at regnum, */
++/* waiting until the write is done before it returns. All PHY */
++/* configuration has to be done through the TSEC1 MIIM regs */
++void write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int value)
++{
++ uec_private_t *ugeth = (uec_private_t *) dev->priv;
++ uec_t *ug_regs;
++ enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum;
++ u32 tmp_reg;
++
++ ug_regs = ugeth->uec_regs;
++
++ /* Stop the MII management read cycle */
++ out_be32 (&ug_regs->miimcom, 0);
++ /* Setting up the MII Mangement Address Register */
++ tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
++ out_be32 (&ug_regs->miimadd, tmp_reg);
++
++ /* Setting up the MII Mangement Control Register with the value */
++ out_be32 (&ug_regs->miimcon, (u32) value);
++
++ /* Wait till MII management write is complete */
++ while ((in_be32 (&ug_regs->miimind)) & MIIMIND_BUSY);
++
++ udelay (100000);
++}
++
++/* Reads from register regnum in the PHY for device dev, */
++/* returning the value. Clears miimcom first. All PHY */
++/* configuration has to be done through the TSEC1 MIIM regs */
++int read_phy_reg (struct eth_device *dev, int mii_id, int regnum)
++{
++ uec_private_t *ugeth = (uec_private_t *) dev->priv;
++ uec_t *ug_regs;
++ enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum;
++ u32 tmp_reg;
++ u16 value;
++
++ ug_regs = ugeth->uec_regs;
++
++ /* Setting up the MII Mangement Address Register */
++ tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
++ out_be32 (&ug_regs->miimadd, tmp_reg);
++
++ /* Perform an MII management read cycle */
++ out_be32 (&ug_regs->miimcom, 0);
++ out_be32 (&ug_regs->miimcom, MIIMCOM_READ_CYCLE);
++
++ /* Wait till MII management write is complete */
++ while ((in_be32 (&ug_regs->miimind)) &
++ (MIIMIND_NOT_VALID | MIIMIND_BUSY));
++
++ udelay (100000);
++
++ /* Read MII management status */
++ value = (u16) in_be32 (&ug_regs->miimstat);
++ if (value == 0xffff)
++ ugphy_warn
++ ("read wrong value : mii_id %d,mii_reg %d, base %08x",
++ mii_id, mii_reg, (u32) & (ug_regs->miimcfg));
++
++ return (value);
++}
++
++void mii_clear_phy_interrupt (struct uec_mii_info *mii_info)
++{
++ if (mii_info->phyinfo->ack_interrupt)
++ mii_info->phyinfo->ack_interrupt (mii_info);
++}
++
++void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,
++ u32 interrupts)
++{
++ mii_info->interrupts = interrupts;
++ if (mii_info->phyinfo->config_intr)
++ mii_info->phyinfo->config_intr (mii_info);
++}
++
++/* Writes MII_ADVERTISE with the appropriate values, after
++ * sanitizing advertise to make sure only supported features
++ * are advertised
++ */
++static void config_genmii_advert (struct uec_mii_info *mii_info)
++{
++ u32 advertise;
++ u16 adv;
++
++ /* Only allow advertising what this PHY supports */
++ mii_info->advertising &= mii_info->phyinfo->features;
++ advertise = mii_info->advertising;
++
++ /* Setup standard advertisement */
++ adv = phy_read (mii_info, PHY_ANAR);
++ adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4);
++ if (advertise & ADVERTISED_10baseT_Half)
++ adv |= ADVERTISE_10HALF;
++ if (advertise & ADVERTISED_10baseT_Full)
++ adv |= ADVERTISE_10FULL;
++ if (advertise & ADVERTISED_100baseT_Half)
++ adv |= ADVERTISE_100HALF;
++ if (advertise & ADVERTISED_100baseT_Full)
++ adv |= ADVERTISE_100FULL;
++ phy_write (mii_info, PHY_ANAR, adv);
++}
++
++static void genmii_setup_forced (struct uec_mii_info *mii_info)
++{
++ u16 ctrl;
++ u32 features = mii_info->phyinfo->features;
++
++ ctrl = phy_read (mii_info, PHY_BMCR);
++
++ ctrl &= ~(PHY_BMCR_DPLX | PHY_BMCR_100_MBPS |
++ PHY_BMCR_1000_MBPS | PHY_BMCR_AUTON);
++ ctrl |= PHY_BMCR_RESET;
++
++ switch (mii_info->speed) {
++ case SPEED_1000:
++ if (features & (SUPPORTED_1000baseT_Half
++ | SUPPORTED_1000baseT_Full)) {
++ ctrl |= PHY_BMCR_1000_MBPS;
++ break;
++ }
++ mii_info->speed = SPEED_100;
++ case SPEED_100:
++ if (features & (SUPPORTED_100baseT_Half
++ | SUPPORTED_100baseT_Full)) {
++ ctrl |= PHY_BMCR_100_MBPS;
++ break;
++ }
++ mii_info->speed = SPEED_10;
++ case SPEED_10:
++ if (features & (SUPPORTED_10baseT_Half
++ | SUPPORTED_10baseT_Full))
++ break;
++ default: /* Unsupported speed! */
++ ugphy_err ("%s: Bad speed!", mii_info->dev->name);
++ break;
++ }
++
++ phy_write (mii_info, PHY_BMCR, ctrl);
++}
++
++/* Enable and Restart Autonegotiation */
++static void genmii_restart_aneg (struct uec_mii_info *mii_info)
++{
++ u16 ctl;
++
++ ctl = phy_read (mii_info, PHY_BMCR);
++ ctl |= (PHY_BMCR_AUTON | PHY_BMCR_RST_NEG);
++ phy_write (mii_info, PHY_BMCR, ctl);
++}
++
++static int gbit_config_aneg (struct uec_mii_info *mii_info)
++{
++ u16 adv;
++ u32 advertise;
++
++ if (mii_info->autoneg) {
++ /* Configure the ADVERTISE register */
++ config_genmii_advert (mii_info);
++ advertise = mii_info->advertising;
++
++ adv = phy_read (mii_info, MII_1000BASETCONTROL);
++ adv &= ~(MII_1000BASETCONTROL_FULLDUPLEXCAP |
++ MII_1000BASETCONTROL_HALFDUPLEXCAP);
++ if (advertise & SUPPORTED_1000baseT_Half)
++ adv |= MII_1000BASETCONTROL_HALFDUPLEXCAP;
++ if (advertise & SUPPORTED_1000baseT_Full)
++ adv |= MII_1000BASETCONTROL_FULLDUPLEXCAP;
++ phy_write (mii_info, MII_1000BASETCONTROL, adv);
++
++ /* Start/Restart aneg */
++ genmii_restart_aneg (mii_info);
++ } else
++ genmii_setup_forced (mii_info);
++
++ return 0;
++}
++
++static int marvell_config_aneg (struct uec_mii_info *mii_info)
++{
++ /* The Marvell PHY has an errata which requires
++ * that certain registers get written in order
++ * to restart autonegotiation */
++ phy_write (mii_info, PHY_BMCR, PHY_BMCR_RESET);
++
++ phy_write (mii_info, 0x1d, 0x1f);
++ phy_write (mii_info, 0x1e, 0x200c);
++ phy_write (mii_info, 0x1d, 0x5);
++ phy_write (mii_info, 0x1e, 0);
++ phy_write (mii_info, 0x1e, 0x100);
++
++ gbit_config_aneg (mii_info);
++
++ return 0;
++}
++
++static int genmii_config_aneg (struct uec_mii_info *mii_info)
++{
++ if (mii_info->autoneg) {
++ config_genmii_advert (mii_info);
++ genmii_restart_aneg (mii_info);
++ } else
++ genmii_setup_forced (mii_info);
++
++ return 0;
++}
++
++static int genmii_update_link (struct uec_mii_info *mii_info)
++{
++ u16 status;
++
++ /* Do a fake read */
++ phy_read (mii_info, PHY_BMSR);
++
++ /* Read link and autonegotiation status */
++ status = phy_read (mii_info, PHY_BMSR);
++ if ((status & PHY_BMSR_LS) == 0)
++ mii_info->link = 0;
++ else
++ mii_info->link = 1;
++
++ /* If we are autonegotiating, and not done,
++ * return an error */
++ if (mii_info->autoneg && !(status & PHY_BMSR_AUTN_COMP))
++ return -EAGAIN;
++
++ return 0;
++}
++
++static int genmii_read_status (struct uec_mii_info *mii_info)
++{
++ u16 status;
++ int err;
++
++ /* Update the link, but return if there
++ * was an error */
++ err = genmii_update_link (mii_info);
++ if (err)
++ return err;
++
++ if (mii_info->autoneg) {
++ status = phy_read (mii_info, PHY_ANLPAR);
++
++ if (status & (PHY_ANLPAR_10FD | PHY_ANLPAR_TXFD))
++ mii_info->duplex = DUPLEX_FULL;
++ else
++ mii_info->duplex = DUPLEX_HALF;
++ if (status & (PHY_ANLPAR_TXFD | PHY_ANLPAR_TX))
++ mii_info->speed = SPEED_100;
++ else
++ mii_info->speed = SPEED_10;
++ mii_info->pause = 0;
++ }
++ /* On non-aneg, we assume what we put in BMCR is the speed,
++ * though magic-aneg shouldn't prevent this case from occurring
++ */
++
++ return 0;
++}
++
++static int marvell_read_status (struct uec_mii_info *mii_info)
++{
++ u16 status;
++ int err;
++
++ /* Update the link, but return if there
++ * was an error */
++ err = genmii_update_link (mii_info);
++ if (err)
++ return err;
++
++ /* If the link is up, read the speed and duplex */
++ /* If we aren't autonegotiating, assume speeds
++ * are as set */
++ if (mii_info->autoneg && mii_info->link) {
++ int speed;
++
++ status = phy_read (mii_info, MII_M1011_PHY_SPEC_STATUS);
++
++ /* Get the duplexity */
++ if (status & MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX)
++ mii_info->duplex = DUPLEX_FULL;
++ else
++ mii_info->duplex = DUPLEX_HALF;
++
++ /* Get the speed */
++ speed = status & MII_M1011_PHY_SPEC_STATUS_SPD_MASK;
++ switch (speed) {
++ case MII_M1011_PHY_SPEC_STATUS_1000:
++ mii_info->speed = SPEED_1000;
++ break;
++ case MII_M1011_PHY_SPEC_STATUS_100:
++ mii_info->speed = SPEED_100;
++ break;
++ default:
++ mii_info->speed = SPEED_10;
++ break;
++ }
++ mii_info->pause = 0;
++ }
++
++ return 0;
++}
++
++static int marvell_ack_interrupt (struct uec_mii_info *mii_info)
++{
++ /* Clear the interrupts by reading the reg */
++ phy_read (mii_info, MII_M1011_IEVENT);
++
++ return 0;
++}
++
++static int marvell_config_intr (struct uec_mii_info *mii_info)
++{
++ if (mii_info->interrupts == MII_INTERRUPT_ENABLED)
++ phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_INIT);
++ else
++ phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR);
++
++ return 0;
++}
++
++static int dm9161_init (struct uec_mii_info *mii_info)
++{
++ /* Reset the PHY */
++ phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) |
++ PHY_BMCR_RESET);
++ /* PHY and MAC connect */
++ phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) &
++ ~PHY_BMCR_ISO);
++#ifdef CONFIG_RMII_MODE
++ phy_write (mii_info, MII_DM9161_SCR, MII_DM9161_SCR_RMII_INIT);
++#else
++ phy_write (mii_info, MII_DM9161_SCR, MII_DM9161_SCR_INIT);
++#endif
++ config_genmii_advert (mii_info);
++ /* Start/restart aneg */
++ genmii_config_aneg (mii_info);
++ /* Delay to wait the aneg compeleted */
++ udelay (3000000);
++
++ return 0;
++}
++
++static int dm9161_config_aneg (struct uec_mii_info *mii_info)
++{
++ return 0;
++}
++
++static int dm9161_read_status (struct uec_mii_info *mii_info)
++{
++ u16 status;
++ int err;
++
++ /* Update the link, but return if there was an error */
++ err = genmii_update_link (mii_info);
++ if (err)
++ return err;
++ /* If the link is up, read the speed and duplex
++ If we aren't autonegotiating assume speeds are as set */
++ if (mii_info->autoneg && mii_info->link) {
++ status = phy_read (mii_info, MII_DM9161_SCSR);
++ if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_100H))
++ mii_info->speed = SPEED_100;
++ else
++ mii_info->speed = SPEED_10;
++
++ if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_10F))
++ mii_info->duplex = DUPLEX_FULL;
++ else
++ mii_info->duplex = DUPLEX_HALF;
++ }
++
++ return 0;
++}
++
++static int dm9161_ack_interrupt (struct uec_mii_info *mii_info)
++{
++ /* Clear the interrupt by reading the reg */
++ phy_read (mii_info, MII_DM9161_INTR);
++
++ return 0;
++}
++
++static int dm9161_config_intr (struct uec_mii_info *mii_info)
++{
++ if (mii_info->interrupts == MII_INTERRUPT_ENABLED)
++ phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_INIT);
++ else
++ phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_STOP);
++
++ return 0;
++}
++
++static void dm9161_close (struct uec_mii_info *mii_info)
++{
++}
++
++static struct phy_info phy_info_dm9161 = {
++ .phy_id = 0x0181b880,
++ .phy_id_mask = 0x0ffffff0,
++ .name = "Davicom DM9161E",
++ .init = dm9161_init,
++ .config_aneg = dm9161_config_aneg,
++ .read_status = dm9161_read_status,
++ .close = dm9161_close,
++};
++
++static struct phy_info phy_info_dm9161a = {
++ .phy_id = 0x0181b8a0,
++ .phy_id_mask = 0x0ffffff0,
++ .name = "Davicom DM9161A",
++ .features = MII_BASIC_FEATURES,
++ .init = dm9161_init,
++ .config_aneg = dm9161_config_aneg,
++ .read_status = dm9161_read_status,
++ .ack_interrupt = dm9161_ack_interrupt,
++ .config_intr = dm9161_config_intr,
++ .close = dm9161_close,
++};
++
++static struct phy_info phy_info_marvell = {
++ .phy_id = 0x01410c00,
++ .phy_id_mask = 0xffffff00,
++ .name = "Marvell 88E11x1",
++ .features = MII_GBIT_FEATURES,
++ .config_aneg = &marvell_config_aneg,
++ .read_status = &marvell_read_status,
++ .ack_interrupt = &marvell_ack_interrupt,
++ .config_intr = &marvell_config_intr,
++};
++
++static struct phy_info phy_info_genmii = {
++ .phy_id = 0x00000000,
++ .phy_id_mask = 0x00000000,
++ .name = "Generic MII",
++ .features = MII_BASIC_FEATURES,
++ .config_aneg = genmii_config_aneg,
++ .read_status = genmii_read_status,
++};
++
++static struct phy_info *phy_info[] = {
++ &phy_info_dm9161,
++ &phy_info_dm9161a,
++ &phy_info_marvell,
++ &phy_info_genmii,
++ NULL
++};
++
++u16 phy_read (struct uec_mii_info *mii_info, u16 regnum)
++{
++ return mii_info->mdio_read (mii_info->dev, mii_info->mii_id, regnum);
++}
++
++void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val)
++{
++ mii_info->mdio_write (mii_info->dev, mii_info->mii_id, regnum, val);
++}
++
++/* Use the PHY ID registers to determine what type of PHY is attached
++ * to device dev. return a struct phy_info structure describing that PHY
++ */
++struct phy_info *get_phy_info (struct uec_mii_info *mii_info)
++{
++ u16 phy_reg;
++ u32 phy_ID;
++ int i;
++ struct phy_info *theInfo = NULL;
++
++ /* Grab the bits from PHYIR1, and put them in the upper half */
++ phy_reg = phy_read (mii_info, PHY_PHYIDR1);
++ phy_ID = (phy_reg & 0xffff) << 16;
++
++ /* Grab the bits from PHYIR2, and put them in the lower half */
++ phy_reg = phy_read (mii_info, PHY_PHYIDR2);
++ phy_ID |= (phy_reg & 0xffff);
++
++ /* loop through all the known PHY types, and find one that */
++ /* matches the ID we read from the PHY. */
++ for (i = 0; phy_info[i]; i++)
++ if (phy_info[i]->phy_id ==
++ (phy_ID & phy_info[i]->phy_id_mask)) {
++ theInfo = phy_info[i];
++ break;
++ }
++
++ /* This shouldn't happen, as we have generic PHY support */
++ if (theInfo == NULL) {
++ ugphy_info ("UEC: PHY id %x is not supported!", phy_ID);
++ return NULL;
++ } else {
++ ugphy_info ("UEC: PHY is %s (%x)", theInfo->name, phy_ID);
++ }
++
++ return theInfo;
++}
++
++void marvell_phy_interface_mode (struct eth_device *dev,
++ enet_interface_e mode)
++{
++ uec_private_t *uec = (uec_private_t *) dev->priv;
++ struct uec_mii_info *mii_info;
++
++ if (!uec->mii_info) {
++ printf ("%s: the PHY not intialized\n", __FUNCTION__);
++ return;
++ }
++ mii_info = uec->mii_info;
++
++ if (mode == ENET_100_RGMII) {
++ phy_write (mii_info, 0x00, 0x9140);
++ phy_write (mii_info, 0x1d, 0x001f);
++ phy_write (mii_info, 0x1e, 0x200c);
++ phy_write (mii_info, 0x1d, 0x0005);
++ phy_write (mii_info, 0x1e, 0x0000);
++ phy_write (mii_info, 0x1e, 0x0100);
++ phy_write (mii_info, 0x09, 0x0e00);
++ phy_write (mii_info, 0x04, 0x01e1);
++ phy_write (mii_info, 0x00, 0x9140);
++ phy_write (mii_info, 0x00, 0x1000);
++ udelay (100000);
++ phy_write (mii_info, 0x00, 0x2900);
++ phy_write (mii_info, 0x14, 0x0cd2);
++ phy_write (mii_info, 0x00, 0xa100);
++ phy_write (mii_info, 0x09, 0x0000);
++ phy_write (mii_info, 0x1b, 0x800b);
++ phy_write (mii_info, 0x04, 0x05e1);
++ phy_write (mii_info, 0x00, 0xa100);
++ phy_write (mii_info, 0x00, 0x2100);
++ udelay (1000000);
++ } else if (mode == ENET_10_RGMII) {
++ phy_write (mii_info, 0x14, 0x8e40);
++ phy_write (mii_info, 0x1b, 0x800b);
++ phy_write (mii_info, 0x14, 0x0c82);
++ phy_write (mii_info, 0x00, 0x8100);
++ udelay (1000000);
++ }
++}
++
++void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode)
++{
++#ifdef CONFIG_PHY_MODE_NEED_CHANGE
++ marvell_phy_interface_mode (dev, mode);
++#endif
++}
++#endif /* CONFIG_QE */
+diff -Naupr u-boot-1.1.6/drivers/qe/uec_phy.h u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.h
+--- u-boot-1.1.6/drivers/qe/uec_phy.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,259 @@
++/*
++ * Copyright (C) 2005 Freescale Semiconductor, Inc.
++ *
++ * Author: Shlomi Gridish <gridish@freescale.com>
++ *
++ * Description: UCC ethernet driver -- PHY handling
++ * Driver for UEC on QE
++ * Based on 8260_io/fcc_enet.c
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ */
++#ifndef __UEC_PHY_H__
++#define __UEC_PHY_H__
++
++#define MII_end ((u32)-2)
++#define MII_read ((u32)-1)
++
++#define MIIMIND_BUSY 0x00000001
++#define MIIMIND_NOTVALID 0x00000004
++
++#define UGETH_AN_TIMEOUT 2000
++
++/* 1000BT control (Marvell & BCM54xx at least) */
++#define MII_1000BASETCONTROL 0x09
++#define MII_1000BASETCONTROL_FULLDUPLEXCAP 0x0200
++#define MII_1000BASETCONTROL_HALFDUPLEXCAP 0x0100
++
++/* Cicada Extended Control Register 1 */
++#define MII_CIS8201_EXT_CON1 0x17
++#define MII_CIS8201_EXTCON1_INIT 0x0000
++
++/* Cicada Interrupt Mask Register */
++#define MII_CIS8201_IMASK 0x19
++#define MII_CIS8201_IMASK_IEN 0x8000
++#define MII_CIS8201_IMASK_SPEED 0x4000
++#define MII_CIS8201_IMASK_LINK 0x2000
++#define MII_CIS8201_IMASK_DUPLEX 0x1000
++#define MII_CIS8201_IMASK_MASK 0xf000
++
++/* Cicada Interrupt Status Register */
++#define MII_CIS8201_ISTAT 0x1a
++#define MII_CIS8201_ISTAT_STATUS 0x8000
++#define MII_CIS8201_ISTAT_SPEED 0x4000
++#define MII_CIS8201_ISTAT_LINK 0x2000
++#define MII_CIS8201_ISTAT_DUPLEX 0x1000
++
++/* Cicada Auxiliary Control/Status Register */
++#define MII_CIS8201_AUX_CONSTAT 0x1c
++#define MII_CIS8201_AUXCONSTAT_INIT 0x0004
++#define MII_CIS8201_AUXCONSTAT_DUPLEX 0x0020
++#define MII_CIS8201_AUXCONSTAT_SPEED 0x0018
++#define MII_CIS8201_AUXCONSTAT_GBIT 0x0010
++#define MII_CIS8201_AUXCONSTAT_100 0x0008
++
++/* 88E1011 PHY Status Register */
++#define MII_M1011_PHY_SPEC_STATUS 0x11
++#define MII_M1011_PHY_SPEC_STATUS_1000 0x8000
++#define MII_M1011_PHY_SPEC_STATUS_100 0x4000
++#define MII_M1011_PHY_SPEC_STATUS_SPD_MASK 0xc000
++#define MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX 0x2000
++#define MII_M1011_PHY_SPEC_STATUS_RESOLVED 0x0800
++#define MII_M1011_PHY_SPEC_STATUS_LINK 0x0400
++
++#define MII_M1011_IEVENT 0x13
++#define MII_M1011_IEVENT_CLEAR 0x0000
++
++#define MII_M1011_IMASK 0x12
++#define MII_M1011_IMASK_INIT 0x6400
++#define MII_M1011_IMASK_CLEAR 0x0000
++
++#define MII_DM9161_SCR 0x10
++#define MII_DM9161_SCR_INIT 0x0610
++#define MII_DM9161_SCR_RMII_INIT 0x0710
++
++/* DM9161 Specified Configuration and Status Register */
++#define MII_DM9161_SCSR 0x11
++#define MII_DM9161_SCSR_100F 0x8000
++#define MII_DM9161_SCSR_100H 0x4000
++#define MII_DM9161_SCSR_10F 0x2000
++#define MII_DM9161_SCSR_10H 0x1000
++
++/* DM9161 Interrupt Register */
++#define MII_DM9161_INTR 0x15
++#define MII_DM9161_INTR_PEND 0x8000
++#define MII_DM9161_INTR_DPLX_MASK 0x0800
++#define MII_DM9161_INTR_SPD_MASK 0x0400
++#define MII_DM9161_INTR_LINK_MASK 0x0200
++#define MII_DM9161_INTR_MASK 0x0100
++#define MII_DM9161_INTR_DPLX_CHANGE 0x0010
++#define MII_DM9161_INTR_SPD_CHANGE 0x0008
++#define MII_DM9161_INTR_LINK_CHANGE 0x0004
++#define MII_DM9161_INTR_INIT 0x0000
++#define MII_DM9161_INTR_STOP \
++(MII_DM9161_INTR_DPLX_MASK | MII_DM9161_INTR_SPD_MASK \
++ | MII_DM9161_INTR_LINK_MASK | MII_DM9161_INTR_MASK)
++
++/* DM9161 10BT Configuration/Status */
++#define MII_DM9161_10BTCSR 0x12
++#define MII_DM9161_10BTCSR_INIT 0x7800
++
++#define MII_BASIC_FEATURES (SUPPORTED_10baseT_Half | \
++ SUPPORTED_10baseT_Full | \
++ SUPPORTED_100baseT_Half | \
++ SUPPORTED_100baseT_Full | \
++ SUPPORTED_Autoneg | \
++ SUPPORTED_TP | \
++ SUPPORTED_MII)
++
++#define MII_GBIT_FEATURES (MII_BASIC_FEATURES | \
++ SUPPORTED_1000baseT_Half | \
++ SUPPORTED_1000baseT_Full)
++
++#define MII_READ_COMMAND 0x00000001
++
++#define MII_INTERRUPT_DISABLED 0x0
++#define MII_INTERRUPT_ENABLED 0x1
++
++#define SPEED_10 10
++#define SPEED_100 100
++#define SPEED_1000 1000
++
++/* Duplex, half or full. */
++#define DUPLEX_HALF 0x00
++#define DUPLEX_FULL 0x01
++
++/* Indicates what features are supported by the interface. */
++#define SUPPORTED_10baseT_Half (1 << 0)
++#define SUPPORTED_10baseT_Full (1 << 1)
++#define SUPPORTED_100baseT_Half (1 << 2)
++#define SUPPORTED_100baseT_Full (1 << 3)
++#define SUPPORTED_1000baseT_Half (1 << 4)
++#define SUPPORTED_1000baseT_Full (1 << 5)
++#define SUPPORTED_Autoneg (1 << 6)
++#define SUPPORTED_TP (1 << 7)
++#define SUPPORTED_AUI (1 << 8)
++#define SUPPORTED_MII (1 << 9)
++#define SUPPORTED_FIBRE (1 << 10)
++#define SUPPORTED_BNC (1 << 11)
++#define SUPPORTED_10000baseT_Full (1 << 12)
++
++#define ADVERTISED_10baseT_Half (1 << 0)
++#define ADVERTISED_10baseT_Full (1 << 1)
++#define ADVERTISED_100baseT_Half (1 << 2)
++#define ADVERTISED_100baseT_Full (1 << 3)
++#define ADVERTISED_1000baseT_Half (1 << 4)
++#define ADVERTISED_1000baseT_Full (1 << 5)
++#define ADVERTISED_Autoneg (1 << 6)
++#define ADVERTISED_TP (1 << 7)
++#define ADVERTISED_AUI (1 << 8)
++#define ADVERTISED_MII (1 << 9)
++#define ADVERTISED_FIBRE (1 << 10)
++#define ADVERTISED_BNC (1 << 11)
++#define ADVERTISED_10000baseT_Full (1 << 12)
++
++/* 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)
++
++/* Taken from mii_if_info and sungem_phy.h */
++struct uec_mii_info {
++ /* Information about the PHY type */
++ /* And management functions */
++ struct phy_info *phyinfo;
++
++ struct eth_device *dev;
++
++ /* forced speed & duplex (no autoneg)
++ * partner speed & duplex & pause (autoneg)
++ */
++ int speed;
++ int duplex;
++ int pause;
++
++ /* The most recently read link state */
++ int link;
++
++ /* Enabled Interrupts */
++ u32 interrupts;
++
++ u32 advertising;
++ int autoneg;
++ int mii_id;
++
++ /* private data pointer */
++ /* For use by PHYs to maintain extra state */
++ void *priv;
++
++ /* Provided by ethernet driver */
++ int (*mdio_read) (struct eth_device * dev, int mii_id, int reg);
++ void (*mdio_write) (struct eth_device * dev, int mii_id, int reg,
++ int val);
++};
++
++/* struct phy_info: a structure which defines attributes for a PHY
++ *
++ * id will contain a number which represents the PHY. During
++ * startup, the driver will poll the PHY to find out what its
++ * UID--as defined by registers 2 and 3--is. The 32-bit result
++ * gotten from the PHY will be ANDed with phy_id_mask to
++ * discard any bits which may change based on revision numbers
++ * unimportant to functionality
++ *
++ * There are 6 commands which take a ugeth_mii_info structure.
++ * Each PHY must declare config_aneg, and read_status.
++ */
++struct phy_info {
++ u32 phy_id;
++ char *name;
++ unsigned int phy_id_mask;
++ u32 features;
++
++ /* Called to initialize the PHY */
++ int (*init) (struct uec_mii_info * mii_info);
++
++ /* Called to suspend the PHY for power */
++ int (*suspend) (struct uec_mii_info * mii_info);
++
++ /* Reconfigures autonegotiation (or disables it) */
++ int (*config_aneg) (struct uec_mii_info * mii_info);
++
++ /* Determines the negotiated speed and duplex */
++ int (*read_status) (struct uec_mii_info * mii_info);
++
++ /* Clears any pending interrupts */
++ int (*ack_interrupt) (struct uec_mii_info * mii_info);
++
++ /* Enables or disables interrupts */
++ int (*config_intr) (struct uec_mii_info * mii_info);
++
++ /* Clears up any memory if needed */
++ void (*close) (struct uec_mii_info * mii_info);
++};
++
++struct phy_info *get_phy_info (struct uec_mii_info *mii_info);
++void write_phy_reg (struct eth_device *dev, int mii_id, int regnum,
++ int value);
++int read_phy_reg (struct eth_device *dev, int mii_id, int regnum);
++void mii_clear_phy_interrupt (struct uec_mii_info *mii_info);
++void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,
++ u32 interrupts);
++#endif /* __UEC_PHY_H__ */
+diff -Naupr u-boot-1.1.6/drivers/tsec.c u-boot-1.1.6-fsl-1/drivers/tsec.c
+--- u-boot-1.1.6/drivers/tsec.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/tsec.c 2006-11-10 11:24:29.000000000 -0600
+@@ -610,11 +610,10 @@ static void adjust_link(struct eth_devic
+ regs->maccfg2 = ((regs->maccfg2 & ~(MACCFG2_IF))
+ | MACCFG2_MII);
+
+- /* If We're in reduced mode, we need
+- * to say whether we're 10 or 100 MB.
++ /* Set R100 bit in all modes although
++ * it is only used in RGMII mode
+ */
+- if ((priv->speed == 100)
+- && (priv->flags & TSEC_REDUCED))
++ if (priv->speed == 100)
+ regs->ecntrl |= ECNTRL_R100;
+ else
+ regs->ecntrl &= ~(ECNTRL_R100);
+@@ -816,6 +815,7 @@ struct phy_info phy_info_M88E1111S = {
+ {0x1d, 0x5, NULL},
+ {0x1e, 0x0, NULL},
+ {0x1e, 0x100, NULL},
++ {0x14, 0x0cd2, NULL}, /* Delay RGMII TX and RX */
+ {MIIM_GBIT_CONTROL, MIIM_GBIT_CONTROL_INIT, NULL},
+ {MIIM_ANAR, MIIM_ANAR_INIT, NULL},
+ {MIIM_CONTROL, MIIM_CONTROL_RESET, NULL},
+@@ -1110,10 +1110,8 @@ struct phy_info phy_info_dp83865 = {
+ };
+
+ struct phy_info *phy_info[] = {
+-#if 0
+- &phy_info_cis8201,
+-#endif
+ &phy_info_cis8204,
++ &phy_info_cis8201,
+ &phy_info_M88E1011S,
+ &phy_info_M88E1111S,
+ &phy_info_M88E1145,
+diff -Naupr u-boot-1.1.6/drivers/tsec.h u-boot-1.1.6-fsl-1/drivers/tsec.h
+--- u-boot-1.1.6/drivers/tsec.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/drivers/tsec.h 2006-11-10 11:24:29.000000000 -0600
+@@ -30,7 +30,7 @@
+ #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
+ #define TSEC_BASE_ADDR (CFG_IMMR + CFG_TSEC1_OFFSET)
+ #elif defined(CONFIG_MPC83XX)
+- #define TSEC_BASE_ADDR (CFG_IMMRBAR + CFG_TSEC1_OFFSET)
++ #define TSEC_BASE_ADDR (CFG_IMMR + CFG_TSEC1_OFFSET)
+ #endif
+
+
+diff -Naupr u-boot-1.1.6/include/74xx_7xx.h u-boot-1.1.6-fsl-1/include/74xx_7xx.h
+--- u-boot-1.1.6/include/74xx_7xx.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/74xx_7xx.h 2006-12-06 10:33:49.000000000 -0600
+@@ -111,6 +111,7 @@ typedef enum __cpu_t {
+ CPU_750CX, CPU_750FX, CPU_750GX,
+ CPU_7400,
+ CPU_7410,
++ CPU_7448,
+ CPU_7450, CPU_7455, CPU_7457,
+ CPU_UNKNOWN} cpu_t;
+
+diff -Naupr u-boot-1.1.6/include/ACEX1K.h u-boot-1.1.6-fsl-1/include/ACEX1K.h
+--- u-boot-1.1.6/include/ACEX1K.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/ACEX1K.h 2006-11-30 12:34:13.000000000 -0600
+@@ -35,6 +35,11 @@ extern int ACEX1K_dump( Altera_desc *des
+ extern int ACEX1K_info( Altera_desc *desc );
+ extern int ACEX1K_reloc( Altera_desc *desc, ulong reloc_off );
+
++extern int CYC2_load( Altera_desc *desc, void *image, size_t size );
++extern int CYC2_dump( Altera_desc *desc, void *buf, size_t bsize );
++extern int CYC2_info( Altera_desc *desc );
++extern int CYC2_reloc( Altera_desc *desc, ulong reloc_off );
++
+ /* Slave Serial Implementation function table */
+ typedef struct {
+ Altera_pre_fn pre;
+@@ -48,6 +53,18 @@ typedef struct {
+ int relocated;
+ } Altera_ACEX1K_Passive_Serial_fns;
+
++/* Slave Serial Implementation function table */
++typedef struct {
++ Altera_pre_fn pre;
++ Altera_config_fn config;
++ Altera_status_fn status;
++ Altera_done_fn done;
++ Altera_write_fn write;
++ Altera_abort_fn abort;
++ Altera_post_fn post;
++ int relocated;
++} Altera_CYC2_Passive_Serial_fns;
++
+ /* Device Image Sizes
+ *********************************************************************/
+ /* ACEX1K */
+@@ -60,6 +77,8 @@ typedef struct {
+ #endif
+ #define Altera_EP1K100_SIZE (166965*8)
+
++#define Altera_EP2C35_SIZE 883905
++
+ /* Descriptor Macros
+ *********************************************************************/
+ /* ACEX1K devices */
+diff -Naupr u-boot-1.1.6/include/altera.h u-boot-1.1.6-fsl-1/include/altera.h
+--- u-boot-1.1.6/include/altera.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/altera.h 2006-11-30 12:34:13.000000000 -0600
+@@ -34,8 +34,10 @@
+ /* Altera Model definitions
+ *********************************************************************/
+ #define CFG_ACEX1K CFG_FPGA_DEV( 0x1 )
++#define CFG_CYCLON2 CFG_FPGA_DEV( 0x2 )
+
+ #define CFG_ALTERA_ACEX1K (CFG_FPGA_ALTERA | CFG_ACEX1K)
++#define CFG_ALTERA_CYCLON2 (CFG_FPGA_ALTERA | CFG_CYCLON2)
+ /* Add new models here */
+
+ /* Altera Interface definitions
+@@ -56,6 +58,7 @@ typedef enum { /* typedef Altera_ifac
+ typedef enum { /* typedef Altera_Family */
+ min_altera_type, /* insert all new types after this */
+ Altera_ACEX1K, /* ACEX1K Family */
++ Altera_CYC2, /* CYCLONII Family */
+ /* Add new models here */
+ max_altera_type /* insert all new types before this */
+ } Altera_Family; /* end, typedef Altera_Family */
+@@ -84,6 +87,7 @@ typedef int (*Altera_status_fn)( int coo
+ typedef int (*Altera_done_fn)( int cookie );
+ typedef int (*Altera_clk_fn)( int assert_clk, int flush, int cookie );
+ typedef int (*Altera_data_fn)( int assert_data, int flush, int cookie );
++typedef int (*Altera_write_fn)(void *buf, size_t len, int flush, int cookie);
+ typedef int (*Altera_abort_fn)( int cookie );
+ typedef int (*Altera_post_fn)( int cookie );
+
+diff -Naupr u-boot-1.1.6/include/asm-ppc/e300.h u-boot-1.1.6-fsl-1/include/asm-ppc/e300.h
+--- u-boot-1.1.6/include/asm-ppc/e300.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/e300.h 2006-11-10 11:24:29.000000000 -0600
+@@ -12,6 +12,8 @@
+ #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)
+
+ /*
+ * Hardware Implementation-Dependent Register 0 (HID0)
+diff -Naupr u-boot-1.1.6/include/asm-ppc/fsl_i2c.h u-boot-1.1.6-fsl-1/include/asm-ppc/fsl_i2c.h
+--- u-boot-1.1.6/include/asm-ppc/fsl_i2c.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/fsl_i2c.h 2006-11-30 12:34:13.000000000 -0600
+@@ -83,8 +83,4 @@ typedef struct fsl_i2c {
+ u8 res6[0xE8];
+ } fsl_i2c_t;
+
+-
+-#define I2C_READ 1
+-#define I2C_WRITE 0
+-
+ #endif /* _ASM_I2C_H_ */
+diff -Naupr u-boot-1.1.6/include/asm-ppc/global_data.h u-boot-1.1.6-fsl-1/include/asm-ppc/global_data.h
+--- u-boot-1.1.6/include/asm-ppc/global_data.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/global_data.h 2006-11-10 11:24:29.000000000 -0600
+@@ -52,17 +52,29 @@ typedef struct global_data {
+ #if defined(CONFIG_MPC83XX)
+ /* There are other clocks in the MPC83XX */
+ u32 csb_clk;
++#if defined (CONFIG_MPC8349)
+ u32 tsec1_clk;
+ u32 tsec2_clk;
+- u32 core_clk;
+ u32 usbmph_clk;
+ u32 usbdr_clk;
+- u32 i2c_clk;
++#endif /* CONFIG_MPC8349 */
++ u32 core_clk;
++ u32 i2c1_clk;
++ u32 i2c2_clk;
+ u32 enc_clk;
+ u32 lbiu_clk;
+ u32 lclk_clk;
+ u32 ddr_clk;
+ u32 pci_clk;
++#if defined(CONFIG_QE)
++ u32 qe_clk;
++ u32 brg_clk;
++ uint mp_alloc_base;
++ uint mp_alloc_top;
++#endif /* CONFIG_QE */
++#if defined (CONFIG_MPC8360)
++ u32 ddr_sec_clk;
++#endif /* CONFIG_MPC8360 */
+ #endif
+ #if defined(CONFIG_MPC5xxx)
+ unsigned long ipb_clk;
+diff -Naupr u-boot-1.1.6/include/asm-ppc/i2c.h u-boot-1.1.6-fsl-1/include/asm-ppc/i2c.h
+--- u-boot-1.1.6/include/asm-ppc/i2c.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/i2c.h 1969-12-31 18:00:00.000000000 -0600
+@@ -1,103 +0,0 @@
+-/*
+- * Freescale I2C Controller
+- *
+- * This software may be used and distributed according to the
+- * terms of the GNU Public License, Version 2, incorporated
+- * herein by reference.
+- *
+- * Copyright 2004 Freescale Semiconductor.
+- * (C) Copyright 2003, Motorola, Inc.
+- * author: 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
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public 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_I2C_H_
+-#define _ASM_I2C_H_
+-
+-#include <asm/types.h>
+-
+-typedef struct i2c
+-{
+- u8 adr; /**< I2C slave address */
+-#define I2C_ADR 0xFE
+-#define I2C_ADR_SHIFT 1
+-#define I2C_ADR_RES ~(I2C_ADR)
+- u8 res0[3];
+- u8 fdr; /**< I2C frequency divider register */
+-#define IC2_FDR 0x3F
+-#define IC2_FDR_SHIFT 0
+-#define IC2_FDR_RES ~(IC2_FDR)
+- u8 res1[3];
+- u8 cr; /**< I2C control redister */
+-#define I2C_CR_MEN 0x80
+-#define I2C_CR_MIEN 0x40
+-#define I2C_CR_MSTA 0x20
+-#define I2C_CR_MTX 0x10
+-#define I2C_CR_TXAK 0x08
+-#define I2C_CR_RSTA 0x04
+-#define I2C_CR_BCST 0x01
+- u8 res2[3];
+- u8 sr; /**< I2C status register */
+-#define I2C_SR_MCF 0x80
+-#define I2C_SR_MAAS 0x40
+-#define I2C_SR_MBB 0x20
+-#define I2C_SR_MAL 0x10
+-#define I2C_SR_BCSTM 0x08
+-#define I2C_SR_SRW 0x04
+-#define I2C_SR_MIF 0x02
+-#define I2C_SR_RXAK 0x01
+- u8 res3[3];
+- u8 dr; /**< I2C data register */
+-#define I2C_DR 0xFF
+-#define I2C_DR_SHIFT 0
+-#define I2C_DR_RES ~(I2C_DR)
+- u8 res4[3];
+- u8 dfsrr; /**< I2C digital filter sampling rate register */
+-#define I2C_DFSRR 0x3F
+-#define I2C_DFSRR_SHIFT 0
+-#define I2C_DFSRR_RES ~(I2C_DR)
+- u8 res5[3];
+- u8 res6[0xE8];
+-} i2c_t;
+-
+-#ifndef CFG_HZ
+-#error CFG_HZ is not defined in /include/configs/${BOARD}.h
+-#endif
+-#define I2C_TIMEOUT (CFG_HZ/4)
+-
+-#ifndef CFG_IMMRBAR
+-#error CFG_IMMRBAR is not defined in /include/configs/${BOARD}.h
+-#endif
+-
+-#ifndef CFG_I2C_OFFSET
+-#error CFG_I2C_OFFSET is not defined in /include/configs/${BOARD}.h
+-#endif
+-
+-#if defined(CONFIG_MPC8349EMDS) || defined(CONFIG_TQM834X)
+-/*
+- * MPC8349 have two i2c bus
+- */
+-extern i2c_t * mpc8349_i2c;
+-#define I2C mpc8349_i2c
+-#else
+-#define I2C ((i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET))
+-#endif
+-
+-#define I2C_READ 1
+-#define I2C_WRITE 0
+-
+-#endif /* _ASM_I2C_H_ */
+diff -Naupr u-boot-1.1.6/include/asm-ppc/immap_83xx.h u-boot-1.1.6-fsl-1/include/asm-ppc/immap_83xx.h
+--- u-boot-1.1.6/include/asm-ppc/immap_83xx.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/immap_83xx.h 2006-12-06 10:33:49.000000000 -0600
+@@ -1,75 +1,116 @@
+ /*
+- * MPC8349 Internal Memory Map
+- * Copyright (c) 2004 Freescale Semiconductor.
+- * Eran Liberty (liberty@freescale.com)
++ * (C) Copyright 2004-2006 Freescale Semiconductor, Inc.
++ *
++ * 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)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
+ *
+- * 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)
+ */
+-#ifndef __IMMAP_8349__
+-#define __IMMAP_8349__
++#ifndef __IMMAP_83xx__
++#define __IMMAP_83xx__
+
++#include <config.h>
+ #include <asm/types.h>
+-#include <asm/i2c.h>
++#include <asm/fsl_i2c.h>
+
+ /*
+ * Local Access Window.
+ */
+-typedef struct law8349 {
+- u32 bar; /* LBIU local access window base address register */
++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_BAR 0xFFFFF000
+ #define LAWBAR_RES ~(LAWBAR_BAR)
+- u32 ar; /* LBIU local access window attribute register */
+-} law8349_t;
++ u32 ar; /* LBIU local access window attribute register */
++} law83xx_t;
+
+ /*
+ * System configuration registers.
+ */
+-typedef struct sysconf8349 {
+- u32 immrbar; /* Internal memory map base address register */
++typedef struct sysconf83xx {
++ u32 immrbar; /* Internal memory map base address register */
+ u8 res0[0x04];
+- u32 altcbar; /* Alternate configuration base address register */
++ 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. */
++#define ALTCBAR_RES ~(ALTCBAR_BASE_ADDR) /* Reserved. Write has no effect, read returns 0. */
+ u8 res1[0x14];
+- law8349_t lblaw[4]; /* LBIU local access window */
++ law83xx_t lblaw[4]; /* LBIU local access window */
+ u8 res2[0x20];
+- law8349_t pcilaw[2]; /* PCI local access window */
++ law83xx_t pcilaw[2]; /* PCI local access window */
+ u8 res3[0x30];
+- law8349_t ddrlaw[2]; /* DDR local access window */
++ law83xx_t ddrlaw[2]; /* DDR local access window */
+ u8 res4[0x50];
+- 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. */
++ 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_PCIPR 0x03000000 /* PCI bridge system bus request priority. */
+-#define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable. */
+-#define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority. */
+-#define SPCR_TSEC1DP 0x00003000 /* TSEC1 data priority. */
+-#define SPCR_TSEC1BDP 0x00000C00 /* TSEC1 buffer descriptor priority. */
+-#define SPCR_TSEC1EP 0x00000300 /* TSEC1 emergency priority. */
+-#define SPCR_TSEC2DP 0x00000030 /* TSEC2 data priority. */
+-#define SPCR_TSEC2BDP 0x0000000C /* TSEC2 buffer descriptor priority. */
+-#define SPCR_TSEC2EP 0x00000003 /* TSEC2 emergency priority. */
++ 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)
+- u32 sicrl; /* System General Purpose Register Low */
++#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
+@@ -91,8 +132,18 @@ typedef struct sysconf8349 {
+ | 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 )
+- u32 sicrh; /* System General Purpose Register High */
++#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
+@@ -117,7 +168,7 @@ typedef struct sysconf8349 {
+ #define SICRH_GPIO2_H 0x00000060
+ #define SICRH_TSOBI1 0x00000002
+ #define SICRH_TSOBI2 0x00000001
+-#define SICRh_RES ~( SICRH_DDR | SICRH_TSEC1_A | SICRH_TSEC1_B \
++#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 \
+@@ -126,207 +177,256 @@ typedef struct sysconf8349 {
+ | 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];
+-} sysconf8349_t;
++} sysconf83xx_t;
+
+ /*
+ * Watch Dog Timer (WDT) Registers
+ */
+-typedef struct wdt8349 {
++typedef struct wdt83xx {
+ u8 res0[4];
+- u32 swcrr; /* System watchdog control register */
+- u32 swcnr; /* System watchdog count register */
++ 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 */
++ u16 swsrr; /* System watchdog service register */
++#define SWSRR_WS 0x0000FFFF /* Software Watchdog Service Field. */
+ u8 res2[0xF0];
+-} wdt8349_t;
++} wdt83xx_t;
+
+ /*
+ * RTC/PIT Module Registers
+ */
+-typedef struct rtclk8349 {
+- 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 */
+- u32 psr; /* prescale register */
+- u32 ctr; /* register */
+- u32 evr; /* event register */
+-#define RTEVR_SIF 0x00000001 /* Second Interrupt Flag Bit */
+-#define RTEVR_AIF 0x00000002 /* Alarm Interrupt Flag Bit */
+-#define RTEVR_RES ~(EVR_SIF | EVR_AIF)
+- u32 alr; /* alarm register */
++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 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];
+-} rtclk8349_t;
++} rtclk83xx_t;
+
+ /*
+ * Global timper module
+ */
+
+-typedef struct gtm8349 {
+- 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 */
+- 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 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 */
++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 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 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 */
+- u8 res[0xC0];
+-} gtm8349_t;
++ 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)
++ u8 res[0xC0];
++} gtm83xx_t;
+
+ /*
+ * Integrated Programmable Interrupt Controller
+ */
+-typedef struct ipic8349 {
+- 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 */
++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 */
++ 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) */
+-#define SIIH_TSEC1TX 0x80000000 /* TSEC1 Tx interrupt */
+-#define SIIH_TSEC1RX 0x40000000 /* TSEC1 Rx interrupt */
++ 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_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 */
++#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 /* 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)
+- 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 */
+-#define SIIL_PCI2 0x10000000 /* PCI2 interrupt */
+-#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 */
+-#define SIIL_GPIO1 0x00200000 /* GPIO1 interrupt */
+-#define SIIL_GPIO2 0x00100000 /* GPIO2 interrupt */
+-#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 !!!) */
++#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 )
+- u32 siprr_a; /* System Internal Interrupt Group A Priority Register (PRR) */
+- 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) */
+- 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 */
++#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) */
++ 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) */
++ 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 */
++ 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 */
++ 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 */
+@@ -339,176 +439,238 @@ typedef struct ipic8349 {
+ | 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 */
+-#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 */
+-#define SERR_MU 0x01000000 /* MU MCP request */
+-#define SERR_RNC 0x00010000 /* MU MCP request (!!! Non-visible for users !!!) */
++ 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 )
+- u32 sercr; /* System Error Control Register (SERCR) */
+-#define SERCR_MCPR 0x00000001 /* MCP Route */
++#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)
+- 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) */
+- u8 res3[0xA0];
+-} ipic8349_t;
++ 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 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;
+
+ /*
+ * System Arbiter Registers
+ */
+-typedef struct arbiter8349 {
+- u32 acr; /* Arbiter Configuration Register */
+-#define ACR_COREDIS 0x10000000 /* Core disable. */
+-#define ACR_PIPE_DEP 0x00070000 /* Pipeline depth (number of outstanding transactions). */
+-#define ACR_PCI_RPTCNT 0x00007000 /* PCI repeat count. */
+-#define ACR_RPTCNT 0x00000700 /* Repeat count. */
+-#define ACR_APARK 0x00000030 /* Address parking. */
+-#define ACR_PARKM 0x0000000F /* Parking master. */
++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. */
++ 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 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. */
++ u32 aer; /* Arbiter Event Register (AE) */
++ u32 aidr; /* Arbiter Interrupt Definition Register (AE) */
++ u32 amr; /* Arbiter Mask Register (AE) */
++ 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. */
++ 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)
+ u8 res1[0xDC];
+-} arbiter8349_t;
++} arbiter83xx_t;
+
+ /*
+ * Reset Module
+ */
+-typedef struct reset8349 {
+- u32 rcwl; /* RCWL Register */
++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 */
+-#define RCWL_SPMF 0x0f000000 /* SPMF */
+-#define RCWL_SPMF_SHIFT 24
++#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_RES ~(RCWL_BIUCM|RCWL_DDRCM|RCWL_SVCOD|RCWL_SPMF|RCWL_COREPLL|RCWL_CEVCOD|RCWL_CEPDF|RCWL_CEPMF)
+- u32 rcwh; /* RCHL Register */
++#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_BMS 0x04000000 /* BMS */
+ #define RCWH_BOOTSEQ 0x03000000 /* BOOTSEQ */
+-#define RCWH_SWEN 0x00800000 /* SWEN */
++#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 */
+-#define RCWH_TLE 0x00000008 /* TLE */
+-#define RCWH_LALE 0x00000004 /* LALE */
++#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)
+- u8 res0[8];
+- u32 rsr; /* Reset status Register */
+-#define RSR_RSTSRC 0xE0000000 /* Reset source */
++#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
++ 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_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
++ 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 */
++ 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 */
++ u32 rcer; /* Reset Control Enable Register */
++#define RCER_CRE 0x00000001 /* software hard reset */
+ #define RCER_RES ~(RCER_CRE)
+- u8 res1[0xDC];
+-} reset8349_t;
++ u8 res1[0xDC];
++} reset83xx_t;
+
+-typedef struct clk8349 {
+- u32 spmr; /* system PLL mode Register */
++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 */
+-#define SPMR_SPMF 0x0F000000 /* SPMF */
+-#define SPMR_CKID 0x00800000 /* CKID */
++#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)
+- u32 occr; /* output clock control Register */
++#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 */
+@@ -522,72 +684,253 @@ typedef struct clk8349 {
+ | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICD3 \
+ | OCCR_PCICD4 | OCCR_PCICD5 | OCCR_PCICD6 \
+ | OCCR_PCICD7 | OCCR_PCI1CR | OCCR_PCI2CR )
+- u32 sccr; /* system clock control Register */
+-#define SCCR_TSEC1CM 0xc0000000 /* TSEC1CM */
++#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 0x30000000 /* TSEC2CM */
+ #define SCCR_TSEC2CM_SHIFT 28
+-#define SCCR_ENCCM 0x03000000 /* ENCCM */
++#endif
++#define SCCR_ENCCM 0x03000000 /* ENCCM */
+ #define SCCR_ENCCM_SHIFT 24
+-#define SCCR_USBMPHCM 0x00c00000 /* USBMPHCM */
++#if defined (CONFIG_MPC8349)
++#define SCCR_USBMPHCM 0x00c00000 /* USBMPHCM */
+ #define SCCR_USBMPHCM_SHIFT 22
+-#define SCCR_USBDRCM 0x00300000 /* USBDRCM */
++#define SCCR_USBDRCM 0x00300000 /* USBDRCM */
+ #define SCCR_USBDRCM_SHIFT 20
+-#define SCCR_PCICM 0x00010000 /* PCICM */
++#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)
+- u8 res0[0xF4];
+-} clk8349_t;
++#endif
++#if defined (CONFIG_MPC8360)
++#define SCCR_RES ~(SCCR_ENCCM | SCCR_PCICM)
++#endif
++ u8 res0[0xF4];
++} clk83xx_t;
+
+ /*
+ * Power Management Control Module
+ */
+-typedef struct pmc8349 {
+- u32 pmccr; /* PMC Configuration Register */
+-#define PMCCR_SLPEN 0x00000001 /* System Low Power Enable */
+-#define PMCCR_DLPEN 0x00000002 /* DDR SDRAM Low Power Enable */
+-#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN)
+- u32 pmcer; /* PMC Event Register */
+-#define PMCER_PMCI 0x00000001 /* PMC Interrupt */
++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 */
++ u32 pmcmr; /* PMC Mask Register */
++#define PMCMR_PMCIE 0x0001 /* PMC Interrupt Enable */
+ #define PMCMR_RES ~(PMCMR_PMCIE)
+ u8 res0[0xF4];
+-} pmc8349_t;
+-
++} pmc83xx_t;
+
++#if defined (CONFIG_MPC8349)
+ /*
+ * general purpose I/O module
+ */
+-typedef struct gpio8349 {
+- u32 dir; /* direction register */
+- u32 odr; /* open drain register */
+- u32 dat; /* data register */
+- u32 ier; /* interrupt event register */
+- u32 imr; /* interrupt mask register */
+- u32 icr; /* external interrupt control register */
++typedef struct gpio83xx {
++ u32 dir; /* direction register */
++ u32 odr; /* open drain register */
++ u32 dat; /* data register */
++ u32 ier; /* interrupt event register */
++ u32 imr; /* interrupt mask register */
++ u32 icr; /* external interrupt control register */
+ u8 res0[0xE8];
+-} gpio8349_t;
++} 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
++ */
++typedef struct gpio_n {
++ u32 podr; /* Open Drain Register */
++ u32 pdat; /* Data Register */
++ u32 dir1; /* direction register 1 */
++ u32 dir2; /* direction register 2 */
++ u32 ppar1; /* Pin Assignment Register 1 */
++ u32 ppar2; /* Pin Assignment Register 2 */
++} gpio_n_t;
++
++typedef struct gpio83xx {
++ gpio_n_t ioport[0x7];
++ u8 res0[0x358];
++} gpio83xx_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 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];
++} qesba83xx_t;
++#endif
+
+ /*
+ * DDR Memory Controller Memory Map
+ */
+-typedef struct ddr_cs_bnds{
++typedef struct ddr_cs_bnds {
+ u32 csbnds;
+ #define CSBNDS_SA 0x00FF0000
+-#define CSBNDS_SA_SHIFT 8
++#define CSBNDS_SA_SHIFT 8
+ #define CSBNDS_EA 0x000000FF
+-#define CSBNDS_EA_SHIFT 24
+- u8 res0[4];
++#define CSBNDS_EA_SHIFT 24
++ u8 res0[4];
+ } ddr_cs_bnds_t;
+
+-typedef struct ddr8349{
+- ddr_cs_bnds_t csbnds[4]; /**< Chip Select x Memory Bounds */
++typedef struct ddr83xx {
++ 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
++ 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
+@@ -598,7 +941,7 @@ typedef struct ddr8349{
+ #define CSCONFIG_COL_BIT_10 0x00000002
+ #define CSCONFIG_COL_BIT_11 0x00000003
+ u8 res1[0x78];
+- u32 timing_cfg_1; /**< SDRAM Timing Configuration 1 */
++ u32 timing_cfg_1; /**< SDRAM Timing Configuration 1 */
+ #define TIMING_CFG1_PRETOACT 0x70000000
+ #define TIMING_CFG1_PRETOACT_SHIFT 28
+ #define TIMING_CFG1_ACTTOPRE 0x0F000000
+@@ -610,70 +953,70 @@ typedef struct ddr8349{
+ #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_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 */
++#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
++ 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) */
++#define TIMING_CFG2_WR_DATA_DELAY_SHIFT 10
++#define TIMING_CFG2_CPO_DEF 0x00000000 /* default (= CASLAT + 1) */
+
+- u32 sdram_cfg; /**< SDRAM Control Configuration */
++ u32 sdram_cfg; /**< SDRAM Control Configuration */
+ #define SDRAM_CFG_MEM_EN 0x80000000
+-#define SDRAM_CFG_SREN 0x40000000
++#define SDRAM_CFG_SREN 0x40000000
+ #define SDRAM_CFG_ECC_EN 0x20000000
+-#define SDRAM_CFG_RD_EN 0x10000000
++#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_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
+
+ u8 res2[4];
+- u32 sdram_mode; /**< SDRAM Mode Configuration */
++ 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 */
++#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 */
++ 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 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
+@@ -683,37 +1026,37 @@ typedef struct ddr8349{
+ 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 */
++ 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 */
++ 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
+ u8 res6[0x14];
+- u32 err_detect; /**< Memory Error Detect */
+-#define ECC_ERROR_DETECT_MME (0x80000000>>0) /* Multiple Memory Errors */
++ 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 */
++ 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 */
++ 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 (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 (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
+@@ -738,209 +1081,207 @@ typedef struct ddr8349{
+ #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_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*/
++ 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 (0xff000000>>24) /* Single Bit Error Counter 0..255 */
+ #define ECC_ERROR_MAN_SBEC_SHIFT 0
+ u8 res7[0xA4];
+ u32 debug_reg;
+ u8 res8[0xFC];
+-} ddr8349_t;
++} ddr83xx_t;
+
+ /*
+ * I2C1 Controller
+ */
+
+-
+ /*
+ * DUART
+ */
+-typedef struct duart8349{
++typedef struct duart83xx {
+ u8 urbr_ulcr_udlb; /**< combined register for URBR, UTHR and UDLB */
+- u8 uier_udmb; /**< combined register for UIER and UDMB */
++ 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 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];
+-} duart8349_t;
++} duart83xx_t;
+
+ /*
+ * Local Bus Controller Registers
+ */
+-typedef struct lbus_bank{
+- u32 br; /**< Base Register */
+- u32 or; /**< Base Register */
++typedef struct lbus_bank {
++ u32 br; /**< Base Register */
++ u32 or; /**< Base Register */
+ } lbus_bank_t;
+
+-typedef struct lbus8349 {
++typedef struct lbus83xx {
+ lbus_bank_t bank[8];
+ u8 res0[0x28];
+- u32 mar; /**< UPM Address Register */
++ u32 mar; /**< UPM Address Register */
+ u8 res1[0x4];
+- u32 mamr; /**< UPMA Mode Register */
+- u32 mbmr; /**< UPMB Mode Register */
+- u32 mcmr; /**< UPMC Mode Register */
++ u32 mamr; /**< UPMA Mode Register */
++ u32 mbmr; /**< UPMB Mode Register */
++ u32 mcmr; /**< UPMC Mode Register */
+ u8 res2[0x8];
+- u32 mrtpr; /**< Memory Refresh Timer Prescaler Register */
+- u32 mdr; /**< UPM Data Register */
++ u32 mrtpr; /**< Memory Refresh Timer Prescaler Register */
++ u32 mdr; /**< UPM Data Register */
+ u8 res3[0x8];
+- u32 lsdmr; /**< SDRAM Mode Register */
++ u32 lsdmr; /**< SDRAM Mode Register */
+ u8 res4[0x8];
+- u32 lurt; /**< UPM Refresh Timer */
+- u32 lsrt; /**< SDRAM Refresh Timer */
++ u32 lurt; /**< UPM Refresh Timer */
++ u32 lsrt; /**< SDRAM Refresh Timer */
+ u8 res5[0x8];
+- u32 ltesr; /**< Transfer Error Status Register */
+- u32 ltedr; /**< Transfer Error Disable Register */
+- u32 lteir; /**< Transfer Error Interrupt Register */
+- u32 lteatr; /**< Transfer Error Attributes Register */
+- u32 ltear; /**< Transfer Error Address Register */
++ u32 ltesr; /**< Transfer Error Status Register */
++ u32 ltedr; /**< Transfer Error Disable Register */
++ u32 lteir; /**< Transfer Error Interrupt Register */
++ u32 lteatr; /**< Transfer Error Attributes Register */
++ u32 ltear; /**< Transfer Error Address Register */
+ u8 res6[0xC];
+- u32 lbcr; /**< Configuration Register */
++ u32 lbcr; /**< Configuration Register */
+ #define LBCR_LDIS 0x80000000
+-#define LBCR_LDIS_SHIFT 31
++#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_EPAR_SHIFT 16
+ #define LBCR_BMT 0x0000FF00
+-#define LBCR_BMT_SHIFT 8
+- u32 lcrr; /**< Clock Ratio Register */
++#define LBCR_BMT_SHIFT 8
++ u32 lcrr; /**< Clock Ratio Register */
+ #define LCRR_DBYP 0x80000000
+-#define LCRR_DBYP_SHIFT 31
++#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_ECL_SHIFT 24
+ #define LCRR_EADC 0x00030000
+-#define LCRR_EADC_SHIFT 16
++#define LCRR_EADC_SHIFT 16
+ #define LCRR_CLKDIV 0x0000000F
+ #define LCRR_CLKDIV_SHIFT 0
+
+-
+ u8 res7[0x28];
+ u8 res8[0xF00];
+-} lbus8349_t;
++} lbus83xx_t;
+
++#if defined (CONFIG_MPC8349)
+ /*
+ * Serial Peripheral Interface
+ */
+-typedef struct spi8349
+-{
++typedef struct spi83xx {
+ 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 */
++ u32 tx; /**< transmit register */
++ u32 rx; /**< receive register */
+ u8 res1[0xD8];
+-} spi8349_t;
+-
++} spi83xx_t;
++#endif
+
+ /*
+ * DMA/Messaging Unit
+ */
+-typedef struct dma8349 {
+- u32 res0[0xC]; /* 0x0-0x29 reseverd */
+- 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 */
+- u32 res5; /* 0x10C reserved */
+- u32 dmasar0; /* 0x110 DMA 0 source address register */
+- u32 res6; /* 0x114 reserved */
+- u32 dmadar0; /* 0x118 DMA 0 destination address register */
+- u32 res7; /* 0x11C reserved */
+- 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 */
+- u32 res9; /* 0x18C reserved */
+- u32 dmasar1; /* 0x190 DMA 1 source address register */
+- u32 res10; /* 0x194 reserved */
+- u32 dmadar1; /* 0x198 DMA 1 destination address register */
+- u32 res11; /* 0x19C reserved */
+- 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 */
+- u32 res13; /* 0x20C reserved */
+- u32 dmasar2; /* 0x210 DMA 2 source address register */
+- u32 res14; /* 0x214 reserved */
+- u32 dmadar2; /* 0x218 DMA 2 destination address register */
+- u32 res15; /* 0x21C reserved */
+- 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 */
+- u32 res17; /* 0x28C reserved */
+- u32 dmasar3; /* 0x290 DMA 3 source address register */
+- u32 res18; /* 0x294 reserved */
+- u32 dmadar3; /* 0x298 DMA 3 destination address register */
+- 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 */
+-} dma8349_t;
++typedef struct dma83xx {
++ u32 res0[0xC]; /* 0x0-0x29 reseverd */
++ 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 */
++ u32 res5; /* 0x10C reserved */
++ u32 dmasar0; /* 0x110 DMA 0 source address register */
++ u32 res6; /* 0x114 reserved */
++ u32 dmadar0; /* 0x118 DMA 0 destination address register */
++ u32 res7; /* 0x11C reserved */
++ 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 */
++ u32 res9; /* 0x18C reserved */
++ u32 dmasar1; /* 0x190 DMA 1 source address register */
++ u32 res10; /* 0x194 reserved */
++ u32 dmadar1; /* 0x198 DMA 1 destination address register */
++ u32 res11; /* 0x19C reserved */
++ 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 */
++ u32 res13; /* 0x20C reserved */
++ u32 dmasar2; /* 0x210 DMA 2 source address register */
++ u32 res14; /* 0x214 reserved */
++ u32 dmadar2; /* 0x218 DMA 2 destination address register */
++ u32 res15; /* 0x21C reserved */
++ 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 */
++ u32 res17; /* 0x28C reserved */
++ u32 dmasar3; /* 0x290 DMA 3 source address register */
++ u32 res18; /* 0x294 reserved */
++ u32 dmadar3; /* 0x298 DMA 3 destination address register */
++ 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 */
++#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 */
++#define DMA_CHANNEL_BUSY (0x00000004) /* Bit - DMASRn CB */
++#define DMA_CHANNEL_TRANSFER_ERROR (0x00000080) /* Bit - DMASRn TE */
+
+ /*
+ * PCI Software Configuration Registers
+ */
+-typedef struct pciconf8349 {
+- u32 config_address;
++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
+@@ -952,235 +1293,788 @@ typedef struct pciconf8349 {
+ #define PCI_CONFIG_ADDRESS_RN_MASK 0x000000fc
+ u32 config_data;
+ u32 int_ack;
+- u8 res[116];
+-} pciconf8349_t;
++ u8 res[116];
++} pciconf83xx_t;
+
+ /*
+ * PCI Outbound Translation Register
+ */
+ typedef struct pci_outbound_window {
+- u32 potar;
+- u8 res0[4];
+- u32 pobar;
+- u8 res1[4];
+- u32 pocmr;
+- u8 res2[4];
+-} pot8349_t;
++ u32 potar;
++ u8 res0[4];
++ u32 pobar;
++ u8 res1[4];
++ u32 pocmr;
++ u8 res2[4];
++} pot83xx_t;
++
+ /*
+ * Sequencer
+ */
+-typedef struct ios8349 {
+- pot8349_t pot[6];
++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];
+- u32 dtcr;
+- u8 res2[4];
+-} ios8349_t;
++#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];
++ u32 dtcr;
++ u8 res2[4];
++} ios83xx_t;
+
+ /*
+ * PCI Controller Control and Status Registers
+ */
+-typedef struct pcictrl8349 {
+- u32 esr;
++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 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
++#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 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_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
+-#define EATCR_HBE_MASK 0x00000f00 /* PCI high byte enable*/
+-#define EATCR_BE_MASK 0x000000f0 /* PCI byte enable */
+-#define EATCR_HPB 0x00000004 /* high parity bit */
+-#define EATCR_PB 0x00000002 /* parity bit*/
+-#define EATCR_VI 0x00000001 /* error information valid */
+- u32 eacr;
+- u32 eeacr;
+- u32 edlcr;
+- u32 edhcr;
+- u32 gcr;
+- u32 ecr;
+- u32 gsr;
+- u8 res0[12];
+- u32 pitar2;
+- u8 res1[4];
+- u32 pibar2;
+- u32 piebar2;
+- u32 piwar2;
+- u8 res2[4];
+- u32 pitar1;
+- u8 res3[4];
+- u32 pibar1;
+- u32 piebar1;
+- u32 piwar1;
+- u8 res4[4];
+- u32 pitar0;
+- u8 res5[4];
+- u32 pibar0;
+- u8 res6[4];
+- u32 piwar0;
+- u8 res7[132];
++#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;
++ u8 res0[12];
++ u32 pitar2;
++ u8 res1[4];
++ u32 pibar2;
++ u32 piebar2;
++ u32 piwar2;
++ u8 res2[4];
++ u32 pitar1;
++ u8 res3[4];
++ u32 pibar1;
++ u32 piebar1;
++ u32 piwar1;
++ u8 res4[4];
++ u32 pitar0;
++ u8 res5[4];
++ u32 pibar0;
++ 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_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_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
+-} pcictrl8349_t;
++#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 usb8349 {
++typedef struct usb83xx {
+ u8 fixme[0x2000];
+-} usb8349_t;
++} usb83xx_t;
+
+ /*
+ * TSEC
+ */
+-typedef struct tsec8349 {
++typedef struct tsec83xx {
+ u8 fixme[0x1000];
+-} tsec8349_t;
++} tsec83xx_t;
++#endif
+
+ /*
+ * Security
+ */
+-typedef struct security8349 {
++typedef struct security83xx {
+ u8 fixme[0x10000];
+-} security8349_t;
++} security83xx_t;
++
++#if defined (CONFIG_MPC8360)
++/*
++ * iram
++ */
++typedef struct iram83xx {
++ u32 iadd; /* I-RAM address register */
++ u32 idata; /* I-RAM data register */
++ u8 res0[0x78];
++} iram83xx_t;
++
++/*
++ * Interrupt Controller
++ */
++typedef struct irq83xx {
++ u32 cicr; /* QE system interrupt configuration */
++ u32 civec; /* QE system interrupt vector register */
++ u32 cripnr; /* QE RISC interrupt pending register */
++ u32 cipnr; /* QE system interrupt pending register */
++ u32 cipxcc; /* QE interrupt priority register */
++ u32 cipycc; /* QE interrupt priority register */
++ u32 cipwcc; /* QE interrupt priority register */
++ u32 cipzcc; /* QE interrupt priority register */
++ u32 cimr; /* QE system interrupt mask register */
++ u32 crimr; /* QE RISC interrupt mask register */
++ u32 cicnr; /* QE system interrupt control register */
++ u8 res0[0x4];
++ u32 ciprta; /* QE system interrupt priority register for RISC tasks A */
++ u32 ciprtb; /* QE system interrupt priority register for RISC tasks B */
++ u8 res1[0x4];
++ u32 cricr; /* QE system RISC interrupt control */
++ u8 res2[0x20];
++ u32 chivec; /* QE high system interrupt vector */
++ u8 res3[0x1C];
++} irq83xx_t;
++
++/*
++ * Communications Processor
++ */
++typedef struct cp83xx {
++ u32 cecr; /* QE command register */
++ u32 ceccr; /* QE controller configuration register */
++ u32 cecdr; /* QE command data register */
++ u8 res0[0xA];
++ u16 ceter; /* QE timer event register */
++ u8 res1[0x2];
++ u16 cetmr; /* QE timers mask register */
++ u32 cetscr; /* QE time-stamp timer control register */
++ u32 cetsr1; /* QE time-stamp register 1 */
++ u32 cetsr2; /* QE time-stamp register 2 */
++ u8 res2[0x8];
++ u32 cevter; /* QE virtual tasks event register */
++ u32 cevtmr; /* QE virtual tasks mask register */
++ u16 cercr; /* QE RAM control register */
++ u8 res3[0x2];
++ u8 res4[0x24];
++ u16 ceexe1; /* QE external request 1 event register */
++ u8 res5[0x2];
++ u16 ceexm1; /* QE external request 1 mask register */
++ u8 res6[0x2];
++ u16 ceexe2; /* QE external request 2 event register */
++ u8 res7[0x2];
++ u16 ceexm2; /* QE external request 2 mask register */
++ u8 res8[0x2];
++ u16 ceexe3; /* QE external request 3 event register */
++ u8 res9[0x2];
++ u16 ceexm3; /* QE external request 3 mask register */
++ u8 res10[0x2];
++ u16 ceexe4; /* QE external request 4 event register */
++ u8 res11[0x2];
++ u16 ceexm4; /* QE external request 4 mask register */
++ u8 res12[0x2];
++ u8 res13[0x280];
++} cp83xx_t;
++
++/*
++ * QE Multiplexer
++ */
++
++typedef struct qmx83xx {
++ u32 cmxgcr; /* CMX general clock route register */
++ u32 cmxsi1cr_l; /* CMX SI1 clock route low register */
++ u32 cmxsi1cr_h; /* CMX SI1 clock route high register */
++ u32 cmxsi1syr; /* CMX SI1 SYNC route register */
++ u32 cmxucr1; /* CMX UCC1, UCC3 clock route register */
++ u32 cmxucr2; /* CMX UCC5, UCC7 clock route register */
++ u32 cmxucr3; /* CMX UCC2, UCC4 clock route register */
++ u32 cmxucr4; /* CMX UCC6, UCC8 clock route register */
++ u32 cmxupcr; /* CMX UPC clock route register */
++ u8 res0[0x1C];
++} qmx83xx_t;
++
++/*
++* QE Timers
++*/
++
++typedef struct qet83xx {
++ u8 gtcfr1; /* Timer 1 and Timer 2 global configuration register */
++ u8 res0[0x3];
++ u8 gtcfr2; /* Timer 3 and timer 4 global configuration register */
++ u8 res1[0xB];
++ u16 gtmdr1; /* Timer 1 mode register */
++ u16 gtmdr2; /* Timer 2 mode register */
++ u16 gtrfr1; /* Timer 1 reference register */
++ u16 gtrfr2; /* Timer 2 reference register */
++ u16 gtcpr1; /* Timer 1 capture register */
++ u16 gtcpr2; /* Timer 2 capture register */
++ u16 gtcnr1; /* Timer 1 counter */
++ u16 gtcnr2; /* Timer 2 counter */
++ u16 gtmdr3; /* Timer 3 mode register */
++ u16 gtmdr4; /* Timer 4 mode register */
++ u16 gtrfr3; /* Timer 3 reference register */
++ u16 gtrfr4; /* Timer 4 reference register */
++ u16 gtcpr3; /* Timer 3 capture register */
++ u16 gtcpr4; /* Timer 4 capture register */
++ u16 gtcnr3; /* Timer 3 counter */
++ u16 gtcnr4; /* Timer 4 counter */
++ u16 gtevr1; /* Timer 1 event register */
++ u16 gtevr2; /* Timer 2 event register */
++ u16 gtevr3; /* Timer 3 event register */
++ u16 gtevr4; /* Timer 4 event register */
++ u16 gtps; /* Timer 1 prescale register */
++ u8 res2[0x46];
++} qet83xx_t;
++
++/*
++* spi
++*/
++
++typedef struct spi83xx {
++ u8 res0[0x20];
++ u32 spmode; /* SPI mode register */
++ u8 res1[0x2];
++ u8 spie; /* SPI event register */
++ u8 res2[0x1];
++ u8 res3[0x2];
++ u8 spim; /* SPI mask register */
++ u8 res4[0x1];
++ u8 res5[0x1];
++ u8 spcom; /* SPI command register */
++ u8 res6[0x2];
++ u32 spitd; /* SPI transmit data register (cpu mode) */
++ u32 spird; /* SPI receive data register (cpu mode) */
++ u8 res7[0x8];
++} spi83xx_t;
++
++/*
++* mcc
++*/
++
++typedef struct mcc83xx {
++ u32 mcce; /* MCC event register */
++ u32 mccm; /* MCC mask register */
++ u32 mccf; /* MCC configuration register */
++ u32 merl; /* MCC emergency request level register */
++ u8 res0[0xF0];
++} mcc83xx_t;
++
++/*
++* brg
++*/
++
++typedef struct brg83xx {
++ u32 brgc1; /* BRG1 configuration register */
++ u32 brgc2; /* BRG2 configuration register */
++ u32 brgc3; /* BRG3 configuration register */
++ u32 brgc4; /* BRG4 configuration register */
++ u32 brgc5; /* BRG5 configuration register */
++ u32 brgc6; /* BRG6 configuration register */
++ u32 brgc7; /* BRG7 configuration register */
++ u32 brgc8; /* BRG8 configuration register */
++ u32 brgc9; /* BRG9 configuration register */
++ u32 brgc10; /* BRG10 configuration register */
++ u32 brgc11; /* BRG11 configuration register */
++ u32 brgc12; /* BRG12 configuration register */
++ u32 brgc13; /* BRG13 configuration register */
++ u32 brgc14; /* BRG14 configuration register */
++ u32 brgc15; /* BRG15 configuration register */
++ u32 brgc16; /* BRG16 configuration register */
++ u8 res0[0x40];
++} brg83xx_t;
++
++/*
++* USB
++*/
++
++typedef struct usb83xx {
++ u8 usmod; /* USB mode register */
++ u8 usadd; /* USB address register */
++ u8 uscom; /* USB command register */
++ u8 res0[0x1];
++ u16 usep0; /* USB endpoint register 0 */
++ u16 usep1; /* USB endpoint register 1 */
++ u16 usep2; /* USB endpoint register 2 */
++ u16 usep3; /* USB endpoint register 3 */
++ u8 res1[0x4];
++ u16 usber; /* USB event register */
++ u8 res2[0x2];
++ u16 usbmr; /* USB mask register */
++ u8 res3[0x1];
++ u8 usbs; /* USB status register */
++ u32 ussft; /* USB start of frame timer */
++ u8 res4[0x24];
++} usb83xx_t;
++
++/*
++* SI
++*/
++
++typedef struct si1_83xx {
++ u16 siamr1; /* SI1 TDMA mode register */
++ u16 sibmr1; /* SI1 TDMB mode register */
++ u16 sicmr1; /* SI1 TDMC mode register */
++ u16 sidmr1; /* SI1 TDMD mode register */
++ u8 siglmr1_h; /* SI1 global mode register high */
++ u8 res0[0x1];
++ u8 sicmdr1_h; /* SI1 command register high */
++ u8 res2[0x1];
++ u8 sistr1_h; /* SI1 status register high */
++ u8 res3[0x1];
++ u16 sirsr1_h; /* SI1 RAM shadow address register high */
++ u8 sitarc1; /* SI1 RAM counter Tx TDMA */
++ u8 sitbrc1; /* SI1 RAM counter Tx TDMB */
++ u8 sitcrc1; /* SI1 RAM counter Tx TDMC */
++ u8 sitdrc1; /* SI1 RAM counter Tx TDMD */
++ u8 sirarc1; /* SI1 RAM counter Rx TDMA */
++ u8 sirbrc1; /* SI1 RAM counter Rx TDMB */
++ u8 sircrc1; /* SI1 RAM counter Rx TDMC */
++ u8 sirdrc1; /* SI1 RAM counter Rx TDMD */
++ u8 res4[0x8];
++ u16 siemr1; /* SI1 TDME mode register 16 bits */
++ u16 sifmr1; /* SI1 TDMF mode register 16 bits */
++ u16 sigmr1; /* SI1 TDMG mode register 16 bits */
++ u16 sihmr1; /* SI1 TDMH mode register 16 bits */
++ u8 siglmg1_l; /* SI1 global mode register low 8 bits */
++ u8 res5[0x1];
++ u8 sicmdr1_l; /* SI1 command register low 8 bits */
++ u8 res6[0x1];
++ u8 sistr1_l; /* SI1 status register low 8 bits */
++ u8 res7[0x1];
++ u16 sirsr1_l; /* SI1 RAM shadow address register low 16 bits */
++ u8 siterc1; /* SI1 RAM counter Tx TDME 8 bits */
++ u8 sitfrc1; /* SI1 RAM counter Tx TDMF 8 bits */
++ u8 sitgrc1; /* SI1 RAM counter Tx TDMG 8 bits */
++ u8 sithrc1; /* SI1 RAM counter Tx TDMH 8 bits */
++ u8 sirerc1; /* SI1 RAM counter Rx TDME 8 bits */
++ u8 sirfrc1; /* SI1 RAM counter Rx TDMF 8 bits */
++ u8 sirgrc1; /* SI1 RAM counter Rx TDMG 8 bits */
++ u8 sirhrc1; /* SI1 RAM counter Rx TDMH 8 bits */
++ u8 res8[0x8];
++ u32 siml1; /* SI1 multiframe limit register */
++ u8 siedm1; /* SI1 extended diagnostic mode register */
++ u8 res9[0xBB];
++} si1_83xx_t;
++
++/*
++* SI Routing Tables
++*/
++
++typedef struct sir83xx {
++ u8 tx[0x400];
++ u8 rx[0x400];
++ u8 res0[0x800];
++} sir83xx_t;
++
++/*
++* ucc
++*/
++
++typedef struct uslow {
++ u32 gumr_l; /* UCCx general mode register (low) */
++ u32 gumr_h; /* UCCx general mode register (high) */
++ u16 upsmr; /* UCCx protocol-specific mode register */
++ u8 res0[0x2];
++ u16 utodr; /* UCCx transmit on demand register */
++ u16 udsr; /* UCCx data synchronization register */
++ u16 ucce; /* UCCx event register */
++ u8 res1[0x2];
++ u16 uccm; /* UCCx mask register */
++ u8 res2[0x1];
++ u8 uccs; /* UCCx status register */
++ u8 res3[0x1E8];
++} uslow_t;
++
++typedef struct ufast {
++ u32 gumr; /* UCCx general mode register */
++ u32 upsmr; /* UCCx protocol-specific mode register */
++ u16 utodr; /* UCCx transmit on demand register */
++ u8 res0[0x2];
++ u16 udsr; /* UCCx data synchronization register */
++ u8 res1[0x2];
++ u32 ucce; /* UCCx event register */
++ u32 uccm; /* UCCx mask register. */
++ u8 uccs; /* UCCx status register */
++ u8 res2[0x7];
++ u32 urfb; /* UCC receive FIFO base */
++ u16 urfs; /* UCC receive FIFO size */
++ u8 res3[0x2];
++ u16 urfet; /* UCC receive FIFO emergency threshold */
++ u16 urfset; /* UCC receive FIFO special emergency threshold */
++ u32 utfb; /* UCC transmit FIFO base */
++ u16 utfs; /* UCC transmit FIFO size */
++ u8 res4[0x2];
++ u16 utfet; /* UCC transmit FIFO emergency threshold */
++ u8 res5[0x2];
++ u16 utftt; /* UCC transmit FIFO transmit threshold */
++ u8 res6[0x2];
++ u16 utpt; /* UCC transmit polling timer */
++ u32 urtry; /* UCC retry counter register */
++ u8 res7[0x4C];
++ u8 guemr; /* UCC general extended mode register */
++ u8 res8[0x3];
++ u8 res9[0x6C];
++ u32 maccfg1; /* Mac configuration register #1 */
++ u32 maccfg2; /* Mac configuration register #2 */
++ u16 ipgifg; /* Interframe gap register */
++ u8 res10[0x2];
++ u32 hafdup; /* Half-duplex register */
++ u8 res11[0xC];
++ u32 emtr; /* Ethernet MAC test register */
++ u32 miimcfg; /* MII mgmt configuration register */
++ u32 miimcom; /* MII mgmt command register */
++ u32 miimadd; /* MII mgmt address register */
++ u32 miimcon; /* MII mgmt control register */
++ u32 miistat; /* MII mgmt status register */
++ u32 miimnd; /* MII mgmt indication register */
++ u32 ifctl; /* Interface control register */
++ u32 ifstat; /* Interface status register */
++ u32 macstnaddr1; /* Station address part 1 register */
++ u32 macstnaddr2; /* Station address part 2 register */
++ u8 res12[0x8];
++ u32 uempr; /* UCC Ethernet MAC parameter register */
++ u32 utbipa; /* UCC TBI address */
++ u16 uescr; /* UCC Ethernet statistics control register */
++ u8 res13[0x26];
++ u32 tx64; /* Transmit and receive 64-byte frame counter */
++ u32 tx127; /* Transmit and receive 65- to 127-byte frame counter */
++ u32 tx255; /* Transmit and receive 128- to 255-byte frame counter */
++ u32 rx64; /* Receive and receive 64-byte frame counter */
++ u32 rx127; /* Receive and receive 65- to 127-byte frame counter */
++ u32 rx255; /* Receive and receive 128- to 255-byte frame counter */
++ u32 txok; /* Transmit good bytes counter */
++ u32 txcf; /* Transmit control frame counter */
++ u32 tmca; /* Transmit multicast control frame counter */
++ u32 tbca; /* Transmit broadcast packet counter */
++ u32 rxfok; /* Receive frame OK counter */
++ u32 rbyt; /* Receive good and bad bytes counter */
++ u32 rxbok; /* Receive bytes OK counter */
++ u32 rmca; /* Receive multicast packet counter */
++ u32 rbca; /* Receive broadcast packet counter */
++ u32 scar; /* Statistics carry register */
++ u32 scam; /* Statistics carry mask register */
++ u8 res14[0x3C];
++} ufast_t;
++
++typedef struct ucc83xx {
++ union {
++ uslow_t slow;
++ ufast_t fast;
++ };
++} ucc83xx_t;
++
++/*
++* MultiPHY UTOPIA POS Controllers
++*/
++
++typedef struct upc83xx {
++ u32 upgcr; /* UTOPIA/POS general configuration register */
++#define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */
++#define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */
++#define UPGCR_RMS 0x20000000 /* Receive master/slave mode */
++#define UPGCR_ADDR 0x10000000 /* Master MPHY Addr multiplexing: */
++#define UPGCR_DIAG 0x01000000 /* Diagnostic mode */
++ u32 uplpa; /* UTOPIA/POS last PHY address */
++ u32 uphec; /* ATM HEC register */
++ u32 upuc; /* UTOPIA/POS UCC configuration */
++ u32 updc1; /* UTOPIA/POS device 1 configuration */
++ u32 updc2; /* UTOPIA/POS device 2 configuration */
++ u32 updc3; /* UTOPIA/POS device 3 configuration */
++ u32 updc4; /* UTOPIA/POS device 4 configuration */
++ u32 upstpa; /* UTOPIA/POS STPA threshold */
++ u8 res0[0xC];
++ u32 updrs1_h; /* UTOPIA/POS device 1 rate select */
++ u32 updrs1_l; /* UTOPIA/POS device 1 rate select */
++ u32 updrs2_h; /* UTOPIA/POS device 2 rate select */
++ u32 updrs2_l; /* UTOPIA/POS device 2 rate select */
++ u32 updrs3_h; /* UTOPIA/POS device 3 rate select */
++ u32 updrs3_l; /* UTOPIA/POS device 3 rate select */
++ u32 updrs4_h; /* UTOPIA/POS device 4 rate select */
++ u32 updrs4_l; /* UTOPIA/POS device 4 rate select */
++ u32 updrp1; /* UTOPIA/POS device 1 receive priority low */
++ u32 updrp2; /* UTOPIA/POS device 2 receive priority low */
++ u32 updrp3; /* UTOPIA/POS device 3 receive priority low */
++ u32 updrp4; /* UTOPIA/POS device 4 receive priority low */
++ u32 upde1; /* UTOPIA/POS device 1 event */
++ u32 upde2; /* UTOPIA/POS device 2 event */
++ u32 upde3; /* UTOPIA/POS device 3 event */
++ u32 upde4; /* UTOPIA/POS device 4 event */
++ u16 uprp1;
++ u16 uprp2;
++ u16 uprp3;
++ u16 uprp4;
++ u8 res1[0x8];
++ u16 uptirr1_0; /* Device 1 transmit internal rate 0 */
++ u16 uptirr1_1; /* Device 1 transmit internal rate 1 */
++ u16 uptirr1_2; /* Device 1 transmit internal rate 2 */
++ u16 uptirr1_3; /* Device 1 transmit internal rate 3 */
++ u16 uptirr2_0; /* Device 2 transmit internal rate 0 */
++ u16 uptirr2_1; /* Device 2 transmit internal rate 1 */
++ u16 uptirr2_2; /* Device 2 transmit internal rate 2 */
++ u16 uptirr2_3; /* Device 2 transmit internal rate 3 */
++ u16 uptirr3_0; /* Device 3 transmit internal rate 0 */
++ u16 uptirr3_1; /* Device 3 transmit internal rate 1 */
++ u16 uptirr3_2; /* Device 3 transmit internal rate 2 */
++ u16 uptirr3_3; /* Device 3 transmit internal rate 3 */
++ u16 uptirr4_0; /* Device 4 transmit internal rate 0 */
++ u16 uptirr4_1; /* Device 4 transmit internal rate 1 */
++ u16 uptirr4_2; /* Device 4 transmit internal rate 2 */
++ u16 uptirr4_3; /* Device 4 transmit internal rate 3 */
++ u32 uper1; /* Device 1 port enable register */
++ u32 uper2; /* Device 2 port enable register */
++ u32 uper3; /* Device 3 port enable register */
++ u32 uper4; /* Device 4 port enable register */
++ u8 res2[0x150];
++} upc83xx_t;
++
++/*
++* SDMA
++*/
++
++typedef struct sdma83xx {
++ u32 sdsr; /* Serial DMA status register */
++ u32 sdmr; /* Serial DMA mode register */
++ u32 sdtr1; /* SDMA system bus threshold register */
++ u32 sdtr2; /* SDMA secondary bus threshold register */
++ u32 sdhy1; /* SDMA system bus hysteresis register */
++ u32 sdhy2; /* SDMA secondary bus hysteresis register */
++ u32 sdta1; /* SDMA system bus address register */
++ u32 sdta2; /* SDMA secondary bus address register */
++ u32 sdtm1; /* SDMA system bus MSNUM register */
++ u32 sdtm2; /* SDMA secondary bus MSNUM register */
++ u8 res0[0x10];
++ u32 sdaqr; /* SDMA address bus qualify register */
++ u32 sdaqmr; /* SDMA address bus qualify mask register */
++ u8 res1[0x4];
++ u32 sdwbcr; /* SDMA CAM entries base register */
++ u8 res2[0x38];
++} sdma83xx_t;
++
++/*
++* Debug Space
++*/
++
++typedef struct dbg83xx {
++ u32 bpdcr; /* Breakpoint debug command register */
++ u32 bpdsr; /* Breakpoint debug status register */
++ u32 bpdmr; /* Breakpoint debug mask register */
++ u32 bprmrr0; /* Breakpoint request mode risc register 0 */
++ u32 bprmrr1; /* Breakpoint request mode risc register 1 */
++ u8 res0[0x8];
++ u32 bprmtr0; /* Breakpoint request mode trb register 0 */
++ u32 bprmtr1; /* Breakpoint request mode trb register 1 */
++ u8 res1[0x8];
++ u32 bprmir; /* Breakpoint request mode immediate register */
++ u32 bprmsr; /* Breakpoint request mode serial register */
++ u32 bpemr; /* Breakpoint exit mode register */
++ u8 res2[0x48];
++} dbg83xx_t;
++
++/*
++* RISC Special Registers (Trap and Breakpoint)
++*/
++
++typedef struct rsp83xx {
++ u8 fixme[0x100];
++} rsp83xx_t;
++#endif
+
+ typedef struct immap {
+- sysconf8349_t sysconf; /* System configuration */
+- wdt8349_t wdt; /* Watch Dog Timer (WDT) Registers */
+- rtclk8349_t rtc; /* Real Time Clock Module Registers */
+- rtclk8349_t pit; /* Periodic Interval Timer */
+- gtm8349_t gtm[2]; /* Global Timers Module */
+- ipic8349_t ipic; /* Integrated Programmable Interrupt Controller */
+- arbiter8349_t arbiter; /* System Arbiter Registers */
+- reset8349_t reset; /* Reset Module */
+- clk8349_t clk; /* System Clock Module */
+- pmc8349_t pmc; /* Power Management Control Module */
+- gpio8349_t pgio[2]; /* general purpose I/O module */
++ 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];
+- ddr8349_t ddr; /* DDR Memory Controller Memory */
+- i2c_t i2c[2]; /* I2C1 Controller */
++#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];
+- duart8349_t duart[2];/* DUART */
++ duart83xx_t duart[2]; /* DUART */
++#if defined (CONFIG_MPC8349)
+ u8 res3[0x900];
+- lbus8349_t lbus; /* Local Bus Controller Registers */
++ lbus83xx_t lbus; /* Local Bus Controller Registers */
+ u8 res4[0x1000];
+- spi8349_t spi; /* Serial Peripheral Interface */
++ spi83xx_t spi; /* Serial Peripheral Interface */
+ u8 res5[0xF00];
+- dma8349_t dma; /* DMA */
+- pciconf8349_t pci_conf[2]; /* PCI Software Configuration Registers */
+- ios8349_t ios; /* Sequencer */
+- pcictrl8349_t pci_ctrl[2]; /* PCI Controller Control and Status Registers */
++#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];
+- usb8349_t usb;
+- tsec8349_t tsec[2];
++ usb83xx_t usb;
++ tsec83xx_t tsec[2];
+ u8 res7[0xA000];
+- security8349_t security;
++ 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
+ } immap_t;
+
+-#endif /* __IMMAP_8349__ */
++#endif /* __IMMAP_83xx__ */
+diff -Naupr u-boot-1.1.6/include/asm-ppc/immap_qe.h u-boot-1.1.6-fsl-1/include/asm-ppc/immap_qe.h
+--- u-boot-1.1.6/include/asm-ppc/immap_qe.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/immap_qe.h 2006-11-10 11:24:29.000000000 -0600
+@@ -0,0 +1,550 @@
++/*
++ * QUICC Engine (QE) Internal Memory Map.
++ * The Internal Memory Map for devices with QE on them. This
++ * is the superset of all QE devices (8360, etc.).
++ *
++ * Copyright (c) 2006 Freescale Semiconductor, Inc.
++ * Author: Shlomi Gridih <gridish@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.
++ */
++
++#ifndef __IMMAP_QE_H__
++#define __IMMAP_QE_H__
++
++/* QE I-RAM
++*/
++typedef struct qe_iram {
++ u32 iadd; /* I-RAM Address Register */
++ u32 idata; /* I-RAM Data Register */
++ u8 res0[0x78];
++} __attribute__ ((packed)) qe_iram_t;
++
++/* QE Interrupt Controller
++*/
++typedef struct qe_ic {
++ u32 qicr;
++ u32 qivec;
++ u32 qripnr;
++ u32 qipnr;
++ u32 qipxcc;
++ u32 qipycc;
++ u32 qipwcc;
++ u32 qipzcc;
++ u32 qimr;
++ u32 qrimr;
++ u32 qicnr;
++ u8 res0[0x4];
++ u32 qiprta;
++ u32 qiprtb;
++ u8 res1[0x4];
++ u32 qricr;
++ u8 res2[0x20];
++ u32 qhivec;
++ u8 res3[0x1C];
++} __attribute__ ((packed)) qe_ic_t;
++
++/* Communications Processor
++*/
++typedef struct cp_qe {
++ 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];
++} __attribute__ ((packed)) cp_qe_t;
++
++/* QE Multiplexer
++*/
++typedef struct qe_mux {
++ 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];
++} __attribute__ ((packed)) qe_mux_t;
++
++/* QE Timers
++*/
++typedef struct qe_timers {
++ u8 gtcfr1; /* Timer 1 2 global configuration register */
++ u8 res0[0x3];
++ u8 gtcfr2; /* Timer 3 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];
++} __attribute__ ((packed)) qe_timers_t;
++
++/* BRG
++*/
++typedef struct qe_brg {
++ 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];
++} __attribute__ ((packed)) qe_brg_t;
++
++/* SPI
++*/
++typedef struct spi {
++ 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];
++} __attribute__ ((packed)) spi_t;
++
++/* SI
++*/
++typedef struct si1 {
++ 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];
++} __attribute__ ((packed)) si1_t;
++
++/* SI Routing Tables
++*/
++typedef struct sir {
++ u8 tx[0x400];
++ u8 rx[0x400];
++ u8 res0[0x800];
++} __attribute__ ((packed)) sir_t;
++
++/* USB Controller.
++*/
++typedef struct usb_ctlr {
++ u8 usb_usmod;
++ u8 usb_usadr;
++ u8 usb_uscom;
++ u8 res1[1];
++ u16 usb_usep1;
++ u16 usb_usep2;
++ u16 usb_usep3;
++ u16 usb_usep4;
++ u8 res2[4];
++ u16 usb_usber;
++ u8 res3[2];
++ u16 usb_usbmr;
++ u8 res4[1];
++ u8 usb_usbs;
++ u16 usb_ussft;
++ u8 res5[2];
++ u16 usb_usfrn;
++ u8 res6[0x22];
++} __attribute__ ((packed)) usb_t;
++
++/* MCC
++*/
++typedef struct mcc {
++ 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];
++} __attribute__ ((packed)) mcc_t;
++
++/* QE UCC Slow
++*/
++typedef struct ucc_slow {
++ 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[0x24];
++ u16 utpt;
++ u8 guemr; /* UCC general extended mode register */
++ u8 res4[0x200 - 0x091];
++} __attribute__ ((packed)) ucc_slow_t;
++
++typedef struct ucc_ethernet {
++ u32 maccfg1; /* mac configuration reg. 1 */
++ u32 maccfg2; /* mac configuration reg. 2 */
++ u32 ipgifg; /* interframe gap reg. */
++ u32 hafdup; /* half-duplex reg. */
++ u8 res1[0x10];
++ u32 miimcfg; /* MII management configuration reg */
++ u32 miimcom; /* MII management command reg */
++ u32 miimadd; /* MII management address reg */
++ u32 miimcon; /* MII management control reg */
++ u32 miimstat; /* MII management status reg */
++ u32 miimind; /* MII management indication reg */
++ u32 ifctl; /* interface control reg */
++ u32 ifstat; /* interface statux reg */
++ u32 macstnaddr1; /* mac station address part 1 reg */
++ u32 macstnaddr2; /* mac station address part 2 reg */
++ u8 res2[0x8];
++ u32 uempr; /* UCC Ethernet Mac parameter reg */
++ u32 utbipar; /* UCC tbi address reg */
++ u16 uescr; /* UCC Ethernet statistics control reg */
++ u8 res3[0x180 - 0x15A];
++ u32 tx64; /* Total number of frames (including bad
++ * frames) transmitted that were exactly
++ * of the minimal length (64 for un tagged,
++ * 68 for tagged, or with length exactly
++ * equal to the parameter MINLength */
++ u32 tx127; /* Total number of frames (including bad
++ * frames) transmitted that were between
++ * MINLength (Including FCS length==4)
++ * and 127 octets */
++ u32 tx255; /* Total number of frames (including bad
++ * frames) transmitted that were between
++ * 128 (Including FCS length==4) and 255
++ * octets */
++ u32 rx64; /* Total number of frames received including
++ * bad frames that were exactly of the
++ * mninimal length (64 bytes) */
++ u32 rx127; /* Total number of frames (including bad
++ * frames) received that were between
++ * MINLength (Including FCS length==4)
++ * and 127 octets */
++ u32 rx255; /* Total number of frames (including
++ * bad frames) received that were between
++ * 128 (Including FCS length==4) and 255
++ * octets */
++ u32 txok; /* Total number of octets residing in frames
++ * that where involved in succesfull
++ * transmission */
++ u16 txcf; /* Total number of PAUSE control frames
++ * transmitted by this MAC */
++ u8 res4[0x2];
++ u32 tmca; /* Total number of frames that were transmitted
++ * succesfully with the group address bit set
++ * that are not broadcast frames */
++ u32 tbca; /* Total number of frames transmitted
++ * succesfully that had destination address
++ * field equal to the broadcast address */
++ u32 rxfok; /* Total number of frames received OK */
++ u32 rxbok; /* Total number of octets received OK */
++ u32 rbyt; /* Total number of octets received including
++ * octets in bad frames. Must be implemented
++ * in HW because it includes octets in frames
++ * that never even reach the UCC */
++ u32 rmca; /* Total number of frames that were received
++ * succesfully with the group address bit set
++ * that are not broadcast frames */
++ u32 rbca; /* Total number of frames received succesfully
++ * that had destination address equal to the
++ * broadcast address */
++ u32 scar; /* Statistics carry register */
++ u32 scam; /* Statistics caryy mask register */
++ u8 res5[0x200 - 0x1c4];
++} __attribute__ ((packed)) uec_t;
++
++/* QE UCC Fast
++*/
++typedef struct ucc_fast {
++ 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 */
++ u8 res7[0x2];
++ u32 urtry; /* UCC retry counter register */
++ u8 res8[0x4C];
++ u8 guemr; /* UCC general extended mode register */
++ u8 res9[0x100 - 0x091];
++ uec_t ucc_eth;
++} __attribute__ ((packed)) ucc_fast_t;
++
++/* QE UCC
++*/
++typedef struct ucc_common {
++ u8 res1[0x90];
++ u8 guemr;
++ u8 res2[0x200 - 0x091];
++} __attribute__ ((packed)) ucc_common_t;
++
++typedef struct ucc {
++ union {
++ ucc_slow_t slow;
++ ucc_fast_t fast;
++ ucc_common_t common;
++ };
++} __attribute__ ((packed)) ucc_t;
++
++/* MultiPHY UTOPIA POS Controllers (UPC)
++*/
++typedef struct upc {
++ u32 upgcr; /* UTOPIA/POS general configuration register */
++ 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];
++} __attribute__ ((packed)) upc_t;
++
++/* SDMA
++*/
++typedef struct sdma {
++ 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];
++} __attribute__ ((packed)) sdma_t;
++
++/* Debug Space
++*/
++typedef struct dbg {
++ 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];
++} __attribute__ ((packed)) dbg_t;
++
++/* RISC Special Registers (Trap and Breakpoint)
++*/
++typedef struct rsp {
++ u8 fixme[0x100];
++} __attribute__ ((packed)) rsp_t;
++
++typedef struct qe_immap {
++ qe_iram_t iram; /* I-RAM */
++ qe_ic_t ic; /* Interrupt Controller */
++ cp_qe_t cp; /* Communications Processor */
++ qe_mux_t qmx; /* QE Multiplexer */
++ qe_timers_t qet; /* QE Timers */
++ spi_t spi[0x2]; /* spi */
++ mcc_t mcc; /* mcc */
++ qe_brg_t brg; /* brg */
++ usb_t usb; /* USB */
++ si1_t si1; /* SI */
++ u8 res11[0x800];
++ sir_t sir; /* SI Routing Tables */
++ ucc_t ucc1; /* ucc1 */
++ ucc_t ucc3; /* ucc3 */
++ ucc_t ucc5; /* ucc5 */
++ ucc_t ucc7; /* ucc7 */
++ u8 res12[0x600];
++ upc_t upc1; /* MultiPHY UTOPIA POS Controller 1 */
++ ucc_t ucc2; /* ucc2 */
++ ucc_t ucc4; /* ucc4 */
++ ucc_t ucc6; /* ucc6 */
++ ucc_t ucc8; /* ucc8 */
++ u8 res13[0x600];
++ upc_t upc2; /* MultiPHY UTOPIA POS Controller 2 */
++ sdma_t sdma; /* SDMA */
++ dbg_t dbg; /* Debug Space */
++ rsp_t rsp[0x2]; /* RISC Special Registers
++ * (Trap and Breakpoint) */
++ u8 res14[0x300];
++ u8 res15[0x3A00];
++ u8 res16[0x8000]; /* 0x108000 - 0x110000 */
++ u8 muram[0xC000]; /* 0x110000 - 0x11C000 Multi-user RAM */
++ u8 res17[0x24000]; /* 0x11C000 - 0x140000 */
++ u8 res18[0xC0000]; /* 0x140000 - 0x200000 */
++} __attribute__ ((packed)) qe_map_t;
++
++extern qe_map_t *qe_immr;
++
++#endif /* __IMMAP_QE_H__ */
+diff -Naupr u-boot-1.1.6/include/asm-ppc/processor.h u-boot-1.1.6-fsl-1/include/asm-ppc/processor.h
+--- u-boot-1.1.6/include/asm-ppc/processor.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/asm-ppc/processor.h 2006-12-06 10:33:49.000000000 -0600
+@@ -749,6 +749,7 @@
+ #define PVR_405EP_RB 0x51210950
+ #define PVR_440SP_RA 0x53221850
+ #define PVR_440SP_RB 0x53221891
++#define PVR_440SP_RC 0x53221892
+ #define PVR_440SPe_RA 0x53421890
+ #define PVR_440SPe_RB 0x53421891
+ #define PVR_601 0x00010000
+diff -Naupr u-boot-1.1.6/include/common.h u-boot-1.1.6-fsl-1/include/common.h
+--- u-boot-1.1.6/include/common.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/common.h 2006-11-30 12:34:13.000000000 -0600
+@@ -270,7 +270,7 @@ int misc_init_r (void);
+ void jumptable_init(void);
+
+ /* common/memsize.c */
+-int get_ram_size (volatile long *, long);
++long get_ram_size (volatile long *, long);
+
+ /* $(BOARD)/$(BOARD).c */
+ void reset_phy (void);
+@@ -402,6 +402,11 @@ void ppcSync(void);
+ void ppcDcbz(unsigned long value);
+ #endif
+
++#if defined (CONFIG_MPC83XX)
++void ppcDWload(unsigned int *addr, unsigned int *ret);
++void ppcDWstore(unsigned int *addr, unsigned int *value);
++#endif
++
+ /* $(CPU)/cpu.c */
+ int checkcpu (void);
+ int checkicache (void);
+diff -Naupr u-boot-1.1.6/include/configs/alpr.h u-boot-1.1.6-fsl-1/include/configs/alpr.h
+--- u-boot-1.1.6/include/configs/alpr.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/alpr.h 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,346 @@
++/*
++ * (C) Copyright 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
++ */
++
++#ifndef __CONFIG_H
++#define __CONFIG_H
++
++/*-----------------------------------------------------------------------
++ * High Level Configuration Options
++ *----------------------------------------------------------------------*/
++#define CONFIG_ALPR 1 /* Board is ebony */
++#define CONFIG_440GX 1 /* Specifc GX support */
++#define CONFIG_4xx 1 /* ... PPC4xx family */
++#define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_pre_init */
++#define CONFIG_LAST_STAGE_INIT 1 /* call last_stage_init() */
++#undef CFG_DRAM_TEST /* Disable-takes long time! */
++#define CONFIG_SYS_CLK_FREQ 33333333 /* external freq to pll */
++
++/*-----------------------------------------------------------------------
++ * Base addresses -- Note these are effective addresses where the
++ * actual resources get mapped (not physical addresses)
++ *----------------------------------------------------------------------*/
++#define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */
++#define CFG_FLASH_BASE 0xffe00000 /* start of FLASH */
++#define CFG_MONITOR_BASE 0xfffc0000 /* start of monitor */
++#define CFG_PCI_MEMBASE 0x80000000 /* mapped pci memory */
++#define CFG_PCI_MEMSIZE 0x40000000 /* size of mapped pci memory */
++#define CFG_PERIPHERAL_BASE 0xe0000000 /* internal peripherals */
++#define CFG_ISRAM_BASE 0xc0000000 /* internal SRAM */
++#define CFG_PCI_BASE 0xd0000000 /* internal PCI regs */
++#define CFG_PCI_MEMBASE1 CFG_PCI_MEMBASE + 0x10000000
++#define CFG_PCI_MEMBASE2 CFG_PCI_MEMBASE1 + 0x10000000
++#define CFG_PCI_MEMBASE3 CFG_PCI_MEMBASE2 + 0x10000000
++
++
++#define CFG_FPGA_BASE (CFG_PERIPHERAL_BASE + 0x08300000)
++#define CFG_NVRAM_BASE_ADDR (CFG_PERIPHERAL_BASE + 0x08000000)
++
++/*-----------------------------------------------------------------------
++ * 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
++
++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */
++#define CFG_MALLOC_LEN (128 * 1024) /* Reserve 128 kB for malloc*/
++
++/*-----------------------------------------------------------------------
++ * Serial Port
++ *----------------------------------------------------------------------*/
++#undef CFG_EXT_SERIAL_CLOCK
++#define CONFIG_BAUDRATE 115200
++#define CONFIG_UART1_CONSOLE /* define for uart1 as console */
++
++#define CFG_BAUDRATE_TABLE \
++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
++
++/*-----------------------------------------------------------------------
++ * FLASH related
++ *----------------------------------------------------------------------*/
++#define CFG_FLASH_CFI 1 /* The flash is CFI compatible */
++#define CFG_FLASH_CFI_DRIVER 1 /* Use common CFI driver */
++#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_USE_BUFFER_WRITE 1 /* use buffered writes (20x faster) */
++#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */
++#define CFG_FLASH_QUIET_TEST 1 /* don't warn upon unknown flash */
++
++#define CFG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */
++
++#define CFG_ENV_SECT_SIZE 0x10000 /* size of one complete sector */
++#define CFG_ENV_ADDR (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE)
++#define CFG_ENV_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)
++
++/*-----------------------------------------------------------------------
++ * DDR SDRAM
++ *----------------------------------------------------------------------*/
++#undef CONFIG_SPD_EEPROM /* Don't use SPD EEPROM for setup */
++#define CONFIG_SDRAM_BANK0 1 /* init onboard DDR SDRAM bank 0 */
++#undef CONFIG_SDRAM_ECC /* enable ECC support */
++#define CFG_SDRAM_TABLE { \
++ {(256 << 20), 13, 0x000C4001}, /* 256MB mode 3, 13x10(4)*/ \
++ {(64 << 20), 12, 0x00082001}} /* 64MB mode 2, 12x9(4) */
++
++/*-----------------------------------------------------------------------
++ * 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 CFG_I2C_NOPROBES {0x69} /* Don't probe these addrs */
++
++/*-----------------------------------------------------------------------
++ * I2C EEPROM (PCF8594C)
++ *----------------------------------------------------------------------*/
++#define CFG_I2C_EEPROM_ADDR 0x54 /* EEPROM PCF8594C */
++#define CFG_I2C_EEPROM_ADDR_LEN 1 /* Bytes of address */
++/* mask of address bits that overflow into the "EEPROM chip address" */
++#define CFG_I2C_EEPROM_ADDR_OVERFLOW 0x07
++#define CFG_EEPROM_PAGE_WRITE_BITS 3 /* The Philips PCF8594C has */
++ /* 8 byte page write mode using */
++ /* last 3 bits of the address */
++#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 40 /* and takes up to 40 msec */
++#define CFG_EEPROM_PAGE_WRITE_ENABLE
++
++#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=eth3\0" \
++ "hostname=alpr\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=ttyS1,${baudrate} " \
++ "mem=193M\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/projects/alpr/nfs_root\0" \
++ "bootfile=/alpr/uImage\0" \
++ "kernel_addr=fff00000\0" \
++ "ramdisk_addr=fff10000\0" \
++ "load=tftp 100000 /alpr/u-boot/u-boot.bin\0" \
++ "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;" \
++ "cp.b 100000 fffc0000 40000;" \
++ "setenv filesize;saveenv\0" \
++ "upd=run load;run update\0" \
++ ""
++#define CONFIG_BOOTCOMMAND "run flash_self"
++
++#define CONFIG_BOOTDELAY 2 /* autoboot after 5 seconds */
++
++#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
++#define CONFIG_PHY_ADDR 0x02 /* dummy setting, no EMAC0 used */
++#define CONFIG_PHY1_ADDR 0x03 /* dummy setting, no EMAC1 used */
++#define CONFIG_PHY2_ADDR 0x01 /* PHY address for EMAC2 */
++#define CONFIG_PHY3_ADDR 0x02 /* PHY address for EMAC3 */
++#define CONFIG_HAS_ETH0
++#define CONFIG_HAS_ETH1
++#define CONFIG_HAS_ETH2
++#define CONFIG_HAS_ETH3
++#define CONFIG_PHY_RESET 1 /* reset phy upon startup */
++#define CONFIG_M88E1111_PHY 1 /* needed for PHY specific setup*/
++#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_COMMANDS (CONFIG_CMD_DFL | \
++ CFG_CMD_ASKENV | \
++ CFG_CMD_DHCP | \
++ CFG_CMD_DIAG | \
++ CFG_CMD_EEPROM | \
++ CFG_CMD_ELF | \
++ CFG_CMD_I2C | \
++ CFG_CMD_IRQ | \
++ CFG_CMD_MII | \
++ CFG_CMD_NET | \
++ CFG_CMD_NFS | \
++ CFG_CMD_PCI | \
++ CFG_CMD_PING | \
++ CFG_CMD_FPGA | \
++ CFG_CMD_NAND | \
++ CFG_CMD_REGINFO)
++
++/* 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 */
++
++#define CFG_4xx_RESET_TYPE 0x2 /* use chip reset on this board */
++
++/*-----------------------------------------------------------------------
++ * PCI stuff
++ *-----------------------------------------------------------------------
++ */
++/* General PCI */
++#define CONFIG_PCI /* include pci support */
++#define CONFIG_PCI_PNP /* do 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 */
++#define CONFIG_PCI_BOOTDELAY 1 /* enable pci bootdelay variable*/
++
++/* Board-specific PCI */
++#define CFG_PCI_PRE_INIT /* enable board pci_pre_init() */
++#define CFG_PCI_TARGET_INIT /* let board init pci target */
++#define CFG_PCI_MASTER_INIT
++
++#define CFG_PCI_SUBSYS_VENDORID 0x10e8 /* AMCC */
++#define CFG_PCI_SUBSYS_DEVICEID 0xcafe /* Whatever */
++
++/*-----------------------------------------------------------------------
++ * FPGA stuff
++ *-----------------------------------------------------------------------*/
++#define CONFIG_FPGA CFG_ALTERA_CYCLON2
++#define CFG_FPGA_CHECK_CTRLC
++#define CFG_FPGA_PROG_FEEDBACK
++#define CONFIG_FPGA_COUNT 1 /* Ich habe 2 ... aber in
++ Reihe geschaltet -> sollte gehen,
++ aufpassen mit Datasize ist jetzt
++ halt doppelt so gross ... Seite 306
++ ist das mit den multiple Device in PS
++ Mode erklaert ...*/
++
++/* FPGA program pin configuration */
++#define CFG_GPIO_CLK 18 /* FPGA clk pin (cpu output) */
++#define CFG_GPIO_DATA 19 /* FPGA data pin (cpu output) */
++#define CFG_GPIO_STATUS 20 /* FPGA status pin (cpu input) */
++#define CFG_GPIO_CONFIG 21 /* FPGA CONFIG pin (cpu output) */
++#define CFG_GPIO_CON_DON 22 /* FPGA CONFIG_DONE pin (cpu input) */
++
++#define CFG_GPIO_SEL_DPR 14 /* cpu output */
++#define CFG_GPIO_SEL_AVR 15 /* cpu output */
++#define CFG_GPIO_PROG_EN 23 /* cpu output */
++
++/*-----------------------------------------------------------------------
++ * Definitions for GPIO setup
++ *-----------------------------------------------------------------------*/
++#define CFG_GPIO_EREADY (0x80000000 >> 26)
++#define CFG_GPIO_REV0 (0x80000000 >> 14)
++#define CFG_GPIO_REV1 (0x80000000 >> 15)
++
++/*-----------------------------------------------------------------------
++ * NAND-FLASH stuff
++ *-----------------------------------------------------------------------*/
++#define CFG_MAX_NAND_DEVICE 4
++#define NAND_MAX_CHIPS CFG_MAX_NAND_DEVICE
++#define CFG_NAND_BASE 0xF0000000 /* NAND FLASH Base Address */
++#define CFG_NAND_BASE_LIST { CFG_NAND_BASE + 0, CFG_NAND_BASE + 2, \
++ CFG_NAND_BASE + 4, CFG_NAND_BASE + 6 }
++#define CFG_NAND_QUIET_TEST 1 /* don't warn upon unknown NAND flash */
++
++/*-----------------------------------------------------------------------
++ * External Bus Controller (EBC) Setup
++ *----------------------------------------------------------------------*/
++#define CFG_FLASH CFG_FLASH_BASE
++
++/* Memory Bank 0 (Flash Bank 0, NOR-FLASH) initialization */
++#define CFG_EBC_PB0AP 0x92015480
++#define CFG_EBC_PB0CR (CFG_FLASH | 0x3A000) /* BS=2MB,BU=R/W,BW=16bit */
++
++/* Memory Bank 1 (NAND-FLASH) initialization */
++#define CFG_EBC_PB1AP 0x01840380 /* TWT=3 */
++#define CFG_EBC_PB1CR (CFG_NAND_BASE | 0x18000) /* BS=1MB,BU=R/W,BW=8bit */
++
++/*
++ * 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 /* For AMCC 440 CPUs */
++#define CFG_CACHELINE_SIZE 32 /* ... */
++#define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */
++
++/*
++ * 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 -Naupr u-boot-1.1.6/include/configs/IceCube.h u-boot-1.1.6-fsl-1/include/configs/IceCube.h
+--- u-boot-1.1.6/include/configs/IceCube.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/IceCube.h 2006-12-06 10:33:49.000000000 -0600
+@@ -172,6 +172,19 @@
+ #undef CFG_IPBSPEED_133 /* define for 133MHz speed */
+ #endif
+ #endif /* CONFIG_MPC5200 */
++
++/* 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"
++
+ /*
+ * I2C configuration
+ */
+diff -Naupr u-boot-1.1.6/include/configs/MPC8349EMDS.h u-boot-1.1.6-fsl-1/include/configs/MPC8349EMDS.h
+--- u-boot-1.1.6/include/configs/MPC8349EMDS.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/MPC8349EMDS.h 2006-11-10 11:24:30.000000000 -0600
+@@ -36,6 +36,7 @@
+ */
+ #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_MPC8349EMDS 1 /* MPC8349EMDS board specific */
+
+@@ -59,9 +60,20 @@
+ #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_IMMRBAR 0xE0000000
++#define CFG_IMMR 0xE0000000
+
+ #undef CFG_DRAM_TEST /* memory test, takes time */
+ #define CFG_MEMTEST_START 0x00000000 /* memtest region */
+@@ -299,8 +311,8 @@
+ #define CFG_BAUDRATE_TABLE \
+ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200}
+
+-#define CFG_NS16550_COM1 (CFG_IMMRBAR+0x4500)
+-#define CFG_NS16550_COM2 (CFG_IMMRBAR+0x4600)
++#define CFG_NS16550_COM1 (CFG_IMMR+0x4500)
++#define CFG_NS16550_COM2 (CFG_IMMR+0x4600)
+
+ /* Use the HUSH parser */
+ #define CFG_HUSH_PARSER
+@@ -308,20 +320,35 @@
+ #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_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_NOPROBES {{0,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_IMMRBAR+CFG_TSEC1_OFFSET)
++#define CFG_TSEC1 (CFG_IMMR+CFG_TSEC1_OFFSET)
+ #define CFG_TSEC2_OFFSET 0x25000
+-#define CFG_TSEC2 (CFG_IMMRBAR+CFG_TSEC2_OFFSET)
++#define CFG_TSEC2 (CFG_IMMR+CFG_TSEC2_OFFSET)
+
+ /* USB */
+ #define CFG_USE_MPC834XSYS_USB_PHY 1 /* Use SYS board PHY */
+@@ -615,8 +642,8 @@
+ #endif
+
+ /* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 & BCSR @ 0xE2400000 */
+-#define CFG_IBAT5L (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+-#define CFG_IBAT5U (CFG_IMMRBAR | BATU_BL_256M | BATU_VS | BATU_VP)
++#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)
+@@ -666,11 +693,11 @@
+ #define CONFIG_ETH1ADDR 00:E0:0C:00:7E:21
+ #endif
+
+-#define CONFIG_IPADDR 192.168.205.5
++#define CONFIG_IPADDR 192.168.1.253
+
+ #define CONFIG_HOSTNAME mpc8349emds
+-#define CONFIG_ROOTPATH /opt/eldk/ppc_6xx
+-#define CONFIG_BOOTFILE /tftpboot/tqm83xx/uImage
++#define CONFIG_ROOTPATH /nfsroot/rootfs
++#define CONFIG_BOOTFILE uImage
+
+ #define CONFIG_SERVERIP 192.168.1.1
+ #define CONFIG_GATEWAYIP 192.168.1.1
+@@ -703,14 +730,31 @@
+ "bootm ${kernel_addr} ${ramdisk_addr}\0" \
+ "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \
+ "bootm\0" \
+- "rootpath=/opt/eldk/ppc_6xx\0" \
+- "bootfile=/tftpboot/mpc8349emds/uImage\0" \
+ "load=tftp 100000 /tftpboot/mpc8349emds/u-boot.bin\0" \
+ "update=protect off fe000000 fe03ffff; " \
+ "era fe000000 fe03ffff; cp.b 100000 fe000000 ${filesize}\0" \
+ "upd=run load;run update\0" \
++ "fdtaddr=400000\0" \
++ "fdtfile=mpc8349emds.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 */
+diff -Naupr u-boot-1.1.6/include/configs/MPC8349ITX.h u-boot-1.1.6-fsl-1/include/configs/MPC8349ITX.h
+--- u-boot-1.1.6/include/configs/MPC8349ITX.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/MPC8349ITX.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,804 @@
++/*
++ * Copyright (C) Freescale Semiconductor, Inc. 2006. 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., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/*
++ MPC8349E-mITX board configuration file
++
++ Memory map:
++
++ 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
++ 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)
++
++ I2C address list:
++ Align. Board
++ Bus Addr Part No. Description Length Location
++ ----------------------------------------------------------------
++ I2C0 0x50 M24256-BWMN6P Board EEPROM 2 U64
++
++ I2C1 0x20 PCF8574 I2C Expander 0 U8
++ I2C1 0x21 PCF8574 I2C Expander 0 U10
++ I2C1 0x38 PCF8574A I2C Expander 0 U8
++ I2C1 0x39 PCF8574A I2C Expander 0 U10
++ I2C1 0x51 (DDR) DDR EEPROM 1 U1
++ I2C1 0x68 DS1339 RTC 1 U68
++
++ Note that a given board has *either* a pair of 8574s or a pair of 8574As.
++*/
++
++#ifndef __CONFIG_H
++#define __CONFIG_H
++
++#undef DEBUG
++
++/*
++ * High Level Configuration Options
++ */
++#define CONFIG_MPC834X /* MPC834x family (8343, 8347, 8349) */
++#define CONFIG_MPC8349 /* MPC8349 specific */
++
++#define CONFIG_PCI
++
++#define CONFIG_COMPACT_FLASH /* The CF card interface on the back of the board */
++#define CONFIG_RTC_DS1337
++
++/* I2C */
++#define CONFIG_HARD_I2C
++
++#ifdef CONFIG_HARD_I2C
++
++#define CONFIG_MISC_INIT_F
++#define CONFIG_MISC_INIT_R
++
++#define CONFIG_FSL_I2C
++#define CONFIG_I2C_MULTI_BUS
++#define CONFIG_I2C_CMD_TREE
++#define CFG_I2C_OFFSET 0x3000
++#define CFG_I2C2_OFFSET 0x3100
++#define CFG_SPD_BUS_NUM 1 /* The I2C bus for SPD */
++
++#define CFG_I2C_8574_ADDR1 0x20 /* I2C1, PCF8574 */
++#define CFG_I2C_8574_ADDR2 0x21 /* I2C1, PCF8574 */
++#define CFG_I2C_8574A_ADDR1 0x38 /* I2C1, PCF8574A */
++#define CFG_I2C_8574A_ADDR2 0x39 /* I2C1, PCF8574A */
++#define CFG_I2C_EEPROM_ADDR 0x50 /* I2C0, Board EEPROM */
++#define CFG_I2C_RTC_ADDR 0x68 /* I2C1, DS1339 RTC*/
++#define SPD_EEPROM_ADDRESS 0x51 /* I2C1, DDR */
++
++#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */
++#define CFG_I2C_SLAVE 0x7F
++
++/* Don't probe these addresses: */
++#define CFG_I2C_NOPROBES {{1, CFG_I2C_8574_ADDR1}, \
++ {1, CFG_I2C_8574_ADDR2}, \
++ {1, CFG_I2C_8574A_ADDR1}, \
++ {1, CFG_I2C_8574A_ADDR2}}
++/* Bit definitions for the 8574[A] I2C expander */
++#define I2C_8574_REVISION 0x03 /* Board revision, 00=0.0, 01=0.1, 10=1.0 */
++#define I2C_8574_CF 0x08 /* 1=Compact flash absent, 0=present */
++#define I2C_8574_MPCICLKRN 0x10 /* MiniPCI Clk Run */
++#define I2C_8574_PCI66 0x20 /* 0=33MHz PCI, 1=66MHz PCI */
++#define I2C_8574_FLASHSIDE 0x40 /* 0=Reset vector from U4, 1=from U7*/
++
++#undef CONFIG_SOFT_I2C
++
++#endif
++
++#define CONFIG_TSEC_ENET /* tsec ethernet support */
++#define CONFIG_ENV_OVERWRITE
++
++#define PCI_66M
++#ifdef PCI_66M
++#define CONFIG_83XX_CLKIN 66666666 /* in Hz */
++#else
++#define CONFIG_83XX_CLKIN 33333333 /* in Hz */
++#endif
++
++#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_IMMR 0xE0000000 /* The IMMR is relocated to here */
++
++#undef CFG_DRAM_TEST /* memory test, takes time */
++#define CFG_MEMTEST_START 0x00003000 /* memtest region */
++#define CFG_MEMTEST_END 0x07100000 /* only has 128M */
++
++/*
++ * 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*/
++
++/*
++ * 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
++#undef CONFIG_DDR_2T_TIMING
++#define CFG_83XX_DDR_USES_CS0
++
++#ifndef CONFIG_SPD_EEPROM
++/*
++ * 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_1 0x26242321
++ #define CFG_DDR_TIMING_2 0x00000800 /* P9-45, may need tuning */
++#endif
++
++/* 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_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 */
++
++/* VSC7385 on the Local Bus */
++#define CFG_VSC7385_BASE 0xF8000000 /* start of VSC7385 */
++
++#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)
++
++#define CFG_LBLAWBAR1_PRELIM CFG_VSC7385_BASE /* Access window base at VSC7385 base */
++#define CFG_LBLAWAR1_PRELIM 0x80000010 /* Access window size 128K */
++
++#define CFG_MAX_FLASH_BANKS 2 /* number of banks */
++#define CFG_MAX_FLASH_SECT 135 /* sectors per device */
++
++#define CFG_FLASH_BANKS_LIST {CFG_FLASH_BASE, CFG_FLASH_BASE + 0x800000}
++
++#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_LED_BASE 0xF9000000 /* start of LED and Board ID */
++#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)
++
++#ifdef CONFIG_COMPACT_FLASH
++
++#define CFG_CF_BASE 0xF0000000
++
++#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 */
++
++#endif
++
++#define CONFIG_DOS_PARTITION
++
++#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
++#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 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 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)
++
++/* 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"
++
++#ifdef CONFIG_PCI
++
++#define CONFIG_MPC83XX_PCI2
++
++/*
++ * 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 (CFG_PCI1_MEM_BASE + CFG_PCI1_MEM_SIZE)
++#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 0x01000000 /* 16M */
++
++#ifdef CONFIG_MPC83XX_PCI2
++#define CFG_PCI2_MEM_BASE (CFG_PCI1_MMIO_BASE + CFG_PCI1_MMIO_SIZE)
++#define CFG_PCI2_MEM_PHYS CFG_PCI2_MEM_BASE
++#define CFG_PCI2_MEM_SIZE 0x10000000 /* 256M */
++#define CFG_PCI2_MMIO_BASE (CFG_PCI2_MEM_BASE + CFG_PCI2_MEM_SIZE)
++#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 (CFG_PCI1_IO_PHYS + CFG_PCI1_IO_SIZE)
++#define CFG_PCI2_IO_SIZE 0x01000000 /* 16M */
++#endif
++
++#define _IO_BASE 0x00000000 /* points to PCI I/O space */
++
++#define CONFIG_NET_MULTI
++#define CONFIG_PCI_PNP /* do pci plug-and-play */
++
++#ifdef CONFIG_RTL8139
++/* This macro is used by RTL8139 but not defined in PPC architecture */
++#define KSEG1ADDR(x) (x)
++#endif
++
++#ifndef CONFIG_PCI_PNP
++ #define PCI_ENET0_IOADDR 0x00000000
++ #define PCI_ENET0_MEMADDR CFG_PCI2_MEM_BASE
++ #define PCI_IDSEL_NUMBER 0x0f /* IDSEL = AD15 */
++#endif
++
++#define CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */
++
++#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 */
++
++#define CONFIG_MPC83XX_TSEC1
++
++#ifdef CONFIG_MPC83XX_TSEC1
++#define CONFIG_MPC83XX_TSEC1_NAME "TSEC0"
++#define CFG_TSEC1_OFFSET 0x24000
++#define TSEC1_PHY_ADDR 0x1c /* VSC8201 uses address 0x1c */
++#define TSEC1_PHYIDX 0
++#endif
++
++#ifdef CONFIG_MPC83XX_TSEC2
++#define CONFIG_MPC83XX_TSEC2_NAME "TSEC1"
++#define CFG_TSEC2_OFFSET 0x25000
++#define CONFIG_UNKNOWN_TSEC /* TSEC2 is proprietary */
++#define TSEC2_PHY_ADDR 4
++#define TSEC2_PHYIDX 0
++#endif
++
++#define CONFIG_ETHPRIME "Freescale TSEC"
++
++#endif
++
++
++/*
++ * Environment
++ */
++#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_SIZE 0x2000
++#else
++ #define CFG_NO_FLASH /* Flash is not usable now */
++ #define CFG_ENV_IS_NOWHERE /* Store ENV in memory only */
++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000)
++ #define CFG_ENV_SIZE 0x2000
++#endif
++
++#define CONFIG_LOADS_ECHO /* echo on for serial download */
++#define CFG_LOADS_BAUD_CHANGE /* allow baudrate change */
++
++/* CONFIG_COMMANDS */
++
++#ifdef CONFIG_COMPACT_FLASH
++#define CONFIG_COMMANDS_CF (CFG_CMD_IDE | CFG_CMD_FAT)
++#else
++#define CONFIG_COMMANDS_CF 0
++#endif
++
++#ifdef CONFIG_PCI
++#define CONFIG_COMMANDS_PCI CFG_CMD_PCI
++#else
++#define CONFIG_COMMANDS_PCI 0
++#endif
++
++#ifdef CONFIG_HARD_I2C
++#define CONFIG_COMMANDS_I2C CFG_CMD_I2C
++#else
++#define CONFIG_COMMANDS_I2C 0
++#endif
++
++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
++ CONFIG_COMMANDS_CF | \
++ CFG_CMD_NET | \
++ CFG_CMD_PING | \
++ CONFIG_COMMANDS_I2C | \
++ CONFIG_COMMANDS_PCI | \
++ CFG_CMD_SDRAM | \
++ CFG_CMD_DATE | \
++ CFG_CMD_CACHE | \
++ CFG_CMD_IRQ)
++#include <cmd_confdefs.h>
++
++/* 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 CFG_LOAD_ADDR 0x2000000 /* default load address */
++#define CFG_PROMPT "MPC8349E-mITX> " /* 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 /* 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_CSB_TO_CLKIN_4X1 |\
++ HRCWL_VCO_1X2 |\
++ HRCWL_CORE_TO_CSB_2X1)
++
++#ifdef 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_DISABLE |\
++ HRCWH_CORE_ENABLE |\
++ HRCWH_FROM_0XFFF00100 |\
++ HRCWH_BOOTSEQ_DISABLE |\
++ HRCWH_SW_WATCHDOG_DISABLE |\
++ HRCWH_ROM_LOC_LOCAL_16BIT |\
++ HRCWH_TSEC1M_IN_GMII |\
++ HRCWH_TSEC2M_IN_GMII )
++#endif
++
++/* 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 */
++#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_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 & 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 | 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
++
++#ifdef CONFIG_MPC83XX_TSEC1
++#define CONFIG_ETHADDR 00:E0:0C:00:8C:01
++#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
++
++#define CONFIG_HOSTNAME mpc8349emitx
++#define CONFIG_ROOTPATH /nfsroot/rootfs
++#define CONFIG_BOOTFILE uImage
++
++#define CONFIG_UBOOTPATH u-boot.bin
++#endif
++
++#define CONFIG_UBOOTSTART fe700000
++#define CONFIG_UBOOTEND fe77ffff
++
++#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */
++
++#define CONFIG_BAUDRATE 115200
++
++#undef CONFIG_BOOTCOMMAND
++#ifdef CONFIG_BOOTCOMMAND
++#define CONFIG_BOOTDELAY 6
++#else
++#define CONFIG_BOOTDELAY -1 /* -1 disables auto-boot */
++#endif
++
++#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) ":" \
++ 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" \
++ "fdtaddr=400000\0" \
++ "fdtfile=mpc8349emitx.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"
++
++
++#undef MK_STR
++#undef XMK_STR
++
++#endif
+diff -Naupr u-boot-1.1.6/include/configs/MPC8360EMDS.h u-boot-1.1.6-fsl-1/include/configs/MPC8360EMDS.h
+--- u-boot-1.1.6/include/configs/MPC8360EMDS.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/MPC8360EMDS.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,635 @@
++/*
++ * Copyright (C) 2006 Freescale Semiconductor, Inc.
++ *
++ * Dave Liu <daveliu@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
++ */
++
++#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_MPC8360 1 /* MPC8360 CPU specific */
++#define CONFIG_MPC8360EMDS 1 /* MPC8360EMDS 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_1X1 |\
++ HRCWL_CSB_TO_CLKIN_4X1 |\
++ HRCWL_VCO_1X2 |\
++ HRCWL_CE_PLL_VCO_DIV_4 |\
++ HRCWL_CE_PLL_DIV_1X1 |\
++ HRCWL_CE_TO_PLL_1X6 |\
++ HRCWL_CORE_TO_CSB_2X1)
++
++#ifdef CONFIG_PCISLAVE
++#define CFG_HRCW_HIGH (\
++ HRCWH_PCI_AGENT |\
++ HRCWH_PCI1_ARBITER_DISABLE |\
++ HRCWH_PCICKDRV_DISABLE |\
++ HRCWH_CORE_ENABLE |\
++ HRCWH_FROM_0XFFF00100 |\
++ HRCWH_BOOTSEQ_DISABLE |\
++ HRCWH_SW_WATCHDOG_DISABLE |\
++ HRCWH_ROM_LOC_LOCAL_16BIT)
++#else
++#define CFG_HRCW_HIGH (\
++ HRCWH_PCI_HOST |\
++ HRCWH_PCI1_ARBITER_ENABLE |\
++ HRCWH_PCICKDRV_ENABLE |\
++ HRCWH_CORE_ENABLE |\
++ HRCWH_FROM_0X00000100 |\
++ HRCWH_BOOTSEQ_DISABLE |\
++ HRCWH_SW_WATCHDOG_DISABLE |\
++ HRCWH_ROM_LOC_LOCAL_16BIT)
++#endif
++
++/*
++ * System IO Config
++ */
++#define CFG_SICRH 0x00000000
++#define CFG_SICRL 0x40000000
++
++#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_83XX_DDR_USES_CS0
++
++#undef CONFIG_DDR_ECC /* only for ECC DDR module */
++#define CONFIG_DDR_ECC_CMD /* Use DDR ECC user commands */
++
++#define CONFIG_SPD_EEPROM /* Use SPD EEPROM for DDR setup */
++#if defined(CONFIG_SPD_EEPROM)
++/*
++ * Determine DDR configuration from I2C interface.
++ */
++#define SPD_EEPROM_ADDRESS 0x52 /* DDR SODIMM */
++#else
++/*
++ * Manually set up DDR parameters
++ */
++#define CFG_DDR_SIZE 256 /* MB */
++#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_CONTROL 0x42008000 /* Self refresh,2T timing */
++#define CFG_DDR_MODE 0x20000162 /* DLL,normal,seq,4/2.5 */
++#define CFG_DDR_INTERVAL 0x045b0100 /* page mode */
++#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_4)
++#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
++ */
++#define CFG_LBC_SDRAM_BASE 0xF0000000 /* SDRAM base address */
++#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */
++
++#define CFG_LB_SDRAM /* if board has SRDAM on local bus */
++
++#ifdef CFG_LB_SDRAM
++#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 */
++
++/*
++ * CS4 on Local Bus, to PIB
++ */
++#define CFG_BR4_PRELIM 0xf8008801 /* CS4 base address at 0xf8008000 */
++#define CFG_OR4_PRELIM 0xffffe9f7 /* size 32KB, port size 8bit, GPCM */
++
++/*
++ * CS5 on Local Bus, to PIB
++ */
++#define CFG_BR5_PRELIM 0xf8010801 /* CS5 base address at 0xf8010000 */
++#define CFG_OR5_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)
++
++/* 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,8360@0"
++#define OF_SOC "soc8360@e0000000"
++#define OF_TBCLK (bd->bi_busfreq / 4)
++#define OF_STDOUT_PATH "/soc8360@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 {0x52} /* Don't probe these addrs */
++#define CFG_I2C_OFFSET 0x3000
++#define CFG_I2C2_OFFSET 0x3100
++
++/*
++ * 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_PHY_MODE_NEED_CHANGE
++
++#define CONFIG_UEC_ETH1 /* GETH1 */
++
++#ifdef CONFIG_UEC_ETH1
++#define CFG_UEC1_UCC_NUM 0 /* UCC1 */
++#define CFG_UEC1_RX_CLK QE_CLK_NONE
++#define CFG_UEC1_TX_CLK QE_CLK9
++#define CFG_UEC1_ETH_TYPE GIGA_ETH
++#define CFG_UEC1_PHY_ADDR 0
++#define CFG_UEC1_INTERFACE_MODE ENET_1000_GMII
++#endif
++
++#define CONFIG_UEC_ETH2 /* GETH2 */
++
++#ifdef CONFIG_UEC_ETH2
++#define CFG_UEC2_UCC_NUM 1 /* UCC2 */
++#define CFG_UEC2_RX_CLK QE_CLK_NONE
++#define CFG_UEC2_TX_CLK QE_CLK4
++#define CFG_UEC2_ETH_TYPE GIGA_ETH
++#define CFG_UEC2_PHY_ADDR 1
++#define CFG_UEC2_INTERFACE_MODE ENET_1000_GMII
++#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 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
++
++/*
++ * 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
++
++/* Local bus SDRAM: cacheable */
++#define CFG_IBAT4L (CFG_LBC_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
++#define CFG_IBAT4U (CFG_LBC_SDRAM_BASE | BATU_BL_64M | BATU_VS | BATU_VP)
++#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:01:01
++#define CONFIG_HAS_ETH1
++#define CONFIG_ETH1ADDR 00:04:9f:ef:01: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=mpc8349emds.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 */
+diff -Naupr u-boot-1.1.6/include/configs/p3mx.h u-boot-1.1.6-fsl-1/include/configs/p3mx.h
+--- u-boot-1.1.6/include/configs/p3mx.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/p3mx.h 2006-12-06 10:33:49.000000000 -0600
+@@ -0,0 +1,450 @@
++/*
++ * (C) Copyright 2006
++ * Stefan Roese, DENX Software Engineering, sr@denx.de.
++ *
++ * Based on original work by
++ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V.
++ *
++ * See file CREDITS for list of people who contributed to this
++ * project.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/************************************************************************
++ * p3mx.h - configuration for Prodrive P3M750 & P3M7448 boards
++ *
++ * The defines:
++ * CONFIG_P3M750 or
++ * CONFIG_P3M7448
++ * are written into include/config.h by the "make xxx_config" command
++ ***********************************************************************/
++#ifndef __CONFIG_H
++#define __CONFIG_H
++
++/*-----------------------------------------------------------------------
++ * High Level Configuration Options
++ *----------------------------------------------------------------------*/
++#define CONFIG_P3Mx /* used for both board versions */
++
++#if defined (CONFIG_P3M750)
++#define CONFIG_750FX /* 750GL/GX/FX */
++#define CFG_BOARD_NAME "P3M750"
++#define CFG_BUS_HZ 100000000
++#define CFG_BUS_CLK CFG_BUS_HZ
++#define CFG_TCLK 100000000
++#elif defined (CONFIG_P3M7448)
++#define CONFIG_74xx
++#define CFG_BOARD_NAME "P3M7448"
++#define CFG_BUS_HZ 133333333
++#define CFG_BUS_CLK CFG_BUS_HZ
++#define CFG_TCLK 133333333
++#endif
++#define CFG_GT_DUAL_CPU /* also for JTAG even with one cpu */
++
++/* which initialization functions to call for this board */
++#define CFG_BOARD_ASM_INIT 1
++#define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_early_init_f */
++#define CONFIG_BOARD_EARLY_INIT_R 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
++ * actual resources get mapped (not physical addresses)
++ *----------------------------------------------------------------------*/
++#define CFG_SDRAM_BASE 0x00000000
++#ifdef CONFIG_P3M750
++#define CFG_SDRAM1_BASE 0x10000000 /* each 256 MByte */
++#endif
++
++#define CFG_MONITOR_LEN (256 << 10) /* Reserve 256 kB for Monitor */
++#if defined (CONFIG_P3M750)
++#define CFG_FLASH_BASE 0xff800000 /* start of flash banks */
++#define CFG_BOOT_SIZE _8M /* boot flash */
++#elif defined (CONFIG_P3M7448)
++#define CFG_FLASH_BASE 0xff000000 /* start of flash banks */
++#define CFG_BOOT_SIZE _16M /* boot flash */
++#endif
++#define CFG_BOOT_SPACE CFG_FLASH_BASE /* BOOT_CS0 flash 0 */
++#define CFG_MONITOR_BASE 0xfff00000
++#define CFG_RESET_ADDRESS 0xfff00100
++#define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc */
++#define CFG_MISC_REGION_BASE 0xf0000000
++
++#define CFG_DFL_GT_REGS 0xf1000000 /* boot time GT_REGS */
++#define CFG_GT_REGS 0xf1000000 /* GT Registers are mapped here */
++#define CFG_INT_SRAM_BASE 0x42000000 /* GT offers 256k internal SRAM */
++
++/*-----------------------------------------------------------------------
++ * Initial RAM & stack pointer (placed in internal SRAM)
++ *----------------------------------------------------------------------*/
++ /*
++ * 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 0x42000000
++#define CFG_INIT_RAM_END 0x1000
++#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)
++
++
++/*-----------------------------------------------------------------------
++ * Serial Port
++ *----------------------------------------------------------------------*/
++#define CONFIG_MPSC /* MV64460 Serial */
++#define CONFIG_MPSC_PORT 0
++#define CONFIG_BAUDRATE 115200 /* console baudrate */
++#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, 230400 }
++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
++
++/*-----------------------------------------------------------------------
++ * Ethernet
++ *----------------------------------------------------------------------*/
++/* Change the default ethernet port, use this define (options: 0, 1, 2) */
++#define CFG_ETH_PORT ETH_0
++#define CONFIG_NET_MULTI
++#define MV_ETH_DEVS 2
++#define CONFIG_PHY_RESET 1 /* reset phy upon startup */
++#define CONFIG_PHY_GIGE 1 /* Include GbE speed/duplex detection */
++
++/*-----------------------------------------------------------------------
++ * FLASH related
++ *----------------------------------------------------------------------*/
++#define CFG_FLASH_CFI /* The flash is CFI compatible */
++#define CFG_FLASH_CFI_DRIVER /* Use common CFI driver */
++#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_PROTECTION 1 /* use hardware flash protection */
++#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */
++
++#define CFG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */
++#if defined (CONFIG_P3M750)
++#define CFG_ENV_SECT_SIZE 0x20000 /* one sector (1 device)*/
++#elif defined (CONFIG_P3M7448)
++#define CFG_ENV_SECT_SIZE 0x40000 /* two sectors (2 devices parallel */
++#endif
++#define CFG_ENV_SIZE 0x2000 /* Total Size of Environment Sector */
++#define CFG_ENV_ADDR (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
++
++/*-----------------------------------------------------------------------
++ * DDR SDRAM
++ *----------------------------------------------------------------------*/
++#define CONFIG_MV64460_ECC
++
++/*-----------------------------------------------------------------------
++ * I2C
++ *----------------------------------------------------------------------*/
++#define CFG_I2C_SPEED 100000 /* I2C speed default */
++
++/* I2C RTC */
++#define CONFIG_RTC_M41T11 1
++#define CFG_I2C_RTC_ADDR 0x68
++#define CFG_M41T11_BASE_YEAR 1900 /* play along with linux */
++
++/*-----------------------------------------------------------------------
++ * PCI stuff
++ *----------------------------------------------------------------------*/
++#define PCI_HOST_ADAPTER 0 /* configure ar pci adapter */
++#define PCI_HOST_FORCE 1 /* configure as pci host */
++#define PCI_HOST_AUTO 2 /* detected via arbiter enable */
++
++#define CONFIG_PCI /* include pci support */
++#define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function */
++#define CONFIG_PCI_PNP /* do pci plug-and-play */
++#define CONFIG_PCI_SCAN_SHOW /* show devices on bus */
++
++/* PCI MEMORY MAP section */
++#define CFG_PCI0_MEM_BASE 0x80000000
++#define CFG_PCI0_MEM_SIZE _128M
++#define CFG_PCI1_MEM_BASE 0x88000000
++#define CFG_PCI1_MEM_SIZE _128M
++
++#define CFG_PCI0_0_MEM_SPACE (CFG_PCI0_MEM_BASE)
++#define CFG_PCI1_0_MEM_SPACE (CFG_PCI1_MEM_BASE)
++
++/* PCI I/O MAP section */
++#define CFG_PCI0_IO_BASE 0xfa000000
++#define CFG_PCI0_IO_SIZE _16M
++#define CFG_PCI1_IO_BASE 0xfb000000
++#define CFG_PCI1_IO_SIZE _16M
++
++#define CFG_PCI0_IO_SPACE (CFG_PCI0_IO_BASE)
++#define CFG_PCI0_IO_SPACE_PCI 0x00000000
++#define CFG_PCI1_IO_SPACE (CFG_PCI1_IO_BASE)
++#define CFG_PCI1_IO_SPACE_PCI 0x00000000
++
++#define CFG_ISA_IO_BASE_ADDRESS (CFG_PCI0_IO_BASE)
++
++#define CFG_PCI_IDSEL 0x30
++
++#undef CONFIG_BOOTARGS
++#define CONFIG_EXTRA_ENV_SETTINGS_COMMON \
++ "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" \
++ "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_6xx\0" \
++ "u-boot=p3mx/u-boot/u-boot.bin\0" \
++ "load=tftp 100000 ${u-boot}\0" \
++ "update=protect off fff00000 fff3ffff;era fff00000 fff3ffff;" \
++ "cp.b 100000 fff00000 40000;" \
++ "setenv filesize;saveenv\0" \
++ "upd=run load;run update\0" \
++ "serverip=11.0.0.152\0"
++
++#if defined (CONFIG_P3M750)
++#define CONFIG_EXTRA_ENV_SETTINGS \
++ CONFIG_EXTRA_ENV_SETTINGS_COMMON \
++ "hostname=p3m750\0" \
++ "bootfile=/tftpboot/p3mx/vxWorks.st\0" \
++ "kernel_addr=fc000000\0" \
++ "ramdisk_addr=fc180000\0" \
++ "vxfile=p3m750/vxWorks\0" \
++ "vxuser=ddg\0" \
++ "vxpass=ddg\0" \
++ "vxtarget=target\0" \
++ "vxflags=0x8\0" \
++ "vxargs=setenv bootargs mgi(0,0)host:${vxfile} h=${serverip} " \
++ "e=${ipaddr} u=${vxuser} pw=${vxpass} tn=${vxtarget} " \
++ "f=${vxflags}\0"
++#elif defined (CONFIG_P3M7448)
++#define CONFIG_EXTRA_ENV_SETTINGS \
++ CONFIG_EXTRA_ENV_SETTINGS_COMMON \
++ "hostname=p3m7448\0"
++#endif
++
++#if defined (CONFIG_P3M750)
++#define CONFIG_BOOTCOMMAND "tftp;run vxargs;bootvx"
++#elif defined (CONFIG_P3M7448)
++#define CONFIG_BOOTCOMMAND " "
++#endif
++
++#define CONFIG_BOOTDELAY 3 /* autoboot after 5 seconds */
++#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT | \
++ CONFIG_BOOTP_BOOTFILESIZE)
++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
++ CFG_CMD_ASKENV | \
++ CFG_CMD_DATE | \
++ CFG_CMD_DIAG | \
++ CFG_CMD_ELF | \
++ CFG_CMD_I2C | \
++ CFG_CMD_IRQ | \
++ CFG_CMD_MII | \
++ CFG_CMD_NET | \
++ CFG_CMD_NFS | \
++ CFG_CMD_PING | \
++ CFG_CMD_REGINFO | \
++ CFG_CMD_PCI | \
++ CFG_CMD_CACHE | \
++ CFG_CMD_SDRAM)
++
++/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
++#include <cmd_confdefs.h>
++
++/*-----------------------------------------------------------------------
++ * Miscellaneous configurable options
++ *----------------------------------------------------------------------*/
++#define CFG_HUSH_PARSER
++#define CFG_PROMPT_HUSH_PS2 "> "
++
++#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 0x08000000 /* default load address */
++
++#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 */
++
++/*-----------------------------------------------------------------------
++ * Marvell MV64460 config settings
++ *----------------------------------------------------------------------*/
++/* Reset values for Port behavior (8bit/ 32bit, etc.) only corrected device width */
++#if defined (CONFIG_P3M750)
++#define CFG_BOOT_PAR 0x8FDFF87F /* 16 bit flash, disable burst*/
++#elif defined (CONFIG_P3M7448)
++#define CFG_BOOT_PAR 0x8FEFFFFF /* 32 bit flash, burst enabled */
++#endif
++
++/*
++ * MPP[0] Serial Port 0 TxD TxD OUT Connected to P14 (buffered)
++ * MPP[1] Serial Port 0 RxD RxD IN Connected to P14 (buffered)
++ * MPP[2] NC
++ * MPP[3] Serial Port 1 TxD TxD OUT Connected to P14 (buffered)
++ * MPP[4] PCI Monarch# GPIO IN Connected to P12
++ * MPP[5] Serial Port 1 RxD RxD IN Connected to P14 (buffered)
++ * MPP[6] PMC Carrier Interrupt 0 Int IN Connected to P14
++ * MPP[7] PMC Carrier Interrupt 1 Int IN Connected to P14
++ * MPP[8] Reserved Do not use
++ * MPP[9] Reserved Do not use
++ * MPP[10] Reserved Do not use
++ * MPP[11] Reserved Do not use
++ * MPP[12] Phy 0 Interrupt Int IN
++ * MPP[13] Phy 1 Interrupt Int IN
++ * MPP[14] NC
++ * MPP[15] NC
++ * MPP[16] PCI Interrupt C Int IN Connected to P11
++ * MPP[17] PCI Interrupt D Int IN Connected to P11
++ * MPP[18] Watchdog NMI# GPIO IN Connected to MPP[24]
++ * MPP[19] Watchdog Expired# WDE OUT Connected to rst logic
++ * MPP[20] Watchdog Status WD_STS IN Read back of rst by watchdog
++ * MPP[21] NC
++ * MPP[22] GP LED Green GPIO OUT
++ * MPP[23] GP LED Red GPIO OUT
++ * MPP[24] Watchdog NMI# Int OUT
++ * MPP[25] NC
++ * MPP[26] NC
++ * MPP[27] PCI Interrupt A Int IN Connected to P11
++ * MPP[28] NC
++ * MPP[29] PCI Interrupt B Int IN Connected to P11
++ * MPP[30] Module reset GPIO OUT Board reset
++ * MPP[31] PCI EReady GPIO IN Connected to P12
++ */
++#define CFG_MPP_CONTROL_0 0x00303022
++#define CFG_MPP_CONTROL_1 0x00000000
++#define CFG_MPP_CONTROL_2 0x00004000
++#define CFG_MPP_CONTROL_3 0x00000004
++#define CFG_GPP_LEVEL_CONTROL 0x280730D0
++
++/*----------------------------------------------------------------------
++ * Initial BAT mappings
++ */
++
++/* NOTES:
++ * 1) GUARDED and WRITE_THRU not allowed in IBATS
++ * 2) CACHEINHIBIT and WRITETHROUGH not allowed together in same BAT
++ */
++/* SDRAM */
++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_CACHEINHIBIT)
++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
++#define CFG_DBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_GUARDEDSTORAGE | BATL_CACHEINHIBIT)
++#define CFG_DBAT0U CFG_IBAT0U
++
++/* init ram */
++#define CFG_IBAT1L (CFG_INIT_RAM_ADDR | BATL_PP_RW | BATL_MEMCOHERENCE)
++#define CFG_IBAT1U (CFG_INIT_RAM_ADDR | BATU_BL_256K | BATU_VS | BATU_VP)
++#define CFG_DBAT1L CFG_IBAT1L
++#define CFG_DBAT1U CFG_IBAT1U
++
++/* PCI0, PCI1 in one BAT */
++#define CFG_IBAT2L BATL_NO_ACCESS
++#define CFG_IBAT2U CFG_DBAT2U
++#define CFG_DBAT2L (CFG_PCI0_MEM_BASE | BATL_CACHEINHIBIT | BATL_PP_RW | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT2U (CFG_PCI0_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
++
++/* GT regs, bootrom, all the devices, PCI I/O */
++#define CFG_IBAT3L (CFG_MISC_REGION_BASE | BATL_CACHEINHIBIT | BATL_PP_RW)
++#define CFG_IBAT3U (CFG_MISC_REGION_BASE | BATU_VS | BATU_VP | BATU_BL_256M)
++#define CFG_DBAT3L (CFG_MISC_REGION_BASE | BATL_CACHEINHIBIT | BATL_PP_RW | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT3U CFG_IBAT3U
++
++#define CFG_IBAT4L (CFG_SDRAM1_BASE | BATL_PP_RW | BATL_CACHEINHIBIT)
++#define CFG_IBAT4U (CFG_SDRAM1_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
++#define CFG_DBAT4L (CFG_SDRAM1_BASE | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT4U CFG_IBAT4U
++
++/* set rest out of range for Linux !!!!!!!!!!! */
++
++/* IBAT5 and DBAT5 */
++#define CFG_IBAT5L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT)
++#define CFG_IBAT5U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP)
++#define CFG_DBAT5L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT5U CFG_IBAT5U
++
++/* IBAT6 and DBAT6 */
++#define CFG_IBAT6L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT)
++#define CFG_IBAT6U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP)
++#define CFG_DBAT6L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT6U CFG_IBAT6U
++
++/* IBAT7 and DBAT7 */
++#define CFG_IBAT7L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT)
++#define CFG_IBAT7U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP)
++#define CFG_DBAT7L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
++#define CFG_DBAT7U CFG_IBAT7U
++
++/*
++ * 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 */
++#define CFG_VXWORKS_MAC_PTR 0x42010000 /* use some memory in SRAM that's not used!!! */
++
++/*-----------------------------------------------------------------------
++ * 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
++ */
++#define CFG_L2
++
++#if defined (CONFIG_750CX) || defined (CONFIG_750FX)
++#define L2_INIT 0
++#else
++#define L2_INIT (L2CR_L2SIZ_2M | L2CR_L2CLK_3 | L2CR_L2RAM_BURST | \
++ L2CR_L2OH_5 | L2CR_L2CTL | L2CR_L2WT)
++#endif
++
++#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 */
++
++#endif /* __CONFIG_H */
+diff -Naupr u-boot-1.1.6/include/configs/sequoia.h u-boot-1.1.6-fsl-1/include/configs/sequoia.h
+--- u-boot-1.1.6/include/configs/sequoia.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/sequoia.h 2006-11-30 12:34:13.000000000 -0600
+@@ -53,7 +53,7 @@
+
+ #define CFG_BOOT_BASE_ADDR 0xf0000000
+ #define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */
+-#define CFG_FLASH_BASE 0xfe000000 /* start of FLASH */
++#define CFG_FLASH_BASE 0xfc000000 /* start of FLASH */
+ #define CFG_MONITOR_BASE TEXT_BASE
+ #define CFG_NAND_ADDR 0xd0000000 /* NAND Flash */
+ #define CFG_OCM_BASE 0xe0010000 /* ocm */
+@@ -102,6 +102,7 @@
+ #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
+
+ /*-----------------------------------------------------------------------
+@@ -234,10 +235,10 @@
+ "bootm ${kernel_addr} ${ramdisk_addr}\0" \
+ "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \
+ "bootm\0" \
+- "rootpath=/opt/eldk/ppc_4xx\0" \
++ "rootpath=/opt/eldk/ppc_4xxFP\0" \
+ "bootfile=/tftpboot/sequoia/uImage\0" \
+- "kernel_addr=FE000000\0" \
+- "ramdisk_addr=FE180000\0" \
++ "kernel_addr=FC000000\0" \
++ "ramdisk_addr=FC180000\0" \
+ "load=tftp 100000 /tftpboot/sequoia/u-boot.bin\0" \
+ "update=protect off FFFA0000 FFFFFFFF;era FFFA0000 FFFFFFFF;" \
+ "cp.b 100000 FFFA0000 60000\0" \
+@@ -378,7 +379,7 @@
+ #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 | 0xba000)
++#define CFG_EBC_PB0CR (CFG_FLASH | 0xda000)
+
+ /* Memory Bank 3 (NAND-FLASH) initialization */
+ #define CFG_EBC_PB3AP 0x018003c0
+@@ -387,7 +388,7 @@
+ #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 | 0xba000)
++#define CFG_EBC_PB3CR (CFG_FLASH | 0xda000)
+
+ /* Memory Bank 0 (NAND-FLASH) initialization */
+ #define CFG_EBC_PB0AP 0x018003c0
+diff -Naupr u-boot-1.1.6/include/configs/TQM5200.h u-boot-1.1.6-fsl-1/include/configs/TQM5200.h
+--- u-boot-1.1.6/include/configs/TQM5200.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/TQM5200.h 2006-11-30 12:34:13.000000000 -0600
+@@ -217,43 +217,19 @@
+
+ #undef CONFIG_BOOTARGS
+
+-#ifdef CONFIG_STK52XX
+-# if defined(CONFIG_TQM5200_B)
+-# if defined(CFG_LOWBOOT)
+-# define ENV_UPDT \
+- "update=protect off FC000000 FC07FFFF;" \
+- "erase FC000000 FC07FFFF;" \
+- "cp.b 200000 FC000000 ${filesize};" \
+- "protect on FC000000 FC07FFFF\0"
+-# else /* highboot */
+-# define ENV_UPDT \
+- "update=protect off FFF00000 FFF7FFFF;" \
+- "erase FFF00000 FFF7FFFF;" \
++#if defined(CONFIG_TQM5200_B) && !defined(CFG_LOWBOOT)
++# define ENV_UPDT \
++ "update=protect off FFF00000 +${filesize};" \
++ "erase FFF00000 +${filesize};" \
+ "cp.b 200000 FFF00000 ${filesize};" \
+- "protect on FFF00000 FFF7FFFF\0"
+-# endif /* CFG_LOWBOOT */
+-# else /* !CONFIG_TQM5200_B */
+-# define ENV_UPDT \
+- "update=protect off FC000000 FC05FFFF;" \
+- "erase FC000000 FC05FFFF;" \
+- "cp.b 200000 FC000000 ${filesize};" \
+- "protect on FC000000 FC05FFFF\0"
+-# endif /* CONFIG_TQM5200_B */
+-#elif defined (CONFIG_CAM5200)
+-# define ENV_UPDT \
+- "update=protect off FC000000 FC03FFFF;" \
+- "erase FC000000 FC03FFFF;" \
+- "cp.b 200000 FC000000 ${filesize};" \
+- "protect on FC000000 FC03FFFF\0"
+-#elif defined (CONFIG_FO300)
++ "protect on FFF00000 +${filesize}\0"
++#else /* default lowboot configuration */
+ # define ENV_UPDT \
+- "update=protect off FC000000 FC05FFFF;" \
+- "erase FC000000 FC05FFFF;" \
++ "update=protect off FC000000 +${filesize};" \
++ "erase FC000000 +${filesize};" \
+ "cp.b 200000 FC000000 ${filesize};" \
+- "protect on FC000000 FC05FFFF\0"
+-#else
+-# error "Unknown Carrier Board"
+-#endif /* CONFIG_STK52XX */
++ "protect on FC000000 +${filesize}\0"
++#endif
+
+ #define CONFIG_EXTRA_ENV_SETTINGS \
+ "netdev=eth0\0" \
+@@ -432,7 +408,7 @@
+ */
+ #define CFG_ENV_IS_IN_FLASH 1
+ #define CFG_ENV_SIZE 0x4000 /* 16 k - keep small for fast booting */
+-#if defined(CONFIG_TQM5200_B)
++#if defined(CONFIG_TQM5200_B) || defined (CONFIG_CAM5200)
+ #define CFG_ENV_SECT_SIZE 0x40000
+ #else
+ #define CFG_ENV_SECT_SIZE 0x20000
+diff -Naupr u-boot-1.1.6/include/configs/TQM834x.h u-boot-1.1.6-fsl-1/include/configs/TQM834x.h
+--- u-boot-1.1.6/include/configs/TQM834x.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/TQM834x.h 2006-11-10 11:24:30.000000000 -0600
+@@ -37,10 +37,11 @@
+ #define CONFIG_E300 1 /* E300 Family */
+ #define CONFIG_MPC83XX 1 /* MPC83XX family */
+ #define CONFIG_MPC834X 1 /* MPC834X specific */
++#define CONFIG_MPC8349 1 /* MPC8349 specific */
+ #define CONFIG_TQM834X 1 /* TQM834X board specific */
+
+ /* IMMR Base Addres Register, use Freescale default: 0xff400000 */
+-#define CFG_IMMRBAR 0xff400000
++#define CFG_IMMR 0xff400000
+
+ /* System clock. Primary input clock when in PCI host mode */
+ #define CONFIG_83XX_CLKIN 66666000 /* 66,666 MHz */
+@@ -56,6 +57,17 @@
+ */
+ #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
+
+@@ -83,6 +95,7 @@
+ #define CFG_FLASH_CFI_DRIVER /* use the CFI driver */
+ #undef CFG_FLASH_CHECKSUM
+ #define CFG_FLASH_BASE 0x80000000 /* start of FLASH */
++#define CFG_FLASH_SIZE 8 /* FLASH size in MB */
+
+ /* buffered writes in the AMD chip set is not supported yet */
+ #undef CFG_FLASH_USE_BUFFER_WRITE
+@@ -197,14 +210,15 @@ extern int tqm834x_num_flash_banks;
+ #define CFG_BAUDRATE_TABLE \
+ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200}
+
+-#define CFG_NS16550_COM1 (CFG_IMMRBAR + 0x4500)
+-#define CFG_NS16550_COM2 (CFG_IMMRBAR + 0x4600)
++#define CFG_NS16550_COM1 (CFG_IMMR + 0x4500)
++#define CFG_NS16550_COM2 (CFG_IMMR + 0x4600)
+
+ /*
+ * 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: 400KHz */
+ #define CFG_I2C_SLAVE 0x7F /* slave address */
+ #define CFG_I2C_OFFSET 0x3000
+@@ -235,9 +249,9 @@ extern int tqm834x_num_flash_banks;
+ #define CONFIG_MII
+
+ #define CFG_TSEC1_OFFSET 0x24000
+-#define CFG_TSEC1 (CFG_IMMRBAR + CFG_TSEC1_OFFSET)
++#define CFG_TSEC1 (CFG_IMMR + CFG_TSEC1_OFFSET)
+ #define CFG_TSEC2_OFFSET 0x25000
+-#define CFG_TSEC2 (CFG_IMMRBAR + CFG_TSEC2_OFFSET)
++#define CFG_TSEC2 (CFG_IMMR + CFG_TSEC2_OFFSET)
+
+ #if defined(CONFIG_TSEC_ENET)
+
+@@ -460,8 +474,8 @@ extern int tqm834x_num_flash_banks;
+ #endif
+
+ /* IMMRBAR */
+-#define CFG_IBAT6L (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+-#define CFG_IBAT6U (CFG_IMMRBAR | BATU_BL_1M | BATU_VS | BATU_VP)
++#define CFG_IBAT6L (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
++#define CFG_IBAT6U (CFG_IMMR | BATU_BL_1M | BATU_VS | BATU_VP)
+
+ /* FLASH */
+ #define CFG_IBAT7L (CFG_FLASH_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+diff -Naupr u-boot-1.1.6/include/configs/v38b.h u-boot-1.1.6-fsl-1/include/configs/v38b.h
+--- u-boot-1.1.6/include/configs/v38b.h 1969-12-31 18:00:00.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/v38b.h 2006-11-30 12:34:13.000000000 -0600
+@@ -0,0 +1,343 @@
++/*
++ * (C) Copyright 2003-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
++ */
++
++#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 /* This is an MPC5200 CPU */
++#define CONFIG_V38B 1 /* ...on V38B board */
++#define CFG_MPC5XXX_CLKIN 33000000 /* ...running at 33.000000MHz */
++
++#define CONFIG_RTC_PCF8563 1 /* has PCF8563 RTC */
++#define CONFIG_MPC5200_DDR 1 /* has DDR SDRAM */
++
++#undef CONFIG_HW_WATCHDOG /* don't use watchdog */
++
++#define CONFIG_NETCONSOLE 1
++
++#define CONFIG_BOARD_EARLY_INIT_R 1 /* do board-specific init */
++
++#define CFG_XLB_PIPELINING 1 /* gives better performance */
++
++#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 }
++
++/*
++ * DDR
++ */
++#define SDRAM_DDR 1 /* is DDR */
++/* Settings for XLB = 132 MHz */
++#define SDRAM_MODE 0x018D0000
++#define SDRAM_EMODE 0x40090000
++#define SDRAM_CONTROL 0x704f0f00
++#define SDRAM_CONFIG1 0x73722930
++#define SDRAM_CONFIG2 0x47770000
++#define SDRAM_TAPDELAY 0x10000000
++
++/*
++ * PCI - no suport
++ */
++#undef CONFIG_PCI
++
++/*
++ * Partitions
++ */
++#define CONFIG_MAC_PARTITION 1
++#define CONFIG_DOS_PARTITION 1
++
++/*
++ * USB
++ */
++#define CONFIG_USB_OHCI
++#define CONFIG_USB_STORAGE
++#define CONFIG_USB_CLOCK 0x0001BBBB
++#define CONFIG_USB_CONFIG 0x00001000
++
++/*
++ * Supported commands
++ */
++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
++ CFG_CMD_FAT | \
++ CFG_CMD_I2C | \
++ CFG_CMD_IDE | \
++ CFG_CMD_PING | \
++ CFG_CMD_DHCP | \
++ CFG_CMD_DIAG | \
++ CFG_CMD_IRQ | \
++ CFG_CMD_JFFS2 | \
++ CFG_CMD_MII | \
++ CFG_CMD_SDRAMi | \
++ CFG_CMD_DATE | \
++ CFG_CMD_USB | \
++ CFG_CMD_FAT)
++
++#define CONFIG_TIMESTAMP /* Print image info with timestamp */
++
++/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
++#include <cmd_confdefs.h>
++
++/*
++ * Boot low with 16 MB Flash
++ */
++#define CFG_LOWBOOT 1
++#define CFG_LOWBOOT16 1
++
++/*
++ * Autobooting
++ */
++#define CONFIG_BOOTDELAY 3 /* autoboot after 3 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 \
++ "bootcmd=run net_nfs\0" \
++ "bootdelay=3\0" \
++ "baudrate=115200\0" \
++ "preboot=echo;echo Type \"run flash_nfs\" to mount root " \
++ "filesystem over NFS; echo\0" \
++ "netdev=eth0\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;bootm $(kernel_addr)\0" \
++ "flash_self=run ramargs addip;bootm $(kernel_addr) " \
++ "$(ramdisk_addr)\0" \
++ "net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \
++ "nfsargs=setenv bootargs root=/dev/nfs rw " \
++ "nfsroot=$(serverip):$(rootpath)\0" \
++ "hostname=v38b\0" \
++ "ethact=FEC ETHERNET\0" \
++ "rootpath=/opt/eldk-3.1.1/ppc_6xx\0" \
++ "update=prot off ff000000 ff03ffff; era ff000000 ff03ffff; " \
++ "cp.b 200000 ff000000 $(filesize);" \
++ "prot on ff000000 ff03ffff\0" \
++ "load=tftp 200000 $(u-boot)\0" \
++ "netmask=255.255.0.0\0" \
++ "ipaddr=192.168.160.18\0" \
++ "serverip=192.168.1.1\0" \
++ "ethaddr=00:e0:ee:00:05:2e\0" \
++ "bootfile=/tftpboot/v38b/uImage\0" \
++ "u-boot=/tftpboot/v38b/u-boot.bin\0" \
++ ""
++
++#define CONFIG_BOOTCOMMAND "run net_nfs"
++
++#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 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
++
++/*
++ * RTC configuration
++ */
++#define CFG_I2C_RTC_ADDR 0x51
++
++/*
++ * Flash configuration - use CFI driver
++ */
++#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */
++#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */
++#define CFG_FLASH_CFI_AMD_RESET 1
++#define CFG_FLASH_BASE 0xFF000000
++#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks */
++#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
++#define CFG_FLASH_SIZE 0x01000000 /* 16 MiB */
++#define CFG_MAX_FLASH_SECT 256 /* max num of sects on one chip */
++#define CFG_FLASH_USE_BUFFER_WRITE 1 /* flash write speed-up */
++
++/*
++ * Environment settings
++ */
++#define CFG_ENV_IS_IN_FLASH 1
++#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00040000)
++#define CFG_ENV_SIZE 0x10000
++#define CFG_ENV_SECT_SIZE 0x10000
++#define CONFIG_ENV_OVERWRITE 1
++
++/*
++ * 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 (256 << 10) /* Reserve 256kB for Monitor */
++#define CFG_MALLOC_LEN (128 << 10) /* Reserve 128kB for malloc() */
++#define CFG_BOOTMAPSZ (8 << 20) /* Linux initial memory map */
++
++/*
++ * Ethernet configuration
++ */
++#define CONFIG_MPC5xxx_FEC 1
++#define CONFIG_PHY_ADDR 0x00
++#define CONFIG_MII 1
++
++/*
++ * GPIO configuration
++ */
++#define CFG_GPS_PORT_CONFIG 0x90001404
++
++/*
++ * 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 */
++
++/*
++ * 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
++
++/*
++ * IDE/ATA (supports IDE harddisk)
++ */
++#undef CONFIG_IDE_8xx_PCCARD /* Don't 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
++
++#define CFG_ATA_DATA_OFFSET (0x0060) /* data I/O offset */
++
++#define CFG_ATA_REG_OFFSET (CFG_ATA_DATA_OFFSET) /* normal register accesses offset */
++
++#define CFG_ATA_ALT_OFFSET (0x005C) /* alternate registers offset */
++
++#define CFG_ATA_STRIDE 4 /* Interval between registers */
++
++/*
++ * Status LED
++ */
++#define CONFIG_STATUS_LED /* Status LED enabled */
++#define CONFIG_BOARD_SPECIFIC_LED /* version has board specific leds */
++
++#define CFG_LED_BASE MPC5XXX_GPT7_ENABLE /* Timer 7 GPIO */
++#ifndef __ASSEMBLY__
++typedef unsigned int led_id_t;
++
++#define __led_toggle(_msk) \
++ do { \
++ *((volatile long *) (CFG_LED_BASE)) ^= (_msk); \
++ } while(0)
++
++#define __led_set(_msk, _st) \
++ do { \
++ if ((_st)) \
++ *((volatile long *) (CFG_LED_BASE)) &= ~(_msk); \
++ else \
++ *((volatile long *) (CFG_LED_BASE)) |= (_msk); \
++ } while(0)
++
++#define __led_init(_msk, st) \
++ do { \
++ *((volatile long *) (CFG_LED_BASE)) |= 0x34; \
++ } while(0)
++#endif /* __ASSEMBLY__ */
++
++#endif /* __CONFIG_H */
+diff -Naupr u-boot-1.1.6/include/configs/V38B.h u-boot-1.1.6-fsl-1/include/configs/V38B.h
+--- u-boot-1.1.6/include/configs/V38B.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/V38B.h 1969-12-31 18:00:00.000000000 -0600
+@@ -1,368 +0,0 @@
+-/*
+- * (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
+- */
+-
+-#ifndef __CONFIG_H
+-#define __CONFIG_H
+-
+-#if 0
+-#define DEBUG 0xFFF
+-#endif
+-
+-#if 0
+-#define DEBUG 0x01
+-#endif
+-
+-/*
+- * High Level Configuration Options
+- * (easy to change)
+-*/
+-
+-#define CONFIG_MPC5xxx 1 /* This is an MPC5xxx CPU */
+-#define CONFIG_MPC5200 1 /* This is an MPC5200 CPU */
+-#define CONFIG_V38B 1 /* ... on V38B board */
+-#define CFG_MPC5XXX_CLKIN 33000000 /* ... running at 33.000000MHz */
+-
+-#define CONFIG_RTC_PCF8563 1 /* has PCF8563 RTC */
+-#define CONFIG_MPC5200_DDR 1 /* has DDR SDRAM */
+-#define CONFIG_HW_WATCHDOG 1 /* has watchdog */
+-
+-#define CONFIG_NETCONSOLE 1
+-
+-#define CONFIG_BOARD_EARLY_INIT_R 1 /* make flash read/write */
+-
+-#define CFG_XLB_PIPELINING 1 /* gives better performance */
+-
+-
+-#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 }
+-
+-
+-/*
+- * DDR
+- */
+-#define SDRAM_DDR 1 /* is DDR */
+-/* Settings for XLB = 132 MHz */
+-#define SDRAM_MODE 0x018D0000
+-#define SDRAM_EMODE 0x40090000
+-#define SDRAM_CONTROL 0x704f0f00
+-#define SDRAM_CONFIG1 0x73722930
+-#define SDRAM_CONFIG2 0x47770000
+-#define SDRAM_TAPDELAY 0x10000000
+-
+-
+-/*
+- * PCI - no suport
+- */
+-#undef CONFIG_PCI
+-
+-/*
+- * Partitions
+- */
+-#define CONFIG_MAC_PARTITION 1
+-#define CONFIG_DOS_PARTITION 1
+-
+-/*
+- * USB
+- */
+-#define CONFIG_USB_OHCI
+-#define CONFIG_USB_STORAGE
+-
+-#define CONFIG_TIMESTAMP /* Print image info with timestamp */
+-
+-/*
+- * Supported commands
+- */
+-#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
+- CFG_CMD_FAT | \
+- CFG_CMD_I2C | \
+- CFG_CMD_IDE | \
+- CFG_CMD_PING | \
+- CFG_CMD_DHCP | \
+- CFG_CMD_DIAG | \
+- CFG_CMD_IRQ | \
+- CFG_CMD_JFFS2 | \
+- CFG_CMD_MII | \
+- CFG_CMD_SDRAMi | \
+- CFG_CMD_DATE | \
+- CFG_CMD_USB | \
+- CFG_CMD_FAT)
+-
+-/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+-#include <cmd_confdefs.h>
+-
+-/*
+- * Boot low with 16 MB Flash
+- */
+-# define CFG_LOWBOOT 1
+-# define CFG_LOWBOOT16 1
+-
+-/*
+- * Autobooting
+- */
+-#define CONFIG_BOOTDELAY 3 /* autoboot after 3 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" \
+- "devno=5\0" \
+- "hostname=V38B_$(devno)\0" \
+- "ipaddr=10.100.99.$(devno)\0" \
+- "netmask=255.255.0.0\0" \
+- "serverip=10.100.10.90\0" \
+- "gatewayip=10.100.254.254\0" \
+- "ramargs=setenv bootargs root=/dev/ram rw\0" \
+- "rootpath=/opt/eldk/ppc_6xx\0" \
+- "bootfile=mpc5200/uImage\0" \
+- "bootcmd=run net_nfs\0" \
+- "addip=setenv bootargs $(bootargs) " \
+- "ip=$(ipaddr):$(serverip):$(gatewayip):" \
+- "$(netmask):$(hostname):$(netdev):off panic=1\0" \
+- "flash_nfs=run nfsargs addip;bootm $(kernel_addr)\0" \
+- "flash_self=run ramargs addip;bootm $(kernel_addr) " \
+- "$(ramdisk_addr)\0" \
+- "net_nfs=tftp 200000 $(bootfile);run nfsargs " \
+- "addip;bootm\0" \
+- "nfsargs=setenv bootargs root=/dev/nfs rw " \
+- "nfsroot=$(serverip):$(rootpath)\0" \
+- ""
+-
+-#define CONFIG_BOOTCOMMAND "run net_nfs"
+-
+-#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 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
+-
+-/*
+- * RTC configuration
+- */
+-#define CFG_I2C_RTC_ADDR 0x51
+-
+-/*
+- * Flash configuration - use CFI driver
+- */
+-#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */
+-#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */
+-#define CFG_FLASH_CFI_AMD_RESET 1
+-#define CFG_FLASH_BASE 0xFF000000
+-#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks */
+-#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE }
+-#define CFG_FLASH_SIZE 0x01000000 /* 16 MiB */
+-#define CFG_MAX_FLASH_SECT 256 /* max num of sects on one chip */
+-#define CFG_FLASH_USE_BUFFER_WRITE 1 /* flash write speed-up */
+-
+-/*
+- * Environment settings
+- */
+-#define CFG_ENV_IS_IN_FLASH 1
+-#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00040000)
+-#define CFG_ENV_SIZE 0x10000
+-#define CFG_ENV_SECT_SIZE 0x10000
+-#define CONFIG_ENV_OVERWRITE 1
+-
+-/*
+- * 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_PHY_ADDR 0x00
+-#define CONFIG_MII 1
+-
+-/*
+- * GPIO configuration
+- */
+-#define CFG_GPS_PORT_CONFIG 0x90000404
+-
+-/*
+- * 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 */
+-
+-/*
+- * 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 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
+-
+-/*-----------------------------------------------------------------------
+- * USB stuff
+- *-----------------------------------------------------------------------
+- */
+-#define CONFIG_USB_CLOCK 0x0001BBBB
+-#define CONFIG_USB_CONFIG 0x00001000
+-
+-
+-/*-----------------------------------------------------------------------
+- * IDE/ATA stuff Supports IDE harddisk
+- *-----------------------------------------------------------------------
+- */
+-
+-#undef CONFIG_IDE_8xx_PCCARD /* Don't 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
+-
+-/* Status LED */
+-
+-#define CONFIG_STATUS_LED /* Status LED enabled */
+-#define CONFIG_BOARD_SPECIFIC_LED /* version has board specific leds */
+-
+-#define CFG_LED_BASE (0xf0000600 + 0x70) /* Timer 7 GPIO */
+-
+-#ifndef __ASSEMBLY__
+-/* LEDs */
+-typedef unsigned int led_id_t;
+-
+-#define __led_toggle(_msk) \
+- do { \
+- *((volatile long *) (CFG_LED_BASE)) ^= (_msk); \
+- } while(0)
+-
+-#define __led_set(_msk, _st) \
+- do { \
+- if ((_st)) \
+- *((volatile long *) (CFG_LED_BASE)) &= ~(_msk); \
+- else \
+- *((volatile long *) (CFG_LED_BASE)) |= (_msk); \
+- } while(0)
+-
+-#define __led_init(_msk, st) \
+- { \
+- *((volatile long *) (CFG_LED_BASE)) |= 0x34; \
+- }
+-
+-#endif
+-
+-#endif /* __CONFIG_H */
+diff -Naupr u-boot-1.1.6/include/configs/yellowstone.h u-boot-1.1.6-fsl-1/include/configs/yellowstone.h
+--- u-boot-1.1.6/include/configs/yellowstone.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/yellowstone.h 2006-11-30 12:34:13.000000000 -0600
+@@ -37,6 +37,7 @@
+
+ #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
+diff -Naupr u-boot-1.1.6/include/configs/yosemite.h u-boot-1.1.6-fsl-1/include/configs/yosemite.h
+--- u-boot-1.1.6/include/configs/yosemite.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/configs/yosemite.h 2006-11-30 12:34:13.000000000 -0600
+@@ -37,6 +37,7 @@
+
+ #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
+diff -Naupr u-boot-1.1.6/include/environment.h u-boot-1.1.6-fsl-1/include/environment.h
+--- u-boot-1.1.6/include/environment.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/environment.h 2006-11-30 12:34:13.000000000 -0600
+@@ -79,8 +79,7 @@
+ # ifdef CFG_ENV_OFFSET_REDUND
+ # define CFG_REDUNDAND_ENVIRONMENT
+ # endif
+-# if defined(CONFIG_NAND_U_BOOT)
+-/* Use embedded environment in NAND boot versions */
++# ifdef CFG_ENV_IS_EMBEDDED
+ # define ENV_IS_EMBEDDED 1
+ # endif
+ #endif /* CFG_ENV_IS_IN_NAND */
+diff -Naupr u-boot-1.1.6/include/flash.h u-boot-1.1.6-fsl-1/include/flash.h
+--- u-boot-1.1.6/include/flash.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/flash.h 2006-11-30 12:34:13.000000000 -0600
+@@ -43,9 +43,14 @@ typedef struct {
+ ulong write_tout; /* maximum write timeout */
+ ulong buffer_write_tout; /* maximum buffer write timeout */
+ ushort vendor; /* the primary vendor id */
+- ushort cmd_reset; /* Vendor specific reset command */
++ ushort cmd_reset; /* vendor specific reset command */
+ ushort interface; /* used for x8/x16 adjustments */
+ ushort legacy_unlock; /* support Intel legacy (un)locking */
++ uchar manufacturer_id; /* manufacturer id */
++ ushort device_id; /* device id */
++ ushort device_id2; /* extended device id */
++ ushort ext_addr; /* extended query table address */
++ ushort cfi_version; /* cfi version */
+ #endif
+ } flash_info_t;
+
+@@ -439,6 +444,7 @@ extern void flash_read_factory_serial(fl
+ #define FLASH_MAN_MT 0x00400000
+ #define FLASH_MAN_SHARP 0x00500000
+ #define FLASH_MAN_ATM 0x00600000
++#define FLASH_MAN_CFI 0x01000000
+
+
+ #define FLASH_TYPEMASK 0x0000FFFF /* extract FLASH type information */
+diff -Naupr u-boot-1.1.6/include/i2c.h u-boot-1.1.6-fsl-1/include/i2c.h
+--- u-boot-1.1.6/include/i2c.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/i2c.h 2006-11-10 11:24:30.000000000 -0600
+@@ -82,4 +82,49 @@ int i2c_write(uchar chip, uint addr, int
+ uchar i2c_reg_read (uchar chip, uchar reg);
+ void i2c_reg_write(uchar chip, uchar reg, uchar val);
+
++/*
++ * Functions for setting the current I2C bus and its speed
++ */
++
++/*
++ * i2c_set_bus_num:
++ *
++ * Change the active I2C bus. Subsequent read/write calls will
++ * go to this one.
++ *
++ * bus - bus index, zero based
++ *
++ * Returns: 0 on success, not 0 on failure
++ *
++ */
++int i2c_set_bus_num(unsigned int bus);
++
++/*
++ * i2c_get_bus_num:
++ *
++ * Returns index of currently active I2C bus. Zero-based.
++ */
++
++unsigned int i2c_get_bus_num(void);
++
++/*
++ * i2c_set_bus_speed:
++ *
++ * Change the speed of the active I2C bus
++ *
++ * speed - bus speed in Hz
++ *
++ * Returns: 0 on success, not 0 on failure
++ *
++ */
++int i2c_set_bus_speed(unsigned int);
++
++/*
++ * i2c_get_bus_speed:
++ *
++ * Returns speed of currently active I2C bus in Hz
++ */
++
++unsigned int i2c_get_bus_speed(void);
++
+ #endif /* _I2C_H_ */
+diff -Naupr u-boot-1.1.6/include/ioports.h u-boot-1.1.6-fsl-1/include/ioports.h
+--- u-boot-1.1.6/include/ioports.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/ioports.h 2006-12-06 10:33:49.000000000 -0600
+@@ -53,3 +53,13 @@ typedef struct {
+ * like the table in the 8260UM (and in the hymod manuals).
+ */
+ extern const iop_conf_t iop_conf_tab[4][32];
++
++typedef struct {
++ unsigned char port;
++ unsigned char pin;
++ int dir;
++ int open_drain;
++ int assign;
++} qe_iop_conf_t;
++
++#define QE_IOP_TAB_END (-1)
+diff -Naupr u-boot-1.1.6/include/mpc5xxx.h u-boot-1.1.6-fsl-1/include/mpc5xxx.h
+--- u-boot-1.1.6/include/mpc5xxx.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/mpc5xxx.h 2006-11-10 11:24:30.000000000 -0600
+@@ -188,7 +188,14 @@
+ #define MPC5XXX_WU_GPIO_ENABLE (MPC5XXX_WU_GPIO + 0x0000)
+ #define MPC5XXX_WU_GPIO_ODE (MPC5XXX_WU_GPIO + 0x0004)
+ #define MPC5XXX_WU_GPIO_DIR (MPC5XXX_WU_GPIO + 0x0008)
+-#define MPC5XXX_WU_GPIO_DATA (MPC5XXX_WU_GPIO + 0x000c)
++#define MPC5XXX_WU_GPIO_DATA_O (MPC5XXX_WU_GPIO + 0x000c)
++#define MPC5XXX_WU_GPIO_DATA_I (MPC5XXX_WU_GPIO + 0x0020)
++
++/* GPIO pins */
++#define GPIO_WKUP_7 0x80000000UL
++#define GPIO_PSC6_0 0x10000000UL
++#define GPIO_PSC3_9 0x04000000UL
++#define GPIO_PSC1_4 0x01000000UL
+
+ /* PCI registers */
+ #define MPC5XXX_PCI_CMD (MPC5XXX_PCI + 0x04)
+diff -Naupr u-boot-1.1.6/include/mpc83xx.h u-boot-1.1.6-fsl-1/include/mpc83xx.h
+--- u-boot-1.1.6/include/mpc83xx.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/mpc83xx.h 2006-11-10 11:24:30.000000000 -0600
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2004 Freescale Semiconductor, Inc.
++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+@@ -8,16 +8,6 @@
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+- * MA 02111-1307 USA
+ */
+
+ /*
+@@ -29,6 +19,7 @@
+ #ifndef __MPC83XX_H__
+ #define __MPC83XX_H__
+
++#include <config.h>
+ #if defined(CONFIG_E300)
+ #include <asm/e300.h>
+ #endif
+@@ -85,6 +76,33 @@
+ #define LBLAWBAR3 0x0038
+ #define LBLAWAR3 0x003C
+
++/*
++ * 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
+
+ /*
+ * Base Registers & Option Registers
+@@ -116,9 +134,17 @@
+ #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
++#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)
++#endif
+
+ #define OR0 0x5004
+ #define OR1 0x500C
+@@ -201,14 +227,21 @@
+ #define HRCWH_PCI_AGENT 0x00000000
+ #define HRCWH_PCI_HOST 0x80000000
+
++#if defined (CONFIG_MPC8349)
+ #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
+
++#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
++#endif
+
+ #define HRCWH_CORE_DISABLE 0x08000000
+ #define HRCWH_CORE_ENABLE 0x00000000
+@@ -225,11 +258,14 @@
+
+ #define HRCWH_ROM_LOC_DDR_SDRAM 0x00000000
+ #define HRCWH_ROM_LOC_PCI1 0x00100000
++#if defined (CONFIG_MPC8349)
+ #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
+@@ -239,10 +275,22 @@
+ #define HRCWH_TSEC2M_IN_RTBI 0x00001000
+ #define HRCWH_TSEC2M_IN_GMII 0x00002000
+ #define HRCWH_TSEC2M_IN_TBI 0x00003000
++#endif
++
++#if defined (CONFIG_MPC8360)
++#define HRCWH_SECONDARY_DDR_DISABLE 0x00000000
++#define HRCWH_SECONDARY_DDR_ENABLE 0x00000010
++#endif
+
+ #define HRCWH_BIG_ENDIAN 0x00000000
+ #define HRCWH_LITTLE_ENDIAN 0x00000008
+
++#define HRCWH_LALE_NORMAL 0x00000000
++#define HRCWH_LALE_EARLY 0x00000004
++
++#define HRCWH_LDP_SET 0x00000000
++#define HRCWH_LDP_CLEAR 0x00000002
++
+ /*
+ * Hard Reset Configration Word - Low
+ */
+@@ -281,6 +329,47 @@
+ #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)
+ */
+@@ -310,4 +399,31 @@
+ #define LCRR_CLKDIV_8 0x00000008
+ #define LCRR_CLKDIV_SHIFT 0
+
++/*
++ * 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
++
+ #endif /* __MPC83XX_H__ */
+diff -Naupr u-boot-1.1.6/include/ppc440.h u-boot-1.1.6-fsl-1/include/ppc440.h
+--- u-boot-1.1.6/include/ppc440.h 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/include/ppc440.h 2006-12-06 10:33:49.000000000 -0600
+@@ -1350,26 +1350,26 @@
+
+ #if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
+ #define UIC2_DCR_BASE 0xe0
+-#define uic2sr (UIC0_DCR_BASE+0x0) /* UIC2 status-Read Clear */
+-#define uic2srs (UIC0_DCR_BASE+0x1) /* UIC2 status-Read Set */
+-#define uic2er (UIC0_DCR_BASE+0x2) /* UIC2 enable */
+-#define uic2cr (UIC0_DCR_BASE+0x3) /* UIC2 critical */
+-#define uic2pr (UIC0_DCR_BASE+0x4) /* UIC2 polarity */
+-#define uic2tr (UIC0_DCR_BASE+0x5) /* UIC2 triggering */
+-#define uic2msr (UIC0_DCR_BASE+0x6) /* UIC2 masked status */
+-#define uic2vr (UIC0_DCR_BASE+0x7) /* UIC2 vector */
+-#define uic2vcr (UIC0_DCR_BASE+0x8) /* UIC2 vector configuration */
++#define uic2sr (UIC2_DCR_BASE+0x0) /* UIC2 status-Read Clear */
++#define uic2srs (UIC2_DCR_BASE+0x1) /* UIC2 status-Read Set */
++#define uic2er (UIC2_DCR_BASE+0x2) /* UIC2 enable */
++#define uic2cr (UIC2_DCR_BASE+0x3) /* UIC2 critical */
++#define uic2pr (UIC2_DCR_BASE+0x4) /* UIC2 polarity */
++#define uic2tr (UIC2_DCR_BASE+0x5) /* UIC2 triggering */
++#define uic2msr (UIC2_DCR_BASE+0x6) /* UIC2 masked status */
++#define uic2vr (UIC2_DCR_BASE+0x7) /* UIC2 vector */
++#define uic2vcr (UIC2_DCR_BASE+0x8) /* UIC2 vector configuration */
+
+ #define UIC3_DCR_BASE 0xf0
+-#define uic3sr (UIC1_DCR_BASE+0x0) /* UIC3 status-Read Clear */
+-#define uic3srs (UIC0_DCR_BASE+0x1) /* UIC3 status-Read Set */
+-#define uic3er (UIC1_DCR_BASE+0x2) /* UIC3 enable */
+-#define uic3cr (UIC1_DCR_BASE+0x3) /* UIC3 critical */
+-#define uic3pr (UIC1_DCR_BASE+0x4) /* UIC3 polarity */
+-#define uic3tr (UIC1_DCR_BASE+0x5) /* UIC3 triggering */
+-#define uic3msr (UIC1_DCR_BASE+0x6) /* UIC3 masked status */
+-#define uic3vr (UIC1_DCR_BASE+0x7) /* UIC3 vector */
+-#define uic3vcr (UIC1_DCR_BASE+0x8) /* UIC3 vector configuration */
++#define uic3sr (UIC3_DCR_BASE+0x0) /* UIC3 status-Read Clear */
++#define uic3srs (UIC3_DCR_BASE+0x1) /* UIC3 status-Read Set */
++#define uic3er (UIC3_DCR_BASE+0x2) /* UIC3 enable */
++#define uic3cr (UIC3_DCR_BASE+0x3) /* UIC3 critical */
++#define uic3pr (UIC3_DCR_BASE+0x4) /* UIC3 polarity */
++#define uic3tr (UIC3_DCR_BASE+0x5) /* UIC3 triggering */
++#define uic3msr (UIC3_DCR_BASE+0x6) /* UIC3 masked status */
++#define uic3vr (UIC3_DCR_BASE+0x7) /* UIC3 vector */
++#define uic3vcr (UIC3_DCR_BASE+0x8) /* UIC3 vector configuration */
+ #endif /* CONFIG_440SPE */
+
+ #if defined(CONFIG_440GX)
+@@ -3183,7 +3183,7 @@
+ #define GPIO0 0
+ #define GPIO1 1
+
+-#if defined(CONFIG_440GP)
++#if defined(CONFIG_440GP) || defined(CONFIG_440GX)
+ #define GPIO0_BASE (CFG_PERIPHERAL_BASE+0x00000700)
+
+ #define GPIO0_OR (GPIO0_BASE+0x0)
+diff -Naupr u-boot-1.1.6/lib_ppc/board.c u-boot-1.1.6-fsl-1/lib_ppc/board.c
+--- u-boot-1.1.6/lib_ppc/board.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/lib_ppc/board.c 2006-12-06 10:33:49.000000000 -0600
+@@ -511,7 +511,7 @@ void board_init_f (ulong bootflag)
+ bd->bi_mbar_base = CFG_MBAR; /* base of internal registers */
+ #endif
+ #if defined(CONFIG_MPC83XX)
+- bd->bi_immrbar = CFG_IMMRBAR;
++ bd->bi_immrbar = CFG_IMMR;
+ #endif
+ #if defined(CONFIG_MPC8220)
+ bd->bi_mbar_base = CFG_MBAR; /* base of internal registers */
+@@ -521,17 +521,17 @@ void board_init_f (ulong bootflag)
+ bd->bi_pevfreq = gd->pev_clk;
+ bd->bi_flbfreq = gd->flb_clk;
+
+- /* store bootparam to sram (backward compatible), here? */
+- {
+- u32 *sram = (u32 *)CFG_SRAM_BASE;
+- *sram++ = gd->ram_size;
+- *sram++ = gd->bus_clk;
+- *sram++ = gd->inp_clk;
+- *sram++ = gd->cpu_clk;
+- *sram++ = gd->vco_clk;
+- *sram++ = gd->flb_clk;
+- *sram++ = 0xb8c3ba11; /* boot signature */
+- }
++ /* store bootparam to sram (backward compatible), here? */
++ {
++ u32 *sram = (u32 *)CFG_SRAM_BASE;
++ *sram++ = gd->ram_size;
++ *sram++ = gd->bus_clk;
++ *sram++ = gd->inp_clk;
++ *sram++ = gd->cpu_clk;
++ *sram++ = gd->vco_clk;
++ *sram++ = gd->flb_clk;
++ *sram++ = 0xb8c3ba11; /* boot signature */
++ }
+ #endif
+
+ bd->bi_bootflags = bootflag; /* boot / reboot flag (for LynxOS) */
+diff -Naupr u-boot-1.1.6/MAINTAINERS u-boot-1.1.6-fsl-1/MAINTAINERS
+--- u-boot-1.1.6/MAINTAINERS 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/MAINTAINERS 2006-12-06 10:33:48.000000000 -0600
+@@ -277,10 +277,13 @@ Daniel Poirot <dan.poirot@windriver.com>
+
+ Stefan Roese <sr@denx.de>
+
++ P3M7448 MPC7448
++
+ uc100 MPC857
+
+ TQM85xx MPC8540/8541/8555/8560
+
++ alpr PPC440GX
+ bamboo PPC440EP
+ bunbinga PPC405EP
+ ebony PPC440GP
+@@ -293,6 +296,8 @@ Stefan Roese <sr@denx.de>
+ yellowstone PPC440GR
+ yosemite PPC440EP
+
++ P3M750 PPC750FX/GX/GL
++
+ Yusdi Santoso <yusdi_santoso@adaptec.com>
+
+ HIDDEN_DRAGON MPC8241/MPC8245
+@@ -339,6 +344,18 @@ John Zhan <zhanz@sinovee.com>
+
+ svm_sc8xx MPC8xx
+
++Timur Tabi <timur@freescale.com>
++
++ MPC8349E-mITX MPC8349
++
++Kim Phillips <kim.phillips@freescale.com>
++
++ MPC8349EMDS MPC8349
++
++Dave Liu <daveliu@freescale.com>
++
++ MPC8360EMDS MPC8360
++
+ -------------------------------------------------------------------------
+
+ Unknown / orphaned boards:
+diff -Naupr u-boot-1.1.6/MAKEALL u-boot-1.1.6-fsl-1/MAKEALL
+--- u-boot-1.1.6/MAKEALL 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/MAKEALL 2006-12-06 10:33:48.000000000 -0600
+@@ -74,21 +74,21 @@ LIST_8xx=" \
+ #########################################################################
+
+ LIST_4xx=" \
+- ADCIOP 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 sequoia sequoia_nand \
+- VOH405 VOM405 W7OLMC W7OLMG \
+- walnut WUH405 XPEDITE1K yellowstone \
+- yosemite yucca bamboo \
++ 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 sequoia \
++ sequoia_nand VOH405 VOM405 W7OLMC \
++ W7OLMG walnut WUH405 XPEDITE1K \
++ yellowstone yosemite yucca \
+ "
+
+ #########################################################################
+@@ -130,7 +130,7 @@ LIST_8260=" \
+ #########################################################################
+
+ LIST_83xx=" \
+- TQM834x MPC8349EMDS \
++ TQM834x MPC8349EMDS MPC8349ITX MPC8360EMDS \
+ "
+
+
+@@ -151,11 +151,12 @@ LIST_85xx=" \
+
+ LIST_74xx=" \
+ DB64360 DB64460 EVB64260 P3G4 \
+- PCIPPC2 PCIPPC6 ZUMA \
++ p3m7448 PCIPPC2 PCIPPC6 ZUMA \
+ "
+
+ LIST_7xx=" \
+- BAB7xx CPCI750 ELPPC ppmc7xx \
++ BAB7xx CPCI750 ELPPC p3m750 \
++ ppmc7xx \
+ "
+
+ LIST_ppc="${LIST_5xx} ${LIST_5xxx} \
+diff -Naupr u-boot-1.1.6/Makefile u-boot-1.1.6-fsl-1/Makefile
+--- u-boot-1.1.6/Makefile 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/Makefile 2006-12-06 10:33:48.000000000 -0600
+@@ -93,7 +93,7 @@ MKCONFIG := $(SRCTREE)/mkconfig
+ export MKCONFIG
+
+ ifneq ($(OBJTREE),$(SRCTREE))
+-REMOTE_BUILD := 1
++REMOTE_BUILD := 1
+ export REMOTE_BUILD
+ endif
+
+@@ -174,9 +174,6 @@ endif
+ ifeq ($(CPU),ppc4xx)
+ OBJS += cpu/$(CPU)/resetvec.o
+ endif
+-ifeq ($(CPU),mpc83xx)
+-OBJS += cpu/$(CPU)/resetvec.o
+-endif
+ ifeq ($(CPU),mpc85xx)
+ OBJS += cpu/$(CPU)/resetvec.o
+ endif
+@@ -206,6 +203,9 @@ LIBS += dtt/libdtt.a
+ LIBS += drivers/libdrivers.a
+ LIBS += drivers/nand/libnand.a
+ LIBS += drivers/nand_legacy/libnand_legacy.a
++ifeq ($(CPU),mpc83xx)
++LIBS += drivers/qe/qe.a
++endif
+ LIBS += drivers/sk98lin/libsk98lin.a
+ LIBS += post/libpost.a post/cpu/libcpu.a
+ LIBS += common/libcommon.a
+@@ -378,8 +378,8 @@ Lite5200_LOWBOOT08_config \
+ icecube_5200_config \
+ icecube_5200_LOWBOOT_config \
+ icecube_5200_LOWBOOT08_config \
+-icecube_5200_DDR_config \
+-icecube_5200_DDR_LOWBOOT_config \
++icecube_5200_DDR_config \
++icecube_5200_DDR_LOWBOOT_config \
+ icecube_5200_DDR_LOWBOOT08_config \
+ icecube_5100_config: unconfig
+ @mkdir -p $(obj)include
+@@ -412,7 +412,7 @@ icecube_5100_config: unconfig
+ @$(MKCONFIG) -a IceCube ppc mpc5xxx icecube
+
+ v38b_config: unconfig
+- @./mkconfig -a V38B ppc mpc5xxx v38b
++ @./mkconfig -a v38b ppc mpc5xxx v38b
+
+ inka4x0_config: unconfig
+ @$(MKCONFIG) inka4x0 ppc mpc5xxx inka4x0
+@@ -458,7 +458,7 @@ prs200_highboot_DDR_config: unconfig
+ @[ -n "$(findstring _SDRAM,$@)" ] || \
+ { if [ -n "$(findstring mcc200,$@)" ]; \
+ then \
+- echo "... with DDR" ; \
++ echo "... with DDR" ; \
+ else \
+ if [ -n "$(findstring _DDR,$@)" ];\
+ then \
+@@ -865,9 +865,9 @@ RPXClassic_config: unconfig
+ RPXlite_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc mpc8xx RPXlite
+
+-RPXlite_DW_64_config \
+-RPXlite_DW_LCD_config \
+-RPXlite_DW_64_LCD_config \
++RPXlite_DW_64_config \
++RPXlite_DW_LCD_config \
++RPXlite_DW_64_LCD_config \
+ RPXlite_DW_NVRAM_config \
+ RPXlite_DW_NVRAM_64_config \
+ RPXlite_DW_NVRAM_LCD_config \
+@@ -880,12 +880,12 @@ RPXlite_DW_config: unconfig
+ echo "... with 64MHz system clock ..."; \
+ }
+ @[ -z "$(findstring _LCD,$@)" ] || \
+- { echo "#define CONFIG_LCD" >>$(obj)include/config.h ; \
++ { echo "#define CONFIG_LCD" >>$(obj)include/config.h ; \
+ echo "#define CONFIG_NEC_NL6448BC20" >>$(obj)include/config.h ; \
+ echo "... with LCD display ..."; \
+ }
+ @[ -z "$(findstring _NVRAM,$@)" ] || \
+- { echo "#define CFG_ENV_IS_IN_NVRAM" >>$(obj)include/config.h ; \
++ { echo "#define CFG_ENV_IS_IN_NVRAM" >>$(obj)include/config.h ; \
+ echo "... with ENV in NVRAM ..."; \
+ }
+ @$(MKCONFIG) -a RPXlite_DW ppc mpc8xx RPXlite_dw
+@@ -984,6 +984,9 @@ xtract_4xx = $(subst _25,,$(subst _33,,$
+ ADCIOP_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc ppc4xx adciop esd
+
++alpr_config: unconfig
++ @./mkconfig $(@:_config=) ppc ppc4xx alpr prodrive
++
+ AP1000_config:unconfig
+ @$(MKCONFIG) $(@:_config=) ppc ppc4xx ap1000 amirix
+
+@@ -1585,15 +1588,39 @@ r5200_config : unconfig
+ ## MPC83xx Systems
+ #########################################################################
+
+-MPC8349ADS_config: unconfig
+- @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349ads
+-
+ TQM834x_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc mpc83xx tqm834x
+
+ MPC8349EMDS_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349emds
+
++MPC8360EMDS_config \
++MPC8360EMDS_HOST_33_config \
++MPC8360EMDS_HOST_66_config \
++MPC8360EMDS_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 MPC8360EMDS ppc mpc83xx mpc8360emds
++
++MPC8349ITX_config: unconfig
++ @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349itx
++
+ #########################################################################
+ ## MPC85xx Systems
+ #########################################################################
+@@ -1721,6 +1748,16 @@ EVB64260_750CX_config: unconfig
+ P3G4_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx evb64260
+
++p3m750_config \
++p3m7448_config: unconfig
++ @mkdir -p $(obj)include
++ @if [ "$(findstring 750_,$@)" ] ; then \
++ echo "#define CONFIG_P3M750" >>$(obj)include/config.h ; \
++ else \
++ echo "#define CONFIG_P3M7448" >>$(obj)include/config.h ; \
++ fi
++ @$(MKCONFIG) -a p3mx ppc 74xx_7xx p3mx prodrive
++
+ PCIPPC2_config \
+ PCIPPC6_config: unconfig
+ @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx pcippc2
+@@ -1784,7 +1821,7 @@ ap966_config \
+ ap922_config \
+ ap922_XA10_config \
+ ap7_config \
+-ap720t_config \
++ap720t_config \
+ ap920t_config \
+ ap926ejs_config \
+ ap946es_config: unconfig
+@@ -1941,7 +1978,7 @@ cm4008_config : unconfig
+ cm41xx_config : unconfig
+ @$(MKCONFIG) $(@:_config=) arm arm920t cm41xx NULL ks8695
+
+-gth2_config : unconfig
++gth2_config : unconfig
+ @mkdir -p $(obj)include
+ @ >$(obj)include/config.h
+ @echo "#define CONFIG_GTH2 1" >>$(obj)include/config.h
+@@ -2087,19 +2124,19 @@ tb0229_config: unconfig
+ #########################################################################
+ ## MIPS32 AU1X00
+ #########################################################################
+-dbau1000_config : unconfig
++dbau1000_config : unconfig
+ @mkdir -p $(obj)include
+ @ >$(obj)include/config.h
+ @echo "#define CONFIG_DBAU1000 1" >>$(obj)include/config.h
+ @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00
+
+-dbau1100_config : unconfig
++dbau1100_config : unconfig
+ @mkdir -p $(obj)include
+ @ >$(obj)include/config.h
+ @echo "#define CONFIG_DBAU1100 1" >>$(obj)include/config.h
+ @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00
+
+-dbau1500_config : unconfig
++dbau1500_config : unconfig
+ @mkdir -p $(obj)include
+ @ >$(obj)include/config.h
+ @echo "#define CONFIG_DBAU1500 1" >>$(obj)include/config.h
+@@ -2117,7 +2154,7 @@ dbau1550_el_config : unconfig
+ @echo "#define CONFIG_DBAU1550 1" >>$(obj)include/config.h
+ @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00
+
+-pb1000_config : unconfig
++pb1000_config : unconfig
+ @mkdir -p $(obj)include
+ @ >$(obj)include/config.h
+ @echo "#define CONFIG_PB1000 1" >>$(obj)include/config.h
+diff -Naupr u-boot-1.1.6/net/eth.c u-boot-1.1.6-fsl-1/net/eth.c
+--- u-boot-1.1.6/net/eth.c 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/net/eth.c 2006-12-06 10:33:49.000000000 -0600
+@@ -54,6 +54,7 @@ extern int scc_initialize(bd_t*);
+ extern int skge_initialize(bd_t*);
+ extern int tsec_initialize(bd_t*, int, char *);
+ extern int npe_initialize(bd_t *);
++extern int uec_initialize(int);
+
+ static struct eth_device *eth_devices, *eth_current;
+
+@@ -142,13 +143,10 @@ int eth_initialize(bd_t *bis)
+ miiphy_init();
+ #endif
+
+-#ifdef CONFIG_DB64360
++#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
+ mv6436x_eth_initialize(bis);
+ #endif
+-#ifdef CONFIG_CPCI750
+- mv6436x_eth_initialize(bis);
+-#endif
+-#ifdef CONFIG_DB64460
++#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx)
+ mv6446x_eth_initialize(bis);
+ #endif
+ #if defined(CONFIG_4xx) && !defined(CONFIG_IOP480) && !defined(CONFIG_AP1000)
+@@ -196,6 +194,12 @@ int eth_initialize(bd_t *bis)
+ tsec_initialize(bis, 3, CONFIG_MPC83XX_TSEC4_NAME);
+ # endif
+ #endif
++#if defined(CONFIG_UEC_ETH1)
++ uec_initialize(0);
++#endif
++#if defined(CONFIG_UEC_ETH2)
++ uec_initialize(1);
++#endif
+ #if defined(CONFIG_MPC86XX_TSEC1)
+ tsec_initialize(bis, 0, CONFIG_MPC86XX_TSEC1_NAME);
+ #endif
+diff -Naupr u-boot-1.1.6/README u-boot-1.1.6-fsl-1/README
+--- u-boot-1.1.6/README 2006-11-02 08:15:01.000000000 -0600
++++ u-boot-1.1.6-fsl-1/README 2006-11-30 12:34:13.000000000 -0600
+@@ -1207,7 +1207,12 @@ The following options need to be configu
+ clock chips. See common/cmd_i2c.c for a description of the
+ command line interface.
+
+- CONFIG_HARD_I2C selects the CPM hardware driver for I2C.
++ CONFIG_I2C_CMD_TREE is a recommended option that places
++ all I2C commands under a single 'i2c' root command. The
++ older 'imm', 'imd', 'iprobe' etc. commands are considered
++ deprecated and may disappear in the future.
++
++ CONFIG_HARD_I2C selects a hardware I2C controller.
+
+ CONFIG_SOFT_I2C configures u-boot to use a software (aka
+ bit-banging) driver instead of CPM or similar hardware
+@@ -1312,6 +1317,42 @@ The following options need to be configu
+ in u-boot bd_info structure based on u-boot environment
+ variable "i2cfast". (see also i2cfast)
+
++ CONFIG_I2C_MULTI_BUS
++
++ This option allows the use of multiple I2C buses, each of which
++ must have a controller. At any point in time, only one bus is
++ active. To switch to a different bus, use the 'i2c dev' command.
++ Note that bus numbering is zero-based.
++
++ CFG_I2C_NOPROBES
++
++ This option specifies a list of I2C devices that will be skipped
++ when the 'i2c probe' command is issued (or 'iprobe' using the legacy
++ command). If CONFIG_I2C_MULTI_BUS is set, specify a list of bus-device
++ pairs. Otherwise, specify a 1D array of device addresses
++
++ e.g.
++ #undef CONFIG_I2C_MULTI_BUS
++ #define CFG_I2C_NOPROBES {0x50,0x68}
++
++ will skip addresses 0x50 and 0x68 on a board with one I2C bus
++
++ #define CONFIG_I2C_MULTI_BUS
++ #define CFG_I2C_MULTI_NOPROBES {{0,0x50},{0,0x68},{1,0x54}}
++
++ will skip addresses 0x50 and 0x68 on bus 0 and address 0x54 on bus 1
++
++ CFG_SPD_BUS_NUM
++
++ 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.
++
++ CONFIG_FSL_I2C
++
++ Define this option if you want to use Freescale's I2C driver in
++ drivers/fsl_i2c.c.
++
++
+ - SPI Support: CONFIG_SPI
+
+ Enables SPI driver (so far only tested with
+@@ -1470,8 +1511,8 @@ The following options need to be configu
+
+ Enable auto completion of commands using TAB.
+
+- Note that this feature has NOT been implemented yet
+- for the "hush" shell.
++ Note that this feature has NOT been implemented yet
++ for the "hush" shell.
+
+
+ CFG_HUSH_PARSER
+@@ -2209,6 +2250,24 @@ Low Level (hardware related) configurati
+ CFG_POCMR2_MASK_ATTRIB: (MPC826x only)
+ Overrides the default PCI memory map in cpu/mpc8260/pci.c if set.
+
++- CONFIG_SPD_EEPROM
++ Get DDR timing information from an I2C EEPROM. Common with pluggable
++ memory modules such as SODIMMs
++ SPD_EEPROM_ADDRESS
++ I2C address of the SPD EEPROM
++
++- CFG_SPD_BUS_NUM
++ If SPD EEPROM is on an I2C bus other than the first one, specify here.
++ Note that the value must resolve to something your driver can deal with.
++
++- CFG_83XX_DDR_USES_CS0
++ Only for 83xx systems. If specified, then DDR should be configured
++ using CS0 and CS1 instead of CS2 and CS3.
++
++- CFG_83XX_DDR_USES_CS0
++ Only for 83xx systems. If specified, then DDR should be configured
++ using CS0 and CS1 instead of CS2 and CS3.
++
+ - CONFIG_ETHER_ON_FEC[12]
+ Define to enable FEC[12] on a 8xx series processor.
+
+@@ -3114,11 +3173,11 @@ loadaddr=200000
+ oftaddr=0x300000
+ => bootm $loadaddr - $oftaddr
+ ## Booting image at 00200000 ...
+- Image Name: Linux-2.6.17-dirty
+- Image Type: PowerPC Linux Kernel Image (gzip compressed)
+- Data Size: 1029343 Bytes = 1005.2 kB
++ Image Name: Linux-2.6.17-dirty
++ Image Type: PowerPC Linux Kernel Image (gzip compressed)
++ Data Size: 1029343 Bytes = 1005.2 kB
+ Load Address: 00000000
+- Entry Point: 00000000
++ Entry Point: 00000000
+ Verifying Checksum ... OK
+ Uncompressing Kernel Image ... OK
+ Booting using flat device tree at 0x300000