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 Sambuchalt_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 Sambucreset(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 Sambucpoweroff(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 Sambucarch_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 Sambucser_putc(char c) 78*433d6423SLionel Sambuc { 79*433d6423SLionel Sambuc bsp_ser_putc(c); 80*433d6423SLionel Sambuc } 81*433d6423SLionel Sambuc 82*433d6423SLionel Sambuc #endif 83