xref: /minix3/minix/kernel/arch/earm/arch_reset.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #include "kernel/kernel.h"
2*433d6423SLionel Sambuc 
3*433d6423SLionel Sambuc #include <unistd.h>
4*433d6423SLionel Sambuc #include <ctype.h>
5*433d6423SLionel Sambuc #include <string.h>
6*433d6423SLionel Sambuc #include <machine/cpu.h>
7*433d6423SLionel Sambuc #include <assert.h>
8*433d6423SLionel Sambuc #include <signal.h>
9*433d6423SLionel Sambuc #include <machine/vm.h>
10*433d6423SLionel Sambuc #include <io.h>
11*433d6423SLionel Sambuc 
12*433d6423SLionel Sambuc #include <minix/board.h>
13*433d6423SLionel Sambuc #include <sys/reboot.h>
14*433d6423SLionel Sambuc 
15*433d6423SLionel Sambuc #include <minix/u64.h>
16*433d6423SLionel Sambuc 
17*433d6423SLionel Sambuc #include "archconst.h"
18*433d6423SLionel Sambuc #include "arch_proto.h"
19*433d6423SLionel Sambuc #include "bsp_reset.h"
20*433d6423SLionel Sambuc #include "bsp_serial.h"
21*433d6423SLionel Sambuc #include "kernel/proc.h"
22*433d6423SLionel Sambuc #include "kernel/debug.h"
23*433d6423SLionel Sambuc #include "direct_utils.h"
24*433d6423SLionel Sambuc #include <machine/multiboot.h>
25*433d6423SLionel Sambuc 
26*433d6423SLionel Sambuc void
halt_cpu(void)27*433d6423SLionel Sambuc halt_cpu(void)
28*433d6423SLionel Sambuc {
29*433d6423SLionel Sambuc 	asm volatile("dsb");
30*433d6423SLionel Sambuc 	asm volatile("cpsie i");
31*433d6423SLionel Sambuc 	asm volatile("wfi");
32*433d6423SLionel Sambuc 	asm volatile("cpsid i");
33*433d6423SLionel Sambuc }
34*433d6423SLionel Sambuc 
35*433d6423SLionel Sambuc void
reset(void)36*433d6423SLionel Sambuc reset(void)
37*433d6423SLionel Sambuc {
38*433d6423SLionel Sambuc 	bsp_reset(); /* should not exit */
39*433d6423SLionel Sambuc 	direct_print("Reset not supported.");
40*433d6423SLionel Sambuc 	while (1);
41*433d6423SLionel Sambuc }
42*433d6423SLionel Sambuc 
43*433d6423SLionel Sambuc void
poweroff(void)44*433d6423SLionel Sambuc poweroff(void)
45*433d6423SLionel Sambuc {
46*433d6423SLionel Sambuc 	bsp_poweroff();
47*433d6423SLionel Sambuc 	/* fallback option: hang */
48*433d6423SLionel Sambuc 	direct_print("Unable to power-off this device.");
49*433d6423SLionel Sambuc 	while (1);
50*433d6423SLionel Sambuc }
51*433d6423SLionel Sambuc 
52*433d6423SLionel Sambuc __dead void
arch_shutdown(int how)53*433d6423SLionel Sambuc arch_shutdown(int how)
54*433d6423SLionel Sambuc {
55*433d6423SLionel Sambuc 
56*433d6423SLionel Sambuc 	if((how & RB_POWERDOWN) == RB_POWERDOWN) {
57*433d6423SLionel Sambuc 		/* Power off if possible, hang otherwise */
58*433d6423SLionel Sambuc 		poweroff();
59*433d6423SLionel Sambuc 		NOT_REACHABLE;
60*433d6423SLionel Sambuc 	}
61*433d6423SLionel Sambuc 
62*433d6423SLionel Sambuc 	if(how & RB_HALT) {
63*433d6423SLionel Sambuc 		/* Hang */
64*433d6423SLionel Sambuc 		for (; ; ) halt_cpu();
65*433d6423SLionel Sambuc 		NOT_REACHABLE;
66*433d6423SLionel Sambuc 	}
67*433d6423SLionel Sambuc 
68*433d6423SLionel Sambuc 	/* Reset the system */
69*433d6423SLionel Sambuc 	reset();
70*433d6423SLionel Sambuc 	NOT_REACHABLE;
71*433d6423SLionel Sambuc 
72*433d6423SLionel Sambuc 	while (1);
73*433d6423SLionel Sambuc }
74*433d6423SLionel Sambuc 
75*433d6423SLionel Sambuc #ifdef DEBUG_SERIAL
76*433d6423SLionel Sambuc void
ser_putc(char c)77*433d6423SLionel Sambuc ser_putc(char c)
78*433d6423SLionel Sambuc {
79*433d6423SLionel Sambuc 	bsp_ser_putc(c);
80*433d6423SLionel Sambuc }
81*433d6423SLionel Sambuc 
82*433d6423SLionel Sambuc #endif
83