blob: e128d7fce692b074c441acca5d40ba58b8b451cf [file] [log] [blame]
Anup Patelf3c84792018-12-12 06:12:31 -08001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2018, Anup Patel <anup@brainfault.org>
4 * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
5 *
6 * The riscv_get_time() API implementation that is using the
7 * standard rdtime instruction.
8 */
9
10#include <common.h>
11
12/* Implement the API required by RISC-V timer driver */
13int riscv_get_time(u64 *time)
14{
15#ifdef CONFIG_64BIT
16 u64 n;
17
18 __asm__ __volatile__ (
19 "rdtime %0"
20 : "=r" (n));
21
22 *time = n;
23#else
24 u32 lo, hi, tmp;
25
26 __asm__ __volatile__ (
27 "1:\n"
28 "rdtimeh %0\n"
29 "rdtime %1\n"
30 "rdtimeh %2\n"
31 "bne %0, %2, 1b"
32 : "=&r" (hi), "=&r" (lo), "=&r" (tmp));
33
34 *time = ((u64)hi << 32) | lo;
35#endif
36
37 return 0;
38}