Merge with git://www.denx.de/git/u-boot.git
authorStefan Roese <sr@denx.de>
Fri, 10 Aug 2007 18:33:06 +0000 (20:33 +0200)
committerStefan Roese <sr@denx.de>
Fri, 10 Aug 2007 18:33:06 +0000 (20:33 +0200)
25 files changed:
Makefile
board/freescale/mpc8323erdb/Makefile [new file with mode: 0644]
board/freescale/mpc8323erdb/config.mk [new file with mode: 0644]
board/freescale/mpc8323erdb/mpc8323erdb.c [new file with mode: 0644]
board/mpc8349emds/mpc8349emds.c
board/mpc8349itx/config.mk
board/mpc8360emds/mpc8360emds.c
board/mpc8360emds/pci.c
cpu/mpc83xx/Makefile
cpu/mpc83xx/cpu.c
cpu/mpc83xx/cpu_init.c
cpu/mpc83xx/ecc.c [new file with mode: 0644]
cpu/mpc83xx/pci.c
cpu/mpc83xx/spd_sdram.c
doc/README.mpc8323erdb [new file with mode: 0644]
doc/README.mpc8360emds
doc/README.mpc83xx.ddrecc [moved from doc/README.mpc8349emds.ddrecc with 62% similarity]
drivers/fsl_i2c.c
drivers/qe/qe.c
drivers/qe/qe.h
include/common.h
include/configs/MPC8323ERDB.h [new file with mode: 0644]
include/configs/TQM834x.h
include/mpc83xx.h
lib_ppc/board.c

index 87ddb1c..eef51cc 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1666,15 +1666,18 @@ MPC8313ERDB_66_config: unconfig
        @mkdir -p $(obj)include
        @echo "" >$(obj)include/config.h ; \
        if [ "$(findstring _33_,$@)" ] ; then \
-               echo "...33M ..." ; \
+               echo -n "...33M ..." ; \
                echo "#define CFG_33MHZ" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _66_,$@)" ] ; then \
-               echo "...66M..." ; \
+               echo -n "...66M..." ; \
                echo "#define CFG_66MHZ" >>$(obj)include/config.h ; \
        fi ;
        @$(MKCONFIG) -a MPC8313ERDB ppc mpc83xx mpc8313erdb
 
+MPC8323ERDB_config:    unconfig
+       @$(MKCONFIG) -a MPC8323ERDB ppc mpc83xx mpc8323erdb freescale
+
 MPC832XEMDS_config \
 MPC832XEMDS_HOST_33_config \
 MPC832XEMDS_HOST_66_config \
@@ -1682,7 +1685,7 @@ MPC832XEMDS_SLAVE_config: unconfig
        @mkdir -p $(obj)include
        @echo "" >$(obj)include/config.h ; \
        if [ "$(findstring _HOST_,$@)" ] ; then \
-               echo "... PCI HOST " ; \
+               echo -n "... PCI HOST " ; \
                echo "#define CONFIG_PCI" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _SLAVE_,$@)" ] ; then \
@@ -1691,11 +1694,11 @@ MPC832XEMDS_SLAVE_config:       unconfig
                echo "#define CONFIG_PCISLAVE" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _33_,$@)" ] ; then \
-               echo "...33M ..." ; \
+               echo -n "...33M ..." ; \
                echo "#define PCI_33M" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _66_,$@)" ] ; then \
-               echo "...66M..." ; \
+               echo -n "...66M..." ; \
                echo "#define PCI_66M" >>$(obj)include/config.h ; \
        fi ;
        @$(MKCONFIG) -a MPC832XEMDS ppc mpc83xx mpc832xemds
@@ -1724,7 +1727,7 @@ MPC8360EMDS_SLAVE_config: unconfig
        @mkdir -p $(obj)include
        @echo "" >$(obj)include/config.h ; \
        if [ "$(findstring _HOST_,$@)" ] ; then \
-               echo "... PCI HOST " ; \
+               echo -n "... PCI HOST " ; \
                echo "#define CONFIG_PCI" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _SLAVE_,$@)" ] ; then \
@@ -1733,11 +1736,11 @@ MPC8360EMDS_SLAVE_config:       unconfig
                echo "#define CONFIG_PCISLAVE" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _33_,$@)" ] ; then \
-               echo "...33M ..." ; \
+               echo -n "...33M ..." ; \
                echo "#define PCI_33M" >>$(obj)include/config.h ; \
        fi ; \
        if [ "$(findstring _66_,$@)" ] ; then \
-               echo "...66M..." ; \
+               echo -n "...66M..." ; \
                echo "#define PCI_66M" >>$(obj)include/config.h ; \
        fi ;
        @$(MKCONFIG) -a MPC8360EMDS ppc mpc83xx mpc8360emds
diff --git a/board/freescale/mpc8323erdb/Makefile b/board/freescale/mpc8323erdb/Makefile
new file mode 100644 (file)
index 0000000..acc9544
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/freescale/mpc8323erdb/config.mk b/board/freescale/mpc8323erdb/config.mk
new file mode 100644 (file)
index 0000000..fe0d37d
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+#
+# MPC8323ERDB
+#
+
+TEXT_BASE = 0xFE000000
diff --git a/board/freescale/mpc8323erdb/mpc8323erdb.c b/board/freescale/mpc8323erdb/mpc8323erdb.c
new file mode 100644 (file)
index 0000000..1886f19
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ *
+ * Michael Barkowski <michael.barkowski@freescale.com>
+ * Based on mpc832xmds file by 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include <common.h>
+#include <ioports.h>
+#include <mpc83xx.h>
+#include <i2c.h>
+#include <spd.h>
+#include <miiphy.h>
+#include <command.h>
+#include <libfdt.h>
+#include <libfdt_env.h>
+#if defined(CONFIG_PCI)
+#include <pci.h>
+#endif
+#if defined(CONFIG_SPD_EEPROM)
+#include <spd_sdram.h>
+#else
+#include <asm/mmu.h>
+#endif
+
+const qe_iop_conf_t qe_iop_conf_tab[] = {
+       /* UCC3 */
+       {1,  0, 1, 0, 1}, /* TxD0 */
+       {1,  1, 1, 0, 1}, /* TxD1 */
+       {1,  2, 1, 0, 1}, /* TxD2 */
+       {1,  3, 1, 0, 1}, /* TxD3 */
+       {1,  9, 1, 0, 1}, /* TxER */
+       {1, 12, 1, 0, 1}, /* TxEN */
+       {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */
+
+       {1,  4, 2, 0, 1}, /* RxD0 */
+       {1,  5, 2, 0, 1}, /* RxD1 */
+       {1,  6, 2, 0, 1}, /* RxD2 */
+       {1,  7, 2, 0, 1}, /* RxD3 */
+       {1,  8, 2, 0, 1}, /* RxER */
+       {1, 10, 2, 0, 1}, /* RxDV */
+       {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */
+       {1, 11, 2, 0, 1}, /* COL */
+       {1, 13, 2, 0, 1}, /* CRS */
+
+       /* UCC2 */
+       {0, 18, 1, 0, 1}, /* TxD0 */
+       {0, 19, 1, 0, 1}, /* TxD1 */
+       {0, 20, 1, 0, 1}, /* TxD2 */
+       {0, 21, 1, 0, 1}, /* TxD3 */
+       {0, 27, 1, 0, 1}, /* TxER */
+       {0, 30, 1, 0, 1}, /* TxEN */
+       {3, 23, 2, 0, 1}, /* TxCLK->CLK3 */
+
+       {0, 22, 2, 0, 1}, /* RxD0 */
+       {0, 23, 2, 0, 1}, /* RxD1 */
+       {0, 24, 2, 0, 1}, /* RxD2 */
+       {0, 25, 2, 0, 1}, /* RxD3 */
+       {0, 26, 1, 0, 1}, /* RxER */
+       {0, 28, 2, 0, 1}, /* Rx_DV */
+       {3, 21, 2, 0, 1}, /* RxCLK->CLK16 */
+       {0, 29, 2, 0, 1}, /* COL */
+       {0, 31, 2, 0, 1}, /* CRS */
+
+       {3,  4, 3, 0, 2}, /* MDIO */
+       {3,  5, 1, 0, 2}, /* MDC */
+
+       {0,  0, 0, 0, QE_IOP_TAB_END}, /* END of table */
+};
+
+int board_early_init_f(void)
+{
+       return 0;
+}
+
+int fixed_sdram(void);
+
+long int initdram(int board_type)
+{
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       u32 msize = 0;
+
+       if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
+               return -1;
+
+       /* DDR SDRAM - Main SODIMM */
+       im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR;
+
+       msize = fixed_sdram();
+
+       puts("\n   DDR RAM: ");
+
+       /* return total bus SDRAM size(bytes)  -- DDR */
+       return (msize * 1024 * 1024);
+}
+
+/*************************************************************************
+ *  fixed sdram init -- doesn't use serial presence detect.
+ ************************************************************************/
+int fixed_sdram(void)
+{
+       volatile immap_t *im = (immap_t *) CFG_IMMR;
+       u32 msize = 0;
+       u32 ddr_size;
+       u32 ddr_size_log2;
+
+       msize = CFG_DDR_SIZE;
+       for (ddr_size = msize << 20, ddr_size_log2 = 0;
+            (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) {
+               if (ddr_size & 1) {
+                       return -1;
+               }
+       }
+       im->sysconf.ddrlaw[0].ar =
+           LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
+       im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL;
+       im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS;
+       im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG;
+       im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
+       im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
+       im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
+       im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
+       im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG;
+       im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2;
+       im->ddr.sdram_mode = CFG_DDR_MODE;
+       im->ddr.sdram_mode2 = CFG_DDR_MODE2;
+       im->ddr.sdram_interval = CFG_DDR_INTERVAL;
+       __asm__ __volatile__ ("sync");
+       udelay(200);
+
+       im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
+       __asm__ __volatile__ ("sync");
+       return msize;
+}
+
+int checkboard(void)
+{
+       puts("Board: Freescale MPC8323ERDB\n");
+       return 0;
+}
+
+static struct pci_region pci_regions[] = {
+       {
+               bus_start: CFG_PCI1_MEM_BASE,
+               phys_start: CFG_PCI1_MEM_PHYS,
+               size: CFG_PCI1_MEM_SIZE,
+               flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
+       },
+       {
+               bus_start: CFG_PCI1_MMIO_BASE,
+               phys_start: CFG_PCI1_MMIO_PHYS,
+               size: CFG_PCI1_MMIO_SIZE,
+               flags: PCI_REGION_MEM
+       },
+       {
+               bus_start: CFG_PCI1_IO_BASE,
+               phys_start: CFG_PCI1_IO_PHYS,
+               size: CFG_PCI1_IO_SIZE,
+               flags: PCI_REGION_IO
+       }
+};
+
+void pci_init_board(void)
+{
+       volatile immap_t *immr = (volatile immap_t *)CFG_IMMR;
+       volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
+       volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
+       struct pci_region *reg[] = { pci_regions };
+
+       /* Enable all 3 PCI_CLK_OUTPUTs. */
+       clk->occr |= 0xe0000000;
+
+       /* Configure PCI Local Access Windows */
+       pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB;
+
+       pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB;
+
+       mpc83xx_pci_init(1, reg, 0);
+}
+
+#if defined(CONFIG_OF_BOARD_SETUP)
+
+/*
+ * Prototypes of functions that we use.
+ */
+void ft_cpu_setup(void *blob, bd_t *bd);
+
+#ifdef CONFIG_PCI
+void ft_pci_setup(void *blob, bd_t *bd);
+#endif
+
+void
+ft_board_setup(void *blob, bd_t *bd)
+{
+       int nodeoffset;
+       int tmp[2];
+
+       nodeoffset = fdt_find_node_by_path(blob, "/memory");
+       if (nodeoffset >= 0) {
+               tmp[0] = cpu_to_be32(bd->bi_memstart);
+               tmp[1] = cpu_to_be32(bd->bi_memsize);
+               fdt_setprop(blob, nodeoffset, "reg", tmp, sizeof(tmp));
+       }
+
+       ft_cpu_setup(blob, bd);
+
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
+#endif
+}
+#endif /* CONFIG_OF_BOARD_SETUP */
index 071591e..521d1bb 100644 (file)
@@ -29,7 +29,6 @@
 #include <i2c.h>
 #include <spd.h>
 #include <miiphy.h>
-#include <command.h>
 #if defined(CONFIG_SPD_EEPROM)
 #include <spd_sdram.h>
 #endif
@@ -258,332 +257,6 @@ void sdram_init(void)
 }
 #endif
 
-#if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD)
-/*
- * ECC user commands
- */
-void ecc_print_status(void)
-{
-       volatile immap_t *immap = (immap_t *)CFG_IMMR;
-       volatile ddr83xx_t *ddr = &immap->ddr;
-
-       printf("\nECC mode: %s\n\n", (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) ? "ON" : "OFF");
-
-       /* Interrupts */
-       printf("Memory Error Interrupt Enable:\n");
-       printf("  Multiple-Bit Error Interrupt Enable: %d\n",
-                       (ddr->err_int_en & ECC_ERR_INT_EN_MBEE) ? 1 : 0);
-       printf("  Single-Bit Error Interrupt Enable: %d\n",
-                       (ddr->err_int_en & ECC_ERR_INT_EN_SBEE) ? 1 : 0);
-       printf("  Memory Select Error Interrupt Enable: %d\n\n",
-                       (ddr->err_int_en & ECC_ERR_INT_EN_MSEE) ? 1 : 0);
-
-       /* Error disable */
-       printf("Memory Error Disable:\n");
-       printf("  Multiple-Bit Error Disable: %d\n",
-                       (ddr->err_disable & ECC_ERROR_DISABLE_MBED) ? 1 : 0);
-       printf("  Sinle-Bit Error Disable: %d\n",
-                       (ddr->err_disable & ECC_ERROR_DISABLE_SBED) ? 1 : 0);
-       printf("  Memory Select Error Disable: %d\n\n",
-                       (ddr->err_disable & ECC_ERROR_DISABLE_MSED) ? 1 : 0);
-
-       /* Error injection */
-       printf("Memory Data Path Error Injection Mask High/Low: %08lx %08lx\n",
-                       ddr->data_err_inject_hi, ddr->data_err_inject_lo);
-
-       printf("Memory Data Path Error Injection Mask ECC:\n");
-       printf("  ECC Mirror Byte: %d\n",
-                       (ddr->ecc_err_inject & ECC_ERR_INJECT_EMB) ? 1 : 0);
-       printf("  ECC Injection Enable: %d\n",
-                       (ddr->ecc_err_inject & ECC_ERR_INJECT_EIEN) ? 1 : 0);
-       printf("  ECC Error Injection Mask: 0x%02x\n\n",
-                       ddr->ecc_err_inject & ECC_ERR_INJECT_EEIM);
-
-       /* SBE counter/threshold */
-       printf("Memory Single-Bit Error Management (0..255):\n");
-       printf("  Single-Bit Error Threshold: %d\n",
-                       (ddr->err_sbe & ECC_ERROR_MAN_SBET) >> ECC_ERROR_MAN_SBET_SHIFT);
-       printf("  Single-Bit Error Counter: %d\n\n",
-                       (ddr->err_sbe & ECC_ERROR_MAN_SBEC) >> ECC_ERROR_MAN_SBEC_SHIFT);
-
-       /* Error detect */
-       printf("Memory Error Detect:\n");
-       printf("  Multiple Memory Errors: %d\n",
-                       (ddr->err_detect & ECC_ERROR_DETECT_MME) ? 1 : 0);
-       printf("  Multiple-Bit Error: %d\n",
-                       (ddr->err_detect & ECC_ERROR_DETECT_MBE) ? 1 : 0);
-       printf("  Single-Bit Error: %d\n",
-                       (ddr->err_detect & ECC_ERROR_DETECT_SBE) ? 1 : 0);
-       printf("  Memory Select Error: %d\n\n",
-                       (ddr->err_detect & ECC_ERROR_DETECT_MSE) ? 1 : 0);
-
-       /* Capture data */
-       printf("Memory Error Address Capture: 0x%08lx\n", ddr->capture_address);
-       printf("Memory Data Path Read Capture High/Low: %08lx %08lx\n",
-                       ddr->capture_data_hi, ddr->capture_data_lo);
-       printf("Memory Data Path Read Capture ECC: 0x%02x\n\n",
-               ddr->capture_ecc & CAPTURE_ECC_ECE);
-
-       printf("Memory Error Attributes Capture:\n");
-       printf("  Data Beat Number: %d\n",
-                       (ddr->capture_attributes & ECC_CAPT_ATTR_BNUM) >> ECC_CAPT_ATTR_BNUM_SHIFT);
-       printf("  Transaction Size: %d\n",
-                       (ddr->capture_attributes & ECC_CAPT_ATTR_TSIZ) >> ECC_CAPT_ATTR_TSIZ_SHIFT);
-       printf("  Transaction Source: %d\n",
-                       (ddr->capture_attributes & ECC_CAPT_ATTR_TSRC) >> ECC_CAPT_ATTR_TSRC_SHIFT);
-       printf("  Transaction Type: %d\n",
-                       (ddr->capture_attributes & ECC_CAPT_ATTR_TTYP) >> ECC_CAPT_ATTR_TTYP_SHIFT);
-       printf("  Error Information Valid: %d\n\n",
-                       ddr->capture_attributes & ECC_CAPT_ATTR_VLD);
-}
-
-int do_ecc ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
-       volatile immap_t *immap = (immap_t *)CFG_IMMR;
-       volatile ddr83xx_t *ddr = &immap->ddr;
-       volatile u32 val;
-       u64 *addr, count, val64;
-       register u64 *i;
-
-       if (argc > 4) {
-               printf ("Usage:\n%s\n", cmdtp->usage);
-               return 1;
-       }
-
-       if (argc == 2) {
-               if (strcmp(argv[1], "status") == 0) {
-                       ecc_print_status();
-                       return 0;
-               } else if (strcmp(argv[1], "captureclear") == 0) {
-                       ddr->capture_address = 0;
-                       ddr->capture_data_hi = 0;
-                       ddr->capture_data_lo = 0;
-                       ddr->capture_ecc = 0;
-                       ddr->capture_attributes = 0;
-                       return 0;
-               }
-       }
-
-       if (argc == 3) {
-               if (strcmp(argv[1], "sbecnt") == 0) {
-                       val = simple_strtoul(argv[2], NULL, 10);
-                       if (val > 255) {
-                               printf("Incorrect Counter value, should be 0..255\n");
-                               return 1;
-                       }
-
-                       val = (val << ECC_ERROR_MAN_SBEC_SHIFT);
-                       val |= (ddr->err_sbe & ECC_ERROR_MAN_SBET);
-
-                       ddr->err_sbe = val;
-                       return 0;
-               } else if (strcmp(argv[1], "sbethr") == 0) {
-                       val = simple_strtoul(argv[2], NULL, 10);
-                       if (val > 255) {
-                               printf("Incorrect Counter value, should be 0..255\n");
-                               return 1;
-                       }
-
-                       val = (val << ECC_ERROR_MAN_SBET_SHIFT);
-                       val |= (ddr->err_sbe & ECC_ERROR_MAN_SBEC);
-
-                       ddr->err_sbe = val;
-                       return 0;
-               } else if (strcmp(argv[1], "errdisable") == 0) {
-                       val = ddr->err_disable;
-
-                       if (strcmp(argv[2], "+sbe") == 0) {
-                               val |= ECC_ERROR_DISABLE_SBED;
-                       } else if (strcmp(argv[2], "+mbe") == 0) {
-                               val |= ECC_ERROR_DISABLE_MBED;
-                       } else if (strcmp(argv[2], "+mse") == 0) {
-                               val |= ECC_ERROR_DISABLE_MSED;
-                       } else if (strcmp(argv[2], "+all") == 0) {
-                               val |= (ECC_ERROR_DISABLE_SBED |
-                                       ECC_ERROR_DISABLE_MBED |
-                                       ECC_ERROR_DISABLE_MSED);
-                       } else if (strcmp(argv[2], "-sbe") == 0) {
-                               val &= ~ECC_ERROR_DISABLE_SBED;
-                       } else if (strcmp(argv[2], "-mbe") == 0) {
-                               val &= ~ECC_ERROR_DISABLE_MBED;
-                       } else if (strcmp(argv[2], "-mse") == 0) {
-                               val &= ~ECC_ERROR_DISABLE_MSED;
-                       } else if (strcmp(argv[2], "-all") == 0) {
-                               val &= ~(ECC_ERROR_DISABLE_SBED |
-                                       ECC_ERROR_DISABLE_MBED |
-                                       ECC_ERROR_DISABLE_MSED);
-                       } else {
-                               printf("Incorrect err_disable field\n");
-                               return 1;
-                       }
-
-                       ddr->err_disable = val;
-                       __asm__ __volatile__ ("sync");
-                       __asm__ __volatile__ ("isync");
-                       return 0;
-               } else if (strcmp(argv[1], "errdetectclr") == 0) {
-                       val = ddr->err_detect;
-
-                       if (strcmp(argv[2], "mme") == 0) {
-                               val |= ECC_ERROR_DETECT_MME;
-                       } else if (strcmp(argv[2], "sbe") == 0) {
-                               val |= ECC_ERROR_DETECT_SBE;
-                       } else if (strcmp(argv[2], "mbe") == 0) {
-                               val |= ECC_ERROR_DETECT_MBE;
-                       } else if (strcmp(argv[2], "mse") == 0) {
-                               val |= ECC_ERROR_DETECT_MSE;
-                       } else if (strcmp(argv[2], "all") == 0) {
-                               val |= (ECC_ERROR_DETECT_MME |
-                                       ECC_ERROR_DETECT_MBE |
-                                       ECC_ERROR_DETECT_SBE |
-                                       ECC_ERROR_DETECT_MSE);
-                       } else {
-                               printf("Incorrect err_detect field\n");
-                               return 1;
-                       }
-
-                       ddr->err_detect = val;
-                       return 0;
-               } else if (strcmp(argv[1], "injectdatahi") == 0) {
-                       val = simple_strtoul(argv[2], NULL, 16);
-
-                       ddr->data_err_inject_hi = val;
-                       return 0;
-               } else if (strcmp(argv[1], "injectdatalo") == 0) {
-                       val = simple_strtoul(argv[2], NULL, 16);
-
-                       ddr->data_err_inject_lo = val;
-                       return 0;
-               } else if (strcmp(argv[1], "injectecc") == 0) {
-                       val = simple_strtoul(argv[2], NULL, 16);
-                       if (val > 0xff) {
-                               printf("Incorrect ECC inject mask, should be 0x00..0xff\n");
-                               return 1;
-                       }
-                       val |= (ddr->ecc_err_inject & ~ECC_ERR_INJECT_EEIM);
-
-                       ddr->ecc_err_inject = val;
-                       return 0;
-               } else if (strcmp(argv[1], "inject") == 0) {
-                       val = ddr->ecc_err_inject;
-
-                       if (strcmp(argv[2], "en") == 0)
-                               val |= ECC_ERR_INJECT_EIEN;
-                       else if (strcmp(argv[2], "dis") == 0)
-                               val &= ~ECC_ERR_INJECT_EIEN;
-                       else
-                               printf("Incorrect command\n");
-
-                       ddr->ecc_err_inject = val;
-                       __asm__ __volatile__ ("sync");
-                       __asm__ __volatile__ ("isync");
-                       return 0;
-               } else if (strcmp(argv[1], "mirror") == 0) {
-                       val = ddr->ecc_err_inject;
-
-                       if (strcmp(argv[2], "en") == 0)
-                               val |= ECC_ERR_INJECT_EMB;
-                       else if (strcmp(argv[2], "dis") == 0)
-                               val &= ~ECC_ERR_INJECT_EMB;
-                       else
-                               printf("Incorrect command\n");
-
-                       ddr->ecc_err_inject = val;
-                       return 0;
-               }
-       }
-
-       if (argc == 4) {
-               if (strcmp(argv[1], "test") == 0) {
-                       addr = (u64 *)simple_strtoul(argv[2], NULL, 16);
-                       count = simple_strtoul(argv[3], NULL, 16);
-
-                       if ((u32)addr % 8) {
-                               printf("Address not alligned on double word boundary\n");
-                               return 1;
-                       }
-
-                       disable_interrupts();
-                       icache_disable();
-
-                       for (i = addr; i < addr + count; i++) {
-                               /* enable injects */
-                               ddr->ecc_err_inject |= ECC_ERR_INJECT_EIEN;
-                               __asm__ __volatile__ ("sync");
-                               __asm__ __volatile__ ("isync");
-
-                               /* write memory location injecting errors */
-                               *i = 0x1122334455667788ULL;
-                               __asm__ __volatile__ ("sync");
-
-                               /* disable injects */
-                               ddr->ecc_err_inject &= ~ECC_ERR_INJECT_EIEN;
-                               __asm__ __volatile__ ("sync");
-                               __asm__ __volatile__ ("isync");
-
-                               /* read data, this generates ECC error */
-                               val64 = *i;
-                               __asm__ __volatile__ ("sync");
-
-                               /* disable errors for ECC */
-                               ddr->err_disable |= ~ECC_ERROR_ENABLE;
-                               __asm__ __volatile__ ("sync");
-                               __asm__ __volatile__ ("isync");
-
-                               /* re-initialize memory, write the location again
-                                * NOT injecting errors this time */
-                               *i = 0xcafecafecafecafeULL;
-                               __asm__ __volatile__ ("sync");
-
-                               /* enable errors for ECC */
-                               ddr->err_disable &= ECC_ERROR_ENABLE;
-                               __asm__ __volatile__ ("sync");
-                               __asm__ __volatile__ ("isync");
-                       }
-
-                       icache_enable();
-                       enable_interrupts();
-
-                       return 0;
-               }
-       }
-
-       printf ("Usage:\n%s\n", cmdtp->usage);
-       return 1;
-}
-
-U_BOOT_CMD(
-       ecc,     4,     0,      do_ecc,
-       "ecc     - support for DDR ECC features\n",
-       "status              - print out status info\n"
-       "ecc captureclear        - clear capture regs data\n"
-       "ecc sbecnt <val>        - set Single-Bit Error counter\n"
-       "ecc sbethr <val>        - set Single-Bit Threshold\n"
-       "ecc errdisable <flag>   - clear/set disable Memory Error Disable, flag:\n"
-       "  [-|+]sbe - Single-Bit Error\n"
-       "  [-|+]mbe - Multiple-Bit Error\n"
-       "  [-|+]mse - Memory Select Error\n"
-       "  [-|+]all - all errors\n"
-       "ecc errdetectclr <flag> - clear Memory Error Detect, flag:\n"
-       "  mme - Multiple Memory Errors\n"
-       "  sbe - Single-Bit Error\n"
-       "  mbe - Multiple-Bit Error\n"
-       "  mse - Memory Select Error\n"
-       "  all - all errors\n"
-       "ecc injectdatahi <hi>  - set Memory Data Path Error Injection Mask High\n"
-       "ecc injectdatalo <lo>  - set Memory Data Path Error Injection Mask Low\n"
-       "ecc injectecc <ecc>    - set ECC Error Injection Mask\n"
-       "ecc inject <en|dis>    - enable/disable error injection\n"
-       "ecc mirror <en|dis>    - enable/disable mirror byte\n"
-       "ecc test <addr> <cnt>  - test mem region:\n"
-       "  - enables injects\n"
-       "  - writes pattern injecting errors\n"
-       "  - disables injects\n"
-       "  - reads pattern back, generates error\n"
-       "  - re-inits memory"
-);
-#endif /* if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD) */
-
 #if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
 void
 ft_board_setup(void *blob, bd_t *bd)
index 1901fdc..79f1765 100644 (file)
@@ -29,9 +29,3 @@ sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
 ifndef TEXT_BASE
 TEXT_BASE  =   0xFEF00000
 endif
-
-ifneq ($(OBJTREE),$(SRCTREE))
-# We are building u-boot in a separate directory, use generated
-# .lds script from OBJTREE directory.
-LDSCRIPT := $(OBJTREE)/board/$(BOARDDIR)/u-boot.lds
-endif
index 562eb8b..3fa093d 100644 (file)
@@ -1,8 +1,6 @@
 /*
  * 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.
@@ -19,7 +17,6 @@
 #include <i2c.h>
 #include <spd.h>
 #include <miiphy.h>
-#include <command.h>
 #if defined(CONFIG_PCI)
 #include <pci.h>
 #endif
@@ -30,8 +27,7 @@
 #endif
 #if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
-#endif
-#if defined(CONFIG_OF_LIBFDT)
+#elif defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #include <libfdt_env.h>
 #endif
@@ -103,7 +99,9 @@ int board_early_init_f(void)
 
        /* Disable G1TXCLK, G2TXCLK h/w buffers (rev.2 h/w bug workaround) */
        if (immr->sysconf.spridr == SPR_8360_REV20 ||
-           immr->sysconf.spridr == SPR_8360E_REV20)
+           immr->sysconf.spridr == SPR_8360E_REV20 ||
+           immr->sysconf.spridr == SPR_8360_REV21 ||
+           immr->sysconf.spridr == SPR_8360E_REV21)
                bcsr[0xe] = 0x30;
 
        return 0;
@@ -287,381 +285,6 @@ void sdram_init(void)
 }
 #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_LIBFDT)) \
      && defined(CONFIG_OF_BOARD_SETUP)
 
@@ -681,11 +304,11 @@ ft_board_setup(void *blob, bd_t *bd)
        int nodeoffset;
        int tmp[2];
 
-       nodeoffset = fdt_path_offset (fdt, "/memory");
+       nodeoffset = fdt_find_node_by_path(blob, "/memory");
        if (nodeoffset >= 0) {
                tmp[0] = cpu_to_be32(bd->bi_memstart);
                tmp[1] = cpu_to_be32(bd->bi_memsize);
-               fdt_setprop(fdt, nodeoffset, "reg", tmp, sizeof(tmp));
+               fdt_setprop(blob, nodeoffset, "reg", tmp, sizeof(tmp));
        }
 #else
        u32 *p;
index 158effe..8f90471 100644 (file)
@@ -20,8 +20,7 @@
 #include <i2c.h>
 #if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
-#endif
-#if defined(CONFIG_OF_LIBFDT)
+#elif defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #include <libfdt_env.h>
 #endif
@@ -207,7 +206,7 @@ void pci_init_board(void)
 
        /* Switch temporarily to I2C bus #2 */
        orig_i2c_bus = i2c_get_bus_num();
-       i2c_set_bus_num(1);
+       i2c_set_bus_num(1);
 
        val8 = 0;
        i2c_write(0x23, 0x6, 1, &val8, 1);
@@ -311,26 +310,25 @@ ft_pci_setup(void *blob, bd_t *bd)
        int err;
        int tmp[2];
 
-       nodeoffset = fdt_path_offset (fdt, "/" OF_SOC "/pci@8500");
+       nodeoffset = fdt_find_node_by_path(blob, "/" OF_SOC "/pci@8500");
        if (nodeoffset >= 0) {
                tmp[0] = cpu_to_be32(hose[0].first_busno);
                tmp[1] = cpu_to_be32(hose[0].last_busno);
-               err = fdt_setprop(fdt, nodeoffset, "bus-range", tmp, sizeof(tmp));
+               err = fdt_setprop(blob, nodeoffset, "bus-range", tmp, sizeof(tmp));
        }
 }
-#endif                         /* CONFIG_OF_LIBFDT */
-#ifdef CONFIG_OF_FLAT_TREE
+#elif defined(CONFIG_OF_FLAT_TREE)
 void
 ft_pci_setup(void *blob, bd_t *bd)
 {
-               u32 *p;
-               int len;
+       u32 *p;
+       int len;
 
-               p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
-               if (p != NULL) {
+       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 */
index bb96f77..2329970 100644 (file)
@@ -29,7 +29,7 @@ LIB   = $(obj)lib$(CPU).a
 
 START  = start.o
 COBJS  = traps.o cpu.o cpu_init.o speed.o interrupts.o \
-         spd_sdram.o qe_io.o pci.o
+         spd_sdram.o ecc.o qe_io.o pci.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
index 841fe82..adf8083 100644 (file)
@@ -33,8 +33,7 @@
 #include <asm/processor.h>
 #if defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
-#endif
-#if defined(CONFIG_OF_LIBFDT)
+#elif defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #include <libfdt_env.h>
 #endif
@@ -113,12 +112,14 @@ int checkcpu(void)
        case SPR_8360E_REV11:
        case SPR_8360E_REV12:
        case SPR_8360E_REV20:
+       case SPR_8360E_REV21:
                puts("MPC8360E, ");
                break;
        case SPR_8360_REV10:
        case SPR_8360_REV11:
        case SPR_8360_REV12:
        case SPR_8360_REV20:
+       case SPR_8360_REV21:
                puts("MPC8360, ");
                break;
        case SPR_8323E_REV10:
@@ -150,7 +151,8 @@ int checkcpu(void)
                puts("MPC8313E, ");
                break;
        default:
-               puts("Rev: Unknown revision number.\nWarning: Unsupported cpu revision!\n");
+               printf("Rev: Unknown revision number:%08x\n"
+                       "Warning: Unsupported cpu revision!\n",spridr);
                return 0;
        }
 
@@ -329,154 +331,167 @@ void watchdog_reset (void)
 /*
  * "Setter" functions used to add/modify FDT entries.
  */
-static int fdt_set_eth0(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+static int fdt_set_eth0(void *blob, int nodeoffset, const char *name, bd_t *bd)
 {
        /*
         * Fix it up if it exists, don't create it if it doesn't exist.
         */
-       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
-               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enetaddr, 6);
+       if (fdt_get_property(blob, nodeoffset, name, 0)) {
+               return fdt_setprop(blob, nodeoffset, name, bd->bi_enetaddr, 6);
        }
-       return -FDT_ERR_NOTFOUND;
+       return 0;
 }
 #ifdef CONFIG_HAS_ETH1
 /* second onboard ethernet port */
-static int fdt_set_eth1(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+static int fdt_set_eth1(void *blob, int nodeoffset, const char *name, bd_t *bd)
 {
        /*
         * Fix it up if it exists, don't create it if it doesn't exist.
         */
-       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
-               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet1addr, 6);
+       if (fdt_get_property(blob, nodeoffset, name, 0)) {
+               return fdt_setprop(blob, nodeoffset, name, bd->bi_enet1addr, 6);
        }
-       return -FDT_ERR_NOTFOUND;
+       return 0;
 }
 #endif
 #ifdef CONFIG_HAS_ETH2
 /* third onboard ethernet port */
-static int fdt_set_eth2(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+static int fdt_set_eth2(void *blob, int nodeoffset, const char *name, bd_t *bd)
 {
        /*
         * Fix it up if it exists, don't create it if it doesn't exist.
         */
-       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
-               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet2addr, 6);
+       if (fdt_get_property(blob, nodeoffset, name, 0)) {
+               return fdt_setprop(blob, nodeoffset, name, bd->bi_enet2addr, 6);
        }
-       return -FDT_ERR_NOTFOUND;
+       return 0;
 }
 #endif
 #ifdef CONFIG_HAS_ETH3
 /* fourth onboard ethernet port */
-static int fdt_set_eth3(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+static int fdt_set_eth3(void *blob, int nodeoffset, const char *name, bd_t *bd)
 {
        /*
         * Fix it up if it exists, don't create it if it doesn't exist.
         */
-       if (fdt_get_property(fdt, nodeoffset, name, 0)) {
-               return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet3addr, 6);
+       if (fdt_get_property(blob, nodeoffset, name, 0)) {
+               return fdt_setprop(blob, nodeoffset, name, bd->bi_enet3addr, 6);
        }
-       return -FDT_ERR_NOTFOUND;
+       return 0;
 }
 #endif
 
-static int fdt_set_busfreq(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+static int fdt_set_busfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
 {
        u32  tmp;
        /*
         * Create or update the property.
         */
        tmp = cpu_to_be32(bd->bi_busfreq);
-       return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
+       return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
+}
+
+static int fdt_set_tbfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
+{
+       u32  tmp;
+       /*
+        * Create or update the property.
+        */
+       tmp = cpu_to_be32(OF_TBCLK);
+       return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
 }
 
+
 /*
- * Fixups to the fdt.  If "create" is TRUE, the node is created
- * unconditionally.  If "create" is FALSE, the node is updated
- * only if it already exists.
+ * Fixups to the fdt.
  */
 static const struct {
        char *node;
        char *prop;
-       int (*set_fn)(void *fdt, int nodeoffset, const char *name, bd_t *bd);
+       int (*set_fn)(void *blob, int nodeoffset, const char *name, bd_t *bd);
 } fixup_props[] = {
        {       "/cpus/" OF_CPU,
-                "bus-frequency",
-               fdt_set_busfreq
+               "timebase-frequency",
+               fdt_set_tbfreq
        },
-       {       "/cpus/" OF_SOC,
+       {       "/cpus/" OF_CPU,
                "bus-frequency",
                fdt_set_busfreq
        },
-       {       "/" OF_SOC "/serial@4500/",
+       {       "/cpus/" OF_CPU,
+               "clock-frequency",
+               fdt_set_busfreq
+       },
+       {       "/" OF_SOC "/serial@4500",
                "clock-frequency",
                fdt_set_busfreq
        },
-       {       "/" OF_SOC "/serial@4600/",
+       {       "/" OF_SOC "/serial@4600",
                "clock-frequency",
                fdt_set_busfreq
        },
 #ifdef CONFIG_TSEC1
-       {       "/" OF_SOC "/ethernet@24000,
+       {       "/" OF_SOC "/ethernet@24000",
                "mac-address",
                fdt_set_eth0
        },
-       {       "/" OF_SOC "/ethernet@24000,
+       {       "/" OF_SOC "/ethernet@24000",
                "local-mac-address",
                fdt_set_eth0
        },
 #endif
 #ifdef CONFIG_TSEC2
-       {       "/" OF_SOC "/ethernet@25000,
+       {       "/" OF_SOC "/ethernet@25000",
                "mac-address",
                fdt_set_eth1
        },
-       {       "/" OF_SOC "/ethernet@25000,
+       {       "/" OF_SOC "/ethernet@25000",
                "local-mac-address",
                fdt_set_eth1
        },
 #endif
 #ifdef CONFIG_UEC_ETH1
 #if CFG_UEC1_UCC_NUM == 0  /* UCC1 */
-       {       "/" OF_QE "/ucc@2000/mac-address",
+       {       "/" OF_QE "/ucc@2000",
                "mac-address",
                fdt_set_eth0
        },
-       {       "/" OF_QE "/ucc@2000/mac-address",
+       {       "/" OF_QE "/ucc@2000",
                "local-mac-address",
                fdt_set_eth0
        },
 #elif CFG_UEC1_UCC_NUM == 2  /* UCC3 */
-       {       "/" OF_QE "/ucc@2200/mac-address",
+       {       "/" OF_QE "/ucc@2200",
                "mac-address",
                fdt_set_eth0
        },
-       {       "/" OF_QE "/ucc@2200/mac-address",
+       {       "/" OF_QE "/ucc@2200",
                "local-mac-address",
                fdt_set_eth0
        },
 #endif
-#endif
+#endif /* CONFIG_UEC_ETH1 */
 #ifdef CONFIG_UEC_ETH2
 #if CFG_UEC2_UCC_NUM == 1  /* UCC2 */
-       {       "/" OF_QE "/ucc@3000/mac-address",
+       {       "/" OF_QE "/ucc@3000",
                "mac-address",
                fdt_set_eth1
        },
-       {       "/" OF_QE "/ucc@3000/mac-address",
+       {       "/" OF_QE "/ucc@3000",
                "local-mac-address",
                fdt_set_eth1
        },
 #elif CFG_UEC1_UCC_NUM == 3  /* UCC4 */
-       {       "/" OF_QE "/ucc@3200/mac-address",
+       {       "/" OF_QE "/ucc@3200",
                "mac-address",
                fdt_set_eth1
        },
-       {       "/" OF_QE "/ucc@3200/mac-address",
+       {       "/" OF_QE "/ucc@3200",
                "local-mac-address",
                fdt_set_eth1
        },
 #endif
-#endif
+#endif /* CONFIG_UEC_ETH2 */
 };
 
 void
@@ -487,20 +502,23 @@ ft_cpu_setup(void *blob, bd_t *bd)
        int  j;
 
        for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) {
-               nodeoffset = fdt_path_offset(fdt, fixup_props[j].node);
+               nodeoffset = fdt_find_node_by_path(blob, fixup_props[j].node);
                if (nodeoffset >= 0) {
-                       err = (*fixup_props[j].set_fn)(blob, nodeoffset, fixup_props[j].prop, bd);
+                       err = fixup_props[j].set_fn(blob, nodeoffset,
+                                                   fixup_props[j].prop, bd);
                        if (err < 0)
-                               printf("set_fn/libfdt: %s %s returned %s\n",
+                               debug("Problem setting %s = %s: %s\n",
                                        fixup_props[j].node,
                                        fixup_props[j].prop,
                                        fdt_strerror(err));
+               } else {
+                       debug("Couldn't find %s: %s\n",
+                               fixup_props[j].node,
+                               fdt_strerror(nodeoffset));
                }
        }
 }
-#endif
-
-#if defined(CONFIG_OF_FLAT_TREE)
+#elif defined(CONFIG_OF_FLAT_TREE)
 void
 ft_cpu_setup(void *blob, bd_t *bd)
 {
index 3ac9161..7224979 100644 (file)
@@ -83,20 +83,30 @@ void cpu_init_f (volatile immap_t * im)
        im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (CFG_SPCR_TSEC2EP << SPCR_TSEC2EP_SHIFT);
 #endif
 
-#ifdef CONFIG_MPC834X
 #ifdef CFG_SCCR_TSEC1CM
        /* TSEC1 clock mode */
        im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (CFG_SCCR_TSEC1CM << SCCR_TSEC1CM_SHIFT);
 #endif
+
 #ifdef CFG_SCCR_TSEC2CM
        /* TSEC2 & I2C1 clock mode */
        im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (CFG_SCCR_TSEC2CM << SCCR_TSEC2CM_SHIFT);
 #endif
+
+#ifdef CFG_SCCR_TSEC1ON
+       /* TSEC1 clock switch */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1ON) | (CFG_SCCR_TSEC1ON << SCCR_TSEC1ON_SHIFT);
+#endif
+
+#ifdef CFG_SCCR_TSEC2ON
+       /* TSEC2 clock switch */
+       im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2ON) | (CFG_SCCR_TSEC2ON << SCCR_TSEC2ON_SHIFT);
+#endif
+
 #ifdef CFG_SCCR_USBMPHCM
        /* USB MPH clock mode */
        im->clk.sccr = (im->clk.sccr & ~SCCR_USBMPHCM) | (CFG_SCCR_USBMPHCM << SCCR_USBMPHCM_SHIFT);
 #endif
-#endif /* CONFIG_MPC834X */
 
 #ifdef CFG_SCCR_PCICM
        /* PCI & DMA clock mode */
@@ -247,3 +257,39 @@ int cpu_init_r (void)
 #endif
        return 0;
 }
+
+/*
+ * Figure out the cause of the reset
+ */
+int prt_83xx_rsr(void)
+{
+       static struct {
+               ulong mask;
+               char *desc;
+       } bits[] = {
+               {
+               RSR_SWSR, "Software Soft"}, {
+               RSR_SWHR, "Software Hard"}, {
+               RSR_JSRS, "JTAG Soft"}, {
+               RSR_CSHR, "Check Stop"}, {
+               RSR_SWRS, "Software Watchdog"}, {
+               RSR_BMRS, "Bus Monitor"}, {
+               RSR_SRS,  "External/Internal Soft"}, {
+               RSR_HRS,  "External/Internal Hard"}
+       };
+       static int n = sizeof bits / sizeof bits[0];
+       ulong rsr = gd->reset_status;
+       int i;
+       char *sep;
+
+       puts("Reset Status:");
+
+       sep = " ";
+       for (i = 0; i < n; i++)
+               if (rsr & bits[i].mask) {
+                       printf("%s%s", sep, bits[i].desc);
+                       sep = ", ";
+               }
+       puts("\n\n");
+       return 0;
+}
diff --git a/cpu/mpc83xx/ecc.c b/cpu/mpc83xx/ecc.c
new file mode 100644 (file)
index 0000000..6f13094
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@freescale.com>
+ * based on the contribution of Marian Balakowicz <m8@semihalf.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <common.h>
+#include <mpc83xx.h>
+#include <command.h>
+
+#if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD)
+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
index 785d612..2298218 100644 (file)
 
 #include <common.h>
 #include <pci.h>
+
+#if defined(CONFIG_OF_LIBFDT)
+#include <libfdt.h>
+#include <libfdt_env.h>
+#elif defined(CONFIG_OF_FLAT_TREE)
 #include <ft_build.h>
+#endif
+
 #include <asm/mpc8349_pci.h>
 
 #ifdef CONFIG_83XX_GENERIC_PCI
@@ -163,7 +170,34 @@ void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot)
                pci_init_bus(i, reg[i]);
 }
 
-#ifdef CONFIG_OF_FLAT_TREE
+#if defined(CONFIG_OF_LIBFDT)
+void ft_pci_setup(void *blob, bd_t *bd)
+{
+       int nodeoffset;
+       int err;
+       int tmp[2];
+
+       if (pci_num_buses < 1)
+               return;
+
+       nodeoffset = fdt_find_node_by_path(blob, "/" OF_SOC "/pci@8500");
+       if (nodeoffset >= 0) {
+               tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
+               tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
+               err = fdt_setprop(blob, nodeoffset, "bus-range", tmp, sizeof(tmp));
+       }
+
+       if (pci_num_buses < 2)
+               return;
+
+       nodeoffset = fdt_find_node_by_path(blob, "/" OF_SOC "/pci@8600");
+       if (nodeoffset >= 0) {
+               tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
+               tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
+               err = fdt_setprop(blob, nodeoffset, "bus-range", tmp, sizeof(tmp));
+       }
+}
+#elif CONFIG_OF_FLAT_TREE
 void ft_pci_setup(void *blob, bd_t *bd)
 {
        u32 *p;
index 647813f..2c17cee 100644 (file)
@@ -574,7 +574,10 @@ long int spd_sdram()
 
        /* Check DIMM data bus width */
        if (spd.dataw_lsb == 0x20) {
-               burstlen = 0x03; /* 32 bit data bus, burst len is 8 */
+               if (spd.mem_type == SPD_MEMTYPE_DDR)
+                       burstlen = 0x03; /* 32 bit data bus, burst len is 8 */
+               if (spd.mem_type == SPD_MEMTYPE_DDR2)
+                       burstlen = 0x02; /* 32 bit data bus, burst len is 4 */
                printf("\n   DDR DIMM: data bus width is 32 bit");
        } else {
                burstlen = 0x02; /* Others act as 64 bit bus, burst len is 4 */
@@ -730,8 +733,12 @@ long int spd_sdram()
                sdram_cfg |= 0x10000000;
 
        /* The DIMM is 32bit width */
-       if (spd.dataw_lsb == 0x20)
-               sdram_cfg |= 0x000C0000;
+       if (spd.dataw_lsb == 0x20) {
+               if (spd.mem_type == SPD_MEMTYPE_DDR)
+                       sdram_cfg |= 0x000C0000;
+               if (spd.mem_type == SPD_MEMTYPE_DDR2)
+                       sdram_cfg |= 0x00080000;
+       }
 
        ddrc_ecc_enable = 0;
 
diff --git a/doc/README.mpc8323erdb b/doc/README.mpc8323erdb
new file mode 100644 (file)
index 0000000..6f89829
--- /dev/null
@@ -0,0 +1,71 @@
+Freescale MPC8323ERDB Board
+-----------------------------------------
+
+1.     Memory Map
+       The memory map looks like this:
+
+       0x0000_0000     0x03ff_ffff     DDR              64M
+       0x8000_0000     0x8fff_ffff     PCI MEM          256M
+       0x9000_0000     0x9fff_ffff     PCI_MMIO         256M
+       0xe000_0000     0xe00f_ffff     IMMR             1M
+       0xd000_0000     0xd3ff_ffff     PCI IO           64M
+       0xfe00_0000     0xfeff_ffff     NOR FLASH (CS0)  16M
+
+2.     Compilation
+
+       Assuming you're using BASH (or similar) as your shell:
+
+       export CROSS_COMPILE=your-cross-compiler-prefix-
+       make distclean
+       make MPC8323ERDB_config
+       make
+
+3.     Downloading and Flashing Images
+
+3.1    Reflash U-boot Image using U-boot
+
+       N.b, have an alternate means of programming
+       the flash available if the new u-boot doesn't boot.
+
+       First try a:
+
+       tftpboot $loadaddr $uboot
+
+       to make sure that the TFTP load will succeed before
+       an erase goes ahead and wipes out your current firmware.
+       Then do a:
+
+       run tftpflash
+
+       which is a shorter version of the manual sequence:
+
+       tftp $loadaddr u-boot.bin
+       protect off fe000000 +$filesize
+       erase fe000000 +$filesize
+       cp.b $loadaddr fe000000 $filesize
+
+       To keep your old u-boot's environment variables, do a:
+
+       saveenv
+
+       prior to resetting the board.
+
+3.2    Downloading and Booting Linux Kernel
+
+       Ensure that all networking-related environment variables are set
+       properly (including ipaddr, serverip, gatewayip (if needed),
+       netmask, ethaddr, eth1addr, rootpath (if using NFS root),
+       fdtfile, and bootfile).
+
+       Then, do one of the following, depending on whether you
+       want an NFS root or a ramdisk root:
+
+       run nfsboot
+
+       or
+
+       run ramboot
+
+4      Notes
+
+       The console baudrate for MPC8323ERDB is 115200bps.
index c87469f..5f20247 100644 (file)
@@ -21,7 +21,13 @@ Freescale MPC8360EMDS Board
        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
+1.1    There are three type boards for MPC8360E silicon up to now, They are
+
+       * MPC8360E-MDS-PB PROTO (a.k.a 8360SYS PROTOTYPE)
+       * MPC8360E-MDS-PB PILOT (a.k.a 8360SYS PILOT)
+       * MPC8360EA-MDS-PB PROTO (a.k.a 8360SYS2 PROTOTYPE)
+
+1.2    For all the MPC8360EMDS Board
 
        First, make sure the board default setting is consistent with the
        document shipped with your board. Then apply the following setting:
@@ -33,6 +39,21 @@ Freescale MPC8360EMDS Board
        JP6 1-2
        on board Oscillator: 66M
 
+1.3    Since different board/chip rev. combinations have AC timing issues,
+       u-boot forces RGMII-ID (RGMII with Internal Delay) mode on by default
+       by the patch (mpc83xx: Disable G1TXCLK, G2TXCLK h/w buffers).
+
+       When the rev2.x silicon mount on these boards, and if you are using
+       u-boot version after this patch, to make the ethernet interfaces usable,
+       and to enable RGMII-ID on your board, you have to setup the jumpers
+       correctly.
+
+       * MPC8360E-MDS-PB PROTO
+         nothing to do
+       * MPC8360E-MDS-PB PILOT
+         JP9 and JP8 should be ON
+       * MPC8360EA-MDS-PB PROTO
+         JP2 and JP3 should be ON
 
 2.     Memory Map
 
similarity index 62%
rename from doc/README.mpc8349emds.ddrecc
rename to doc/README.mpc83xx.ddrecc
index eb249c3..0029f08 100644 (file)
@@ -15,10 +15,10 @@ IMPORTANT NOTICE: enabling injecting multiple-bit errors is potentially
 dangerous as such errors are NOT corrected by the controller. Therefore caution
 should be taken when enabling the injection of multiple-bit errors: it is only
 safe when used on a carefully selected memory area and used under control of
-the 'ecc test' command (see example 'Injecting Multiple-Bit Errors' below). In
-particular, when you simply set the multiple-bit errors in inject mask and
-enable injection, U-Boot is very likely to hang quickly as the errors will be
-injected when it accesses its code, data etc.
+the 'ecc testdw' 'ecc testword' command (see example 'Injecting Multiple-Bit
+Errors' below). In particular, when you simply set the multiple-bit errors in
+inject mask and enable injection, U-Boot is very likely to hang quickly as the
+errors will be injected when it accesses its code, data etc.
 
 
 Use cases for DDR 'ecc' command:
@@ -40,7 +40,7 @@ Injecting Single-Bit Errors
 
 2. Run test over some memory region
 
-=> ecc test 200000 10
+=> ecc testdw 200000 10
 
 3. Check ECC status
 
@@ -61,57 +61,57 @@ Memory Error Detect:
 16 errors were generated, Single-Bit Error flag was not set as Single Bit Error
 Counter did not reach  Single-Bit Error Threshold.
 
-4. Make sure used memory region got re-initialized with 0xcafecafe pattern
+4. Make sure used memory region got re-initialized with 0x0123456789abcdef
 
 => md 200000
-00200000: cafecafe cafecafe cafecafe cafecafe    ................
-00200010: cafecafe cafecafe cafecafe cafecafe    ................
-00200020: cafecafe cafecafe cafecafe cafecafe    ................
-00200030: cafecafe cafecafe cafecafe cafecafe    ................
-00200040: cafecafe cafecafe cafecafe cafecafe    ................
-00200050: cafecafe cafecafe cafecafe cafecafe    ................
-00200060: cafecafe cafecafe cafecafe cafecafe    ................
-00200070: cafecafe cafecafe cafecafe cafecafe    ................
+00200000: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200010: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200020: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200030: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200040: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200050: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200060: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200070: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
 00200080: deadbeef deadbeef deadbeef deadbeef    ................
 00200090: deadbeef deadbeef deadbeef deadbeef    ................
 
-
 Injecting Multiple-Bit Errors
 -----------------------------
 
 1. Set more than 1 bit in Data Path Error Inject Mask
 
-=> ecc injectdatahi 5
+=> ecc injectdatahi 1
+=> ecc injectdatalo 1
 
 2. Run test over some memory region
 
-=> ecc test 200000 10
+=> ecc testword 200000 1
 
 3. Check ECC status
 
 => ecc status
 ...
-Memory Data Path Error Injection Mask High/Low: 00000005 00000000
+Memory Data Path Error Injection Mask High/Low: 00000001 00000001
 ...
 Memory Error Detect:
-  Multiple Memory Errors: 1
+  Multiple Memory Errors: 0
   Multiple-Bit Error: 1
   Single-Bit Error: 0
 ...
 
-Observe that both Multiple Memory Errors and Multiple-Bit Error flags are set.
+The Multiple Memory Errors flags not set and Multiple-Bit Error flags are set.
 
-4. Make sure used memory region got re-initialized with 0xcafecafe pattern
+4. Make sure used memory region got re-initialized with 0x0123456789abcdef
 
 => md 200000
-00200000: cafecafe cafecafe cafecafe cafecafe    ................
-00200010: cafecafe cafecafe cafecafe cafecafe    ................
-00200020: cafecafe cafecafe cafecafe cafecafe    ................
-00200030: cafecafe cafecafe cafecafe cafecafe    ................
-00200040: cafecafe cafecafe cafecafe cafecafe    ................
-00200050: cafecafe cafecafe cafecafe cafecafe    ................
-00200060: cafecafe cafecafe cafecafe cafecafe    ................
-00200070: cafecafe cafecafe cafecafe cafecafe    ................
+00200000: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200010: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200020: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200030: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200040: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200050: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200060: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
+00200070: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
 00200080: deadbeef deadbeef deadbeef deadbeef    ................
 00200090: deadbeef deadbeef deadbeef deadbeef    ................
 
@@ -140,7 +140,7 @@ Test Single-Bit Error Counter and Threshold
 ...
 Memory Single-Bit Error Management (0..255):
   Single-Bit Error Threshold: 255
-  Single Bit Error Counter: 60
+  Single Bit Error Counter: 199
 
 Memory Error Detect:
   Multiple Memory Errors: 1
index ebae5af..22485ea 100644 (file)
@@ -69,9 +69,10 @@ i2c_init(int speed, int slaveadd)
        dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET);
 
        writeb(0, &dev->cr);                    /* stop I2C controller */
+       udelay(5);                              /* let it shutdown in peace */
        writeb(0x3F, &dev->fdr);                /* set bus speed */
        writeb(0x3F, &dev->dfsrr);              /* set default filter */
-       writeb(slaveadd, &dev->adr);            /* write slave address */
+       writeb(slaveadd << 1, &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 */
index 5f20962..0f5232a 100644 (file)
@@ -98,7 +98,7 @@ static void qe_sdma_init(void)
        out_be32(&p->sdaqmr, 0);
 
        /* Allocate 2KB temporary buffer for sdma */
-       sdma_buffer_base = qe_muram_alloc(2048, 64);
+       sdma_buffer_base = qe_muram_alloc(2048, 4096);
        out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK);
 
        /* Clear sdma status */
index 0bcd0a9..400b1a6 100644 (file)
@@ -29,7 +29,7 @@
 #define QE_NUM_OF_BRGS 16
 #define UCC_MAX_NUM    8
 
-#define QE_DATAONLY_BASE       (uint)(128)
+#define QE_DATAONLY_BASE       0
 #define QE_DATAONLY_SIZE       (QE_MURAM_SIZE - QE_DATAONLY_BASE)
 
 /* QE threads SNUM
index 229e64b..27a660a 100644 (file)
@@ -529,6 +529,8 @@ void        cpu_init_f    (void);
 int    cpu_init_r    (void);
 #if defined(CONFIG_8260)
 int    prt_8260_rsr  (void);
+#elif defined(CONFIG_MPC83XX)
+int    prt_83xx_rsr  (void);
 #endif
 
 /* $(CPU)/interrupts.c */
diff --git a/include/configs/MPC8323ERDB.h b/include/configs/MPC8323ERDB.h
new file mode 100644 (file)
index 0000000..376973b
--- /dev/null
@@ -0,0 +1,583 @@
+/*
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#undef DEBUG
+
+/*
+ * High Level Configuration Options
+ */
+#define CONFIG_E300            1       /* E300 family */
+#define CONFIG_QE              1       /* Has QE */
+#define CONFIG_MPC83XX         1       /* MPC83xx family */
+#define CONFIG_MPC832X         1       /* MPC832x CPU specific */
+
+#define CONFIG_PCI             1
+#define CONFIG_83XX_GENERIC_PCI        1
+
+/*
+ * System Clock Setup
+ */
+#define CONFIG_83XX_CLKIN      66666667        /* in Hz */
+
+#ifndef CONFIG_SYS_CLK_FREQ
+#define CONFIG_SYS_CLK_FREQ    CONFIG_83XX_CLKIN
+#endif
+
+/*
+ * Hardware Reset Configuration Word
+ */
+#define CFG_HRCW_LOW (\
+       HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
+       HRCWL_DDR_TO_SCB_CLK_2X1 |\
+       HRCWL_VCO_1X2 |\
+       HRCWL_CSB_TO_CLKIN_2X1 |\
+       HRCWL_CORE_TO_CSB_2_5X1 |\
+       HRCWL_CE_PLL_VCO_DIV_2 |\
+       HRCWL_CE_PLL_DIV_1X1 |\
+       HRCWL_CE_TO_PLL_1X3)
+
+#define CFG_HRCW_HIGH (\
+       HRCWH_PCI_HOST |\
+       HRCWH_PCI1_ARBITER_ENABLE |\
+       HRCWH_CORE_ENABLE |\
+       HRCWH_FROM_0X00000100 |\
+       HRCWH_BOOTSEQ_DISABLE |\
+       HRCWH_SW_WATCHDOG_DISABLE |\
+       HRCWH_ROM_LOC_LOCAL_16BIT |\
+       HRCWH_BIG_ENDIAN |\
+       HRCWH_LALE_NORMAL)
+
+/*
+ * System IO Config
+ */
+#define CFG_SICRL              0x00000000
+
+#define CONFIG_BOARD_EARLY_INIT_F      /* call board_pre_init */
+
+/*
+ * IMMR new address
+ */
+#define CFG_IMMR               0xE0000000
+
+/*
+ * DDR Setup
+ */
+#define CFG_DDR_BASE           0x00000000      /* DDR is system memory */
+#define CFG_SDRAM_BASE         CFG_DDR_BASE
+#define CFG_DDR_SDRAM_BASE     CFG_DDR_BASE
+#define CFG_DDRCDR             0x73000002      /* DDR II voltage is 1.8V */
+
+#undef CONFIG_SPD_EEPROM
+#if defined(CONFIG_SPD_EEPROM)
+/* Determine DDR configuration from I2C interface
+ */
+#define SPD_EEPROM_ADDRESS     0x51    /* DDR SODIMM */
+#else
+/* Manually set up DDR parameters
+ */
+#define CFG_DDR_SIZE           64      /* MB */
+#define CFG_DDR_CS0_CONFIG     0x80840101
+#define CFG_DDR_TIMING_0       0x00220802
+#define CFG_DDR_TIMING_1       0x3935d322
+#define CFG_DDR_TIMING_2       0x0f9048ca
+#define CFG_DDR_TIMING_3       0x00000000
+#define CFG_DDR_CLK_CNTL       0x02000000
+#define CFG_DDR_MODE           0x44400232
+#define CFG_DDR_MODE2          0x8000c000
+#define CFG_DDR_INTERVAL       0x03200064
+#define CFG_DDR_CS0_BNDS       0x00000003
+#define CFG_DDR_SDRAM_CFG      0x43080000
+#define CFG_DDR_SDRAM_CFG2     0x00401000
+#endif
+
+/*
+ * Memory test
+ */
+#undef CFG_DRAM_TEST           /* memory test, takes time */
+#define CFG_MEMTEST_START      0x00030000      /* memtest region */
+#define CFG_MEMTEST_END                0x03f00000
+
+/*
+ * The reserved memory
+ */
+#define CFG_MONITOR_BASE       TEXT_BASE       /* start of monitor */
+
+#if (CFG_MONITOR_BASE < CFG_FLASH_BASE)
+#define CFG_RAMBOOT
+#else
+#undef  CFG_RAMBOOT
+#endif
+
+#define CFG_MONITOR_LEN                (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CFG_MALLOC_LEN         (128 * 1024)    /* Reserved for malloc */
+
+/*
+ * Initial RAM Base Address Setup
+ */
+#define CFG_INIT_RAM_LOCK      1
+#define CFG_INIT_RAM_ADDR      0xE6000000      /* Initial RAM address */
+#define CFG_INIT_RAM_END       0x1000          /* End of used area in RAM */
+#define CFG_GBL_DATA_SIZE      0x100           /* num bytes initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+
+/*
+ * Local Bus Configuration & Clock Setup
+ */
+#define CFG_LCRR               (LCRR_DBYP | LCRR_CLKDIV_2)
+#define CFG_LBC_LBCR           0x00000000
+
+/*
+ * FLASH on the Local Bus
+ */
+#define CFG_FLASH_CFI          /* use the Common Flash Interface */
+#define CFG_FLASH_CFI_DRIVER   /* use the CFI driver */
+#define CFG_FLASH_BASE         0xFE000000      /* FLASH base address */
+#define CFG_FLASH_SIZE         16      /* FLASH size is 16M */
+
+#define CFG_LBLAWBAR0_PRELIM   CFG_FLASH_BASE  /* Window base at flash base */
+#define CFG_LBLAWAR0_PRELIM    0x80000018      /* 32MB window size */
+
+#define CFG_BR0_PRELIM (CFG_FLASH_BASE |       /* Flash Base address */ \
+                       (2 << BR_PS_SHIFT) |    /* 16 bit port size */ \
+                       BR_V)                   /* valid */
+#define CFG_OR0_PRELIM         0xfe006ff7      /* 16MB Flash size */
+
+#define CFG_MAX_FLASH_BANKS    1               /* number of banks */
+#define CFG_MAX_FLASH_SECT     128             /* sectors per device */
+
+#undef CFG_FLASH_CHECKSUM
+
+/*
+ * SDRAM on the Local Bus
+ */
+#undef CFG_LB_SDRAM            /* The board has not SRDAM on local bus */
+
+#ifdef CFG_LB_SDRAM
+#define CFG_LBC_SDRAM_BASE     0xF0000000      /* SDRAM base address */
+#define CFG_LBC_SDRAM_SIZE     64              /* LBC SDRAM is 64MB */
+
+#define CFG_LBLAWBAR2_PRELIM   CFG_LBC_SDRAM_BASE
+#define CFG_LBLAWAR2_PRELIM    0x80000019      /* 64MB */
+
+/*local bus BR2, OR2 definition for SDRAM if soldered on the EPB board */
+/*
+ * Base Register 2 and Option Register 2 configure SDRAM.
+ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000.
+ *
+ * For BR2, need:
+ *    Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0
+ *    port size = 32-bits = BR2[19:20] = 11
+ *    no parity checking = BR2[21:22] = 00
+ *    SDRAM for MSEL = BR2[24:26] = 011
+ *    Valid = BR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861
+ *
+ * CFG_LBC_SDRAM_BASE should be masked and OR'ed into
+ * the top 17 bits of BR2.
+ */
+
+#define CFG_BR2_PRELIM 0xf0001861      /*Port size=32bit, MSEL=SDRAM */
+
+/*
+ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64.
+ *
+ * For OR2, need:
+ *    64MB mask for AM, OR2[0:7] = 1111 1100
+ *                 XAM, OR2[17:18] = 11
+ *    9 columns OR2[19-21] = 010
+ *    13 rows   OR2[23-25] = 100
+ *    EAD set for extra time OR[31] = 1
+ *
+ * 0    4    8    12   16   20   24   28
+ * 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901
+ */
+
+#define CFG_OR2_PRELIM 0xfc006901
+
+#define CFG_LBC_LSRT   0x32000000      /* LB sdram refresh timer, about 6us */
+#define CFG_LBC_MRTPR  0x20000000      /* LB refresh timer prescal, 266MHz/32 */
+
+/*
+ * LSDMR masks
+ */
+#define CFG_LBC_LSDMR_OP_NORMAL        (0 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ARFRSH        (1 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_SRFRSH        (2 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_MRW   (3 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_PCHALL        (5 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_ACTBNK        (6 << (31 - 4))
+#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4))
+
+#define CFG_LBC_LSDMR_COMMON   0x0063b723
+
+/*
+ * SDRAM Controller configuration sequence.
+ */
+#define CFG_LBC_LSDMR_1                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_PCHALL)
+#define CFG_LBC_LSDMR_2                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_3                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_ARFRSH)
+#define CFG_LBC_LSDMR_4                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_MRW)
+#define CFG_LBC_LSDMR_5                ( CFG_LBC_LSDMR_COMMON \
+                               | CFG_LBC_LSDMR_OP_NORMAL)
+
+#endif
+
+/*
+ * Windows to access PIB via local bus
+ */
+#define CFG_LBLAWBAR3_PRELIM   0xf8008000      /* windows base 0xf8008000 */
+#define CFG_LBLAWAR3_PRELIM    0x8000000f      /* windows size 64KB */
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX      1
+#undef CONFIG_SERIAL_SOFTWARE_FIFO
+#define CFG_NS16550
+#define CFG_NS16550_SERIAL
+#define CFG_NS16550_REG_SIZE   1
+#define CFG_NS16550_CLK                get_bus_freq(0)
+
+#define CFG_BAUDRATE_TABLE  \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200}
+
+#define CFG_NS16550_COM1       (CFG_IMMR+0x4500)
+#define CFG_NS16550_COM2       (CFG_IMMR+0x4600)
+
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history */
+/* Use the HUSH parser */
+#define CFG_HUSH_PARSER
+#ifdef CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2 "> "
+#endif
+
+/* pass open firmware flat tree */
+#define CONFIG_OF_LIBFDT       1
+#define CONFIG_OF_BOARD_SETUP  1
+
+#define OF_CPU                 "PowerPC,8323@0"
+#define OF_SOC                 "soc8323@e0000000"
+#define OF_QE                  "qe@e0100000"
+#define OF_TBCLK               (bd->bi_busfreq / 4)
+#define OF_STDOUT_PATH         "/soc8323@e0000000/serial@4500"
+
+/* I2C */
+#define CONFIG_HARD_I2C                /* I2C with hardware support */
+#undef CONFIG_SOFT_I2C         /* I2C bit-banged */
+#define CONFIG_FSL_I2C
+#define CFG_I2C_SPEED  400000  /* I2C speed and slave address */
+#define CFG_I2C_SLAVE  0x7F
+#define CFG_I2C_NOPROBES       {0x51}  /* Don't probe these addrs */
+#define CFG_I2C_OFFSET 0x3000
+
+/*
+ * Config on-board RTC
+ */
+#define CONFIG_RTC_DS1374              /* use ds1374 rtc via i2c */
+#define CFG_I2C_RTC_ADDR       0x68    /* at address 0x68 */
+
+/*
+ * General PCI
+ * Addresses are mapped 1-1.
+ */
+#define CFG_PCI1_MEM_BASE      0x80000000
+#define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
+#define CFG_PCI1_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI1_MMIO_BASE     0x90000000
+#define CFG_PCI1_MMIO_PHYS     CFG_PCI1_MMIO_BASE
+#define CFG_PCI1_MMIO_SIZE     0x10000000      /* 256M */
+#define CFG_PCI1_IO_BASE               0xd0000000
+#define CFG_PCI1_IO_PHYS               CFG_PCI1_IO_BASE
+#define CFG_PCI1_IO_SIZE               0x04000000      /* 64M */
+
+#ifdef CONFIG_PCI
+
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP         /* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_PCI_SCAN_SHOW    /* show pci devices on startup */
+#define CFG_PCI_SUBSYS_VENDORID        0x1957  /* Freescale */
+
+#endif /* CONFIG_PCI */
+
+
+#ifndef CONFIG_NET_MULTI
+#define CONFIG_NET_MULTI       1
+#endif
+
+/*
+ * QE UEC ethernet configuration
+ */
+#define CONFIG_UEC_ETH
+#define CONFIG_ETHPRIME                "Freescale GETH"
+
+#define CONFIG_UEC_ETH1                /* ETH3 */
+
+#ifdef CONFIG_UEC_ETH1
+#define CFG_UEC1_UCC_NUM       2       /* UCC3 */
+#define CFG_UEC1_RX_CLK                QE_CLK9
+#define CFG_UEC1_TX_CLK                QE_CLK10
+#define CFG_UEC1_ETH_TYPE      FAST_ETH
+#define CFG_UEC1_PHY_ADDR      4
+#define CFG_UEC1_INTERFACE_MODE        ENET_100_MII
+#endif
+
+#define CONFIG_UEC_ETH2                /* ETH4 */
+
+#ifdef CONFIG_UEC_ETH2
+#define CFG_UEC2_UCC_NUM       1       /* UCC2 */
+#define CFG_UEC2_RX_CLK                QE_CLK16
+#define CFG_UEC2_TX_CLK                QE_CLK3
+#define CFG_UEC2_ETH_TYPE      FAST_ETH
+#define CFG_UEC2_PHY_ADDR      0
+#define CFG_UEC2_INTERFACE_MODE        ENET_100_MII
+#endif
+
+/*
+ * Environment
+ */
+#ifndef CFG_RAMBOOT
+       #define CFG_ENV_IS_IN_FLASH     1
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE + 0x40000)
+       #define CFG_ENV_SECT_SIZE       0x40000 /* 256K(one sector) for env */
+       #define CFG_ENV_SIZE            0x2000
+#else
+       #define CFG_NO_FLASH            1       /* Flash is not usable now */
+       #define CFG_ENV_IS_NOWHERE      1       /* Store ENV in memory only */
+       #define CFG_ENV_ADDR            (CFG_MONITOR_BASE - 0x1000)
+       #define CFG_ENV_SIZE            0x2000
+#endif
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download */
+#define CFG_LOADS_BAUD_CHANGE  1       /* allow baudrate change */
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_BOOTFILESIZE
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_HOSTNAME
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_ASKENV
+
+#if defined(CONFIG_PCI)
+       #define CONFIG_CMD_PCI
+#endif
+#if defined(CFG_RAMBOOT)
+       #undef CONFIG_CMD_ENV
+       #undef CONFIG_CMD_LOADS
+#endif
+
+#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_CMD_KGDB)
+       #define CFG_CBSIZE      1024    /* Console I/O Buffer Size */
+#else
+       #define CFG_CBSIZE      256     /* Console I/O Buffer Size */
+#endif
+
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)  /* Print Buffer Size */
+#define CFG_MAXARGS    16              /* max number of command args */
+#define CFG_BARGSIZE   CFG_CBSIZE      /* Boot Argument Buffer Size */
+#define CFG_HZ         1000            /* decrementer freq: 1ms ticks */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
+
+/*
+ * Core HID Setup
+ */
+#define CFG_HID0_INIT          0x000000000
+#define CFG_HID0_FINAL         HID0_ENABLE_MACHINE_CHECK
+#define CFG_HID2               HID2_HBE
+
+/*
+ * Cache Config
+ */
+#define CFG_DCACHE_SIZE                16384
+#define CFG_CACHELINE_SIZE     32
+#if defined(CONFIG_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
+
+/* FLASH: icache cacheable, but dcache-inhibit and guarded */
+#define CFG_IBAT2L     (CFG_FLASH_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT2U     (CFG_FLASH_BASE | BATU_BL_32M | BATU_VS | BATU_VP)
+#define CFG_DBAT2L     (CFG_FLASH_BASE | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_DBAT2U     CFG_IBAT2U
+
+#define CFG_IBAT3L     (0)
+#define CFG_IBAT3U     (0)
+#define CFG_DBAT3L     CFG_IBAT3L
+#define CFG_DBAT3U     CFG_IBAT3U
+
+/* Stack in dcache: cacheable, no memory coherence */
+#define CFG_IBAT4L     (CFG_INIT_RAM_ADDR | BATL_PP_10)
+#define CFG_IBAT4U     (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+
+#ifdef CONFIG_PCI
+/* PCI MEM space: cacheable */
+#define CFG_IBAT5L     (CFG_PCI1_MEM_PHYS | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT5U     (CFG_PCI1_MEM_PHYS | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+/* PCI MMIO space: cache-inhibit and guarded */
+#define CFG_IBAT6L     (CFG_PCI1_MMIO_PHYS | BATL_PP_10 | \
+                       BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT6U     (CFG_PCI1_MMIO_PHYS | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#else
+#define CFG_IBAT5L     (0)
+#define CFG_IBAT5U     (0)
+#define CFG_IBAT6L     (0)
+#define CFG_IBAT6U     (0)
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#endif
+
+/* Nothing in BAT7 */
+#define CFG_IBAT7L     (0)
+#define CFG_IBAT7U     (0)
+#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_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
+
+#define CONFIG_ETHADDR 00:04:9f:ef:03:01
+#define CONFIG_HAS_ETH1                                /* add support for "eth1addr" */
+#define CONFIG_ETH1ADDR        00:04:9f:ef:03:02
+
+#define CONFIG_IPADDR          10.0.0.2
+#define CONFIG_SERVERIP                10.0.0.1
+#define CONFIG_GATEWAYIP       10.0.0.1
+#define CONFIG_NETMASK         255.0.0.0
+#define CONFIG_NETDEV          eth1
+
+#define CONFIG_HOSTNAME                mpc8323erdb
+#define CONFIG_ROOTPATH                /nfsroot
+#define CONFIG_RAMDISKFILE     rootfs.ext2.gz.uboot
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_UBOOTPATH       u-boot.bin      /* U-Boot image on TFTP server */
+#define CONFIG_FDTFILE         mpc832x_rdb.dtb
+
+#define CONFIG_LOADADDR                200000  /* default location for tftp and bootm */
+#define CONFIG_BOOTDELAY       -1      /* -1 disables auto-boot */
+#define CONFIG_BAUDRATE                115200
+
+#define XMK_STR(x)     #x
+#define MK_STR(x)      XMK_STR(x)
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "netdev=" MK_STR(CONFIG_NETDEV) "\0"                            \
+       "uboot=" MK_STR(CONFIG_UBOOTPATH) "\0"                          \
+       "tftpflash=tftp $loadaddr $uboot;"                              \
+               "protect off " MK_STR(TEXT_BASE) " +$filesize; "        \
+               "erase " MK_STR(TEXT_BASE) " +$filesize; "              \
+               "cp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize; "      \
+               "protect on " MK_STR(TEXT_BASE) " +$filesize; "         \
+               "cmp.b $loadaddr " MK_STR(TEXT_BASE) " $filesize\0"     \
+       "fdtaddr=400000\0"                                              \
+       "fdtfile=" MK_STR(CONFIG_FDTFILE) "\0"                          \
+       "ramdiskaddr=1000000\0"                                         \
+       "ramdiskfile=" MK_STR(CONFIG_RAMDISKFILE) "\0"                  \
+       "console=ttyS0\0"                                               \
+       "setbootargs=setenv bootargs "                                  \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0" \
+       "setipargs=setenv bootargs nfsroot=$serverip:$rootpath "        \
+               "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
+               "root=$rootdev rw console=$console,$baudrate $othbootargs\0"
+
+#define CONFIG_NFSBOOTCOMMAND                                          \
+       "setenv rootdev /dev/nfs;"                                      \
+       "run setbootargs;"                                              \
+       "run setipargs;"                                                \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND                                          \
+       "setenv rootdev /dev/ram;"                                      \
+       "run setbootargs;"                                              \
+       "tftp $ramdiskaddr $ramdiskfile;"                               \
+       "tftp $loadaddr $bootfile;"                                     \
+       "tftp $fdtaddr $fdtfile;"                                       \
+       "bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+#undef MK_STR
+#undef XMK_STR
+
+#endif /* __CONFIG_H */
index c3efb7b..661712b 100644 (file)
@@ -28,9 +28,6 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define DEBUG
-#undef DEBUG
-
 /*
  * High Level Configuration Options
  */
index 336c0ac..829dbf9 100644 (file)
@@ -86,6 +86,8 @@
 #define SPR_8360_REV12                 0x80490012
 #define SPR_8360E_REV20                        0x80480020
 #define SPR_8360_REV20                 0x80490020
+#define SPR_8360E_REV21                        0x80480021
+#define SPR_8360_REV21                 0x80490021
 
 #define SPR_8323E_REV10                        0x80620010
 #define SPR_8323_REV10                 0x80630010
 #define SCCR_TSEC1CM_3                 0xC0000000
 
 #define SCCR_TSEC1ON                   0x20000000
+#define SCCR_TSEC1ON_SHIFT             29
 #define SCCR_TSEC2ON                   0x10000000
+#define SCCR_TSEC2ON_SHIFT             28
 
 #endif
 
index 325f5c2..c87d46c 100644 (file)
@@ -309,7 +309,9 @@ init_fnc_t *init_sequence[] = {
        prt_8260_rsr,
        prt_8260_clks,
 #endif /* CONFIG_8260 */
-
+#if defined(CONFIG_MPC83XX)
+       prt_83xx_rsr,
+#endif
        checkcpu,
 #if defined(CONFIG_MPC5xxx)
        prt_mpc5xxx_clks,
@@ -376,7 +378,7 @@ void board_init_f (ulong bootflag)
        /* compiler optimization barrier needed for GCC >= 3.4 */
        __asm__ __volatile__("": : :"memory");
 
-#if !defined(CONFIG_CPM2)
+#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC83XX)
        /* Clear initial global data */
        memset ((void *) gd, 0, sizeof (gd_t));
 #endif