parent
63be111e72
commit
f046ccd15c
@ -0,0 +1,45 @@ |
||||
#
|
||||
# Copyright 2004 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = lib$(BOARD).a
|
||||
|
||||
OBJS := $(BOARD).o
|
||||
|
||||
$(LIB): $(OBJS) $(SOBJS) |
||||
$(AR) crv $@ $(OBJS)
|
||||
|
||||
clean: |
||||
rm -f $(SOBJS) $(OBJS)
|
||||
|
||||
distclean: clean |
||||
rm -f $(LIB) core *.bak .depend
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) |
||||
$(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
|
||||
|
||||
-include .depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,27 @@ |
||||
#
|
||||
# Copyright 2004 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
#
|
||||
# MPC83xxADS
|
||||
#
|
||||
|
||||
TEXT_BASE = 0xFE700000
|
@ -0,0 +1,278 @@ |
||||
/*
|
||||
* Copyright Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <ioports.h> |
||||
#include <mpc83xx.h> |
||||
#include <asm/mpc8349_pci.h> |
||||
#include <i2c.h> |
||||
#include <spd.h> |
||||
#include <miiphy.h> |
||||
#if defined(CONFIG_PCI) |
||||
#include <pci.h> |
||||
#endif |
||||
#if defined(CONFIG_SPD_EEPROM) |
||||
#include <spd_sdram.h> |
||||
#endif |
||||
int fixed_sdram(void); |
||||
void sdram_init(void); |
||||
|
||||
int board_early_init_f (void) |
||||
{ |
||||
volatile u8* bcsr = (volatile u8*)CFG_BCSR; |
||||
|
||||
/* Enable flash write */ |
||||
bcsr[1] &= ~0x01; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
|
||||
#define ns2clk(ns) (ns / (1000000000 / CONFIG_8349_CLKIN) + 1) |
||||
|
||||
|
||||
long int initdram (int board_type) |
||||
{ |
||||
volatile immap_t *im = (immap_t *)CFG_IMMRBAR; |
||||
u32 msize = 0; |
||||
|
||||
if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im) |
||||
return -1; |
||||
|
||||
/* DDR SDRAM - Main SODIMM */ |
||||
im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; |
||||
#if defined(CONFIG_SPD_EEPROM) |
||||
msize = spd_sdram(NULL); |
||||
#else |
||||
msize = fixed_sdram(); |
||||
#endif |
||||
/*
|
||||
* Initialize SDRAM if it is on local bus. |
||||
*/ |
||||
sdram_init(); |
||||
puts(" DDR RAM: "); |
||||
/* return total bus SDRAM size(bytes) -- DDR */ |
||||
return (msize * 1024 * 1024); |
||||
} |
||||
|
||||
|
||||
#if !defined(CONFIG_SPD_EEPROM) |
||||
/*************************************************************************
|
||||
* fixed sdram init -- doesn't use serial presence detect. |
||||
************************************************************************/ |
||||
int fixed_sdram(void) |
||||
{ |
||||
volatile immap_t *im = (immap_t *)CFG_IMMRBAR; |
||||
u32 msize = 0; |
||||
u32 ddr_size; |
||||
u32 ddr_size_log2; |
||||
|
||||
msize = CFG_DDR_SIZE; |
||||
for (ddr_size = msize << 20, ddr_size_log2 = 0; |
||||
(ddr_size > 1); |
||||
ddr_size = ddr_size>>1, ddr_size_log2++) { |
||||
if (ddr_size & 1) { |
||||
return -1; |
||||
} |
||||
} |
||||
im->sysconf.ddrlaw[0].ar = LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); |
||||
#if (CFG_DDR_SIZE != 256) |
||||
#warning Currenly any ddr size other than 256 is not supported |
||||
#endif |
||||
|
||||
im->ddr.csbnds[0].csbnds = 0x00100017; |
||||
im->ddr.csbnds[1].csbnds = 0x0018001f; |
||||
im->ddr.csbnds[2].csbnds = 0x00000007; |
||||
im->ddr.csbnds[3].csbnds = 0x0008000f; |
||||
im->ddr.cs_config[0] = CFG_DDR_CONFIG; |
||||
im->ddr.cs_config[1] = CFG_DDR_CONFIG; |
||||
im->ddr.cs_config[2] = CFG_DDR_CONFIG; |
||||
im->ddr.cs_config[3] = CFG_DDR_CONFIG; |
||||
im->ddr.timing_cfg_1 = |
||||
3 << TIMING_CFG1_PRETOACT_SHIFT | |
||||
7 << TIMING_CFG1_ACTTOPRE_SHIFT | |
||||
3 << TIMING_CFG1_ACTTORW_SHIFT | |
||||
4 << TIMING_CFG1_CASLAT_SHIFT | |
||||
3 << TIMING_CFG1_REFREC_SHIFT | |
||||
3 << TIMING_CFG1_WRREC_SHIFT | |
||||
2 << TIMING_CFG1_ACTTOACT_SHIFT | |
||||
1 << TIMING_CFG1_WRTORD_SHIFT; |
||||
im->ddr.timing_cfg_2 = 2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT; |
||||
im->ddr.sdram_cfg = |
||||
SDRAM_CFG_SREN |
||||
#if defined(CONFIG_DDR_2T_TIMING) |
||||
| SDRAM_CFG_2T_EN |
||||
#endif |
||||
| 2 << SDRAM_CFG_SDRAM_TYPE_SHIFT; |
||||
im->ddr.sdram_mode = |
||||
0x2000 << SDRAM_MODE_ESD_SHIFT | |
||||
0x0162 << SDRAM_MODE_SD_SHIFT; |
||||
|
||||
im->ddr.sdram_interval = 0x045B << SDRAM_INTERVAL_REFINT_SHIFT | |
||||
0x0100 << SDRAM_INTERVAL_BSTOPRE_SHIFT; |
||||
udelay(200); |
||||
|
||||
im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; |
||||
|
||||
return msize; |
||||
} |
||||
#endif/*!CFG_SPD_EEPROM*/ |
||||
|
||||
|
||||
int checkboard (void) |
||||
{ |
||||
puts("Board: Freescale MPC8349ADS\n"); |
||||
return 0; |
||||
} |
||||
|
||||
#if defined(CONFIG_PCI) //copy from mpc85xx
|
||||
/*
|
||||
* Initialize PCI Devices, report devices found |
||||
*/ |
||||
#ifndef CONFIG_PCI_PNP |
||||
static struct pci_config_table pci_mpc83xxads_config_table[] = { |
||||
{PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID, |
||||
pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, |
||||
PCI_ENET0_MEMADDR, |
||||
PCI_COMMON_MEMORY | PCI_COMMAND_MASTER |
||||
} }, |
||||
{} |
||||
} |
||||
#endif |
||||
|
||||
|
||||
volatile static struct pci_controller hose[] = { |
||||
{ |
||||
#ifndef CONFIG_PCI_PNP |
||||
config_table:pci_mpc83xxads_config_table, |
||||
#endif |
||||
}, |
||||
{ |
||||
#ifndef CONFIG_PCI_PNP |
||||
config_table:pci_mpc83xxads_config_table, |
||||
#endif |
||||
} |
||||
}; |
||||
#endif /* CONFIG_PCI */ |
||||
|
||||
|
||||
void |
||||
pci_init_board(void) |
||||
{ |
||||
#ifdef CONFIG_PCI |
||||
extern void pci_mpc83xx_init(volatile struct pci_controller *hose); |
||||
|
||||
pci_mpc83xx_init(hose); |
||||
#endif /* CONFIG_PCI */ |
||||
} |
||||
|
||||
/*
|
||||
if MPC8349ADS is soldered with SDRAM |
||||
*/ |
||||
#if defined(CFG_BR2_PRELIM) \ |
||||
&& defined(CFG_OR2_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR2_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR2_PRELIM) |
||||
/*
|
||||
* Initialize SDRAM memory on the Local Bus. |
||||
*/ |
||||
|
||||
void |
||||
sdram_init(void) |
||||
{ |
||||
volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; |
||||
volatile lbus8349_t *lbc= &immap->lbus; |
||||
uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; |
||||
|
||||
|
||||
puts("\n SDRAM on Local Bus: "); |
||||
print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); |
||||
|
||||
/*
|
||||
* Setup SDRAM Base and Option Registers, already done in cpu_init.c |
||||
*/ |
||||
|
||||
/*setup mtrpt, lsrt and lbcr for LB bus*/ |
||||
lbc->lbcr = CFG_LBC_LBCR; |
||||
lbc->mrtpr = CFG_LBC_MRTPR; |
||||
lbc->lsrt = CFG_LBC_LSRT; |
||||
asm("sync"); |
||||
|
||||
/*
|
||||
* Configure the SDRAM controller Machine Mode Register. |
||||
*/ |
||||
lbc->lsdmr = CFG_LBC_LSDMR_5; /* 0x40636733; normal operation*/ |
||||
|
||||
lbc->lsdmr = CFG_LBC_LSDMR_1; /*0x68636733;precharge all the banks*/ |
||||
asm("sync"); |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
|
||||
lbc->lsdmr = CFG_LBC_LSDMR_2;/*0x48636733;auto refresh*/ |
||||
asm("sync"); |
||||
/*1 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*2 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*3 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*4 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*5 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*6 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*7 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
/*8 times*/ |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
|
||||
lbc->lsdmr = CFG_LBC_LSDMR_4; /*0x58636733;mode register write operation*/ |
||||
asm("sync"); |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
|
||||
lbc->lsdmr = CFG_LBC_LSDMR_5; /*0x40636733;normal operation*/ |
||||
asm("sync"); |
||||
*sdram_addr = 0xff; |
||||
udelay(100); |
||||
} |
||||
#else |
||||
void |
||||
sdram_init(void) |
||||
{ |
||||
put("SDRAM on Local Bus is NOT available!\n"); |
||||
} |
||||
#endif |
||||
|
@ -0,0 +1,119 @@ |
||||
/* |
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
OUTPUT_ARCH(powerpc) |
||||
SECTIONS |
||||
{ |
||||
/* Read-only sections, merged into text segment: */ |
||||
. = + SIZEOF_HEADERS; |
||||
.interp : { *(.interp) } |
||||
.hash : { *(.hash) } |
||||
.dynsym : { *(.dynsym) } |
||||
.dynstr : { *(.dynstr) } |
||||
.rel.text : { *(.rel.text) } |
||||
.rela.text : { *(.rela.text) } |
||||
.rel.data : { *(.rel.data) } |
||||
.rela.data : { *(.rela.data) } |
||||
.rel.rodata : { *(.rel.rodata) } |
||||
.rela.rodata : { *(.rela.rodata) } |
||||
.rel.got : { *(.rel.got) } |
||||
.rela.got : { *(.rela.got) } |
||||
.rel.ctors : { *(.rel.ctors) } |
||||
.rela.ctors : { *(.rela.ctors) } |
||||
.rel.dtors : { *(.rel.dtors) } |
||||
.rela.dtors : { *(.rela.dtors) } |
||||
.rel.bss : { *(.rel.bss) } |
||||
.rela.bss : { *(.rela.bss) } |
||||
.rel.plt : { *(.rel.plt) } |
||||
.rela.plt : { *(.rela.plt) } |
||||
.init : { *(.init) } |
||||
.plt : { *(.plt) } |
||||
.text : |
||||
{ |
||||
cpu/mpc83xx/start.o (.text) |
||||
*(.text) |
||||
*(.fixup) |
||||
*(.got1) |
||||
. = ALIGN(16); |
||||
*(.rodata) |
||||
*(.rodata1) |
||||
*(.rodata.str1.4) |
||||
} |
||||
.fini : { *(.fini) } =0 |
||||
.ctors : { *(.ctors) } |
||||
.dtors : { *(.dtors) } |
||||
|
||||
/* Read-write section, merged into data segment: */ |
||||
. = (. + 0x0FFF) & 0xFFFFF000; |
||||
_erotext = .; |
||||
PROVIDE (erotext = .); |
||||
.reloc : |
||||
{ |
||||
*(.got) |
||||
_GOT2_TABLE_ = .; |
||||
*(.got2) |
||||
_FIXUP_TABLE_ = .; |
||||
*(.fixup) |
||||
} |
||||
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; |
||||
__fixup_entries = (. - _FIXUP_TABLE_) >> 2; |
||||
|
||||
.data : |
||||
{ |
||||
*(.data) |
||||
*(.data1) |
||||
*(.sdata) |
||||
*(.sdata2) |
||||
*(.dynamic) |
||||
CONSTRUCTORS |
||||
} |
||||
_edata = .; |
||||
PROVIDE (edata = .); |
||||
|
||||
__u_boot_cmd_start = .; |
||||
.u_boot_cmd : { *(.u_boot_cmd) } |
||||
__u_boot_cmd_end = .; |
||||
|
||||
|
||||
__start___ex_table = .; |
||||
__ex_table : { *(__ex_table) } |
||||
__stop___ex_table = .; |
||||
|
||||
. = ALIGN(4096); |
||||
__init_begin = .; |
||||
.text.init : { *(.text.init) } |
||||
.data.init : { *(.data.init) } |
||||
. = ALIGN(4096); |
||||
__init_end = .; |
||||
|
||||
__bss_start = .; |
||||
.bss : |
||||
{ |
||||
*(.sbss) *(.scommon) |
||||
*(.dynbss) |
||||
*(.bss) |
||||
*(COMMON) |
||||
} |
||||
_end = . ; |
||||
PROVIDE (end = .); |
||||
} |
||||
ENTRY(_start) |
@ -0,0 +1,53 @@ |
||||
#
|
||||
# Copyright 2004 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = lib$(CPU).a
|
||||
|
||||
START = start.o \
|
||||
resetvec.o
|
||||
|
||||
COBJS = traps.o \
|
||||
cpu.o \
|
||||
cpu_init.o \
|
||||
speed.o \
|
||||
interrupts.o \
|
||||
pci.o \
|
||||
i2c.o \
|
||||
spd_sdram.o
|
||||
|
||||
OBJS = $(COBJS)
|
||||
|
||||
all: .depend $(START) $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(AR) crv $@ $(OBJS)
|
||||
|
||||
#########################################################################
|
||||
|
||||
.depend: Makefile $(START:.o=.S) $(AOBJS:.o=.S) $(COBJS:.o=.c) |
||||
$(CC) -M $(CFLAGS) $(START:.o=.S) $(COBJS:.o=.c) > $@
|
||||
|
||||
sinclude .depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,26 @@ |
||||
#
|
||||
# Copyright 2004 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
PLATFORM_RELFLAGS += -fPIC -ffixed-r14 -meabi
|
||||
|
||||
PLATFORM_CPPFLAGS += -DCONFIG_MPC83XX -DCONFIG_E300 \
|
||||
-ffixed-r2 -ffixed-r29 -msoft-float
|
@ -0,0 +1,145 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
/*
|
||||
* CPU specific code for the MPC83xx family. |
||||
* |
||||
* Derived from the MPC8260 and MPC85xx. |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <watchdog.h> |
||||
#include <command.h> |
||||
#include <mpc83xx.h> |
||||
#include <asm/processor.h> |
||||
|
||||
|
||||
int checkcpu(void) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
ulong clock = gd->cpu_clk; |
||||
u32 pvr = get_pvr(); |
||||
char buf[32]; |
||||
|
||||
if ((pvr & 0xFFFF0000) != PVR_83xx) { |
||||
puts("Not MPC83xx Family!!!\n"); |
||||
return -1; |
||||
} |
||||
|
||||
puts("CPU: MPC83xx, "); |
||||
switch(pvr) { |
||||
case PVR_8349_REV10: |
||||
break; |
||||
case PVR_8349_REV11: |
||||
break; |
||||
default: |
||||
puts("Rev: Unknown\n"); |
||||
return -1; /* Not sure what this is */ |
||||
} |
||||
printf("Rev: %02x at %s MHz\n",pvr & 0x0000FFFF, strmhz(buf, clock)); |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
void upmconfig (uint upm, uint *table, uint size) |
||||
{ |
||||
hang(); /* FIXME: upconfig() needed? */ |
||||
} |
||||
|
||||
|
||||
int |
||||
do_reset (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) |
||||
{ |
||||
ulong msr, addr; |
||||
|
||||
volatile immap_t *immap = (immap_t *) CFG_IMMRBAR; |
||||
|
||||
#ifdef MPC83xx_RESET |
||||
/* Interrupts and MMU off */ |
||||
__asm__ __volatile__ ("mfmsr %0":"=r" (msr):); |
||||
|
||||
msr &= ~( MSR_EE | MSR_IR | MSR_DR); |
||||
__asm__ __volatile__ ("mtmsr %0"::"r" (msr)); |
||||
|
||||
/* enable Reset Control Reg */ |
||||
immap->reset.rpr = 0x52535445; |
||||
|
||||
/* confirm Reset Control Reg is enabled */ |
||||
while(!((immap->reset.rcer) & RCER_CRE)); |
||||
|
||||
printf("Resetting the board."); |
||||
printf("\n"); |
||||
|
||||
udelay(200); |
||||
|
||||
/* perform reset, only one bit */ |
||||
immap->reset.rcr = RCR_SWHR; |
||||
#else |
||||
immap->reset.rmr = RMR_CSRE; /* Checkstop Reset enable */ |
||||
|
||||
/* Interrupts and MMU off */ |
||||
__asm__ __volatile__ ("mfmsr %0":"=r" (msr):); |
||||
|
||||
msr &= ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR); |
||||
__asm__ __volatile__ ("mtmsr %0"::"r" (msr)); |
||||
|
||||
/*
|
||||
* Trying to execute the next instruction at a non-existing address |
||||
* should cause a machine check, resulting in reset |
||||
*/ |
||||
addr = CFG_RESET_ADDRESS; |
||||
|
||||
printf("resetting the board."); |
||||
printf("\n"); |
||||
((void (*)(void)) addr) (); |
||||
#endif |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
/*
|
||||
* Get timebase clock frequency (like cpu_clk in Hz) |
||||
*/ |
||||
|
||||
unsigned long get_tbclk(void) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
ulong tbclk; |
||||
|
||||
tbclk = (gd->bus_clk + 3L) / 4L; |
||||
|
||||
return tbclk; |
||||
} |
||||
|
||||
|
||||
#if defined(CONFIG_WATCHDOG) |
||||
void watchdog_reset (void) |
||||
{ |
||||
hang(); /* FIXME: implement watchdog_reset()? */ |
||||
} |
||||
#endif /* CONFIG_WATCHDOG */ |
@ -0,0 +1,164 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <mpc83xx.h> |
||||
#include <ioports.h> |
||||
|
||||
/*
|
||||
* Breathe some life into the CPU... |
||||
* |
||||
* Set up the memory map, |
||||
* initialize a bunch of registers, |
||||
* initialize the UPM's |
||||
*/ |
||||
void cpu_init_f (volatile immap_t * im) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
/* Pointer is writable since we allocated a register for it */ |
||||
gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET); |
||||
|
||||
/* Clear initial global data */ |
||||
memset ((void *) gd, 0, sizeof (gd_t)); |
||||
|
||||
/* RSR - Reset Status Register - clear all status (4.6.1.3) */ |
||||
gd->reset_status = im->reset.rsr; |
||||
im->reset.rsr = ~(RSR_RES); |
||||
|
||||
/*
|
||||
* RMR - Reset Mode Register |
||||
* contains checkstop reset enable (4.6.1.4) |
||||
*/ |
||||
im->reset.rmr = (RMR_CSRE & (1<<RMR_CSRE_SHIFT)); |
||||
|
||||
/* LCRR - Clock Ratio Register (10.3.1.16) */ |
||||
im->lbus.lcrr = CFG_LCRR; |
||||
|
||||
/* Enable Time Base & Decrimenter ( so we will have udelay() )*/ |
||||
im->sysconf.spcr |= SPCR_TBEN; |
||||
|
||||
/* System General Purpose Register */ |
||||
im->sysconf.sicrh = SICRH_TSOBI1; |
||||
im->sysconf.sicrl = SICRL_LDP_A; |
||||
|
||||
/*
|
||||
* Memory Controller: |
||||
*/ |
||||
|
||||
/* Map banks 0 and 1 to the FLASH banks 0 and 1 at preliminary
|
||||
* addresses - these have to be modified later when FLASH size |
||||
* has been determined |
||||
*/ |
||||
|
||||
#if defined(CFG_BR0_PRELIM) \ |
||||
&& defined(CFG_OR0_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR0_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR0_PRELIM) |
||||
im->lbus.bank[0].br = CFG_BR0_PRELIM; |
||||
im->lbus.bank[0].or = CFG_OR0_PRELIM; |
||||
im->sysconf.lblaw[0].bar = CFG_LBLAWBAR0_PRELIM; |
||||
im->sysconf.lblaw[0].ar = CFG_LBLAWAR0_PRELIM; |
||||
#else |
||||
#error CFG_BR0_PRELIM, CFG_OR0_PRELIM, CFG_LBLAWBAR0_PRELIM & CFG_LBLAWAR0_PRELIM must be defined |
||||
#endif |
||||
|
||||
#if defined(CFG_BR1_PRELIM) \ |
||||
&& defined(CFG_OR1_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR1_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR1_PRELIM) |
||||
im->lbus.bank[1].br = CFG_BR1_PRELIM; |
||||
im->lbus.bank[1].or = CFG_OR1_PRELIM; |
||||
im->sysconf.lblaw[1].bar = CFG_LBLAWBAR1_PRELIM; |
||||
im->sysconf.lblaw[1].ar = CFG_LBLAWAR1_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR2_PRELIM) \ |
||||
&& defined(CFG_OR2_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR2_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR2_PRELIM) |
||||
im->lbus.bank[2].br = CFG_BR2_PRELIM; |
||||
im->lbus.bank[2].or = CFG_OR2_PRELIM; |
||||
im->sysconf.lblaw[2].bar = CFG_LBLAWBAR2_PRELIM; |
||||
im->sysconf.lblaw[2].ar = CFG_LBLAWAR2_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR3_PRELIM) \ |
||||
&& defined(CFG_OR3_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR3_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR3_PRELIM) |
||||
im->lbus.bank[3].br = CFG_BR3_PRELIM; |
||||
im->lbus.bank[3].or = CFG_OR3_PRELIM; |
||||
im->sysconf.lblaw[3].bar = CFG_LBLAWBAR3_PRELIM; |
||||
im->sysconf.lblaw[3].ar = CFG_LBLAWAR3_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR4_PRELIM) \ |
||||
&& defined(CFG_OR4_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR4_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR4_PRELIM) |
||||
im->lbus.bank[4].br = CFG_BR4_PRELIM; |
||||
im->lbus.bank[4].or = CFG_OR4_PRELIM; |
||||
im->sysconf.lblaw[4].bar = CFG_LBLAWBAR4_PRELIM; |
||||
im->sysconf.lblaw[4].ar = CFG_LBLAWAR4_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR5_PRELIM) \ |
||||
&& defined(CFG_OR5_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR5_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR5_PRELIM) |
||||
im->lbus.bank[5].br = CFG_BR5_PRELIM; |
||||
im->lbus.bank[5].or = CFG_OR5_PRELIM; |
||||
im->sysconf.lblaw[5].bar = CFG_LBLAWBAR5_PRELIM; |
||||
im->sysconf.lblaw[5].ar = CFG_LBLAWAR5_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR6_PRELIM) \ |
||||
&& defined(CFG_OR6_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR6_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR6_PRELIM) |
||||
im->lbus.bank[6].br = CFG_BR6_PRELIM; |
||||
im->lbus.bank[6].or = CFG_OR6_PRELIM; |
||||
im->sysconf.lblaw[6].bar = CFG_LBLAWBAR6_PRELIM; |
||||
im->sysconf.lblaw[6].ar = CFG_LBLAWAR6_PRELIM; |
||||
#endif |
||||
#if defined(CFG_BR7_PRELIM) \ |
||||
&& defined(CFG_OR7_PRELIM) \
|
||||
&& defined(CFG_LBLAWBAR7_PRELIM) \
|
||||
&& defined(CFG_LBLAWAR7_PRELIM) |
||||
im->lbus.bank[7].br = CFG_BR7_PRELIM; |
||||
im->lbus.bank[7].or = CFG_OR7_PRELIM; |
||||
im->sysconf.lblaw[7].bar = CFG_LBLAWBAR7_PRELIM; |
||||
im->sysconf.lblaw[7].ar = CFG_LBLAWAR7_PRELIM; |
||||
#endif |
||||
} |
||||
|
||||
|
||||
/*
|
||||
* Initialize higher level parts of CPU like time base and timers. |
||||
*/ |
||||
|
||||
int cpu_init_r (void) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
@ -0,0 +1,251 @@ |
||||
/*
|
||||
* (C) Copyright 2003,Motorola Inc. |
||||
* Xianghua Xiao <x.xiao@motorola.com> |
||||
* Adapted for Motorola 85xx chip. |
||||
* |
||||
* (C) Copyright 2003 |
||||
* Gleb Natapov <gnatapov@mrv.com> |
||||
* Some bits are taken from linux driver writen by adrian@humboldt.co.uk |
||||
* |
||||
* Hardware I2C driver for MPC107 PCI bridge. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <asm/io.h> |
||||
|
||||
#ifdef CONFIG_HARD_I2C |
||||
#include <i2c.h> |
||||
#include <asm/i2c.h> |
||||
|
||||
#ifdef CONFIG_MPC8349ADS |
||||
i2c_t * mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET); |
||||
#endif |
||||
|
||||
void |
||||
i2c_init(int speed, int slaveadd) |
||||
{ |
||||
/* stop I2C controller */ |
||||
writeb(0x00 , &I2C->cr); |
||||
|
||||
/* set clock */ |
||||
writeb(0x3f, &I2C->fdr); |
||||
|
||||
/* set default filter */ |
||||
writeb(0x10,&I2C->dfsrr); |
||||
|
||||
/* write slave address */ |
||||
writeb(slaveadd, &I2C->adr); |
||||
|
||||
/* clear status register */ |
||||
writeb(0x00, &I2C->sr); |
||||
|
||||
/* start I2C controller */ |
||||
writeb(I2C_CR_MEN, &I2C->cr); |
||||
} |
||||
|
||||
static __inline__ int |
||||
i2c_wait4bus (void) |
||||
{ |
||||
ulong timeval = get_timer (0); |
||||
while (readb(&I2C->sr) & I2C_SR_MBB) { |
||||
if (get_timer (timeval) > I2C_TIMEOUT) { |
||||
return -1; |
||||
} |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
static __inline__ int |
||||
i2c_wait (int write) |
||||
{ |
||||
u32 csr; |
||||
ulong timeval = get_timer(0); |
||||
do { |
||||
csr = readb(&I2C->sr); |
||||
|
||||
if (!(csr & I2C_SR_MIF)) |
||||
continue; |
||||
|
||||
writeb(0x0, &I2C->sr); |
||||
|
||||
if (csr & I2C_SR_MAL) { |
||||
debug("i2c_wait: MAL\n"); |
||||
return -1; |
||||
} |
||||
|
||||
if (!(csr & I2C_SR_MCF)) { |
||||
debug("i2c_wait: unfinished\n"); |
||||
return -1; |
||||
} |
||||
|
||||
if (write == I2C_WRITE && (csr & I2C_SR_RXAK)) { |
||||
debug("i2c_wait: No RXACK\n"); |
||||
return -1; |
||||
} |
||||
|
||||
return 0; |
||||
} while (get_timer (timeval) < I2C_TIMEOUT); |
||||
debug("i2c_wait: timed out\n"); |
||||
} |
||||
|
||||
static __inline__ int |
||||
i2c_write_addr (u8 dev, u8 dir, int rsta) |
||||
{ |
||||
writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX | |
||||
(rsta?I2C_CR_RSTA:0), |
||||
&I2C->cr); |
||||
|
||||
writeb((dev << 1) | dir, &I2C->dr); |
||||
|
||||
if (i2c_wait (I2C_WRITE) < 0) |
||||
return 0; |
||||
return 1; |
||||
} |
||||
|
||||
static __inline__ int |
||||
__i2c_write (u8 *data, int length) |
||||
{ |
||||
int i; |
||||
|
||||
writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX, |
||||
&I2C->cr); |
||||
|
||||
for (i=0; i < length; i++) { |
||||
writeb(data[i], &I2C->dr); |
||||
|
||||
if (i2c_wait (I2C_WRITE) < 0) |
||||
break; |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
static __inline__ int |
||||
__i2c_read (u8 *data, int length) |
||||
{ |
||||
int i; |
||||
|
||||
writeb(I2C_CR_MEN | I2C_CR_MSTA | |
||||
((length == 1) ? I2C_CR_TXAK : 0), |
||||
&I2C->cr); |
||||
|
||||
/* dummy read */ |
||||
readb(&I2C->dr); |
||||
|
||||
for (i=0; i < length; i++) { |
||||
if (i2c_wait (I2C_READ) < 0) |
||||
break; |
||||
|
||||
/* Generate ack on last next to last byte */ |
||||
if (i == length - 2) |
||||
writeb(I2C_CR_MEN | I2C_CR_MSTA | |
||||
I2C_CR_TXAK, |
||||
&I2C->cr); |
||||
|
||||
/* Generate stop on last byte */ |
||||
if (i == length - 1) |
||||
writeb(I2C_CR_MEN | I2C_CR_TXAK, &I2C->cr); |
||||
|
||||
data[i] = readb(&I2C->dr); |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
int |
||||
i2c_read (u8 dev, uint addr, int alen, u8 *data, int length) |
||||
{ |
||||
int i = 0; |
||||
u8 *a = (u8*)&addr; |
||||
|
||||
if (i2c_wait4bus () < 0) |
||||
goto exit; |
||||
|
||||
if (i2c_write_addr (dev, I2C_WRITE, 0) == 0) |
||||
goto exit; |
||||
|
||||
if (__i2c_write (&a[4 - alen], alen) != alen) |
||||
goto exit; |
||||
|
||||
if (i2c_write_addr (dev, I2C_READ, 1) == 0) |
||||
goto exit; |
||||
|
||||
i = __i2c_read (data, length); |
||||
|
||||
exit: |
||||
writeb(I2C_CR_MEN, &I2C->cr); |
||||
return !(i == length); |
||||
} |
||||
|
||||
int |
||||
i2c_write (u8 dev, uint addr, int alen, u8 *data, int length) |
||||
{ |
||||
int i = 0; |
||||
u8 *a = (u8*)&addr; |
||||
|
||||
if (i2c_wait4bus () < 0) |
||||
goto exit; |
||||
|
||||
if (i2c_write_addr (dev, I2C_WRITE, 0) == 0) |
||||
goto exit; |
||||
|
||||
if (__i2c_write (&a[4 - alen], alen) != alen) |
||||
goto exit; |
||||
|
||||
i = __i2c_write (data, length); |
||||
|
||||
exit: |
||||
writeb(I2C_CR_MEN, &I2C->cr); |
||||
return !(i == length); |
||||
} |
||||
|
||||
int i2c_probe (uchar chip) |
||||
{ |
||||
int tmp; |
||||
|
||||
/*
|
||||
* Try to read the first location of the chip. The underlying |
||||
* driver doesn't appear to support sending just the chip address |
||||
* and looking for an <ACK> back. |
||||
*/ |
||||
udelay(10000); |
||||
return i2c_read (chip, 0, 1, (char *)&tmp, 1); |
||||
} |
||||
|
||||
uchar i2c_reg_read (uchar i2c_addr, uchar reg) |
||||
{ |
||||
char buf[1]; |
||||
|
||||
i2c_read (i2c_addr, reg, 1, buf, 1); |
||||
|
||||
return (buf[0]); |
||||
} |
||||
|
||||
void i2c_reg_write (uchar i2c_addr, uchar reg, uchar val) |
||||
{ |
||||
i2c_write (i2c_addr, reg, 1, &val, 1); |
||||
} |
||||
|
||||
#endif /* CONFIG_HARD_I2C */ |
@ -0,0 +1,94 @@ |
||||
/*
|
||||
* (C) Copyright 2000-2002 |
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
||||
* |
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* Hacked for MPC8260 by Murray.Jensen@cmst.csiro.au, 22-Oct-00 |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <mpc83xx.h> |
||||
#include <asm/processor.h> |
||||
|
||||
struct irq_action { |
||||
interrupt_handler_t *handler; |
||||
void *arg; |
||||
ulong count; |
||||
}; |
||||
|
||||
int interrupt_init_cpu (unsigned *decrementer_count) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
/*
|
||||
* Handle external interrupts |
||||
*/ |
||||
|
||||
void external_interrupt (struct pt_regs *regs) |
||||
{ |
||||
} |
||||
|
||||
|
||||
/*
|
||||
* Install and free an interrupt handler. |
||||
*/ |
||||
|
||||
void |
||||
irq_install_handler (int irq, interrupt_handler_t * handler, void *arg) |
||||
{ |
||||
} |
||||
|
||||
|
||||
void irq_free_handler (int irq) |
||||
{ |
||||
} |
||||
|
||||
|
||||
void timer_interrupt_cpu (struct pt_regs *regs) |
||||
{ |
||||
/* nothing to do here */ |
||||
return; |
||||
} |
||||
|
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_IRQ) |
||||
|
||||
/* ripped this out of ppc4xx/interrupts.c */ |
||||
|
||||
/*
|
||||
* irqinfo - print information about PCI devices |
||||
*/ |
||||
|
||||
void |
||||
do_irqinfo(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]) |
||||
{ |
||||
} |
||||
|
||||
#endif /* CONFIG_COMMANDS & CFG_CMD_IRQ */ |
@ -0,0 +1,253 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor. |
||||
* Copyright (C) 2003 Motorola Inc. |
||||
* Xianghua Xiao (x.xiao@motorola.com) |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
/*
|
||||
* PCI Configuration space access support for MPC85xx PCI Bridge |
||||
*/ |
||||
#include <asm/mmu.h> |
||||
#include <asm/io.h> |
||||
#include <common.h> |
||||
#include <pci.h> |
||||
|
||||
#ifdef CONFIG_MPC8349ADS |
||||
#include <asm/i2c.h> |
||||
#endif |
||||
|
||||
#if defined(CONFIG_PCI) |
||||
|
||||
void |
||||
pci_mpc83xx_init(volatile struct pci_controller *hose) |
||||
{ |
||||
volatile immap_t * immr; |
||||
volatile clk8349_t * clk;
|
||||
volatile law8349_t * pci_law; |
||||
volatile pot8349_t * pci_pot; |
||||
volatile pcictrl8349_t * pci_ctrl; |
||||
volatile pciconf8349_t * pci_conf; |
||||
|
||||
u8 val8,tmp8,ret; |
||||
u16 reg16,tmp16; |
||||
u32 val32,tmp32; |
||||
|
||||
immr = (immap_t *)CFG_IMMRBAR; |
||||
clk = (clk8349_t *)&immr->clk; |
||||
pci_law = immr->sysconf.pcilaw; |
||||
pci_pot = immr->ios.pot; |
||||
pci_ctrl = immr->pci_ctrl; |
||||
pci_conf = immr->pci_conf; |
||||
|
||||
/*
|
||||
* Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode |
||||
*/ |
||||
val32 = clk->occr; |
||||
udelay(2000); |
||||
clk->occr = 0xff000000; |
||||
udelay(2000); |
||||
|
||||
/*
|
||||
* Configure PCI Local Access Windows |
||||
*/ |
||||
pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR; |
||||
pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G; |
||||
pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR; |
||||
pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_32M; |
||||
|
||||
/*
|
||||
* Configure PCI Outbound Translation Windows |
||||
*/ |
||||
pci_pot[0].potar = (CFG_PCI1_MEM_BASE >> 12) & POTAR_TA_MASK; |
||||
pci_pot[0].pobar = (CFG_PCI1_MEM_PHYS >> 12) & POBAR_BA_MASK; |
||||
pci_pot[0].pocmr = POCMR_EN | (POCMR_CM_512M & POCMR_CM_MASK); |
||||
|
||||
/* mapped to PCI1 IO space 0x0 to local 0xe2000000 */ |
||||
pci_pot[1].potar = (CFG_PCI1_IO_BASE >> 12) & POTAR_TA_MASK; |
||||
pci_pot[1].pobar = (CFG_PCI1_IO_PHYS >> 12) & POBAR_BA_MASK; |
||||
pci_pot[1].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_16M & POCMR_CM_MASK); |
||||
//#if defined(CONFIG_PCI_2)
|
||||
pci_pot[3].potar = (CFG_PCI2_MEM_BASE >> 12) & POTAR_TA_MASK; |
||||
pci_pot[3].pobar = (CFG_PCI2_MEM_PHYS >> 12) & POBAR_BA_MASK; |
||||
pci_pot[3].pocmr = POCMR_EN | POCMR_DST | (POCMR_CM_512M & POCMR_CM_MASK); |
||||
|
||||
/* mapped to PCI2 IO space 0x0 to local 0xe3000000 */ |
||||
pci_pot[4].potar = (CFG_PCI2_IO_BASE >> 12) & POTAR_TA_MASK; |
||||
pci_pot[4].pobar = (CFG_PCI2_IO_PHYS >> 12) & POBAR_BA_MASK; |
||||
pci_pot[4].pocmr = POCMR_EN | POCMR_DST | POCMR_IO | (POCMR_CM_16M & POCMR_CM_MASK); |
||||
//#endif
|
||||
|
||||
/*
|
||||
* Configure PCI Inbound Translation Windows |
||||
*/ |
||||
pci_ctrl[0].pitar1 = 0x0; |
||||
pci_ctrl[0].pibar1 = 0x0; |
||||
pci_ctrl[0].piebar1 = 0x0; |
||||
pci_ctrl[0].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | PIWAR_IWS_2G; |
||||
|
||||
pci_ctrl[1].pitar1 = 0x0; |
||||
pci_ctrl[1].pibar1 = 0x0; |
||||
pci_ctrl[1].piebar1 = 0x0; |
||||
pci_ctrl[1].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | PIWAR_IWS_2G; |
||||
/*
|
||||
* Assign PIB PMC slot to desired PCI bus |
||||
*/ |
||||
#ifdef CONFIG_MPC8349ADS |
||||
mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C2_OFFSET); |
||||
i2c_init(CFG_I2C_SPEED,CFG_I2C_SLAVE); |
||||
#endif |
||||
val8 = 0; |
||||
ret = i2c_write(0x23,0x6,1,&val8,1); |
||||
ret = i2c_write(0x23,0x7,1,&val8,1); |
||||
val8 = 0xff; |
||||
ret = i2c_write(0x23,0x2,1,&val8,1); |
||||
ret = i2c_write(0x23,0x3,1,&val8,1); |
||||
|
||||
val8 = 0; |
||||
ret = i2c_write(0x26,0x6,1,&val8,1); |
||||
val8 = 0x34; |
||||
ret = i2c_write(0x26,0x7,1,&val8,1); |
||||
#if defined(PCI_64BIT) |
||||
val8 = 0xf4; // PMC2<->PCI1 64bit
|
||||
#elif defined(PCI_ALL_PCI1) |
||||
val8 = 0xf3; // PMC1<->PCI1,PMC2<->PCI1,PMC3<->PCI1 32bit
|
||||
#elif defined(PCI_ONE_PCI1) |
||||
val8 = 0xf9; // PMC1<->PCI1,PMC2<->PCI2,PMC3<->PCI2 32bit
|
||||
#elif defined(PCI_TWO_PCI1) |
||||
val8 = 0xf5; // PMC1<->PCI1,PMC2<->PCI1,PMC3<->PCI2 32bit
|
||||
#else |
||||
val8 = 0xf5; |
||||
#endif |
||||
ret = i2c_write(0x26,0x2,1,&val8,1); |
||||
val8 = 0xff; |
||||
ret = i2c_write(0x26,0x3,1,&val8,1); |
||||
val8 = 0; |
||||
ret = i2c_write(0x27,0x6,1,&val8,1); |
||||
ret = i2c_write(0x27,0x7,1,&val8,1); |
||||
val8 = 0xff; |
||||
ret = i2c_write(0x27,0x2,1,&val8,1); |
||||
val8 = 0xef; |
||||
ret = i2c_write(0x27,0x3,1,&val8,1); |
||||
asm("eieio"); |
||||
|
||||
/*
|
||||
* Release PCI RST Output signal |
||||
*/ |
||||
udelay(2000); |
||||
pci_ctrl[0].gcr = 1; |
||||
#ifndef PCI_64BIT |
||||
pci_ctrl[1].gcr = 1; |
||||
#endif |
||||
udelay(2000); |
||||
|
||||
hose[0].first_busno = 0; |
||||
hose[0].last_busno = 0xff; |
||||
|
||||
pci_set_region(hose[0].regions + 0, |
||||
CFG_PCI1_MEM_BASE, |
||||
CFG_PCI1_MEM_PHYS, |
||||
CFG_PCI1_MEM_SIZE, |
||||
PCI_REGION_MEM); |
||||
|
||||
pci_set_region(hose[0].regions + 1, |
||||
CFG_PCI1_IO_BASE, |
||||
CFG_PCI1_IO_PHYS, |
||||
CFG_PCI1_IO_SIZE, |
||||
PCI_REGION_IO); |
||||
|
||||
hose[0].region_count = 2; |
||||
|
||||
pci_setup_indirect(&hose[0], |
||||
(CFG_IMMRBAR+0x8300), |
||||
(CFG_IMMRBAR+0x8304)); |
||||
#define PCI_CLASS_BRIDGE 0x06 |
||||
reg16 = 0xff; |
||||
tmp32 = 0xffff; |
||||
pci_hose_write_config_byte(&hose[0],PCI_BDF(0,0,0),PCI_CLASS_CODE,PCI_CLASS_BRIDGE);
|
||||
|
||||
pci_hose_read_config_word (&hose[0],PCI_BDF(0,0,0),PCI_COMMAND, ®16); |
||||
reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; |
||||
pci_hose_write_config_word(&hose[0],PCI_BDF(0,0,0), PCI_COMMAND, reg16); |
||||
|
||||
/*
|
||||
* Clear non-reserved bits in status register. |
||||
*/ |
||||
pci_hose_write_config_word(&hose[0],PCI_BDF(0,0,0), PCI_STATUS, 0xffff); |
||||
pci_hose_write_config_byte(&hose[0],PCI_BDF(0,0,0), PCI_LATENCY_TIMER,0x80); |
||||
#ifndef PCI_64BIT |
||||
hose[1].first_busno = 0; |
||||
hose[1].last_busno = 0xff; |
||||
|
||||
pci_set_region(hose[1].regions + 0, |
||||
CFG_PCI2_MEM_BASE, |
||||
CFG_PCI2_MEM_PHYS, |
||||
CFG_PCI2_MEM_SIZE, |
||||
PCI_REGION_MEM); |
||||
|
||||
pci_set_region(hose[1].regions + 1, |
||||
CFG_PCI2_IO_BASE, |
||||
CFG_PCI2_IO_PHYS, |
||||
CFG_PCI2_IO_SIZE, |
||||
PCI_REGION_IO); |
||||
|
||||
hose[1].region_count = 2; |
||||
|
||||
pci_setup_indirect(&hose[1], |
||||
(CFG_IMMRBAR+0x8380), |
||||
(CFG_IMMRBAR+0x8384)); |
||||
|
||||
pci_hose_write_config_byte(&hose[1],PCI_BDF(0,0,0),PCI_CLASS_CODE,PCI_CLASS_BRIDGE);
|
||||
pci_hose_read_config_word (&hose[1],PCI_BDF(0,0,0), PCI_COMMAND, ®16); |
||||
reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; |
||||
pci_hose_write_config_word(&hose[1],PCI_BDF(0,0,0), PCI_COMMAND, reg16); |
||||
|
||||
/*
|
||||
* Clear non-reserved bits in status register. |
||||
*/ |
||||
pci_hose_write_config_word(&hose[1],PCI_BDF(0,0,0), PCI_STATUS, 0xffff); |
||||
pci_hose_write_config_byte(&hose[1],PCI_BDF(0,0,0), PCI_LATENCY_TIMER,0x80); |
||||
#endif |
||||
|
||||
#if defined(PCI_64BIT) |
||||
printf("PCI1 64bit on PMC2\n"); |
||||
#elif defined(PCI_ALL_PCI1) |
||||
printf("PCI1 32bit on PMC1 & PMC2 & PMC3\n"); |
||||
#elif defined(PCI_ONE_PCI1) |
||||
printf("PCI1 32bit on PMC1,PCI2 32bit on PMC2 & PMC3\n"); |
||||
#else |
||||
printf("PCI1 32bit on PMC1 & PMC2 & PMC3 in default\n"); |
||||
#endif |
||||
|
||||
#if 1 |
||||
/*
|
||||
* Hose scan. |
||||
*/ |
||||
pci_register_hose(hose); |
||||
hose->last_busno = pci_hose_scan(hose); |
||||
#endif |
||||
} |
||||
|
||||
#endif /* CONFIG_PCI */ |
@ -0,0 +1,6 @@ |
||||
.section .resetvec,"ax" |
||||
#ifndef FIXME |
||||
#if 0 |
||||
b _start_e500 |
||||
#endif
|
||||
#endif |
@ -0,0 +1,413 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor. |
||||
* (C) Copyright 2003 Motorola Inc. |
||||
* Xianghua Xiao (X.Xiao@motorola.com) |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/processor.h> |
||||
#include <i2c.h> |
||||
#include <spd.h> |
||||
#include <asm/mmu.h> |
||||
#include <spd_sdram.h> |
||||
|
||||
#ifdef CONFIG_SPD_EEPROM |
||||
|
||||
|
||||
#if defined(CONFIG_DDR_ECC) |
||||
extern void dma_init(void); |
||||
extern uint dma_check(void); |
||||
extern int dma_xfer(void *dest, uint count, void *src); |
||||
#endif |
||||
|
||||
|
||||
#ifndef CFG_READ_SPD |
||||
#define CFG_READ_SPD i2c_read |
||||
#endif |
||||
|
||||
|
||||
|
||||
/*
|
||||
* Convert picoseconds into clock cycles (rounding up if needed). |
||||
*/ |
||||
|
||||
int |
||||
picos_to_clk(int picos) |
||||
{ |
||||
int clks; |
||||
|
||||
clks = picos / (2000000000 / (get_bus_freq(0) / 1000)); |
||||
if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) { |
||||
clks++; |
||||
} |
||||
|
||||
return clks; |
||||
} |
||||
|
||||
|
||||
unsigned int |
||||
banksize(unsigned char row_dens) |
||||
{ |
||||
return ((row_dens >> 2) | ((row_dens & 3) << 6)) << 24; |
||||
} |
||||
|
||||
|
||||
long int spd_sdram(int(read_spd)(uint addr)) |
||||
{ |
||||
volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; |
||||
volatile ddr8349_t *ddr = &immap->ddr; |
||||
volatile law8349_t *ecm = &immap->sysconf.ddrlaw[0]; |
||||
spd_eeprom_t spd; |
||||
unsigned tmp, tmp1; |
||||
unsigned int memsize; |
||||
unsigned int law_size; |
||||
unsigned char caslat; |
||||
unsigned int trfc, trfc_clk, trfc_low; |
||||
|
||||
#warning Current spd_sdram does not fit its usage... adjust implementation or API... |
||||
|
||||
CFG_READ_SPD(SPD_EEPROM_ADDRESS, 0, 1, (uchar *) & spd, sizeof (spd)); |
||||
|
||||
if (spd.nrows > 2) { |
||||
puts("DDR:Only two chip selects are supported on ADS.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
if (spd.nrow_addr < 12 |
||||
|| spd.nrow_addr > 14 |
||||
|| spd.ncol_addr < 8 |
||||
|| spd.ncol_addr > 11) { |
||||
puts("DDR:Row or Col number unsupported.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
ddr->csbnds[2].csbnds = (banksize(spd.row_dens) >> 24) - 1; |
||||
ddr->cs_config[2] = ( 1 << 31 |
||||
| (spd.nrow_addr - 12) << 8 |
||||
| (spd.ncol_addr - 8) ); |
||||
debug("\n"); |
||||
debug("cs2_bnds = 0x%08x\n",ddr->csbnds[2].csbnds); |
||||
debug("cs2_config = 0x%08x\n",ddr->cs_config[2]); |
||||
|
||||
if (spd.nrows == 2) { |
||||
ddr->csbnds[3].csbnds = ( (banksize(spd.row_dens) >> 8) |
||||
| ((banksize(spd.row_dens) >> 23) - 1) ); |
||||
ddr->cs_config[3] = ( 1<<31 |
||||
| (spd.nrow_addr-12) << 8 |
||||
| (spd.ncol_addr-8) ); |
||||
debug("cs3_bnds = 0x%08x\n",ddr->csbnds[3].csbnds); |
||||
debug("cs3_config = 0x%08x\n",ddr->cs_config[3]); |
||||
} |
||||
|
||||
if (spd.mem_type != 0x07) { |
||||
puts("No DDR module found!\n"); |
||||
return 0; |
||||
} |
||||
|
||||
/*
|
||||
* Figure out memory size in Megabytes. |
||||
*/ |
||||
memsize = spd.nrows * banksize(spd.row_dens) / 0x100000; |
||||
|
||||
/*
|
||||
* First supported LAW size is 16M, at LAWAR_SIZE_16M == 23. |
||||
*/ |
||||
law_size = 19 + __ilog2(memsize); |
||||
|
||||
/*
|
||||
* Set up LAWBAR for all of DDR. |
||||
*/ |
||||
ecm->bar = ((CFG_DDR_SDRAM_BASE>>12) & 0xfffff); |
||||
ecm->ar = (LAWAR_EN | LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & law_size)); |
||||
debug("DDR:bar=0x%08x\n", ecm->bar); |
||||
debug("DDR:ar=0x%08x\n", ecm->ar); |
||||
|
||||
/*
|
||||
* find the largest CAS |
||||
*/ |
||||
if(spd.cas_lat & 0x40) { |
||||
caslat = 7; |
||||
} else if (spd.cas_lat & 0x20) { |
||||
caslat = 6; |
||||
} else if (spd.cas_lat & 0x10) { |
||||
caslat = 5; |
||||
} else if (spd.cas_lat & 0x08) { |
||||
caslat = 4; |
||||
} else if (spd.cas_lat & 0x04) { |
||||
caslat = 3; |
||||
} else if (spd.cas_lat & 0x02) { |
||||
caslat = 2; |
||||
} else if (spd.cas_lat & 0x01) { |
||||
caslat = 1; |
||||
} else { |
||||
puts("DDR:no valid CAS Latency information.\n"); |
||||
return 0; |
||||
} |
||||
|
||||
tmp = 20000 / (((spd.clk_cycle & 0xF0) >> 4) * 10 |
||||
+ (spd.clk_cycle & 0x0f)); |
||||
debug("DDR:Module maximum data rate is: %dMhz\n", tmp); |
||||
|
||||
tmp1 = get_bus_freq(0) / 1000000; |
||||
if (tmp1 < 230 && tmp1 >= 90 && tmp >= 230) { |
||||
/* 90~230 range, treated as DDR 200 */ |
||||
if (spd.clk_cycle3 == 0xa0) |
||||
caslat -= 2; |
||||
else if(spd.clk_cycle2 == 0xa0) |
||||
caslat--; |
||||
} else if (tmp1 < 280 && tmp1 >= 230 && tmp >= 280) { |
||||
/* 230-280 range, treated as DDR 266 */ |
||||
if (spd.clk_cycle3 == 0x75) |
||||
caslat -= 2; |
||||
else if (spd.clk_cycle2 == 0x75) |
||||
caslat--; |
||||
} else if (tmp1 < 350 && tmp1 >= 280 && tmp >= 350) { |
||||
/* 280~350 range, treated as DDR 333 */ |
||||
if (spd.clk_cycle3 == 0x60) |
||||
caslat -= 2; |
||||
else if (spd.clk_cycle2 == 0x60) |
||||
caslat--; |
||||
} else if (tmp1 < 90 || tmp1 >= 350) { |
||||
/* DDR rate out-of-range */ |
||||
puts("DDR:platform frequency is not fit for DDR rate\n"); |
||||
return 0; |
||||
} |
||||
|
||||
/*
|
||||
* note: caslat must also be programmed into ddr->sdram_mode |
||||
* register. |
||||
* |
||||
* note: WRREC(Twr) and WRTORD(Twtr) are not in SPD, |
||||
* use conservative value here. |
||||
*/ |
||||
trfc = spd.trfc * 1000; /* up to ps */ |
||||
trfc_clk = picos_to_clk(trfc); |
||||
trfc_low = (trfc_clk - 8) & 0xf; |
||||
|
||||
ddr->timing_cfg_1 = |
||||
(((picos_to_clk(spd.trp * 250) & 0x07) << 28 ) | |
||||
((picos_to_clk(spd.tras * 1000) & 0x0f ) << 24 ) | |
||||
((picos_to_clk(spd.trcd * 250) & 0x07) << 20 ) | |
||||
((caslat & 0x07) << 16 ) | |
||||
(trfc_low << 12 ) | |
||||
( 0x300 ) | |
||||
((picos_to_clk(spd.trrd * 250) & 0x07) << 4) | 1); |
||||
|
||||
ddr->timing_cfg_2 = 0x00000800; |
||||
|
||||
debug("DDR:timing_cfg_1=0x%08x\n", ddr->timing_cfg_1); |
||||
debug("DDR:timing_cfg_2=0x%08x\n", ddr->timing_cfg_2); |
||||
|
||||
/*
|
||||
* Only DDR I is supported |
||||
* DDR I and II have different mode-register-set definition |
||||
*/ |
||||
|
||||
/* burst length is always 4 */ |
||||
switch(caslat) { |
||||
case 2: |
||||
ddr->sdram_mode = 0x52; /* 1.5 */ |
||||
break; |
||||
case 3: |
||||
ddr->sdram_mode = 0x22; /* 2.0 */ |
||||
break; |
||||
case 4: |
||||
ddr->sdram_mode = 0x62; /* 2.5 */ |
||||
break; |
||||
case 5: |
||||
ddr->sdram_mode = 0x32; /* 3.0 */ |
||||
break; |
||||
default: |
||||
puts("DDR:only CAS Latency 1.5, 2.0, 2.5, 3.0 is supported.\n"); |
||||
return 0; |
||||
} |
||||
debug("DDR:sdram_mode=0x%08x\n", ddr->sdram_mode); |
||||
|
||||
switch(spd.refresh) { |
||||
case 0x00: |
||||
case 0x80: |
||||
tmp = picos_to_clk(15625000); |
||||
break; |
||||
case 0x01: |
||||
case 0x81: |
||||
tmp = picos_to_clk(3900000); |
||||
break; |
||||
case 0x02: |
||||
case 0x82: |
||||
tmp = picos_to_clk(7800000); |
||||
break; |
||||
case 0x03: |
||||
case 0x83: |
||||
tmp = picos_to_clk(31300000); |
||||
break; |
||||
case 0x04: |
||||
case 0x84: |
||||
tmp = picos_to_clk(62500000); |
||||
break; |
||||
case 0x05: |
||||
case 0x85: |
||||
tmp = picos_to_clk(125000000); |
||||
break; |
||||
default: |
||||
tmp = 0x512; |
||||
break; |
||||
} |
||||
|
||||
/*
|
||||
* Set BSTOPRE to 0x100 for page mode |
||||
* If auto-charge is used, set BSTOPRE = 0 |
||||
*/ |
||||
ddr->sdram_interval = ((tmp & 0x3fff) << 16) | 0x100; |
||||
debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval); |
||||
|
||||
/*
|
||||
* Is this an ECC DDR chip? |
||||
*/ |
||||
#if defined(CONFIG_DDR_ECC) |
||||
if (spd.config == 0x02) { |
||||
ddr->err_disable = 0x0000000d; |
||||
ddr->err_sbe = 0x00ff0000; |
||||
} |
||||
debug("DDR:err_disable=0x%08x\n", ddr->err_disable); |
||||
debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe); |
||||
#endif |
||||
asm("sync;isync"); |
||||
|
||||
udelay(500); |
||||
|
||||
|
||||
ddr->sdram_clk_cntl = 0x82000000;/*SS_EN=1, CLK_ADJST = 2-MCK/MCK_B, is lauched 1/2 of one SDRAM clock cycle after address/command*/ |
||||
|
||||
|
||||
/*
|
||||
* Figure out the settings for the sdram_cfg register. Build up |
||||
* the entire register in 'tmp' before writing since the write into |
||||
* the register will actually enable the memory controller, and all |
||||
* settings must be done before enabling. |
||||
* |
||||
* sdram_cfg[0] = 1 (ddr sdram logic enable) |
||||
* sdram_cfg[1] = 1 (self-refresh-enable) |
||||
* sdram_cfg[6:7] = 2 (SDRAM type = DDR SDRAM) |
||||
*/ |
||||
tmp = 0xc2000000; |
||||
|
||||
/*
|
||||
* sdram_cfg[3] = RD_EN - registered DIMM enable |
||||
* A value of 0x26 indicates micron registered DIMMS (micron.com) |
||||
*/ |
||||
if (spd.mod_attr == 0x26) { |
||||
tmp |= 0x10000000; |
||||
} |
||||
|
||||
#if defined(CONFIG_DDR_ECC) |
||||
/*
|
||||
* If the user wanted ECC (enabled via sdram_cfg[2]) |
||||
*/ |
||||
if (spd.config == 0x02) { |
||||
tmp |= 0x20000000; |
||||
} |
||||
#endif |
||||
|
||||
#if defined(CONFIG_DDR_2T_TIMING) |
||||
/*
|
||||
* Enable 2T timing by setting sdram_cfg[16]. |
||||
*/ |
||||
tmp |= SDRAM_CFG_2T_EN; |
||||
#endif |
||||
|
||||
ddr->sdram_cfg = tmp; |
||||
|
||||
asm("sync;isync"); |
||||
udelay(500); |
||||
|
||||
debug("DDR:sdram_cfg=0x%08x\n", ddr->sdram_cfg); |
||||
|
||||
return memsize;/*in MBytes*/ |
||||
} |
||||
|
||||
#endif /* CONFIG_SPD_EEPROM */ |
||||
|
||||
|
||||
#if defined(CONFIG_DDR_ECC) |
||||
/*
|
||||
* Initialize all of memory for ECC, then enable errors. |
||||
*/ |
||||
|
||||
void |
||||
ddr_enable_ecc(unsigned int dram_size) |
||||
{ |
||||
#ifndef FIXME |
||||
uint *p = 0; |
||||
uint i = 0; |
||||
volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; |
||||
volatile ccsr_ddr_t *ddr= &immap->im_ddr; |
||||
|
||||
dma_init(); |
||||
|
||||
for (*p = 0; p < (uint *)(8 * 1024); p++) { |
||||
if (((unsigned int)p & 0x1f) == 0) { |
||||
ppcDcbz((unsigned long) p); |
||||
} |
||||
*p = (unsigned int)0xdeadbeef; |
||||
if (((unsigned int)p & 0x1c) == 0x1c) { |
||||
ppcDcbf((unsigned long) p); |
||||
} |
||||
} |
||||
|
||||
/* 8K */ |
||||
dma_xfer((uint *)0x2000, 0x2000, (uint *)0); |
||||
/* 16K */ |
||||
dma_xfer((uint *)0x4000, 0x4000, (uint *)0); |
||||
/* 32K */ |
||||
dma_xfer((uint *)0x8000, 0x8000, (uint *)0); |
||||
/* 64K */ |
||||
dma_xfer((uint *)0x10000, 0x10000, (uint *)0); |
||||
/* 128k */ |
||||
dma_xfer((uint *)0x20000, 0x20000, (uint *)0); |
||||
/* 256k */ |
||||
dma_xfer((uint *)0x40000, 0x40000, (uint *)0); |
||||
/* 512k */ |
||||
dma_xfer((uint *)0x80000, 0x80000, (uint *)0); |
||||
/* 1M */ |
||||
dma_xfer((uint *)0x100000, 0x100000, (uint *)0); |
||||
/* 2M */ |
||||
dma_xfer((uint *)0x200000, 0x200000, (uint *)0); |
||||
/* 4M */ |
||||
dma_xfer((uint *)0x400000, 0x400000, (uint *)0); |
||||
|
||||
for (i = 1; i < dram_size / 0x800000; i++) { |
||||
dma_xfer((uint *)(0x800000*i), 0x800000, (uint *)0); |
||||
} |
||||
|
||||
/*
|
||||
* Enable errors for ECC. |
||||
*/ |
||||
ddr->err_disable = 0x00000000; |
||||
asm("sync;isync"); |
||||
#endif |
||||
} |
||||
|
||||
#endif /* CONFIG_DDR_ECC */ |
@ -0,0 +1,424 @@ |
||||
/*
|
||||
* (C) Copyright 2000-2002 |
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
||||
* |
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <mpc83xx.h> |
||||
#include <asm/processor.h> |
||||
|
||||
/* ----------------------------------------------------------------- */ |
||||
|
||||
typedef enum { |
||||
_unk, |
||||
_off, |
||||
_byp, |
||||
_x8, |
||||
_x4, |
||||
_x2, |
||||
_x1, |
||||
_1x, |
||||
_1_5x, |
||||
_2x, |
||||
_2_5x, |
||||
_3x |
||||
} mult_t; |
||||
|
||||
typedef struct { |
||||
mult_t core_csb_ratio; |
||||
mult_t vco_divider; |
||||
} corecnf_t; |
||||
|
||||
corecnf_t corecnf_tab[] = { |
||||
{ _byp, _byp}, /* 0x00 */ |
||||
{ _byp, _byp}, /* 0x01 */ |
||||
{ _byp, _byp}, /* 0x02 */ |
||||
{ _byp, _byp}, /* 0x03 */ |
||||
{ _byp, _byp}, /* 0x04 */ |
||||
{ _byp, _byp}, /* 0x05 */ |
||||
{ _byp, _byp}, /* 0x06 */ |
||||
{ _byp, _byp}, /* 0x07 */ |
||||
{ _1x, _x2}, /* 0x08 */ |
||||
{ _1x, _x4}, /* 0x09 */ |
||||
{ _1x, _x8}, /* 0x0A */ |
||||
{ _1x, _x8}, /* 0x0B */ |
||||
{_1_5x, _x2}, /* 0x0C */ |
||||
{_1_5x, _x4}, /* 0x0D */ |
||||
{_1_5x, _x8}, /* 0x0E */ |
||||
{_1_5x, _x8}, /* 0x0F */ |
||||
{ _2x, _x2}, /* 0x10 */ |
||||
{ _2x, _x4}, /* 0x11 */ |
||||
{ _2x, _x8}, /* 0x12 */ |
||||
{ _2x, _x8}, /* 0x13 */ |
||||
{_2_5x, _x2}, /* 0x14 */ |
||||
{_2_5x, _x4}, /* 0x15 */ |
||||
{_2_5x, _x8}, /* 0x16 */ |
||||
{_2_5x, _x8}, /* 0x17 */ |
||||
{ _3x, _x2}, /* 0x18 */ |
||||
{ _3x, _x4}, /* 0x19 */ |
||||
{ _3x, _x8}, /* 0x1A */ |
||||
{ _3x, _x8}, /* 0x1B */ |
||||
}; |
||||
|
||||
/* ----------------------------------------------------------------- */ |
||||
|
||||
/*
|
||||
* |
||||
*/ |
||||
int get_clocks (void) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
volatile immap_t *im = (immap_t *)CFG_IMMRBAR; |
||||
u32 pci_sync_in; |
||||
u8 spmf; |
||||
u8 clkin_div; |
||||
u32 sccr; |
||||
u32 corecnf_tab_index; |
||||
u8 corepll; |
||||
u32 lcrr; |
||||
|
||||
u32 csb_clk; |
||||
u32 tsec1_clk; |
||||
u32 tsec2_clk; |
||||
u32 core_clk; |
||||
u32 usbmph_clk; |
||||
u32 usbdr_clk; |
||||
u32 i2c_clk; |
||||
u32 enc_clk; |
||||
u32 lbiu_clk; |
||||
u32 lclk_clk; |
||||
u32 ddr_clk; |
||||
|
||||
if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im) |
||||
return -1; |
||||
|
||||
#ifndef CFG_HRCW_HIGH |
||||
# error "CFG_HRCW_HIGH must be defined in include/configs/MCP83XXADS.h" |
||||
#endif /* CFG_HCWD_HIGH */ |
||||
|
||||
#if (CFG_HRCW_HIGH & HRCWH_PCI_HOST) |
||||
# ifndef CONFIG_83XX_CLKIN |
||||
# error "In PCI Host Mode, CONFIG_83XX_CLKIN must be defined in include/configs/MCP83XXADS.h" |
||||
# endif /* CONFIG_83XX_CLKIN */ |
||||
# ifdef CONFIG_83XX_PCICLK |
||||
# warning "In PCI Host Mode, CONFIG_83XX_PCICLK in include/configs/MCP83XXADS.h is igonred." |
||||
# endif /* CONFIG_83XX_PCICLK */ |
||||
/* PCI Host Mode */ |
||||
if (!(im->reset.rcwh & RCWH_PCIHOST)) { |
||||
/* though RCWH_PCIHOST is defined in CFG_HRCW_HIGH the im->reset.rcwhr PCI Host Mode is disabled */ |
||||
/* FIXME: findout if there is a way to issue some warning */ |
||||
return -2; |
||||
|
||||
} |
||||
if (im->clk.spmr & SPMR_CKID) { |
||||
pci_sync_in = CONFIG_83XX_CLKIN / 2; /* PCI Clock is half CONFIG_83XX_CLKIN */ |
||||
} |
||||
else { |
||||
pci_sync_in = CONFIG_83XX_CLKIN; |
||||
} |
||||
#else |
||||
# ifdef CONFIG_83XX_CLKIN |
||||
# warning "In PCI Agent Mode, CONFIG_83XX_CLKIN in include/configs/MCP83XXADS.h is igonred." |
||||
# endif /* CONFIG_83XX_CLKIN */ |
||||
# ifndef CONFIG_83XX_PCICLK |
||||
# error "In PCI Agent Mode, CONFIG_83XX_PCICLK must be defined in include/configs/MCP83XXADS.h" |
||||
# endif /* CONFIG_83XX_PCICLK */ |
||||
/* PCI Agent Mode */ |
||||
if (im->reset.rcwh & RCWH_PCIHOST) { |
||||
/* though RCWH_PCIHOST is not defined in CFG_HRCW_HIGH the im->reset.rcwhr PCI Host Mode is enabled */ |
||||
return -3; |
||||
} |
||||
pci_sync_in = CONFIG_83XX_PCICLK; |
||||
#endif /* (CFG_HRCW_HIGH | RCWH_PCIHOST) */ |
||||
|
||||
/* we have up to date pci_sync_in */ |
||||
|
||||
spmf = ((im->reset.rcwl & RCWL_SPMF) >> RCWL_SPMF_SHIFT); |
||||
clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT); |
||||
|
||||
if ((im->reset.rcwl & RCWL_LBIUCM) || (im->reset.rcwl & RCWL_DDRCM)) { |
||||
csb_clk = (pci_sync_in * spmf * (1 + clkin_div)) / 2; |
||||
} |
||||
else { |
||||
csb_clk = pci_sync_in * spmf * (1 + clkin_div); |
||||
} |
||||
|
||||
sccr = im->clk.sccr; |
||||
switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) { |
||||
case 0: |
||||
tsec1_clk = 0; |
||||
break; |
||||
case 1: |
||||
tsec1_clk = csb_clk; |
||||
break; |
||||
case 2: |
||||
tsec1_clk = csb_clk / 2; |
||||
break; |
||||
case 3: |
||||
tsec1_clk = csb_clk / 3; |
||||
break; |
||||
default: |
||||
/* unkown SCCR_TSEC1CM value */ |
||||
return -4; |
||||
} |
||||
|
||||
switch ((sccr & SCCR_TSEC2CM) >> SCCR_TSEC2CM_SHIFT) { |
||||
case 0: |
||||
tsec2_clk = 0; |
||||
break; |
||||
case 1: |
||||
tsec2_clk = csb_clk; |
||||
break; |
||||
case 2: |
||||
tsec2_clk = csb_clk / 2; |
||||
break; |
||||
case 3: |
||||
tsec2_clk = csb_clk / 3; |
||||
break; |
||||
default: |
||||
/* unkown SCCR_TSEC2CM value */ |
||||
return -5; |
||||
} |
||||
i2c_clk = tsec2_clk; |
||||
|
||||
switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) { |
||||
case 0: |
||||
enc_clk = 0; |
||||
break; |
||||
case 1: |
||||
enc_clk = csb_clk; |
||||
break; |
||||
case 2: |
||||
enc_clk = csb_clk / 2; |
||||
break; |
||||
case 3: |
||||
enc_clk = csb_clk / 3; |
||||
break; |
||||
default: |
||||
/* unkown SCCR_ENCCM value */ |
||||
return -6; |
||||
} |
||||
|
||||
switch ((sccr & SCCR_USBMPHCM) >> SCCR_USBMPHCM_SHIFT) { |
||||
case 0: |
||||
usbmph_clk = 0; |
||||
break; |
||||
case 1: |
||||
usbmph_clk = csb_clk; |
||||
break; |
||||
case 2: |
||||
usbmph_clk = csb_clk / 2; |
||||
break; |
||||
case 3: |
||||
usbmph_clk = csb_clk / 3; |
||||
break; |
||||
default: |
||||
/* unkown SCCR_USBMPHCM value */ |
||||
return -7; |
||||
} |
||||
|
||||
switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) { |
||||
case 0: |
||||
usbdr_clk = 0; |
||||
break; |
||||
case 1: |
||||
usbdr_clk = csb_clk; |
||||
break; |
||||
case 2: |
||||
usbdr_clk = csb_clk / 2; |
||||
break; |
||||
case 3: |
||||
usbdr_clk = csb_clk / 3; |
||||
break; |
||||
default: |
||||
/* unkown SCCR_USBDRCM value */ |
||||
return -8; |
||||
} |
||||
|
||||
if (usbmph_clk != 0 |
||||
&& usbdr_clk != 0 |
||||
&& usbmph_clk != usbdr_clk ) { |
||||
/* if USB MPH clock is not disabled and USB DR clock is not disabled than USB MPH & USB DR must have the same rate */ |
||||
return -9; |
||||
} |
||||
|
||||
lbiu_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); |
||||
lcrr = (im->lbus.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT; |
||||
switch (lcrr) { |
||||
case 2: |
||||
case 4: |
||||
case 8: |
||||
lclk_clk = lbiu_clk / lcrr; |
||||
break; |
||||
default: |
||||
/* unknown lcrr */ |
||||
return -10; |
||||
} |
||||
|
||||
ddr_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT)); |
||||
|
||||
corepll = (im->reset.rcwl & RCWL_COREPLL) >> RCWL_COREPLL_SHIFT; |
||||
corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5); |
||||
if (corecnf_tab_index > (sizeof(corecnf_tab)/sizeof(corecnf_t)) ) { |
||||
/* corecnf_tab_index is too high, possibly worng value */ |
||||
return -11; |
||||
} |
||||
switch (corecnf_tab[corecnf_tab_index].core_csb_ratio) { |
||||
case _byp: |
||||
case _x1: |
||||
case _1x: |
||||
core_clk = csb_clk; |
||||
break; |
||||
case _1_5x: |
||||
core_clk = (3 * csb_clk) / 2; |
||||
break; |
||||
case _2x: |
||||
core_clk = 2 * csb_clk; |
||||
break; |
||||
case _2_5x: |
||||
core_clk = ( 5 * csb_clk) / 2; |
||||
break; |
||||
case _3x: |
||||
core_clk = 3 * csb_clk; |
||||
break; |
||||
default: |
||||
/* unkown core to csb ratio */ |
||||
return -12; |
||||
} |
||||
|
||||
gd->csb_clk = csb_clk ; |
||||
gd->tsec1_clk = tsec1_clk ; |
||||
gd->tsec2_clk = tsec2_clk ; |
||||
gd->core_clk = core_clk ; |
||||
gd->usbmph_clk = usbmph_clk; |
||||
gd->usbdr_clk = usbdr_clk ; |
||||
gd->i2c_clk = i2c_clk ; |
||||
gd->enc_clk = enc_clk ;
|
||||
gd->lbiu_clk = lbiu_clk ; |
||||
gd->lclk_clk = lclk_clk ; |
||||
gd->ddr_clk = ddr_clk ; |
||||
|
||||
gd->cpu_clk = gd->core_clk; |
||||
gd->bus_clk = gd->lbiu_clk; |
||||
return 0; |
||||
} |
||||
|
||||
/********************************************
|
||||
* get_bus_freq |
||||
* return system bus freq in Hz |
||||
*********************************************/ |
||||
ulong get_bus_freq (ulong dummy) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
return gd->csb_clk; |
||||
} |
||||
|
||||
int print_clock_conf (void) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
printf("Clock configuration:\n"); |
||||
printf(" Coherent System Bus: %4d MHz\n",gd->csb_clk/1000000); |
||||
printf(" Core: %4d MHz\n",gd->core_clk/1000000); |
||||
printf(" Local Bus Controller:%4d MHz\n",gd->lbiu_clk/1000000); |
||||
printf(" Local Bus: %4d MHz\n",gd->lclk_clk/1000000); |
||||
printf(" DDR: %4d MHz\n",gd->ddr_clk/1000000); |
||||
printf(" I2C: %4d MHz\n",gd->i2c_clk/1000000); |
||||
printf(" TSEC1: %4d MHz\n",gd->tsec1_clk/1000000); |
||||
printf(" TSEC2: %4d MHz\n",gd->tsec2_clk/1000000); |
||||
printf(" USB MPH: %4d MHz\n",gd->usbmph_clk/1000000); |
||||
printf(" USB DR: %4d MHz\n",gd->usbdr_clk/1000000); |
||||
|
||||
#if 0 |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
volatile immap_t *immap = (immap_t *) CFG_IMMR; |
||||
ulong sccr, dfbrg; |
||||
ulong scmr, corecnf, busdf, cpmdf, plldf, pllmf; |
||||
corecnf_t *cp; |
||||
|
||||
sccr = immap->im_clkrst.car_sccr; |
||||
dfbrg = (sccr & SCCR_DFBRG_MSK) >> SCCR_DFBRG_SHIFT; |
||||
|
||||
scmr = immap->im_clkrst.car_scmr; |
||||
corecnf = (scmr & SCMR_CORECNF_MSK) >> SCMR_CORECNF_SHIFT; |
||||
busdf = (scmr & SCMR_BUSDF_MSK) >> SCMR_BUSDF_SHIFT; |
||||
cpmdf = (scmr & SCMR_CPMDF_MSK) >> SCMR_CPMDF_SHIFT; |
||||
plldf = (scmr & SCMR_PLLDF) ? 1 : 0; |
||||
pllmf = (scmr & SCMR_PLLMF_MSK) >> SCMR_PLLMF_SHIFT; |
||||
|
||||
cp = &corecnf_tab[corecnf]; |
||||
|
||||
puts (CPU_ID_STR " Clock Configuration\n - Bus-to-Core Mult "); |
||||
|
||||
switch (cp->b2c_mult) { |
||||
case _byp: |
||||
puts ("BYPASS"); |
||||
break; |
||||
|
||||
case _off: |
||||
puts ("OFF"); |
||||
break; |
||||
|
||||
case _unk: |
||||
puts ("UNKNOWN"); |
||||
break; |
||||
|
||||
default: |
||||
printf ("%d%sx", |
||||
cp->b2c_mult / 2, |
||||
(cp->b2c_mult % 2) ? ".5" : ""); |
||||
break; |
||||
} |
||||
|
||||
printf (", VCO Div %d, 60x Bus Freq %s, Core Freq %s\n", |
||||
cp->vco_div, cp->freq_60x, cp->freq_core); |
||||
|
||||
printf (" - dfbrg %ld, corecnf 0x%02lx, busdf %ld, cpmdf %ld, " |
||||
"plldf %ld, pllmf %ld\n", dfbrg, corecnf, busdf, cpmdf, plldf, |
||||
pllmf); |
||||
|
||||
printf (" - vco_out %10ld, scc_clk %10ld, brg_clk %10ld\n", |
||||
gd->vco_out, gd->scc_clk, gd->brg_clk); |
||||
|
||||
printf (" - cpu_clk %10ld, cpm_clk %10ld, bus_clk %10ld\n", |
||||
gd->cpu_clk, gd->cpm_clk, gd->bus_clk); |
||||
|
||||
if (sccr & SCCR_PCI_MODE) { |
||||
uint pci_div; |
||||
|
||||
pci_div = ( (sccr & SCCR_PCI_MODCK) ? 2 : 1) * |
||||
( ( (sccr & SCCR_PCIDF_MSK) >> SCCR_PCIDF_SHIFT) + 1); |
||||
|
||||
printf (" - pci_clk %10ld\n", (gd->cpm_clk * 2) / pci_div); |
||||
} |
||||
putc ('\n'); |
||||
#endif |
||||
return (0); |
||||
} |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,274 @@ |
||||
/*
|
||||
* linux/arch/ppc/kernel/traps.c |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
* |
||||
* Change log: |
||||
* |
||||
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
||||
* |
||||
* Modified by Cort Dougan (cort@cs.nmt.edu) |
||||
* and Paul Mackerras (paulus@cs.anu.edu.au) |
||||
* |
||||
* (C) Copyright 2000 |
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
||||
* |
||||
* 20050101: Eran Liberty (liberty@freescale.com) |
||||
* Initial file creating (porting from 85XX & 8260) |
||||
*/ |
||||
|
||||
/*
|
||||
* This file handles the architecture-dependent parts of hardware |
||||
* exceptions |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <asm/processor.h> |
||||
#include <asm/mpc8349_pci.h> |
||||
|
||||
/* Returns 0 if exception not found and fixup otherwise. */ |
||||
extern unsigned long search_exception_table(unsigned long); |
||||
|
||||
#define END_OF_MEM (gd->bd->bi_memstart + gd->bd->bi_memsize) |
||||
|
||||
/*
|
||||
* Trap & Exception support |
||||
*/ |
||||
|
||||
void |
||||
print_backtrace(unsigned long *sp) |
||||
{ |
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
int cnt = 0; |
||||
unsigned long i; |
||||
|
||||
puts ("Call backtrace: "); |
||||
while (sp) { |
||||
if ((uint)sp > END_OF_MEM) |
||||
break; |
||||
|
||||
i = sp[1]; |
||||
if (cnt++ % 7 == 0) |
||||
putc ('\n'); |
||||
printf("%08lX ", i); |
||||
if (cnt > 32) break; |
||||
sp = (unsigned long *)*sp; |
||||
} |
||||
putc ('\n'); |
||||
} |
||||
|
||||
void show_regs(struct pt_regs * regs) |
||||
{ |
||||
int i; |
||||
|
||||
printf("NIP: %08lX XER: %08lX LR: %08lX REGS: %p TRAP: %04lx DAR: %08lX\n", |
||||
regs->nip, regs->xer, regs->link, regs, regs->trap, regs->dar); |
||||
printf("MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n", |
||||
regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0, |
||||
regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0, |
||||
regs->msr&MSR_IR ? 1 : 0, |
||||
regs->msr&MSR_DR ? 1 : 0); |
||||
|
||||
putc ('\n'); |
||||
for (i = 0; i < 32; i++) { |
||||
if ((i % 8) == 0) { |
||||
printf("GPR%02d: ", i); |
||||
} |
||||
|
||||
printf("%08lX ", regs->gpr[i]); |
||||
if ((i % 8) == 7) { |
||||
putc ('\n'); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
void |
||||
_exception(int signr, struct pt_regs *regs) |
||||
{ |
||||
show_regs(regs); |
||||
print_backtrace((unsigned long *)regs->gpr[1]); |
||||
panic("Exception in kernel pc %lx signal %d",regs->nip,signr); |
||||
} |
||||
|
||||
#ifdef CONFIG_PCI |
||||
void dump_pci (void) |
||||
{ |
||||
/*
|
||||
volatile immap_t *immap = (immap_t *) CFG_IMMR; |
||||
printf ("PCI: err status %x err mask %x err ctrl %x\n", |
||||
le32_to_cpu (immap->im_pci.pci_esr), |
||||
le32_to_cpu (immap->im_pci.pci_emr), |
||||
le32_to_cpu (immap->im_pci.pci_ecr)); |
||||
printf (" error address %x error data %x ctrl %x\n", |
||||
le32_to_cpu (immap->im_pci.pci_eacr), |
||||
le32_to_cpu (immap->im_pci.pci_edcr), |
||||
le32_to_cpu (immap->im_pci.pci_eccr)); |
||||
*/ |
||||
} |
||||
#endif |
||||
|
||||
void |
||||
MachineCheckException(struct pt_regs *regs) |
||||
{ |
||||
unsigned long fixup; |
||||
|
||||
/* Probing PCI using config cycles cause this exception
|
||||
* when a device is not present. Catch it and return to |
||||
* the PCI exception handler. |
||||
*/ |
||||
#ifdef CONFIG_PCI |
||||
#if 0 |
||||
volatile immap_t *immap = (immap_t *)CFG_IMMR; |
||||
#ifdef DEBUG |
||||
dump_pci(); |
||||
#endif |
||||
/* clear the error in the error status register */ |
||||
if(immap->im_pci.pci_esr & cpu_to_le32(PCI_ERROR_PCI_NO_RSP)) { |
||||
immap->im_pci.pci_esr = cpu_to_le32(PCI_ERROR_PCI_NO_RSP); |
||||
return; |
||||
} |
||||
#endif |
||||
#endif /* CONFIG_PCI */ |
||||
if ((fixup = search_exception_table(regs->nip)) != 0) { |
||||
regs->nip = fixup; |
||||
return; |
||||
} |
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
if (debugger_exception_handler && (*debugger_exception_handler)(regs)) |
||||
return; |
||||
#endif |
||||
|
||||
puts ("Machine check in kernel mode.\n" |
||||
"Caused by (from msr): "); |
||||
printf("regs %p ",regs); |
||||
switch( regs->msr & 0x000F0000) { |
||||
case (0x80000000>>12): |
||||
puts ("Machine check signal - probably due to mm fault\n" |
||||
"with mmu off\n"); |
||||
break; |
||||
case (0x80000000>>13): |
||||
puts ("Transfer error ack signal\n"); |
||||
break; |
||||
case (0x80000000>>14): |
||||
puts ("Data parity signal\n"); |
||||
break; |
||||
case (0x80000000>>15): |
||||
puts ("Address parity signal\n"); |
||||
break; |
||||
default: |
||||
puts ("Unknown values in msr\n"); |
||||
} |
||||
show_regs(regs); |
||||
print_backtrace((unsigned long *)regs->gpr[1]); |
||||
#ifdef CONFIG_PCI |
||||
dump_pci(); |
||||
#endif |
||||
panic("machine check"); |
||||
} |
||||
|
||||
void |
||||
AlignmentException(struct pt_regs *regs) |
||||
{ |
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
if (debugger_exception_handler && (*debugger_exception_handler)(regs)) |
||||
return; |
||||
#endif |
||||
show_regs(regs); |
||||
print_backtrace((unsigned long *)regs->gpr[1]); |
||||
panic("Alignment Exception"); |
||||
} |
||||
|
||||
void |
||||
ProgramCheckException(struct pt_regs *regs) |
||||
{ |
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
if (debugger_exception_handler && (*debugger_exception_handler)(regs)) |
||||
return; |
||||
#endif |
||||
show_regs(regs); |
||||
print_backtrace((unsigned long *)regs->gpr[1]); |
||||
panic("Program Check Exception"); |
||||
} |
||||
|
||||
void |
||||
SoftEmuException(struct pt_regs *regs) |
||||
{ |
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
if (debugger_exception_handler && (*debugger_exception_handler)(regs)) |
||||
return; |
||||
#endif |
||||
show_regs(regs); |
||||
print_backtrace((unsigned long *)regs->gpr[1]); |
||||
panic("Software Emulation Exception"); |
||||
} |
||||
|
||||
|
||||
void |
||||
UnknownException(struct pt_regs *regs) |
||||
{ |
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
if (debugger_exception_handler && (*debugger_exception_handler)(regs)) |
||||
return; |
||||
#endif |
||||
printf("Bad trap at PC: %lx, SR: %lx, vector=%lx\n", |
||||
regs->nip, regs->msr, regs->trap); |
||||
_exception(0, regs); |
||||
} |
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_BEDBUG) |
||||
extern void do_bedbug_breakpoint(struct pt_regs *); |
||||
#endif |
||||
|
||||
void |
||||
DebugException(struct pt_regs *regs) |
||||
{ |
||||
printf("Debugger trap at @ %lx\n", regs->nip ); |
||||
show_regs(regs); |
||||
#if (CONFIG_COMMANDS & CFG_CMD_BEDBUG) |
||||
do_bedbug_breakpoint( regs ); |
||||
#endif |
||||
} |
||||
|
||||
/* Probe an address by reading. If not present, return -1, otherwise
|
||||
* return 0. |
||||
*/ |
||||
int |
||||
addr_probe(uint *addr) |
||||
{ |
||||
#if 0 |
||||
int retval; |
||||
|
||||
__asm__ __volatile__( \
|
||||
"1: lwz %0,0(%1)\n" \
|
||||
" eieio\n" \
|
||||
" li %0,0\n" \
|
||||
"2:\n" \
|
||||
".section .fixup,\"ax\"\n" \
|
||||
"3: li %0,-1\n" \
|
||||
" b 2b\n" \
|
||||
".section __ex_table,\"a\"\n" \
|
||||
" .align 2\n" \
|
||||
" .long 1b,3b\n" \
|
||||
".text" \
|
||||
: "=r" (retval) : "r"(addr)); |
||||
|
||||
return (retval); |
||||
#endif |
||||
return 0; |
||||
} |
@ -0,0 +1,96 @@ |
||||
Freescale MPC83xx ADS Boards |
||||
----------------------------------------- |
||||
|
||||
0. Toolchain / Building |
||||
|
||||
% setenv CROSS_COMPILE /usr/powerpc/bin/powerpc-linux- |
||||
|
||||
% /usr/powerpc/bin/powerpc-linux-gcc -v |
||||
Reading specs from /usr/powerpc/lib/gcc/powerpc-linux/3.4.3/specs |
||||
Configured with: ../configure --prefix=/usr/powerpc |
||||
--exec-prefix=/usr/powerpc --target=powerpc-linux --enable-shared |
||||
--disable-nls --disable-multilib --enable-languages=c,c++,ada,f77,objc |
||||
Thread model: posix |
||||
gcc version 3.4.3 (Debian) |
||||
|
||||
% /usr/powerpc/bin/powerpc-linux-as -v |
||||
GNU assembler version 2.15 (powerpc-linux) using BFD version 2.15 |
||||
|
||||
|
||||
% make MPC8349ADS_config |
||||
Configuring for MPC8349ADS board... |
||||
|
||||
% make |
||||
|
||||
|
||||
1. Board Switches and Jumpers |
||||
|
||||
|
||||
2. Memory Map |
||||
|
||||
2.1. The memory map should look pretty much like this: |
||||
|
||||
0x0000_0000 0x7fff_ffff DDR 2G |
||||
0x8000_0000 0x9fff_ffff PCI MEM 512M |
||||
0xc000_0000 0xdfff_ffff Rapid IO 512M |
||||
0xe000_0000 0xe00f_ffff CCSR 1M |
||||
0xe200_0000 0xe2ff_ffff PCI IO 16M |
||||
0xf000_0000 0xf7ff_ffff SDRAM 128M |
||||
0xf800_0000 0xf80f_ffff BCSR 1M |
||||
0xfe00_0000 0xffff_ffff FLASH (boot bank) 16M |
||||
|
||||
|
||||
3. Definitions |
||||
|
||||
3.1 Explanation of NEW definitions in: |
||||
|
||||
include/configs/MPC8349ADS.h |
||||
|
||||
CONFIG_MPC83xx MPC83xx family |
||||
CONFIG_MPC8349 MPC8349 specific |
||||
CONFIG_MPC8349ADS MPC8349ADS board specific |
||||
CONFIG_TSEC_ENET Use on-chip 10/100/1000 ethernet |
||||
|
||||
|
||||
4. Compilation |
||||
|
||||
Assuming you're using BASH shell: |
||||
|
||||
export CROSS_COMPILE=your-cross-compile-prefix |
||||
cd u-boot |
||||
make distclean |
||||
make MPC8349ADS_config |
||||
make |
||||
|
||||
5. Downloading and Flashing Images |
||||
|
||||
5.0 Download over serial line using Kermit: |
||||
|
||||
loadb |
||||
[Drop to kermit: |
||||
^\c |
||||
send <u-boot-bin-image> |
||||
c |
||||
] |
||||
|
||||
|
||||
Or via tftp: |
||||
|
||||
tftp 10000 u-boot.bin |
||||
|
||||
5.1 Reflash U-boot Image using U-boot |
||||
|
||||
tftp 10000 u-boot.bin |
||||
protect off fe000000 fe09ffff |
||||
erase fe000000 fe09ffff |
||||
|
||||
cp.b 10000 fe000000 xxxx |
||||
or |
||||
cp.b 10000 fe000000 a0000 |
||||
|
||||
You might have to supply the correct byte count for 'xxxx' from |
||||
the TFTP. Maybe a0000 will work too, that corresponds to the |
||||
erased sectors. |
||||
|
||||
|
||||
6. Notes |
@ -0,0 +1,128 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* Liberty Eran (liberty@freescale.com) |
||||
*/ |
||||
|
||||
#ifndef __E300_H__ |
||||
#define __E300_H__ |
||||
|
||||
/*
|
||||
* e300 Processor Version & Revision Numbers
|
||||
*/ |
||||
#define PVR_83xx 0x80830000 |
||||
#define PVR_8349_REV10 (PVR_83xx | 0x0010) |
||||
#define PVR_8349_REV11 (PVR_83xx | 0x0011) |
||||
|
||||
/*
|
||||
* Hardware Implementation-Dependent Register 0 (HID0) |
||||
*/ |
||||
|
||||
/* #define HID0 1008 already defined in processor.h */ |
||||
#define HID0_MASK_MACHINE_CHECK 0x00000000 |
||||
#define HID0_ENABLE_MACHINE_CHECK 0x80000000 |
||||
|
||||
#define HID0_DISABLE_CACHE_PARITY 0x00000000 |
||||
#define HID0_ENABLE_CACHE_PARITY 0x40000000 |
||||
|
||||
#define HID0_DISABLE_ADDRESS_PARITY 0x00000000 /* on mpc8349ads must be disabled */ |
||||
#define HID0_ENABLE_ADDRESS_PARITY 0x20000000 |
||||
|
||||
#define HID0_DISABLE_DATA_PARITY 0x00000000 /* on mpc8349ads must be disabled */ |
||||
#define HID0_ENABLE_DATE_PARITY 0x10000000 |
||||
|
||||
#define HID0_CORE_CLK_OUT 0x00000000 |
||||
#define HID0_CORE_CLK_OUT_DIV_2 0x08000000 |
||||
|
||||
#define HID0_ENABLE_ARTRY_OUT_PRECHARGE 0x00000000 /* on mpc8349ads must be enabled */ |
||||
#define HID0_DISABLE_ARTRY_OUT_PRECHARGE 0x01000000 |
||||
|
||||
#define HID0_DISABLE_DOSE_MODE 0x00000000 |
||||
#define HID0_ENABLE_DOSE_MODE 0x00800000 |
||||
|
||||
#define HID0_DISABLE_NAP_MODE 0x00000000 |
||||
#define HID0_ENABLE_NAP_MODE 0x00400000 |
||||
|
||||
#define HID0_DISABLE_SLEEP_MODE 0x00000000 |
||||
#define HID0_ENABLE_SLEEP_MODE 0x00200000 |
||||
|
||||
#define HID0_DISABLE_DYNAMIC_POWER_MANAGMENT 0x00000000 |
||||
#define HID0_ENABLE_DYNAMIC_POWER_MANAGMENT 0x00100000 |
||||
|
||||
#define HID0_SOFT_RESET 0x00010000 |
||||
|
||||
#define HID0_DISABLE_INSTRUCTION_CACHE 0x00000000 |
||||
#define HID0_ENABLE_INSTRUCTION_CACHE 0x00008000 |
||||
|
||||
#define HID0_DISABLE_DATA_CACHE 0x00000000 |
||||
#define HID0_ENABLE_DATA_CACHE 0x00004000 |
||||
|
||||
#define HID0_LOCK_INSTRUCTION_CACHE 0x00002000 |
||||
|
||||
#define HID0_LOCK_DATA_CACHE 0x00001000 |
||||
|
||||
#define HID0_INVALIDATE_INSTRUCTION_CACHE 0x00000800 |
||||
|
||||
#define HID0_INVALIDATE_DATA_CACHE 0x00000400 |
||||
|
||||
#define HID0_DISABLE_M_BIT 0x00000000 |
||||
#define HID0_ENABLE_M_BIT 0x00000080 |
||||
|
||||
#define HID0_FBIOB 0x00000010 |
||||
|
||||
#define HID0_DISABLE_ADDRESS_BROADCAST 0x00000000 |
||||
#define HID0_ENABLE_ADDRESS_BROADCAST 0x00000008 |
||||
|
||||
#define HID0_ENABLE_NOOP_DCACHE_INSTRUCTION 0x00000000 |
||||
#define HID0_DISABLE_NOOP_DCACHE_INSTRUCTION 0x00000001 |
||||
|
||||
/*
|
||||
* Hardware Implementation-Dependent Register 2 (HID2) |
||||
*/ |
||||
#define HID2 1011 |
||||
|
||||
#define HID2_LET 0x08000000 |
||||
#define HID2_HBE 0x00040000 |
||||
#define HID2_IWLCK_000 0x00000000 /* no ways locked */ |
||||
#define HID2_IWLCK_001 0x00002000 /* way 0 locked */ |
||||
#define HID2_IWLCK_010 0x00004000 /* way 0 through way 1 locked */ |
||||
#define HID2_IWLCK_011 0x00006000 /* way 0 through way 2 locked */ |
||||
#define HID2_IWLCK_100 0x00008000 /* way 0 through way 3 locked */ |
||||
#define HID2_IWLCK_101 0x0000A000 /* way 0 through way 4 locked */ |
||||
#define HID2_IWLCK_110 0x0000C000 /* way 0 through way 5 locked */ |
||||
|
||||
|
||||
/* BAT (block address translation */ |
||||
#define BATU_BEPI_MSK 0xfffe0000 |
||||
#define BATU_BL_MSK 0x00001ffc |
||||
|
||||
#define BATU_BL_128K 0x00000000 |
||||
#define BATU_BL_256K 0x00000004 |
||||
#define BATU_BL_512K 0x0000000c |
||||
#define BATU_BL_1M 0x0000001c |
||||
#define BATU_BL_2M 0x0000003c |
||||
#define BATU_BL_4M 0x0000007c |
||||
#define BATU_BL_8M 0x000000fc |
||||
#define BATU_BL_16M 0x000001fc |
||||
#define BATU_BL_32M 0x000003fc |
||||
#define BATU_BL_64M 0x000007fc |
||||
#define BATU_BL_128M 0x00000ffc |
||||
#define BATU_BL_256M 0x00001ffc |
||||
|
||||
#define BATU_VS 0x00000002 |
||||
#define BATU_VP 0x00000001 |
||||
|
||||
#define BATL_BRPN_MSK 0xfffe0000 |
||||
#define BATL_WIMG_MSK 0x00000078 |
||||
|
||||
#define BATL_WRITETHROUGH 0x00000040 |
||||
#define BATL_CACHEINHIBIT 0x00000020 |
||||
#define BATL_MEMCOHERENCE 0x00000010 |
||||
#define BATL_GUARDEDSTORAGE 0x00000008 |
||||
|
||||
#define BATL_PP_MSK 0x00000003 |
||||
#define BATL_PP_00 0x00000000 /* No access */ |
||||
#define BATL_PP_01 0x00000001 /* Read-only */ |
||||
#define BATL_PP_10 0x00000002 /* Read-write */ |
||||
#define BATL_PP_11 0x00000003 |
||||
|
||||
#endif /* __E300_H__ */ |
@ -0,0 +1,104 @@ |
||||
/*
|
||||
* Freescale I2C Controller |
||||
* |
||||
* This software may be used and distributed according to the |
||||
* terms of the GNU Public License, Version 2, incorporated |
||||
* herein by reference. |
||||
* |
||||
* Copyright 2004 Freescale Semiconductor. |
||||
* (C) Copyright 2003, Motorola, Inc. |
||||
* author: Eran Liberty (liberty@freescale.com) |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#ifndef _ASM_I2C_H_ |
||||
#define _ASM_I2C_H_ |
||||
|
||||
#include <asm/types.h> |
||||
|
||||
typedef struct i2c |
||||
{ |
||||
u8 adr; /**< I2C slave address */ |
||||
#define I2C_ADR 0xFE |
||||
#define I2C_ADR_SHIFT 1 |
||||
#define I2C_ADR_RES ~(I2C_ADR) |
||||
u8 res0[3];
|
||||
u8 fdr; /**< I2C frequency divider register */ |
||||
|
||||
#define IC2_FDR 0x3F |
||||
#define IC2_FDR_SHIFT 0 |
||||
#define IC2_FDR_RES ~(IC2_FDR) |
||||
u8 res1[3];
|
||||
u8 cr; /**< I2C control redister */ |
||||
#define I2C_CR_MEN 0x80 |
||||
#define I2C_CR_MIEN 0x40 |
||||
#define I2C_CR_MSTA 0x20 |
||||
#define I2C_CR_MTX 0x10 |
||||
#define I2C_CR_TXAK 0x08 |
||||
#define I2C_CR_RSTA 0x04 |
||||
#define I2C_CR_BCST 0x01 |
||||
u8 res2[3];
|
||||
u8 sr; /**< I2C status register */ |
||||
#define I2C_SR_MCF 0x80 |
||||
#define I2C_SR_MAAS 0x40 |
||||
#define I2C_SR_MBB 0x20 |
||||
#define I2C_SR_MAL 0x10 |
||||
#define I2C_SR_BCSTM 0x08 |
||||
#define I2C_SR_SRW 0x04 |
||||
#define I2C_SR_MIF 0x02 |
||||
#define I2C_SR_RXAK 0x01 |
||||
u8 res3[3];
|
||||
u8 dr; /**< I2C data register */ |
||||
#define I2C_DR 0xFF |
||||
#define I2C_DR_SHIFT 0 |
||||
#define I2C_DR_RES ~(I2C_DR) |
||||
u8 res4[3];
|
||||
u8 dfsrr; /**< I2C digital filter sampling rate register */ |
||||
#define I2C_DFSRR 0x3F |
||||
#define I2C_DFSRR_SHIFT 0 |
||||
#define I2C_DFSRR_RES ~(I2C_DR) |
||||
u8 res5[3]; |
||||
u8 res6[0xE8];
|
||||
} i2c_t; |
||||
|
||||
#ifndef CFG_HZ |
||||
#error CFG_HZ is not defined in /include/configs/${BOARD}.h |
||||
#endif |
||||
#define I2C_TIMEOUT (CFG_HZ/4) |
||||
|
||||
#ifndef CFG_IMMRBAR |
||||
#error CFG_IMMRBAR is not defined in /include/configs/${BOARD}.h |
||||
#endif |
||||
|
||||
#ifndef CFG_I2C_OFFSET |
||||
#error CFG_I2C_OFFSET is not defined in /include/configs/${BOARD}.h |
||||
#endif |
||||
|
||||
#ifdef CONFIG_MPC8349ADS |
||||
/*
|
||||
* MPC8349 have two i2c bus
|
||||
*/ |
||||
extern i2c_t * mpc8349_i2c; |
||||
#define I2C mpc8349_i2c |
||||
#else |
||||
#define I2C ((i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET)) |
||||
#endif |
||||
|
||||
#define I2C_READ 1 |
||||
#define I2C_WRITE 0 |
||||
|
||||
#endif /* _ASM_I2C_H_ */ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,167 @@ |
||||
#ifndef _PPC_KERNEL_MPC8349_PCI_H |
||||
#define _PPC_KERNEL_MPC8349_PCI_H |
||||
|
||||
|
||||
#define M8265_PCIBR0 0x101ac |
||||
#define M8265_PCIBR1 0x101b0 |
||||
#define M8265_PCIMSK0 0x101c4 |
||||
#define M8265_PCIMSK1 0x101c8 |
||||
|
||||
/* Bit definitions for PCIBR registers */ |
||||
|
||||
#define PCIBR_ENABLE 0x00000001 |
||||
|
||||
/* Bit definitions for PCIMSK registers */ |
||||
|
||||
#define PCIMSK_32KB 0xFFFF8000 /* Size of window, smallest */ |
||||
#define PCIMSK_64KB 0xFFFF0000 |
||||
#define PCIMSK_128KB 0xFFFE0000 |
||||
#define PCIMSK_256KB 0xFFFC0000 |
||||
#define PCIMSK_512KB 0xFFF80000 |
||||
#define PCIMSK_1MB 0xFFF00000 |
||||
#define PCIMSK_2MB 0xFFE00000 |
||||
#define PCIMSK_4MB 0xFFC00000 |
||||
#define PCIMSK_8MB 0xFF800000 |
||||
#define PCIMSK_16MB 0xFF000000 |
||||
#define PCIMSK_32MB 0xFE000000 |
||||
#define PCIMSK_64MB 0xFC000000 |
||||
#define PCIMSK_128MB 0xF8000000 |
||||
#define PCIMSK_256MB 0xF0000000 |
||||
#define PCIMSK_512MB 0xE0000000 |
||||
#define PCIMSK_1GB 0xC0000000 /* Size of window, largest */ |
||||
|
||||
|
||||
#define M826X_SCCR_PCI_MODE_EN 0x100 |
||||
|
||||
|
||||
/*
|
||||
* Outbound ATU registers (3 sets). These registers control how 60x bus |
||||
* (local) addresses are translated to PCI addresses when the MPC826x is |
||||
* a PCI bus master (initiator). |
||||
*/ |
||||
|
||||
#define POTAR_REG0 0x10800 /* PCI Outbound Translation Addr registers */ |
||||
#define POTAR_REG1 0x10818 |
||||
#define POTAR_REG2 0x10830 |
||||
|
||||
#define POBAR_REG0 0x10808 /* PCI Outbound Base Addr registers */ |
||||
#define POBAR_REG1 0x10820 |
||||
#define POBAR_REG2 0x10838 |
||||
|
||||
#define POCMR_REG0 0x10810 /* PCI Outbound Comparison Mask registers */ |
||||
#define POCMR_REG1 0x10828 |
||||
#define POCMR_REG2 0x10840 |
||||
|
||||
/* Bit definitions for POMCR registers */ |
||||
|
||||
#define POCMR_MASK_4KB 0x000FFFFF |
||||
#define POCMR_MASK_8KB 0x000FFFFE |
||||
#define POCMR_MASK_16KB 0x000FFFFC |
||||
#define POCMR_MASK_32KB 0x000FFFF8 |
||||
#define POCMR_MASK_64KB 0x000FFFF0 |
||||
#define POCMR_MASK_128KB 0x000FFFE0 |
||||
#define POCMR_MASK_256KB 0x000FFFC0 |
||||
#define POCMR_MASK_512KB 0x000FFF80 |
||||
#define POCMR_MASK_1MB 0x000FFF00 |
||||
#define POCMR_MASK_2MB 0x000FFE00 |
||||
#define POCMR_MASK_4MB 0x000FFC00 |
||||
#define POCMR_MASK_8MB 0x000FF800 |
||||
#define POCMR_MASK_16MB 0x000FF000 |
||||
#define POCMR_MASK_32MB 0x000FE000 |
||||
#define POCMR_MASK_64MB 0x000FC000 |
||||
#define POCMR_MASK_128MB 0x000F8000 |
||||
#define POCMR_MASK_256MB 0x000F0000 |
||||
#define POCMR_MASK_512MB 0x000E0000 |
||||
#define POCMR_MASK_1GB 0x000C0000 |
||||
|
||||
#define POCMR_ENABLE 0x80000000 |
||||
#define POCMR_PCI_IO 0x40000000 |
||||
#define POCMR_PREFETCH_EN 0x20000000 |
||||
|
||||
/* Soft PCI reset */ |
||||
|
||||
#define PCI_GCR_REG 0x10880 |
||||
|
||||
/* Bit definitions for PCI_GCR registers */ |
||||
|
||||
#define PCIGCR_PCI_BUS_EN 0x1 |
||||
|
||||
/*
|
||||
* Inbound ATU registers (2 sets). These registers control how PCI |
||||
* addresses are translated to 60x bus (local) addresses when the |
||||
* MPC826x is a PCI bus target. |
||||
*/ |
||||
|
||||
#define PITAR_REG1 0x108D0 |
||||
#define PIBAR_REG1 0x108D8 |
||||
#define PICMR_REG1 0x108E0 |
||||
#define PITAR_REG0 0x108E8 |
||||
#define PIBAR_REG0 0x108F0 |
||||
#define PICMR_REG0 0x108F8 |
||||
|
||||
/* Bit definitions for PCI Inbound Comparison Mask registers */ |
||||
|
||||
#define PICMR_MASK_4KB 0x000FFFFF |
||||
#define PICMR_MASK_8KB 0x000FFFFE |
||||
#define PICMR_MASK_16KB 0x000FFFFC |
||||
#define PICMR_MASK_32KB 0x000FFFF8 |
||||
#define PICMR_MASK_64KB 0x000FFFF0 |
||||
#define PICMR_MASK_128KB 0x000FFFE0 |
||||
#define PICMR_MASK_256KB 0x000FFFC0 |
||||
#define PICMR_MASK_512KB 0x000FFF80 |
||||
#define PICMR_MASK_1MB 0x000FFF00 |
||||
#define PICMR_MASK_2MB 0x000FFE00 |
||||
#define PICMR_MASK_4MB 0x000FFC00 |
||||
#define PICMR_MASK_8MB 0x000FF800 |
||||
#define PICMR_MASK_16MB 0x000FF000 |
||||
#define PICMR_MASK_32MB 0x000FE000 |
||||
#define PICMR_MASK_64MB 0x000FC000 |
||||
#define PICMR_MASK_128MB 0x000F8000 |
||||
#define PICMR_MASK_256MB 0x000F0000 |
||||
#define PICMR_MASK_512MB 0x000E0000 |
||||
#define PICMR_MASK_1GB 0x000C0000 |
||||
|
||||
#define PICMR_ENABLE 0x80000000 |
||||
#define PICMR_NO_SNOOP_EN 0x40000000 |
||||
#define PICMR_PREFETCH_EN 0x20000000 |
||||
|
||||
/* PCI error Registers */ |
||||
|
||||
#define PCI_ERROR_STATUS_REG 0x10884 |
||||
#define PCI_ERROR_MASK_REG 0x10888 |
||||
#define PCI_ERROR_CONTROL_REG 0x1088C |
||||
#define PCI_ERROR_ADRS_CAPTURE_REG 0x10890 |
||||
#define PCI_ERROR_DATA_CAPTURE_REG 0x10898 |
||||
#define PCI_ERROR_CTRL_CAPTURE_REG 0x108A0 |
||||
|
||||
/* PCI error Register bit defines */ |
||||
|
||||
#define PCI_ERROR_PCI_ADDR_PAR 0x00000001 |
||||
#define PCI_ERROR_PCI_DATA_PAR_WR 0x00000002 |
||||
#define PCI_ERROR_PCI_DATA_PAR_RD 0x00000004 |
||||
#define PCI_ERROR_PCI_NO_RSP 0x00000008 |
||||
#define PCI_ERROR_PCI_TAR_ABT 0x00000010 |
||||
#define PCI_ERROR_PCI_SERR 0x00000020 |
||||
#define PCI_ERROR_PCI_PERR_RD 0x00000040 |
||||
#define PCI_ERROR_PCI_PERR_WR 0x00000080 |
||||
#define PCI_ERROR_I2O_OFQO 0x00000100 |
||||
#define PCI_ERROR_I2O_IPQO 0x00000200 |
||||
#define PCI_ERROR_IRA 0x00000400 |
||||
#define PCI_ERROR_NMI 0x00000800 |
||||
#define PCI_ERROR_I2O_DBMC 0x00001000 |
||||
|
||||
/*
|
||||
* Register pair used to generate configuration cycles on the PCI bus |
||||
* and access the MPC826x's own PCI configuration registers. |
||||
*/ |
||||
|
||||
#define PCI_CFG_ADDR_REG 0x10900 |
||||
#define PCI_CFG_DATA_REG 0x10904 |
||||
|
||||
/* Bus parking decides where the bus control sits when idle */ |
||||
/* If modifying memory controllers for PCI park on the core */ |
||||
|
||||
#define PPC_ACR_BUS_PARK_CORE 0x6 |
||||
#define PPC_ACR_BUS_PARK_PCI 0x3 |
||||
|
||||
#endif /* _PPC_KERNEL_M8260_PCI_H */ |
@ -0,0 +1,609 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
/*
|
||||
* mpc8349ads board configuration file |
||||
* |
||||
* Please refer to doc/README.mpc83xxads for more info. |
||||
*/ |
||||
|
||||
#ifndef __CONFIG_H |
||||
#define __CONFIG_H |
||||
|
||||
#undef DEBUG |
||||
|
||||
#define CONFIG_MII |
||||
|
||||
/*
|
||||
* High Level Configuration Options |
||||
*/ |
||||
#define CONFIG_E300 1 /* E300 Family */ |
||||
#define CONFIG_MPC83XX 1 /* MPC83XX family */ |
||||
#define CONFIG_MPC8349 1 /* MPC8349 specific */ |
||||
#define CONFIG_MPC8349ADS 1 /* MPC8349ADS board specific */ |
||||
|
||||
#define CONFIG_PCI |
||||
|
||||
#define CONFIG_TSEC_ENET /* tsec ethernet support */ |
||||
#define CONFIG_ENV_OVERWRITE |
||||
|
||||
#define CONFIG_SPD_EEPROM /* Use SPD EEPROM for DDR setup*/ |
||||
|
||||
#undef CONFIG_DDR_ECC /* only for ECC DDR module */ |
||||
|
||||
#define PCI_66M |
||||
#ifdef PCI_66M |
||||
#define CONFIG_83XX_CLKIN 66000000 /* in Hz */ |
||||
#else |
||||
#define CONFIG_83XX_CLKIN 33000000 /* in Hz */ |
||||
#endif |
||||
|
||||
#ifndef CONFIG_SYS_CLK_FREQ |
||||
#ifdef PCI_66M |
||||
#define CONFIG_SYS_CLK_FREQ 66000000 |
||||
#else |
||||
#define CONFIG_SYS_CLK_FREQ 33000000 |
||||
#endif |
||||
#endif |
||||
|
||||
#define CONFIG_BOARD_EARLY_INIT_F /* call board_pre_init */ |
||||
|
||||
#define CFG_IMMRBAR 0xE0000000 |
||||
|
||||
#undef CFG_DRAM_TEST /* memory test, takes time */ |
||||
#define CFG_MEMTEST_START 0x00000000 /* memtest region */ |
||||
#define CFG_MEMTEST_END 0x00100000 |
||||
|
||||
|
||||
|
||||
/*
|
||||
* DDR Setup |
||||
*/ |
||||
|
||||
#define CFG_DDR_BASE 0x00000000 /* DDR is system memory*/ |
||||
#define CFG_SDRAM_BASE CFG_DDR_BASE |
||||
#undef CONFIG_DDR_2T_TIMING |
||||
#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE |
||||
|
||||
#if defined(CONFIG_SPD_EEPROM) |
||||
/*
|
||||
* Determine DDR configuration from I2C interface. |
||||
*/ |
||||
#define SPD_EEPROM_ADDRESS 0x51 /* DDR DIMM */ |
||||
|
||||
#else |
||||
/*
|
||||
* Manually set up DDR parameters |
||||
*/ |
||||
#define CFG_DDR_SIZE 256 /* Mb */ |
||||
#define CFG_DDR_CONFIG (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_9) |
||||
#define CFG_DDR_TIMING_1 0x37344321 |
||||
#define CFG_DDR_TIMING_2 0x00000800 /* P9-45,may need tuning */ |
||||
#define CFG_DDR_CONTROL 0xc2000000 /* unbuffered,no DYN_PWR */ |
||||
#define CFG_DDR_MODE 0x00000062 /* DLL,normal,seq,4/2.5 */ |
||||
#define CFG_DDR_INTERVAL 0x05200100 /* autocharge,no open page */ |
||||
#endif |
||||
|
||||
|
||||
/*
|
||||
* SDRAM on the Local Bus |
||||
*/ |
||||
#define CFG_LBC_SDRAM_BASE 0xf0000000 /* Localbus SDRAM */ |
||||
#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */ |
||||
|
||||
/*
|
||||
* FLASH on the Local Bus |
||||
*/ |
||||
#define CFG_FLASH_CFI /* use the Common Flash Interface */ |
||||
#define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ |
||||
#define CFG_FLASH_BASE 0xFE000000 /* start of FLASH */ |
||||
#define CFG_FLASH_SIZE 8 /* FLASH size in MB */ |
||||
/* #define CFG_FLASH_USE_BUFFER_WRITE */ |
||||
|
||||
#define CFG_BR0_PRELIM (CFG_FLASH_BASE | /* Flash Base address */ \ |
||||
(2 << BR_PS_SHIFT) | /* 32 bit port size */ \
|
||||
BR_V) /* valid */ |
||||
#define CFG_OR0_PRELIM 0xff806ff7 /* 16Mb Flash size*/ |
||||
#define CFG_LBLAWBAR0_PRELIM CFG_FLASH_BASE /* Window base at flash base */ |
||||
#define CFG_LBLAWAR0_PRELIM 0x80000016 /* 16Mb window size */ |
||||
|
||||
|
||||
#define CFG_MAX_FLASH_BANKS 1 /* number of banks */ |
||||
#define CFG_MAX_FLASH_SECT 64 /* sectors per device */ |
||||
|
||||
#undef CFG_FLASH_CHECKSUM |
||||
#define CFG_FLASH_ERASE_TOUT 60000 /* Flash Erase Timeout (ms) */ |
||||
#define CFG_FLASH_WRITE_TOUT 500 /* Flash Write Timeout (ms) */ |
||||
|
||||
#define CFG_MID_FLASH_JUMP 0x7F000000 |
||||
#define CFG_MONITOR_BASE TEXT_BASE /* start of monitor */ |
||||
|
||||
|
||||
#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) |
||||
#define CFG_RAMBOOT |
||||
#else |
||||
#undef CFG_RAMBOOT |
||||
#endif |
||||
|
||||
/*
|
||||
* BCSR register on local bus 32KB, 8-bit wide for ADS config reg |
||||
*/ |
||||
#define CFG_BCSR 0xF8000000 |
||||
#define CFG_LBLAWBAR1_PRELIM CFG_BCSR /* Access window base at BCSR base */ |
||||
#define CFG_LBLAWAR1_PRELIM 0x8000000E /* Access window size 32K */ |
||||
#define CFG_BR1_PRELIM (CFG_BCSR|0x00000801) /* Port-size=8bit, MSEL=GPCM */ |
||||
#define CFG_OR1_PRELIM 0xFFFFE8f0 /* length 32K */ |
||||
|
||||
|
||||
#define CONFIG_L1_INIT_RAM |
||||
#define CFG_INIT_RAM_LOCK 1 |
||||
#define CFG_INIT_RAM_ADDR 0xe4010000 /* Initial RAM address */ |
||||
#define CFG_INIT_RAM_END 0x1000 /* End of used area in RAM*/ |
||||
|
||||
#define CFG_GBL_DATA_SIZE 0x100 /* num bytes initial data */ |
||||
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) |
||||
#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET |
||||
|
||||
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ |
||||
#define CFG_MALLOC_LEN (128 * 1024) /* Reserved for malloc */ |
||||
|
||||
/*
|
||||
* Local Bus LCRR and LBCR regs |
||||
* LCRR: DLL bypass, Clock divider is 4 |
||||
* External Local Bus rate is |
||||
* CLKIN * HRCWL_CSB_TO_CLKIN / HRCWL_LCL_BUS_TO_SCB_CLK / LCRR_CLKDIV |
||||
*/ |
||||
#define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_4) |
||||
#define CFG_LBC_LBCR 0x00000000 |
||||
|
||||
#define CFG_LB_SDRAM /* if board has SRDAM on local bus */ |
||||
|
||||
#ifdef CFG_LB_SDRAM |
||||
/*local bus BR2, OR2 definition for SDRAM if soldered on the ADS board*/ |
||||
/*
|
||||
* Base Register 2 and Option Register 2 configure SDRAM. |
||||
* The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000. |
||||
* |
||||
* For BR2, need: |
||||
* Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0 |
||||
* port-size = 32-bits = BR2[19:20] = 11 |
||||
* no parity checking = BR2[21:22] = 00 |
||||
* SDRAM for MSEL = BR2[24:26] = 011 |
||||
* Valid = BR[31] = 1 |
||||
* |
||||
* 0 4 8 12 16 20 24 28 |
||||
* 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861 |
||||
* |
||||
* FIXME: CFG_LBC_SDRAM_BASE should be masked and OR'ed into |
||||
* FIXME: the top 17 bits of BR2. |
||||
*/ |
||||
|
||||
#define CFG_BR2_PRELIM 0xf0001861 /*Port-size=32bit, MSEL=SDRAM*/ |
||||
|
||||
#define CFG_LBLAWBAR2_PRELIM 0xF0000000 |
||||
|
||||
#define CFG_LBLAWAR2_PRELIM 0x80000019 /*64M*/ |
||||
|
||||
|
||||
/*
|
||||
* The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64. |
||||
* |
||||
* For OR2, need: |
||||
* 64MB mask for AM, OR2[0:7] = 1111 1100 |
||||
* XAM, OR2[17:18] = 11 |
||||
* 9 columns OR2[19-21] = 010 |
||||
* 13 rows OR2[23-25] = 100 |
||||
* EAD set for extra time OR[31] = 1 |
||||
* |
||||
* 0 4 8 12 16 20 24 28 |
||||
* 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901 |
||||
*/ |
||||
|
||||
#define CFG_OR2_PRELIM 0xfc006901 |
||||
|
||||
#define CFG_LBC_LSRT 0x32000000 /* LB sdram refresh timer, about 6us */ |
||||
#define CFG_LBC_MRTPR 0x20000000 /* LB refresh timer prescal, 266MHz/32*/ |
||||
|
||||
/*
|
||||
* LSDMR masks |
||||
*/ |
||||
#define CFG_LBC_LSDMR_RFEN (1 << (31 - 1)) |
||||
#define CFG_LBC_LSDMR_BSMA1516 (3 << (31 - 10)) |
||||
#define CFG_LBC_LSDMR_BSMA1617 (4 << (31 - 10)) |
||||
#define CFG_LBC_LSDMR_RFCR5 (3 << (31 - 16)) |
||||
#define CFG_LBC_LSDMR_RFCR8 (5 << (31 - 16)) |
||||
#define CFG_LBC_LSDMR_RFCR16 (7 << (31 - 16)) |
||||
#define CFG_LBC_LSDMR_PRETOACT3 (3 << (31 - 19)) |
||||
#define CFG_LBC_LSDMR_PRETOACT6 (5 << (31 - 19)) |
||||
#define CFG_LBC_LSDMR_PRETOACT7 (7 << (31 - 19)) |
||||
#define CFG_LBC_LSDMR_ACTTORW3 (3 << (31 - 22)) |
||||
#define CFG_LBC_LSDMR_ACTTORW7 (7 << (31 - 22)) |
||||
#define CFG_LBC_LSDMR_ACTTORW6 (6 << (31 - 22)) |
||||
#define CFG_LBC_LSDMR_BL8 (1 << (31 - 23)) |
||||
#define CFG_LBC_LSDMR_WRC2 (2 << (31 - 27)) |
||||
#define CFG_LBC_LSDMR_WRC3 (3 << (31 - 27)) |
||||
#define CFG_LBC_LSDMR_WRC4 (0 << (31 - 27)) |
||||
#define CFG_LBC_LSDMR_BUFCMD (1 << (31 - 29)) |
||||
#define CFG_LBC_LSDMR_CL3 (3 << (31 - 31)) |
||||
|
||||
#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_MRW (3 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4)) |
||||
#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4)) |
||||
|
||||
#define CFG_LBC_LSDMR_COMMON ( CFG_LBC_LSDMR_RFEN \ |
||||
| CFG_LBC_LSDMR_BSMA1516 \
|
||||
| CFG_LBC_LSDMR_RFCR8 \
|
||||
| CFG_LBC_LSDMR_PRETOACT6 \
|
||||
| CFG_LBC_LSDMR_ACTTORW3 \
|
||||
| CFG_LBC_LSDMR_BL8 \
|
||||
| CFG_LBC_LSDMR_WRC3 \
|
||||
| CFG_LBC_LSDMR_CL3 \
|
||||
) |
||||
|
||||
|
||||
/*
|
||||
* SDRAM Controller configuration sequence. |
||||
*/ |
||||
#define CFG_LBC_LSDMR_1 ( CFG_LBC_LSDMR_COMMON \ |
||||
| CFG_LBC_LSDMR_OP_PCHALL) |
||||
#define CFG_LBC_LSDMR_2 ( CFG_LBC_LSDMR_COMMON \ |
||||
| CFG_LBC_LSDMR_OP_ARFRSH) |
||||
#define CFG_LBC_LSDMR_3 ( CFG_LBC_LSDMR_COMMON \ |
||||
| CFG_LBC_LSDMR_OP_ARFRSH) |
||||
#define CFG_LBC_LSDMR_4 ( CFG_LBC_LSDMR_COMMON \ |
||||
| CFG_LBC_LSDMR_OP_MRW) |
||||
#define CFG_LBC_LSDMR_5 ( CFG_LBC_LSDMR_COMMON \ |
||||
| CFG_LBC_LSDMR_OP_NORMAL) |
||||
|
||||
#endif |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Serial Port |
||||
*/ |
||||
#define CONFIG_CONS_INDEX 1 |
||||
#undef CONFIG_SERIAL_SOFTWARE_FIFO |
||||
#define CFG_NS16550 |
||||
#define CFG_NS16550_SERIAL |
||||
#define CFG_NS16550_REG_SIZE 1 |
||||
#define CFG_NS16550_CLK get_bus_freq(0) |
||||
|
||||
#define CFG_BAUDRATE_TABLE \ |
||||
{300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} |
||||
|
||||
#define CFG_NS16550_COM1 (CFG_IMMRBAR+0x4500) |
||||
#define CFG_NS16550_COM2 (CFG_IMMRBAR+0x4600) |
||||
|
||||
/* Use the HUSH parser */ |
||||
#define CFG_HUSH_PARSER |
||||
#ifdef CFG_HUSH_PARSER |
||||
#define CFG_PROMPT_HUSH_PS2 "> " |
||||
#endif |
||||
|
||||
/* I2C */ |
||||
#define CONFIG_HARD_I2C /* I2C with hardware support*/ |
||||
#undef CONFIG_SOFT_I2C /* I2C bit-banged */ |
||||
#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ |
||||
#define CFG_I2C_SLAVE 0x7F |
||||
#define CFG_I2C_NOPROBES {0x69} /* Don't probe these addrs */ |
||||
#define CFG_I2C_OFFSET 0x3000 |
||||
#define CFG_I2C2_OFFSET 0x3100 |
||||
|
||||
/* TSEC */ |
||||
#define CFG_TSEC1_OFFSET 0x24000 |
||||
#define CFG_TSEC1 (CFG_IMMRBAR+CFG_TSEC1_OFFSET) |
||||
#define CFG_TSEC2_OFFSET 0x25000 |
||||
#define CFG_TSEC2 (CFG_IMMRBAR+CFG_TSEC2_OFFSET) |
||||
|
||||
|
||||
/* IO Configuration */ |
||||
#define CFG_IO_CONF (\ |
||||
IO_CONF_UART |\
|
||||
IO_CONF_TSEC1 |\
|
||||
IO_CONF_IRQ0 |\
|
||||
IO_CONF_IRQ1 |\
|
||||
IO_CONF_IRQ2 |\
|
||||
IO_CONF_IRQ3 |\
|
||||
IO_CONF_IRQ4 |\
|
||||
IO_CONF_IRQ5 |\
|
||||
IO_CONF_IRQ6 |\
|
||||
IO_CONF_IRQ7 ) |
||||
|
||||
/*
|
||||
* 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 0x20000000 /* 512M */ |
||||
#define CFG_PCI1_IO_BASE 0x00000000 |
||||
#define CFG_PCI1_IO_PHYS 0xe2000000 |
||||
#define CFG_PCI1_IO_SIZE 0x1000000 /* 16M */ |
||||
|
||||
|
||||
#define CFG_PCI2_MEM_BASE 0xA0000000 |
||||
#define CFG_PCI2_MEM_PHYS CFG_PCI2_MEM_BASE |
||||
#define CFG_PCI2_MEM_SIZE 0x20000000 /* 512M */ |
||||
#define CFG_PCI2_IO_BASE 0x00000000 |
||||
#define CFG_PCI2_IO_PHYS 0xe3000000 |
||||
#define CFG_PCI2_IO_SIZE 0x1000000 /* 16M */ |
||||
#if defined(CONFIG_PCI) |
||||
|
||||
//#define PCI_64BIT
|
||||
#define PCI_ALL_PCI1 |
||||
//#define PCI_ONE_PCI1
|
||||
//#define PCI_TWO_PCI1
|
||||
#if defined(PCI_64BIT) |
||||
#undef PCI_ALL_PCI1 |
||||
#undef PCI_TWO_PCI1 |
||||
#undef PCI_ONE_PCI1 |
||||
#endif |
||||
|
||||
#define CONFIG_NET_MULTI |
||||
#define CONFIG_PCI_PNP /* do pci plug-and-play */ |
||||
|
||||
#undef CONFIG_EEPRO100 |
||||
#undef CONFIG_TULIP |
||||
|
||||
#if !defined(CONFIG_PCI_PNP) |
||||
#define PCI_ENET0_IOADDR 0xFIXME |
||||
#define PCI_ENET0_MEMADDR 0xFIXME |
||||
#define PCI_IDSEL_NUMBER 0x0c /* slot0->3(IDSEL)=12->15 */ |
||||
#endif |
||||
|
||||
#undef CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ |
||||
#define CFG_PCI_SUBSYS_VENDORID 0x1057 /* Motorola */ |
||||
|
||||
#endif /* CONFIG_PCI */ |
||||
|
||||
|
||||
#if defined(CONFIG_TSEC_ENET) |
||||
|
||||
#ifndef CONFIG_NET_MULTI |
||||
#define CONFIG_NET_MULTI 1 |
||||
#endif |
||||
|
||||
#define CONFIG_GMII 1 /* MII PHY management */ |
||||
#define CONFIG_MPC83XX_TSEC1 1 |
||||
#define CONFIG_MPC83XX_TSEC1_NAME "TSEC0" |
||||
#define CONFIG_MPC83XX_TSEC2 1 |
||||
#define CONFIG_MPC83XX_TSEC2_NAME "TSEC1" |
||||
#define TSEC1_PHY_ADDR 0 |
||||
#define TSEC2_PHY_ADDR 1 |
||||
#define TSEC1_PHYIDX 0 |
||||
#define TSEC2_PHYIDX 0 |
||||
|
||||
/* Options are: TSEC[0-1] */ |
||||
#define CONFIG_ETHPRIME "TSEC0" |
||||
|
||||
#endif /* CONFIG_TSEC_ENET */ |
||||
|
||||
|
||||
/*
|
||||
* Environment |
||||
*/ |
||||
#ifndef CFG_RAMBOOT |
||||
#define CFG_ENV_IS_IN_FLASH 1 |
||||
#define CFG_ENV_ADDR (CFG_MONITOR_BASE + 0x40000) |
||||
#define CFG_ENV_SECT_SIZE 0x40000 /* 256K(one sector) for env */ |
||||
#define CFG_ENV_SIZE 0x2000 |
||||
#else |
||||
#define CFG_NO_FLASH 1 /* Flash is not usable now */ |
||||
#define CFG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ |
||||
#define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000) |
||||
#define CFG_ENV_SIZE 0x2000 |
||||
#endif |
||||
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ |
||||
#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ |
||||
|
||||
#if defined(CFG_RAMBOOT) |
||||
#if defined(CONFIG_PCI) |
||||
#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ |
||||
| CFG_CMD_PING \
|
||||
| CFG_CMD_PCI \
|
||||
| CFG_CMD_I2C) \
|
||||
& \
|
||||
~(CFG_CMD_ENV \
|
||||
| CFG_CMD_LOADS)) |
||||
#else |
||||
#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ |
||||
| CFG_CMD_PING \
|
||||
| CFG_CMD_I2C) \
|
||||
& \
|
||||
~(CFG_CMD_ENV \
|
||||
| CFG_CMD_LOADS)) |
||||
#endif |
||||
#else |
||||
#if defined(CONFIG_PCI) |
||||
#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ |
||||
| CFG_CMD_PCI \
|
||||
| CFG_CMD_PING \
|
||||
| CFG_CMD_I2C) |
||||
#else |
||||
#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ |
||||
| CFG_CMD_PING \
|
||||
| CFG_CMD_I2C \
|
||||
| CFG_CMD_MII \
|
||||
) |
||||
#endif |
||||
#endif |
||||
|
||||
#include <cmd_confdefs.h> |
||||
|
||||
#undef CONFIG_WATCHDOG /* watchdog disabled */ |
||||
|
||||
/*
|
||||
* Miscellaneous configurable options |
||||
*/ |
||||
#define CFG_LONGHELP /* undef to save memory */ |
||||
#define CFG_LOAD_ADDR 0x2000000 /* default load address */ |
||||
#define CFG_PROMPT "=> " /* Monitor Command Prompt */ |
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ |
||||
#else |
||||
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ |
||||
#endif |
||||
|
||||
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ |
||||
#define CFG_MAXARGS 16 /* max number of command args */ |
||||
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ |
||||
#define CFG_HZ 1000 /* decrementer freq: 1ms ticks */ |
||||
|
||||
/*
|
||||
* For booting Linux, the board info and command line data |
||||
* have to be in the first 8 MB of memory, since this is |
||||
* the maximum mapped by the Linux kernel during initialization. |
||||
*/ |
||||
#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux*/ |
||||
|
||||
/* Cache Configuration */ |
||||
#define CFG_DCACHE_SIZE 32768 |
||||
#define CFG_CACHELINE_SIZE 32 |
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
#define CFG_CACHELINE_SHIFT 5 /*log base 2 of the above value*/ |
||||
#endif |
||||
|
||||
#define CFG_RCWH_PCIHOST 0x80000000 /* PCIHOST */ |
||||
|
||||
#define CFG_HRCW_LOW (\ |
||||
HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\
|
||||
HRCWL_DDR_TO_SCB_CLK_1X1 |\
|
||||
HRCWL_CSB_TO_CLKIN_4X1 |\
|
||||
HRCWL_VCO_1X2 |\
|
||||
HRCWL_CORE_TO_CSB_2X1) |
||||
|
||||
#if defined(PCI_64BIT) |
||||
#define CFG_HRCW_HIGH (\ |
||||
HRCWH_PCI_HOST |\
|
||||
HRCWH_64_BIT_PCI |\
|
||||
HRCWH_PCI1_ARBITER_ENABLE |\
|
||||
HRCWH_PCI2_ARBITER_DISABLE |\
|
||||
HRCWH_CORE_ENABLE |\
|
||||
HRCWH_FROM_0X00000100 |\
|
||||
HRCWH_BOOTSEQ_DISABLE |\
|
||||
HRCWH_SW_WATCHDOG_DISABLE |\
|
||||
HRCWH_ROM_LOC_LOCAL_16BIT |\
|
||||
HRCWH_TSEC1M_IN_GMII |\
|
||||
HRCWH_TSEC2M_IN_GMII ) |
||||
#else |
||||
#define CFG_HRCW_HIGH (\ |
||||
HRCWH_PCI_HOST |\
|
||||
HRCWH_32_BIT_PCI |\
|
||||
HRCWH_PCI1_ARBITER_ENABLE |\
|
||||
HRCWH_PCI2_ARBITER_ENABLE |\
|
||||
HRCWH_CORE_ENABLE |\
|
||||
HRCWH_FROM_0X00000100 |\
|
||||
HRCWH_BOOTSEQ_DISABLE |\
|
||||
HRCWH_SW_WATCHDOG_DISABLE |\
|
||||
HRCWH_ROM_LOC_LOCAL_16BIT |\
|
||||
HRCWH_TSEC1M_IN_GMII |\
|
||||
HRCWH_TSEC2M_IN_GMII ) |
||||
#endif |
||||
|
||||
|
||||
#define CFG_HID0_INIT 0x000000000 |
||||
|
||||
#define CFG_HID0_FINAL CFG_HID0_INIT |
||||
|
||||
/* #define CFG_HID0_FINAL (\
|
||||
HID0_ENABLE_INSTRUCTION_CACHE |\
|
||||
HID0_ENABLE_M_BIT |\
|
||||
HID0_ENABLE_ADDRESS_BROADCAST ) */ |
||||
|
||||
#define CFG_HID2 0x000000000 |
||||
|
||||
/*
|
||||
* Internal Definitions |
||||
* |
||||
* Boot Flags |
||||
*/ |
||||
#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ |
||||
#define BOOTFLAG_WARM 0x02 /* Software reboot */ |
||||
|
||||
#if (CONFIG_COMMANDS & CFG_CMD_KGDB) |
||||
#define CONFIG_KGDB_BAUDRATE 230400 /* speed of kgdb serial port */ |
||||
#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ |
||||
#endif |
||||
|
||||
|
||||
/*
|
||||
* Environment Configuration |
||||
*/ |
||||
|
||||
#if defined(CONFIG_TSEC_ENET) |
||||
#define CONFIG_ETHADDR 00:04:9f:11:22:33 |
||||
#define CONFIG_HAS_ETH1 |
||||
#define CONFIG_ETH1ADDR 00:E0:0C:00:7D:01 |
||||
#endif |
||||
|
||||
#define CONFIG_IPADDR 10.193.20.150 |
||||
|
||||
#define CONFIG_HOSTNAME unknown |
||||
#define CONFIG_ROOTPATH /tftpboot/10.193.20.150 |
||||
#define CONFIG_BOOTFILE /tftpboot/vmlinux.150 |
||||
|
||||
#define CONFIG_SERVERIP 10.193.20.58 |
||||
#define CONFIG_GATEWAYIP 192.168.1.1 |
||||
#define CONFIG_NETMASK 255.255.255.0 |
||||
|
||||
#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */ |
||||
|
||||
#define CONFIG_BOOTDELAY 6 /* -1 disables auto-boot */ |
||||
#undef CONFIG_BOOTARGS /* the boot command will set bootargs */ |
||||
|
||||
#define CONFIG_BAUDRATE 115200 |
||||
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \ |
||||
"netdev=eth0\0" \
|
||||
"consoledev=ttyS0\0" \
|
||||
"ramdiskaddr=400000\0" \
|
||||
"ramdiskfile=ramfs.83xx\0" \
|
||||
|
||||
#define CONFIG_NFSBOOTCOMMAND \ |
||||
"setenv bootargs root=/dev/nfs rw " \
|
||||
"nfsroot=$serverip:$rootpath " \
|
||||
"ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
|
||||
"console=$consoledev,$baudrate $othbootargs;" \
|
||||
"tftp $loadaddr $bootfile;" \
|
||||
"bootm $loadaddr" |
||||
|
||||
#define CONFIG_RAMBOOTCOMMAND \ |
||||
"setenv bootargs root=/dev/ram rw " \
|
||||
"console=$consoledev,$baudrate $othbootargs;" \
|
||||
"tftp $ramdiskaddr $ramdiskfile;" \
|
||||
"tftp $loadaddr $bootfile;" \
|
||||
"bootm $loadaddr $ramdiskaddr" |
||||
|
||||
#define CONFIG_BOOTCOMMAND CONFIG_NFSBOOTCOMMAND |
||||
|
||||
#endif /* __CONFIG_H */ |
@ -0,0 +1,289 @@ |
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc. |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
/*
|
||||
* mpc83xx.h |
||||
* |
||||
* MPC83xx specific definitions |
||||
*/ |
||||
|
||||
#ifndef __MPC83XX_H__ |
||||
#define __MPC83XX_H__ |
||||
|
||||
#if defined(CONFIG_E300) |
||||
#include <asm/e300.h> |
||||
#endif |
||||
|
||||
/*
|
||||
* MPC83xx cpu provide RCR register to do reset thing specially. easier |
||||
* to implement |
||||
*/ |
||||
|
||||
#define MPC83xx_RESET |
||||
|
||||
/*
|
||||
* System reset offset (PowerPC standard) |
||||
*/ |
||||
#define EXC_OFF_SYS_RESET 0x0100 |
||||
|
||||
/*
|
||||
* Default Internal Memory Register Space (Freescale recomandation) |
||||
*/ |
||||
#define CONFIG_DEFAULT_IMMR 0xFF400000 |
||||
|
||||
/*
|
||||
* Watchdog |
||||
*/ |
||||
#define SWCRR 0x0204 |
||||
#define SWCRR_SWTC 0xFFFF0000 /* Software Watchdog Time Count. */ |
||||
#define SWCRR_SWEN 0x00000004 /* Watchdog Enable bit. */ |
||||
#define SWCRR_SWRI 0x00000002 /* Software Watchdog Reset/Interrupt Select bit. */ |
||||
#define SWCRR_SWPR 0x00000001 /* Software Watchdog Counter Prescale bit. */ |
||||
#define SWCRR_RES ~(SWCRR_SWTC | SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR) |
||||
|
||||
#define SWCNR 0x0208 |
||||
#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field. |
||||
#define SWCNR_RES ~(SWCNR_SWCN) |
||||
|
||||
#define SWSRR 0x020E |
||||
|
||||
/*
|
||||
* Default Internal Memory Register Space (Freescale recomandation) |
||||
*/ |
||||
#define IMMRBAR 0x0000 |
||||
#define IMMRBAR_BASE_ADDR 0xFFF00000 /* Identifies the 12 most-significant address bits of the base of the 1 MByte internal memory window. */ |
||||
#define IMMRBAR_RES ~(IMMRBAR_BASE_ADDR) |
||||
|
||||
/*
|
||||
* Default Internal Memory Register Space (Freescale recomandation) |
||||
*/ |
||||
#define LBLAWBAR0 0x0020 |
||||
#define LBLAWAR0 0x0024 |
||||
#define LBLAWBAR1 0x0028 |
||||
#define LBLAWAR1 0x002C |
||||
#define LBLAWBAR2 0x0030 |
||||
#define LBLAWAR2 0x0034 |
||||
#define LBLAWBAR3 0x0038 |
||||
#define LBLAWAR3 0x003C |
||||
|
||||
|
||||
/*
|
||||
* Base Registers & Option Registers |
||||
*/ |
||||
#define BR0 0x5000 |
||||
#define BR1 0x5008 |
||||
#define BR2 0x5010 |
||||
#define BR3 0x5018 |
||||
#define BR4 0x5020 |
||||
#define BR5 0x5028 |
||||
#define BR6 0x5030 |
||||
#define BR7 0x5038 |
||||
|
||||
#define BR_BA 0xFFFF8000 |
||||
#define BR_BA_SHIFT 15 |
||||
#define BR_PS 0x00001800 |
||||
#define BR_PS_SHIFT 11 |
||||
#define BR_DECC 0x00000600 |
||||
#define BR_DECC_SHIFT 9 |
||||
#define BR_WP 0x00000100 |
||||
#define BR_WP_SHIFT 8 |
||||
#define BR_MSEL 0x000000E0 |
||||
#define BR_MSEL_SHIFT 5 |
||||
#define BR_V 0x00000001 |
||||
#define BR_V_SHIFT 0 |
||||
#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V) |
||||
|
||||
#define OR0 0x5004 |
||||
#define OR1 0x500C |
||||
#define OR2 0x5014 |
||||
#define OR3 0x501C |
||||
#define OR4 0x5024 |
||||
#define OR5 0x502C |
||||
#define OR6 0x5034 |
||||
#define OR7 0x503C |
||||
|
||||
#define OR_GPCM_AM 0xFFFF8000 |
||||
#define OR_GPCM_AM_SHIFT 15 |
||||
#define OR_GPCM_BCTLD 0x00001000 |
||||
#define OR_GPCM_BCTLD_SHIFT 12 |
||||
#define OR_GPCM_CSNT 0x00000800 |
||||
#define OR_GPCM_CSNT_SHIFT 11 |
||||
#define OR_GPCM_ACS 0x00000600 |
||||
#define OR_GPCM_ACS_SHIFT 9 |
||||
#define OR_GPCM_XACS 0x00000100 |
||||
#define OR_GPCM_XACS_SHIFT 8 |
||||
#define OR_GPCM_SCY 0x000000F0 |
||||
#define OR_GPCM_SCY_SHIFT 4 |
||||
#define OR_GPCM_SETA 0x00000008 |
||||
#define OR_GPCM_SETA_SHIFT 3 |
||||
#define OR_GPCM_TRLX 0x00000004 |
||||
#define OR_GPCM_TRLX_SHIFT 2 |
||||
#define OR_GPCM_EHTR 0x00000002 |
||||
#define OR_GPCM_EHTR_SHIFT 1 |
||||
#define OR_GPCM_EAD 0x00000001 |
||||
#define OR_GPCM_EAD_SHIFT 0 |
||||
|
||||
#define OR_UPM_AM 0xFFFF8000 |
||||
#define OR_UPM_AM_SHIFT 15 |
||||
#define OR_UPM_XAM 0x00006000 |
||||
#define OR_UPM_XAM_SHIFT 13 |
||||
#define OR_UPM_BCTLD 0x00001000 |
||||
#define OR_UPM_BCTLD_SHIFT 12 |
||||
#define OR_UPM_BI 0x00000100 |
||||
#define OR_UPM_BI_SHIFT 8 |
||||
#define OR_UPM_TRLX 0x00000004 |
||||
#define OR_UPM_TRLX_SHIFT 2 |
||||
#define OR_UPM_EHTR 0x00000002 |
||||
#define OR_UPM_EHTR_SHIFT 1 |
||||
#define OR_UPM_EAD 0x00000001 |
||||
#define OR_UPM_EAD_SHIFT 0 |
||||
|
||||
#define OR_SDRAM_AM 0xFFFF8000 |
||||
#define OR_SDRAM_AM_SHIFT 15 |
||||
#define OR_SDRAM_XAM 0x00006000 |
||||
#define OR_SDRAM_XAM_SHIFT 13 |
||||
#define OR_SDRAM_COLS 0x00001C00 |
||||
#define OR_SDRAM_COLS_SHIFT 10 |
||||
#define OR_SDRAM_ROWS 0x000001C0 |
||||
#define OR_SDRAM_ROWS_SHIFT 6 |
||||
#define OR_SDRAM_PMSEL 0x00000020 |
||||
#define OR_SDRAM_PMSEL_SHIFT 5 |
||||
#define OR_SDRAM_EAD 0x00000001 |
||||
#define OR_SDRAM_EAD_SHIFT 0 |
||||
|
||||
/*
|
||||
* Hard Reset Configration Word - High |
||||
*/
|
||||
#define HRCWH_PCI_AGENT 0x00000000 |
||||
#define HRCWH_PCI_HOST 0x80000000 |
||||
|
||||
#define HRCWH_32_BIT_PCI 0x00000000 |
||||
#define HRCWH_64_BIT_PCI 0x40000000 |
||||
|
||||
#define HRCWH_PCI1_ARBITER_DISABLE 0x00000000 |
||||
#define HRCWH_PCI1_ARBITER_ENABLE 0x20000000 |
||||
|
||||
#define HRCWH_PCI2_ARBITER_DISABLE 0x00000000 |
||||
#define HRCWH_PCI2_ARBITER_ENABLE 0x10000000 |
||||
|
||||
#define HRCWH_CORE_DISABLE 0x08000000 |
||||
#define HRCWH_CORE_ENABLE 0x00000000 |
||||
|
||||
#define HRCWH_FROM_0X00000100 0x00000000 |
||||
#define HRCWH_FROM_0XFFF00100 0x04000000 |
||||
|
||||
#define HRCWH_BOOTSEQ_DISABLE 0x00000000 |
||||
#define HRCWH_BOOTSEQ_NORMAL 0x01000000 |
||||
#define HRCWH_BOOTSEQ_EXTENDED 0x02000000 |
||||
|
||||
#define HRCWH_SW_WATCHDOG_DISABLE 0x00000000 |
||||
#define HRCWH_SW_WATCHDOG_ENABLE 0x00800000 |
||||
|
||||
#define HRCWH_ROM_LOC_DDR_SDRAM 0x00000000 |
||||
#define HRCWH_ROM_LOC_PCI1 0x00100000 |
||||
#define HRCWH_ROM_LOC_PCI2 0x00200000 |
||||
#define HRCWH_ROM_LOC_LOCAL_8BIT 0x00500000 |
||||
#define HRCWH_ROM_LOC_LOCAL_16BIT 0x00600000 |
||||
#define HRCWH_ROM_LOC_LOCAL_32BIT 0x00700000 |
||||
|
||||
#define HRCWH_TSEC1M_IN_RGMII 0x00000000 |
||||
#define HRCWH_TSEC1M_IN_RTBI 0x00004000 |
||||
#define HRCWH_TSEC1M_IN_GMII 0x00008000 |
||||
#define HRCWH_TSEC1M_IN_TBI 0x0000C000 |
||||
|
||||
#define HRCWH_TSEC2M_IN_RGMII 0x00000000 |
||||
#define HRCWH_TSEC2M_IN_RTBI 0x00001000 |
||||
#define HRCWH_TSEC2M_IN_GMII 0x00002000 |
||||
#define HRCWH_TSEC2M_IN_TBI 0x00003000 |
||||
|
||||
#define HRCWH_BIG_ENDIAN 0x00000000 |
||||
#define HRCWH_LITTLE_ENDIAN 0x00000008 |
||||
|
||||
/*
|
||||
* Hard Reset Configration Word - Low |
||||
*/ |
||||
#define HRCWL_LCL_BUS_TO_SCB_CLK_1X1 0x00000000 |
||||
#define HRCWL_LCL_BUS_TO_SCB_CLK_2X1 0x80000000 |
||||
|
||||
#define HRCWL_DDR_TO_SCB_CLK_1X1 0x00000000 |
||||
#define HRCWL_DDR_TO_SCB_CLK_2X1 0x40000000 |
||||
|
||||
#define HRCWL_CSB_TO_CLKIN_16X1 0x00000000 |
||||
#define HRCWL_CSB_TO_CLKIN_1X1 0x01000000 |
||||
#define HRCWL_CSB_TO_CLKIN_2X1 0x02000000 |
||||
#define HRCWL_CSB_TO_CLKIN_3X1 0x03000000 |
||||
#define HRCWL_CSB_TO_CLKIN_4X1 0x04000000 |
||||
#define HRCWL_CSB_TO_CLKIN_5X1 0x05000000 |
||||
#define HRCWL_CSB_TO_CLKIN_6X1 0x06000000 |
||||
#define HRCWL_CSB_TO_CLKIN_7X1 0x07000000 |
||||
#define HRCWL_CSB_TO_CLKIN_8X1 0x08000000 |
||||
#define HRCWL_CSB_TO_CLKIN_9X1 0x09000000 |
||||
#define HRCWL_CSB_TO_CLKIN_10X1 0x0A000000 |
||||
#define HRCWL_CSB_TO_CLKIN_11X1 0x0B000000 |
||||
#define HRCWL_CSB_TO_CLKIN_12X1 0x0C000000 |
||||
#define HRCWL_CSB_TO_CLKIN_13X1 0x0D000000 |
||||
#define HRCWL_CSB_TO_CLKIN_14X1 0x0E000000 |
||||
#define HRCWL_CSB_TO_CLKIN_15X1 0x0F000000 |
||||
|
||||
#define HRCWL_VCO_BYPASS 0x00000000 |
||||
#define HRCWL_VCO_1X2 0x00000000 |
||||
#define HRCWL_VCO_1X4 0x00200000 |
||||
#define HRCWL_VCO_1X8 0x00400000 |
||||
|
||||
#define HRCWL_CORE_TO_CSB_BYPASS 0x00000000 |
||||
#define HRCWL_CORE_TO_CSB_1X1 0x00020000 |
||||
#define HRCWL_CORE_TO_CSB_1_5X1 0x00030000 |
||||
#define HRCWL_CORE_TO_CSB_2X1 0x00040000 |
||||
#define HRCWL_CORE_TO_CSB_2_5X1 0x00050000 |
||||
#define HRCWL_CORE_TO_CSB_3X1 0x00060000 |
||||
|
||||
/*
|
||||
* LCRR - Clock Ratio Register (10.3.1.16)
|
||||
*/ |
||||
#define LCRR_DBYP 0x80000000 |
||||
#define LCRR_DBYP_SHIFT 31 |
||||
#define LCRR_BUFCMDC 0x30000000 |
||||
#define LCRR_BUFCMDC_1 0x10000000 |
||||
#define LCRR_BUFCMDC_2 0x20000000 |
||||
#define LCRR_BUFCMDC_3 0x30000000 |
||||
#define LCRR_BUFCMDC_4 0x00000000 |
||||
#define LCRR_BUFCMDC_SHIFT 28 |
||||
#define LCRR_ECL 0x03000000 |
||||
#define LCRR_ECL_4 0x00000000 |
||||
#define LCRR_ECL_5 0x01000000 |
||||
#define LCRR_ECL_6 0x02000000 |
||||
#define LCRR_ECL_7 0x03000000 |
||||
#define LCRR_ECL_SHIFT 24 |
||||
#define LCRR_EADC 0x00030000 |
||||
#define LCRR_EADC_1 0x00010000 |
||||
#define LCRR_EADC_2 0x00020000 |
||||
#define LCRR_EADC_3 0x00030000 |
||||
#define LCRR_EADC_4 0x00000000 |
||||
#define LCRR_EADC_SHIFT 16 |
||||
#define LCRR_CLKDIV 0x0000000F |
||||
#define LCRR_CLKDIV_2 0x00000002 |
||||
#define LCRR_CLKDIV_4 0x00000004 |
||||
#define LCRR_CLKDIV_8 0x00000008 |
||||
#define LCRR_CLKDIV_SHIFT 0 |
||||
|
||||
|
||||
#endif /* __MPC83XX_H__ */ |
Loading…
Reference in new issue