diff options
Diffstat (limited to 'cpu/mpc86xx/cpu.c')
| -rw-r--r-- | cpu/mpc86xx/cpu.c | 181 | 
1 files changed, 63 insertions, 118 deletions
| diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c index 4cace984d..c41616d2f 100644 --- a/cpu/mpc86xx/cpu.c +++ b/cpu/mpc86xx/cpu.c @@ -32,6 +32,17 @@  #include <asm/fsl_law.h> +/* + * Default board reset function + */ +static void +__board_reset(void) +{ +	/* Do nothing */ +} +void board_reset(void) __attribute((weak, alias("__board_reset"))); + +  int  checkcpu(void)  { @@ -39,51 +50,25 @@ checkcpu(void)  	uint pvr, svr;  	uint ver;  	uint major, minor; -	uint lcrr;		/* local bus clock ratio register */ -	uint clkdiv;		/* clock divider portion of lcrr */ +	char buf1[32], buf2[32];  	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;  	volatile ccsr_gur_t *gur = &immap->im_gur; - -	puts("Freescale PowerPC\n"); - -	pvr = get_pvr(); -	ver = PVR_VER(pvr); -	major = PVR_MAJ(pvr); -	minor = PVR_MIN(pvr); - -	puts("CPU:\n"); -	puts("    Core: "); - -	switch (ver) { -	case PVR_VER(PVR_86xx): -	{ -		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; -	default: -		puts("Unknown"); -		break; -	} -	printf(", Version: %d.%d, (0x%08x)\n", major, minor, pvr); +	uint msscr0 = mfspr(MSSCR0);  	svr = get_svr();  	ver = SVR_SOC_VER(svr);  	major = SVR_MAJ(svr);  	minor = SVR_MIN(svr); -	puts("    System: "); +	puts("CPU:   "); +  	switch (ver) {  	case SVR_8641: -	    if (SVR_SUBVER(svr) == 1) { -		puts("8641D"); -	    } else {  		puts("8641"); -	    } -	    break; +		break; +	case SVR_8641D: +		puts("8641D"); +		break;  	case SVR_8610:  		puts("8610");  		break; @@ -92,109 +77,69 @@ checkcpu(void)  		break;  	}  	printf(", Version: %d.%d, (0x%08x)\n", major, minor, svr); +	puts("Core:  "); -	get_sys_info(&sysinfo); +	pvr = get_pvr(); +	ver = PVR_E600_VER(pvr); +	major = PVR_E600_MAJ(pvr); +	minor = PVR_E600_MIN(pvr); -	puts("    Clocks: "); -	printf("CPU:%4lu MHz, ", sysinfo.freqProcessor / 1000000); -	printf("MPX:%4lu MHz, ", sysinfo.freqSystemBus / 1000000); -	printf("DDR:%4lu MHz, ", sysinfo.freqSystemBus / 2000000); +	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); -#if defined(CONFIG_SYS_LBC_LCRR) -	lcrr = CONFIG_SYS_LBC_LCRR; -#else -	{ -		volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR; -		volatile ccsr_lbc_t *lbc = &immap->im_lbc; +	printf(", Version: %d.%d, (0x%08x)\n", major, minor, pvr); -		lcrr = lbc->lcrr; -	} -#endif -	clkdiv = lcrr & 0x0f; -	if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) { -		printf("LBC:%4lu MHz\n", -		       sysinfo.freqSystemBus / 1000000 / clkdiv); +	get_sys_info(&sysinfo); + +	puts("Clock Configuration:\n"); +	printf("       CPU:%-4s MHz, ", strmhz(buf1, sysinfo.freqProcessor)); +	printf("MPX:%-4s MHz\n", strmhz(buf1, sysinfo.freqSystemBus)); +	printf("       DDR:%-4s MHz (%s MT/s data rate), ", +		strmhz(buf1, sysinfo.freqSystemBus / 2), +		strmhz(buf2, sysinfo.freqSystemBus)); + +	if (sysinfo.freqLocalBus > LCRR_CLKDIV) { +		printf("LBC:%-4s MHz\n", strmhz(buf1, sysinfo.freqLocalBus));  	} else { -		printf("    LBC: unknown (lcrr: 0x%08x)\n", lcrr); +		printf("LBC: unknown (LCRR[CLKDIV] = 0x%02lx)\n", +		       sysinfo.freqLocalBus);  	} -	puts("    L2: "); -	if (get_l2cr() & 0x80000000) -		puts("Enabled\n"); -	else +	puts("L1:    D-cache 32 KB enabled\n"); +	puts("       I-cache 32 KB enabled\n"); + +	puts("L2:    "); +	if (get_l2cr() & 0x80000000) { +#if defined(CONFIG_MPC8610) +		puts("256"); +#elif defined(CONFIG_MPC8641) +		puts("512"); +#endif +		puts(" KB enabled\n"); +	} else {  		puts("Disabled\n"); +	}  	return 0;  } -static inline void -soft_restart(unsigned long addr) -{ -#if !defined(CONFIG_MPC8641HPCN) && !defined(CONFIG_MPC8610HPCD) - -	/* -	 * SRR0 has system reset vector, SRR1 has default MSR value -	 * rfi restores MSR from SRR1 and sets the PC to the SRR0 value -	 */ - -	__asm__ __volatile__ ("mtspr	26, %0"		:: "r" (addr)); -	__asm__ __volatile__ ("li	4, (1 << 6)"	::: "r4"); -	__asm__ __volatile__ ("mtspr	27, 4"); -	__asm__ __volatile__ ("rfi"); - -#else /* CONFIG_MPC8641HPCN */ - -	out8(PIXIS_BASE + PIXIS_RST, 0); - -#endif /* !CONFIG_MPC8641HPCN */ - -	while (1) ;		/* not reached */ -} - - -/* - * No generic way to do board reset. Simply call soft_reset. - */  void  do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -#if !defined(CONFIG_MPC8641HPCN) && !defined(CONFIG_MPC8610HPCD) - -#ifdef CONFIG_SYS_RESET_ADDRESS -	ulong addr = CONFIG_SYS_RESET_ADDRESS; -#else -	/* -	 * note: when CONFIG_SYS_MONITOR_BASE points to a RAM address, -	 * CONFIG_SYS_MONITOR_BASE - sizeof (ulong) is usually a valid -	 * address. Better pick an address known to be invalid on your -	 * system and assign it to CONFIG_SYS_RESET_ADDRESS. -	 */ -	ulong addr = CONFIG_SYS_MONITOR_BASE - sizeof(ulong); -#endif - -	/* flush and disable I/D cache */ -	__asm__ __volatile__ ("mfspr	3, 1008"	::: "r3"); -	__asm__ __volatile__ ("ori	5, 5, 0xcc00"	::: "r5"); -	__asm__ __volatile__ ("ori	4, 3, 0xc00"	::: "r4"); -	__asm__ __volatile__ ("andc	5, 3, 5"	::: "r5"); -	__asm__ __volatile__ ("sync"); -	__asm__ __volatile__ ("mtspr	1008, 4"); -	__asm__ __volatile__ ("isync"); -	__asm__ __volatile__ ("sync"); -	__asm__ __volatile__ ("mtspr	1008, 5"); -	__asm__ __volatile__ ("isync"); -	__asm__ __volatile__ ("sync"); - -	soft_restart(addr); - -#else /* CONFIG_MPC8641HPCN */ +	volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; +	volatile ccsr_gur_t *gur = &immap->im_gur; -	out8(PIXIS_BASE + PIXIS_RST, 0); +	/* Attempt board-specific reset */ +	board_reset(); -#endif /* !CONFIG_MPC8641HPCN */ +	/* Next try asserting HRESET_REQ */ +	out_be32(&gur->rstcr, MPC86xx_RSTCR_HRST_REQ); -	while (1) ;		/* not reached */ +	while (1) +		;  } |