mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-11-04 10:21:25 +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;
 | 
						|
}
 |