mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	This adds an implementation of riscv_get_time() API that is using rdtime instruction. This is the case for S-mode U-Boot, and is useful for processors that support rdtime in M-mode too. Signed-off-by: Anup Patel <anup@brainfault.org> Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
		
			
				
	
	
		
			39 lines
		
	
	
		
			676 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			676 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Copyright (C) 2018, Anup Patel <anup@brainfault.org>
 | |
|  * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
 | |
|  *
 | |
|  * The riscv_get_time() API implementation that is using the
 | |
|  * standard rdtime instruction.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| 
 | |
| /* Implement the API required by RISC-V timer driver */
 | |
| int riscv_get_time(u64 *time)
 | |
| {
 | |
| #ifdef CONFIG_64BIT
 | |
| 	u64 n;
 | |
| 
 | |
| 	__asm__ __volatile__ (
 | |
| 		"rdtime %0"
 | |
| 		: "=r" (n));
 | |
| 
 | |
| 	*time = n;
 | |
| #else
 | |
| 	u32 lo, hi, tmp;
 | |
| 
 | |
| 	__asm__ __volatile__ (
 | |
| 		"1:\n"
 | |
| 		"rdtimeh %0\n"
 | |
| 		"rdtime %1\n"
 | |
| 		"rdtimeh %2\n"
 | |
| 		"bne %0, %2, 1b"
 | |
| 		: "=&r" (hi), "=&r" (lo), "=&r" (tmp));
 | |
| 
 | |
| 	*time = ((u64)hi << 32) | lo;
 | |
| #endif
 | |
| 
 | |
| 	return 0;
 | |
| }
 |