xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/generic_timer.c (revision 060ef094600373ea2b25111006edc56c072d9bd7)
10ae76531SDavid Feng /*
20ae76531SDavid Feng  * (C) Copyright 2013
30ae76531SDavid Feng  * David Feng <fenghua@phytium.com.cn>
40ae76531SDavid Feng  *
50ae76531SDavid Feng  * SPDX-License-Identifier:	GPL-2.0+
60ae76531SDavid Feng  */
70ae76531SDavid Feng 
80ae76531SDavid Feng #include <common.h>
90ae76531SDavid Feng #include <command.h>
100ae76531SDavid Feng #include <asm/system.h>
110ae76531SDavid Feng 
120ae76531SDavid Feng /*
130ae76531SDavid Feng  * Generic timer implementation of get_tbclk()
140ae76531SDavid Feng  */
150ae76531SDavid Feng unsigned long get_tbclk(void)
160ae76531SDavid Feng {
170ae76531SDavid Feng 	unsigned long cntfrq;
180ae76531SDavid Feng 	asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
190ae76531SDavid Feng 	return cntfrq;
200ae76531SDavid Feng }
210ae76531SDavid Feng 
220ae76531SDavid Feng /*
230ae76531SDavid Feng  * Generic timer implementation of timer_read_counter()
240ae76531SDavid Feng  */
250ae76531SDavid Feng unsigned long timer_read_counter(void)
260ae76531SDavid Feng {
270ae76531SDavid Feng 	unsigned long cntpct;
28*060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
29*060ef094SYork Sun 	/* This erratum number needs to be confirmed to match ARM document */
30*060ef094SYork Sun 	unsigned long temp;
31*060ef094SYork Sun #endif
320ae76531SDavid Feng 	isb();
330ae76531SDavid Feng 	asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
34*060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
35*060ef094SYork Sun 	asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
36*060ef094SYork Sun 	while (temp != cntpct) {
37*060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
38*060ef094SYork Sun 		asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
39*060ef094SYork Sun 	}
40*060ef094SYork Sun #endif
410ae76531SDavid Feng 	return cntpct;
420ae76531SDavid Feng }
43