mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-30 00:21:06 +00:00
511107d85d
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>
38 lines
676 B
C
38 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;
|
|
}
|