Merge tag 'signed-rpi-next' of git://github.com/agraf/u-boot
[oweals/u-boot.git] / arch / arm / cpu / armv8 / generic_timer.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2013
4  * David Feng <fenghua@phytium.com.cn>
5  */
6
7 #include <common.h>
8 #include <command.h>
9 #include <asm/system.h>
10
11 DECLARE_GLOBAL_DATA_PTR;
12
13 /*
14  * Generic timer implementation of get_tbclk()
15  */
16 unsigned long get_tbclk(void)
17 {
18         unsigned long cntfrq;
19         asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
20         return cntfrq;
21 }
22
23 /*
24  * Generic timer implementation of timer_read_counter()
25  */
26 unsigned long timer_read_counter(void)
27 {
28         unsigned long cntpct;
29 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
30         /* This erratum number needs to be confirmed to match ARM document */
31         unsigned long temp;
32 #endif
33         isb();
34         asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
35 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
36         asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
37         while (temp != cntpct) {
38                 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
39                 asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
40         }
41 #endif
42         return cntpct;
43 }
44
45 uint64_t get_ticks(void)
46 {
47         unsigned long ticks = timer_read_counter();
48
49         gd->arch.tbl = ticks;
50
51         return ticks;
52 }
53
54 unsigned long usec2ticks(unsigned long usec)
55 {
56         ulong ticks;
57         if (usec < 1000)
58                 ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
59         else
60                 ticks = ((usec / 10) * (get_tbclk() / 100000));
61
62         return ticks;
63 }
64
65 ulong timer_get_boot_us(void)
66 {
67         u64 val = get_ticks() * 1000000;
68
69         return val / get_tbclk();
70 }