aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/lib/rdtime.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2018-12-21 13:36:08 -0500
committerTom Rini <trini@konsulko.com>2018-12-21 13:36:08 -0500
commit328e3f8a706931e1a8f76adfdc015ad76cbeb83c (patch)
treeb88b5eb9c3135640bc44262229cc70f4a0e6acdc /arch/riscv/lib/rdtime.c
parent1f2e948d6d53f77a2ddb2dde3531b0d5bc2815ad (diff)
parent368ff57805b03bebf99e97e703ce07aec721bc71 (diff)
Merge git://git.denx.de/u-boot-riscv
- Add DM drivers to support RISC-V CPU and timer, plus some bug fixes. - Support SiFive UART - Rename ax25-ae350 defconfig
Diffstat (limited to 'arch/riscv/lib/rdtime.c')
-rw-r--r--arch/riscv/lib/rdtime.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/arch/riscv/lib/rdtime.c b/arch/riscv/lib/rdtime.c
new file mode 100644
index 0000000000..e128d7fce6
--- /dev/null
+++ b/arch/riscv/lib/rdtime.c
@@ -0,0 +1,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;
+}