mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 12:08:19 +00:00 
			
		
		
		
	On RISC-V systems system the Supervisory Binary Interface provides system reset and poweroff. Use it at EFI runtime. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
		
			
				
	
	
		
			30 lines
		
	
	
		
			811 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			811 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #include <efi_loader.h>
 | |
| #include <asm/sbi.h>
 | |
| 
 | |
| void __efi_runtime EFIAPI efi_reset_system(enum efi_reset_type reset_type,
 | |
| 					   efi_status_t reset_status,
 | |
| 					   unsigned long data_size,
 | |
| 					   void *reset_data)
 | |
| {
 | |
| 	register unsigned long eid asm("a7") = SBI_EXT_SRST;
 | |
| 	register unsigned long fid asm("a6") = SBI_EXT_SRST_RESET;
 | |
| 	register unsigned long type asm("a0");
 | |
| 	register unsigned long reason asm("a1") = SBI_SRST_RESET_REASON_NONE;
 | |
| 
 | |
| 	switch (reset_type) {
 | |
| 	case EFI_RESET_WARM:
 | |
| 		type = SBI_SRST_RESET_TYPE_WARM_REBOOT;
 | |
| 		break;
 | |
| 	case EFI_RESET_SHUTDOWN:
 | |
| 		type = SBI_SRST_RESET_TYPE_SHUTDOWN;
 | |
| 		break;
 | |
| 	default:
 | |
| 		type = SBI_SRST_RESET_TYPE_COLD_REBOOT;
 | |
| 		break;
 | |
| 	}
 | |
| 	asm volatile ("ecall\n"
 | |
| 		      : : "r" (eid), "r" (fid), "r" (type), "r" (reason));
 | |
| }
 |