2006-04-27 07:58:56 +09:00
|
|
|
/*
|
2006-06-01 02:44:44 +09:00
|
|
|
* Copyright 2006 Freescale Semiconductor
|
|
|
|
* Jeff Brown
|
2006-04-27 07:58:56 +09:00
|
|
|
* Srikanth Srinivasan (srikanth.srinivasan@freescale.com)
|
|
|
|
*
|
|
|
|
* See file CREDITS for list of people who contributed to this
|
|
|
|
* project.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2 of
|
|
|
|
* the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
|
|
|
#include <watchdog.h>
|
|
|
|
#include <command.h>
|
|
|
|
#include <asm/cache.h>
|
2008-05-09 09:02:51 +09:00
|
|
|
#include <asm/mmu.h>
|
2006-04-27 07:58:56 +09:00
|
|
|
#include <mpc86xx.h>
|
2008-09-01 06:33:26 +09:00
|
|
|
#include <tsec.h>
|
2008-01-24 07:31:06 +09:00
|
|
|
#include <asm/fsl_law.h>
|
2006-04-27 07:58:56 +09:00
|
|
|
|
|
|
|
|
2009-02-06 02:25:25 +09:00
|
|
|
/*
|
|
|
|
* Default board reset function
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
__board_reset(void)
|
|
|
|
{
|
|
|
|
/* Do nothing */
|
|
|
|
}
|
|
|
|
void board_reset(void) __attribute((weak, alias("__board_reset")));
|
|
|
|
|
|
|
|
|
2006-08-23 02:06:18 +09:00
|
|
|
int
|
|
|
|
checkcpu(void)
|
2006-04-27 07:58:56 +09:00
|
|
|
{
|
|
|
|
sys_info_t sysinfo;
|
|
|
|
uint pvr, svr;
|
|
|
|
uint ver;
|
|
|
|
uint major, minor;
|
2008-10-16 22:01:15 +09:00
|
|
|
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
|
2007-10-17 05:26:51 +09:00
|
|
|
volatile ccsr_gur_t *gur = &immap->im_gur;
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2006-04-27 07:58:56 +09:00
|
|
|
puts("Freescale PowerPC\n");
|
|
|
|
|
|
|
|
pvr = get_pvr();
|
|
|
|
ver = PVR_VER(pvr);
|
|
|
|
major = PVR_MAJ(pvr);
|
|
|
|
minor = PVR_MIN(pvr);
|
|
|
|
|
2006-04-28 00:15:16 +09:00
|
|
|
puts("CPU:\n");
|
2006-06-01 02:44:44 +09:00
|
|
|
puts(" Core: ");
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2006-04-27 07:58:56 +09:00
|
|
|
switch (ver) {
|
|
|
|
case PVR_VER(PVR_86xx):
|
2007-10-17 05:26:51 +09:00
|
|
|
{
|
|
|
|
uint msscr0 = mfspr(MSSCR0);
|
|
|
|
printf("E600 Core %d", (msscr0 & 0x20) ? 1 : 0 );
|
|
|
|
if (gur->pordevsr & MPC86xx_PORDEVSR_CORE1TE)
|
|
|
|
puts("\n Core1Translation Enabled");
|
|
|
|
debug(" (MSSCR0=%x, PORDEVSR=%x)", msscr0, gur->pordevsr);
|
|
|
|
}
|
|
|
|
break;
|
2006-04-27 07:58:56 +09:00
|
|
|
default:
|
2006-08-23 02:06:18 +09:00
|
|
|
puts("Unknown");
|
|
|
|
break;
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
printf(", Version: %d.%d, (0x%08x)\n", major, minor, pvr);
|
|
|
|
|
|
|
|
svr = get_svr();
|
2008-02-06 16:19:40 +09:00
|
|
|
ver = SVR_SOC_VER(svr);
|
2006-04-27 07:58:56 +09:00
|
|
|
major = SVR_MAJ(svr);
|
|
|
|
minor = SVR_MIN(svr);
|
|
|
|
|
|
|
|
puts(" System: ");
|
2006-04-28 00:15:16 +09:00
|
|
|
switch (ver) {
|
2006-04-27 07:58:56 +09:00
|
|
|
case SVR_8641:
|
2006-09-14 22:40:36 +09:00
|
|
|
if (SVR_SUBVER(svr) == 1) {
|
2006-04-27 07:58:56 +09:00
|
|
|
puts("8641D");
|
2006-09-14 22:40:36 +09:00
|
|
|
} else {
|
|
|
|
puts("8641");
|
|
|
|
}
|
|
|
|
break;
|
2007-10-17 05:26:51 +09:00
|
|
|
case SVR_8610:
|
|
|
|
puts("8610");
|
|
|
|
break;
|
2006-04-27 07:58:56 +09:00
|
|
|
default:
|
|
|
|
puts("Unknown");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
printf(", Version: %d.%d, (0x%08x)\n", major, minor, svr);
|
|
|
|
|
|
|
|
get_sys_info(&sysinfo);
|
|
|
|
|
|
|
|
puts(" Clocks: ");
|
|
|
|
printf("CPU:%4lu MHz, ", sysinfo.freqProcessor / 1000000);
|
|
|
|
printf("MPX:%4lu MHz, ", sysinfo.freqSystemBus / 1000000);
|
|
|
|
printf("DDR:%4lu MHz, ", sysinfo.freqSystemBus / 2000000);
|
2006-04-28 00:15:16 +09:00
|
|
|
|
mpc8[56]xx: Put localbus clock in sysinfo and gd
Currently MPC85xx and MPC86xx boards just calculate the localbus frequency
and print it out, but don't save it.
This changes where its calculated and stored to be more consistent with the
CPU, CCB, TB, and DDR frequencies and the MPC83xx localbus clock.
The localbus frequency is added to sysinfo and calculated when sysinfo is
set up, in cpu/mpc8[56]xx/speed.c, the same as the other frequencies are.
get_clocks() copies the frequency into the global data, as the other
frequencies are, into a new field that is only enabled for MPC85xx and
MPC86xx.
checkcpu() in cpu/mpc8[56]xx/cpu.c will print out the local bus frequency
from sysinfo, like the other frequencies, instead of calculating it on the
spot.
Signed-off-by: Trent Piepho <tpiepho@freescale.com>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
Acked-by: Jon Loeliger <jdl@freescale.com>
2008-12-04 08:16:37 +09:00
|
|
|
if (sysinfo.freqLocalBus > LCRR_CLKDIV) {
|
|
|
|
printf("LBC:%4lu MHz\n", sysinfo.freqLocalBus / 1000000);
|
2006-04-27 07:58:56 +09:00
|
|
|
} else {
|
2009-01-12 22:50:35 +09:00
|
|
|
printf("LBC: unknown (LCRR[CLKDIV] = 0x%02lx)\n",
|
mpc8[56]xx: Put localbus clock in sysinfo and gd
Currently MPC85xx and MPC86xx boards just calculate the localbus frequency
and print it out, but don't save it.
This changes where its calculated and stored to be more consistent with the
CPU, CCB, TB, and DDR frequencies and the MPC83xx localbus clock.
The localbus frequency is added to sysinfo and calculated when sysinfo is
set up, in cpu/mpc8[56]xx/speed.c, the same as the other frequencies are.
get_clocks() copies the frequency into the global data, as the other
frequencies are, into a new field that is only enabled for MPC85xx and
MPC86xx.
checkcpu() in cpu/mpc8[56]xx/cpu.c will print out the local bus frequency
from sysinfo, like the other frequencies, instead of calculating it on the
spot.
Signed-off-by: Trent Piepho <tpiepho@freescale.com>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
Acked-by: Jon Loeliger <jdl@freescale.com>
2008-12-04 08:16:37 +09:00
|
|
|
sysinfo.freqLocalBus);
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
|
2006-06-01 02:44:44 +09:00
|
|
|
puts(" L2: ");
|
2006-05-31 07:47:00 +09:00
|
|
|
if (get_l2cr() & 0x80000000)
|
2006-06-01 02:44:44 +09:00
|
|
|
puts("Enabled\n");
|
2006-05-31 07:47:00 +09:00
|
|
|
else
|
2006-06-01 02:44:44 +09:00
|
|
|
puts("Disabled\n");
|
2006-04-28 00:15:16 +09:00
|
|
|
|
|
|
|
return 0;
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2006-05-31 07:47:00 +09:00
|
|
|
do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
2006-04-27 07:58:56 +09:00
|
|
|
{
|
2009-02-06 02:25:25 +09:00
|
|
|
volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
|
|
|
|
volatile ccsr_gur_t *gur = &immap->im_gur;
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2009-02-06 02:25:25 +09:00
|
|
|
/* Attempt board-specific reset */
|
|
|
|
board_reset();
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2009-02-06 02:25:25 +09:00
|
|
|
/* Next try asserting HRESET_REQ */
|
|
|
|
out_be32(&gur->rstcr, MPC86xx_RSTCR_HRST_REQ);
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2009-02-06 02:25:25 +09:00
|
|
|
while (1)
|
|
|
|
;
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Get timebase clock frequency
|
|
|
|
*/
|
2006-08-23 02:06:18 +09:00
|
|
|
unsigned long
|
|
|
|
get_tbclk(void)
|
2006-04-27 07:58:56 +09:00
|
|
|
{
|
2006-08-23 02:06:18 +09:00
|
|
|
sys_info_t sys_info;
|
2006-04-27 07:58:56 +09:00
|
|
|
|
|
|
|
get_sys_info(&sys_info);
|
2006-04-28 00:15:16 +09:00
|
|
|
return (sys_info.freqSystemBus + 3L) / 4L;
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(CONFIG_WATCHDOG)
|
|
|
|
void
|
|
|
|
watchdog_reset(void)
|
|
|
|
{
|
2008-05-13 12:50:36 +09:00
|
|
|
#if defined(CONFIG_MPC8610)
|
|
|
|
/*
|
|
|
|
* This actually feed the hard enabled watchdog.
|
|
|
|
*/
|
2008-10-16 22:01:15 +09:00
|
|
|
volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
|
2008-05-13 12:50:36 +09:00
|
|
|
volatile ccsr_wdt_t *wdt = &immap->im_wdt;
|
|
|
|
volatile ccsr_gur_t *gur = &immap->im_gur;
|
|
|
|
u32 tmp = gur->pordevsr;
|
|
|
|
|
|
|
|
if (tmp & 0x4000) {
|
|
|
|
wdt->swsrr = 0x556c;
|
|
|
|
wdt->swsrr = 0xaa39;
|
|
|
|
}
|
|
|
|
#endif
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
#endif /* CONFIG_WATCHDOG */
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(CONFIG_DDR_ECC)
|
2006-08-23 02:06:18 +09:00
|
|
|
void
|
|
|
|
dma_init(void)
|
2006-04-28 00:15:16 +09:00
|
|
|
{
|
2008-10-16 22:01:15 +09:00
|
|
|
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
|
2006-04-27 07:58:56 +09:00
|
|
|
volatile ccsr_dma_t *dma = &immap->im_dma;
|
|
|
|
|
|
|
|
dma->satr0 = 0x00040000;
|
|
|
|
dma->datr0 = 0x00040000;
|
|
|
|
asm("sync; isync");
|
|
|
|
}
|
|
|
|
|
2006-08-23 02:06:18 +09:00
|
|
|
uint
|
|
|
|
dma_check(void)
|
2006-04-28 00:15:16 +09:00
|
|
|
{
|
2008-10-16 22:01:15 +09:00
|
|
|
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
|
2006-04-27 07:58:56 +09:00
|
|
|
volatile ccsr_dma_t *dma = &immap->im_dma;
|
|
|
|
volatile uint status = dma->sr0;
|
|
|
|
|
|
|
|
/* While the channel is busy, spin */
|
2006-08-23 02:06:18 +09:00
|
|
|
while ((status & 4) == 4) {
|
2006-04-27 07:58:56 +09:00
|
|
|
status = dma->sr0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status != 0) {
|
2006-08-23 02:06:18 +09:00
|
|
|
printf("DMA Error: status = %x\n", status);
|
2006-04-27 07:58:56 +09:00
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2006-08-23 02:06:18 +09:00
|
|
|
int
|
|
|
|
dma_xfer(void *dest, uint count, void *src)
|
2006-04-28 00:15:16 +09:00
|
|
|
{
|
2008-10-16 22:01:15 +09:00
|
|
|
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
|
2006-04-27 07:58:56 +09:00
|
|
|
volatile ccsr_dma_t *dma = &immap->im_dma;
|
|
|
|
|
|
|
|
dma->dar0 = (uint) dest;
|
|
|
|
dma->sar0 = (uint) src;
|
|
|
|
dma->bcr0 = count;
|
|
|
|
dma->mr0 = 0xf000004;
|
|
|
|
asm("sync;isync");
|
|
|
|
dma->mr0 = 0xf000005;
|
|
|
|
asm("sync;isync");
|
|
|
|
return dma_check();
|
|
|
|
}
|
2006-04-28 00:15:16 +09:00
|
|
|
|
2006-04-27 07:58:56 +09:00
|
|
|
#endif /* CONFIG_DDR_ECC */
|
|
|
|
|
|
|
|
|
2008-01-24 07:31:06 +09:00
|
|
|
/*
|
|
|
|
* Print out the state of various machine registers.
|
2008-05-09 09:02:51 +09:00
|
|
|
* Currently prints out LAWs, BR0/OR0, and BATs
|
2008-01-24 07:31:06 +09:00
|
|
|
*/
|
|
|
|
void mpc86xx_reginfo(void)
|
|
|
|
{
|
2008-10-16 22:01:15 +09:00
|
|
|
immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
|
2008-01-24 07:31:06 +09:00
|
|
|
ccsr_lbc_t *lbc = &immap->im_lbc;
|
|
|
|
|
2008-05-09 09:02:51 +09:00
|
|
|
print_bats();
|
2008-01-24 07:31:06 +09:00
|
|
|
print_laws();
|
|
|
|
|
|
|
|
printf ("Local Bus Controller Registers\n"
|
|
|
|
"\tBR0\t0x%08X\tOR0\t0x%08X \n", in_be32(&lbc->br0), in_be32(&lbc->or0));
|
|
|
|
printf("\tBR1\t0x%08X\tOR1\t0x%08X \n", in_be32(&lbc->br1), in_be32(&lbc->or1));
|
|
|
|
printf("\tBR2\t0x%08X\tOR2\t0x%08X \n", in_be32(&lbc->br2), in_be32(&lbc->or2));
|
|
|
|
printf("\tBR3\t0x%08X\tOR3\t0x%08X \n", in_be32(&lbc->br3), in_be32(&lbc->or3));
|
|
|
|
printf("\tBR4\t0x%08X\tOR4\t0x%08X \n", in_be32(&lbc->br4), in_be32(&lbc->or4));
|
|
|
|
printf("\tBR5\t0x%08X\tOR5\t0x%08X \n", in_be32(&lbc->br5), in_be32(&lbc->or5));
|
|
|
|
printf("\tBR6\t0x%08X\tOR6\t0x%08X \n", in_be32(&lbc->br6), in_be32(&lbc->or6));
|
|
|
|
printf("\tBR7\t0x%08X\tOR7\t0x%08X \n", in_be32(&lbc->br7), in_be32(&lbc->or7));
|
2006-04-27 07:58:56 +09:00
|
|
|
|
|
|
|
}
|
2008-06-24 14:57:27 +09:00
|
|
|
|
2008-09-01 06:33:26 +09:00
|
|
|
/*
|
|
|
|
* Initializes on-chip ethernet controllers.
|
|
|
|
* to override, implement board_eth_init()
|
2008-06-24 14:57:27 +09:00
|
|
|
*/
|
|
|
|
int cpu_eth_init(bd_t *bis)
|
|
|
|
{
|
2008-09-01 06:33:26 +09:00
|
|
|
#if defined(CONFIG_TSEC_ENET)
|
|
|
|
tsec_standard_init(bis);
|
2008-06-24 14:57:27 +09:00
|
|
|
#endif
|
2008-09-01 06:33:26 +09:00
|
|
|
|
2008-06-24 14:57:27 +09:00
|
|
|
return 0;
|
|
|
|
}
|