mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-11 22:03:15 +00:00
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;
|
||
|
}
|