@ -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 )
{
@ -115,73 +126,20 @@ checkcpu(void)
}
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 )
;
}