aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/lib/rdtime.c
blob: e128d7fce692b074c441acca5d40ba58b8b451cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 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;
}