1*9ccb00e4SAndrew Jones // SPDX-License-Identifier: GPL-2.0-only 2*9ccb00e4SAndrew Jones #include <libcflat.h> 3*9ccb00e4SAndrew Jones #include <asm/sbi.h> 4*9ccb00e4SAndrew Jones 5*9ccb00e4SAndrew Jones struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, 6*9ccb00e4SAndrew Jones unsigned long arg1, unsigned long arg2, 7*9ccb00e4SAndrew Jones unsigned long arg3, unsigned long arg4, 8*9ccb00e4SAndrew Jones unsigned long arg5) 9*9ccb00e4SAndrew Jones { 10*9ccb00e4SAndrew Jones register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); 11*9ccb00e4SAndrew Jones register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); 12*9ccb00e4SAndrew Jones register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2); 13*9ccb00e4SAndrew Jones register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3); 14*9ccb00e4SAndrew Jones register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4); 15*9ccb00e4SAndrew Jones register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5); 16*9ccb00e4SAndrew Jones register uintptr_t a6 asm ("a6") = (uintptr_t)(fid); 17*9ccb00e4SAndrew Jones register uintptr_t a7 asm ("a7") = (uintptr_t)(ext); 18*9ccb00e4SAndrew Jones struct sbiret ret; 19*9ccb00e4SAndrew Jones 20*9ccb00e4SAndrew Jones asm volatile ( 21*9ccb00e4SAndrew Jones "ecall" 22*9ccb00e4SAndrew Jones : "+r" (a0), "+r" (a1) 23*9ccb00e4SAndrew Jones : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7) 24*9ccb00e4SAndrew Jones : "memory"); 25*9ccb00e4SAndrew Jones ret.error = a0; 26*9ccb00e4SAndrew Jones ret.value = a1; 27*9ccb00e4SAndrew Jones 28*9ccb00e4SAndrew Jones return ret; 29*9ccb00e4SAndrew Jones } 30*9ccb00e4SAndrew Jones 31*9ccb00e4SAndrew Jones void sbi_shutdown(void) 32*9ccb00e4SAndrew Jones { 33*9ccb00e4SAndrew Jones sbi_ecall(SBI_EXT_SRST, 0, 0, 0, 0, 0, 0, 0); 34*9ccb00e4SAndrew Jones puts("SBI shutdown failed!\n"); 35*9ccb00e4SAndrew Jones } 36