Merge with git://www.denx.de/git/u-boot.git
This commit is contained in:
commit
59530af556
25 changed files with 1594 additions and 832 deletions
19
Makefile
19
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
|
||||
|
|
50
board/freescale/mpc8323erdb/Makefile
Normal file
50
board/freescale/mpc8323erdb/Makefile
Normal file
|
@ -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
|
||||
|
||||
#########################################################################
|
28
board/freescale/mpc8323erdb/config.mk
Normal file
28
board/freescale/mpc8323erdb/config.mk
Normal file
|
@ -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
|
217
board/freescale/mpc8323erdb/mpc8323erdb.c
Normal file
217
board/freescale/mpc8323erdb/mpc8323erdb.c
Normal file
|
@ -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 */
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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@4600/",
|
||||
{ "/" OF_SOC "/serial@4500",
|
||||
"clock-frequency",
|
||||
fdt_set_busfreq
|
||||
},
|
||||
{ "/" 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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
390
cpu/mpc83xx/ecc.c
Normal file
390
cpu/mpc83xx/ecc.c
Normal file
|
@ -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
|
|
@ -25,7 +25,14 @@
|
|||
|
||||
#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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
71
doc/README.mpc8323erdb
Normal file
71
doc/README.mpc8323erdb
Normal file
|
@ -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.
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
583
include/configs/MPC8323ERDB.h
Normal file
583
include/configs/MPC8323ERDB.h
Normal file
|
@ -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 */
|
|
@ -28,9 +28,6 @@
|
|||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
#define DEBUG
|
||||
#undef DEBUG
|
||||
|
||||
/*
|
||||
* High Level Configuration Options
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
@ -600,7 +602,9 @@
|
|||
#define SCCR_TSEC1CM_3 0xC0000000
|
||||
|
||||
#define SCCR_TSEC1ON 0x20000000
|
||||
#define SCCR_TSEC1ON_SHIFT 29
|
||||
#define SCCR_TSEC2ON 0x10000000
|
||||
#define SCCR_TSEC2ON_SHIFT 28
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue