86xx: Reset update
Update the 86xx reset sequence to try executing a board-specific reset function. If the board-specific reset is not implemented or does not succeed, then assert #HRESET_REQ. Using #HRESET_REQ is a more standard reset procedure than the previous method and allows all board peripherals to be reset if needed. Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
This commit is contained in:
parent
edf0e2524a
commit
4ef630df77
|
@ -484,3 +484,11 @@ int board_eth_init(bd_t *bis)
|
||||||
{
|
{
|
||||||
return pci_eth_init(bis);
|
return pci_eth_init(bis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void board_reset(void)
|
||||||
|
{
|
||||||
|
out8(PIXIS_BASE + PIXIS_RST, 0);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
|
@ -363,3 +363,11 @@ int board_eth_init(bd_t *bis)
|
||||||
cpu_eth_init(bis);
|
cpu_eth_init(bis);
|
||||||
return pci_eth_init(bis);
|
return pci_eth_init(bis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void board_reset(void)
|
||||||
|
{
|
||||||
|
out8(PIXIS_BASE + PIXIS_RST, 0);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
|
@ -384,3 +384,32 @@ unsigned long get_board_sys_clk (ulong dummy)
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void board_reset(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SYS_RESET_ADDRESS
|
||||||
|
ulong addr = CONFIG_SYS_RESET_ADDRESS;
|
||||||
|
|
||||||
|
/* 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");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,17 @@
|
||||||
#include <asm/fsl_law.h>
|
#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
|
int
|
||||||
checkcpu(void)
|
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
|
void
|
||||||
do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_MPC8641HPCN) && !defined(CONFIG_MPC8610HPCD)
|
volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
|
||||||
|
volatile ccsr_gur_t *gur = &immap->im_gur;
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_RESET_ADDRESS
|
/* Attempt board-specific reset */
|
||||||
ulong addr = CONFIG_SYS_RESET_ADDRESS;
|
board_reset();
|
||||||
#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 */
|
/* Next try asserting HRESET_REQ */
|
||||||
__asm__ __volatile__ ("mfspr 3, 1008" ::: "r3");
|
out_be32(&gur->rstcr, MPC86xx_RSTCR_HRST_REQ);
|
||||||
__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);
|
while (1)
|
||||||
|
;
|
||||||
#else /* CONFIG_MPC8641HPCN */
|
|
||||||
|
|
||||||
out8(PIXIS_BASE + PIXIS_RST, 0);
|
|
||||||
|
|
||||||
#endif /* !CONFIG_MPC8641HPCN */
|
|
||||||
|
|
||||||
while (1) ; /* not reached */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,6 @@
|
||||||
#define CONFIG_SYS_DIAG_ADDR 0xff800000
|
#define CONFIG_SYS_DIAG_ADDR 0xff800000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CONFIG_SYS_RESET_ADDRESS 0xfff00100
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virtual address to be used for temporary mappings. There
|
* virtual address to be used for temporary mappings. There
|
||||||
* should be 128k free at this VA.
|
* should be 128k free at this VA.
|
||||||
|
|
|
@ -45,8 +45,6 @@
|
||||||
#define CONFIG_SYS_DIAG_ADDR CONFIG_SYS_FLASH_BASE
|
#define CONFIG_SYS_DIAG_ADDR CONFIG_SYS_FLASH_BASE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CONFIG_SYS_RESET_ADDRESS 0xfff00100
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virtual address to be used for temporary mappings. There
|
* virtual address to be used for temporary mappings. There
|
||||||
* should be 128k free at this VA.
|
* should be 128k free at this VA.
|
||||||
|
|
Loading…
Reference in New Issue