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